@valyrianjs/terminal 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +105 -55
  2. package/dist/ansi.d.ts +20 -4
  3. package/dist/ansi.d.ts.map +1 -1
  4. package/dist/ansi.js +171 -47
  5. package/dist/ansi.js.map +1 -1
  6. package/dist/editor-state.d.ts +22 -0
  7. package/dist/editor-state.d.ts.map +1 -0
  8. package/dist/editor-state.js +110 -0
  9. package/dist/editor-state.js.map +1 -0
  10. package/dist/events.d.ts +1 -4
  11. package/dist/events.d.ts.map +1 -1
  12. package/dist/events.js +15 -38
  13. package/dist/events.js.map +1 -1
  14. package/dist/index.d.ts +4 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/keymap.d.ts +7 -0
  19. package/dist/keymap.d.ts.map +1 -0
  20. package/dist/keymap.js +133 -0
  21. package/dist/keymap.js.map +1 -0
  22. package/dist/layout.d.ts +10 -1
  23. package/dist/layout.d.ts.map +1 -1
  24. package/dist/layout.js +97 -7
  25. package/dist/layout.js.map +1 -1
  26. package/dist/mouse.d.ts +1 -0
  27. package/dist/mouse.d.ts.map +1 -1
  28. package/dist/mouse.js +24 -1
  29. package/dist/mouse.js.map +1 -1
  30. package/dist/output-writer.d.ts +9 -0
  31. package/dist/output-writer.d.ts.map +1 -0
  32. package/dist/output-writer.js +79 -0
  33. package/dist/output-writer.js.map +1 -0
  34. package/dist/paste.d.ts +7 -0
  35. package/dist/paste.d.ts.map +1 -0
  36. package/dist/paste.js +18 -0
  37. package/dist/paste.js.map +1 -0
  38. package/dist/primitives.d.ts +8 -1
  39. package/dist/primitives.d.ts.map +1 -1
  40. package/dist/primitives.js +9 -1
  41. package/dist/primitives.js.map +1 -1
  42. package/dist/render.d.ts +8 -3
  43. package/dist/render.d.ts.map +1 -1
  44. package/dist/render.js +840 -67
  45. package/dist/render.js.map +1 -1
  46. package/dist/runtime.d.ts +29 -0
  47. package/dist/runtime.d.ts.map +1 -0
  48. package/dist/runtime.js +215 -0
  49. package/dist/runtime.js.map +1 -0
  50. package/dist/scheduler.d.ts +8 -0
  51. package/dist/scheduler.d.ts.map +1 -0
  52. package/dist/scheduler.js +24 -0
  53. package/dist/scheduler.js.map +1 -0
  54. package/dist/session.d.ts.map +1 -1
  55. package/dist/session.js +729 -199
  56. package/dist/session.js.map +1 -1
  57. package/dist/stream-log.d.ts +40 -0
  58. package/dist/stream-log.d.ts.map +1 -0
  59. package/dist/stream-log.js +73 -0
  60. package/dist/stream-log.js.map +1 -0
  61. package/dist/text.d.ts +3 -0
  62. package/dist/text.d.ts.map +1 -0
  63. package/dist/text.js +19 -0
  64. package/dist/text.js.map +1 -0
  65. package/dist/theme.d.ts +7 -0
  66. package/dist/theme.d.ts.map +1 -0
  67. package/dist/theme.js +254 -0
  68. package/dist/theme.js.map +1 -0
  69. package/dist/tree.d.ts +2 -0
  70. package/dist/tree.d.ts.map +1 -1
  71. package/dist/tree.js +42 -1
  72. package/dist/tree.js.map +1 -1
  73. package/dist/types.d.ts +183 -18
  74. package/dist/types.d.ts.map +1 -1
  75. package/docs/api-reference.md +302 -136
  76. package/docs/assets/quick-note.svg +13 -0
  77. package/docs/cookbook.md +297 -202
  78. package/docs/core-concepts.md +143 -55
  79. package/docs/getting-started.md +209 -90
  80. package/docs/interaction-model.md +95 -61
  81. package/docs/primitive-gallery.md +365 -0
  82. package/docs/session-runtime.md +132 -363
  83. package/docs/valyrian-modules.md +3196 -0
  84. package/llms-full.txt +5357 -0
  85. package/package.json +21 -8
  86. package/src/ansi.ts +269 -0
  87. package/src/clipboard.ts +76 -0
  88. package/src/editor-state.ts +162 -0
  89. package/src/events.ts +163 -0
  90. package/src/index.ts +92 -0
  91. package/src/keymap.ts +151 -0
  92. package/src/layout.ts +282 -0
  93. package/src/mouse.ts +68 -0
  94. package/src/output-writer.ts +93 -0
  95. package/src/paste.ts +23 -0
  96. package/src/primitives.ts +52 -0
  97. package/src/render.ts +1107 -0
  98. package/src/runtime.ts +273 -0
  99. package/src/scheduler.ts +33 -0
  100. package/src/session.ts +1260 -0
  101. package/src/stream-log.ts +96 -0
  102. package/src/text.ts +20 -0
  103. package/src/theme.ts +263 -0
  104. package/src/tree.ts +169 -0
  105. package/src/types.ts +523 -0
  106. package/tsconfig.json +4 -7
  107. package/docs/local-demo.md +0 -28
