synthesisui 0.16.365 → 0.16.367
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/color-forms.js +94 -2
- package/dist/commands/align.js +96 -15
- package/dist/copy/connect.pt-BR.js +4 -0
- package/dist/doctor/scan.js +16 -1
- package/dist/install-marks.js +16 -2
- package/package.json +1 -1
package/dist/color-forms.js
CHANGED
|
@@ -130,6 +130,98 @@ function fromHsl(raw) {
|
|
|
130
130
|
alpha: Number.isFinite(alpha) ? Math.max(0, Math.min(1, alpha)) : 1,
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* `oklch(69.6% 0.17 162.48)` - E ELE ERA 42% DOS LITERAIS DE COR DE UM SISTEMA REAL.
|
|
135
|
+
*
|
|
136
|
+
* O QUE O CLIENTE GANHA: a cor que o Tailwind 4 escreve por padrão passa a ser interpretada como
|
|
137
|
+
* cor. Antes ela chegava na receita (o coletor a lê) e morria aqui - `colorForm` devolvia `null` -,
|
|
138
|
+
* então `deltaE` não a comparava, `namedByValue` não a indexava, o v2 nunca propunha agrupá-la nem
|
|
139
|
+
* nomeá-la, e nada a declarava como lacuna. Ela era invisível nos dois sentidos.
|
|
140
|
+
*
|
|
141
|
+
* MEDIDO em 03/09, nos `looks` de duas populações: 94 usos no `codelevel-ui` e 23 no
|
|
142
|
+
* `frontend-hub`, 39 valores distintos - e ZERO deles no `observed` das três populações, que é a
|
|
143
|
+
* régua de valores. É a decisão 1 do dono (21/08): *"toda forma de cor entra - hex, rgb, rgba, hsl,
|
|
144
|
+
* color-mix, oklch"*.
|
|
145
|
+
*
|
|
146
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
147
|
+
* O GAMUT É MAPEADO POR CHROMA, E NÃO CLAMPADO - e essa é a decisão que impede a cor errada
|
|
148
|
+
*
|
|
149
|
+
* OKLCh descreve cores que o sRGB não alcança: 25 dos 39 valores medidos caem fora. A saída barata
|
|
150
|
+
* é clampar cada canal em 0-255; a certa é a do CSS Color 4, reduzir o CHROMA mantendo o L e o H até
|
|
151
|
+
* a cor caber. As duas DISCORDAM em 22 dos 25:
|
|
152
|
+
*
|
|
153
|
+
* oklch(69.6% 0.17 162.48) clamp #00bc7d chroma-map #00b981
|
|
154
|
+
* oklch(76.9% 0.188 70.08) clamp #fe9a00 chroma-map #f69e00
|
|
155
|
+
*
|
|
156
|
+
* `#00b981` é o emerald que o navegador pinta; `#00bc7d` é uma cor que ninguém vê. Um hex errado
|
|
157
|
+
* aqui não fica quieto: ele vira a chave que decide se duas cores são a mesma e se um token dele
|
|
158
|
+
* casa com um valor - as duas afirmações que este produto não pode errar. O laço binário custa 24
|
|
159
|
+
* iterações e só roda para quem está fora.
|
|
160
|
+
*/
|
|
161
|
+
function fromOklch(raw) {
|
|
162
|
+
const m = /^oklch\(([^)]*)\)$/i.exec(raw.trim());
|
|
163
|
+
if (!m)
|
|
164
|
+
return null;
|
|
165
|
+
const [body, alphaPart] = m[1].split("/");
|
|
166
|
+
const parts = body
|
|
167
|
+
.trim()
|
|
168
|
+
.split(/[\s,]+/)
|
|
169
|
+
.filter(Boolean);
|
|
170
|
+
if (parts.length < 3)
|
|
171
|
+
return null;
|
|
172
|
+
/** L aceita 0-1 e 0%-100%; C aceita o número e o percentual, cujo 100% é 0.4 por spec. */
|
|
173
|
+
const L = unit(parts[0]);
|
|
174
|
+
const C = parts[1].trim().endsWith("%")
|
|
175
|
+
? unit(parts[1], 0.4)
|
|
176
|
+
: Number.parseFloat(parts[1]);
|
|
177
|
+
/** `none` é um ângulo ausente, e ausente é zero - com C=0 o matiz não muda nada de qualquer forma. */
|
|
178
|
+
const H = /^none$/i.test(parts[2].trim()) ? 0 : Number.parseFloat(parts[2]);
|
|
179
|
+
if (![L, C, H].every(Number.isFinite))
|
|
180
|
+
return null;
|
|
181
|
+
const linear = (chroma) => {
|
|
182
|
+
const h = (H * Math.PI) / 180;
|
|
183
|
+
const a = chroma * Math.cos(h);
|
|
184
|
+
const b = chroma * Math.sin(h);
|
|
185
|
+
const l_ = L + 0.3963377774 * a + 0.2158037573 * b;
|
|
186
|
+
const m_ = L - 0.1055613458 * a - 0.0638541728 * b;
|
|
187
|
+
const s_ = L - 0.0894841775 * a - 1.291485548 * b;
|
|
188
|
+
const l3 = l_ ** 3;
|
|
189
|
+
const m3 = m_ ** 3;
|
|
190
|
+
const s3 = s_ ** 3;
|
|
191
|
+
return [
|
|
192
|
+
4.0767416621 * l3 - 3.3077115913 * m3 + 0.2309699292 * s3,
|
|
193
|
+
-1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3,
|
|
194
|
+
-0.0041960863 * l3 - 0.7034186147 * m3 + 1.707614701 * s3,
|
|
195
|
+
];
|
|
196
|
+
};
|
|
197
|
+
/** A folga de 1e-4 é ruído de ponto flutuante, não cor fora do gamut. */
|
|
198
|
+
const fits = (c) => c.every((x) => x >= -0.0001 && x <= 1.0001);
|
|
199
|
+
let channels = linear(Math.max(0, C));
|
|
200
|
+
if (!fits(channels)) {
|
|
201
|
+
let lo = 0;
|
|
202
|
+
let hi = Math.max(0, C);
|
|
203
|
+
for (let i = 0; i < 24; i++) {
|
|
204
|
+
const mid = (lo + hi) / 2;
|
|
205
|
+
if (fits(linear(mid)))
|
|
206
|
+
lo = mid;
|
|
207
|
+
else
|
|
208
|
+
hi = mid;
|
|
209
|
+
}
|
|
210
|
+
channels = linear(lo);
|
|
211
|
+
}
|
|
212
|
+
/** sRGB transfer function - o mesmo expoente que o navegador usa. */
|
|
213
|
+
const gamma = (x) => {
|
|
214
|
+
const v = Math.max(0, Math.min(1, x));
|
|
215
|
+
return (v <= 0.0031308 ? 12.92 * v : 1.055 * v ** (1 / 2.4) - 0.055) * 255;
|
|
216
|
+
};
|
|
217
|
+
const [r, g, b] = channels.map(gamma);
|
|
218
|
+
const rawAlpha = alphaPart ?? parts[3];
|
|
219
|
+
const alpha = rawAlpha === undefined ? 1 : unit(rawAlpha);
|
|
220
|
+
return {
|
|
221
|
+
hex: `#${hex2(r)}${hex2(g)}${hex2(b)}`,
|
|
222
|
+
alpha: Number.isFinite(alpha) ? Math.max(0, Math.min(1, alpha)) : 1,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
133
225
|
/**
|
|
134
226
|
* QUALQUER FORMA -> a canônica. `null` para o que não é uma cor literal.
|
|
135
227
|
*
|
|
@@ -140,7 +232,7 @@ export function colorForm(value) {
|
|
|
140
232
|
const v = value.trim();
|
|
141
233
|
if (!v || /^(transparent|currentcolor|inherit|initial|unset|none)$/i.test(v))
|
|
142
234
|
return null;
|
|
143
|
-
return fromHex(v) ?? fromRgb(v) ?? fromHsl(v);
|
|
235
|
+
return fromHex(v) ?? fromRgb(v) ?? fromHsl(v) ?? fromOklch(v);
|
|
144
236
|
}
|
|
145
237
|
/**
|
|
146
238
|
* AS CORES LITERAIS DENTRO DE UM VALOR - inclusive as de dentro de uma função de composição.
|
|
@@ -163,7 +255,7 @@ export function colorsIn(value) {
|
|
|
163
255
|
seen.add(key);
|
|
164
256
|
out.push(c);
|
|
165
257
|
};
|
|
166
|
-
const rest = value.replace(/\b(?:rgba?|hsla
|
|
258
|
+
const rest = value.replace(/\b(?:rgba?|hsla?|oklch)\([^)]*\)/gi, (m) => (push(colorForm(m)), " "));
|
|
167
259
|
for (const m of rest.match(/#[0-9a-f]{3,8}\b/gi) ?? [])
|
|
168
260
|
push(colorForm(m));
|
|
169
261
|
return out;
|
package/dist/commands/align.js
CHANGED
|
@@ -114,7 +114,15 @@ opts = {}) {
|
|
|
114
114
|
out.push({
|
|
115
115
|
says: "The system's tools are declared here and still waiting for your approval - until you give it, I cannot reach the import playbook, only measure your files.",
|
|
116
116
|
run: "/mcp",
|
|
117
|
-
|
|
117
|
+
/**
|
|
118
|
+
* O VALOR NÃO TRAZ O PRÓPRIO RÓTULO - quem rotula é quem desenha.
|
|
119
|
+
*
|
|
120
|
+
* Ele dizia `then say: import my design system`, e o render põe "then, to pick up where you
|
|
121
|
+
* left off:" acima: a tela saía com dois rótulos e dois "then" para UM passo. É o defeito que
|
|
122
|
+
* o #1314 consertou, reintroduzido por um valor que carregava a moldura dentro.
|
|
123
|
+
*/
|
|
124
|
+
then: "import my design system",
|
|
125
|
+
where: "agent",
|
|
118
126
|
});
|
|
119
127
|
const locks = (await locksIn(root)).filter((l) => l.slug && !l.adopted);
|
|
120
128
|
/** Sem sistema instalado não há alinho a cobrar - não é desalinho, é um repo sem DS. */
|
|
@@ -535,7 +543,7 @@ from = "session") {
|
|
|
535
543
|
: from === "shell"
|
|
536
544
|
? "This repo is out of alignment with the design system that governs it:"
|
|
537
545
|
: "Before this session starts, this environment is out of alignment with the design system that governs it:",
|
|
538
|
-
...grouped(items),
|
|
546
|
+
...grouped(items, from),
|
|
539
547
|
].join("\n");
|
|
540
548
|
}
|
|
541
549
|
/**
|
|
@@ -554,7 +562,13 @@ from = "session") {
|
|
|
554
562
|
*
|
|
555
563
|
* A ordem é a da primeira aparição: o primeiro achado decide onde o grupo dele fica.
|
|
556
564
|
*/
|
|
557
|
-
function grouped(items
|
|
565
|
+
function grouped(items,
|
|
566
|
+
/**
|
|
567
|
+
* QUEM ESTÁ LENDO decide duas coisas aqui: se um remédio do agente precisa dizer onde mora, e se
|
|
568
|
+
* a linha ganha cor. Numa sessão a pessoa JÁ está no agente, e o rótulo seria a tela falando de
|
|
569
|
+
* si mesma.
|
|
570
|
+
*/
|
|
571
|
+
from = "session") {
|
|
558
572
|
const order = [];
|
|
559
573
|
const byRun = new Map();
|
|
560
574
|
for (const m of items) {
|
|
@@ -571,12 +585,29 @@ function grouped(items) {
|
|
|
571
585
|
const group = byRun.get(key) ?? [];
|
|
572
586
|
for (const m of group)
|
|
573
587
|
out.push(` - ${m.says}`);
|
|
574
|
-
const { run, then } = group[0];
|
|
575
|
-
|
|
576
|
-
|
|
588
|
+
const { run, then, where } = group[0];
|
|
589
|
+
/**
|
|
590
|
+
* A HIERARQUIA, e ela faltava inteira - *"o texto está sem hierarquia de cor, está muito ruim"*
|
|
591
|
+
* (dono, na 0.16.365). Este bloco saía cru enquanto a ação recomendada, quinze linhas acima,
|
|
592
|
+
* usava seção, azul e cinza. A paleta é a que já existe e no papel que ela declara: `blue` é o
|
|
593
|
+
* que está VIVO (o que ele roda ou diz), `dim` é a prosa que emoldura.
|
|
594
|
+
*
|
|
595
|
+
* `paint` se apaga sozinho sem TTY, então o `SessionStart` - que entrega texto a um modelo -
|
|
596
|
+
* continua recebendo o mesmo texto de sempre, sem um único código de escape.
|
|
597
|
+
*/
|
|
598
|
+
if (run) {
|
|
599
|
+
/**
|
|
600
|
+
* UM REMÉDIO DO AGENTE DIZ ONDE MORA, na superfície onde ele não é digitável. `/mcp` no
|
|
601
|
+
* prompt do zsh é um comando que não existe; com o rótulo, a linha continua colável no lugar
|
|
602
|
+
* certo em vez de mandar a pessoa ao lugar errado.
|
|
603
|
+
*/
|
|
604
|
+
if (where === "agent" && from !== "session")
|
|
605
|
+
out.push(paint.dim(` ${say("inside your agent session:")}`));
|
|
606
|
+
out.push(paint.blue(` ${run}`));
|
|
607
|
+
}
|
|
577
608
|
/** O `then` sai numa linha própria e rotulada: um segundo comando solto lê como parte do primeiro. */
|
|
578
609
|
if (then)
|
|
579
|
-
out.push(` then, to pick up where you left off
|
|
610
|
+
out.push(`${paint.dim(` ${say("then, to pick up where you left off:")}`)}\n${paint.blue(` ${then}`)}`);
|
|
580
611
|
}
|
|
581
612
|
return out;
|
|
582
613
|
}
|
|
@@ -595,13 +626,24 @@ function grouped(items) {
|
|
|
595
626
|
* própria e sem saber de defasagem nenhuma - duas portas para a mesma sala, e uma delas cega
|
|
596
627
|
* (dono, 07/08).
|
|
597
628
|
*/
|
|
598
|
-
export async function misalignments(root,
|
|
629
|
+
export async function misalignments(root,
|
|
630
|
+
/**
|
|
631
|
+
* `home` ATRAVESSA ATÉ AQUI, e a falta dele é por que a regressão da 0.16.365 passou.
|
|
632
|
+
*
|
|
633
|
+
* `localMisalignments` sempre aceitou `home` - a sessão e a decisão sobre as ferramentas moram
|
|
634
|
+
* nele, não no repo - e esta porta, que é a que o `connect` usa, não o repassava. Consequência:
|
|
635
|
+
* o aviso da aprovação pendente era inalcançável por teste pela jornada real; qualquer cenário
|
|
636
|
+
* montado aqui lia o `~/.claude.json` da máquina que roda a suíte, e passava por sorte.
|
|
637
|
+
*/
|
|
638
|
+
opts = {}) {
|
|
599
639
|
const items = await localMisalignments(root, {
|
|
600
640
|
...(opts.cli ? { cli: opts.cli } : {}),
|
|
641
|
+
...(opts.home ? { home: opts.home } : {}),
|
|
601
642
|
}).catch(() => []);
|
|
602
643
|
/** A única linha que custa rede, e ela some inteira quando não há rede. */
|
|
603
644
|
const remote = await versionBehind(root, {
|
|
604
645
|
...(opts.cli ? { cli: opts.cli } : {}),
|
|
646
|
+
...(opts.home ? { home: opts.home } : {}),
|
|
605
647
|
}).catch(() => null);
|
|
606
648
|
if (remote)
|
|
607
649
|
items.push(remote);
|
|
@@ -626,10 +668,14 @@ export async function misalignments(root, opts = {}) {
|
|
|
626
668
|
* repositório inteiro, e isto roda em TODA abertura de sessão. Um aviso que custa um walk completo
|
|
627
669
|
* a cada sessão é um aviso que alguém desliga.
|
|
628
670
|
*/
|
|
629
|
-
export async function nextStepFor(root
|
|
671
|
+
export async function nextStepFor(root,
|
|
672
|
+
/** `home` porque a decisão sobre as ferramentas mora nele - ver `mcpAwaitingApproval`. */
|
|
673
|
+
opts = {}) {
|
|
630
674
|
const locks = (await locksIn(root)).filter((l) => l.slug && !l.adopted);
|
|
631
675
|
if (locks.length > 0)
|
|
632
676
|
return null;
|
|
677
|
+
/** `true` só quando declarado e sem decisão; `null` (não sei) e `false` calam do mesmo jeito. */
|
|
678
|
+
const awaiting = (await mcpAwaitingApproval(root, opts.home ?? homedir()).catch(() => null)) === true;
|
|
633
679
|
const measured = await readFile(join(root, "_synthesisui", "census.json"), "utf8").then(() => true, () => false);
|
|
634
680
|
/**
|
|
635
681
|
* MEDIDO E SEM SISTEMA INSTALADO SÃO DUAS HISTÓRIAS, e a frase antiga contava a errada.
|
|
@@ -646,14 +692,17 @@ export async function nextStepFor(root) {
|
|
|
646
692
|
* `list --mine` primeiro porque o slug nasce no servidor: ele não está em nenhum arquivo daqui, e
|
|
647
693
|
* chutá-lo seria pior que pedir para olhar.
|
|
648
694
|
*/
|
|
695
|
+
const awaits = awaiting ? { toolsAwaiting: true } : {};
|
|
649
696
|
return measured
|
|
650
697
|
? {
|
|
698
|
+
...awaits,
|
|
651
699
|
sentence: "This repo has been measured and has no system installed here. If you already imported, the system is in your account: `synthesisui list --mine`, then `synthesisui add <slug>`.",
|
|
652
700
|
headline: "Your system is already in your account. Bring it in here:",
|
|
653
701
|
run: ["synthesisui list --mine", "synthesisui add <slug>"],
|
|
654
702
|
why: "Re-measuring would cost minutes and change nothing the platform already knows.",
|
|
655
703
|
}
|
|
656
704
|
: {
|
|
705
|
+
...awaits,
|
|
657
706
|
sentence: 'This repo has no design system contract yet. Ask me: "import my design system."',
|
|
658
707
|
headline: "Open a new agent session in this repo",
|
|
659
708
|
open: await agentOpenCommands(root).catch(() => []),
|
|
@@ -716,9 +765,18 @@ export function renderNextStep(next, freshSession) {
|
|
|
716
765
|
: fmt(list.length === 1
|
|
717
766
|
? "This run moved {what}, and a new session is what reads it."
|
|
718
767
|
: "This run moved {what}, and a new session is what reads them.", { what: said })).map(paint.dim));
|
|
719
|
-
if (freshSession.mcp)
|
|
720
|
-
lines.push(...bodyWrapped(say("The project's tools ask for approval once - say yes.")).map(paint.dim));
|
|
721
768
|
}
|
|
769
|
+
/**
|
|
770
|
+
* A LINHA DA APROVAÇÃO, UMA VEZ, PELO FATO OU PELO QUE ACABOU DE MOVER.
|
|
771
|
+
*
|
|
772
|
+
* Ela estava dentro do `if (freshSession)` e dependia de o MCP ter mudado NESTA rodada. O caso do
|
|
773
|
+
* dono é o contrário e é o mais comum a partir da segunda vez: a fiação já estava lá ("nothing to
|
|
774
|
+
* change - this environment is already current") e a aprovação continuava pendente. `next.toolsAwaiting`
|
|
775
|
+
* é o fato lido do estado; `freshSession.mcp` continua valendo para a rodada que acabou de
|
|
776
|
+
* declarar as ferramentas, quando ainda não há decisão nenhuma para ler.
|
|
777
|
+
*/
|
|
778
|
+
if (next.toolsAwaiting || freshSession?.mcp)
|
|
779
|
+
lines.push(...bodyWrapped(say("The project's tools ask for approval once - say yes.")).map(paint.dim));
|
|
722
780
|
return lines.join("\n");
|
|
723
781
|
}
|
|
724
782
|
/**
|
|
@@ -733,12 +791,35 @@ export function renderNextStep(next, freshSession) {
|
|
|
733
791
|
*/
|
|
734
792
|
export async function reportWhatIsLeft(root, opts = {}) {
|
|
735
793
|
const items = await misalignments(root, opts).catch(() => []);
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
794
|
+
const next = await nextStepFor(root, {
|
|
795
|
+
...(opts.home ? { home: opts.home } : {}),
|
|
796
|
+
}).catch(() => null);
|
|
797
|
+
/**
|
|
798
|
+
* A AÇÃO RECOMENDADA GANHA DO QUE SÓ SE RESOLVE DENTRO DELA - e a falta desta regra é a
|
|
799
|
+
* regressão que o dono leu na 0.16.365.
|
|
800
|
+
*
|
|
801
|
+
* Isto era um OU EXCLUSIVO: um desalinho qualquer e o bloco "Do this next" não saía. O aviso da
|
|
802
|
+
* aprovação pendente nasceu em 03/09 e é verdadeiro justamente no repo que acabou de rodar
|
|
803
|
+
* `connect` - foi ele que declarou as ferramentas. E num repo sem sistema instalado aquele é o
|
|
804
|
+
* ÚNICO desalinho possível: todos os outros vêm depois de um `.lock`, e o remoto devolve `null`
|
|
805
|
+
* sem lock. Então a instrução de abrir o agente não desapareceu às vezes; ela desapareceu SEMPRE,
|
|
806
|
+
* no único momento em que ela é a coisa que a pessoa procura na tela.
|
|
807
|
+
*
|
|
808
|
+
* A separação não esconde nada: o que se resolve no terminal continua saindo, embaixo da ação. O
|
|
809
|
+
* que se resolve dentro do agente vira a segunda metade da ação, que é o que ele é - a aprovação
|
|
810
|
+
* acontece na sessão que o passo 1 manda abrir.
|
|
811
|
+
*/
|
|
812
|
+
const onTheTerminal = items.filter((m) => m.where !== "agent");
|
|
813
|
+
if (next) {
|
|
814
|
+
console.log(renderNextStep(next, opts.freshSession));
|
|
815
|
+
if (onTheTerminal.length > 0) {
|
|
816
|
+
console.log("");
|
|
817
|
+
console.log(describeMisalignments(onTheTerminal, "after"));
|
|
818
|
+
}
|
|
740
819
|
return;
|
|
741
820
|
}
|
|
821
|
+
if (items.length === 0)
|
|
822
|
+
return;
|
|
742
823
|
console.log("");
|
|
743
824
|
console.log(describeMisalignments(items, "after"));
|
|
744
825
|
}
|
|
@@ -87,6 +87,10 @@ register("pt-BR", {
|
|
|
87
87
|
"This run moved {what}, and a new session is what reads them.": "Esta rodada moveu {what}, e é uma sessão nova que lê isso.",
|
|
88
88
|
"A new session reads the wiring this run changed.": "Uma sessão nova lê a fiação que esta rodada mudou.",
|
|
89
89
|
"The project's tools ask for approval once - say yes.": "As ferramentas do projeto pedem aprovação uma vez - diga sim.",
|
|
90
|
+
// ── a lista do que ainda está fora, quando ela é o que sobra ──
|
|
91
|
+
/** O rótulo que diz onde uma slash command se digita - ela não existe no prompt do terminal. */
|
|
92
|
+
"inside your agent session:": "dentro da sua sessão do agente:",
|
|
93
|
+
"then, to pick up where you left off:": "e depois, para voltar de onde você parou:",
|
|
90
94
|
// ── os nomes do que moveu, usados dentro da frase acima ──
|
|
91
95
|
"the checks": "as verificações",
|
|
92
96
|
"the write check": "a verificação de escrita",
|
package/dist/doctor/scan.js
CHANGED
|
@@ -38,8 +38,23 @@ const IGNORE_LINE = /^\s*(import|@import|\/\/|\*|\/\*)/;
|
|
|
38
38
|
* plain CSS values and Tailwind arbitrary values (`bg-[#2563eb]`).
|
|
39
39
|
* `#` inside a URL fragment or an id selector is excluded by requiring a full
|
|
40
40
|
* 3/6/8 digit run terminated by a non-hex character.
|
|
41
|
+
*
|
|
42
|
+
* `oklch()` ENTROU EM 03/09, e a ausência dela era a metade calada de uma lacuna maior.
|
|
43
|
+
*
|
|
44
|
+
* O QUE O CLIENTE GANHA: a cor que o Tailwind 4 escreve por padrão passa a ser contada como valor
|
|
45
|
+
* de design. Este regex alimenta TRÊS superfícies - o `observed` do censo, a lista "Values written
|
|
46
|
+
* by hand" do `doctor`, e o relatório do `hook` a cada escrita -, e as três eram cegas a ela.
|
|
47
|
+
*
|
|
48
|
+
* MEDIDO no menor caso possível, uma `@theme` com duas cores em oklch e uma em hex: o `declared`
|
|
49
|
+
* trazia as três, o `look` do componente trazia `background: oklch(...)`, e o `observed` trazia
|
|
50
|
+
* SÓ o `#ffffff` da mesma regra. Nas populações: 94 usos no `codelevel-ui`, 23 no `frontend-hub`,
|
|
51
|
+
* e zero no `observed` das três.
|
|
52
|
+
*
|
|
53
|
+
* Ler oklch aqui e não no motor de cor - ou o contrário - não entrega nada: o valor precisa ser
|
|
54
|
+
* VISTO pelo scanner e INTERPRETADO por `colorForm` para chegar a uma comparação. As duas metades
|
|
55
|
+
* entraram na mesma mudança porque meia jornada não é meio valor.
|
|
41
56
|
*/
|
|
42
|
-
const COLOR = /#[0-9a-fA-F]{8}\b|#[0-9a-fA-F]{6}\b|#[0-9a-fA-F]{3}\b|rgba?\([^)]*\)|hsla?\([^)]*\)/g;
|
|
57
|
+
const COLOR = /#[0-9a-fA-F]{8}\b|#[0-9a-fA-F]{6}\b|#[0-9a-fA-F]{3}\b|rgba?\([^)]*\)|hsla?\([^)]*\)|oklch\([^)]*\)/g;
|
|
43
58
|
/**
|
|
44
59
|
* THE QUOTE THAT MADE HALF THE DRIFT INVISIBLE.
|
|
45
60
|
*
|
package/dist/install-marks.js
CHANGED
|
@@ -235,7 +235,14 @@ export const MATERIALISER_SINCE = "0.16.362";
|
|
|
235
235
|
* "não lido" sobre um valor que o de hoje resolve - e o número é o que a pessoa lê para decidir
|
|
236
236
|
* se adotou. O `!` de important (0.16.306) já tinha mudado a mesma contagem.
|
|
237
237
|
*/
|
|
238
|
-
|
|
238
|
+
/**
|
|
239
|
+
* 0.16.308 -> 0.16.367 em 03/09: o hook passa a ver `oklch()`. O regex de cor do scanner era cego à
|
|
240
|
+
* forma, então um agente que escrevia `oklch(69.6% 0.17 162.48)` recebia SILÊNCIO mesmo com o
|
|
241
|
+
* `--color-mint-500` do próprio repositório nomeando aquele valor. Agora recebe a linha de sempre:
|
|
242
|
+
* `line 12 oklch(...) -> --color-mint-500`. Um hook pinado antes desta versão aconselha OUTRA
|
|
243
|
+
* coisa - nada -, que é a régua desta marca.
|
|
244
|
+
*/
|
|
245
|
+
export const CHECKER_SINCE = "0.16.367";
|
|
239
246
|
/**
|
|
240
247
|
* A ÚLTIMA VERSÃO EM QUE OS LEITORES PASSARAM A PRODUZIR UM CENSO DIFERENTE.
|
|
241
248
|
*
|
|
@@ -651,7 +658,14 @@ export const CHECKER_SINCE = "0.16.308";
|
|
|
651
658
|
* QUEM NÃO É AFETADO: quem tem menos de 4 096 formas em todo grupo - `web-onboarding` já chegava
|
|
652
659
|
* com 39 de 39. O `sync` daquele repositório não muda um byte.
|
|
653
660
|
*/
|
|
654
|
-
|
|
661
|
+
/**
|
|
662
|
+
* 0.16.366 -> 0.16.367 em 03/09: `oklch()` entra na leitura de cor. O regex do scanner passou a ver
|
|
663
|
+
* a forma (era cega no `observed`, no `doctor` e no `hook`) e `colorForm` passou a interpretá-la,
|
|
664
|
+
* mapeando o gamut por chroma em vez de clampar canal. Medido nos `looks`: 94 usos no
|
|
665
|
+
* `codelevel-ui` e 23 no `frontend-hub`, e ZERO no `observed` das três populações. Um censo tirado
|
|
666
|
+
* antes disto não tem aqueles valores na régua, e só um `sync` os traz.
|
|
667
|
+
*/
|
|
668
|
+
export const READER_SINCE = "0.16.367";
|
|
655
669
|
/**
|
|
656
670
|
* O QUE ESTÁ INSTALADO AQUI FICOU PARA TRÁS - e as DUAS condições que fazem isso ser verdade.
|
|
657
671
|
*
|
package/package.json
CHANGED