@vectoriox/iox-builder 5.1.1 → 5.3.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.
@@ -16,7 +16,7 @@ import { SelectModule } from 'primeng/select';
16
16
  import { TooltipModule } from 'primeng/tooltip';
17
17
  import { DialogModule } from 'primeng/dialog';
18
18
  import * as i1 from '@vectoriox/iox-ui';
19
- import { VALIDATION_STATES as VALIDATION_STATES$1, VALIDATION_STATE_CLASS as VALIDATION_STATE_CLASS$1, DEFAULT_WIDTH_BY_TYPE, COLOR_SCHEME_TRAIT, COLOR_SCHEMES, ColorScheme, Breakpoint, BREAKPOINTS, countOverrides, setOverride, defaultElementStyleFor, applyElementStyle, stripSuppressedProps, DeclarationContext, buildPartSelector, planResponsiveRules, resolveStyleProps, buildTargetedStateSelector, statePseudoClass, compileTokenCssBlocks, compileDeclarations, wrapInBreakpointQuery, BreakpointQueryKind, breakpointDef, breakpointForWidth, FormRenderState, safeSetInput, ContextStore, ComponentInstanceRegistryService, isActionEnabled, isContextAction, contextActionEffect, resolveContextValue, emptyImageSrc, composeVirtualTraits, withDefaultHoverTransition, stateNamesIn, partClassName, syncNodeDesignClasses, resolveInputs, setInputOverride, collectContextSlotKeys, withContextSlots, compilePageStyle, nodeUsesContext, resolveBoundValue, IS_PREVIEW, planDataSource, dataSourcePlanToRequest, normalizeCollectionResult, resolveRepeaterItems, getByPath, computeRelative, IoxPageModule, PALETTE_PRESETS, PART_CLASS_NAMES } from '@vectoriox/iox-ui';
19
+ import { VALIDATION_STATES as VALIDATION_STATES$1, VALIDATION_STATE_CLASS as VALIDATION_STATE_CLASS$1, DEFAULT_WIDTH_BY_TYPE, COLOR_SCHEME_TRAIT, COLOR_SCHEMES, ColorScheme, Breakpoint, BREAKPOINTS, countOverrides, setOverride, defaultElementStyleFor, applyElementStyle, stripSuppressedProps, DeclarationContext, buildPartSelector, planResponsiveRules, resolveStyleProps, buildTargetedStateSelector, statePseudoClass, compileTokenCssBlocks, fontsForTokens, GOOGLE_FONTS_FILE_ORIGIN, googleFontHref, compileDeclarations, wrapInBreakpointQuery, BreakpointQueryKind, breakpointDef, breakpointForWidth, FormRenderState, safeSetInput, ContextStore, ComponentInstanceRegistryService, isActionEnabled, isContextAction, contextActionEffect, resolveContextValue, declaredInputNames, emptyImagePlaceholder, syncNodeDesignClasses, composeVirtualTraits, withDefaultHoverTransition, stateNamesIn, partClassName, resolveInputs, setInputOverride, collectContextSlotKeys, withContextSlots, compilePageStyle, nodeUsesContext, resolveBoundValue, IS_PREVIEW, planDataSource, dataSourcePlanToRequest, normalizeCollectionResult, resolveRepeaterItems, getByPath, computeRelative, IoxPageModule, PALETTE_PRESETS, PART_CLASS_NAMES } from '@vectoriox/iox-ui';
20
20
  export { ComponentInstanceRegistryService, VIRTUAL_TRAIT_KEYS, composeVirtualTraits } from '@vectoriox/iox-ui';
21
21
  import Lenis from 'lenis';
22
22
  import { Subject, BehaviorSubject, of, forkJoin } from 'rxjs';
