@vectoriox/iox-ui 5.11.0 → 5.12.1

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.
@@ -621,7 +621,7 @@ class CardComponent {
621
621
  <h2>{{ title }}</h2>
622
622
  <p>{{ description }}</p>
623
623
  </div>
624
- `, isInline: true, styles: [".image-wrapper{width:100%;aspect-ratio:1/1;overflow:hidden;margin-bottom:.75rem}\n", ".card-img{width:100%;height:100%;object-fit:cover}\n", "h2{margin:0 0 .5rem;font-size:1.2rem}\n", "p{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
624
+ `, isInline: true, styles: [".image-wrapper{width:100%;aspect-ratio:1/1;overflow:hidden;margin-bottom:var(--iox-card-media-gap, .75rem)}\n", ".card-img{width:100%;height:100%;object-fit:cover}\n", "h2{margin:0 0 var(--iox-card-title-gap, .5rem) 0;font-size:var(--iox-card-title-size, 1.2rem)}\n", "p{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
625
625
  }
626
626
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: CardComponent, decorators: [{
627
627
  type: Component,
@@ -633,7 +633,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
633
633
  <h2>{{ title }}</h2>
634
634
  <p>{{ description }}</p>
635
635
  </div>
636
- `, standalone: false, styles: [".image-wrapper{width:100%;aspect-ratio:1/1;overflow:hidden;margin-bottom:.75rem}\n", ".card-img{width:100%;height:100%;object-fit:cover}\n", "h2{margin:0 0 .5rem;font-size:1.2rem}\n", "p{margin:0}\n"] }]
636
+ `, standalone: false, styles: [".image-wrapper{width:100%;aspect-ratio:1/1;overflow:hidden;margin-bottom:var(--iox-card-media-gap, .75rem)}\n", ".card-img{width:100%;height:100%;object-fit:cover}\n", "h2{margin:0 0 var(--iox-card-title-gap, .5rem) 0;font-size:var(--iox-card-title-size, 1.2rem)}\n", "p{margin:0}\n"] }]
637
637
  }], propDecorators: { title: [{
638
638
  type: Input
639
639
  }], image: [{
@@ -748,7 +748,7 @@ class BuilderLinkComponent {
748
748
  }
749
749
  }
750
750
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: BuilderLinkComponent, deps: [{ token: IS_PREVIEW, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
751
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: BuilderLinkComponent, isStandalone: false, selector: "a[iox-link]", inputs: { nodeId: "nodeId", label: "label", linkType: "linkType", url: "url", pageRoute: "pageRoute", target: "target", style: "style" }, host: { listeners: { "click": "onLinkClick($event)" }, properties: { "attr.href": "isPreview ? resolvedHref : null", "attr.target": "isPreview ? target : null", "style.pointer-events": "isPreview ? null : 'none'", "class": "'builder-link iox-node-' + nodeId" } }, ngImport: i0, template: `{{ label }}`, isInline: true, styles: [":host{display:inline;cursor:pointer;color:inherit}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
751
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: BuilderLinkComponent, isStandalone: false, selector: "a[iox-link]", inputs: { nodeId: "nodeId", label: "label", linkType: "linkType", url: "url", pageRoute: "pageRoute", target: "target", style: "style" }, host: { listeners: { "click": "onLinkClick($event)" }, properties: { "attr.href": "isPreview ? resolvedHref : null", "attr.target": "isPreview ? target : null", "style.pointer-events": "isPreview ? null : 'none'", "class": "'builder-link iox-node-' + nodeId" } }, ngImport: i0, template: `{{ label }}`, isInline: true, styles: [":host{display:inline;cursor:pointer}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
752
752
  }
753
753
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: BuilderLinkComponent, decorators: [{
754
754
  type: Component,
@@ -758,7 +758,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
758
758
  '[style.pointer-events]': "isPreview ? null : 'none'",
759
759
  '[class]': "'builder-link iox-node-' + nodeId",
760
760
  '(click)': 'onLinkClick($event)',
761
- }, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline;cursor:pointer;color:inherit}\n"] }]
761
+ }, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline;cursor:pointer}\n"] }]
762
762
  }], ctorParameters: () => [{ type: undefined, decorators: [{
763
763
  type: Optional
764
764
  }, {
@@ -835,7 +835,7 @@ class BuilderButtonComponent {
835
835
  this.events.emit('elementselect', { node: this.node, componentRef: null });
836
836
  }
837
837
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: BuilderButtonComponent, deps: [{ token: IOX_BUILDER_EVENTS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
838
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: BuilderButtonComponent, isStandalone: false, selector: "a[iox-button]", inputs: { label: "label", link: "link", variant: "variant", nodeId: "nodeId", node: "node" }, host: { listeners: { "dblclick": "startEdit($event)", "blur": "commitEdit($event)", "keydown": "onKeyDown($event)" }, properties: { "attr.href": "link", "class": "'builder-btn variant-' + variant + ' iox-node-' + nodeId", "attr.contenteditable": "editing ? 'true' : null" } }, ngImport: i0, template: `{{ label }}`, isInline: true, styles: [":host{display:inline-block;padding:.6rem 1.5rem;border-radius:6px;font-size:.9rem;text-decoration:none;cursor:pointer;text-align:center;transition:opacity .15s}:host.variant-primary{background:#cb9090;color:#fff;border:1px solid #cb9090}:host.variant-outlined{background:transparent;color:#cb9090;border:1px solid #cb9090}:host.variant-text{background:transparent;color:#cb9090;border:1px solid transparent}:host[contenteditable]{outline:2px solid #cb9090;cursor:text}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
838
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: BuilderButtonComponent, isStandalone: false, selector: "a[iox-button]", inputs: { label: "label", link: "link", variant: "variant", nodeId: "nodeId", node: "node" }, host: { listeners: { "dblclick": "startEdit($event)", "blur": "commitEdit($event)", "keydown": "onKeyDown($event)" }, properties: { "attr.href": "link", "class": "'builder-btn variant-' + variant + ' iox-node-' + nodeId", "attr.contenteditable": "editing ? 'true' : null" } }, ngImport: i0, template: `{{ label }}`, isInline: true, styles: [":host{display:inline-block;padding:var(--iox-button-pad, .6rem 1.5rem);border-radius:var(--iox-button-radius, 6px);font-size:var(--iox-button-size, .9rem);text-decoration:none;cursor:pointer;text-align:center;transition:opacity var(--iox-dur-fast, .15s)}:host.variant-primary{background:var(--iox-button-primary-bg, #cb9090);color:var(--iox-button-primary-ink, #fff);border:var(--iox-button-border-width, 1px) solid var(--iox-button-primary-border, #cb9090)}:host.variant-outlined{background:var(--iox-button-secondary-bg, transparent);color:var(--iox-button-secondary-ink, #cb9090);border:var(--iox-button-border-width, 1px) solid var(--iox-button-secondary-border, #cb9090)}:host.variant-text{background:transparent;color:var(--iox-button-ghost-ink, #cb9090);border:var(--iox-button-border-width, 1px) solid transparent}:host[contenteditable]{outline:2px solid #cb9090;cursor:text}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
839
839
  }
840
840
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: BuilderButtonComponent, decorators: [{
841
841
  type: Component,
@@ -846,7 +846,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
846
846
  '(dblclick)': 'startEdit($event)',
847
847
  '(blur)': 'commitEdit($event)',
848
848
  '(keydown)': 'onKeyDown($event)',
849
- }, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block;padding:.6rem 1.5rem;border-radius:6px;font-size:.9rem;text-decoration:none;cursor:pointer;text-align:center;transition:opacity .15s}:host.variant-primary{background:#cb9090;color:#fff;border:1px solid #cb9090}:host.variant-outlined{background:transparent;color:#cb9090;border:1px solid #cb9090}:host.variant-text{background:transparent;color:#cb9090;border:1px solid transparent}:host[contenteditable]{outline:2px solid #cb9090;cursor:text}\n"] }]
849
+ }, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block;padding:var(--iox-button-pad, .6rem 1.5rem);border-radius:var(--iox-button-radius, 6px);font-size:var(--iox-button-size, .9rem);text-decoration:none;cursor:pointer;text-align:center;transition:opacity var(--iox-dur-fast, .15s)}:host.variant-primary{background:var(--iox-button-primary-bg, #cb9090);color:var(--iox-button-primary-ink, #fff);border:var(--iox-button-border-width, 1px) solid var(--iox-button-primary-border, #cb9090)}:host.variant-outlined{background:var(--iox-button-secondary-bg, transparent);color:var(--iox-button-secondary-ink, #cb9090);border:var(--iox-button-border-width, 1px) solid var(--iox-button-secondary-border, #cb9090)}:host.variant-text{background:transparent;color:var(--iox-button-ghost-ink, #cb9090);border:var(--iox-button-border-width, 1px) solid transparent}:host[contenteditable]{outline:2px solid #cb9090;cursor:text}\n"] }]
850
850
  }], ctorParameters: () => [{ type: undefined, decorators: [{
851
851
  type: Optional
852
852
  }, {
@@ -1089,17 +1089,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
1089
1089
  args: ['childrenHost', { read: ViewContainerRef, static: true }]
1090
1090
  }] } });
1091
1091
 
1092
- /** Directive-host container: the `<div>` IS the host — no wrapper, no inner/outer split. */
1092
+ /**
1093
+ * The tags a Container may render as (its `htmlTag` trait) — the builder canvas's list. The engine's
1094
+ * string renderer and component path both pick from THIS list, so a Navigation bar is a `<nav>` on
1095
+ * the live site exactly as on the canvas.
1096
+ */
1097
+ const CONTAINER_HTML_TAGS = ['div', 'section', 'article', 'header', 'footer', 'main', 'nav', 'ul', 'ol', 'li'];
1098
+ /** `htmlTag` when it is an allowed Container tag, else `div`. */
1099
+ function containerHtmlTag(htmlTag) {
1100
+ return CONTAINER_HTML_TAGS.includes(String(htmlTag)) ? String(htmlTag) : 'div';
1101
+ }
1102
+ /** Directive-host container: the host element IS the container — no wrapper, no inner/outer split.
1103
+ * Variable tag: the engine creates it on an explicit `hostElement` of `containerHtmlTag(htmlTag)`. */
1093
1104
  class ContainerComponent {
1094
1105
  constructor() {
1095
1106
  this.nodeId = '';
1096
1107
  }
1097
1108
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1098
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: ContainerComponent, isStandalone: false, selector: "div[iox-container]", inputs: { nodeId: "nodeId" }, host: { properties: { "class": "'iox-node-' + nodeId" } }, viewQueries: [{ propertyName: "childrenHost", first: true, predicate: ["childrenHost"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `<ng-container #childrenHost></ng-container>`, isInline: true, styles: [":host{box-sizing:border-box}\n"] }); }
1109
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: ContainerComponent, 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]", inputs: { nodeId: "nodeId" }, host: { properties: { "class": "'iox-node-' + nodeId" } }, viewQueries: [{ propertyName: "childrenHost", first: true, predicate: ["childrenHost"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `<ng-container #childrenHost></ng-container>`, isInline: true, styles: [":host{box-sizing:border-box}\n"] }); }
1099
1110
  }
1100
1111
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ContainerComponent, decorators: [{
1101
1112
  type: Component,
1102
- args: [{ selector: 'div[iox-container]', template: `<ng-container #childrenHost></ng-container>`, host: { '[class]': "'iox-node-' + nodeId" }, standalone: false, styles: [":host{box-sizing:border-box}\n"] }]
1113
+ 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]', template: `<ng-container #childrenHost></ng-container>`, host: { '[class]': "'iox-node-' + nodeId" }, standalone: false, styles: [":host{box-sizing:border-box}\n"] }]
1103
1114
  }], propDecorators: { nodeId: [{
1104
1115
  type: Input
1105
1116
  }], childrenHost: [{
@@ -1283,6 +1294,11 @@ const MARKER_FUNS = [
1283
1294
  ['markerFontSize', 'fontSize'],
1284
1295
  ];
1285
1296
  const TRANSITION_KEYS = ['transitionDuration', 'transitionTimingFunction', 'transitionDelay'];
1297
+ /** The whole-value backdrop trait (DS2). A plain key — it is copied, not stripped — but it feeds
1298
+ * the backdrop group's output, so a breakpoint layer that sets it must count as touching it. */
1299
+ const BACKDROP_WHOLE_KEY = 'backdropFilter';
1300
+ /** The prefixed twin emitted beside every composed `backdropFilter` (Safari). */
1301
+ const BACKDROP_TWIN_KEY = 'WebkitBackdropFilter';
1286
1302
  const VIRTUAL_TRAIT_GROUPS = Object.freeze([
1287
1303
  { output: 'filter', keys: FILTER_FUNS.map(([t]) => t), reset: 'none' },
1288
1304
  { output: 'backdropFilter', keys: BACKDROP_FUNS.map(([t]) => t), reset: 'none' },
@@ -1327,10 +1343,20 @@ function composeVirtualTraits(raw, base = raw) {
1327
1343
  const filterStr = buildFns(FILTER_FUNS, merged(FILTER_FUNS));
1328
1344
  if (filterStr)
1329
1345
  result['filter'] = filterStr;
1330
- // backdrop-filter
1346
+ // backdrop-filter. The whole-value `backdropFilter` trait (DS2 — an element style writes
1347
+ // `var(--iox-card-backdrop)`) WINS over the composed backdrop* group when it is set; its
1348
+ // default `none` means unset, so a legacy node's composed blur still applies. The -webkit-
1349
+ // twin rides along for Safari (design-system plan T3).
1350
+ const whole = raw[BACKDROP_WHOLE_KEY] ?? base[BACKDROP_WHOLE_KEY];
1351
+ const wholeSet = typeof whole === 'string' && whole.trim() !== '' && whole.trim() !== 'none';
1331
1352
  const backdropStr = buildFns(BACKDROP_FUNS, merged(BACKDROP_FUNS));
1332
- if (backdropStr)
1333
- result['backdropFilter'] = backdropStr;
1353
+ if (wholeSet)
1354
+ result[BACKDROP_WHOLE_KEY] = whole;
1355
+ else if (backdropStr)
1356
+ result[BACKDROP_WHOLE_KEY] = backdropStr;
1357
+ if (result[BACKDROP_WHOLE_KEY] !== undefined && result[BACKDROP_WHOLE_KEY] !== '') {
1358
+ result[BACKDROP_TWIN_KEY] = result[BACKDROP_WHOLE_KEY];
1359
+ }
1334
1360
  // transform
1335
1361
  const transformStr = buildFns(TRANSFORM_FUNS, merged(TRANSFORM_FUNS));
1336
1362
  if (transformStr)
@@ -1697,7 +1723,8 @@ function groupsTouchedBy(map) {
1697
1723
  if (!map)
1698
1724
  return touched;
1699
1725
  for (const group of VIRTUAL_TRAIT_GROUPS) {
1700
- if (group.keys.some(k => map[k] !== undefined))
1726
+ const wholeTouched = group.output === BACKDROP_WHOLE_KEY && map[BACKDROP_WHOLE_KEY] !== undefined;
1727
+ if (wholeTouched || group.keys.some(k => map[k] !== undefined))
1701
1728
  touched.add(group);
1702
1729
  }
1703
1730
  return touched;
@@ -1726,7 +1753,7 @@ function composeOverride(own, wider, touched) {
1726
1753
  const groupOutputs = new Set(VIRTUAL_TRAIT_GROUPS.map(g => g.output));
1727
1754
  const out = {};
1728
1755
  for (const [k, v] of Object.entries(composed)) {
1729
- if (!groupOutputs.has(k) && v !== undefined)
1756
+ if (!groupOutputs.has(k) && k !== BACKDROP_TWIN_KEY && v !== undefined)
1730
1757
  out[k] = v;
1731
1758
  }
1732
1759
  const merged = { ...wider, ...own };
@@ -1737,6 +1764,8 @@ function composeOverride(own, wider, touched) {
1737
1764
  else if (shouldReset(group, merged))
1738
1765
  out[group.output] = group.reset;
1739
1766
  }
1767
+ if (out[BACKDROP_WHOLE_KEY] !== undefined)
1768
+ out[BACKDROP_TWIN_KEY] = out[BACKDROP_WHOLE_KEY];
1740
1769
  return out;
1741
1770
  }
1742
1771
  /**
@@ -2822,7 +2851,7 @@ class ClientGalleryComponent {
2822
2851
  [ngStyle]="slideStyle(i)"></div>
2823
2852
  <div class="iox-gallery__overlay"></div>
2824
2853
  </div>
2825
- `, isInline: true, styles: [":host{display:block}.iox-gallery{position:relative;overflow:hidden;box-sizing:border-box}.iox-gallery__img{position:absolute;inset:0;background-size:cover;background-position:center;pointer-events:none;opacity:0;filter:brightness(1.35);-webkit-mask-image:radial-gradient(circle at 50% 50%,rgba(0,0,0,1) 80%,rgba(0,0,0,.1) 95%,rgba(0,0,0,0) 100%);mask-image:radial-gradient(circle at 50% 50%,#000 80%,#0000001a 95%,#0000)}.iox-gallery__overlay{position:absolute;inset:0;pointer-events:none;z-index:3;background:linear-gradient(to bottom,#00000080,#00000026 20% 80%,#00000080)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
2854
+ `, isInline: true, styles: [":host{display:block}.iox-gallery{position:relative;overflow:hidden;box-sizing:border-box}.iox-gallery__img{position:absolute;inset:0;background-size:cover;background-position:center;pointer-events:none;opacity:0;filter:var(--iox-gallery-filter, brightness(1.35));-webkit-mask-image:var(--iox-gallery-mask, radial-gradient(circle at 50% 50%, rgba(0,0,0,1) 80%, rgba(0,0,0,.1) 95%, rgba(0,0,0,0) 100%));mask-image:var(--iox-gallery-mask, radial-gradient(circle at 50% 50%, rgba(0,0,0,1) 80%, rgba(0,0,0,.1) 95%, rgba(0,0,0,0) 100%))}.iox-gallery__overlay{position:absolute;inset:0;pointer-events:none;z-index:3;background:var(--iox-gallery-overlay, linear-gradient(to bottom, rgba(0,0,0,.5) 0%, rgba(0,0,0,.15) 20%, rgba(0,0,0,.15) 80%, rgba(0,0,0,.5) 100%))}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
2826
2855
  }
2827
2856
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ClientGalleryComponent, decorators: [{
2828
2857
  type: Component,
@@ -2834,7 +2863,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
2834
2863
  [ngStyle]="slideStyle(i)"></div>
2835
2864
  <div class="iox-gallery__overlay"></div>
2836
2865
  </div>
2837
- `, standalone: false, styles: [":host{display:block}.iox-gallery{position:relative;overflow:hidden;box-sizing:border-box}.iox-gallery__img{position:absolute;inset:0;background-size:cover;background-position:center;pointer-events:none;opacity:0;filter:brightness(1.35);-webkit-mask-image:radial-gradient(circle at 50% 50%,rgba(0,0,0,1) 80%,rgba(0,0,0,.1) 95%,rgba(0,0,0,0) 100%);mask-image:radial-gradient(circle at 50% 50%,#000 80%,#0000001a 95%,#0000)}.iox-gallery__overlay{position:absolute;inset:0;pointer-events:none;z-index:3;background:linear-gradient(to bottom,#00000080,#00000026 20% 80%,#00000080)}\n"] }]
2866
+ `, standalone: false, styles: [":host{display:block}.iox-gallery{position:relative;overflow:hidden;box-sizing:border-box}.iox-gallery__img{position:absolute;inset:0;background-size:cover;background-position:center;pointer-events:none;opacity:0;filter:var(--iox-gallery-filter, brightness(1.35));-webkit-mask-image:var(--iox-gallery-mask, radial-gradient(circle at 50% 50%, rgba(0,0,0,1) 80%, rgba(0,0,0,.1) 95%, rgba(0,0,0,0) 100%));mask-image:var(--iox-gallery-mask, radial-gradient(circle at 50% 50%, rgba(0,0,0,1) 80%, rgba(0,0,0,.1) 95%, rgba(0,0,0,0) 100%))}.iox-gallery__overlay{position:absolute;inset:0;pointer-events:none;z-index:3;background:var(--iox-gallery-overlay, linear-gradient(to bottom, rgba(0,0,0,.5) 0%, rgba(0,0,0,.15) 20%, rgba(0,0,0,.15) 80%, rgba(0,0,0,.5) 100%))}\n"] }]
2838
2867
  }], ctorParameters: () => [{ type: undefined, decorators: [{
2839
2868
  type: Inject,
2840
2869
  args: [PLATFORM_ID]
@@ -4506,6 +4535,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
4506
4535
  args: ['childrenHost', { read: ViewContainerRef, static: true }]
4507
4536
  }] } });
4508
4537
 
4538
+ const PLACEMENTS = ['top', 'bottom', 'start', 'end'];
4539
+ const isOn = (v) => v === true || v === 'true';
4540
+ const isOff = (v) => v === false || v === 'false';
4541
+ /**
4542
+ * The Dialog's LIVE twin on the engine's component path (actions plan A1b; design-system DS2).
4543
+ * Directive-host: the `<dialog>` IS the host, carrying exactly the markup the string renderer
4544
+ * writes (`data-iox-dialog`, the opt-in backdrop-close / consent-role / placement attributes and
4545
+ * the close X), so the runtime's dialog actions, the consent prompt and `styles.scss` treat both
4546
+ * paths alike. Ships CLOSED — only the dialog actions open it. Before this existed, a page holding
4547
+ * a Dialog fell back to the string renderer wholesale.
4548
+ */
4549
+ class IoxDialogComponent {
4550
+ constructor() {
4551
+ this.nodeId = '';
4552
+ this.placement = 'center';
4553
+ this.closeOnBackdrop = true;
4554
+ this.showCloseButton = true;
4555
+ this.consentRole = false;
4556
+ }
4557
+ get backdropCloses() { return !isOff(this.closeOnBackdrop); }
4558
+ get closeButtonShown() { return !isOff(this.showCloseButton); }
4559
+ get consentRoleOn() { return isOn(this.consentRole); }
4560
+ get placementAttr() { return PLACEMENTS.includes(String(this.placement)) ? String(this.placement) : null; }
4561
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: IoxDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4562
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.31", type: IoxDialogComponent, isStandalone: false, selector: "dialog[iox-dialog]", inputs: { nodeId: "nodeId", placement: "placement", closeOnBackdrop: "closeOnBackdrop", showCloseButton: "showCloseButton", consentRole: "consentRole" }, host: { attributes: { "data-iox-dialog": "" }, properties: { "class": "'iox-node-' + nodeId", "attr.data-iox-dialog-backdrop-close": "backdropCloses ? '' : null", "attr.data-iox-consent-role": "consentRoleOn ? '' : null", "attr.data-iox-dialog-placement": "placementAttr" } }, viewQueries: [{ propertyName: "childrenHost", first: true, predicate: ["childrenHost"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `@if (closeButtonShown) {<button type="button" class="iox-dialog-close" data-iox-dialog-close aria-label="Close">×</button>}<ng-container #childrenHost></ng-container>`, isInline: true, styles: [":host{box-sizing:border-box}\n"] }); }
4563
+ }
4564
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: IoxDialogComponent, decorators: [{
4565
+ type: Component,
4566
+ args: [{ selector: 'dialog[iox-dialog]', template: `@if (closeButtonShown) {<button type="button" class="iox-dialog-close" data-iox-dialog-close aria-label="Close">×</button>}<ng-container #childrenHost></ng-container>`, host: {
4567
+ '[class]': "'iox-node-' + nodeId",
4568
+ 'data-iox-dialog': '',
4569
+ '[attr.data-iox-dialog-backdrop-close]': "backdropCloses ? '' : null",
4570
+ '[attr.data-iox-consent-role]': "consentRoleOn ? '' : null",
4571
+ '[attr.data-iox-dialog-placement]': 'placementAttr',
4572
+ }, standalone: false, styles: [":host{box-sizing:border-box}\n"] }]
4573
+ }], propDecorators: { nodeId: [{
4574
+ type: Input
4575
+ }], placement: [{
4576
+ type: Input
4577
+ }], closeOnBackdrop: [{
4578
+ type: Input
4579
+ }], showCloseButton: [{
4580
+ type: Input
4581
+ }], consentRole: [{
4582
+ type: Input
4583
+ }], childrenHost: [{
4584
+ type: ViewChild,
4585
+ args: ['childrenHost', { read: ViewContainerRef, static: true }]
4586
+ }] } });
4587
+
4509
4588
  const COMPONENTS = [
4510
4589
  BuilderImageComponent,
4511
4590
  BuilderSpacerComponent,
@@ -4531,6 +4610,7 @@ const COMPONENTS = [
4531
4610
  IoxSubmitButtonComponent,
4532
4611
  IoxFormSuccessComponent,
4533
4612
  IoxFormErrorComponent,
4613
+ IoxDialogComponent,
4534
4614
  ];
4535
4615
  class IoxBuilderComponentsModule {
4536
4616
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: IoxBuilderComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -4557,7 +4637,8 @@ class IoxBuilderComponentsModule {
4557
4637
  IoxFieldComponent,
4558
4638
  IoxSubmitButtonComponent,
4559
4639
  IoxFormSuccessComponent,
4560
- IoxFormErrorComponent], imports: [CommonModule], exports: [BuilderImageComponent,
4640
+ IoxFormErrorComponent,
4641
+ IoxDialogComponent], imports: [CommonModule], exports: [BuilderImageComponent,
4561
4642
  BuilderSpacerComponent,
4562
4643
  CardComponent,
4563
4644
  BuilderDividerComponent,
@@ -4580,7 +4661,8 @@ class IoxBuilderComponentsModule {
4580
4661
  IoxFieldComponent,
4581
4662
  IoxSubmitButtonComponent,
4582
4663
  IoxFormSuccessComponent,
4583
- IoxFormErrorComponent] }); }
4664
+ IoxFormErrorComponent,
4665
+ IoxDialogComponent] }); }
4584
4666
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: IoxBuilderComponentsModule, imports: [CommonModule] }); }
4585
4667
  }
4586
4668
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: IoxBuilderComponentsModule, decorators: [{
@@ -4635,6 +4717,9 @@ class IoxComponentRegistryService {
4635
4717
  ['SubmitButton', IoxSubmitButtonComponent],
4636
4718
  ['FormSuccess', IoxFormSuccessComponent],
4637
4719
  ['FormError', IoxFormErrorComponent],
4720
+ // Dialog (DS2) — the live <dialog> twin, so a page holding one no longer falls back to
4721
+ // the string renderer.
4722
+ ['Dialog', IoxDialogComponent],
4638
4723
  ]);
4639
4724
  }
4640
4725
  getComponent(type) {
@@ -4714,6 +4799,12 @@ const NOOP_INITIAL_VALUES = {
4714
4799
  // initial, so it still emits and wins.
4715
4800
  'overflow': ['visible'], 'overflow-x': ['visible'], 'overflow-y': ['visible'],
4716
4801
  'clip-path': ['none'],
4802
+ // DS2 traits (design-system plan T3/T4). `backdrop-filter: blur(0px)` would still create a
4803
+ // containing block, so the whole-value trait's solid-flavor value is `none` — and `none` must
4804
+ // never be emitted on every node. text-transform IS inherited: the cost is that `none` cannot
4805
+ // cancel an ancestor's uppercase in a base rule — chosen over emitting it on every node.
4806
+ 'backdrop-filter': ['none'], '-webkit-backdrop-filter': ['none'],
4807
+ 'text-transform': ['none'],
4717
4808
  };
4718
4809
  /**
4719
4810
  * Style props a type's render-default fully REPLACES. Emitting them would produce a dead
@@ -4778,6 +4869,45 @@ function compileDeclarations(props, importantProps, context = DeclarationContext
4778
4869
  }
4779
4870
  return out;
4780
4871
  }
4872
+ /**
4873
+ * The state names whose rule compiles to a DIFFERENT pseudo-class than their own name. `focus`
4874
+ * compiles to `:focus-visible` (design-system DS2): an element style's focus ring must appear for
4875
+ * keyboard users, not stick to a button after a mouse click. Stored states keep the name `focus` —
4876
+ * no migration — and a text field still matches, since browsers treat a focused text input as
4877
+ * focus-visible. Shared by the builder canvas and both engine paths.
4878
+ */
4879
+ const STATE_PSEUDO_CLASS = { focus: 'focus-visible' };
4880
+ /** The pseudo-class a stored state compiles to (`focus` → `focus-visible`, everything else itself). */
4881
+ function statePseudoClass(state) {
4882
+ return STATE_PSEUDO_CLASS[state] ?? state;
4883
+ }
4884
+ /** The states driven by a pointer hovering something — each earns the default hover transition. */
4885
+ const HOVER_STATES = ['hover', 'parent-hover', 'trigger-hover'];
4886
+ /** True when the node restyles on hover (its own, its parent's or a chosen trigger's). */
4887
+ function hasHoverState(stateStyles) {
4888
+ return !!stateStyles && HOVER_STATES.some(s => Object.keys(stateStyles[s] ?? {}).length > 0);
4889
+ }
4890
+ /**
4891
+ * The base-rule transition a hovering node gets when it declares none of its own, so a hover
4892
+ * animates instead of snapping. Token-driven with today's literal as the fallback (T6), so an
4893
+ * unseeded org renders `all 0.2s ease` byte-identically. ONE copy for the builder canvas, the style
4894
+ * panel and the engine — it was hand-written in three places.
4895
+ */
4896
+ const HOVER_DEFAULT_TRANSITION = 'all var(--iox-dur-fast, 0.2s) var(--iox-ease-standard, ease)';
4897
+ /** True when the RAW style map already yields a transition (an explicit one, or the composed
4898
+ * transitionDuration/TimingFunction an element style writes). */
4899
+ function hasOwnTransition(styleProps) {
4900
+ const sp = styleProps ?? {};
4901
+ if (sp['transition'] !== undefined && sp['transition'] !== null && sp['transition'] !== '')
4902
+ return true;
4903
+ return composeVirtualTraits(sp)['transition'] !== undefined;
4904
+ }
4905
+ /** `styleProps` plus the default hover transition when the node hovers and sets none itself. */
4906
+ function withDefaultHoverTransition(styleProps, stateStyles) {
4907
+ return hasHoverState(stateStyles) && !hasOwnTransition(styleProps)
4908
+ ? { ...styleProps, transition: HOVER_DEFAULT_TRANSITION }
4909
+ : styleProps;
4910
+ }
4781
4911
  /**
4782
4912
  * Per-type default `width` that the builder applies from each component's config
4783
4913
  * (NOT persisted in styleProps — see render-parity.md "saved node is not
@@ -4832,9 +4962,11 @@ function renderDefaultDeclarations(type, styleProps, hasHoverState) {
4832
4962
  if (sp['borderWidth'] && sp['borderStyle'] === undefined) {
4833
4963
  out.push('border-style: solid');
4834
4964
  }
4835
- // Default transition so own/parent hover animates smoothly (parity with the builder).
4836
- if (hasHoverState && sp['transition'] === undefined) {
4837
- out.push('transition: all 0.2s ease');
4965
+ // Default transition so own/parent hover animates smoothly (parity with the builder). Skipped
4966
+ // when the node composes its own (an element style's transitionDuration) — appended after the
4967
+ // node's declarations, it would otherwise beat them in the engine only.
4968
+ if (hasHoverState && !hasOwnTransition(sp)) {
4969
+ out.push(`transition: ${HOVER_DEFAULT_TRANSITION}`);
4838
4970
  }
4839
4971
  // Image defaults reapplied when unset (the config defaults aren't always persisted). height:auto
4840
4972
  // is only a DEFAULT — when the user sets an explicit height (e.g. 100%) it must WIN, so guard it
@@ -6859,5 +6991,5 @@ function effectiveTransitionId(anim) {
6859
6991
  * Generated bundle index. Do not edit.
6860
6992
  */
6861
6993
 
6862
- export { AOSService, BREAKPOINTS, Breakpoint, BreakpointQueryKind, BuilderButtonComponent, BuilderDividerComponent, BuilderHeadingComponent, BuilderIconComponent, BuilderImageComponent, BuilderLinkComponent, BuilderSpacerComponent, ButtonBlockComponent, CONTEXT_ACTION_TYPES, CardComponent, ClientGalleryComponent, ClientListComponent, ClientListItemComponent, ClientRepeaterComponent, ClientSliderContainerComponent, ClientSliderSlideComponent, ComponentInstanceRegistryService, ContainerComponent, ContextStore, DEFAULT_GALLERY_SCHEDULER, DEFAULT_PAGE_TRANSITION, DEFAULT_PAGE_TRANSITION_DURATION, DEFAULT_PAGE_TRANSITION_EASING, DEFAULT_PAGE_TRANSITION_PERSPECTIVE, DEFAULT_PHOSPHOR_WEIGHT, DEFAULT_WIDTH_BY_TYPE, DeclarationContext, FormRenderState, FormRuntimeService, GALLERY_EFFECTS, GALLERY_EFFECT_DESCRIPTORS, GalleryLoop, IOX_BUILDER_EVENTS, IOX_FORM_MESSAGES, IOX_FORM_NAVIGATOR, IOX_FORM_TRANSPORT, IS_PREVIEW, IoxAnimateContainer, IoxAosDirective, IoxAosModule, IoxBuilderComponentsModule, IoxComponentRegistryService, IoxFieldComponent, IoxFormComponent, IoxFormErrorComponent, IoxFormSuccessComponent, IoxPageComponent, IoxPageModule, IoxSubmitButtonComponent, IoxUiModule, LinkedContainerComponent, PAGE_TRANSITION_CATEGORIES, PAGE_TRANSITION_PRESETS, PART_CLASS_NAMES, PIPE_DESCRIPTORS, PIPE_REGISTRY, PageScrollProvider, RESERVED_ALIAS_PREFIX, SUPPRESSED_STYLE_PROPS_BY_TYPE, SWIPER_RESPONSIVE_TRAITS, SectionComponent, TRANSITION_FEELS, TextBlockComponent, VALIDATION_STATES, VALIDATION_STATE_CLASS, VIRTUAL_TRAIT_GROUPS, VIRTUAL_TRAIT_KEYS, ViewPositionDirective, ViewPositionModule, activeActions, applyBindingPipes, applyFeel, breakpointDef, breakpointForWidth, breakpointQueryFor, buildDataSourceFilter, buildPartSelector, buildRelatedFilter, buildSwiperBreakpoints, buildTargetedStateSelector, buildTransitionTimeline, cascadeChain, clearInputOverride, clearOverride, collectContextSlotKeys, collectReferencedAliases, compileDeclarations, compilePageStyle, composeVirtualTraits, computeRelative, contextActionEffect, contextSlotKeys, countOverrides, dataSourcePlanToRequest, declaredInputNames, defaultMessageResolver, deriveSeoFromContent, describeSeoFields, effectiveTransitionId, excludeSelf, feelFor, getByPath, getSeoValue, initialSlotValues, isActionEnabled, isContextAction, isInputOverriddenAt, isOverriddenAt, isReservedAlias, isValidSlotKey, legacyEnterToTransition, matchRouteParams, mediaQueryFor, mergeSwiperBreakpoints, nearestCommonAncestorId, nodeCssId, nodeUsesContext, normalizeCollectionResult, normalizeGalleryImage, normalizeIconClass, parentBreakpoint, parseUrlList, partClassName, planDataSource, planResponsiveRules, referencedDataSources, referencedDataSourcesDeep, renderDefaultDeclarations, resetSeoField, resolveBoundValue, resolveContextValue, resolveDerivedInto, resolveGalleryEffect, resolveGalleryUrls, resolveInputChain, resolveInputs, resolvePageTransition, resolvePath, resolveRelativeInto, resolveRepeaterItems, resolveSeo, resolveSiblings, resolveSingleItemId, resolveStateStyles, resolveStyleProps, resolveValueChain, rewriteViewportUnits, safeSetInput, setInputOverride, setOverride, setSeoAuto, setSeoBinding, setSeoOverride, setSeoValue, stateNamesIn, stripSuppressedProps, variableAliases, variableItemsFrom, withContextSlots, wrapInBreakpointQuery, wrapInMediaQuery };
6994
+ export { AOSService, BACKDROP_TWIN_KEY, BACKDROP_WHOLE_KEY, BREAKPOINTS, Breakpoint, BreakpointQueryKind, BuilderButtonComponent, BuilderDividerComponent, BuilderHeadingComponent, BuilderIconComponent, BuilderImageComponent, BuilderLinkComponent, BuilderSpacerComponent, ButtonBlockComponent, CONTAINER_HTML_TAGS, CONTEXT_ACTION_TYPES, CardComponent, ClientGalleryComponent, ClientListComponent, ClientListItemComponent, ClientRepeaterComponent, ClientSliderContainerComponent, ClientSliderSlideComponent, ComponentInstanceRegistryService, ContainerComponent, ContextStore, DEFAULT_GALLERY_SCHEDULER, DEFAULT_PAGE_TRANSITION, DEFAULT_PAGE_TRANSITION_DURATION, DEFAULT_PAGE_TRANSITION_EASING, DEFAULT_PAGE_TRANSITION_PERSPECTIVE, DEFAULT_PHOSPHOR_WEIGHT, DEFAULT_WIDTH_BY_TYPE, DeclarationContext, FormRenderState, FormRuntimeService, GALLERY_EFFECTS, GALLERY_EFFECT_DESCRIPTORS, GalleryLoop, HOVER_DEFAULT_TRANSITION, HOVER_STATES, IOX_BUILDER_EVENTS, IOX_FORM_MESSAGES, IOX_FORM_NAVIGATOR, IOX_FORM_TRANSPORT, IS_PREVIEW, IoxAnimateContainer, IoxAosDirective, IoxAosModule, IoxBuilderComponentsModule, IoxComponentRegistryService, IoxDialogComponent, IoxFieldComponent, IoxFormComponent, IoxFormErrorComponent, IoxFormSuccessComponent, IoxPageComponent, IoxPageModule, IoxSubmitButtonComponent, IoxUiModule, LinkedContainerComponent, PAGE_TRANSITION_CATEGORIES, PAGE_TRANSITION_PRESETS, PART_CLASS_NAMES, PIPE_DESCRIPTORS, PIPE_REGISTRY, PageScrollProvider, RESERVED_ALIAS_PREFIX, STATE_PSEUDO_CLASS, SUPPRESSED_STYLE_PROPS_BY_TYPE, SWIPER_RESPONSIVE_TRAITS, SectionComponent, TRANSITION_FEELS, TextBlockComponent, VALIDATION_STATES, VALIDATION_STATE_CLASS, VIRTUAL_TRAIT_GROUPS, VIRTUAL_TRAIT_KEYS, ViewPositionDirective, ViewPositionModule, activeActions, applyBindingPipes, applyFeel, breakpointDef, breakpointForWidth, breakpointQueryFor, buildDataSourceFilter, buildPartSelector, buildRelatedFilter, buildSwiperBreakpoints, buildTargetedStateSelector, buildTransitionTimeline, cascadeChain, clearInputOverride, clearOverride, collectContextSlotKeys, collectReferencedAliases, compileDeclarations, compilePageStyle, composeVirtualTraits, computeRelative, containerHtmlTag, contextActionEffect, contextSlotKeys, countOverrides, dataSourcePlanToRequest, declaredInputNames, defaultMessageResolver, deriveSeoFromContent, describeSeoFields, effectiveTransitionId, excludeSelf, feelFor, getByPath, getSeoValue, hasHoverState, hasOwnTransition, initialSlotValues, isActionEnabled, isContextAction, isInputOverriddenAt, isOverriddenAt, isReservedAlias, isValidSlotKey, legacyEnterToTransition, matchRouteParams, mediaQueryFor, mergeSwiperBreakpoints, nearestCommonAncestorId, nodeCssId, nodeUsesContext, normalizeCollectionResult, normalizeGalleryImage, normalizeIconClass, parentBreakpoint, parseUrlList, partClassName, planDataSource, planResponsiveRules, referencedDataSources, referencedDataSourcesDeep, renderDefaultDeclarations, resetSeoField, resolveBoundValue, resolveContextValue, resolveDerivedInto, resolveGalleryEffect, resolveGalleryUrls, resolveInputChain, resolveInputs, resolvePageTransition, resolvePath, resolveRelativeInto, resolveRepeaterItems, resolveSeo, resolveSiblings, resolveSingleItemId, resolveStateStyles, resolveStyleProps, resolveValueChain, rewriteViewportUnits, safeSetInput, setInputOverride, setOverride, setSeoAuto, setSeoBinding, setSeoOverride, setSeoValue, stateNamesIn, statePseudoClass, stripSuppressedProps, variableAliases, variableItemsFrom, withContextSlots, withDefaultHoverTransition, wrapInBreakpointQuery, wrapInMediaQuery };
6863
6995
  //# sourceMappingURL=vectoriox-iox-ui.mjs.map