synthesisui 0.16.416 → 0.16.417

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.
@@ -212,6 +212,23 @@ function nameOfTag(tag) {
212
212
  .replace(/[^a-z0-9]+/g, "-")
213
213
  .replace(/^-|-$/g, "");
214
214
  }
215
+ /**
216
+ * A PROP QUE ALIMENTA O ELEMENTO, na mesma grafia dos outros nomes de part.
217
+ *
218
+ * `contentFrom` é a expressão verbatim que o JSX escreve, então ela pode ser um identificador
219
+ * simples (`label`), um acesso (`item.title`) ou uma chamada. Só o que é um nome simples vira
220
+ * nome de part: um pedaço de expressão viraria uma classe ilegível no CSS compilado, e o nó cai
221
+ * em `box` como antes. Medido nos dois censos: os 19 do `codelevel-ui` são todos identificadores
222
+ * simples, e dos 534 do `frontend-hub` a maioria também.
223
+ */
224
+ function nameOfProp(expression) {
225
+ const clean = expression.trim();
226
+ if (!/^[A-Za-z_$][\w$]*$/.test(clean))
227
+ return undefined;
228
+ const name = nameOfTag(clean);
229
+ /** `children` é a palavra do React, não do design dele - ali o nó é um slot, não uma part. */
230
+ return name && name !== "children" ? name : undefined;
231
+ }
215
232
  /**
216
233
  * O NOME QUE ELE MESMO DEU AO ELEMENTO - a classe do CSS Module.
217
234
  *
@@ -535,6 +552,31 @@ consumedAt) {
535
552
  const hasKids = children.length > 0;
536
553
  let as;
537
554
  let name;
555
+ /**
556
+ * O CONTEÚDO QUE VEM DE UMA PROP DELE É CONTEÚDO - A1 da etapa 15 (dono, 11/09).
557
+ *
558
+ * O QUE ELE VIA: o `CapabilityCard` dele desenhado como três losangos `✧` soltos, e o `Beam`
559
+ * como um `✧`. A pergunta dele foi a certa: *"mesmo tendo a receita vindo de um componente
560
+ * funcionando, não consigo entender o motivo"*.
561
+ *
562
+ * A SUPOSIÇÃO QUE ERRAVA estava escrita três linhas abaixo, em voz alta: *"a leaf box with no
563
+ * content of its own is a drawn SHAPE (...) `icon` is the form for 'a bare shape with no
564
+ * text'"*. Em React o texto quase nunca é literal no JSX - ele vem de `{label}`, `{children}`,
565
+ * `{value}`. **"Sem texto literal" não significa "sem conteúdo": significa "o conteúdo vem de
566
+ * fora".**
567
+ *
568
+ * E O COLETOR JÁ SABIA. `contentFrom` é a expressão que aquele elemento escreve, e o contrato
569
+ * a descreve como *"a evidência de QUAL prop alimenta este elemento"*. A derivação nunca a
570
+ * consultava. MEDIDO nos dois censos congelados: **19 nós** no `codelevel-ui` e **534** no
571
+ * `frontend-hub` - e no sistema dele isso era 36 dos 94 nós chegando como `icon`, 20 deles
572
+ * sem ser glifo nenhum (`label`, `value`, `title`, `eyebrow`, `meta`).
573
+ *
574
+ * É EVIDÊNCIA, NUNCA EXECUÇÃO: em outro projeto a prop tem outro nome, e o que atravessa é
575
+ * que ESTE elemento é onde o conteúdo entra. Por isso a regra lê a PRESENÇA do campo, e a
576
+ * palavra dele só vira o nome da part.
577
+ */
578
+ const writesContent = typeof node.contentFrom === "string" &&
579
+ node.contentFrom.trim().length > 0;
538
580
  if (capitalised) {
539
581
  // A primitive's member name is the client's own word for the element.
540
582
  name = nameOfTag(tag);
@@ -551,10 +593,25 @@ consumedAt) {
551
593
  else if (form)
552
594
  as = form;
553
595
  else
554
- as = hasKids ? arrangement(classes) : node.text ? "text" : "icon";
596
+ as = hasKids
597
+ ? arrangement(classes)
598
+ : node.text || writesContent
599
+ ? "text"
600
+ : "icon";
555
601
  }