@@ -1558,8 +1558,10 @@ function buildLayoutPreset(def, createNode) {
1558
1558
  /**
1559
1559
  * True for nodes rendered on the EDITING canvas — provided by `BuilderComponent` at component level,
1560
1560
  * so it reaches every `[ioxRender]` under `<app-builder>` and nothing else (Preview renders the same
1561
- * directive outside it). Not `IS_PREVIEW`: the admin provides that one from an eagerly imported module,
1562
- * so it reads true everywhere, the canvas included.
1561
+ * directive outside it). It answers "is this the editor?" — the canvas-only "Add image" label hangs off
1562
+ * it. `IS_PREVIEW` answers the other question, "is this a preview/live render?" (links navigate,
1563
+ * sliders run live), and is provided ONLY by Preview (component level) and the engine; neither token
1564
+ * implies the other — a design sampler, for one, is neither.
1563
1565
  */
1564
1566
  const IOX_BUILDER_CANVAS = new InjectionToken('IOX_BUILDER_CANVAS');
1565
1567
  /** Optional font manager. Provide from the host app to populate the fontFamily dropdown. */
@@ -1602,6 +1604,14 @@ const BUILDER_CHROME_EN = Object.freeze({
1602
1604
  'builder.chrome.preview': 'Preview',
1603
1605
  'builder.chrome.addImage': 'Add image',
1604
1606
  });
1607
+ const CANVAS_EMPTY_IMAGE_LABEL_KEY = 'builder.chrome.addImage';
1608
+ const CANVAS_EMPTY_IMAGE_LABEL_EN = BUILDER_CHROME_EN[CANVAS_EMPTY_IMAGE_LABEL_KEY];
1609
+ /**
1610
+ * Marks an element the builder draws on the canvas that the live site never has — drop placeholders,
1611
+ * repeat badges, the empty slider hint. A page thumbnail is a picture of the SITE, so its capture
1612
+ * leaves every marked element out.
1613
+ */
1614
+ const EDITOR_CHROME_ATTRIBUTE = 'data-iox-chrome';
1605
1615
 
1606
1616
  class ComponentRegistryService {
1607
1617
  constructor() {
@@ -1883,6 +1893,8 @@ const BUILDER_CANVAS_CONTAINER = 'iox-canvas';
1883
1893
  * registry — the canvas frame, the global-elements overlay, preview, specimens — wears this class.
1884
1894
  */
1885
1895
  const BUILDER_TOKEN_SCOPE_CLASS = 'iox-token-scope';
1896
+ /** Marks the Google font `<link>`s the canvas adds to `<head>` (one per family, design-system DS4). */
1897
+ const BUILDER_FONT_LINK_ATTR = 'data-iox-font';
1886
1898
  /**
1887
1899
  * StyleRegistryService — manages a single <style> tag for the builder canvas.
1888
1900
  *
@@ -1923,6 +1935,8 @@ class StyleRegistryService {
1923
1935
  * positioning, an Icon's line-height) from EVERY rule of that node, whoever upserts it. */
1924
1936
  this.nodeTypes = new Map();
1925
1937
  this.tokenCss = { base: '', dark: '' };
1938
+ this.tokenRows = [];
1939
+ this.tokenMode = 'auto';
1926
1940
  this.styleEl = null;
1927
1941
  this._flushPending = false;
1928
1942
  }
@@ -2179,10 +2193,21 @@ class StyleRegistryService {
2179
2193
  * block, LAST. It used to be a hand-written copy that emitted variables and dark only.
2180
2194
  * Pass the full row set every time (an empty list clears).
2181
2195
  */
2182
- upsertTokens(tokens) {
2183
- this.tokenCss = compileTokenCssBlocks(tokens, { scope: `.${BUILDER_TOKEN_SCOPE_CLASS}` });
2196
+ upsertTokens(tokens, opts = {}) {
2197
+ if (opts.mode)
2198
+ this.tokenMode = opts.mode;
2199
+ this.tokenRows = [...(tokens ?? [])];
2200
+ this.tokenCss = compileTokenCssBlocks(tokens, {
2201
+ scope: `.${BUILDER_TOKEN_SCOPE_CLASS}`,
2202
+ mode: this.tokenMode,
2203
+ // A missing org row must compute UNSET on the canvas, as it does on the live site — never
2204
+ // the admin's same-named :root chrome token inherited from above the frame (DS4).
2205
+ isolate: true,
2206
+ });
2184
2207
  this.flush();
2185
2208
  }
2209
+ /** The colour mode the canvas compiles in. */
2210
+ get mode() { return this.tokenMode; }
2186
2211
  remove(nodeId) {
2187
2212
  if (!nodeId)
2188
2213
  return;
@@ -2210,11 +2235,46 @@ class StyleRegistryService {
2210
2235
  this.stateScopes.clear();
2211
2236
  this.nodeTypes.clear();
2212
2237
  this.tokenCss = { base: '', dark: '' };
2238
+ this.tokenRows = [];
2213
2239
  if (this.styleEl) {
2214
2240
  this.styleEl.remove();
2215
2241
  this.styleEl = null;
2216
2242
  }
2217
2243
  }
2244
+ /**
2245
+ * The Google families the org's font tokens name — the SAME catalog and URL the SSR engine links
2246
+ * (design-core `fontsForTokens` / `googleFontHref`), one `<link>` per family. They only declare
2247
+ * @font-face, and only the canvas (`.iox-token-scope`) reads the font tokens, so the admin keeps
2248
+ * Poppins. Links stay for the session: a trial that switches back costs no refetch.
2249
+ */
2250
+ loadTokenFonts(nodeCss) {
2251
+ const head = this.styleEl?.ownerDocument?.head;
2252
+ if (!head)
2253
+ return;
2254
+ const ids = fontsForTokens(this.tokenRows, { usedCss: nodeCss });
2255
+ if (!ids.length)
2256
+ return;
2257
+ const doc = head.ownerDocument;
2258
+ if (!head.querySelector(`link[rel="preconnect"][${BUILDER_FONT_LINK_ATTR}]`)) {
2259
+ const pre = doc.createElement('link');
2260
+ pre.rel = 'preconnect';
2261
+ pre.href = GOOGLE_FONTS_FILE_ORIGIN;
2262
+ pre.setAttribute('crossorigin', '');
2263
+ pre.setAttribute(BUILDER_FONT_LINK_ATTR, '');
2264
+ head.appendChild(pre);
2265
+ }
2266
+ const present = new Set(Array.from(head.querySelectorAll(`link[rel="stylesheet"][${BUILDER_FONT_LINK_ATTR}]`))
2267
+ .map(l => l.getAttribute(BUILDER_FONT_LINK_ATTR)));
2268
+ for (const id of ids) {
2269
+ if (present.has(id))
2270
+ continue;
2271
+ const link = doc.createElement('link');
2272
+ link.rel = 'stylesheet';
2273
+ link.href = googleFontHref(id);
2274
+ link.setAttribute(BUILDER_FONT_LINK_ATTR, id);
2275
+ head.appendChild(link);
2276
+ }
2277
+ }
2218
2278
  compile(className, styles, context = DeclarationContext.Base) {
2219
2279
  // Declaration compilation (kebab-case, viewport-unit rewrite, !important) lives in
2220
2280
  // the shared style-compiler so the SSR engine produces byte-identical output.
@@ -2242,7 +2302,9 @@ class StyleRegistryService {
2242
2302
  ? wrapInBreakpointQuery(BREAKPOINTS[i].id, Array.from(bucket.values()).join('\n'), BreakpointQueryKind.Container, BUILDER_CANVAS_CONTAINER)
2243
2303
  : '');
2244
2304
  // …and the token dark half LAST (the appended-last contract the engine also keeps).
2245
- this.styleEl.textContent = [this.tokenCss.base, ...rest, ...breakpoints, this.tokenCss.dark].filter(Boolean).join('\n');
2305
+ const nodeCss = [...rest, ...breakpoints].filter(Boolean).join('\n');
2306
+ this.styleEl.textContent = [this.tokenCss.base, nodeCss, this.tokenCss.dark].filter(Boolean).join('\n');
2307
+ this.loadTokenFonts(nodeCss);
2246
2308
  this.changes$.next();
2247
2309
  });
2248
2310
  }
@@ -4559,6 +4621,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
4559
4621
  args: [{ providedIn: 'root' }]
4560
4622
  }] });
