@esfaenza/flow-builder 20.3.23 → 20.3.25

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/index.d.ts CHANGED
@@ -152,17 +152,34 @@ interface FlowChoice {
152
152
  choiceText?: string;
153
153
  value?: FlowValue;
154
154
  }
155
+ /**
156
+ * §5.2 — le opzioni generate. Le sorgenti sono **tre e si escludono a vicenda**: una collection
157
+ * già nel flow, una query su un'entita', i valori di un tipo di enumerazione. Dichiararne due
158
+ * insieme non blocca l'attivazione ma e' `CHOICE_SET_SOURCE_AMBIGUOUS`, e quale il runtime usi
159
+ * non e' una cosa da lasciare decidere al caso: `core/enum-choice-set.util.ts` le riconosce.
160
+ */
155
161
  interface FlowDynamicChoiceSet {
156
162
  name?: string;
157
163
  description?: string;
158
164
  dataType?: FlowDataType;
165
+ /** Sorgente: una collection del flow, tipicamente il risultato di un Get Records. */
166
+ collectionReference?: string;
167
+ /** Sorgente: l'entita' da interrogare. */
159
168
  object?: string;
169
+ /**
170
+ * Sorgente: il tipo di enumerazione, lo stesso nome che una risorsa `Enum` scrive in
171
+ * `objectType`. I campi citabili non sono campi di un'entita' ma le tre proprieta' di un
172
+ * valore di enum — `Name`, `Label`, `NumericValue` — e le porta `enumChoiceSetFields` (§7.1).
173
+ */
174
+ enumType?: string;
175
+ /** Assente: l'etichetta e' `Label` su un enum, e va dichiarato altrove. */
160
176
  displayField?: string;
177
+ /** Assente: il valore memorizzato e' `Name` su un enum, e va dichiarato altrove. */
161
178
  valueField?: string;
162
179
  sortField?: string;
163
180
  sortOrder?: FlowSortOrder;
164
181
  limit?: number;
165
- /** Sempre in AND: nessun `filterLogic` qui (§4.4). */
182
+ /** Sempre in AND: nessun `filterLogic` qui (§4.4). Su un enum sono valutati in memoria. */
166
183
  filters?: FlowRecordFilter[];
167
184
  }
