zard-cli 1.0.0-beta.98 → 1.0.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.
Files changed (253) hide show
  1. package/README.md +92 -36
  2. package/commands/add/component-installer.d.ts +3 -0
  3. package/commands/add/component-installer.d.ts.map +1 -1
  4. package/commands/add/component-installer.js +10 -4
  5. package/commands/add/component-installer.js.map +1 -1
  6. package/commands/add/component-selector.d.ts +6 -0
  7. package/commands/add/component-selector.d.ts.map +1 -1
  8. package/commands/add/component-selector.js +9 -27
  9. package/commands/add/component-selector.js.map +1 -1
  10. package/commands/add/dark-mode-setup.d.ts.map +1 -1
  11. package/commands/add/dark-mode-setup.js +2 -11
  12. package/commands/add/dark-mode-setup.js.map +1 -1
  13. package/commands/add/dependency-resolver.d.ts +8 -1
  14. package/commands/add/dependency-resolver.d.ts.map +1 -1
  15. package/commands/add/dependency-resolver.js +87 -16
  16. package/commands/add/dependency-resolver.js.map +1 -1
  17. package/commands/add/index.d.ts.map +1 -1
  18. package/commands/add/index.js +128 -96
  19. package/commands/add/index.js.map +1 -1
  20. package/commands/add/stylesheet-setup.d.ts +3 -0
  21. package/commands/add/stylesheet-setup.d.ts.map +1 -0
  22. package/commands/add/stylesheet-setup.js +92 -0
  23. package/commands/add/stylesheet-setup.js.map +1 -0
  24. package/commands/add/wizard.d.ts +35 -0
  25. package/commands/add/wizard.d.ts.map +1 -0
  26. package/commands/add/wizard.js +299 -0
  27. package/commands/add/wizard.js.map +1 -0
  28. package/commands/init/config-prompter.d.ts +55 -3
  29. package/commands/init/config-prompter.d.ts.map +1 -1
  30. package/commands/init/config-prompter.js +92 -74
  31. package/commands/init/config-prompter.js.map +1 -1
  32. package/commands/init/dependencies.d.ts +1 -8
  33. package/commands/init/dependencies.d.ts.map +1 -1
  34. package/commands/init/dependencies.js +51 -25
  35. package/commands/init/dependencies.js.map +1 -1
  36. package/commands/init/index.d.ts.map +1 -1
  37. package/commands/init/index.js +147 -81
  38. package/commands/init/index.js.map +1 -1
  39. package/commands/init/project-kind.d.ts +82 -0
  40. package/commands/init/project-kind.d.ts.map +1 -0
  41. package/commands/init/project-kind.js +166 -0
  42. package/commands/init/project-kind.js.map +1 -0
  43. package/commands/init/steps.d.ts +15 -0
  44. package/commands/init/steps.d.ts.map +1 -0
  45. package/commands/init/steps.js +154 -0
  46. package/commands/init/steps.js.map +1 -0
  47. package/commands/init/tailwind-setup.d.ts +9 -2
  48. package/commands/init/tailwind-setup.d.ts.map +1 -1
  49. package/commands/init/tailwind-setup.js +33 -12
  50. package/commands/init/tailwind-setup.js.map +1 -1
  51. package/commands/init/tsconfig-updater.d.ts +8 -1
  52. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  53. package/commands/init/tsconfig-updater.js +30 -11
  54. package/commands/init/tsconfig-updater.js.map +1 -1
  55. package/commands/init/update-angular-config.d.ts.map +1 -1
  56. package/commands/init/update-angular-config.js +28 -50
  57. package/commands/init/update-angular-config.js.map +1 -1
  58. package/commands/init/vite-setup.d.ts +11 -0
  59. package/commands/init/vite-setup.d.ts.map +1 -0
  60. package/commands/init/vite-setup.js +61 -0
  61. package/commands/init/vite-setup.js.map +1 -0
  62. package/commands/init/wizard.d.ts +30 -0
  63. package/commands/init/wizard.d.ts.map +1 -0
  64. package/commands/init/wizard.js +560 -0
  65. package/commands/init/wizard.js.map +1 -0
  66. package/constants/app.constants.d.ts +17 -0
  67. package/constants/app.constants.d.ts.map +1 -1
  68. package/constants/app.constants.js +39 -16
  69. package/constants/app.constants.js.map +1 -1
  70. package/core/icons/families.d.ts +38 -0
  71. package/core/icons/families.d.ts.map +1 -0
  72. package/core/icons/families.js +26 -0
  73. package/core/icons/families.js.map +1 -0
  74. package/core/icons/icon-map.d.ts +24 -0
  75. package/core/icons/icon-map.d.ts.map +1 -0
  76. package/core/icons/icon-map.js +141 -0
  77. package/core/icons/icon-map.js.map +1 -0
  78. package/core/icons/index.d.ts +107 -0
  79. package/core/icons/index.d.ts.map +1 -0
  80. package/core/icons/index.js +183 -0
  81. package/core/icons/index.js.map +1 -0
  82. package/core/registry/registry-data.d.ts.map +1 -1
  83. package/core/registry/registry-data.js +482 -37
  84. package/core/registry/registry-data.js.map +1 -1
  85. package/core/themes/theme-definitions.d.ts.map +1 -1
  86. package/core/themes/theme-definitions.js +61 -72
  87. package/core/themes/theme-definitions.js.map +1 -1
  88. package/index.js +6 -3
  89. package/index.js.map +1 -1
  90. package/package.json +6 -11
  91. package/ui/blocks.d.ts +71 -0
  92. package/ui/blocks.d.ts.map +1 -0
  93. package/ui/blocks.js +116 -0
  94. package/ui/blocks.js.map +1 -0
  95. package/ui/brand.d.ts +14 -0
  96. package/ui/brand.d.ts.map +1 -0
  97. package/ui/brand.js +35 -0
  98. package/ui/brand.js.map +1 -0
  99. package/ui/engine/animation/index.d.ts +38 -0
  100. package/ui/engine/animation/index.d.ts.map +1 -0
  101. package/ui/engine/animation/index.js +102 -0
  102. package/ui/engine/animation/index.js.map +1 -0
  103. package/ui/engine/ansi/index.d.ts +51 -0
  104. package/ui/engine/ansi/index.d.ts.map +1 -0
  105. package/ui/engine/ansi/index.js +116 -0
  106. package/ui/engine/ansi/index.js.map +1 -0
  107. package/ui/engine/components/index.d.ts +211 -0
  108. package/ui/engine/components/index.d.ts.map +1 -0
  109. package/ui/engine/components/index.js +109 -0
  110. package/ui/engine/components/index.js.map +1 -0
  111. package/ui/engine/cursor/index.d.ts +16 -0
  112. package/ui/engine/cursor/index.d.ts.map +1 -0
  113. package/ui/engine/cursor/index.js +40 -0
  114. package/ui/engine/cursor/index.js.map +1 -0
  115. package/ui/engine/diff/index.d.ts +26 -0
  116. package/ui/engine/diff/index.d.ts.map +1 -0
  117. package/ui/engine/diff/index.js +56 -0
  118. package/ui/engine/diff/index.js.map +1 -0
  119. package/ui/engine/events/index.d.ts +24 -0
  120. package/ui/engine/events/index.d.ts.map +1 -0
  121. package/ui/engine/events/index.js +60 -0
  122. package/ui/engine/events/index.js.map +1 -0
  123. package/ui/engine/focus/index.d.ts +25 -0
  124. package/ui/engine/focus/index.d.ts.map +1 -0
  125. package/ui/engine/focus/index.js +77 -0
  126. package/ui/engine/focus/index.js.map +1 -0
  127. package/ui/engine/frame/index.d.ts +48 -0
  128. package/ui/engine/frame/index.d.ts.map +1 -0
  129. package/ui/engine/frame/index.js +0 -0
  130. package/ui/engine/frame/index.js.map +1 -0
  131. package/ui/engine/index.d.ts +28 -0
  132. package/ui/engine/index.d.ts.map +1 -0
  133. package/ui/engine/index.js +28 -0
  134. package/ui/engine/index.js.map +1 -0
  135. package/ui/engine/input/index.d.ts +36 -0
  136. package/ui/engine/input/index.d.ts.map +1 -0
  137. package/ui/engine/input/index.js +224 -0
  138. package/ui/engine/input/index.js.map +1 -0
  139. package/ui/engine/layout/index.d.ts +42 -0
  140. package/ui/engine/layout/index.d.ts.map +1 -0
  141. package/ui/engine/layout/index.js +241 -0
  142. package/ui/engine/layout/index.js.map +1 -0
  143. package/ui/engine/renderer/index.d.ts +43 -0
  144. package/ui/engine/renderer/index.d.ts.map +1 -0
  145. package/ui/engine/renderer/index.js +619 -0
  146. package/ui/engine/renderer/index.js.map +1 -0
  147. package/ui/engine/scheduler/index.d.ts +22 -0
  148. package/ui/engine/scheduler/index.d.ts.map +1 -0
  149. package/ui/engine/scheduler/index.js +77 -0
  150. package/ui/engine/scheduler/index.js.map +1 -0
  151. package/ui/engine/screen/index.d.ts +39 -0
  152. package/ui/engine/screen/index.d.ts.map +1 -0
  153. package/ui/engine/screen/index.js +255 -0
  154. package/ui/engine/screen/index.js.map +1 -0
  155. package/ui/engine/terminal/index.d.ts +84 -0
  156. package/ui/engine/terminal/index.d.ts.map +1 -0
  157. package/ui/engine/terminal/index.js +235 -0
  158. package/ui/engine/terminal/index.js.map +1 -0
  159. package/ui/engine/testing/index.d.ts +27 -0
  160. package/ui/engine/testing/index.d.ts.map +1 -0
  161. package/ui/engine/testing/index.js +63 -0
  162. package/ui/engine/testing/index.js.map +1 -0
  163. package/ui/engine/theme/index.d.ts +26 -0
  164. package/ui/engine/theme/index.d.ts.map +1 -0
  165. package/ui/engine/theme/index.js +128 -0
  166. package/ui/engine/theme/index.js.map +1 -0
  167. package/ui/engine/utils/index.d.ts +12 -0
  168. package/ui/engine/utils/index.d.ts.map +1 -0
  169. package/ui/engine/utils/index.js +143 -0
  170. package/ui/engine/utils/index.js.map +1 -0
  171. package/ui/gate.d.ts +19 -0
  172. package/ui/gate.d.ts.map +1 -0
  173. package/ui/gate.js +36 -0
  174. package/ui/gate.js.map +1 -0
  175. package/ui/index.d.ts +18 -0
  176. package/ui/index.d.ts.map +1 -0
  177. package/ui/index.js +18 -0
  178. package/ui/index.js.map +1 -0
  179. package/ui/log-sink.d.ts +24 -0
  180. package/ui/log-sink.d.ts.map +1 -0
  181. package/ui/log-sink.js +35 -0
  182. package/ui/log-sink.js.map +1 -0
  183. package/ui/output.d.ts +14 -0
  184. package/ui/output.d.ts.map +1 -0
  185. package/ui/output.js +28 -0
  186. package/ui/output.js.map +1 -0
  187. package/ui/report.d.ts +30 -0
  188. package/ui/report.d.ts.map +1 -0
  189. package/ui/report.js +45 -0
  190. package/ui/report.js.map +1 -0
  191. package/ui/runner.d.ts +66 -0
  192. package/ui/runner.d.ts.map +1 -0
  193. package/ui/runner.js +135 -0
  194. package/ui/runner.js.map +1 -0
  195. package/ui/style.d.ts +24 -0
  196. package/ui/style.d.ts.map +1 -0
  197. package/ui/style.js +44 -0
  198. package/ui/style.js.map +1 -0
  199. package/ui/testing/fake-tty.d.ts +26 -0
  200. package/ui/testing/fake-tty.d.ts.map +1 -0
  201. package/ui/testing/fake-tty.js +61 -0
  202. package/ui/testing/fake-tty.js.map +1 -0
  203. package/ui/text-input.d.ts +31 -0
  204. package/ui/text-input.d.ts.map +1 -0
  205. package/ui/text-input.js +89 -0
  206. package/ui/text-input.js.map +1 -0
  207. package/ui/theme.d.ts +10 -0
  208. package/ui/theme.d.ts.map +1 -0
  209. package/ui/theme.js +20 -0
  210. package/ui/theme.js.map +1 -0
  211. package/utils/angular-compat.d.ts +21 -0
  212. package/utils/angular-compat.d.ts.map +1 -0
  213. package/utils/angular-compat.js +52 -0
  214. package/utils/angular-compat.js.map +1 -0
  215. package/utils/config.d.ts +29 -0
  216. package/utils/config.d.ts.map +1 -1
  217. package/utils/config.js +50 -4
  218. package/utils/config.js.map +1 -1
  219. package/utils/errors.d.ts +11 -0
  220. package/utils/errors.d.ts.map +1 -1
  221. package/utils/errors.js +14 -0
  222. package/utils/errors.js.map +1 -1
  223. package/utils/get-project-info.d.ts +29 -0
  224. package/utils/get-project-info.d.ts.map +1 -1
  225. package/utils/get-project-info.js +176 -1
  226. package/utils/get-project-info.js.map +1 -1
  227. package/utils/http-client.d.ts.map +1 -1
  228. package/utils/http-client.js +18 -3
  229. package/utils/http-client.js.map +1 -1
  230. package/utils/icon-catalog.d.ts +34 -0
  231. package/utils/icon-catalog.d.ts.map +1 -0
  232. package/utils/icon-catalog.js +63 -0
  233. package/utils/icon-catalog.js.map +1 -0
  234. package/utils/logger.d.ts +13 -1
  235. package/utils/logger.d.ts.map +1 -1
  236. package/utils/logger.js +95 -15
  237. package/utils/logger.js.map +1 -1
  238. package/utils/package-manager.d.ts +42 -1
  239. package/utils/package-manager.d.ts.map +1 -1
  240. package/utils/package-manager.js +204 -11
  241. package/utils/package-manager.js.map +1 -1
  242. package/utils/registry.d.ts +84 -2
  243. package/utils/registry.d.ts.map +1 -1
  244. package/utils/registry.js +121 -18
  245. package/utils/registry.js.map +1 -1
  246. package/utils/schema-version.d.ts +21 -0
  247. package/utils/schema-version.d.ts.map +1 -0
  248. package/utils/schema-version.js +28 -0
  249. package/utils/schema-version.js.map +1 -0
  250. package/utils/source-file.d.ts +40 -0
  251. package/utils/source-file.d.ts.map +1 -0
  252. package/utils/source-file.js +104 -0
  253. package/utils/source-file.js.map +1 -0
