@valyrianjs/terminal 0.1.1 → 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 +296 -201
  78. package/docs/core-concepts.md +143 -55
  79. package/docs/getting-started.md +209 -90
  80. package/docs/interaction-model.md +86 -52
  81. package/docs/primitive-gallery.md +365 -0
  82. package/docs/session-runtime.md +131 -362
  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
- Terminal-first adapter for `valyrian.js`. It lets you render text UIs with its own primitives and, when needed, mount interactive sessions on top of `stdin` and `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
- ## What It Solves
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
- - terminal-first layout with `Screen`, `Box`, `View`, `Text`, `Table`, `Row`, and `Td`
8
- - interactive primitives with `Input`, `Button`, `List`, and `ScrollView`
9
- - static text rendering with `renderTerminal()`
10
- - interactive runtime with `mountTerminal()`
11
-
12
- ## Installation
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
- ## Choose the Right Entrypoint
19
-
20
- - Use `renderTerminal()` for snapshots, tests, or non-interactive output.
21
- - Use `mountTerminal()` when you need focus, keyboard, mouse, clipboard, or writes to `stdout`.
22
-
23
- ## Minimal Example
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
- ## Docs Map
52
-
53
- - `docs/getting-started.md` - first complete flow, from static rendering to an interactive session
54
- - `docs/core-concepts.md` - mental model: ids, focus, hitboxes, plain output, ANSI, and cleanup
55
- - `docs/interaction-model.md` - behavior of each primitive and interaction events
56
- - `docs/session-runtime.md` - session lifecycle, streams, clipboard, coordinates, and runtime
57
- - `docs/cookbook.md` - short recipes for concrete tasks
58
- - `docs/api-reference.md` - reference for the public surface and published subpaths
59
- - `docs/local-demo.md` - repo-local demo, not part of the published package
26
+ ## Smallest useful example
60
27
 
61
- ## Published Package Scope
28
+ Full example: [`examples/docs/interactive-note.tsx`](./examples/docs/interactive-note.tsx)
62
29
 
63
- The published package includes the compiled adapter in `dist/`, this documentation, and supporting metadata. Files in `examples/` live only in the repo and are not part of the distributed package.
30
+ ```tsx
31
+ import { Input, Screen, Text, mountTerminal } from "@valyrianjs/terminal";
64
32
 
65
- ## Local Development
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":"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"}
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"}