synthesisui 0.16.351 → 0.16.355
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/doctor/style-ledger.js +83 -21
- package/dist/doctor/transcribe.js +132 -2
- package/dist/doctor/variant-read.js +28 -2
- package/dist/install-marks.js +50 -1
- package/package.json +1 -1
|
@@ -185,6 +185,7 @@ declared) {
|
|
|
185
185
|
seenFiles: new Set(),
|
|
186
186
|
withTheirTokens: 0,
|
|
187
187
|
formTally: new Map(),
|
|
188
|
+
distinctTexts: new Set(),
|
|
188
189
|
};
|
|
189
190
|
group.uses += 1;
|
|
190
191
|
group.seenFiles.add(f.file);
|
|
@@ -218,30 +219,57 @@ declared) {
|
|
|
218
219
|
/**
|
|
219
220
|
* SÓ O QUE UM LEITOR ALCANÇA, E SÓ TEXTO DISTINTO - as duas restrições vieram de medir.
|
|
220
221
|
*
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
* `component-not-admitted` é o portão, não a leitura. Sobram os
|
|
222
|
+
* SOBRA O QUE `A_READER_REACHES` NOMEIA, e o que ele nomeia mudou duas vezes - este comentário
|
|
223
|
+
* ficou parado na primeira. Ele dizia *"`value-not-read` … texto não ensina nada a leitor
|
|
224
|
+
* nenhum … `component-not-admitted` é o portão, não a leitura. Sobram os DOIS"*, e os dois
|
|
225
|
+
* excluídos ali entraram no conjunto depois (11/08 e 24/08), somando quatro. Quem lesse isto
|
|
226
|
+
* concluiria que o maior grupo de todos - 96% do volume não interpretado - não carrega texto,
|
|
227
|
+
* quando ele carrega. O conjunto é a fonte única; esta frase não repete os nomes de propósito.
|
|
228
|
+
*
|
|
229
|
+
* `computed` continua fora, e por uma razão que não envelhece: é montado em runtime e não
|
|
230
|
+
* existe na fonte, então não há texto para guardar.
|
|
224
231
|
*
|
|
225
232
|
* E TEXTO DISTINTO, porque a primeira versão disto reprovou no spec do repo vivo: guardar todo
|
|
226
233
|
* fragmento deu 723 215 bytes no dashboard dele, contra um teto de 65 536. Oito mil cópias da
|
|
227
234
|
* mesma string não ensinam mais que uma - o que um leitor precisa é da variedade de FORMAS.
|
|
228
235
|
*
|
|
229
|
-
* O TETO SUBIU PARA 4096 EM 24/08
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
236
|
+
* O TETO SUBIU PARA 4096 EM 24/08 sobre uma medição que EXTRAPOLOU: *"a variedade real do
|
|
237
|
+
* `frontend-hub` é de ~1 500 textos distintos sobre 10 825 usos"*, contada nos 400 primeiros
|
|
238
|
+
* arquivos de module. Remedida em 03/09 no repositório inteiro, com o teto solto, ela é 6 394 -
|
|
239
|
+
* quatro vezes o estimado. O teto corta, e corta a maior parte:
|
|
240
|
+
*
|
|
241
|
+
* web-subscribe css/component-not-admitted 9 722 distintos, 4 096 viajam
|
|
242
|
+
* web-subscribe css/shape-not-read 8 016 distintos, 4 096 viajam
|
|
243
|
+
* frontend-hub/dashboard css/component-not-admitted 6 394 distintos, 4 096 viajam
|
|
233
244
|
*
|
|
234
|
-
* `uses` continua contando tudo, então a
|
|
235
|
-
*
|
|
245
|
+
* A FRASE QUE ESTAVA AQUI DIZIA QUE ISSO ERA VISÍVEL: *"`uses` continua contando tudo, então a
|
|
246
|
+
* diferença entre o contado e o que viajou permanece visível em vez de silenciosa"*. Não é.
|
|
247
|
+
* `uses` conta ocorrências e `unreadable` guarda distintos, então aquela diferença existe
|
|
248
|
+
* sempre, por repetição, e não muda de forma quando o teto entra. Quem paga é a
|
|
249
|
+
* re-interpretação, que roda sobre o censo guardado prometendo alcançar quem já importou sem
|
|
250
|
+
* re-medir: ela processa 4 096 de 9 722 e relata sucesso.
|
|
251
|
+
*
|
|
252
|
+
* QUEM DECLARA O CORTE AGORA É `distinct`, escrito na linha de baixo e sempre presente. ESTE
|
|
253
|
+
* NÚMERO NÃO É O CONSERTO DO TETO - subir 4096 é uma decisão de tamanho de censo, medida e
|
|
254
|
+
* entregue à parte. Declarar vem primeiro; ampliar vem depois, e as duas são separadas porque
|
|
255
|
+
* uma é honestidade e a outra é custo.
|
|
236
256
|
*/
|
|
237
|
-
if (A_READER_REACHES.has(reason) &&
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
257
|
+
if (A_READER_REACHES.has(reason) && !group.distinctTexts.has(f.text)) {
|
|
258
|
+
/**
|
|
259
|
+
* CONTAR VEM ANTES DE CABER, e essa ordem é a correção inteira.
|
|
260
|
+
*
|
|
261
|
+
* O texto entra no conjunto mesmo quando o teto já fechou: é assim que `distinct` sabe
|
|
262
|
+
* dizer 9 722 enquanto `unreadable` carrega 4 096, e é a única diferença entre um teto
|
|
263
|
+
* declarado e um teto silencioso. Inverter as duas linhas devolve o defeito.
|
|
264
|
+
*/
|
|
265
|
+
group.distinctTexts.add(f.text);
|
|
266
|
+
if (group.unreadable.length < DISTINCT_CAP)
|
|
267
|
+
group.unreadable.push({
|
|
268
|
+
file: f.file,
|
|
269
|
+
line: f.line,
|
|
270
|
+
text: f.text.replace(/\s+/g, " ").trim().slice(0, 400),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
245
273
|
groups.set(key, group);
|
|
246
274
|
}
|
|
247
275
|
return {
|
|
@@ -250,18 +278,36 @@ declared) {
|
|
|
250
278
|
counted,
|
|
251
279
|
interpreted,
|
|
252
280
|
unread: [...groups.values()]
|
|
253
|
-
.map(({ seenFiles, withTheirTokens, formTally, ...group }) => ({
|
|
281
|
+
.map(({ seenFiles, withTheirTokens, formTally, distinctTexts, ...group }) => ({
|
|
254
282
|
...group,
|
|
255
283
|
files: seenFiles.size,
|
|
284
|
+
/**
|
|
285
|
+
* QUANTOS TEXTOS DISTINTOS EXISTEM - incondicional, e é isso que o torna legível.
|
|
286
|
+
*
|
|
287
|
+
* Os outros campos deste objeto somem quando são zero, porque um zero repetido em todo
|
|
288
|
+
* grupo é ruído. Este não pode: quem lê precisa separar "o censo mediu e deu zero" de "o
|
|
289
|
+
* censo é anterior a este campo", e um campo que desaparece funde os dois casos. O tipo o
|
|
290
|
+
* declara opcional pela segunda razão, nunca pela primeira.
|
|
291
|
+
*/
|
|
292
|
+
distinct: distinctTexts.size,
|
|
256
293
|
/** Ausente quando é zero: um campo zerado em todo grupo é ruído em cada relatório. */
|
|
257
|
-
...(withTheirTokens && withTheirTokens > 0
|
|
294
|
+
...(withTheirTokens && withTheirTokens > 0
|
|
295
|
+
? { withTheirTokens }
|
|
296
|
+
: {}),
|
|
258
297
|
/**
|
|
259
298
|
* AS FORMAS DESTE GRUPO, com os usos de cada uma - ver `form-identity.ts` (item 12).
|
|
260
|
-
* Ordenadas por uso: a primeira é a pergunta que mais vale a pena fazer.
|
|
261
|
-
*
|
|
299
|
+
* Ordenadas por uso: a primeira é a pergunta que mais vale a pena fazer.
|
|
300
|
+
*
|
|
301
|
+
* `formsTotal` existe pela MESMA razão que `distinct`, e o comentário que estava aqui
|
|
302
|
+
* afirmava o contrário: *"o teto corta o patológico, e `uses` do grupo continua contando
|
|
303
|
+
* tudo - o corte fica visível"*. `uses` conta OCORRÊNCIAS e o teto corta FORMAS, então
|
|
304
|
+
* `uses` alto convive com qualquer número de formas e não denuncia corte nenhum. Medido em
|
|
305
|
+
* 03/09: cinco grupos em três populações relatam exatamente 64 formas, que é o teto - e
|
|
306
|
+
* nenhum deles diz quantas ficaram de fora.
|
|
262
307
|
*/
|
|
263
308
|
...(formTally.size > 0
|
|
264
309
|
? {
|
|
310
|
+
formsTotal: formTally.size,
|
|
265
311
|
forms: [...formTally.entries()]
|
|
266
312
|
.sort((a, b) => b[1] - a[1])
|
|
267
313
|
.slice(0, FORM_CAP)
|
|
@@ -328,6 +374,22 @@ values) {
|
|
|
328
374
|
? ` — and ${g.withTheirTokens} of them already wear a token you declare, so their value is in the system`
|
|
329
375
|
: "";
|
|
330
376
|
lines.push(` ${g.uses} ${g.shape}${g.uses === 1 ? "" : "s"} in ${g.files} file${g.files === 1 ? "" : "s"} - ${g.because}${theirs}`);
|
|
377
|
+
/**
|
|
378
|
+
* A TERCEIRA FRASE, QUANDO O TETO CORTOU - e ela existe para não deixar o cliente descobrir
|
|
379
|
+
* sozinho (lei 8: lacuna declarada é confiança, lacuna calada é bug).
|
|
380
|
+
*
|
|
381
|
+
* Ela só aparece quando corta, ao contrário do campo `distinct`, e a assimetria é de propósito:
|
|
382
|
+
* um campo ausente no censo é ambíguo para quem lê JSON e precisa do valor incondicional; uma
|
|
383
|
+
* linha a mais em TODO grupo de um relatório de 108 linhas é ruído que treina a pessoa a rolar
|
|
384
|
+
* sem ler (dono, 09/08).
|
|
385
|
+
*
|
|
386
|
+
* O QUE ELA NÃO FAZ é prometer o desfecho - mesma correção que `shape-not-read` recebeu em
|
|
387
|
+
* 24/08. Ela diz quantos textos viajam e o que isso significa para um leitor que a gente
|
|
388
|
+
* publique depois; para onde vai o resto depende de uma decisão de tamanho de censo que não é
|
|
389
|
+
* do cliente e ainda não foi tomada.
|
|
390
|
+
*/
|
|
391
|
+
if (g.distinct !== undefined && g.distinct > g.unreadable.length)
|
|
392
|
+
lines.push(` of ${g.distinct} distinct texts here, ${g.unreadable.length} travel with the census - a reader we publish later reaches those without you re-measuring, and the remaining ${g.distinct - g.unreadable.length} need this scan run again`);
|
|
331
393
|
for (const e of g.examples)
|
|
332
394
|
lines.push(` ${e.file}:${e.line} ${e.text.slice(0, 80)}`);
|
|
333
395
|
}
|
|
@@ -677,6 +677,24 @@ export function readUtility(raw, declared) {
|
|
|
677
677
|
if (property)
|
|
678
678
|
return { property, value: `${Number(pct.toFixed(4))}%` };
|
|
679
679
|
}
|
|
680
|
+
/**
|
|
681
|
+
* `-translate-x-1/2` TAMBÉM É UMA FRAÇÃO, e ela tem que ser lida AQUI pelo motivo exato que o
|
|
682
|
+
* comentário acima já dava: depois do split de alpha ela chega como `translate-x-1` e volta
|
|
683
|
+
* `0.25rem` - *silently wrong, which is worse than unread*.
|
|
684
|
+
*
|
|
685
|
+
* E isto não é hipótese: o primeiro rascunho do leitor de `translate` (02/09) tratava a fração
|
|
686
|
+
* dentro de `readUtilityCore`, depois do split, e produziu `translateX(-0.25rem)` para o
|
|
687
|
+
* `-translate-x-1/2` com que ele centra elementos. O spec pegou. É a mesma armadilha, uma função
|
|
688
|
+
* de transform depois.
|
|
689
|
+
*/
|
|
690
|
+
const shift = /^(-?)translate-([xy])-(\d+)\/(\d+)$/.exec(utility);
|
|
691
|
+
if (shift) {
|
|
692
|
+
const pct = (Number(shift[3]) / Number(shift[4])) * 100;
|
|
693
|
+
return {
|
|
694
|
+
property: "transform",
|
|
695
|
+
value: `translate${shift[2] === "x" ? "X" : "Y"}(${shift[1]}${Number(pct.toFixed(4))}%)`,
|
|
696
|
+
};
|
|
697
|
+
}
|
|
680
698
|
const read = readUtilityCore(utility, declared);
|
|
681
699
|
return read ? withAlpha(read, utility.split("/")[1]) : read;
|
|
682
700
|
}
|
|
@@ -1139,6 +1157,63 @@ function readUtilityCore(utility, declared) {
|
|
|
1139
1157
|
* so two on the same element would overwrite - none of their 3 co-occur, and saying
|
|
1140
1158
|
* one of them is better than saying neither.
|
|
1141
1159
|
*/
|
|
1160
|
+
/**
|
|
1161
|
+
* O EIXO FAZ PARTE DA FUNÇÃO, e não do argumento - `rotate-x-45` é `rotateX(45deg)`.
|
|
1162
|
+
*
|
|
1163
|
+
* O QUE ISTO CONSERTA, e é pior que não-lido: o teste abaixo é `^-?rotate-(.+)$`, que capturava
|
|
1164
|
+
* `x-45` e montava **`rotate(x-45deg)`** - uma declaração que o navegador descarta inteira,
|
|
1165
|
+
* gravada na receita como se fosse a decisão dele. `skew-x-6` e `scale-x-95` caíam fora de
|
|
1166
|
+
* qualquer leitor e viravam lacuna, que é o lado seguro de errar; `rotate-x` era o inseguro.
|
|
1167
|
+
*
|
|
1168
|
+
* MEDIDO EM 02/09 COM A RÉGUA DO PRODUTO - as classes que o censo realmente carrega, e não um
|
|
1169
|
+
* grep: **0 usos nas duas populações** para as seis formas por eixo. E o grep ingênuo mentia
|
|
1170
|
+
* feio: ele dava 114 e 16 para `perspective-` e 60 e 78 para `origin-`, e NENHUM era classe de
|
|
1171
|
+
* componente - era o CSS `perspective:` e `transform-origin:` dentro das `@utility` dele.
|
|
1172
|
+
*
|
|
1173
|
+
* ENTÃO POR QUE LER, com N=0? Pelo mesmo motivo que `peer-<estado>/<nome>:` entrou no
|
|
1174
|
+
* `INV-INTERP-17`: isto não é forma de repositório nenhum, é a GRAMÁTICA que o Tailwind declara,
|
|
1175
|
+
* e nela o eixo é sufixo da função. Derivar da gramática cobre o cliente que a gente nunca viu -
|
|
1176
|
+
* e o que decide o caso é que a alternativa aqui não era silêncio, era CSS inválido.
|
|
1177
|
+
*
|
|
1178
|
+
* O QUE NÃO ENTROU, declarado: `origin-*`, `perspective-*`, `transform-gpu` e `translate-z-*`.
|
|
1179
|
+
* Os três primeiros são propriedades PRÓPRIAS (`transformOrigin`, `perspective`, `willChange`) e
|
|
1180
|
+
* não funções de `transform`, então não são sufixo desta família: entram como leitor novo, com
|
|
1181
|
+
* medição própria, no dia em que uma população as escrever como classe.
|
|
1182
|
+
*/
|
|
1183
|
+
const axial = /^(-?)(rotate|skew|scale)-([xyz])-(.+)$/.exec(core);
|
|
1184
|
+
if (axial) {
|
|
1185
|
+
/**
|
|
1186
|
+
* QUANDO ESTE PADRÃO CASA, ELE DECIDE - e nunca deixa cair no leitor genérico abaixo.
|
|
1187
|
+
*
|
|
1188
|
+
* É a metade que fecha a porta de verdade. O primeiro rascunho só ACRESCENTAVA a leitura por
|
|
1189
|
+
* eixo, e `rotate-x-banana` continuava passando para `^-?rotate-(.+)$` e voltando
|
|
1190
|
+
* `rotate(x-bananadeg)` - o mesmo CSS inválido, agora por um caminho a mais. Um `return null`
|
|
1191
|
+
* aqui manda a classe para a lista de não lidas, que é a resposta certa: nunca inventamos, e
|
|
1192
|
+
* uma lacuna dita vale mais que um valor que o navegador descarta.
|
|
1193
|
+
*
|
|
1194
|
+
* E O SINAL SÓ EXISTE ONDE O TAILWIND O DEFINE: `-rotate-y-90` e `-skew-y-3` são válidos;
|
|
1195
|
+
* `-scale-x-95` não é, e aceitá-lo seria ler uma decisão que ele não tem como ter escrito.
|
|
1196
|
+
*/
|
|
1197
|
+
const [, sign, kind, ax, arg] = axial;
|
|
1198
|
+
const fn = `${kind}${ax.toUpperCase()}`;
|
|
1199
|
+
const arbitrary = /^\[(.+)\]$/.exec(arg);
|
|
1200
|
+
if (kind === "scale") {
|
|
1201
|
+
if (sign)
|
|
1202
|
+
return null;
|
|
1203
|
+
const factor = arbitrary
|
|
1204
|
+
? arbitrary[1]
|
|
1205
|
+
: /^\d+$/.test(arg)
|
|
1206
|
+
? String(Number(arg) / 100)
|
|
1207
|
+
: null;
|
|
1208
|
+
return factor
|
|
1209
|
+
? { property: "transform", value: `${fn}(${factor})` }
|
|
1210
|
+
: null;
|
|
1211
|
+
}
|
|
1212
|
+
if (!arbitrary && !/^\d+(\.\d+)?$/.test(arg))
|
|
1213
|
+
return null;
|
|
1214
|
+
const deg = arbitrary ? arbitrary[1] : `${arg}deg`;
|
|
1215
|
+
return { property: "transform", value: `${fn}(${sign}${deg})` };
|
|
1216
|
+
}
|
|
1142
1217
|
const rotate = /^-?rotate-(.+)$/.exec(core);
|
|
1143
1218
|
if (rotate) {
|
|
1144
1219
|
const arbitrary = /^\[(.+)\]$/.exec(rotate[1]);
|
|
@@ -1148,6 +1223,57 @@ function readUtilityCore(utility, declared) {
|
|
|
1148
1223
|
value: `rotate(${core.startsWith("-") ? `-${deg}` : deg})`,
|
|
1149
1224
|
};
|
|
1150
1225
|
}
|
|
1226
|
+
/**
|
|
1227
|
+
* `-translate-y-px`, `translate-x-1/2`, `translate-y-[140%]` - o deslocamento estático.
|
|
1228
|
+
*
|
|
1229
|
+
* A MESMA FAMÍLIA DE `rotate` E `scale`, e era a única das três sem leitor. Medido em 02/09, por
|
|
1230
|
+
* CAMADA e com a régua do produto:
|
|
1231
|
+
*
|
|
1232
|
+
* codelevel 22 camadas com classe de transform · 5 chegavam (23%) · 17 perdidas
|
|
1233
|
+
* frontend-hub 2 camadas · 2 chegavam (100%) · 0 perdidas
|
|
1234
|
+
*
|
|
1235
|
+
* As duas populações discordam porque escrevem coisas diferentes: o `frontend-hub` usa
|
|
1236
|
+
* `scale-95` e `rotate-180`, que já eram lidos; o `codelevel` usa `translate`, e nele as formas
|
|
1237
|
+
* perdidas eram `-translate-y-px` (6), `-translate-x-1/2` (3), `-translate-y-0.5` (2),
|
|
1238
|
+
* `-translate-y-1/2` (2), `translate-y-0`, `translate-y-[140%]` e as duas do grupo nomeado.
|
|
1239
|
+
*
|
|
1240
|
+
* O QUE ELE VÊ SEM ISTO: o card dele sobe 1px no hover no navegador e não sobe no Canvas, e o
|
|
1241
|
+
* elemento que ele centrou com `-translate-x-1/2` aparece deslocado meia largura.
|
|
1242
|
+
*
|
|
1243
|
+
* A ESCALA É A DELE PRIMEIRO, exatamente como em `gap-sm`: `--spacing-<passo>` declarado vence a
|
|
1244
|
+
* fórmula numérica. A FRAÇÃO é percentual por definição do Tailwind (`1/2` = 50%), e não passo de
|
|
1245
|
+
* escala - convertê-la pela escala daria um valor que nada no CSS dele significa.
|
|
1246
|
+
*
|
|
1247
|
+
* DUAS NA MESMA CAMADA AINDA SE SOBRESCREVEM, e isso não é novo nem calado: as três funções
|
|
1248
|
+
* pousam em `transform` inteiro, o comentário de `rotate` já declarava isso, e medido em 02/09 é
|
|
1249
|
+
* **1 de 18** camadas no `codelevel` e 0 no `frontend-hub`. Dizer uma continua sendo melhor que
|
|
1250
|
+
* dizer nenhuma.
|
|
1251
|
+
*/
|
|
1252
|
+
const translate = /^-?translate-([xy])-(.+)$/.exec(core);
|
|
1253
|
+
if (translate) {
|
|
1254
|
+
const axis = translate[1] === "x" ? "X" : "Y";
|
|
1255
|
+
const arg = translate[2];
|
|
1256
|
+
const neg = core.startsWith("-");
|
|
1257
|
+
const own = `--spacing-${arg}`;
|
|
1258
|
+
const arbitrary = /^\[(.+)\]$/.exec(arg);
|
|
1259
|
+
/** A FRAÇÃO NÃO CHEGA AQUI - `readUtility` a lê antes do split de alpha, e o comentário lá
|
|
1260
|
+
* explica por que ela não pode esperar por este ponto. */
|
|
1261
|
+
const size = arbitrary
|
|
1262
|
+
? arbitrary[1]
|
|
1263
|
+
: arg === "full"
|
|
1264
|
+
? "100%"
|
|
1265
|
+
: declared.has(own)
|
|
1266
|
+
? `{spacing.${arg}}`
|
|
1267
|
+
: (SPACING[arg] ?? numericSpacing(arg));
|
|
1268
|
+
if (size)
|
|
1269
|
+
return {
|
|
1270
|
+
property: "transform",
|
|
1271
|
+
value: `translate${axis}(${neg ? `-${size}` : size})`,
|
|
1272
|
+
...(!arbitrary && arg !== "full" && declared.has(own)
|
|
1273
|
+
? { token: own }
|
|
1274
|
+
: {}),
|
|
1275
|
+
};
|
|
1276
|
+
}
|
|
1151
1277
|
const scale = /^scale-(.+)$/.exec(core);
|
|
1152
1278
|
if (scale) {
|
|
1153
1279
|
const arbitrary = /^\[(.+)\]$/.exec(scale[1]);
|
|
@@ -1648,8 +1774,12 @@ function slotFor(out, modifiers) {
|
|
|
1648
1774
|
let at;
|
|
1649
1775
|
let unslotted = false;
|
|
1650
1776
|
for (const mod of rest) {
|
|
1651
|
-
/**
|
|
1652
|
-
|
|
1777
|
+
/**
|
|
1778
|
+
* `group-hover:`, `group-data-[checked]:` - the PARENT's state. E o NOME do grupo depois da
|
|
1779
|
+
* barra não é parte do estado: ver a régua gêmea em `variant-read.ts`, com a medição das duas
|
|
1780
|
+
* populações e a prova de que descartar o nome não junta nada.
|
|
1781
|
+
*/
|
|
1782
|
+
const group = /^group-(.+?)(?:\/[A-Za-z0-9_-]+)?$/.exec(mod);
|
|
1653
1783
|
const bare = group ? group[1] : mod;
|
|
1654
1784
|
const state = STATE_SPELLING[bare] ?? dataState(bare);
|
|
1655
1785
|
if (state) {
|
|
@@ -73,8 +73,34 @@ const MODIFIER_STATE = {
|
|
|
73
73
|
"aria-invalid": "invalid",
|
|
74
74
|
"aria-busy": "loading",
|
|
75
75
|
};
|
|
76
|
-
/**
|
|
77
|
-
|
|
76
|
+
/**
|
|
77
|
+
* O NOME DO GRUPO NÃO É PARTE DO ESTADO - `group-hover/tt:` é "quando o grupo chamado `tt` está em
|
|
78
|
+
* hover", e o estado ali é `hover`.
|
|
79
|
+
*
|
|
80
|
+
* O TAILWIND NOMEIA GRUPOS desde a v3, e é o que se escreve quando dois grupos se aninham: o pai
|
|
81
|
+
* declara `group/tt` e o filho reage com `group-hover/tt:`. A régua capturava `(.+)` depois do
|
|
82
|
+
* `group-`, então ela procurava o estado `hover/tt` na tabela e não achava - e o estilo inteiro
|
|
83
|
+
* daquela condição era declarado perdido.
|
|
84
|
+
*
|
|
85
|
+
* MEDIDO EM 02/09, e AS DUAS POPULAÇÕES SÃO OPOSTAS (`INV-GERAL-07`):
|
|
86
|
+
*
|
|
87
|
+
* codelevel 138 usos NOMEADOS em 39 arquivos · 0 anônimos
|
|
88
|
+
* frontend-hub 0 nomeados · 192 anônimos
|
|
89
|
+
*
|
|
90
|
+
* Uma régua escrita para qualquer uma das duas quebraria na outra por inteiro. O que decide não é
|
|
91
|
+
* a população: é a gramática que o Tailwind declara, e nela o nome é um IDENTIFICADOR opcional
|
|
92
|
+
* depois de uma barra. `peer-<estado>/<nome>:` tem a mesma forma e entra pela mesma porta - 0 usos
|
|
93
|
+
* nas duas populações hoje, e cobrir os dois é derivar da gramática em vez de fixar o que um
|
|
94
|
+
* repositório escreve.
|
|
95
|
+
*
|
|
96
|
+
* DESCARTAR O NOME É SEGURO, e isto foi medido antes de ser decidido: o nome só distinguiria algo
|
|
97
|
+
* se dois grupos diferentes aparecessem na MESMA lista de classes. No `codelevel` são 2 nomes no
|
|
98
|
+
* repositório inteiro (`tt` 96, `btn` 42), 7 arquivos usam os dois, e **em 0 dos 10 atributos
|
|
99
|
+
* `className` medidos eles coexistem**. Cada lista de classes pertence a um elemento, e ali o nome
|
|
100
|
+
* é derivável do contexto. Se um dia coexistirem, as duas condições produzem o MESMO `within` e
|
|
101
|
+
* viram duas camadas distinguíveis pelas outras classes - nada é somado em silêncio.
|
|
102
|
+
*/
|
|
103
|
+
const RELATIONAL = /^(?:group|peer)-(.+?)(?:\/[A-Za-z0-9_-]+)?$/;
|
|
78
104
|
/**
|
|
79
105
|
* `data-[state=open]:`, `data-[checked]:`, `data-[side=top]:` - como @base-ui e Radix escrevem uma
|
|
80
106
|
* condição.
|
package/dist/install-marks.js
CHANGED
|
@@ -567,7 +567,56 @@ export const CHECKER_SINCE = "0.16.308";
|
|
|
567
567
|
* QUEM NÃO É AFETADO: quem não escreve `@keyframes`. E quem escreve um que a captura NÃO alcançou -
|
|
568
568
|
* ali o frame continua sendo lacuna, porque ali a perda é real.
|
|
569
569
|
*/
|
|
570
|
-
|
|
570
|
+
/**
|
|
571
|
+
* 0.16.351 -> 0.16.352 em 02/09 (`INV-INTERP-17`): o GRUPO NOMEADO do Tailwind passa a ser lido.
|
|
572
|
+
*
|
|
573
|
+
* O QUE ELE GANHA COM O `sync`: a condição que só existe quando o grupo em volta reage. `group/tt`
|
|
574
|
+
* no pai e `group-hover/tt:` no filho é como se escreve isso desde a v3 do Tailwind, e a régua
|
|
575
|
+
* procurava o estado `hover/tt` na tabela - não achava, e declarava PERDIDA a condição inteira.
|
|
576
|
+
*
|
|
577
|
+
* MEDIDO NO `codelevel`: 4 classes em `unplaced` viram 2 camadas condicionais com `opacity: 1` na
|
|
578
|
+
* receita do `TooltipContent`. O tooltip dele aparece no hover no navegador e não aparecia na
|
|
579
|
+
* nossa.
|
|
580
|
+
*
|
|
581
|
+
* codelevel 138 usos NOMEADOS · 0 anônimos · unplaced 4 -> 0
|
|
582
|
+
* frontend-hub 0 nomeados · 192 anônimos · unplaced 0 -> 0 (a forma anônima não regride)
|
|
583
|
+
*
|
|
584
|
+
* QUEM NÃO É AFETADO: quem escreve só a forma anônima (`group-hover:`), que já era lida. O nome do
|
|
585
|
+
* grupo é descartado com prova: em 0 dos 10 atributos `className` medidos dois grupos coexistem.
|
|
586
|
+
*/
|
|
587
|
+
/**
|
|
588
|
+
* 0.16.352 -> 0.16.353 em 02/09 (`INV-INTERP-18`): `translate` passa a ser lido.
|
|
589
|
+
*
|
|
590
|
+
* O QUE ELE GANHA COM O `sync`: o deslocamento estático que ele declara. `rotate` e `scale` já
|
|
591
|
+
* eram lidos; `translate` era a única das três funções de transform sem leitor, e a camada inteira
|
|
592
|
+
* que dependia dela era descartada.
|
|
593
|
+
*
|
|
594
|
+
* codelevel 5 de 22 camadas chegavam (23%) -> 30 de 30
|
|
595
|
+
* frontend-hub 2 de 2 (100%) -> 2 de 2 · ele escreve `scale`/`rotate`, que já eram lidos
|
|
596
|
+
*
|
|
597
|
+
* E UM CASO PIOR QUE NÃO-LIDO: `-translate-x-1/2`, com que ele centra elementos, chegava ao leitor
|
|
598
|
+
* de tamanho como `translate-x-1` e voltava `0.25rem`. Quem já importou tem essa receita gravada -
|
|
599
|
+
* o elemento aparece deslocado meia largura em vez de centrado.
|
|
600
|
+
*
|
|
601
|
+
* QUEM NÃO É AFETADO: quem não escreve `translate-*`.
|
|
602
|
+
*/
|
|
603
|
+
/**
|
|
604
|
+
* 0.16.353 -> 0.16.354 em 02/09 (`INV-INTERP-19`): o EIXO passa a fazer parte da função, e a régua
|
|
605
|
+
* para de emitir CSS inválido.
|
|
606
|
+
*
|
|
607
|
+
* O QUE ELE GANHA COM O `sync`: `rotate-x-45` virava **`rotate(x-45deg)`**, uma declaração que o
|
|
608
|
+
* navegador descarta inteira e que ficava GRAVADA na receita como se fosse a decisão dele. Agora é
|
|
609
|
+
* `rotateX(45deg)`, e o que não é ângulo vira lacuna em vez de valor inventado.
|
|
610
|
+
*
|
|
611
|
+
* A MARCA SOBE APESAR DE N=0 nas duas populações, e é uma escolha declarada: quem TEM a forma tem
|
|
612
|
+
* um valor inválido gravado, e é a marca que faz o `align` chamá-lo a re-medir. Errar para o lado
|
|
613
|
+
* de subir custa um `sync` que não precisava; errar para o outro deixa o valor inválido para
|
|
614
|
+
* sempre, e "0 nas duas que eu medi" não é "0 no mundo" (`INV-GERAL-07`).
|
|
615
|
+
*
|
|
616
|
+
* QUEM NÃO É AFETADO: quem não escreve `rotate-x`, `skew-x/y` ou `scale-x/y`. As formas SEM eixo -
|
|
617
|
+
* `rotate-180`, `scale-95` - não se movem, e há asserção disso.
|
|
618
|
+
*/
|
|
619
|
+
export const READER_SINCE = "0.16.354";
|
|
571
620
|
/**
|
|
572
621
|
* O QUE ESTÁ INSTALADO AQUI FICOU PARA TRÁS - e as DUAS condições que fazem isso ser verdade.
|
|
573
622
|
*
|
package/package.json
CHANGED