@esfaenza/flow-builder 20.3.15 → 20.3.16

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
@@ -2,7 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, Signal, AfterViewChecked } from '@angular/core';
3
3
  import * as _esfaenza_flow_builder from '@esfaenza/flow-builder';
4
4
  import { EFMarkerType, EFConnectableSide } from '@foblex/flow';
5
- import { CdkDragDrop } from '@angular/cdk/drag-drop';
5
+ import { CdkDragMove, CdkDragEnd } from '@angular/cdk/drag-drop';
6
6
 
7
7
  /**
8
8
  * Modello del documento Flow — FRONTEND.md §3, §4, §5.
@@ -132,7 +132,11 @@ interface FlowFormula {
132
132
  description?: string;
133
133
  dataType?: FlowDataType;
134
134
  scale?: number;
135
- /** Passata verbatim al motore di regole: il backend non la valida (§4.6). */
135
+ /**
136
+ * Passata verbatim al motore di regole: il backend non la interpreta, ma la fa **verificare**
137
+ * al motore — `POST /flows/validate-formula` mentre si digita, e la stessa cosa durante la
138
+ * validazione del documento (§4.6, §6.3).
139
+ */
136
140
  expression?: string;
137
141
  }
138
142
  interface FlowTextTemplate {
@@ -954,6 +958,50 @@ interface FlowValidationResult {
954
958
  warningCount: number;
955
959
  isValid: boolean;
956
960
  }
961
+ /**
962
+ * Dove comparira' l'espressione. Non e' cosmesi: e' cio' che permette al motore di dire
963
+ * «qui serve un booleano» invece di accettare un'espressione che poi fallira' a runtime (§6.3).
964
+ */
965
+ type FlowFormulaUsage = 'Resource' | 'Condition' | 'ValidationRule' | 'Value' | string;
966
+ /**
967
+ * L'unica primitiva della §6.3 che **avvolge** il documento invece di prenderlo nudo: oltre al
968
+ * flow deve portare l'espressione e cosa ci si aspetta che produca (§6.4, ultimo capoverso).
969
+ * Il documento va mandato **in lavorazione**: una formula cita le variabili appena aggiunte, e
970
+ * verificarla contro la versione salvata la direbbe sbagliata.
971
+ */
972
+ interface FlowFormulaValidationRequest {
973
+ flow: FlowDefinition;
974
+ expression: string;
975
+ /** `Boolean` per una condizione o una validation rule, il tipo dichiarato per una risorsa. */
976
+ expectedDataType?: FlowDataType;
977
+ usage?: FlowFormulaUsage;
978
+ /** Solo dove il tipo atteso e' `Number` o `Integer` (§4.6). */
979
+ scale?: number;
980
+ }
981
+ /**
982
+ * Come {@link FlowValidationIssue}, piu' la **posizione del tratto sbagliato** dentro
983
+ * l'espressione: e' il motivo per cui questa primitiva esiste accanto a `POST /flows/validate`.
984
+ * `code` resta del motore: l'elenco della §7 non lo comprende, quindi si mostra e non si
985
+ * interpreta.
986
+ */
987
+ interface FlowFormulaIssue extends FlowValidationIssue {
988
+ /** Indice del primo carattere, 0-based. Puo' mancare: non ogni rilievo ha una posizione. */
989
+ position?: number | null;
990
+ length?: number | null;
991
+ }
992
+ interface FlowFormulaValidationResult {
993
+ issues: FlowFormulaIssue[];
994
+ /** Il tipo che l'espressione produce, quando il motore sa dirlo. Puo' mancare. */
995
+ resultDataType?: FlowDataType | null;
996
+ isCollection?: boolean;
997
+ /**
998
+ * `false` significa «nessun motore di validazione configurato»: nessun rilievo, ma nemmeno
999
+ * una conferma. **Non e' una promozione** — una spunta verde su un'espressione mai
1000
+ * controllata e' peggio di nessuna spunta (§6.3).
1001
+ */
1002
+ isVerified: boolean;
1003
+ isValid: boolean;
1004
+ }
957
1005
  interface FlowCreateRequest {
958
1006
  definition: FlowDefinition;
959
1007
  flowName?: string;
@@ -1305,6 +1353,21 @@ declare abstract class FlowBuilderApi {
1305
1353
  abstract validateDefinition(definition: FlowDefinition): Promise<FlowValidationResult>;
1306
1354
  /** `GET /flows/{name}/versions/{v}/validate` — valida una versione già salvata. */
1307
1355
  validateVersion(flowName: string, version: number): Promise<FlowValidationResult>;
1356
+ /**
1357
+ * `POST /flows/validate-formula` — verifica **una sola** espressione mentre l'utente la
1358
+ * scrive (§6.3). È l'editor di formule, non il pannello dei problemi: i rilievi portano la
1359
+ * `position` del tratto sbagliato, che la validazione dell'intero documento non ha.
1360
+ *
1361
+ * Unica primitiva di analisi con un involucro: il documento sta sotto `flow` perche' il body
1362
+ * deve portare anche l'espressione e il tipo atteso (§6.4).
1363
+ *
1364
+ * Opzionale come tutte le primitive che dipendono da un servizio dell'host: senza motore di
1365
+ * validazione delle formule l'editor deve restare usabile. Ci sono **due** modi in cui manca,
1366
+ * e sono diversi — il rifiuto `MissingService` (la primitiva non c'e') e la risposta con
1367
+ * `isVerified: false` (la primitiva c'e', il motore no): in entrambi i casi l'espressione non
1368
+ * si accompagna a una conferma, mai a una spunta verde.
1369
+ */
1370
+ validateFormula(request: FlowFormulaValidationRequest): Promise<FlowFormulaValidationResult>;
1308
1371
  /**
1309
1372
  * `GET /flows/dictionaries?processType=` — le tendine in una risposta.
1310
1373
  *
@@ -1500,6 +1563,11 @@ declare class HttpFlowBuilderApi extends FlowBuilderApi {
1500
1563
  * validazione di un flow vuoto, cioe' «manca lo Start».
1501
1564
  */
1502
1565
  validateDefinition(definition: FlowDefinition): Promise<FlowValidationResult>;
1566
+ /**
1567
+ * L'eccezione alla regola del documento nudo: qui l'involucro c'e' e il flow sta sotto
1568
+ * `flow`, perche' il body porta anche l'espressione e cosa deve produrre (§6.3, §6.4).
1569
+ */
1570
+ validateFormula(request: FlowFormulaValidationRequest): Promise<FlowFormulaValidationResult>;
1503
1571
  validateVersion(flowName: string, version: number): Promise<FlowValidationResult>;
1504
1572
  getDictionaries(processType?: string): Promise<FlowDictionaries>;
1505
1573
  /**
@@ -2595,6 +2663,29 @@ declare class FlowValidationStore {
2595
2663
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlowValidationStore>;
2596
2664
  }
2597
2665
 
2666
+ declare class FormulaValidationService {
2667
+ private readonly api;
2668
+ private readonly _isSupported;
2669
+ private readonly _lastError;
2670
+ /**
2671
+ * `false` quando la primitiva non e' esposta da questo ambiente. Diverso da
2672
+ * `isVerified: false` nella risposta, che dice «primitiva sì, motore no»: per l'utente
2673
+ * l'effetto e' lo stesso — nessuna conferma — ma il secondo caso lo dice il backend e lo si
2674
+ * riferisce, il primo e' silenzio (§6.3).
2675
+ */
2676
+ readonly isSupported: _angular_core.Signal<boolean>;
2677
+ readonly lastError: _angular_core.Signal<string | null>;
2678
+ /** Ci si puo' provare: la primitiva c'e' e l'ultima chiamata non e' esplosa. */
2679
+ readonly canValidate: _angular_core.Signal<boolean>;
2680
+ /**
2681
+ * Verifica l'espressione. `null` significa «non lo so»: primitiva assente o richiesta
2682
+ * fallita. Non e' «formula valida» — chi chiama non deve mostrare una conferma su un `null`.
2683
+ */
2684
+ validate(request: FlowFormulaValidationRequest): Promise<FlowFormulaValidationResult | null>;
2685
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormulaValidationService, never>;
2686
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FormulaValidationService>;
2687
+ }
2688
+
2598
2689
  interface FlowLayoutNodeInput {
2599
2690
  name: string;
2600
2691
  width: number;
@@ -3156,7 +3247,7 @@ declare class ReferencePickerComponent {
3156
3247
  * percorso inesistente di uno scope che i percorsi li dichiara, perche' lì il backend
3157
3248
  * risponderebbe `GLOBAL_UNKNOWN`.
3158
3249
  */
3159
- readonly valueState: _angular_core.Signal<"empty" | "known" | "navigated" | "host" | "member" | "containerRoot" | "memberUnknown" | "memberNotWritable" | "pathUnverified" | "globalPathUntyped" | "globalPathInvalid" | "unknown">;
3250
+ readonly valueState: _angular_core.Signal<"empty" | "unknown" | "member" | "known" | "navigated" | "host" | "containerRoot" | "memberUnknown" | "memberNotWritable" | "pathUnverified" | "globalPathUntyped" | "globalPathInvalid">;
3160
3251
  /** Le parole cambiano con la tappa: un campo di un'entita' non e' un membro di una classe. */
3161
3252
  private readonly tailIsObject;
3162
3253
  private readonly tailContainer;
@@ -3458,6 +3549,114 @@ declare class EnumValuePickerComponent {
3458
3549
  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>;
3459
3550
  }
3460
3551
 
3552
+ declare class FormulaEditorComponent {
3553
+ private readonly store;
3554
+ private readonly api;
3555
+ private readonly service;
3556
+ private readonly destroyRef;
3557
+ readonly expression: _angular_core.InputSignal<string>;
3558
+ /** Dove comparira': e' cio' che dice al motore cosa pretendere (§6.3). */
3559
+ readonly usage: _angular_core.InputSignal<string>;
3560
+ /** `Boolean` per condizioni e validation rule, il tipo dichiarato per una risorsa. */
3561
+ readonly expectedDataType: _angular_core.InputSignal<string | undefined>;
3562
+ readonly scale: _angular_core.InputSignal<number | undefined>;
3563
+ readonly placeholder: _angular_core.InputSignal<string>;
3564
+ readonly ariaLabel: _angular_core.InputSignal<string>;
3565
+ readonly disabled: _angular_core.InputSignal<boolean>;
3566
+ readonly rows: _angular_core.InputSignal<number>;
3567
+ /**
3568
+ * Quando propagare al documento. `input` a ogni tasto, `change` all'uscita dal campo: la
3569
+ * seconda serve dove mutare il documento ridisegna mezza schermata — l'anteprima dello screen
3570
+ * dinamico — e riscriverla a ogni tasto costa. La **verifica** parte comunque durante la
3571
+ * digitazione: usa la bozza locale, non cio' che e' arrivato al documento.
3572
+ */
3573
+ readonly commitOn: _angular_core.InputSignal<"input" | "change">;
3574
+ readonly expressionChange: _angular_core.OutputEmitterRef<string>;
3575
+ private readonly area;
3576
+ /**
3577
+ * Il testo che si sta scrivendo. Non e' legato al DOM — la casella tiene il suo valore e la
3578
+ * `[value]` resta quella del documento — perche' riscrivere l'attributo a ogni tasto sposta il
3579
+ * cursore quando si corregge in mezzo all'espressione.
3580
+ */
3581
+ private readonly draft;
3582
+ private readonly _result;
3583
+ private readonly _isChecking;
3584
+ private timer?;
3585
+ /** Cresce a ogni richiesta: scarta le risposte di verifiche già superate. */
3586
+ private sequence;
3587
+ readonly result: _angular_core.Signal<FlowFormulaValidationResult | null>;
3588
+ readonly isChecking: _angular_core.Signal<boolean>;
3589
+ readonly isSupported: _angular_core.Signal<boolean>;
3590
+ /**
3591
+ * I nomi citabili, per l'autocompletamento (§6.3): li da' `POST /flows/references`, cioe' la
3592
+ * stessa fonte del reference picker — compresi gli **output automatici**, che sono riferimenti
3593
+ * validi pur non essendo dichiarati in nessuna collection (§4.5, §13.3). Qui non si filtra per
3594
+ * tipo: dentro un'espressione il tipo lo decide il motore, non il campo.
3595
+ */
3596
+ private readonly references;
3597
+ /** Il documento per cui l'elenco e' stato chiesto: evita una richiesta a ogni focus. */
3598
+ private loadedFor;
3599
+ /** La parola sotto il cursore, che e' cio' che si sta completando. */
3600
+ private readonly token;
3601
+ protected readonly highlighted: _angular_core.WritableSignal<number>;
3602
+ readonly suggestions: _angular_core.Signal<FlowReference[]>;
3603
+ readonly issues: _angular_core.Signal<FlowFormulaIssue[]>;
3604
+ readonly hasErrors: _angular_core.Signal<boolean>;
3605
+ /**
3606
+ * L'esito e' una conferma **solo** se un motore ha davvero guardato l'espressione: senza
3607
+ * `isVerified` non si mostra la spunta, perche' una spunta verde su un'espressione mai
3608
+ * controllata e' peggio di nessuna spunta (§6.3).
3609
+ */
3610
+ readonly isConfirmed: _angular_core.Signal<boolean>;
3611
+ /** Il motore c'e' come primitiva ma non come motore: si dice, non si tace (§6.3). */
3612
+ readonly isUnverified: _angular_core.Signal<boolean>;
3613
+ /**
3614
+ * Il tipo prodotto quando il motore sa dirlo. Serve a segnalare una formula dichiarata
3615
+ * `String` che restituisce una data — ma il rilievo lo fa il motore: se l'ha già emesso,
3616
+ * qui non si ripete lo stesso avviso con parole diverse.
3617
+ */
3618
+ readonly resultDataType: _angular_core.Signal<string | null>;
3619
+ readonly typeMismatch: _angular_core.Signal<{
3620
+ expected: string;
3621
+ produced: string;
3622
+ } | null>;
3623
+ constructor();
3624
+ onInput(value: string): void;
3625
+ onCommit(value: string): void;
3626
+ onFocus(): void;
3627
+ /** Il cursore si sposta anche senza digitare: la parola sotto il cursore va riletta. */
3628
+ onCaretMove(): void;
3629
+ onBlur(): void;
3630
+ /**
3631
+ * Le frecce scorrono l'elenco e Invio inserisce. Senza, l'elenco sarebbe una decorazione: chi
3632
+ * scrive una formula ha le mani sulla tastiera e non va a cercare il mouse.
3633
+ */
3634
+ onKeyDown(event: KeyboardEvent): void;
3635
+ /**
3636
+ * Sostituisce la parola sotto il cursore col nome scelto. Si scrive nel DOM e poi si propaga:
3637
+ * la casella e' la sorgente del testo mentre si digita, e riscrivere solo il documento
3638
+ * lascerebbe indietro il cursore.
3639
+ */
3640
+ insert(name: string): void;
3641
+ private loadReferences;
3642
+ /** La parola sotto il cursore: identificatore o percorso puntato, com'e' in un riferimento. */
3643
+ private refreshToken;
3644
+ severityOf(issue: FlowFormulaIssue): string;
3645
+ hasPosition(issue: FlowFormulaIssue): boolean;
3646
+ /** Il tratto citato dal rilievo, così il messaggio dice *dove* anche senza il salto. */
3647
+ excerptOf(issue: FlowFormulaIssue): string;
3648
+ /**
3649
+ * Porta il cursore sul tratto segnalato. È il payoff di `position`: un indice di carattere
3650
+ * che l'utente dovrebbe contare a mano non aiuta nessuno.
3651
+ */
3652
+ goToIssue(issue: FlowFormulaIssue): void;
3653
+ private schedule;
3654
+ private run;
3655
+ private cancel;
3656
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormulaEditorComponent, never>;
3657
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormulaEditorComponent, "fb-formula-editor", never, { "expression": { "alias": "expression"; "required": false; "isSignal": true; }; "usage": { "alias": "usage"; "required": false; "isSignal": true; }; "expectedDataType": { "alias": "expectedDataType"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "commitOn": { "alias": "commitOn"; "required": false; "isSignal": true; }; }, { "expressionChange": "expressionChange"; }, never, ["*"], true, never>;
3658
+ }
3659
+
3461
3660
  /** Le modalita' offerte: una per campo del modello. */
3462
3661
  type ValueMode = 'reference' | 'literal' | 'formula' | 'globalConstant' | 'empty';
3463
3662
  declare class ValueEditorComponent {
@@ -4049,21 +4248,38 @@ declare class OrchestratedStageInspectorComponent extends NodeInspectorBase {
4049
4248
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OrchestratedStageInspectorComponent, "fb-orchestrated-stage-inspector", never, {}, {}, never, never, true, never>;
4050
4249
  }
4051
4250
 
4052
- /** Il payload della lista di rilascio: l'albero appiattito, cioe' le righe che si vedono. */
4053
- type DropData = FlowScreenFieldNode[];
4251
+ /** Il punto di inserimento calcolato dal trascinamento: dove, e in che posizione. */
4252
+ interface DropTarget {
4253
+ parent: FlowScreenFieldPath;
4254
+ index: number;
4255
+ }
4054
4256
  declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
4055
4257
  private readonly catalog;
4258
+ private readonly document;
4056
4259
  protected readonly dictionary: FlowDictionaryStore;
4057
4260
  readonly elementType: FlowElementType;
4058
4261
  readonly screen: _angular_core.Signal<FlowDynamicScreen>;
4059
- /** Il percorso del campo selezionato: `null` = nessuno, e il pannello destro lo dice. */
4262
+ /** Il percorso del campo selezionato: `null` = nessuno, e a destra ci sono le proprieta'
4263
+ * della **schermata** — lo stesso gesto del cliccare fuori da un campo. */
4060
4264
  private readonly selection;
4061
- /** L'albero appiattito: e' anche cio' che serve per capire quali percorsi esistono ancora. */
4062
- readonly tree: _angular_core.Signal<FlowScreenFieldNode[]>;
4063
4265
  readonly selectedPath: _angular_core.Signal<FlowScreenFieldPath | null>;
4064
4266
  readonly selectedField: _angular_core.Signal<FlowScreenField | undefined>;
4065
4267
  /** La voce di dizionario del campo selezionato: e' lei a decidere il form di destra. */
4066
4268
  readonly selectedType: _angular_core.Signal<FlowScreenFieldTypeEntry | undefined>;
4269
+ /**
4270
+ * Due elenchi e non uno: un **componente** si sceglie per tipo (che cosa fa), un **campo di
4271
+ * un'entita'** si sceglie per nome (quale dato), e da lì tipo, etichetta, obbligatorieta' e
4272
+ * opzioni arrivano dallo schema (§5.2). Metterli insieme costringerebbe a scegliere prima
4273
+ * `ObjectProvided` e poi il campo, che e' il contrario dell'ordine in cui si pensa.
4274
+ */
4275
+ readonly paletteTab: _angular_core.WritableSignal<"fields" | "components">;
4276
+ /** L'entita' di cui elencare i campi nella seconda scheda. */
4277
+ readonly fieldsObject: _angular_core.WritableSignal<string | undefined>;
4278
+ private readonly objectFields;
4279
+ readonly fieldsOfObject: _angular_core.Signal<FlowFieldDescription[]>;
4280
+ iconOf(type: string | undefined): string;
4281
+ setPaletteTab(tab: 'components' | 'fields'): void;
4282
+ setFieldsObject(object: string | undefined): void;
4067
4283
  /** Componenti e form sono la stessa domanda al frontend, e lo stesso catalogo (§5.2). */
4068
4284
  private readonly components;
4069
4285
  private readonly componentParameters;
@@ -4081,16 +4297,105 @@ declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
4081
4297
  readonly choiceOptions: _angular_core.Signal<NamePickerOption[]>;
4082
4298
  /** Gli stage dichiarati: `stageReference` alimenta l'indicatore di avanzamento (§5.2). */
4083
4299
  readonly stageOptions: _angular_core.Signal<NamePickerOption[]>;
4084
- readonly icon: string;
4085
4300
  isSelected(path: FlowScreenFieldPath): boolean;
4086
4301
  isContainer(field: FlowScreenField | undefined): boolean;
4087
- /** L'etichetta mostrata nell'albero: `fieldText`, poi il nome, poi un segnaposto. */
4302
+ /** `true` sulla sezione, che dispone i figli **in riga**: le colonne stanno una accanto all'altra. */
4303
+ isSection(field: FlowScreenField | undefined): boolean;
4304
+ childPath(parent: FlowScreenFieldPath, index: number): FlowScreenFieldPath;
4305
+ /** L'etichetta da disegnare: `fieldText`, poi il nome, poi un segnaposto esplicito. */
4088
4306
  captionOf(field: FlowScreenField): string;
4089
4307
  typeLabelOf(field: FlowScreenField): string;
4090
- /** La larghezza in dodicesimi: assente = tutta la riga, che e' il comportamento di default. */
4308
+ /**
4309
+ * La larghezza in dodicesimi: assente = tutta la riga, che e' il default del runtime. È anche
4310
+ * il numero di colonne che il campo occupa nella griglia dell'anteprima, limitato a 1..12
4311
+ * perche' un valore fuori scala romperebbe la griglia invece di segnalarsi.
4312
+ */
4091
4313
  widthOf(field: FlowScreenField): number;
4092
- /** `true` dove il tipo non e' nel dizionario: il form di destra lo dice invece di indovinare. */
4314
+ /** `true` dove il tipo non e' nel dizionario: si dice, invece di indovinare un disegno. */
4093
4315
  isUnknownType(field: FlowScreenField | undefined): boolean;
4316
+ /**
4317
+ * Le etichette delle opzioni, per disegnarle nell'anteprima: il `choiceText` di una
4318
+ * `FlowChoice`, il nome del choice set (le sue opzioni sono una query, e non esistono finche'
4319
+ * la schermata non viene presentata — §5.2).
4320
+ */
4321
+ choiceLabelsOf(field: FlowScreenField): string[];
4322
+ /** Il testo mostrato dentro il controllo inerte: il default, se ce n'e' uno leggibile. */
4323
+ placeholderOf(field: FlowScreenField): string;
4324
+ /** Il campo che si sta trascinando: la sua anteprima si sbiadisce e non intercetta il mouse. */
4325
+ readonly dragging: _angular_core.WritableSignal<FlowScreenFieldPath | null>;
4326
+ /** Il punto di inserimento corrente, disegnato come una barra fra i campi. */
4327
+ readonly dropTarget: _angular_core.WritableSignal<DropTarget | null>;
4328
+ isDragging(path: FlowScreenFieldPath): boolean;
4329
+ /** `true` se la barra di inserimento va disegnata qui. */
4330
+ isDropAt(parent: FlowScreenFieldPath, index: number): boolean;
4331
+ onFieldDragStarted(path: FlowScreenFieldPath): void;
4332
+ onFieldDragMoved(event: CdkDragMove): void;
4333
+ onFieldDragEnded(event: CdkDragEnd, path: FlowScreenFieldPath): void;
4334
+ /** Trascinamento **dalla palette**: non sposta niente, crea. */
4335
+ onPaletteDragMoved(event: CdkDragMove): void;
4336
+ onComponentDragEnded(event: CdkDragEnd, type: string): void;
4337
+ onObjectFieldDragEnded(event: CdkDragEnd, field: FlowFieldDescription): void;
4338
+ /**
4339
+ * Il documento si muta **dopo** che il gesto e' finito, non dentro `cdkDragEnded`: lì
4340
+ * l'anteprima si ridisegnerebbe mentre il CDK sta ancora chiudendo il trascinamento
4341
+ * sull'elemento che Angular in quel momento riusa per un altro campo. Un rinvio al task
4342
+ * successivo basta, e per chi guarda lo spostamento resta istantaneo.
4343
+ */
4344
+ private afterDrag;
4345
+ /**
4346
+ * Il bersaglio del rilascio, calcolato dal **DOM** e non dalle drop list del CDK.
4347
+ *
4348
+ * Le drop list annidate qui sono ambigue per costruzione: il rettangolo di una sezione
4349
+ * contiene quello delle sue colonne, e a ricevere il rilascio finisce sempre la lista
4350
+ * registrata per prima, cioe' la radice. Interrogando `elementFromPoint` si prende invece il
4351
+ * contenitore **piu' interno** sotto il puntatore, che e' esattamente quello che si vede.
4352
+ *
4353
+ * L'indice viene dal confronto con la mezzeria dei fratelli, sull'asse del contenitore: le
4354
+ * colonne di una sezione stanno in riga, tutto il resto in colonna.
4355
+ */
4356
+ private hitTest;
4357
+ /** `"0.2"` → `[0, 2]`; la radice e' la stringa vuota. */
4358
+ private static parsePath;
4359
+ /** Il valore dell'attributo che marca un contenitore di rilascio. */
4360
+ dropId(path: FlowScreenFieldPath): string;
4361
+ /**
4362
+ * Dove finisce un campo aggiunto **con un clic**: dentro il contenitore selezionato, oppure
4363
+ * accanto al campo selezionato, oppure in fondo alla schermata. È l'ordine in cui uno se lo
4364
+ * aspetta dopo aver cliccato una colonna.
4365
+ */
4366
+ private clickTarget;
4367
+ addComponentAtSelection(type: string): void;
4368
+ addObjectFieldAtSelection(field: FlowFieldDescription): void;
4369
+ /**
4370
+ * Un componente nuovo. Una sezione nasce **con una colonna dentro**: una sezione vuota e'
4371
+ * `SCREEN_CONTAINER_EMPTY` e non ha nemmeno un posto in cui rilasciare i campi, quindi il
4372
+ * primo gesto sarebbe sempre lo stesso.
4373
+ */
4374
+ private addComponent;
4375
+ /**
4376
+ * §5.2 — un campo dell'entita': `objectFieldReference` fa arrivare tipo, label,
4377
+ * obbligatorieta', scala e le opzioni **dallo schema**, invece di ridichiararli qui.
4378
+ */
4379
+ private addObjectField;
4380
+ select(path: FlowScreenFieldPath): void;
4381
+ /** Cliccare la schermata fuori da un campo: a destra tornano le proprieta' della schermata. */
4382
+ selectScreen(): void;
4383
+ removeSelected(): void;
4384
+ duplicateSelected(): void;
4385
+ /**
4386
+ * Spostamento con i tasti: la stessa operazione del trascinamento, per chi non trascina e
4387
+ * perche' spostare di una posizione con il mouse e' piu' difficile che con una freccia.
4388
+ */
4389
+ moveSelected(direction: -1 | 1): void;
4390
+ /** Estrae il campo dal proprio contenitore e lo mette subito dopo di esso. */
4391
+ outdentSelected(): void;
4392
+ readonly canOutdent: _angular_core.Signal<boolean>;
4393
+ /**
4394
+ * `preRemoval` distingue le due convenzioni sull'indice di arrivo: i comandi (su, giu', porta
4395
+ * fuori) ragionano sulla lista **dopo** l'estrazione, il rilascio su cio' che si vedeva
4396
+ * **prima**. Confonderle sposta di uno ogni trascinamento verso il basso.
4397
+ */
4398
+ private applyMove;
4094
4399
  /** Il campo raccoglie un valore, quindi e' referenziabile per nome nel resto del flow (§5.2). */
4095
4400
  readonly selectedIsResource: _angular_core.Signal<boolean>;
4096
4401
  /**
@@ -4122,46 +4427,6 @@ declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
4122
4427
  /** L'oggetto di un `ObjectProvided`, cioe' la parte prima del punto (§5.2). */
4123
4428
  readonly providedObject: _angular_core.Signal<string>;
4124
4429
  readonly providedField: _angular_core.Signal<string>;
4125
- select(path: FlowScreenFieldPath): void;
4126
- /** Aggiunge un campo dentro il contenitore selezionato, o in fondo alla schermata. */
4127
- addField(type: string): void;
4128
- /**
4129
- * Dove finisce un campo nuovo: dentro il contenitore selezionato (o dentro il contenitore
4130
- * che contiene il campo selezionato), altrimenti in fondo alla schermata. È il gesto che
4131
- * l'utente si aspetta dopo aver cliccato una colonna.
4132
- */
4133
- private parentForNewField;
4134
- removeSelected(): void;
4135
- duplicateSelected(): void;
4136
- /**
4137
- * Spostamento con i tasti: la stessa operazione del trascinamento, per chi non trascina e per
4138
- * i casi in cui la lista e' piu' alta del pannello.
4139
- */
4140
- moveSelected(direction: -1 | 1): void;
4141
- /**
4142
- * Sposta il campo dentro il contenitore che lo precede. È la controparte esplicita del
4143
- * trascinamento: dove l'albero e' lungo, mirare la riga giusta costa piu' di un clic.
4144
- */
4145
- indentSelected(): void;
4146
- /** Il contenitore in cui «porta dentro» metterebbe il campo, o `null` se non ce n'e' uno. */
4147
- readonly indentTarget: _angular_core.Signal<FlowScreenFieldPath | null>;
4148
- /** Estrae il campo dal proprio contenitore e lo mette subito dopo di esso. */
4149
- outdentSelected(): void;
4150
- /**
4151
- * Rilascio del trascinamento sulla lista **piatta**.
4152
- *
4153
- * Il contenitore di arrivo non lo dice il CDK — c'e' una sola lista — ma si deduce dalla riga
4154
- * che **precede** il punto di rilascio, che e' anche cio' che l'utente vede: rilasciare subito
4155
- * sotto una sezione o una colonna significa «mettilo dentro»; rilasciare sotto un campo
4156
- * normale significa «mettilo accanto». Sono le due sole intenzioni possibili.
4157
- */
4158
- onDrop(event: CdkDragDrop<DropData>): void;
4159
- /**
4160
- * `preRemoval` distingue le due convenzioni sull'indice di arrivo: i comandi (su, giu',
4161
- * porta fuori) ragionano sulla lista **dopo** l'estrazione, il rilascio ragiona su cio' che
4162
- * si vedeva **prima**. Confonderle sposta di uno ogni trascinamento verso il basso.
4163
- */
4164
- private applyMove;
4165
4430
  /** Scrive una proprieta' del campo selezionato; valore vuoto → chiave omessa (§2). */
4166
4431
  private patchField;
4167
4432
  setFieldProperty(property: keyof FlowScreenField, value: unknown): void;
@@ -4600,5 +4865,5 @@ declare class SelectValueDirective implements AfterViewChecked {
4600
4865
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4601
4866
  }
4602
4867
 
4603
- export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, DynamicScreenInspectorComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, EnumValuePickerComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, 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_RESOURCE_COLLECTIONS, FLOW_VALUE_FIELDS, FLOW_VALUE_LITERAL_FIELDS, FieldAssignmentEditorComponent, FieldPickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, 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, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, insertField, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, moveCondition, moveField, navigatePath, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, referenceRoot, remapConditionLogic, removeCondition, removeField, resolvePath, samePath, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
4604
- export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, 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, FlowFormula, 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, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenField, FlowScreenFieldInputsRevisited, FlowScreenFieldNode, FlowScreenFieldPath, FlowScreenFieldType, FlowScreenFieldTypeEntry, FlowScreenNavigation, FlowScreenResponseRequest, 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 };
4868
+ export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, DynamicScreenInspectorComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, EnumValuePickerComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, 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_RESOURCE_COLLECTIONS, FLOW_VALUE_FIELDS, FLOW_VALUE_LITERAL_FIELDS, FieldAssignmentEditorComponent, FieldPickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, FormulaEditorComponent, FormulaValidationService, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, 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, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, insertField, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, moveCondition, moveField, navigatePath, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, referenceRoot, remapConditionLogic, removeCondition, removeField, resolvePath, samePath, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
4869
+ export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, 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, 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, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenField, FlowScreenFieldInputsRevisited, FlowScreenFieldNode, FlowScreenFieldPath, FlowScreenFieldType, FlowScreenFieldTypeEntry, FlowScreenNavigation, FlowScreenResponseRequest, 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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/flow-builder",
3
- "version": "20.3.15",
3
+ "version": "20.3.16",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.2.14",
6
6
  "@angular/common": "^20.3.25",
@@ -250,6 +250,41 @@ f-flow .fb-edge--goto .f-connection-path {
250
250
  min-width: 0;
251
251
  }
252
252
 
253
+ /**
254
+ * I tre campi di un'assegnazione — destinazione, operazione, valore — su una riga sola.
255
+ * Incolonnati, una singola operazione era alta mezza dialog e per vederne due si scorreva.
256
+ *
257
+ * Il rientro a capo lo decide il flex dalla larghezza disponibile, non una media query: lo
258
+ * stesso inspector vive nel pannello laterale (420px, dove si incolonna) e nella dialog
259
+ * (1400px, dove sta in riga), e sul viewport non c'e' modo di distinguerli.
260
+ */
261
+ .fb-fields-row {
262
+ display: flex;
263
+ flex-wrap: wrap;
264
+ align-items: flex-start;
265
+ column-gap: 8px;
266
+ }
267
+
268
+ /* Il `margin-bottom` della `.fb-field` fa da distanza fra le righe quando vanno a capo. */
269
+ .fb-fields-row > .fb-field {
270
+ flex: 1 1 200px;
271
+ min-width: 0;
272
+ }
273
+
274
+ /* L'operatore e' un `select` di due parole: puo' stringersi, non deve allargarsi. */
275
+ .fb-fields-row > .fb-field--compact {
276
+ flex: 0 1 220px;
277
+ }
278
+
279
+ /*
280
+ * Il bottone in coda alla riga (rimozione): il margine lo allinea al controllo, non
281
+ * all'etichetta che gli sta sopra.
282
+ */
283
+ .fb-fields-row > .fb-fields-row__action {
284
+ flex: 0 0 auto;
285
+ margin-top: 17px;
286
+ }
287
+
253
288
  .fb-input,
254
289
  .fb-select,
255
290
  .fb-textarea {
@@ -506,36 +541,3 @@ f-flow .fb-edge--goto .f-connection-path {
506
541
  background: color-mix(in srgb, var(--fb-warning, #b7791f) 8%, transparent);
507
542
  font-size: 11px;
508
543
  }
509
-
510
- /* ------------------------------------------------ trascinamento (CDK) */
511
- /*
512
- * L'anteprima del trascinamento e' l'unico pezzo di UI che il CDK sposta **fuori** dal
513
- * componente: la aggancia a `body` (o al piu' vicino contenitore con overlay), dove il CSS
514
- * incapsulato dell'inspector non arriva. Senza queste regole il campo trascinato si vede
515
- * come testo nudo senza sfondo — lo stesso motivo per cui gli archi stanno qui.
516
- */
517
- .cdk-drag-preview {
518
- display: flex;
519
- align-items: center;
520
- gap: 6px;
521
- box-sizing: border-box;
522
- padding: 4px 6px;
523
- border: 1px solid var(--fb-accent, #4f6ef7);
524
- border-radius: var(--fb-radius-xs, 6px);
525
- background: var(--fb-surface, #fff);
526
- box-shadow: var(--fb-shadow-md, 0 6px 18px rgb(16 24 40 / 10%));
527
- font-size: 12px;
528
- color: var(--fb-text, #1a1c23);
529
- }
530
-
531
- /* L'anteprima resta essenziale: il tipo e la barra della larghezza sono contorno, e in un
532
- riquadro che segue il puntatore rubano l'attenzione al punto di rilascio. */
533
- .cdk-drag-preview .fb-dyn__type,
534
- .cdk-drag-preview .fb-dyn__width {
535
- display: none;
536
- }
537
-
538
- .cdk-drag-animating,
539
- .cdk-drop-list-dragging .cdk-drag {
540
- transition: transform 180ms cubic-bezier(0, 0, 0.2, 1);
541
- }