@esfaenza/dpe-builder 20.3.12 → 20.3.14

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.
@@ -51,6 +51,34 @@
51
51
  --dpe-text-muted: #6b7086;
52
52
  --dpe-text-subtle: #98a2b3;
53
53
 
54
+ /*
55
+ * Il testo attenuato fa **due mestieri**, e per questo sono due token. La divisione e' la stessa
56
+ * gia' applicata agli stati (`--dpe-*-text` qui sotto): non un gusto, una soglia.
57
+ *
58
+ * - `--dpe-text-subtle` e' **decorazione**: testo secondario e ridondante, che dice una cosa gia'
59
+ * leggibile altrove. Il nome tecnico sulla card del nodo lo ripete la testata della dialog,
60
+ * l'etichetta di una porta la ripete il colore dell'arco, un separatore «·» non dice niente.
61
+ * Sta a 2.58:1 su bianco e va bene cosi': attenuare e' il suo lavoro.
62
+ * - `--dpe-text-subtle-strong` e' **informazione**: testo che l'utente deve leggere per agire e
63
+ * che non trova da nessun'altra parte. Sta sopra 4.5:1 su **tutte** le superfici chiare,
64
+ * compresa la piu' scura (`--dpe-surface-sunken`): da 4.6 a 5.2.
65
+ *
66
+ * Criterio per scegliere, uno solo: **se questo testo fosse illeggibile, l'utente perderebbe
67
+ * qualcosa che non trova altrove?** Si' -> `-strong`. No -> il token attenuato.
68
+ *
69
+ * Perche' non alzare il token unico: lo userebbero anche i trenta punti decorativi, e la card del
70
+ * nodo si appiattirebbe — nome tecnico, sottotitolo ed etichette delle porte tutti allo stesso
71
+ * peso del titolo. Perche' non usare `--dpe-text-muted` al loro posto: misura **4.29:1** su
72
+ * `--dpe-surface-sunken`, cioe' sotto il minimo proprio dove finiscono i messaggi di stato vuoto.
73
+ *
74
+ * Nota onesta sul valore: in tema chiaro non esiste un grigio **piu' chiaro** di
75
+ * `--dpe-text-muted` che regga 4.5:1 (il limite su bianco e' circa #767676, misurato in LV1), e
76
+ * lo stesso vale in scuro. Il token informativo cade quindi nella fascia di `--dpe-text-muted`,
77
+ * e la gerarchia fra i due la fanno corpo e peso, non il colore. Restano token distinti perche'
78
+ * governano usi diversi con soglie diverse e l'ospite deve poterli ritingere separatamente.
79
+ */
80
+ --dpe-text-subtle-strong: #666c80;
81
+
54
82
  /* Accento e stati */
55
83
  --dpe-accent: #2f7d8f;
56
84
  --dpe-accent-strong: #226270;
@@ -60,13 +88,46 @@
60
88
  --dpe-success: #22a06b;
61
89
  --dpe-info: #3b6fd4;
62
90
 
91
+ /*
92
+ * Gli stessi stati **quando colorano lettere**, e sono token separati per un fatto misurato, non
93
+ * per gusto.
94
+ *
95
+ * Un colore di stato fa due mestieri con due soglie diverse: bordo, pastiglia e banner sono
96
+ * elementi di interfaccia (WCAG chiede 3:1), un rilievo scritto e' testo (4.5:1). Su superficie
97
+ * chiara i valori qui sopra reggono il primo mestiere e non il secondo: `--dpe-warning` misura
98
+ * **3.64:1** su `--dpe-surface` e `--dpe-success` **3.33:1**. Un rilievo che l'utente fatica a
99
+ * leggere e' un rilievo che non arriva, e l'avviso e' il colore con cui arriva
100
+ * `DPE_EXPR_TYPE_WIDENED`.
101
+ *
102
+ * Perche' separare invece di alzare il token unico: alzarlo avrebbe imbrunito insieme al testo
103
+ * anche i bordi dei nodi, le pastiglie e il fondo tinto del banner — cioe' il linguaggio visivo
104
+ * dell'editor — e avrebbe chiesto di **argomentare** che nessuno di quegli usi peggiora. Con due
105
+ * token quegli usi restano identici al bit, e cambia solo il colore delle lettere.
106
+ *
107
+ * I valori chiari stanno sopra 4.5:1 su **tutte** le superfici chiare, compresa la piu' scura
108
+ * (`--dpe-surface-sunken`) e i fondi tinti del catalogo: da 5.0 a 5.9 su `--dpe-surface`.
109
+ *
110
+ * Regola d'uso, una sola: **se colora lettere si usa la variante `-text`; se colora un bordo o un
111
+ * fondo si usa il token di stato.**
112
+ */
113
+ --dpe-error-text: #c81e1e;
114
+ --dpe-warning-text: #8f6115;
115
+ --dpe-success-text: #177a4f;
116
+ --dpe-info-text: #3161bd;
117
+
63
118
  /*
64
119
  * Nodo valido ma **non compilabile** (`DPE_NODE_NOT_COMPILABLE`, I10): non e' un errore
65
120
  * dell'utente ed e' l'unica distinzione che deve leggersi a colpo d'occhio nel pannello
66
121
  * delle diagnostiche. Colore proprio, ne' rosso ne' giallo, per non farlo confondere con
67
122
  * qualcosa da correggere.
123
+ *
124
+ * Vale la stessa divisione di mestiere: il viola pieno disegna bordo e tratteggio, la variante
125
+ * `-text` scrive la pastiglia e l'etichetta. Il pieno su `--dpe-surface-alt` misura 4.53:1 e sulla
126
+ * riga tinta del pannello 4.47:1 — sopra e sotto il minimo a seconda di dove finisce, che e'
127
+ * esattamente il tipo di fortuna su cui non si costruisce.
68
128
  */