4561
4623
 
4624
+ /** The input a component declares to receive its empty-image placeholder (the Image). */
4625
+ const EMPTY_SRC_INPUT = 'emptySrc';
4626
+ /** The editing canvas's "Add image" label, through the host's i18n. */
4627
+ function canvasEmptyImageLabel(labels) {
4628
+ return labels(CANVAS_EMPTY_IMAGE_LABEL_KEY, CANVAS_EMPTY_IMAGE_LABEL_EN);
4629
+ }
4630
+ /**
4631
+ * Push a node's empty-image placeholder (design-system DS3) to its rendered component — a no-op for
4632
+ * a component that declares no `emptySrc`. The placeholder depends on the MARKER only, never on the
4633
+ * source, so it is set once at render and again whenever the node's element style changes.
4634
+ */
4635
+ function syncEmptyImagePlaceholder(ref, node, emptyLabel) {
4636
+ if (!ref || !declaredInputNames(ref.componentType).has(EMPTY_SRC_INPUT))
4637
+ return;
4638
+ ref.setInput(EMPTY_SRC_INPUT, emptyImagePlaceholder(node, emptyLabel));
4639
+ }
4640
+ /**
4641
+ * Everything a node's element style / colour scheme decides on its rendered host, in ONE call: the
4642
+ * design classes (marker + scheme) and the empty-image placeholder. Every place that switches or
4643
+ * resets a node's style on the canvas calls this, so an adopted Image gains its placeholder at once
4644
+ * instead of after a reload (DS3 D2).
4645
+ */
4646
+ function syncNodeDesign(ref, node, emptyLabel) {
4647
+ syncNodeDesignClasses(ref?.location?.nativeElement ?? null, node);
4648
+ syncEmptyImagePlaceholder(ref, node, emptyLabel);
4649
+ }
4650
+
4562
4651
  // Module-level counter — unique drop-list ID per Section instance across the whole app session.
4563
4652
  let dropListCounter = 0;
