@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.
- package/design-core/index.d.ts +122 -36
- package/fesm2022/vectoriox-iox-ui-design-core.mjs +217 -76
- package/fesm2022/vectoriox-iox-ui-design-core.mjs.map +1 -1
- package/fesm2022/vectoriox-iox-ui.mjs +154 -22
- package/fesm2022/vectoriox-iox-ui.mjs.map +1 -1
- package/index.d.ts +67 -4
- package/package.json +1 -1
- package/src/design-core/element-styles.ts +271 -0
- package/src/design-core/flavor.ts +11 -88
- package/src/design-core/public-api.ts +1 -0
- package/src/design-core/token-css.ts +25 -6
- package/styles/iox-forms.css +56 -5
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
/**
|
|
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 (
|
|
1333
|
-
result[
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
4837
|
-
|
|
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
|