69
129
  --dpe-not-compilable: #7c5cd6;
130
+ --dpe-not-compilable-text: #6f4fc4;
70
131
 
71
132
  /*
72
133
  * Velo della dialog modale (`::backdrop`). E' un token perche' la regola della casa e' «colori
@@ -94,8 +155,23 @@
94
155
  --dpe-cat-uncompilable: #7c5cd6;
95
156
  --dpe-cat-uncompilable-soft: #ebe6fa;
96
157
 
97
- /* Colori degli archi per tipo di ingresso */
98
- --dpe-edge-source: #98a2b3;
158
+ /*
159
+ * Colori degli archi per tipo di ingresso.
160
+ *
161
+ * Un arco del DAG e' un **oggetto grafico necessario a capire il contenuto** (WCAG 1.4.11, 3:1):
162
+ * senza archi non c'e' grafo, e la topologia non e' scritta da nessun'altra parte
163
+ * dell'interfaccia. L'arco predefinito misurava **2.36:1** sul fondo del canvas in tema chiaro,
164
+ * cioe' sotto il minimo; e' lo stesso grigio-azzurro, trenta punti piu' scuro su ogni canale, e
165
+ * ora sta a **3.46:1**. Gli altri quattro erano gia' sopra (3.05-4.43) e non si toccano.
166
+ *
167
+ * In tema scuro il valore non cambia: li' l'arco predefinito misura gia' 4.18:1 sul canvas. La
168
+ * separazione esiste dove serve e non dove non serve.
169
+ *
170
+ * Nota: questa famiglia **coincide per valore** con i token di stato in piu' punti, ma e' una
171
+ * famiglia sua. Cambiare un colore di stato non cambia un arco, e viceversa — le due cose si
172
+ * assomigliano, non si condividono.
173
+ */
174
+ --dpe-edge-source: #7a8496;
99
175
  --dpe-edge-primary: #2f7d8f;
100
176
  --dpe-edge-secondary: #8b5cf6;
101
177
  --dpe-edge-append: #22a06b;
@@ -161,6 +237,12 @@
161
237
  --dpe-text: #e8eaf0;
162
238
  --dpe-text-muted: #8b90a0;
163
239
  --dpe-text-subtle: #6b7684;
240
+ /*
241
+ * Qui la separazione **serve in entrambi i temi**, al contrario di quella degli stati: su fondo
242
+ * scuro `--dpe-text-subtle` misura 3.81:1 sulla superficie e 3.21:1 su quella incassata, cioe'
243
+ * sotto il minimo ovunque. Il valore informativo sta fra 4.9 e 5.8 sulle tre superfici scure.
244
+ */
245
+ --dpe-text-subtle-strong: #8d94a6;
164
246
  --dpe-accent: #5fb3c4;
165
247
  --dpe-accent-strong: #7ac6d6;
166
248
  --dpe-accent-contrast: #0c0e14;
@@ -169,6 +251,17 @@
169
251
  --dpe-success: #63b57f;
170
252
  --dpe-info: #7ea6f0;
171
253
  --dpe-not-compilable: #a78bfa;
254
+ /*
255
+ * In tema scuro la separazione fra colore di stato e colore del testo **non serve**: misurati su
256
+ * tutte le superfici scure, fondi tinti compresi, i cinque stanno fra 4.8:1 e 7.6:1. Le varianti
257
+ * puntano quindi al token di stato invece di ripeterne il valore, cosi' un ospite che ritinge uno
258
+ * stato in tema scuro si porta dietro anche il testo senza doverlo sapere.
259
+ */
260
+ --dpe-error-text: var(--dpe-error);
261
+ --dpe-warning-text: var(--dpe-warning);
262
+ --dpe-success-text: var(--dpe-success);
263
+ --dpe-info-text: var(--dpe-info);
264
+ --dpe-not-compilable-text: var(--dpe-not-compilable);
172
265
  /* Su fondo scuro il velo deve pesare piu': la superficie sotto e' gia' scura. */
173
266
  --dpe-scrim: rgba(4, 5, 8, 0.66);
174
267
  /*
@@ -296,6 +389,11 @@ dpe-builder {
296
389
  /*
297
390
  * Indicatore di stato sporco. Colore **e** simbolo: il colore da solo non basta a distinguere
298
391
  * due stati per chi non lo percepisce, e questo e' l'indicatore su cui si decide se salvare.
392
+ *
393
+ * **Decorativo nello stato a riposo**, informativo in quello acceso — che infatti prende
394
+ * `--dpe-warning-text` qui sotto. «○ nessuna modifica» e' la meta' ridondante della coppia:
395
+ * l'assenza di «● modificata» dice la stessa cosa, e «Salva» e' comunque spento con il motivo nel
396
+ * titolo. Attenuarlo e' voluto, perche' lo stato a riposo non deve chiamare l'attenzione.
299
397
  */
