synthesisui 0.16.314 → 0.16.317
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.
- package/dist/commands/add.js +2 -2
- package/dist/commands/doctor.js +3 -1
- package/dist/commands/import.js +3 -1
- package/dist/commands/sync.js +6 -0
- package/dist/doctor/value-ledger.js +12 -3
- package/dist/fonts.js +14 -2
- package/dist/guide.js +4 -3
- package/dist/install-marks.js +6 -1
- package/dist/populations.spec-input.js +7 -5
- package/dist/their-vars.js +3 -1
- package/package.json +1 -1
package/dist/commands/add.js
CHANGED
|
@@ -581,7 +581,7 @@ export async function add(slug, opts) {
|
|
|
581
581
|
const families = payload.document.foundations.typography.families;
|
|
582
582
|
const fontsHref = googleFontsHref(families);
|
|
583
583
|
const nextFonts = projectConfig.target === "next"
|
|
584
|
-
? nextFontSnippet(families, payload.slug, appDir)
|
|
584
|
+
? nextFontSnippet(families, payload.slug, appDir, payload.fontSeam)
|
|
585
585
|
: null;
|
|
586
586
|
if (nextFonts) {
|
|
587
587
|
/**
|
|
@@ -603,7 +603,7 @@ export async function add(slug, opts) {
|
|
|
603
603
|
continue;
|
|
604
604
|
if (!(await exists(join(projectRoot, ...dir.split("/")))))
|
|
605
605
|
continue;
|
|
606
|
-
const snippet = nextFontSnippet(families, payload.slug, dir);
|
|
606
|
+
const snippet = nextFontSnippet(families, payload.slug, dir, payload.fontSeam);
|
|
607
607
|
if (!snippet)
|
|
608
608
|
continue;
|
|
609
609
|
const header = [
|
package/dist/commands/doctor.js
CHANGED
|
@@ -16,6 +16,7 @@ import { diagnose, nameToWrite, scanSource, siblingTokens, } from "../doctor/sca
|
|
|
16
16
|
import { findSelfConflicts, forbiddenProps, isReset, propMatchesLabel, } from "../doctor/self-conflict.js";
|
|
17
17
|
import { withTheirNames } from "../doctor/their-names.js";
|
|
18
18
|
import { buildTable, EMPTY_TABLE, nearestToken, } from "../doctor/tokens.js";
|
|
19
|
+
import { FAMILY_SEAM_PREFIX } from "../fonts.js";
|
|
19
20
|
import { groupRole } from "../group-role.js";
|
|
20
21
|
import { actingSlug, describeScope, measuredScope, scopePaths, } from "../measured-scope.js";
|
|
21
22
|
import { body, paint, section, snippet } from "../output.js";
|
|
@@ -554,7 +555,8 @@ async function readWiring(root, slug) {
|
|
|
554
555
|
// default face (my-test2, 27/07). What the checker checks is what gets done.
|
|
555
556
|
if (src.includes("--font-ds-") && /next\/font/.test(src))
|
|
556
557
|
w.fontsWritten = true;
|
|
557
|
-
|
|
558
|
+
/** O prefixo vem da const única da costura - um literal aqui divergiria em silêncio (26/08). */
|
|
559
|
+
if (new RegExp(`${FAMILY_SEAM_PREFIX}\\w+\\s*:\\s*var\\(\\s*--font-ds-`).test(src))
|
|
558
560
|
w.fontsMapped = true;
|
|
559
561
|
// The bridge joins the early exit, otherwise the walk can stop before the
|
|
560
562
|
// stylesheet that imports it and report a wired project as unbridged.
|
package/dist/commands/import.js
CHANGED
|
@@ -1859,6 +1859,8 @@ export async function takeCensus(root, opts) {
|
|
|
1859
1859
|
* 26/08), e é esta régua - a mesma que a tela usa. A frase do ledger passa a liderar com ela.
|
|
1860
1860
|
*/
|
|
1861
1861
|
const valueByComponent = {};
|
|
1862
|
+
/** As respostas do dono, quando o chamador as trouxe - ver `opts.answered` e o T1. */
|
|
1863
|
+
const answeredTokens = (opts?.answered?.length ?? 0) > 0 ? new Set(opts?.answered) : undefined;
|
|
1862
1864
|
for (const [lookName, look] of Object.entries(looks)) {
|
|
1863
1865
|
const tokens = [];
|
|
1864
1866
|
for (const node of look.sketch ?? []) {
|
|
@@ -1867,7 +1869,7 @@ export async function takeCensus(root, opts) {
|
|
|
1867
1869
|
for (const layer of look.rawLayers ?? [])
|
|
1868
1870
|
tokens.push(...layer.classes);
|
|
1869
1871
|
if (tokens.length > 0) {
|
|
1870
|
-
valueByComponent[lookName] = accountClasses(tokens, declaredValues);
|
|
1872
|
+
valueByComponent[lookName] = accountClasses(tokens, declaredValues, answeredTokens);
|
|
1871
1873
|
}
|
|
1872
1874
|
}
|
|
1873
1875
|
const valuesTotal = sumAccounts(Object.values(valueByComponent));
|
package/dist/commands/sync.js
CHANGED
|
@@ -403,6 +403,12 @@ export async function remeasure(args) {
|
|
|
403
403
|
const c = await takeCensus(one ? join(root, one) : root, {
|
|
404
404
|
...(one ? { scopeLabel: one } : {}),
|
|
405
405
|
...(args.cli ? { cli: args.cli } : {}),
|
|
406
|
+
/**
|
|
407
|
+
* AS RESPOSTAS DELE CONTAM NO NÚMERO (T1): o servidor devolve os tokens já respondidos na
|
|
408
|
+
* mesma resposta da leitura, e a medição os classifica como `answered` em vez de `unread` -
|
|
409
|
+
* é o que faz o `gaps` e o painel dizerem "N answered by you" a partir da MEDIÇÃO.
|
|
410
|
+
*/
|
|
411
|
+
...(stored.answered?.length ? { answered: stored.answered } : {}),
|
|
406
412
|
/** Uma RE-medição conta o que MUDOU; o relatório inteiro fica no `--full` - ver `say`. */
|
|
407
413
|
...(args.full ? {} : { quiet: true }),
|
|
408
414
|
/** O `--usage` é EVIDÊNCIA e leva rótulo: sem ele o censo não sabe de que app o número veio. */
|
|
@@ -98,8 +98,14 @@ const STRUCTURAL_TOKENS = new Set([
|
|
|
98
98
|
/**
|
|
99
99
|
* O destino de UM token de classe. Exportado para o julgamento por valor e a triagem lerem a
|
|
100
100
|
* MESMA resposta - duas cópias desta decisão é como o item 11 nasceu.
|
|
101
|
+
*
|
|
102
|
+
* `answered` FECHA O CICLO DO ELO 3 (T1, 26/08): a resposta que o dono deu ontem aparece no número
|
|
103
|
+
* de hoje. O conjunto vem do servidor pela rota `reading` do sync - são os tokens que ele já
|
|
104
|
+
* respondeu -, e ele só reclassifica o que seria `unread`: uma resposta preenche ausência, nunca
|
|
105
|
+
* disputa o que o leitor resolve sozinho. Sem o conjunto (import fresco, triagem, julgamento por
|
|
106
|
+
* fragmento) a conta é a mesma de sempre.
|
|
101
107
|
*/
|
|
102
|
-
export function destinationOf(cls, declared) {
|
|
108
|
+
export function destinationOf(cls, declared, answered) {
|
|
103
109
|
const { utility } = parseClass(cls);
|
|
104
110
|
if (STRUCTURAL_TOKENS.has(utility))
|
|
105
111
|
return "structure";
|
|
@@ -109,10 +115,13 @@ export function destinationOf(cls, declared) {
|
|
|
109
115
|
? "structure"
|
|
110
116
|
: "interpreted";
|
|
111
117
|
}
|
|
118
|
+
/** A grafia respondida é a do código dele - com o modificador fora, como `applyAnswers` casa. */
|
|
119
|
+
if (answered && (answered.has(utility) || answered.has(cls)))
|
|
120
|
+
return "answered";
|
|
112
121
|
return "unread";
|
|
113
122
|
}
|
|
114
123
|
/** A conta de uma lista de tokens - a soma SEMPRE fecha com `seen`, por construção. */
|
|
115
|
-
export function accountClasses(tokens, declared) {
|
|
124
|
+
export function accountClasses(tokens, declared, answered) {
|
|
116
125
|
const account = {
|
|
117
126
|
seen: 0,
|
|
118
127
|
interpreted: 0,
|
|
@@ -123,7 +132,7 @@ export function accountClasses(tokens, declared) {
|
|
|
123
132
|
};
|
|
124
133
|
for (const cls of tokens) {
|
|
125
134
|
account.seen += 1;
|
|
126
|
-
account[destinationOf(cls, declared)] += 1;
|
|
135
|
+
account[destinationOf(cls, declared, answered)] += 1;
|
|
127
136
|
}
|
|
128
137
|
return account;
|
|
129
138
|
}
|
package/dist/fonts.js
CHANGED
|
@@ -81,7 +81,19 @@ export function googleFontsHref(families) {
|
|
|
81
81
|
* `<link href="fonts.googleapis.com...">` stays as the framework-agnostic
|
|
82
82
|
* fallback - it works everywhere but swaps visibly on cold loads.
|
|
83
83
|
*/
|
|
84
|
-
|
|
84
|
+
/**
|
|
85
|
+
* O PREFIXO DO FALLBACK, exportado para o twin: quando o payload não traz a costura (`fontSeam`),
|
|
86
|
+
* o bloco é composto com este prefixo - e o twin-drift assere que ele é o MESMO que a plataforma
|
|
87
|
+
* batiza em `fontSeamOf`. Payload novo dispensa a convenção: o dado vence.
|
|
88
|
+
*/
|
|
89
|
+
export const FAMILY_SEAM_PREFIX = "--ds-typography-families-";
|
|
90
|
+
export function nextFontSnippet(families, slug, appDir = "app",
|
|
91
|
+
/**
|
|
92
|
+
* A COSTURA SERVIDA PELO PAYLOAD (papel → nome do token no tokens.css) - ver `fontSeam` em
|
|
93
|
+
* `types.ts`. Presente, o bloco de mapa fala os nomes que o ARTEFATO declara, por construção;
|
|
94
|
+
* ausente (payload antigo), a composição por convenção continua valendo.
|
|
95
|
+
*/
|
|
96
|
+
seam) {
|
|
85
97
|
/** Toda vaga que o documento tem, não só as nossas três - ver `customFontFamilies`. */
|
|
86
98
|
const roles = familySlots(families).filter((role) => {
|
|
87
99
|
const name = firstFamily(families[role] ?? "");
|
|
@@ -128,7 +140,7 @@ export function nextFontSnippet(families, slug, appDir = "app") {
|
|
|
128
140
|
const css = [
|
|
129
141
|
`/* ${appDir}/globals.css - AFTER the tokens.css import */`,
|
|
130
142
|
`[data-ds="${slug}"] {`,
|
|
131
|
-
...roles.map((role) => `
|
|
143
|
+
...roles.map((role) => ` ${seam?.[role] ?? `${FAMILY_SEAM_PREFIX}${role}`}: var(${roleVar(role)});`),
|
|
132
144
|
`}`,
|
|
133
145
|
];
|
|
134
146
|
return { fontsFile, layout, css };
|
package/dist/guide.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* famílias que o código dele declara, as três deixaram de carregar a fonte ao mesmo tempo. Este
|
|
7
7
|
* arquivo já importava `nextFontSnippet` do mesmo módulo; a cópia não tinha razão de existir.
|
|
8
8
|
*/
|
|
9
|
-
import { customFontFamilies, familySlots, nextFontSnippet } from "./fonts.js";
|
|
9
|
+
import { customFontFamilies, FAMILY_SEAM_PREFIX, familySlots, nextFontSnippet, } from "./fonts.js";
|
|
10
10
|
import { animationShorthand, classifyKeyframe, describeKeyframe, isFullRotation, } from "./motion.js";
|
|
11
11
|
const kebab = (v) => v.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
12
12
|
/**
|
|
@@ -280,7 +280,8 @@ export function buildGuide(payload) {
|
|
|
280
280
|
.map((n) => `family=${n.replace(/ /g, "+")}:wght@400;500;600;700`)
|
|
281
281
|
.join("&")}&display=swap`
|
|
282
282
|
: null;
|
|
283
|
-
|
|
283
|
+
/** A costura vem do payload quando o servidor a fala - o dado vence a convenção (T18-par). */
|
|
284
|
+
const nextFonts = nextFontSnippet(foundations.typography.families, slug, undefined, payload.fontSeam);
|
|
284
285
|
const fontsSection = fontsHref
|
|
285
286
|
? `
|
|
286
287
|
## Fonts
|
|
@@ -696,7 +697,7 @@ ${hasTailwind
|
|
|
696
697
|
- Radius → \`var(--ds-radius-<key>)\`: ${list(Object.keys(foundations.radius))}.
|
|
697
698
|
- Shadow → \`var(--ds-shadow-<key>)\`: ${list(Object.keys(foundations.shadow))}.
|
|
698
699
|
- Typography: families ${familySlots(foundations.typography.families)
|
|
699
|
-
.map((slot) =>
|
|
700
|
+
.map((slot) => `\`${payload.fontSeam?.[slot] ?? `${FAMILY_SEAM_PREFIX}${slot}`}\` (${foundations.typography.families[slot]})`)
|
|
700
701
|
.join(", ")};
|
|
701
702
|
weights${hasTailwind ? " (utility: `font-<key>`)" : ""}: ${list(weights)};
|
|
702
703
|
scale \`--ds-typography-scale-<key>-font-size\`${hasTailwind ? " (utility: `text-<key>`)" : ""}: ${list(Object.keys(foundations.typography.scale))}.
|
package/dist/install-marks.js
CHANGED
|
@@ -317,8 +317,13 @@ export const CHECKER_SINCE = "0.16.308";
|
|
|
317
317
|
* variáveis, e os 223 valores (37%) que as vestiam passam a resolver como token DELE
|
|
318
318
|
*
|
|
319
319
|
* Um censo medido antes não tem nada disso; quem remede ganha os cinco.
|
|
320
|
+
*
|
|
321
|
+
* 0.16.308 -> 0.16.315 em 26/08 (T1, o fecho do elo 3): a medição passa a contar `answered` -
|
|
322
|
+
* os tokens que o dono já respondeu chegam pela rota `reading` do sync e um token que seria
|
|
323
|
+
* `unread` conta como respondido. Um censo medido antes diz `answered: 0` para um projeto com
|
|
324
|
+
* respostas gravadas; quem remede vê "N answered by you" no gaps e no painel.
|
|
320
325
|
*/
|
|
321
|
-
export const READER_SINCE = "0.16.
|
|
326
|
+
export const READER_SINCE = "0.16.315";
|
|
322
327
|
/**
|
|
323
328
|
* O QUE ESTÁ INSTALADO AQUI FICOU PARA TRÁS - e as DUAS condições que fazem isso ser verdade.
|
|
324
329
|
*
|
|
@@ -27,14 +27,16 @@ import { join } from "node:path";
|
|
|
27
27
|
const ROOT = join(import.meta.dirname, "..", "..", "..");
|
|
28
28
|
const POPULATIONS = join(ROOT, "fixtures", "populations");
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* 294 componentes, escopo `apps/web-dashboard` (re-medida com o leitor 0.16.315 em 26/08, T9 -
|
|
31
|
+
* ganhou `values`; era 323 no leitor 0.16.261). A população que derruba régua feita em cima da
|
|
32
|
+
* outra: ela não declara um `--animate-*` sequer, escreve o relógio literal na receita, e tem
|
|
33
|
+
* dezenas de componentes cujo primeiro nó do sketch não é a raiz.
|
|
33
34
|
*/
|
|
34
35
|
export const FRONTEND_HUB_CENSUS = join(POPULATIONS, "frontend-hub.census.json");
|
|
35
36
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
37
|
+
* 67 componentes, escopo `packages/ui` (censo vivo 0.16.310 congelado em 26/08, T9 - com
|
|
38
|
+
* `values`). O caso de teste vivo do dia a dia - é dele que saem os números do `triage` e é nele
|
|
39
|
+
* que a jornada é conferida na tela.
|
|
38
40
|
*/
|
|
39
41
|
export const CODELEVEL_CENSUS = join(POPULATIONS, "codelevel-ui.census.json");
|
|
40
42
|
/**
|
package/dist/their-vars.js
CHANGED
|
@@ -2,6 +2,7 @@ import { readdir, readFile } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { theirNames } from "./doctor/their-names.js";
|
|
4
4
|
import { buildTable, normalizeValue, } from "./doctor/tokens.js";
|
|
5
|
+
import { FAMILY_SEAM_PREFIX } from "./fonts.js";
|
|
5
6
|
/**
|
|
6
7
|
* A FOLHA APONTA PARA O NOME QUE O CÓDIGO DELE JÁ DÁ AO VALOR.
|
|
7
8
|
*
|
|
@@ -136,7 +137,8 @@ export function pointAtTheirNames(css, theirs, resolvable) {
|
|
|
136
137
|
const FAMILY_KIND = {
|
|
137
138
|
"--ds-color-": "color",
|
|
138
139
|
"--ds-shadow-": "shadow",
|
|
139
|
-
|
|
140
|
+
/** A const única da costura - um literal aqui seria o stray que a varredura de 26/08 caçou. */
|
|
141
|
+
[FAMILY_SEAM_PREFIX]: "font",
|
|
140
142
|
"--ds-motion-durations-": "motion",
|
|
141
143
|
"--ds-motion-easings-": "motion",
|
|
142
144
|
};
|
package/package.json
CHANGED