@esfaenza/flow-builder 20.3.32 → 20.3.34

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
@@ -1,7 +1,7 @@
1
1
  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
- import { EFMarkerType, EFConnectableSide } from '@foblex/flow';
4
+ import { EFMarkerType, EFConnectableSide, EFResizeHandleType } from '@foblex/flow';
5
5
  import { CdkDragMove, CdkDragEnd } from '@angular/cdk/drag-drop';
6
6
 
7
7
  /**
@@ -683,12 +683,46 @@ interface FlowDefinition {
683
683
  /** Non supportati: conservati nel round-trip ma non creabili dalla palette. */
684
684
  steps?: FlowUnsupportedNode[];
685
685
  experiments?: FlowUnsupportedNode[];
686
+ /** §3.6 — riquadri di raggruppamento: commenti sul canvas, nessun effetto sull'esecuzione. */
687
+ groups?: FlowGroup[];
686
688
  apiVersion?: string;
687
689
  timeZoneSidKey?: string;
688
690
  triggerOrder?: number;
689
691
  isTemplate?: boolean;
690
692
  customProperties?: FlowCustomProperty[];
691
693
  }
694
+ /**
695
+ * §3.6 — un riquadro di raggruppamento: l'unica collection del radice che **non contiene node**.
696
+ *
697
+ * E' documentazione, non esecuzione: nessun connector, nessuna raggiungibilita', il runtime non
698
+ * lo legge mai. Da lì vengono le due cose che sorprendono chi lo tratta come un elemento:
699
+ *
700
+ * - il `name` **non** entra nello spazio dei nomi dei riferimenti (§3.3), perche' non c'e'
701
+ * nessun riferimento da rendere ambiguo: un riquadro omonimo di una variabile non e'
702
+ * `NAME_DUPLICATED`, e l'unicita' si verifica **fra i riquadri** (`GROUP_NAME_DUPLICATED`);
703
+ * - l'appartenenza la dichiara `members`, non la geometria: il rettangolo dice come si disegna,
704
+ * `members` chi c'e' dentro. Con un auto-layout le coordinate valgono 0 e un riquadro
705
+ * conterrebbe tutto o niente, e senza `members` non sarebbe implementabile «sposto il
706
+ * riquadro, si spostano i node».
707
+ */
708
+ interface FlowGroup {
709
+ /** Identificatore del riquadro, univoco **fra i riquadri** (§3.6). */
710
+ name?: string;
711
+ /** Intestazione mostrata sulla barra del riquadro. */
712
+ label?: string;
713
+ /** Il testo del commento. */
714
+ description?: string;
715
+ locationX?: number;
716
+ locationY?: number;
717
+ /** `0` (o assente) significa «calcolala sui membri» (§3.6). */
718
+ width?: number;
719
+ height?: number;
720
+ /** Token concordato fra editor e backend: la libreria non lo interpreta. */
721
+ color?: string;
722
+ isCollapsed?: boolean;
723
+ /** I `name` dei node contenuti. Un nome rimasto indietro e' normale, non un difetto (§3.6). */
724
+ members?: string[];
725
+ }
692
726
  /** Le collection di node: `metadataProperty` del dizionario `elementTypes` (§3.2). */
693
727
  declare const FLOW_NODE_COLLECTIONS: readonly ["screens", "dynamicScreens", "assignments", "decisions", "loops", "collectionProcessors", "recordLookups", "recordCreates", "recordUpdates", "recordDeletes", "recordRollbacks", "actionCalls", "scriptPluginCalls", "subflows", "transforms", "waits", "customErrors", "orchestratedStages", "steps", "experiments"];
694
728
  type FlowNodeCollection = (typeof FLOW_NODE_COLLECTIONS)[number];
@@ -1219,6 +1253,24 @@ interface FlowOutlineConnection {
1219
1253
  label?: string | null;
1220
1254
  isGoTo?: boolean;
1221
1255
  }
