@semacode/cli 1.5.18 → 1.5.19

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 (93) hide show
  1. package/AGENTS.md +268 -260
  2. package/LICENSE +22 -22
  3. package/README.md +144 -104
  4. package/SEMA_BRIEF.curto.txt +7 -5
  5. package/SEMA_BRIEF.md +60 -4
  6. package/SEMA_BRIEF.micro.txt +6 -4
  7. package/SEMA_INDEX.json +917 -41
  8. package/dist/controleComercialSupabase.d.ts +326 -0
  9. package/dist/controleComercialSupabase.js +310 -0
  10. package/dist/controleComercialSupabase.js.map +1 -0
  11. package/dist/docs.js +48 -20
  12. package/dist/docs.js.map +1 -1
  13. package/dist/drift.d.ts +5 -3
  14. package/dist/drift.js +123 -14
  15. package/dist/drift.js.map +1 -1
  16. package/dist/index.js +1889 -38
  17. package/dist/index.js.map +1 -1
  18. package/dist/mcpRemoto.d.ts +32 -0
  19. package/dist/mcpRemoto.js +61 -0
  20. package/dist/mcpRemoto.js.map +1 -0
  21. package/dist/projeto.js +3 -1
  22. package/dist/projeto.js.map +1 -1
  23. package/docs/AGENT_STARTER.md +103 -97
  24. package/docs/cli.md +175 -106
  25. package/docs/como-ensinar-a-sema-para-ia.md +41 -35
  26. package/docs/deploy.md +231 -43
  27. package/docs/documentacao.md +61 -36
  28. package/docs/env.md +105 -56
  29. package/docs/extensao-vscode.md +12 -4
  30. package/docs/fluxo-pratico-ia-sema.md +182 -176
  31. package/docs/instalacao-e-primeiro-uso.md +52 -30
  32. package/docs/integracao-com-ia.md +108 -101
  33. package/docs/mcp.md +292 -51
  34. package/docs/pagamento-ponta-a-ponta.md +34 -28
  35. package/docs/persistencia-vendor-first.md +11 -5
  36. package/docs/prompt-base-ia-sema.md +13 -7
  37. package/docs/rollback.md +17 -15
  38. package/docs/sintaxe.md +180 -174
  39. package/exemplos/agendamento.sema +105 -105
  40. package/exemplos/assinatura.sema +133 -133
  41. package/exemplos/auditoria.sema +89 -89
  42. package/exemplos/autenticacao.sema +125 -125
  43. package/exemplos/author_obra_comum.sema +294 -0
  44. package/exemplos/author_tema_sensivel.sema +264 -0
  45. package/exemplos/automacao.sema +107 -107
  46. package/exemplos/cadastro_usuario.sema +54 -54
  47. package/exemplos/calculadora.sema +78 -78
  48. package/exemplos/crud_simples.sema +89 -89
  49. package/exemplos/estoque.sema +127 -127
  50. package/exemplos/exportacao.sema +94 -94
  51. package/exemplos/fila.sema +130 -130
  52. package/exemplos/integracao_externa.sema +94 -94
  53. package/exemplos/multi_tenant.sema +140 -140
  54. package/exemplos/notificacao.sema +149 -149
  55. package/exemplos/operacao_estrategia.sema +633 -633
  56. package/exemplos/pagamento.sema +434 -434
  57. package/exemplos/pagamento_dominio.sema +35 -35
  58. package/exemplos/pedido.sema +255 -255
  59. package/exemplos/permissao.sema +121 -121
  60. package/exemplos/persistencia_vendor_first.sema +86 -86
  61. package/exemplos/profile_game.sema +114 -0
  62. package/exemplos/profile_legal.sema +105 -0
  63. package/exemplos/profile_ops.sema +110 -0
  64. package/exemplos/profile_research.sema +104 -0
  65. package/exemplos/profile_software.sema +123 -0
  66. package/exemplos/profile_workflow_n8n.sema +99 -0
  67. package/exemplos/relatorio.sema +93 -93
  68. package/exemplos/replica_analitica_erp.sema +160 -160
  69. package/exemplos/testes_embutidos.sema +45 -45
  70. package/exemplos/tratamento_erro.sema +157 -157
  71. package/exemplos/upload_arquivo.sema +93 -93
  72. package/exemplos/webhook.sema +94 -94
  73. package/llms-full.txt +34 -34
  74. package/llms.txt +17 -17
  75. package/node_modules/@sema/gerador-css/dist/index.js +563 -563
  76. package/node_modules/@sema/gerador-css/package.json +1 -1
  77. package/node_modules/@sema/gerador-dart/package.json +1 -1
  78. package/node_modules/@sema/gerador-html/dist/index.js +90 -90
  79. package/node_modules/@sema/gerador-html/package.json +1 -1
  80. package/node_modules/@sema/gerador-javascript/dist/index.js +92 -92
  81. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  82. package/node_modules/@sema/gerador-lua/dist/index.js +53 -53
  83. package/node_modules/@sema/gerador-lua/package.json +1 -1
  84. package/node_modules/@sema/gerador-python/dist/index.js +122 -96
  85. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
  86. package/node_modules/@sema/gerador-python/package.json +1 -1
  87. package/node_modules/@sema/gerador-typescript/dist/index.js +153 -153
  88. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  89. package/node_modules/@sema/nucleo/dist/formatador/index.js +12 -4
  90. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  91. package/node_modules/@sema/nucleo/package.json +1 -1
  92. package/node_modules/@sema/padroes/package.json +1 -1
  93. package/package.json +11 -11
@@ -1,24 +1,24 @@
1
1
  import { normalizarNomeModulo, normalizarNomeParaSimbolo, } from "@sema/padroes";