300
398
  .dpe-shell__dirty {
301
399
  flex: 0 0 auto;
@@ -305,7 +403,7 @@ dpe-builder {
305
403
  }
306
404
 
307
405
  .dpe-shell__dirty--on {
308
- color: var(--dpe-warning, #b7791f);
406
+ color: var(--dpe-warning-text, #8f6115);
309
407
  font-weight: 600;
310
408
  }
311
409
 
@@ -352,7 +450,7 @@ dpe-builder {
352
450
  padding: 2px 8px;
353
451
  border: 1px solid var(--dpe-success, #22a06b);
354
452
  border-radius: 999px;
355
- color: var(--dpe-success, #22a06b);
453
+ color: var(--dpe-success-text, #177a4f);
356
454
  font-size: 11px;
357
455
  font-weight: 600;
358
456
  white-space: nowrap;
@@ -398,19 +496,24 @@ dpe-builder {
398
496
  font-size: 11px;
399
497
  }
400
498
 
499
+ /*
500
+ * Pastiglie di stato: il bordo porta il colore di stato, le lettere la sua variante `-text`. E' la
501
+ * divisione dichiarata in testa al foglio, e qui si vede il perche': il bordo e il testo stanno
502
+ * sullo stesso fondo ma hanno due soglie diverse.
503
+ */
401
504
  .dpe-shell__pill--ok {
402
505
  border-color: var(--dpe-success, #22a06b);
403
- color: var(--dpe-success, #22a06b);
506
+ color: var(--dpe-success-text, #177a4f);
404
507
  }
405
508
 
406
509
  .dpe-shell__pill--error {
407
510
  border-color: var(--dpe-error, #dc2626);
408
- color: var(--dpe-error, #dc2626);
511
+ color: var(--dpe-error-text, #c81e1e);
409
512
  }
410
513
 
411
514
  .dpe-shell__pill--busy {
412
515
  border-color: var(--dpe-info, #3b6fd4);
413
- color: var(--dpe-info, #3b6fd4);
516
+ color: var(--dpe-info-text, #3161bd);
414
517
  }
415
518
 
416
519
  /* Banner di riga intera: disallineamento del dialetto, salvataggio fallito. Non e' un tooltip. */
@@ -729,6 +832,9 @@ dpe-canvas .dpe-flow .dpe-port {
729
832
  min-width: 0;
730
833
  }
731
834
 
835
+ /* **Decorativo**: quale porta sia quale lo dice gia' il **colore dell'arco** che ci arriva (vedi la
836
+ sezione «archi»), e la dialog del nodo nomina sorgente primaria e secondaria per esteso. A 9px
837
+ l'etichetta e' un promemoria sulla card, non la fonte del fatto. */
732
838
  dpe-canvas .dpe-flow .dpe-port__label {
733
839
  max-width: 96px;
734
840
  overflow: hidden;
@@ -795,7 +901,7 @@ dpe-canvas .dpe-flow .dpe-node .dpe-connector--out {
795
901
  border: 2px solid var(--dpe-surface, #fff);
796
902
  border-radius: 50%;
797
903
  background: var(--dpe-border-strong, #cfd4de);
798
- /* Sporge oltre il bordo inferiore: e' lì che gli archi partono. */
904
+ /* Sporge oltre il bordo inferiore: e' li' che gli archi partono. */
799
905
  margin-bottom: -6px;
800
906
  /*
801
907
  * `--ff-connector-connected-color` e' il token con cui la libreria colora un connettore
@@ -858,6 +964,7 @@ dpe-canvas .dpe-flow .dpe-node__sub {
858
964
  white-space: nowrap;
859
965
  }
860
966
 
967
+ /* **Decorativo**: e' un separatore «·», non porta nessun contenuto. */
861
968
  dpe-canvas .dpe-flow .dpe-node__dot {
862
969
  padding: 0 4px;
863
970
  color: var(--dpe-text-subtle, #98a2b3);
@@ -886,7 +993,7 @@ dpe-canvas .dpe-flow .dpe-node__btn:hover {
886
993
 
887
994
  dpe-canvas .dpe-flow .dpe-node__btn--remove:hover {
888
995
  border-color: var(--dpe-error, #dc2626);
889
- color: var(--dpe-error, #dc2626);
996
+ color: var(--dpe-error-text, #c81e1e);
890
997
  }
891
998
 
892
999
  dpe-canvas .dpe-flow .dpe-node__meta {
@@ -898,6 +1005,10 @@ dpe-canvas .dpe-flow .dpe-node__meta {
898
1005
  min-height: 18px;
899
1006
  }
900
1007
 
1008
+ /* **Decorativo**, ed e' il posto che il token attenuato esiste per servire: il nome tecnico lo
1009
+ ripetono la testata della dialog (`.dpe-dialog__name`) e il pannello dello schema
1010
+ (`.dpe-schema__name`), entrambi leggibili. Alzarlo qui appiattirebbe la card, che e' il danno
1011
+ che la divisione dei due token evita. */
901
1012
  dpe-canvas .dpe-flow .dpe-node__name {
902
1013
  overflow: hidden;
903
1014
  max-width: 130px;
@@ -918,24 +1029,29 @@ dpe-canvas .dpe-flow .dpe-badge {
918
1029
  white-space: nowrap;
919
1030
  }
920
1031
 
1032
+ /*
1033
+ * Le pastiglie sulla card: bordo con il colore di stato, lettere con la variante `-text`. Qui il
1034
+ * fondo e' `--dpe-surface-alt`, dove il viola pieno scendeva a 4.53:1 e l'azzurro a 4.48:1 — una
1035
+ * pastiglia da 10px e' il posto peggiore dove restare al filo del minimo.
1036
+ */
921
1037
  dpe-canvas .dpe-flow .dpe-badge--error {
922
1038
  border-color: var(--dpe-error, #dc2626);
923
- color: var(--dpe-error, #dc2626);
1039
+ color: var(--dpe-error-text, #c81e1e);
924
1040
  }
925
1041
 
926
1042
  dpe-canvas .dpe-flow .dpe-badge--warning {
927
1043
  border-color: var(--dpe-warning, #b7791f);
928
- color: var(--dpe-warning, #b7791f);
1044
+ color: var(--dpe-warning-text, #8f6115);
929
1045
  }
930
1046
 
931
1047
  dpe-canvas .dpe-flow .dpe-badge--info {
932
1048
  border-color: var(--dpe-info, #3b6fd4);
933
- color: var(--dpe-info, #3b6fd4);
1049
+ color: var(--dpe-info-text, #3161bd);
934
1050
  }
935
1051
 
936
1052
  dpe-canvas .dpe-flow .dpe-badge--not-compilable {
937
1053
  border-color: var(--dpe-not-compilable, #7c5cd6);
938
- color: var(--dpe-not-compilable, #7c5cd6);
1054
+ color: var(--dpe-not-compilable-text, #6f4fc4);
939
1055
  }
940
1056
 
941
1057
  /* =================================================================== archi */
@@ -952,8 +1068,8 @@ dpe-canvas .dpe-flow .dpe-badge--not-compilable {
952
1068
  */
953
1069
 
954
1070
  .dpe-edge {
955
- --ff-connection-color: var(--dpe-edge-source, #98a2b3);
956
- --ff-marker-color: var(--dpe-edge-source, #98a2b3);
1071
+ --ff-connection-color: var(--dpe-edge-source, #7a8496);
1072
+ --ff-marker-color: var(--dpe-edge-source, #7a8496);
957
1073
  --ff-connection-selected-color: var(--dpe-accent, #2f7d8f);
958
1074
  }
959
1075
 
@@ -1029,7 +1145,10 @@ dpe-node-palette input[type='search'] {
1029
1145
  font-size: 12px;
1030
1146
  }
1031
1147
 
1032
- /* Intestazione di gruppo: piu' piccola del titolo della palette, e non cliccabile. */
1148
+ /* Intestazione di gruppo: piu' piccola del titolo della palette, e non cliccabile.
1149
+ **Decorativa**: «Sorgenti / Trasformazioni / Scritture» e' il riassunto delle voci che contiene,
1150
+ e ogni voce porta la propria etichetta leggibile piu' l'icona colorata per famiglia. Illeggibile
1151
+ l'intestazione, non si perde nessuna voce. */
1033
1152
  dpe-node-palette .dpe-palette__group {
1034
1153
  margin: 8px 2px 2px;
1035
1154
  color: var(--dpe-text-subtle, #98a2b3);
@@ -1136,7 +1255,7 @@ dpe-node-palette .dpe-palette__flag {
1136
1255
  padding: 0 5px;
1137
1256
  border: 1px solid var(--dpe-not-compilable, #7c5cd6);
1138
1257
  border-radius: 999px;
1139
- color: var(--dpe-not-compilable, #7c5cd6);
1258
+ color: var(--dpe-not-compilable-text, #6f4fc4);
1140
1259
  font-size: 9px;
1141
1260
  font-weight: 700;
1142
1261
  letter-spacing: 0.04em;
@@ -1187,24 +1306,41 @@ dpe-node-icon {
1187
1306
  font-weight: 600;
1188
1307
  }
1189
1308
 
1309
+ /*
1310
+ * Il suggerimento sotto un campo: testo attenuato, **non** testo che si puo' non leggere. Con
1311
+ * `--dpe-text-subtle` misurava 2.58:1 in tema chiaro e 3.81:1 in scuro — sotto il minimo in
1312
+ * entrambi — e ci passano le colonne disponibili e il conteggio del catalogo delle formule, cioe'
1313
+ * cio' che si legge per capire cosa si puo' scrivere nel campo sopra.
1314
+ *
1315
+ * Colore proprio e non token alzato: sulle nostre superfici chiare **non esiste** un terzo grigio
1316
+ * piu' chiaro di `--dpe-text-muted` che stia sopra 4.5:1 (su bianco il limite e' circa #767676, e
1317
+ * `--dpe-text-muted` e' gia' li'). Alzare `--dpe-text-subtle` lo renderebbe un doppione di
1318
+ * `--dpe-text-muted` e appiattirebbe dove serve davvero attenuare — il nome tecnico sulla card del
1319
+ * nodo. La gerarchia qui la fanno corpo e peso: etichetta 12px/600, suggerimento 11px/400.
1320
+ */
1190
1321
  .dpe-field__hint {
1191
- color: var(--dpe-text-subtle, #98a2b3);
1322
+ color: var(--dpe-text-muted, #6b7086);
1192
1323
  font-size: 11px;
1193
1324
  }
1194
1325
 
1195
- /* Un rilievo del backend sul campo: si mostra sotto, non in un tooltip. */
1326
+ /*
1327
+ * Un rilievo del backend sul campo: si mostra sotto, non in un tooltip — e con le varianti `-text`
1328
+ * degli stati, perche' qui il colore e' **lettere**. L'avviso con `--dpe-warning` misurava 3.64:1
1329
+ * sul fondo della dialog: e' il colore con cui arriva `DPE_EXPR_TYPE_WIDENED`, la diagnostica piu'
1330
+ * frequente dell'editor di formule.
1331
+ */
1196
1332
  .dpe-field__issue {
1197
- color: var(--dpe-error, #dc2626);
1333
+ color: var(--dpe-error-text, #c81e1e);
1198
1334
  font-size: 11px;
1199
1335
  line-height: 1.45;
1200
1336
  }
1201
1337
 
1202
1338
  .dpe-field__issue--warning {
1203
- color: var(--dpe-warning, #b7791f);
1339
+ color: var(--dpe-warning-text, #8f6115);
1204
1340
  }
1205
1341
 
1206
1342
  .dpe-field__issue--info {
1207
- color: var(--dpe-info, #3b6fd4);
1343
+ color: var(--dpe-info-text, #3161bd);
1208
1344
  }
1209
1345
 
1210
1346
  .dpe-form input[type='text'],
@@ -1230,7 +1366,18 @@ dpe-node-icon {
1230
1366
  outline-offset: 1px;
1231
1367
  }
1232
1368
 
1233
- .dpe-form input[aria-invalid='true'] {
1369
+ /*
1370
+ * Il bordo del rilievo vale per **tutti** i controlli, non per i soli `input`.
1371
+ *
1372
+ * Con la regola sul solo `input` l'utente impara «bordo rosso = qualcosa non va» e poi la tendina
1373
+ * che il backend segnala non ce l'ha: la diagnostica e' sotto il campo, ma il campo sembra sano.
1374
+ * Che questo cambi l'aspetto di ogni tendina diagnosticata non e' un effetto collaterale, e' la
1375
+ * correzione — dovevano gia' averlo tutte. Resta legato ad `aria-invalid`, che e' scritto solo
1376
+ * dove una diagnostica del backend nomina quel campo: nessuna regola locale decide il colore.
1377
+ */
1378
+ .dpe-form input[aria-invalid='true'],
1379
+ .dpe-form select[aria-invalid='true'],
1380
+ .dpe-form textarea[aria-invalid='true'] {
1234
1381
  border-color: var(--dpe-error, #dc2626);
1235
1382
  }
1236
1383
 
@@ -1318,7 +1465,7 @@ dpe-node-icon {
1318
1465
 
1319
1466
  .dpe-btn--danger:hover:not(:disabled) {
1320
1467
  border-color: var(--dpe-error, #dc2626);
1321
- color: var(--dpe-error, #dc2626);
1468
+ color: var(--dpe-error-text, #c81e1e);
1322
1469
  }
1323
1470
 
1324
1471
  .dpe-btn--icon {
@@ -1366,16 +1513,177 @@ dpe-node-icon {
1366
1513
  border-left-color: var(--dpe-error, #dc2626);
1367
1514
  }
1368
1515
 
1516
+ /*
1517
+ * **Informativo.** Un messaggio di stato vuoto e' l'**unico** contenuto della sua area: se non si
1518
+ * legge, al suo posto non c'e' un testo piu' debole, c'e' uno spazio bianco — e uno spazio bianco
1519
+ * non distingue «non c'e' niente» da «non e' ancora arrivato». Diversi di questi messaggi portano
1520
+ * anche la conseguenza («Nessun campo: la sorgente non produce colonne»), che non e' scritta
1521
+ * altrove.
1522
+ */
1369
1523
  .dpe-empty {
1370
- color: var(--dpe-text-subtle, #98a2b3);
1524
+ color: var(--dpe-text-subtle-strong, #666c80);
1371
1525
  font-size: 12px;
1372
1526
  font-style: italic;
1373
1527
  }
1374
1528
 
1375
- /* Dialetto citato nell'editor di espressioni: e' testo tecnico, quindi monospaziato. */
1376
- .dpe-expr__dialect {
1529
+ /*
1530
+ * Il **linguaggio di formule** nominato nell'etichetta del campo (ADR 0031/0036). Sostituisce
1531
+ * `.dpe-expr__dialect`, che nominava il dialetto: da quando le espressioni sono formule il
1532
+ * dialetto non c'entra piu' con cio' che si scrive li'.
1533
+ *
1534
+ * Non e' un avviso e non ne prende i colori: e' un'etichetta di contesto, quindi tono attenuato.
1535
+ * L'avviso rosso che stava sotto questo campo diceva «cio' che scrivi verra' eseguito», ed e'
1536
+ * sparito perche' non e' piu' vero.
1537
+ */
1538
+ .dpe-expr__language {
1539
+ margin-left: 6px;
1540
+ padding: 1px 6px;
1541
+ /* Scala dei raggi **unica**: niente pillola inventata qui, il gradino piu' piccolo e' questo. */
1542
+ border-radius: var(--dpe-radius-xs, 6px);
1543
+ background: var(--dpe-surface-alt, #f7f8fa);
1544
+ border: 1px solid var(--dpe-border, #e2e5eb);
1545
+ color: var(--dpe-text-muted, #6b7086);
1377
1546
  font-family: var(--dpe-font-mono, monospace);
1547
+ font-size: 10px;
1378
1548
  font-weight: 600;
1549
+ text-transform: none;
1550
+ letter-spacing: 0;
1551
+ }
1552
+
1553
+ /*
1554
+ * La **forma** pretesa dal campo (`DpeFormulaCatalogResult.requiredForm`), accanto al linguaggio.
1555
+ *
1556
+ * Deve leggersi come una cosa **diversa** dalla pastiglia del linguaggio, che le sta a fianco: due
1557
+ * pastiglie identiche una accanto all'altra si leggono come un'unica etichetta spezzata. Stessa
1558
+ * scala di raggi e stesso corpo — la morbidezza e' unica in tutta la libreria — ma tinta d'accento
1559
+ * invece che di superficie.
1560
+ *
1561
+ * Il testo prende `--dpe-accent-strong` e non `--dpe-accent`: qui il colore e' **lettere**, ed e' la
1562
+ * stessa divisione di mestiere che LV1 ha introdotto per gli stati. Non si apre un token nuovo
1563
+ * perche' quello giusto esiste gia': in tema chiaro e' la versione scurita dell'accento (6.9:1 su
1564
+ * bianco, ~6.3:1 sul fondo tinto al 10%), in tema scuro la versione schiarita — cioe' in entrambi
1565
+ * i temi punta dalla parte leggibile senza che questa regola debba saperlo.
1566
+ */
1567
+ .dpe-expr__form {
1568
+ margin-left: 6px;
1569
+ padding: 1px 6px;
1570
+ border-radius: var(--dpe-radius-xs, 6px);
1571
+ background: color-mix(in srgb, var(--dpe-accent, #2f7d8f) 10%, var(--dpe-surface, #fff));
1572
+ border: 1px solid color-mix(in srgb, var(--dpe-accent, #2f7d8f) 35%, var(--dpe-surface, #fff));
1573
+ color: var(--dpe-accent-strong, #226270);
1574
+ font-size: 10px;
1575
+ font-weight: 600;
1576
+ text-transform: none;
1577
+ letter-spacing: 0;
1578
+ }
1579
+
1580
+ /*
1581
+ * La stessa pastiglia **mentre una validazione e' in volo** (ADR 0042). La forma arriva da
1582
+ * `validate`, quindi fra il gesto che la cambia e la risposta c'e' una finestra — misurata a
1583
+ * 2,58 s dentro la pagina — in cui questa pastiglia mostra la forma **precedente** con la faccia
1584
+ * di un fatto. Qui non si afferma piu'.
1585
+ *
1586
+ * Come si ottiene «non asserito» senza togliere leggibilita': si **sottrae la tinta d'accento** —
1587
+ * che e' cio' che la faceva leggere come corrente — e si mette il bordo **tratteggiato**, che e'
1588
+ * l'idioma della cosa provvisoria. Non si abbassa l'opacita': un'etichetta che spiega un campo
1589
+ * bloccato deve restare leggibile per intero, e l'opacita' avrebbe portato il testo sotto la
1590
+ * soglia del contrasto proprio dove serve.
1591
+ *
1592
+ * Nessun token nuovo, e non per parsimonia: la coppia giusta esiste gia' ed e' quella che LV2 ha
1593
+ * fissato per il **testo attenuato che porta informazione** — `--dpe-text-subtle-strong` su
1594
+ * `--dpe-surface-alt`, misurata 4.91:1 in chiaro e 5.37:1 in scuro. Un token nuovo per questo
1595
+ * stato sarebbe una seconda dichiarazione della stessa decisione.
1596
+ *
1597
+ * La specificita' e' la stessa della regola qui sopra (0,1,0 contro 0,1,0) e questa viene **dopo**:
1598
+ * e' l'unico caso del foglio in cui l'ordine e' il presidio giusto, perche' i due selettori sono
1599
+ * lo stesso stato in due momenti — il modificatore non contende con una regola generale, la
1600
+ * specializza.
1601
+ */
1602
+ .dpe-expr__form--updating {
1603
+ background: var(--dpe-surface-alt, #f7f8fa);
1604
+ border: 1px dashed var(--dpe-border-strong, #cfd4de);
1605
+ color: var(--dpe-text-subtle-strong, #666c80);
1606
+ }
1607
+
1608
+ /* Il marcatore dentro la pastiglia: non e' un'altra pastiglia — due accostate si leggono come
1609
+ un'unica etichetta spezzata — quindi non ha fondo ne' bordo, solo il corsivo del provvisorio. */
1610
+ .dpe-expr__form-note {
1611
+ font-style: italic;
1612
+ font-weight: 500;
1613
+ }
1614
+
1615
+ /*
1616
+ * Il campo formula **bloccato**: la forma che questo nodo pretende non e' fra quelle che il
1617
+ * compilatore registrato sa produrre (`DpeEnvironment.supportedForms` incrociato con
1618
+ * `requiredForm`).
1619
+ *
1620
+ * Il selettore dichiara la specificita' che gli serve — `.dpe-form .dpe-expr__input--blocked` e'
1621
+ * (0,2,0) contro (0,1,1) di `.dpe-form textarea` — invece di sperare nell'ordine: una classe sola
1622
+ * perderebbe fondo e colore contro la regola generale del controllo, che e' il modo tipico in cui
1623
+ * uno stato «si vede in ispezione e non a schermo».
1624
+ *
1625
+ * Il colore e' `--dpe-text-subtle-strong` e non `--dpe-text-muted`: qui dentro c'e' una formula
1626
+ * **scritta dall'utente**, cioe' testo che deve restare leggibile per essere portato altrove, e
1627
+ * per la divisione di LV2 il testo attenuato che porta informazione prende il token informativo.
1628
+ * Misurato: 4.91:1 in chiaro e 5.37:1 in scuro sulla superficie attenuata, contro 4.61:1 e 5.12:1
1629
+ * dell'altro — ed e' in elenco nel test di contrasto, perche' il colore non si giudica a occhio.
1630
+ *
1631
+ * Il controllo e' `readonly`, non `disabled`: `disabled` lo toglierebbe dalla tabulazione e ne
1632
+ * renderebbe il testo non selezionabile, cioe' toglierebbe la formula proprio a chi deve
1633
+ * riscriverla altrove. Per questo il fondo lo dichiara questa regola e non `:disabled`.
1634
+ */
1635
+ .dpe-form .dpe-expr__input--blocked {
1636
+ background: var(--dpe-surface-alt, #f7f8fa);
1637
+ color: var(--dpe-text-subtle-strong, #666c80);
1638
+ cursor: not-allowed;
1639
+ }
1640
+
1641
+ /* Il motivo, attaccato al campo che spiega: e' l'unica cosa che l'utente puo' leggere per capire
1642
+ perche' non si scrive. Stessa scala di spaziatura dei rilievi qui sopra. */
1643
+ .dpe-expr__blocked {
1644
+ margin-top: 4px;
1645
+ }
1646
+
1647
+ /*
1648
+ * La riga in testa del blocco «il catalogo non e' stato prodotto»: e' l'unica che l'utente deve
1649
+ * leggere per forza, quindi prende il colore pieno del testo invece dell'attenuato del blocco.
1650
+ */
1651
+ .dpe-expr__catalog-lead {
1652
+ margin: 0;
1653
+ color: var(--dpe-text, #1a1c23);
1654
+ font-weight: 600;
1655
+ }
1656
+
1657
+ /*
1658
+ * Le strutturali che spiegano la causa, chiuse per difetto. Il sacco riguarda **tutta** la
1659
+ * definizione e puo' contenere voci che con questo nodo non c'entrano: non si filtrano per
1660
+ * pertinenza — l'errore che spiega lo schema puo' stare a piu' salti di distanza — quindi si
1661
+ * dichiarano come dettaglio. Aperte per difetto sarebbero il muro indistinguibile che la riga in
1662
+ * testa esiste per evitare.
1663
+ */
1664
+ .dpe-expr__catalog-details {
1665
+ margin-top: 4px;
1666
+ font-size: 11px;
1667
+ }
1668
+
1669
+ .dpe-expr__catalog-details summary {
1670
+ cursor: pointer;
1671
+ color: var(--dpe-text-muted, #6b7086);
1672
+ }
1673
+
1674
+ /*
1675
+ * Cosa il linguaggio offre in questo nodo: un conteggio dentro il suggerimento, non un elenco.
1676
+ *
1677
+ * Colore **proprio** e non quello ereditato dal suggerimento: `--dpe-text-subtle` sul fondo del
1678
+ * pannello stava a 2.6:1 in tema chiaro, sotto il minimo WCAG, e questo e' testo che si legge per
1679
+ * capire se il catalogo e' arrivato. Il rilievo su `.dpe-field__hint` accanto, riportato allora
1680
+ * all'architetto, e' stato chiuso dopo: adesso il suggerimento porta lo stesso token e i due non
1681
+ * si contraddicono piu'. La dichiarazione resta esplicita invece di ereditare, cosi' il conteggio
1682
+ * si legge anche se un giorno finisce fuori da un suggerimento.
1683
+ */
1684
+ .dpe-expr__catalog {
1685
+ color: var(--dpe-text-muted, #6b7086);
1686
+ font-style: italic;
1379
1687
  }
1380
1688
 
1381
1689
  /* ================================================= ispettore e fatti del nodo */
@@ -1652,7 +1960,7 @@ dpe-node-facts .dpe-badge {
1652
1960
 
1653
1961
  dpe-node-facts .dpe-badge--not-compilable {
1654
1962
  border-color: var(--dpe-not-compilable, #7c5cd6);
1655
- color: var(--dpe-not-compilable, #7c5cd6);
1963
+ color: var(--dpe-not-compilable-text, #6f4fc4);
1656
1964
  }
1657
1965
 
1658
1966
  /*
@@ -1769,7 +2077,7 @@ dpe-node-facts .dpe-badge--not-compilable {
1769
2077
 
1770
2078
  .dpe-dialog__btn--danger:hover {
1771
2079
  border-color: var(--dpe-error, #dc2626);
1772
- color: var(--dpe-error, #dc2626);
2080
+ color: var(--dpe-error-text, #c81e1e);
1773
2081
  }
1774
2082
 
1775
2083
  /* ============================================================ diagnostiche */
@@ -1850,8 +2158,14 @@ dpe-diagnostics-panel {
1850
2158
  flex: 1 1 auto;
1851
2159
  }
1852
2160
 
2161
+ /*
2162
+ * **Informativo**, ed e' il caso che decide la regola. E' l'unica resa testuale del percorso
2163
+ * diagnostico, cioe' esattamente l'aiuto per cui questo pannello esiste: un pannello in cui il
2164
+ * «dove» e' il pezzo meno leggibile e' un difetto di scopo, non di stile. Con il token decorativo
2165
+ * misurava 2.39:1 sulla riga «non compilabile», che e' anche il fondo peggiore delle tre.
2166
+ */
1853
2167
  .dpe-diag__where {
1854
- color: var(--dpe-text-subtle, #98a2b3);
2168
+ color: var(--dpe-text-subtle-strong, #666c80);
1855
2169
  font-size: 10px;
1856
2170
  }
1857
2171
 
@@ -1864,17 +2178,25 @@ dpe-diagnostics-panel {
1864
2178
  text-transform: uppercase;
1865
2179
  }
1866
2180
 
2181
+ /*
2182
+ * Le due etichette della riga: 9px maiuscoletto, con il bordo che prende il colore dal testo
2183
+ * (`currentcolor`). Quindi qui la variante `-text` colora **entrambi**, ed e' voluto: a 9px il
2184
+ * testo e' il vincolo piu' stretto dei due, e la riga «non compilabile» ha pure un fondo tinto che
2185
+ * portava il viola pieno a 4.47:1.
2186
+ */
1867
2187
  .dpe-diag__tag--not-compilable {
1868
- color: var(--dpe-not-compilable, #7c5cd6);
2188
+ color: var(--dpe-not-compilable-text, #6f4fc4);
1869
2189
  }
1870
2190
 
1871
2191
  .dpe-diag__tag--dialect {
1872
- color: var(--dpe-info, #3b6fd4);
2192
+ color: var(--dpe-info-text, #3161bd);
1873
2193
  }
1874
2194
 
2195
+ /* **Informativo**: e' la riga che distingue «nessun rilievo» da «non ancora validata», e sono due
2196
+ stati che portano a due decisioni opposte. Vedi `.dpe-empty`. */
1875
2197
  .dpe-diag__empty {
1876
2198
  padding: 10px;
1877
- color: var(--dpe-text-subtle, #98a2b3);
2199
+ color: var(--dpe-text-subtle-strong, #666c80);
1878
2200
  font-size: 11px;
1879
2201
  font-style: italic;
1880
2202
  }
@@ -1910,6 +2232,8 @@ dpe-schema-panel {
1910
2232
  color: var(--dpe-accent, #2f7d8f);
1911
2233
  }
1912
2234
 
2235
+ /* **Decorativa**: la riga e' identificata da `.dpe-schema__name`, e la categoria del nodo si legge
2236
+ sulla card del canvas e nella testata della dialog. Qui e' un promemoria, non la fonte. */
1913
2237
  .dpe-schema__category {
1914
2238
  color: var(--dpe-text-subtle, #98a2b3);
1915
2239
  font-size: 10px;
@@ -1951,7 +2275,7 @@ dpe-schema-panel {
1951
2275
 
1952
2276
  .dpe-col--dropped {
1953
2277
  border-color: var(--dpe-warning, #b7791f);
1954
- color: var(--dpe-warning, #b7791f);
2278
+ color: var(--dpe-warning-text, #8f6115);
1955
2279
  text-decoration: line-through;
1956
2280
  }
1957
2281
 
@@ -1959,13 +2283,15 @@ dpe-schema-panel {
1959
2283
  padding: 0 6px;
1960
2284
  border: 1px solid var(--dpe-not-compilable, #7c5cd6);
1961
2285
  border-radius: 999px;
1962
- color: var(--dpe-not-compilable, #7c5cd6);
2286
+ color: var(--dpe-not-compilable-text, #6f4fc4);
1963
2287
  font-size: 9px;
1964
2288
  text-transform: uppercase;
1965
2289
  }
1966
2290
 
2291
+ /* **Informativo**: «in attesa della propagazione» e «nessuno schema propagato» sono l'unico modo di
2292
+ sapere se lo schema sta arrivando o non arrivera'. Vedi `.dpe-empty`. */
1967
2293
  .dpe-schema__empty {
1968
- color: var(--dpe-text-subtle, #98a2b3);
2294
+ color: var(--dpe-text-subtle-strong, #666c80);
1969
2295
  font-size: 11px;
1970
2296
  font-style: italic;
1971
2297
  }
@@ -2047,8 +2373,11 @@ dpe-sql-preview td {
2047
2373
  text-align: left;
2048
2374
  }
2049
2375
 
2376
+ /* **Informativo**, e qui il testo porta **I10**: «nessuna istruzione prodotta» e «nessuna anteprima
2377
+ richiesta» sono situazioni diverse, e il pannello dell'SQL non ha altro da mostrare quando una
2378
+ delle due vale. Vedi `.dpe-empty`. */
2050
2379
  .dpe-sql__empty {
2051
- color: var(--dpe-text-subtle, #98a2b3);
2380
+ color: var(--dpe-text-subtle-strong, #666c80);
2052
2381
  font-size: 11px;
2053
2382
  font-style: italic;
2054
2383
  }
@@ -2137,6 +2466,9 @@ dpe-catalog {
2137
2466
  color: var(--dpe-accent-strong);
2138
2467
  }
2139
2468
 
2469
+ /* **Decorativo** per la ragione piu' forte delle altre: un controllo disattivato e' escluso dal
2470
+ requisito di contrasto (WCAG 1.4.3), e attenuarlo e' *come* si dice che e' disattivato. Il motivo
2471
+ per cui lo e' sta nel `title` e in pagina, non nelle lettere del bottone. */
2140
2472
  .dpe-cat__btn:disabled {
2141
2473
  color: var(--dpe-text-subtle);
2142
2474
  cursor: not-allowed;
@@ -2151,7 +2483,7 @@ dpe-catalog {
2151
2483
 
2152
2484
  .dpe-cat__btn--danger:not(:disabled) {
2153
2485
  border-color: var(--dpe-error);
2154
- color: var(--dpe-error);
2486
+ color: var(--dpe-error-text);
2155
2487
  }
2156
2488
 
2157
2489
  .dpe-cat__btn:focus-visible,
@@ -2170,7 +2502,12 @@ dpe-catalog {
2170
2502
  padding: 7px 14px;
2171
2503
  border-bottom: 1px solid var(--dpe-border);
2172
2504
  background: color-mix(in srgb, var(--dpe-error) 10%, var(--dpe-surface));
2173
- color: var(--dpe-error);
2505
+ /*
2506
+ * Fondo tinto del proprio stesso colore: il rosso pieno ci misurava 4.13:1, meno che sul bianco.
2507
+ * Un banner d'errore e' il posto in cui il testo conta di piu' e quello in cui il fondo aiuta di
2508
+ * meno.
2509
+ */
2510
+ color: var(--dpe-error-text);
2174
2511
  font-size: 11px;
2175
2512
  }
2176
2513
 
@@ -2246,6 +2583,7 @@ dpe-catalog {
2246
2583
  font-size: 10px;
2247
2584
  }
2248
2585
 
2586
+ /* **Decorativo**: separatore «·» fra i fatti del sommario, come sulla card del nodo. */
2249
2587
  .dpe-cat__dot {
2250
2588
  color: var(--dpe-text-subtle);
2251
2589
  }
@@ -2262,7 +2600,7 @@ dpe-catalog {
2262
2600
  .dpe-cat__flag--errors {
2263
2601
  border-color: var(--dpe-error);
2264
2602
  background: color-mix(in srgb, var(--dpe-error) 8%, transparent);
2265
- color: var(--dpe-error);
2603
+ color: var(--dpe-error-text);
2266
2604
  }
2267
2605
 
2268
2606
  .dpe-cat__actions,
@@ -2320,6 +2658,7 @@ dpe-catalog {
2320
2658
  font-size: 12px;
2321
2659
  }
2322
2660
 
2661
+ /* **Decorativo**: come il bottone disattivato qui sopra, e' un controllo inattivo. */
2323
2662
  .dpe-cat__input:disabled {
2324
2663
  background: var(--dpe-surface-sunken);
2325
2664
  color: var(--dpe-text-subtle);