synthesisui 0.16.356 → 0.16.357

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.
@@ -59,23 +59,49 @@ const segments = (name) => name.replace(/^--/, "").split("-");
59
59
  *
60
60
  * 1. quantos segmentos ele compartilha com o nosso token daquela família
61
61
  * `--ds-radius-xs` puxa `--radius-xs` (2) e não `--spacing` (0)
62
- * 2. a convenção dominante dele - o primeiro segmento mais frequente entre os tokens dele
62
+ * 2. quantos segmentos dele são um PAPEL que este sistema declara - ver `roles`
63
+ * 3. a convenção dominante dele - o primeiro segmento mais frequente entre os tokens dele
63
64
  * no repo real, `--color-*` (57) contra `--dashboard-*` (25)
64
- * 3. ordem de declaração, que é o desempate que sempre existe e nunca inventa
65
+ * 4. ordem de declaração, que é o desempate que sempre existe e nunca inventa
66
+ *
67
+ * O CRITÉRIO 2 NASCEU DE UMA DECISÃO DO DONO (03/09), e o critério 1 não alcançava o caso. No
68
+ * sistema dele `#f59e0b` é `--color-tier-gold` E `--color-feedback-warning`, e medindo o censo:
69
+ * `tier-gold` tem 59 menções contra 7, e uma escada própria (bronze 13, prata 13). Pela contagem
70
+ * bruta ele venceria - e vencia, sempre que o nosso token daquele valor não existisse para o
71
+ * critério 1 comparar: aí caía na ORDEM DE DECLARAÇÃO, e `tier-gold` vem antes no CSS dele.
72
+ *
73
+ * A ESCOLHA NÃO É PELO MAIS FREQUENTE, É PELO ERRO QUE SE ANUNCIA. `feedback-warning` escrito num
74
+ * badge de nível mostra "warning" onde devia ser ouro, e quem lê corrige. `tier-gold` escrito num
75
+ * alerta pinta a cor CERTA com o nome de outro domínio - a tela fica visualmente correta e ninguém
76
+ * corrige nunca. Entre dois nomes dele, o que descreve um PAPEL erra alto; o que descreve um
77
+ * domínio de negócio erra calado.
65
78
  */
66
- function pick(candidates, ours, convention) {
79
+ function pick(candidates, ours, convention,
80
+ /**
81
+ * OS PAPÉIS QUE ESTE SISTEMA DECLARA - o critério 2, e o único que decide quando não há token
82
+ * nosso daquele valor para comparar.
83
+ *
84
+ * DERIVADO, nunca escrito: são os segmentos finais dos papéis semânticos do próprio sistema, e
85
+ * por isso a regra vale em qualquer projeto. Um projeto que chame o aviso de `atencao` puxa
86
+ * `atencao`; nenhum nome de família deste ou daquele repositório entra aqui (`INV-GERAL-07`).
87
+ */
88
+ roles) {
67
89
  const mine = ours ? new Set(segments(ours)) : null;
68
90
  let best = candidates[0];
69
- let bestScore = [-1, -1];
91
+ let bestScore = [-1, -1, -1];
70
92
  for (const name of candidates) {
71
93
  const parts = segments(name);
72
94
  const shared = mine ? parts.filter((p) => mine.has(p)).length : 0;
73
95
  const score = [
74
96
  shared,
97
+ parts.filter((p) => roles.has(p)).length,
75
98
  convention.get(parts[0] ?? "") ?? 0,
76
99
  ];
77
100
  if (score[0] > bestScore[0] ||
78
- (score[0] === bestScore[0] && score[1] > bestScore[1])) {
101
+ (score[0] === bestScore[0] && score[1] > bestScore[1]) ||
102
+ (score[0] === bestScore[0] &&
103
+ score[1] === bestScore[1] &&
104
+ score[2] > bestScore[2])) {
79
105
  best = name;
80
106
  bestScore = score;
81
107
  }
@@ -106,14 +132,29 @@ function pick(candidates, ours, convention) {
106
132
  * sistema do dono, `#f59e0b` é `--color-tier-gold` E `--color-feedback-warning` - dois conceitos
107
133
  * dele, gamificação e estado -, e o relatório dizia `→ {color.tier-gold}` como se fosse fato.
108
134
  */
109
- function escolha(candidates, ours, convention) {
110
- const name = pick(candidates, ours, convention);
135
+ function escolha(candidates, ours, convention, roles) {
136
+ const name = pick(candidates, ours, convention, roles);
111
137
  return { name, also: candidates.filter((c) => c !== name) };
112
138
  }
113
139
  export function theirNames(ours, theirs) {
114
140
  const out = new Map();
115
141
  if (theirs.byName.size === 0)
116
142
  return out;
143
+ /**
144
+ * OS PAPÉIS QUE ESTE SISTEMA DECLARA, derivados dos NOSSOS nomes - ver o critério 2 de `pick`.
145
+ *
146
+ * O último segmento de cada token semântico é o papel: `--ds-color-semantic-warning` dá
147
+ * `warning`. Sai daqui e não de uma lista escrita porque uma lista seria o nosso vocabulário
148
+ * virando régua - um sistema que chame o aviso de `atencao` tem que puxar `atencao`.
149
+ */
150
+ const roles = new Set();
151
+ for (const name of ours.byName.keys()) {
152
+ if (!name.includes("-semantic-"))
153
+ continue;
154
+ const last = segments(name).at(-1);
155
+ if (last)
156
+ roles.add(last);
157
+ }
117
158
  /** A convenção dominante dele, contada e não suposta - ver `pick`. */
118
159
  const convention = new Map();
119
160
  for (const name of theirs.byName.keys()) {
@@ -151,7 +192,7 @@ export function theirNames(ours, theirs) {
151
192
  : candidates.filter((n) => familySays(kind, n));
152
193
  if (usable.length === 0)
153
194
  continue;
154
- out.set(key, escolha(usable, name, convention));
195
+ out.set(key, escolha(usable, name, convention, roles));
155
196
  }
156
197
  }
157
198
  for (const [value, candidates] of theirs.byValue) {
@@ -161,7 +202,7 @@ export function theirNames(ours, theirs) {
161
202
  const key = `${kind}:${value}`;
162
203
  if (out.has(key))
163
204
  continue;
164
- out.set(key, escolha(candidates, null, convention));
205
+ out.set(key, escolha(candidates, null, convention, roles));
165
206
  }
166
207
  }
167
208
  return out;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.356",
3
+ "version": "0.16.357",
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": {