168
185
  interface FlowStage {
@@ -837,6 +854,12 @@ interface FlowDictionaries {
837
854
  regionContainerTypes?: FlowDictionaryEntry[];
838
855
  /** §5.2 — `UseStoredValues` | `ResetValues` (`inputsOnNextNavToAssocScrn`). */
839
856
  screenFieldInputsRevisited?: FlowDictionaryEntry[];
857
+ /**
858
+ * §5.2 — le proprieta' citabili di un valore di enum in un dynamic choice set con `enumType`:
859
+ * `Name`, `Label`, `NumericValue`. Non sono campi di un'entita', quindi l'elenco arriva da qui
860
+ * e non da `GET /catalog/objects/{name}/fields`.
861
+ */
862
+ enumChoiceSetFields?: FlowDictionaryEntry[];
840
863
  }
841
864
  interface FlowObjectSummary {
842
865
  name: string;
@@ -2171,6 +2194,48 @@ declare function moveField(screen: FlowDynamicScreen, from: FlowScreenFieldPath,
2171
2194
  /** Duplica un campo accanto all'originale, rinominandolo: i nomi restano unici (§3.3). */
2172
2195
  declare function duplicateField(screen: FlowDynamicScreen, path: FlowScreenFieldPath, newName: string): FlowScreenFieldPath | undefined;
2173
2196
 
2197
+ /**
2198
+ * I dynamic choice set — FRONTEND.md §5.2.
2199
+ *
2200
+ * Due cose che il resto del codice non deve indovinare.
2201
+ *
2202
+ * La prima: le sorgenti sono **tre e si escludono a vicenda** (`collectionReference`, `object`,
2203
+ * `enumType`). Dichiararne due insieme non blocca l'attivazione ma e' `CHOICE_SET_SOURCE_AMBIGUOUS`:
2204
+ * l'editor deve saperlo dire, e per dirlo serve un solo posto che sappia quali campi sono una
2205
+ * sorgente — aggiungerne una quarta domani e' una riga qui, non una condizione in tre template.
2206
+ *
2207
+ * La seconda: su un choice set da enum i **campi citabili non sono campi di un'entita'**. Non c'e'
2208
+ * nessuna entita' da interrogare: sono le tre proprieta' di un valore di enum, e valgono per
2209
+ * `displayField`, `valueField`, `sortField` e per il campo di un filtro. Le etichette da mostrare
2210
+ * arrivano dal dizionario (`enumChoiceSetFields`, §7.1); il **tipo** di ciascuna no, e senza il tipo
2211
+ * l'editor del valore di un filtro proporrebbe una casella di testo dove il contratto scrive un
2212
+ * numero (`NumericValue`, §5.2). Per questo la mappa sta qui e non nel dizionario.
2213
+ */
2214
+
2215
+ /** La sorgente delle opzioni, o `null` se non ne e' dichiarata nessuna. */
2216
+ type ChoiceSetSource = 'collection' | 'object' | 'enum';
2217
+ /** Le sorgenti **dichiarate**: piu' di una e' `CHOICE_SET_SOURCE_AMBIGUOUS`. */
2218
+ declare function declaredChoiceSetSources(set: FlowDynamicChoiceSet): ChoiceSetSource[];
2219
+ /** La prima sorgente dichiarata, che e' anche quella su cui il form si apre. */
2220
+ declare function choiceSetSourceOf(set: FlowDynamicChoiceSet): ChoiceSetSource | null;
2221
+ /** I campi da cancellare passando a `source`: due sorgenti insieme sono un avviso. */
2222
+ declare function otherSourceFieldsOf(source: ChoiceSetSource): (keyof FlowDynamicChoiceSet)[];
2223
+ /**
2224
+ * §5.2 — le proprieta' di un valore di enum, col tipo con cui si confrontano in un filtro.
2225
+ * Qualunque altro nome e' `FIELD_UNKNOWN`.
2226
+ */
2227
+ declare const ENUM_CHOICE_SET_FIELDS: {
2228
+ readonly name: string;
2229
+ readonly label: string;
2230
+ readonly dataType: FlowDataType;
2231
+ }[];
2232
+ /** Senza `displayField` l'etichetta e' `Label`, senza `valueField` il valore memorizzato e' `Name`. */
2233
+ declare const ENUM_CHOICE_SET_DEFAULT_DISPLAY_FIELD = "Label";
2234
+ declare const ENUM_CHOICE_SET_DEFAULT_VALUE_FIELD = "Name";
2235
+ declare function enumChoiceSetFieldType(name: string | undefined | null): FlowDataType | undefined;
2236
+ /** Il nome non e' una delle tre proprieta': vuoto non si accusa, e' semplicemente il default. */
2237
+ declare function isUnknownEnumChoiceSetField(name: string | undefined | null): boolean;
2238
+
2174
2239
  /**
2175
2240
  * La gravita' di un rilievo, ridotta a tre secchi — FRONTEND.md §7.
2176
2241
  *
@@ -2247,6 +2312,12 @@ declare class FlowDictionaryStore {
2247
2312
  readonly conditionLogicModes: _angular_core.Signal<FlowDictionaryEntry[]>;
2248
2313
  readonly regionContainerTypes: _angular_core.Signal<FlowDictionaryEntry[]>;
2249
2314
  readonly screenFieldInputsRevisited: _angular_core.Signal<FlowDictionaryEntry[]>;
2315
+ /**
2316
+ * §5.2 — le proprieta' citabili in un choice set da enum. Elenco vuoto: il dizionario non le
2317
+ * dichiara, e il form ripiega sui tre nomi del contratto invece di lasciare la tendina vuota —
2318
+ * qui il contratto li nomina uno per uno, quindi non e' cablare un dizionario aperto.
2319
+ */
2320
+ readonly enumChoiceSetFields: _angular_core.Signal<FlowDictionaryEntry[]>;
2250
2321
  /** §5.2 — i tipi di campo di uno screen dinamico, con i flag che guidano il form. */
2251
2322
  readonly screenFieldTypes: _angular_core.Signal<FlowScreenFieldTypeEntry[]>;
2252
2323
  /**
@@ -2465,6 +2536,18 @@ interface PathContainer {
2465
2536
  /** Nome dell'entita' o della classe. */
2466
2537
  name: string;
2467
2538
  }
2539
+ /**
2540
+ * Dove chiedere i valori ammessi di un campo a scelta chiusa (§6.4):
2541
+ * `GET /schema/{object}/fields/{field}/values`.
2542
+ *
2543
+ * Sono i valori del **campo**, non di un tipo: `Ordine.Stato` e `Attivita.Stato` sono due insiemi
2544
+ * diversi anche a parita' di `dataType`, e per questo serve la coppia e non il solo nome. È
2545
+ * l'altra meta' della §4.6 — lì l'insieme e' del tipo di enumerazione, qui della colonna.
2546
+ */
2547
+ interface PathValueSet {
2548
+ object: string;
2549
+ field: string;
2550
+ }
2468
2551
  /**
2469
2552
  * Un segmento proponibile in una tappa — campo o membro ridotti al minimo comune, perche' chi
2470
2553
  * naviga non deve sapere quale dei due sta guardando.
@@ -2480,6 +2563,12 @@ interface PathEntry {
2480
2563
  isWritable: boolean;
2481
2564
  /** Dove il percorso continua dopo questo segmento; assente = qui finisce cio' che si sa. */
2482
2565
  next?: PathContainer;
2566
+ /**
2567
+ * Presente solo sui campi che dichiarano `hasClosedValueSet`: dice dove chiedere i valori
2568
+ * ammessi, così un insieme chiuso non finisce in una casella di testo libero. Un membro di
2569
+ * classe non lo ha — lì l'insieme chiuso e' un `Enum` col suo tipo (§4.6, §4.7.1).
2570
+ */
2571
+ valueSet?: PathValueSet;
2483
2572
  }
2484
2573
  /**
2485
2574
  * Esito della descrizione di una tappa. Sono quattro come per le classi (§4.7.1) e vanno tenuti
@@ -3920,7 +4009,7 @@ declare class NamePickerComponent {
3920
4009
  * **errori** che bloccano l'attivazione (`ACTION_UNKNOWN`, `FORM_UNKNOWN`), mentre un flow
3921
4010
  * senza versione attiva e' un avviso. Mostrarli con lo stesso colore direbbe il falso.
3922
4011
  */
3923
- readonly unknownSeverity: _angular_core.InputSignal<"error" | "warn">;
4012
+ readonly unknownSeverity: _angular_core.InputSignal<"warn" | "error">;
3924
4013
  /**
3925
4014
  * Nomi che **esistono** ma non sono utilizzabili qui. Il caso vero e' il catalogo dei form,
3926
4015
  * dove una schermata intera e un componente vivono nello stesso elenco e si distinguono per
@@ -4081,6 +4170,27 @@ declare class EnumValuePickerComponent {
4081
4170
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EnumValuePickerComponent, "fb-enum-value-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "enumType": { "alias": "enumType"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
4082
4171
  }
4083
4172
 
4173
+ declare class FieldValuePickerComponent {
4174
+ private readonly catalog;
4175
+ readonly value: _angular_core.InputSignal<string | undefined>;
4176
+ /** Entita' e campo di cui chiedere i valori: la coppia, non il solo nome del campo. */
4177
+ readonly valueSet: _angular_core.InputSignal<PathValueSet | undefined>;
4178
+ readonly label: _angular_core.InputSignal<string>;
4179
+ readonly placeholder: _angular_core.InputSignal<string>;
4180
+ readonly disabled: _angular_core.InputSignal<boolean>;
4181
+ readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
4182
+ private readonly values;
4183
+ /** Cresce a ogni caricamento: scarta la risposta di un campo che non e' piu' quello scelto. */
4184
+ private sequence;
4185
+ constructor();
4186
+ readonly options: _angular_core.Signal<NamePickerOption[]>;
4187
+ private readonly fieldLabel;
4188
+ readonly emptyMessage: _angular_core.Signal<string>;
4189
+ readonly unknownMessage: _angular_core.Signal<string>;
4190
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FieldValuePickerComponent, never>;
4191
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FieldValuePickerComponent, "fb-field-value-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "valueSet": { "alias": "valueSet"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
4192
+ }
4193
+
4084
4194
  declare class FormulaEditorComponent {
4085
4195
  private readonly store;
4086
4196
  private readonly api;
@@ -4199,6 +4309,12 @@ declare class ValueEditorComponent {
4199
4309
  readonly dataType: _angular_core.InputSignal<string | undefined>;
4200
4310
  readonly objectType: _angular_core.InputSignal<string | undefined>;
4201
4311
  readonly isCollection: _angular_core.InputSignal<boolean | undefined>;
4312
+ /**
4313
+ * L'insieme chiuso della destinazione, quando e' un campo dello schema che lo dichiara: senza,
4314
+ * un valore fra quattro possibili si digita a memoria (§4.4, §6.4). Lo passa chi conosce entita'
4315
+ * e campo — i filtri, le assegnazioni di campo — perche' qui il tipo non basta a dedurlo.
4316
+ */
4317
+ readonly valueSet: _angular_core.InputSignal<PathValueSet | undefined>;
4202
4318
  readonly disabled: _angular_core.InputSignal<boolean>;
4203
4319
  /** Nasconde la modalita' formula dove il modello non la prevede. */
4204
4320
  readonly allowFormula: _angular_core.InputSignal<boolean>;
@@ -4223,6 +4339,11 @@ declare class ValueEditorComponent {
4223
4339
  * non lo avra': un'istanza nasce dal runtime e nel metadata si cita per riferimento (§4.7).
4224
4340
  */
4225
4341
  readonly literalAllowed: _angular_core.Signal<boolean>;
4342
+ /**
4343
+ * L'insieme chiuso c'e' e si puo' chiedere. `Enum` resta fuori di proposito: lì i valori sono del
4344
+ * **tipo** e li propone `fb-enum-value-picker` (§4.6), e `Boolean` ha già la sua casella.
4345
+ */
4346
+ readonly hasValueSet: _angular_core.Signal<boolean>;
4226
4347
  /** §4.7 — la destinazione e' un'istanza di classe: si passa per riferimento e basta. */
4227
4348
  readonly isStructureTarget: _angular_core.Signal<boolean>;
4228
4349
  readonly literalInputType: _angular_core.Signal<string>;
@@ -4238,6 +4359,12 @@ declare class ValueEditorComponent {
4238
4359
  setMode(mode: ValueMode): void;
4239
4360
  onReferenceChange(reference: string | undefined): void;
4240
4361
  onLiteralChange(raw: string): void;
4362
+ /**
4363
+ * Un valore scelto da un insieme chiuso non e' un tipo a parte: finisce nello stesso campo del
4364
+ * letterale, quindi passa dalla stessa conversione (interi in cultura invariante compresi).
4365
+ * Svuotare il picker toglie il valore invece di scrivere una stringa vuota.
4366
+ */
4367
+ onClosedValueChange(raw: string | undefined): void;
4241
4368
  /**
4242
4369
  * §4.2 — l'`enumValue` e' il **nome** del valore. Svuotare il picker toglie il valore invece di
4243
4370
  * scrivere una stringa vuota: un `enumValue: ''` sarebbe un campo valorizzato con niente.
@@ -4259,7 +4386,7 @@ declare class ValueEditorComponent {
4259
4386
  private emit;
4260
4387
  readonly dataTypeOptions: _angular_core.Signal<_esfaenza_flow_builder.FlowDataTypeEntry[]>;
4261
4388
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ValueEditorComponent, never>;
4262
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ValueEditorComponent, "fb-value-editor", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "dataType": { "alias": "dataType"; "required": false; "isSignal": true; }; "objectType": { "alias": "objectType"; "required": false; "isSignal": true; }; "isCollection": { "alias": "isCollection"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "allowFormula": { "alias": "allowFormula"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
4389
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ValueEditorComponent, "fb-value-editor", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "dataType": { "alias": "dataType"; "required": false; "isSignal": true; }; "objectType": { "alias": "objectType"; "required": false; "isSignal": true; }; "isCollection": { "alias": "isCollection"; "required": false; "isSignal": true; }; "valueSet": { "alias": "valueSet"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "allowFormula": { "alias": "allowFormula"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
4263
4390
  }
4264
4391
 
4265
4392
  declare class ConditionEditorComponent {
@@ -4315,7 +4442,7 @@ declare class ConditionEditorComponent {
4315
4442
  */
4316
4443
  hasTypeMismatch(condition: FlowCondition): boolean;
4317
4444
  typeMismatchMessage(condition: FlowCondition): string;
4318
- readonly logicMode: _angular_core.Signal<"and" | "or" | "formula" | "custom">;
4445
+ readonly logicMode: _angular_core.Signal<"formula" | "and" | "or" | "custom">;
4319
4446
  readonly customLogic: _angular_core.Signal<string>;
4320
4447
  /** Feedback immediato sull'espressione: la verita' resta della validazione backend. */
4321
4448
  readonly customLogicError: _angular_core.Signal<string | null>;
@@ -4359,6 +4486,15 @@ declare class ConditionEditorComponent {
4359
4486
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConditionEditorComponent, "fb-condition-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "allowFormula": { "alias": "allowFormula"; "required": false; "isSignal": true; }; "allowLogic": { "alias": "allowLogic"; "required": false; "isSignal": true; }; "issuePath": { "alias": "issuePath"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
4360
4487
  }
4361
4488
 
4489
+ /**
4490
+ * Un campo filtrabile che **non** viene da un catalogo di campi: nome, etichetta e tipo con cui
4491
+ * confrontarlo. Oggi lo usano i choice set da enum (§5.2).
4492
+ */
4493
+ interface FilterFieldOption {
4494
+ value: string;
4495
+ label: string;
4496
+ dataType?: FlowDataType;
4497
+ }
4362
4498
  /** Il contenitore dei filtri, qualunque elemento sia. */
4363
4499
  interface FilterHolder {
4364
4500
  filters?: FlowRecordFilter[];
@@ -4373,6 +4509,11 @@ declare class RecordFilterEditorComponent {
4373
4509
  readonly title: _angular_core.InputSignal<string>;
4374
4510
  /** L'uso con cui chiedere i campi: `filterable` per i filtri, `updateable` altrove. */
4375
4511
  readonly usage: _angular_core.InputSignal<FlowFieldUsage>;
4512
+ /**
4513
+ * Elenco chiuso di campi, al posto del catalogo dell'entita'. Valorizzato, `object` non serve:
4514
+ * non c'e' nessuna entita' da interrogare (§5.2, choice set da `enumType`).
4515
+ */
4516
+ readonly fieldOptions: _angular_core.InputSignal<FilterFieldOption[]>;
4376
4517
  /** `false` dove il modello non ha `filterLogic`: i filtri sono sempre in AND (§4.4). */
4377
4518
  readonly supportsLogic: _angular_core.InputSignal<boolean>;
4378
4519
  /** `true` dove esiste `filterFormula` come alternativa ai filtri. */
@@ -4383,7 +4524,7 @@ declare class RecordFilterEditorComponent {
4383
4524
  * (§5.8, §13.10).
4384
4525
  */
4385
4526
  readonly emptyWarning: _angular_core.InputSignal<string | null>;
4386
- readonly emptyWarningSeverity: _angular_core.InputSignal<"error" | "warn">;
4527
+ readonly emptyWarningSeverity: _angular_core.InputSignal<"warn" | "error">;
4387
4528
  readonly changed: _angular_core.OutputEmitterRef<(holder: FilterHolder) => void>;
4388
4529
  /** Tutti i campi, filtrabili o no: serve solo a riconoscere le chiavi composte (§5.8). */
4389
4530
  private readonly allFields;
@@ -4406,7 +4547,7 @@ declare class RecordFilterEditorComponent {
4406
4547
  * evita la ricerca di un campo che nell'elenco non c'e' e non ci sara'.
4407
4548
  */
4408
4549
  readonly identifierNotFilterable: _angular_core.Signal<boolean>;
4409
- readonly logicMode: _angular_core.Signal<"and" | "or" | "formula" | "custom">;
4550
+ readonly logicMode: _angular_core.Signal<"formula" | "and" | "or" | "custom">;
4410
4551
  readonly customLogic: _angular_core.Signal<string>;
4411
4552
  readonly showEmptyWarning: _angular_core.Signal<boolean>;
4412
4553
  addFilter(): void;
@@ -4425,13 +4566,24 @@ declare class RecordFilterEditorComponent {
4425
4566
  * catalogo resta interrogato qui, e non solo dentro il picker.
4426
4567
  */
4427
4568
  fieldDataType(filter: FlowRecordFilter): FlowDataType | undefined;
4569
+ /**
4570
+ * Fuori dall'elenco chiuso: e' `FIELD_UNKNOWN`, e va detto qui perche' il `<select>` mostrerebbe
4571
+ * solo una casella vuota — cioe' un documento scritto altrove sembrerebbe senza campo.
4572
+ */
4573
+ unknownFixedField(filter: FlowRecordFilter): boolean;
4428
4574
  /**
4429
4575
  * Il tipo concreto del campo: su un campo `Enum` e' cio' che permette di proporre i valori
4430
4576
  * ammessi invece di farli digitare (§4.6).
4431
4577
  */
4432
4578
  fieldObjectType(filter: FlowRecordFilter): string | undefined;
4579
+ /**
4580
+ * L'insieme chiuso del campo, dove lo schema lo dichiara (`hasClosedValueSet`, §6.4): e' cio' che
4581
+ * fa comparire i valori ammessi al posto della casella di testo. Vale anche in fondo a un percorso
4582
+ * di relazione, e lì l'entita' non e' quella di partenza — la porta con se' il segmento risolto.
4583
+ */
4584
+ fieldValueSet(filter: FlowRecordFilter): PathValueSet | undefined;
4433
4585
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RecordFilterEditorComponent, never>;
4434
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RecordFilterEditorComponent, "fb-record-filter-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "object": { "alias": "object"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "usage": { "alias": "usage"; "required": false; "isSignal": true; }; "supportsLogic": { "alias": "supportsLogic"; "required": false; "isSignal": true; }; "supportsFormula": { "alias": "supportsFormula"; "required": false; "isSignal": true; }; "emptyWarning": { "alias": "emptyWarning"; "required": false; "isSignal": true; }; "emptyWarningSeverity": { "alias": "emptyWarningSeverity"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
4586
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RecordFilterEditorComponent, "fb-record-filter-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "object": { "alias": "object"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "usage": { "alias": "usage"; "required": false; "isSignal": true; }; "fieldOptions": { "alias": "fieldOptions"; "required": false; "isSignal": true; }; "supportsLogic": { "alias": "supportsLogic"; "required": false; "isSignal": true; }; "supportsFormula": { "alias": "supportsFormula"; "required": false; "isSignal": true; }; "emptyWarning": { "alias": "emptyWarning"; "required": false; "isSignal": true; }; "emptyWarningSeverity": { "alias": "emptyWarningSeverity"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
4435
4587
  }
4436
4588
 
4437
4589
  /** Contenitore generico: gli input hanno `value`, gli output `assignToReference`. */
@@ -5230,6 +5382,39 @@ declare class ResourcePanelComponent {
5230
5382
  * e la mutazione va dentro `updateResource` perche' e' lì che il documento viene rimpiazzato.
5231
5383
  */
5232
5384
  onFiltersChanged(reference: FlowResourceRef, mutate: (holder: FilterHolder) => void): void;
5385
+ /** La sorgente scelta per un set che ancora non ne dichiara nessuna. */
5386
+ private readonly pendingSource;
5387
+ /**
5388
+ * La sorgente dichiarata vince sempre: e' cio' che c'e' nel documento. Finche' non c'e' niente
5389
+ * conta la scelta fatta nel pannello, e in mancanza si apre sulla query — la sorgente storica.
5390
+ */
5391
+ choiceSetSource(reference: FlowResourceRef): ChoiceSetSource;
5392
+ /**
5393
+ * Cambiare sorgente cancella le altre — dichiararne due e' `CHOICE_SET_SOURCE_AMBIGUOUS` — e
5394
+ * anche i **campi citati**: `Label` non e' un campo di un'entita' e `Ragione_Sociale` non e' una
5395
+ * proprieta' di un valore di enum, quindi lasciarli lì trasformerebbe un cambio di sorgente in
5396
+ * tre `FIELD_UNKNOWN` che l'utente non ha scritto.
5397
+ */
5398
+ setChoiceSetSource(reference: FlowResourceRef, source: ChoiceSetSource): void;
5399
+ /** Su un choice set da enum il tipo e' `enumType`: il campo generico sarebbe un doppione. */
5400
+ hidesObjectType(reference: FlowResourceRef): boolean;
5401
+ isChoiceSetSource(reference: FlowResourceRef, source: ChoiceSetSource): boolean;
5402
+ /** Piu' di una sorgente nel documento: il runtime ne usa una sola (§5.2). */
5403
+ ambiguousChoiceSetSource(reference: FlowResourceRef): boolean;
5404
+ /**
5405
+ * §5.2 — i campi citabili di un choice set da enum. Le etichette le dice il dizionario; il
5406
+ * **tipo** no, e senza tipo il valore di un filtro su `NumericValue` sarebbe una casella di testo.
5407
+ */
5408
+ readonly enumChoiceSetFields: _angular_core.Signal<FilterFieldOption[]>;
5409
+ /** Fuori dalle tre proprieta' di un valore di enum: `FIELD_UNKNOWN`. */
5410
+ unknownEnumChoiceSetField(reference: FlowResourceRef, field: string): boolean;
5411
+ /**
5412
+ * §5.2 — qui l'elenco dei tipi e' **autorevole** quando non e' vuoto: un `enumType` che il
5413
+ * catalogo non conosce e' un errore, non l'avviso che si darebbe su un catalogo di campi.
5414
+ */
5415
+ unknownEnumType(reference: FlowResourceRef): boolean;
5416
+ readonly defaultDisplayField = "Label";
5417
+ readonly defaultValueField = "Name";
5233
5418
  setValue(reference: FlowResourceRef, value: FlowValue | undefined): void;
5234
5419
  setDataType(reference: FlowResourceRef, dataType: string): void;
5235
5420
  requiresObjectType(reference: FlowResourceRef): boolean;
@@ -5688,5 +5873,5 @@ declare class SelectValueDirective implements AfterViewChecked {
5688
5873
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5689
5874
  }
5690
5875
 
5691
- export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, DynamicScreenInspectorComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, EnumValuePickerComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_CLIPBOARD_KIND, FLOW_CLIPBOARD_VERSION, FLOW_ELEMENT_ICONS, FLOW_ELEMENT_VARIANT_FIELDS, FLOW_ELEMENT_VARIANT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_REFERENCE_FIELDS, FLOW_RESOURCE_COLLECTIONS, FLOW_VALUE_FIELDS, FLOW_VALUE_LITERAL_FIELDS, FieldAssignmentEditorComponent, FieldPickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowClipboardService, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, FormulaEditorComponent, FormulaValidationService, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, PasteDialogComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, RunDialogComponent, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, allFieldsOf, applyPaste, areTypesComparable, buildClipboardPayload, canvasNodeId, checkConditionLogic, checkFlowName, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, innerNamesOf, insertField, isClipboardPayload, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, moveCondition, moveField, navigatePath, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, planPaste, referenceRoot, referencedRootsOf, remapConditionLogic, removeCondition, removeField, resolvePath, rewriteReferences, samePath, screenActionNames, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, typeOfCollection, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
5692
- export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowClipboardNode, FlowClipboardPayload, FlowClipboardResource, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowDynamicScreen, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowEnumValue, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormKind, FlowFormula, FlowFormulaIssue, FlowFormulaUsage, FlowFormulaValidationRequest, FlowFormulaValidationResult, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPalettePick, FlowPastePlan, FlowPasteRename, FlowPasteResource, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowRunOutcome, FlowRunRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenAction, FlowScreenField, FlowScreenFieldInputsRevisited, FlowScreenFieldNode, FlowScreenFieldPath, FlowScreenFieldType, FlowScreenFieldTypeEntry, FlowScreenNavigation, FlowScreenResponseRequest, FlowScreenTrigger, FlowScreenTriggerInitBehavior, FlowScreenValidationRule, FlowScriptPluginCall, FlowSeverityBucket, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowStructureDescribed, FlowStructureDescription, FlowStructureInstance, FlowStructureMember, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedEntry, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, PaletteGroup, PaletteItem, ParameterHolder, PathCatalog, PathContainer, PathContainerKind, PathEntry, PathLevel, PathLevelStatus, PathNavigation, PathNavigationRequest, PathResolution, PathStopReason, StructureMemberUsage, ValueMode };
5876
+ export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, DynamicScreenInspectorComponent, ENUM_CHOICE_SET_DEFAULT_DISPLAY_FIELD, ENUM_CHOICE_SET_DEFAULT_VALUE_FIELD, ENUM_CHOICE_SET_FIELDS, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, EnumValuePickerComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_CLIPBOARD_KIND, FLOW_CLIPBOARD_VERSION, FLOW_ELEMENT_ICONS, FLOW_ELEMENT_VARIANT_FIELDS, FLOW_ELEMENT_VARIANT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_REFERENCE_FIELDS, FLOW_RESOURCE_COLLECTIONS, FLOW_VALUE_FIELDS, FLOW_VALUE_LITERAL_FIELDS, FieldAssignmentEditorComponent, FieldPickerComponent, FieldValuePickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowClipboardService, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, FormulaEditorComponent, FormulaValidationService, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, PasteDialogComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, RunDialogComponent, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, allFieldsOf, applyPaste, areTypesComparable, buildClipboardPayload, canvasNodeId, checkConditionLogic, checkFlowName, choiceSetSourceOf, declaredChoiceSetSources, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, enumChoiceSetFieldType, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, innerNamesOf, insertField, isClipboardPayload, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isUnknownEnumChoiceSetField, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, moveCondition, moveField, navigatePath, otherSourceFieldsOf, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, planPaste, referenceRoot, referencedRootsOf, remapConditionLogic, removeCondition, removeField, resolvePath, rewriteReferences, samePath, screenActionNames, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, typeOfCollection, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
5877
+ export type { ChoiceSetSource, FieldAssignmentHolder, FilterFieldOption, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowClipboardNode, FlowClipboardPayload, FlowClipboardResource, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowDynamicScreen, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowEnumValue, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormKind, FlowFormula, FlowFormulaIssue, FlowFormulaUsage, FlowFormulaValidationRequest, FlowFormulaValidationResult, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPalettePick, FlowPastePlan, FlowPasteRename, FlowPasteResource, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowRunOutcome, FlowRunRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenAction, FlowScreenField, FlowScreenFieldInputsRevisited, FlowScreenFieldNode, FlowScreenFieldPath, FlowScreenFieldType, FlowScreenFieldTypeEntry, FlowScreenNavigation, FlowScreenResponseRequest, FlowScreenTrigger, FlowScreenTriggerInitBehavior, FlowScreenValidationRule, FlowScriptPluginCall, FlowSeverityBucket, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowStructureDescribed, FlowStructureDescription, FlowStructureInstance, FlowStructureMember, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedEntry, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, PaletteGroup, PaletteItem, ParameterHolder, PathCatalog, PathContainer, PathContainerKind, PathEntry, PathLevel, PathLevelStatus, PathNavigation, PathNavigationRequest, PathResolution, PathStopReason, PathValueSet, StructureMemberUsage, ValueMode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/flow-builder",
3
- "version": "20.3.23",
3
+ "version": "20.3.25",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.2.14",
6
6
  "@angular/common": "^20.3.24",
@@ -402,6 +402,102 @@ f-flow .fb-edge--goto .f-connection-path {
402
402
  line-height: 1;
403
403
  }
404
404
 
405
+ /**
406
+ * Il controllo segmentato: una scelta **esclusiva** fra poche voci, mostrata come un gruppo con una
407
+ * cornice sola invece che come bottoni sciolti. Lo usano le modalita' di un valore (§4.2: un solo
408
+ * campo valorizzato), la logica di condizioni e filtri e l'esito atteso di un operatore unario —
409
+ * cioe' controlli che nello stesso pannello si guardano, e che quindi devono essere uguali.
410
+ *
411
+ * Sta qui e non nei tre componenti perche' era già duplicato tre volte e i tre stili avevano
412
+ * cominciato a divergere. Vale l'avvertenza dei CSS con scope: queste regole sono globali, quindi
413
+ * un componente non deve ridefinirle — le variabili `--fb-*` sono la leva per ritemizzarle.
414
+ *
415
+ * `width: fit-content` con `max-width: 100%`: la cornice si stringe sul contenuto — nella dialog,
416
+ * larga il doppio, una barra da bordo a bordo sarebbe mezza vuota — ma nella colonna
417
+ * dell'inspector, dove le quattro voci di un valore non ci stanno in riga, va a capo invece di
418
+ * sfondare. `inline-flex` non servirebbe: dentro una colonna `flex` viene comunque blockificato.
419
+ */
420
+ .fb-value__modes,
421
+ .fb-filter__modes,
422
+ .fb-cond__modes,
423
+ .fb-cond__unary {
424
+ display: flex;
425
+ flex-wrap: wrap;
426
+ gap: 2px;
427
+ width: fit-content;
428
+ max-width: 100%;
429
+ padding: 2px;
430
+ border: 1px solid var(--fb-border-subtle, #eef0f4);
431
+ border-radius: var(--fb-radius-sm, 8px);
432
+ background: var(--fb-surface-sunken, #eef0f4);
433
+ }
434
+
435
+ .fb-value__mode,
436
+ .fb-filter__mode,
437
+ .fb-cond__mode {
438
+ padding: 3px 10px;
439
+ border: 0;
440
+ border-radius: var(--fb-radius-xs, 6px);
441
+ background: transparent;
442
+ color: var(--fb-text-muted, #6b7086);
443
+ font: inherit;
444
+ font-size: 11px;
445
+ font-weight: 500;
446
+ line-height: 1.5;
447
+ white-space: nowrap;
448
+ cursor: pointer;
449
+ transition: background 0.12s ease, color 0.12s ease, box-shadow 0.12s ease;
450
+ }
451
+
452
+ .fb-value__mode:hover:not(:disabled),
453
+ .fb-filter__mode:hover:not(:disabled),
454
+ .fb-cond__mode:hover:not(:disabled) {
455
+ /* Sulla superficie affossata del gruppo un grigio piu' scuro non si vedrebbe: si schiarisce. */
456
+ background: color-mix(in srgb, var(--fb-surface, #fff) 65%, transparent);
457
+ color: var(--fb-text, #1a1c23);
458
+ }
459
+
460
+ .fb-value__mode:focus-visible,
461
+ .fb-filter__mode:focus-visible,
462
+ .fb-cond__mode:focus-visible {
463
+ outline: 2px solid var(--fb-accent, #4f6ef7);
464
+ outline-offset: 1px;
465
+ }
466
+
467
+ /* La voce scelta sale sulla superficie: e' la differenza che si legge anche senza il colore. */
468
+ .fb-value__mode--active,
469
+ .fb-filter__mode--active,
470
+ .fb-cond__mode--active {
471
+ background: var(--fb-surface, #fff);
472
+ color: var(--fb-accent, #4f6ef7);
473
+ font-weight: 600;
474
+ box-shadow: var(--fb-shadow-sm, 0 1px 2px rgb(16 24 40 / 6%));
475
+ }
476
+
477
+ .fb-value__mode:disabled,
478
+ .fb-filter__mode:disabled,
479
+ .fb-cond__mode:disabled {
480
+ opacity: 0.5;
481
+ cursor: not-allowed;
482
+ }
483
+
484
+ /**
485
+ * «Nessun valore» non e' una modalita' alla pari delle altre: e' l'uscita, e non prende mai lo
486
+ * stato attivo — quando lo sarebbe, il bottone non c'e'.
487
+ */
488
+ .fb-value__mode--clear {
489
+ margin-left: 4px;
490
+ padding: 3px 7px;
491
+ color: var(--fb-text-subtle, #98a2b3);
492
+ font-size: 12px;
493
+ line-height: 1.25;
494
+ }
495
+
496
+ .fb-value__mode--clear:hover:not(:disabled) {
497
+ background: color-mix(in srgb, var(--fb-error, #dc2626) 12%, transparent);
498
+ color: var(--fb-error, #dc2626);
499
+ }
500
+
405
501
  .fb-section {
406
502
  margin: 0 0 14px;
407
503
  padding: 0;