@sigx/terminal-zero 0.5.0 → 0.6.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.
- package/LICENSE +21 -21
- package/dist/contract.js.map +1 -1
- package/dist/layout-BRHtLdVH.js.map +1 -1
- package/dist/prompts/index.js.map +1 -1
- package/dist/shared-h5p-EcZV.js.map +1 -1
- package/dist/theme/index.js.map +1 -1
- package/package.json +2 -2
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025-2026 Andreas Ekdahl
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Andreas Ekdahl
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","names":[],"sources":["../src/contract.ts"],"sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"contract.js","names":[],"sources":["../src/contract.ts"],"sourcesContent":["/**\n * The shared design-system contract for SignalX terminal UIs.\n *\n * `@sigx/terminal-zero` is the design-system-neutral foundation that skin\n * packages (`@sigx/terminal-ui`, …) build on. This module is the *vocabulary*\n * they agree on — the structural/semantic color tokens every theme authors, and\n * how each token degrades to a 16-color terminal — so switching skins or themes\n * is a token remap, not a component rewrite.\n *\n * Rules of the contract:\n * - Skins author themes against the `Theme` shape; they never redeclare the\n * token names. Drift fails `pnpm typecheck`.\n * - Hex values are the single source of truth. The renderer\n * (`@sigx/runtime-terminal`) turns a hex into a truecolor / 256 / 16-color SGR\n * escape; this contract decides which *token* maps to which 16-color ANSI name\n * when a hex can't be shown (`FALLBACK_ALIAS`).\n *\n * Token groups (from the SigX-tui design spec):\n * - structure: `bg panel chrome line fg dim faint shadow`\n * - accent: `accent accentSoft accentText selSoft`\n * - status: `success warn danger info`\n * - ANSI core: `black red green yellow blue magenta cyan white` (themed, with a\n * guaranteed 16-color fallback since they ARE ANSI names)\n */\nimport type { Define } from '@sigx/runtime-core';\n\nexport type Mode = 'dark' | 'light';\n\n/** Every token a component may reference. Keep this shape identical across themes. */\nexport interface Theme {\n name: string;\n mode: Mode;\n\n // structure\n bg: string; // canvas / terminal background\n panel: string; // raised surface\n chrome: string; // title bars / footers\n line: string; // idle borders, rules\n fg: string; // default text\n dim: string; // muted text\n faint: string; // faintest text / progress track\n shadow: string; // drop-shadow tone (▒)\n\n // accent (focus + selection)\n accent: string;\n accentSoft: string; // subtle focus tint behind content\n accentText: string; // text on a solid accent fill\n selSoft: string; // selected-row tint (Select / Radio)\n\n // status\n success: string;\n warn: string;\n danger: string;\n info: string;\n\n // ANSI core (themed); each also has a guaranteed 16-color SGR fallback\n black: string;\n red: string;\n green: string;\n yellow: string;\n blue: string;\n magenta: string;\n cyan: string;\n white: string;\n}\n\n/** A token name (anything in `Theme` except its metadata). */\nexport type ColorToken = keyof Omit<Theme, 'name' | 'mode'>;\n\n/** A color value: a semantic token (autocompleted) OR a raw `#rrggbb` hex. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/ban-types\nexport type ColorValue = ColorToken | (string & {});\n\n/** The 8 ANSI core token names — they degrade to themselves in 16-color mode. */\nexport const ANSI_NAMES: ReadonlySet<string> = new Set([\n 'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white',\n]);\n\n/**\n * Which 16-color ANSI name each non-ANSI token degrades to when the terminal\n * can't render truecolor/256. (Design knowledge — lives here, not in the\n * renderer; the renderer only knows hex→SGR device math.)\n */\nexport const FALLBACK_ALIAS: Record<string, string> = {\n accent: 'cyan', accentSoft: 'black', accentText: 'black', selSoft: 'black',\n success: 'green', warn: 'yellow', danger: 'red', info: 'cyan',\n fg: 'white', dim: 'white', faint: 'white', line: 'white',\n shadow: 'black', bg: 'black', panel: 'black', chrome: 'black',\n};\n\n// ---------------------------------------------------------------------------\n// Common prop fragments — skin component props intersect these instead of\n// redeclaring the conventions. (`variant` is intentionally NOT here — fill style\n// is skin chrome and differs per design system.)\n// ---------------------------------------------------------------------------\n\n/** Semantic/structural color of the component (`accent`, `danger`, `fg`, …). */\nexport type WithColor = Define.Prop<'color', ColorValue, false>;\n\n/** Disabled: non-interactive + skin disabled styling. */\nexport type WithDisabled = Define.Prop<'disabled', boolean, false>;\n\n/** Fieldset-style legend rendered into the top border. */\nexport type WithLabel = Define.Prop<'label', string, false>;\n\n/** Auto-focus this control on mount. */\nexport type WithAutofocus = Define.Prop<'autofocus', boolean, false>;\n"],"mappings":";AA0EA,IAAa,IAAkC,IAAI,IAAI;CACnD;CAAS;CAAO;CAAS;CAAU;CAAQ;CAAW;CAAQ;CACjE,CAAC,EAOW,IAAyC;CAClD,QAAQ;CAAQ,YAAY;CAAS,YAAY;CAAS,SAAS;CACnE,SAAS;CAAS,MAAM;CAAU,QAAQ;CAAO,MAAM;CACvD,IAAI;CAAS,KAAK;CAAS,OAAO;CAAS,MAAM;CACjD,QAAQ;CAAS,IAAI;CAAS,OAAO;CAAS,QAAQ;CACzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-BRHtLdVH.js","names":[],"sources":["../src/layout/Box.tsx","../src/layout/Col.tsx","../src/layout/Spacer.tsx","../src/layout/Divider.tsx","../src/layout/Row.tsx","../src/layout/Text.tsx"],"sourcesContent":["/** @jsxImportSource @sigx/runtime-core */\r\nimport { component, type Define } from '@sigx/runtime-core';\r\nimport { resolveColor } from '../theme';\r\n\r\n/**\r\n * Themed container. A thin wrapper over the renderer's `<box>` that resolves\r\n * token-named colors and defaults to a rounded `line` border with a themed\r\n * drop shadow. Skins compose this; raw `<box>` stays available for the renderer.\r\n */\r\nexport const Box = component<\r\n Define.Prop<'border', 'single' | 'double' | 'rounded' | 'thick' | 'none', false> &\r\n Define.Prop<'borderColor', string, false> &\r\n Define.Prop<'backgroundColor', string, false> &\r\n Define.Prop<'label', string, false> &\r\n Define.Prop<'labelColor', string, false> &\r\n Define.Prop<'padX', number, false> &\r\n Define.Prop<'dropShadow', boolean, false> &\r\n Define.Slot<'default'>\r\n>(({ props, slots }) => {\r\n return () => (\r\n <box\r\n border={props.border ?? 'rounded'}\r\n borderColor={resolveColor(props.borderColor ?? 'line')}\r\n backgroundColor={props.backgroundColor ? resolveColor(props.backgroundColor) : undefined}\r\n label={props.label}\r\n labelColor={resolveColor(props.labelColor ?? 'accent')}\r\n padX={props.padX}\r\n dropShadow={props.dropShadow}\r\n shadowColor={resolveColor('shadow')}\r\n >\r\n {slots.default?.()}\r\n </box>\r\n );\r\n}, { name: 'Box' });\r\n\r\nexport default Box;\r\n","/** @jsxImportSource @sigx/runtime-core */\r\nimport { component, type Define } from '@sigx/runtime-core';\r\n\r\n/**\r\n * Vertical stack. The renderer already lays block children out top-to-bottom,\r\n * so `Col` is a borderless grouping box with optional spacing: `gap` inserts\r\n * that many blank rows BETWEEN children (not before or after) — the\r\n * component-layer replacement for `<box></box>` spacer hacks. For\r\n * side-by-side columns, see `Row`.\r\n */\r\nexport const Col = component<\r\n Define.Prop<'gap', number, false> &\r\n Define.Slot<'default'>\r\n>(({ props, slots }) => {\r\n return () => {\r\n const children = slots.default?.();\r\n const gap = Math.max(0, props.gap ?? 0);\r\n if (!gap || !Array.isArray(children) || children.length < 2) {\r\n return <box>{children}</box>;\r\n }\r\n const spaced: unknown[] = [];\r\n children.forEach((child, i) => {\r\n if (i > 0) {\r\n for (let g = 0; g < gap; g++) {\r\n spaced.push(<box><text> </text></box>);\r\n }\r\n }\r\n spaced.push(child);\r\n });\r\n return <box>{spaced}</box>;\r\n };\r\n}, { name: 'Col' });\r\n\r\nexport default Col;\r\n","/** @jsxImportSource @sigx/runtime-core */\r\nimport { component, type Define } from '@sigx/runtime-core';\r\n\r\n/** Vertical gap of `size` blank lines (default 1). */\r\nexport const Spacer = component<\r\n Define.Prop<'size', number, false>\r\n>(({ props }) => {\r\n return () => {\r\n const size = Math.max(1, props.size ?? 1);\r\n // A <box> already renders one line; each <br/> adds another — so\r\n // exactly `size` blank lines means size-1 breaks.\r\n const breaks = [];\r\n for (let i = 0; i < size - 1; i++) breaks.push(<br />);\r\n return <box>{breaks}</box>;\r\n };\r\n}, { name: 'Spacer' });\r\n\r\nexport default Spacer;\r\n","/** @jsxImportSource @sigx/runtime-core */\r\nimport { component, type Define } from '@sigx/runtime-core';\r\nimport { displayWidth } from '@sigx/runtime-terminal';\r\nimport { resolveColor } from '../theme';\r\n\r\n/** Horizontal rule of `width` cells, with an optional centered accent label. */\r\nexport const Divider = component<\r\n Define.Prop<'width', number, false> &\r\n Define.Prop<'label', string, false> &\r\n Define.Prop<'color', string, false>\r\n>(({ props }) => {\r\n return () => {\r\n const width = Math.max(1, props.width ?? 24);\r\n const ruleColor = resolveColor(props.color ?? 'line');\r\n const label = props.label;\r\n\r\n if (!label) {\r\n return <box><text color={ruleColor}>{'─'.repeat(width)}</text></box>;\r\n }\r\n\r\n const inner = ` ${label} `;\r\n // Measure in terminal cells, not UTF-16 units — wide glyphs (CJK,\r\n // emoji) and combining marks would otherwise mis-center the label.\r\n const remain = Math.max(0, width - displayWidth(inner));\r\n const left = Math.floor(remain / 2);\r\n const right = remain - left;\r\n return (\r\n <box>\r\n <text color={ruleColor}>{'─'.repeat(left)}</text>\r\n <text color={resolveColor('accent')}>{inner}</text>\r\n <text color={ruleColor}>{'─'.repeat(right)}</text>\r\n </box>\r\n );\r\n };\r\n}, { name: 'Divider' });\r\n\r\nexport default Divider;\r\n","/** @jsxImportSource @sigx/runtime-core */\r\nimport { component, type Define } from '@sigx/runtime-core';\r\n\r\n/**\r\n * Horizontal layout: each slot child renders as a column, merged side by side\r\n * (the renderer pads every column to its own display width and zips the lines).\r\n * `gap` is the spacing between columns (default 2); `align` places shorter\r\n * columns at the start (default), center, or end — 'top'/'bottom' are\r\n * accepted aliases. A row wider than the terminal clips at the right edge —\r\n * put the column that must stay intact leftmost.\r\n */\r\nexport const Row = component<\r\n Define.Slot<'default'> &\r\n Define.Prop<'gap', number, false> &\r\n Define.Prop<'align', 'start' | 'center' | 'end' | 'top' | 'bottom', false>\r\n>(({ props, slots }) => {\r\n return () => (\r\n <row gap={props.gap ?? 2} align={props.align ?? 'start'}>\r\n {slots.default?.()}\r\n </row>\r\n );\r\n}, { name: 'Row' });\r\n\r\nexport default Row;\r\n","/** @jsxImportSource @sigx/runtime-core */\r\nimport { component, type Define } from '@sigx/runtime-core';\r\nimport { resolveColor } from '../theme';\r\n\r\n/**\r\n * Typography span — the token-aware way to write styled text without\r\n * touching `resolveColor` or raw `<text>`:\r\n *\r\n * <Text color=\"dim\">Scan with sigx-lynx-go:</Text>\r\n * <Text color=\"danger\" bold>failed</Text>\r\n *\r\n * `color`/`bg` accept theme tokens or `#hex`. Style flags map to terminal\r\n * SGR attributes (rendering depends on the emulator; all are gated off for\r\n * piped/CI output).\r\n *\r\n * NOTE — deliberately INLINE, unlike every other component: Text is a span\r\n * that composes inside a line (`<Text color=\"accent\">{n}</Text> items`).\r\n * Standalone lines use `Heading` or wrap in a layout component.\r\n *\r\n * There is no `size`/`weight` enum: terminal cells have exactly one size;\r\n * weight is the `bold`/`faint` pair. This mirrors the daisy/lynx `Text`\r\n * shape (discrete props, no variant) minus what a terminal cannot do.\r\n */\r\nexport const Text = component<\r\n Define.Prop<'color', string, false> &\r\n Define.Prop<'bg', string, false> &\r\n Define.Prop<'bold', boolean, false> &\r\n Define.Prop<'faint', boolean, false> &\r\n Define.Prop<'italic', boolean, false> &\r\n Define.Prop<'underline', boolean, false> &\r\n Define.Prop<'lineThrough', boolean, false> &\r\n Define.Prop<'inverse', boolean, false> &\r\n Define.Slot<'default'>\r\n>(({ props, slots }) => {\r\n return () => (\r\n <text\r\n color={props.color ? resolveColor(props.color) : undefined}\r\n backgroundColor={props.bg ? resolveColor(props.bg) : undefined}\r\n bold={props.bold}\r\n faint={props.faint}\r\n italic={props.italic}\r\n underline={props.underline}\r\n lineThrough={props.lineThrough}\r\n inverse={props.inverse}\r\n >\r\n {slots.default?.()}\r\n </text>\r\n );\r\n}, { name: 'Text' });\r\n\r\n/**\r\n * A standalone bold line — the terminal analog of a heading. Block element\r\n * (its own line), default color `fg`.\r\n */\r\nexport const Heading = component<\r\n Define.Prop<'color', string, false> &\r\n Define.Slot<'default'>\r\n>(({ props, slots }) => {\r\n return () => (\r\n <box>\r\n <text bold color={resolveColor(props.color ?? 'fg')}>\r\n {slots.default?.()}\r\n </text>\r\n </box>\r\n );\r\n}, { name: 'Heading' });\r\n\r\nexport default Text;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout-BRHtLdVH.js","names":[],"sources":["../src/layout/Box.tsx","../src/layout/Col.tsx","../src/layout/Spacer.tsx","../src/layout/Divider.tsx","../src/layout/Row.tsx","../src/layout/Text.tsx"],"sourcesContent":["/** @jsxImportSource @sigx/runtime-core */\nimport { component, type Define } from '@sigx/runtime-core';\nimport { resolveColor } from '../theme';\n\n/**\n * Themed container. A thin wrapper over the renderer's `<box>` that resolves\n * token-named colors and defaults to a rounded `line` border with a themed\n * drop shadow. Skins compose this; raw `<box>` stays available for the renderer.\n */\nexport const Box = component<\n Define.Prop<'border', 'single' | 'double' | 'rounded' | 'thick' | 'none', false> &\n Define.Prop<'borderColor', string, false> &\n Define.Prop<'backgroundColor', string, false> &\n Define.Prop<'label', string, false> &\n Define.Prop<'labelColor', string, false> &\n Define.Prop<'padX', number, false> &\n Define.Prop<'dropShadow', boolean, false> &\n Define.Slot<'default'>\n>(({ props, slots }) => {\n return () => (\n <box\n border={props.border ?? 'rounded'}\n borderColor={resolveColor(props.borderColor ?? 'line')}\n backgroundColor={props.backgroundColor ? resolveColor(props.backgroundColor) : undefined}\n label={props.label}\n labelColor={resolveColor(props.labelColor ?? 'accent')}\n padX={props.padX}\n dropShadow={props.dropShadow}\n shadowColor={resolveColor('shadow')}\n >\n {slots.default?.()}\n </box>\n );\n}, { name: 'Box' });\n\nexport default Box;\n","/** @jsxImportSource @sigx/runtime-core */\nimport { component, type Define } from '@sigx/runtime-core';\n\n/**\n * Vertical stack. The renderer already lays block children out top-to-bottom,\n * so `Col` is a borderless grouping box with optional spacing: `gap` inserts\n * that many blank rows BETWEEN children (not before or after) — the\n * component-layer replacement for `<box></box>` spacer hacks. For\n * side-by-side columns, see `Row`.\n */\nexport const Col = component<\n Define.Prop<'gap', number, false> &\n Define.Slot<'default'>\n>(({ props, slots }) => {\n return () => {\n const children = slots.default?.();\n const gap = Math.max(0, props.gap ?? 0);\n if (!gap || !Array.isArray(children) || children.length < 2) {\n return <box>{children}</box>;\n }\n const spaced: unknown[] = [];\n children.forEach((child, i) => {\n if (i > 0) {\n for (let g = 0; g < gap; g++) {\n spaced.push(<box><text> </text></box>);\n }\n }\n spaced.push(child);\n });\n return <box>{spaced}</box>;\n };\n}, { name: 'Col' });\n\nexport default Col;\n","/** @jsxImportSource @sigx/runtime-core */\nimport { component, type Define } from '@sigx/runtime-core';\n\n/** Vertical gap of `size` blank lines (default 1). */\nexport const Spacer = component<\n Define.Prop<'size', number, false>\n>(({ props }) => {\n return () => {\n const size = Math.max(1, props.size ?? 1);\n // A <box> already renders one line; each <br/> adds another — so\n // exactly `size` blank lines means size-1 breaks.\n const breaks = [];\n for (let i = 0; i < size - 1; i++) breaks.push(<br />);\n return <box>{breaks}</box>;\n };\n}, { name: 'Spacer' });\n\nexport default Spacer;\n","/** @jsxImportSource @sigx/runtime-core */\nimport { component, type Define } from '@sigx/runtime-core';\nimport { displayWidth } from '@sigx/runtime-terminal';\nimport { resolveColor } from '../theme';\n\n/** Horizontal rule of `width` cells, with an optional centered accent label. */\nexport const Divider = component<\n Define.Prop<'width', number, false> &\n Define.Prop<'label', string, false> &\n Define.Prop<'color', string, false>\n>(({ props }) => {\n return () => {\n const width = Math.max(1, props.width ?? 24);\n const ruleColor = resolveColor(props.color ?? 'line');\n const label = props.label;\n\n if (!label) {\n return <box><text color={ruleColor}>{'─'.repeat(width)}</text></box>;\n }\n\n const inner = ` ${label} `;\n // Measure in terminal cells, not UTF-16 units — wide glyphs (CJK,\n // emoji) and combining marks would otherwise mis-center the label.\n const remain = Math.max(0, width - displayWidth(inner));\n const left = Math.floor(remain / 2);\n const right = remain - left;\n return (\n <box>\n <text color={ruleColor}>{'─'.repeat(left)}</text>\n <text color={resolveColor('accent')}>{inner}</text>\n <text color={ruleColor}>{'─'.repeat(right)}</text>\n </box>\n );\n };\n}, { name: 'Divider' });\n\nexport default Divider;\n","/** @jsxImportSource @sigx/runtime-core */\nimport { component, type Define } from '@sigx/runtime-core';\n\n/**\n * Horizontal layout: each slot child renders as a column, merged side by side\n * (the renderer pads every column to its own display width and zips the lines).\n * `gap` is the spacing between columns (default 2); `align` places shorter\n * columns at the start (default), center, or end — 'top'/'bottom' are\n * accepted aliases. A row wider than the terminal clips at the right edge —\n * put the column that must stay intact leftmost.\n */\nexport const Row = component<\n Define.Slot<'default'> &\n Define.Prop<'gap', number, false> &\n Define.Prop<'align', 'start' | 'center' | 'end' | 'top' | 'bottom', false>\n>(({ props, slots }) => {\n return () => (\n <row gap={props.gap ?? 2} align={props.align ?? 'start'}>\n {slots.default?.()}\n </row>\n );\n}, { name: 'Row' });\n\nexport default Row;\n","/** @jsxImportSource @sigx/runtime-core */\nimport { component, type Define } from '@sigx/runtime-core';\nimport { resolveColor } from '../theme';\n\n/**\n * Typography span — the token-aware way to write styled text without\n * touching `resolveColor` or raw `<text>`:\n *\n * <Text color=\"dim\">Scan with sigx-lynx-go:</Text>\n * <Text color=\"danger\" bold>failed</Text>\n *\n * `color`/`bg` accept theme tokens or `#hex`. Style flags map to terminal\n * SGR attributes (rendering depends on the emulator; all are gated off for\n * piped/CI output).\n *\n * NOTE — deliberately INLINE, unlike every other component: Text is a span\n * that composes inside a line (`<Text color=\"accent\">{n}</Text> items`).\n * Standalone lines use `Heading` or wrap in a layout component.\n *\n * There is no `size`/`weight` enum: terminal cells have exactly one size;\n * weight is the `bold`/`faint` pair. This mirrors the daisy/lynx `Text`\n * shape (discrete props, no variant) minus what a terminal cannot do.\n */\nexport const Text = component<\n Define.Prop<'color', string, false> &\n Define.Prop<'bg', string, false> &\n Define.Prop<'bold', boolean, false> &\n Define.Prop<'faint', boolean, false> &\n Define.Prop<'italic', boolean, false> &\n Define.Prop<'underline', boolean, false> &\n Define.Prop<'lineThrough', boolean, false> &\n Define.Prop<'inverse', boolean, false> &\n Define.Slot<'default'>\n>(({ props, slots }) => {\n return () => (\n <text\n color={props.color ? resolveColor(props.color) : undefined}\n backgroundColor={props.bg ? resolveColor(props.bg) : undefined}\n bold={props.bold}\n faint={props.faint}\n italic={props.italic}\n underline={props.underline}\n lineThrough={props.lineThrough}\n inverse={props.inverse}\n >\n {slots.default?.()}\n </text>\n );\n}, { name: 'Text' });\n\n/**\n * A standalone bold line — the terminal analog of a heading. Block element\n * (its own line), default color `fg`.\n */\nexport const Heading = component<\n Define.Prop<'color', string, false> &\n Define.Slot<'default'>\n>(({ props, slots }) => {\n return () => (\n <box>\n <text bold color={resolveColor(props.color ?? 'fg')}>\n {slots.default?.()}\n </text>\n </box>\n );\n}, { name: 'Heading' });\n\nexport default Text;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/prompts/cancel.ts","../../src/prompts/keys.ts","../../src/prompts/runPrompt.ts"],"sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/prompts/cancel.ts","../../src/prompts/keys.ts","../../src/prompts/runPrompt.ts"],"sourcesContent":["/**\n * Cancellation marker for the imperative prompts. `Symbol.for` so duplicated\n * module instances (mixed dist/src resolution in a workspace) still agree.\n */\nexport const CANCEL: unique symbol = Symbol.for('sigx.prompt.cancel') as never;\n\n/** True when a prompt result means the user cancelled (Esc / Ctrl+C). */\nexport function isCancel(value: unknown): value is typeof CANCEL {\n return value === CANCEL;\n}\n","/**\n * Shared key predicates for prompt input. Constants are built with\n * fromCharCode so no raw control bytes live in source. Esc is detected by\n * exact match: Node delivers complete escape sequences per data event, so a\n * lone ESC byte is the Esc key, while arrows arrive as multi-byte chunks.\n */\nconst ESC = String.fromCharCode(27);\nconst CTRL_C = String.fromCharCode(3);\nconst DEL = String.fromCharCode(127);\nconst BS = String.fromCharCode(8);\n\nexport const isEnter = (key: string): boolean => key === '\\r' || key === '\\n';\nexport const isSpace = (key: string): boolean => key === ' ';\nexport const isEsc = (key: string): boolean => key === ESC;\nexport const isCtrlC = (key: string): boolean => key === CTRL_C;\n/** DEL on most terminals, BS on some Windows shells. */\nexport const isBackspace = (key: string): boolean => key === DEL || key === BS;\nexport const isUp = (key: string): boolean => key === ESC + '[A';\nexport const isDown = (key: string): boolean => key === ESC + '[B';\nexport const isRight = (key: string): boolean => key === ESC + '[C';\nexport const isLeft = (key: string): boolean => key === ESC + '[D';\n/** A single printable character (what a text field appends). */\nexport const isPrintable = (key: string): boolean => key.length === 1 && key >= ' ' && key !== DEL;\n","/**\n * One-shot mount plumbing for the imperative prompts: each prompt mounts an\n * inline app with `persistOnExit: false` (the UI vanishes on settle) and\n * `exitOnCtrlC: false` (Ctrl+C becomes a cancel). On settle the live region\n * is erased by the unmount and a permanent summary line takes its place —\n * a finished wizard reads as a tidy `◇`-transcript in scrollback.\n *\n * Concurrent calls SERIALIZE through a module-level promise chain — the\n * renderer is a singleton, so two live prompts can never race it.\n */\nimport {\n renderTerminal, getOutputTarget, writeStatic, printStatic, resolveFg,\n} from '@sigx/runtime-terminal';\nimport { resolveColor } from '../theme';\nimport { CANCEL } from './cancel';\n\nlet chain: Promise<unknown> = Promise.resolve();\nlet interactiveOverride: boolean | undefined;\n\n/** Test seam: force the interactive/non-interactive decision. */\nexport function __setInteractiveOverride(value?: boolean): void {\n interactiveOverride = value;\n}\n\n/** Both ends must be a TTY: output for the live region, stdin for the keys. */\nexport function isInteractive(): boolean {\n if (interactiveOverride !== undefined) return interactiveOverride;\n return getOutputTarget().isTTY && !!process.stdin.isTTY;\n}\n\n/** Foreground SGR for a theme token; '' at depth none (plain output). */\nexport function tokenSgr(token: string): string {\n return resolveFg(resolveColor(token));\n}\n\n/** Wrap text in a token color, with default-fg restore (never a full reset). */\nexport function paintToken(text: string, token: string): string {\n const code = tokenSgr(token);\n return code ? `${code}${text}\\x1b[39m` : text;\n}\n\nexport function summaryLine(kind: 'done' | 'cancel', message: string, display?: string): string {\n if (kind === 'cancel') {\n return `${paintToken('■', 'danger')} ${message} ${paintToken('· cancelled', 'dim')}`;\n }\n const tail = display !== undefined && display !== '' ? ` ${paintToken(`· ${display}`, 'dim')}` : '';\n return `${paintToken('◇', 'success')} ${message}${tail}`;\n}\n\n/**\n * Serialize a task behind any prompts already in flight. Exposed to the\n * prompt spinner so it occupies the live region exclusively too.\n */\nexport function enqueue<T>(task: () => Promise<T>): Promise<T> {\n const p = chain.then(task);\n chain = p.then(() => undefined, () => undefined);\n return p;\n}\n\nexport interface RunPromptSpec<R> {\n message: string;\n /** Build the prompt vnode; call `done` exactly once to settle. */\n build: (done: (result: R | typeof CANCEL) => void) => unknown;\n /** Human display of the result for the `◇ message · display` summary. */\n display: (result: R) => string;\n /** Non-interactive fallback (the prompt's initialValue, when provided). */\n fallback?: () => { ok: true; value: R } | { ok: false };\n}\n\n/**\n * Note on the event loop: a prompt resolves inside the stdin data handler, so\n * back-to-back awaited prompts never let the loop go empty. Pure-promise work\n * between prompts with no other pending handles could end the process —\n * real async work (fs, network, timers) keeps it alive on its own.\n */\nexport function runPrompt<R>(spec: RunPromptSpec<R>): Promise<R | typeof CANCEL> {\n const run = (): Promise<R | typeof CANCEL> => {\n if (!isInteractive()) {\n const fb = spec.fallback?.();\n if (fb && fb.ok) {\n printStatic(summaryLine('done', spec.message, spec.display(fb.value)));\n return Promise.resolve(fb.value);\n }\n return Promise.reject(new Error(\n `Prompt \"${spec.message}\" requires an interactive terminal — ` +\n 'pass the value via a CLI flag or provide initialValue.',\n ));\n }\n return new Promise<R | typeof CANCEL>((resolve) => {\n let settled = false;\n const done = (result: R | typeof CANCEL) => {\n if (settled) return;\n settled = true;\n // Order matters: unmount erases the live region and pauses\n // stdin; the unmounted writeStatic then prints the summary\n // exactly where the prompt stood.\n handle.unmount();\n writeStatic(result === CANCEL\n ? summaryLine('cancel', spec.message)\n : summaryLine('done', spec.message, spec.display(result as R)));\n resolve(result);\n };\n const handle = renderTerminal(spec.build(done), {\n mode: 'inline',\n persistOnExit: false,\n exitOnCtrlC: false,\n });\n });\n };\n return enqueue(run);\n}\n"],"mappings":";;;AAIA,IAAa,IAAwB,OAAO,IAAI,qBAAqB;AAGrE,SAAgB,EAAS,GAAwC;CAC7D,OAAO,MAAU;;;;ACFrB,IAAM,IAAM,QACN,IAAS,KACT,IAAM,KACN,IAAK,MAEE,KAAW,MAAyB,MAAQ,QAAQ,MAAQ,MAC5D,KAAW,MAAyB,MAAQ,KAC5C,KAAS,MAAyB,MAAQ,GAC1C,KAAW,MAAyB,MAAQ,GAE5C,KAAe,MAAyB,MAAQ,KAAO,MAAQ,GAC/D,KAAQ,MAAyB,MAAQ,IAAM,MAC/C,KAAU,MAAyB,MAAQ,IAAM,MACjD,KAAW,MAAyB,MAAQ,IAAM,MAClD,KAAU,MAAyB,MAAQ,IAAM,MAEjD,KAAe,MAAyB,EAAI,WAAW,KAAK,KAAO,OAAO,MAAQ,GCN3F,IAA0B,QAAQ,SAAS,EAC3C;AAGJ,SAAgB,EAAyB,GAAuB;CAC5D,IAAsB;;AAI1B,SAAgB,IAAyB;CAErC,OADI,MAAwB,KAAA,IACrB,GAAiB,CAAC,SAAS,CAAC,CAAC,QAAQ,MAAM,QADJ;;AAKlD,SAAgB,EAAS,GAAuB;CAC5C,OAAO,EAAU,EAAa,EAAM,CAAC;;AAIzC,SAAgB,EAAW,GAAc,GAAuB;CAC5D,IAAM,IAAO,EAAS,EAAM;CAC5B,OAAO,IAAO,GAAG,IAAO,EAAK,YAAY;;AAG7C,SAAgB,EAAY,GAAyB,GAAiB,GAA0B;CAC5F,IAAI,MAAS,UACT,OAAO,GAAG,EAAW,KAAK,SAAS,CAAC,GAAG,EAAQ,GAAG,EAAW,eAAe,MAAM;CAEtF,IAAM,IAAO,MAAY,KAAA,KAAa,MAAY,KAAK,IAAI,EAAW,KAAK,KAAW,MAAM,KAAK;CACjG,OAAO,GAAG,EAAW,KAAK,UAAU,CAAC,GAAG,IAAU;;AAOtD,SAAgB,EAAW,GAAoC;CAC3D,IAAM,IAAI,EAAM,KAAK,EAAK;CAE1B,OADA,IAAQ,EAAE,WAAW,KAAA,SAAiB,KAAA,EAAU,EACzC;;AAmBX,SAAgB,EAAa,GAAoD;CAkC7E,OAAO,QAjCuC;EAC1C,IAAI,CAAC,GAAe,EAAE;GAClB,IAAM,IAAK,EAAK,YAAY;GAK5B,OAJI,KAAM,EAAG,MACT,EAAY,EAAY,QAAQ,EAAK,SAAS,EAAK,QAAQ,EAAG,MAAM,CAAC,CAAC,EAC/D,QAAQ,QAAQ,EAAG,MAAM,IAE7B,QAAQ,OAAO,gBAAI,MACtB,WAAW,EAAK,QAAQ,6FAE3B,CAAC;;EAEN,OAAO,IAAI,SAA4B,MAAY;GAC/C,IAAI,IAAU,IAaR,IAAS,EAAe,EAAK,OAZrB,MAA8B;IACpC,MACJ,IAAU,IAIV,EAAO,SAAS,EAChB,EAAY,MAAW,IACjB,EAAY,UAAU,EAAK,QAAQ,GACnC,EAAY,QAAQ,EAAK,SAAS,EAAK,QAAQ,EAAY,CAAC,CAAC,EACnE,EAAQ,EAAO;KAE2B,EAAE;IAC5C,MAAM;IACN,eAAe;IACf,aAAa;IAChB,CAAC;IACJ;GAEa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-h5p-EcZV.js","names":[],"sources":["../src/shared/colorMath.ts","../src/shared/ticker.ts","../src/shared/textBuffer.ts","../src/shared/viewStack.ts","../src/shared/qr.ts","../src/shared/index.ts"],"sourcesContent":["/**\r\n * Pure color→color math for gradients and animated effects. Deliberately\r\n * dependency-free: token→color stays in the theme layer, color→SGR in the\r\n * renderer — this module only mixes concrete colors in between. Invalid input\r\n * degrades to white instead of throwing; these run inside render functions.\r\n */\r\n\r\nexport function parseHex(hex: string): [number, number, number] | null {\r\n const s = hex.trim().replace(/^#/, '');\r\n if (/^[0-9a-f]{6}$/i.test(s)) {\r\n return [parseInt(s.slice(0, 2), 16), parseInt(s.slice(2, 4), 16), parseInt(s.slice(4, 6), 16)];\r\n }\r\n if (/^[0-9a-f]{3}$/i.test(s)) {\r\n return [parseInt(s[0] + s[0], 16), parseInt(s[1] + s[1], 16), parseInt(s[2] + s[2], 16)];\r\n }\r\n return null;\r\n}\r\n\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const c = (v: number) => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0');\r\n return `#${c(r)}${c(g)}${c(b)}`;\r\n}\r\n\r\n/** Per-channel linear mix of two hex colors; `t` clamped to 0..1. */\r\nexport function mixHex(a: string, b: string, t: number): string {\r\n const ca = parseHex(a) ?? [255, 255, 255];\r\n const cb = parseHex(b) ?? [255, 255, 255];\r\n const k = Math.max(0, Math.min(1, t));\r\n return rgbToHex(\r\n ca[0] + (cb[0] - ca[0]) * k,\r\n ca[1] + (cb[1] - ca[1]) * k,\r\n ca[2] + (cb[2] - ca[2]) * k,\r\n );\r\n}\r\n\r\n/** Sample `n` colors evenly across a multi-stop gradient. */\r\nexport function gradient(stops: string[], n: number): string[] {\r\n if (n <= 0) return [];\r\n if (stops.length === 0) return new Array(n).fill('#ffffff');\r\n if (stops.length === 1) return new Array(n).fill(stops[0]);\r\n const out: string[] = [];\r\n for (let i = 0; i < n; i++) {\r\n const pos = n === 1 ? 0 : i / (n - 1);\r\n const seg = pos * (stops.length - 1);\r\n const k = Math.min(Math.floor(seg), stops.length - 2);\r\n out.push(mixHex(stops[k], stops[k + 1], seg - k));\r\n }\r\n return out;\r\n}\r\n\r\nfunction rgbToHsl(r: number, g: number, b: number): [number, number, number] {\r\n r /= 255; g /= 255; b /= 255;\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n const l = (max + min) / 2;\r\n if (max === min) return [0, 0, l];\r\n const d = max - min;\r\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n let h: number;\r\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\r\n else if (max === g) h = ((b - r) / d + 2) / 6;\r\n else h = ((r - g) / d + 4) / 6;\r\n return [h, s, l];\r\n}\r\n\r\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\r\n if (s === 0) {\r\n const v = l * 255;\r\n return [v, v, v];\r\n }\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n const channel = (t: number) => {\r\n if (t < 0) t += 1;\r\n if (t > 1) t -= 1;\r\n if (t < 1 / 6) return p + (q - p) * 6 * t;\r\n if (t < 1 / 2) return q;\r\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\r\n return p;\r\n };\r\n return [channel(h + 1 / 3) * 255, channel(h) * 255, channel(h - 1 / 3) * 255];\r\n}\r\n\r\n/** Rotate a hex color's hue by `degrees` (HSL space). */\r\nexport function hueShift(hex: string, degrees: number): string {\r\n const rgb = parseHex(hex) ?? [255, 255, 255];\r\n const [h, s, l] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\r\n const shifted = (((h + degrees / 360) % 1) + 1) % 1;\r\n const [r, g, b] = hslToRgb(shifted, s, l);\r\n return rgbToHex(r, g, b);\r\n}\r\n","/**\r\n * Shared animation ticker: ONE refcounted interval drives every animated\r\n * component (spinners, gradients, shimmers), instead of a timer per instance.\r\n * Frozen at 0 when stdout is not a TTY, so piped/CI runs render frame zero\r\n * everywhere — deterministic plain output, no wasted wakeups.\r\n */\r\nimport { signal } from '@sigx/reactivity';\r\nimport { getOutputTarget } from '@sigx/runtime-terminal';\r\n\r\n/** Global animation granularity, ms. Components derive slower rates from it. */\r\nexport const TICK_MS = 80;\r\n\r\nconst tick = signal({ t: 0 });\r\nlet timer: ReturnType<typeof setInterval> | null = null;\r\nlet refs = 0;\r\n\r\n/** Reactive frame counter — read it in a render function to re-render per tick. */\r\nexport function getTick(): number {\r\n return tick.t;\r\n}\r\n\r\n/**\r\n * Refcounted subscription: the first subscriber starts the interval, the last\r\n * unsubscribe stops it. Returns an idempotent unsubscribe function.\r\n */\r\nexport function subscribeTicker(): () => void {\r\n if (!getOutputTarget().isTTY) return () => {};\r\n refs++;\r\n if (!timer) {\r\n timer = setInterval(() => { tick.t++; }, TICK_MS);\r\n }\r\n let active = true;\r\n return () => {\r\n if (!active) return;\r\n active = false;\r\n refs--;\r\n if (refs === 0 && timer) {\r\n clearInterval(timer);\r\n timer = null;\r\n }\r\n };\r\n}\r\n","/**\r\n * Headless text-buffer core for multi-line editors: soft-wrap layout and\r\n * cursor math, all pure functions. The styled editor (`TextArea` in\r\n * @sigx/terminal-ui) renders on top of this.\r\n *\r\n * Conventions: the cursor is a CODE-POINT index into the text (0..length in\r\n * code points); columns are display cells (wide glyphs count 2, via\r\n * `charWidth`). A wide glyph never straddles a wrap boundary.\r\n */\r\nimport { charWidth } from '@sigx/runtime-terminal';\r\n\r\nexport interface TextBufferState {\r\n text: string;\r\n /** Code-point index, 0..codePointLength(text). */\r\n cursor: number;\r\n}\r\n\r\nexport interface TextRow {\r\n text: string;\r\n /** Code-point offset of the row's first character in the full text. */\r\n start: number;\r\n /** Exclusive end offset; excludes the `\\n` on hard rows. */\r\n end: number;\r\n /** True when the row ends at an explicit newline (or end of text). */\r\n hard: boolean;\r\n}\r\n\r\nexport interface TextLayout {\r\n rows: TextRow[];\r\n width: number;\r\n}\r\n\r\nconst cps = (text: string): string[] => [...text];\r\n\r\n/**\r\n * Soft-wrap `text` at `width` display cells. Explicit `\\n` always breaks a\r\n * row (hard). Overlong rows break at the last space when one exists in the\r\n * row, otherwise hard-break mid-word. Empty text yields one empty row.\r\n */\r\nexport function layoutText(text: string, width: number): TextLayout {\r\n const w = Math.max(1, width);\r\n const chars = cps(text);\r\n const rows: TextRow[] = [];\r\n\r\n let rowStart = 0;\r\n let rowCells = 0;\r\n let lastSpace = -1; // code-point index of the last space in the current row\r\n\r\n const pushRow = (end: number, hard: boolean, nextStart: number) => {\r\n rows.push({ text: chars.slice(rowStart, end).join(''), start: rowStart, end, hard });\r\n rowStart = nextStart;\r\n lastSpace = -1;\r\n };\r\n\r\n let i = 0;\r\n while (i < chars.length) {\r\n const ch = chars[i];\r\n if (ch === '\\n') {\r\n pushRow(i, true, i + 1);\r\n rowCells = 0;\r\n i++;\r\n continue;\r\n }\r\n const cw = charWidth(ch.codePointAt(0) ?? 0);\r\n if (rowCells + cw > w && i > rowStart) {\r\n // The overflowing character IS a space: break right here and\r\n // swallow it — the row before it fit exactly.\r\n if (ch === ' ') {\r\n pushRow(i, false, i + 1);\r\n rowCells = 0;\r\n i++;\r\n continue;\r\n }\r\n // Overflow: wrap at the last space if the row has one, else here.\r\n if (lastSpace > rowStart) {\r\n pushRow(lastSpace, false, lastSpace + 1); // the space is swallowed by the wrap\r\n } else {\r\n pushRow(i, false, i);\r\n }\r\n // Recompute cells for the (possibly re-started) row up to i.\r\n rowCells = 0;\r\n for (let j = rowStart; j < i; j++) {\r\n rowCells += charWidth(chars[j].codePointAt(0) ?? 0);\r\n }\r\n continue; // re-process chars[i] against the new row\r\n }\r\n if (ch === ' ') lastSpace = i;\r\n rowCells += cw;\r\n i++;\r\n }\r\n rows.push({ text: chars.slice(rowStart).join(''), start: rowStart, end: chars.length, hard: true });\r\n return { rows, width: w };\r\n}\r\n\r\n/**\r\n * Map a cursor (code-point index) to its visual row and column (cells).\r\n * A cursor sitting exactly on a soft-wrap boundary maps to the start of the\r\n * NEXT row — except at the very end of the text, where it stays on the last.\r\n */\r\nexport function cursorToRowCol(layout: TextLayout, cursor: number): { row: number; col: number } {\r\n const rows = layout.rows;\r\n for (let r = 0; r < rows.length; r++) {\r\n const row = rows[r];\r\n const isLast = r === rows.length - 1;\r\n const next = rows[r + 1];\r\n // cursor === row.end belongs to THIS row unless the next row starts\r\n // exactly there (a pure soft wrap, where the boundary cursor renders\r\n // at the start of the next row). A wrap that swallowed a space leaves\r\n // next.start === row.end + 1, so the on-the-space cursor stays here.\r\n const within = cursor >= row.start && (\r\n cursor < row.end ||\r\n (cursor === row.end && (isLast || next.start !== row.end)) ||\r\n (isLast && cursor >= row.end)\r\n );\r\n if (!within) continue;\r\n let col = 0;\r\n const chars = cps(row.text);\r\n const upto = Math.min(cursor - row.start, chars.length);\r\n for (let j = 0; j < upto; j++) {\r\n col += charWidth(chars[j].codePointAt(0) ?? 0);\r\n }\r\n return { row: r, col };\r\n }\r\n const last = rows.length - 1;\r\n return { row: last, col: cps(rows[last].text).reduce((c, ch) => c + charWidth(ch.codePointAt(0) ?? 0), 0) };\r\n}\r\n\r\n/**\r\n * Map a visual (row, goalCol) back to a cursor index. A goal column landing\r\n * inside a wide glyph snaps to the glyph start; beyond the row end clamps to\r\n * the row end.\r\n */\r\nexport function rowColToCursor(layout: TextLayout, row: number, goalCol: number): number {\r\n const r = layout.rows[Math.max(0, Math.min(row, layout.rows.length - 1))];\r\n const chars = cps(r.text);\r\n let col = 0;\r\n for (let j = 0; j < chars.length; j++) {\r\n const cw = charWidth(chars[j].codePointAt(0) ?? 0);\r\n if (col + cw > goalCol) return r.start + j;\r\n col += cw;\r\n }\r\n return r.end;\r\n}\r\n\r\nexport function insertAt(state: TextBufferState, chunk: string): TextBufferState {\r\n const chars = cps(state.text);\r\n const at = Math.max(0, Math.min(state.cursor, chars.length));\r\n const text = chars.slice(0, at).join('') + chunk + chars.slice(at).join('');\r\n return { text, cursor: at + cps(chunk).length };\r\n}\r\n\r\n/** Backspace: delete the code point before the cursor. */\r\nexport function deleteBefore(state: TextBufferState): TextBufferState {\r\n const chars = cps(state.text);\r\n const at = Math.max(0, Math.min(state.cursor, chars.length));\r\n if (at === 0) return state;\r\n return { text: chars.slice(0, at - 1).join('') + chars.slice(at).join(''), cursor: at - 1 };\r\n}\r\n\r\n/** Forward delete: delete the code point under the cursor. */\r\nexport function deleteAt(state: TextBufferState): TextBufferState {\r\n const chars = cps(state.text);\r\n const at = Math.max(0, Math.min(state.cursor, chars.length));\r\n if (at >= chars.length) return state;\r\n return { text: chars.slice(0, at).join('') + chars.slice(at + 1).join(''), cursor: at };\r\n}\r\n\r\nexport function moveLeft(state: TextBufferState): TextBufferState {\r\n return { ...state, cursor: Math.max(0, state.cursor - 1) };\r\n}\r\n\r\nexport function moveRight(state: TextBufferState): TextBufferState {\r\n return { ...state, cursor: Math.min(cps(state.text).length, state.cursor + 1) };\r\n}\r\n\r\n/**\r\n * Move the cursor a visual row up (-1) or down (+1), keeping a sticky goal\r\n * column: pass the previous call's `goalCol` back in while the user keeps\r\n * moving vertically (any horizontal move/edit resets it — caller's job).\r\n */\r\nexport function moveVertical(\r\n state: TextBufferState,\r\n width: number,\r\n dir: -1 | 1,\r\n goalCol?: number,\r\n): { state: TextBufferState; goalCol: number } {\r\n const layout = layoutText(state.text, width);\r\n const { row, col } = cursorToRowCol(layout, state.cursor);\r\n const goal = goalCol !== undefined && goalCol >= 0 ? goalCol : col;\r\n const targetRow = row + dir;\r\n if (targetRow < 0 || targetRow >= layout.rows.length) {\r\n return { state, goalCol: goal };\r\n }\r\n return { state: { ...state, cursor: rowColToCursor(layout, targetRow, goal) }, goalCol: goal };\r\n}\r\n\r\n/** Jump to the start of the cursor's visual row. */\r\nexport function moveLineStart(state: TextBufferState, width: number): TextBufferState {\r\n const layout = layoutText(state.text, width);\r\n const { row } = cursorToRowCol(layout, state.cursor);\r\n return { ...state, cursor: layout.rows[row].start };\r\n}\r\n\r\n/** Jump to the end of the cursor's visual row. */\r\nexport function moveLineEnd(state: TextBufferState, width: number): TextBufferState {\r\n const layout = layoutText(state.text, width);\r\n const { row } = cursorToRowCol(layout, state.cursor);\r\n return { ...state, cursor: layout.rows[row].end };\r\n}\r\n","/**\r\n * Reactive view/navigation stack — the headless half of screen navigation.\r\n * Push a view (a settings page, a model picker), pop back with Esc:\r\n *\r\n * const views = createViewStack<'shell' | 'model'>('shell');\r\n * onKey((key) => {\r\n * if (isEsc(key) && views.depth() > 1) {\r\n * views.pop();\r\n * return true; // consume — nothing below sees Esc\r\n * }\r\n * }, { layer: 'view' });\r\n * // render: views.current() === 'model' ? <ModelPicker/> : <Shell/>\r\n */\r\nimport { signal } from '@sigx/reactivity';\r\n\r\nexport interface ViewStack<T> {\r\n push(view: T): void;\r\n /** Pop the current view. Returns false (and stays) at the root. */\r\n pop(): boolean;\r\n /** Swap the current view without growing the stack. */\r\n replace(view: T): void;\r\n /** The top of the stack. Reactive. */\r\n current(): T;\r\n /** Stack size (root = 1). Reactive. */\r\n depth(): number;\r\n}\r\n\r\nexport function createViewStack<T>(root: T): ViewStack<T> {\r\n // The array is replaced wholesale on every mutation so signal subscribers\r\n // re-run reliably.\r\n const state = signal({ stack: [root] as T[] });\r\n\r\n return {\r\n push(view: T) {\r\n state.stack = [...state.stack, view];\r\n },\r\n pop(): boolean {\r\n if (state.stack.length <= 1) return false;\r\n state.stack = state.stack.slice(0, -1);\r\n return true;\r\n },\r\n replace(view: T) {\r\n state.stack = [...state.stack.slice(0, -1), view];\r\n },\r\n current(): T {\r\n return state.stack[state.stack.length - 1];\r\n },\r\n depth(): number {\r\n return state.stack.length;\r\n },\r\n };\r\n}\r\n","/**\r\n * Terminal QR code generator.\r\n *\r\n * Generates a QR code using Unicode block characters for display\r\n * in the terminal. Zero dependencies — implements QR encoding inline\r\n * (byte mode, versions 1–20, error-correction level L, half-block\r\n * rendering: two QR rows per terminal row).\r\n *\r\n * Extracted from @sigx/lynx-cli (packages/lynx-cli/src/qr.ts) — keep the two\r\n * in sync until lynx-cli imports `generateQR` from @sigx/terminal-zero.\r\n */\r\nimport { Buffer } from 'node:buffer';\r\n\r\n// QR code encoding constants\r\nconst MODE_BYTE = 0b0100;\r\nconst EC_LEVEL_L = 0; // ~7% error correction (sufficient for URLs on clean channel)\r\n\r\n// Version capacities for byte mode, EC level L\r\nconst VERSION_CAPACITIES: number[] = [\r\n 0, 17, 32, 53, 78, 106, 134, 154, 192, 230, 271,\r\n 321, 367, 425, 458, 520, 586, 644, 718, 792, 858,\r\n];\r\n\r\n// Error correction codewords per block for each version (EC level L)\r\nconst EC_CODEWORDS_PER_BLOCK: number[] = [\r\n 0, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18,\r\n 20, 24, 26, 30, 22, 24, 28, 30, 28, 28,\r\n];\r\n\r\n// Number of EC blocks for each version (EC level L). Source: ISO/IEC 18004\r\n// Table 9. Previously the V10–V20 counts were truncated to 4, which produced\r\n// codes that visually parsed but didn't decode in commercial scanners.\r\nconst NUM_EC_BLOCKS: number[] = [\r\n 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4,\r\n 4, 4, 4, 4, 6, 6, 6, 6, 7, 8,\r\n];\r\n\r\n// Total codewords per version (data + EC). Fixed by the QR spec — the\r\n// previous \"size² minus function modules / 8\" formula was off by a few\r\n// codewords per version, which threw off data placement so ML Kit /\r\n// commercial scanners couldn't decode the result. Source: ISO/IEC 18004\r\n// Table 1. Length must match VERSION_CAPACITIES.length (21).\r\nconst TOTAL_CODEWORDS: number[] = [\r\n 0, 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\r\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\r\n];\r\n\r\n// Alignment pattern positions for each version\r\nconst ALIGNMENT_PATTERNS: number[][] = [\r\n [], [], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34],\r\n [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50],\r\n [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66],\r\n [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78],\r\n [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90],\r\n];\r\n\r\n// Format info bits for EC level L, masks 0-7\r\nconst FORMAT_INFO: number[] = [\r\n 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,\r\n];\r\n\r\n// Version info bits for versions 7+\r\nconst VERSION_INFO: number[] = [\r\n 0, 0, 0, 0, 0, 0, 0,\r\n 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847,\r\n 0x0e60d, 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6,\r\n];\r\n\r\nclass BitBuffer {\r\n private buffer: number[] = [];\r\n private length = 0;\r\n\r\n put(num: number, bitLength: number) {\r\n for (let i = bitLength - 1; i >= 0; i--) {\r\n this.buffer.push((num >> i) & 1);\r\n this.length++;\r\n }\r\n }\r\n\r\n getBit(index: number): number {\r\n return this.buffer[index];\r\n }\r\n\r\n getLength(): number {\r\n return this.length;\r\n }\r\n\r\n getBuffer(): number[] {\r\n return this.buffer;\r\n }\r\n}\r\n\r\n// GF(256) arithmetic for Reed-Solomon\r\nconst GF_EXP = new Uint8Array(512);\r\nconst GF_LOG = new Uint8Array(256);\r\n\r\n(function initGaloisField() {\r\n let x = 1;\r\n for (let i = 0; i < 255; i++) {\r\n GF_EXP[i] = x;\r\n GF_LOG[x] = i;\r\n x = x << 1;\r\n if (x >= 256) x ^= 0x11d;\r\n }\r\n for (let i = 255; i < 512; i++) {\r\n GF_EXP[i] = GF_EXP[i - 255];\r\n }\r\n})();\r\n\r\nfunction gfMultiply(a: number, b: number): number {\r\n if (a === 0 || b === 0) return 0;\r\n return GF_EXP[GF_LOG[a] + GF_LOG[b]];\r\n}\r\n\r\nfunction rsEncode(data: number[], ecCount: number): number[] {\r\n // Build generator polynomial\r\n const gen = new Uint8Array(ecCount + 1);\r\n gen[0] = 1;\r\n for (let i = 0; i < ecCount; i++) {\r\n for (let j = ecCount; j >= 1; j--) {\r\n gen[j] = gen[j] ^ gfMultiply(gen[j - 1], GF_EXP[i]);\r\n }\r\n }\r\n\r\n const msg = new Uint8Array(data.length + ecCount);\r\n for (let i = 0; i < data.length; i++) msg[i] = data[i];\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const coef = msg[i];\r\n if (coef !== 0) {\r\n for (let j = 1; j <= ecCount; j++) {\r\n msg[i + j] ^= gfMultiply(gen[j], coef);\r\n }\r\n }\r\n }\r\n\r\n return Array.from(msg.slice(data.length));\r\n}\r\n\r\nfunction getVersion(dataLength: number): number {\r\n for (let v = 1; v <= 20; v++) {\r\n if (VERSION_CAPACITIES[v] >= dataLength) return v;\r\n }\r\n throw new Error('Data too long for QR code (max ~850 bytes)');\r\n}\r\n\r\nfunction getSize(version: number): number {\r\n return 17 + version * 4;\r\n}\r\n\r\nfunction createMatrix(size: number): (boolean | null)[][] {\r\n return Array.from({ length: size }, () => Array(size).fill(null));\r\n}\r\n\r\nfunction setModule(matrix: (boolean | null)[][], row: number, col: number, value: boolean) {\r\n if (row >= 0 && row < matrix.length && col >= 0 && col < matrix.length) {\r\n matrix[row][col] = value;\r\n }\r\n}\r\n\r\nfunction addFinderPattern(matrix: (boolean | null)[][], row: number, col: number) {\r\n for (let r = -1; r <= 7; r++) {\r\n for (let c = -1; c <= 7; c++) {\r\n const inOuter = r >= 0 && r <= 6 && c >= 0 && c <= 6;\r\n const inInner = r >= 2 && r <= 4 && c >= 2 && c <= 4;\r\n const onBorder = r === 0 || r === 6 || c === 0 || c === 6;\r\n const val = inOuter && (onBorder || inInner);\r\n setModule(matrix, row + r, col + c, val);\r\n }\r\n }\r\n}\r\n\r\nfunction addAlignmentPattern(matrix: (boolean | null)[][], row: number, col: number) {\r\n for (let r = -2; r <= 2; r++) {\r\n for (let c = -2; c <= 2; c++) {\r\n const val = Math.abs(r) === 2 || Math.abs(c) === 2 || (r === 0 && c === 0);\r\n if (matrix[row + r][col + c] === null) {\r\n matrix[row + r][col + c] = val;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction addTimingPatterns(matrix: (boolean | null)[][]) {\r\n const size = matrix.length;\r\n for (let i = 8; i < size - 8; i++) {\r\n const val = i % 2 === 0;\r\n if (matrix[6][i] === null) matrix[6][i] = val;\r\n if (matrix[i][6] === null) matrix[i][6] = val;\r\n }\r\n}\r\n\r\nfunction reserveFormatArea(matrix: (boolean | null)[][]) {\r\n const size = matrix.length;\r\n // Around top-left finder\r\n for (let i = 0; i <= 8; i++) {\r\n if (matrix[8][i] === null) matrix[8][i] = false;\r\n if (matrix[i][8] === null) matrix[i][8] = false;\r\n }\r\n // Around top-right finder\r\n for (let i = 0; i <= 7; i++) {\r\n if (matrix[8][size - 1 - i] === null) matrix[8][size - 1 - i] = false;\r\n }\r\n // Around bottom-left finder\r\n for (let i = 0; i <= 7; i++) {\r\n if (matrix[size - 1 - i][8] === null) matrix[size - 1 - i][8] = false;\r\n }\r\n // Dark module\r\n matrix[size - 8][8] = true;\r\n}\r\n\r\nfunction addFormatInfo(matrix: (boolean | null)[][], maskPattern: number) {\r\n const size = matrix.length;\r\n const bits = FORMAT_INFO[maskPattern];\r\n\r\n for (let i = 0; i <= 5; i++) {\r\n matrix[8][i] = !!((bits >> (14 - i)) & 1);\r\n }\r\n matrix[8][7] = !!((bits >> 8) & 1);\r\n matrix[8][8] = !!((bits >> 7) & 1);\r\n matrix[7][8] = !!((bits >> 6) & 1);\r\n\r\n for (let i = 0; i <= 5; i++) {\r\n matrix[5 - i][8] = !!((bits >> (i)) & 1);\r\n }\r\n\r\n for (let i = 0; i <= 7; i++) {\r\n matrix[8][size - 1 - i] = !!((bits >> i) & 1);\r\n }\r\n for (let i = 0; i <= 6; i++) {\r\n matrix[size - 1 - i][8] = !!((bits >> (14 - i)) & 1);\r\n }\r\n}\r\n\r\nfunction addVersionInfo(matrix: (boolean | null)[][], version: number) {\r\n if (version < 7) return;\r\n const size = matrix.length;\r\n const bits = VERSION_INFO[version];\r\n\r\n for (let i = 0; i < 18; i++) {\r\n const bit = !!((bits >> i) & 1);\r\n const row = Math.floor(i / 3);\r\n const col = i % 3;\r\n matrix[5 - row][size - 9 - col] = bit;\r\n matrix[size - 9 - col][5 - row] = bit;\r\n }\r\n}\r\n\r\nconst MASK_FUNCTIONS: ((row: number, col: number) => boolean)[] = [\r\n (r, c) => (r + c) % 2 === 0,\r\n (r, _) => r % 2 === 0,\r\n (_, c) => c % 3 === 0,\r\n (r, c) => (r + c) % 3 === 0,\r\n (r, c) => (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0,\r\n (r, c) => ((r * c) % 2 + (r * c) % 3) === 0,\r\n (r, c) => ((r * c) % 2 + (r * c) % 3) % 2 === 0,\r\n (r, c) => ((r + c) % 2 + (r * c) % 3) % 2 === 0,\r\n];\r\n\r\nfunction placeData(matrix: (boolean | null)[][], bits: number[]) {\r\n const size = matrix.length;\r\n let bitIndex = 0;\r\n let upward = true;\r\n\r\n for (let right = size - 1; right >= 1; right -= 2) {\r\n if (right === 6) right = 5; // Skip timing column\r\n\r\n const rows = upward\r\n ? Array.from({ length: size }, (_, i) => size - 1 - i)\r\n : Array.from({ length: size }, (_, i) => i);\r\n\r\n for (const row of rows) {\r\n for (const col of [right, right - 1]) {\r\n if (matrix[row][col] === null) {\r\n matrix[row][col] = bitIndex < bits.length ? !!bits[bitIndex] : false;\r\n bitIndex++;\r\n }\r\n }\r\n }\r\n upward = !upward;\r\n }\r\n}\r\n\r\nfunction applyMask(matrix: (boolean | null)[][], reserved: (boolean | null)[][], mask: number): boolean[][] {\r\n const size = matrix.length;\r\n const result: boolean[][] = Array.from({ length: size }, (_, r) =>\r\n Array.from({ length: size }, (_, c) => !!matrix[r][c])\r\n );\r\n\r\n const fn = MASK_FUNCTIONS[mask];\r\n for (let r = 0; r < size; r++) {\r\n for (let c = 0; c < size; c++) {\r\n if (reserved[r][c] !== null) continue; // Don't mask reserved areas\r\n if (fn(r, c)) result[r][c] = !result[r][c];\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction penaltyScore(matrix: boolean[][]): number {\r\n const size = matrix.length;\r\n let penalty = 0;\r\n\r\n // Rule 1: Runs of same color\r\n for (let r = 0; r < size; r++) {\r\n let count = 1;\r\n for (let c = 1; c < size; c++) {\r\n if (matrix[r][c] === matrix[r][c - 1]) {\r\n count++;\r\n if (count === 5) penalty += 3;\r\n else if (count > 5) penalty++;\r\n } else {\r\n count = 1;\r\n }\r\n }\r\n }\r\n for (let c = 0; c < size; c++) {\r\n let count = 1;\r\n for (let r = 1; r < size; r++) {\r\n if (matrix[r][c] === matrix[r - 1][c]) {\r\n count++;\r\n if (count === 5) penalty += 3;\r\n else if (count > 5) penalty++;\r\n } else {\r\n count = 1;\r\n }\r\n }\r\n }\r\n\r\n // Rule 2: 2x2 blocks\r\n for (let r = 0; r < size - 1; r++) {\r\n for (let c = 0; c < size - 1; c++) {\r\n const v = matrix[r][c];\r\n if (v === matrix[r][c + 1] && v === matrix[r + 1][c] && v === matrix[r + 1][c + 1]) {\r\n penalty += 3;\r\n }\r\n }\r\n }\r\n\r\n return penalty;\r\n}\r\n\r\nfunction encodeQR(data: string): boolean[][] {\r\n const bytes = Buffer.from(data, 'utf-8');\r\n const version = getVersion(bytes.length);\r\n const size = getSize(version);\r\n const ecPerBlock = EC_CODEWORDS_PER_BLOCK[version];\r\n const numBlocks = NUM_EC_BLOCKS[version];\r\n const totalCodewords = TOTAL_CODEWORDS[version];\r\n\r\n // Build data bits\r\n const bitBuf = new BitBuffer();\r\n bitBuf.put(MODE_BYTE, 4);\r\n bitBuf.put(bytes.length, version <= 9 ? 8 : 16);\r\n for (let i = 0; i < bytes.length; i++) {\r\n bitBuf.put(bytes[i], 8);\r\n }\r\n\r\n // Total data codewords\r\n const dataCodewords = totalCodewords - ecPerBlock * numBlocks;\r\n\r\n // Pad to fill data capacity\r\n const targetBits = dataCodewords * 8;\r\n if (bitBuf.getLength() < targetBits) {\r\n bitBuf.put(0, Math.min(4, targetBits - bitBuf.getLength()));\r\n }\r\n while (bitBuf.getLength() % 8 !== 0) {\r\n bitBuf.put(0, 1);\r\n }\r\n const padBytes = [0xEC, 0x11];\r\n let padIdx = 0;\r\n while (bitBuf.getLength() < targetBits) {\r\n bitBuf.put(padBytes[padIdx % 2], 8);\r\n padIdx++;\r\n }\r\n\r\n // Convert to codewords\r\n const dataWords: number[] = [];\r\n const buf = bitBuf.getBuffer();\r\n for (let i = 0; i < dataCodewords; i++) {\r\n let byte = 0;\r\n for (let j = 0; j < 8; j++) {\r\n byte = (byte << 1) | (buf[i * 8 + j] || 0);\r\n }\r\n dataWords.push(byte);\r\n }\r\n\r\n // Split into blocks and compute EC\r\n const blockSize = Math.floor(dataCodewords / numBlocks);\r\n const longBlocks = dataCodewords % numBlocks;\r\n const dataBlocks: number[][] = [];\r\n const ecBlocks: number[][] = [];\r\n\r\n let offset = 0;\r\n for (let i = 0; i < numBlocks; i++) {\r\n const bSize = blockSize + (i >= numBlocks - longBlocks ? 1 : 0);\r\n const block = dataWords.slice(offset, offset + bSize);\r\n dataBlocks.push(block);\r\n ecBlocks.push(rsEncode(block, ecPerBlock));\r\n offset += bSize;\r\n }\r\n\r\n // Interleave\r\n const allBits: number[] = [];\r\n const maxDataLen = Math.max(...dataBlocks.map(b => b.length));\r\n for (let i = 0; i < maxDataLen; i++) {\r\n for (const block of dataBlocks) {\r\n if (i < block.length) {\r\n for (let j = 7; j >= 0; j--) {\r\n allBits.push((block[i] >> j) & 1);\r\n }\r\n }\r\n }\r\n }\r\n for (let i = 0; i < ecPerBlock; i++) {\r\n for (const block of ecBlocks) {\r\n if (i < block.length) {\r\n for (let j = 7; j >= 0; j--) {\r\n allBits.push((block[i] >> j) & 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Build matrix with reserved areas\r\n const reserved = createMatrix(size);\r\n addFinderPattern(reserved, 0, 0);\r\n addFinderPattern(reserved, 0, size - 7);\r\n addFinderPattern(reserved, size - 7, 0);\r\n addTimingPatterns(reserved);\r\n reserveFormatArea(reserved);\r\n\r\n const positions = ALIGNMENT_PATTERNS[version] || [];\r\n for (let i = 0; i < positions.length; i++) {\r\n for (let j = 0; j < positions.length; j++) {\r\n const r = positions[i], c = positions[j];\r\n if (reserved[r]?.[c] !== null) continue;\r\n addAlignmentPattern(reserved, r, c);\r\n }\r\n }\r\n\r\n // Place data on a copy\r\n const matrix = reserved.map(row => [...row]);\r\n placeData(matrix, allBits);\r\n\r\n // Try all masks, pick best\r\n let bestMask = 0;\r\n let bestPenalty = Infinity;\r\n for (let m = 0; m < 8; m++) {\r\n const masked = applyMask(matrix, reserved, m);\r\n const p = penaltyScore(masked);\r\n if (p < bestPenalty) {\r\n bestPenalty = p;\r\n bestMask = m;\r\n }\r\n }\r\n\r\n const result = applyMask(matrix, reserved, bestMask);\r\n\r\n // Write format & version info\r\n const fmtMatrix = createMatrix(size);\r\n addFinderPattern(fmtMatrix, 0, 0);\r\n addFinderPattern(fmtMatrix, 0, size - 7);\r\n addFinderPattern(fmtMatrix, size - 7, 0);\r\n addTimingPatterns(fmtMatrix);\r\n addFormatInfo(fmtMatrix, bestMask);\r\n addVersionInfo(fmtMatrix, version);\r\n\r\n // Overlay format/version info onto result\r\n for (let r = 0; r < size; r++) {\r\n for (let c = 0; c < size; c++) {\r\n if (reserved[r][c] !== null) {\r\n result[r][c] = !!fmtMatrix[r][c];\r\n }\r\n }\r\n }\r\n\r\n addFormatInfo(result as any, bestMask);\r\n if (version >= 7) addVersionInfo(result as any, version);\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Generate a QR code string for terminal display.\r\n * Uses Unicode half-block characters (▀▄█ ) to render 2 rows per line.\r\n *\r\n * @param text - The text/URL to encode\r\n * @param opts - Options: quiet zone width, colors\r\n * @returns Multi-line string ready for console.log()\r\n */\r\nexport function generateQR(text: string, opts?: { quiet?: number; invert?: boolean }): string {\r\n // Quiet zone: ISO/IEC 18004 requires at least 4 modules of white border\r\n // around the matrix. The previous default of 2 made finder-pattern\r\n // detection slow — scanners would burn many frames before lock-on.\r\n const quiet = opts?.quiet ?? 4;\r\n const invert = opts?.invert ?? false;\r\n\r\n let matrix: boolean[][];\r\n try {\r\n matrix = encodeQR(text);\r\n } catch {\r\n // Fallback: return a simple text representation\r\n return ` [QR: ${text}]`;\r\n }\r\n\r\n const size = matrix.length;\r\n const totalSize = size + quiet * 2;\r\n\r\n // Pad with quiet zone\r\n const getModule = (r: number, c: number): boolean => {\r\n const mr = r - quiet;\r\n const mc = c - quiet;\r\n if (mr < 0 || mr >= size || mc < 0 || mc >= size) return false;\r\n return matrix[mr][mc];\r\n };\r\n\r\n const lines: string[] = [];\r\n\r\n // Use half-block characters: each character represents 2 vertical pixels\r\n // ▀ = top half, ▄ = bottom half, █ = full, ' ' = empty\r\n const BLACK = invert ? false : true;\r\n\r\n for (let r = 0; r < totalSize; r += 2) {\r\n let line = '';\r\n for (let c = 0; c < totalSize; c++) {\r\n const top = getModule(r, c);\r\n const bottom = r + 1 < totalSize ? getModule(r + 1, c) : false;\r\n\r\n if (top === BLACK && bottom === BLACK) {\r\n line += '█';\r\n } else if (top === BLACK && bottom !== BLACK) {\r\n line += '▀';\r\n } else if (top !== BLACK && bottom === BLACK) {\r\n line += '▄';\r\n } else {\r\n line += ' ';\r\n }\r\n }\r\n lines.push(line);\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n","/**\r\n * Shared, design-system-neutral utilities for terminal components: the glyph\r\n * set the SigX-tui spec standardizes on, interaction timings, and re-exports of\r\n * the renderer's focus + key APIs so skins depend only on `@sigx/terminal-zero`.\r\n */\r\n\r\n// Focus registry + keyboard input (re-exported from the renderer so skin\r\n// components have a single foundation import).\r\nexport {\r\n focusState,\r\n registerFocusable,\r\n unregisterFocusable,\r\n focus,\r\n focusNext,\r\n focusPrev,\r\n onKey,\r\n setScreenBackground,\r\n setScreenForeground,\r\n} from '@sigx/runtime-terminal';\r\n\r\n// Renderer device APIs the FX / log components build on: depth-aware SGR for\r\n// embedded gradient escapes, static output, and escape-safe measurement.\r\nexport {\r\n hexToSGR,\r\n resolveFg,\r\n getColorDepth,\r\n getOutputTarget,\r\n writeStatic,\r\n printStatic,\r\n displayWidth,\r\n truncateToWidth,\r\n} from '@sigx/runtime-terminal';\r\n\r\n// One-shot mount + key injection — what the imperative prompts layer builds\r\n// on. Re-exported here so skins keep their single foundation import.\r\nexport {\r\n renderTerminal,\r\n dispatchKey,\r\n type RenderTerminalOptions,\r\n type KeyLayer,\r\n type KeyHandler,\r\n} from '@sigx/runtime-terminal';\r\n\r\n// Cell measurement + background SGR for components that build their own\r\n// escape strings (text buffers, pixel art).\r\nexport {\r\n charWidth,\r\n resolveBg,\r\n} from '@sigx/runtime-terminal';\r\n\r\n// Reactive terminal size — read it in a render function to re-render on\r\n// resize (getOutputTarget().columns/rows are live but not reactive).\r\nexport {\r\n getTerminalSize,\r\n syncTerminalSize,\r\n} from '@sigx/runtime-terminal';\r\n\r\nexport * from './colorMath';\r\nexport * from './ticker';\r\nexport * from './textBuffer';\r\nexport * from './viewStack';\r\nexport { generateQR } from './qr';\r\n\r\n/**\r\n * Standard glyphs. All are width-1 in monospace fonts (Braille, geometric,\r\n * box-drawing) — except the status icons, which some terminals render as 2\r\n * cells; prefer them only where a trailing column is acceptable.\r\n */\r\nexport const GLYPHS = {\r\n checkboxOn: '◉',\r\n checkboxOff: '◯',\r\n radioOn: '●',\r\n radioOff: '○',\r\n cursor: '❯', // Select / menu pointer\r\n focusBar: '▌', // focused-control accent bar\r\n shadowCell: '▒', // drop shadow\r\n barFull: '█', // progress filled\r\n barEmpty: '░', // progress track\r\n // sub-cell progress edge, thinnest → widest (smooth bar leading edge)\r\n barEighths: ['▏', '▎', '▍', '▌', '▋', '▊', '▉'] as readonly string[],\r\n // status icons (may be 2 cells in some terminals)\r\n check: '✔',\r\n cross: '✖',\r\n warn: '⚠',\r\n info: 'ℹ',\r\n // spinner animation frames (Braille — always width 1)\r\n spinner: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as readonly string[],\r\n} as const;\r\n\r\n/**\r\n * Spinner frame sets, selectable via the Spinner `variant` prop. All width-1\r\n * except `moon` (emoji — 2 cells; use where a wider glyph column is fine).\r\n */\r\nexport const SPINNERS = {\r\n dots: GLYPHS.spinner,\r\n line: ['—', '\\\\', '|', '/'],\r\n arc: ['◜', '◠', '◝', '◞', '◡', '◟'],\r\n circle: ['◐', '◓', '◑', '◒'],\r\n bounce: ['▁', '▃', '▄', '▅', '▆', '▇', '▆', '▅', '▄', '▃'],\r\n moon: ['🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘'],\r\n} as const satisfies Record<string, readonly string[]>;\r\n\r\nexport type SpinnerVariant = keyof typeof SPINNERS;\r\n\r\n/** Milliseconds a button stays in its visual \"pressed\" state after activation. */\r\nexport const PRESS_MS = 120;\r\n\r\n/** Milliseconds to ignore input after mount (debounces the activating Enter). */\r\nexport const READY_DELAY_MS = 50;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-h5p-EcZV.js","names":[],"sources":["../src/shared/colorMath.ts","../src/shared/ticker.ts","../src/shared/textBuffer.ts","../src/shared/viewStack.ts","../src/shared/qr.ts","../src/shared/index.ts"],"sourcesContent":["/**\n * Pure color→color math for gradients and animated effects. Deliberately\n * dependency-free: token→color stays in the theme layer, color→SGR in the\n * renderer — this module only mixes concrete colors in between. Invalid input\n * degrades to white instead of throwing; these run inside render functions.\n */\n\nexport function parseHex(hex: string): [number, number, number] | null {\n const s = hex.trim().replace(/^#/, '');\n if (/^[0-9a-f]{6}$/i.test(s)) {\n return [parseInt(s.slice(0, 2), 16), parseInt(s.slice(2, 4), 16), parseInt(s.slice(4, 6), 16)];\n }\n if (/^[0-9a-f]{3}$/i.test(s)) {\n return [parseInt(s[0] + s[0], 16), parseInt(s[1] + s[1], 16), parseInt(s[2] + s[2], 16)];\n }\n return null;\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n const c = (v: number) => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0');\n return `#${c(r)}${c(g)}${c(b)}`;\n}\n\n/** Per-channel linear mix of two hex colors; `t` clamped to 0..1. */\nexport function mixHex(a: string, b: string, t: number): string {\n const ca = parseHex(a) ?? [255, 255, 255];\n const cb = parseHex(b) ?? [255, 255, 255];\n const k = Math.max(0, Math.min(1, t));\n return rgbToHex(\n ca[0] + (cb[0] - ca[0]) * k,\n ca[1] + (cb[1] - ca[1]) * k,\n ca[2] + (cb[2] - ca[2]) * k,\n );\n}\n\n/** Sample `n` colors evenly across a multi-stop gradient. */\nexport function gradient(stops: string[], n: number): string[] {\n if (n <= 0) return [];\n if (stops.length === 0) return new Array(n).fill('#ffffff');\n if (stops.length === 1) return new Array(n).fill(stops[0]);\n const out: string[] = [];\n for (let i = 0; i < n; i++) {\n const pos = n === 1 ? 0 : i / (n - 1);\n const seg = pos * (stops.length - 1);\n const k = Math.min(Math.floor(seg), stops.length - 2);\n out.push(mixHex(stops[k], stops[k + 1], seg - k));\n }\n return out;\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n r /= 255; g /= 255; b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h: number;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return [h, s, l];\n}\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n if (s === 0) {\n const v = l * 255;\n return [v, v, v];\n }\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const channel = (t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n return [channel(h + 1 / 3) * 255, channel(h) * 255, channel(h - 1 / 3) * 255];\n}\n\n/** Rotate a hex color's hue by `degrees` (HSL space). */\nexport function hueShift(hex: string, degrees: number): string {\n const rgb = parseHex(hex) ?? [255, 255, 255];\n const [h, s, l] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const shifted = (((h + degrees / 360) % 1) + 1) % 1;\n const [r, g, b] = hslToRgb(shifted, s, l);\n return rgbToHex(r, g, b);\n}\n","/**\n * Shared animation ticker: ONE refcounted interval drives every animated\n * component (spinners, gradients, shimmers), instead of a timer per instance.\n * Frozen at 0 when stdout is not a TTY, so piped/CI runs render frame zero\n * everywhere — deterministic plain output, no wasted wakeups.\n */\nimport { signal } from '@sigx/reactivity';\nimport { getOutputTarget } from '@sigx/runtime-terminal';\n\n/** Global animation granularity, ms. Components derive slower rates from it. */\nexport const TICK_MS = 80;\n\nconst tick = signal({ t: 0 });\nlet timer: ReturnType<typeof setInterval> | null = null;\nlet refs = 0;\n\n/** Reactive frame counter — read it in a render function to re-render per tick. */\nexport function getTick(): number {\n return tick.t;\n}\n\n/**\n * Refcounted subscription: the first subscriber starts the interval, the last\n * unsubscribe stops it. Returns an idempotent unsubscribe function.\n */\nexport function subscribeTicker(): () => void {\n if (!getOutputTarget().isTTY) return () => {};\n refs++;\n if (!timer) {\n timer = setInterval(() => { tick.t++; }, TICK_MS);\n }\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n refs--;\n if (refs === 0 && timer) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n","/**\n * Headless text-buffer core for multi-line editors: soft-wrap layout and\n * cursor math, all pure functions. The styled editor (`TextArea` in\n * @sigx/terminal-ui) renders on top of this.\n *\n * Conventions: the cursor is a CODE-POINT index into the text (0..length in\n * code points); columns are display cells (wide glyphs count 2, via\n * `charWidth`). A wide glyph never straddles a wrap boundary.\n */\nimport { charWidth } from '@sigx/runtime-terminal';\n\nexport interface TextBufferState {\n text: string;\n /** Code-point index, 0..codePointLength(text). */\n cursor: number;\n}\n\nexport interface TextRow {\n text: string;\n /** Code-point offset of the row's first character in the full text. */\n start: number;\n /** Exclusive end offset; excludes the `\\n` on hard rows. */\n end: number;\n /** True when the row ends at an explicit newline (or end of text). */\n hard: boolean;\n}\n\nexport interface TextLayout {\n rows: TextRow[];\n width: number;\n}\n\nconst cps = (text: string): string[] => [...text];\n\n/**\n * Soft-wrap `text` at `width` display cells. Explicit `\\n` always breaks a\n * row (hard). Overlong rows break at the last space when one exists in the\n * row, otherwise hard-break mid-word. Empty text yields one empty row.\n */\nexport function layoutText(text: string, width: number): TextLayout {\n const w = Math.max(1, width);\n const chars = cps(text);\n const rows: TextRow[] = [];\n\n let rowStart = 0;\n let rowCells = 0;\n let lastSpace = -1; // code-point index of the last space in the current row\n\n const pushRow = (end: number, hard: boolean, nextStart: number) => {\n rows.push({ text: chars.slice(rowStart, end).join(''), start: rowStart, end, hard });\n rowStart = nextStart;\n lastSpace = -1;\n };\n\n let i = 0;\n while (i < chars.length) {\n const ch = chars[i];\n if (ch === '\\n') {\n pushRow(i, true, i + 1);\n rowCells = 0;\n i++;\n continue;\n }\n const cw = charWidth(ch.codePointAt(0) ?? 0);\n if (rowCells + cw > w && i > rowStart) {\n // The overflowing character IS a space: break right here and\n // swallow it — the row before it fit exactly.\n if (ch === ' ') {\n pushRow(i, false, i + 1);\n rowCells = 0;\n i++;\n continue;\n }\n // Overflow: wrap at the last space if the row has one, else here.\n if (lastSpace > rowStart) {\n pushRow(lastSpace, false, lastSpace + 1); // the space is swallowed by the wrap\n } else {\n pushRow(i, false, i);\n }\n // Recompute cells for the (possibly re-started) row up to i.\n rowCells = 0;\n for (let j = rowStart; j < i; j++) {\n rowCells += charWidth(chars[j].codePointAt(0) ?? 0);\n }\n continue; // re-process chars[i] against the new row\n }\n if (ch === ' ') lastSpace = i;\n rowCells += cw;\n i++;\n }\n rows.push({ text: chars.slice(rowStart).join(''), start: rowStart, end: chars.length, hard: true });\n return { rows, width: w };\n}\n\n/**\n * Map a cursor (code-point index) to its visual row and column (cells).\n * A cursor sitting exactly on a soft-wrap boundary maps to the start of the\n * NEXT row — except at the very end of the text, where it stays on the last.\n */\nexport function cursorToRowCol(layout: TextLayout, cursor: number): { row: number; col: number } {\n const rows = layout.rows;\n for (let r = 0; r < rows.length; r++) {\n const row = rows[r];\n const isLast = r === rows.length - 1;\n const next = rows[r + 1];\n // cursor === row.end belongs to THIS row unless the next row starts\n // exactly there (a pure soft wrap, where the boundary cursor renders\n // at the start of the next row). A wrap that swallowed a space leaves\n // next.start === row.end + 1, so the on-the-space cursor stays here.\n const within = cursor >= row.start && (\n cursor < row.end ||\n (cursor === row.end && (isLast || next.start !== row.end)) ||\n (isLast && cursor >= row.end)\n );\n if (!within) continue;\n let col = 0;\n const chars = cps(row.text);\n const upto = Math.min(cursor - row.start, chars.length);\n for (let j = 0; j < upto; j++) {\n col += charWidth(chars[j].codePointAt(0) ?? 0);\n }\n return { row: r, col };\n }\n const last = rows.length - 1;\n return { row: last, col: cps(rows[last].text).reduce((c, ch) => c + charWidth(ch.codePointAt(0) ?? 0), 0) };\n}\n\n/**\n * Map a visual (row, goalCol) back to a cursor index. A goal column landing\n * inside a wide glyph snaps to the glyph start; beyond the row end clamps to\n * the row end.\n */\nexport function rowColToCursor(layout: TextLayout, row: number, goalCol: number): number {\n const r = layout.rows[Math.max(0, Math.min(row, layout.rows.length - 1))];\n const chars = cps(r.text);\n let col = 0;\n for (let j = 0; j < chars.length; j++) {\n const cw = charWidth(chars[j].codePointAt(0) ?? 0);\n if (col + cw > goalCol) return r.start + j;\n col += cw;\n }\n return r.end;\n}\n\nexport function insertAt(state: TextBufferState, chunk: string): TextBufferState {\n const chars = cps(state.text);\n const at = Math.max(0, Math.min(state.cursor, chars.length));\n const text = chars.slice(0, at).join('') + chunk + chars.slice(at).join('');\n return { text, cursor: at + cps(chunk).length };\n}\n\n/** Backspace: delete the code point before the cursor. */\nexport function deleteBefore(state: TextBufferState): TextBufferState {\n const chars = cps(state.text);\n const at = Math.max(0, Math.min(state.cursor, chars.length));\n if (at === 0) return state;\n return { text: chars.slice(0, at - 1).join('') + chars.slice(at).join(''), cursor: at - 1 };\n}\n\n/** Forward delete: delete the code point under the cursor. */\nexport function deleteAt(state: TextBufferState): TextBufferState {\n const chars = cps(state.text);\n const at = Math.max(0, Math.min(state.cursor, chars.length));\n if (at >= chars.length) return state;\n return { text: chars.slice(0, at).join('') + chars.slice(at + 1).join(''), cursor: at };\n}\n\nexport function moveLeft(state: TextBufferState): TextBufferState {\n return { ...state, cursor: Math.max(0, state.cursor - 1) };\n}\n\nexport function moveRight(state: TextBufferState): TextBufferState {\n return { ...state, cursor: Math.min(cps(state.text).length, state.cursor + 1) };\n}\n\n/**\n * Move the cursor a visual row up (-1) or down (+1), keeping a sticky goal\n * column: pass the previous call's `goalCol` back in while the user keeps\n * moving vertically (any horizontal move/edit resets it — caller's job).\n */\nexport function moveVertical(\n state: TextBufferState,\n width: number,\n dir: -1 | 1,\n goalCol?: number,\n): { state: TextBufferState; goalCol: number } {\n const layout = layoutText(state.text, width);\n const { row, col } = cursorToRowCol(layout, state.cursor);\n const goal = goalCol !== undefined && goalCol >= 0 ? goalCol : col;\n const targetRow = row + dir;\n if (targetRow < 0 || targetRow >= layout.rows.length) {\n return { state, goalCol: goal };\n }\n return { state: { ...state, cursor: rowColToCursor(layout, targetRow, goal) }, goalCol: goal };\n}\n\n/** Jump to the start of the cursor's visual row. */\nexport function moveLineStart(state: TextBufferState, width: number): TextBufferState {\n const layout = layoutText(state.text, width);\n const { row } = cursorToRowCol(layout, state.cursor);\n return { ...state, cursor: layout.rows[row].start };\n}\n\n/** Jump to the end of the cursor's visual row. */\nexport function moveLineEnd(state: TextBufferState, width: number): TextBufferState {\n const layout = layoutText(state.text, width);\n const { row } = cursorToRowCol(layout, state.cursor);\n return { ...state, cursor: layout.rows[row].end };\n}\n","/**\n * Reactive view/navigation stack — the headless half of screen navigation.\n * Push a view (a settings page, a model picker), pop back with Esc:\n *\n * const views = createViewStack<'shell' | 'model'>('shell');\n * onKey((key) => {\n * if (isEsc(key) && views.depth() > 1) {\n * views.pop();\n * return true; // consume — nothing below sees Esc\n * }\n * }, { layer: 'view' });\n * // render: views.current() === 'model' ? <ModelPicker/> : <Shell/>\n */\nimport { signal } from '@sigx/reactivity';\n\nexport interface ViewStack<T> {\n push(view: T): void;\n /** Pop the current view. Returns false (and stays) at the root. */\n pop(): boolean;\n /** Swap the current view without growing the stack. */\n replace(view: T): void;\n /** The top of the stack. Reactive. */\n current(): T;\n /** Stack size (root = 1). Reactive. */\n depth(): number;\n}\n\nexport function createViewStack<T>(root: T): ViewStack<T> {\n // The array is replaced wholesale on every mutation so signal subscribers\n // re-run reliably.\n const state = signal({ stack: [root] as T[] });\n\n return {\n push(view: T) {\n state.stack = [...state.stack, view];\n },\n pop(): boolean {\n if (state.stack.length <= 1) return false;\n state.stack = state.stack.slice(0, -1);\n return true;\n },\n replace(view: T) {\n state.stack = [...state.stack.slice(0, -1), view];\n },\n current(): T {\n return state.stack[state.stack.length - 1];\n },\n depth(): number {\n return state.stack.length;\n },\n };\n}\n","/**\n * Terminal QR code generator.\n *\n * Generates a QR code using Unicode block characters for display\n * in the terminal. Zero dependencies — implements QR encoding inline\n * (byte mode, versions 1–20, error-correction level L, half-block\n * rendering: two QR rows per terminal row).\n *\n * Extracted from @sigx/lynx-cli (packages/lynx-cli/src/qr.ts) — keep the two\n * in sync until lynx-cli imports `generateQR` from @sigx/terminal-zero.\n */\nimport { Buffer } from 'node:buffer';\n\n// QR code encoding constants\nconst MODE_BYTE = 0b0100;\nconst EC_LEVEL_L = 0; // ~7% error correction (sufficient for URLs on clean channel)\n\n// Version capacities for byte mode, EC level L\nconst VERSION_CAPACITIES: number[] = [\n 0, 17, 32, 53, 78, 106, 134, 154, 192, 230, 271,\n 321, 367, 425, 458, 520, 586, 644, 718, 792, 858,\n];\n\n// Error correction codewords per block for each version (EC level L)\nconst EC_CODEWORDS_PER_BLOCK: number[] = [\n 0, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18,\n 20, 24, 26, 30, 22, 24, 28, 30, 28, 28,\n];\n\n// Number of EC blocks for each version (EC level L). Source: ISO/IEC 18004\n// Table 9. Previously the V10–V20 counts were truncated to 4, which produced\n// codes that visually parsed but didn't decode in commercial scanners.\nconst NUM_EC_BLOCKS: number[] = [\n 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4,\n 4, 4, 4, 4, 6, 6, 6, 6, 7, 8,\n];\n\n// Total codewords per version (data + EC). Fixed by the QR spec — the\n// previous \"size² minus function modules / 8\" formula was off by a few\n// codewords per version, which threw off data placement so ML Kit /\n// commercial scanners couldn't decode the result. Source: ISO/IEC 18004\n// Table 1. Length must match VERSION_CAPACITIES.length (21).\nconst TOTAL_CODEWORDS: number[] = [\n 0, 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n];\n\n// Alignment pattern positions for each version\nconst ALIGNMENT_PATTERNS: number[][] = [\n [], [], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34],\n [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50],\n [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66],\n [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78],\n [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90],\n];\n\n// Format info bits for EC level L, masks 0-7\nconst FORMAT_INFO: number[] = [\n 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,\n];\n\n// Version info bits for versions 7+\nconst VERSION_INFO: number[] = [\n 0, 0, 0, 0, 0, 0, 0,\n 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847,\n 0x0e60d, 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6,\n];\n\nclass BitBuffer {\n private buffer: number[] = [];\n private length = 0;\n\n put(num: number, bitLength: number) {\n for (let i = bitLength - 1; i >= 0; i--) {\n this.buffer.push((num >> i) & 1);\n this.length++;\n }\n }\n\n getBit(index: number): number {\n return this.buffer[index];\n }\n\n getLength(): number {\n return this.length;\n }\n\n getBuffer(): number[] {\n return this.buffer;\n }\n}\n\n// GF(256) arithmetic for Reed-Solomon\nconst GF_EXP = new Uint8Array(512);\nconst GF_LOG = new Uint8Array(256);\n\n(function initGaloisField() {\n let x = 1;\n for (let i = 0; i < 255; i++) {\n GF_EXP[i] = x;\n GF_LOG[x] = i;\n x = x << 1;\n if (x >= 256) x ^= 0x11d;\n }\n for (let i = 255; i < 512; i++) {\n GF_EXP[i] = GF_EXP[i - 255];\n }\n})();\n\nfunction gfMultiply(a: number, b: number): number {\n if (a === 0 || b === 0) return 0;\n return GF_EXP[GF_LOG[a] + GF_LOG[b]];\n}\n\nfunction rsEncode(data: number[], ecCount: number): number[] {\n // Build generator polynomial\n const gen = new Uint8Array(ecCount + 1);\n gen[0] = 1;\n for (let i = 0; i < ecCount; i++) {\n for (let j = ecCount; j >= 1; j--) {\n gen[j] = gen[j] ^ gfMultiply(gen[j - 1], GF_EXP[i]);\n }\n }\n\n const msg = new Uint8Array(data.length + ecCount);\n for (let i = 0; i < data.length; i++) msg[i] = data[i];\n\n for (let i = 0; i < data.length; i++) {\n const coef = msg[i];\n if (coef !== 0) {\n for (let j = 1; j <= ecCount; j++) {\n msg[i + j] ^= gfMultiply(gen[j], coef);\n }\n }\n }\n\n return Array.from(msg.slice(data.length));\n}\n\nfunction getVersion(dataLength: number): number {\n for (let v = 1; v <= 20; v++) {\n if (VERSION_CAPACITIES[v] >= dataLength) return v;\n }\n throw new Error('Data too long for QR code (max ~850 bytes)');\n}\n\nfunction getSize(version: number): number {\n return 17 + version * 4;\n}\n\nfunction createMatrix(size: number): (boolean | null)[][] {\n return Array.from({ length: size }, () => Array(size).fill(null));\n}\n\nfunction setModule(matrix: (boolean | null)[][], row: number, col: number, value: boolean) {\n if (row >= 0 && row < matrix.length && col >= 0 && col < matrix.length) {\n matrix[row][col] = value;\n }\n}\n\nfunction addFinderPattern(matrix: (boolean | null)[][], row: number, col: number) {\n for (let r = -1; r <= 7; r++) {\n for (let c = -1; c <= 7; c++) {\n const inOuter = r >= 0 && r <= 6 && c >= 0 && c <= 6;\n const inInner = r >= 2 && r <= 4 && c >= 2 && c <= 4;\n const onBorder = r === 0 || r === 6 || c === 0 || c === 6;\n const val = inOuter && (onBorder || inInner);\n setModule(matrix, row + r, col + c, val);\n }\n }\n}\n\nfunction addAlignmentPattern(matrix: (boolean | null)[][], row: number, col: number) {\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n const val = Math.abs(r) === 2 || Math.abs(c) === 2 || (r === 0 && c === 0);\n if (matrix[row + r][col + c] === null) {\n matrix[row + r][col + c] = val;\n }\n }\n }\n}\n\nfunction addTimingPatterns(matrix: (boolean | null)[][]) {\n const size = matrix.length;\n for (let i = 8; i < size - 8; i++) {\n const val = i % 2 === 0;\n if (matrix[6][i] === null) matrix[6][i] = val;\n if (matrix[i][6] === null) matrix[i][6] = val;\n }\n}\n\nfunction reserveFormatArea(matrix: (boolean | null)[][]) {\n const size = matrix.length;\n // Around top-left finder\n for (let i = 0; i <= 8; i++) {\n if (matrix[8][i] === null) matrix[8][i] = false;\n if (matrix[i][8] === null) matrix[i][8] = false;\n }\n // Around top-right finder\n for (let i = 0; i <= 7; i++) {\n if (matrix[8][size - 1 - i] === null) matrix[8][size - 1 - i] = false;\n }\n // Around bottom-left finder\n for (let i = 0; i <= 7; i++) {\n if (matrix[size - 1 - i][8] === null) matrix[size - 1 - i][8] = false;\n }\n // Dark module\n matrix[size - 8][8] = true;\n}\n\nfunction addFormatInfo(matrix: (boolean | null)[][], maskPattern: number) {\n const size = matrix.length;\n const bits = FORMAT_INFO[maskPattern];\n\n for (let i = 0; i <= 5; i++) {\n matrix[8][i] = !!((bits >> (14 - i)) & 1);\n }\n matrix[8][7] = !!((bits >> 8) & 1);\n matrix[8][8] = !!((bits >> 7) & 1);\n matrix[7][8] = !!((bits >> 6) & 1);\n\n for (let i = 0; i <= 5; i++) {\n matrix[5 - i][8] = !!((bits >> (i)) & 1);\n }\n\n for (let i = 0; i <= 7; i++) {\n matrix[8][size - 1 - i] = !!((bits >> i) & 1);\n }\n for (let i = 0; i <= 6; i++) {\n matrix[size - 1 - i][8] = !!((bits >> (14 - i)) & 1);\n }\n}\n\nfunction addVersionInfo(matrix: (boolean | null)[][], version: number) {\n if (version < 7) return;\n const size = matrix.length;\n const bits = VERSION_INFO[version];\n\n for (let i = 0; i < 18; i++) {\n const bit = !!((bits >> i) & 1);\n const row = Math.floor(i / 3);\n const col = i % 3;\n matrix[5 - row][size - 9 - col] = bit;\n matrix[size - 9 - col][5 - row] = bit;\n }\n}\n\nconst MASK_FUNCTIONS: ((row: number, col: number) => boolean)[] = [\n (r, c) => (r + c) % 2 === 0,\n (r, _) => r % 2 === 0,\n (_, c) => c % 3 === 0,\n (r, c) => (r + c) % 3 === 0,\n (r, c) => (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0,\n (r, c) => ((r * c) % 2 + (r * c) % 3) === 0,\n (r, c) => ((r * c) % 2 + (r * c) % 3) % 2 === 0,\n (r, c) => ((r + c) % 2 + (r * c) % 3) % 2 === 0,\n];\n\nfunction placeData(matrix: (boolean | null)[][], bits: number[]) {\n const size = matrix.length;\n let bitIndex = 0;\n let upward = true;\n\n for (let right = size - 1; right >= 1; right -= 2) {\n if (right === 6) right = 5; // Skip timing column\n\n const rows = upward\n ? Array.from({ length: size }, (_, i) => size - 1 - i)\n : Array.from({ length: size }, (_, i) => i);\n\n for (const row of rows) {\n for (const col of [right, right - 1]) {\n if (matrix[row][col] === null) {\n matrix[row][col] = bitIndex < bits.length ? !!bits[bitIndex] : false;\n bitIndex++;\n }\n }\n }\n upward = !upward;\n }\n}\n\nfunction applyMask(matrix: (boolean | null)[][], reserved: (boolean | null)[][], mask: number): boolean[][] {\n const size = matrix.length;\n const result: boolean[][] = Array.from({ length: size }, (_, r) =>\n Array.from({ length: size }, (_, c) => !!matrix[r][c])\n );\n\n const fn = MASK_FUNCTIONS[mask];\n for (let r = 0; r < size; r++) {\n for (let c = 0; c < size; c++) {\n if (reserved[r][c] !== null) continue; // Don't mask reserved areas\n if (fn(r, c)) result[r][c] = !result[r][c];\n }\n }\n\n return result;\n}\n\nfunction penaltyScore(matrix: boolean[][]): number {\n const size = matrix.length;\n let penalty = 0;\n\n // Rule 1: Runs of same color\n for (let r = 0; r < size; r++) {\n let count = 1;\n for (let c = 1; c < size; c++) {\n if (matrix[r][c] === matrix[r][c - 1]) {\n count++;\n if (count === 5) penalty += 3;\n else if (count > 5) penalty++;\n } else {\n count = 1;\n }\n }\n }\n for (let c = 0; c < size; c++) {\n let count = 1;\n for (let r = 1; r < size; r++) {\n if (matrix[r][c] === matrix[r - 1][c]) {\n count++;\n if (count === 5) penalty += 3;\n else if (count > 5) penalty++;\n } else {\n count = 1;\n }\n }\n }\n\n // Rule 2: 2x2 blocks\n for (let r = 0; r < size - 1; r++) {\n for (let c = 0; c < size - 1; c++) {\n const v = matrix[r][c];\n if (v === matrix[r][c + 1] && v === matrix[r + 1][c] && v === matrix[r + 1][c + 1]) {\n penalty += 3;\n }\n }\n }\n\n return penalty;\n}\n\nfunction encodeQR(data: string): boolean[][] {\n const bytes = Buffer.from(data, 'utf-8');\n const version = getVersion(bytes.length);\n const size = getSize(version);\n const ecPerBlock = EC_CODEWORDS_PER_BLOCK[version];\n const numBlocks = NUM_EC_BLOCKS[version];\n const totalCodewords = TOTAL_CODEWORDS[version];\n\n // Build data bits\n const bitBuf = new BitBuffer();\n bitBuf.put(MODE_BYTE, 4);\n bitBuf.put(bytes.length, version <= 9 ? 8 : 16);\n for (let i = 0; i < bytes.length; i++) {\n bitBuf.put(bytes[i], 8);\n }\n\n // Total data codewords\n const dataCodewords = totalCodewords - ecPerBlock * numBlocks;\n\n // Pad to fill data capacity\n const targetBits = dataCodewords * 8;\n if (bitBuf.getLength() < targetBits) {\n bitBuf.put(0, Math.min(4, targetBits - bitBuf.getLength()));\n }\n while (bitBuf.getLength() % 8 !== 0) {\n bitBuf.put(0, 1);\n }\n const padBytes = [0xEC, 0x11];\n let padIdx = 0;\n while (bitBuf.getLength() < targetBits) {\n bitBuf.put(padBytes[padIdx % 2], 8);\n padIdx++;\n }\n\n // Convert to codewords\n const dataWords: number[] = [];\n const buf = bitBuf.getBuffer();\n for (let i = 0; i < dataCodewords; i++) {\n let byte = 0;\n for (let j = 0; j < 8; j++) {\n byte = (byte << 1) | (buf[i * 8 + j] || 0);\n }\n dataWords.push(byte);\n }\n\n // Split into blocks and compute EC\n const blockSize = Math.floor(dataCodewords / numBlocks);\n const longBlocks = dataCodewords % numBlocks;\n const dataBlocks: number[][] = [];\n const ecBlocks: number[][] = [];\n\n let offset = 0;\n for (let i = 0; i < numBlocks; i++) {\n const bSize = blockSize + (i >= numBlocks - longBlocks ? 1 : 0);\n const block = dataWords.slice(offset, offset + bSize);\n dataBlocks.push(block);\n ecBlocks.push(rsEncode(block, ecPerBlock));\n offset += bSize;\n }\n\n // Interleave\n const allBits: number[] = [];\n const maxDataLen = Math.max(...dataBlocks.map(b => b.length));\n for (let i = 0; i < maxDataLen; i++) {\n for (const block of dataBlocks) {\n if (i < block.length) {\n for (let j = 7; j >= 0; j--) {\n allBits.push((block[i] >> j) & 1);\n }\n }\n }\n }\n for (let i = 0; i < ecPerBlock; i++) {\n for (const block of ecBlocks) {\n if (i < block.length) {\n for (let j = 7; j >= 0; j--) {\n allBits.push((block[i] >> j) & 1);\n }\n }\n }\n }\n\n // Build matrix with reserved areas\n const reserved = createMatrix(size);\n addFinderPattern(reserved, 0, 0);\n addFinderPattern(reserved, 0, size - 7);\n addFinderPattern(reserved, size - 7, 0);\n addTimingPatterns(reserved);\n reserveFormatArea(reserved);\n\n const positions = ALIGNMENT_PATTERNS[version] || [];\n for (let i = 0; i < positions.length; i++) {\n for (let j = 0; j < positions.length; j++) {\n const r = positions[i], c = positions[j];\n if (reserved[r]?.[c] !== null) continue;\n addAlignmentPattern(reserved, r, c);\n }\n }\n\n // Place data on a copy\n const matrix = reserved.map(row => [...row]);\n placeData(matrix, allBits);\n\n // Try all masks, pick best\n let bestMask = 0;\n let bestPenalty = Infinity;\n for (let m = 0; m < 8; m++) {\n const masked = applyMask(matrix, reserved, m);\n const p = penaltyScore(masked);\n if (p < bestPenalty) {\n bestPenalty = p;\n bestMask = m;\n }\n }\n\n const result = applyMask(matrix, reserved, bestMask);\n\n // Write format & version info\n const fmtMatrix = createMatrix(size);\n addFinderPattern(fmtMatrix, 0, 0);\n addFinderPattern(fmtMatrix, 0, size - 7);\n addFinderPattern(fmtMatrix, size - 7, 0);\n addTimingPatterns(fmtMatrix);\n addFormatInfo(fmtMatrix, bestMask);\n addVersionInfo(fmtMatrix, version);\n\n // Overlay format/version info onto result\n for (let r = 0; r < size; r++) {\n for (let c = 0; c < size; c++) {\n if (reserved[r][c] !== null) {\n result[r][c] = !!fmtMatrix[r][c];\n }\n }\n }\n\n addFormatInfo(result as any, bestMask);\n if (version >= 7) addVersionInfo(result as any, version);\n\n return result;\n}\n\n/**\n * Generate a QR code string for terminal display.\n * Uses Unicode half-block characters (▀▄█ ) to render 2 rows per line.\n *\n * @param text - The text/URL to encode\n * @param opts - Options: quiet zone width, colors\n * @returns Multi-line string ready for console.log()\n */\nexport function generateQR(text: string, opts?: { quiet?: number; invert?: boolean }): string {\n // Quiet zone: ISO/IEC 18004 requires at least 4 modules of white border\n // around the matrix. The previous default of 2 made finder-pattern\n // detection slow — scanners would burn many frames before lock-on.\n const quiet = opts?.quiet ?? 4;\n const invert = opts?.invert ?? false;\n\n let matrix: boolean[][];\n try {\n matrix = encodeQR(text);\n } catch {\n // Fallback: return a simple text representation\n return ` [QR: ${text}]`;\n }\n\n const size = matrix.length;\n const totalSize = size + quiet * 2;\n\n // Pad with quiet zone\n const getModule = (r: number, c: number): boolean => {\n const mr = r - quiet;\n const mc = c - quiet;\n if (mr < 0 || mr >= size || mc < 0 || mc >= size) return false;\n return matrix[mr][mc];\n };\n\n const lines: string[] = [];\n\n // Use half-block characters: each character represents 2 vertical pixels\n // ▀ = top half, ▄ = bottom half, █ = full, ' ' = empty\n const BLACK = invert ? false : true;\n\n for (let r = 0; r < totalSize; r += 2) {\n let line = '';\n for (let c = 0; c < totalSize; c++) {\n const top = getModule(r, c);\n const bottom = r + 1 < totalSize ? getModule(r + 1, c) : false;\n\n if (top === BLACK && bottom === BLACK) {\n line += '█';\n } else if (top === BLACK && bottom !== BLACK) {\n line += '▀';\n } else if (top !== BLACK && bottom === BLACK) {\n line += '▄';\n } else {\n line += ' ';\n }\n }\n lines.push(line);\n }\n\n return lines.join('\\n');\n}\n","/**\n * Shared, design-system-neutral utilities for terminal components: the glyph\n * set the SigX-tui spec standardizes on, interaction timings, and re-exports of\n * the renderer's focus + key APIs so skins depend only on `@sigx/terminal-zero`.\n */\n\n// Focus registry + keyboard input (re-exported from the renderer so skin\n// components have a single foundation import).\nexport {\n focusState,\n registerFocusable,\n unregisterFocusable,\n focus,\n focusNext,\n focusPrev,\n onKey,\n setScreenBackground,\n setScreenForeground,\n} from '@sigx/runtime-terminal';\n\n// Renderer device APIs the FX / log components build on: depth-aware SGR for\n// embedded gradient escapes, static output, and escape-safe measurement.\nexport {\n hexToSGR,\n resolveFg,\n getColorDepth,\n getOutputTarget,\n writeStatic,\n printStatic,\n displayWidth,\n truncateToWidth,\n} from '@sigx/runtime-terminal';\n\n// One-shot mount + key injection — what the imperative prompts layer builds\n// on. Re-exported here so skins keep their single foundation import.\nexport {\n renderTerminal,\n dispatchKey,\n type RenderTerminalOptions,\n type KeyLayer,\n type KeyHandler,\n} from '@sigx/runtime-terminal';\n\n// Cell measurement + background SGR for components that build their own\n// escape strings (text buffers, pixel art).\nexport {\n charWidth,\n resolveBg,\n} from '@sigx/runtime-terminal';\n\n// Reactive terminal size — read it in a render function to re-render on\n// resize (getOutputTarget().columns/rows are live but not reactive).\nexport {\n getTerminalSize,\n syncTerminalSize,\n} from '@sigx/runtime-terminal';\n\nexport * from './colorMath';\nexport * from './ticker';\nexport * from './textBuffer';\nexport * from './viewStack';\nexport { generateQR } from './qr';\n\n/**\n * Standard glyphs. All are width-1 in monospace fonts (Braille, geometric,\n * box-drawing) — except the status icons, which some terminals render as 2\n * cells; prefer them only where a trailing column is acceptable.\n */\nexport const GLYPHS = {\n checkboxOn: '◉',\n checkboxOff: '◯',\n radioOn: '●',\n radioOff: '○',\n cursor: '❯', // Select / menu pointer\n focusBar: '▌', // focused-control accent bar\n shadowCell: '▒', // drop shadow\n barFull: '█', // progress filled\n barEmpty: '░', // progress track\n // sub-cell progress edge, thinnest → widest (smooth bar leading edge)\n barEighths: ['▏', '▎', '▍', '▌', '▋', '▊', '▉'] as readonly string[],\n // status icons (may be 2 cells in some terminals)\n check: '✔',\n cross: '✖',\n warn: '⚠',\n info: 'ℹ',\n // spinner animation frames (Braille — always width 1)\n spinner: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as readonly string[],\n} as const;\n\n/**\n * Spinner frame sets, selectable via the Spinner `variant` prop. All width-1\n * except `moon` (emoji — 2 cells; use where a wider glyph column is fine).\n */\nexport const SPINNERS = {\n dots: GLYPHS.spinner,\n line: ['—', '\\\\', '|', '/'],\n arc: ['◜', '◠', '◝', '◞', '◡', '◟'],\n circle: ['◐', '◓', '◑', '◒'],\n bounce: ['▁', '▃', '▄', '▅', '▆', '▇', '▆', '▅', '▄', '▃'],\n moon: ['🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘'],\n} as const satisfies Record<string, readonly string[]>;\n\nexport type SpinnerVariant = keyof typeof SPINNERS;\n\n/** Milliseconds a button stays in its visual \"pressed\" state after activation. */\nexport const PRESS_MS = 120;\n\n/** Milliseconds to ignore input after mount (debounces the activating Enter). */\nexport const READY_DELAY_MS = 50;\n"],"mappings":"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"}
|
package/dist/theme/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/theme/index.ts"],"sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/theme/index.ts"],"sourcesContent":["/**\n * The theme engine — the semantic half of the token pipeline.\n *\n * Owns the theme registry, the active-theme signal, and `resolveColor()`, which\n * turns a token into a concrete color string the renderer can paint:\n * - truecolor / 256-color terminals → the theme's hex (renderer quantizes 256)\n * - 16-color terminals → the `FALLBACK_ALIAS` ANSI name\n * It reads the renderer's detected color depth (`getColorDepth`) but never emits\n * SGR itself — that's the renderer's device half. Reads of the active-theme and\n * color-depth signals are reactive, so `setTheme()` / `setColorDepth()` repaint\n * any component that resolved a token during render.\n */\nimport { signal, effect, type EffectRunner } from '@sigx/reactivity';\nimport { getColorDepth, setScreenBackground, setScreenForeground } from '@sigx/runtime-terminal';\nimport { ANSI_NAMES, FALLBACK_ALIAS, type Theme } from '../contract';\n\nconst themes: Record<string, Theme> = {};\n\n// Reactive active-theme id. Empty until the first theme registers.\nconst themeState = signal({ active: '' });\n\n/**\n * A minimal neutral theme so the foundation is usable standalone, before any\n * design-system skin registers its palettes. Skins (e.g. @sigx/terminal-ui)\n * register richer themes and switch the default.\n */\nconst neutral: Theme = {\n name: 'Neutral', mode: 'dark',\n bg: '#000000', panel: '#0a0a0a', chrome: '#000000', line: '#3a3a3a',\n fg: '#d0d0d0', dim: '#808080', faint: '#4a4a4a', shadow: '#000000',\n accent: '#5fafff', accentSoft: '#1c2733', accentText: '#000000', selSoft: '#1a1f26',\n success: '#5faf5f', warn: '#d7af5f', danger: '#d75f5f', info: '#5fafd7',\n black: '#000000', red: '#d75f5f', green: '#5faf5f', yellow: '#d7af5f',\n blue: '#5fafff', magenta: '#af5fd7', cyan: '#5fd7d7', white: '#d0d0d0',\n};\n\n/** Register (or replace) a theme. The first registered theme becomes active. */\nexport function registerTheme(id: string, theme: Theme): void {\n themes[id] = theme;\n if (!themeState.active) themeState.active = id;\n}\n\nregisterTheme('neutral', neutral);\n\n/** Switch the active theme. Throws on an unknown id. */\nexport function setTheme(id: string): void {\n if (!themes[id]) throw new Error(`Unknown theme: ${id}`);\n themeState.active = id;\n}\n\n/** The active theme id (reactive). */\nexport function getTheme(): string {\n return themeState.active;\n}\n\n/** The active theme object (reactive). */\nexport function getActiveTheme(): Theme {\n return themes[themeState.active] ?? neutral;\n}\n\n/** Whether a theme id is registered. */\nexport function hasTheme(id: string): boolean {\n return !!themes[id];\n}\n\n/** All registered theme ids. */\nexport function listThemes(): string[] {\n return Object.keys(themes);\n}\n\n/**\n * Resolve a token (or raw `#hex`) to a concrete color string for the renderer.\n * Reactive: re-reads the active theme + color depth on every call.\n */\nexport function resolveColor(token: string | undefined): string {\n if (!token) return '';\n if (token[0] === '#') return token; // raw hex passes through\n const theme = getActiveTheme(); // tracks active-theme signal\n const depth = getColorDepth(); // tracks color-depth signal\n\n if (depth === 'ansi16') {\n // Degrade to a 16-color ANSI name the renderer paints by name.\n if (ANSI_NAMES.has(token)) return token;\n return FALLBACK_ALIAS[token] ?? 'white';\n }\n\n // truecolor / 256 / none: hand the renderer the theme hex (it quantizes/skips).\n const hex = (theme as unknown as Record<string, string>)[token];\n return hex ?? token;\n}\n\n// ---------------------------------------------------------------------------\n// Theme canvas — auto-paint the renderer's screen background + default\n// foreground from the active theme (the app-level canvas). The renderer owns\n// the device fill; this is the reactive binding that drives it.\n// ---------------------------------------------------------------------------\n\nlet canvasEffect: EffectRunner | null = null;\n\n/**\n * Bind the renderer's screen canvas (background + default foreground) to the\n * active theme. Reactive: it re-applies whenever the theme or color depth\n * changes. Idempotent — calling it again returns the same stop function.\n *\n * Design-system packages call this on import so apps get a legible themed canvas\n * automatically (especially light themes on a dark terminal). Returns a function\n * that stops the binding (see also `disableThemeCanvas`).\n */\nexport function applyThemeCanvas(): () => void {\n if (!canvasEffect) {\n canvasEffect = effect(() => {\n setScreenBackground(resolveColor('bg'));\n setScreenForeground(resolveColor('fg'));\n });\n }\n return disableThemeCanvas;\n}\n\n/**\n * Stop the theme→canvas binding and clear the canvas, so the terminal's own\n * background shows through (for transparent / inline apps that don't want a\n * themed canvas).\n */\nexport function disableThemeCanvas(): void {\n if (canvasEffect) {\n canvasEffect.stop?.();\n canvasEffect = null;\n }\n setScreenBackground(undefined);\n setScreenForeground(undefined);\n}\n"],"mappings":";;;;AAgBA,IAAM,IAAgC,EAAE,EAGlC,IAAa,EAAO,EAAE,QAAQ,IAAI,CAAC,EAOnC,IAAiB;CACnB,MAAM;CAAW,MAAM;CACvB,IAAI;CAAW,OAAO;CAAW,QAAQ;CAAW,MAAM;CAC1D,IAAI;CAAW,KAAK;CAAW,OAAO;CAAW,QAAQ;CACzD,QAAQ;CAAW,YAAY;CAAW,YAAY;CAAW,SAAS;CAC1E,SAAS;CAAW,MAAM;CAAW,QAAQ;CAAW,MAAM;CAC9D,OAAO;CAAW,KAAK;CAAW,OAAO;CAAW,QAAQ;CAC5D,MAAM;CAAW,SAAS;CAAW,MAAM;CAAW,OAAO;CAChE;AAGD,SAAgB,EAAc,GAAY,GAAoB;CAE1D,AADA,EAAO,KAAM,GACb,AAAwB,EAAW,WAAS;;AAGhD,EAAc,WAAW,EAAQ;AAGjC,SAAgB,EAAS,GAAkB;CACvC,IAAI,CAAC,EAAO,IAAK,MAAU,MAAM,kBAAkB,IAAK;CACxD,EAAW,SAAS;;AAIxB,SAAgB,IAAmB;CAC/B,OAAO,EAAW;;AAItB,SAAgB,IAAwB;CACpC,OAAO,EAAO,EAAW,WAAW;;AAIxC,SAAgB,EAAS,GAAqB;CAC1C,OAAO,CAAC,CAAC,EAAO;;AAIpB,SAAgB,IAAuB;CACnC,OAAO,OAAO,KAAK,EAAO;;AAO9B,SAAgB,EAAa,GAAmC;CAC5D,IAAI,CAAC,GAAO,OAAO;CACnB,IAAI,EAAM,OAAO,KAAK,OAAO;CAC7B,IAAM,IAAQ,GAAgB;CAW9B,OAVc,GAEV,KAAU,WAEN,EAAW,IAAI,EAAM,GAAS,IAC3B,EAAe,MAAU,UAIvB,EAA4C,MAC3C;;AASlB,IAAI,IAAoC;AAWxC,SAAgB,IAA+B;CAO3C,OANA,AACI,MAAe,QAAa;EAExB,AADA,EAAoB,EAAa,KAAK,CAAC,EACvC,EAAoB,EAAa,KAAK,CAAC;GACzC,EAEC;;AAQX,SAAgB,IAA2B;CAMvC,AALA,AAEI,OADA,EAAa,QAAQ,EACN,OAEnB,EAAoB,KAAA,EAAU,EAC9B,EAAoB,KAAA,EAAU"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sigx/terminal-zero",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Headless, design-system-neutral foundation for SignalX terminal UIs — token contract, theme engine, and layout primitives",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"@sigx/reactivity": "^0.4.9",
|
|
59
59
|
"@sigx/runtime-core": "^0.4.9",
|
|
60
|
-
"@sigx/runtime-terminal": "^0.
|
|
60
|
+
"@sigx/runtime-terminal": "^0.6.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@sigx/vite": "^0.4.7",
|