@vectoriox/iox-builder 8.0.0 → 9.0.0

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 i0 from '@angular/core';
2
- import { ComponentRef, Type, ChangeDetectorRef, OnInit, AfterViewInit, OnChanges, OnDestroy, EventEmitter, ElementRef, ApplicationRef, SimpleChanges, ViewContainerRef, Injector, EnvironmentInjector, InjectionToken, TemplateRef, AfterContentInit, QueryList } from '@angular/core';
2
+ import { ComponentRef, Type, InjectionToken, ChangeDetectorRef, OnInit, AfterViewInit, OnChanges, OnDestroy, EventEmitter, ElementRef, ApplicationRef, SimpleChanges, ViewContainerRef, Injector, EnvironmentInjector, TemplateRef, AfterContentInit, QueryList } from '@angular/core';
3
3
  import * as i30 from '@vectoriox/iox-ui';
4
- import { ResponsiveOverrides, RelativeSourceSpec, Breakpoint, PageStyleSettings, FormRenderState, AdoptContext, DesignTokenLike, DesignMode, ComponentInstanceRegistryService, DataSourceEndpoints, PalettePreset, syncNodeDesignClasses } from '@vectoriox/iox-ui';
4
+ import { ResponsiveOverrides, RelativeSourceSpec, Breakpoint, PageStyleSettings, FormRenderState, AdoptContext, DesignTokenLike, DesignMode, ComponentInstanceRegistryService, DataSourceEndpoints, LinkType, PalettePreset, syncNodeDesignClasses } from '@vectoriox/iox-ui';
5
5
  export { ComponentInstanceRegistryService, IoxContextSlot, PageStyleSettings, SetContextParams, VIRTUAL_TRAIT_KEYS, composeVirtualTraits } from '@vectoriox/iox-ui';
6
6
  import * as rxjs from 'rxjs';
7
7
  import { Subject, Subscription, BehaviorSubject, Observable } from 'rxjs';
@@ -19,6 +19,7 @@ import * as i26 from 'primeng/inputtext';
19
19
  import * as i27 from 'primeng/select';
20
20
  import * as i28 from 'primeng/tooltip';
21
21
  import * as i29 from 'primeng/dialog';
22
+ import { FormPresetDef } from '@vectoriox/iox-ui/forms-core';
22
23
 
