synthesisui 0.16.434 → 0.16.436

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.
@@ -56,7 +56,7 @@ import { consumersOf, outsideScope, } from "../outside-scope.js";
56
56
  import { phase, startProgress } from "../progress.js";
57
57
  import { repoStateOf } from "../repo-state.js";
58
58
  import { relatorioHtml, secoesDe } from "../report-html.js";
59
- import { abertura, aneis, historiaDeCor, oQueMuda } from "../report-insight.js";
59
+ import { abertura, aneis, historiaDeCor, oQueMuda, passos, } from "../report-insight.js";
60
60
  import { runtimeDeclaredVars, runtimeDeclaredVarsIn } from "../runtime-vars.js";
61
61
  import { detectStack, resolveDeps, stackVersions } from "../stack.js";
62
62
  import { desligarCaptura, ligarCaptura } from "../transcript.js";
@@ -3793,6 +3793,7 @@ async function mostrarInspecao(c, root, transcrito) {
3793
3793
  */
3794
3794
  comando: "npx synthesisui@latest import",
3795
3795
  muda: oQueMuda(c),
3796
+ passos: passos(),
3796
3797
  });
3797
3798
  console.log(section("What came out of your files"));
3798
3799
  console.log(body(`${paint.strong(`${lidos} of ${total}`)} components came out with a blueprint${pct === null
@@ -1,4 +1,12 @@
1
1
  import { FAMILY_SEAM_PREFIX } from "./fonts.js";
2
+ /**
3
+ * A PÁGINA QUE O BOTÃO ABRE (dono, 19/09) - e ela SOMA ao passo a passo, nunca o substitui.
4
+ *
5
+ * Um endereço não é uma requisição: a página desenha inteira sem rede, e o navegador só o segue se
6
+ * a pessoa clicar. É por isso que ele convive com o auto-contido - e é por isso que os três
7
+ * comandos continuam escritos aqui dentro, para quem abrir o arquivo offline.
8
+ */
9
+ const INSTALL_URL = "https://www.synthesisui.com/install";
2
10
  import { HALOGEN_TOKENS, HALOGEN_VERSION } from "./report-theme.js";
3
11
  import { semCor } from "./transcript.js";
4
12
  /**
@@ -113,6 +121,7 @@ ${desenharCor(input.cor)}
113
121
  ${corpo}
114
122
 
115
123
  ${desenharMuda(input.muda ?? [], input.comando)}
124
+ ${desenharPassos(input.passos ?? [])}
116
125
 
117
126
  <footer>
118
127
  <p>Dressed by Halogen v${HALOGEN_VERSION}, a design system from the SynthesisUI gallery.</p>
@@ -124,6 +133,34 @@ ${desenharMuda(input.muda ?? [], input.comando)}
124
133
  </html>
125
134
  `;
126
135
  }
136
+ /**
137
+ * O CAMINHO INTEIRO, numerado, com o que cada comando FAZ antes do que digitar.
138
+ *
139
+ * O botão no topo do bloco não é decoração: quem leu a conta e decidiu adotar tem um alvo único
140
+ * para o olho, e o passo a passo logo abaixo para quando ele perguntar "e depois?". Ele leva para a
141
+ * primeira linha - não para fora da página, porque a página não faz requisição nenhuma.
142
+ */
143
+ function desenharPassos(passos) {
144
+ if (passos.length === 0)
145
+ return "";
146
+ const itens = passos
147
+ .map((p, i) => ` <li>
148
+ <div class="passo-topo"><b>${i + 1}</b><h3>${escapar(p.titulo)}</h3></div>
149
+ <code class="comando grande">${escapar(p.comando)}</code>
150
+ <p>${escapar(p.porque)}</p>
151
+ </li>`)
152
+ .join("\n");
153
+ return ` <section class="chapter passos" style="--ordem:12">
154
+ <div class="passos-topo">
155
+ <h2><span>How to install it, start to finish</span></h2>
156
+ <a class="botao" href="${INSTALL_URL}" target="_blank" rel="noreferrer">Open the install page</a>
157
+ </div>
158
+ <p class="callout">Three commands, in this order. Each one says what it does before it says what to type - a command without a stated consequence is somebody pasting into their terminal on faith. They are all here, so this works with no internet at all.</p>
159
+ <ol class="lista-passos" id="passo-1">
160
+ ${itens}
161
+ </ol>
162
+ </section>`;
163
+ }
127
164
  /**
128
165
  * A ÚLTIMA COISA QUE ELA LÊ: a conta, e não mais um inventário.
129
166
  *
@@ -398,15 +435,21 @@ body {
398
435
  .bar-in {
399
436
  max-width: 1200px;
400
437
  margin-inline: auto;
401
- padding: 11px 24px;
438
+ padding: 0 24px;
439
+ min-height: 64px;
440
+ display: grid;
441
+ grid-template-columns: 230px minmax(0, 1fr);
442
+ gap: 40px;
443
+ align-items: center;
444
+ }
445
+ .bar-repo { margin: 2px 0 0; font-weight: 600; }
446
+ .bar-fim {
402
447
  display: flex;
448
+ align-items: center;
449
+ gap: 14px;
403
450
  flex-wrap: wrap;
404
- gap: 8px 24px;
405
- align-items: baseline;
406
451
  justify-content: space-between;
407
452
  }
408
- .bar-repo { margin: 2px 0 0; font-weight: 600; }
409
- .bar-fim { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
410
453
 
411
454
  /* O COMANDO NO TOPO, sem rolar: quem decidiu adotar no meio da leitura nao volta para procura-lo. */
412
455
  .comando {
@@ -692,10 +735,54 @@ footer { margin-top: 40px; color: var(--ds-color-semantic-muted); font-size: 13p
692
735
  @keyframes girar { from { --fatia: 0%; } }
693
736
 
694
737
  @media (max-width: 900px) {
695
- .wrap { grid-template-columns: minmax(0, 1fr); gap: 0; }
738
+ .wrap, .bar-in { grid-template-columns: minmax(0, 1fr); gap: 8px; }
739
+ .bar-in { padding-block: 10px; }
696
740
  .lado { position: static; max-height: none; padding-bottom: 20px; }
697
741
  }
698
742
 
743
+ /* O BOTAO: um alvo unico para quem leu a conta e decidiu, no topo direito do capitulo. Ele abre a
744
+ pagina publica de instalacao - e isso nao quebra o auto-contido, porque um endereco so e buscado
745
+ se a pessoa clicar. Os tres comandos seguem escritos aqui embaixo, para quem esta sem rede. */
746
+ .passos-topo {
747
+ display: flex;
748
+ align-items: center;
749
+ justify-content: space-between;
750
+ gap: 16px;
751
+ flex-wrap: wrap;
752
+ }
753
+ .passos-topo h2 { margin-bottom: 0; }
754
+ .botao {
755
+ display: inline-block;
756
+ margin: 0;
757
+ padding: 12px 22px;
758
+ border-radius: var(--ds-radius-lg, 12px);
759
+ background: var(--ds-color-semantic-accent);
760
+ color: var(--ds-color-semantic-canvas);
761
+ font-weight: 600;
762
+ font-size: 14px;
763
+ text-decoration: none;
764
+ }
765
+ .botao:hover { opacity: 0.9; }
766
+
767
+ .lista-passos { list-style: none; margin: 0; padding: 0; display: grid; gap: 22px; }
768
+ .lista-passos li {
769
+ border-left: 2px solid var(--ds-color-semantic-border);
770
+ padding-left: 18px;
771
+ }
772
+ .passo-topo { display: flex; align-items: center; gap: 10px; }
773
+ .passo-topo b {
774
+ width: 22px;
775
+ height: 22px;
776
+ border-radius: 50%;
777
+ display: grid;
778
+ place-items: center;
779
+ font-size: 12px;
780
+ background: var(--ds-color-semantic-accent);
781
+ color: var(--ds-color-semantic-canvas);
782
+ }
783
+ .passo-topo h3 { margin: 0; font-size: 15px; }
784
+ .lista-passos p { margin: 10px 0 0; color: var(--ds-color-semantic-muted); font-size: 14px; }
785
+
699
786
  @media print {
700
787
  .bar { position: static; }
701
788
  nav { display: none; }
@@ -169,3 +169,36 @@ export function oQueMuda(c) {
169
169
  linhas.push("And it stops coming back: once the system is in the repository, the check runs after every file your agent writes and catches a value that drifts off your own scale, before it ships.");
170
170
  return linhas;
171
171
  }
172
+ /**
173
+ * O PASSO A PASSO INTEIRO, do login ao import (pedido dele, 18/09).
174
+ *
175
+ * O QUE O CLIENTE GANHA: ela termina a leitura sabendo exatamente o que digitar, na ordem, sem
176
+ * abrir documentação nenhuma. Cada passo diz o que FAZ antes de dizer o que digitar - um comando
177
+ * sem consequência declarada é uma pessoa colando algo no terminal dela por fé.
178
+ *
179
+ * A ORDEM NÃO É GOSTO, é a única que funciona: o `connect` instala hook, ferramentas e skills, e um
180
+ * agente só os enxerga numa sessão iniciada DEPOIS; e o `import` precisa do token que o `login`
181
+ * deixa nesta máquina - sem ele a leitura sobe e morre num 401 três passos adiante.
182
+ *
183
+ * ELE É FIXO PORQUE A ESTEIRA É FIXA: estes três comandos são os mesmos em qualquer projeto, e é
184
+ * exatamente por isso que eles podem ser escritos aqui sem medir nada do repositório dela.
185
+ */
186
+ export function passos() {
187
+ return [
188
+ {
189
+ comando: "npx synthesisui@latest login",
190
+ titulo: "Let this machine in",
191
+ porque: "Opens a page that already knows you and leaves a token in ~/.synthesisui/ on this computer. It is one click on a code - there is no account to fill in halfway through a terminal.",
192
+ },
193
+ {
194
+ comando: "npx synthesisui@latest connect",
195
+ titulo: "Wire your agent",
196
+ porque: "Installs the check that runs after every file your agent writes, the tools it can query, and the skills that know this pipeline. Nothing of your code is touched or sent. Run it before you open the agent - a session only picks these up when it starts.",
197
+ },
198
+ {
199
+ comando: "npx synthesisui@latest import",
200
+ titulo: "Turn your code into blueprints",
201
+ porque: "Reads the same values you saw above and writes them down as your design system, in your own vocabulary. From here your agent reads them before it writes anything, so consistency becomes something the project knows rather than something you remember.",
202
+ },
203
+ ];
204
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.434",
3
+ "version": "0.16.436",
4
4
  "description": "Bring SynthesisUI design systems into any project - tokens, typed components, whole pages and an agent-ready CLAUDE.md manifest.",
5
5
  "type": "module",
6
6
  "bin": {