2
2
  function gerarEstilosEntity(entity) {
3
3
  const nome = normalizarNomeParaSimbolo(entity.nome);
4
- return `.sema-entity[data-entity="${entity.nome}"] {
5
- border-left: 3px solid var(--sema-cor-entidade);
6
- }
4
+ return `.sema-entity[data-entity="${entity.nome}"] {
5
+ border-left: 3px solid var(--sema-cor-entidade);
6
+ }
7
7
  `;
8
8
  }
9
9
  function gerarEstilosTask(task) {
10
10
  const erros = Object.keys(task.errors);
11
- const erroEstilos = erros.map((nomeErro) => `.sema-erro[data-erro="${nomeErro}"] {
12
- display: block;
13
- color: var(--sema-cor-erro-texto);
14
- background: var(--sema-cor-erro-fundo);
15
- border-left: 3px solid var(--sema-cor-erro);
16
- padding: 0.5rem 0.75rem;
17
- margin-top: 0.5rem;
18
- border-radius: var(--sema-raio);
19
- font-size: 0.875rem;
20
- animation: sema-surgir 0.3s ease;
21
- }
11
+ const erroEstilos = erros.map((nomeErro) => `.sema-erro[data-erro="${nomeErro}"] {
12
+ display: block;
13
+ color: var(--sema-cor-erro-texto);
14
+ background: var(--sema-cor-erro-fundo);
15
+ border-left: 3px solid var(--sema-cor-erro);
16
+ padding: 0.5rem 0.75rem;
17
+ margin-top: 0.5rem;
18
+ border-radius: var(--sema-raio);
19
+ font-size: 0.875rem;
20
+ animation: sema-surgir 0.3s ease;
21
+ }
22
22
  `).join("\n");
23
23
  return erroEstilos;
24
24
  }
@@ -30,9 +30,9 @@ function gerarEstilosState(state) {
30
30
  return estilos.join("\n");
31
31
  }
