zard-cli 1.0.0-beta.102 → 1.0.0-beta.104

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 (234) hide show
  1. package/commands/add/component-installer.d.ts +2 -0
  2. package/commands/add/component-installer.d.ts.map +1 -1
  3. package/commands/add/component-installer.js +9 -4
  4. package/commands/add/component-installer.js.map +1 -1
  5. package/commands/add/component-selector.d.ts +6 -0
  6. package/commands/add/component-selector.d.ts.map +1 -1
  7. package/commands/add/component-selector.js +9 -27
  8. package/commands/add/component-selector.js.map +1 -1
  9. package/commands/add/dark-mode-setup.d.ts.map +1 -1
  10. package/commands/add/dark-mode-setup.js +2 -11
  11. package/commands/add/dark-mode-setup.js.map +1 -1
  12. package/commands/add/dependency-resolver.d.ts +2 -1
  13. package/commands/add/dependency-resolver.d.ts.map +1 -1
  14. package/commands/add/dependency-resolver.js +19 -4
  15. package/commands/add/dependency-resolver.js.map +1 -1
  16. package/commands/add/index.d.ts.map +1 -1
  17. package/commands/add/index.js +116 -86
  18. package/commands/add/index.js.map +1 -1
  19. package/commands/add/wizard.d.ts +31 -0
  20. package/commands/add/wizard.d.ts.map +1 -0
  21. package/commands/add/wizard.js +289 -0
  22. package/commands/add/wizard.js.map +1 -0
  23. package/commands/init/config-prompter.d.ts +49 -3
  24. package/commands/init/config-prompter.d.ts.map +1 -1
  25. package/commands/init/config-prompter.js +84 -74
  26. package/commands/init/config-prompter.js.map +1 -1
  27. package/commands/init/dependencies.d.ts +1 -8
  28. package/commands/init/dependencies.d.ts.map +1 -1
  29. package/commands/init/dependencies.js +47 -18
  30. package/commands/init/dependencies.js.map +1 -1
  31. package/commands/init/index.d.ts.map +1 -1
  32. package/commands/init/index.js +147 -81
  33. package/commands/init/index.js.map +1 -1
  34. package/commands/init/project-kind.d.ts +82 -0
  35. package/commands/init/project-kind.d.ts.map +1 -0
  36. package/commands/init/project-kind.js +166 -0
  37. package/commands/init/project-kind.js.map +1 -0
  38. package/commands/init/steps.d.ts +16 -0
  39. package/commands/init/steps.d.ts.map +1 -0
  40. package/commands/init/steps.js +153 -0
  41. package/commands/init/steps.js.map +1 -0
  42. package/commands/init/tailwind-setup.d.ts +9 -2
  43. package/commands/init/tailwind-setup.d.ts.map +1 -1
  44. package/commands/init/tailwind-setup.js +33 -12
  45. package/commands/init/tailwind-setup.js.map +1 -1
  46. package/commands/init/tsconfig-updater.d.ts +8 -1
  47. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  48. package/commands/init/tsconfig-updater.js +30 -11
  49. package/commands/init/tsconfig-updater.js.map +1 -1
  50. package/commands/init/update-angular-config.d.ts.map +1 -1
  51. package/commands/init/update-angular-config.js +28 -50
  52. package/commands/init/update-angular-config.js.map +1 -1
  53. package/commands/init/vite-setup.d.ts +10 -0
  54. package/commands/init/vite-setup.d.ts.map +1 -0
  55. package/commands/init/vite-setup.js +60 -0
  56. package/commands/init/vite-setup.js.map +1 -0
  57. package/commands/init/wizard.d.ts +30 -0
  58. package/commands/init/wizard.d.ts.map +1 -0
  59. package/commands/init/wizard.js +560 -0
  60. package/commands/init/wizard.js.map +1 -0
  61. package/core/icons/families.d.ts +38 -0
  62. package/core/icons/families.d.ts.map +1 -0
  63. package/core/icons/families.js +26 -0
  64. package/core/icons/families.js.map +1 -0
  65. package/core/icons/icon-map.d.ts +22 -0
  66. package/core/icons/icon-map.d.ts.map +1 -0
  67. package/core/icons/icon-map.js +125 -0
  68. package/core/icons/icon-map.js.map +1 -0
  69. package/core/icons/index.d.ts +107 -0
  70. package/core/icons/index.d.ts.map +1 -0
  71. package/core/icons/index.js +183 -0
  72. package/core/icons/index.js.map +1 -0
  73. package/core/registry/registry-data.d.ts.map +1 -1
  74. package/core/registry/registry-data.js +8 -0
  75. package/core/registry/registry-data.js.map +1 -1
  76. package/index.js +5 -3
  77. package/index.js.map +1 -1
  78. package/package.json +1 -4
  79. package/ui/blocks.d.ts +70 -0
  80. package/ui/blocks.d.ts.map +1 -0
  81. package/ui/blocks.js +116 -0
  82. package/ui/blocks.js.map +1 -0
  83. package/ui/brand.d.ts +14 -0
  84. package/ui/brand.d.ts.map +1 -0
  85. package/ui/brand.js +35 -0
  86. package/ui/brand.js.map +1 -0
  87. package/ui/engine/animation/index.d.ts +39 -0
  88. package/ui/engine/animation/index.d.ts.map +1 -0
  89. package/ui/engine/animation/index.js +103 -0
  90. package/ui/engine/animation/index.js.map +1 -0
  91. package/ui/engine/ansi/index.d.ts +52 -0
  92. package/ui/engine/ansi/index.d.ts.map +1 -0
  93. package/ui/engine/ansi/index.js +117 -0
  94. package/ui/engine/ansi/index.js.map +1 -0
  95. package/ui/engine/components/index.d.ts +211 -0
  96. package/ui/engine/components/index.d.ts.map +1 -0
  97. package/ui/engine/components/index.js +109 -0
  98. package/ui/engine/components/index.js.map +1 -0
  99. package/ui/engine/cursor/index.d.ts +17 -0
  100. package/ui/engine/cursor/index.d.ts.map +1 -0
  101. package/ui/engine/cursor/index.js +41 -0
  102. package/ui/engine/cursor/index.js.map +1 -0
  103. package/ui/engine/diff/index.d.ts +27 -0
  104. package/ui/engine/diff/index.d.ts.map +1 -0
  105. package/ui/engine/diff/index.js +57 -0
  106. package/ui/engine/diff/index.js.map +1 -0
  107. package/ui/engine/events/index.d.ts +24 -0
  108. package/ui/engine/events/index.d.ts.map +1 -0
  109. package/ui/engine/events/index.js +60 -0
  110. package/ui/engine/events/index.js.map +1 -0
  111. package/ui/engine/focus/index.d.ts +25 -0
  112. package/ui/engine/focus/index.d.ts.map +1 -0
  113. package/ui/engine/focus/index.js +77 -0
  114. package/ui/engine/focus/index.js.map +1 -0
  115. package/ui/engine/frame/index.d.ts +48 -0
  116. package/ui/engine/frame/index.d.ts.map +1 -0
  117. package/ui/engine/frame/index.js +0 -0
  118. package/ui/engine/frame/index.js.map +1 -0
  119. package/ui/engine/index.d.ts +28 -0
  120. package/ui/engine/index.d.ts.map +1 -0
  121. package/ui/engine/index.js +28 -0
  122. package/ui/engine/index.js.map +1 -0
  123. package/ui/engine/input/index.d.ts +36 -0
  124. package/ui/engine/input/index.d.ts.map +1 -0
  125. package/ui/engine/input/index.js +224 -0
  126. package/ui/engine/input/index.js.map +1 -0
  127. package/ui/engine/layout/index.d.ts +42 -0
  128. package/ui/engine/layout/index.d.ts.map +1 -0
  129. package/ui/engine/layout/index.js +241 -0
  130. package/ui/engine/layout/index.js.map +1 -0
  131. package/ui/engine/renderer/index.d.ts +43 -0
  132. package/ui/engine/renderer/index.d.ts.map +1 -0
  133. package/ui/engine/renderer/index.js +619 -0
  134. package/ui/engine/renderer/index.js.map +1 -0
  135. package/ui/engine/scheduler/index.d.ts +22 -0
  136. package/ui/engine/scheduler/index.d.ts.map +1 -0
  137. package/ui/engine/scheduler/index.js +77 -0
  138. package/ui/engine/scheduler/index.js.map +1 -0
  139. package/ui/engine/screen/index.d.ts +39 -0
  140. package/ui/engine/screen/index.d.ts.map +1 -0
  141. package/ui/engine/screen/index.js +255 -0
  142. package/ui/engine/screen/index.js.map +1 -0
  143. package/ui/engine/terminal/index.d.ts +84 -0
  144. package/ui/engine/terminal/index.d.ts.map +1 -0
  145. package/ui/engine/terminal/index.js +235 -0
  146. package/ui/engine/terminal/index.js.map +1 -0
  147. package/ui/engine/testing/index.d.ts +27 -0
  148. package/ui/engine/testing/index.d.ts.map +1 -0
  149. package/ui/engine/testing/index.js +63 -0
  150. package/ui/engine/testing/index.js.map +1 -0
  151. package/ui/engine/theme/index.d.ts +27 -0
  152. package/ui/engine/theme/index.d.ts.map +1 -0
  153. package/ui/engine/theme/index.js +129 -0
  154. package/ui/engine/theme/index.js.map +1 -0
  155. package/ui/engine/utils/index.d.ts +12 -0
  156. package/ui/engine/utils/index.d.ts.map +1 -0
  157. package/ui/engine/utils/index.js +143 -0
  158. package/ui/engine/utils/index.js.map +1 -0
  159. package/ui/gate.d.ts +19 -0
  160. package/ui/gate.d.ts.map +1 -0
  161. package/ui/gate.js +36 -0
  162. package/ui/gate.js.map +1 -0
  163. package/ui/index.d.ts +18 -0
  164. package/ui/index.d.ts.map +1 -0
  165. package/ui/index.js +18 -0
  166. package/ui/index.js.map +1 -0
  167. package/ui/log-sink.d.ts +24 -0
  168. package/ui/log-sink.d.ts.map +1 -0
  169. package/ui/log-sink.js +35 -0
  170. package/ui/log-sink.js.map +1 -0
  171. package/ui/output.d.ts +14 -0
  172. package/ui/output.d.ts.map +1 -0
  173. package/ui/output.js +28 -0
  174. package/ui/output.js.map +1 -0
  175. package/ui/report.d.ts +30 -0
  176. package/ui/report.d.ts.map +1 -0
  177. package/ui/report.js +45 -0
  178. package/ui/report.js.map +1 -0
  179. package/ui/runner.d.ts +66 -0
  180. package/ui/runner.d.ts.map +1 -0
  181. package/ui/runner.js +135 -0
  182. package/ui/runner.js.map +1 -0
  183. package/ui/style.d.ts +24 -0
  184. package/ui/style.d.ts.map +1 -0
  185. package/ui/style.js +44 -0
  186. package/ui/style.js.map +1 -0
  187. package/ui/testing/fake-tty.d.ts +26 -0
  188. package/ui/testing/fake-tty.d.ts.map +1 -0
  189. package/ui/testing/fake-tty.js +61 -0
  190. package/ui/testing/fake-tty.js.map +1 -0
  191. package/ui/text-input.d.ts +30 -0
  192. package/ui/text-input.d.ts.map +1 -0
  193. package/ui/text-input.js +87 -0
  194. package/ui/text-input.js.map +1 -0
  195. package/ui/theme.d.ts +10 -0
  196. package/ui/theme.d.ts.map +1 -0
  197. package/ui/theme.js +20 -0
  198. package/ui/theme.js.map +1 -0
  199. package/utils/config.d.ts +26 -0
  200. package/utils/config.d.ts.map +1 -1
  201. package/utils/config.js +41 -1
  202. package/utils/config.js.map +1 -1
  203. package/utils/errors.d.ts +11 -0
  204. package/utils/errors.d.ts.map +1 -1
  205. package/utils/errors.js +14 -0
  206. package/utils/errors.js.map +1 -1
  207. package/utils/get-project-info.d.ts +29 -0
  208. package/utils/get-project-info.d.ts.map +1 -1
  209. package/utils/get-project-info.js +176 -1
  210. package/utils/get-project-info.js.map +1 -1
  211. package/utils/icon-catalog.d.ts +33 -0
  212. package/utils/icon-catalog.d.ts.map +1 -0
  213. package/utils/icon-catalog.js +62 -0
  214. package/utils/icon-catalog.js.map +1 -0
  215. package/utils/logger.d.ts +13 -1
  216. package/utils/logger.d.ts.map +1 -1
  217. package/utils/logger.js +95 -15
  218. package/utils/logger.js.map +1 -1
  219. package/utils/package-manager.d.ts +42 -1
  220. package/utils/package-manager.d.ts.map +1 -1
  221. package/utils/package-manager.js +204 -11
  222. package/utils/package-manager.js.map +1 -1
  223. package/utils/registry.d.ts +42 -2
  224. package/utils/registry.d.ts.map +1 -1
  225. package/utils/registry.js +51 -9
  226. package/utils/registry.js.map +1 -1
  227. package/utils/schema-version.d.ts +20 -0
  228. package/utils/schema-version.d.ts.map +1 -0
  229. package/utils/schema-version.js +27 -0
  230. package/utils/schema-version.js.map +1 -0
  231. package/utils/source-file.d.ts +40 -0
  232. package/utils/source-file.d.ts.map +1 -0
  233. package/utils/source-file.js +104 -0
  234. package/utils/source-file.js.map +1 -0