23
24
  declare enum StyleCategory {
24
25
  Layout = "Layout",
@@ -921,6 +922,79 @@ declare class ComponentRegistryService {
921
922
  static ɵprov: i0.ɵɵInjectableDeclaration<ComponentRegistryService>;
922
923
  }
923
924
 
925
+ /**
926
+ * Canvas data preview used to come from host-provided content services (IOX_CONTENT_SERVICE /
927
+ * IOX_SHOP_SERVICE), whose `getContent(contentType, orgId)` hit the ADMIN resources endpoint and
928
+ * accepted no filters — so the Repeater/Slider ignored every data-source filter. Data now flows
929
+ * through BuilderDataSourceService + the shared planDataSource, configured with
930
+ * IOX_DATA_SOURCE_ENDPOINTS. Those tokens are gone; do not reintroduce a fetch that bypasses it.
931
+ */
932
+ /**
933
+ * True for nodes rendered on the EDITING canvas — provided by `BuilderComponent` at component level,
934
+ * so it reaches every `[ioxRender]` under `<app-builder>` and nothing else (Preview renders the same
935
+ * directive outside it). It answers "is this the editor?" — the canvas-only "Add image" label hangs off
936
+ * it. `IS_PREVIEW` answers the other question, "is this a preview/live render?" (links navigate,
937
+ * sliders run live), and is provided ONLY by Preview (component level) and the engine; neither token
938
+ * implies the other — a design sampler, for one, is neither.
939
+ */
940
+ declare const IOX_BUILDER_CANVAS: InjectionToken<boolean>;
941
+ /**
942
+ * Translates the builder library's OWN chrome.
943
+ *
944
+ * The library cannot depend on ngx-translate — that is the host app's choice — but its toolbar was
945
+ * hardcoded English, which shows through as untranslated controls in a Hebrew/RTL admin. This token
946
+ * lets the host route those strings through its own i18n while the library keeps working standalone:
947
+ * unprovided, `defaultBuilderLabels` returns the English text, so nothing ever renders a raw key.
948
+ *
949
+ * Keys are namespaced `builder.chrome.*` and listed in `BUILDER_CHROME_EN` below — that object is
950
+ * the contract. A host providing this token should add those keys to its own bundles.
951
+ */
952
+ declare const IOX_BUILDER_LABELS: InjectionToken<BuilderLabelResolver>;
953
+ type BuilderLabelResolver = (key: string, fallback: string) => string;
954
+ /** Standalone behaviour: the English text the library ships with. */
955
+ declare const defaultBuilderLabels: BuilderLabelResolver;
956
+ /**
957
+ * Every user-visible string in the builder's own chrome, so a host can copy this into its bundles
958
+ * in one go rather than discovering keys one missing label at a time.
959
+ */
960
+ declare const BUILDER_CHROME_EN: Readonly<Record<string, string>>;
961
+ declare const CANVAS_EMPTY_IMAGE_LABEL_KEY = "builder.chrome.addImage";
962
+ declare const CANVAS_EMPTY_IMAGE_LABEL_EN: string;
963
+ /**
964
+ * Marks an element the builder draws on the canvas that the live site never has — drop placeholders,
965
+ * repeat badges, the empty slider hint. A page thumbnail is a picture of the SITE, so its capture
966
+ * leaves every marked element out.
967
+ */
968
+ declare const EDITOR_CHROME_ATTRIBUTE = "data-iox-chrome";
969
+
970
+ /**
971
+ * What may NOT be placed where — the ONE rule every insert path asks (drag, click-to-insert, quick-add,
972
+ * the Form presets, paste, duplicate). Everything not refused here is accepted: any container-capable
973
+ * node takes any child, a Form included.
974
+ */
975
+ declare enum InsertRefusal {
976
+ /** A form inside a form — fields belong to their NEAREST form (forms plan D1), and HTML forbids it. */
977
+ NestedForm = "nestedForm",
978
+ /** A Success / Error block is part of its form's state machine; it is never placed on its own. */
979
+ StateBlockAlone = "stateBlockAlone"
980
+ }
981
+ declare const FORM_STATE_BLOCK_TYPES: ReadonlySet<string>;
982
+ /** The builder-chrome label that says each refusal on screen (English in `BUILDER_CHROME_EN`). */
983
+ declare const INSERT_REFUSAL_LABEL_KEYS: Readonly<Record<InsertRefusal, string>>;
984
+ /** The refusal in the host's language (the library's English when no host resolver is provided). */
985
+ declare function insertRefusalLabel(reason: InsertRefusal, labels?: BuilderLabelResolver): string;
986
+ interface TypedNode {
987
+ type?: string;
988
+ children?: TypedNode[] | null;
989
+ }
990
+ /**
991
+ * Why `node` may not be inserted under `ancestors` (outermost first, the new parent last; empty = the page),
992
+ * or null when it may. `node` is the whole subtree being placed — a Container holding a Form is refused
993
+ * inside a Form just as a bare Form is. Reordering a node inside its CURRENT parent is not an insert and
994
+ * never asks.
995
+ */
996
+ declare function insertRefusal(node: TypedNode | null | undefined, ancestors: readonly TypedNode[]): InsertRefusal | null;
997
+
924
998
  /**
925
999
  * SymbolRegistryService — in-memory store for org-level symbols.
926
1000
  *
@@ -960,11 +1034,33 @@ interface IoxDropEvent {
960
1034
  targetId: string;
961
1035
  insertIndex: number;
962
1036
  }
1037
+ /** An insert the builder refused — `message` is the on-screen sentence, in the host's language. */
1038
+ interface InsertRefusedEvent {
1039
+ reason: InsertRefusal;
1040
+ message: string;
1041
+ }
1042
+ /** The node a drop target names: canvas-root ancestors outermost first, the dropzone's own node last. */
1043
+ type AncestorNode = Pick<ComponentNode, 'type' | 'children'>;
1044
+ /** On the drop-target overlay while the target refuses the dragged payload (styled by the host). */
1045
+ declare const DROP_REFUSED_CLASS = "iox-drop-target-overlay--refused";
963
1046
  declare class DragEngineService {
964
1047
  private registry;
965
1048
  private symbolRegistry;
966
1049
  private overlayService;
967
- constructor(registry: ComponentRegistryService, symbolRegistry: SymbolRegistryService, overlayService: OverlayService);
1050
+ private readonly labels;
1051
+ constructor(registry: ComponentRegistryService, symbolRegistry: SymbolRegistryService, overlayService: OverlayService, labels?: BuilderLabelResolver | null);
1052
+ /** Every insert the builder refused, for the host to say on screen (a toast). */
1053
+ readonly insertRefused$: Subject<InsertRefusedEvent>;
1054
+ /**
1055
+ * The ONE acceptance check for every insert path: null when `data` (a panel payload or a node) may go
1056
+ * under `ancestors`; otherwise the refusal, already announced on `insertRefused$`.
1057
+ */
1058
+ refuseInsert(data: unknown, ancestors: readonly AncestorNode[]): InsertRefusal | null;
1059
+ /** The node a payload WOULD insert, without building it: a type string, a block/symbol, or a node. */
1060
+ private payloadNode;
1061
+ /** The nodes a dropzone sits in, outermost first, its own node last — read from the DOM, which is
1062
+ * where a dropzone id lives. Empty for the page itself. */
1063
+ dropzoneAncestors(id: string): AncestorNode[];
968
1064
  handleDrop(children: ComponentNode[], event: IoxDropEvent, dropListId: string, cdr: ChangeDetectorRef, afterDrop?: () => void): void;
969
1065
  /**
970
1066
  * Turn a components-panel payload into a fresh ComponentNode: a built-in type string via the
@@ -981,7 +1077,7 @@ declare class DragEngineService {
981
1077
  * `dropComplete$` exactly like a drop, so the builder selects the new node and records one undo
982
1078
  * step through the same path. Returns the inserted node, or null if the payload was unusable.
983
1079
  */
984
- insertPayload(children: ComponentNode[], index: number, data: unknown): ComponentNode | null;
1080
+ insertPayload(children: ComponentNode[], index: number, data: unknown, ancestors?: readonly AncestorNode[]): ComponentNode | null;
985
1081
  /** True when `children` is a registered drop zone's array — i.e. a real container that can hold
986
1082
  * children. Click-to-insert uses the same test a drag does, so it can't insert where a drop
987
1083
  * couldn't. */
@@ -1032,8 +1128,11 @@ declare class DragEngineService {
1032
1128
  setScale(scale: number): void;
1033
1129
  private _dropzoneRectCache;
1034
1130
  private _snapshotRects;
1035
- private readonly ROOT_ESCAPE_PX;
1036
1131
  private _rootEscapeActiveFor;
1132
+ /** The root container whose inner region held the previous sample. */
1133
+ private _innerRootId;
1134
+ /** Why the current target would refuse the dragged payload; null = it accepts. */
1135
+ private _targetRefusal;
1037
1136
  private _getEl;
1038
1137
  registerDropzone(id: string, el: HTMLElement, data: any[], cdr: ChangeDetectorRef, dropCb: (e: IoxDropEvent) => void, postDrop?: () => void): void;
1039
1138
  unregisterDropzone(id: string, el: HTMLElement): void;
@@ -1060,6 +1159,17 @@ declare class DragEngineService {
1060
1159
  private _ghostFollowStep;
1061
1160
  private _stopGhostFollow;
1062
1161
  private _updateDeepTarget;
1162
+ /** Near a ROOT container's edge, after moving there from its inner region, the drop goes to the page. */
1163
+ private _applyRootEscape;
1164
+ /** The ROOT-level dropzone (a direct child zone of the page) that holds dropzone `id`, or null when it
1165
+ * is not on the page canvas (the global-elements layer). */
1166
+ private _rootContainerOf;
1167
+ /** Why the dragged payload may not land in `targetId` (null = it may). Reordering inside the source
1168
+ * container is not an insert. */
1169
+ private _refusalAt;
1170
+ /** The node a dropzone element belongs to — the element itself or the nearest registered ancestor
1171
+ * (a LinkedContainer, a Dialog, a Repeater or a slide registers an INNER element as its zone). */
1172
+ private _ownerNode;
1063
1173
  /** Call on every canvas scroll tick to keep the fixed-position drop-target
1064
1174
  * overlay aligned with the container element that moved in the viewport. */
1065
1175
  refreshDragOverlays(): void;
@@ -1067,18 +1177,11 @@ declare class DragEngineService {
1067
1177
  private _removeTargetOverlay;
1068
1178
  /** Name the drop target and the slot: "into Card grid · position 2 of 4". */
1069
1179
  private _updateTargetChip;
1070
- private _isRootContainer;
1071
- /**
1072
- * Returns true if the dropzone with `childId` is a DOM descendant of the
1073
- * dropzone with `parentId`. Used to decide whether the cursor was already
1074
- * "inside" a root section before triggering root-escape.
1075
- */
1076
- private _isDescendantDropzone;
1077
1180
  private _updateIndicator;
1078
1181
  private _positionIndicator;
1079
1182
  private _removeIndicator;
1080
1183
  calcInsertIndex(containerId: string): number;
1081
- static ɵfac: i0.ɵɵFactoryDeclaration<DragEngineService, never>;
1184
+ static ɵfac: i0.ɵɵFactoryDeclaration<DragEngineService, [null, null, null, { optional: true; }]>;
1082
1185
  static ɵprov: i0.ɵɵInjectableDeclaration<DragEngineService>;
1083
1186
  }
1084
1187
 
@@ -2077,6 +2180,8 @@ declare class BuilderComponent implements OnInit, AfterViewInit, OnChanges, OnDe
2077
2180
  clientHeight: number;
2078
2181
  scrollPercentage?: number;
2079
2182
  }): void;
2183
+ /** The nodes a sibling of `node` sits under — `node`'s ancestors, outermost first (empty at a root). */
2184
+ private siblingAncestors;
2080
2185
  private findNodeInTree;
2081
2186
  /** Immediate parent of `target` within `children`, or null at a root. Derives from the
2082
2187
  * shared `nodeAncestorPath` walk in `utils/node-path.util.ts` — one tree recursion to
@@ -2386,51 +2491,6 @@ declare class OverlayComponent implements OnInit, OnDestroy {
2386
2491
  static ɵcmp: i0.ɵɵComponentDeclaration<OverlayComponent, "app-overlay", never, {}, { "toolbarAction": "toolbarAction"; }, never, never, false, never>;
2387
2492
  }
2388
2493
 
2389
- /**
2390
- * Canvas data preview used to come from host-provided content services (IOX_CONTENT_SERVICE /
2391
- * IOX_SHOP_SERVICE), whose `getContent(contentType, orgId)` hit the ADMIN resources endpoint and
2392
- * accepted no filters — so the Repeater/Slider ignored every data-source filter. Data now flows
2393
- * through BuilderDataSourceService + the shared planDataSource, configured with
2394
- * IOX_DATA_SOURCE_ENDPOINTS. Those tokens are gone; do not reintroduce a fetch that bypasses it.
2395
- */
2396
- /**
2397
- * True for nodes rendered on the EDITING canvas — provided by `BuilderComponent` at component level,
2398
- * so it reaches every `[ioxRender]` under `<app-builder>` and nothing else (Preview renders the same
2399
- * directive outside it). It answers "is this the editor?" — the canvas-only "Add image" label hangs off
2400
- * it. `IS_PREVIEW` answers the other question, "is this a preview/live render?" (links navigate,
2401
- * sliders run live), and is provided ONLY by Preview (component level) and the engine; neither token
2402
- * implies the other — a design sampler, for one, is neither.
2403
- */
2404
- declare const IOX_BUILDER_CANVAS: InjectionToken<boolean>;
2405
- /**
2406
- * Translates the builder library's OWN chrome.
2407
- *
2408
- * The library cannot depend on ngx-translate — that is the host app's choice — but its toolbar was
2409
- * hardcoded English, which shows through as untranslated controls in a Hebrew/RTL admin. This token
2410
- * lets the host route those strings through its own i18n while the library keeps working standalone:
2411
- * unprovided, `defaultBuilderLabels` returns the English text, so nothing ever renders a raw key.
2412
- *
2413
- * Keys are namespaced `builder.chrome.*` and listed in `BUILDER_CHROME_EN` below — that object is
2414
- * the contract. A host providing this token should add those keys to its own bundles.
2415
- */
2416
- declare const IOX_BUILDER_LABELS: InjectionToken<BuilderLabelResolver>;
2417
- type BuilderLabelResolver = (key: string, fallback: string) => string;
2418
- /** Standalone behaviour: the English text the library ships with. */
2419
- declare const defaultBuilderLabels: BuilderLabelResolver;
2420
- /**
2421
- * Every user-visible string in the builder's own chrome, so a host can copy this into its bundles
2422
- * in one go rather than discovering keys one missing label at a time.
2423
- */
2424
- declare const BUILDER_CHROME_EN: Readonly<Record<string, string>>;
2425
- declare const CANVAS_EMPTY_IMAGE_LABEL_KEY = "builder.chrome.addImage";
2426
- declare const CANVAS_EMPTY_IMAGE_LABEL_EN: string;
2427
- /**
2428
- * Marks an element the builder draws on the canvas that the live site never has — drop placeholders,
2429
- * repeat badges, the empty slider hint. A page thumbnail is a picture of the SITE, so its capture
2430
- * leaves every marked element out.
2431
- */
2432
- declare const EDITOR_CHROME_ATTRIBUTE = "data-iox-chrome";
2433
-
2434
2494
  declare class ToolbarComponent {
2435
2495
  private readonly labels;
2436
2496
  activeMode: BuilderMode;
@@ -2745,7 +2805,10 @@ declare class BuilderButtonBlockComponent implements OnInit, OnDestroy {
2745
2805
  [key: string]: any;
2746
2806
  };
2747
2807
  tag: 'button' | 'a';
2808
+ linkType: LinkType;
2748
2809
  href: string;
2810
+ /** A page link shows its route as authored, as the canvas Link does (the engine resolves it). */
2811
+ pageRoute: string;
2749
2812
  target: '_self' | '_blank';
2750
2813
  type: 'button' | 'submit' | 'reset';
2751
2814
  nodeId: string;
@@ -2754,11 +2817,12 @@ declare class BuilderButtonBlockComponent implements OnInit, OnDestroy {
2754
2817
  childMouseEnter: EventEmitter<any>;
2755
2818
  childMouseLeave: EventEmitter<void>;
2756
2819
  constructor(elRef: ElementRef<HTMLElement>, dragEngine: DragEngineService, cdr: ChangeDetectorRef);
2820
+ get resolvedHref(): string | null;
2757
2821
  ngOnInit(): void;
2758
2822
  ngOnDestroy(): void;
2759
2823
  onDrop(event: IoxDropEvent): void;
2760
2824
  static ɵfac: i0.ɵɵFactoryDeclaration<BuilderButtonBlockComponent, never>;
2761
- static ɵcmp: i0.ɵɵComponentDeclaration<BuilderButtonBlockComponent, "button[iox-button-block],a[iox-button-block]", never, { "children": { "alias": "children"; "required": false; }; "style": { "alias": "style"; "required": false; }; "tag": { "alias": "tag"; "required": false; }; "href": { "alias": "href"; "required": false; }; "target": { "alias": "target"; "required": false; }; "type": { "alias": "type"; "required": false; }; "nodeId": { "alias": "nodeId"; "required": false; }; "dropListId": { "alias": "dropListId"; "required": false; }; }, { "childClick": "childClick"; "childMouseEnter": "childMouseEnter"; "childMouseLeave": "childMouseLeave"; }, never, never, false, never>;
2825
+ static ɵcmp: i0.ɵɵComponentDeclaration<BuilderButtonBlockComponent, "button[iox-button-block],a[iox-button-block]", never, { "children": { "alias": "children"; "required": false; }; "style": { "alias": "style"; "required": false; }; "tag": { "alias": "tag"; "required": false; }; "linkType": { "alias": "linkType"; "required": false; }; "href": { "alias": "href"; "required": false; }; "pageRoute": { "alias": "pageRoute"; "required": false; }; "target": { "alias": "target"; "required": false; }; "type": { "alias": "type"; "required": false; }; "nodeId": { "alias": "nodeId"; "required": false; }; "dropListId": { "alias": "dropListId"; "required": false; }; }, { "childClick": "childClick"; "childMouseEnter": "childMouseEnter"; "childMouseLeave": "childMouseLeave"; }, never, never, false, never>;
2762
2826
  }
2763
2827
 
2764
2828
  /**
@@ -2952,6 +3016,7 @@ interface TreeNode {
2952
3016
  declare class LayerTreeComponent implements OnInit, OnDestroy {
2953
3017
  private registry;
2954
3018
  private overlayService;
3019
+ private dragEngine;
2955
3020
  layout: ComponentNode[];
2956
3021
  globalElements: ComponentNode[];
2957
3022
  nodeSelect: EventEmitter<ComponentNode>;
@@ -2973,7 +3038,7 @@ declare class LayerTreeComponent implements OnInit, OnDestroy {
2973
3038
  /** Last-seen structural signature — used by ngDoCheck to skip no-op rebuilds. */
2974
3039
  private _layoutSig;
2975
3040
  private _globalSig;
2976
- constructor(registry: ComponentRegistryService, overlayService: OverlayService);
3041
+ constructor(registry: ComponentRegistryService, overlayService: OverlayService, dragEngine: DragEngineService);
2977
3042
  ngOnInit(): void;
2978
3043
  ngOnDestroy(): void;
2979
3044
  ngDoCheck(): void;
@@ -3258,33 +3323,10 @@ declare function matchesControlSearch(name: string, label: string, term: string)
3258
3323
  * author's first action is editing copy, not wiring plumbing. Nothing here is a new component type:
3259
3324
  * what lands on the canvas is ordinary nodes, editable and take-apart-able afterwards.
3260
3325
  *
3261
- * Mirrors `layout-presets.ts` deliberately: same shape, same build-from-configs approach, so there
3262
- * is one way to express "a preset" in this codebase rather than two.
3326
+ * The presets themselves (`FORM_PRESETS`) live in `@vectoriox/iox-ui/forms-core` since W1.1 — the
3327
+ * site composer stamps the SAME contact preset into a generated page. This file only builds one onto
3328
+ * the canvas through the registry. Mirrors `layout-presets.ts`: same build-from-configs approach.
3263
3329
  */
3264
- interface FormPresetField {
3265
- label: string;
3266
- control: string;
3267
- required?: boolean;
3268
- help?: string;
3269
- placeholder?: string;
3270
- /** Choices for select/radio, `value|Label` per line — the Field's `optionsText` trait. */
3271
- optionsText?: string;
3272
- rows?: number;
3273
- }
3274
- interface FormPresetDef {
3275
- id: string;
3276
- name: string;
3277
- icon: string;
3278
- /** One line in the panel: what it collects and where it goes. */
3279
- description: string;
3280
- /** The form's author-facing name, which the submissions inbox groups by. */
3281
- formName: string;
3282
- fields: FormPresetField[];
3283
- submitLabel: string;
3284
- successText: string;
3285
- errorText: string;
3286
- }
3287
- declare const FORM_PRESETS: readonly FormPresetDef[];
3288
3330
  /** How a config is produced. The caller owns the registry, so this file stays pure. */
3289
3331
  type CreateConfig = (type: string) => ComponentNode | null | undefined;
3290
3332
  /**
@@ -3398,6 +3440,43 @@ declare const FORM_TYPE = "Form";
3398
3440
  */
3399
3441
  declare function nearestFormNode(path: readonly ComponentNode[] | null | undefined): ComponentNode | null;
3400
3442
 
3443
+ /**
3444
+ * ROOT ESCAPE — near the top or bottom edge of a ROOT-level container the drop goes to the PAGE, between
3445
+ * root containers, instead of inside the container. This file is the decision; DragEngineService only
3446
+ * measures and applies it.
3447
+ *
3448
+ * ⚠️ The bug this replaced (2026-10-19, "a Form cannot be inserted into a Section / Container / Linked
3449
+ * Container"): escape switched on when the pointer was in the edge band and the PREVIOUS target was the
3450
+ * same container — which is also true on the second sample after ENTERING through the band — and it only
3451
+ * switched off once the pointer LEFT the container. So approaching a root container from above or below
3452
+ * locked every drop inside it to the page, even at its centre; an empty (short) container was almost
3453
+ * always entered that way. Now escape needs a move OUTWARD — from the container's inner region to its
3454
+ * edge — and it ends as soon as the pointer is back in the inner region.
3455
+ */
3456
+ /** The edge band on a tall container, in screen px. */
3457
+ declare const ROOT_ESCAPE_PX = 14;
3458
+ declare enum RootZone {
3459
+ Outside = "outside",
3460
+ Edge = "edge",
3461
+ Inner = "inner"
3462
+ }
3463
+ /** The band shrinks on a short container (a quarter of its height), so its middle stays a drop target. */
3464
+ declare function rootEscapeBand(height: number): number;
3465
+ /** Where the pointer's y sits relative to a root container's vertical extent. */
3466
+ declare function rootZone(py: number, top: number, bottom: number): RootZone;
3467
+ interface RootEscapeMemory {
3468
+ /** The root container a drop is currently escaping, if any. */
3469
+ escapingFor: string | null;
3470
+ /** The root container whose INNER region held the previous sample, if any. */
3471
+ innerOf: string | null;
3472
+ }
3473
+ /**
3474
+ * Whether this sample escapes `rootId` to the page: the pointer is on its edge band AND it either was
3475
+ * already escaping it or has just moved out to the edge from its inner region. Entering from outside
3476
+ * through the band never escapes.
3477
+ */
3478
+ declare function escapesRoot(rootId: string, zone: RootZone, memory: RootEscapeMemory): boolean;
3479
+
3401
3480
  /**
3402
3481
  * The text on the drop indicator's chip — "into Card grid · position 2 of 3" (B2).
3403
3482
  *
@@ -3576,5 +3655,5 @@ declare class TextBlockComponentConfig extends ComponentConfig {
3576
3655
  constructor();
3577
3656
  }
3578
3657
 
3579
- export { ACTION_TYPE_OPTIONS, AuditCode, AuditPanelComponent, AuditSeverity, BODY_CRUMB_LABEL, BREAKPOINT_PRESENTATION, BUILDER_CANVAS_CONTAINER, BUILDER_CHROME_EN, BUILDER_FONT_LINK_ATTR, BUILDER_TOKEN_SCOPE_CLASS, BackgroundGroupStyleConfig, BorderGroupStyleConfig, BreadcrumbBarComponent, BuilderButtonBlockComponent, BuilderButtonComponentConfig, BuilderClipboardService, BuilderComponent, BuilderContainerComponent, BuilderContainerComponentConfig, BuilderDataSourceService, BuilderDialogComponent, BuilderDividerComponentConfig, BuilderHeadingComponentConfig, BuilderHistoryService, BuilderIconComponentConfig, BuilderImageComponentConfig, BuilderLinkComponentConfig, BuilderLinkedContainerComponent, BuilderLinkedContainerConfig, BuilderListComponentConfig, BuilderListItemComponentConfig, BuilderMode, BuilderRepeaterComponent, BuilderSpacerComponentConfig, ButtonBlockComponentConfig, CANVAS_EMPTY_IMAGE_LABEL_EN, CANVAS_EMPTY_IMAGE_LABEL_KEY, CANVAS_ROOT_RESET_CSS, CardComponentConfig, ChildLayoutGroupStyleConfig, ComponentConfig, ComponentRegistryService, DEFAULT_ESSENTIAL_TRAITS, DRAG_HANDLE_ATTR, DataSourceRegistryService, DataSourceType, DialogComponentConfig, DimensionsGroupStyleConfig, DragEngineService, EASING_OPTIONS, EDITOR_CHROME_ATTRIBUTE, ESSENTIAL_TRAITS_BY_TYPE, EffectsGroupStyleConfig, FIELD_KIND_PRESETS, FIELD_PARTS, FORM_PRESETS, FORM_TYPE, FieldComponentConfig, FieldGroupComponentConfig, FormComponentConfig, FormErrorComponentConfig, FormStateService, FormSuccessComponentConfig, GalleryConfig, GroupStyleConfig, INTERACTION_STATES, INVERSE_ACTION, IOX_BUILDER_CANVAS, IOX_BUILDER_LABELS, IOX_DATA_SOURCE_ENDPOINTS, InteractionEngineService, InteractionPresetRegistryService, IoxBuilderModule, IoxDraggableDirective, IoxDropzoneDirective, LAYOUT_PRESETS, LayerTreeComponent, LayoutGroupStyleConfig, ListGroupStyleConfig, NodeAction, OverlayComponent, OverlayService, PALETTE_PRESET_DEFS, PanelChildComponent, PanelComponent, PanelEventService, PanelEventTypes, PanelTypes, PositionGroupStyleConfig, PresetRegistryService, RELATIONAL_STATES, RELATIONAL_STATE_BASE, ROUTE_ANIMATION_OPTIONS, RenderDirective, RepeaterComponentConfig, SCREEN_WIDTH_OPTIONS, STRUCTURAL_STATES, SUPPORTED_STATES, SectionComponent, SectionComponentConfig, SizeGroupStyleConfig, SliderContainerComponent, SliderContainerConfig, SliderSlideComponent, SliderSlideConfig, SpacingGroupStyleConfig, StyleCategory, StyleRegistryService, TraitConfig as StyleTraitConfig, SubmitButtonComponentConfig, SymbolRegistryService, TARGETED_STATES, TARGETED_STATE_BASE, TRIGGER_OPTIONS, TextBlockComponentConfig, ToolbarAction, ToolbarComponent, TraitConfig, TraitInputType, TypographyGroupStyleConfig, UNITS_ALL, UNITS_DEG, UNITS_FIXED, UNITS_NO_VW, VALIDATION_STATES, VALIDATION_STATE_CLASS, ViewportService, ZOOM_OPTIONS, arrayItemSchemaFields, arraySchemaFields, auditNodes, buildConsentPreset, buildElementStyleSpecimen, buildFieldKindPreset, buildFlavorSpecimen, buildFormPreset, buildFullStyleTraits, buildLayoutPreset, buildPalettePreset, buildPresetStyleTraits, canFluidise, canvasEmptyImageLabel, collapseColumnsProps, columnCountOf, defaultBuilderLabels, defaultPageSettings, dropTargetLabel, essentialTraitsFor, findNodeLocation, findParentOf, flattenSchemaFields, fluidiseProps, generateNodeId, isHiddenAt, isSpecimen, markSpecimen, matchesControlSearch, nearestFormNode, nodeAncestorPath, nodeAncestorPathInEither, reorderProps, resolveInsertTarget, resolveTraitControllerType, resolveTraitOptions, setStyleTrait, setTrait, stackChildrenProps, summarise, syncEmptyImagePlaceholder, syncNodeDesign, textNode, visibilityProps, wrapNode };
3580
- export type { AuditFinding, AuditNode, BreakpointPresentation, BuilderClipboard, BuilderLabelResolver, ComponentEventDef, ComponentMethodDef, ComponentNode, ComponentTrait, ConsentPreset, CreateConfig, Crumb, DesignSpecimenCopy, DragPayload, DsFilterByQueryParam, DsFilterByRouteParam, ElementState, FieldKindDef, FormPresetDef, FormPresetField, FormStateSnapshot, HistoryChange, HistoryEntry, HistoryStep, InsertTarget, InteractionAction, InteractionActionType, InteractionPreset, InteractionTrigger, IoxBinding, IoxDataSource, IoxDropEvent, IoxInteraction, IoxSymbol, LayoutPresetChildStyles, LayoutPresetDef, NodeRef, OverlayBoxModel, OverlayBoxSpacing, OverlayEntry, PageRouteAnimationSettings, PageScrollSettings, PageSettings, PalettePresetDef, PanelEvent, QuadSizeSegment, RouteAnimationPreset, ScreenWidthOption, SelectionBadge, StyleMap, StylePart, StylePreset, StyleTrait, StyleTraitGroup, TraitOptionMap, TraitSelectOption, TraitShowCondition, TreePathNode, UpsertTokensOptions, ViewportState, ZoomOption };
3658
+ export { ACTION_TYPE_OPTIONS, AuditCode, AuditPanelComponent, AuditSeverity, BODY_CRUMB_LABEL, BREAKPOINT_PRESENTATION, BUILDER_CANVAS_CONTAINER, BUILDER_CHROME_EN, BUILDER_FONT_LINK_ATTR, BUILDER_TOKEN_SCOPE_CLASS, BackgroundGroupStyleConfig, BorderGroupStyleConfig, BreadcrumbBarComponent, BuilderButtonBlockComponent, BuilderButtonComponentConfig, BuilderClipboardService, BuilderComponent, BuilderContainerComponent, BuilderContainerComponentConfig, BuilderDataSourceService, BuilderDialogComponent, BuilderDividerComponentConfig, BuilderHeadingComponentConfig, BuilderHistoryService, BuilderIconComponentConfig, BuilderImageComponentConfig, BuilderLinkComponentConfig, BuilderLinkedContainerComponent, BuilderLinkedContainerConfig, BuilderListComponentConfig, BuilderListItemComponentConfig, BuilderMode, BuilderRepeaterComponent, BuilderSpacerComponentConfig, ButtonBlockComponentConfig, CANVAS_EMPTY_IMAGE_LABEL_EN, CANVAS_EMPTY_IMAGE_LABEL_KEY, CANVAS_ROOT_RESET_CSS, CardComponentConfig, ChildLayoutGroupStyleConfig, ComponentConfig, ComponentRegistryService, DEFAULT_ESSENTIAL_TRAITS, DRAG_HANDLE_ATTR, DROP_REFUSED_CLASS, DataSourceRegistryService, DataSourceType, DialogComponentConfig, DimensionsGroupStyleConfig, DragEngineService, EASING_OPTIONS, EDITOR_CHROME_ATTRIBUTE, ESSENTIAL_TRAITS_BY_TYPE, EffectsGroupStyleConfig, FIELD_KIND_PRESETS, FIELD_PARTS, FORM_STATE_BLOCK_TYPES, FORM_TYPE, FieldComponentConfig, FieldGroupComponentConfig, FormComponentConfig, FormErrorComponentConfig, FormStateService, FormSuccessComponentConfig, GalleryConfig, GroupStyleConfig, INSERT_REFUSAL_LABEL_KEYS, INTERACTION_STATES, INVERSE_ACTION, IOX_BUILDER_CANVAS, IOX_BUILDER_LABELS, IOX_DATA_SOURCE_ENDPOINTS, InsertRefusal, InteractionEngineService, InteractionPresetRegistryService, IoxBuilderModule, IoxDraggableDirective, IoxDropzoneDirective, LAYOUT_PRESETS, LayerTreeComponent, LayoutGroupStyleConfig, ListGroupStyleConfig, NodeAction, OverlayComponent, OverlayService, PALETTE_PRESET_DEFS, PanelChildComponent, PanelComponent, PanelEventService, PanelEventTypes, PanelTypes, PositionGroupStyleConfig, PresetRegistryService, RELATIONAL_STATES, RELATIONAL_STATE_BASE, ROOT_ESCAPE_PX, ROUTE_ANIMATION_OPTIONS, RenderDirective, RepeaterComponentConfig, RootZone, SCREEN_WIDTH_OPTIONS, STRUCTURAL_STATES, SUPPORTED_STATES, SectionComponent, SectionComponentConfig, SizeGroupStyleConfig, SliderContainerComponent, SliderContainerConfig, SliderSlideComponent, SliderSlideConfig, SpacingGroupStyleConfig, StyleCategory, StyleRegistryService, TraitConfig as StyleTraitConfig, SubmitButtonComponentConfig, SymbolRegistryService, TARGETED_STATES, TARGETED_STATE_BASE, TRIGGER_OPTIONS, TextBlockComponentConfig, ToolbarAction, ToolbarComponent, TraitConfig, TraitInputType, TypographyGroupStyleConfig, UNITS_ALL, UNITS_DEG, UNITS_FIXED, UNITS_NO_VW, VALIDATION_STATES, VALIDATION_STATE_CLASS, ViewportService, ZOOM_OPTIONS, arrayItemSchemaFields, arraySchemaFields, auditNodes, buildConsentPreset, buildElementStyleSpecimen, buildFieldKindPreset, buildFlavorSpecimen, buildFormPreset, buildFullStyleTraits, buildLayoutPreset, buildPalettePreset, buildPresetStyleTraits, canFluidise, canvasEmptyImageLabel, collapseColumnsProps, columnCountOf, defaultBuilderLabels, defaultPageSettings, dropTargetLabel, escapesRoot, essentialTraitsFor, findNodeLocation, findParentOf, flattenSchemaFields, fluidiseProps, generateNodeId, insertRefusal, insertRefusalLabel, isHiddenAt, isSpecimen, markSpecimen, matchesControlSearch, nearestFormNode, nodeAncestorPath, nodeAncestorPathInEither, reorderProps, resolveInsertTarget, resolveTraitControllerType, resolveTraitOptions, rootEscapeBand, rootZone, setStyleTrait, setTrait, stackChildrenProps, summarise, syncEmptyImagePlaceholder, syncNodeDesign, textNode, visibilityProps, wrapNode };
3659
+ export type { AuditFinding, AuditNode, BreakpointPresentation, BuilderClipboard, BuilderLabelResolver, ComponentEventDef, ComponentMethodDef, ComponentNode, ComponentTrait, ConsentPreset, CreateConfig, Crumb, DesignSpecimenCopy, DragPayload, DsFilterByQueryParam, DsFilterByRouteParam, ElementState, FieldKindDef, FormStateSnapshot, HistoryChange, HistoryEntry, HistoryStep, InsertRefusedEvent, InsertTarget, InteractionAction, InteractionActionType, InteractionPreset, InteractionTrigger, IoxBinding, IoxDataSource, IoxDropEvent, IoxInteraction, IoxSymbol, LayoutPresetChildStyles, LayoutPresetDef, NodeRef, OverlayBoxModel, OverlayBoxSpacing, OverlayEntry, PageRouteAnimationSettings, PageScrollSettings, PageSettings, PalettePresetDef, PanelEvent, QuadSizeSegment, RootEscapeMemory, RouteAnimationPreset, ScreenWidthOption, SelectionBadge, StyleMap, StylePart, StylePreset, StyleTrait, StyleTraitGroup, TraitOptionMap, TraitSelectOption, TraitShowCondition, TreePathNode, UpsertTokensOptions, ViewportState, ZoomOption };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vectoriox/iox-builder",
3
- "version": "8.0.0",
3
+ "version": "9.0.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=20.0.0",
6
6
  "@angular/core": ">=20.0.0",