package/README.md CHANGED
@@ -1,71 +1,121 @@
1
- # valyrianjs-terminal
1
+ # ValyrianJS Terminal
2
2
 
3
- Adapter terminal-first para `valyrian.js`. Sirve para renderizar pantallas de texto con primitivas propias y, si lo necesitas, montar sesiones interactivas sobre `stdin` y `stdout`.
3
+ Terminal UI primitives and runtime helpers for Valyrian.js. Use it to render terminal trees as plain text, or mount an interactive session that handles focus, keyboard input, mouse input, clipboard integration, and terminal output.
4
4
 
5
- ## Que resuelve
5
+ This package is for developers building text-based interfaces with Valyrian components. It focuses on terminal rendering and interaction, so your app can compose its own routing, commands, data loading, persistence, and application state around a clear terminal UI layer.
6
6
 
7
- - layout terminal-first con `Screen`, `Box`, `View`, `Text`, `Table`, `Row` y `Td`
8
- - primitivas interactivas con `Input`, `Button`, `List` y `ScrollView`
9
- - render estatico a texto con `renderTerminal()`
10
- - runtime interactivo con `mountTerminal()`
11
-
12
- ## Instalacion
7
+ ## Install
13
8
 
14
9
  ```bash
15
- npm install valyrianjs-terminal valyrian.js
10
+ npm install @valyrianjs/terminal valyrian.js
16
11
  ```
17
12
 
18
- ## Elige el entrypoint correcto
19
-
20
- - Usa `renderTerminal()` para snapshots, pruebas o salidas no interactivas.
21
- - Usa `mountTerminal()` cuando necesitas foco, teclado, mouse, clipboard o escritura a `stdout`.
22
-
23
- ## Ejemplo minimo
24
-
25
- ```tsx
26
- /** @jsx v */
27
- /** @jsxFrag v.fragment */
28
-
29
- import { v } from "valyrian.js";
30
- import { Input, Screen, Text, mountTerminal } from "valyrianjs-terminal";
13
+ ## JSX config
31
14
 
32
- const state = { value: "" };
15
+ For TSX, use Valyrian's automatic JSX runtime:
33
16
 
34
- const session = mountTerminal(() => (
35
- <Screen title="Notes">
36
- <Input
37
- id="note"
38
- value={state.value}
39
- placeholder="Write a note"
40
- onchange={(event) => {
41
- state.value = event.value;
42
- }}
43
- />
44
- <Text>{state.value || "Nothing yet"}</Text>
45
- </Screen>
46
- ));
47
-
48
- session.focus("note");
17
+ ```json
18
+ {
19
+ "compilerOptions": {
20
+ "jsx": "react-jsx",
21
+ "jsxImportSource": "valyrian.js"
22
+ }
23
+ }
49
24
  ```
50
25
 
51
- ## Mapa de docs
52
-
53
- - `docs/getting-started.md` - primer flujo completo, de render estatico a sesion interactiva
54
- - `docs/core-concepts.md` - modelo mental: ids, foco, hitboxes, salida plana, ANSI y cleanup
55
- - `docs/interaction-model.md` - comportamiento por primitiva y eventos de interaccion
56
- - `docs/session-runtime.md` - lifecycle de sesion, streams, clipboard, coordenadas y runtime
57
- - `docs/cookbook.md` - recetas cortas para tareas concretas
58
- - `docs/api-reference.md` - referencia de la superficie publica y subpaths publicados
59
- - `docs/local-demo.md` - demo repo-local, no parte del paquete publicado
26
+ ## Smallest useful example
60
27
 
61
- ## Alcance del paquete publicado
28
+ Full example: [`examples/docs/interactive-note.tsx`](./examples/docs/interactive-note.tsx)
62
29
 
63
- El paquete publicado incluye el adapter compilado en `dist/`, esta documentacion y metadatos de soporte. Los archivos de `examples/` viven solo en el repo y no forman parte del paquete distribuido.
30
+ ```tsx
31
+ import { Input, Screen, Text, mountTerminal } from "@valyrianjs/terminal";
64
32
 
65
- ## Desarrollo local
33
+ const state = { value: "" };
66
34
 
67
- ```bash
68
- bun test
69
- bun run typecheck
70
- bun run build
35
+ function App() {
36
+ return (
37
+ <Screen title="Quick note">
38
+ <Text>Type a note. Ctrl+C: exit.</Text>
39
+ <Input
40
+ id="note"
41
+ value={state.value}
42
+ placeholder="Write a note"
43
+ onchange={(event) => {
44
+ state.value = event.value;
45
+ }}
46
+ />
47
+ <Text>{state.value ? `Draft: ${state.value}` : "Draft: empty"}</Text>
48
+ </Screen>
49
+ );
50
+ }
51
+
52
+ if (import.meta.main) {
53
+ const session = mountTerminal(<App />);
54
+ session.focus("note");
55
+ }
71
56
  ```
