@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/fesm2022/vectoriox-iox-builder.mjs +286 -159
- package/fesm2022/vectoriox-iox-builder.mjs.map +1 -1
- package/index.d.ts +167 -88
- package/package.json +1 -1
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
*
|
|
3262
|
-
*
|
|
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,
|
|
3580
|
-
export type { AuditFinding, AuditNode, BreakpointPresentation, BuilderClipboard, BuilderLabelResolver, ComponentEventDef, ComponentMethodDef, ComponentNode, ComponentTrait, ConsentPreset, CreateConfig, Crumb, DesignSpecimenCopy, DragPayload, DsFilterByQueryParam, DsFilterByRouteParam, ElementState, FieldKindDef,
|
|
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 };
|