reasonix 0.24.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dashboard/dist/app.js +618 -491
  2. package/dashboard/dist/app.js.map +1 -1
  3. package/dist/cli/{banner-demo-QKOPDSTL.js → banner-demo-C3FJP4R6.js} +2 -2
  4. package/dist/cli/{card-demo-5TVXJISK.js → card-demo-OEFBRAJP.js} +2 -2
  5. package/dist/cli/{chunk-BGTXZKNY.js → chunk-2K5D5J3I.js} +2 -2
  6. package/dist/cli/{chunk-JHXQDL7B.js → chunk-V3DLUJY6.js} +15 -5
  7. package/dist/cli/chunk-V3DLUJY6.js.map +1 -0
  8. package/dist/cli/{flicker-demo-MOB6GAW4.js → flicker-demo-YCYC5AR7.js} +3 -3
  9. package/dist/cli/index.js +616 -489
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/{preview-4FOEEE5G.js → preview-7BGTDC65.js} +2 -2
  12. package/dist/cli/{renderer-demo-2BIGEV2T.js → renderer-demo-262TD7PU.js} +2 -2
  13. package/dist/cli/{select-demo-OA5N34BJ.js → select-demo-3QMFXV5D.js} +2 -2
  14. package/dist/cli/{stress-demo-I7XRPQMM.js → stress-demo-W3AU6PUZ.js} +2 -2
  15. package/package.json +2 -2
  16. package/dist/cli/chunk-JHXQDL7B.js.map +0 -1
  17. /package/dist/cli/{banner-demo-QKOPDSTL.js.map → banner-demo-C3FJP4R6.js.map} +0 -0
  18. /package/dist/cli/{card-demo-5TVXJISK.js.map → card-demo-OEFBRAJP.js.map} +0 -0
  19. /package/dist/cli/{chunk-BGTXZKNY.js.map → chunk-2K5D5J3I.js.map} +0 -0
  20. /package/dist/cli/{flicker-demo-MOB6GAW4.js.map → flicker-demo-YCYC5AR7.js.map} +0 -0
  21. /package/dist/cli/{preview-4FOEEE5G.js.map → preview-7BGTDC65.js.map} +0 -0
  22. /package/dist/cli/{renderer-demo-2BIGEV2T.js.map → renderer-demo-262TD7PU.js.map} +0 -0
  23. /package/dist/cli/{select-demo-OA5N34BJ.js.map → select-demo-3QMFXV5D.js.map} +0 -0
  24. /package/dist/cli/{stress-demo-I7XRPQMM.js.map → stress-demo-W3AU6PUZ.js.map} +0 -0
@@ -6,7 +6,7 @@ import {
6
6
  ink_compat_exports,
7
7
  mount,
8
8
  useKeystroke
9
- } from "./chunk-JHXQDL7B.js";
9
+ } from "./chunk-V3DLUJY6.js";
10
10
  import "./chunk-2H7UOFLK.js";
11
11
 
12
12
  // src/cli/commands/banner-demo.tsx
@@ -74,4 +74,4 @@ async function runBannerDemo(opts = {}) {
74
74
  export {
75
75
  runBannerDemo
76
76
  };
77
- //# sourceMappingURL=banner-demo-QKOPDSTL.js.map
77
+ //# sourceMappingURL=banner-demo-C3FJP4R6.js.map
@@ -6,7 +6,7 @@ import {
6
6
  ink_compat_exports,
7
7
  mount,
8
8
  useKeystroke
9
- } from "./chunk-JHXQDL7B.js";
9
+ } from "./chunk-V3DLUJY6.js";
10
10
  import "./chunk-2H7UOFLK.js";
11
11
 
12
12
  // src/cli/commands/card-demo.tsx
@@ -941,4 +941,4 @@ export {
941
941
  CardDemoShell,
942
942
  runCardDemo
943
943
  };
944
- //# sourceMappingURL=card-demo-5TVXJISK.js.map
944
+ //# sourceMappingURL=card-demo-OEFBRAJP.js.map
@@ -3,7 +3,7 @@ import {
3
3
  Box2 as Box,
4
4
  Text2 as Text,
5
5
  useStdout
6
- } from "./chunk-JHXQDL7B.js";
6
+ } from "./chunk-V3DLUJY6.js";
7
7
 
8
8
  // src/cli/ui/cards/ApprovalCard.tsx
9
9
  import React from "react";
@@ -194,4 +194,4 @@ export {
194
194
  useReserveRows,
195
195
  useTotalRows
196
196
  };
197
- //# sourceMappingURL=chunk-BGTXZKNY.js.map
197
+ //# sourceMappingURL=chunk-2K5D5J3I.js.map
@@ -1464,6 +1464,9 @@ var RESET_SGR = "\x1B[0m";
1464
1464
  var CLOSE_HYPERLINK = "\x1B]8;;\x1B\\";
1465
1465
  var ENTER_VIRTUAL = "\x1B[?1049h\x1B[2J\x1B[H\x1B[?1002h\x1B[?1006h";
1466
1466
  var LEAVE_VIRTUAL = "\x1B[?1006l\x1B[?1002l\x1B[?1000l\x1B[?1049l";