556
602
  else if (byTag) {
557
- name = byTag.name;
603
+ /**
604
+ * A PALAVRA DELE VENCE O NOME QUE A TAG SUGERE (A5 da etapa 15).
605
+ *
606
+ * `BY_TAG` dá a um `<span>` o nome `text` e a um `<div>` nada - nomes corretos e MUDOS,
607
+ * que dizem o que a tag é e nada sobre o papel daquele nó no componente dele. Quando o
608
+ * JSX escreve `<span>{eyebrow}</span>`, `eyebrow` é a palavra que ele usa para aquilo, e
609
+ * é ela que precisa chegar na tela e no seletor. Perde só para um nome que também é dele
610
+ * e mais específico: uma classe de module, ou o membro de um componente que ele escreveu.
611
+ */
612
+ name =
613
+ (writesContent ? nameOfProp(String(node.contentFrom)) : undefined) ??
614
+ byTag.name;
558
615
  if (NEUTRAL.has(lower)) {
559
616
  /**
560
617
  * A leaf box with no content of its own is a drawn SHAPE - a dot, a
@@ -564,7 +621,7 @@ consumedAt) {
564
621
  as =
565
622
  hasKids || node.slot
566
623
  ? arrangement(classes)
567
- : node.text
624
+ : node.text || writesContent
568
625
  ? "text"
569
626
  : "icon";
570
627
  }
@@ -572,7 +629,7 @@ consumedAt) {
572
629
  as = byTag.as;
573
630
  }
574
631
  else {
575
- as = hasKids ? arrangement(classes) : "icon";
632
+ as = hasKids ? arrangement(classes) : writesContent ? "text" : "icon";
576
633
  }
577
634
  /**
578
635
  * ANYTHING HOLDING ELEMENTS ARRANGES THEM - the contract gives children to
@@ -598,9 +655,16 @@ consumedAt) {
598
655
  /**
599
656
  * `box` VIROU A ÚLTIMA OPÇÃO, não a primeira - ver `nameOfModule`. Um nó com
600
657
  * classe de module tem nome, e o nome é dele.
658
+ *
659
+ * E A PROP QUE ALIMENTA O ELEMENTO VEM ANTES DE `box` (A5 da etapa 15). Os dois nós de
660
+ * texto do `CapabilityCard` dele chegavam como `box` e `box` - dois irmãos com o mesmo
661
+ * nome, que é o mesmo que não ter nome. `contentFrom: "label"` é a palavra que o CÓDIGO
662
+ * DELE escreve, e ela é melhor que qualquer coisa que a gente derivasse da tag.
601
663
  */
602
664
  name =
603
- nameOfModule(node.moduleClass) ?? "box";
665
+ nameOfModule(node.moduleClass) ??
666
+ (writesContent ? nameOfProp(String(node.contentFrom)) : undefined) ??
667
+ "box";
604
668
  /**
605
669
  * A NODE WHOSE CONTENT IS THE CALLER'S is a slot, and it keeps its own name
606
670
  * and classes - the border and the hover on a `<tr>{children}</tr>` are real
@@ -793,7 +793,7 @@ export const CHECKER_SINCE = "0.16.413";
793
793
  * deveriam estar lá. Quem tem censo gravado precisa de um `sync` para a fila de trabalho dele ser a
794
794
  * real; ver o livro-razão de `corpus.spec.ts`.
795
795
  */
796
- export const READER_SINCE = "0.16.408";
796
+ export const READER_SINCE = "0.16.417";
797
797
  /**
798
798
  * O QUE ESTÁ INSTALADO AQUI FICOU PARA TRÁS - e as DUAS condições que fazem isso ser verdade.
799
799
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.416",
3
+ "version": "0.16.417",
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": {