1256
+ /**
1257
+ * §3.6, §6.4 — un riquadro di raggruppamento come arriva nell'outline: gli stessi campi del
1258
+ * documento, con i **soli membri che corrispondono a un node esistente**. Quelli rimasti
1259
+ * indietro sono omessi qui e segnalati dalla validazione (`GROUP_MEMBER_UNKNOWN`, un avviso):
1260
+ * chi disegna non deve filtrarli di nuovo.
1261
+ */
1262
+ interface FlowOutlineGroup {
1263
+ name: string;
1264
+ label?: string | null;
1265
+ description?: string | null;
1266
+ locationX?: number;
1267
+ locationY?: number;
1268
+ width?: number;
1269
+ height?: number;
1270
+ color?: string | null;
1271
+ isCollapsed?: boolean;
1272
+ members?: string[];
1273
+ }
1222
1274
  interface FlowOutline {
1223
1275
  flowName?: string | null;
1224
1276
  label?: string | null;
@@ -1227,6 +1279,8 @@ interface FlowOutline {
1227
1279
  entryElementName?: string | null;
1228
1280
  nodes: FlowOutlineNode[];
1229
1281
  connections: FlowOutlineConnection[];
1282
+ /** I riquadri (§3.6): si disegnano **sotto** i node e non hanno archi. */
1283
+ groups?: FlowOutlineGroup[];
1230
1284
  }
1231
1285
  type FlowInterviewStatus = 'Completed' | 'WaitingForScreen' | 'Paused' | 'Suspended'
1232
1286
  /** **Non** e' un errore HTTP: la richiesta e' riuscita, il flow e' fallito (§6.5). */
@@ -2257,6 +2311,31 @@ declare function removeField(screen: FlowDynamicScreen, path: FlowScreenFieldPat
2257
2311
  declare function moveField(screen: FlowDynamicScreen, from: FlowScreenFieldPath, toParent: FlowScreenFieldPath, toIndex: number): FlowScreenFieldPath | undefined;
2258
2312
  /** Duplica un campo accanto all'originale, rinominandolo: i nomi restano unici (§3.3). */
2259
2313
  declare function duplicateField(screen: FlowDynamicScreen, path: FlowScreenFieldPath, newName: string): FlowScreenFieldPath | undefined;
2314
+ /**
2315
+ * Il `path` di un rilievo di validazione tradotto nel percorso del campo che riguarda.
2316
+ *
2317
+ * Serve a far sì che il clic su un problema porti **sul campo**, non solo sull'elemento: su una
2318
+ * schermata da venti campi «apro la dialog e cercalo» significa contare i figli a mano, e con un
2319
+ * path a indici (`fields[1].fields[1].fields[0]`) contarli e' letteralmente l'unico modo.
2320
+ *
2321
+ * Il `path` e' testo libero deciso dal backend (§7), e i due formati che si incontrano sono
2322
+ * **entrambi** legittimi: per indice (`fields[1]`) e per nome (`fields[Sezione_1]`). Si
2323
+ * accettano tutti e due, perche' un editor che ne capisce uno solo funziona con metà dei
2324
+ * rilievi e non c'e' modo di accorgersene. Cio' che segue i campi (`.defaultValue.formulaExpression`)
2325
+ * si ignora: individua il campo, non il sottocampo, ed e' il campo che va selezionato.
2326
+ *
2327
+ * `null` quando il path non nomina nessun campo (un rilievo sull'elemento) o quando il campo non
2328
+ * esiste piu': una selezione che punta al vuoto mostrerebbe le proprieta' di un altro campo.
2329
+ */
2330
+ declare function parseFieldPath(screen: FlowDynamicScreen | undefined, path: string | null | undefined): FlowScreenFieldPath | null;
2331
+ /**
2332
+ * Il percorso di un campo scritto **per nome**: `Indirizzo di residenza › Colonna_3 › CAP`.
2333
+ *
2334
+ * E' l'altra metà dello stesso problema: `fields[1].fields[1].fields[2]` e' un percorso che
2335
+ * l'utente non puo' seguire, e il pannello dei problemi lo stampava così com'era. I nomi li ha
2336
+ * il documento, quindi tradurli e' compito dell'editor e non del backend.
2337
+ */
2338
+ declare function describeFieldPath(screen: FlowDynamicScreen | undefined, path: FlowScreenFieldPath | null): string;
2260
2339
 
2261
2340
  /**
2262
2341
  * I dynamic choice set — FRONTEND.md §5.2.
@@ -2800,6 +2879,149 @@ declare function isEmptyReferenceFilter(filter: FlowReferenceFilter | undefined)
2800
2879
  declare function matchesReferenceFilter(entry: FlowTypedEntry, filter: FlowReferenceFilter): boolean;
2801
2880
  declare function filterReferences(references: readonly FlowReference[], filter: FlowReferenceFilter | undefined): FlowReference[];
2802
2881
 
2882
+ /**
2883
+ * I riquadri di raggruppamento — FRONTEND.md §3.6.
2884
+ *
2885
+ * Logica pura: geometria e appartenenza. Il documento resta la fonte di verita' e lo scrive
2886
+ * {@link FlowDocumentStore}; qui non si tocca nessun signal.
2887
+ *
2888
+ * Le due cose che un riquadro non lascia indovinare, e che stanno tutte e due qui:
2889
+ *
2890
+ * - **la geometria puo' essere assente.** `width`/`height` a 0 significa «calcolala sui membri»
2891
+ * (§3.6), quindi il rettangolo da disegnare non e' cio' che sta scritto nel documento:
2892
+ * e' {@link groupRect}, che ripiega sull'ingombro dei membri piu' il respiro
2893
+ * dell'intestazione. Leggere `width` direttamente disegna riquadri di larghezza zero, che
2894
+ * non si vedono e non si possono nemmeno afferrare per correggerli;
2895
+ * - **l'appartenenza la dichiara `members`, non la geometria** (§3.6, regola 2). La geometria
2896
+ * serve solo a **calcolarla** quando l'utente trascina un node dentro o fuori
2897
+ * ({@link membersInside}), e il risultato va scritto nel documento. Il contrario — dedurre
2898
+ * l'appartenenza dai rettangoli a ogni disegno — con un auto-layout (tutte le coordinate a 0)
2899
+ * metterebbe tutti i node in tutti i riquadri.
2900
+ */
2901
+
2902
+ /** Il rettangolo di un node o di un riquadro, in coordinate del canvas. */
2903
+ interface FlowRect {
2904
+ x: number;
2905
+ y: number;
2906
+ width: number;
2907
+ height: number;
2908
+ }
2909
+ /**
2910
+ * Altezza della barra del titolo. Serve due volte: e' il respiro sopra i membri quando la
2911
+ * geometria si calcola, ed e' l'altezza del riquadro **chiuso**.
2912
+ */
2913
+ declare const GROUP_HEADER_HEIGHT = 30;
2914
+ /** Respiro fra il bordo del riquadro e i node che contiene. */
2915
+ declare const GROUP_PADDING = 28;
2916
+ /** Sotto queste misure il riquadro non si afferra piu': niente titolo, niente maniglia. */
2917
+ declare const GROUP_MIN_WIDTH = 160;
2918
+ declare const GROUP_MIN_HEIGHT = 90;
2919
+ /**
2920
+ * I colori che l'editor propone. `color` e' «un token concordato fra editor e backend» (§3.6),
2921
+ * quindi questo elenco e' una **proposta**, non un dizionario autoritativo: un token che non e'
2922
+ * qui non e' un errore, si disegna con il colore neutro e resta scritto com'e'.
2923
+ */
2924
+ declare const FLOW_GROUP_COLORS: ReadonlyArray<{
2925
+ value: string;
2926
+ label: string;
2927
+ }>;
2928
+ /** La classe che porta il colore. Token sconosciuto → neutro: la libreria non lo interpreta. */
2929
+ declare function groupColorClass(color: string | undefined): string;
2930
+ /**
2931
+ * L'ingombro di un insieme di rettangoli, piu' il respiro. E' cio' che serve sia a calcolare la
2932
+ * geometria di un riquadro senza misure, sia a crearne uno **attorno alla selezione**.
2933
+ */
2934
+ declare function boundsAround(rects: readonly FlowRect[]): FlowRect | null;
2935
+ /**
2936
+ * Il rettangolo da disegnare. `width`/`height` a 0 o assenti significano «calcolala sui membri»
2937
+ * (§3.6): si prende l'ingombro dei membri **presenti** — un `members` che nomina un node
2938
+ * cancellato e' normale (§3.6, regola 3) — e se non ne resta nemmeno uno si tiene una misura
2939
+ * minima nel punto dichiarato, perche' un riquadro vuoto deve restare afferrabile per essere
2940
+ * riempito o cancellato.
2941
+ */
2942
+ declare function groupRect(group: FlowGroup, memberRects: readonly FlowRect[]): FlowRect;
2943
+ /** `true` se la geometria del riquadro e' calcolata sui membri invece che dichiarata. */
2944
+ declare function hasAutoSize(group: FlowGroup): boolean;
2945
+ /**
2946
+ * I node che il rettangolo contiene, per **centro** e non per intersezione: un node che sporge
2947
+ * da un bordo appartiene al riquadro in cui sta la sua parte maggiore, e con l'intersezione un
2948
+ * node in mezzo a due riquadri finirebbe in entrambi.
2949
+ *
2950
+ * L'ordine e' quello dei node passati, così un `members` ricalcolato non cambia solo perche' si
2951
+ * e' spostato qualcosa.
2952
+ */
2953
+ declare function membersInside(rect: FlowRect, nodes: ReadonlyArray<{
2954
+ name: string;
2955
+ rect: FlowRect;
2956
+ }>): string[];
2957
+ /**
2958
+ * L'elenco dei membri dopo un trascinamento: cio' che il rettangolo contiene, **piu'** due
2959
+ * conservazioni che sembrano dettagli e non lo sono.
2960
+ *
2961
+ * - **l'ordine di prima si mantiene.** `membersInside` risponde nell'ordine delle collection,
2962
+ * quindi adottarlo tale e quale riscriveva l'elenco di **ogni** riquadro a ogni spostamento
2963
+ * di un node qualunque: il documento risultava modificato senza che nulla fosse cambiato, e
2964
+ * il diff del salvataggio era pieno di righe rimescolate;
2965
+ * - **i membri che non sono node restano.** Un nome che non corrisponde a nessun node e' cio'
2966
+ * che resta dopo una cancellazione (§3.6, regola 3): non e' un difetto, e' un avviso da
2967
+ * ripulire — e ripulirlo di soppiatto mentre si trascina un altro elemento farebbe sparire
2968
+ * l'avviso senza che nessuno l'abbia deciso. La ripulitura e' un comando, non un effetto
2969
+ * collaterale.
2970
+ */
2971
+ declare function recomputeMembers(previous: readonly string[] | undefined, inside: readonly string[], isNode: (name: string) => boolean): string[];
2972
+ /** Due elenchi di membri sono lo stesso elenco: evita di scrivere il documento per niente. */
2973
+ declare function sameMembers(left: readonly string[] | undefined, right: readonly string[]): boolean;
2974
+
2975
+ /**
2976
+ * Innestare un elemento **su un arco** — cioe' in mezzo a un percorso già collegato.
2977
+ *
2978
+ * Perche' esiste: senza, aggiungere un passo in mezzo a una catena e' tutto lavoro manuale.
2979
+ * L'elemento nasce scollegato nel punto del rilascio, poi si riscrivono **due** connettori a
2980
+ * mano (quello di chi precede e quello del nuovo elemento) e infine si trascina il node al suo
2981
+ * posto — su un flow di quaranta elementi distanti duecento pixel e' il gesto piu' costoso che
2982
+ * l'editor chiede.
2983
+ *
2984
+ * Qui c'e' solo il **piano**: dove va il node, quale sua uscita riprende il percorso, e cosa
2985
+ * va spostato per fargli spazio. Applicarlo e' dello store, che lo fa in una mutazione sola —
2986
+ * un annulla, non quattro.
2987
+ *
2988
+ * Due cose non ovvie.
2989
+ *
2990
+ * La prima: **quale uscita riprende il percorso** non e' «la prima». Una Decision riprende dal
2991
+ * ramo `default` («nessuna regola vera»), non dalla prima regola, perche' le regole sono cio'
2992
+ * che l'autore deve ancora scrivere; un Loop riprende da `loopEnd`, perche' `loopNext` e' il
2993
+ * corpo. E un Custom Error non riprende affatto: interrompe l'esecuzione (§5.12), quindi
2994
+ * innestarlo **scollega** cio' che stava a valle — chi applica il piano lo deve dire.
2995
+ *
2996
+ * La seconda: si sposta qualcosa **solo se serve**. Se fra i due elementi c'e' già spazio per
2997
+ * un node, il resto del flow non si muove: un comando che riordina mezzo grafo per fare posto a
2998
+ * un passo e' peggio del problema che risolve.
2999
+ */
3000
+
3001
+ /** Posizione di un elemento sul canvas, come la tiene il documento (§3.5). */
3002
+ interface FlowNodePosition {
3003
+ x: number;
3004
+ y: number;
3005
+ }
3006
+ /** Il piano di un innesto, pronto da applicare. */
3007
+ interface FlowEdgeInsertion {
3008
+ /** L'arco su cui si innesta: chi precede e da quale sua uscita. */
3009
+ from: string;
3010
+ outletKey: string;
3011
+ /** Cio' che l'arco raggiungeva: diventa la destinazione del nuovo elemento. */
3012
+ to: string;
3013
+ /** Dove nasce il nuovo elemento. */
3014
+ position: FlowNodePosition;
3015
+ /**
3016
+ * Gli elementi da traslare in basso per fare spazio, con il delta. `null` se lo spazio
3017
+ * c'era già: allora niente si muove.
3018
+ */
3019
+ shift: {
3020
+ names: readonly string[];
3021
+ deltaY: number;
3022
+ } | null;
3023
+ }
3024
+
2803
3025
  /** Un node come lo vede l'editor: il node piu' da dove viene. */
2804
3026
  interface FlowNodeRef {
2805
3027
  name: string;
@@ -2821,6 +3043,12 @@ interface FlowEdge {
2821
3043
  label?: string | null;
2822
3044
  isGoTo?: boolean;
2823
3045
  }
3046
+ /** Un riquadro di raggruppamento come lo vede l'editor (§3.6). */
3047
+ interface FlowGroupRef {
3048
+ name: string;
3049
+ index: number;
3050
+ group: FlowGroup;
3051
+ }
2824
3052
  /** Una risorsa come la vede l'editor. */
2825
3053
  interface FlowResourceRef {
2826
3054
  name: string;
@@ -2846,6 +3074,18 @@ declare class FlowDocumentStore {
2846
3074
  readonly nodes: _angular_core.Signal<FlowNodeRef[]>;
2847
3075
  readonly nodeByName: _angular_core.Signal<Map<string, FlowNodeRef>>;
2848
3076
  readonly resources: _angular_core.Signal<FlowResourceRef[]>;
3077
+ /**
3078
+ * §3.6 — i riquadri di raggruppamento. Non sono node: non hanno uscite, non entrano negli
3079
+ * archi e non partecipano alla raggiungibilita'.
3080
+ */
3081
+ readonly groups: _angular_core.Signal<FlowGroupRef[]>;
3082
+ /**
3083
+ * I nomi dei riquadri, che sono uno spazio dei nomi **a parte** (§3.6, regola 1): un riquadro
3084
+ * non e' referenziabile, quindi un omonimo di una variabile non e' `NAME_DUPLICATED` e non
3085
+ * deve comparire in {@link usedNames}. Un riquadro nuovo si confronta solo con questi
3086
+ * (`GROUP_NAME_DUPLICATED`).
3087
+ */
3088
+ readonly groupNames: _angular_core.Signal<string[]>;
2849
3089
  /**
2850
3090
  * §3.3 — l'insieme dei nomi già usati, che e' **uno solo**: node, risorse e le **tre** cose che non
2851
3091
  * sono ne' l'uno ne' l'altro ma il cui nome e' la radice di un riferimento — step di orchestrazione,
@@ -2883,6 +3123,27 @@ declare class FlowDocumentStore {
2883
3123
  redo(): void;
2884
3124
  /** Inserisce un node nella collection indicata dal dizionario (`metadataProperty`). */
2885
3125
  addNode(collection: FlowNodeCollection, node: FlowAnyNode): void;
3126
+ /**
3127
+ * Inserisce un node **in mezzo a un arco**: chi precede punta al nuovo elemento, il nuovo
3128
+ * elemento riprende il percorso da `resumeOutletKey`, e cio' che stava sotto si sposta per
3129
+ * fargli spazio (§3.5).
3130
+ *
3131
+ * Tutto in **una** mutazione: sono quattro modifiche al documento, ma un solo gesto
3132
+ * dell'utente, e annullarlo deve riportare il flow com'era — non a un terzo del lavoro.
3133
+ *
3134
+ * `resumeOutletKey` a `null` e' legittimo e non e' un errore: un Custom Error non ha uscite,
3135
+ * quindi il percorso a valle resta scollegato. Lo decide {@link resumeOutletOf}, e chi chiama
3136
+ * ha il compito di dirlo all'utente.
3137
+ */
3138
+ insertNodeOnEdge(collection: FlowNodeCollection, node: FlowAnyNode, insertion: FlowEdgeInsertion, resumeOutletKey: string | null): void;
3139
+ /** Il node con quel nome dentro una copia di lavoro: la mappa dei nomi vale sul documento. */
3140
+ private static nodeIn;
3141
+ /**
3142
+ * Scrive la destinazione di un'uscita **su un node**, senza passare dallo storico: la usano
3143
+ * `setConnector` (una modifica sola) e `insertNodeOnEdge` (quattro modifiche in un passo).
3144
+ * Staccare un ramo lo **omette** (§2) — vedi il commento di `setConnector`.
3145
+ */
3146
+ private static writeConnector;
2886
3147
  /** Modifica un node per nome. Il mutatore riceve la copia di lavoro. */
2887
3148
  updateNode(name: string, mutate: (node: FlowAnyNode) => void, options?: {
2888
3149
  silent?: boolean;
@@ -2903,6 +3164,8 @@ declare class FlowDocumentStore {
2903
3164
  * e' `CONNECTOR_TARGET_UNKNOWN`, cioe' un errore che blocca l'attivazione (§7).
2904
3165
  */
2905
3166
  removeNode(name: string): void;
3167
+ /** Toglie un nome dai `members` di ogni riquadro; una lista vuota si omette (§2). */
3168
+ private static forgetMember;
2906
3169
  /** Toglie i connector che puntano a un node scomparso, Start compreso. */
2907
3170
  private static clearReferencesTo;
2908
3171
  /**
@@ -2962,10 +3225,61 @@ declare class FlowDocumentStore {
2962
3225
  y: number;
2963
3226
  };
2964
3227
  }): string[];
2965
- /** Scrive la destinazione di un'uscita. `target` assente → il ramo si stacca del tutto. */
3228
+ /**
3229
+ * Scrive la destinazione di un'uscita. `target` assente → il ramo si stacca del tutto.
3230
+ *
3231
+ * Staccare un ramo lo **omette** (§2), non lascia un oggetto senza destinazione: quello
3232
+ * sarebbe `CONNECTOR_TARGET_MISSING`, cioe' «ramo dichiarato ma non collegato» — un avviso —
3233
+ * mentre un ramo assente e' `CONNECTOR_MISSING`, la nota «il percorso finisce qui», che per
3234
+ * il default di una Decision e' legittimo (§3.5, §5.5). `isGoTo` non tiene in vita il
3235
+ * connector: e' solo un suggerimento di disegno sull'arco, e senza arco non ha niente da
3236
+ * suggerire — conservarlo faceva restare `{isGoTo: true}` e trasformava lo stacco di un arco
3237
+ * «a salto» in un avviso. La scrittura vera e' in `writeConnector`, che condivide con
3238
+ * l'innesto su un arco.
3239
+ */
2966
3240
  setConnector(fromName: string, outletKey: string, target: string | undefined, isGoTo?: boolean): void;
2967
3241
  /** Rimuove un arco: il percorso finisce lì, che e' legittimo (§3.5). */
2968
3242
  removeConnector(fromName: string, outletKey: string): void;
3243
+ addGroup(group: FlowGroup): void;
3244
+ updateGroup(index: number, mutate: (group: FlowGroup) => void, options?: {
3245
+ silent?: boolean;
3246
+ }): void;
3247
+ removeGroup(index: number): void;
3248
+ /**
3249
+ * Sposta un riquadro **e i suoi membri**, in una sola mutazione.
3250
+ *
3251
+ * E' il senso di `members` (§3.6, regola 2): il rettangolo dice come si disegna, l'elenco dice
3252
+ * chi c'e' dentro, e spostare la cornice senza il contenuto sarebbe un gesto che non serve a
3253
+ * nessuno. Un solo passo di storico perche' e' un solo gesto: annullarlo deve riportare
3254
+ * indietro riquadro e node insieme, non prima gli uni e poi l'altro.
3255
+ *
3256
+ * `silent` per il trascinamento: il chiamante registra un solo passo alla fine.
3257
+ */
3258
+ moveGroup(name: string, x: number, y: number, options?: {
3259
+ silent?: boolean;
3260
+ }): void;
3261
+ /**
3262
+ * Scrive la geometria dichiarata di un riquadro: e' il ridimensionamento a mano.
3263
+ *
3264
+ * Scriverla e' anche il modo di **uscire** dal «calcolala sui membri» (§3.6): finche'
3265
+ * `width`/`height` valgono 0 il rettangolo segue i membri, e allora ridimensionarlo non
3266
+ * avrebbe effetto. L'appartenenza non si ricalcola qui: la ricalcola chi conosce le geometrie
3267
+ * dei node, cioe' il canvas.
3268
+ */
3269
+ resizeGroup(name: string, rect: {
3270
+ x: number;
3271
+ y: number;
3272
+ width: number;
3273
+ height: number;
3274
+ }): void;
3275
+ /**
3276
+ * Riscrive i membri di un riquadro. Ritorna `true` se il documento e' cambiato: il canvas lo
3277
+ * chiama a ogni fine di trascinamento, e riscrivere un elenco identico riempirebbe lo storico
3278
+ * di passi che non annullano niente.
3279
+ */
3280
+ setGroupMembers(name: string, members: readonly string[], options?: {
3281
+ silent?: boolean;
3282
+ }): boolean;
2969
3283
  addResource(collection: FlowResourceCollection, resource: Record<string, unknown>): void;
2970
3284
  updateResource(collection: FlowResourceCollection, index: number, mutate: (resource: Record<string, unknown>) => void): void;
2971
3285
  removeResource(collection: FlowResourceCollection, index: number): void;
@@ -3467,6 +3781,14 @@ declare function parseTargetConnectorId(id: string): string | null;
3467
3781
  /** L'id del node sul canvas: prefissato per non collidere con quello dei connettori. */
3468
3782
  declare function canvasNodeId(nodeName: string): string;
3469
3783
  declare function parseCanvasNodeId(id: string): string | null;
3784
+ /**
3785
+ * L'id di un riquadro sul canvas (§3.6). Prefisso diverso da quello dei node perche' gli
3786
+ * eventi della libreria — `fMoveNodes`, `fSelectionChange`, `fDeleteSelected` — portano node e
3787
+ * riquadri **nello stesso elenco**: senza due prefissi distinti, spostare un riquadro finirebbe
3788
+ * in `moveNode` di un node che non esiste, cioe' in un gesto che non fa niente.
3789
+ */
3790
+ declare function canvasGroupId(groupName: string): string;
3791
+ declare function parseCanvasGroupId(id: string): string | null;
3470
3792
  interface FlowCanvasNode {
3471
3793
  /** Nome nel documento; `$start` per lo Start, che nel modello non ha nome. */
3472
3794
  name: string;
@@ -3524,6 +3846,40 @@ interface FlowCanvasEdge {
3524
3846
  label?: string | null;
3525
3847
  isGoTo: boolean;
3526
3848
  }
3849
+ /**
3850
+ * Un riquadro di raggruppamento come lo disegna il canvas (§3.6).
3851
+ *
3852
+ * Il rettangolo qui dentro e' **già risolto**: `width`/`height` a 0 nel documento significano
3853
+ * «calcolala sui membri», e il template non deve sapere quale delle due strade e' stata presa —
3854
+ * disegnare la geometria del documento farebbe sparire i riquadri auto-dimensionati.
3855
+ */
3856
+ interface FlowCanvasGroup {
3857
+ name: string;
3858
+ /** Id per il canvas, prefissato: vedi {@link canvasGroupId}. */
3859
+ id: string;
3860
+ label: string;
3861
+ description?: string | null;
3862
+ position: {
3863
+ x: number;
3864
+ y: number;
3865
+ };
3866
+ size: {
3867
+ width: number;
3868
+ height: number;
3869
+ };
3870
+ /** La classe del colore; token fuori elenco → neutro (§3.6: la libreria non lo interpreta). */
3871
+ colorClass: string;
3872
+ isCollapsed: boolean;
3873
+ /** Quanti membri corrispondono a un node esistente. */
3874
+ memberCount: number;
3875
+ /**
3876
+ * Membri che nominano un node che non c'e' piu'. Non e' un difetto (§3.6, regola 3) ed e' un
3877
+ * avviso: si mostra come tale, perche' e' l'unico posto in cui si vede senza validare.
3878
+ */
3879
+ unknownMembers: string[];
3880
+ /** La geometria e' calcolata sui membri: ridimensionarlo la dichiara (§3.6). */
3881
+ isAutoSized: boolean;
3882
+ }
3527
3883
 
3528
3884
  /**
3529
3885
  * Dimensioni nominali di un node, usate dal layout automatico.
@@ -3541,6 +3897,11 @@ declare class FlowCanvasComponent {
3541
3897
  private readonly store;
3542
3898
  private readonly dictionaries;
3543
3899
  private readonly validation;
3900
+ /** L'elemento del componente: serve per convertire punti e per il hit test degli archi. */
3901
+ private readonly host;
3902
+ private readonly destroyRef;
3903
+ /** Lo schema dei gesti: serve a scambiare «trascina per spostare la vista» con «per selezionare». */
3904
+ private readonly gestures;
3544
3905
  /**
3545
3906
  * Marker di fine arco: la variante "all states" crea sia quello normale sia quello
3546
3907
  * selezionato, evitando che l'arco selezionato perda la punta.
@@ -3553,8 +3914,16 @@ declare class FlowCanvasComponent {
3553
3914
  * uscirebbe di fianco.
3554
3915
  */
3555
3916
  readonly sides: typeof EFConnectableSide;
3917
+ /**
3918
+ * I lati della maniglia di ridimensionamento di un riquadro. Una sola, in basso a destra:
3919
+ * quattro maniglie su una cornice che sta **sotto** i node sarebbero quattro bersagli da
3920
+ * prendere per sbaglio mentre si lavora al grafo.
3921
+ */
3922
+ readonly resizeHandles: typeof EFResizeHandleType;
3556
3923
  /** Il nome dell'elemento selezionato, `$start` per lo Start. */
3557
3924
  readonly selectedName: _angular_core.InputSignal<string | null>;
3925
+ /** Il riquadro selezionato (§3.6): la selezione dei riquadri e' separata da quella dei node. */
3926
+ readonly selectedGroupName: _angular_core.InputSignal<string | null>;
3558
3927
  /**
3559
3928
  * La selezione **intera**, quando ne fa parte piu' di un elemento: la libreria sa selezionare
3560
3929
  * a rettangolo e con `Ctrl`+`A`, e i comandi che agiscono su un blocco (copia, duplica,
@@ -3581,6 +3950,9 @@ declare class FlowCanvasComponent {
3581
3950
  readonly nodeOpened: _angular_core.OutputEmitterRef<string>;
3582
3951
  readonly nodeRemoveRequested: _angular_core.OutputEmitterRef<string>;
3583
3952
  readonly nodeDuplicateRequested: _angular_core.OutputEmitterRef<string>;
3953
+ /** Un riquadro e' stato scelto: chi ascolta ne apre il pannello (§3.6). */
3954
+ readonly groupSelected: _angular_core.OutputEmitterRef<string>;
3955
+ readonly groupRemoveRequested: _angular_core.OutputEmitterRef<string>;
3584
3956
  /** Rilascio di un elemento dalla palette: tipo + punto nel sistema del canvas. */
3585
3957
  readonly elementDropped: _angular_core.OutputEmitterRef<{
3586
3958
  type: FlowElementType;
@@ -3588,11 +3960,28 @@ declare class FlowCanvasComponent {
3588
3960
  variant?: string;
3589
3961
  x: number;
3590
3962
  y: number;
3963
+ /**
3964
+ * L'arco sotto il puntatore al momento del rilascio, se ce n'era uno: allora l'elemento
3965
+ * non nasce scollegato ma **in mezzo** a quel percorso.
3966
+ */
3967
+ edge?: {
3968
+ from: string;
3969
+ outletKey: string;
3970
+ to: string;
3971
+ };
3591
3972
  }>;
3592
3973
  private readonly canvas;
3593
3974
  private readonly _hasMovedViewport;
3594
3975
  /** L'utente ha zoomato o spostato la vista: il comando per rimetterla a posto ha senso. */
3595
3976
  readonly hasMovedViewport: _angular_core.Signal<boolean>;
3977
+ /**
3978
+ * L'ingrandimento corrente, in percentuale. Esiste perche' senza il numero non si capisce
3979
+ * dove si e': su un flow grande si finisce all'8% con la rotella e sembra che il canvas si
3980
+ * sia svuotato. Si aggiorna dagli eventi della libreria e dopo i nostri comandi — la
3981
+ * libreria non espone un signal.
3982
+ */
3983
+ private readonly _zoomPercent;
3984
+ readonly zoomPercent: _angular_core.Signal<number>;
3596
3985
  /** Il primo `fNodesRendered` inquadra, i successivi no: rifarlo combatterebbe con l'utente. */
3597
3986
  private hasFramedOnce;
3598
3987
  /**
@@ -3603,24 +3992,175 @@ declare class FlowCanvasComponent {
3603
3992
  * vista si spalancherebbe su una card sola.
3604
3993
  */
3605
3994
  onNodesRendered(): void;
3995
+ /**
3996
+ * Porta la vista **su** un elemento: e' l'arrivo della ricerca e del clic su un problema.
3997
+ * Se si stava troppo indietro si avvicina, altrimenti la scala non si tocca — chi stava al
3998
+ * 100% non vuole essere rimpicciolito per aver cercato un nome.
3999
+ */
4000
+ bringIntoView(name: string): void;
4001
+ zoomIn(): void;
4002
+ zoomOut(): void;
4003
+ /**
4004
+ * Torna al 100% **sull'elemento corrente**, non sull'origine del canvas: al 9% l'origine puo'
4005
+ * essere a settemila pixel da cio' che si stava guardando, e un «100%» che porta nel vuoto e'
4006
+ * peggio di nessun comando. Senza selezione l'ancora e' lo Start.
4007
+ */
4008
+ zoomToActual(): void;
4009
+ private applyScale;
4010
+ /** Rilegge la scala dalla libreria: la percentuale mostrata e' quella vera, non una stima. */
4011
+ private syncZoom;
3606
4012
  /**
3607
4013
  * Qualunque zoom o panoramica accende il pulsante. `frameFlow` passa
3608
4014
  * `emitCanvasChange: false`, quindi il ritorno alla vista iniziale non rientra da qui e il
3609
4015
  * pulsante si spegne invece di restare acceso per sempre.
3610
4016
  */
3611
4017
  onCanvasChange(): void;
4018
+ /**
4019
+ * La modalita' selezione: sul canvas vuoto il trascinamento **seleziona** invece di spostare
4020
+ * la vista.
4021
+ *
4022
+ * Esiste per un motivo solo, e non e' un vezzo. Spostare venti elementi su un flow di
4023
+ * produzione richiede di selezionarli, e i due gesti che la libreria offre di serie —
4024
+ * `Ctrl`+clic per aggiungere, `Shift`+trascina per il rettangolo — **non si vedono**: chi non
4025
+ * li conosce sposta un elemento alla volta, che e' esattamente cio' che accadeva. Un
4026
+ * interruttore visibile e' l'unico modo di annunciare un gesto.
4027
+ *
4028
+ * I due gesti di prima restano validi: questo cambia solo cosa fa il **trascinamento nudo**.
4029
+ * Con la modalita' accesa la vista si sposta col tasto centrale — la rotella continua a
4030
+ * zoomare — e per questo la modalita' e' un interruttore e non un cambio permanente: chi ha un
4031
+ * mouse senza tasto centrale la spegne e torna a spostare la vista trascinando.
4032
+ */
4033
+ private readonly _isSelecting;
4034
+ readonly isSelecting: _angular_core.Signal<boolean>;
4035
+ toggleSelectionMode(): void;
4036
+ /**
4037
+ * Quanti elementi sono selezionati. Serve al suggerimento: «trascinane uno per spostarli
4038
+ * tutti» e' l'informazione che rende utile la selezione, e senza dirla si continua a
4039
+ * spostarli uno per uno anche dopo averli selezionati.
4040
+ */
4041
+ readonly selectionCount: _angular_core.Signal<number>;
3612
4042
  resetViewport(): void;
4043
+ /**
4044
+ * Inquadra il flow, ma **non oltre** {@link MIN_READABLE_SCALE}: quando ci starebbe tutto solo
4045
+ * a una scala illeggibile si tiene quella e si inquadra l'**inizio**, che e' il posto da cui
4046
+ * si comincia a leggerlo.
4047
+ *
4048
+ * Le due strade sono **alternative**, e non «fai il fit, poi correggi»: `fitToScreen` applica
4049
+ * in modo asincrono (la libreria rimanda al frame successivo), quindi rileggerne la scala
4050
+ * subito dopo restituisce quella di prima, e la correzione partiva sempre o mai. Per questo la
4051
+ * scala di inquadratura la calcoliamo noi: le geometrie sono nel documento, non c'e' niente da
4052
+ * chiedere alla libreria.
4053
+ */
3613
4054
  private frameFlow;
4055
+ /**
4056
+ * La scala a cui il flow ci starebbe tutto, senza pavimento. Si calcola dal **documento**:
4057
+ * posizioni e ingombri dei node li conosciamo (la larghezza dipende dal numero di rami), e la
4058
+ * viewport e' l'elemento del componente. Non si chiede alla libreria perche' la sua risposta
4059
+ * arriva un frame dopo.
4060
+ */
4061
+ private fittingScale;
3614
4062
  /** Raggiungibilita': backend se c'e', locale altrimenti. */
3615
4063
  private readonly reachability;
3616
4064
  readonly nodes: _angular_core.Signal<FlowCanvasNode[]>;
3617
4065
  private toCanvasNode;
3618
4066
  /** Gli archi con destinazione: solo questi diventano `<f-connection>`. */
3619
4067
  readonly edges: _angular_core.Signal<FlowCanvasEdge[]>;
4068
+ /**
4069
+ * Gli ingombri dei node, per l'appartenenza ai riquadri. Lo Start non c'e': `members` porta i
4070
+ * `name` dei node (§3.6) e lo Start nel modello non ha nome.
4071
+ */
4072
+ private readonly nodeRects;
4073
+ private rectsOf;
4074
+ /**
4075
+ * I riquadri da disegnare. Vengono dal **documento** e non dall'outline: l'outline li porta
4076
+ * (§6.4) ma arriva mezzo secondo dopo, e una cornice che segue il trascinamento con un
4077
+ * ritardo e' peggio di nessuna cornice. Dell'outline si usa la raggiungibilita', che il
4078
+ * client non puo' sapere meglio del backend; la geometria la conosciamo noi.
4079
+ */
4080
+ readonly groups: _angular_core.Signal<FlowCanvasGroup[]>;
4081
+ /**
4082
+ * Ricalcola l'appartenenza dai rettangoli: e' il gesto «trascino un node dentro o fuori dal
4083
+ * riquadro» della §3.6, regola 2 — la geometria non **e'** l'appartenenza, la **calcola**, e
4084
+ * il risultato va scritto in `members`.
4085
+ *
4086
+ * `moved` sono i node appena trascinati, e servono per i riquadri **senza** geometria
4087
+ * dichiarata: lì il rettangolo e' l'ingombro dei membri, quindi comprende sempre il membro
4088
+ * che si sta portando fuori — che così non ne uscirebbe mai. Escludendolo dal calcolo del
4089
+ * rettangolo, il confronto avviene contro la cornice che l'utente vedeva prima del gesto.
4090
+ *
4091
+ * Sempre `silent`: accompagna una mutazione che ha già registrato il suo passo di storico, e
4092
+ * un annulla che riporta indietro l'appartenenza ma non la posizione sarebbe incomprensibile.
4093
+ */
4094
+ private syncGroupMembers;
4095
+ /** Apre e chiude il riquadro. Non tocca i membri: chiuso e' un fatto del disegno (§3.6). */
4096
+ toggleGroupCollapsed(event: Event, name: string): void;
4097
+ onGroupClick(event: Event, name: string): void;
4098
+ onGroupRemoveClick(event: Event, name: string): void;
4099
+ /**
4100
+ * Ridimensionamento a mano: `fGroupSizeChange` porta il rettangolo intero, posizione
4101
+ * compresa — trascinare la maniglia di un lato sposta anche l'angolo opposto.
4102
+ *
4103
+ * Scrivere la geometria e' anche il modo di uscire dal «calcolala sui membri» (§3.6): finche'
4104
+ * `width`/`height` sono 0 la cornice segue i membri, e allora ridimensionarla non si vedrebbe.
4105
+ */
4106
+ onGroupResized(name: string, rect: {
4107
+ x: number;
4108
+ y: number;
4109
+ width: number;
4110
+ height: number;
4111
+ }): void;
4112
+ isGroupSelected(group: FlowCanvasGroup): boolean;
3620
4113
  /** Sintesi mostrata sul node: la cosa che serve sapere senza aprire l'inspector. */
3621
4114
  private subtitleOf;
3622
4115
  /** Sullo Start conta il trigger: e' cio' che decide quando il flow parte (§3.4). */
3623
4116
  private startSubtitle;
4117
+ /**
4118
+ * L'arco su cui si innesterebbe l'elemento che si sta trascinando dalla palette.
4119
+ *
4120
+ * Esiste per **dirlo prima**: senza l'evidenziazione, rilasciare sopra un arco e scoprire dopo
4121
+ * che il flow si e' ricollegato e' una sorpresa, e non ci sarebbe modo di rilasciare *accanto*
4122
+ * di proposito. Con l'arco acceso, il gesto e' una scelta.
4123
+ */
4124
+ private readonly _insertionEdgeId;
4125
+ readonly insertionEdgeId: _angular_core.Signal<string | null>;
4126
+ /** Gli id degli archi disegnati: il hit test accetta solo questi. */
4127
+ private readonly edgeIds;
4128
+ /** L'ascoltatore attivo solo durante un trascinamento dalla palette. */
4129
+ private pointerListener;
4130
+ /**
4131
+ * Inizio di un trascinamento. Interessa **solo** quello di una voce della palette: trascinare
4132
+ * un node o il capo di una connessione non innesta niente, e accendere gli archi in quei casi
4133
+ * sarebbe rumore. La libreria chiama `drag-external-item` quel gesto (`kind`, o `fEventType`
4134
+ * nella forma vecchia).
4135
+ */
4136
+ onDragStarted(event: {
4137
+ kind?: string;
4138
+ fEventType?: string;
4139
+ }): void;
4140
+ onDragEnded(): void;
4141
+ /**
4142
+ * L'arco sotto un punto dello schermo.
4143
+ *
4144
+ * Non serve nessuna geometria: @foblex/flow disegna gia', sotto ogni arco, un secondo path
4145
+ * spesso (`.f-connection-selection`, 14px) con `pointer-events: stroke` — e' quello che rende
4146
+ * cliccabile un arco da 2px, ed e' quello che risponde qui. L'id dell'elemento
4147
+ * `<f-connection>` e' il nostro `fConnectionId`, cioe' `<sorgente>|<uscita>`.
4148
+ *
4149
+ * Si scorre l'elenco invece di guardare il solo primo elemento: sopra l'arco ci sono
4150
+ * l'anteprima del trascinamento e il velo del canvas.
4151
+ */
4152
+ private edgeIdAt;
4153
+ /**
4154
+ * Da coordinate del flow a coordinate dello schermo.
4155
+ *
4156
+ * `f-canvas` porta la trasformazione del canvas (`matrix(s,0,0,s,tx,ty)`) e il suo riquadro
4157
+ * comincia dall'origine del flow: l'angolo del suo `getBoundingClientRect` **e'** il punto
4158
+ * (0,0) del flow, e da li' basta la scala. Serve perche' il rilascio arriva in coordinate del
4159
+ * flow mentre il hit test lavora su quelle dello schermo.
4160
+ */
4161
+ private toClientPoint;
4162
+ /** L'arco da cui viene un id, per rimandare al chiamante anche la destinazione. */
4163
+ private edgeById;
3624
4164
  /**
3625
4165
  * Creazione di un arco. `targetId` assente significa rilascio nel vuoto: il ramo resta
3626
4166
  * **staccato**, cioe' omesso dal documento (`CONNECTOR_MISSING`, «il percorso finisce
@@ -3670,6 +4210,10 @@ declare class FlowCanvasComponent {
3670
4210
  x: number;
3671
4211
  y: number;
3672
4212
  };
4213
+ dropPosition?: {
4214
+ x: number;
4215
+ y: number;
4216
+ };
3673
4217
  }): void;
3674
4218
  onNodeDoubleClick(name: string): void;
3675
4219
  /**
@@ -3699,7 +4243,7 @@ declare class FlowCanvasComponent {
3699
4243
  /** Classe della fascia colorata, per categoria del dizionario. */
3700
4244
  categoryClass(node: FlowCanvasNode): string;
3701
4245
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlowCanvasComponent, never>;
3702
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowCanvasComponent, "fb-flow-canvas", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "selectedNames": { "alias": "selectedNames"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "nodeOpened": "nodeOpened"; "nodeRemoveRequested": "nodeRemoveRequested"; "nodeDuplicateRequested": "nodeDuplicateRequested"; "elementDropped": "elementDropped"; }, never, never, true, never>;
4246
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowCanvasComponent, "fb-flow-canvas", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "selectedGroupName": { "alias": "selectedGroupName"; "required": false; "isSignal": true; }; "selectedNames": { "alias": "selectedNames"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "nodeOpened": "nodeOpened"; "nodeRemoveRequested": "nodeRemoveRequested"; "nodeDuplicateRequested": "nodeDuplicateRequested"; "groupSelected": "groupSelected"; "groupRemoveRequested": "groupRemoveRequested"; "elementDropped": "elementDropped"; }, never, never, true, never>;
3703
4247
  }
3704
4248
 
3705
4249
  /** Il gesto scelto sulla palette: un tipo e, dove esiste, la sua variante (§5.6). */
@@ -3829,6 +4373,7 @@ declare class ReferencePickerComponent {
3829
4373
  private readonly loadError;
3830
4374
  readonly isOpen: _angular_core.WritableSignal<boolean>;
3831
4375
  readonly query: _angular_core.WritableSignal<string>;
4376
+ private readonly panel;
3832
4377
  constructor();
3833
4378
  /**
3834
4379
  * Il riferimento dichiarato piu' **lungo** che sia un prefisso del valore, e la tappa da cui
@@ -4097,6 +4642,20 @@ declare class NamePickerComponent {
4097
4642
  readonly emptyMessage: _angular_core.InputSignal<string>;
4098
4643
  /** Testo monospazio: i nomi tecnici si leggono meglio, ed e' come li mostra il resto del form. */
4099
4644
  readonly isMono: _angular_core.InputSignal<boolean>;
4645
+ /**
4646
+ * Quando si emette cio' che si **digita**.
4647
+ *
4648
+ * `'input'` (predefinito) e' il caso normale: il picker e' legato a un campo del documento, e a
4649
+ * ogni tasto il valore va lì — come in una casella di testo qualunque.
4650
+ *
4651
+ * `'enter'` serve dove il picker **non** e' un campo ma un comando: l'aggiunta di un'opzione a un
4652
+ * elenco (§5.2), dove ogni emissione e' una riga in piu'. Lì «una per tasto» significa che
4653
+ * scrivere `Alta` aggiunge `A`, `Al`, `Alt` e `Alta`: la scelta dall'elenco resta immediata, il
4654
+ * testo scritto a mano si conferma con Invio. Non si conferma sul blur di proposito — il blur
4655
+ * arriva **prima** del click su un'opzione, e confermerebbe la parola incompleta insieme alla
4656
+ * voce scelta.
4657
+ */
4658
+ readonly commitOn: _angular_core.InputSignal<"input" | "enter">;
4100
4659
  readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
4101
4660
  readonly isOpen: _angular_core.WritableSignal<boolean>;
4102
4661
  private readonly query;
@@ -4112,11 +4671,13 @@ declare class NamePickerComponent {
4112
4671
  close(): void;
4113
4672
  toggle(): void;
4114
4673
  onInput(text: string): void;
4674
+ /** Invio: conferma il testo scritto a mano dove non lo fa la digitazione. */
4675
+ commit(): void;
4115
4676
  choose(option: NamePickerOption): void;
4116
4677
  clear(): void;
4117
4678
  describe(option: NamePickerOption): string;
4118
4679
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NamePickerComponent, never>;
4119
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NamePickerComponent, "fb-name-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "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; }; "unknownMessage": { "alias": "unknownMessage"; "required": false; "isSignal": true; }; "unknownSeverity": { "alias": "unknownSeverity"; "required": false; "isSignal": true; }; "unusableOptions": { "alias": "unusableOptions"; "required": false; "isSignal": true; }; "unusableMessage": { "alias": "unusableMessage"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isMono": { "alias": "isMono"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
4680
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NamePickerComponent, "fb-name-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "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; }; "unknownMessage": { "alias": "unknownMessage"; "required": false; "isSignal": true; }; "unknownSeverity": { "alias": "unknownSeverity"; "required": false; "isSignal": true; }; "unusableOptions": { "alias": "unusableOptions"; "required": false; "isSignal": true; }; "unusableMessage": { "alias": "unusableMessage"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isMono": { "alias": "isMono"; "required": false; "isSignal": true; }; "commitOn": { "alias": "commitOn"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
4120
4681
  }
4121
4682
 
4122
4683
  declare class StructurePickerComponent {
@@ -4858,6 +5419,11 @@ declare class ElementInspectorComponent {
4858
5419
  * nell'intestazione della dialog, e ripeterli sprecherebbe la riga piu' preziosa.
4859
5420
  */
4860
5421
  readonly showHeader: _angular_core.InputSignal<boolean>;
5422
+ /**
5423
+ * Il campo di screen dinamico da selezionare all'apertura, quando si arriva da un rilievo o
5424
+ * dalla ricerca. Si passa avanti al compositore: qui non si sa nemmeno che forma abbia.
5425
+ */
5426
+ readonly initialFieldPath: _angular_core.InputSignal<FlowScreenFieldPath | null>;
4861
5427
  readonly closed: _angular_core.OutputEmitterRef<void>;
4862
5428
  readonly removeRequested: _angular_core.OutputEmitterRef<string>;
4863
5429
  readonly duplicateRequested: _angular_core.OutputEmitterRef<string>;
@@ -4877,6 +5443,18 @@ declare class ElementInspectorComponent {
4877
5443
  /** I rilievi ancorati all'elemento (§7). */
4878
5444
  readonly issues: _angular_core.Signal<_esfaenza_flow_builder.FlowValidationIssue[]>;
4879
5445
  /** Il nome tecnico in modifica: si applica con un comando esplicito, non a ogni tasto. */
5446
+ /**
5447
+ * I rilievi mostrati per intero o accorciati.
5448
+ *
5449
+ * Un elemento con sei rilievi apriva il form con un muro di 350px di avvisi prima del primo
5450
+ * campo: su una dialog alta 550px e' il 63% di cio' che si vede, e il form sembra non esserci.
5451
+ * Se ne mostrano due — quanti bastano a sapere che qualcosa non va — e il resto si chiede.
5452
+ */
5453
+ readonly issuesExpanded: _angular_core.WritableSignal<boolean>;
5454
+ private static readonly ISSUE_PREVIEW;
5455
+ readonly visibleIssues: _angular_core.Signal<_esfaenza_flow_builder.FlowValidationIssue[]>;
5456
+ readonly hiddenIssueCount: _angular_core.Signal<number>;
5457
+ toggleIssues(): void;
4880
5458
  readonly pendingName: _angular_core.WritableSignal<string | null>;
4881
5459
  readonly nameError: _angular_core.Signal<string | null>;
4882
5460
  /**
@@ -4903,7 +5481,7 @@ declare class ElementInspectorComponent {
4903
5481
  y: number;
4904
5482
  }>;
4905
5483
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementInspectorComponent, never>;
4906
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementInspectorComponent, "fb-element-inspector", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "removeRequested": "removeRequested"; "duplicateRequested": "duplicateRequested"; "renamed": "renamed"; }, never, never, true, never>;
5484
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementInspectorComponent, "fb-element-inspector", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "initialFieldPath": { "alias": "initialFieldPath"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "removeRequested": "removeRequested"; "duplicateRequested": "duplicateRequested"; "renamed": "renamed"; }, never, never, true, never>;
4907
5485
  }
4908
5486
 
4909
5487
  declare class ElementDialogComponent {
@@ -4911,6 +5489,8 @@ declare class ElementDialogComponent {
4911
5489
  private readonly dictionaries;
4912
5490
  /** L'elemento da configurare; `$start` per lo Start. */
4913
5491
  readonly selectedName: _angular_core.InputSignal<string | null>;
5492
+ /** Il campo di screen dinamico da selezionare all'apertura: si passa avanti all'inspector. */
5493
+ readonly initialFieldPath: _angular_core.InputSignal<FlowScreenFieldPath | null>;
4914
5494
  readonly closed: _angular_core.OutputEmitterRef<void>;
4915
5495
  readonly removeRequested: _angular_core.OutputEmitterRef<string>;
4916
5496
  readonly duplicateRequested: _angular_core.OutputEmitterRef<string>;
@@ -4922,12 +5502,42 @@ declare class ElementDialogComponent {
4922
5502
  readonly typeLabel: _angular_core.Signal<string>;
4923
5503
  readonly title: _angular_core.Signal<string>;
4924
5504
  constructor();
5505
+ /**
5506
+ * Vincolo dello spostamento: cio' che deve restare nel builder e' la **maniglia**, non la
5507
+ * finestra. Un `cdkDragBoundary` chiede che l'elemento ci stia tutto, e con una dialog quasi
5508
+ * grande quanto il builder non lascia nessun margine di movimento; qui invece si spinge la
5509
+ * finestra fin quasi fuori — che e' il punto: si sposta per guardare cio' che copre — e
5510
+ * l'intestazione resta comunque sotto il puntatore per riportarla indietro.
5511
+ *
5512
+ * Attenzione alla firma, che non e' simmetrica e il compilatore non lo dice: **in** arriva la
5513
+ * posizione del puntatore in coordinate di pagina, **fuori** deve andare l'angolo in alto a
5514
+ * sinistra dell'**elemento** — con un `constrainPosition` il CDK calcola la trasformazione da
5515
+ * `_initialDomRect`, non dal punto di presa. Restituendo un puntatore la finestra si sposta di
5516
+ * quanto e' distante la presa dal suo bordo, e il vincolo scatta nel posto sbagliato.
5517
+ *
5518
+ * Per lo stesso motivo i conti si fanno in coordinate del **viewport**: `_initialDomRect` viene
5519
+ * da `getBoundingClientRect`, mentre il punto in ingresso comprende lo scorrimento della pagina.
5520
+ */
5521
+ readonly constrainPosition: (point: {
5522
+ x: number;
5523
+ y: number;
5524
+ }, _drag: unknown, dimensions: DOMRect, pickup: {
5525
+ x: number;
5526
+ y: number;
5527
+ }) => {
5528
+ x: number;
5529
+ y: number;
5530
+ };
5531
+ /** Altezza dell'intestazione: la fetta che deve restare visibile in basso. */
5532
+ private static readonly HEAD_HEIGHT;
5533
+ /** Il rettangolo del builder, nelle stesse coordinate in cui il CDK vuole la risposta. */
5534
+ private builderBounds;
4925
5535
  close(): void;
4926
5536
  onRemoveRequested(name: string): void;
4927
5537
  onDuplicateRequested(name: string): void;
4928
5538
  onRenamed(name: string): void;
4929
5539
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementDialogComponent, never>;
4930
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementDialogComponent, "fb-element-dialog", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "removeRequested": "removeRequested"; "duplicateRequested": "duplicateRequested"; "renamed": "renamed"; }, never, never, true, never>;
5540
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementDialogComponent, "fb-element-dialog", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "initialFieldPath": { "alias": "initialFieldPath"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "removeRequested": "removeRequested"; "duplicateRequested": "duplicateRequested"; "renamed": "renamed"; }, never, never, true, never>;
4931
5541
  }
4932
5542
 
4933
5543
  declare class PasteDialogComponent {
@@ -5113,6 +5723,16 @@ declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
5113
5723
  protected readonly dictionary: FlowDictionaryStore;
5114
5724
  readonly elementType: FlowElementType;
5115
5725
  readonly screen: _angular_core.Signal<FlowDynamicScreen>;
5726
+ /**
5727
+ * Il campo da selezionare all'apertura: lo passa chi apre il form (un rilievo del pannello dei
5728
+ * problemi, un risultato della ricerca). L'effetto scatta solo quando l'input **cambia**,
5729
+ * quindi non litiga con la selezione dell'utente; un `null` non e' un'istruzione — significa
5730
+ * «apri come sempre», cioe' sulle proprieta' della schermata.
5731
+ */
5732
+ readonly initialSelection: _angular_core.InputSignal<FlowScreenFieldPath | null>;
5733
+ /** Il compositore: si porta in vista quando la selezione arriva da fuori (vedi il costruttore). */
5734
+ private readonly composer;
5735
+ private readonly injector;
5116
5736
  /** Il percorso del campo selezionato: `null` = nessuno, e a destra ci sono le proprieta'
5117
5737
  * della **schermata** — lo stesso gesto del cliccare fuori da un campo. */
5118
5738
  private readonly selection;
@@ -5453,9 +6073,19 @@ declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
5453
6073
  /** I flag con default `true` si scrivono solo quando si nega, per non sporcare il diff. */
5454
6074
  setScreenFlag(flag: 'allowBack' | 'allowFinish' | 'allowPause' | 'showHeader' | 'showFooter', value: boolean): void;
5455
6075
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DynamicScreenInspectorComponent, never>;
5456
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicScreenInspectorComponent, "fb-dynamic-screen-inspector", never, {}, {}, never, never, true, never>;
6076
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicScreenInspectorComponent, "fb-dynamic-screen-inspector", never, { "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5457
6077
  }
5458
6078
 
6079
+ /**
6080
+ * La risorsa su cui aprire il pannello, quando ci arriva dalla ricerca. `token` esiste per far
6081
+ * ripartire l'effetto anche se si scegliesse due volte la stessa risorsa: senza, il secondo
6082
+ * arrivo non cambierebbe l'input e non accadrebbe niente.
6083
+ */
6084
+ interface FlowResourceTarget {
6085
+ collection: FlowResourceCollection;
6086
+ index: number;
6087
+ token: number;
6088
+ }
5459
6089
  interface ResourceKindDescriptor {
5460
6090
  collection: FlowResourceCollection;
5461
6091
  label: string;
@@ -5469,6 +6099,8 @@ declare class ResourcePanelComponent {
5469
6099
  private readonly dictionaries;
5470
6100
  private readonly catalog;
5471
6101
  readonly closed: _angular_core.OutputEmitterRef<void>;
6102
+ /** Dove aprire il pannello: e' l'arrivo della ricerca su una risorsa. */
6103
+ readonly target: _angular_core.InputSignal<FlowResourceTarget | null>;
5472
6104
  readonly kinds: ResourceKindDescriptor[];
5473
6105
  readonly dataTypes: _angular_core.Signal<_esfaenza_flow_builder.FlowDataTypeEntry[]>;
5474
6106
  readonly sortOrders: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
@@ -5477,6 +6109,12 @@ declare class ResourcePanelComponent {
5477
6109
  readonly activeCollection: _angular_core.WritableSignal<"variables" | "constants" | "formulas" | "textTemplates" | "choices" | "dynamicChoiceSets" | "stages">;
5478
6110
  /** L'indice della risorsa in modifica, o `null`. */
5479
6111
  readonly editingIndex: _angular_core.WritableSignal<number | null>;
6112
+ /**
6113
+ * La risorsa per cui e' stata chiesta la rimozione ma che risulta **usata**: si conferma.
6114
+ * La chiave e' `collection:index`, non la risorsa, perche' l'oggetto viene ricostruito a ogni
6115
+ * ricalcolo del documento.
6116
+ */
6117
+ readonly pendingRemoval: _angular_core.WritableSignal<string | null>;
5480
6118
  constructor();
5481
6119
  readonly enumOptions: _angular_core.Signal<FlowCatalogEntry[]>;
5482
6120
  readonly activeKind: _angular_core.Signal<ResourceKindDescriptor>;
@@ -5487,6 +6125,27 @@ declare class ResourcePanelComponent {
5487
6125
  /** Nome valido e libero nello spazio dei nomi condiviso con i node (§3.3, §13.5). */
5488
6126
  nameError(reference: FlowResourceRef): string | null;
5489
6127
  add(): void;
6128
+ /**
6129
+ * Quante volte la risorsa e' **usata** nel documento.
6130
+ *
6131
+ * Serve dove il danno di una cancellazione non si vede: togliere una variabile non fa sparire
6132
+ * nessun arco dal canvas, e i riferimenti orfani restano lì fino alla validazione successiva.
6133
+ * A zero occorrenze e' l'informazione opposta, ed e' quella che serve su un flow grande: dice
6134
+ * quali delle venti variabili sono morte.
6135
+ *
6136
+ * Il conteggio comprende le **formule**, che citano le risorse per nome dentro l'espressione:
6137
+ * senza, tre formule che leggono una variabile la direbbero «non usata».
6138
+ */
6139
+ usesOf(reference: FlowResourceRef): number;
6140
+ private keyOf;
6141
+ isPendingRemoval(reference: FlowResourceRef): boolean;
6142
+ /**
6143
+ * Il primo clic su «×» di una risorsa usata **chiede**, non cancella: e' l'unico punto
6144
+ * dell'editor in cui un gesto rompe silenziosamente qualcosa che sta altrove. Su una risorsa
6145
+ * che nessuno usa si cancella subito — l'annulla dell'editor basta come rete.
6146
+ */
6147
+ requestRemove(reference: FlowResourceRef): void;
6148
+ cancelRemove(): void;
5490
6149
  remove(reference: FlowResourceRef): void;
5491
6150
  rename(reference: FlowResourceRef, name: string): void;
5492
6151
  setField(reference: FlowResourceRef, field: string, value: unknown): void;
@@ -5555,14 +6214,98 @@ declare class ResourcePanelComponent {
5555
6214
  value(reference: FlowResourceRef): FlowValue | undefined;
5556
6215
  close(): void;
5557
6216
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ResourcePanelComponent, never>;
5558
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResourcePanelComponent, "fb-resource-panel", never, {}, { "closed": "closed"; }, never, never, true, never>;
6217
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResourcePanelComponent, "fb-resource-panel", never, { "target": { "alias": "target"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
6218
+ }
6219
+
6220
+ /** Il riquadro su cui aprire il pannello. `token` fa ripartire l'effetto sulla stessa scelta. */
6221
+ interface FlowGroupTarget {
6222
+ name: string;
6223
+ token: number;
6224
+ }
6225
+ declare class GroupPanelComponent {
6226
+ private readonly store;
6227
+ readonly isEditable: _angular_core.InputSignal<boolean>;
6228
+ /** La selezione del canvas: e' cio' che si puo' aggiungere a un riquadro con un comando. */
6229
+ readonly selectedNodeNames: _angular_core.InputSignal<readonly string[]>;
6230
+ /** Il riquadro da aprire, quando ci si arriva dal canvas o dal pannello dei problemi. */
6231
+ readonly target: _angular_core.InputSignal<FlowGroupTarget | null>;
6232
+ readonly closed: _angular_core.OutputEmitterRef<void>;
6233
+ /** «Nuovo riquadro»: lo crea il builder, che conosce le geometrie dei node. */
6234
+ readonly createRequested: _angular_core.OutputEmitterRef<void>;
6235
+ /** Un elemento del riquadro: si porta la vista su di lui. */
6236
+ readonly memberFocused: _angular_core.OutputEmitterRef<string>;
6237
+ readonly colors: readonly {
6238
+ value: string;
6239
+ label: string;
6240
+ }[];
6241
+ readonly groups: _angular_core.Signal<_esfaenza_flow_builder.FlowGroupRef[]>;
6242
+ /** Quale riquadro e' aperto, per nome: l'indice cambia quando se ne cancella uno prima. */
6243
+ readonly openName: _angular_core.WritableSignal<string | null>;
6244
+ constructor();
6245
+ toggleOpen(name: string): void;
6246
+ isOpen(name: string): boolean;
6247
+ /** I nomi dei node esistenti: distingue un membro vivo da uno rimasto indietro (regola 3). */
6248
+ private readonly knownNodes;
6249
+ isKnownMember(member: string): boolean;
6250
+ membersOf(index: number): string[];
6251
+ staleMembersOf(index: number): string[];
6252
+ /** La geometria e' calcolata sui membri: si dice, perche' spiega perche' la cornice si muove. */
6253
+ isAutoSized(index: number): boolean;
6254
+ /**
6255
+ * Il doppione si cerca **fra i riquadri** e in nessun altro posto (§3.6, regola 1). E' l'unico
6256
+ * controllo di nome dell'editor che non guarda `usedNames`: un riquadro non e' referenziabile,
6257
+ * quindi non c'e' niente da rendere ambiguo.
6258
+ */
6259
+ nameProblem(index: number): string | null;
6260
+ setName(index: number, value: string): void;
6261
+ setLabel(index: number, value: string): void;
6262
+ setDescription(index: number, value: string): void;
6263
+ setColor(index: number, value: string): void;
6264
+ setCollapsed(index: number, value: boolean): void;
6265
+ /** Aggiunge gli elementi selezionati sul canvas: e' il gesto per i riquadri sovrapposti. */
6266
+ addSelection(index: number): void;
6267
+ removeMember(index: number, member: string): void;
6268
+ /** Toglie i membri che non esistono piu': la ripulitura e' dell'editor (§3.6, regola 3). */
6269
+ cleanStale(index: number): void;
6270
+ /** Il riquadro va via, il contenuto resta: e' un commento, non un contenitore. */
6271
+ remove(index: number): void;
6272
+ canAddSelection(): boolean;
6273
+ /** Il colore scritto nel documento non e' fra quelli proposti: si mostra, non si corregge. */
6274
+ isColorOutOfList(index: number): boolean;
6275
+ colorOf(index: number): string;
6276
+ close(): void;
6277
+ create(): void;
6278
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GroupPanelComponent, never>;
6279
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GroupPanelComponent, "fb-group-panel", never, { "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "selectedNodeNames": { "alias": "selectedNodeNames"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "createRequested": "createRequested"; "memberFocused": "memberFocused"; }, never, never, true, never>;
5559
6280
  }
5560
6281
 
5561
6282
  type SeverityFilter = 'all' | FlowSeverityBucket;
5562
6283
  declare class ProblemsPanelComponent {
5563
6284
  private readonly validation;
5564
- /** Chiede di selezionare l'elemento: `$start` per i rilievi sul documento. */
5565
- readonly elementFocused: _angular_core.OutputEmitterRef<string>;
6285
+ /** Serve solo a **leggere** i nomi: il `path` di un rilievo arriva a indici (vedi `pathLabel`). */
6286
+ private readonly store;
6287
+ /**
6288
+ * Chiede di **mostrare** il rilievo: selezionare l'elemento e portarlo al centro, senza
6289
+ * aprirne il form. E' cio' che fa il clic su una riga, ed e' deliberato: guardare l'elenco dei
6290
+ * problemi vuol dire scorrerlo, e un form che si apre a ogni riga copre il grafo che si sta
6291
+ * leggendo. `$start` per i rilievi che riguardano il documento.
6292
+ */
6293
+ readonly elementFocused: _angular_core.OutputEmitterRef<{
6294
+ name: string;
6295
+ path?: string | null;
6296
+ }>;
6297
+ /**
6298
+ * Chiede di **aprire** il form sul rilievo, che e' il gesto successivo: si guarda dov'e', poi
6299
+ * si va a correggerlo. Sta su un bottone suo (e sul doppio clic) invece di essere il
6300
+ * comportamento della riga.
6301
+ *
6302
+ * Il `path` viaggia col nome perche' e' cio' che permette di selezionare il **campo** dentro
6303
+ * uno screen dinamico, e non solo la schermata che lo contiene.
6304
+ */
6305
+ readonly elementOpened: _angular_core.OutputEmitterRef<{
6306
+ name: string;
6307
+ path?: string | null;
6308
+ }>;
5566
6309
  readonly closed: _angular_core.OutputEmitterRef<void>;
5567
6310
  readonly filter: _angular_core.WritableSignal<SeverityFilter>;
5568
6311
  readonly isRunning: _angular_core.Signal<boolean>;
@@ -5587,10 +6330,23 @@ declare class ProblemsPanelComponent {
5587
6330
  bucketOf(issue: FlowValidationIssue): FlowSeverityBucket;
5588
6331
  iconText(bucket: FlowSeverityBucket): string;
5589
6332
  labelText(bucket: FlowSeverityBucket): string;
6333
+ /** Clic sulla riga: porta la vista sull'elemento e lo seleziona. Non apre niente. */
5590
6334
  focus(issue: FlowValidationIssue): void;
6335
+ /** Il bottone «✎» e il doppio clic: apre il form, con il campo selezionato quando c'e'. */
6336
+ open(issue: FlowValidationIssue, event?: Event): void;
6337
+ /**
6338
+ * Il `path` del rilievo, scritto in modo che si possa **seguire**.
6339
+ *
6340
+ * Il backend lo manda come percorso di campi (§7), e sugli screen dinamici lo manda spesso a
6341
+ * **indici**: `fields[1].fields[1].fields[0]` e' esatto e inutile, perche' per arrivarci si
6342
+ * devono contare i figli a mano. I nomi li ha il documento, quindi tradurre e' compito
6343
+ * dell'editor. Quando il path non nomina campi — o nomina campi che non esistono piu' — si
6344
+ * mostra tale e quale: inventare un'etichetta sarebbe peggio.
6345
+ */
6346
+ pathLabel(issue: FlowValidationIssue): string;
5591
6347
  close(): void;
5592
6348
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProblemsPanelComponent, never>;
5593
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProblemsPanelComponent, "fb-problems-panel", never, {}, { "elementFocused": "elementFocused"; "closed": "closed"; }, never, never, true, never>;
6349
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProblemsPanelComponent, "fb-problems-panel", never, {}, { "elementFocused": "elementFocused"; "elementOpened": "elementOpened"; "closed": "closed"; }, never, never, true, never>;
5594
6350
  }
5595
6351
 
5596
6352
  declare class VersionPanelComponent {
@@ -5714,7 +6470,47 @@ declare class DebugPanelComponent {
5714
6470
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DebugPanelComponent, "fb-debug-panel", never, { "outcome": { "alias": "outcome"; "required": false; "isSignal": true; }; "wasDebug": { "alias": "wasDebug"; "required": false; "isSignal": true; }; "isRunning": { "alias": "isRunning"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "elementFocused": "elementFocused"; "cleared": "cleared"; }, never, never, true, never>;
5715
6471
  }
5716
6472
 
5717
- type SidePanel = 'inspector' | 'resources' | 'versions' | 'debug';
6473
+ /**
6474
+ * Trovare qualcosa **nel documento** per nome.
6475
+ *
6476
+ * Non esisteva: l'unica casella di ricerca dell'editor filtra i **tipi** della palette, cioe'
6477
+ * cio' che si puo' aggiungere, non cio' che c'e'. Su un flow da dieci elementi non serve — si
6478
+ * vedono tutti; su uno da quaranta, distribuiti su settemila pixel di canvas, cercare
6479
+ * `CreaRigaEle` a occhio e' l'operazione piu' frequente e la piu' lenta.
6480
+ *
6481
+ * Cosa entra nell'indice: tutto cio' che ha un **nome nello spazio dei nomi comune** (§3.3) —
6482
+ * elementi, risorse, e le tre cose che non sono ne' l'uno ne' l'altro ma il cui nome e' la
6483
+ * radice di un riferimento: step di orchestrazione, campi di screen dinamico e screen action.
6484
+ * E' lo stesso insieme di `usedNames` dello store, e non e' una coincidenza: se un nome puo'
6485
+ * comparire in un riferimento, deve essere cercabile.
6486
+ *
6487
+ * Quello che l'indice **non** fa e' cercare nei valori: un'espressione che cita `Totale` non
6488
+ * rende `Totale` un risultato per «Totale», perche' il risultato sarebbe l'espressione. Il
6489
+ * «dove e' usato» e' un'altra domanda, e la risposta sta in `flow-references.ts`.
6490
+ */
6491
+
6492
+ /** Cosa e' stato trovato: decide dove porta il clic. */
6493
+ type FlowSearchKind = 'node' | 'field' | 'action' | 'step' | 'resource';
6494
+ interface FlowSearchHit {
6495
+ kind: FlowSearchKind;
6496
+ /** Il nome nello spazio dei nomi comune: e' cio' su cui si cerca. */
6497
+ name: string;
6498
+ /** Testo mostrato in grande: l'etichetta se c'e', il nome altrimenti. */
6499
+ label: string;
6500
+ /** Riga secondaria: il tipo, e per cio' che sta dentro un elemento l'elemento che lo contiene. */
6501
+ detail: string;
6502
+ /** L'elemento su cui portare l'utente. Per una risorsa e' assente. */
6503
+ elementName?: string;
6504
+ /** Il percorso del campo dentro lo screen dinamico, quando `kind` e' `field`. */
6505
+ fieldPath?: FlowScreenFieldPath;
6506
+ /** Dove sta la risorsa, quando `kind` e' `resource`. */
6507
+ resource?: {
6508
+ collection: string;
6509
+ index: number;
6510
+ };
6511
+ }
6512
+
6513
+ type SidePanel = 'inspector' | 'resources' | 'groups' | 'versions' | 'debug';
5718
6514
  interface Notice {
5719
6515
  kind: 'info' | 'error';
5720
6516
  message: string;
@@ -5758,6 +6554,30 @@ declare class FlowBuilderComponent {
5758
6554
  readonly notice: _angular_core.WritableSignal<Notice | null>;
5759
6555
  readonly outline: _angular_core.WritableSignal<FlowOutline | null>;
5760
6556
  readonly isLoading: _angular_core.WritableSignal<boolean>;
6557
+ /** Il canvas: serve per portare la vista su un elemento (ricerca, clic su un problema). */
6558
+ private readonly canvas;
6559
+ private readonly search;
6560
+ /**
6561
+ * Il campo di screen dinamico da selezionare quando il form si apre.
6562
+ *
6563
+ * Esiste perche' «apri l'elemento» non basta: un rilievo su `fields[1].fields[1].fields[0]`
6564
+ * porta su una schermata da venti campi, e senza la selezione il campo va ritrovato contando
6565
+ * i figli a mano. Si azzera appena il form lo consuma: e' un'istruzione per un'apertura, non
6566
+ * uno stato dell'editor.
6567
+ */
6568
+ readonly pendingFieldPath: _angular_core.WritableSignal<FlowScreenFieldPath | null>;
6569
+ /** La risorsa su cui aprire il pannello: e' l'arrivo della ricerca su una risorsa. */
6570
+ readonly resourceTarget: _angular_core.WritableSignal<FlowResourceTarget | null>;
6571
+ private resourceReveals;
6572
+ /**
6573
+ * Il riquadro corrente (§3.6). E' una selezione **separata** da `selectedName`: un riquadro
6574
+ * non e' un elemento — non si copia, non si duplica, non si valida come tale — e tenerlo nella
6575
+ * stessa variabile avrebbe fatto puntare l'inspector a un nome che nelle collection dei node
6576
+ * non esiste.
6577
+ */
6578
+ readonly selectedGroupName: _angular_core.WritableSignal<string | null>;
6579
+ readonly groupTarget: _angular_core.WritableSignal<FlowGroupTarget | null>;
6580
+ private groupReveals;
5761
6581
  /** Il documento e' cambiato: usato per riscadenzare validazione e outline. */
5762
6582
  private lastDocument?;
5763
6583
  private outlineTimer?;
@@ -5819,10 +6639,40 @@ declare class FlowBuilderComponent {
5819
6639
  onSelectionChange(names: string[]): void;
5820
6640
  /** Doppio click o bottone «✎» sul node: qui il dettaglio si apre. */
5821
6641
  onNodeOpened(name: string): void;
5822
- /** Porta l'utente sull'elemento **e** ne apre il form: e' l'ancora dei problemi (§7). */
5823
- focusElement(name: string): void;
6642
+ /**
6643
+ * **Mostra** il rilievo: seleziona l'elemento e lo porta al centro, senza aprire niente.
6644
+ *
6645
+ * E' il clic su una riga del pannello dei problemi, ed e' cio' che serve nel 90% dei casi:
6646
+ * l'elenco si scorre, e il primo bisogno e' capire **dove** sta la cosa segnalata. Aprire il
6647
+ * form a ogni riga copriva il grafo che si stava leggendo, e per tornare a guardarlo si doveva
6648
+ * chiudere una finestra per riga.
6649
+ *
6650
+ * Un riquadro (§3.6) si seleziona come tale: gli spazi dei nomi sono due, e l'elemento vince
6651
+ * sull'omonimia per la stessa ragione di {@link openIssueElement}.
6652
+ */
6653
+ revealIssueElement(event: string | {
6654
+ name: string;
6655
+ path?: string | null;
6656
+ }): void;
6657
+ /**
6658
+ * Porta l'utente sull'elemento **e** ne apre il form: e' il bottone «✎» di una riga dei
6659
+ * problemi, e il doppio clic sulla riga (§7).
6660
+ *
6661
+ * Il `path` del rilievo, quando nomina un campo di uno screen dinamico, diventa la selezione
6662
+ * dentro il form: e' la differenza fra «ti apro la schermata» e «ti apro il campo».
6663
+ */
6664
+ openIssueElement(event: string | {
6665
+ name: string;
6666
+ path?: string | null;
6667
+ }): void;
5824
6668
  /** Apre il dettaglio dell'elemento, nella dialog o nel pannello secondo la modalita'. */
5825
- openElement(name: string): void;
6669
+ openElement(name: string, fieldPath?: FlowScreenFieldPath | null): void;
6670
+ /**
6671
+ * L'arrivo della ricerca. Un elemento si apre; cio' che sta **dentro** un elemento apre
6672
+ * l'elemento che lo contiene (con il campo selezionato, quando e' un campo); una risorsa apre
6673
+ * il pannello delle risorse su di lei — non c'e' niente da inquadrare sul canvas.
6674
+ */
6675
+ onSearchPicked(hit: FlowSearchHit): void;
5826
6676
  /** Il comando della top bar: apre il dettaglio di cio' che e' selezionato. */
5827
6677
  openSelectedElement(): void;
5828
6678
  closeDialog(): void;
@@ -5832,16 +6682,36 @@ declare class FlowBuilderComponent {
5832
6682
  * sostituirlo con l'inspector farebbe sparire la traccia che si stava leggendo.
5833
6683
  */
5834
6684
  highlightElement(name: string): void;
5835
- /** Rilascio dalla palette: il punto di rilascio diventa `locationX`/`locationY` (§11). */
6685
+ /**
6686
+ * Rilascio dalla palette: il punto di rilascio diventa `locationX`/`locationY` (§11), a meno
6687
+ * che sotto il puntatore non ci fosse un **arco** — allora l'elemento si innesta in quel
6688
+ * percorso e la posizione la decide il piano di innesto.
6689
+ */
5836
6690
  onElementDropped(event: {
5837
6691
  type: FlowElementType;
5838
6692
  variant?: string;
5839
6693
  x: number;
5840
6694
  y: number;
6695
+ edge?: {
6696
+ from: string;
6697
+ outletKey: string;
6698
+ to: string;
6699
+ };
5841
6700
  }): void;
5842
6701
  /** Click sulla palette: l'elemento si posiziona in una zona libera. */
5843
6702
  onElementPicked(pick: FlowPalettePick): void;
5844
6703
  private createElement;
6704
+ /**
6705
+ * Innesta l'elemento appena costruito **in mezzo** all'arco su cui e' stato rilasciato.
6706
+ *
6707
+ * Il piano lo calcola `core/flow-insert.ts` e lo applica lo store in una mutazione sola. Qui
6708
+ * restano le due cose che sono dell'interfaccia: la posizione scritta nel node — il punto del
6709
+ * rilascio non conta piu', conta il varco fra i due elementi — e il messaggio nel caso in cui
6710
+ * l'elemento **non abbia uscite** (un Custom Error interrompe l'esecuzione, §5.12): il
6711
+ * percorso a valle resta scollegato, e va detto subito invece di lasciarlo scoprire dal
6712
+ * pannello dei problemi.
6713
+ */
6714
+ private insertOnEdge;
5845
6715
  onRemoveNode(name: string): void;
5846
6716
  /**
5847
6717
  * La selezione dell'editor e' il **nome** dell'elemento: dopo una rinomina il nome vecchio
@@ -5849,6 +6719,23 @@ declare class FlowBuilderComponent {
5849
6719
  */
5850
6720
  onNodeRenamed(newName: string): void;
5851
6721
  onDuplicateNode(name: string): void;
6722
+ /**
6723
+ * Crea un riquadro **attorno alla selezione**, che e' il gesto per cui serve: si selezionano
6724
+ * gli elementi che vanno insieme e si dice «questi sono una cosa». Senza selezione nasce un
6725
+ * riquadro vuoto sotto il flow, da riempire trascinandoci dentro gli elementi.
6726
+ *
6727
+ * La geometria si scrive sempre, anche se il contratto ammette lo 0 («calcolala sui membri»,
6728
+ * §3.6): un riquadro nato con una misura si puo' spostare e ridimensionare subito, mentre uno
6729
+ * auto-dimensionato segue i membri e la maniglia non farebbe niente.
6730
+ */
6731
+ createGroup(): void;
6732
+ /** Apre il pannello dei riquadri su uno di loro. Il token lo riapre anche sulla stessa scelta. */
6733
+ private revealGroup;
6734
+ onGroupSelected(name: string): void;
6735
+ /** Il riquadro va via, gli elementi che conteneva restano: e' documentazione (§3.6). */
6736
+ onGroupRemoved(name: string): void;
6737
+ /** Un membro del riquadro: si porta la vista su di lui, senza aprirne il form. */
6738
+ focusMember(name: string): void;
5852
6739
  /** La selezione del canvas per intero; `selectedName` resta l'elemento «corrente». */
5853
6740
  readonly selectedNames: _angular_core.WritableSignal<string[]>;
5854
6741
  /** L'anteprima dell'incolla, mentre la finestra e' aperta. */
@@ -5989,5 +6876,5 @@ declare class SelectValueDirective implements AfterViewChecked {
5989
6876
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5990
6877
  }
5991
6878
 
5992
- 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 };
5993
- 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, FlowFormulaFunction, FlowFormulaFunctionParameter, 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 };
6879
+ 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_GROUP_COLORS, 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, GROUP_HEADER_HEIGHT, GROUP_MIN_HEIGHT, GROUP_MIN_WIDTH, GROUP_PADDING, GroupPanelComponent, 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, boundsAround, buildClipboardPayload, canvasGroupId, canvasNodeId, checkConditionLogic, checkFlowName, choiceSetSourceOf, declaredChoiceSetSources, describeFieldPath, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, enumChoiceSetFieldType, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, groupColorClass, groupRect, hasAutoSize, innerNamesOf, insertField, isClipboardPayload, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isUnknownEnumChoiceSetField, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, membersInside, moveCondition, moveField, navigatePath, otherSourceFieldsOf, outletByKey, outletsOf, parseCanvasGroupId, parseCanvasNodeId, parseFieldPath, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, planPaste, recomputeMembers, referenceRoot, referencedRootsOf, remapConditionLogic, removeCondition, removeField, resolvePath, rewriteReferences, sameMembers, samePath, screenActionNames, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, typeOfCollection, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
6880
+ export type { ChoiceSetSource, FieldAssignmentHolder, FilterFieldOption, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasGroup, 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, FlowFormulaFunction, FlowFormulaFunctionParameter, FlowFormulaIssue, FlowFormulaUsage, FlowFormulaValidationRequest, FlowFormulaValidationResult, FlowGlobalVariableEntry, FlowGroup, FlowGroupRef, FlowGroupTarget, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineGroup, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPalettePick, FlowPastePlan, FlowPasteRename, FlowPasteResource, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowRect, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResourceTarget, 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 };