32
32
  function gerarEstilosEnum(enumeracao) {
33
- return enumeracao.valores.map((valor) => `.sema-select option[value="${valor}"] {
34
- color: var(--sema-cor-texto);
35
- }
33
+ return enumeracao.valores.map((valor) => `.sema-select option[value="${valor}"] {
34
+ color: var(--sema-cor-texto);
35
+ }
36
36
  `).join("");
37
37
  }
38
38
  export function gerarCss(modulo) {
@@ -40,552 +40,552 @@ export function gerarCss(modulo) {
40
40
  const entidades = modulo.entities.map(gerarEstilosEntity).join("\n");
41
41
  const tasks = modulo.tasks.map(gerarEstilosTask).join("\n");
42
42
  const enums = modulo.enums.map(gerarEstilosEnum).join("\n");
43
- const css = `/* Arquivo gerado automaticamente pela Sema. */
44
- /* Modulo de origem: ${modulo.nome} */
45
-
46
- /* ========================================
47
- Design System — Variaveis
48
- ======================================== */
49
-
50
- :root {
51
- /* Cores principais */
52
- --sema-cor-primaria: #6366f1;
53
- --sema-cor-primaria-hover: #4f46e5;
54
- --sema-cor-primaria-suave: #eef2ff;
55
- --sema-cor-sucesso: #10b981;
56
- --sema-cor-sucesso-fundo: #ecfdf5;
57
- --sema-cor-erro: #ef4444;
58
- --sema-cor-erro-texto: #991b1b;
59
- --sema-cor-erro-fundo: #fef2f2;
60
- --sema-cor-aviso: #f59e0b;
61
- --sema-cor-info: #3b82f6;
62
-
63
- /* Neutros */
64
- --sema-cor-fundo: #fafafa;
65
- --sema-cor-superficie: #ffffff;
66
- --sema-cor-texto: #18181b;
67
- --sema-cor-texto-secundario: #71717a;
68
- --sema-cor-borda: #e4e4e7;
69
- --sema-cor-borda-foco: #a5b4fc;
70
- --sema-cor-entidade: #8b5cf6;
71
-
72
- /* Tipografia */
73
- --sema-fonte: "Inter", "Segoe UI", system-ui, -apple-system, sans-serif;
74
- --sema-fonte-mono: "JetBrains Mono", "Fira Code", "Consolas", monospace;
75
- --sema-tamanho-base: 0.9375rem;
76
- --sema-tamanho-titulo: 1.75rem;
77
- --sema-tamanho-subtitulo: 1.25rem;
78
- --sema-tamanho-pequeno: 0.8125rem;
79
-
80
- /* Espacamento */
81
- --sema-espacamento-xs: 0.25rem;
82
- --sema-espacamento-sm: 0.5rem;
83
- --sema-espacamento-md: 1rem;
84
- --sema-espacamento-lg: 1.5rem;
85
- --sema-espacamento-xl: 2rem;
86
-
87
- /* Bordas e sombras */
88
- --sema-raio: 0.5rem;
89
- --sema-raio-lg: 0.75rem;
90
- --sema-sombra: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.04);
91
- --sema-sombra-lg: 0 4px 12px rgba(0, 0, 0, 0.1);
92
-
93
- /* Transicoes */
94
- --sema-transicao: 150ms ease;
95
- --sema-transicao-lenta: 300ms ease;
96
- }
97
-
98
- /* ========================================
99
- Dark Mode
100
- ======================================== */
101
-
102
- @media (prefers-color-scheme: dark) {
103
- :root {
104
- --sema-cor-primaria: #818cf8;
105
- --sema-cor-primaria-hover: #a5b4fc;
106
- --sema-cor-primaria-suave: #1e1b4b;
107
- --sema-cor-sucesso: #34d399;
108
- --sema-cor-sucesso-fundo: #064e3b;
109
- --sema-cor-erro: #f87171;
110
- --sema-cor-erro-texto: #fecaca;
111
- --sema-cor-erro-fundo: #450a0a;
112
- --sema-cor-fundo: #09090b;
113
- --sema-cor-superficie: #18181b;
114
- --sema-cor-texto: #fafafa;
115
- --sema-cor-texto-secundario: #a1a1aa;
116
- --sema-cor-borda: #3f3f46;
117
- --sema-cor-borda-foco: #6366f1;
118
- --sema-cor-entidade: #a78bfa;
119
- }
120
- }
121
-
122
- /* ========================================
123
- Base
124
- ======================================== */
125
-
126
- *, *::before, *::after {
127
- box-sizing: border-box;
128
- margin: 0;
129
- padding: 0;
130
- }
131
-
132
- body {
133
- font-family: var(--sema-fonte);
134
- font-size: var(--sema-tamanho-base);
135
- line-height: 1.6;
136
- color: var(--sema-cor-texto);
137
- background-color: var(--sema-cor-fundo);
138
- -webkit-font-smoothing: antialiased;
139
- }
140
-
141
- /* ========================================
142
- Layout
143
- ======================================== */
144
-
145
- .sema-header {
146
- background: var(--sema-cor-superficie);
147
- border-bottom: 1px solid var(--sema-cor-borda);
148
- padding: var(--sema-espacamento-xl) var(--sema-espacamento-lg);
149
- text-align: center;
150
- }
151
-
152
- .sema-header h1 {
153
- font-size: var(--sema-tamanho-titulo);
154
- font-weight: 700;
155
- color: var(--sema-cor-primaria);
156
- letter-spacing: -0.02em;
157
- }
158
-
159
- .sema-subtitulo {
160
- color: var(--sema-cor-texto-secundario);
161
- font-size: var(--sema-tamanho-pequeno);
162
- margin-top: var(--sema-espacamento-xs);
163
- }
164
-
165
- .sema-main {
166
- max-width: 64rem;
167
- margin: 0 auto;
168
- padding: var(--sema-espacamento-xl) var(--sema-espacamento-lg);
169
- display: flex;
170
- flex-direction: column;
171
- gap: var(--sema-espacamento-lg);
172
- }
173
-
174
- .sema-footer {
175
- text-align: center;
176
- padding: var(--sema-espacamento-lg);
177
- color: var(--sema-cor-texto-secundario);
178
- font-size: var(--sema-tamanho-pequeno);
179
- border-top: 1px solid var(--sema-cor-borda);
180
- }
181
-
182
- .sema-footer code {
183
- font-family: var(--sema-fonte-mono);
184
- background: var(--sema-cor-primaria-suave);
185
- padding: 0.125rem 0.375rem;
186
- border-radius: 0.25rem;
187
- font-size: 0.8125rem;
188
- }
189
-
190
- /* ========================================
191
- Entities
192
- ======================================== */
193
-
194
- .sema-entity,
195
- .sema-task,
196
- .sema-enum,
197
- .sema-state,
198
- .sema-flow,
199
- .sema-route {
200
- background: var(--sema-cor-superficie);
201
- border: 1px solid var(--sema-cor-borda);
202
- border-radius: var(--sema-raio-lg);
203
- padding: var(--sema-espacamento-lg);
204
- box-shadow: var(--sema-sombra);
205
- transition: box-shadow var(--sema-transicao);
206
- }
207
-
208
- .sema-entity:hover,
209
- .sema-task:hover,
210
- .sema-route:hover {
211
- box-shadow: var(--sema-sombra-lg);
212
- }
213
-
214
- .sema-entity h3,
215
- .sema-task h3,
216
- .sema-enum h3,
217
- .sema-state h3,
218
- .sema-flow h3,
219
- .sema-route h3 {
220
- font-size: var(--sema-tamanho-subtitulo);
221
- font-weight: 600;
222
- margin-bottom: var(--sema-espacamento-md);
223
- color: var(--sema-cor-texto);
224
- }
225
-
226
- /* ========================================
227
- Tabelas de Entity
228
- ======================================== */
229
-
230
- .sema-tabela {
231
- width: 100%;
232
- border-collapse: collapse;
233
- font-size: var(--sema-tamanho-pequeno);
234
- }
235
-
236
- .sema-tabela th {
237
- text-align: left;
238
- padding: var(--sema-espacamento-sm) var(--sema-espacamento-md);
239
- background: var(--sema-cor-primaria-suave);
240
- border-bottom: 2px solid var(--sema-cor-borda);
241
- font-weight: 600;
242
- white-space: nowrap;
243
- }
244
-
245
- .sema-tabela th small {
246
- color: var(--sema-cor-texto-secundario);
247
- font-weight: 400;
248
- margin-left: 0.25rem;
249
- }
250
-
251
- .sema-tabela td {
252
- padding: var(--sema-espacamento-sm) var(--sema-espacamento-md);
253
- border-bottom: 1px solid var(--sema-cor-borda);
254
- color: var(--sema-cor-texto-secundario);
255
- }
256
-
257
- /* ========================================
258
- Formularios de Task
259
- ======================================== */
260
-
261
- .sema-formulario fieldset {
262
- border: 1px solid var(--sema-cor-borda);
263
- border-radius: var(--sema-raio);
264
- padding: var(--sema-espacamento-md);
265
- margin-bottom: var(--sema-espacamento-md);
266
- }
267
-
268
- .sema-formulario legend {
269
- font-weight: 600;
270
- font-size: var(--sema-tamanho-pequeno);
271
- color: var(--sema-cor-texto-secundario);
272
- padding: 0 var(--sema-espacamento-xs);
273
- text-transform: uppercase;
274
- letter-spacing: 0.05em;
275
- }
276
-
277
- .sema-campo {
278
- margin-bottom: var(--sema-espacamento-md);
279
- }
280
-
281
- .sema-campo label {
282
- display: block;
283
- font-weight: 500;
284
- font-size: var(--sema-tamanho-pequeno);
285
- margin-bottom: var(--sema-espacamento-xs);
286
- color: var(--sema-cor-texto);
287
- }
288
-
289
- .sema-obrigatorio {
290
- color: var(--sema-cor-erro);
291
- }
292
-
293
- .sema-campo input[type="text"],
294
- .sema-campo input[type="number"],
295
- .sema-campo input[type="email"],
296
- .sema-campo input[type="url"],
297
- .sema-campo input[type="date"],
298
- .sema-campo input[type="datetime-local"],
299
- .sema-campo textarea {
300
- width: 100%;
301
- padding: 0.5rem 0.75rem;
302
- font-family: var(--sema-fonte);
303
- font-size: var(--sema-tamanho-base);
304
- color: var(--sema-cor-texto);
305
- background: var(--sema-cor-fundo);
306
- border: 1px solid var(--sema-cor-borda);
307
- border-radius: var(--sema-raio);
308
- outline: none;
309
- transition: border-color var(--sema-transicao), box-shadow var(--sema-transicao);
310
- }
311
-
312
- .sema-campo input:focus,
313
- .sema-campo textarea:focus {
314
- border-color: var(--sema-cor-borda-foco);
315
- box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);
316
- }
317
-
318
- .sema-campo textarea {
319
- min-height: 5rem;
320
- resize: vertical;
321
- }
322
-
323
- .sema-campo-checkbox label {
324
- display: flex;
325
- align-items: center;
326
- gap: var(--sema-espacamento-sm);
327
- cursor: pointer;
328
- }
329
-
330
- .sema-campo-checkbox input[type="checkbox"] {
331
- width: 1.125rem;
332
- height: 1.125rem;
333
- accent-color: var(--sema-cor-primaria);
334
- }
335
-
336
- /* ========================================
337
- Botoes
338
- ======================================== */
339
-
340
- .sema-botao {
341
- display: inline-flex;
342
- align-items: center;
343
- justify-content: center;
344
- padding: 0.625rem 1.25rem;
345
- font-family: var(--sema-fonte);
346
- font-size: var(--sema-tamanho-base);
347
- font-weight: 600;
348
- color: #fff;
349
- background: var(--sema-cor-primaria);
350
- border: none;
351
- border-radius: var(--sema-raio);
352
- cursor: pointer;
353
- transition: background var(--sema-transicao), transform var(--sema-transicao);
354
- }
355
-
356
- .sema-botao:hover {
357
- background: var(--sema-cor-primaria-hover);
358
- transform: translateY(-1px);
359
- }
360
-
361
- .sema-botao:active {
362
- transform: translateY(0);
363
- }
364
-
365
- /* ========================================
366
- Erros
367
- ======================================== */
368
-
369
- .sema-erros {
370
- margin-top: var(--sema-espacamento-sm);
371
- }
372
-
373
- .sema-erro[hidden] {
374
- display: none;
375
- }
376
-
377
- /* ========================================
378
- Saida
379
- ======================================== */
380
-
381
- .sema-saida {
382
- margin-top: var(--sema-espacamento-md);
383
- padding: var(--sema-espacamento-md);
384
- background: var(--sema-cor-sucesso-fundo);
385
- border: 1px solid var(--sema-cor-sucesso);
386
- border-radius: var(--sema-raio);
387
- }
388
-
389
- .sema-saida[hidden] {
390
- display: none;
391
- }
392
-
393
- .sema-saida h4 {
394
- font-size: var(--sema-tamanho-pequeno);
395
- font-weight: 600;
396
- text-transform: uppercase;
397
- letter-spacing: 0.05em;
398
- color: var(--sema-cor-sucesso);
399
- margin-bottom: var(--sema-espacamento-sm);
400
- }
401
-
402
- .sema-campo-saida {
403
- padding: var(--sema-espacamento-xs) 0;
404
- font-size: var(--sema-tamanho-pequeno);
405
- }
406
-
407
- /* ========================================
408
- Selects (Enums)
409
- ======================================== */
410
-
411
- .sema-select {
412
- width: 100%;
413
- padding: 0.5rem 0.75rem;
414
- font-family: var(--sema-fonte);
415
- font-size: var(--sema-tamanho-base);
416
- color: var(--sema-cor-texto);
417
- background: var(--sema-cor-fundo);
418
- border: 1px solid var(--sema-cor-borda);
419
- border-radius: var(--sema-raio);
420
- outline: none;
421
- transition: border-color var(--sema-transicao);
422
- }
423
-
424
- .sema-select:focus {
425
- border-color: var(--sema-cor-borda-foco);
426
- box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);
427
- }
428
-
429
- /* ========================================
430
- States
431
- ======================================== */
432
-
433
- .sema-state {
434
- border-left: 3px solid var(--sema-cor-aviso);
435
- }
436
-
437
- .sema-transicoes {
438
- list-style: none;
439
- padding: 0;
440
- }
441
-
442
- .sema-transicoes li {
443
- padding: var(--sema-espacamento-sm) 0;
444
- border-bottom: 1px solid var(--sema-cor-borda);
445
- font-size: var(--sema-tamanho-pequeno);
446
- }
447
-
448
- .sema-transicoes li:last-child {
449
- border-bottom: none;
450
- }
451
-
452
- .sema-estado-origem {
453
- font-weight: 600;
454
- color: var(--sema-cor-texto);
455
- }
456
-
457
- .sema-estado-destino {
458
- color: var(--sema-cor-primaria);
459
- font-weight: 600;
460
- }
461
-
462
- /* ========================================
463
- Flows
464
- ======================================== */
465
-
466
- .sema-flow {
467
- border-left: 3px solid var(--sema-cor-info);
468
- }
469
-
470
- .sema-etapas {
471
- padding-left: var(--sema-espacamento-lg);
472
- counter-reset: etapa;
473
- }
474
-
475
- .sema-etapas li {
476
- padding: var(--sema-espacamento-sm) 0;
477
- font-size: var(--sema-tamanho-pequeno);
478
- }
479
-
480
- .sema-etapa strong {
481
- color: var(--sema-cor-primaria);
482
- }
483
-
484
- /* ========================================
485
- Routes
486
- ======================================== */
487
-
488
- .sema-route {
489
- border-left: 3px solid var(--sema-cor-sucesso);
490
- }
491
-
492
- .sema-route-detalhe {
493
- display: flex;
494
- align-items: center;
495
- gap: var(--sema-espacamento-sm);
496
- flex-wrap: wrap;
497
- margin-bottom: var(--sema-espacamento-sm);
498
- }
499
-
500
- .sema-route-metodo {
501
- display: inline-block;
502
- padding: 0.125rem 0.5rem;
503
- font-family: var(--sema-fonte-mono);
504
- font-size: var(--sema-tamanho-pequeno);
505
- font-weight: 700;
506
- color: #fff;
507
- background: var(--sema-cor-sucesso);
508
- border-radius: 0.25rem;
509
- text-transform: uppercase;
510
- }
511
-
512
- .sema-route-caminho {
513
- font-family: var(--sema-fonte-mono);
514
- font-size: var(--sema-tamanho-pequeno);
515
- color: var(--sema-cor-texto);
516
- }
517
-
518
- .sema-route-task {
519
- font-size: var(--sema-tamanho-pequeno);
520
- color: var(--sema-cor-texto-secundario);
521
- }
522
-
523
- .sema-route-io {
524
- margin-top: var(--sema-espacamento-sm);
525
- font-size: var(--sema-tamanho-pequeno);
526
- }
527
-
528
- .sema-route-io summary {
529
- cursor: pointer;
530
- font-weight: 500;
531
- color: var(--sema-cor-texto-secundario);
532
- }
533
-
534
- .sema-route-io ul {
535
- padding-left: var(--sema-espacamento-lg);
536
- margin-top: var(--sema-espacamento-xs);
537
- }
538
-
539
- /* ========================================
540
- Animacoes
541
- ======================================== */
542
-
543
- @keyframes sema-surgir {
544
- from {
545
- opacity: 0;
546
- transform: translateY(-4px);
547
- }
548
- to {
549
- opacity: 1;
550
- transform: translateY(0);
551
- }
552
- }
553
-
554
- /* ========================================
555
- Responsividade
556
- ======================================== */
557
-
558
- @media (max-width: 640px) {
559
- .sema-main {
560
- padding: var(--sema-espacamento-md);
561
- }
562
-
563
- .sema-header {
564
- padding: var(--sema-espacamento-lg) var(--sema-espacamento-md);
565
- }
566
-
567
- .sema-header h1 {
568
- font-size: 1.375rem;
569
- }
570
-
571
- .sema-tabela {
572
- display: block;
573
- overflow-x: auto;
574
- }
575
-
576
- .sema-route-detalhe {
577
- flex-direction: column;
578
- align-items: flex-start;
579
- }
580
- }
581
-
582
- /* ========================================
583
- Estilos especificos do modulo
584
- ======================================== */
585
-
586
- ${entidades}
587
- ${tasks}
588
- ${enums}
43
+ const css = `/* Arquivo gerado automaticamente pela Sema. */
44
+ /* Modulo de origem: ${modulo.nome} */
45
+
46
+ /* ========================================
47
+ Design System — Variaveis
48
+ ======================================== */
49
+
50
+ :root {
51
+ /* Cores principais */
52
+ --sema-cor-primaria: #6366f1;
53
+ --sema-cor-primaria-hover: #4f46e5;
54
+ --sema-cor-primaria-suave: #eef2ff;
55
+ --sema-cor-sucesso: #10b981;
56
+ --sema-cor-sucesso-fundo: #ecfdf5;
57
+ --sema-cor-erro: #ef4444;
58
+ --sema-cor-erro-texto: #991b1b;
59
+ --sema-cor-erro-fundo: #fef2f2;
60
+ --sema-cor-aviso: #f59e0b;
61
+ --sema-cor-info: #3b82f6;
62
+
63
+ /* Neutros */
64
+ --sema-cor-fundo: #fafafa;
65
+ --sema-cor-superficie: #ffffff;
66
+ --sema-cor-texto: #18181b;
67
+ --sema-cor-texto-secundario: #71717a;
68
+ --sema-cor-borda: #e4e4e7;
69
+ --sema-cor-borda-foco: #a5b4fc;
70
+ --sema-cor-entidade: #8b5cf6;
71
+
72
+ /* Tipografia */
73
+ --sema-fonte: "Inter", "Segoe UI", system-ui, -apple-system, sans-serif;
74
+ --sema-fonte-mono: "JetBrains Mono", "Fira Code", "Consolas", monospace;
75
+ --sema-tamanho-base: 0.9375rem;
76
+ --sema-tamanho-titulo: 1.75rem;
77
+ --sema-tamanho-subtitulo: 1.25rem;
78
+ --sema-tamanho-pequeno: 0.8125rem;
79
+
80
+ /* Espacamento */
81
+ --sema-espacamento-xs: 0.25rem;
82
+ --sema-espacamento-sm: 0.5rem;
83
+ --sema-espacamento-md: 1rem;
84
+ --sema-espacamento-lg: 1.5rem;
85
+ --sema-espacamento-xl: 2rem;
86
+
87
+ /* Bordas e sombras */
88
+ --sema-raio: 0.5rem;
89
+ --sema-raio-lg: 0.75rem;
90
+ --sema-sombra: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.04);
91
+ --sema-sombra-lg: 0 4px 12px rgba(0, 0, 0, 0.1);
92
+
93
+ /* Transicoes */
94
+ --sema-transicao: 150ms ease;
95
+ --sema-transicao-lenta: 300ms ease;
96
+ }
97
+
98
+ /* ========================================
99
+ Dark Mode
100
+ ======================================== */
101
+
102
+ @media (prefers-color-scheme: dark) {
103
+ :root {
104
+ --sema-cor-primaria: #818cf8;
105
+ --sema-cor-primaria-hover: #a5b4fc;
106
+ --sema-cor-primaria-suave: #1e1b4b;
107
+ --sema-cor-sucesso: #34d399;
108
+ --sema-cor-sucesso-fundo: #064e3b;
109
+ --sema-cor-erro: #f87171;
110
+ --sema-cor-erro-texto: #fecaca;
111
+ --sema-cor-erro-fundo: #450a0a;
112
+ --sema-cor-fundo: #09090b;
113
+ --sema-cor-superficie: #18181b;
114
+ --sema-cor-texto: #fafafa;
115
+ --sema-cor-texto-secundario: #a1a1aa;
116
+ --sema-cor-borda: #3f3f46;
117
+ --sema-cor-borda-foco: #6366f1;
118
+ --sema-cor-entidade: #a78bfa;
119
+ }
120
+ }
121
+
122
+ /* ========================================
123
+ Base
124
+ ======================================== */
125
+
126
+ *, *::before, *::after {
127
+ box-sizing: border-box;
128
+ margin: 0;
129
+ padding: 0;
130
+ }
131
+
132
+ body {
133
+ font-family: var(--sema-fonte);
134
+ font-size: var(--sema-tamanho-base);
135
+ line-height: 1.6;
136
+ color: var(--sema-cor-texto);
137
+ background-color: var(--sema-cor-fundo);
138
+ -webkit-font-smoothing: antialiased;
139
+ }
140
+
141
+ /* ========================================
142
+ Layout
143
+ ======================================== */
144
+
145
+ .sema-header {
146
+ background: var(--sema-cor-superficie);
147
+ border-bottom: 1px solid var(--sema-cor-borda);
148
+ padding: var(--sema-espacamento-xl) var(--sema-espacamento-lg);
149
+ text-align: center;
150
+ }
151
+
152
+ .sema-header h1 {
153
+ font-size: var(--sema-tamanho-titulo);
154
+ font-weight: 700;
155
+ color: var(--sema-cor-primaria);
156
+ letter-spacing: -0.02em;
157
+ }
158
+
159
+ .sema-subtitulo {
160
+ color: var(--sema-cor-texto-secundario);
161
+ font-size: var(--sema-tamanho-pequeno);
162
+ margin-top: var(--sema-espacamento-xs);
163
+ }
164
+
165
+ .sema-main {
166
+ max-width: 64rem;
167
+ margin: 0 auto;
168
+ padding: var(--sema-espacamento-xl) var(--sema-espacamento-lg);
169
+ display: flex;
170
+ flex-direction: column;
171
+ gap: var(--sema-espacamento-lg);
172
+ }
173
+
174
+ .sema-footer {
175
+ text-align: center;
176
+ padding: var(--sema-espacamento-lg);
177
+ color: var(--sema-cor-texto-secundario);
178
+ font-size: var(--sema-tamanho-pequeno);
179
+ border-top: 1px solid var(--sema-cor-borda);
180
+ }
181
+
182
+ .sema-footer code {
183
+ font-family: var(--sema-fonte-mono);
184
+ background: var(--sema-cor-primaria-suave);
185
+ padding: 0.125rem 0.375rem;
186
+ border-radius: 0.25rem;
187
+ font-size: 0.8125rem;
188
+ }
189
+
190
+ /* ========================================
191
+ Entities
192
+ ======================================== */
193
+
194
+ .sema-entity,
195
+ .sema-task,
196
+ .sema-enum,
197
+ .sema-state,
198
+ .sema-flow,
199
+ .sema-route {
200
+ background: var(--sema-cor-superficie);
201
+ border: 1px solid var(--sema-cor-borda);
202
+ border-radius: var(--sema-raio-lg);
203
+ padding: var(--sema-espacamento-lg);
204
+ box-shadow: var(--sema-sombra);
205
+ transition: box-shadow var(--sema-transicao);
206
+ }
207
+
208
+ .sema-entity:hover,
209
+ .sema-task:hover,
210
+ .sema-route:hover {
211
+ box-shadow: var(--sema-sombra-lg);
212
+ }
213
+
214
+ .sema-entity h3,
215
+ .sema-task h3,
216
+ .sema-enum h3,
217
+ .sema-state h3,
218
+ .sema-flow h3,
219
+ .sema-route h3 {
220
+ font-size: var(--sema-tamanho-subtitulo);
221
+ font-weight: 600;
222
+ margin-bottom: var(--sema-espacamento-md);
223
+ color: var(--sema-cor-texto);
224
+ }
225
+
226
+ /* ========================================
227
+ Tabelas de Entity
228
+ ======================================== */
229
+
230
+ .sema-tabela {
231
+ width: 100%;
232
+ border-collapse: collapse;
233
+ font-size: var(--sema-tamanho-pequeno);
234
+ }
235
+
236
+ .sema-tabela th {
237
+ text-align: left;
238
+ padding: var(--sema-espacamento-sm) var(--sema-espacamento-md);
239
+ background: var(--sema-cor-primaria-suave);
240
+ border-bottom: 2px solid var(--sema-cor-borda);
241
+ font-weight: 600;
242
+ white-space: nowrap;
243
+ }
244
+
245
+ .sema-tabela th small {
246
+ color: var(--sema-cor-texto-secundario);
247
+ font-weight: 400;
248
+ margin-left: 0.25rem;
249
+ }
250
+
251
+ .sema-tabela td {
252
+ padding: var(--sema-espacamento-sm) var(--sema-espacamento-md);
253
+ border-bottom: 1px solid var(--sema-cor-borda);
254
+ color: var(--sema-cor-texto-secundario);
255
+ }
256
+
257
+ /* ========================================
258
+ Formularios de Task
259
+ ======================================== */
260
+
261
+ .sema-formulario fieldset {
262
+ border: 1px solid var(--sema-cor-borda);
263
+ border-radius: var(--sema-raio);
264
+ padding: var(--sema-espacamento-md);
265
+ margin-bottom: var(--sema-espacamento-md);
266
+ }
267
+
268
+ .sema-formulario legend {
269
+ font-weight: 600;
270
+ font-size: var(--sema-tamanho-pequeno);
271
+ color: var(--sema-cor-texto-secundario);
272
+ padding: 0 var(--sema-espacamento-xs);
273
+ text-transform: uppercase;
274
+ letter-spacing: 0.05em;
275
+ }
276
+
277
+ .sema-campo {
278
+ margin-bottom: var(--sema-espacamento-md);
279
+ }
280
+
281
+ .sema-campo label {
282
+ display: block;
283
+ font-weight: 500;
284
+ font-size: var(--sema-tamanho-pequeno);
285
+ margin-bottom: var(--sema-espacamento-xs);
286
+ color: var(--sema-cor-texto);
287
+ }
288
+
289
+ .sema-obrigatorio {
290
+ color: var(--sema-cor-erro);
291
+ }
292
+
293
+ .sema-campo input[type="text"],
294
+ .sema-campo input[type="number"],
295
+ .sema-campo input[type="email"],
296
+ .sema-campo input[type="url"],
297
+ .sema-campo input[type="date"],
298
+ .sema-campo input[type="datetime-local"],
299
+ .sema-campo textarea {
300
+ width: 100%;
301
+ padding: 0.5rem 0.75rem;
302
+ font-family: var(--sema-fonte);
303
+ font-size: var(--sema-tamanho-base);
304
+ color: var(--sema-cor-texto);
305
+ background: var(--sema-cor-fundo);
306
+ border: 1px solid var(--sema-cor-borda);
307
+ border-radius: var(--sema-raio);
308
+ outline: none;
309
+ transition: border-color var(--sema-transicao), box-shadow var(--sema-transicao);
310
+ }
311
+
312
+ .sema-campo input:focus,
313
+ .sema-campo textarea:focus {
314
+ border-color: var(--sema-cor-borda-foco);
315
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);
316
+ }
317
+
318
+ .sema-campo textarea {
319
+ min-height: 5rem;
320
+ resize: vertical;
321
+ }
322
+
323
+ .sema-campo-checkbox label {
324
+ display: flex;
325
+ align-items: center;
326
+ gap: var(--sema-espacamento-sm);
327
+ cursor: pointer;
328
+ }
329
+
330
+ .sema-campo-checkbox input[type="checkbox"] {
331
+ width: 1.125rem;
332
+ height: 1.125rem;
333
+ accent-color: var(--sema-cor-primaria);
334
+ }
335
+
336
+ /* ========================================
337
+ Botoes
338
+ ======================================== */
339
+
340
+ .sema-botao {
341
+ display: inline-flex;
342
+ align-items: center;
343
+ justify-content: center;
344
+ padding: 0.625rem 1.25rem;
345
+ font-family: var(--sema-fonte);
346
+ font-size: var(--sema-tamanho-base);
347
+ font-weight: 600;
348
+ color: #fff;
349
+ background: var(--sema-cor-primaria);
350
+ border: none;
351
+ border-radius: var(--sema-raio);
352
+ cursor: pointer;
353
+ transition: background var(--sema-transicao), transform var(--sema-transicao);
354
+ }
355
+
356
+ .sema-botao:hover {
357
+ background: var(--sema-cor-primaria-hover);
358
+ transform: translateY(-1px);
359
+ }
360
+
361
+ .sema-botao:active {
362
+ transform: translateY(0);
363
+ }
364
+
365
+ /* ========================================
366
+ Erros
367
+ ======================================== */
368
+
369
+ .sema-erros {
370
+ margin-top: var(--sema-espacamento-sm);
371
+ }
372
+
373
+ .sema-erro[hidden] {
374
+ display: none;
375
+ }
376
+
377
+ /* ========================================
378
+ Saida
379
+ ======================================== */
380
+
381
+ .sema-saida {
382
+ margin-top: var(--sema-espacamento-md);
383
+ padding: var(--sema-espacamento-md);
384
+ background: var(--sema-cor-sucesso-fundo);
385
+ border: 1px solid var(--sema-cor-sucesso);
386
+ border-radius: var(--sema-raio);
387
+ }
388
+
389
+ .sema-saida[hidden] {
390
+ display: none;
391
+ }
392
+
393
+ .sema-saida h4 {
394
+ font-size: var(--sema-tamanho-pequeno);
395
+ font-weight: 600;
396
+ text-transform: uppercase;
397
+ letter-spacing: 0.05em;
398
+ color: var(--sema-cor-sucesso);
399
+ margin-bottom: var(--sema-espacamento-sm);
400
+ }
401
+
402
+ .sema-campo-saida {
403
+ padding: var(--sema-espacamento-xs) 0;
404
+ font-size: var(--sema-tamanho-pequeno);
405
+ }
406
+
407
+ /* ========================================
408
+ Selects (Enums)
409
+ ======================================== */
410
+
411
+ .sema-select {
412
+ width: 100%;
413
+ padding: 0.5rem 0.75rem;
414
+ font-family: var(--sema-fonte);
415
+ font-size: var(--sema-tamanho-base);
416
+ color: var(--sema-cor-texto);
417
+ background: var(--sema-cor-fundo);
418
+ border: 1px solid var(--sema-cor-borda);
419
+ border-radius: var(--sema-raio);
420
+ outline: none;
421
+ transition: border-color var(--sema-transicao);
422
+ }
423
+
424
+ .sema-select:focus {
425
+ border-color: var(--sema-cor-borda-foco);
426
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);
427
+ }
428
+
429
+ /* ========================================
430
+ States
431
+ ======================================== */
432
+
433
+ .sema-state {
434
+ border-left: 3px solid var(--sema-cor-aviso);
435
+ }
436
+
437
+ .sema-transicoes {
438
+ list-style: none;
439
+ padding: 0;
440
+ }
441
+
442
+ .sema-transicoes li {
443
+ padding: var(--sema-espacamento-sm) 0;
444
+ border-bottom: 1px solid var(--sema-cor-borda);
445
+ font-size: var(--sema-tamanho-pequeno);
446
+ }
447
+
448
+ .sema-transicoes li:last-child {
449
+ border-bottom: none;
450
+ }
451
+
452
+ .sema-estado-origem {
453
+ font-weight: 600;
454
+ color: var(--sema-cor-texto);
455
+ }
456
+
457
+ .sema-estado-destino {
458
+ color: var(--sema-cor-primaria);
459
+ font-weight: 600;
460
+ }
461
+
462
+ /* ========================================
463
+ Flows
464
+ ======================================== */
465
+
466
+ .sema-flow {
467
+ border-left: 3px solid var(--sema-cor-info);
468
+ }
469
+
470
+ .sema-etapas {
471
+ padding-left: var(--sema-espacamento-lg);
472
+ counter-reset: etapa;
473
+ }
474
+
475
+ .sema-etapas li {
476
+ padding: var(--sema-espacamento-sm) 0;
477
+ font-size: var(--sema-tamanho-pequeno);
478
+ }
479
+
480
+ .sema-etapa strong {
481
+ color: var(--sema-cor-primaria);
482
+ }
483
+
484
+ /* ========================================
485
+ Routes
486
+ ======================================== */
487
+
488
+ .sema-route {
489
+ border-left: 3px solid var(--sema-cor-sucesso);
490
+ }
491
+
492
+ .sema-route-detalhe {
493
+ display: flex;
494
+ align-items: center;
495
+ gap: var(--sema-espacamento-sm);
496
+ flex-wrap: wrap;
497
+ margin-bottom: var(--sema-espacamento-sm);
498
+ }
499
+
500
+ .sema-route-metodo {
501
+ display: inline-block;
502
+ padding: 0.125rem 0.5rem;
503
+ font-family: var(--sema-fonte-mono);
504
+ font-size: var(--sema-tamanho-pequeno);
505
+ font-weight: 700;
506
+ color: #fff;
507
+ background: var(--sema-cor-sucesso);
508
+ border-radius: 0.25rem;
509
+ text-transform: uppercase;
510
+ }
511
+
512
+ .sema-route-caminho {
513
+ font-family: var(--sema-fonte-mono);
514
+ font-size: var(--sema-tamanho-pequeno);
515
+ color: var(--sema-cor-texto);
516
+ }
517
+
518
+ .sema-route-task {
519
+ font-size: var(--sema-tamanho-pequeno);
520
+ color: var(--sema-cor-texto-secundario);
521
+ }
522
+
523
+ .sema-route-io {
524
+ margin-top: var(--sema-espacamento-sm);
525
+ font-size: var(--sema-tamanho-pequeno);
526
+ }
527
+
528
+ .sema-route-io summary {
529
+ cursor: pointer;
530
+ font-weight: 500;
531
+ color: var(--sema-cor-texto-secundario);
532
+ }
533
+
534
+ .sema-route-io ul {
535
+ padding-left: var(--sema-espacamento-lg);
536
+ margin-top: var(--sema-espacamento-xs);
537
+ }
538
+
539
+ /* ========================================
540
+ Animacoes
541
+ ======================================== */
542
+
543
+ @keyframes sema-surgir {
544
+ from {
545
+ opacity: 0;
546
+ transform: translateY(-4px);
547
+ }
548
+ to {
549
+ opacity: 1;
550
+ transform: translateY(0);
551
+ }
552
+ }
553
+
554
+ /* ========================================
555
+ Responsividade
556
+ ======================================== */
557
+
558
+ @media (max-width: 640px) {
559
+ .sema-main {
560
+ padding: var(--sema-espacamento-md);
561
+ }
562
+
563
+ .sema-header {
564
+ padding: var(--sema-espacamento-lg) var(--sema-espacamento-md);
565
+ }
566
+
567
+ .sema-header h1 {
568
+ font-size: 1.375rem;
569
+ }
570
+
571
+ .sema-tabela {
572
+ display: block;
573
+ overflow-x: auto;
574
+ }
575
+
576
+ .sema-route-detalhe {
577
+ flex-direction: column;
578
+ align-items: flex-start;
579
+ }
580
+ }
581
+
582
+ /* ========================================
583
+ Estilos especificos do modulo
584
+ ======================================== */
585
+
586
+ ${entidades}
587
+ ${tasks}
588
+ ${enums}
589
589
  `;
590
590
  return [{ caminhoRelativo: `${nomeBase}.css`, conteudo: css }];
591
591
  }