@@ -0,0 +1,235 @@
1
+ /**
2
+ * terminal — the ONE low-level I/O boundary (ADR-0007). Nothing else touches
3
+ * process.stdout/stdin. Detects capabilities and handles raw mode and the
4
+ * alternate screen.
5
+ */
6
+ import { closeSync, openSync } from 'node:fs';
7
+ import { ReadStream, WriteStream } from 'node:tty';
8
+ import { csi } from '../ansi/index.js';
9
+ /**
10
+ * Opens the process's controlling terminal, ignoring the inherited fds.
11
+ *
12
+ * `/dev/tty` is the terminal the process is attached to, whatever the caller did
13
+ * with stdin and stdout. It is the mechanism `fzf`, `less` and `git rebase -i`
14
+ * use to stay interactive inside a pipe; on Windows, `CONIN$`/`CONOUT$` are the
15
+ * equivalent.
16
+ *
17
+ * Returns null when there is no terminal at all — real CI, a cron job, a
18
+ * container with no tty — and that is what keeps the headless path working
19
+ * where it should.
20
+ */
21
+ export function openControllingTerminal() {
22
+ const [inPath, outPath] = process.platform === 'win32' ? ['CONIN$', 'CONOUT$'] : ['/dev/tty', '/dev/tty'];
23
+ let inFd;
24
+ let outFd;
25
+ try {
26
+ inFd = openSync(inPath, 'r');
27
+ outFd = openSync(outPath, 'w');
28
+ const input = new ReadStream(inFd);
29
+ const output = new WriteStream(outFd);
30
+ if (!input.isTTY || !output.isTTY)
31
+ throw new Error('not a terminal');
32
+ // Without this the screen does not reflow when the window is resized: Node
33
+ // only wires SIGWINCH to the `process.stdout` it creates itself.
34
+ // `_refreshSize` is internal, so the optional chaining is deliberate — if it
35
+ // disappears, reflow is lost, not the interface.
36
+ const onResize = () => output._refreshSize?.();
37
+ process.on('SIGWINCH', onResize);
38
+ return {
39
+ input,
40
+ output,
41
+ fromControllingTerminal: true,
42
+ close() {
43
+ process.off('SIGWINCH', onResize);
44
+ for (const stream of [input, output]) {
45
+ try {
46
+ stream.destroy();
47
+ }
48
+ catch {
49
+ /* already closed */
50
+ }
51
+ }
52
+ },
53
+ };
54
+ }
55
+ catch {
56
+ for (const fd of [inFd, outFd]) {
57
+ if (fd === undefined)
58
+ continue;
59
+ try {
60
+ closeSync(fd);
61
+ }
62
+ catch {
63
+ /* nunca chegou a abrir */
64
+ }
65
+ }
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * Where the UI should be drawn.
71
+ *
72
+ * The inherited fds come first: when both are already a terminal, there is
73
+ * nothing to resolve. The rest exists because of `npx` — on POSIX it runs the
74
+ * binary through a shell and the process's stdin arrives as a pipe, which made
75
+ * the CLI conclude nobody could answer and fall back to text mode. The terminal
76
+ * was there the whole time; it was the route to it that had gone missing.
77
+ */
78
+ export function resolveTerminalStreams(stdin = process.stdin, stdout = process.stdout, openTerminal = openControllingTerminal) {
79
+ if (stdin.isTTY && stdout.isTTY) {
80
+ return { input: stdin, output: stdout, fromControllingTerminal: false, close: () => undefined };
81
+ }
82
+ return openTerminal();
83
+ }
84
+ /** Emuladores que fazem 24 bits sem anunciar nada em COLORTERM. */
85
+ const TRUECOLOR_PROGRAMS = new Set([
86
+ 'vscode',
87
+ 'iterm.app',
88
+ 'hyper',
89
+ 'wezterm',
90
+ 'ghostty',
91
+ 'tabby',
92
+ 'rio',
93
+ 'warpterminal',
94
+ ]);
95
+ const TRUECOLOR_TERMS = ['kitty', 'alacritty', 'wezterm', 'contour', 'foot', 'ghostty', 'direct'];
96
+ const FORCE_LEVELS = {
97
+ '0': 'none',
98
+ '1': 'ansi16',
99
+ '2': 'ansi256',
100
+ '3': 'truecolor',
101
+ };
102
+ /**
103
+ * How many colours this terminal accepts.
104
+ *
105
+ * This decides whether the banner's gradient comes out in the theme's exact
106
+ * tones or quantized — and the answer has to be the same on all three platforms,
107
+ * or the same CLI has three appearances. `COLORTERM` alone does not give that:
108
+ * Windows Terminal, VS Code and iTerm all do 24-bit and none of them set it, so
109
+ * falling through to the `ansi16` at the end would treat them as 1990 terminals.
110
+ *
111
+ * The order runs from the most explicit to the most assumed: what the user asked
112
+ * for (NO_COLOR/FORCE_COLOR), what the terminal declares, who it says it is, and
113
+ * only then a guess from the platform.
114
+ */
115
+ export function detectColorLevel(env, isTTY, force, platform = process.platform) {
116
+ if (force)
117
+ return force;
118
+ if (env['NO_COLOR'] !== undefined)
119
+ return 'none';
120
+ const forced = FORCE_LEVELS[(env['FORCE_COLOR'] ?? '').trim()];
121
+ if (forced)
122
+ return forced;
123
+ if (!isTTY)
124
+ return 'none';
125
+ const term = (env['TERM'] ?? '').toLowerCase();
126
+ if (term === 'dumb')
127
+ return 'none';
128
+ const colorterm = (env['COLORTERM'] ?? '').toLowerCase();
129
+ if (colorterm.includes('truecolor') || colorterm.includes('24bit'))
130
+ return 'truecolor';
131
+ // Windows Terminal and the Windows 10+ console both do 24-bit; neither sets
132
+ // COLORTERM or TERM, so without this line the CLI would look poorer exactly
133
+ // where it was developed.
134
+ if (env['WT_SESSION'] !== undefined || env['ConEmuANSI'] === 'ON')
135
+ return 'truecolor';
136
+ const program = (env['TERM_PROGRAM'] ?? '').toLowerCase();
137
+ if (TRUECOLOR_PROGRAMS.has(program))
138
+ return 'truecolor';
139
+ if (TRUECOLOR_TERMS.some(known => term.includes(known)))
140
+ return 'truecolor';
141
+ // macOS Terminal.app announces xterm-256color and means it: 256 colours, no
142
+ // 24-bit. The generic branch below would give the same answer, but saying it
143
+ // here stops a future TERM rule from promoting it by mistake.
144
+ if (program === 'apple_terminal')
145
+ return 'ansi256';
146
+ if (term.includes('256'))
147
+ return 'ansi256';
148
+ // Windows with none of the hints above is still Windows 10 or newer: Node 20,
149
+ // which the CLI requires, runs on nothing older.
150
+ if (platform === 'win32')
151
+ return 'truecolor';
152
+ return 'ansi16';
153
+ }
154
+ export function createTerminal(options = {}) {
155
+ const out = options.stdout ?? process.stdout;
156
+ const inp = options.stdin ?? process.stdin;
157
+ const caps = {
158
+ colors: detectColorLevel(process.env, Boolean(out.isTTY), options.forceColor),
159
+ unicode: (process.env['TERM'] ?? '') !== 'dumb',
160
+ mouse: Boolean(out.isTTY),
161
+ synchronizedOutput: Boolean(out.isTTY),
162
+ isTTY: Boolean(out.isTTY),
163
+ };
164
+ let rawOn = false;
165
+ let altOn = false;
166
+ return {
167
+ caps,
168
+ size() {
169
+ return { cols: out.columns ?? 80, rows: out.rows ?? 24 };
170
+ },
171
+ write(bytes) {
172
+ out.write(bytes);
173
+ },
174
+ writeError(bytes) {
175
+ process.stderr.write(bytes);
176
+ },
177
+ enterRawMode() {
178
+ if (inp.isTTY && !rawOn) {
179
+ inp.setRawMode(true);
180
+ inp.resume();
181
+ rawOn = true;
182
+ }
183
+ },
184
+ exitRawMode() {
185
+ if (inp.isTTY && rawOn) {
186
+ inp.setRawMode(false);
187
+ // enterRawMode's `resume()` holds a live reference in the event loop.
188
+ // Without putting stdin back to paused, the process keeps running after
189
+ // the wizard ends: the screen drops, the summary appears and the shell
190
+ // never comes back — it looks as if the final enter did nothing.
191
+ inp.pause();
192
+ rawOn = false;
193
+ }
194
+ },
195
+ enterAltScreen() {
196
+ if (!altOn) {
197
+ out.write(csi('?1049h'));
198
+ altOn = true;
199
+ }
200
+ },
201
+ exitAltScreen() {
202
+ if (altOn) {
203
+ out.write(csi('?1049l'));
204
+ altOn = false;
205
+ }
206
+ },
207
+ showCursor(visible) {
208
+ out.write(csi(visible ? '?25h' : '?25l'));
209
+ },
210
+ enableMouse(enabled) {
211
+ out.write(csi(enabled ? '?1000;1006h' : '?1000;1006l'));
212
+ },
213
+ onResize(cb) {
214
+ const handler = () => cb({ cols: out.columns ?? 80, rows: out.rows ?? 24 });
215
+ out.on('resize', handler);
216
+ return { dispose: () => out.off('resize', handler) };
217
+ },
218
+ onData(cb) {
219
+ inp.on('data', cb);
220
+ return { dispose: () => inp.off('data', cb) };
221
+ },
222
+ restore() {
223
+ // The attribute reset comes first, and before leaving the alt-screen: the
224
+ // last frame almost always ends mid-colour, and without clearing SGR that
225
+ // attribute still applies in the main buffer — the user's shell keeps
226
+ // writing in colour after the CLI has exited.
227
+ out.write('\x1b[0m');
228
+ this.showCursor(true);
229
+ this.enableMouse(false);
230
+ this.exitAltScreen();
231
+ this.exitRawMode();
232
+ },
233
+ };
234
+ }
235
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/terminal/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * testing — test utilities. An in-memory Terminal that captures writes
3
+ * deterministically (no TTY) for snapshots and byte assertions.
4
+ */
5
+ import type { ColorLevel } from '../ansi/index.js';
6
+ import type { Size } from '../frame/index.js';
7
+ import type { Terminal } from '../terminal/index.js';
8
+ export interface MockTerminal extends Terminal {
9
+ /** Todos os chunks escritos, na ordem. */
10
+ readonly writes: readonly string[];
11
+ /** The last chunk written (the frame's patch). */
12
+ readonly lastWrite: string;
13
+ /** Everything written so far, concatenated. */
14
+ output(): string;
15
+ reset(): void;
16
+ /** Injeta bytes no stdin simulado (dispara onData). */
17
+ feed(bytes: string | Buffer): void;
18
+ /** Simula um SIGWINCH com novo tamanho. */
19
+ emitResize(size: Size): void;
20
+ }
21
+ export interface MockTerminalOptions {
22
+ readonly size?: Size;
23
+ readonly colors?: ColorLevel;
24
+ readonly synchronizedOutput?: boolean;
25
+ }
26
+ export declare function createMockTerminal(options?: MockTerminalOptions): MockTerminal;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/engine/testing/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAwB,MAAM,sBAAsB,CAAC;AAE3E,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,MAAM,IAAI,MAAM,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;IACd,uDAAuD;IACvD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,2CAA2C;IAC3C,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAwDlF"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * testing — test utilities. An in-memory Terminal that captures writes
3
+ * deterministically (no TTY) for snapshots and byte assertions.
4
+ */
5
+ export function createMockTerminal(options = {}) {
6
+ let size = options.size ?? { cols: 80, rows: 24 };
7
+ const writes = [];
8
+ const dataCbs = new Set();
9
+ const resizeCbs = new Set();
10
+ const caps = {
11
+ colors: options.colors ?? 'truecolor',
12
+ unicode: true,
13
+ mouse: true,
14
+ synchronizedOutput: options.synchronizedOutput ?? true,
15
+ isTTY: true,
16
+ };
17
+ return {
18
+ caps,
19
+ writes,
20
+ get lastWrite() {
21
+ return writes[writes.length - 1] ?? '';
22
+ },
23
+ output() {
24
+ return writes.join('');
25
+ },
26
+ reset() {
27
+ writes.length = 0;
28
+ },
29
+ feed(bytes) {
30
+ const buf = typeof bytes === 'string' ? Buffer.from(bytes, 'utf8') : bytes;
31
+ for (const cb of [...dataCbs])
32
+ cb(buf);
33
+ },
34
+ emitResize(next) {
35
+ size = next;
36
+ for (const cb of [...resizeCbs])
37
+ cb(next);
38
+ },
39
+ size() {
40
+ return size;
41
+ },
42
+ write(bytes) {
43
+ writes.push(bytes);
44
+ },
45
+ writeError() { },
46
+ enterRawMode() { },
47
+ exitRawMode() { },
48
+ enterAltScreen() { },
49
+ exitAltScreen() { },
50
+ showCursor() { },
51
+ enableMouse() { },
52
+ onResize(cb) {
53
+ resizeCbs.add(cb);
54
+ return { dispose: () => resizeCbs.delete(cb) };
55
+ },
56
+ onData(cb) {
57
+ dataCbs.add(cb);
58
+ return { dispose: () => dataCbs.delete(cb) };
59
+ },
60
+ restore() { },
61
+ };
62
+ }
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/testing/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0BH,MAAM,UAAU,kBAAkB,CAAC,UAA+B,EAAE;IAClE,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC/C,MAAM,IAAI,GAAyB;QACjC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,WAAW;QACrC,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;QACX,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI;QACtD,KAAK,EAAE,IAAI;KACZ,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,MAAM;QACN,IAAI,SAAS;YACX,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;QACD,MAAM;YACJ,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,KAAK;YACH,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,KAAK;YACR,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3E,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;gBAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,UAAU,CAAC,IAAI;YACb,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC;gBAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,UAAU,KAAI,CAAC;QACf,YAAY,KAAI,CAAC;QACjB,WAAW,KAAI,CAAC;QAChB,cAAc,KAAI,CAAC;QACnB,aAAa,KAAI,CAAC;QAClB,UAAU,KAAI,CAAC;QACf,WAAW,KAAI,CAAC;QAChB,QAAQ,CAAC,EAAE;YACT,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACjD,CAAC;QACD,MAAM,CAAC,EAAE;YACP,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,KAAI,CAAC;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * theme — semantic colour tokens, resolved and downsampled to the terminal's
3
+ * capability. Themes are immutable; `extend` creates derived ones.
4
+ */
5
+ import type { AnsiColor, ColorLevel } from '../ansi/index.js';
6
+ import type { ColorRef } from '../frame/index.js';
7
+ export type Color = string;
8
+ export interface ThemeTokens {
9
+ primary: Color;
10
+ secondary: Color;
11
+ success: Color;
12
+ warning: Color;
13
+ danger: Color;
14
+ muted: Color;
15
+ foreground: Color;
16
+ background: Color;
17
+ border: Color;
18
+ }
19
+ export interface Theme {
20
+ readonly tokens: ThemeTokens;
21
+ resolve(ref: ColorRef | undefined, level: ColorLevel): AnsiColor;
22
+ extend(partial: Partial<ThemeTokens>): Theme;
23
+ }
24
+ export declare function createTheme(tokens?: Partial<ThemeTokens>): Theme;
25
+ export declare const defaultTheme: Theme;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/engine/theme/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,KAAK,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;CAC9C;AA0HD,wBAAgB,WAAW,CAAC,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,KAAK,CAEpE;AAED,eAAO,MAAM,YAAY,EAAE,KAAiC,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * theme — semantic colour tokens, resolved and downsampled to the terminal's
3
+ * capability. Themes are immutable; `extend` creates derived ones.
4
+ */
5
+ const DEFAULT_TOKENS = {
6
+ primary: '#7c93ff',
7
+ secondary: '#a78bfa',
8
+ success: '#4ade80',
9
+ warning: '#fbbf24',
10
+ danger: '#f87171',
11
+ muted: '#8b93a7',
12
+ foreground: '#e6e9f0',
13
+ background: '#0b0d12',
14
+ border: '#2b3040',
15
+ };
16
+ const NAMED = {
17
+ black: [0, 0, 0],
18
+ red: [205, 49, 49],
19
+ green: [13, 188, 121],
20
+ yellow: [229, 229, 16],
21
+ blue: [36, 114, 200],
22
+ magenta: [188, 63, 188],
23
+ cyan: [17, 168, 205],
24
+ white: [229, 229, 229],
25
+ };
26
+ function parseColor(c) {
27
+ const s = c.trim().toLowerCase();
28
+ const named = NAMED[s];
29
+ if (named)
30
+ return named;
31
+ const hex = s.startsWith('#') ? s.slice(1) : null;
32
+ if (hex && (hex.length === 3 || hex.length === 6)) {
33
+ const full = hex.length === 3
34
+ ? hex
35
+ .split('')
36
+ .map(ch => ch + ch)
37
+ .join('')
38
+ : hex;
39
+ const r = parseInt(full.slice(0, 2), 16);
40
+ const g = parseInt(full.slice(2, 4), 16);
41
+ const b = parseInt(full.slice(4, 6), 16);
42
+ if ([r, g, b].every(n => !Number.isNaN(n)))
43
+ return [r, g, b];
44
+ }
45
+ const m = s.match(/rgb\(\s*(\d+)[ ,]+(\d+)[ ,]+(\d+)\s*\)/);
46
+ if (m)
47
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
48
+ return null;
49
+ }
50
+ // RGB → index in the 6x6x6 cube plus the ANSI-256 grayscale ramp.
51
+ function toAnsi256(r, g, b) {
52
+ if (r === g && g === b) {
53
+ if (r < 8)
54
+ return 16;
55
+ if (r > 248)
56
+ return 231;
57
+ return Math.round(((r - 8) / 247) * 24) + 232;
58
+ }
59
+ const q = (v) => (v < 48 ? 0 : v < 115 ? 1 : Math.round((v - 35) / 40));
60
+ return 16 + 36 * q(r) + 6 * q(g) + q(b);
61
+ }
62
+ const ANSI16 = [
63
+ [0, 0, 0],
64
+ [205, 49, 49],
65
+ [13, 188, 121],
66
+ [229, 229, 16],
67
+ [36, 114, 200],
68
+ [188, 63, 188],
69
+ [17, 168, 205],
70
+ [229, 229, 229],
71
+ [102, 102, 102],
72
+ [241, 76, 76],
73
+ [35, 209, 139],
74
+ [245, 245, 67],
75
+ [59, 142, 234],
76
+ [214, 112, 214],
77
+ [41, 184, 219],
78
+ [255, 255, 255],
79
+ ];
80
+ function toAnsi16(r, g, b) {
81
+ let best = 0;
82
+ let bestD = Infinity;
83
+ for (let i = 0; i < ANSI16.length; i++) {
84
+ const c = ANSI16[i];
85
+ const d = (r - c[0]) ** 2 + (g - c[1]) ** 2 + (b - c[2]) ** 2;
86
+ if (d < bestD) {
87
+ bestD = d;
88
+ best = i;
89
+ }
90
+ }
91
+ return best;
92
+ }
93
+ function makeTheme(tokens) {
94
+ const cache = new Map();
95
+ const resolve = (ref, level) => {
96
+ if (ref === undefined || level === 'none')
97
+ return { kind: 'default' };
98
+ const key = ref + '@' + level;
99
+ const hit = cache.get(key);
100
+ if (hit)
101
+ return hit;
102
+ const raw = tokens[ref] ?? ref;
103
+ const rgb = parseColor(raw);
104
+ let out;
105
+ if (!rgb)
106
+ out = { kind: 'default' };
107
+ else if (level === 'truecolor')
108
+ out = { kind: 'rgb', r: rgb[0], g: rgb[1], b: rgb[2] };
109
+ else if (level === 'ansi256')
110
+ out = { kind: 'ansi256', index: toAnsi256(rgb[0], rgb[1], rgb[2]) };
111
+ else
112
+ out = { kind: 'ansi16', index: toAnsi16(rgb[0], rgb[1], rgb[2]) };
113
+ cache.set(key, out);
114
+ return out;
115
+ };
116
+ return {
117
+ tokens,
118
+ resolve,
119
+ extend(partial) {
120
+ return makeTheme({ ...tokens, ...partial });
121
+ },
122
+ };
123
+ }
124
+ export function createTheme(tokens = {}) {
125
+ return makeTheme({ ...DEFAULT_TOKENS, ...tokens });
126
+ }
127
+ export const defaultTheme = makeTheme(DEFAULT_TOKENS);
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/theme/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * utils — pure string/Unicode helpers. No I/O, no dependencies.
3
+ * Enough for ASCII, wide characters and emoji.
4
+ */
5
+ export declare function graphemes(text: string): string[];
6
+ export declare function charWidth(grapheme: string): 0 | 1 | 2;
7
+ export declare function stringWidth(text: string): number;
8
+ export declare function wrapText(text: string, width: number): string[];
9
+ export declare function truncate(text: string, width: number, ellipsis?: string): string;
10
+ export declare function sliceByWidth(text: string, start: number, end: number): string;
11
+ export declare function stripAnsi(text: string): string;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/engine/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhD;AAqCD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAOrD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsC9D;AAOD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAa5E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAU7E;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}