@gridland/web 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TUI.tsx","../src/core-shims/index.ts","../src/core-shims/rgba.ts","../src/core-shims/types.ts","../src/browser-text-buffer.ts","../src/browser-text-buffer-view.ts","../src/browser-syntax-style.ts","../src/browser-render-context.ts","../src/browser-buffer.ts","../src/canvas-painter.ts","../src/selection-manager.ts","../src/browser-renderer.ts","../src/browser-context.ts","../src/create-browser-root.tsx"],"sourcesContent":["import React, {\n useRef,\n useEffect,\n useState,\n type ReactNode,\n type CSSProperties,\n} from \"react\"\nimport { BrowserRenderer, setRootRenderableClass } from \"./browser-renderer\"\nimport { createBrowserRoot, type BrowserRoot } from \"./create-browser-root\"\nimport { CanvasPainter } from \"./canvas-painter\"\nimport { RootRenderable } from \"@opentui/core\"\n\nexport interface TUIProps {\n children: ReactNode\n /** CSS styles for the outer container div */\n style?: CSSProperties\n /** CSS class for the outer container div */\n className?: string\n /** Font size in pixels (default: 14) */\n fontSize?: number\n /** Font family (default: monospace stack) */\n fontFamily?: string\n /** Auto-focus the canvas for keyboard input (default: true) */\n autoFocus?: boolean\n /** Called when the renderer is ready */\n onReady?: (renderer: BrowserRenderer) => void\n}\n\n/**\n * A single React component that renders TUI content to an HTML5 Canvas.\n * Gridland is built on the opentui engine.\n *\n * Usage:\n * ```tsx\n * <TUI style={{ width: \"100%\", height: 400 }}>\n * <box border borderStyle=\"rounded\">\n * <text>Hello from Gridland!</text>\n * </box>\n * </TUI>\n * ```\n *\n * No dynamic imports, no wrapper chains. Just a component.\n */\nexport function TUI({\n children,\n style,\n className,\n fontSize = 14,\n fontFamily = \"'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'Consolas', monospace\",\n autoFocus = true,\n onReady,\n}: TUIProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const rendererRef = useRef<BrowserRenderer | null>(null)\n const rootRef = useRef<BrowserRoot | null>(null)\n const [isClient, setIsClient] = useState(false)\n\n // SSR safety: only render canvas on the client\n useEffect(() => {\n setIsClient(true)\n }, [])\n\n // Initialize renderer when canvas is available\n useEffect(() => {\n if (!isClient) return\n\n const canvas = canvasRef.current\n const container = containerRef.current\n if (!canvas || !container) return\n\n setRootRenderableClass(RootRenderable)\n\n // Measure cell size to calculate grid dimensions\n const painter = new CanvasPainter({ fontSize, fontFamily })\n const tempCtx = canvas.getContext(\"2d\")!\n const cellSize = painter.measureCell(tempCtx)\n\n const containerRect = container.getBoundingClientRect()\n const cols = Math.max(1, Math.floor(containerRect.width / cellSize.width))\n const rows = Math.max(1, Math.floor(containerRect.height / cellSize.height))\n\n const renderer = new BrowserRenderer(canvas, cols, rows)\n rendererRef.current = renderer\n\n const root = createBrowserRoot(renderer)\n rootRef.current = root\n\n root.render(children)\n renderer.start()\n\n canvas.tabIndex = 0\n if (autoFocus) {\n canvas.focus()\n }\n\n onReady?.(renderer)\n\n // Handle keyboard events\n const onKeyDown = (e: KeyboardEvent) => {\n renderer.handleKeyDown(e)\n }\n canvas.addEventListener(\"keydown\", onKeyDown)\n\n // Handle resize with ResizeObserver\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n const newCols = Math.max(1, Math.floor(width / cellSize.width))\n const newRows = Math.max(1, Math.floor(height / cellSize.height))\n renderer.resize(newCols, newRows)\n }\n })\n resizeObserver.observe(container)\n\n return () => {\n canvas.removeEventListener(\"keydown\", onKeyDown)\n resizeObserver.disconnect()\n renderer.stop()\n root.unmount()\n rendererRef.current = null\n rootRef.current = null\n }\n }, [isClient, fontSize, fontFamily]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Re-render when children change\n useEffect(() => {\n if (rootRef.current) {\n rootRef.current.render(children)\n }\n }, [children])\n\n if (!isClient) {\n // SSR placeholder\n return (\n <div style={style} className={className}>\n <div style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n ...style,\n }}\n className={className}\n >\n <canvas\n ref={canvasRef}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n outline: \"none\",\n }}\n />\n </div>\n )\n}\n","// Core shims barrel — aliased as @opentui/core by Vite\n// Re-exports portable code from opentui and swaps in browser replacements.\n// Vite aliases intercept zig, buffer, text-buffer, text-buffer-view,\n// syntax-style, renderer, console, etc. before they reach the filesystem.\n\n// ─── Pure TS re-exports ───────────────────────────────────────────────────\n\n// RGBA and color utilities (our own copy to avoid pulling in opentui's lib/index)\nexport { RGBA, parseColor, hexToRgb, rgbToHex, hsvToRgb } from \"./rgba\"\nexport type { ColorInput } from \"./rgba\"\n\n// Types\nexport {\n TextAttributes,\n ATTRIBUTE_BASE_BITS,\n ATTRIBUTE_BASE_MASK,\n getBaseAttributes,\n DebugOverlayCorner,\n} from \"./types\"\nexport type {\n RenderContext,\n ThemeMode,\n CursorStyle,\n CursorStyleOptions,\n MousePointerStyle,\n WidthMethod,\n Timeout,\n ViewportBounds,\n Highlight,\n LineInfo,\n LineInfoProvider,\n CapturedSpan,\n CapturedLine,\n CapturedFrame,\n} from \"./types\"\n\n// ─── Re-exports from opentui source (Vite intercepts Zig deps) ───────────\n\n// Renderable base classes (needed by our own code — main.tsx uses RootRenderable)\n// NOTE: The opentui react package imports from the real opentui barrel instead\n// (redirected by the Vite plugin) to avoid cross-barrel circular dependency issues.\nexport {\n Renderable,\n BaseRenderable,\n RootRenderable,\n LayoutEvents,\n RenderableEvents,\n isRenderable,\n} from \"../../../../opentui/packages/core/src/Renderable\"\nexport type {\n RenderableOptions,\n LayoutOptions,\n BaseRenderableOptions,\n Position,\n RenderCommand,\n} from \"../../../../opentui/packages/core/src/Renderable\"\n\n// Border (pure TS)\nexport {\n BorderChars,\n BorderCharArrays,\n isValidBorderStyle,\n parseBorderStyle,\n getBorderFromSides,\n getBorderSides,\n borderCharsToArray,\n} from \"../../../../opentui/packages/core/src/lib/border\"\nexport type {\n BorderCharacters,\n BorderStyle,\n BorderSides,\n BorderConfig,\n BoxDrawOptions,\n BorderSidesConfig,\n} from \"../../../../opentui/packages/core/src/lib/border\"\n\n// Styled text (pure TS)\nexport {\n StyledText,\n isStyledText,\n stringToStyledText,\n t,\n bold,\n italic,\n underline,\n strikethrough,\n dim,\n reverse,\n blink,\n fg,\n bg,\n black,\n red,\n green,\n yellow,\n blue,\n magenta,\n cyan,\n white,\n} from \"../../../../opentui/packages/core/src/lib/styled-text\"\n\n// Yoga options (pure TS)\nexport {\n parseAlign,\n parseAlignItems,\n parseFlexDirection,\n parseJustify,\n parseOverflow,\n parsePositionType,\n parseWrap,\n} from \"../../../../opentui/packages/core/src/lib/yoga.options\"\nexport type {\n AlignString,\n FlexDirectionString,\n JustifyString,\n OverflowString,\n PositionTypeString,\n WrapString,\n} from \"../../../../opentui/packages/core/src/lib/yoga.options\"\n\n// Renderable validations (pure TS)\nexport {\n validateOptions,\n isPositionType,\n isDimensionType,\n isFlexBasisType,\n isSizeType,\n isMarginType,\n isPaddingType,\n isPositionTypeType,\n isOverflowType,\n} from \"../../../../opentui/packages/core/src/lib/renderable.validations\"\n\n// Selection (pure TS)\nexport {\n Selection,\n convertGlobalToLocalSelection,\n} from \"../../../../opentui/packages/core/src/lib/selection\"\n\n// VNode composition (pure TS)\nexport { maybeMakeRenderable } from \"../../../../opentui/packages/core/src/renderables/composition/vnode\"\nexport type { VNode } from \"../../../../opentui/packages/core/src/renderables/composition/vnode\"\n\n// ─── Renderable subclasses (re-exported from individual files, not barrel) ─\n\n// These are needed by @opentui/react for the component catalogue and host-config.\n// File-level shims (zig, buffer, renderer, etc.) handle their internal imports.\nexport * from \"../../../../opentui/packages/core/src/renderables/Box\"\nexport * from \"../../../../opentui/packages/core/src/renderables/Text\"\nexport * from \"../../../../opentui/packages/core/src/renderables/TextNode\"\nexport * from \"../../../../opentui/packages/core/src/renderables/Code\"\nexport * from \"../../../../opentui/packages/core/src/renderables/Diff\"\nexport * from \"../../../../opentui/packages/core/src/renderables/Input\"\nexport * from \"../../../../opentui/packages/core/src/renderables/Select\"\nexport * from \"../../../../opentui/packages/core/src/renderables/TabSelect\"\nexport * from \"../../../../opentui/packages/core/src/renderables/Textarea\"\nexport * from \"../../../../opentui/packages/core/src/renderables/ScrollBox\"\nexport * from \"../../../../opentui/packages/core/src/renderables/ScrollBar\"\nexport * from \"../../../../opentui/packages/core/src/renderables/Slider\"\nexport * from \"../../../../opentui/packages/core/src/renderables/ASCIIFont\"\nexport * from \"../../../../opentui/packages/core/src/renderables/LineNumberRenderable\"\nexport * from \"../../../../opentui/packages/core/src/renderables/Markdown\"\nexport * from \"../../../../opentui/packages/core/src/renderables/FrameBuffer\"\nexport * from \"../../../../opentui/packages/core/src/renderables/TextBufferRenderable\"\n\n// ─── Browser replacements ─────────────────────────────────────────────────\n\n// Buffer — browser replacement\nexport { BrowserBuffer as OptimizedBuffer } from \"../browser-buffer\"\n\n// TextBuffer — browser replacement\nexport { BrowserTextBuffer as TextBuffer } from \"../browser-text-buffer\"\nexport type { TextChunk } from \"../browser-text-buffer\"\n\n// TextBufferView — browser replacement\nexport { BrowserTextBufferView as TextBufferView } from \"../browser-text-buffer-view\"\n\n// SyntaxStyle — browser stub\nexport { BrowserSyntaxStyle as SyntaxStyle } from \"../browser-syntax-style\"\n\n// ─── Stubs ────────────────────────────────────────────────────────────────\n\nexport function resolveRenderLib(): any {\n return null\n}\n\nexport type RenderLib = any\nexport type Pointer = number\n\n// KeyHandler (re-implemented for browser)\nexport {\n BrowserKeyHandler as KeyHandler,\n BrowserInternalKeyHandler as InternalKeyHandler,\n} from \"../browser-render-context\"\n\n// Renderer — re-exported from shimmed source path (resolved to renderer-stub.ts)\nexport {\n CliRenderer,\n CliRenderEvents,\n createCliRenderer,\n} from \"../../../../opentui/packages/core/src/renderer\"\nexport type { MouseEvent } from \"../../../../opentui/packages/core/src/renderer\"\n\n// Timeline & engine — re-exported from shimmed source path (resolved to timeline-stub.ts)\nexport {\n Timeline,\n engine,\n createTimeline,\n} from \"../../../../opentui/packages/core/src/animation/Timeline\"\n\n// Yoga re-export\nexport * as Yoga from \"yoga-layout\"\n\n// Stub types for mouse\nexport type MouseEventType = any\n\n// Utils\nexport function createTextAttributes(opts: {\n bold?: boolean\n italic?: boolean\n underline?: boolean\n dim?: boolean\n blink?: boolean\n inverse?: boolean\n hidden?: boolean\n strikethrough?: boolean\n} = {}): number {\n const TA = {\n NONE: 0, BOLD: 1, DIM: 2, ITALIC: 4, UNDERLINE: 8,\n BLINK: 16, INVERSE: 32, HIDDEN: 64, STRIKETHROUGH: 128,\n }\n let attr = TA.NONE\n if (opts.bold) attr |= TA.BOLD\n if (opts.italic) attr |= TA.ITALIC\n if (opts.underline) attr |= TA.UNDERLINE\n if (opts.dim) attr |= TA.DIM\n if (opts.blink) attr |= TA.BLINK\n if (opts.inverse) attr |= TA.INVERSE\n if (opts.hidden) attr |= TA.HIDDEN\n if (opts.strikethrough) attr |= TA.STRIKETHROUGH\n return attr\n}\n\nexport function attributesWithLink(baseAttributes: number, linkId: number): number {\n return (baseAttributes & 0xff) | ((linkId & 0xffffff) << 8)\n}\n\nexport function getLinkId(attributes: number): number {\n return (attributes >>> 8) & 0xffffff\n}\n\nexport function visualizeRenderableTree(..._args: any[]): void {}\n","// Pure-TS RGBA - copied from opentui core for standalone use\n// This avoids importing from opentui which pulls in Zig\n\nexport class RGBA {\n buffer: Float32Array\n\n constructor(buffer: Float32Array) {\n this.buffer = buffer\n }\n\n static fromArray(array: Float32Array): RGBA {\n return new RGBA(array)\n }\n\n static fromValues(r: number, g: number, b: number, a: number = 1.0): RGBA {\n return new RGBA(new Float32Array([r, g, b, a]))\n }\n\n static fromInts(r: number, g: number, b: number, a: number = 255): RGBA {\n return new RGBA(new Float32Array([r / 255, g / 255, b / 255, a / 255]))\n }\n\n static fromHex(hex: string): RGBA {\n return hexToRgb(hex)\n }\n\n get r(): number {\n return this.buffer[0]\n }\n set r(v: number) {\n this.buffer[0] = v\n }\n\n get g(): number {\n return this.buffer[1]\n }\n set g(v: number) {\n this.buffer[1] = v\n }\n\n get b(): number {\n return this.buffer[2]\n }\n set b(v: number) {\n this.buffer[2] = v\n }\n\n get a(): number {\n return this.buffer[3]\n }\n set a(v: number) {\n this.buffer[3] = v\n }\n\n toInts(): [number, number, number, number] {\n return [\n Math.round(this.buffer[0] * 255),\n Math.round(this.buffer[1] * 255),\n Math.round(this.buffer[2] * 255),\n Math.round(this.buffer[3] * 255),\n ]\n }\n\n map<R>(fn: (value: number) => R): R[] {\n return [fn(this.buffer[0]), fn(this.buffer[1]), fn(this.buffer[2]), fn(this.buffer[3])]\n }\n\n toString(): string {\n const [r, g, b, a] = this.toInts()\n return `rgba(${r}, ${g}, ${b}, ${a / 255})`\n }\n\n equals(other?: RGBA): boolean {\n if (!other) return false\n return (\n this.buffer[0] === other.buffer[0] &&\n this.buffer[1] === other.buffer[1] &&\n this.buffer[2] === other.buffer[2] &&\n this.buffer[3] === other.buffer[3]\n )\n }\n}\n\nexport type ColorInput = string | RGBA\n\nconst CSS_COLOR_NAMES: Record<string, string> = {\n black: \"#000000\",\n white: \"#ffffff\",\n red: \"#ff0000\",\n green: \"#008000\",\n blue: \"#0000ff\",\n yellow: \"#ffff00\",\n cyan: \"#00ffff\",\n magenta: \"#ff00ff\",\n silver: \"#c0c0c0\",\n gray: \"#808080\",\n grey: \"#808080\",\n maroon: \"#800000\",\n olive: \"#808000\",\n lime: \"#00ff00\",\n aqua: \"#00ffff\",\n teal: \"#008080\",\n navy: \"#000080\",\n fuchsia: \"#ff00ff\",\n purple: \"#800080\",\n orange: \"#ffa500\",\n transparent: \"#00000000\",\n brightblack: \"#808080\",\n brightred: \"#ff5555\",\n brightgreen: \"#55ff55\",\n brightyellow: \"#ffff55\",\n brightblue: \"#5555ff\",\n brightmagenta: \"#ff55ff\",\n brightcyan: \"#55ffff\",\n brightwhite: \"#ffffff\",\n}\n\nexport function hexToRgb(hex: string): RGBA {\n hex = hex.replace(/^#/, \"\")\n\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]\n }\n\n if (hex.length === 6) {\n hex = hex + \"ff\"\n }\n\n const r = parseInt(hex.substring(0, 2), 16) / 255\n const g = parseInt(hex.substring(2, 4), 16) / 255\n const b = parseInt(hex.substring(4, 6), 16) / 255\n const a = parseInt(hex.substring(6, 8), 16) / 255\n\n return RGBA.fromValues(r, g, b, a)\n}\n\nexport function rgbToHex(rgb: RGBA): string {\n const [r, g, b] = rgb.toInts()\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`\n}\n\nexport function hsvToRgb(h: number, s: number, v: number): RGBA {\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n let r = 0,\n g = 0,\n b = 0\n\n if (h < 60) {\n r = c; g = x; b = 0\n } else if (h < 120) {\n r = x; g = c; b = 0\n } else if (h < 180) {\n r = 0; g = c; b = x\n } else if (h < 240) {\n r = 0; g = x; b = c\n } else if (h < 300) {\n r = x; g = 0; b = c\n } else {\n r = c; g = 0; b = x\n }\n\n return RGBA.fromValues(r + m, g + m, b + m, 1)\n}\n\nexport function parseColor(color: ColorInput): RGBA {\n if (color instanceof RGBA) return color\n if (typeof color !== \"string\") return RGBA.fromValues(1, 1, 1, 1)\n\n const lower = color.toLowerCase().trim()\n\n // Check CSS named colors\n if (CSS_COLOR_NAMES[lower]) {\n return hexToRgb(CSS_COLOR_NAMES[lower])\n }\n\n // Hex\n if (lower.startsWith(\"#\")) {\n return hexToRgb(lower)\n }\n\n // rgba(r, g, b, a)\n const rgbaMatch = lower.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)$/)\n if (rgbaMatch) {\n return RGBA.fromInts(\n parseInt(rgbaMatch[1]),\n parseInt(rgbaMatch[2]),\n parseInt(rgbaMatch[3]),\n rgbaMatch[4] ? Math.round(parseFloat(rgbaMatch[4]) * 255) : 255,\n )\n }\n\n return RGBA.fromValues(1, 1, 1, 1)\n}\n","// Types matching opentui core types.ts\nimport type { RGBA } from \"./rgba\"\nimport type { Renderable } from \"./renderable-types\"\n\nexport const TextAttributes = {\n NONE: 0,\n BOLD: 1 << 0,\n DIM: 1 << 1,\n ITALIC: 1 << 2,\n UNDERLINE: 1 << 3,\n BLINK: 1 << 4,\n INVERSE: 1 << 5,\n HIDDEN: 1 << 6,\n STRIKETHROUGH: 1 << 7,\n}\n\nexport const ATTRIBUTE_BASE_BITS = 8\nexport const ATTRIBUTE_BASE_MASK = 0xff\n\nexport function getBaseAttributes(attr: number): number {\n return attr & 0xff\n}\n\nexport type ThemeMode = \"dark\" | \"light\"\nexport type CursorStyle = \"block\" | \"line\" | \"underline\"\nexport type MousePointerStyle = \"default\" | \"pointer\" | \"text\" | \"crosshair\" | \"move\" | \"not-allowed\"\nexport type WidthMethod = \"wcwidth\" | \"unicode\"\nexport type Timeout = ReturnType<typeof setTimeout> | undefined\n\nexport interface CursorStyleOptions {\n style?: CursorStyle\n blinking?: boolean\n color?: RGBA\n cursor?: MousePointerStyle\n}\n\nexport enum DebugOverlayCorner {\n topLeft = 0,\n topRight = 1,\n bottomLeft = 2,\n bottomRight = 3,\n}\n\nexport interface RenderContext {\n addToHitGrid: (x: number, y: number, width: number, height: number, id: number) => void\n pushHitGridScissorRect: (x: number, y: number, width: number, height: number) => void\n popHitGridScissorRect: () => void\n clearHitGridScissorRects: () => void\n width: number\n height: number\n requestRender: () => void\n setCursorPosition: (x: number, y: number, visible: boolean) => void\n setCursorStyle: (options: CursorStyleOptions) => void\n setCursorColor: (color: RGBA) => void\n setMousePointer: (shape: MousePointerStyle) => void\n widthMethod: WidthMethod\n capabilities: any | null\n requestLive: () => void\n dropLive: () => void\n hasSelection: boolean\n getSelection: () => any | null\n requestSelectionUpdate: () => void\n currentFocusedRenderable: any | null\n focusRenderable: (renderable: any) => void\n registerLifecyclePass: (renderable: any) => void\n unregisterLifecyclePass: (renderable: any) => void\n getLifecyclePasses: () => Set<any>\n keyInput: any\n _internalKeyInput: any\n clearSelection: () => void\n startSelection: (renderable: any, x: number, y: number) => void\n updateSelection: (\n currentRenderable: any | undefined,\n x: number,\n y: number,\n options?: { finishDragging?: boolean },\n ) => void\n // EventEmitter methods\n on: (event: string, listener: (...args: any[]) => void) => any\n off: (event: string, listener: (...args: any[]) => void) => any\n emit: (event: string, ...args: any[]) => boolean\n removeAllListeners: (event?: string) => any\n}\n\nexport interface ViewportBounds {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface Highlight {\n start: number\n end: number\n styleId: number\n priority?: number | null\n hlRef?: number | null\n}\n\nexport interface LineInfo {\n lineStarts: number[]\n lineWidths: number[]\n maxLineWidth: number\n lineSources: number[]\n lineWraps: number[]\n}\n\nexport interface LineInfoProvider {\n get lineInfo(): LineInfo\n get lineCount(): number\n get virtualLineCount(): number\n get scrollY(): number\n}\n\nexport interface CapturedSpan {\n text: string\n fg: RGBA\n bg: RGBA\n attributes: number\n width: number\n}\n\nexport interface CapturedLine {\n spans: CapturedSpan[]\n}\n\nexport interface CapturedFrame {\n cols: number\n rows: number\n cursor: [number, number]\n lines: CapturedLine[]\n}\n","import type { RGBA } from \"./core-shims/rgba\"\nimport type { WidthMethod } from \"./browser-buffer\"\n\nexport interface TextChunk {\n __isChunk: true\n text: string\n fg?: RGBA\n bg?: RGBA\n attributes?: number\n link?: { url: string }\n}\n\nexport interface StyledTextInput {\n chunks: TextChunk[]\n}\n\nexport class BrowserTextBuffer {\n private _text: string = \"\"\n private _chunks: TextChunk[] = []\n private _defaultFg: RGBA | null = null\n private _defaultBg: RGBA | null = null\n private _defaultAttributes: number = 0\n private _syntaxStyle: any = null\n private _tabWidth: number = 4\n private _widthMethod: WidthMethod\n\n constructor(widthMethod: WidthMethod) {\n this._widthMethod = widthMethod\n }\n\n static create(widthMethod: WidthMethod): BrowserTextBuffer {\n return new BrowserTextBuffer(widthMethod)\n }\n\n // Compat property\n get ptr(): number {\n return 1 // Non-zero so TextBufferRenderable.renderSelf proceeds\n }\n\n get length(): number {\n return this._text.length\n }\n\n get byteSize(): number {\n return new TextEncoder().encode(this._text).length\n }\n\n setText(text: string): void {\n this._text = text\n this._chunks = [\n {\n __isChunk: true,\n text,\n fg: this._defaultFg ?? undefined,\n bg: this._defaultBg ?? undefined,\n attributes: this._defaultAttributes,\n },\n ]\n }\n\n append(text: string): void {\n this._text += text\n this._chunks.push({\n __isChunk: true,\n text,\n fg: this._defaultFg ?? undefined,\n bg: this._defaultBg ?? undefined,\n attributes: this._defaultAttributes,\n })\n }\n\n setStyledText(styledText: StyledTextInput): void {\n this._chunks = styledText.chunks.map((chunk) => ({\n __isChunk: true,\n text: chunk.text,\n fg: chunk.fg ?? this._defaultFg ?? undefined,\n bg: chunk.bg ?? this._defaultBg ?? undefined,\n attributes: chunk.attributes ?? this._defaultAttributes,\n link: chunk.link,\n }))\n this._text = this._chunks.map((c) => c.text).join(\"\")\n }\n\n getPlainText(): string {\n return this._text\n }\n\n getTextRange(startOffset: number, endOffset: number): string {\n return this._text.slice(startOffset, endOffset)\n }\n\n getLineCount(): number {\n if (this._text.length === 0) return 0\n return this._text.split(\"\\n\").length\n }\n\n getChunks(): TextChunk[] {\n return this._chunks\n }\n\n setDefaultFg(fg: RGBA | null): void {\n this._defaultFg = fg\n }\n\n setDefaultBg(bg: RGBA | null): void {\n this._defaultBg = bg\n }\n\n setDefaultAttributes(attributes: number | null): void {\n this._defaultAttributes = attributes ?? 0\n }\n\n resetDefaults(): void {\n this._defaultFg = null\n this._defaultBg = null\n this._defaultAttributes = 0\n }\n\n get defaultFg(): RGBA | null {\n return this._defaultFg\n }\n\n get defaultBg(): RGBA | null {\n return this._defaultBg\n }\n\n get defaultAttributes(): number {\n return this._defaultAttributes\n }\n\n setSyntaxStyle(style: any): void {\n this._syntaxStyle = style\n }\n\n getSyntaxStyle(): any {\n return this._syntaxStyle\n }\n\n setTabWidth(width: number): void {\n this._tabWidth = width\n }\n\n getTabWidth(): number {\n return this._tabWidth\n }\n\n addHighlightByCharRange(_highlight: any): void {}\n addHighlight(_lineIdx: number, _highlight: any): void {}\n removeHighlightsByRef(_hlRef: number): void {}\n clearLineHighlights(_lineIdx: number): void {}\n clearAllHighlights(): void {}\n getLineHighlights(_lineIdx: number): any[] {\n return []\n }\n getHighlightCount(): number {\n return 0\n }\n loadFile(_path: string): void {}\n\n clear(): void {\n this._text = \"\"\n this._chunks = []\n }\n\n reset(): void {\n this.clear()\n this.resetDefaults()\n }\n\n destroy(): void {\n this._text = \"\"\n this._chunks = []\n }\n}\n","import type { RGBA } from \"./core-shims/rgba\"\nimport type { BrowserTextBuffer, TextChunk } from \"./browser-text-buffer\"\n\nexport interface VisibleLineChunk {\n text: string\n fg: RGBA\n bg: RGBA\n attributes: number\n link?: { url: string }\n}\n\nexport interface VisibleLine {\n chunks: VisibleLineChunk[]\n}\n\nconst defaultFg: RGBA = {\n r: 1, g: 1, b: 1, a: 1,\n buffer: new Float32Array([1, 1, 1, 1]),\n} as RGBA\n\nconst defaultBg: RGBA = {\n r: 0, g: 0, b: 0, a: 0,\n buffer: new Float32Array([0, 0, 0, 0]),\n} as RGBA\n\nexport class BrowserTextBufferView {\n private textBuffer: BrowserTextBuffer\n private _wrapWidth: number | null = null\n private _wrapMode: \"none\" | \"char\" | \"word\" = \"word\"\n private _viewportX: number = 0\n private _viewportY: number = 0\n private _viewportWidth: number = 0\n private _viewportHeight: number = 0\n private _truncate: boolean = false\n private _selection: { start: number; end: number } | null = null\n private _selectionBg: RGBA | undefined\n private _selectionFg: RGBA | undefined\n\n constructor(textBuffer: BrowserTextBuffer) {\n this.textBuffer = textBuffer\n }\n\n static create(textBuffer: BrowserTextBuffer): BrowserTextBufferView {\n return new BrowserTextBufferView(textBuffer)\n }\n\n // Compat\n get ptr(): number {\n return 1\n }\n\n get lineInfo() {\n const lines = this.getAllWrappedLines()\n const lineStarts: number[] = []\n const lineWidths: number[] = []\n const lineSources: number[] = []\n const lineWraps: number[] = []\n let maxWidth = 0\n let offset = 0\n\n for (let i = 0; i < lines.length; i++) {\n lineStarts.push(offset)\n const lineText = lines[i].map((c) => c.text).join(\"\")\n const w = lineText.length\n lineWidths.push(w)\n lineSources.push(0)\n lineWraps.push(0)\n if (w > maxWidth) maxWidth = w\n offset += lineText.length + 1\n }\n\n return { lineStarts, lineWidths, maxLineWidth: maxWidth, lineSources, lineWraps }\n }\n\n get logicalLineInfo() {\n return this.lineInfo\n }\n\n setSelection(start: number, end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this._selection = { start, end }\n this._selectionBg = bgColor\n this._selectionFg = fgColor\n }\n\n updateSelection(end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n if (this._selection) {\n this._selection.end = end\n }\n if (bgColor) this._selectionBg = bgColor\n if (fgColor) this._selectionFg = fgColor\n }\n\n resetSelection(): void {\n this._selection = null\n }\n\n getSelection(): { start: number; end: number } | null {\n return this._selection\n }\n\n hasSelection(): boolean {\n return this._selection !== null\n }\n\n setLocalSelection(\n _anchorX: number,\n _anchorY: number,\n _focusX: number,\n _focusY: number,\n _bgColor?: RGBA,\n _fgColor?: RGBA,\n ): boolean {\n return false\n }\n\n updateLocalSelection(\n _anchorX: number,\n _anchorY: number,\n _focusX: number,\n _focusY: number,\n _bgColor?: RGBA,\n _fgColor?: RGBA,\n ): boolean {\n return false\n }\n\n resetLocalSelection(): void {}\n\n getSelectedText(): string {\n if (!this._selection) return \"\"\n const text = this.textBuffer.getPlainText()\n const start = Math.min(this._selection.start, this._selection.end)\n const end = Math.max(this._selection.start, this._selection.end)\n return text.slice(start, end)\n }\n\n getPlainText(): string {\n return this.textBuffer.getPlainText()\n }\n\n setWrapWidth(width: number | null): void {\n this._wrapWidth = width\n }\n\n setWrapMode(mode: \"none\" | \"char\" | \"word\"): void {\n this._wrapMode = mode\n }\n\n setViewportSize(width: number, height: number): void {\n this._viewportWidth = width\n this._viewportHeight = height\n }\n\n setViewport(x: number, y: number, width: number, height: number): void {\n this._viewportX = x\n this._viewportY = y\n this._viewportWidth = width\n this._viewportHeight = height\n }\n\n setTabIndicator(_indicator: string | number): void {}\n\n setTabIndicatorColor(_color: RGBA): void {}\n\n setTruncate(truncate: boolean): void {\n this._truncate = truncate\n }\n\n private getAllWrappedLines(): VisibleLineChunk[][] {\n const chunks = this.textBuffer.getChunks()\n if (chunks.length === 0) return []\n\n const dfg = this.textBuffer.defaultFg ?? defaultFg\n const dbg = this.textBuffer.defaultBg ?? defaultBg\n\n // First, build logical lines from chunks\n const logicalLines: VisibleLineChunk[][] = [[]]\n\n for (const chunk of chunks) {\n const parts = chunk.text.split(\"\\n\")\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) {\n logicalLines.push([])\n }\n if (parts[i].length > 0) {\n const vlc: VisibleLineChunk = {\n text: parts[i],\n fg: chunk.fg ?? dfg,\n bg: chunk.bg ?? dbg,\n attributes: chunk.attributes ?? 0,\n }\n if (chunk.link) vlc.link = chunk.link\n logicalLines[logicalLines.length - 1].push(vlc)\n }\n }\n }\n\n // Apply wrapping\n if (this._wrapMode === \"none\" || !this._wrapWidth || this._wrapWidth <= 0) {\n return logicalLines\n }\n\n const wrappedLines: VisibleLineChunk[][] = []\n const wrapWidth = this._wrapWidth\n\n for (const logicalLine of logicalLines) {\n // Flatten line text to handle wrapping\n const lineText = logicalLine.map((c) => c.text).join(\"\")\n\n if (lineText.length <= wrapWidth) {\n wrappedLines.push(logicalLine)\n continue\n }\n\n if (this._wrapMode === \"char\") {\n // Character wrapping\n let pos = 0\n while (pos < lineText.length) {\n const end = Math.min(pos + wrapWidth, lineText.length)\n const sliceChunks = this.sliceChunks(logicalLine, pos, end)\n wrappedLines.push(sliceChunks)\n pos = end\n }\n } else {\n // Word wrapping\n let pos = 0\n while (pos < lineText.length) {\n let end = Math.min(pos + wrapWidth, lineText.length)\n if (end < lineText.length) {\n // Look for a space to break at\n let breakPos = end\n while (breakPos > pos && lineText[breakPos] !== \" \") {\n breakPos--\n }\n if (breakPos > pos) {\n end = breakPos + 1 // Include the space\n }\n }\n const sliceChunks = this.sliceChunks(logicalLine, pos, end)\n wrappedLines.push(sliceChunks)\n pos = end\n }\n }\n }\n\n return wrappedLines\n }\n\n private sliceChunks(chunks: VisibleLineChunk[], start: number, end: number): VisibleLineChunk[] {\n const result: VisibleLineChunk[] = []\n let offset = 0\n\n for (const chunk of chunks) {\n const chunkStart = offset\n const chunkEnd = offset + chunk.text.length\n\n if (chunkEnd <= start || chunkStart >= end) {\n offset = chunkEnd\n continue\n }\n\n const sliceStart = Math.max(0, start - chunkStart)\n const sliceEnd = Math.min(chunk.text.length, end - chunkStart)\n const slicedText = chunk.text.slice(sliceStart, sliceEnd)\n\n if (slicedText.length > 0) {\n const sliced: VisibleLineChunk = {\n text: slicedText,\n fg: chunk.fg,\n bg: chunk.bg,\n attributes: chunk.attributes,\n }\n if (chunk.link) sliced.link = chunk.link\n result.push(sliced)\n }\n\n offset = chunkEnd\n }\n\n return result\n }\n\n measureForDimensions(width: number, height: number): { lineCount: number; maxWidth: number } | null {\n // Temporarily set wrap width for measurement\n const oldWrapWidth = this._wrapWidth\n if (width > 0 && this._wrapMode !== \"none\") {\n this._wrapWidth = width\n } else if (width === 0) {\n // width=0 means measure without wrapping\n this._wrapWidth = null\n }\n\n const lines = this.getAllWrappedLines()\n this._wrapWidth = oldWrapWidth\n\n let maxWidth = 0\n for (const line of lines) {\n const lineWidth = line.reduce((sum, c) => sum + c.text.length, 0)\n if (lineWidth > maxWidth) maxWidth = lineWidth\n }\n\n return {\n lineCount: lines.length,\n maxWidth,\n }\n }\n\n getVirtualLineCount(): number {\n return this.getAllWrappedLines().length\n }\n\n getVisibleLines(): VisibleLine[] | null {\n const allLines = this.getAllWrappedLines()\n if (allLines.length === 0) return null\n\n const startLine = this._viewportY\n const endLine =\n this._viewportHeight > 0 ? Math.min(startLine + this._viewportHeight, allLines.length) : allLines.length\n\n const visibleLines: VisibleLine[] = []\n for (let i = startLine; i < endLine; i++) {\n if (i >= 0 && i < allLines.length) {\n visibleLines.push({ chunks: allLines[i] })\n }\n }\n\n return visibleLines\n }\n\n destroy(): void {}\n}\n","// Stub SyntaxStyle for browser - no native Zig backing needed\nexport class BrowserSyntaxStyle {\n private _destroyed = false\n\n static create(): BrowserSyntaxStyle {\n return new BrowserSyntaxStyle()\n }\n\n static fromTheme(_theme: any): BrowserSyntaxStyle {\n return new BrowserSyntaxStyle()\n }\n\n static fromStyles(_styles: any): BrowserSyntaxStyle {\n return new BrowserSyntaxStyle()\n }\n\n get ptr(): number {\n return 0\n }\n\n registerStyle(_name: string, _style: any): number {\n return 0\n }\n\n resolveStyleId(_name: string): number | null {\n return null\n }\n\n getStyleId(_name: string): number | null {\n return null\n }\n\n getStyleCount(): number {\n return 0\n }\n\n clearNameCache(): void {}\n\n getStyle(_name: string): any {\n return undefined\n }\n\n mergeStyles(..._styleNames: string[]): { attributes: number } {\n return { attributes: 0 }\n }\n\n clearCache(): void {}\n getCacheSize(): number {\n return 0\n }\n getAllStyles(): Map<string, any> {\n return new Map()\n }\n getRegisteredNames(): string[] {\n return []\n }\n\n destroy(): void {\n this._destroyed = true\n }\n}\n","import { EventEmitter } from \"events\"\nimport type { RenderContext, CursorStyleOptions, MousePointerStyle, WidthMethod } from \"./core-shims/types\"\nimport type { RGBA } from \"./core-shims/rgba\"\n\nexport class BrowserKeyHandler extends EventEmitter {\n constructor() {\n super()\n }\n\n processInput(_data: string): boolean {\n return false\n }\n}\n\nexport class BrowserInternalKeyHandler extends BrowserKeyHandler {\n private renderableHandlers: Map<string, Set<Function>> = new Map()\n\n onInternal(event: string, handler: Function): void {\n if (!this.renderableHandlers.has(event)) {\n this.renderableHandlers.set(event, new Set())\n }\n this.renderableHandlers.get(event)!.add(handler)\n }\n\n offInternal(event: string, handler: Function): void {\n const handlers = this.renderableHandlers.get(event)\n if (handlers) {\n handlers.delete(handler)\n }\n }\n\n override emit(event: string, ...args: any[]): boolean {\n // Emit to global listeners first\n const hasGlobal = super.emit(event, ...args)\n\n // Then emit to renderable handlers\n const renderableSet = this.renderableHandlers.get(event)\n if (renderableSet && renderableSet.size > 0) {\n for (const handler of [...renderableSet]) {\n try {\n handler(...args)\n } catch (e) {\n console.error(`[BrowserInternalKeyHandler] Error in ${event} handler:`, e)\n }\n // Check propagation\n if (args[0] && args[0].propagationStopped) break\n }\n return true\n }\n\n return hasGlobal\n }\n}\n\nexport class BrowserRenderContext extends EventEmitter implements RenderContext {\n private _width: number\n private _height: number\n private _widthMethod: WidthMethod\n private _renderRequested = false\n private _onRenderRequest: (() => void) | null = null\n private _lifecyclePasses: Set<any> = new Set()\n private _focusedRenderable: any | null = null\n\n public keyInput: BrowserKeyHandler\n public _internalKeyInput: BrowserInternalKeyHandler\n\n constructor(width: number, height: number, widthMethod: WidthMethod = \"wcwidth\") {\n super()\n this._width = width\n this._height = height\n this._widthMethod = widthMethod\n this.keyInput = new BrowserKeyHandler()\n this._internalKeyInput = new BrowserInternalKeyHandler()\n }\n\n get width(): number {\n return this._width\n }\n\n get height(): number {\n return this._height\n }\n\n get widthMethod(): WidthMethod {\n return this._widthMethod\n }\n\n get capabilities(): any {\n return null\n }\n\n get hasSelection(): boolean {\n return false\n }\n\n get currentFocusedRenderable(): any | null {\n return this._focusedRenderable\n }\n\n setOnRenderRequest(callback: () => void): void {\n this._onRenderRequest = callback\n }\n\n resize(width: number, height: number): void {\n this._width = width\n this._height = height\n this.emit(\"resize\", width, height)\n }\n\n // RenderContext interface methods\n addToHitGrid(_x: number, _y: number, _width: number, _height: number, _id: number): void {}\n\n pushHitGridScissorRect(_x: number, _y: number, _width: number, _height: number): void {}\n\n popHitGridScissorRect(): void {}\n\n clearHitGridScissorRects(): void {}\n\n requestRender(): void {\n if (this._renderRequested) return\n this._renderRequested = true\n this._onRenderRequest?.()\n this._renderRequested = false\n }\n\n setCursorPosition(_x: number, _y: number, _visible: boolean): void {}\n\n setCursorStyle(_options: CursorStyleOptions): void {}\n\n setCursorColor(_color: RGBA): void {}\n\n setMousePointer(_shape: MousePointerStyle): void {}\n\n requestLive(): void {}\n\n dropLive(): void {}\n\n getSelection(): any | null {\n return null\n }\n\n requestSelectionUpdate(): void {}\n\n focusRenderable(renderable: any): void {\n if (this._focusedRenderable && this._focusedRenderable !== renderable) {\n this._focusedRenderable.blur?.()\n }\n this._focusedRenderable = renderable\n }\n\n registerLifecyclePass(renderable: any): void {\n this._lifecyclePasses.add(renderable)\n }\n\n unregisterLifecyclePass(renderable: any): void {\n this._lifecyclePasses.delete(renderable)\n }\n\n getLifecyclePasses(): Set<any> {\n return this._lifecyclePasses\n }\n\n clearSelection(): void {}\n\n startSelection(_renderable: any, _x: number, _y: number): void {}\n\n updateSelection(\n _currentRenderable: any | undefined,\n _x: number,\n _y: number,\n _options?: { finishDragging?: boolean },\n ): void {}\n}\n","import type { RGBA } from \"./core-shims/rgba\"\nimport type { CapturedLine, CapturedSpan } from \"./core-shims/types\"\nimport { attributesWithLink } from \"./core-shims/index\"\n\n// Attribute flags matching TextAttributes from opentui core\nconst CONTINUATION = 0xc0000000\n\ninterface ScissorRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport type WidthMethod = \"wcwidth\" | \"unicode\"\n\nexport interface BorderDrawOptions {\n x: number\n y: number\n width: number\n height: number\n borderStyle?: string\n customBorderChars?: Uint32Array\n border: boolean | string[]\n borderColor: RGBA\n backgroundColor: RGBA\n shouldFill?: boolean\n title?: string\n titleAlignment?: \"left\" | \"center\" | \"right\"\n}\n\nexport class BrowserBuffer {\n public id: string\n public respectAlpha: boolean\n\n private _width: number\n private _height: number\n private _widthMethod: WidthMethod\n\n // Cell data - same layout as native OptimizedBuffer\n public char: Uint32Array\n public fg: Float32Array\n public bg: Float32Array\n public attributes: Uint32Array\n\n private scissorStack: ScissorRect[] = []\n private opacityStack: number[] = []\n\n // Link registry for clickable links\n public linkRegistry: Map<number, string> = new Map()\n private nextLinkId: number = 1\n\n constructor(\n width: number,\n height: number,\n options: { respectAlpha?: boolean; id?: string; widthMethod?: WidthMethod } = {},\n ) {\n this._width = width\n this._height = height\n this._widthMethod = options.widthMethod ?? \"wcwidth\"\n this.respectAlpha = options.respectAlpha ?? false\n this.id = options.id ?? `browser-buffer-${Math.random().toString(36).slice(2, 8)}`\n\n const size = width * height\n this.char = new Uint32Array(size)\n this.fg = new Float32Array(size * 4)\n this.bg = new Float32Array(size * 4)\n this.attributes = new Uint32Array(size)\n\n // Fill with spaces\n this.char.fill(0x20) // space\n }\n\n static create(\n width: number,\n height: number,\n widthMethod: WidthMethod,\n options?: { respectAlpha?: boolean; id?: string },\n ): BrowserBuffer {\n return new BrowserBuffer(width, height, { ...options, widthMethod })\n }\n\n get width(): number {\n return this._width\n }\n\n get height(): number {\n return this._height\n }\n\n get widthMethod(): WidthMethod {\n return this._widthMethod\n }\n\n get ptr(): number {\n return 0\n }\n\n get buffers() {\n return {\n char: this.char,\n fg: this.fg,\n bg: this.bg,\n attributes: this.attributes,\n }\n }\n\n setRespectAlpha(respectAlpha: boolean): void {\n this.respectAlpha = respectAlpha\n }\n\n getNativeId(): string {\n return this.id\n }\n\n registerLink(url: string): number {\n const id = this.nextLinkId++\n this.linkRegistry.set(id, url)\n return id\n }\n\n getLinkUrl(linkId: number): string | undefined {\n return this.linkRegistry.get(linkId)\n }\n\n private isInScissor(x: number, y: number): boolean {\n if (this.scissorStack.length === 0) return true\n const rect = this.scissorStack[this.scissorStack.length - 1]\n return x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height\n }\n\n private getCurrentOpacityMultiplier(): number {\n if (this.opacityStack.length === 0) return 1\n return this.opacityStack[this.opacityStack.length - 1]\n }\n\n private applyOpacity(color: RGBA): RGBA {\n const multiplier = this.getCurrentOpacityMultiplier()\n if (multiplier >= 1) return color\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a * multiplier,\n buffer: new Float32Array([color.r, color.g, color.b, color.a * multiplier]),\n toInts: color.toInts,\n equals: color.equals,\n map: color.map,\n toString: color.toString,\n } as RGBA\n }\n\n clear(bg?: RGBA): void {\n const size = this._width * this._height\n this.char.fill(0x20) // space\n this.attributes.fill(0)\n this.linkRegistry.clear()\n this.nextLinkId = 1\n\n if (bg) {\n for (let i = 0; i < size; i++) {\n const offset = i * 4\n this.bg[offset] = bg.r\n this.bg[offset + 1] = bg.g\n this.bg[offset + 2] = bg.b\n this.bg[offset + 3] = bg.a\n // Clear fg\n this.fg[offset] = 0\n this.fg[offset + 1] = 0\n this.fg[offset + 2] = 0\n this.fg[offset + 3] = 0\n }\n } else {\n this.fg.fill(0)\n this.bg.fill(0)\n }\n }\n\n setCell(x: number, y: number, char: string, fgColor: RGBA, bgColor: RGBA, attr: number = 0): void {\n if (x < 0 || x >= this._width || y < 0 || y >= this._height) return\n if (!this.isInScissor(x, y)) return\n\n const idx = y * this._width + x\n const offset = idx * 4\n\n const effectiveBg = this.applyOpacity(bgColor)\n const effectiveFg = this.applyOpacity(fgColor)\n\n this.char[idx] = char.codePointAt(0) ?? 0x20\n this.attributes[idx] = attr\n\n this.fg[offset] = effectiveFg.r\n this.fg[offset + 1] = effectiveFg.g\n this.fg[offset + 2] = effectiveFg.b\n this.fg[offset + 3] = effectiveFg.a\n\n this.bg[offset] = effectiveBg.r\n this.bg[offset + 1] = effectiveBg.g\n this.bg[offset + 2] = effectiveBg.b\n this.bg[offset + 3] = effectiveBg.a\n }\n\n setCellWithAlphaBlending(\n x: number,\n y: number,\n char: string,\n fgColor: RGBA,\n bgColor: RGBA,\n attr: number = 0,\n ): void {\n // For the PoC, same as setCell\n this.setCell(x, y, char, fgColor, bgColor, attr)\n }\n\n drawChar(charCode: number, x: number, y: number, fgColor: RGBA, bgColor: RGBA, attr: number = 0): void {\n if (x < 0 || x >= this._width || y < 0 || y >= this._height) return\n if (!this.isInScissor(x, y)) return\n\n const idx = y * this._width + x\n const offset = idx * 4\n\n const effectiveBg = this.applyOpacity(bgColor)\n const effectiveFg = this.applyOpacity(fgColor)\n\n this.char[idx] = charCode\n this.attributes[idx] = attr\n\n this.fg[offset] = effectiveFg.r\n this.fg[offset + 1] = effectiveFg.g\n this.fg[offset + 2] = effectiveFg.b\n this.fg[offset + 3] = effectiveFg.a\n\n this.bg[offset] = effectiveBg.r\n this.bg[offset + 1] = effectiveBg.g\n this.bg[offset + 2] = effectiveBg.b\n this.bg[offset + 3] = effectiveBg.a\n }\n\n drawText(\n text: string,\n x: number,\n y: number,\n fgColor: RGBA,\n bgColor?: RGBA,\n attr: number = 0,\n _selection?: { start: number; end: number; bgColor?: RGBA; fgColor?: RGBA } | null,\n ): void {\n const transparentBg: RGBA = {\n r: 0, g: 0, b: 0, a: 0,\n buffer: new Float32Array([0, 0, 0, 0]),\n } as RGBA\n const bg = bgColor ?? transparentBg\n\n let curX = x\n for (const ch of text) {\n if (curX >= this._width) break\n if (curX >= 0) {\n this.setCell(curX, y, ch, fgColor, bg, attr)\n }\n curX++\n }\n }\n\n fillRect(x: number, y: number, width: number, height: number, bgColor: RGBA): void {\n for (let row = y; row < y + height && row < this._height; row++) {\n for (let col = x; col < x + width && col < this._width; col++) {\n if (col < 0 || row < 0) continue\n if (!this.isInScissor(col, row)) continue\n\n const idx = row * this._width + col\n const offset = idx * 4\n const effectiveBg = this.applyOpacity(bgColor)\n\n this.char[idx] = 0x20\n this.bg[offset] = effectiveBg.r\n this.bg[offset + 1] = effectiveBg.g\n this.bg[offset + 2] = effectiveBg.b\n this.bg[offset + 3] = effectiveBg.a\n }\n }\n }\n\n drawBox(options: BorderDrawOptions): void {\n const {\n x,\n y,\n width,\n height,\n border,\n borderColor,\n backgroundColor,\n shouldFill = true,\n title,\n titleAlignment = \"left\",\n } = options\n\n if (width <= 0 || height <= 0) return\n\n // Parse border sides\n const sides = {\n top: border === true || (Array.isArray(border) && border.includes(\"top\")),\n right: border === true || (Array.isArray(border) && border.includes(\"right\")),\n bottom: border === true || (Array.isArray(border) && border.includes(\"bottom\")),\n left: border === true || (Array.isArray(border) && border.includes(\"left\")),\n }\n\n // Get border chars (use customBorderChars or default rounded)\n const borderChars = options.customBorderChars ?? this.getDefaultBorderChars(options.borderStyle)\n\n // Fill background\n if (shouldFill) {\n const fillStartX = x + (sides.left ? 1 : 0)\n const fillStartY = y + (sides.top ? 1 : 0)\n const fillWidth = width - (sides.left ? 1 : 0) - (sides.right ? 1 : 0)\n const fillHeight = height - (sides.top ? 1 : 0) - (sides.bottom ? 1 : 0)\n if (fillWidth > 0 && fillHeight > 0) {\n this.fillRect(fillStartX, fillStartY, fillWidth, fillHeight, backgroundColor)\n }\n }\n\n if (!border) return\n\n const transparent: RGBA = { r: 0, g: 0, b: 0, a: 0, buffer: new Float32Array([0, 0, 0, 0]) } as RGBA\n\n // Draw borders\n // borderChars layout: [topLeft, topRight, bottomLeft, bottomRight, horizontal, vertical, topT, bottomT, leftT, rightT, cross]\n const topLeft = borderChars[0]\n const topRight = borderChars[1]\n const bottomLeft = borderChars[2]\n const bottomRight = borderChars[3]\n const horizontal = borderChars[4]\n const vertical = borderChars[5]\n\n // Top border\n if (sides.top) {\n if (sides.left) this.drawChar(topLeft, x, y, borderColor, transparent)\n for (let col = 1; col < width - 1; col++) {\n this.drawChar(horizontal, x + col, y, borderColor, transparent)\n }\n if (sides.right && width > 1) this.drawChar(topRight, x + width - 1, y, borderColor, transparent)\n }\n\n // Bottom border\n if (sides.bottom && height > 1) {\n if (sides.left) this.drawChar(bottomLeft, x, y + height - 1, borderColor, transparent)\n for (let col = 1; col < width - 1; col++) {\n this.drawChar(horizontal, x + col, y + height - 1, borderColor, transparent)\n }\n if (sides.right && width > 1)\n this.drawChar(bottomRight, x + width - 1, y + height - 1, borderColor, transparent)\n }\n\n // Left border\n if (sides.left) {\n for (let row = 1; row < height - 1; row++) {\n this.drawChar(vertical, x, y + row, borderColor, transparent)\n }\n }\n\n // Right border\n if (sides.right && width > 1) {\n for (let row = 1; row < height - 1; row++) {\n this.drawChar(vertical, x + width - 1, y + row, borderColor, transparent)\n }\n }\n\n // Draw title on top border\n if (title && sides.top && width > 4) {\n const maxTitleLen = width - 4\n const truncatedTitle = title.length > maxTitleLen ? title.slice(0, maxTitleLen) : title\n let titleX: number\n if (titleAlignment === \"center\") {\n titleX = x + Math.floor((width - truncatedTitle.length) / 2)\n } else if (titleAlignment === \"right\") {\n titleX = x + width - truncatedTitle.length - 2\n } else {\n titleX = x + 2\n }\n this.drawText(truncatedTitle, titleX, y, borderColor, transparent)\n }\n }\n\n private getDefaultBorderChars(borderStyle?: string): Uint32Array {\n // Rounded border chars by default\n const styles: Record<string, number[]> = {\n rounded: [0x256d, 0x256e, 0x2570, 0x256f, 0x2500, 0x2502, 0x252c, 0x2534, 0x251c, 0x2524, 0x253c],\n single: [0x250c, 0x2510, 0x2514, 0x2518, 0x2500, 0x2502, 0x252c, 0x2534, 0x251c, 0x2524, 0x253c],\n double: [0x2554, 0x2557, 0x255a, 0x255d, 0x2550, 0x2551, 0x2566, 0x2569, 0x2560, 0x2563, 0x256c],\n heavy: [0x250f, 0x2513, 0x2517, 0x251b, 0x2501, 0x2503, 0x2533, 0x253b, 0x2523, 0x252b, 0x254b],\n }\n const chars = styles[borderStyle ?? \"rounded\"] ?? styles.rounded\n return new Uint32Array(chars)\n }\n\n pushScissorRect(x: number, y: number, width: number, height: number): void {\n if (this.scissorStack.length > 0) {\n // Intersect with current scissor\n const current = this.scissorStack[this.scissorStack.length - 1]\n const nx = Math.max(x, current.x)\n const ny = Math.max(y, current.y)\n const nw = Math.min(x + width, current.x + current.width) - nx\n const nh = Math.min(y + height, current.y + current.height) - ny\n this.scissorStack.push({ x: nx, y: ny, width: Math.max(0, nw), height: Math.max(0, nh) })\n } else {\n this.scissorStack.push({ x, y, width, height })\n }\n }\n\n popScissorRect(): void {\n this.scissorStack.pop()\n }\n\n clearScissorRects(): void {\n this.scissorStack = []\n }\n\n pushOpacity(opacity: number): void {\n const current = this.getCurrentOpacityMultiplier()\n this.opacityStack.push(current * opacity)\n }\n\n popOpacity(): void {\n this.opacityStack.pop()\n }\n\n getCurrentOpacity(): number {\n return this.getCurrentOpacityMultiplier()\n }\n\n clearOpacity(): void {\n this.opacityStack = []\n }\n\n resize(width: number, height: number): void {\n this._width = width\n this._height = height\n const size = width * height\n this.char = new Uint32Array(size)\n this.fg = new Float32Array(size * 4)\n this.bg = new Float32Array(size * 4)\n this.attributes = new Uint32Array(size)\n this.char.fill(0x20)\n }\n\n // Read buffer into CapturedLine[] for testing\n getSpanLines(): CapturedLine[] {\n const lines: CapturedLine[] = []\n\n for (let row = 0; row < this._height; row++) {\n const spans: CapturedSpan[] = []\n let currentSpan: CapturedSpan | null = null\n\n for (let col = 0; col < this._width; col++) {\n const idx = row * this._width + col\n const offset = idx * 4\n\n // Skip continuation chars\n if (this.attributes[idx] & CONTINUATION) continue\n\n const charCode = this.char[idx]\n const ch = charCode === 0 ? \" \" : String.fromCodePoint(charCode)\n const fgR = this.fg[offset]\n const fgG = this.fg[offset + 1]\n const fgB = this.fg[offset + 2]\n const fgA = this.fg[offset + 3]\n const bgR = this.bg[offset]\n const bgG = this.bg[offset + 1]\n const bgB = this.bg[offset + 2]\n const bgA = this.bg[offset + 3]\n const attr = this.attributes[idx] & 0xff\n\n const fg: RGBA = {\n r: fgR, g: fgG, b: fgB, a: fgA,\n buffer: new Float32Array([fgR, fgG, fgB, fgA]),\n } as RGBA\n const bg: RGBA = {\n r: bgR, g: bgG, b: bgB, a: bgA,\n buffer: new Float32Array([bgR, bgG, bgB, bgA]),\n } as RGBA\n\n if (\n currentSpan &&\n currentSpan.fg.r === fgR &&\n currentSpan.fg.g === fgG &&\n currentSpan.fg.b === fgB &&\n currentSpan.fg.a === fgA &&\n currentSpan.bg.r === bgR &&\n currentSpan.bg.g === bgG &&\n currentSpan.bg.b === bgB &&\n currentSpan.bg.a === bgA &&\n currentSpan.attributes === attr\n ) {\n currentSpan.text += ch\n currentSpan.width += 1\n } else {\n if (currentSpan) spans.push(currentSpan)\n currentSpan = { text: ch, fg, bg, attributes: attr, width: 1 }\n }\n }\n\n if (currentSpan) spans.push(currentSpan)\n lines.push({ spans })\n }\n\n return lines\n }\n\n // Draw a text buffer view into the buffer\n drawTextBufferView(view: any, x: number, y: number): void {\n if (!view || !view.getVisibleLines) return\n\n const lines = view.getVisibleLines()\n if (!lines) return\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx]\n if (!line) continue\n\n let curX = x\n for (const chunk of line.chunks) {\n const text = chunk.text\n const fgColor = chunk.fg\n const bgColor = chunk.bg\n let attr = chunk.attributes ?? 0\n\n // Encode link ID into attributes if chunk has a link\n if (chunk.link && chunk.link.url) {\n const linkId = this.registerLink(chunk.link.url)\n attr = attributesWithLink(attr, linkId)\n }\n\n for (const ch of text) {\n if (curX >= this._width) break\n if (curX >= 0 && y + lineIdx >= 0 && y + lineIdx < this._height) {\n this.setCell(curX, y + lineIdx, ch, fgColor, bgColor, attr)\n }\n curX++\n }\n }\n }\n }\n\n drawTextBuffer(textBufferView: any, x: number, y: number): void {\n this.drawTextBufferView(textBufferView, x, y)\n }\n\n drawFrameBuffer(\n destX: number,\n destY: number,\n frameBuffer: BrowserBuffer,\n sourceX: number = 0,\n sourceY: number = 0,\n sourceWidth?: number,\n sourceHeight?: number,\n ): void {\n const sw = sourceWidth ?? frameBuffer.width\n const sh = sourceHeight ?? frameBuffer.height\n const srcChar = frameBuffer.char\n const srcFg = frameBuffer.fg\n const srcBg = frameBuffer.bg\n const srcAttr = frameBuffer.attributes\n const srcCols = frameBuffer.width\n\n for (let row = 0; row < sh; row++) {\n const srcRow = sourceY + row\n const dstRow = destY + row\n if (srcRow < 0 || srcRow >= frameBuffer.height) continue\n if (dstRow < 0 || dstRow >= this._height) continue\n\n for (let col = 0; col < sw; col++) {\n const srcCol = sourceX + col\n const dstCol = destX + col\n if (srcCol < 0 || srcCol >= frameBuffer.width) continue\n if (dstCol < 0 || dstCol >= this._width) continue\n if (!this.isInScissor(dstCol, dstRow)) continue\n\n const srcIdx = srcRow * srcCols + srcCol\n const dstIdx = dstRow * this._width + dstCol\n const srcOffset = srcIdx * 4\n const dstOffset = dstIdx * 4\n\n this.char[dstIdx] = srcChar[srcIdx]\n this.attributes[dstIdx] = srcAttr[srcIdx]\n\n // Apply opacity to fg\n const fgA = srcFg[srcOffset + 3]\n const opacityMul = this.getCurrentOpacityMultiplier()\n this.fg[dstOffset] = srcFg[srcOffset]\n this.fg[dstOffset + 1] = srcFg[srcOffset + 1]\n this.fg[dstOffset + 2] = srcFg[srcOffset + 2]\n this.fg[dstOffset + 3] = fgA * opacityMul\n\n // Apply opacity to bg\n const bgA = srcBg[srcOffset + 3]\n this.bg[dstOffset] = srcBg[srcOffset]\n this.bg[dstOffset + 1] = srcBg[srcOffset + 1]\n this.bg[dstOffset + 2] = srcBg[srcOffset + 2]\n this.bg[dstOffset + 3] = bgA * opacityMul\n }\n }\n }\n drawEditorView(editorView: any, x: number, y: number): void {\n if (!editorView) return\n\n const viewport = editorView.getViewport()\n const text = editorView.getText()\n const lines = text.split(\"\\n\")\n\n // Default colors\n const dfg = editorView.editBuffer?._defaultFg ?? {\n r: 1, g: 1, b: 1, a: 1,\n buffer: new Float32Array([1, 1, 1, 1]),\n } as RGBA\n const dbg = editorView.editBuffer?._defaultBg ?? {\n r: 0, g: 0, b: 0, a: 0,\n buffer: new Float32Array([0, 0, 0, 0]),\n } as RGBA\n\n const visibleRows = viewport.height > 0 ? viewport.height : this._height - y\n\n if (text === \"\" && editorView._placeholderChunks && editorView._placeholderChunks.length > 0) {\n // Draw placeholder text\n let curX = x\n for (const chunk of editorView._placeholderChunks) {\n const chunkFg = chunk.fg ?? dfg\n const chunkBg = chunk.bg ?? dbg\n const attr = (chunk.attributes ?? 0) | 2 // DIM attribute = 1 << 1\n for (const ch of chunk.text) {\n if (curX >= this._width) break\n if (curX >= 0 && y >= 0 && y < this._height) {\n this.setCell(curX, y, ch, chunkFg, chunkBg, attr)\n }\n curX++\n }\n }\n } else {\n // Draw text lines\n for (let row = 0; row < visibleRows; row++) {\n const lineIdx = viewport.offsetY + row\n if (lineIdx < 0 || lineIdx >= lines.length) continue\n const dstRow = y + row\n if (dstRow < 0 || dstRow >= this._height) continue\n\n const line = lines[lineIdx]\n for (let col = 0; col < line.length; col++) {\n const srcCol = viewport.offsetX + col\n if (srcCol < 0 || srcCol >= line.length) continue\n const dstCol = x + col\n if (dstCol < 0 || dstCol >= this._width) break\n\n this.setCell(dstCol, dstRow, line[srcCol], dfg, dbg, 0)\n }\n }\n }\n\n // Draw cursor with INVERSE attribute\n const cursor = editorView.getVisualCursor()\n if (cursor) {\n const cursorX = x + cursor.visualCol\n const cursorY = y + cursor.visualRow\n if (cursorX >= 0 && cursorX < this._width && cursorY >= 0 && cursorY < this._height) {\n const idx = cursorY * this._width + cursorX\n const charCode = this.char[idx]\n const ch = charCode === 0 || charCode === 0x20 ? \" \" : String.fromCodePoint(charCode)\n this.setCell(cursorX, cursorY, ch, dfg, dbg, 32) // INVERSE = 1 << 5 = 32\n }\n }\n }\n drawSuperSampleBuffer(): void {}\n drawPackedBuffer(): void {}\n drawGrayscaleBuffer(): void {}\n drawGrayscaleBufferSupersampled(): void {}\n drawGrid(): void {}\n encodeUnicode(_text: string): null {\n return null\n }\n freeUnicode(): void {}\n getRealCharBytes(): Uint8Array {\n return new Uint8Array(0)\n }\n destroy(): void {}\n}\n\n// Export as OptimizedBuffer so opentui source code imports work directly\nexport { BrowserBuffer as OptimizedBuffer }\n","import type { BrowserBuffer } from \"./browser-buffer\"\nimport type { SelectionManager } from \"./selection-manager\"\n\nconst TextAttributes = {\n BOLD: 1 << 0,\n DIM: 1 << 1,\n ITALIC: 1 << 2,\n UNDERLINE: 1 << 3,\n UNDERLINE_DASHED: 1 << 4,\n INVERSE: 1 << 5,\n UNDERLINE_DOTTED: 1 << 6,\n}\n\nconst CONTINUATION = 0xc0000000\n\n// Box-drawing character definitions (U+2500–U+257F)\n// Each entry defines which directions extend from cell center and the line weight.\ninterface BoxDrawDef {\n left?: boolean\n right?: boolean\n up?: boolean\n down?: boolean\n type: \"light\" | \"heavy\" | \"double\"\n arc?: \"tl\" | \"tr\" | \"bl\" | \"br\" // rounded corner arc direction\n}\n\nconst BOX_DRAWING_MAP: Record<number, BoxDrawDef> = {\n // Light lines\n 0x2500: { left: true, right: true, type: \"light\" }, // ─\n 0x2502: { up: true, down: true, type: \"light\" }, // │\n 0x250c: { right: true, down: true, type: \"light\" }, // ┌\n 0x2510: { left: true, down: true, type: \"light\" }, // ┐\n 0x2514: { right: true, up: true, type: \"light\" }, // └\n 0x2518: { left: true, up: true, type: \"light\" }, // ┘\n 0x251c: { up: true, down: true, right: true, type: \"light\" }, // ├\n 0x2524: { up: true, down: true, left: true, type: \"light\" }, // ┤\n 0x252c: { left: true, right: true, down: true, type: \"light\" }, // ┬\n 0x2534: { left: true, right: true, up: true, type: \"light\" }, // ┴\n 0x253c: { left: true, right: true, up: true, down: true, type: \"light\" }, // ┼\n\n // Heavy lines\n 0x2501: { left: true, right: true, type: \"heavy\" }, // ━\n 0x2503: { up: true, down: true, type: \"heavy\" }, // ┃\n 0x250f: { right: true, down: true, type: \"heavy\" }, // ┏\n 0x2513: { left: true, down: true, type: \"heavy\" }, // ┓\n 0x2517: { right: true, up: true, type: \"heavy\" }, // ┗\n 0x251b: { left: true, up: true, type: \"heavy\" }, // ┛\n 0x2523: { up: true, down: true, right: true, type: \"heavy\" }, // ┣\n 0x252b: { up: true, down: true, left: true, type: \"heavy\" }, // ┫\n 0x2533: { left: true, right: true, down: true, type: \"heavy\" }, // ┳\n 0x253b: { left: true, right: true, up: true, type: \"heavy\" }, // ┻\n 0x254b: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╋\n\n // Light/heavy mixed (treat as light for simplicity of joins)\n 0x250d: { right: true, down: true, type: \"heavy\" }, // ┍\n 0x250e: { right: true, down: true, type: \"heavy\" }, // ┎\n 0x2511: { left: true, down: true, type: \"heavy\" }, // ┑\n 0x2512: { left: true, down: true, type: \"heavy\" }, // ┒\n 0x2515: { right: true, up: true, type: \"heavy\" }, // ┕\n 0x2516: { right: true, up: true, type: \"heavy\" }, // ┖\n 0x2519: { left: true, up: true, type: \"heavy\" }, // ┙\n 0x251a: { left: true, up: true, type: \"heavy\" }, // ┚\n 0x251d: { up: true, down: true, right: true, type: \"heavy\" }, // ┝\n 0x251e: { up: true, down: true, right: true, type: \"light\" }, // ┞\n 0x251f: { up: true, down: true, right: true, type: \"light\" }, // ┟\n 0x2520: { up: true, down: true, right: true, type: \"heavy\" }, // ┠\n 0x2521: { up: true, down: true, right: true, type: \"heavy\" }, // ┡\n 0x2522: { up: true, down: true, right: true, type: \"heavy\" }, // ┢\n 0x2525: { up: true, down: true, left: true, type: \"heavy\" }, // ┥\n 0x2526: { up: true, down: true, left: true, type: \"light\" }, // ┦\n 0x2527: { up: true, down: true, left: true, type: \"light\" }, // ┧\n 0x2528: { up: true, down: true, left: true, type: \"heavy\" }, // ┨\n 0x2529: { up: true, down: true, left: true, type: \"heavy\" }, // ┩\n 0x252a: { up: true, down: true, left: true, type: \"heavy\" }, // ┪\n 0x252d: { left: true, right: true, down: true, type: \"heavy\" }, // ┭\n 0x252e: { left: true, right: true, down: true, type: \"heavy\" }, // ┮\n 0x252f: { left: true, right: true, down: true, type: \"heavy\" }, // ┯\n 0x2530: { left: true, right: true, down: true, type: \"heavy\" }, // ┰\n 0x2531: { left: true, right: true, down: true, type: \"heavy\" }, // ┱\n 0x2532: { left: true, right: true, down: true, type: \"heavy\" }, // ┲\n 0x2535: { left: true, right: true, up: true, type: \"heavy\" }, // ┵\n 0x2536: { left: true, right: true, up: true, type: \"heavy\" }, // ┶\n 0x2537: { left: true, right: true, up: true, type: \"heavy\" }, // ┷\n 0x2538: { left: true, right: true, up: true, type: \"heavy\" }, // ┸\n 0x2539: { left: true, right: true, up: true, type: \"heavy\" }, // ┹\n 0x253a: { left: true, right: true, up: true, type: \"heavy\" }, // ┺\n 0x253d: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ┽\n 0x253e: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ┾\n 0x253f: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ┿\n 0x2540: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╀\n 0x2541: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╁\n 0x2542: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╂\n 0x2543: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╃\n 0x2544: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╄\n 0x2545: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╅\n 0x2546: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╆\n 0x2547: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╇\n 0x2548: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╈\n 0x2549: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╉\n 0x254a: { left: true, right: true, up: true, down: true, type: \"heavy\" }, // ╊\n\n // Dashed lines (render as solid light/heavy)\n 0x2504: { left: true, right: true, type: \"light\" }, // ┄\n 0x2505: { left: true, right: true, type: \"heavy\" }, // ┅\n 0x2506: { up: true, down: true, type: \"light\" }, // ┆\n 0x2507: { up: true, down: true, type: \"heavy\" }, // ┇\n 0x2508: { left: true, right: true, type: \"light\" }, // ┈\n 0x2509: { left: true, right: true, type: \"heavy\" }, // ┉\n 0x250a: { up: true, down: true, type: \"light\" }, // ┊\n 0x250b: { up: true, down: true, type: \"heavy\" }, // ┋\n\n // Double lines\n 0x2550: { left: true, right: true, type: \"double\" }, // ═\n 0x2551: { up: true, down: true, type: \"double\" }, // ║\n 0x2552: { right: true, down: true, type: \"double\" }, // ╒\n 0x2553: { right: true, down: true, type: \"double\" }, // ╓\n 0x2554: { right: true, down: true, type: \"double\" }, // ╔\n 0x2555: { left: true, down: true, type: \"double\" }, // ╕\n 0x2556: { left: true, down: true, type: \"double\" }, // ╖\n 0x2557: { left: true, down: true, type: \"double\" }, // ╗\n 0x2558: { right: true, up: true, type: \"double\" }, // ╘\n 0x2559: { right: true, up: true, type: \"double\" }, // ╙\n 0x255a: { right: true, up: true, type: \"double\" }, // ╚\n 0x255b: { left: true, up: true, type: \"double\" }, // ╛\n 0x255c: { left: true, up: true, type: \"double\" }, // ╜\n 0x255d: { left: true, up: true, type: \"double\" }, // ╝\n 0x255e: { up: true, down: true, right: true, type: \"double\" }, // ╞\n 0x255f: { up: true, down: true, right: true, type: \"double\" }, // ╟\n 0x2560: { up: true, down: true, right: true, type: \"double\" }, // ╠\n 0x2561: { up: true, down: true, left: true, type: \"double\" }, // ╡\n 0x2562: { up: true, down: true, left: true, type: \"double\" }, // ╢\n 0x2563: { up: true, down: true, left: true, type: \"double\" }, // ╣\n 0x2564: { left: true, right: true, down: true, type: \"double\" }, // ╤\n 0x2565: { left: true, right: true, down: true, type: \"double\" }, // ╥\n 0x2566: { left: true, right: true, down: true, type: \"double\" }, // ╦\n 0x2567: { left: true, right: true, up: true, type: \"double\" }, // ╧\n 0x2568: { left: true, right: true, up: true, type: \"double\" }, // ╨\n 0x2569: { left: true, right: true, up: true, type: \"double\" }, // ╩\n 0x256a: { left: true, right: true, up: true, down: true, type: \"double\" }, // ╪\n 0x256b: { left: true, right: true, up: true, down: true, type: \"double\" }, // ╫\n 0x256c: { left: true, right: true, up: true, down: true, type: \"double\" }, // ╬\n\n // Rounded corners\n 0x256d: { right: true, down: true, type: \"light\", arc: \"tl\" }, // ╭\n 0x256e: { left: true, down: true, type: \"light\", arc: \"tr\" }, // ╮\n 0x256f: { left: true, up: true, type: \"light\", arc: \"br\" }, // ╯\n 0x2570: { right: true, up: true, type: \"light\", arc: \"bl\" }, // ╰\n\n // Diagonal lines (render as simple connecting lines)\n 0x2571: { type: \"light\" }, // ╱ (forward slash)\n 0x2572: { type: \"light\" }, // ╲ (backslash)\n 0x2573: { type: \"light\" }, // ╳ (cross)\n\n // Half lines\n 0x2574: { left: true, type: \"light\" }, // ╴\n 0x2575: { up: true, type: \"light\" }, // ╵\n 0x2576: { right: true, type: \"light\" }, // ╶\n 0x2577: { down: true, type: \"light\" }, // ╷\n 0x2578: { left: true, type: \"heavy\" }, // ╸\n 0x2579: { up: true, type: \"heavy\" }, // ╹\n 0x257a: { right: true, type: \"heavy\" }, // ╺\n 0x257b: { down: true, type: \"heavy\" }, // ╻\n 0x257c: { left: true, right: true, type: \"light\" }, // ╼ (light left, heavy right)\n 0x257d: { up: true, down: true, type: \"light\" }, // ╽ (light up, heavy down)\n 0x257e: { left: true, right: true, type: \"heavy\" }, // ╾ (heavy left, light right)\n 0x257f: { up: true, down: true, type: \"heavy\" }, // ╿ (heavy up, light down)\n}\n\nexport interface CanvasPainterOptions {\n fontFamily?: string\n fontSize?: number\n}\n\nexport class CanvasPainter {\n private cellWidth: number = 0\n private cellHeight: number = 0\n private fontFamily: string\n private fontSize: number\n private baselineOffset: number = 0\n\n constructor(options: CanvasPainterOptions = {}) {\n this.fontFamily = options.fontFamily ?? \"'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'Consolas', monospace\"\n this.fontSize = options.fontSize ?? 14\n }\n\n measureCell(ctx: CanvasRenderingContext2D): { width: number; height: number } {\n ctx.font = `${this.fontSize}px ${this.fontFamily}`\n const metrics = ctx.measureText(\"M\")\n this.cellWidth = metrics.width\n this.cellHeight = Math.ceil(this.fontSize * 1.4)\n this.baselineOffset = Math.ceil(this.fontSize * 1.1)\n return { width: this.cellWidth, height: this.cellHeight }\n }\n\n getCellSize(): { width: number; height: number } {\n return { width: this.cellWidth, height: this.cellHeight }\n }\n\n paint(ctx: CanvasRenderingContext2D, buffer: BrowserBuffer, selection?: SelectionManager): void {\n const { char, fg, bg, attributes } = buffer\n const cols = buffer.width\n const rows = buffer.height\n const cw = this.cellWidth\n const ch = this.cellHeight\n\n // Pass 1: Background rects — batch adjacent same-color cells per row\n for (let row = 0; row < rows; row++) {\n let runStartCol = 0\n let runR = -1,\n runG = -1,\n runB = -1,\n runA = -1\n\n for (let col = 0; col <= cols; col++) {\n let r = 0,\n g = 0,\n b = 0,\n a = 0\n if (col < cols) {\n const idx = row * cols + col\n const offset = idx * 4\n const attr = attributes[idx] & 0xff\n const isInverse = !!(attr & TextAttributes.INVERSE)\n if (isInverse) {\n // INVERSE: use fg color as background\n r = fg[offset]\n g = fg[offset + 1]\n b = fg[offset + 2]\n a = fg[offset + 3]\n } else {\n r = bg[offset]\n g = bg[offset + 1]\n b = bg[offset + 2]\n a = bg[offset + 3]\n }\n }\n\n if (col < cols && r === runR && g === runG && b === runB && a === runA) {\n continue\n }\n\n // Flush previous run\n if (runA > 0 && col > runStartCol) {\n ctx.fillStyle = rgbaToCSS(runR, runG, runB, runA)\n ctx.fillRect(runStartCol * cw, row * ch, (col - runStartCol) * cw, ch)\n }\n\n runStartCol = col\n runR = r\n runG = g\n runB = b\n runA = a\n }\n }\n\n // Pass 2: Foreground characters\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const idx = row * cols + col\n\n // Skip continuation cells (wide char placeholders)\n if (attributes[idx] & CONTINUATION) continue\n\n const charCode = char[idx]\n if (charCode === 0 || charCode === 0x20) continue // skip spaces\n\n const offset = idx * 4\n const attr = attributes[idx] & 0xff\n const isInverse = !!(attr & TextAttributes.INVERSE)\n\n let fgR: number, fgG: number, fgB: number, fgA: number\n if (isInverse) {\n // INVERSE: use bg color as text color\n fgR = bg[offset]\n fgG = bg[offset + 1]\n fgB = bg[offset + 2]\n fgA = bg[offset + 3]\n // If bg is transparent, use black (default terminal bg) as text color\n if (fgA === 0) {\n fgR = 0; fgG = 0; fgB = 0; fgA = 1\n }\n } else {\n fgR = fg[offset]\n fgG = fg[offset + 1]\n fgB = fg[offset + 2]\n fgA = fg[offset + 3]\n }\n\n if (fgA === 0) continue\n\n const isBold = !!(attr & TextAttributes.BOLD)\n const isItalic = !!(attr & TextAttributes.ITALIC)\n const isDim = !!(attr & TextAttributes.DIM)\n const isUnderline = !!(attr & TextAttributes.UNDERLINE)\n\n const effectiveA = isDim ? fgA * 0.5 : fgA\n\n // Box-drawing character rendering\n if (charCode >= 0x2500 && charCode <= 0x257f) {\n const def = BOX_DRAWING_MAP[charCode]\n if (def) {\n const cellX = col * cw\n const cellY = row * ch\n const cx = cellX + cw / 2\n const cy = cellY + ch / 2\n ctx.strokeStyle = rgbaToCSS(fgR, fgG, fgB, effectiveA)\n ctx.lineCap = \"square\"\n\n if (def.type === \"double\") {\n // Draw two parallel lines for each direction\n const gap = Math.max(2, Math.round(cw / 5))\n ctx.lineWidth = 1\n ctx.beginPath()\n if (def.left) {\n ctx.moveTo(cellX, cy - gap / 2); ctx.lineTo(cx, cy - gap / 2)\n ctx.moveTo(cellX, cy + gap / 2); ctx.lineTo(cx, cy + gap / 2)\n }\n if (def.right) {\n ctx.moveTo(cx, cy - gap / 2); ctx.lineTo(cellX + cw, cy - gap / 2)\n ctx.moveTo(cx, cy + gap / 2); ctx.lineTo(cellX + cw, cy + gap / 2)\n }\n if (def.up) {\n ctx.moveTo(cx - gap / 2, cellY); ctx.lineTo(cx - gap / 2, cy)\n ctx.moveTo(cx + gap / 2, cellY); ctx.lineTo(cx + gap / 2, cy)\n }\n if (def.down) {\n ctx.moveTo(cx - gap / 2, cy); ctx.lineTo(cx - gap / 2, cellY + ch)\n ctx.moveTo(cx + gap / 2, cy); ctx.lineTo(cx + gap / 2, cellY + ch)\n }\n ctx.stroke()\n } else if (def.arc) {\n // Rounded corners: use ellipse to handle rectangular cells (ch ≠ cw)\n const rx = cw / 2\n const ry = ch / 2\n ctx.lineWidth = 1\n ctx.beginPath()\n if (def.arc === \"tl\") {\n // ╭: arc from right edge to bottom edge\n ctx.ellipse(cellX + cw, cellY + ch, rx, ry, 0, Math.PI, Math.PI * 1.5)\n } else if (def.arc === \"tr\") {\n // ╮: arc from left edge to bottom edge\n ctx.ellipse(cellX, cellY + ch, rx, ry, 0, Math.PI * 1.5, Math.PI * 2)\n } else if (def.arc === \"bl\") {\n // ╰: arc from right edge to top edge\n ctx.ellipse(cellX + cw, cellY, rx, ry, 0, Math.PI * 0.5, Math.PI)\n } else if (def.arc === \"br\") {\n // ╯: arc from left edge to top edge\n ctx.ellipse(cellX, cellY, rx, ry, 0, 0, Math.PI * 0.5)\n }\n ctx.stroke()\n } else if (charCode === 0x2571 || charCode === 0x2572 || charCode === 0x2573) {\n // Diagonal lines\n ctx.lineWidth = 1\n ctx.beginPath()\n if (charCode === 0x2571 || charCode === 0x2573) {\n // ╱ forward slash\n ctx.moveTo(cellX + cw, cellY)\n ctx.lineTo(cellX, cellY + ch)\n }\n if (charCode === 0x2572 || charCode === 0x2573) {\n // ╲ backslash\n ctx.moveTo(cellX, cellY)\n ctx.lineTo(cellX + cw, cellY + ch)\n }\n ctx.stroke()\n } else {\n ctx.lineWidth = def.type === \"heavy\" ? 2 : 1\n ctx.beginPath()\n if (def.left) { ctx.moveTo(cellX, cy); ctx.lineTo(cx, cy) }\n if (def.right) { ctx.moveTo(cx, cy); ctx.lineTo(cellX + cw, cy) }\n if (def.up) { ctx.moveTo(cx, cellY); ctx.lineTo(cx, cy) }\n if (def.down) { ctx.moveTo(cx, cy); ctx.lineTo(cx, cellY + ch) }\n ctx.stroke()\n }\n continue\n }\n }\n\n // Normal text rendering\n ctx.fillStyle = rgbaToCSS(fgR, fgG, fgB, effectiveA)\n\n // Build font string\n let fontStyle = \"\"\n if (isItalic) fontStyle += \"italic \"\n if (isBold) fontStyle += \"bold \"\n fontStyle += `${this.fontSize}px ${this.fontFamily}`\n ctx.font = fontStyle\n\n const character = String.fromCodePoint(charCode)\n const x = col * cw\n const y = row * this.cellHeight + this.baselineOffset\n\n ctx.fillText(character, x, y)\n\n // Draw underline\n if (isUnderline) {\n const isDashed = !!(attr & TextAttributes.UNDERLINE_DASHED)\n const isDotted = !!(attr & TextAttributes.UNDERLINE_DOTTED)\n ctx.strokeStyle = ctx.fillStyle\n ctx.lineWidth = 1\n const underlineY = row * this.cellHeight + this.baselineOffset + 2\n if (isDotted) {\n ctx.lineCap = \"round\"\n ctx.setLineDash([0.5, 2.5])\n } else if (isDashed) {\n ctx.setLineDash([2, 2])\n }\n ctx.beginPath()\n ctx.moveTo(x, underlineY)\n ctx.lineTo(x + cw, underlineY)\n ctx.stroke()\n if (isDotted || isDashed) {\n ctx.setLineDash([])\n ctx.lineCap = \"butt\"\n }\n }\n }\n }\n\n // Pass 3: Selection overlay\n if (selection?.active) {\n ctx.fillStyle = \"rgba(51, 153, 255, 0.3)\"\n for (let row = 0; row < rows; row++) {\n let runStart = -1\n for (let col = 0; col <= cols; col++) {\n const selected = col < cols && selection.isSelected(col, row)\n if (selected && runStart === -1) {\n runStart = col\n } else if (!selected && runStart !== -1) {\n ctx.fillRect(runStart * cw, row * ch, (col - runStart) * cw, ch)\n runStart = -1\n }\n }\n }\n }\n }\n}\n\nfunction rgbaToCSS(r: number, g: number, b: number, a: number): string {\n const ri = Math.round(r * 255)\n const gi = Math.round(g * 255)\n const bi = Math.round(b * 255)\n return `rgba(${ri},${gi},${bi},${a})`\n}\n","import type { BrowserBuffer } from \"./browser-buffer\"\n\ninterface SelectionRange {\n startCol: number\n startRow: number\n endCol: number\n endRow: number\n}\n\nexport class SelectionManager {\n private _startCol: number = 0\n private _startRow: number = 0\n private _endCol: number = 0\n private _endRow: number = 0\n private _active: boolean = false\n private _selecting: boolean = false\n\n startSelection(col: number, row: number): void {\n this._startCol = col\n this._startRow = row\n this._endCol = col\n this._endRow = row\n this._selecting = true\n this._active = true\n }\n\n updateSelection(col: number, row: number): void {\n if (!this._selecting) return\n this._endCol = col\n this._endRow = row\n }\n\n endSelection(): void {\n this._selecting = false\n // If start and end are the same cell, clear the selection\n if (this._startCol === this._endCol && this._startRow === this._endRow) {\n this._active = false\n }\n }\n\n clearSelection(): void {\n this._active = false\n this._selecting = false\n }\n\n get active(): boolean {\n return this._active\n }\n\n get selecting(): boolean {\n return this._selecting\n }\n\n /** Returns the selection range normalized to reading order (top-left to bottom-right) */\n getSelectedRange(): SelectionRange | null {\n if (!this._active) return null\n\n let startCol = this._startCol\n let startRow = this._startRow\n let endCol = this._endCol\n let endRow = this._endRow\n\n // Normalize to reading order\n if (startRow > endRow || (startRow === endRow && startCol > endCol)) {\n const tmpCol = startCol\n const tmpRow = startRow\n startCol = endCol\n startRow = endRow\n endCol = tmpCol\n endRow = tmpRow\n }\n\n return { startCol, startRow, endCol, endRow }\n }\n\n isSelected(col: number, row: number): boolean {\n const range = this.getSelectedRange()\n if (!range) return false\n\n const { startCol, startRow, endCol, endRow } = range\n\n if (row < startRow || row > endRow) return false\n if (startRow === endRow) {\n return col >= startCol && col < endCol\n }\n if (row === startRow) return col >= startCol\n if (row === endRow) return col < endCol\n return true\n }\n\n getSelectedText(buffer: BrowserBuffer): string {\n const range = this.getSelectedRange()\n if (!range) return \"\"\n\n const { startCol, startRow, endCol, endRow } = range\n const lines: string[] = []\n\n for (let row = startRow; row <= endRow; row++) {\n let lineStart = row === startRow ? startCol : 0\n let lineEnd = row === endRow ? endCol : buffer.width\n\n // Build the line text\n let line = \"\"\n for (let col = lineStart; col < lineEnd && col < buffer.width; col++) {\n const idx = row * buffer.width + col\n const charCode = buffer.char[idx]\n line += charCode === 0 ? \" \" : String.fromCodePoint(charCode)\n }\n\n // Trim trailing spaces\n lines.push(line.trimEnd())\n }\n\n return lines.join(\"\\n\")\n }\n}\n","import { BrowserBuffer } from \"./browser-buffer\"\nimport { BrowserRenderContext } from \"./browser-render-context\"\nimport { CanvasPainter } from \"./canvas-painter\"\nimport { SelectionManager } from \"./selection-manager\"\nimport { getLinkId } from \"./core-shims/index\"\n\n// We import these via the core-shims alias in the Vite build\n// but for the renderer we import directly to avoid circular deps\nlet RootRenderableClass: any = null\n\nexport function setRootRenderableClass(cls: any): void {\n RootRenderableClass = cls\n}\n\nexport class BrowserRenderer {\n public canvas: HTMLCanvasElement\n public ctx2d: CanvasRenderingContext2D\n public buffer: BrowserBuffer\n public renderContext: BrowserRenderContext\n public root: any // RootRenderable\n public painter: CanvasPainter\n public selection: SelectionManager\n\n private cols: number\n private rows: number\n private cellWidth: number = 0\n private cellHeight: number = 0\n private rafId: number | null = null\n private lastTime: number = 0\n private needsRender: boolean = true\n private isDragOver: boolean = false\n private cleanupListeners: (() => void)[] = []\n private mouseDownCell: { col: number; row: number } | null = null\n\n constructor(canvas: HTMLCanvasElement, cols: number, rows: number) {\n this.canvas = canvas\n this.cols = cols\n this.rows = rows\n\n const ctx2d = canvas.getContext(\"2d\")\n if (!ctx2d) throw new Error(\"Could not get 2d context\")\n this.ctx2d = ctx2d\n\n // Measure cell size\n this.painter = new CanvasPainter()\n const cellSize = this.painter.measureCell(this.ctx2d)\n this.cellWidth = cellSize.width\n this.cellHeight = cellSize.height\n\n // Size canvas\n const dpr = window.devicePixelRatio || 1\n canvas.width = Math.ceil(cols * this.cellWidth * dpr)\n canvas.height = Math.ceil(rows * this.cellHeight * dpr)\n canvas.style.width = `${cols * this.cellWidth}px`\n canvas.style.height = `${rows * this.cellHeight}px`\n this.ctx2d.scale(dpr, dpr)\n\n // Text cursor for the canvas\n canvas.style.cursor = \"text\"\n\n // Create buffer\n this.buffer = BrowserBuffer.create(cols, rows, \"wcwidth\")\n\n // Create render context\n this.renderContext = new BrowserRenderContext(cols, rows)\n this.renderContext.setOnRenderRequest(() => {\n this.needsRender = true\n })\n\n // Create selection manager\n this.selection = new SelectionManager()\n\n // Create root renderable\n if (!RootRenderableClass) {\n throw new Error(\"RootRenderableClass not set. Call setRootRenderableClass before creating BrowserRenderer.\")\n }\n this.root = new RootRenderableClass(this.renderContext)\n\n // Set up DOM event listeners\n this.setupDomListeners()\n }\n\n private pixelToCell(clientX: number, clientY: number): { col: number; row: number } {\n const rect = this.canvas.getBoundingClientRect()\n const x = clientX - rect.left\n const y = clientY - rect.top\n const col = Math.floor(x / this.cellWidth)\n const row = Math.floor(y / this.cellHeight)\n return {\n col: Math.max(0, Math.min(col, this.cols - 1)),\n row: Math.max(0, Math.min(row, this.rows - 1)),\n }\n }\n\n private setupDomListeners(): void {\n // --- Drag-and-drop ---\n const onDragOver = (e: DragEvent) => {\n e.preventDefault()\n }\n this.canvas.addEventListener(\"dragover\", onDragOver)\n this.cleanupListeners.push(() => this.canvas.removeEventListener(\"dragover\", onDragOver))\n\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n const files = e.dataTransfer?.files\n if (!files || files.length === 0) return\n const file = files[0]\n this.isDragOver = false\n this.renderContext.emit(\"drag-leave\", undefined)\n file.text().then((content) => {\n this.renderContext.emit(\"file-drop\", {\n name: file.name,\n content,\n type: file.type,\n size: file.size,\n })\n })\n }\n this.canvas.addEventListener(\"drop\", onDrop)\n this.cleanupListeners.push(() => this.canvas.removeEventListener(\"drop\", onDrop))\n\n // --- Mouse selection ---\n const onMouseDown = (e: MouseEvent) => {\n // Only left button\n if (e.button !== 0) return\n this.canvas.focus()\n const { col, row } = this.pixelToCell(e.clientX, e.clientY)\n this.mouseDownCell = { col, row }\n this.selection.startSelection(col, row)\n this.needsRender = true\n }\n this.canvas.addEventListener(\"mousedown\", onMouseDown)\n this.cleanupListeners.push(() => this.canvas.removeEventListener(\"mousedown\", onMouseDown))\n\n const onMouseMove = (e: MouseEvent) => {\n // Update cursor style based on whether we're hovering a link\n const { col, row } = this.pixelToCell(e.clientX, e.clientY)\n const idx = row * this.buffer.width + col\n if (idx >= 0 && idx < this.buffer.attributes.length) {\n const linkId = getLinkId(this.buffer.attributes[idx])\n this.canvas.style.cursor = linkId > 0 ? \"pointer\" : \"text\"\n }\n\n if (!this.selection.selecting) return\n this.selection.updateSelection(col, row)\n this.needsRender = true\n }\n this.canvas.addEventListener(\"mousemove\", onMouseMove)\n this.cleanupListeners.push(() => this.canvas.removeEventListener(\"mousemove\", onMouseMove))\n\n const onMouseUp = (e: MouseEvent) => {\n const wasSelecting = this.selection.selecting\n if (wasSelecting) {\n this.selection.endSelection()\n this.needsRender = true\n }\n\n // Check for link click: same cell as mousedown (no drag)\n if (e.button === 0 && this.mouseDownCell) {\n const { col, row } = this.pixelToCell(e.clientX, e.clientY)\n if (col === this.mouseDownCell.col && row === this.mouseDownCell.row) {\n const idx = row * this.buffer.width + col\n if (idx >= 0 && idx < this.buffer.attributes.length) {\n const attr = this.buffer.attributes[idx]\n const linkId = getLinkId(attr)\n if (linkId > 0) {\n const url = this.buffer.getLinkUrl(linkId)\n if (url) {\n window.open(url, \"_blank\")\n }\n }\n }\n }\n this.mouseDownCell = null\n }\n }\n window.addEventListener(\"mouseup\", onMouseUp)\n this.cleanupListeners.push(() => window.removeEventListener(\"mouseup\", onMouseUp))\n\n // --- Drag enter/leave for visual feedback ---\n const onDragEnter = (e: DragEvent) => {\n e.preventDefault()\n if (this.isDragOver) return\n this.isDragOver = true\n this.renderContext.emit(\"drag-enter\", undefined)\n this.needsRender = true\n }\n this.canvas.addEventListener(\"dragenter\", onDragEnter)\n this.cleanupListeners.push(() => this.canvas.removeEventListener(\"dragenter\", onDragEnter))\n\n const onDragLeave = (e: DragEvent) => {\n // Only emit when truly leaving the canvas (not entering a child)\n if (e.relatedTarget && this.canvas.contains(e.relatedTarget as Node)) return\n this.isDragOver = false\n this.renderContext.emit(\"drag-leave\", undefined)\n this.needsRender = true\n }\n this.canvas.addEventListener(\"dragleave\", onDragLeave)\n this.cleanupListeners.push(() => this.canvas.removeEventListener(\"dragleave\", onDragLeave))\n\n // --- Paste ---\n const onPaste = (e: ClipboardEvent) => {\n if (document.activeElement !== this.canvas) return\n const text = e.clipboardData?.getData(\"text/plain\")\n if (text) {\n e.preventDefault()\n this.renderContext.emit(\"paste\", text)\n }\n }\n document.addEventListener(\"paste\", onPaste)\n this.cleanupListeners.push(() => document.removeEventListener(\"paste\", onPaste))\n }\n\n start(): void {\n this.lastTime = performance.now()\n this.loop()\n }\n\n stop(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n for (const cleanup of this.cleanupListeners) {\n cleanup()\n }\n this.cleanupListeners = []\n }\n\n private loop = (): void => {\n this.rafId = requestAnimationFrame(this.loop)\n\n const now = performance.now()\n const deltaTime = now - this.lastTime\n this.lastTime = now\n\n if (!this.needsRender) return\n this.needsRender = false\n\n // Clear buffer\n this.buffer.clear()\n\n // Run lifecycle passes\n const lifecyclePasses = this.renderContext.getLifecyclePasses()\n for (const renderable of lifecyclePasses) {\n if (renderable.onLifecyclePass) {\n renderable.onLifecyclePass()\n }\n }\n\n // Calculate layout\n this.root.calculateLayout()\n\n // Collect render commands\n const renderList: any[] = []\n this.root.updateLayout(deltaTime, renderList)\n\n // Execute render commands\n for (const cmd of renderList) {\n switch (cmd.action) {\n case \"pushScissorRect\":\n this.buffer.pushScissorRect(cmd.x, cmd.y, cmd.width, cmd.height)\n break\n case \"popScissorRect\":\n this.buffer.popScissorRect()\n break\n case \"pushOpacity\":\n this.buffer.pushOpacity(cmd.opacity)\n break\n case \"popOpacity\":\n this.buffer.popOpacity()\n break\n case \"render\":\n cmd.renderable.render(this.buffer, deltaTime)\n break\n }\n }\n\n // Clear scissor/opacity stacks\n this.buffer.clearScissorRects()\n this.buffer.clearOpacity()\n\n // Paint to canvas\n const dpr = window.devicePixelRatio || 1\n this.ctx2d.setTransform(dpr, 0, 0, dpr, 0, 0)\n this.ctx2d.clearRect(0, 0, this.canvas.width, this.canvas.height)\n this.painter.paint(this.ctx2d, this.buffer, this.selection)\n }\n\n resize(cols: number, rows: number): void {\n this.cols = cols\n this.rows = rows\n\n const dpr = window.devicePixelRatio || 1\n this.canvas.width = Math.ceil(cols * this.cellWidth * dpr)\n this.canvas.height = Math.ceil(rows * this.cellHeight * dpr)\n this.canvas.style.width = `${cols * this.cellWidth}px`\n this.canvas.style.height = `${rows * this.cellHeight}px`\n this.ctx2d.scale(dpr, dpr)\n\n this.buffer.resize(cols, rows)\n this.renderContext.resize(cols, rows)\n this.root.resize(cols, rows)\n this.needsRender = true\n }\n\n private static PREVENT_DEFAULT_KEYS = new Set([\n \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\",\n \" \", \"PageUp\", \"PageDown\", \"Tab\", \"Home\", \"End\",\n ])\n\n private static MODIFIER_KEYS = new Set([\"Alt\", \"Control\", \"Meta\", \"Shift\"])\n\n private static KEY_MAP: Record<string, string> = {\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n ArrowLeft: \"left\",\n ArrowRight: \"right\",\n Enter: \"return\",\n Backspace: \"backspace\",\n Delete: \"delete\",\n Tab: \"tab\",\n Escape: \"escape\",\n Home: \"home\",\n End: \"end\",\n \" \": \"space\",\n PageUp: \"pageup\",\n PageDown: \"pagedown\",\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n // Prevent navigation keys from scrolling the page\n if (BrowserRenderer.PREVENT_DEFAULT_KEYS.has(event.key)) {\n event.preventDefault()\n }\n\n // Copy selected text to clipboard (Cmd+C, Ctrl+C, or Option+C on Mac where key is \"ç\")\n if (this.selection.active && (event.key === \"c\" || event.key === \"ç\") && (event.metaKey || event.ctrlKey || event.altKey)) {\n const text = this.selection.getSelectedText(this.buffer)\n if (text) {\n navigator.clipboard.writeText(text).catch(() => {\n // Fallback: temporary textarea + execCommand\n const ta = document.createElement(\"textarea\")\n ta.value = text\n ta.style.position = \"fixed\"\n ta.style.left = \"-9999px\"\n document.body.appendChild(ta)\n ta.select()\n document.execCommand(\"copy\")\n document.body.removeChild(ta)\n })\n }\n event.preventDefault()\n return\n }\n\n // Any other keypress clears the selection (standard terminal behavior)\n // But ignore modifier-only keys so the user can press Option/Ctrl/Cmd before C\n const modifierOnly = BrowserRenderer.MODIFIER_KEYS.has(event.key)\n if (this.selection.active && !modifierOnly) {\n this.selection.clearSelection()\n this.needsRender = true\n }\n\n // Translate browser KeyboardEvent to OpenTUI KeyEvent format\n const keyEvent = {\n name: BrowserRenderer.KEY_MAP[event.key] ?? (event.key.length === 1 ? event.key : event.key.toLowerCase()),\n ctrl: event.ctrlKey,\n meta: event.metaKey,\n shift: event.shiftKey,\n option: event.altKey,\n sequence: event.key,\n number: false,\n raw: event.key,\n eventType: \"press\" as const,\n source: \"raw\" as const,\n _defaultPrevented: false,\n _propagationStopped: false,\n get defaultPrevented() {\n return this._defaultPrevented\n },\n get propagationStopped() {\n return this._propagationStopped\n },\n preventDefault() {\n this._defaultPrevented = true\n },\n stopPropagation() {\n this._propagationStopped = true\n },\n }\n\n this.renderContext._internalKeyInput.emit(\"keypress\", keyEvent)\n this.renderContext.keyInput.emit(\"keypress\", keyEvent)\n }\n}\n","import { createContext, useContext } from \"react\"\nimport type { BrowserRenderContext } from \"./browser-render-context\"\n\nexport interface BrowserContextValue {\n renderContext: BrowserRenderContext\n}\n\nexport const BrowserContext = createContext<BrowserContextValue | null>(null)\n\nexport function useBrowserContext(): BrowserContextValue {\n const ctx = useContext(BrowserContext)\n if (!ctx) {\n throw new Error(\"useBrowserContext must be used within a BrowserContext.Provider\")\n }\n return ctx\n}\n","import React, { type ReactNode } from \"react\"\nimport type { BrowserRenderer } from \"./browser-renderer\"\nimport { BrowserContext } from \"./browser-context\"\n\n// Import from opentui react through Vite aliases\nimport { _render } from \"../../../opentui/packages/react/src/reconciler/reconciler\"\nimport { AppContext } from \"../../../opentui/packages/react/src/components/app\"\nimport { ErrorBoundary } from \"../../../opentui/packages/react/src/components/error-boundary\"\n\nexport interface BrowserRoot {\n render(node: ReactNode): void\n unmount(): void\n}\n\nexport function createBrowserRoot(renderer: BrowserRenderer): BrowserRoot {\n let unmountFn: (() => void) | null = null\n\n return {\n render(node: ReactNode) {\n const element = (\n <BrowserContext.Provider value={{ renderContext: renderer.renderContext }}>\n <AppContext.Provider value={{ keyHandler: renderer.renderContext.keyInput as any, renderer: null }}>\n <ErrorBoundary>{node}</ErrorBoundary>\n </AppContext.Provider>\n </BrowserContext.Provider>\n )\n unmountFn = _render(element, renderer.root)\n },\n unmount() {\n if (unmountFn) {\n // Reconciler cleanup would happen here\n }\n },\n }\n}\n"],"mappings":"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M,MAAM,QAAQ;AAAA;AAAA,EAC3D,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,QAAQ;AAAA;AAAA,EAC3D,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,QAAQ;AAAA;AAAA,EAC3D,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,QAAQ;AAAA;AAAA,EAC3D,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,QAAQ;AAAA;AAAA,EAC3D,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,QAAQ;AAAA;AAAA,EAC3D,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,EAAE,MAAM,MAAM,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA;AAAA,EACvE,MAAQ,E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","names":["DebugOverlayCorner","fg","bg","bg","fg","TextAttributes","CONTINUATION","fg","bg","RootRenderable","jsx"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SSR-safe utilities for @gridland/web.
3
+ * These can be imported in any environment (Node.js, browser, edge).
4
+ */
5
+ /** Check if running in a browser environment */
6
+ declare function isBrowser(): boolean;
7
+ /** Check if canvas is supported */
8
+ declare function isCanvasSupported(): boolean;
9
+ /** Calculate grid dimensions from pixel dimensions and font size */
10
+ declare function calculateGridSize(widthPx: number, heightPx: number, cellWidth: number, cellHeight: number): {
11
+ cols: number;
12
+ rows: number;
13
+ };
14
+
15
+ export { calculateGridSize, isBrowser, isCanvasSupported };
package/dist/utils.js ADDED
@@ -0,0 +1,21 @@
1
+ // src/utils.ts
2
+ function isBrowser() {
3
+ return typeof window !== "undefined" && typeof document !== "undefined";
4
+ }
5
+ function isCanvasSupported() {
6
+ if (!isBrowser()) return false;
7
+ const canvas = document.createElement("canvas");
8
+ return !!canvas.getContext("2d");
9
+ }
10
+ function calculateGridSize(widthPx, heightPx, cellWidth, cellHeight) {
11
+ return {
12
+ cols: Math.max(1, Math.floor(widthPx / cellWidth)),
13
+ rows: Math.max(1, Math.floor(heightPx / cellHeight))
14
+ };
15
+ }
16
+ export {
17
+ calculateGridSize,
18
+ isBrowser,
19
+ isCanvasSupported
20
+ };
21
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["/**\n * SSR-safe utilities for @gridland/web.\n * These can be imported in any environment (Node.js, browser, edge).\n */\n\n/** Check if running in a browser environment */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\"\n}\n\n/** Check if canvas is supported */\nexport function isCanvasSupported(): boolean {\n if (!isBrowser()) return false\n const canvas = document.createElement(\"canvas\")\n return !!canvas.getContext(\"2d\")\n}\n\n/** Calculate grid dimensions from pixel dimensions and font size */\nexport function calculateGridSize(\n widthPx: number,\n heightPx: number,\n cellWidth: number,\n cellHeight: number,\n): { cols: number; rows: number } {\n return {\n cols: Math.max(1, Math.floor(widthPx / cellWidth)),\n rows: Math.max(1, Math.floor(heightPx / cellHeight)),\n }\n}\n"],"mappings":";AAMO,SAAS,YAAqB;AACnC,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;AAGO,SAAS,oBAA6B;AAC3C,MAAI,CAAC,UAAU,EAAG,QAAO;AACzB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,CAAC,CAAC,OAAO,WAAW,IAAI;AACjC;AAGO,SAAS,kBACd,SACA,UACA,WACA,YACgC;AAChC,SAAO;AAAA,IACL,MAAM,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,SAAS,CAAC;AAAA,IACjD,MAAM,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,UAAU,CAAC;AAAA,EACrD;AACF;","names":[]}
@@ -0,0 +1,15 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ /**
4
+ * Vite plugin that sets up module resolution for Gridland.
5
+ * Handles:
6
+ * - Redirecting Zig/FFI imports to browser shims
7
+ * - Resolving @opentui/core, @opentui/react, @opentui/ui
8
+ * - Shimming Node.js built-ins
9
+ * - Breaking circular dependencies
10
+ *
11
+ * Requires @opentui/core, @opentui/react, and @opentui/ui as peer dependencies.
12
+ */
13
+ declare function gridlandWebPlugin(): Plugin[];
14
+
15
+ export { gridlandWebPlugin };