4564
4653
  /**
@@ -4771,14 +4860,11 @@ class RenderDirective {
4771
4860
  // safeSetInput for every component that does not declare it.
4772
4861
  if (node.responsive)
4773
4862
  safeSetInput(componentRef, 'responsive', node.responsive);
4774
- // Empty images (DS3): a MARKED Image with no source shows the shared placeholder — the
4775
- // "Add image" label on the editing canvas, the bare blank anywhere else (Preview), which is
4776
- // what the live site shows. An unmarked Image gets null and renders exactly as before.
4777
- if (node.type === 'Image') {
4778
- const src = node.traits?.find(t => t.name === 'src')?.default;
4779
- const label = this.onCanvas ? this.labels('builder.chrome.addImage', 'Add image') : null;
4780
- safeSetInput(componentRef, 'emptySrc', emptyImageSrc(node, src, label));
4781
- }
4863
+ // Empty images (DS3): a MARKED Image shows the shared placeholder whenever its source is empty —
4864
+ // the "Add image" label on the editing canvas, the bare blank anywhere else (Preview), which is
4865
+ // what the live site shows. An unmarked Image gets null and renders exactly as before. Set from
4866
+ // the marker alone, so a source cleared later (Bindings) shows it with no re-render.
4867
+ syncEmptyImagePlaceholder(componentRef, node, this.onCanvas ? canvasEmptyImageLabel(this.labels) : null);
4782
4868
  // Build initial style map from styleTraits defaults.
4783
4869
  const initialStyle = {};
4784
4870
  if (node.styleTraits?.length) {
@@ -7619,7 +7705,7 @@ class SectionComponent {
7619
7705
  }
7620
7706
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: SectionComponent, deps: [{ token: i0.ElementRef }, { token: DragEngineService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
7621
7707
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: SectionComponent, isStandalone: false, selector: "section[iox-section]", inputs: { children: "children", style: "style", nodeId: "nodeId", dropListId: "dropListId" }, outputs: { childClick: "childClick", childMouseEnter: "childMouseEnter", childMouseLeave: "childMouseLeave" }, host: { properties: { "class": "'section-root iox-node-' + nodeId + (listOrientation === 'horizontal' ? ' is-horizontal' : '')" } }, ngImport: i0, template: `
7622
- <div *ngIf="!children.length" class="section-placeholder">
7708
+ <div *ngIf="!children.length" class="section-placeholder" data-iox-chrome>
7623
7709
  <i class="ph-thin ph-rows"></i>
7624
7710
  <span>Drop components here</span>
7625
7711
  </div>
@@ -7637,7 +7723,7 @@ class SectionComponent {
7637
7723
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: SectionComponent, decorators: [{
7638
7724
  type: Component,
7639
7725
  args: [{ selector: 'section[iox-section]', template: `
7640
- <div *ngIf="!children.length" class="section-placeholder">
7726
+ <div *ngIf="!children.length" class="section-placeholder" data-iox-chrome>
7641
7727
  <i class="ph-thin ph-rows"></i>
7642
7728
  <span>Drop components here</span>
7643
7729
  </div>
@@ -7725,7 +7811,7 @@ class BuilderContainerComponent {
7725
7811
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: BuilderContainerComponent, isStandalone: false, selector: "div[iox-container],section[iox-container],article[iox-container],header[iox-container],footer[iox-container],main[iox-container],nav[iox-container],ul[iox-container],ol[iox-container],li[iox-container],form[iox-container]", inputs: { children: "children", style: "style", nodeId: "nodeId", dropListId: "dropListId", htmlTag: "htmlTag", start: "start", reversed: "reversed", formClass: "formClass", formState: "formState" }, outputs: { childClick: "childClick", childMouseEnter: "childMouseEnter", childMouseLeave: "childMouseLeave" }, host: { properties: { "class": "'container-root iox-node-' + nodeId + (listOrientation === 'horizontal' ? ' is-horizontal' : '') + (formClass ? ' ' + formClass : '')", "attr.data-iox-state": "formClass === \"iox-form\" ? formState : null", "attr.start": "htmlTag === 'ol' && start !== 1 ? start : null", "attr.reversed": "htmlTag === 'ol' && reversed ? '' : null" } }, ngImport: i0, template: `
7726
7812
  <!-- Empty-container slot (B2). pointer-events:none, so a click falls through and SELECTS
7727
7813
  this container — and the components panel then inserts INSIDE it. -->
7728
- <div *ngIf="!children.length" class="container-placeholder">
7814
+ <div *ngIf="!children.length" class="container-placeholder" data-iox-chrome>
7729
7815
  <i class="ph-thin ph-plus"></i>
7730
7816
  <span>Click to select, then add an element</span>
7731
7817
  </div>
@@ -7748,7 +7834,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
7748
7834
  args: [{ selector: 'div[iox-container],section[iox-container],article[iox-container],header[iox-container],footer[iox-container],main[iox-container],nav[iox-container],ul[iox-container],ol[iox-container],li[iox-container],form[iox-container]', template: `
7749
7835
  <!-- Empty-container slot (B2). pointer-events:none, so a click falls through and SELECTS
7750
7836
  this container — and the components panel then inserts INSIDE it. -->
7751
- <div *ngIf="!children.length" class="container-placeholder">
7837
+ <div *ngIf="!children.length" class="container-placeholder" data-iox-chrome>
7752
7838
  <i class="ph-thin ph-plus"></i>
7753
7839
  <span>Click to select, then add an element</span>
7754
7840
  </div>
@@ -7832,6 +7918,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
7832
7918
  type: Output
7833
7919
  }] } });
7834
7920
 
7921
+ /** `click` covers plain and modified clicks; a middle click opens a tab through `auxclick` alone. */
7922
+ const NAVIGATING_CLICKS = ['click', 'auxclick'];
7835
7923
  class BuilderLinkedContainerComponent {
7836
7924
  constructor(dragEngine, cdr, elRef, isPreview) {
7837
7925
  this.dragEngine = dragEngine;
@@ -7853,12 +7941,14 @@ class BuilderLinkedContainerComponent {
7853
7941
  }
7854
7942
  ngOnInit() {
7855
7943
  if (!this.isPreview) {
7856
- this.elRef.nativeElement.addEventListener('click', this.capturePreventDefault, true);
7944
+ for (const type of NAVIGATING_CLICKS)
7945
+ this.elRef.nativeElement.addEventListener(type, this.capturePreventDefault, true);
7857
7946
  }
7858
7947
  }
7859
7948
  ngOnDestroy() {
7860
7949
  if (!this.isPreview) {
7861
- this.elRef.nativeElement.removeEventListener('click', this.capturePreventDefault, true);
7950
+ for (const type of NAVIGATING_CLICKS)
7951
+ this.elRef.nativeElement.removeEventListener(type, this.capturePreventDefault, true);
7862
7952
  }
7863
7953
  }
7864
7954
  get resolvedHref() {
@@ -7889,7 +7979,7 @@ class BuilderLinkedContainerComponent {
7889
7979
  [ioxDropzoneData]="children"
7890
7980
  (ioxDrop)="onDrop($event)">
7891
7981
 
7892
- <div *ngIf="!children.length" class="linked-container-placeholder">
7982
+ <div *ngIf="!children.length" class="linked-container-placeholder" data-iox-chrome>
7893
7983
  <i class="ph-thin ph-link"></i>
7894
7984
  <span>Drop components here</span>
7895
7985
  </div>
@@ -7918,7 +8008,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
7918
8008
  [ioxDropzoneData]="children"
7919
8009
  (ioxDrop)="onDrop($event)">
7920
8010
 
7921
- <div *ngIf="!children.length" class="linked-container-placeholder">
8011
+ <div *ngIf="!children.length" class="linked-container-placeholder" data-iox-chrome>
7922
8012
  <i class="ph-thin ph-link"></i>
7923
8013
  <span>Drop components here</span>
7924
8014
  </div>
@@ -8318,7 +8408,7 @@ class BuilderRepeaterComponent {
8318
8408
  <div class="repeater-wrapper" [class.has-children]="children.length > 0">
8319
8409
 
8320
8410
  <!-- HAS-CHILDREN: badge outside root, absolute over wrapper -->
8321
- <div *ngIf="children.length > 0" class="repeater-badge">
8411
+ <div *ngIf="children.length > 0" class="repeater-badge" data-iox-chrome>
8322
8412
  <ng-container *ngTemplateOutlet="badgeContent"></ng-container>
8323
8413
  </div>
8324
8414
 
@@ -8332,10 +8422,10 @@ class BuilderRepeaterComponent {
8332
8422
 
8333
8423
  <!-- EMPTY STATE: badge + placeholder inside root -->
8334
8424
  <ng-container *ngIf="!children.length">
8335
- <div class="repeater-badge">
8425
+ <div class="repeater-badge" data-iox-chrome>
8336
8426
  <ng-container *ngTemplateOutlet="badgeContent"></ng-container>
8337
8427
  </div>
8338
- <div class="repeater-placeholder">
8428
+ <div class="repeater-placeholder" data-iox-chrome>
8339
8429
  <i class="ph-thin ph-rows"></i>
8340
8430
  <span>Drop a component here as the item template</span>
8341
8431
  </div>
@@ -8400,7 +8490,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
8400
8490
  <div class="repeater-wrapper" [class.has-children]="children.length > 0">
8401
8491
 
8402
8492
  <!-- HAS-CHILDREN: badge outside root, absolute over wrapper -->
8403
- <div *ngIf="children.length > 0" class="repeater-badge">
8493
+ <div *ngIf="children.length > 0" class="repeater-badge" data-iox-chrome>
8404
8494
  <ng-container *ngTemplateOutlet="badgeContent"></ng-container>
8405
8495
  </div>
8406
8496
 
@@ -8414,10 +8504,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
8414
8504
 
8415
8505
  <!-- EMPTY STATE: badge + placeholder inside root -->
8416
8506
  <ng-container *ngIf="!children.length">
8417
- <div class="repeater-badge">
8507
+ <div class="repeater-badge" data-iox-chrome>
8418
8508
  <ng-container *ngTemplateOutlet="badgeContent"></ng-container>
8419
8509
  </div>
8420
- <div class="repeater-placeholder">
8510
+ <div class="repeater-placeholder" data-iox-chrome>
8421
8511
  <i class="ph-thin ph-rows"></i>
8422
8512
  <span>Drop a component here as the item template</span>
8423
8513
  </div>
@@ -8523,7 +8613,7 @@ class BuilderButtonBlockComponent {
8523
8613
  }
8524
8614
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: BuilderButtonBlockComponent, deps: [{ token: i0.ElementRef }, { token: DragEngineService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
8525
8615
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: BuilderButtonBlockComponent, isStandalone: false, selector: "button[iox-button-block],a[iox-button-block]", inputs: { children: "children", style: "style", tag: "tag", href: "href", target: "target", type: "type", nodeId: "nodeId", dropListId: "dropListId" }, outputs: { childClick: "childClick", childMouseEnter: "childMouseEnter", childMouseLeave: "childMouseLeave" }, host: { properties: { "class": "'button-block-root iox-node-' + nodeId", "attr.href": "tag === 'a' ? (href || null) : null", "attr.target": "tag === 'a' ? (target || null) : null", "attr.type": "tag === 'a' ? null : type" } }, ngImport: i0, template: `
8526
- <span *ngIf="!children.length" class="button-block-placeholder">Button</span>
8616
+ <span *ngIf="!children.length" class="button-block-placeholder" data-iox-chrome>Button</span>
8527
8617
 
8528
8618
  <!-- WRAPPER COLLAPSE (task 9c): render children directly into the host; iox-outer + drag land
8529
8619
  on each child's host (via ioxDragSourceId), matching the SSR engine. -->
@@ -8539,7 +8629,7 @@ class BuilderButtonBlockComponent {
8539
8629
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: BuilderButtonBlockComponent, decorators: [{
8540
8630
  type: Component,
8541
8631
  args: [{ selector: 'button[iox-button-block],a[iox-button-block]', template: `
8542
- <span *ngIf="!children.length" class="button-block-placeholder">Button</span>
8632
+ <span *ngIf="!children.length" class="button-block-placeholder" data-iox-chrome>Button</span>
8543
8633
 
8544
8634
  <!-- WRAPPER COLLAPSE (task 9c): render children directly into the host; iox-outer + drag land
8545
8635
  on each child's host (via ioxDragSourceId), matching the SSR engine. -->
@@ -8690,7 +8780,7 @@ class BuilderDialogComponent {
8690
8780
  <i class="ph-thin ph-x"></i>
8691
8781
  </button>
8692
8782
 
8693
- <div *ngIf="!children.length" class="dialog-placeholder">
8783
+ <div *ngIf="!children.length" class="dialog-placeholder" data-iox-chrome>
8694
8784
  <i class="ph-thin ph-browser"></i>
8695
8785
  <span>Drop components here</span>
8696
8786
  </div>
@@ -8704,7 +8794,7 @@ class BuilderDialogComponent {
8704
8794
  </ng-container>
8705
8795
  </div>
8706
8796
  </div>
8707
- `, isInline: true, styles: [".dialog-stage{position:fixed;inset:0;z-index:50;display:grid;place-items:center;padding:24px;box-sizing:border-box;background:#0f172a73}:host(.iox-es) .dialog-stage{background:var(--iox-scrim)}.dialog-stage[data-placement=top]{align-items:start}.dialog-stage[data-placement=bottom]{align-items:end}.dialog-stage[data-placement=start]{justify-items:start}.dialog-stage[data-placement=end]{justify-items:end}:where(.dialog-surface){box-sizing:border-box;max-width:100%;max-height:100%;overflow:auto;contain:layout}.dialog-close{position:absolute;inset-inline-end:10px;top:10px;width:26px;height:26px;border:none;border-radius:999px;background:#0f172a0f;color:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}:host(.iox-es) .dialog-close{border-radius:var(--iox-radius-pill);background:var(--iox-surface-2);color:var(--iox-text)}.dialog-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:90px;border:1.5px dashed rgba(100,116,139,.35);border-radius:4px;color:#64748b80;font-size:12px}.dialog-placeholder i{font-size:18px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RenderDirective, selector: "[ioxRender]", inputs: ["ioxRender", "ioxDragSourceId"], outputs: ["onClick", "onMouseEnter", "onMouseLeave"] }, { kind: "directive", type: IoxDropzoneDirective, selector: "[ioxDropzone]", inputs: ["ioxDropzoneId", "ioxDropzoneData", "ioxDropzonePostDrop"], outputs: ["ioxDrop"] }] }); }
8797
+ `, isInline: true, styles: [".dialog-stage{position:fixed;inset:0;z-index:50;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);place-items:center;padding:24px;box-sizing:border-box;background:#0f172a73}:host(.iox-es) .dialog-stage{background:var(--iox-scrim)}.dialog-stage[data-placement=top]{align-items:start}.dialog-stage[data-placement=bottom]{align-items:end}.dialog-stage[data-placement=start]{justify-items:start}.dialog-stage[data-placement=end]{justify-items:end}:where(.dialog-surface){box-sizing:border-box;max-width:100%;max-height:100%;overflow:auto;contain:layout}.dialog-close{position:absolute;inset-inline-end:10px;top:10px;width:26px;height:26px;border:none;border-radius:999px;background:#0f172a0f;color:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}:host(.iox-es) .dialog-close{border-radius:var(--iox-radius-pill);background:var(--iox-surface-2);color:var(--iox-text)}.dialog-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:90px;border:1.5px dashed rgba(100,116,139,.35);border-radius:4px;color:#64748b80;font-size:12px}.dialog-placeholder i{font-size:18px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RenderDirective, selector: "[ioxRender]", inputs: ["ioxRender", "ioxDragSourceId"], outputs: ["onClick", "onMouseEnter", "onMouseLeave"] }, { kind: "directive", type: IoxDropzoneDirective, selector: "[ioxDropzone]", inputs: ["ioxDropzoneId", "ioxDropzoneData", "ioxDropzonePostDrop"], outputs: ["ioxDrop"] }] }); }
8708
8798
  }
8709
8799
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: BuilderDialogComponent, decorators: [{
8710
8800
  type: Component,
@@ -8726,7 +8816,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
8726
8816
  <i class="ph-thin ph-x"></i>
8727
8817
  </button>
8728
8818
 
8729
- <div *ngIf="!children.length" class="dialog-placeholder">
8819
+ <div *ngIf="!children.length" class="dialog-placeholder" data-iox-chrome>
8730
8820
  <i class="ph-thin ph-browser"></i>
8731
8821
  <span>Drop components here</span>
8732
8822
  </div>
@@ -8740,7 +8830,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
8740
8830
  </ng-container>
8741
8831
  </div>
8742
8832
  </div>
8743
- `, standalone: false, styles: [".dialog-stage{position:fixed;inset:0;z-index:50;display:grid;place-items:center;padding:24px;box-sizing:border-box;background:#0f172a73}:host(.iox-es) .dialog-stage{background:var(--iox-scrim)}.dialog-stage[data-placement=top]{align-items:start}.dialog-stage[data-placement=bottom]{align-items:end}.dialog-stage[data-placement=start]{justify-items:start}.dialog-stage[data-placement=end]{justify-items:end}:where(.dialog-surface){box-sizing:border-box;max-width:100%;max-height:100%;overflow:auto;contain:layout}.dialog-close{position:absolute;inset-inline-end:10px;top:10px;width:26px;height:26px;border:none;border-radius:999px;background:#0f172a0f;color:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}:host(.iox-es) .dialog-close{border-radius:var(--iox-radius-pill);background:var(--iox-surface-2);color:var(--iox-text)}.dialog-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:90px;border:1.5px dashed rgba(100,116,139,.35);border-radius:4px;color:#64748b80;font-size:12px}.dialog-placeholder i{font-size:18px}\n"] }]
8833
+ `, standalone: false, styles: [".dialog-stage{position:fixed;inset:0;z-index:50;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);place-items:center;padding:24px;box-sizing:border-box;background:#0f172a73}:host(.iox-es) .dialog-stage{background:var(--iox-scrim)}.dialog-stage[data-placement=top]{align-items:start}.dialog-stage[data-placement=bottom]{align-items:end}.dialog-stage[data-placement=start]{justify-items:start}.dialog-stage[data-placement=end]{justify-items:end}:where(.dialog-surface){box-sizing:border-box;max-width:100%;max-height:100%;overflow:auto;contain:layout}.dialog-close{position:absolute;inset-inline-end:10px;top:10px;width:26px;height:26px;border:none;border-radius:999px;background:#0f172a0f;color:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}:host(.iox-es) .dialog-close{border-radius:var(--iox-radius-pill);background:var(--iox-surface-2);color:var(--iox-text)}.dialog-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:90px;border:1.5px dashed rgba(100,116,139,.35);border-radius:4px;color:#64748b80;font-size:12px}.dialog-placeholder i{font-size:18px}\n"] }]
8744
8834
  }], ctorParameters: () => [{ type: DragEngineService }, { type: i1.ComponentInstanceRegistryService }, { type: OverlayService }, { type: i0.ChangeDetectorRef }], propDecorators: { children: [{
8745
8835
  type: Input
8746
8836
  }], nodeId: [{
@@ -9166,7 +9256,7 @@ class SliderContainerComponent {
9166
9256
  (ioxDrop)="onDrop($event)">
9167
9257
 
9168
9258
  <!-- Repeat badge: hover-only, anchored top-left of shell -->
9169
- <div *ngIf="source" class="slider-repeat-badge">
9259
+ <div *ngIf="source" class="slider-repeat-badge" data-iox-chrome>
9170
9260
  <i class="ph-thin ph-repeat"></i>
9171
9261
  <span>{{ source }}</span>
9172
9262
  <span *ngIf="items.length" class="slider-repeat-badge-count">&times; {{ items.length }}</span>
@@ -9224,7 +9314,7 @@ class SliderContainerComponent {
9224
9314
 
9225
9315
  </div>
9226
9316
 
9227
- <div *ngIf="!source && !children.length" class="slider-edit-placeholder">
9317
+ <div *ngIf="!source && !children.length" class="slider-edit-placeholder" data-iox-chrome>
9228
9318
  <i class="ph-thin ph-sliders-horizontal"></i>
9229
9319
  <span>Click + in toolbar to add a slide</span>
9230
9320
  </div>
@@ -9317,7 +9407,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
9317
9407
  (ioxDrop)="onDrop($event)">
9318
9408
 
9319
9409
  <!-- Repeat badge: hover-only, anchored top-left of shell -->
9320
- <div *ngIf="source" class="slider-repeat-badge">
9410
+ <div *ngIf="source" class="slider-repeat-badge" data-iox-chrome>
9321
9411
  <i class="ph-thin ph-repeat"></i>
9322
9412
  <span>{{ source }}</span>
9323
9413
  <span *ngIf="items.length" class="slider-repeat-badge-count">&times; {{ items.length }}</span>
@@ -9375,7 +9465,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
9375
9465
 
9376
9466
  </div>
9377
9467
 
9378
- <div *ngIf="!source && !children.length" class="slider-edit-placeholder">
9468
+ <div *ngIf="!source && !children.length" class="slider-edit-placeholder" data-iox-chrome>
9379
9469
  <i class="ph-thin ph-sliders-horizontal"></i>
9380
9470
  <span>Click + in toolbar to add a slide</span>
9381
9471
  </div>
@@ -9561,24 +9651,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
9561
9651
  }] } });
9562
9652
 
9563
9653
  class SliderSlideComponent {
9564
- constructor(dragEngine, cdr, isPreview) {
9654
+ constructor(dragEngine, cdr) {
9565
9655
  this.dragEngine = dragEngine;
9566
9656
  this.cdr = cdr;
9567
- this.isPreview = isPreview;
9568
9657
  this.children = [];
9569
9658
  this.nodeId = '';
9570
9659
  this.dropListId = '';
9571
9660
  this.childClick = new EventEmitter();
9572
9661
  this.childMouseEnter = new EventEmitter();
9573
9662
  this.childMouseLeave = new EventEmitter();
9574
- this.isPreview = !!isPreview;
9575
9663
  }
9576
9664
  ngOnInit() { }
9577
9665
  ngOnDestroy() { }
9578
9666
  onDrop(event) {
9579
9667
  this.dragEngine.handleDrop(this.children, event, this.dropListId, this.cdr);
9580
9668
  }
9581
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: SliderSlideComponent, deps: [{ token: DragEngineService }, { token: i0.ChangeDetectorRef }, { token: IS_PREVIEW, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
9669
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: SliderSlideComponent, deps: [{ token: DragEngineService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
9582
9670
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: SliderSlideComponent, isStandalone: false, selector: "app-slider-slide", inputs: { children: "children", nodeId: "nodeId", dropListId: "dropListId" }, outputs: { childClick: "childClick", childMouseEnter: "childMouseEnter", childMouseLeave: "childMouseLeave" }, ngImport: i0, template: `
9583
9671
  <!-- The .swiper-slide wrapper (with the iox-outer-* class) is provided by SliderContainer —
9584
9672
  Swiper needs it as a direct child of .swiper-wrapper — and the SLIDE'S size lands there
@@ -9593,7 +9681,7 @@ class SliderSlideComponent {
9593
9681
  [ioxDropzoneData]="children"
9594
9682
  (ioxDrop)="onDrop($event)">
9595
9683
 
9596
- <div *ngIf="!children.length" class="slide-placeholder">
9684
+ <div *ngIf="!children.length" class="slide-placeholder" data-iox-chrome>
9597
9685
  <i class="ph-thin ph-image"></i>
9598
9686
  <span>Drop components here</span>
9599
9687
  </div>
@@ -9629,7 +9717,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
9629
9717
  [ioxDropzoneData]="children"
9630
9718
  (ioxDrop)="onDrop($event)">
9631
9719
 
9632
- <div *ngIf="!children.length" class="slide-placeholder">
9720
+ <div *ngIf="!children.length" class="slide-placeholder" data-iox-chrome>
9633
9721
  <i class="ph-thin ph-image"></i>
9634
9722
  <span>Drop components here</span>
9635
9723
  </div>
@@ -9648,12 +9736,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
9648
9736
  </div>
9649
9737
  </div>
9650
9738
  `, standalone: false, styles: [":where(.slide-edit-block){position:relative;box-sizing:border-box;display:flex;align-items:center;justify-content:center;overflow:hidden;width:100%;background-color:var(--p-surface-300)}.slide-placeholder{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;border:1.5px dashed rgba(100,116,139,.35);border-radius:4px;color:#64748b80;font-size:12px;pointer-events:none;-webkit-user-select:none;user-select:none;opacity:0;transition:opacity .15s}:host:hover .slide-placeholder,:host.iox-drag-over .slide-placeholder{opacity:1}.slide-placeholder i{font-size:22px}\n"] }]
9651
- }], ctorParameters: () => [{ type: DragEngineService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
9652
- type: Optional
9653
- }, {
9654
- type: Inject,
9655
- args: [IS_PREVIEW]
9656
- }] }], propDecorators: { children: [{
9739
+ }], ctorParameters: () => [{ type: DragEngineService }, { type: i0.ChangeDetectorRef }], propDecorators: { children: [{
9657
9740
  type: Input
9658
9741
  }], nodeId: [{
9659
9742
  type: Input
@@ -11404,5 +11487,5 @@ class BuilderSpacerComponentConfig extends ComponentConfig {
11404
11487
  * Generated bundle index. Do not edit.
11405
11488
  */
11406
11489
 
11407
- export { ACTION_TYPE_OPTIONS, AuditCode, AuditPanelComponent, AuditSeverity, BODY_CRUMB_LABEL, BREAKPOINT_PRESENTATION, BUILDER_CANVAS_CONTAINER, BUILDER_CHROME_EN, 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, CardComponentConfig, ChildLayoutGroupStyleConfig, ComponentConfig, ComponentRegistryService, DEFAULT_ESSENTIAL_TRAITS, DRAG_HANDLE_ATTR, DataSourceRegistryService, DataSourceType, DialogComponentConfig, DimensionsGroupStyleConfig, DragEngineService, EASING_OPTIONS$1 as EASING_OPTIONS, 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, IOX_FONT_MANAGER, 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, buildFieldKindPreset, buildFlavorSampler, buildFormPreset, buildFullStyleTraits, buildLayoutPreset, buildPalettePreset, buildPresetStyleTraits, canFluidise, collapseColumnsProps, columnCountOf, defaultBuilderLabels, defaultPageSettings, dropTargetLabel, essentialTraitsFor, findNodeLocation, findParentOf, flattenSchemaFields, fluidiseProps, generateNodeId, isHiddenAt, matchesControlSearch, nearestFormNode, nodeAncestorPath, nodeAncestorPathInEither, reorderProps, resolveInsertTarget, resolveTraitControllerType, resolveTraitOptions, setStyleTrait, setTrait, stackChildrenProps, summarise, textNode, visibilityProps, wrapNode };
11490
+ 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, CardComponentConfig, ChildLayoutGroupStyleConfig, ComponentConfig, ComponentRegistryService, DEFAULT_ESSENTIAL_TRAITS, DRAG_HANDLE_ATTR, DataSourceRegistryService, DataSourceType, DialogComponentConfig, DimensionsGroupStyleConfig, DragEngineService, EASING_OPTIONS$1 as 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, IOX_FONT_MANAGER, 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, buildFieldKindPreset, buildFlavorSampler, buildFormPreset, buildFullStyleTraits, buildLayoutPreset, buildPalettePreset, buildPresetStyleTraits, canFluidise, canvasEmptyImageLabel, collapseColumnsProps, columnCountOf, defaultBuilderLabels, defaultPageSettings, dropTargetLabel, essentialTraitsFor, findNodeLocation, findParentOf, flattenSchemaFields, fluidiseProps, generateNodeId, isHiddenAt, matchesControlSearch, nearestFormNode, nodeAncestorPath, nodeAncestorPathInEither, reorderProps, resolveInsertTarget, resolveTraitControllerType, resolveTraitOptions, setStyleTrait, setTrait, stackChildrenProps, summarise, syncEmptyImagePlaceholder, syncNodeDesign, textNode, visibilityProps, wrapNode };
11408
11491
  //# sourceMappingURL=vectoriox-iox-builder.mjs.map