1467
+ var BSU = "\x1B[?2026h";
1468
+ var ESU = "\x1B[?2026l";
1469
+ var ERASE_SCREEN = "\x1B[2J\x1B[H";
1467
1470
  function mount(element, opts) {
1468
1471
  const scrollMode = opts.scroll ?? "scrollback";
1469
1472
  let viewportWidth = opts.viewportWidth;
@@ -1476,6 +1479,13 @@ function mount(element, opts) {
1476
1479
  let lastTotalRows = 0;
1477
1480
  let destroyed = false;
1478
1481
  let lastElement = element;
1482
+ let pendingClear = false;
1483
+ const flushFrame = (out) => {
1484
+ const buffer = pendingClear ? ERASE_SCREEN + out : out;
1485
+ pendingClear = false;
1486
+ if (buffer.length === 0) return;
1487
+ opts.write(BSU + buffer + ESU);
1488
+ };
1479
1489
  const reader = opts.stdin ? new KeystrokeReader({ source: opts.stdin }) : null;
1480
1490
  let cursorTarget = null;
1481
1491
  const setCursorTarget = (next) => {
@@ -1567,7 +1577,7 @@ function mount(element, opts) {
1567
1577
  };
1568
1578
  const patches = diffFrames(frame, next, opts.pools);
1569
1579
  if (patches.length > 0) out += serializePatches(patches);
1570
- if (out.length > 0) opts.write(out);
1580
+ flushFrame(out);
1571
1581
  frame = next;
1572
1582
  };
1573
1583
  const commitVirtual = (layout2) => {
@@ -1597,7 +1607,7 @@ function mount(element, opts) {
1597
1607
  };
1598
1608
  const patches = diffFrames(frame, next, opts.pools);
1599
1609
  if (patches.length > 0) out += serializePatches(patches);
1600
- if (out.length > 0) opts.write(out);
1610
+ flushFrame(out);
1601
1611
  frame = next;
1602
1612
  };
1603
1613
  const root = {
@@ -1636,7 +1646,7 @@ function mount(element, opts) {
1636
1646
  out += "\r\x1B[J";
1637
1647
  }
1638
1648
  out += bytes;
1639
- opts.write(out);
1649
+ flushFrame(out);
1640
1650
  frame = emptyFrame(viewportWidth, viewportHeight);
1641
1651
  reservedRows = 0;
1642
1652
  root.onCommit();
@@ -1689,7 +1699,7 @@ function mount(element, opts) {
1689
1699
  scrollOffset = 0;
1690
1700
  stickyBottom = true;
1691
1701
  lastTotalRows = 0;
1692
- opts.write("\x1B[2J\x1B[H");
1702
+ pendingClear = true;
1693
1703
  reconciler.updateContainer(wrap(lastElement), container, null, () => {
1694
1704
  });
1695
1705
  },
@@ -2053,4 +2063,4 @@ export {
2053
2063
  render,
2054
2064
  ink_compat_exports
2055
2065
  };
2056
- //# sourceMappingURL=chunk-JHXQDL7B.js.map
2066
+ //# sourceMappingURL=chunk-V3DLUJY6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/renderer/react/components.ts","../../src/renderer/input/use-keystroke.ts","../../src/renderer/input/keystroke.ts","../../src/renderer/input/reader.ts","../../src/renderer/pools/char-pool.ts","../../src/renderer/pools/hyperlink-pool.ts","../../src/renderer/pools/style-pool.ts","../../src/renderer/reconciler/mount.ts","../../src/renderer/screen/cell.ts","../../src/renderer/screen/diff.ts","../../src/renderer/diff/diff-frames.ts","../../src/renderer/screen/screen.ts","../../src/renderer/diff/frame.ts","../../src/renderer/diff/serialize.ts","../../src/renderer/ink-compat/renderer-bridge.ts","../../src/renderer/ink-compat/use-app.ts","../../src/renderer/ink-compat/viewport.ts","../../src/renderer/layout/layout.ts","../../src/renderer/layout/yoga-layout.ts","../../src/renderer/layout/borders.ts","../../src/renderer/runtime/render-to-bytes.ts","../../src/renderer/reconciler/host-config.ts","../../src/renderer/reconciler/host-node.ts","../../src/renderer/reconciler/cursor.ts","../../src/renderer/ink-compat/index.ts","../../src/renderer/ink-compat/Box.tsx","../../src/renderer/ink-compat/colors.ts","../../src/renderer/ink-compat/Text.tsx","../../src/renderer/ink-compat/Spacer.tsx","../../src/renderer/ink-compat/Static.tsx","../../src/renderer/ink-compat/use-input.ts","../../src/renderer/ink-compat/render.tsx","../../src/renderer/react/render.ts"],"sourcesContent":["import React, { type ReactElement, type ReactNode } from \"react\";\nimport type { BorderStyle, BorderStyleName } from \"../layout/borders.js\";\nimport type { AlignItems, FlexWrap, JustifyContent } from \"../layout/node.js\";\nimport type { AnsiCode } from \"../pools/style-pool.js\";\n\nexport const HOST_BOX = \"rsx-box\" as const;\nexport const HOST_TEXT = \"rsx-text\" as const;\n\nexport interface BoxProps {\n readonly children?: ReactNode;\n readonly flexDirection?: \"column\" | \"row\" | \"column-reverse\" | \"row-reverse\";\n readonly flexGrow?: number;\n readonly flexShrink?: number;\n readonly flexBasis?: number | `${number}%` | \"auto\";\n readonly flexWrap?: FlexWrap;\n readonly justifyContent?: JustifyContent;\n readonly alignItems?: AlignItems;\n readonly alignSelf?: AlignItems;\n readonly alignContent?: AlignItems | \"space-between\" | \"space-around\";\n readonly width?: number | `${number}%`;\n readonly height?: number | `${number}%`;\n readonly minWidth?: number | `${number}%`;\n readonly minHeight?: number | `${number}%`;\n readonly maxWidth?: number | `${number}%`;\n readonly maxHeight?: number | `${number}%`;\n readonly gap?: number;\n readonly columnGap?: number;\n readonly rowGap?: number;\n readonly display?: \"flex\" | \"none\";\n readonly paddingTop?: number;\n readonly paddingBottom?: number;\n readonly paddingLeft?: number;\n readonly paddingRight?: number;\n readonly paddingX?: number;\n readonly paddingY?: number;\n readonly padding?: number;\n readonly marginTop?: number;\n readonly marginBottom?: number;\n readonly marginLeft?: number;\n readonly marginRight?: number;\n readonly marginX?: number;\n readonly marginY?: number;\n readonly margin?: number;\n readonly borderStyle?: BorderStyle | BorderStyleName;\n readonly borderTop?: boolean;\n readonly borderBottom?: boolean;\n readonly borderLeft?: boolean;\n readonly borderRight?: boolean;\n readonly borderColor?: ReadonlyArray<AnsiCode>;\n readonly borderTopColor?: ReadonlyArray<AnsiCode>;\n readonly borderBottomColor?: ReadonlyArray<AnsiCode>;\n readonly borderLeftColor?: ReadonlyArray<AnsiCode>;\n readonly borderRightColor?: ReadonlyArray<AnsiCode>;\n}\n\nexport interface TextProps {\n readonly children?: ReactNode;\n readonly style?: ReadonlyArray<AnsiCode>;\n readonly hyperlink?: string;\n}\n\nexport function Box(props: BoxProps): ReactElement {\n return React.createElement(HOST_BOX, props);\n}\n\nexport function Text(props: TextProps): ReactElement {\n return React.createElement(HOST_TEXT, props);\n}\n","import { createContext, useContext, useEffect } from \"react\";\nimport type { Keystroke } from \"./keystroke.js\";\nimport type { KeystrokeListener, KeystrokeReader } from \"./reader.js\";\n\nexport const KeystrokeContext = createContext<KeystrokeReader | null>(null);\n\nexport function useKeystroke(handler: (key: Keystroke) => void, enabled = true): void {\n const reader = useContext(KeystrokeContext);\n useEffect(() => {\n if (!enabled || !reader) return;\n const wrapped: KeystrokeListener = (key) => handler(key);\n return reader.subscribe(wrapped);\n }, [reader, handler, enabled]);\n}\n","export interface Keystroke {\n readonly input: string;\n readonly raw: string;\n readonly ctrl: boolean;\n readonly meta: boolean;\n readonly shift: boolean;\n readonly upArrow: boolean;\n readonly downArrow: boolean;\n readonly leftArrow: boolean;\n readonly rightArrow: boolean;\n readonly home: boolean;\n readonly end: boolean;\n readonly pageUp: boolean;\n readonly pageDown: boolean;\n readonly delete: boolean;\n readonly backspace: boolean;\n readonly return: boolean;\n readonly escape: boolean;\n readonly tab: boolean;\n readonly wheelUp: boolean;\n readonly wheelDown: boolean;\n}\n\nexport function emptyKeystroke(): Keystroke {\n return {\n input: \"\",\n raw: \"\",\n ctrl: false,\n meta: false,\n shift: false,\n upArrow: false,\n downArrow: false,\n leftArrow: false,\n rightArrow: false,\n home: false,\n end: false,\n pageUp: false,\n pageDown: false,\n delete: false,\n backspace: false,\n return: false,\n escape: false,\n tab: false,\n wheelUp: false,\n wheelDown: false,\n };\n}\n\nconst CSI_FINAL: Record<string, Partial<Keystroke>> = {\n A: { upArrow: true },\n B: { downArrow: true },\n C: { rightArrow: true },\n D: { leftArrow: true },\n H: { home: true },\n F: { end: true },\n};\n\nconst CSI_TILDE: Record<string, Partial<Keystroke>> = {\n \"1\": { home: true },\n \"3\": { delete: true },\n \"4\": { end: true },\n \"5\": { pageUp: true },\n \"6\": { pageDown: true },\n \"7\": { home: true },\n \"8\": { end: true },\n};\n\nexport function parseKeystrokes(chunk: string): Keystroke[] {\n const out: Keystroke[] = [];\n let i = 0;\n while (i < chunk.length) {\n const consumed = parseOne(chunk, i);\n if (consumed.length === 0) {\n i++;\n continue;\n }\n out.push(consumed.key);\n i += consumed.length;\n }\n return out;\n}\n\ninterface Consumed {\n key: Keystroke;\n length: number;\n}\n\nconst PASTE_START = \"\\x1b[200~\";\nconst PASTE_END = \"\\x1b[201~\";\n\nfunction parseOne(s: string, start: number): Consumed {\n const ch = s[start]!;\n\n // Bracketed-paste: terminal wraps pasted content in ESC[200~ ... ESC[201~.\n // Surface the entire payload as ONE keystroke so multi-line reducers can\n // recognise it as a paste burst and allocate a single sentinel.\n if (ch === \"\\x1b\" && s.startsWith(PASTE_START, start)) {\n const bodyStart = start + PASTE_START.length;\n const endIdx = s.indexOf(PASTE_END, bodyStart);\n if (endIdx >= 0) {\n const content = s.slice(bodyStart, endIdx);\n return {\n key: {\n ...emptyKeystroke(),\n raw: s.slice(start, endIdx + PASTE_END.length),\n input: content,\n },\n length: endIdx + PASTE_END.length - start,\n };\n }\n // Unterminated paste in this chunk — fall through to generic escape\n // parsing. Real terminals send the wrapper atomically; if it splits we\n // lose the marker but recover the content as normal keystrokes.\n }\n\n if (ch === \"\\x1b\") {\n return parseEscape(s, start);\n }\n\n if (ch === \"\\r\" || ch === \"\\n\") {\n return { key: { ...emptyKeystroke(), raw: ch, return: true }, length: 1 };\n }\n if (ch === \"\\t\") {\n return { key: { ...emptyKeystroke(), raw: ch, tab: true }, length: 1 };\n }\n if (ch === \"\\x7f\" || ch === \"\\x08\") {\n return { key: { ...emptyKeystroke(), raw: ch, backspace: true }, length: 1 };\n }\n\n const code = ch.charCodeAt(0);\n if (code >= 1 && code <= 26 && ch !== \"\\t\" && ch !== \"\\r\" && ch !== \"\\n\") {\n const letter = String.fromCharCode(code + 96);\n return {\n key: { ...emptyKeystroke(), raw: ch, ctrl: true, input: letter },\n length: 1,\n };\n }\n\n return { key: { ...emptyKeystroke(), raw: ch, input: ch }, length: 1 };\n}\n\nfunction parseEscape(s: string, start: number): Consumed {\n if (start + 1 >= s.length) {\n return { key: { ...emptyKeystroke(), raw: \"\\x1b\", escape: true }, length: 1 };\n }\n\n const next = s[start + 1]!;\n\n if (next === \"[\" || next === \"O\") {\n return parseCsi(s, start);\n }\n\n // Alt+Enter — terminals send \\x1b\\r (or \\x1b\\n on some). Surface as\n // meta+return so multi-line reducers can distinguish it from a bare Enter.\n if (next === \"\\r\" || next === \"\\n\") {\n return {\n key: { ...emptyKeystroke(), raw: `\\x1b${next}`, meta: true, return: true },\n length: 2,\n };\n }\n\n if (isPrintable(next)) {\n return {\n key: { ...emptyKeystroke(), raw: `\\x1b${next}`, meta: true, input: next },\n length: 2,\n };\n }\n\n return { key: { ...emptyKeystroke(), raw: \"\\x1b\", escape: true }, length: 1 };\n}\n\nfunction parseCsi(s: string, start: number): Consumed {\n let i = start + 2;\n let params = \"\";\n while (i < s.length) {\n const c = s[i]!;\n if (isCsiFinal(c)) {\n const raw = s.slice(start, i + 1);\n const key = decodeCsi(params, c, raw);\n return { key, length: i - start + 1 };\n }\n params += c;\n i++;\n }\n return {\n key: { ...emptyKeystroke(), raw: s.slice(start), escape: true },\n length: s.length - start,\n };\n}\n\nfunction decodeCsi(params: string, final: string, raw: string): Keystroke {\n const base = { ...emptyKeystroke(), raw };\n\n if (params.startsWith(\"<\") && (final === \"M\" || final === \"m\")) {\n const mouse = params.slice(1).split(\";\");\n const button = Number.parseInt(mouse[0] ?? \"\", 10);\n if (button === 64) return { ...base, wheelUp: true };\n if (button === 65) return { ...base, wheelDown: true };\n return base;\n }\n\n const segments = params.split(\";\");\n const modCode = segments[1] ? Number.parseInt(segments[1], 10) : 1;\n const mods = decodeModifiers(modCode);\n\n if (final === \"~\" && segments[0]) {\n const part = CSI_TILDE[segments[0]];\n if (part) return { ...base, ...part, ...mods };\n }\n\n const part = CSI_FINAL[final];\n if (part) return { ...base, ...part, ...mods };\n\n return { ...base, escape: true };\n}\n\nfunction decodeModifiers(code: number): Pick<Keystroke, \"shift\" | \"meta\" | \"ctrl\"> {\n const m = code - 1;\n return {\n shift: (m & 1) !== 0,\n meta: (m & 2) !== 0,\n ctrl: (m & 4) !== 0,\n };\n}\n\nfunction isCsiFinal(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return code >= 0x40 && code <= 0x7e && ch !== \"[\";\n}\n\nfunction isPrintable(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return code >= 0x20 && code <= 0x7e;\n}\n","import type { Keystroke } from \"./keystroke.js\";\nimport { parseKeystrokes } from \"./keystroke.js\";\n\nexport type KeystrokeListener = (key: Keystroke) => void;\n\nexport interface KeystrokeSource {\n on(event: \"data\", cb: (chunk: Buffer | string) => void): void;\n off(event: \"data\", cb: (chunk: Buffer | string) => void): void;\n setRawMode?(raw: boolean): void;\n resume?(): void;\n pause?(): void;\n}\n\nexport interface KeystrokeReaderOptions {\n source: KeystrokeSource;\n rawMode?: boolean;\n}\n\nexport class KeystrokeReader {\n private listeners: KeystrokeListener[] = [];\n private readonly onData: (chunk: Buffer | string) => void;\n private destroyed = false;\n\n constructor(private readonly opts: KeystrokeReaderOptions) {\n this.onData = (chunk) => this.handle(chunk);\n if (opts.rawMode !== false) {\n opts.source.setRawMode?.(true);\n }\n opts.source.resume?.();\n opts.source.on(\"data\", this.onData);\n }\n\n subscribe(listener: KeystrokeListener): () => void {\n this.listeners.push(listener);\n return () => {\n const i = this.listeners.indexOf(listener);\n if (i >= 0) this.listeners.splice(i, 1);\n };\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.opts.source.off(\"data\", this.onData);\n if (this.opts.rawMode !== false) {\n this.opts.source.setRawMode?.(false);\n }\n this.listeners.length = 0;\n }\n\n private handle(chunk: Buffer | string): void {\n if (this.destroyed) return;\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n const keys = parseKeystrokes(text);\n for (const key of keys) {\n for (const cb of this.listeners) cb(key);\n }\n }\n}\n","const ASCII_TABLE_SIZE = 128;\nconst SPACE_ID = 0;\nconst EMPTY_ID = 1;\n\nexport class CharPool {\n private readonly strings: string[];\n private readonly map: Map<string, number>;\n private readonly ascii: Int32Array;\n\n constructor() {\n this.strings = [\" \", \"\"];\n this.map = new Map([\n [\" \", SPACE_ID],\n [\"\", EMPTY_ID],\n ]);\n this.ascii = new Int32Array(ASCII_TABLE_SIZE).fill(-1);\n this.ascii[\" \".charCodeAt(0)] = SPACE_ID;\n }\n\n intern(s: string): number {\n if (s.length === 1) {\n const code = s.charCodeAt(0);\n if (code < ASCII_TABLE_SIZE) {\n const cached = this.ascii[code]!;\n if (cached !== -1) return cached;\n const id = this.strings.length;\n this.strings.push(s);\n this.ascii[code] = id;\n this.map.set(s, id);\n return id;\n }\n }\n const existing = this.map.get(s);\n if (existing !== undefined) return existing;\n const id = this.strings.length;\n this.strings.push(s);\n this.map.set(s, id);\n return id;\n }\n\n get(id: number): string {\n return this.strings[id] ?? \" \";\n }\n\n get size(): number {\n return this.strings.length;\n }\n}\n","const NO_HYPERLINK = 0;\n\nexport class HyperlinkPool {\n private readonly strings: string[] = [\"\"];\n private readonly map = new Map<string, number>();\n\n intern(uri: string | undefined): number {\n if (!uri) return NO_HYPERLINK;\n const existing = this.map.get(uri);\n if (existing !== undefined) return existing;\n const id = this.strings.length;\n this.strings.push(uri);\n this.map.set(uri, id);\n return id;\n }\n\n get(id: number): string | undefined {\n if (id === NO_HYPERLINK) return undefined;\n return this.strings[id];\n }\n\n get size(): number {\n return this.strings.length;\n }\n}\n","export interface AnsiCode {\n readonly apply: string;\n readonly revert: string;\n}\n\nconst EMPTY_KEY = \"\";\n\nexport class StylePool {\n private readonly stacks: ReadonlyArray<AnsiCode>[] = [[]];\n private readonly idsByKey = new Map<string, number>([[EMPTY_KEY, 0]]);\n private readonly transitionCache = new Map<number, string>();\n readonly none = 0;\n\n intern(codes: ReadonlyArray<AnsiCode>): number {\n const key = stackKey(codes);\n const existing = this.idsByKey.get(key);\n if (existing !== undefined) return existing;\n const id = this.stacks.length;\n this.stacks.push(codes);\n this.idsByKey.set(key, id);\n return id;\n }\n\n transition(fromId: number, toId: number): string {\n if (fromId === toId) return \"\";\n const cacheKey = (fromId << 16) | toId;\n const cached = this.transitionCache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n const from = this.stacks[fromId] ?? [];\n const to = this.stacks[toId] ?? [];\n const fromApplies = new Set(from.map((c) => c.apply));\n const toApplies = new Set(to.map((c) => c.apply));\n\n let out = \"\";\n for (const c of from) {\n if (!toApplies.has(c.apply)) out += c.revert;\n }\n for (const c of to) {\n if (!fromApplies.has(c.apply)) out += c.apply;\n }\n\n this.transitionCache.set(cacheKey, out);\n return out;\n }\n\n get size(): number {\n return this.stacks.length;\n }\n}\n\nfunction stackKey(codes: ReadonlyArray<AnsiCode>): string {\n if (codes.length === 0) return EMPTY_KEY;\n // Sort so {RED, BOLD} and {BOLD, RED} hash to the same id — style identity is the SET of codes.\n const applies = codes.map((c) => c.apply);\n applies.sort();\n return applies.join(\"\\x00\");\n}\n","import { type ReactNode, createElement } from \"react\";\nimport { type DiffPools, diffFrames } from \"../diff/diff-frames.js\";\nimport { type Cursor, type Frame, emptyFrame } from \"../diff/frame.js\";\nimport { serializePatches } from \"../diff/serialize.js\";\nimport { RendererBridgeContext } from \"../ink-compat/renderer-bridge.js\";\nimport { AppContext } from \"../ink-compat/use-app.js\";\nimport { StdoutContext, ViewportContext } from \"../ink-compat/viewport.js\";\nimport { KeystrokeContext, KeystrokeReader, type KeystrokeSource } from \"../input/index.js\";\nimport { renderViewport, renderVirtual } from \"../layout/layout.js\";\nimport type { LayoutNode } from \"../layout/node.js\";\nimport { renderToBytes } from \"../runtime/render-to-bytes.js\";\nimport { CursorContext, type CursorTarget } from \"./cursor.js\";\nimport { type HostRoot, hostToLayoutNode, reconciler } from \"./host-config.js\";\n\nexport type ScrollMode = \"scrollback\" | \"virtual\";\n\nexport interface MountOptions {\n readonly viewportWidth: number;\n readonly viewportHeight: number;\n readonly pools: DiffPools;\n readonly write: (bytes: string) => void;\n readonly cursor?: () => Cursor;\n readonly stdin?: KeystrokeSource;\n readonly onExit?: (error?: Error) => void;\n /** \"scrollback\" (default): rows that overflow viewport go to scrollback, frozen.\n * \"virtual\": full layout stays live in memory; PgUp/PgDown/Home/End scroll within. */\n readonly scroll?: ScrollMode;\n /** Real stdout stream — exposed to consumers via `inkCompat.useStdout()` so\n * components that need `.on(\"resize\", …)` / `.isTTY` etc. get the actual\n * WriteStream rather than a `{columns,rows}` fake. Defaults to process.stdout. */\n readonly stdout?: NodeJS.WriteStream;\n}\n\nexport interface Handle {\n update(element: ReactNode): void;\n resize(width: number, height: number): void;\n emitStatic(element: ReactNode): void;\n destroy(): void;\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\nconst CLOSE_HYPERLINK = \"\\x1b]8;;\\x1b\\\\\";\n// alt-screen + button-event mouse + SGR coords. Shift+drag bypasses for native selection.\nconst ENTER_VIRTUAL = \"\\x1b[?1049h\\x1b[2J\\x1b[H\\x1b[?1002h\\x1b[?1006h\";\nconst LEAVE_VIRTUAL = \"\\x1b[?1006l\\x1b[?1002l\\x1b[?1000l\\x1b[?1049l\";\n// DEC 2026 synchronized output — defers paint until ESU so half-arrived diffs don't flash.\nconst BSU = \"\\x1b[?2026h\";\nconst ESU = \"\\x1b[?2026l\";\nconst ERASE_SCREEN = \"\\x1b[2J\\x1b[H\";\n\nexport function mount(element: ReactNode, opts: MountOptions): Handle {\n const scrollMode: ScrollMode = opts.scroll ?? \"scrollback\";\n let viewportWidth = opts.viewportWidth;\n let viewportHeight = opts.viewportHeight;\n let frame: Frame = emptyFrame(viewportWidth, viewportHeight);\n let reservedRows = 0;\n let promotedRows = 0;\n let scrollOffset = 0;\n let stickyBottom = true;\n let lastTotalRows = 0;\n let destroyed = false;\n let lastElement: ReactNode = element;\n // Set by resize() so the clear is folded into the next commit's sync block.\n let pendingClear = false;\n\n // Empty input is dropped — bare BSU+ESU can briefly flash on some terminals.\n const flushFrame = (out: string): void => {\n const buffer = pendingClear ? ERASE_SCREEN + out : out;\n pendingClear = false;\n if (buffer.length === 0) return;\n opts.write(BSU + buffer + ESU);\n };\n\n const reader = opts.stdin ? new KeystrokeReader({ source: opts.stdin }) : null;\n\n let cursorTarget: CursorTarget | null = null;\n const setCursorTarget = (next: CursorTarget | null): void => {\n cursorTarget = next;\n if (!destroyed && root.children.length > 0) root.onCommit();\n };\n\n const computeCursor = (screenHeight: number): Cursor => {\n if (cursorTarget) {\n const rowFromBottom = Math.max(0, cursorTarget.rowFromBottom ?? 0);\n const y = Math.max(0, screenHeight - 1 - rowFromBottom);\n return {\n x: Math.max(0, cursorTarget.col),\n y,\n visible: cursorTarget.visible !== false,\n };\n }\n if (opts.cursor) return opts.cursor();\n return { x: 0, y: screenHeight, visible: true };\n };\n\n const scrollBy = (delta: number): void => {\n if (scrollMode !== \"virtual\") return;\n const window = Math.max(1, viewportHeight - 1);\n const maxOffset = Math.max(0, lastTotalRows - window);\n const next = Math.max(0, Math.min(maxOffset, scrollOffset + delta));\n if (next === scrollOffset) return;\n scrollOffset = next;\n stickyBottom = next === maxOffset;\n if (root.children.length > 0) {\n root.onCommit();\n }\n };\n\n let exitCleanup: (() => void) | null = null;\n let signalCleanup: (() => void) | null = null;\n if (scrollMode === \"virtual\") {\n opts.write(ENTER_VIRTUAL);\n if (reader) {\n reader.subscribe((k) => {\n const window = Math.max(1, viewportHeight - 1);\n if (k.pageUp) scrollBy(-window);\n else if (k.pageDown) scrollBy(window);\n else if (k.home) scrollBy(-Number.MAX_SAFE_INTEGER);\n else if (k.end) scrollBy(Number.MAX_SAFE_INTEGER);\n else if (k.wheelUp) scrollBy(-3);\n else if (k.wheelDown) scrollBy(3);\n });\n }\n if (typeof process !== \"undefined\" && process.on) {\n exitCleanup = () => {\n try {\n opts.write(LEAVE_VIRTUAL);\n } catch {\n /* stdout already closed */\n }\n };\n signalCleanup = () => process.exit(130);\n process.on(\"exit\", exitCleanup);\n process.on(\"SIGINT\", signalCleanup);\n process.on(\"SIGTERM\", signalCleanup);\n }\n }\n\n const commitScrollback = (layout: LayoutNode): void => {\n const maxHeight = Math.max(1, viewportHeight - 1);\n const split = renderViewport(layout, viewportWidth, opts.pools, maxHeight);\n const newPromote = Math.max(0, split.skipped - promotedRows);\n // Buffer every byte for this frame into ONE string so the terminal can't\n // flush between sub-steps. Multiple writes was visible flicker (modal\n // mount + streaming chunks each hitting reserve-grow + patches separately).\n let out = \"\";\n if (newPromote > 0) {\n if (frame.screen.height > 0) {\n out += `\\r\\x1b[${frame.screen.height}A\\x1b[J`;\n } else if (reservedRows === 0) {\n out += \"\\r\\x1b[J\";\n }\n out += split.serializePromoted(promotedRows, split.skipped);\n promotedRows = split.skipped;\n frame = emptyFrame(viewportWidth, viewportHeight);\n reservedRows = 0;\n }\n const screen = split.screen;\n const targetReserve = Math.min(screen.height, Math.max(0, viewportHeight - 1));\n if (targetReserve > reservedRows) {\n const delta = targetReserve - reservedRows;\n if (reservedRows === 0) out += \"\\r\";\n out += `${\"\\n\".repeat(delta)}\\x1b[${delta}A`;\n reservedRows = targetReserve;\n }\n const next: Frame = {\n screen,\n viewportWidth,\n viewportHeight,\n cursor: computeCursor(screen.height),\n };\n const patches = diffFrames(frame, next, opts.pools);\n if (patches.length > 0) out += serializePatches(patches);\n flushFrame(out);\n frame = next;\n };\n\n const commitVirtual = (layout: LayoutNode): void => {\n const window = Math.max(1, viewportHeight - 1);\n const virt = renderVirtual(layout, viewportWidth, opts.pools);\n const maxOffset = Math.max(0, virt.totalRows - window);\n if (stickyBottom || virt.totalRows < lastTotalRows) {\n scrollOffset = maxOffset;\n } else {\n scrollOffset = Math.min(scrollOffset, maxOffset);\n }\n lastTotalRows = virt.totalRows;\n const screen = virt.windowAt(scrollOffset, window);\n const targetReserve = Math.min(window, Math.max(0, viewportHeight - 1));\n let out = \"\";\n if (targetReserve > reservedRows) {\n const delta = targetReserve - reservedRows;\n if (reservedRows === 0) out += \"\\r\";\n out += `${\"\\n\".repeat(delta)}\\x1b[${delta}A`;\n reservedRows = targetReserve;\n }\n const next: Frame = {\n screen,\n viewportWidth,\n viewportHeight,\n cursor: computeCursor(screen.height),\n };\n const patches = diffFrames(frame, next, opts.pools);\n if (patches.length > 0) out += serializePatches(patches);\n flushFrame(out);\n frame = next;\n };\n\n const root: HostRoot = {\n children: [],\n onCommit: () => {\n if (destroyed) return;\n const layout = collectRootLayout(root.children);\n if (scrollMode === \"virtual\") {\n commitVirtual(layout);\n } else {\n commitScrollback(layout);\n }\n },\n };\n\n const container = reconciler.createContainer(\n root,\n 0,\n null,\n false,\n null,\n \"rsx\",\n () => {\n /* recoverable error */\n },\n null,\n );\n\n // Fires from Static's useEffect (mid-commit). queueMicrotask defers the\n // re-entrant updateContainer until the live commit fully drains —\n // otherwise root.children stays empty when renderToBytes reads it.\n const emitStatic = (node: ReactNode): void => {\n if (destroyed) return;\n queueMicrotask(() => {\n if (destroyed) return;\n const bytes = renderToBytes(node, viewportWidth, opts.pools);\n if (bytes.length === 0) return;\n let out = \"\";\n if (frame.screen.height > 0) {\n out += `\\r\\x1b[${frame.screen.height}A\\x1b[J`;\n } else {\n out += \"\\r\\x1b[J\";\n }\n out += bytes;\n flushFrame(out);\n // Static bytes consumed the previously-reserved live rows — drop the\n // reservation so the next commit re-grows it from the cursor's new\n // position, otherwise live paints onto rows now in scrollback.\n frame = emptyFrame(viewportWidth, viewportHeight);\n reservedRows = 0;\n root.onCommit();\n });\n };\n\n const bridge = { emitStatic };\n\n const appApi = {\n exit: (error?: Error): void => {\n if (destroyed) return;\n queueMicrotask(() => opts.onExit?.(error));\n },\n };\n\n const wrap = (node: ReactNode): ReactNode => {\n const withApp: ReactNode = createElement(AppContext.Provider, { value: appApi }, node);\n const withBridge: ReactNode = createElement(\n RendererBridgeContext.Provider,\n { value: bridge },\n withApp,\n );\n const withViewport: ReactNode = createElement(\n ViewportContext.Provider,\n { value: { columns: viewportWidth, rows: viewportHeight } },\n withBridge,\n );\n const stdoutForCtx =\n opts.stdout ??\n (typeof process !== \"undefined\" ? (process.stdout as NodeJS.WriteStream) : undefined);\n const withStdout: ReactNode = stdoutForCtx\n ? createElement(StdoutContext.Provider, { value: stdoutForCtx }, withViewport)\n : withViewport;\n const withCursor: ReactNode = createElement(\n CursorContext.Provider,\n { value: setCursorTarget },\n withStdout,\n );\n return reader\n ? createElement(KeystrokeContext.Provider, { value: reader }, withCursor)\n : withCursor;\n };\n\n reconciler.updateContainer(wrap(element), container, null, () => {\n /* committed */\n });\n\n return {\n update(nextElement: ReactNode): void {\n if (destroyed) return;\n lastElement = nextElement;\n reconciler.updateContainer(wrap(nextElement), container, null, () => {\n /* committed */\n });\n },\n resize(width: number, height: number): void {\n if (destroyed) return;\n viewportWidth = width;\n viewportHeight = height;\n frame = emptyFrame(width, height);\n reservedRows = 0;\n promotedRows = 0;\n scrollOffset = 0;\n stickyBottom = true;\n lastTotalRows = 0;\n // Folded into the next commit so clear+repaint is one atomic block.\n pendingClear = true;\n reconciler.updateContainer(wrap(lastElement), container, null, () => {\n /* committed */\n });\n },\n emitStatic,\n destroy(): void {\n if (destroyed) return;\n destroyed = true;\n reader?.destroy();\n reconciler.updateContainer(null, container, null, () => {\n /* committed */\n });\n const teardown = scrollMode === \"virtual\" ? LEAVE_VIRTUAL : \"\";\n opts.write(`${teardown}${RESET_SGR}${CLOSE_HYPERLINK}`);\n if (exitCleanup && typeof process !== \"undefined\" && process.off) {\n process.off(\"exit\", exitCleanup);\n exitCleanup = null;\n }\n if (signalCleanup && typeof process !== \"undefined\" && process.off) {\n process.off(\"SIGINT\", signalCleanup);\n process.off(\"SIGTERM\", signalCleanup);\n signalCleanup = null;\n }\n },\n };\n}\n\nfunction collectRootLayout(children: ReadonlyArray<unknown>): LayoutNode {\n const layoutChildren: LayoutNode[] = [];\n for (const c of children) {\n const child = hostToLayoutNode(c as Parameters<typeof hostToLayoutNode>[0]);\n if (child) layoutChildren.push(child);\n }\n if (layoutChildren.length === 1) return layoutChildren[0]!;\n return { kind: \"box\", children: layoutChildren };\n}\n","export const CellWidth = {\n Single: 1,\n Wide: 2,\n /** Occupies the column following a Wide glyph; renderer must skip it. */\n SpacerTail: 3,\n} as const;\n\nexport type CellWidth = (typeof CellWidth)[keyof typeof CellWidth];\n\nexport interface Cell {\n charId: number;\n styleId: number;\n hyperlinkId: number;\n width: CellWidth;\n}\n\nexport const EMPTY_CELL: Cell = Object.freeze({\n charId: 0,\n styleId: 0,\n hyperlinkId: 0,\n width: CellWidth.Single,\n});\n\nexport function cellsEqual(a: Cell, b: Cell): boolean {\n return (\n a.charId === b.charId &&\n a.styleId === b.styleId &&\n a.hyperlinkId === b.hyperlinkId &&\n a.width === b.width\n );\n}\n","import { type Cell, cellsEqual } from \"./cell.js\";\nimport type { Screen } from \"./screen.js\";\n\nexport type DiffCallback = (\n x: number,\n y: number,\n prev: Cell | undefined,\n next: Cell | undefined,\n) => boolean | undefined;\n\nexport function diffEach(prev: Screen, next: Screen, cb: DiffCallback): boolean {\n const w = Math.max(prev.width, next.width);\n const h = Math.max(prev.height, next.height);\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const a = prev.cellAt(x, y);\n const b = next.cellAt(x, y);\n if (a === b) continue;\n if (a !== undefined && b !== undefined && cellsEqual(a, b)) continue;\n if (cb(x, y, a, b) === true) return true;\n }\n }\n return false;\n}\n","import type { CharPool } from \"../pools/char-pool.js\";\nimport type { HyperlinkPool } from \"../pools/hyperlink-pool.js\";\nimport type { StylePool } from \"../pools/style-pool.js\";\nimport { type Cell, CellWidth } from \"../screen/cell.js\";\nimport { diffEach } from \"../screen/diff.js\";\nimport type { Frame } from \"./frame.js\";\nimport type { Patch } from \"./patch.js\";\n\nexport interface DiffPools {\n readonly char: CharPool;\n readonly style: StylePool;\n readonly hyperlink: HyperlinkPool;\n}\n\ninterface CursorState {\n x: number;\n y: number;\n styleId: number;\n hyperlinkId: number;\n}\n\nexport function diffFrames(prev: Frame, next: Frame, pools: DiffPools): Patch[] {\n if (prev.viewportWidth !== next.viewportWidth || prev.viewportHeight !== next.viewportHeight) {\n return fullReset(next, pools);\n }\n\n const out: Patch[] = [];\n const cursor: CursorState = {\n x: prev.cursor.x,\n y: prev.cursor.y,\n styleId: pools.style.none,\n hyperlinkId: 0,\n };\n\n diffEach(prev.screen, next.screen, (x, y, _prevCell, nextCell) => {\n moveTo(out, cursor, x, y, next.viewportWidth);\n writeCell(out, cursor, nextCell, pools);\n return undefined;\n });\n\n if (next.cursor.x !== cursor.x || next.cursor.y !== cursor.y) {\n moveTo(out, cursor, next.cursor.x, next.cursor.y, next.viewportWidth);\n }\n\n if (prev.cursor.visible !== next.cursor.visible) {\n out.push({ type: \"cursorVisible\", visible: next.cursor.visible });\n }\n\n resetTrailingState(out, cursor, pools);\n return out;\n}\n\nfunction fullReset(next: Frame, pools: DiffPools): Patch[] {\n const out: Patch[] = [{ type: \"clearTerminal\" }];\n const cursor: CursorState = { x: 0, y: 0, styleId: pools.style.none, hyperlinkId: 0 };\n for (let y = 0; y < next.screen.height; y++) {\n for (let x = 0; x < next.screen.width; x++) {\n const cell = next.screen.cellAt(x, y);\n if (!cell) continue;\n if (cell.width === CellWidth.SpacerTail) continue;\n moveTo(out, cursor, x, y, next.viewportWidth);\n writeCell(out, cursor, cell, pools);\n }\n }\n resetTrailingState(out, cursor, pools);\n return out;\n}\n\nfunction moveTo(\n out: Patch[],\n cursor: CursorState,\n targetX: number,\n targetY: number,\n viewportWidth: number,\n): void {\n if (cursor.x === targetX && cursor.y === targetY) return;\n\n if (cursor.x >= viewportWidth) {\n out.push({ type: \"carriageReturn\" });\n cursor.x = 0;\n }\n\n if (cursor.y !== targetY) {\n const dy = targetY - cursor.y;\n out.push({ type: \"carriageReturn\" });\n out.push({ type: \"cursorMove\", dx: 0, dy });\n cursor.x = 0;\n cursor.y = targetY;\n }\n\n if (cursor.x !== targetX) {\n out.push({ type: \"cursorMove\", dx: targetX - cursor.x, dy: 0 });\n cursor.x = targetX;\n }\n}\n\nfunction writeCell(\n out: Patch[],\n cursor: CursorState,\n cell: Cell | undefined,\n pools: DiffPools,\n): void {\n if (!cell) {\n transitionStyle(out, cursor, pools.style.none, pools);\n transitionHyperlink(out, cursor, 0, pools);\n out.push({ type: \"stdout\", content: \" \" });\n cursor.x++;\n return;\n }\n if (cell.width === CellWidth.SpacerTail) return;\n\n transitionStyle(out, cursor, cell.styleId, pools);\n transitionHyperlink(out, cursor, cell.hyperlinkId, pools);\n const isWide = cell.width === CellWidth.Wide;\n const charStr = pools.char.get(cell.charId);\n if (isWide) {\n // Compensation for terminal-vs-layout width disagreement on East Asian\n // Ambiguous chars: pre-write a space at col+1 (so it's blank on Western\n // terms where the glyph renders only 1 wide), then jump back, write the\n // char, then force the cursor to col+2 regardless of how many cells the\n // terminal actually advanced. Borrowed from Claude Code's logUpdate.\n out.push({ type: \"cursorTo\", col: cursor.x + 1 });\n out.push({ type: \"stdout\", content: \" \" });\n out.push({ type: \"cursorTo\", col: cursor.x });\n out.push({ type: \"stdout\", content: charStr });\n cursor.x += 2;\n out.push({ type: \"cursorTo\", col: cursor.x });\n } else {\n out.push({ type: \"stdout\", content: charStr });\n cursor.x += 1;\n }\n}\n\nfunction transitionStyle(\n out: Patch[],\n cursor: CursorState,\n targetStyleId: number,\n pools: DiffPools,\n): void {\n if (cursor.styleId === targetStyleId) return;\n const str = pools.style.transition(cursor.styleId, targetStyleId);\n if (str.length > 0) out.push({ type: \"styleStr\", str });\n cursor.styleId = targetStyleId;\n}\n\nfunction transitionHyperlink(\n out: Patch[],\n cursor: CursorState,\n targetId: number,\n pools: DiffPools,\n): void {\n if (cursor.hyperlinkId === targetId) return;\n out.push({ type: \"hyperlink\", uri: pools.hyperlink.get(targetId) ?? \"\" });\n cursor.hyperlinkId = targetId;\n}\n\nfunction resetTrailingState(out: Patch[], cursor: CursorState, pools: DiffPools): void {\n transitionStyle(out, cursor, pools.style.none, pools);\n transitionHyperlink(out, cursor, 0, pools);\n}\n","import { type Cell, EMPTY_CELL } from \"./cell.js\";\n\nexport interface Rectangle {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport class Screen {\n readonly width: number;\n readonly height: number;\n readonly cells: Cell[];\n private _damage: Rectangle | undefined;\n\n constructor(width: number, height: number) {\n this.width = Math.max(0, width | 0);\n this.height = Math.max(0, height | 0);\n this.cells = new Array<Cell>(this.width * this.height);\n for (let i = 0; i < this.cells.length; i++) this.cells[i] = EMPTY_CELL;\n this._damage = undefined;\n }\n\n get damage(): Rectangle | undefined {\n return this._damage;\n }\n\n resetDamage(): void {\n this._damage = undefined;\n }\n\n cellAt(x: number, y: number): Cell | undefined {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return undefined;\n return this.cells[y * this.width + x];\n }\n\n writeCell(x: number, y: number, cell: Cell): void {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return;\n this.cells[y * this.width + x] = cell;\n this.markDamage(x, y, 1, 1);\n }\n\n markDamage(x: number, y: number, w: number, h: number): void {\n if (w <= 0 || h <= 0) return;\n if (this._damage === undefined) {\n this._damage = { x, y, width: w, height: h };\n return;\n }\n const d = this._damage;\n const x1 = Math.min(d.x, x);\n const y1 = Math.min(d.y, y);\n const x2 = Math.max(d.x + d.width, x + w);\n const y2 = Math.max(d.y + d.height, y + h);\n d.x = x1;\n d.y = y1;\n d.width = x2 - x1;\n d.height = y2 - y1;\n }\n}\n","import { Screen } from \"../screen/screen.js\";\n\nexport interface Cursor {\n readonly x: number;\n readonly y: number;\n readonly visible: boolean;\n}\n\nexport interface Frame {\n readonly screen: Screen;\n readonly viewportWidth: number;\n readonly viewportHeight: number;\n readonly cursor: Cursor;\n}\n\nexport function emptyFrame(viewportWidth: number, viewportHeight: number): Frame {\n return {\n screen: new Screen(0, 0),\n viewportWidth,\n viewportHeight,\n cursor: { x: 0, y: 0, visible: true },\n };\n}\n","import type { Diff, Patch } from \"./patch.js\";\n\nconst ESC = \"\\x1b\";\nconst CSI = `${ESC}[`;\nconst ST = `${ESC}\\\\`;\n\nexport function serializePatches(patches: Diff): string {\n let out = \"\";\n for (const patch of patches) {\n out += serializeOne(patch);\n }\n return out;\n}\n\nfunction serializeOne(patch: Patch): string {\n switch (patch.type) {\n case \"stdout\":\n return patch.content;\n case \"cursorMove\":\n return cursorMove(patch.dx, patch.dy);\n case \"cursorTo\":\n return `${CSI}${patch.col + 1}G`;\n case \"cursorVisible\":\n return patch.visible ? `${CSI}?25h` : `${CSI}?25l`;\n case \"carriageReturn\":\n return \"\\r\";\n case \"styleStr\":\n return patch.str;\n case \"hyperlink\":\n return `${ESC}]8;;${patch.uri}${ST}`;\n case \"clear\":\n return clearLines(patch.count);\n case \"clearTerminal\":\n return `${CSI}2J${CSI}H`;\n }\n}\n\nfunction cursorMove(dx: number, dy: number): string {\n let out = \"\";\n if (dy > 0) out += `${CSI}${dy}B`;\n else if (dy < 0) out += `${CSI}${-dy}A`;\n if (dx > 0) out += `${CSI}${dx}C`;\n else if (dx < 0) out += `${CSI}${-dx}D`;\n return out;\n}\n\nfunction clearLines(count: number): string {\n if (count <= 0) return `\\r${CSI}J`;\n return `\\r${CSI}${count}A${CSI}J`;\n}\n","import { type ReactNode, createContext } from \"react\";\n\nexport interface RendererBridge {\n readonly emitStatic: (element: ReactNode) => void;\n}\n\nexport const RendererBridgeContext = createContext<RendererBridge | null>(null);\n","import { createContext, useContext } from \"react\";\n\nexport interface AppApi {\n readonly exit: (error?: Error) => void;\n}\n\nexport const AppContext = createContext<AppApi>({ exit: () => {} });\n\nexport function useApp(): AppApi {\n return useContext(AppContext);\n}\n","/** Mirrors Ink's useStdout — wires viewport sizes + real-stdout methods. */\n\nimport { type ReactNode, createContext, createElement, useContext, useMemo } from \"react\";\n\nexport interface ViewportSize {\n readonly columns: number;\n readonly rows: number;\n}\n\nexport const ViewportContext = createContext<ViewportSize>({ columns: 80, rows: 24 });\n\nexport const StdoutContext = createContext<NodeJS.WriteStream>(\n (typeof process !== \"undefined\" ? (process.stdout ?? null) : null) as NodeJS.WriteStream,\n);\n\nexport function StdoutProvider({\n stdout,\n children,\n}: {\n stdout: NodeJS.WriteStream;\n children: ReactNode;\n}): ReturnType<typeof createElement> {\n return createElement(StdoutContext.Provider, { value: stdout }, children);\n}\n\n/** Quacks like Ink's `useStdout().stdout`: viewport-driven `columns`/`rows`\n * + real `.on/.off/.write/.isTTY` proxied to the WriteStream. */\nexport interface InkStdout {\n readonly columns: number;\n readonly rows: number;\n readonly isTTY: boolean | undefined;\n write(data: string): boolean;\n on(event: string, listener: (...args: unknown[]) => void): unknown;\n off(event: string, listener: (...args: unknown[]) => void): unknown;\n}\n\nexport function useStdout(): { stdout: InkStdout; write: (data: string) => boolean } {\n const viewport = useContext(ViewportContext);\n const real = useContext(StdoutContext);\n // Stable identity: viewport-budget's `useEffect([stdout])` would otherwise\n // re-fire every render (the original cause of the modal-mount flicker).\n return useMemo(() => {\n const stdout: InkStdout = {\n columns: viewport.columns,\n rows: viewport.rows,\n isTTY: real ? real.isTTY : undefined,\n write: real ? (data: string) => real.write(data) : () => true,\n on: real\n ? (event: string, listener: (...args: unknown[]) => void) =>\n real.on(event as never, listener as never)\n : () => undefined,\n off: real\n ? (event: string, listener: (...args: unknown[]) => void) =>\n real.off(event as never, listener as never)\n : () => undefined,\n };\n return { stdout, write: stdout.write };\n }, [viewport.columns, viewport.rows, real]);\n}\n","import stringWidthRaw from \"string-width\";\n\n// Box drawing (U+2500..U+257F) and Block Elements (U+2580..U+259F) render as\n// width 1 on every modern terminal — pin both explicitly so the CJK-aware\n// `ambiguousIsNarrow:false` mode doesn't double-count borders or block art.\nfunction stringWidth(s: string): number {\n if (s.length === 0) return 0;\n if (s.length === 1) {\n const code = s.charCodeAt(0);\n if (code >= 0x2500 && code <= 0x259f) return 1;\n }\n return stringWidthRaw(s, { ambiguousIsNarrow: false });\n}\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport type { CharPool } from \"../pools/char-pool.js\";\nimport type { HyperlinkPool } from \"../pools/hyperlink-pool.js\";\nimport type { AnsiCode, StylePool } from \"../pools/style-pool.js\";\nimport { type Cell, CellWidth } from \"../screen/cell.js\";\nimport { Screen } from \"../screen/screen.js\";\nimport type { BorderStyle } from \"./borders.js\";\nimport type { BoxNode, LayoutNode, TextNode } from \"./node.js\";\nimport {\n type BuiltTree,\n Direction,\n MeasureMode,\n type NodeMeta,\n buildYogaTree,\n} from \"./yoga-layout.js\";\n\nexport interface RenderPools {\n readonly char: CharPool;\n readonly style: StylePool;\n readonly hyperlink: HyperlinkPool;\n}\n\ninterface RowFragment {\n readonly graphemes: ReadonlyArray<{ glyph: string; width: number }>;\n readonly styleId: number;\n readonly hyperlinkId: number;\n readonly leftPad: number;\n}\n\ntype LayoutRows = RowFragment[][];\n\ninterface Laid {\n rows: LayoutRows;\n width: number;\n}\n\nexport function renderToScreen(\n node: LayoutNode,\n width: number,\n pools: RenderPools,\n maxHeight?: number,\n): Screen {\n const w = Math.max(0, width | 0);\n if (w === 0) return new Screen(0, 0);\n const laid = layout(node, w, pools);\n const cap = maxHeight !== undefined ? Math.max(0, Math.floor(maxHeight)) : laid.rows.length;\n const skip = Math.max(0, laid.rows.length - cap);\n return blitRowSlice(laid.rows, skip, laid.rows.length, w, pools);\n}\n\nexport interface ViewportSplit {\n readonly screen: Screen;\n readonly skipped: number;\n readonly totalRows: number;\n serializePromoted(fromRow: number, toRow: number): string;\n}\n\nexport function renderViewport(\n node: LayoutNode,\n width: number,\n pools: RenderPools,\n maxHeight: number,\n): ViewportSplit {\n const w = Math.max(0, width | 0);\n if (w === 0) {\n return {\n screen: new Screen(0, 0),\n skipped: 0,\n totalRows: 0,\n serializePromoted: () => \"\",\n };\n }\n const laid = layout(node, w, pools);\n const cap = Math.max(0, Math.floor(maxHeight));\n const skipped = Math.max(0, laid.rows.length - cap);\n const screen = blitRowSlice(laid.rows, skipped, laid.rows.length, w, pools);\n return {\n screen,\n skipped,\n totalRows: laid.rows.length,\n serializePromoted: (fromRow, toRow) =>\n serializeRowSlice(\n laid.rows,\n Math.max(0, fromRow),\n Math.min(toRow, laid.rows.length),\n w,\n pools,\n ),\n };\n}\n\nfunction blitRowSlice(\n rows: LayoutRows,\n fromRow: number,\n toRow: number,\n width: number,\n pools: RenderPools,\n): Screen {\n const h = Math.max(0, toRow - fromRow);\n const screen = new Screen(width, h);\n for (let y = 0; y < h; y++) {\n for (const frag of rows[y + fromRow]!) blitFragment(screen, frag, y, pools);\n }\n screen.resetDamage();\n return screen;\n}\n\nexport interface VirtualLayout {\n readonly totalRows: number;\n windowAt(scrollOffset: number, windowHeight: number): Screen;\n}\n\nexport function renderVirtual(node: LayoutNode, width: number, pools: RenderPools): VirtualLayout {\n const w = Math.max(0, width | 0);\n if (w === 0) {\n return {\n totalRows: 0,\n windowAt: () => new Screen(0, 0),\n };\n }\n const laid = layout(node, w, pools);\n return {\n totalRows: laid.rows.length,\n windowAt(scrollOffset, windowHeight) {\n const start = Math.max(0, Math.min(laid.rows.length, Math.floor(scrollOffset)));\n const end = Math.max(start, Math.min(laid.rows.length, start + Math.floor(windowHeight)));\n return blitRowSlice(laid.rows, start, end, w, pools);\n },\n };\n}\n\nfunction serializeRowSlice(\n rows: LayoutRows,\n fromRow: number,\n toRow: number,\n width: number,\n pools: RenderPools,\n): string {\n if (toRow <= fromRow) return \"\";\n const screen = blitRowSlice(rows, fromRow, toRow, width, pools);\n let out = \"\";\n let curStyle = pools.style.none;\n let curLink = 0;\n for (let y = 0; y < screen.height; y++) {\n if (y > 0) {\n out += pools.style.transition(curStyle, pools.style.none);\n curStyle = pools.style.none;\n if (curLink !== 0) {\n out += \"\\x1b]8;;\\x1b\\\\\";\n curLink = 0;\n }\n out += \"\\r\\n\";\n }\n for (let x = 0; x < screen.width; x++) {\n const cell = screen.cellAt(x, y);\n if (!cell) continue;\n if (cell.width === CellWidth.SpacerTail) continue;\n if (cell.styleId !== curStyle) {\n out += pools.style.transition(curStyle, cell.styleId);\n curStyle = cell.styleId;\n }\n if (cell.hyperlinkId !== curLink) {\n const uri = pools.hyperlink.get(cell.hyperlinkId) ?? \"\";\n out += `\\x1b]8;;${uri}\\x1b\\\\`;\n curLink = cell.hyperlinkId;\n }\n out += pools.char.get(cell.charId);\n }\n }\n out += pools.style.transition(curStyle, pools.style.none);\n if (curLink !== 0) out += \"\\x1b]8;;\\x1b\\\\\";\n out += \"\\r\\n\";\n return out;\n}\n\nfunction layout(node: LayoutNode, availableWidth: number, pools: RenderPools): Laid {\n if (availableWidth <= 0) return { rows: [], width: 0 };\n\n const built = buildYogaTree(node, pools, measureText);\n built.root.calculateLayout(availableWidth, \"auto\", Direction.LTR);\n\n // Yoga places the root at (marginLeft, marginTop) via getComputedLeft/Top,\n // and getComputedHeight/Width excludes margins. Total render bounds =\n // top-margin + content + bottom-margin (right-margin similarly for width).\n const rootTop = Math.max(0, Math.round(built.root.getComputedTop()));\n const rootLeft = Math.max(0, Math.round(built.root.getComputedLeft()));\n const innerHeight = Math.max(0, Math.ceil(built.root.getComputedHeight()));\n const innerWidth = Math.max(0, Math.ceil(built.root.getComputedWidth()));\n const bottomMargin = node.kind === \"box\" ? Math.max(0, node.marginBottom ?? 0) : 0;\n const rightMargin = node.kind === \"box\" ? Math.max(0, node.marginRight ?? 0) : 0;\n const totalHeight = rootTop + innerHeight + bottomMargin;\n const totalWidth = rootLeft + innerWidth + rightMargin;\n\n const rows: LayoutRows = [];\n for (let i = 0; i < totalHeight; i++) rows.push([]);\n\n rasterize(built.root, built, 0, 0, rows, pools);\n built.root.freeRecursive();\n\n return { rows, width: totalWidth };\n}\n\nfunction rasterize(\n yoga: YogaNode,\n built: BuiltTree,\n parentX: number,\n parentY: number,\n rows: LayoutRows,\n pools: RenderPools,\n): void {\n const meta = built.meta.get(yoga);\n if (!meta) return;\n\n const left = parentX + Math.round(yoga.getComputedLeft());\n const top = parentY + Math.round(yoga.getComputedTop());\n const width = Math.max(0, Math.round(yoga.getComputedWidth()));\n const height = Math.max(0, Math.round(yoga.getComputedHeight()));\n\n if (meta.node.kind === \"text\") {\n rasterizeText(meta.node, left, top, width, height, meta.styleId, meta.hyperlinkId, rows);\n return;\n }\n\n const box = meta.node;\n if (meta.border) {\n paintBorder(meta, box, left, top, width, height, rows, pools);\n }\n\n const childList = built.children.get(yoga) ?? [];\n for (const child of childList) {\n rasterize(child, built, left, top, rows, pools);\n }\n}\n\nfunction rasterizeText(\n text: TextNode,\n x: number,\n y: number,\n width: number,\n height: number,\n styleId: number,\n hyperlinkId: number,\n rows: LayoutRows,\n): void {\n if (width <= 0 || height <= 0 || y < 0) return;\n const segmenter = getSegmenter();\n let lineIdx = 0;\n for (const rawLine of text.content.split(\"\\n\")) {\n if (lineIdx >= height) break;\n const wrapped = wrapLine(rawLine, width, segmenter);\n if (wrapped.length === 0) {\n pushFragment(rows, y + lineIdx, { graphemes: [], styleId, hyperlinkId, leftPad: x });\n lineIdx++;\n continue;\n }\n for (const row of wrapped) {\n if (lineIdx >= height) break;\n pushFragment(rows, y + lineIdx, { graphemes: row, styleId, hyperlinkId, leftPad: x });\n lineIdx++;\n }\n }\n}\n\nfunction paintBorder(\n meta: NodeMeta,\n box: BoxNode,\n left: number,\n top: number,\n width: number,\n height: number,\n rows: LayoutRows,\n pools: RenderPools,\n): void {\n if (!meta.border || width <= 0 || height <= 0) return;\n const border = meta.border;\n const topColor = pickStyleId(box.borderTopColor ?? box.borderColor, pools);\n const bottomColor = pickStyleId(box.borderBottomColor ?? box.borderColor, pools);\n const leftColor = pickStyleId(box.borderLeftColor ?? box.borderColor, pools);\n const rightColor = pickStyleId(box.borderRightColor ?? box.borderColor, pools);\n\n if (meta.useTop) {\n paintHorizontalEdge(\n rows,\n top,\n left,\n width,\n border,\n \"top\",\n meta.useLeft,\n meta.useRight,\n topColor,\n );\n }\n if (meta.useBottom && height > 1) {\n paintHorizontalEdge(\n rows,\n top + height - 1,\n left,\n width,\n border,\n \"bottom\",\n meta.useLeft,\n meta.useRight,\n bottomColor,\n );\n }\n const innerTop = top + (meta.useTop ? 1 : 0);\n const innerBottom = top + height - (meta.useBottom ? 2 : 1);\n for (let r = innerTop; r <= innerBottom; r++) {\n if (meta.useLeft) {\n pushFragment(rows, r, {\n graphemes: [{ glyph: border.left, width: Math.max(1, stringWidth(border.left)) }],\n styleId: leftColor,\n hyperlinkId: 0,\n leftPad: left,\n });\n }\n if (meta.useRight && width > 1) {\n pushFragment(rows, r, {\n graphemes: [{ glyph: border.right, width: Math.max(1, stringWidth(border.right)) }],\n styleId: rightColor,\n hyperlinkId: 0,\n leftPad: left + width - 1,\n });\n }\n }\n}\n\nfunction paintHorizontalEdge(\n rows: LayoutRows,\n y: number,\n x: number,\n width: number,\n style: BorderStyle,\n side: \"top\" | \"bottom\",\n useLeft: boolean,\n useRight: boolean,\n styleId: number,\n): void {\n if (width <= 0 || y < 0) return;\n const corners =\n side === \"top\" ? [style.topLeft, style.topRight] : [style.bottomLeft, style.bottomRight];\n const edge = side === \"top\" ? style.top : style.bottom;\n const graphemes: Array<{ glyph: string; width: number }> = [];\n for (let i = 0; i < width; i++) {\n let glyph: string;\n if (i === 0 && useLeft) glyph = corners[0]!;\n else if (i === width - 1 && useRight) glyph = corners[1]!;\n else glyph = edge;\n graphemes.push({ glyph, width: Math.max(1, stringWidth(glyph)) });\n }\n pushFragment(rows, y, { graphemes, styleId, hyperlinkId: 0, leftPad: x });\n}\n\nfunction pushFragment(rows: LayoutRows, y: number, frag: RowFragment): void {\n if (y < 0) return;\n while (rows.length <= y) rows.push([]);\n rows[y]!.push(frag);\n}\n\nfunction pickStyleId(color: ReadonlyArray<AnsiCode> | undefined, pools: RenderPools): number {\n return color ? pools.style.intern(color) : pools.style.none;\n}\n\n// Yoga measure function for text leaves — must match wrapLine() at rasterization time.\nfunction measureText(\n content: string,\n width: number,\n widthMode: MeasureMode,\n): { width: number; height: number } {\n const segmenter = getSegmenter();\n if (widthMode === MeasureMode.Undefined || width < 0) {\n let maxW = 0;\n let lines = 0;\n for (const line of content.split(\"\\n\")) {\n lines += 1;\n const w = stringWidth(line);\n if (w > maxW) maxW = w;\n }\n return { width: maxW, height: Math.max(1, lines) };\n }\n let maxW = 0;\n let totalLines = 0;\n for (const rawLine of content.split(\"\\n\")) {\n const wrapped = wrapLine(rawLine, Math.floor(width), segmenter);\n if (wrapped.length === 0) {\n totalLines += 1;\n continue;\n }\n totalLines += wrapped.length;\n for (const row of wrapped) {\n let w = 0;\n for (const g of row) w += g.width;\n if (w > maxW) maxW = w;\n }\n }\n return { width: maxW, height: Math.max(1, totalLines) };\n}\n\nfunction wrapLine(\n line: string,\n width: number,\n segmenter: Intl.Segmenter,\n): Array<Array<{ glyph: string; width: number }>> {\n if (width <= 0) return [];\n const rows: Array<Array<{ glyph: string; width: number }>> = [];\n let current: Array<{ glyph: string; width: number }> = [];\n let used = 0;\n for (const seg of segmenter.segment(line)) {\n const glyph = seg.segment;\n const gw = Math.max(0, stringWidth(glyph));\n if (gw === 0) continue;\n if (used + gw > width) {\n if (current.length > 0) rows.push(current);\n current = [];\n used = 0;\n if (gw > width) continue;\n }\n current.push({ glyph, width: gw });\n used += gw;\n }\n if (current.length > 0) rows.push(current);\n return rows;\n}\n\nfunction blitFragment(screen: Screen, frag: RowFragment, y: number, pools: RenderPools): void {\n let x = frag.leftPad;\n for (const { glyph, width } of frag.graphemes) {\n if (x >= screen.width) break;\n const charId = pools.char.intern(glyph);\n const cell: Cell = {\n charId,\n styleId: frag.styleId,\n hyperlinkId: frag.hyperlinkId,\n width: width === 2 ? CellWidth.Wide : CellWidth.Single,\n };\n screen.writeCell(x, y, cell);\n if (width === 2 && x + 1 < screen.width) {\n screen.writeCell(x + 1, y, {\n charId: 1,\n styleId: frag.styleId,\n hyperlinkId: frag.hyperlinkId,\n width: CellWidth.SpacerTail,\n });\n }\n x += width;\n }\n}\n\nlet _segmenter: Intl.Segmenter | undefined;\nfunction getSegmenter(): Intl.Segmenter {\n if (_segmenter) return _segmenter;\n _segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n return _segmenter;\n}\n","import Yoga, {\n Align,\n BoxSizing,\n Direction,\n Display,\n Edge,\n FlexDirection,\n Gutter,\n Justify,\n MeasureMode,\n type MeasureFunction,\n type Node as YogaNode,\n Wrap,\n} from \"yoga-layout\";\nimport type { CharPool } from \"../pools/char-pool.js\";\nimport type { HyperlinkPool } from \"../pools/hyperlink-pool.js\";\nimport type { StylePool } from \"../pools/style-pool.js\";\nimport { type BorderStyle, resolveBorderStyle } from \"./borders.js\";\nimport type { AlignItems, BoxNode, JustifyContent, LayoutNode, TextNode } from \"./node.js\";\n\nexport interface YogaPools {\n readonly char: CharPool;\n readonly style: StylePool;\n readonly hyperlink: HyperlinkPool;\n}\n\nexport interface NodeMeta {\n readonly node: LayoutNode;\n readonly border?: BorderStyle;\n readonly useTop: boolean;\n readonly useBottom: boolean;\n readonly useLeft: boolean;\n readonly useRight: boolean;\n /** Text style/hyperlink interned at build time, applied during rasterization. */\n readonly styleId: number;\n readonly hyperlinkId: number;\n}\n\nexport interface BuiltTree {\n readonly root: YogaNode;\n readonly meta: WeakMap<YogaNode, NodeMeta>;\n /** Children in tree order so the rasterizer can walk without yoga's own tree walk. */\n readonly children: ReadonlyMap<YogaNode, ReadonlyArray<YogaNode>>;\n}\n\nconst ALIGN_MAP: Record<AlignItems, Align> = {\n \"flex-start\": Align.FlexStart,\n \"flex-end\": Align.FlexEnd,\n center: Align.Center,\n stretch: Align.Stretch,\n baseline: Align.Baseline,\n};\n\nconst JUSTIFY_MAP: Record<JustifyContent, Justify> = {\n \"flex-start\": Justify.FlexStart,\n \"flex-end\": Justify.FlexEnd,\n center: Justify.Center,\n \"space-between\": Justify.SpaceBetween,\n \"space-around\": Justify.SpaceAround,\n \"space-evenly\": Justify.SpaceEvenly,\n};\n\n/** Build a yoga tree from a LayoutNode. Caller owns the root and must call freeRecursive(). */\nexport function buildYogaTree(\n node: LayoutNode,\n pools: YogaPools,\n measureText: (\n content: string,\n width: number,\n widthMode: MeasureMode,\n ) => { width: number; height: number },\n): BuiltTree {\n const meta = new WeakMap<YogaNode, NodeMeta>();\n const children = new Map<YogaNode, YogaNode[]>();\n\n const root = build(node, pools, measureText, meta, children);\n return { root, meta, children };\n}\n\nfunction build(\n node: LayoutNode,\n pools: YogaPools,\n measureText: (\n content: string,\n width: number,\n widthMode: MeasureMode,\n ) => { width: number; height: number },\n meta: WeakMap<YogaNode, NodeMeta>,\n children: Map<YogaNode, YogaNode[]>,\n): YogaNode {\n if (node.kind === \"text\") {\n return buildText(node, pools, measureText, meta);\n }\n return buildBox(node, pools, measureText, meta, children);\n}\n\nfunction buildText(\n node: TextNode,\n pools: YogaPools,\n measureText: (\n content: string,\n width: number,\n widthMode: MeasureMode,\n ) => { width: number; height: number },\n meta: WeakMap<YogaNode, NodeMeta>,\n): YogaNode {\n const yoga = Yoga.Node.create();\n yoga.setBoxSizing(BoxSizing.BorderBox);\n // Yoga's default flex-shrink is 0; CSS (and Ink) default is 1. Match CSS so\n // long text wraps to fit narrower containers instead of overflowing.\n yoga.setFlexShrink(1);\n const measure: MeasureFunction = (width, widthMode) =>\n measureText(node.content, width, widthMode);\n yoga.setMeasureFunc(measure);\n\n const styleId = node.style ? pools.style.intern(node.style) : pools.style.none;\n const hyperlinkId = pools.hyperlink.intern(node.hyperlink);\n meta.set(yoga, {\n node,\n useTop: false,\n useBottom: false,\n useLeft: false,\n useRight: false,\n styleId,\n hyperlinkId,\n });\n return yoga;\n}\n\nfunction buildBox(\n node: BoxNode,\n pools: YogaPools,\n measureText: (\n content: string,\n width: number,\n widthMode: MeasureMode,\n ) => { width: number; height: number },\n meta: WeakMap<YogaNode, NodeMeta>,\n children: Map<YogaNode, YogaNode[]>,\n): YogaNode {\n const yoga = Yoga.Node.create();\n yoga.setBoxSizing(BoxSizing.BorderBox);\n // Default shrink=1 to match CSS / Ink ergonomics — applyBoxStyle overrides if explicit.\n yoga.setFlexShrink(1);\n applyBoxStyle(yoga, node);\n\n const border = resolveBorderStyle(node.borderStyle);\n const useTop = border !== undefined && node.borderTop !== false;\n const useBottom = border !== undefined && node.borderBottom !== false;\n const useLeft = border !== undefined && node.borderLeft !== false;\n const useRight = border !== undefined && node.borderRight !== false;\n if (useTop) yoga.setBorder(Edge.Top, 1);\n if (useBottom) yoga.setBorder(Edge.Bottom, 1);\n if (useLeft) yoga.setBorder(Edge.Left, 1);\n if (useRight) yoga.setBorder(Edge.Right, 1);\n\n meta.set(yoga, {\n node,\n border,\n useTop,\n useBottom,\n useLeft,\n useRight,\n styleId: 0,\n hyperlinkId: 0,\n });\n\n const childList: YogaNode[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const childYoga = build(node.children[i]!, pools, measureText, meta, children);\n yoga.insertChild(childYoga, i);\n childList.push(childYoga);\n }\n children.set(yoga, childList);\n return yoga;\n}\n\nfunction applyBoxStyle(yoga: YogaNode, node: BoxNode): void {\n if (node.flexDirection === \"row\") yoga.setFlexDirection(FlexDirection.Row);\n else if (node.flexDirection === \"row-reverse\") yoga.setFlexDirection(FlexDirection.RowReverse);\n else if (node.flexDirection === \"column-reverse\")\n yoga.setFlexDirection(FlexDirection.ColumnReverse);\n else yoga.setFlexDirection(FlexDirection.Column);\n\n if (node.flexGrow !== undefined) yoga.setFlexGrow(node.flexGrow);\n if (node.flexShrink !== undefined) yoga.setFlexShrink(node.flexShrink);\n if (node.flexBasis !== undefined) yoga.setFlexBasis(node.flexBasis);\n if (node.flexWrap === \"wrap\") yoga.setFlexWrap(Wrap.Wrap);\n else if (node.flexWrap === \"wrap-reverse\") yoga.setFlexWrap(Wrap.WrapReverse);\n\n if (node.justifyContent) yoga.setJustifyContent(JUSTIFY_MAP[node.justifyContent]);\n if (node.alignItems) yoga.setAlignItems(ALIGN_MAP[node.alignItems]);\n if (node.alignSelf) yoga.setAlignSelf(ALIGN_MAP[node.alignSelf]);\n if (node.alignContent) {\n if (node.alignContent === \"space-between\") yoga.setAlignContent(Align.SpaceBetween);\n else if (node.alignContent === \"space-around\") yoga.setAlignContent(Align.SpaceAround);\n else yoga.setAlignContent(ALIGN_MAP[node.alignContent]);\n }\n\n if (node.width !== undefined) yoga.setWidth(node.width);\n if (node.height !== undefined) yoga.setHeight(node.height);\n if (node.minWidth !== undefined) yoga.setMinWidth(node.minWidth);\n if (node.minHeight !== undefined) yoga.setMinHeight(node.minHeight);\n if (node.maxWidth !== undefined) yoga.setMaxWidth(node.maxWidth);\n if (node.maxHeight !== undefined) yoga.setMaxHeight(node.maxHeight);\n\n // gap → both row + column gutters; specific overrides win.\n if (node.gap !== undefined) yoga.setGap(Gutter.All, node.gap);\n if (node.rowGap !== undefined) yoga.setGap(Gutter.Row, node.rowGap);\n if (node.columnGap !== undefined) yoga.setGap(Gutter.Column, node.columnGap);\n\n if (node.paddingTop !== undefined) yoga.setPadding(Edge.Top, node.paddingTop);\n if (node.paddingBottom !== undefined) yoga.setPadding(Edge.Bottom, node.paddingBottom);\n if (node.paddingLeft !== undefined) yoga.setPadding(Edge.Left, node.paddingLeft);\n if (node.paddingRight !== undefined) yoga.setPadding(Edge.Right, node.paddingRight);\n\n if (node.marginTop !== undefined) yoga.setMargin(Edge.Top, node.marginTop);\n if (node.marginBottom !== undefined) yoga.setMargin(Edge.Bottom, node.marginBottom);\n if (node.marginLeft !== undefined) yoga.setMargin(Edge.Left, node.marginLeft);\n if (node.marginRight !== undefined) yoga.setMargin(Edge.Right, node.marginRight);\n\n if (node.display === \"none\") yoga.setDisplay(Display.None);\n}\n\nexport { Direction, MeasureMode };\n","export interface BorderStyle {\n readonly topLeft: string;\n readonly top: string;\n readonly topRight: string;\n readonly left: string;\n readonly right: string;\n readonly bottomLeft: string;\n readonly bottom: string;\n readonly bottomRight: string;\n}\n\nexport type BorderStyleName = \"single\" | \"double\" | \"round\" | \"bold\" | \"ascii\";\n\nconst BORDER_PRESETS: Record<BorderStyleName, BorderStyle> = {\n single: {\n topLeft: \"┌\",\n top: \"─\",\n topRight: \"┐\",\n left: \"│\",\n right: \"│\",\n bottomLeft: \"└\",\n bottom: \"─\",\n bottomRight: \"┘\",\n },\n double: {\n topLeft: \"╔\",\n top: \"═\",\n topRight: \"╗\",\n left: \"║\",\n right: \"║\",\n bottomLeft: \"╚\",\n bottom: \"═\",\n bottomRight: \"╝\",\n },\n round: {\n topLeft: \"╭\",\n top: \"─\",\n topRight: \"╮\",\n left: \"│\",\n right: \"│\",\n bottomLeft: \"╰\",\n bottom: \"─\",\n bottomRight: \"╯\",\n },\n bold: {\n topLeft: \"┏\",\n top: \"━\",\n topRight: \"┓\",\n left: \"┃\",\n right: \"┃\",\n bottomLeft: \"┗\",\n bottom: \"━\",\n bottomRight: \"┛\",\n },\n ascii: {\n topLeft: \"+\",\n top: \"-\",\n topRight: \"+\",\n left: \"|\",\n right: \"|\",\n bottomLeft: \"+\",\n bottom: \"-\",\n bottomRight: \"+\",\n },\n};\n\nexport function resolveBorderStyle(\n style: BorderStyle | BorderStyleName | undefined,\n): BorderStyle | undefined {\n if (style === undefined) return undefined;\n if (typeof style === \"string\") return BORDER_PRESETS[style];\n return style;\n}\n","/** One-shot offline render of a React tree to ANSI bytes. */\n\nimport { type ReactNode, createElement } from \"react\";\nimport type { DiffPools } from \"../diff/diff-frames.js\";\nimport { ViewportContext } from \"../ink-compat/viewport.js\";\nimport { renderToScreen } from \"../layout/layout.js\";\nimport type { LayoutNode } from \"../layout/node.js\";\nimport { type HostRoot, hostToLayoutNode, reconciler } from \"../reconciler/host-config.js\";\nimport { CellWidth } from \"../screen/cell.js\";\n\nconst ESC = \"\\x1b\";\nconst ST = `${ESC}\\\\`;\n\nexport function renderToBytes(element: ReactNode, width: number, pools: DiffPools): string {\n const layout = renderTreeToLayout(element, width);\n const screen = renderToScreen(layout, width, pools);\n if (screen.height === 0) return \"\";\n\n let out = \"\";\n let curStyle = pools.style.none;\n let curLink = 0;\n\n for (let y = 0; y < screen.height; y++) {\n if (y > 0) {\n out += pools.style.transition(curStyle, pools.style.none);\n curStyle = pools.style.none;\n if (curLink !== 0) {\n out += `${ESC}]8;;${ST}`;\n curLink = 0;\n }\n out += \"\\r\\n\";\n }\n for (let x = 0; x < screen.width; x++) {\n const cell = screen.cellAt(x, y);\n if (!cell) continue;\n if (cell.width === CellWidth.SpacerTail) continue;\n if (cell.styleId !== curStyle) {\n out += pools.style.transition(curStyle, cell.styleId);\n curStyle = cell.styleId;\n }\n if (cell.hyperlinkId !== curLink) {\n const uri = pools.hyperlink.get(cell.hyperlinkId) ?? \"\";\n out += `${ESC}]8;;${uri}${ST}`;\n curLink = cell.hyperlinkId;\n }\n out += pools.char.get(cell.charId);\n }\n }\n\n out += pools.style.transition(curStyle, pools.style.none);\n if (curLink !== 0) out += `${ESC}]8;;${ST}`;\n out += \"\\r\\n\";\n return out;\n}\n\n/** Render the element through a fresh reconciler container, walk the resulting\n * host tree to a layout node, then unmount. Synchronous: react-reconciler\n * with isPrimaryRenderer=false + LegacyMode commits eagerly. */\nfunction renderTreeToLayout(element: ReactNode, width: number): LayoutNode {\n const root: HostRoot = {\n children: [],\n onCommit: () => {\n /* one-shot — caller reads root.children directly */\n },\n };\n const container = reconciler.createContainer(\n root,\n 0, // LegacyMode — sync\n null,\n false,\n null,\n \"rsx-static\",\n () => {\n /* recoverable error */\n },\n null,\n );\n const wrapped = createElement(\n ViewportContext.Provider,\n { value: { columns: width, rows: 24 } },\n element,\n );\n reconciler.updateContainer(wrapped, container, null, () => {});\n\n const layoutChildren: LayoutNode[] = [];\n for (const c of root.children) {\n const child = hostToLayoutNode(c);\n if (child) layoutChildren.push(child);\n }\n const layout: LayoutNode =\n layoutChildren.length === 1 ? layoutChildren[0]! : { kind: \"box\", children: layoutChildren };\n\n reconciler.updateContainer(null, container, null, () => {});\n\n return layout;\n}\n","import ReactReconciler from \"react-reconciler\";\nimport { type BoxProps, HOST_BOX, HOST_TEXT, type TextProps } from \"../react/components.js\";\nimport {\n type HostBox,\n type HostNode,\n type HostText,\n hostToLayoutNode,\n makeHostBox,\n makeHostRawText,\n makeHostText,\n} from \"./host-node.js\";\n\nexport interface HostRoot {\n readonly children: HostNode[];\n onCommit: () => void;\n}\n\ntype Container = HostRoot;\ntype Type = typeof HOST_BOX | typeof HOST_TEXT | string;\ntype Props = BoxProps | TextProps;\ntype Instance = HostBox | HostText;\ntype TextInstance = ReturnType<typeof makeHostRawText>;\ntype PublicInstance = Instance;\ntype HostContext = Record<string, never>;\ntype UpdatePayload = Props;\ntype ChildSet = never;\ntype TimeoutHandle = ReturnType<typeof setTimeout>;\ntype NoTimeout = -1;\n\nconst hostConfig: ReactReconciler.HostConfig<\n Type,\n Props,\n Container,\n Instance,\n TextInstance,\n never,\n never,\n PublicInstance,\n HostContext,\n UpdatePayload,\n ChildSet,\n TimeoutHandle,\n NoTimeout\n> = {\n supportsMutation: true,\n supportsPersistence: false,\n supportsHydration: false,\n // We're the only React renderer in this process. `false` would put us on\n // React's shared non-primary context-stack — re-entrant updateContainer\n // (the Static / emitStatic path) crashed against that. `true` gives us our\n // own context state, no shared-stack collisions.\n isPrimaryRenderer: true,\n noTimeout: -1,\n\n createInstance(type, props) {\n if (type === HOST_BOX) return makeHostBox(props as BoxProps);\n if (type === HOST_TEXT) return makeHostText(props as TextProps);\n throw new Error(`Reasonix renderer: unsupported element type: ${String(type)}`);\n },\n\n createTextInstance(text) {\n return makeHostRawText(text);\n },\n\n appendInitialChild(parent, child) {\n parent.children.push(child as HostNode);\n (child as HostNode).parent = parent;\n },\n\n appendChild(parent, child) {\n parent.children.push(child as HostNode);\n (child as HostNode).parent = parent;\n },\n\n appendChildToContainer(container, child) {\n container.children.push(child as HostNode);\n (child as HostNode).parent = null;\n },\n\n insertBefore(parent, child, beforeChild) {\n const idx = parent.children.indexOf(beforeChild as HostNode);\n if (idx < 0) parent.children.push(child as HostNode);\n else parent.children.splice(idx, 0, child as HostNode);\n (child as HostNode).parent = parent;\n },\n\n insertInContainerBefore(container, child, beforeChild) {\n const idx = container.children.indexOf(beforeChild as HostNode);\n if (idx < 0) container.children.push(child as HostNode);\n else container.children.splice(idx, 0, child as HostNode);\n (child as HostNode).parent = null;\n },\n\n removeChild(parent, child) {\n const idx = parent.children.indexOf(child as HostNode);\n if (idx >= 0) parent.children.splice(idx, 1);\n (child as HostNode).parent = null;\n },\n\n removeChildFromContainer(container, child) {\n const idx = container.children.indexOf(child as HostNode);\n if (idx >= 0) container.children.splice(idx, 1);\n },\n\n finalizeInitialChildren() {\n return false;\n },\n\n prepareUpdate(_instance, _type, _oldProps, newProps) {\n return newProps;\n },\n\n commitUpdate(instance, payload) {\n instance.props = payload;\n },\n\n commitTextUpdate(textInstance, _oldText, newText) {\n textInstance.text = newText;\n },\n\n resetTextContent() {\n /* no-op */\n },\n\n shouldSetTextContent() {\n return false;\n },\n\n getRootHostContext() {\n return {};\n },\n\n getChildHostContext() {\n return {};\n },\n\n getPublicInstance(instance) {\n return instance as Instance;\n },\n\n prepareForCommit() {\n return null;\n },\n\n resetAfterCommit(container) {\n container.onCommit();\n },\n\n preparePortalMount() {\n /* no-op */\n },\n\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n\n getCurrentEventPriority() {\n return DefaultEventPriority;\n },\n\n getInstanceFromNode() {\n return null;\n },\n\n beforeActiveInstanceBlur() {\n /* no-op */\n },\n\n afterActiveInstanceBlur() {\n /* no-op */\n },\n\n prepareScopeUpdate() {\n /* no-op */\n },\n\n getInstanceFromScope() {\n return null;\n },\n\n detachDeletedInstance() {\n /* no-op */\n },\n\n clearContainer(container) {\n container.children.length = 0;\n },\n};\n\nconst DefaultEventPriority = 16;\n\nexport const reconciler = ReactReconciler(hostConfig);\n\nexport { hostToLayoutNode };\n","import type { BoxNode, LayoutNode, TextNode } from \"../layout/node.js\";\nimport type { BoxProps, TextProps } from \"../react/components.js\";\n\nexport type HostType = \"box\" | \"text\" | \"raw-text\";\n\nexport interface HostBox {\n readonly type: \"box\";\n props: BoxProps;\n children: HostNode[];\n parent: HostBox | null;\n}\n\nexport interface HostText {\n readonly type: \"text\";\n props: TextProps;\n children: HostNode[];\n parent: HostBox | null;\n}\n\nexport interface HostRawText {\n readonly type: \"raw-text\";\n text: string;\n parent: HostBox | HostText | null;\n}\n\nexport type HostNode = HostBox | HostText | HostRawText;\n\nexport function makeHostBox(props: BoxProps): HostBox {\n return { type: \"box\", props, children: [], parent: null };\n}\n\nexport function makeHostText(props: TextProps): HostText {\n return { type: \"text\", props, children: [], parent: null };\n}\n\nexport function makeHostRawText(text: string): HostRawText {\n return { type: \"raw-text\", text, parent: null };\n}\n\nexport function hostToLayoutNode(node: HostNode): LayoutNode | null {\n if (node.type === \"raw-text\") {\n return { kind: \"text\", content: node.text };\n }\n if (node.type === \"text\") {\n return {\n kind: \"text\",\n content: collectText(node.children),\n ...(node.props.style ? { style: node.props.style } : {}),\n ...(node.props.hyperlink ? { hyperlink: node.props.hyperlink } : {}),\n } satisfies TextNode;\n }\n const layoutChildren: LayoutNode[] = [];\n for (const c of node.children) {\n const child = hostToLayoutNode(c);\n if (child) layoutChildren.push(child);\n }\n const p = node.props;\n const out: BoxNode = { kind: \"box\", children: layoutChildren };\n return assignBoxProps(out, p);\n}\n\nfunction collectText(children: HostNode[]): string {\n let out = \"\";\n for (const child of children) {\n if (child.type === \"raw-text\") out += child.text;\n else if (child.type === \"text\") out += collectText(child.children);\n }\n return out;\n}\n\nfunction assignBoxProps(node: BoxNode, props: BoxProps): BoxNode {\n const result: { -readonly [K in keyof BoxNode]: BoxNode[K] } = { ...node };\n\n // padding shorthand: padding > paddingX/Y > side-specific\n const padAll = props.padding;\n const padX = props.paddingX ?? padAll;\n const padY = props.paddingY ?? padAll;\n const padTop = props.paddingTop ?? padY;\n const padBottom = props.paddingBottom ?? padY;\n const padLeft = props.paddingLeft ?? padX;\n const padRight = props.paddingRight ?? padX;\n if (padTop !== undefined) result.paddingTop = padTop;\n if (padBottom !== undefined) result.paddingBottom = padBottom;\n if (padLeft !== undefined) result.paddingLeft = padLeft;\n if (padRight !== undefined) result.paddingRight = padRight;\n\n // margin shorthand: margin > marginX/Y > side-specific\n const marginAll = props.margin;\n const marginX = props.marginX ?? marginAll;\n const marginY = props.marginY ?? marginAll;\n const marginTop = props.marginTop ?? marginY;\n const marginBottom = props.marginBottom ?? marginY;\n const marginLeft = props.marginLeft ?? marginX;\n const marginRight = props.marginRight ?? marginX;\n if (marginTop !== undefined) result.marginTop = marginTop;\n if (marginBottom !== undefined) result.marginBottom = marginBottom;\n if (marginLeft !== undefined) result.marginLeft = marginLeft;\n if (marginRight !== undefined) result.marginRight = marginRight;\n\n if (props.flexDirection !== undefined) result.flexDirection = props.flexDirection;\n if (props.flexGrow !== undefined) result.flexGrow = props.flexGrow;\n if (props.flexShrink !== undefined) result.flexShrink = props.flexShrink;\n if (props.flexBasis !== undefined) result.flexBasis = props.flexBasis;\n if (props.flexWrap !== undefined) result.flexWrap = props.flexWrap;\n if (props.justifyContent !== undefined) result.justifyContent = props.justifyContent;\n if (props.alignItems !== undefined) result.alignItems = props.alignItems;\n if (props.alignSelf !== undefined) result.alignSelf = props.alignSelf;\n if (props.alignContent !== undefined) result.alignContent = props.alignContent;\n if (props.width !== undefined) result.width = props.width;\n if (props.height !== undefined) result.height = props.height;\n if (props.minWidth !== undefined) result.minWidth = props.minWidth;\n if (props.minHeight !== undefined) result.minHeight = props.minHeight;\n if (props.maxWidth !== undefined) result.maxWidth = props.maxWidth;\n if (props.maxHeight !== undefined) result.maxHeight = props.maxHeight;\n if (props.gap !== undefined) result.gap = props.gap;\n if (props.columnGap !== undefined) result.columnGap = props.columnGap;\n if (props.rowGap !== undefined) result.rowGap = props.rowGap;\n if (props.display !== undefined) result.display = props.display;\n\n if (props.borderStyle !== undefined) result.borderStyle = props.borderStyle;\n if (props.borderTop !== undefined) result.borderTop = props.borderTop;\n if (props.borderBottom !== undefined) result.borderBottom = props.borderBottom;\n if (props.borderLeft !== undefined) result.borderLeft = props.borderLeft;\n if (props.borderRight !== undefined) result.borderRight = props.borderRight;\n if (props.borderColor !== undefined) result.borderColor = props.borderColor;\n if (props.borderTopColor !== undefined) result.borderTopColor = props.borderTopColor;\n if (props.borderBottomColor !== undefined) result.borderBottomColor = props.borderBottomColor;\n if (props.borderLeftColor !== undefined) result.borderLeftColor = props.borderLeftColor;\n if (props.borderRightColor !== undefined) result.borderRightColor = props.borderRightColor;\n return result;\n}\n","/** Cursor request from React → renderer. mount() polls this on every frame commit. */\n\nimport { createContext, useContext, useEffect } from \"react\";\n\nexport interface CursorTarget {\n /** Column from the left edge of the viewport (0-based). Wide chars count as 2. */\n readonly col: number;\n /** Row from the BOTTOM of the rendered screen (0 = last row). Default 0. */\n readonly rowFromBottom?: number;\n /** Hide the terminal cursor when false. Default true. */\n readonly visible?: boolean;\n}\n\nexport type CursorSetter = (target: CursorTarget | null) => void;\n\nexport const CursorContext = createContext<CursorSetter | null>(null);\n\n/** Register / replace / clear the cursor target. Pass `null` to release. */\nexport function useCursor(target: CursorTarget | null): void {\n const setter = useContext(CursorContext);\n // Snapshot to primitive scalars so re-renders with structurally equal\n // targets don't re-fire the effect (callers usually pass fresh object literals).\n const isSet = target !== null;\n const col = target?.col ?? 0;\n const rowFromBottom = target?.rowFromBottom ?? 0;\n const visible = target?.visible !== false;\n useEffect(() => {\n if (!setter) return;\n if (!isSet) {\n setter(null);\n return;\n }\n setter({ col, rowFromBottom, visible });\n return () => setter(null);\n }, [setter, isSet, col, rowFromBottom, visible]);\n}\n","export { Box, type InkBoxProps } from \"./Box.js\";\nexport { Text, type InkTextProps } from \"./Text.js\";\nexport { Spacer } from \"./Spacer.js\";\nexport { Static, type StaticProps } from \"./Static.js\";\nexport { type RendererBridge, RendererBridgeContext } from \"./renderer-bridge.js\";\nexport { type ColorName, bgCode, fgCode } from \"./colors.js\";\nexport {\n type ViewportSize,\n StdoutContext,\n StdoutProvider,\n ViewportContext,\n useStdout,\n} from \"./viewport.js\";\nexport { type AppApi, AppContext, useApp } from \"./use-app.js\";\nexport { type InkInputHandler, type InkKey, type UseInputOptions, useInput } from \"./use-input.js\";\nexport { type InkLikeInstance, type InkLikeRenderOptions, render } from \"./render.js\";\n","// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { type ReactNode } from \"react\";\nimport type { BorderStyleName } from \"../layout/borders.js\";\nimport type { AlignItems, FlexWrap, JustifyContent } from \"../layout/node.js\";\nimport { Box as RsxBox } from \"../react/components.js\";\nimport { fgCode } from \"./colors.js\";\n\nexport interface InkBoxProps {\n readonly children?: ReactNode;\n readonly flexDirection?: \"column\" | \"row\" | \"column-reverse\" | \"row-reverse\";\n readonly flexGrow?: number;\n readonly flexShrink?: number;\n readonly flexBasis?: number | `${number}%` | \"auto\";\n readonly flexWrap?: FlexWrap;\n readonly padding?: number;\n readonly paddingX?: number;\n readonly paddingY?: number;\n readonly paddingTop?: number;\n readonly paddingBottom?: number;\n readonly paddingLeft?: number;\n readonly paddingRight?: number;\n readonly margin?: number;\n readonly marginX?: number;\n readonly marginY?: number;\n readonly marginTop?: number;\n readonly marginBottom?: number;\n readonly marginLeft?: number;\n readonly marginRight?: number;\n readonly borderStyle?: BorderStyleName;\n readonly borderColor?: string;\n readonly borderTopColor?: string;\n readonly borderBottomColor?: string;\n readonly borderLeftColor?: string;\n readonly borderRightColor?: string;\n readonly borderTop?: boolean;\n readonly borderBottom?: boolean;\n readonly borderLeft?: boolean;\n readonly borderRight?: boolean;\n readonly width?: number | `${number}%`;\n readonly height?: number | `${number}%`;\n readonly minWidth?: number | `${number}%`;\n readonly minHeight?: number | `${number}%`;\n readonly maxWidth?: number | `${number}%`;\n readonly maxHeight?: number | `${number}%`;\n readonly justifyContent?: JustifyContent;\n readonly alignItems?: AlignItems;\n readonly alignSelf?: AlignItems;\n readonly alignContent?: AlignItems | \"space-between\" | \"space-around\";\n readonly gap?: number;\n readonly columnGap?: number;\n readonly rowGap?: number;\n readonly display?: \"flex\" | \"none\";\n}\n\nexport function Box(props: InkBoxProps): React.ReactElement {\n const borderColor = fgCode(props.borderColor);\n const borderTopColor = fgCode(props.borderTopColor);\n const borderBottomColor = fgCode(props.borderBottomColor);\n const borderLeftColor = fgCode(props.borderLeftColor);\n const borderRightColor = fgCode(props.borderRightColor);\n return (\n <RsxBox\n flexDirection={props.flexDirection ?? \"row\"}\n flexGrow={props.flexGrow}\n flexShrink={props.flexShrink}\n flexBasis={props.flexBasis}\n flexWrap={props.flexWrap}\n justifyContent={props.justifyContent}\n alignItems={props.alignItems}\n alignSelf={props.alignSelf}\n alignContent={props.alignContent}\n width={props.width}\n height={props.height}\n minWidth={props.minWidth}\n minHeight={props.minHeight}\n maxWidth={props.maxWidth}\n maxHeight={props.maxHeight}\n gap={props.gap}\n columnGap={props.columnGap}\n rowGap={props.rowGap}\n display={props.display}\n padding={props.padding}\n paddingX={props.paddingX}\n paddingY={props.paddingY}\n paddingTop={props.paddingTop}\n paddingBottom={props.paddingBottom}\n paddingLeft={props.paddingLeft}\n paddingRight={props.paddingRight}\n margin={props.margin}\n marginX={props.marginX}\n marginY={props.marginY}\n marginTop={props.marginTop}\n marginBottom={props.marginBottom}\n marginLeft={props.marginLeft}\n marginRight={props.marginRight}\n borderStyle={props.borderStyle}\n borderColor={borderColor ? [borderColor] : undefined}\n borderTopColor={borderTopColor ? [borderTopColor] : undefined}\n borderBottomColor={borderBottomColor ? [borderBottomColor] : undefined}\n borderLeftColor={borderLeftColor ? [borderLeftColor] : undefined}\n borderRightColor={borderRightColor ? [borderRightColor] : undefined}\n borderTop={props.borderTop}\n borderBottom={props.borderBottom}\n borderLeft={props.borderLeft}\n borderRight={props.borderRight}\n >\n {props.children}\n </RsxBox>\n );\n}\n","import type { AnsiCode } from \"../pools/style-pool.js\";\n\nexport type ColorName =\n | \"black\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"blue\"\n | \"magenta\"\n | \"cyan\"\n | \"white\"\n | \"gray\"\n | \"grey\"\n | \"blackBright\"\n | \"redBright\"\n | \"greenBright\"\n | \"yellowBright\"\n | \"blueBright\"\n | \"magentaBright\"\n | \"cyanBright\"\n | \"whiteBright\";\n\nconst FG_BASE: Record<ColorName, number> = {\n black: 30,\n red: 31,\n green: 32,\n yellow: 33,\n blue: 34,\n magenta: 35,\n cyan: 36,\n white: 37,\n gray: 90,\n grey: 90,\n blackBright: 90,\n redBright: 91,\n greenBright: 92,\n yellowBright: 93,\n blueBright: 94,\n magentaBright: 95,\n cyanBright: 96,\n whiteBright: 97,\n};\n\nconst FG_RESET = 39;\nconst BG_RESET = 49;\n\nexport function fgCode(color: string | undefined): AnsiCode | null {\n if (!color) return null;\n if (color.startsWith(\"#\")) {\n const rgb = parseHex(color);\n if (!rgb) return null;\n return { apply: `\\x1b[38;2;${rgb[0]};${rgb[1]};${rgb[2]}m`, revert: `\\x1b[${FG_RESET}m` };\n }\n const code = FG_BASE[color as ColorName];\n if (code === undefined) return null;\n return { apply: `\\x1b[${code}m`, revert: `\\x1b[${FG_RESET}m` };\n}\n\nexport function bgCode(color: string | undefined): AnsiCode | null {\n if (!color) return null;\n if (color.startsWith(\"#\")) {\n const rgb = parseHex(color);\n if (!rgb) return null;\n return { apply: `\\x1b[48;2;${rgb[0]};${rgb[1]};${rgb[2]}m`, revert: `\\x1b[${BG_RESET}m` };\n }\n const base = FG_BASE[color as ColorName];\n if (base === undefined) return null;\n const bg = base < 90 ? base + 10 : base + 10;\n return { apply: `\\x1b[${bg}m`, revert: `\\x1b[${BG_RESET}m` };\n}\n\nfunction parseHex(hex: string): [number, number, number] | null {\n const s = hex.slice(1);\n if (s.length === 3) {\n const r = Number.parseInt(s[0]! + s[0]!, 16);\n const g = Number.parseInt(s[1]! + s[1]!, 16);\n const b = Number.parseInt(s[2]! + s[2]!, 16);\n return Number.isNaN(r) ? null : [r, g, b];\n }\n if (s.length === 6) {\n const r = Number.parseInt(s.slice(0, 2), 16);\n const g = Number.parseInt(s.slice(2, 4), 16);\n const b = Number.parseInt(s.slice(4, 6), 16);\n return Number.isNaN(r) ? null : [r, g, b];\n }\n return null;\n}\n","// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { type ReactNode } from \"react\";\nimport type { AnsiCode } from \"../pools/style-pool.js\";\nimport { Text as RsxText } from \"../react/components.js\";\nimport { bgCode, fgCode } from \"./colors.js\";\n\nexport interface InkTextProps {\n readonly children?: ReactNode;\n readonly color?: string;\n readonly backgroundColor?: string;\n readonly bold?: boolean;\n readonly dimColor?: boolean;\n readonly italic?: boolean;\n readonly underline?: boolean;\n readonly strikethrough?: boolean;\n readonly inverse?: boolean;\n readonly wrap?: \"wrap\" | \"truncate\" | \"truncate-start\" | \"truncate-middle\" | \"truncate-end\";\n}\n\nconst SGR = {\n bold: { apply: \"\\x1b[1m\", revert: \"\\x1b[22m\" },\n dim: { apply: \"\\x1b[2m\", revert: \"\\x1b[22m\" },\n italic: { apply: \"\\x1b[3m\", revert: \"\\x1b[23m\" },\n underline: { apply: \"\\x1b[4m\", revert: \"\\x1b[24m\" },\n inverse: { apply: \"\\x1b[7m\", revert: \"\\x1b[27m\" },\n strikethrough: { apply: \"\\x1b[9m\", revert: \"\\x1b[29m\" },\n} as const;\n\nexport function Text(props: InkTextProps): React.ReactElement {\n const codes: AnsiCode[] = [];\n const fg = fgCode(props.color);\n if (fg) codes.push(fg);\n const bg = bgCode(props.backgroundColor);\n if (bg) codes.push(bg);\n if (props.bold) codes.push(SGR.bold);\n if (props.dimColor) codes.push(SGR.dim);\n if (props.italic) codes.push(SGR.italic);\n if (props.underline) codes.push(SGR.underline);\n if (props.inverse) codes.push(SGR.inverse);\n if (props.strikethrough) codes.push(SGR.strikethrough);\n return <RsxText style={codes.length > 0 ? codes : undefined}>{props.children}</RsxText>;\n}\n","// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Box } from \"../react/components.js\";\n\nexport function Spacer(): React.ReactElement {\n return <Box flexGrow={1} />;\n}\n","// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { type ReactNode, useContext, useEffect, useRef } from \"react\";\nimport { Box } from \"../react/components.js\";\nimport { RendererBridgeContext } from \"./renderer-bridge.js\";\n\nexport interface StaticProps<T> {\n readonly items: ReadonlyArray<T>;\n readonly children: (item: T, index: number) => ReactNode;\n}\n\nexport function Static<T>(props: StaticProps<T>): React.ReactElement | null {\n const bridge = useContext(RendererBridgeContext);\n const lastIndex = useRef(0);\n\n useEffect(() => {\n if (!bridge) return;\n if (props.items.length < lastIndex.current) {\n lastIndex.current = props.items.length;\n return;\n }\n if (props.items.length === lastIndex.current) return;\n const fresh = props.items.slice(lastIndex.current);\n const startIndex = lastIndex.current;\n lastIndex.current = props.items.length;\n bridge.emitStatic(\n <Box flexDirection=\"column\">\n {fresh.map((item, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: Static items are positional and append-only\n <React.Fragment key={`s-${startIndex + i}`}>\n {props.children(item, startIndex + i)}\n </React.Fragment>\n ))}\n </Box>,\n );\n }, [bridge, props.items, props.children]);\n\n if (bridge) return null;\n return (\n <Box flexDirection=\"column\">\n {props.items.map((item, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: fallback path with no bridge — positional keys are fine\n <React.Fragment key={`s-${i}`}>{props.children(item, i)}</React.Fragment>\n ))}\n </Box>\n );\n}\n","import { type Keystroke, useKeystroke } from \"../input/index.js\";\n\nexport interface InkKey {\n readonly upArrow: boolean;\n readonly downArrow: boolean;\n readonly leftArrow: boolean;\n readonly rightArrow: boolean;\n readonly pageDown: boolean;\n readonly pageUp: boolean;\n readonly return: boolean;\n readonly escape: boolean;\n readonly ctrl: boolean;\n readonly shift: boolean;\n readonly tab: boolean;\n readonly backspace: boolean;\n readonly delete: boolean;\n readonly meta: boolean;\n}\n\nexport type InkInputHandler = (input: string, key: InkKey) => void;\n\nexport interface UseInputOptions {\n readonly isActive?: boolean;\n}\n\nexport function useInput(handler: InkInputHandler, options: UseInputOptions = {}): void {\n const active = options.isActive !== false;\n useKeystroke((k: Keystroke) => {\n if (!active) return;\n handler(k.input ?? \"\", toInkKey(k));\n });\n}\n\nfunction toInkKey(k: Keystroke): InkKey {\n return {\n upArrow: k.upArrow,\n downArrow: k.downArrow,\n leftArrow: k.leftArrow,\n rightArrow: k.rightArrow,\n pageDown: k.pageDown,\n pageUp: k.pageUp,\n return: k.return,\n escape: k.escape,\n ctrl: k.ctrl,\n shift: k.shift,\n tab: k.tab,\n backspace: k.backspace,\n delete: k.delete,\n meta: k.meta,\n };\n}\n","/** Ink-shaped render() that mounts a React tree on the cell-diff renderer. */\n\nimport type { ReactNode } from \"react\";\nimport { CharPool } from \"../pools/char-pool.js\";\nimport { HyperlinkPool } from \"../pools/hyperlink-pool.js\";\nimport { StylePool } from \"../pools/style-pool.js\";\nimport { type Handle, mount } from \"../reconciler/mount.js\";\n\nexport interface InkLikeRenderOptions {\n readonly stdout?: NodeJS.WriteStream;\n readonly stdin?: NodeJS.ReadStream;\n readonly stderr?: NodeJS.WriteStream;\n /** Default true. Listens for Ctrl+C on stdin and unmounts. */\n readonly exitOnCtrlC?: boolean;\n /** Ink had this; we don't patch console, so this option is accepted but ignored. */\n readonly patchConsole?: boolean;\n}\n\nexport interface InkLikeInstance {\n rerender(element: ReactNode): void;\n unmount(): void;\n waitUntilExit(): Promise<void>;\n cleanup(): void;\n clear(): void;\n}\n\nexport function render(element: ReactNode, opts: InkLikeRenderOptions = {}): InkLikeInstance {\n const stdout = opts.stdout ?? process.stdout;\n const stdin = opts.stdin ?? process.stdin;\n const exitOnCtrlC = opts.exitOnCtrlC !== false;\n\n const pools = {\n char: new CharPool(),\n style: new StylePool(),\n hyperlink: new HyperlinkPool(),\n };\n\n let resolveExit: () => void = () => {};\n let exitError: Error | undefined;\n const exitPromise = new Promise<void>((resolve, reject) => {\n resolveExit = () => {\n if (exitError) reject(exitError);\n else resolve();\n };\n });\n\n let destroyed = false;\n let handle: Handle | null = null;\n\n const onResize = (): void => {\n if (destroyed || !handle) return;\n handle.resize(stdout.columns ?? 80, stdout.rows ?? 24);\n };\n\n const onCtrlCData = (chunk: Buffer | string): void => {\n if (destroyed || !exitOnCtrlC) return;\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n // Ctrl+C in raw mode is a literal \\x03; outside raw mode the terminal turns\n // it into SIGINT and we never see it here. Either path lands in unmount.\n if (text.includes(\"\\x03\")) instance.unmount();\n };\n\n handle = mount(element, {\n viewportWidth: stdout.columns ?? 80,\n viewportHeight: stdout.rows ?? 24,\n pools,\n write: (bytes) => stdout.write(bytes),\n stdin,\n stdout,\n onExit: (err) => {\n if (destroyed) return;\n if (err) exitError = err;\n // Tear down on app-driven exit (useApp().exit()).\n instance.unmount();\n },\n });\n\n stdout.on(\"resize\", onResize);\n stdin.on(\"data\", onCtrlCData);\n\n const sigintListener = (): void => {\n if (!destroyed) instance.unmount();\n };\n if (exitOnCtrlC) process.on(\"SIGINT\", sigintListener);\n\n const instance: InkLikeInstance = {\n rerender(next) {\n if (destroyed || !handle) return;\n handle.update(next);\n },\n unmount() {\n if (destroyed) return;\n destroyed = true;\n stdout.off(\"resize\", onResize);\n stdin.off(\"data\", onCtrlCData);\n if (exitOnCtrlC) process.off(\"SIGINT\", sigintListener);\n handle?.destroy();\n handle = null;\n resolveExit();\n },\n waitUntilExit() {\n return exitPromise;\n },\n cleanup() {\n // Ink uses cleanup() to clear listeners without unmounting; for our renderer\n // the listeners are bound to the handle's lifetime, so this is a no-op\n // unless explicitly unmounting.\n },\n clear() {\n if (destroyed) return;\n stdout.write(\"\\x1b[2J\\x1b[H\");\n },\n };\n\n return instance;\n}\n","import { Fragment, type ReactElement, type ReactNode, isValidElement } from \"react\";\nimport { type RenderPools, renderToScreen } from \"../layout/layout.js\";\nimport type { BoxNode, LayoutNode, TextNode } from \"../layout/node.js\";\nimport type { Screen } from \"../screen/screen.js\";\nimport { type BoxProps, HOST_BOX, HOST_TEXT, type TextProps } from \"./components.js\";\n\nexport interface RenderOptions {\n readonly width: number;\n readonly pools: RenderPools;\n}\n\nexport function render(element: ReactNode, opts: RenderOptions): Screen {\n const node = treeToLayoutNode(element) ?? emptyBox();\n return renderToScreen(node, opts.width, opts.pools);\n}\n\nfunction treeToLayoutNode(element: ReactNode): LayoutNode | null {\n if (element === null || element === undefined || typeof element === \"boolean\") return null;\n if (typeof element === \"string\" || typeof element === \"number\") {\n return { kind: \"text\", content: String(element) };\n }\n if (Array.isArray(element)) {\n const children = element.map(treeToLayoutNode).filter(notNull);\n return children.length > 0 ? { kind: \"box\", children } : null;\n }\n if (isValidElement(element)) {\n return elementToLayoutNode(element);\n }\n return null;\n}\n\nfunction elementToLayoutNode(element: ReactElement): LayoutNode | null {\n const type = element.type;\n const props = element.props as { children?: ReactNode };\n\n if (type === HOST_BOX) {\n const boxProps = element.props as BoxProps;\n const children = childrenToLayoutNodes(props.children);\n return assignAllBoxProps({ kind: \"box\", children }, boxProps);\n }\n\n if (type === HOST_TEXT) {\n const textProps = element.props as TextProps;\n return {\n kind: \"text\",\n content: collectText(textProps.children),\n ...(textProps.style ? { style: textProps.style } : {}),\n ...(textProps.hyperlink ? { hyperlink: textProps.hyperlink } : {}),\n } satisfies TextNode;\n }\n\n if (type === Fragment) {\n const children = childrenToLayoutNodes(props.children);\n return children.length === 1 ? children[0]! : { kind: \"box\", children };\n }\n\n if (typeof type === \"function\") {\n const Component = type as (props: unknown) => ReactNode;\n return treeToLayoutNode(Component(props));\n }\n\n return null;\n}\n\nfunction childrenToLayoutNodes(children: ReactNode): LayoutNode[] {\n if (children === null || children === undefined || typeof children === \"boolean\") return [];\n if (Array.isArray(children)) {\n return children.map(treeToLayoutNode).filter(notNull);\n }\n const node = treeToLayoutNode(children);\n return node ? [node] : [];\n}\n\nfunction collectText(children: ReactNode): string {\n if (children === null || children === undefined || typeof children === \"boolean\") return \"\";\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (Array.isArray(children)) {\n return children.map(collectText).join(\"\");\n }\n if (isValidElement(children)) {\n const inner = (children.props as { children?: ReactNode }).children;\n return collectText(inner);\n }\n return \"\";\n}\n\nfunction emptyBox(): BoxNode {\n return { kind: \"box\", children: [] };\n}\n\nfunction assignAllBoxProps(node: BoxNode, props: BoxProps): BoxNode {\n const r: { -readonly [K in keyof BoxNode]: BoxNode[K] } = { ...node };\n const padAll = props.padding;\n const padX = props.paddingX ?? padAll;\n const padY = props.paddingY ?? padAll;\n if ((props.paddingTop ?? padY) !== undefined) r.paddingTop = props.paddingTop ?? padY;\n if ((props.paddingBottom ?? padY) !== undefined) r.paddingBottom = props.paddingBottom ?? padY;\n if ((props.paddingLeft ?? padX) !== undefined) r.paddingLeft = props.paddingLeft ?? padX;\n if ((props.paddingRight ?? padX) !== undefined) r.paddingRight = props.paddingRight ?? padX;\n const marginAll = props.margin;\n const marginX = props.marginX ?? marginAll;\n const marginY = props.marginY ?? marginAll;\n if ((props.marginTop ?? marginY) !== undefined) r.marginTop = props.marginTop ?? marginY;\n if ((props.marginBottom ?? marginY) !== undefined) r.marginBottom = props.marginBottom ?? marginY;\n if ((props.marginLeft ?? marginX) !== undefined) r.marginLeft = props.marginLeft ?? marginX;\n if ((props.marginRight ?? marginX) !== undefined) r.marginRight = props.marginRight ?? marginX;\n if (props.flexDirection !== undefined) r.flexDirection = props.flexDirection;\n if (props.flexGrow !== undefined) r.flexGrow = props.flexGrow;\n if (props.flexShrink !== undefined) r.flexShrink = props.flexShrink;\n if (props.flexBasis !== undefined) r.flexBasis = props.flexBasis;\n if (props.flexWrap !== undefined) r.flexWrap = props.flexWrap;\n if (props.justifyContent !== undefined) r.justifyContent = props.justifyContent;\n if (props.alignItems !== undefined) r.alignItems = props.alignItems;\n if (props.alignSelf !== undefined) r.alignSelf = props.alignSelf;\n if (props.alignContent !== undefined) r.alignContent = props.alignContent;\n if (props.width !== undefined) r.width = props.width;\n if (props.height !== undefined) r.height = props.height;\n if (props.minWidth !== undefined) r.minWidth = props.minWidth;\n if (props.minHeight !== undefined) r.minHeight = props.minHeight;\n if (props.maxWidth !== undefined) r.maxWidth = props.maxWidth;\n if (props.maxHeight !== undefined) r.maxHeight = props.maxHeight;\n if (props.gap !== undefined) r.gap = props.gap;\n if (props.columnGap !== undefined) r.columnGap = props.columnGap;\n if (props.rowGap !== undefined) r.rowGap = props.rowGap;\n if (props.display !== undefined) r.display = props.display;\n if (props.borderStyle !== undefined) r.borderStyle = props.borderStyle;\n if (props.borderTop !== undefined) r.borderTop = props.borderTop;\n if (props.borderBottom !== undefined) r.borderBottom = props.borderBottom;\n if (props.borderLeft !== undefined) r.borderLeft = props.borderLeft;\n if (props.borderRight !== undefined) r.borderRight = props.borderRight;\n if (props.borderColor !== undefined) r.borderColor = props.borderColor;\n if (props.borderTopColor !== undefined) r.borderTopColor = props.borderTopColor;\n if (props.borderBottomColor !== undefined) r.borderBottomColor = props.borderBottomColor;\n if (props.borderLeftColor !== undefined) r.borderLeftColor = props.borderLeftColor;\n if (props.borderRightColor !== undefined) r.borderRightColor = props.borderRightColor;\n return r;\n}\n\nfunction notNull<T>(v: T | null): v is T {\n return v !== null;\n}\n"],"mappings":"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","names":["part","id","createElement","createContext","createContext","useContext","createContext","useContext","measureText","maxW","createElement","ESC","ST","layout","createElement","createContext","useContext","useEffect","layout","createElement","Box","Text","React","Box","React","React","Text","React","React","React","React","useContext","useEffect","useContext","useEffect","React"]}
@@ -3,7 +3,7 @@ import {
3
3
  ApprovalCard,
4
4
  ViewportBudgetProvider,
5
5
  useReserveRows
6
- } from "./chunk-BGTXZKNY.js";
6
+ } from "./chunk-2K5D5J3I.js";
7
7
  import {
8
8
  CharPool,
9
9
  HyperlinkPool,
@@ -11,7 +11,7 @@ import {
11
11
  ink_compat_exports,
12
12
  mount,
13
13
  useKeystroke
14
- } from "./chunk-JHXQDL7B.js";
14
+ } from "./chunk-V3DLUJY6.js";
15
15
  import "./chunk-2H7UOFLK.js";
16
16
 
17
17
  // src/cli/commands/flicker-demo.tsx
@@ -162,4 +162,4 @@ async function runFlickerDemo(opts = {}) {
162
162
  export {
163
163
  runFlickerDemo
164
164
  };
165
- //# sourceMappingURL=flicker-demo-MOB6GAW4.js.map
165
+ //# sourceMappingURL=flicker-demo-YCYC5AR7.js.map