57
+
58
+ ![Quick note terminal result](./docs/assets/quick-note.svg)
59
+
60
+ Use `renderTerminal()` for deterministic static output. Use `mountTerminal()` for interactive sessions with focus, keyboard input, lifecycle, and repeated renders. Use [Session Runtime](./docs/session-runtime.md) when streams, resize events, clipboard adapters, or mouse input are part of the host integration.
61
+
62
+ ## Docs
63
+
64
+ - [Getting Started](./docs/getting-started.md) - build a first working terminal UI with `main.tsx`, `renderTerminal()`, and `mountTerminal()`.
65
+ - [Core Concepts](./docs/core-concepts.md) - mental model for primitives, state, ids, focus, output, and cleanup.
66
+ - [Cookbook](./docs/cookbook.md) - practical recipes for input, lists, state, Valyrian.js modules, overlays, logs, and full-terminal layout.
67
+ - [Primitive Gallery](./docs/primitive-gallery.md) - choose and compose `Screen`, layout, input, collection, activity, and overlay primitives with complete mini apps.
68
+ - [Interaction Model](./docs/interaction-model.md) - keyboard, focus, event payloads, mouse, and composed interaction behavior.
69
+ - [Session Runtime](./docs/session-runtime.md) - common runtime usage and advanced host integration details.
70
+ - [Valyrian Modules](./docs/valyrian-modules.md) - terminal app patterns for Valyrian.js state, request, query, tasks, forms, persistence, formatting, and utilities.
71
+ - [API Reference](./docs/api-reference.md) - public functions, props, payloads, and session methods.
72
+
73
+ Primitive Gallery maps every public terminal primitive to practical use and complete demos. Try these next:
74
+
75
+ - **Operations Workspace**: `bun examples/docs/primitive-layout-shell.tsx`
76
+ - **Ticket Intake**: `bun examples/docs/primitive-input-workbench.tsx`
77
+ - **Service Explorer**: `bun examples/docs/primitive-data-explorer.tsx`
78
+ - **Activity Console**: `bun examples/docs/primitive-activity-console.tsx`
79
+ - **Command Panel**: `bun examples/docs/primitive-command-panel.tsx`
80
+
81
+ Each example exits with `Ctrl+C`.
82
+
83
+ Valyrian.js modules can power complete terminal apps for state, forms, API calls, async work, formatting, i18n, persistence, and utilities while `@valyrianjs/terminal` renders the interface. See [Valyrian.js modules in terminal apps](./docs/valyrian-modules.md), then run **Operations Workbench** with `bun examples/docs/module-state-workbench.tsx`, **API Operations Dashboard** with `bun examples/docs/module-api-dashboard.tsx`, or **Billing/Settings Wizard** with `bun examples/docs/module-form-workflow.tsx`; each exits with `Ctrl+C`.
84
+
85
+ Core controls use app-like visual defaults from the bundled theme, so buttons, inputs, and lists do not need per-example ASCII chrome. Style examples: [`examples/docs/style-system.tsx`](./examples/docs/style-system.tsx) shows `theme.styles`, `style`, `styles`, and `state` in a runnable ANSI terminal app. Run it with `bun examples/docs/style-system.tsx`, use `Tab`, `Enter`, and `W` to change state, and quit with `Ctrl+C`. Layout examples: [`examples/docs/responsive-split.tsx`](./examples/docs/responsive-split.tsx) shows context-aware `Split` sizing, percent, `fr`, and local split breakpoints. For a full-screen pizza builder with responsive `Split` fractions and simulated checkout, run `bun examples/docs/pizza-builder.tsx`, try `Up/Down`, `Space`, `Enter`, `R`, and `C`, and quit with `Ctrl+C`; or open [`examples/docs/pizza-builder.tsx`](./examples/docs/pizza-builder.tsx).
86
+
87
+ ## Run the docs examples
88
+
89
+ Each docs example runs directly as a small terminal app. Use the command shown, try the listed keys, and quit with `Ctrl+C`.
90
+
91
+ | Example | Run | Try |
92
+ | --- | --- | --- |
93
+ | [`examples/docs/hello.tsx`](./examples/docs/hello.tsx) | `bun examples/docs/hello.tsx` | `Enter`, `Ctrl+C` |
94
+ | [`examples/docs/interactive-note.tsx`](./examples/docs/interactive-note.tsx) | `bun examples/docs/interactive-note.tsx` | type a note, `Enter`, `Ctrl+C` |
95
+ | [`examples/docs/component-composition.tsx`](./examples/docs/component-composition.tsx) | `bun examples/docs/component-composition.tsx` | `N/P`, `Ctrl+C` |
96
+ | [`examples/docs/employees-list.tsx`](./examples/docs/employees-list.tsx) | `bun examples/docs/employees-list.tsx` | `J/K` or arrows, `Ctrl+C` |
97
+ | [`examples/docs/theme-colors.tsx`](./examples/docs/theme-colors.tsx) | `bun examples/docs/theme-colors.tsx` | `Tab`, `Ctrl+C` |
98
+ | [`examples/docs/style-system.tsx`](./examples/docs/style-system.tsx) | `bun examples/docs/style-system.tsx` | `Tab`, `Enter`, `W`, `Ctrl+C` |
99
+ | [`examples/docs/responsive-split.tsx`](./examples/docs/responsive-split.tsx) | `bun examples/docs/responsive-split.tsx` | resize terminal, `Ctrl+C` |
100
+ | [`examples/docs/pizza-builder.tsx`](./examples/docs/pizza-builder.tsx) | `bun examples/docs/pizza-builder.tsx` | `Up/Down`, `Space`, `Enter`, `R`, `C`, `Ctrl+C` |
101
+ | [`examples/docs/background-fill.tsx`](./examples/docs/background-fill.tsx) | `bun examples/docs/background-fill.tsx` | `B`, `Ctrl+C` |
102
+ | [`examples/docs/cursor.tsx`](./examples/docs/cursor.tsx) | `bun examples/docs/cursor.tsx` | type text, `C`, `Ctrl+C` |
103
+ | Operations Workspace ([`examples/docs/primitive-layout-shell.tsx`](./examples/docs/primitive-layout-shell.tsx)) | `bun examples/docs/primitive-layout-shell.tsx` | resize terminal, `Ctrl+C` |
104
+ | Ticket Intake ([`examples/docs/primitive-input-workbench.tsx`](./examples/docs/primitive-input-workbench.tsx)) | `bun examples/docs/primitive-input-workbench.tsx` | type summary, `Tab`, `Enter`, `Ctrl+C` |
105
+ | Service Explorer ([`examples/docs/primitive-data-explorer.tsx`](./examples/docs/primitive-data-explorer.tsx)) | `bun examples/docs/primitive-data-explorer.tsx` | `J/K`, `Ctrl+C` |
106
+ | Activity Console ([`examples/docs/primitive-activity-console.tsx`](./examples/docs/primitive-activity-console.tsx)) | `bun examples/docs/primitive-activity-console.tsx` | `Enter`, `Up/Down`, `Ctrl+C` |
107
+ | Command Panel ([`examples/docs/primitive-command-panel.tsx`](./examples/docs/primitive-command-panel.tsx)) | `bun examples/docs/primitive-command-panel.tsx` | type filter, `Up/Down`, `Enter`, `Ctrl+C` |
108
+ | Terminal Command Palette ([`examples/docs/module-valyrian-core.tsx`](./examples/docs/module-valyrian-core.tsx)) | `bun examples/docs/module-valyrian-core.tsx` | `J/K`, `Enter`, `R`, `Ctrl+C` |
109
+ | Live Shift/Ticket Counter ([`examples/docs/module-pulses.tsx`](./examples/docs/module-pulses.tsx)) | `bun examples/docs/module-pulses.tsx` | `A`, `D`, `P`, `R`, `Ctrl+C` |
110
+ | Operations Queue Manager ([`examples/docs/module-flux-store.tsx`](./examples/docs/module-flux-store.tsx)) | `bun examples/docs/module-flux-store.tsx` | `J/K`, `S`, `D`, `B`, `R`, `Ctrl+C` |
111
+ | Service Status Client ([`examples/docs/module-request.tsx`](./examples/docs/module-request.tsx)) | `bun examples/docs/module-request.tsx` | `R`, `E`, `Ctrl+C` |
112
+ | Cached Inventory Browser ([`examples/docs/module-query.tsx`](./examples/docs/module-query.tsx)) | `bun examples/docs/module-query.tsx` | `F`, `I`, `J/K`, `Ctrl+C` |
113
+ | Background Maintenance Runner ([`examples/docs/module-tasks.tsx`](./examples/docs/module-tasks.tsx)) | `bun examples/docs/module-tasks.tsx` | `R`, `C`, `X`, `Z`, `Ctrl+C` |
114
+ | Profile Editor ([`examples/docs/module-forms.tsx`](./examples/docs/module-forms.tsx)) | `bun examples/docs/module-forms.tsx` | type fields, `Enter`, `R`, `Ctrl+C` |
115
+ | Persistent Workspace Settings ([`examples/docs/module-native-store.tsx`](./examples/docs/module-native-store.tsx)) | `bun examples/docs/module-native-store.tsx` | type workspace, `Enter`, `R`, `Ctrl+C` |
116
+ | Bilingual Support Console ([`examples/docs/module-translate.tsx`](./examples/docs/module-translate.tsx)) | `bun examples/docs/module-translate.tsx` | `L`, `J/K`, `F`, `Ctrl+C` |
117
+ | Invoice Calculator ([`examples/docs/module-money.tsx`](./examples/docs/module-money.tsx)) | `bun examples/docs/module-money.tsx` | `J/K`, `+/-`, `D`, `L`, `Ctrl+C` |
118
+ | Account Data Inspector ([`examples/docs/module-utils.tsx`](./examples/docs/module-utils.tsx)) | `bun examples/docs/module-utils.tsx` | `J/K`, `F`, `R`, `Ctrl+C` |
119
+ | Operations Workbench ([`examples/docs/module-state-workbench.tsx`](./examples/docs/module-state-workbench.tsx)) | `bun examples/docs/module-state-workbench.tsx` | `J/K`, `Enter`, `D`, `B`, `R`, `Ctrl+C` |
120
+ | API Operations Dashboard ([`examples/docs/module-api-dashboard.tsx`](./examples/docs/module-api-dashboard.tsx)) | `bun examples/docs/module-api-dashboard.tsx` | `R`, `E`, `I`, `T`, `C`, `Ctrl+C` |
121
+ | Billing/Settings Wizard ([`examples/docs/module-form-workflow.tsx`](./examples/docs/module-form-workflow.tsx)) | `bun examples/docs/module-form-workflow.tsx` | `N`, `L`, `S/Enter`, `R`, `X`, `Ctrl+C` |
package/dist/ansi.d.ts CHANGED
@@ -1,6 +1,22 @@
1
- import type { CursorPosition, TerminalFrame, TerminalStyleSpan } from "./types.js";
1
+ import type { CursorPosition, TerminalFrame, TerminalStyleSpan, TerminalTheme } from "./types.js";
2
+ export declare const ANSI_ENTER_ALTERNATE_SCREEN = "\u001B[?1049h";
3
+ export declare const ANSI_EXIT_ALTERNATE_SCREEN = "\u001B[?1049l";
4
+ export declare const ANSI_HIDE_CURSOR = "\u001B[?25l";
5
+ export declare const ANSI_SHOW_CURSOR = "\u001B[?25h";
6
+ type AnsiFrameOptions = {
7
+ showCursor?: boolean;
8
+ showCursorWhenFrameHasCursor?: boolean;
9
+ theme?: TerminalTheme;
10
+ };
11
+ export type AnsiFrameDiffResult = {
12
+ changedLineIndexes: number[];
13
+ outputChunk: string;
14
+ restoresCursor: boolean;
15
+ };
2
16
  export declare function stripCursorMarker(value: string): string;