@@ -0,0 +1,235 @@
1
+ /**
2
+ * terminal — ÚNICA fronteira de I/O de baixo nível (ADR-0007). Ninguém mais
3
+ * toca process.stdout/stdin. Detecta capacidades e faz raw mode/alt-screen.
4
+ * (Fatia vertical / PoC: implementação real mínima.)
5
+ */
6
+ import { closeSync, openSync } from 'node:fs';
7
+ import { ReadStream, WriteStream } from 'node:tty';
8
+ import { csi } from '../ansi/index.js';
9
+ /**
10
+ * Abre o terminal de controle do processo, ignorando os fds herdados.
11
+ *
12
+ * `/dev/tty` é o terminal ao qual o processo está ligado, independentemente do
13
+ * que quem o invocou tenha feito com stdin e stdout. É o mecanismo que `fzf`,
14
+ * `less` e o `git rebase -i` usam para continuar interativos dentro de um pipe;
15
+ * no Windows, `CONIN$`/`CONOUT$` são o equivalente.
16
+ *
17
+ * Devolve null quando não há terminal nenhum — CI de verdade, um cron, um
18
+ * contêiner sem tty —, e é isso que mantém o caminho headless funcionando onde
19
+ * ele deve funcionar.
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
+ // Sem isto a tela não reflui ao redimensionar a janela: o Node só liga o
33
+ // SIGWINCH ao `process.stdout` que ele mesmo cria. `_refreshSize` é interno,
34
+ // então o encadeamento opcional é proposital — sumindo, perde-se o reflow,
35
+ // não a 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
+ /* já fechado */
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
+ * Onde a UI deve ser desenhada.
71
+ *
72
+ * Os fds herdados vêm primeiro: quando os dois já são um terminal, não há o que
73
+ * resolver. O resto existe por causa do `npx` — em POSIX ele executa o binário
74
+ * através de um shell e o stdin do processo chega como pipe, o que fazia a CLI
75
+ * concluir que ninguém podia responder e cair no modo texto. O terminal estava
76
+ * lá o tempo todo; era o caminho até ele que tinha sumido.
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
+ * Quantas cores este terminal aceita.
104
+ *
105
+ * Isto é o que decide se o gradiente do banner sai nos tons exatos do tema ou
106
+ * quantizado — e a resposta precisa ser a mesma nas três plataformas, senão a
107
+ * mesma CLI tem três aparências. `COLORTERM` sozinho não dá isso: o Windows
108
+ * Terminal, o VS Code e o iTerm fazem 24 bits e não o definem, então cair no
109
+ * `ansi16` do fim da função os trataria como terminais de 1990.
110
+ *
111
+ * A ordem é do mais explícito para o mais suposto: o que o usuário pediu
112
+ * (NO_COLOR/FORCE_COLOR), o que o terminal declara, quem ele diz ser, e só
113
+ * então o palpite pela plataforma.
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
+ // O Windows Terminal e o console do Windows 10+ fazem 24 bits; nenhum dos
132
+ // dois define COLORTERM ou TERM, então sem esta linha a CLI ficaria mais
133
+ // pobre justamente onde ela foi desenvolvida.
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
+ // O Terminal.app do macOS anuncia xterm-256color e é honesto: 256 cores, sem
142
+ // 24 bits. Cair no ramo genérico abaixo já daria isso, mas dizê-lo aqui
143
+ // impede que uma regra futura sobre TERM o promova por engano.
144
+ if (program === 'apple_terminal')
145
+ return 'ansi256';
146
+ if (term.includes('256'))
147
+ return 'ansi256';
148
+ // Windows sem nenhuma das pistas acima ainda é Windows 10 ou mais novo: o
149
+ // Node 20, que a CLI exige, não roda em nada anterior.
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
+ // O `resume()` de enterRawMode segura uma referência viva no event
188
+ // loop. Sem devolver o stdin ao estado pausado, o processo continua
189
+ // rodando depois que o wizard termina: a tela cai, o resumo aparece e
190
+ // o shell nunca volta — parece que o enter final não fez nada.
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
+ // O reset de atributos vem primeiro, e antes de sair do alt-screen: o
224
+ // último frame quase sempre termina no meio de uma cor, e sem zerar o SGR
225
+ // esse atributo continua valendo no buffer principal — o shell do usuário
226
+ // fica escrevendo colorido depois que a CLI já saiu.
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 — utilitários para teste/PoC. Um Terminal em memória que captura
3
+ * writes de forma determinística (sem TTY) para snapshots e asserções de bytes.
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
+ /** Último chunk escrito (o patch do frame). */
12
+ readonly lastWrite: string;
13
+ /** Concatenação de tudo. */
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,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,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 — utilitários para teste/PoC. Um Terminal em memória que captura
3
+ * writes de forma determinística (sem TTY) para snapshots e asserções de bytes.
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,27 @@
1
+ /**
2
+ * theme — tokens semânticos de cor e resolução/downsampling para a
3
+ * capacidade do terminal. Temas são imutáveis; `extend` cria derivados.
4
+ * (Fatia vertical / PoC: implementação real.)
5
+ */
6
+ import type { AnsiColor, ColorLevel } from '../ansi/index.js';
7
+ import type { ColorRef } from '../frame/index.js';
8
+ export type Color = string;
9
+ export interface ThemeTokens {
10
+ primary: Color;
11
+ secondary: Color;
12
+ success: Color;
13
+ warning: Color;
14
+ danger: Color;
15
+ muted: Color;
16
+ foreground: Color;
17
+ background: Color;
18
+ border: Color;
19
+ }
20
+ export interface Theme {
21
+ readonly tokens: ThemeTokens;
22
+ resolve(ref: ColorRef | undefined, level: ColorLevel): AnsiColor;
23
+ extend(partial: Partial<ThemeTokens>): Theme;
24
+ }
25
+ export declare function createTheme(tokens?: Partial<ThemeTokens>): Theme;
26
+ export declare const defaultTheme: Theme;
27
+ //# 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;;;;GAIG;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,129 @@
1
+ /**
2
+ * theme — tokens semânticos de cor e resolução/downsampling para a
3
+ * capacidade do terminal. Temas são imutáveis; `extend` cria derivados.
4
+ * (Fatia vertical / PoC: implementação real.)
5
+ */
6
+ const DEFAULT_TOKENS = {
7
+ primary: '#7c93ff',
8
+ secondary: '#a78bfa',
9
+ success: '#4ade80',
10
+ warning: '#fbbf24',
11
+ danger: '#f87171',
12
+ muted: '#8b93a7',
13
+ foreground: '#e6e9f0',
14
+ background: '#0b0d12',
15
+ border: '#2b3040',
16
+ };
17
+ const NAMED = {
18
+ black: [0, 0, 0],
19
+ red: [205, 49, 49],
20
+ green: [13, 188, 121],
21
+ yellow: [229, 229, 16],
22
+ blue: [36, 114, 200],
23
+ magenta: [188, 63, 188],
24
+ cyan: [17, 168, 205],
25
+ white: [229, 229, 229],
26
+ };
27
+ function parseColor(c) {
28
+ const s = c.trim().toLowerCase();
29
+ const named = NAMED[s];
30
+ if (named)
31
+ return named;
32
+ const hex = s.startsWith('#') ? s.slice(1) : null;
33
+ if (hex && (hex.length === 3 || hex.length === 6)) {
34
+ const full = hex.length === 3
35
+ ? hex
36
+ .split('')
37
+ .map(ch => ch + ch)
38
+ .join('')
39
+ : hex;
40
+ const r = parseInt(full.slice(0, 2), 16);
41
+ const g = parseInt(full.slice(2, 4), 16);
42
+ const b = parseInt(full.slice(4, 6), 16);
43
+ if ([r, g, b].every(n => !Number.isNaN(n)))
44
+ return [r, g, b];
45
+ }
46
+ const m = s.match(/rgb\(\s*(\d+)[ ,]+(\d+)[ ,]+(\d+)\s*\)/);
47
+ if (m)
48
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
49
+ return null;
50
+ }
51
+ // RGB → índice do cubo 6x6x6 + rampa de cinza do ANSI-256.
52
+ function toAnsi256(r, g, b) {
53
+ if (r === g && g === b) {
54
+ if (r < 8)
55
+ return 16;
56
+ if (r > 248)
57
+ return 231;
58
+ return Math.round(((r - 8) / 247) * 24) + 232;
59
+ }
60
+ const q = (v) => (v < 48 ? 0 : v < 115 ? 1 : Math.round((v - 35) / 40));
61
+ return 16 + 36 * q(r) + 6 * q(g) + q(b);
62
+ }
63
+ const ANSI16 = [
64
+ [0, 0, 0],
65
+ [205, 49, 49],
66
+ [13, 188, 121],
67
+ [229, 229, 16],
68
+ [36, 114, 200],
69
+ [188, 63, 188],
70
+ [17, 168, 205],
71
+ [229, 229, 229],
72
+ [102, 102, 102],
73
+ [241, 76, 76],
74
+ [35, 209, 139],
75
+ [245, 245, 67],
76
+ [59, 142, 234],
77
+ [214, 112, 214],
78
+ [41, 184, 219],
79
+ [255, 255, 255],
80
+ ];
81
+ function toAnsi16(r, g, b) {
82
+ let best = 0;
83
+ let bestD = Infinity;
84
+ for (let i = 0; i < ANSI16.length; i++) {
85
+ const c = ANSI16[i];
86
+ const d = (r - c[0]) ** 2 + (g - c[1]) ** 2 + (b - c[2]) ** 2;
87
+ if (d < bestD) {
88
+ bestD = d;
89
+ best = i;
90
+ }
91
+ }
92
+ return best;
93
+ }
94
+ function makeTheme(tokens) {
95
+ const cache = new Map();
96
+ const resolve = (ref, level) => {
97
+ if (ref === undefined || level === 'none')
98
+ return { kind: 'default' };
99
+ const key = ref + '@' + level;
100
+ const hit = cache.get(key);
101
+ if (hit)
102
+ return hit;
103
+ const raw = tokens[ref] ?? ref;
104
+ const rgb = parseColor(raw);
105
+ let out;
106
+ if (!rgb)
107
+ out = { kind: 'default' };
108
+ else if (level === 'truecolor')
109
+ out = { kind: 'rgb', r: rgb[0], g: rgb[1], b: rgb[2] };
110
+ else if (level === 'ansi256')
111
+ out = { kind: 'ansi256', index: toAnsi256(rgb[0], rgb[1], rgb[2]) };
112
+ else
113
+ out = { kind: 'ansi16', index: toAnsi16(rgb[0], rgb[1], rgb[2]) };
114
+ cache.set(key, out);
115
+ return out;
116
+ };
117
+ return {
118
+ tokens,
119
+ resolve,
120
+ extend(partial) {
121
+ return makeTheme({ ...tokens, ...partial });
122
+ },
123
+ };
124
+ }
125
+ export function createTheme(tokens = {}) {
126
+ return makeTheme({ ...DEFAULT_TOKENS, ...tokens });
127
+ }
128
+ export const defaultTheme = makeTheme(DEFAULT_TOKENS);
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/theme/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyBH,MAAM,cAAc,GAAgB;IAClC,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,MAAM,KAAK,GAA6C;IACtD,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChB,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IAClB,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IACtB,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IACvB,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACpB,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACvB,CAAC;AAEF,SAAS,UAAU,CAAC,CAAS;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GACR,GAAG,CAAC,MAAM,KAAK,CAAC;YACd,CAAC,CAAC,GAAG;iBACA,KAAK,CAAC,EAAE,CAAC;iBACT,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC;YACb,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,IAAI,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2DAA2D;AAC3D,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAChD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG;YAAE,OAAO,GAAG,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChF,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,MAAM,GAA+B;IACzC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACT,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACb,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACd,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IACd,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACd,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IACd,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACd,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACf,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACf,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACb,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACd,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IACd,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACd,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACf,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IACd,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAChB,CAAC;AAEF,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,QAAQ,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAA6B,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;YACd,KAAK,GAAG,CAAC,CAAC;YACV,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,MAAmB;IACpC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE3C,MAAM,OAAO,GAAG,CAAC,GAAyB,EAAE,KAAiB,EAAa,EAAE;QAC1E,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACtE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QAEpB,MAAM,GAAG,GAAI,MAA4C,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QACtE,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,GAAc,CAAC;QACnB,IAAI,CAAC,GAAG;YAAE,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aAC/B,IAAI,KAAK,KAAK,WAAW;YAAE,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;aAClF,IAAI,KAAK,KAAK,SAAS;YAAE,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;;YAC7F,GAAG,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEvE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,OAAO;QACP,MAAM,CAAC,OAAO;YACZ,OAAO,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAA+B,EAAE;IAC3D,OAAO,SAAS,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAU,SAAS,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * utils — helpers puros de string/Unicode. Sem I/O, sem dependências.
3
+ * (Fatia vertical / PoC: implementação real, suficiente para ASCII + wide + 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"}