zard-cli 1.0.0-beta.103 → 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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zard-cli",
3
- "version": "1.0.0-beta.103",
3
+ "version": "1.0.0-beta.104",
4
4
  "description": "An alternative to shadcn/ui for angular",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -45,14 +45,11 @@
45
45
  ],
46
46
  "dependencies": {
47
47
  "@antfu/ni": "^0.23.2",
48
- "chalk": "^5.3.0",
49
48
  "class-variance-authority": "^0.7.1",
50
49
  "clsx": "^2.1.1",
51
50
  "commander": "^12.1.0",
52
51
  "comment-json": "^4.2.5",
53
52
  "execa": "^9.5.2",
54
- "ora": "^8.1.1",
55
- "prompts": "^2.4.2",
56
53
  "zod": "^3.24.1"
57
54
  },
58
55
  "devDependencies": {
package/ui/blocks.d.ts ADDED
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Blocos de view compartilhados pelos wizards.
3
+ *
4
+ * `init` e `add` são fluxos diferentes, mas o usuário deve reconhecer a mesma
5
+ * CLI nos dois: o transcript de respostas, a barra de atalhos no rodapé e os
6
+ * painéis de resultado vivem aqui para não divergirem.
7
+ */
8
+ import { type Node } from './engine/index.js';
9
+ /** Barra de atalhos do rodapé: `↑/↓ navigate enter confirm`. */
10
+ export declare function controls(pairs: readonly (readonly [string, string])[]): Node;
11
+ /** Linha do transcript: uma pergunta já respondida. */
12
+ export declare function answeredLine(label: string, value: string): Node;
13
+ /** Enunciado do passo ativo. */
14
+ export declare function question(prompt: string): Node;
15
+ /** Campo de texto com cursor em bloco. */
16
+ /**
17
+ * Campo de texto com o cursor onde ele realmente está.
18
+ *
19
+ * Desenhar o cursor sempre no fim escondia que ele pode andar — e sem enxergar
20
+ * a posição não há como editar o meio do valor com alguma confiança. O
21
+ * caractere sob o cursor é invertido; no fim da linha isso dá o mesmo bloco
22
+ * cheio de antes.
23
+ */
24
+ export declare function textField(value: string, caret?: number): Node;
25
+ export interface Choice {
26
+ readonly label: string;
27
+ readonly hint?: string;
28
+ /**
29
+ * Cor própria do item, quando ele representa algo que já tem identidade —
30
+ * um framework, por exemplo. Sem ela o rótulo segue o estado (ativo ou não).
31
+ */
32
+ readonly color?: string;
33
+ }
34
+ /**
35
+ * Lista de escolha única, com o item ativo marcado por `❯`.
36
+ *
37
+ * Um item colorido mantém a cor esteja ativo ou não: é ela que identifica o
38
+ * que ele é. O estado continua legível pelo marcador e pelo peso — negrito no
39
+ * ativo, apagado nos demais.
40
+ */
41
+ export declare function choiceList(choices: readonly Choice[], activeIndex: number): Node[];
42
+ /** Lista de múltipla escolha, com marcação por item. */
43
+ export declare function checkList(choices: readonly Choice[], activeIndex: number, selected: ReadonlySet<number>): Node[];
44
+ /** Par Yes/No com o lado ativo destacado. */
45
+ export declare function confirmField(value: boolean): Node;
46
+ /** Explicação do passo ativo, em texto secundário. */
47
+ export declare function hint(content: string): Node;
48
+ /** Aviso destacado — usado quando recusar o passo interrompe o fluxo. */
49
+ export declare function warning(content: string): Node;
50
+ export interface TaskLine {
51
+ readonly label: string;
52
+ readonly note?: string;
53
+ }
54
+ /**
55
+ * Lista de tarefas em execução: concluídas com ✔, a atual com spinner e as
56
+ * pendentes apagadas — o mesmo vocabulário do transcript.
57
+ *
58
+ * `elapsedMs` é o tempo da etapa atual: passado dele, o contador aparece ao
59
+ * lado. Instalar dependências pode levar minutos, e sem esse sinal um spinner
60
+ * girando é indistinguível de um processo travado.
61
+ */
62
+ export declare function taskList(tasks: readonly TaskLine[], doneCount: number, elapsedMs?: number): Node[];
63
+ /** Cabeçalho da fase de execução, com spinner enquanto há trabalho pendente. */
64
+ export declare function taskHeader(label: string, allDone: boolean): Node;
65
+ export declare function progress(done: number, total: number): Node;
66
+ /** Painel de desfecho — sucesso, cancelamento ou falha. */
67
+ export declare function resultPanel(kind: 'success' | 'danger', message: string): Node;
68
+ /** Moldura padrão de uma tela: respiro nas laterais e conteúdo em coluna. */
69
+ export declare function page(...children: Node[]): Node;
70
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/ui/blocks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAkD,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9F,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,CAO5E;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ/D;AAED,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM7C;AAED,0CAA0C;AAC1C;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAoB,GAAG,IAAI,CAWxE;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,CAclF;AAED,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAYhH;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAMjD;AAED,sDAAsD;AACtD,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAuBlG;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAMhE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAS7E;AAED,6EAA6E;AAC7E,wBAAgB,IAAI,CAAC,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAE9C"}
package/ui/blocks.js ADDED
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Blocos de view compartilhados pelos wizards.
3
+ *
4
+ * `init` e `add` são fluxos diferentes, mas o usuário deve reconhecer a mesma
5
+ * CLI nos dois: o transcript de respostas, a barra de atalhos no rodapé e os
6
+ * painéis de resultado vivem aqui para não divergirem.
7
+ */
8
+ import { column, panel, progressBar, row, spinner, text } from './engine/index.js';
9
+ /** Barra de atalhos do rodapé: `↑/↓ navigate enter confirm`. */
10
+ export function controls(pairs) {
11
+ const segments = [];
12
+ pairs.forEach(([key, label], index) => {
13
+ segments.push(text(key, { color: 'foreground' }));
14
+ segments.push(text(` ${label}${index < pairs.length - 1 ? ' ' : ''}`, { color: 'muted' }));
15
+ });
16
+ return row({}, ...segments);
17
+ }
18
+ /** Linha do transcript: uma pergunta já respondida. */
19
+ export function answeredLine(label, value) {
20
+ return row({ gap: 0 }, text('✔ ', { color: 'success' }), text(label, { color: 'muted' }), text(' … ', { color: 'muted', dim: true }), text(value, { color: 'foreground' }));
21
+ }
22
+ /** Enunciado do passo ativo. */
23
+ export function question(prompt) {
24
+ return row({ gap: 0 }, text('◆ ', { color: 'primary' }), text(prompt, { color: 'foreground', bold: true, wrap: true }));
25
+ }
26
+ /** Campo de texto com cursor em bloco. */
27
+ /**
28
+ * Campo de texto com o cursor onde ele realmente está.
29
+ *
30
+ * Desenhar o cursor sempre no fim escondia que ele pode andar — e sem enxergar
31
+ * a posição não há como editar o meio do valor com alguma confiança. O
32
+ * caractere sob o cursor é invertido; no fim da linha isso dá o mesmo bloco
33
+ * cheio de antes.
34
+ */
35
+ export function textField(value, caret = [...value].length) {
36
+ const chars = [...value];
37
+ const position = Math.max(0, Math.min(caret, chars.length));
38
+ return row({ gap: 0 }, text(' › ', { color: 'muted' }), text(chars.slice(0, position).join(''), { color: 'foreground' }), text(chars[position] ?? ' ', { color: 'foreground', inverse: true }), text(chars.slice(position + 1).join(''), { color: 'foreground' }));
39
+ }
40
+ /**
41
+ * Lista de escolha única, com o item ativo marcado por `❯`.
42
+ *
43
+ * Um item colorido mantém a cor esteja ativo ou não: é ela que identifica o
44
+ * que ele é. O estado continua legível pelo marcador e pelo peso — negrito no
45
+ * ativo, apagado nos demais.
46
+ */
47
+ export function choiceList(choices, activeIndex) {
48
+ return choices.map((choice, index) => {
49
+ const active = index === activeIndex;
50
+ return row({ gap: 0 }, text(active ? ' ❯ ' : ' ', { color: 'primary', bold: active }), text(choice.label, {
51
+ color: choice.color ?? (active ? 'foreground' : 'muted'),
52
+ bold: active,
53
+ dim: !active,
54
+ }), ...(choice.hint ? [text(` ${choice.hint}`, { color: 'muted', dim: true })] : []));
55
+ });
56
+ }
57
+ /** Lista de múltipla escolha, com marcação por item. */
58
+ export function checkList(choices, activeIndex, selected) {
59
+ return choices.map((choice, index) => {
60
+ const active = index === activeIndex;
61
+ const checked = selected.has(index);
62
+ return row({ gap: 0 }, text(active ? ' ❯ ' : ' ', { color: 'primary', bold: active }), text(checked ? '◼ ' : '◻ ', { color: checked ? 'success' : 'muted', dim: !checked }), text(choice.label, { color: active ? 'foreground' : checked ? 'foreground' : 'muted', bold: active }), ...(choice.hint ? [text(` ${choice.hint}`, { color: 'muted', dim: true })] : []));
63
+ });
64
+ }
65
+ /** Par Yes/No com o lado ativo destacado. */
66
+ export function confirmField(value) {
67
+ return row({ gap: 4 }, text(` ${value ? '❯ ' : ' '}Yes`, { color: value ? 'success' : 'muted', bold: value }), text(`${!value ? '❯ ' : ' '}No`, { color: !value ? 'danger' : 'muted', bold: !value }));
68
+ }
69
+ /** Explicação do passo ativo, em texto secundário. */
70
+ export function hint(content) {
71
+ return text(` ${content}`, { color: 'muted', dim: true });
72
+ }
73
+ /** Aviso destacado — usado quando recusar o passo interrompe o fluxo. */
74
+ export function warning(content) {
75
+ return text(` ⚠ ${content}`, { color: 'warning', bold: true });
76
+ }
77
+ /** A partir daqui a etapa atual passa a mostrar há quanto tempo está rodando. */
78
+ const SLOW_TASK_MS = 3000;
79
+ /**
80
+ * Lista de tarefas em execução: concluídas com ✔, a atual com spinner e as
81
+ * pendentes apagadas — o mesmo vocabulário do transcript.
82
+ *
83
+ * `elapsedMs` é o tempo da etapa atual: passado dele, o contador aparece ao
84
+ * lado. Instalar dependências pode levar minutos, e sem esse sinal um spinner
85
+ * girando é indistinguível de um processo travado.
86
+ */
87
+ export function taskList(tasks, doneCount, elapsedMs) {
88
+ const allDone = doneCount >= tasks.length;
89
+ return tasks.map((task, index) => {
90
+ const done = index < doneCount;
91
+ const current = index === doneCount && !allDone;
92
+ const mark = done
93
+ ? text('✔', { color: 'success' })
94
+ : current
95
+ ? spinner({ variant: 'dots', color: 'primary' })
96
+ : text('○', { color: 'muted', dim: true });
97
+ const showElapsed = current && elapsedMs !== undefined && elapsedMs >= SLOW_TASK_MS;
98
+ return row({ gap: 0 }, text(' '), mark, text(` ${task.label}`, { color: done || current ? 'foreground' : 'muted' }), ...(task.note ? [text(` — ${task.note}`, { color: 'muted', dim: true })] : []), ...(showElapsed ? [text(` ${Math.round(elapsedMs / 1000)}s`, { color: 'primary', dim: true })] : []));
99
+ });
100
+ }
101
+ /** Cabeçalho da fase de execução, com spinner enquanto há trabalho pendente. */
102
+ export function taskHeader(label, allDone) {
103
+ return row({ gap: 0 }, allDone ? text('✔', { color: 'success' }) : spinner({ variant: 'dots', color: 'primary' }), text(` ${label}`, { color: 'foreground', bold: true }));
104
+ }
105
+ export function progress(done, total) {
106
+ return progressBar({ value: total ? done / total : 1, width: 44, color: 'success', showPercent: true });
107
+ }
108
+ /** Painel de desfecho — sucesso, cancelamento ou falha. */
109
+ export function resultPanel(kind, message) {
110
+ return panel({ border: 'round', borderColor: kind, padding: { top: 0, right: 1, bottom: 0, left: 1 } }, row({ gap: 0 }, text(kind === 'success' ? '✔ ' : '✖ ', { color: kind, bold: true }), text(message, { color: 'foreground', bold: true })));
111
+ }
112
+ /** Moldura padrão de uma tela: respiro nas laterais e conteúdo em coluna. */
113
+ export function page(...children) {
114
+ return column({ flexGrow: 1, padding: { top: 1, right: 3, bottom: 1, left: 3 }, gap: 0 }, ...children);
115
+ }
116
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/ui/blocks.ts"],"names":[],"mappings":"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"}
package/ui/brand.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Identidade visual da CLI — o banner e os cabeçalhos de comando.
3
+ *
4
+ * O banner só aparece quando há altura sobrando: em terminais baixos ele cede
5
+ * lugar ao conteúdo, que é o que o usuário precisa ver para responder.
6
+ */
7
+ import { type Node } from './engine/index.js';
8
+ /** O nome da marca como ela se escreve — a barra faz parte dele. */
9
+ export declare const BRAND = "zard/ui";
10
+ export declare const ZARDUI_BANNER: string[];
11
+ export declare function brandBanner(rows: number): Node[];
12
+ /** Cabeçalho compacto de um comando: `◇ zard/ui · initialize`. */
13
+ export declare function commandHeader(command: string, description?: string): Node;
14
+ //# sourceMappingURL=brand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/ui/brand.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA6B,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzE,oEAAoE;AACpE,eAAO,MAAM,KAAK,YAAY,CAAC;AAE/B,eAAO,MAAM,aAAa,UAOzB,CAAC;AAQF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAKhD;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAUzE"}
package/ui/brand.js ADDED
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Identidade visual da CLI — o banner e os cabeçalhos de comando.
3
+ *
4
+ * O banner só aparece quando há altura sobrando: em terminais baixos ele cede
5
+ * lugar ao conteúdo, que é o que o usuário precisa ver para responder.
6
+ */
7
+ import { banner, column, row, text } from './engine/index.js';
8
+ /** O nome da marca como ela se escreve — a barra faz parte dele. */
9
+ export const BRAND = 'zard/ui';
10
+ export const ZARDUI_BANNER = [
11
+ '███████╗ █████╗ ██████╗ ██████╗ ██╗██╗ ██╗██╗',
12
+ '╚══███╔╝██╔══██╗██╔══██╗██╔══██╗ ██╔╝██║ ██║██║',
13
+ ' ███╔╝ ███████║██████╔╝██║ ██║ ██╔╝ ██║ ██║██║',
14
+ ' ███╔╝ ██╔══██║██╔══██╗██║ ██║ ██╔╝ ██║ ██║██║',
15
+ '███████╗██║ ██║██║ ██║██████╔╝██╔╝ ╚██████╔╝██║',
16
+ '╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═════╝ ╚═╝',
17
+ ];
18
+ const BANNER_COLOR = '#fafafa';
19
+ const TAGLINE = 'The Angular component toolkit · beautiful components in seconds';
20
+ /** Altura mínima para o banner caber sem espremer as perguntas. */
21
+ const BANNER_MIN_ROWS = 24;
22
+ export function brandBanner(rows) {
23
+ if (rows < BANNER_MIN_ROWS) {
24
+ return [row({ gap: 1 }, text('◇', { color: 'primary' }), text(BRAND, { color: 'foreground', bold: true }))];
25
+ }
26
+ return [banner({ lines: ZARDUI_BANNER, colors: [BANNER_COLOR] }), text(TAGLINE, { color: 'muted', dim: true })];
27
+ }
28
+ /** Cabeçalho compacto de um comando: `◇ zard/ui · initialize`. */
29
+ export function commandHeader(command, description) {
30
+ const head = row({ gap: 1 }, text('◇', { color: 'success' }), text(BRAND, { color: 'foreground', bold: true }), text(`· ${command}`, { color: 'muted' }));
31
+ if (!description)
32
+ return head;
33
+ return column({}, head, text(description, { color: 'muted', dim: true }));
34
+ }
35
+ //# sourceMappingURL=brand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/ui/brand.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAa,MAAM,mBAAmB,CAAC;AAEzE,oEAAoE;AACpE,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC;AAE/B,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,qDAAqD;IACrD,qDAAqD;IACrD,qDAAqD;IACrD,qDAAqD;IACrD,qDAAqD;IACrD,qDAAqD;CACtD,CAAC;AAEF,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF,mEAAmE;AACnE,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAClH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,WAAoB;IACjE,MAAM,IAAI,GAAG,GAAG,CACd,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAC/B,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAChD,IAAI,CAAC,KAAK,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CACzC,CAAC;IAEF,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * animation — tweens independentes de FPS (usam dt real), easing e um clock
3
+ * keyed que sobrevive ao re-render. Base de spinner/progress/fade/typing/pulse.
4
+ * (Implementação real.)
5
+ */
6
+ export type Easing = (t: number) => number;
7
+ export declare const Easing: {
8
+ readonly linear: Easing;
9
+ readonly easeIn: Easing;
10
+ readonly easeOut: Easing;
11
+ readonly easeInOut: Easing;
12
+ readonly spring: Easing;
13
+ };
14
+ export interface TweenOptions {
15
+ readonly from: number;
16
+ readonly to: number;
17
+ readonly duration: number;
18
+ readonly easing?: Easing;
19
+ readonly loop?: boolean | 'pingpong';
20
+ }
21
+ export interface Tween {
22
+ readonly value: number;
23
+ readonly done: boolean;
24
+ update(dtMs: number): void;
25
+ reset(): void;
26
+ }
27
+ export declare function tween(options: TweenOptions): Tween;
28
+ export interface AnimationClock {
29
+ register(key: string, tween: Tween): void;
30
+ has(key: string): boolean;
31
+ phase(key: string): number;
32
+ remove(key: string): void;
33
+ tick(dtMs: number): void;
34
+ readonly active: boolean;
35
+ }
36
+ export declare function createAnimationClock(): AnimationClock;
37
+ /** Frames de spinner nomeados (dots, line, arc, bounce, pulse). */
38
+ export declare const spinnerFrames: Readonly<Record<string, readonly string[]>>;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/engine/animation/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAI3C,eAAO,MAAM,MAAM,EAAE;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAmBzB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CACtC;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,KAAK,CAyClD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC1C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAuBrD;AAED,mEAAmE;AACnE,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAMrE,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * animation — tweens independentes de FPS (usam dt real), easing e um clock
3
+ * keyed que sobrevive ao re-render. Base de spinner/progress/fade/typing/pulse.
4
+ * (Implementação real.)
5
+ */
6
+ const clamp01 = (t) => (t < 0 ? 0 : t > 1 ? 1 : t);
7
+ export const Easing = {
8
+ linear: t => clamp01(t),
9
+ easeIn: t => {
10
+ t = clamp01(t);
11
+ return t * t;
12
+ },
13
+ easeOut: t => {
14
+ t = clamp01(t);
15
+ return 1 - (1 - t) * (1 - t);
16
+ },
17
+ easeInOut: t => {
18
+ t = clamp01(t);
19
+ return t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2;
20
+ },
21
+ spring: t => {
22
+ t = clamp01(t);
23
+ return 1 - Math.cos(t * Math.PI * 1.5) * (1 - t);
24
+ },
25
+ };
26
+ export function tween(options) {
27
+ const easing = options.easing ?? Easing.linear;
28
+ const dur = Math.max(1, options.duration);
29
+ let elapsed = 0;
30
+ let dir = 1;
31
+ const compute = () => {
32
+ let t = elapsed / dur;
33
+ let done = false;
34
+ if (options.loop === 'pingpong') {
35
+ t = clamp01(t);
36
+ }
37
+ else if (options.loop) {
38
+ t = t % 1;
39
+ }
40
+ else if (t >= 1) {
41
+ t = 1;
42
+ done = true;
43
+ }
44
+ const eased = easing(t);
45
+ const value = options.from + (options.to - options.from) * (dir < 0 ? 1 - eased : eased);
46
+ return { value, done };
47
+ };
48
+ return {
49
+ get value() {
50
+ return compute().value;
51
+ },
52
+ get done() {
53
+ return compute().done;
54
+ },
55
+ update(dtMs) {
56
+ elapsed += dtMs;
57
+ if (options.loop === 'pingpong' && elapsed >= dur) {
58
+ elapsed = elapsed % dur;
59
+ dir *= -1;
60
+ }
61
+ },
62
+ reset() {
63
+ elapsed = 0;
64
+ dir = 1;
65
+ },
66
+ };
67
+ }
68
+ export function createAnimationClock() {
69
+ const tweens = new Map();
70
+ return {
71
+ register(key, t) {
72
+ tweens.set(key, t);
73
+ },
74
+ has(key) {
75
+ return tweens.has(key);
76
+ },
77
+ phase(key) {
78
+ return tweens.get(key)?.value ?? 0;
79
+ },
80
+ remove(key) {
81
+ tweens.delete(key);
82
+ },
83
+ tick(dtMs) {
84
+ for (const t of tweens.values())
85
+ t.update(dtMs);
86
+ },
87
+ get active() {
88
+ for (const t of tweens.values())
89
+ if (!t.done)
90
+ return true;
91
+ return false;
92
+ },
93
+ };
94
+ }
95
+ /** Frames de spinner nomeados (dots, line, arc, bounce, pulse). */
96
+ export const spinnerFrames = {
97
+ dots: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],
98
+ line: ['-', '\\', '|', '/'],
99
+ arc: ['◜', '◠', '◝', '◞', '◡', '◟'],
100
+ bounce: ['⠁', '⠂', '⠄', '⠂'],
101
+ pulse: ['•', '●', '◉', '●'],
102
+ };
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/animation/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * ansi — geração de sequências de escape (CSI/SGR) e o vocabulário de cor.
3
+ * Nível mais baixo que "conhece" o protocolo do terminal. Sem I/O.
4
+ * (Fatia vertical / PoC: implementação real.)
5
+ */
6
+ /** Nível de cor que o terminal suporta (ver TerminalCapabilities). */
7
+ export type ColorLevel = 'truecolor' | 'ansi256' | 'ansi16' | 'none';
8
+ /** Cor concreta já resolvida para um nível — pronta para virar bytes SGR. */
9
+ export type AnsiColor = {
10
+ readonly kind: 'rgb';
11
+ readonly r: number;
12
+ readonly g: number;
13
+ readonly b: number;
14
+ } | {
15
+ readonly kind: 'ansi256';
16
+ readonly index: number;
17
+ } | {
18
+ readonly kind: 'ansi16';
19
+ readonly index: number;
20
+ } | {
21
+ readonly kind: 'default';
22
+ };
23
+ /**
24
+ * Atributos de texto como bitmask (comparável por valor, barato de diffar).
25
+ * Objeto const (não `const enum`) para ser compatível com `isolatedModules`.
26
+ */
27
+ export declare const Attr: {
28
+ readonly None: 0;
29
+ readonly Bold: number;
30
+ readonly Dim: number;
31
+ readonly Italic: number;
32
+ readonly Underline: number;
33
+ readonly Inverse: number;
34
+ readonly Strike: number;
35
+ readonly Blink: number;
36
+ };
37
+ /** Valor de bitmask de atributos (combinável com OR bit-a-bit). */
38
+ export type Attr = number;
39
+ export declare const ESC = "\u001B";
40
+ /** Monta uma sequência CSI (`ESC [ … `). Ex.: csi("2J"), csi(`${y};${x}H`). */
41
+ export declare function csi(body: string): string;
42
+ /**
43
+ * Builder incremental de SGR que emite APENAS o delta em relação ao estado
44
+ * corrente — chave para minimizar bytes no encoder (ARCHITECTURE §17).
45
+ */
46
+ export interface SgrBuilder {
47
+ transition(fg: AnsiColor, bg: AnsiColor, attrs: Attr): string;
48
+ reset(): string;
49
+ clear(): void;
50
+ }
51
+ export declare function createSgrBuilder(): SgrBuilder;
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/engine/ansi/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAErE,6EAA6E;AAC7E,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAEjC;;;GAGG;AACH,eAAO,MAAM,IAAI;;;;;;;;;CASP,CAAC;AACX,mEAAmE;AACnE,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC;AAE1B,eAAO,MAAM,GAAG,WAAS,CAAC;AAE1B,+EAA+E;AAC/E,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAsCD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC;IAC9D,KAAK,IAAI,MAAM,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CA8C7C"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * ansi — geração de sequências de escape (CSI/SGR) e o vocabulário de cor.
3
+ * Nível mais baixo que "conhece" o protocolo do terminal. Sem I/O.
4
+ * (Fatia vertical / PoC: implementação real.)
5
+ */
6
+ /**
7
+ * Atributos de texto como bitmask (comparável por valor, barato de diffar).
8
+ * Objeto const (não `const enum`) para ser compatível com `isolatedModules`.
9
+ */
10
+ export const Attr = {
11
+ None: 0,
12
+ Bold: 1 << 0,
13
+ Dim: 1 << 1,
14
+ Italic: 1 << 2,
15
+ Underline: 1 << 3,
16
+ Inverse: 1 << 4,
17
+ Strike: 1 << 5,
18
+ Blink: 1 << 6,
19
+ };
20
+ export const ESC = '\x1b';
21
+ /** Monta uma sequência CSI (`ESC [ … `). Ex.: csi("2J"), csi(`${y};${x}H`). */
22
+ export function csi(body) {
23
+ return ESC + '[' + body;
24
+ }
25
+ const DEFAULT_COLOR = { kind: 'default' };
26
+ function sameColor(a, b) {
27
+ if (a.kind !== b.kind)
28
+ return false;
29
+ if (a.kind === 'rgb' && b.kind === 'rgb')
30
+ return a.r === b.r && a.g === b.g && a.b === b.b;
31
+ if (a.kind === 'ansi256' && b.kind === 'ansi256')
32
+ return a.index === b.index;
33
+ if (a.kind === 'ansi16' && b.kind === 'ansi16')
34
+ return a.index === b.index;
35
+ return a.kind === b.kind; // default
36
+ }
37
+ function colorCodes(c, fg) {
38
+ const base = fg ? 38 : 48;
39
+ switch (c.kind) {
40
+ case 'rgb':
41
+ return [base, 2, c.r, c.g, c.b];
42
+ case 'ansi256':
43
+ return [base, 5, c.index];
44
+ case 'ansi16':
45
+ return c.index < 8 ? [(fg ? 30 : 40) + c.index] : [(fg ? 90 : 100) + (c.index - 8)];
46
+ case 'default':
47
+ return [fg ? 39 : 49];
48
+ }
49
+ }
50
+ function attrCodes(mask) {
51
+ const out = [];
52
+ if (mask & Attr.Bold)
53
+ out.push(1);
54
+ if (mask & Attr.Dim)
55
+ out.push(2);
56
+ if (mask & Attr.Italic)
57
+ out.push(3);
58
+ if (mask & Attr.Underline)
59
+ out.push(4);
60
+ if (mask & Attr.Blink)
61
+ out.push(5);
62
+ if (mask & Attr.Inverse)
63
+ out.push(7);
64
+ if (mask & Attr.Strike)
65
+ out.push(9);
66
+ return out;
67
+ }
68
+ export function createSgrBuilder() {
69
+ let curFg = DEFAULT_COLOR;
70
+ let curBg = DEFAULT_COLOR;
71
+ let curAttrs = 0;
72
+ return {
73
+ transition(fg, bg, attrs) {
74
+ const removingAttr = (curAttrs & ~attrs) !== 0;
75
+ const fgToDefault = fg.kind === 'default' && curFg.kind !== 'default';
76
+ const bgToDefault = bg.kind === 'default' && curBg.kind !== 'default';
77
+ if (removingAttr || fgToDefault || bgToDefault) {
78
+ // Não dá para "desligar" seletivamente de forma barata → reset e reconstrói.
79
+ const codes = [0, ...attrCodes(attrs)];
80
+ if (fg.kind !== 'default')
81
+ codes.push(...colorCodes(fg, true));
82
+ if (bg.kind !== 'default')
83
+ codes.push(...colorCodes(bg, false));
84
+ curFg = fg;
85
+ curBg = bg;
86
+ curAttrs = attrs;
87
+ return csi(codes.join(';') + 'm');
88
+ }
89
+ const codes = [];
90
+ const addedAttrs = attrs & ~curAttrs;
91
+ if (addedAttrs)
92
+ codes.push(...attrCodes(addedAttrs));
93
+ if (!sameColor(fg, curFg))
94
+ codes.push(...colorCodes(fg, true));
95
+ if (!sameColor(bg, curBg))
96
+ codes.push(...colorCodes(bg, false));
97
+ curFg = fg;
98
+ curBg = bg;
99
+ curAttrs = attrs;
100
+ if (codes.length === 0)
101
+ return '';
102
+ return csi(codes.join(';') + 'm');
103
+ },
104
+ reset() {
105
+ curFg = DEFAULT_COLOR;
106
+ curBg = DEFAULT_COLOR;
107
+ curAttrs = 0;
108
+ return csi('0m');
109
+ },
110
+ clear() {
111
+ curFg = DEFAULT_COLOR;
112
+ curBg = DEFAULT_COLOR;
113
+ curAttrs = 0;
114
+ },
115
+ };
116
+ }
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/ansi/index.ts"],"names":[],"mappings":"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"}