3
- export declare function formatPlainFrame(frame: TerminalFrame): string;
4
- export declare function toAnsiFrame(lines: string[], cursor: CursorPosition | null, spans?: TerminalStyleSpan[]): string;
5
- export declare function createAnsiDiffWriter(): (lines: string[], cursor: CursorPosition | null, spans?: TerminalStyleSpan[]) => string;
17
+ export declare function formatPlainFrame(frame: TerminalFrame, options?: AnsiFrameOptions): string;
18
+ export declare function toAnsiFrame(lines: string[], cursor: CursorPosition | null, spans?: TerminalStyleSpan[], options?: AnsiFrameOptions): string;
19
+ export declare function createAnsiFrameDiff(previousAnsiLines: string[], nextAnsiLines: string[], cursor: CursorPosition | null, options?: AnsiFrameOptions): AnsiFrameDiffResult;
20
+ export declare function createAnsiDiffWriter(options?: AnsiFrameOptions): (lines: string[], cursor: CursorPosition | null, spans?: TerminalStyleSpan[]) => string;
21
+ export {};
6
22
  //# sourceMappingURL=ansi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../src/ansi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,UAE9C;AA6FD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,UAEpD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,KAAK,GAAE,iBAAiB,EAAO,UAI1G;AAED,wBAAgB,oBAAoB,KAGP,OAAO,MAAM,EAAE,EAAE,QAAQ,cAAc,GAAG,IAAI,EAAE,QAAO,iBAAiB,EAAO,YAe3G"}
1
+ {"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../src/ansi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAElG,eAAO,MAAM,2BAA2B,kBAAkB,CAAC;AAC3D,eAAO,MAAM,0BAA0B,kBAAkB,CAAC;AAC1D,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAE9C,KAAK,gBAAgB,GAAG;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,UAE9C;AAiMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,GAAE,gBAAqB,UAEpF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,KAAK,GAAE,iBAAiB,EAAO,EAAE,OAAO,GAAE,gBAAqB,UAK1I;AAED,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,OAAO,GAAE,gBAAqB,GAC7B,mBAAmB,CA0BrB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,gBAAqB,IAGtC,OAAO,MAAM,EAAE,EAAE,QAAQ,cAAc,GAAG,IAAI,EAAE,QAAO,iBAAiB,EAAO,YAM3G"}
package/dist/ansi.js CHANGED
@@ -1,41 +1,91 @@
1
+ import { resolveTerminalStyle, resolveTerminalStyleToken } from "./theme.js";
2
+ export const ANSI_ENTER_ALTERNATE_SCREEN = "\u001b[?1049h";
3
+ export const ANSI_EXIT_ALTERNATE_SCREEN = "\u001b[?1049l";
4
+ export const ANSI_HIDE_CURSOR = "\u001b[?25l";
5
+ export const ANSI_SHOW_CURSOR = "\u001b[?25h";
1
6
  export function stripCursorMarker(value) {
2
7
  return value.replaceAll("|", "");
3
8
  }
9
+ function spanLayerPriority(span) {
10
+ return span.kind === "focus" ? 0 : 1;
11
+ }
4
12
  function lineSpans(spans, y) {
5
- return spans.filter((span) => span.y === y).sort((a, b) => a.x1 - b.x1);
13
+ return spans
14
+ .map((span, index) => ({ span, index }))
15
+ .filter(({ span }) => span.y === y)
16
+ .sort((a, b) => a.span.x1 - b.span.x1 || spanLayerPriority(a.span) - spanLayerPriority(b.span) || b.span.x2 - a.span.x2 || a.index - b.index)
17
+ .map(({ span }) => span);
6
18
  }
7
- function spanAnsiOpen(kind) {
8
- if (kind === "selection" || kind === "focus" || kind === "current-row") {
9
- return "\u001b[7m";
10
- }
11
- if (kind === "hover") {
12
- return "\u001b[4m";
19
+ function tokenStyle(token) {
20
+ if (!token)
21
+ return undefined;
22
+ return token.style || token.color || token.background
23
+ ? { ...token.style, color: token.color ?? token.style?.color, background: token.background ?? token.style?.background }
24
+ : undefined;
25
+ }
26
+ function styleAnsiOpen(style) {
27
+ return `${colorAnsi(style?.color, false)}${colorAnsi(style?.background, true)}`;
28
+ }
29
+ function styleAnsiClose(style) {
30
+ return `${style?.background ? "\u001b[49m" : ""}${style?.color ? "\u001b[39m" : ""}`;
31
+ }
32
+ function spanAnsiOpen(span, theme) {
33
+ const { kind, style } = span;
34
+ if (style)
35
+ return styleAnsiOpen(style);
36
+ const token = resolveTerminalStyleToken(kind, theme);
37
+ const resolvedTokenStyle = tokenStyle(token);
38
+ if (resolvedTokenStyle)
39
+ return styleAnsiOpen(resolvedTokenStyle);
40
+ if (token?.ansiOpen)
41
+ return token.ansiOpen;
42
+ try {
43
+ return styleAnsiOpen(resolveTerminalStyle(kind, theme));
13
44
  }
14
- if (kind === "highlight") {
15
- return "\u001b[1m";
45
+ catch {
46
+ return "";
16
47
  }
17
- return "";
18
48
  }
19
- function spanAnsiClose(kind) {
20
- if (kind === "selection" || kind === "focus" || kind === "current-row") {
21
- return "\u001b[27m";
49
+ function spanAnsiClose(span, theme) {
50
+ const { kind, style } = span;
51
+ if (style)
52
+ return styleAnsiClose(style);
53
+ const token = resolveTerminalStyleToken(kind, theme);
54
+ const resolvedTokenStyle = tokenStyle(token);
55
+ if (resolvedTokenStyle)
56
+ return styleAnsiClose(resolvedTokenStyle);
57
+ if (token?.ansiClose)
58
+ return token.ansiClose;
59
+ try {
60
+ return styleAnsiClose(resolveTerminalStyle(kind, theme));
22
61
  }
23
- if (kind === "hover") {
24
- return "\u001b[24m";
62
+ catch {
63
+ return "";
25
64
  }
26
- if (kind === "highlight") {
27
- return "\u001b[22m";
65
+ }
66
+ function colorAnsi(value, background) {
67
+ if (!value)
68
+ return "";
69
+ const hex = value.startsWith("#") ? value.slice(1) : "";
70
+ const full = hex.length === 3
71
+ ? hex.split("").map((part) => part + part).join("")
72
+ : hex;
73
+ if (!/^[0-9a-fA-F]{6}$/.test(full)) {
74
+ throw new RangeError(`Unsupported terminal style color: ${value}`);
28
75
  }
29
- return "";
76
+ const red = Number.parseInt(full.slice(0, 2), 16);
77
+ const green = Number.parseInt(full.slice(2, 4), 16);
78
+ const blue = Number.parseInt(full.slice(4, 6), 16);
79
+ return `\u001b[${background ? 48 : 38};2;${red};${green};${blue}m`;
30
80
  }
31
- function renderAnsiLine(line, spans, y) {
81
+ function renderAnsiLine(line, spans, y, theme) {
32
82
  let output = "";
33
83
  let visibleColumn = 1;
34
84
  const rowSpans = lineSpans(spans, y);
35
85
  let activeSpanIndex = 0;
36
86
  for (let i = 0; i < line.length; i += 1) {
37
87
  while (rowSpans[activeSpanIndex]?.x1 === visibleColumn) {
38
- output += spanAnsiOpen(rowSpans[activeSpanIndex].kind);
88
+ output += spanAnsiOpen(rowSpans[activeSpanIndex], theme);
39
89
  activeSpanIndex += 1;
40
90
  }
41
91
  const char = line[i];
@@ -46,60 +96,134 @@ function renderAnsiLine(line, spans, y) {
46
96
  visibleColumn += 1;
47
97
  for (const span of rowSpans) {
48
98
  if (span.x2 === visibleColumn) {
49
- output += spanAnsiClose(span.kind);
99
+ if (span.kind !== "focus") {
100
+ output += spanAnsiClose(span, theme);
101
+ }
102
+ }
103
+ }
104
+ for (const span of rowSpans) {
105
+ if (span.x2 === visibleColumn && span.kind === "focus") {
106
+ output += spanAnsiClose(span, theme);
107
+ }
108
+ }
109
+ }
110
+ for (const span of rowSpans) {
111
+ if (span.x1 < visibleColumn && span.x2 > visibleColumn) {
112
+ if (span.kind !== "focus") {
113
+ output += spanAnsiClose(span, theme);
50
114
  }
51
115
  }
52
116
  }
117
+ for (const span of rowSpans) {
118
+ if (span.x1 < visibleColumn && span.x2 > visibleColumn && span.kind === "focus") {
119
+ output += spanAnsiClose(span, theme);
120
+ }
121
+ }
53
122
  return output;
54
123
  }
55
- function formatPlainLine(line, spans, y) {
124
+ function hasPlainAffordance(token) {
125
+ return typeof token !== "undefined" && ("plainPrefix" in token || "plainSuffix" in token);
126
+ }
127
+ function formatPlainLine(line, spans, y, theme) {
56
128
  let output = "";
57
129
  let visibleColumn = 1;
58
- const rowSpans = lineSpans(spans, y).filter((span) => span.kind === "selection");
130
+ const firstFallbackFocusY = lineSpans(spans, y).some((span) => {
131
+ const token = resolveTerminalStyleToken(span.kind, theme);
132
+ return span.kind === "focus" && !hasPlainAffordance(token) && span.x1 === 1;
133
+ })
134
+ ? Math.min(...spans.filter((span) => span.kind === "focus" && span.x1 === 1).map((span) => span.y))
135
+ : null;
136
+ const rowSpans = lineSpans(spans, y).map((span) => {
137
+ const token = resolveTerminalStyleToken(span.kind, theme);
138
+ const fallbackFocusMarker = span.kind === "focus"
139
+ && !token?.plainPrefix
140
+ && !token?.plainSuffix
141
+ && span.x1 === 1
142
+ && y === firstFallbackFocusY
143
+ && span.x2 <= line.length + 1
144
+ && !line.trimStart().startsWith(">")
145
+ && !line.includes("|")
146
+ && !line.includes("[>");
147
+ return {
148
+ ...span,
149
+ x2: fallbackFocusMarker ? Math.min(span.x2, line.trimEnd().length + 1) : span.x2,
150
+ plainPrefix: token?.plainPrefix ?? span.style?.plainPrefix ?? (fallbackFocusMarker ? ">" : ""),
151
+ plainSuffix: token?.plainSuffix ?? span.style?.plainSuffix ?? (fallbackFocusMarker ? "<" : "")
152
+ };
153
+ }).filter((span) => Boolean(span.plainPrefix || span.plainSuffix));
59
154
  for (let i = 0; i < line.length; i += 1) {
60
155
  const char = line[i];
61
156
  if (char === "|") {
62
157
  output += char;
63
158
  continue;
64
159
  }
65
- if (rowSpans.some((span) => span.x1 === visibleColumn)) {
66
- output += "[";
160
+ for (const span of rowSpans) {
161
+ if (span.x1 === visibleColumn) {
162
+ output += span.plainPrefix;
163
+ }
67
164
  }
68
165
  output += char;
69
166
  visibleColumn += 1;
70
- if (rowSpans.some((span) => span.x2 === visibleColumn)) {
71
- output += "]";
167
+ for (const span of rowSpans) {
168
+ if (span.x2 === visibleColumn) {
169
+ if (span.kind !== "focus") {
170
+ output += span.plainSuffix;
171
+ }
172
+ }
173
+ }
174
+ for (const span of rowSpans) {
175
+ if (span.x2 === visibleColumn && span.kind === "focus") {
176
+ output += span.plainSuffix;
177
+ }
72
178
  }
73
179
  }
74
- if (rowSpans.some((span) => span.x1 === visibleColumn)) {
75
- output += "[]";
180
+ for (const span of rowSpans) {
181
+ if (span.x1 === visibleColumn) {
182
+ output += span.plainPrefix + span.plainSuffix;
183
+ }
76
184
  }
77
185
  return output;
78
186
  }
79
- export function formatPlainFrame(frame) {
80
- return frame.lines.map((line, index) => formatPlainLine(line, frame.spans, index + 1)).join("\n");
187
+ export function formatPlainFrame(frame, options = {}) {
188
+ return frame.lines.map((line, index) => formatPlainLine(line, frame.spans, index + 1, options.theme)).join("\n");
81
189
  }
82
- export function toAnsiFrame(lines, cursor, spans = []) {
83
- const ansiLines = lines.map((line, index) => renderAnsiLine(line, spans, index + 1));
84
- const cursorCode = cursor ? `\u001b[${cursor.y};${cursor.x}H\u001b[?25h` : "\u001b[?25h";
190
+ export function toAnsiFrame(lines, cursor, spans = [], options = {}) {
191
+ const ansiLines = lines.map((line, index) => `${renderAnsiLine(line, spans, index + 1, options.theme)}\u001b[K`);
192
+ const showCursor = options.showCursor !== false || (options.showCursorWhenFrameHasCursor === true && cursor);
193
+ const cursorCode = cursor ? `\u001b[${cursor.y};${cursor.x}H${showCursor ? ANSI_SHOW_CURSOR : ""}` : showCursor ? ANSI_SHOW_CURSOR : "";
85
194
  return `\u001b[?25l\u001b[H${ansiLines.join("\n")}${cursorCode}`;
86
195
  }
87
- export function createAnsiDiffWriter() {
196
+ export function createAnsiFrameDiff(previousAnsiLines, nextAnsiLines, cursor, options = {}) {
197
+ const changedLineIndexes = [];
198
+ const writes = ["\u001b[?25l"];
199
+ const maxLines = Math.max(previousAnsiLines.length, nextAnsiLines.length);
200
+ for (let i = 0; i < maxLines; i += 1) {
201
+ const nextLine = nextAnsiLines[i] || "";
202
+ const prevLine = previousAnsiLines[i] || "";
203
+ if (nextLine !== prevLine) {
204
+ changedLineIndexes.push(i);
205
+ writes.push(`\u001b[${i + 1};1H${nextLine}\u001b[0m\u001b[K`);
206
+ }
207
+ }
208
+ if (cursor) {
209
+ writes.push(`\u001b[${cursor.y};${cursor.x}H`);
210
+ }
211
+ if (options.showCursor !== false || (options.showCursorWhenFrameHasCursor === true && cursor)) {
212
+ writes.push(ANSI_SHOW_CURSOR);
213
+ }
214
+ return {
215
+ changedLineIndexes,
216
+ outputChunk: writes.join(""),
217
+ restoresCursor: Boolean(cursor)
218
+ };
219
+ }
220
+ export function createAnsiDiffWriter(options = {}) {
88
221
  let previousAnsiLines = [];
89
222
  return function toAnsiDiff(lines, cursor, spans = []) {
90
- const ansiLines = lines.map((line, index) => renderAnsiLine(line, spans, index + 1));
91
- const writes = ["\u001b[?25l"];
92
- const maxLines = Math.max(previousAnsiLines.length, ansiLines.length);
93
- for (let i = 0; i < maxLines; i += 1) {
94
- const nextLine = ansiLines[i] || "";
95
- const prevLine = previousAnsiLines[i] || "";
96
- if (nextLine !== prevLine) {
97
- writes.push(`\u001b[${i + 1};1H${nextLine}\u001b[0m\u001b[K`);
98
- }
99
- }
100
- writes.push(cursor ? `\u001b[${cursor.y};${cursor.x}H\u001b[?25h` : "\u001b[?25h");
223
+ const ansiLines = lines.map((line, index) => renderAnsiLine(line, spans, index + 1, options.theme));
224
+ const diff = createAnsiFrameDiff(previousAnsiLines, ansiLines, cursor, options);
101
225
  previousAnsiLines = ansiLines.slice();
102
- return writes.join("");
226
+ return diff.outputChunk;
103
227
  };
104
228
  }
105
229
  //# sourceMappingURL=ansi.js.map
package/dist/ansi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ansi.js","sourceRoot":"","sources":["../src/ansi.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,KAA0B,EAAE,CAAS;IACtD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QACvE,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QACvE,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,KAA0B,EAAE,CAAS;IACzE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,aAAa,EAAE,CAAC;YACvD,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC;YACvD,eAAe,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,IAAI,IAAI,CAAC;QACf,aAAa,IAAI,CAAC,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;gBAC9B,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,KAA0B,EAAE,CAAS;IAC1E,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IAEjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,IAAI,CAAC;QACf,aAAa,IAAI,CAAC,CAAC;QAEnB,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACnD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAe,EAAE,MAA6B,EAAE,QAA6B,EAAE;IACzG,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;IACzF,OAAO,sBAAsB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,IAAI,iBAAiB,GAAa,EAAE,CAAC;IAErC,OAAO,SAAS,UAAU,CAAC,KAAe,EAAE,MAA6B,EAAE,QAA6B,EAAE;QACxG,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,MAAM,GAAa,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,QAAQ,mBAAmB,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACnF,iBAAiB,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ansi.js","sourceRoot":"","sources":["../src/ansi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface EditorCursor {
2
+ line: number;
3
+ column: number;
4
+ }
5
+ export interface EditorState {
6
+ value: string;
7
+ lines: string[];
8
+ cursor: EditorCursor;
9
+ desiredColumn?: number;
10
+ }
11
+ export type EditorCursorDirection = "left" | "right" | "up" | "down" | "home" | "end";
12
+ export interface EditorOperationResult {
13
+ value: string;
14
+ state: EditorState;
15
+ }
16
+ export declare function createEditorState(value: string, cursor?: EditorCursor, desiredColumn?: number): EditorState;
17
+ export declare function normalizeEditorState(value: string, cursor?: EditorCursor, desiredColumn?: number): EditorState;
18
+ export declare function insertEditorText(value: string, state: EditorState, text: string): EditorOperationResult;
19
+ export declare function removeEditorBackward(value: string, state: EditorState): EditorOperationResult;
20
+ export declare function removeEditorForward(value: string, state: EditorState): EditorOperationResult;
21
+ export declare function moveEditorCursor(value: string, state: EditorState, direction: EditorCursorDirection): EditorState;
22
+ //# sourceMappingURL=editor-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-state.d.ts","sourceRoot":"","sources":["../src/editor-state.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAE3G;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAY9G;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAgBvG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,qBAAqB,CAmB7F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,qBAAqB,CAY5F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,GAAG,WAAW,CAiDjH"}