@vectoriox/iox-ui 4.2.9 → 4.2.11

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.
@@ -1227,6 +1227,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
1227
1227
  type: Input
1228
1228
  }] } });
1229
1229
 
1230
+ /**
1231
+ * Directive-host Heading: the real `<h1>`…`<h6>` IS the host — no `app-builder-heading`
1232
+ * wrapper, no inner/outer split. The tag is chosen by whoever CREATES the component
1233
+ * (engine: `createComponent({ hostElement: document.createElement(level) })`; builder:
1234
+ * RenderDirective does the same), NOT by an internal ngSwitch. `level` is kept as an input
1235
+ * for that creation logic + serialization. Editing (contenteditable) runs in the builder only.
1236
+ */
1230
1237
  class BuilderHeadingComponent {
1231
1238
  constructor(events, cdr) {
1232
1239
  this.events = events;
@@ -1263,11 +1270,12 @@ class BuilderHeadingComponent {
1263
1270
  this.syncTraitToPanel('content', newValue);
1264
1271
  }
1265
1272
  onKeyDown(event) {
1266
- if (event.key === 'Enter' && !event.shiftKey) {
1273
+ const ke = event;
1274
+ if (ke.key === 'Enter' && !ke.shiftKey) {
1267
1275
  event.preventDefault();
1268
1276
  event.target.blur();
1269
1277
  }
1270
- if (event.key === 'Escape') {
1278
+ if (ke.key === 'Escape') {
1271
1279
  this.editing = false;
1272
1280
  this.cdr.reattach();
1273
1281
  event.target.blur();
@@ -1287,65 +1295,18 @@ class BuilderHeadingComponent {
1287
1295
  this.events.emit('elementselect', { node: this.node, componentRef: null, isCanvasUpdate: true });
1288
1296
  }
1289
1297
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BuilderHeadingComponent, deps: [{ token: IOX_BUILDER_EVENTS, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1290
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: BuilderHeadingComponent, isStandalone: false, selector: "app-builder-heading", inputs: { content: "content", level: "level", nodeId: "nodeId", node: "node" }, ngImport: i0, template: `
1291
- <ng-container [ngSwitch]="level">
1292
- <h1 *ngSwitchCase="'h1'" [ngClass]="'iox-node-' + nodeId"
1293
- [attr.contenteditable]="editing ? 'true' : null"
1294
- (mousedown)="onMouseDown($event)"
1295
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h1>
1296
- <h2 *ngSwitchCase="'h2'" [ngClass]="'iox-node-' + nodeId"
1297
- [attr.contenteditable]="editing ? 'true' : null"
1298
- (mousedown)="onMouseDown($event)"
1299
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h2>
1300
- <h3 *ngSwitchCase="'h3'" [ngClass]="'iox-node-' + nodeId"
1301
- [attr.contenteditable]="editing ? 'true' : null"
1302
- (mousedown)="onMouseDown($event)"
1303
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h3>
1304
- <h4 *ngSwitchCase="'h4'" [ngClass]="'iox-node-' + nodeId"
1305
- [attr.contenteditable]="editing ? 'true' : null"
1306
- (mousedown)="onMouseDown($event)"
1307
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h4>
1308
- <h5 *ngSwitchCase="'h5'" [ngClass]="'iox-node-' + nodeId"
1309
- [attr.contenteditable]="editing ? 'true' : null"
1310
- (mousedown)="onMouseDown($event)"
1311
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h5>
1312
- <h6 *ngSwitchDefault [ngClass]="'iox-node-' + nodeId"
1313
- [attr.contenteditable]="editing ? 'true' : null"
1314
- (mousedown)="onMouseDown($event)"
1315
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h6>
1316
- </ng-container>
1317
- `, isInline: true, styles: ["h1,h2,h3,h4,h5,h6{margin:0}[contenteditable]{outline:none;cursor:text}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$2.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1298
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: BuilderHeadingComponent, isStandalone: false, selector: "h1[iox-heading],h2[iox-heading],h3[iox-heading],h4[iox-heading],h5[iox-heading],h6[iox-heading]", inputs: { content: "content", level: "level", nodeId: "nodeId", node: "node" }, host: { listeners: { "mousedown": "onMouseDown($event)", "dblclick": "startEdit($event)", "blur": "commitEdit($event)", "keydown": "onKeyDown($event)" }, properties: { "class": "'iox-node-' + nodeId", "attr.contenteditable": "editing ? 'true' : null" } }, ngImport: i0, template: `{{ content }}`, isInline: true, styles: [":host{margin:0}:host[contenteditable]{outline:none;cursor:text}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1318
1299
  }
1319
1300
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BuilderHeadingComponent, decorators: [{
1320
1301
  type: Component,
1321
- args: [{ selector: 'app-builder-heading', template: `
1322
- <ng-container [ngSwitch]="level">
1323
- <h1 *ngSwitchCase="'h1'" [ngClass]="'iox-node-' + nodeId"
1324
- [attr.contenteditable]="editing ? 'true' : null"
1325
- (mousedown)="onMouseDown($event)"
1326
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h1>
1327
- <h2 *ngSwitchCase="'h2'" [ngClass]="'iox-node-' + nodeId"
1328
- [attr.contenteditable]="editing ? 'true' : null"
1329
- (mousedown)="onMouseDown($event)"
1330
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h2>
1331
- <h3 *ngSwitchCase="'h3'" [ngClass]="'iox-node-' + nodeId"
1332
- [attr.contenteditable]="editing ? 'true' : null"
1333
- (mousedown)="onMouseDown($event)"
1334
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h3>
1335
- <h4 *ngSwitchCase="'h4'" [ngClass]="'iox-node-' + nodeId"
1336
- [attr.contenteditable]="editing ? 'true' : null"
1337
- (mousedown)="onMouseDown($event)"
1338
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h4>
1339
- <h5 *ngSwitchCase="'h5'" [ngClass]="'iox-node-' + nodeId"
1340
- [attr.contenteditable]="editing ? 'true' : null"
1341
- (mousedown)="onMouseDown($event)"
1342
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h5>
1343
- <h6 *ngSwitchDefault [ngClass]="'iox-node-' + nodeId"
1344
- [attr.contenteditable]="editing ? 'true' : null"
1345
- (mousedown)="onMouseDown($event)"
1346
- (dblclick)="startEdit($event)" (blur)="commitEdit($event)" (keydown)="onKeyDown($event)">{{ content }}</h6>
1347
- </ng-container>
1348
- `, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["h1,h2,h3,h4,h5,h6{margin:0}[contenteditable]{outline:none;cursor:text}\n"] }]
1302
+ args: [{ selector: 'h1[iox-heading],h2[iox-heading],h3[iox-heading],h4[iox-heading],h5[iox-heading],h6[iox-heading]', template: `{{ content }}`, host: {
1303
+ '[class]': "'iox-node-' + nodeId",
1304
+ '[attr.contenteditable]': "editing ? 'true' : null",
1305
+ '(mousedown)': 'onMouseDown($event)',
1306
+ '(dblclick)': 'startEdit($event)',
1307
+ '(blur)': 'commitEdit($event)',
1308
+ '(keydown)': 'onKeyDown($event)',
1309
+ }, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{margin:0}:host[contenteditable]{outline:none;cursor:text}\n"] }]
1349
1310
  }], ctorParameters: () => [{ type: undefined, decorators: [{
1350
1311
  type: Optional
1351
1312
  }, {
@@ -1361,6 +1322,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
1361
1322
  type: Input
1362
1323
  }] } });
1363
1324
 
1325
+ /**
1326
+ * Directive-host Text: the real `<p>`/`<span>` IS the host — no `app-text-block` wrapper,
1327
+ * no inner/outer split. The tag is chosen by whoever CREATES the component (engine/builder
1328
+ * pass `hostElement`), NOT an internal ngSwitch. Content is rich HTML (Quill) → bound via
1329
+ * `[innerHTML]` on the host. Editing (contenteditable) runs in the builder only.
1330
+ */
1364
1331
  class TextBlockComponent {
1365
1332
  constructor(events, cdr) {
1366
1333
  this.events = events;
@@ -1409,7 +1376,7 @@ class TextBlockComponent {
1409
1376
  const newValue = el.innerText;
1410
1377
  this.content = newValue;
1411
1378
  // Explicitly reset to plain text so any pasted HTML nodes are gone
1412
- // before Angular re-renders {{ content }}
1379
+ // before Angular re-renders [innerHTML]
1413
1380
  el.textContent = newValue;
1414
1381
  this.cdr.reattach();
1415
1382
  this.syncTraitToPanel('content', newValue);
@@ -1435,57 +1402,21 @@ class TextBlockComponent {
1435
1402
  this.events.emit('elementselect', { node: this.node, componentRef: null, isCanvasUpdate: true });
1436
1403
  }
1437
1404
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: TextBlockComponent, deps: [{ token: IOX_BUILDER_EVENTS, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1438
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: TextBlockComponent, isStandalone: false, selector: "app-text-block", inputs: { content: "content", tag: "tag", style: "style", nodeId: "nodeId", node: "node" }, ngImport: i0, template: `
1439
- <ng-container [ngSwitch]="tag">
1440
- <p *ngSwitchDefault
1441
- [ngClass]="'iox-node-' + nodeId"
1442
- [attr.contenteditable]="editing ? 'true' : null"
1443
- (pointerdown)="onPointerDown($event)"
1444
- (mousedown)="onMouseDown($event)"
1445
- (dblclick)="startEdit($event)"
1446
- (blur)="commitEdit($event)"
1447
- (keydown)="onKeyDown($event)"
1448
- (paste)="onPaste($event)"
1449
- [innerHTML]="content"></p>
1450
- <span *ngSwitchCase="'span'"
1451
- [ngClass]="'iox-node-' + nodeId"
1452
- [attr.contenteditable]="editing ? 'true' : null"
1453
- (pointerdown)="onPointerDown($event)"
1454
- (mousedown)="onMouseDown($event)"
1455
- (dblclick)="startEdit($event)"
1456
- (blur)="commitEdit($event)"
1457
- (keydown)="onKeyDown($event)"
1458
- (paste)="onPaste($event)"
1459
- [innerHTML]="content"></span>
1460
- </ng-container>
1461
- `, isInline: true, styles: ["p,span{margin:0;white-space:pre-wrap}[contenteditable]{outline:none;cursor:text}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$2.NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
1405
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: TextBlockComponent, isStandalone: false, selector: "p[iox-text],span[iox-text]", inputs: { content: "content", tag: "tag", style: "style", nodeId: "nodeId", node: "node" }, host: { listeners: { "pointerdown": "onPointerDown($event)", "mousedown": "onMouseDown($event)", "dblclick": "startEdit($event)", "blur": "commitEdit($event)", "keydown": "onKeyDown($event)", "paste": "onPaste($event)" }, properties: { "class": "'iox-node-' + nodeId", "innerHTML": "content", "attr.contenteditable": "editing ? 'true' : null" } }, ngImport: i0, template: ``, isInline: true, styles: [":host{margin:0;white-space:pre-wrap}:host[contenteditable]{outline:none;cursor:text}\n"] }); }
1462
1406
  }
1463
1407
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: TextBlockComponent, decorators: [{
1464
1408
  type: Component,
1465
- args: [{ selector: 'app-text-block', template: `
1466
- <ng-container [ngSwitch]="tag">
1467
- <p *ngSwitchDefault
1468
- [ngClass]="'iox-node-' + nodeId"
1469
- [attr.contenteditable]="editing ? 'true' : null"
1470
- (pointerdown)="onPointerDown($event)"
1471
- (mousedown)="onMouseDown($event)"
1472
- (dblclick)="startEdit($event)"
1473
- (blur)="commitEdit($event)"
1474
- (keydown)="onKeyDown($event)"
1475
- (paste)="onPaste($event)"
1476
- [innerHTML]="content"></p>
1477
- <span *ngSwitchCase="'span'"
1478
- [ngClass]="'iox-node-' + nodeId"
1479
- [attr.contenteditable]="editing ? 'true' : null"
1480
- (pointerdown)="onPointerDown($event)"
1481
- (mousedown)="onMouseDown($event)"
1482
- (dblclick)="startEdit($event)"
1483
- (blur)="commitEdit($event)"
1484
- (keydown)="onKeyDown($event)"
1485
- (paste)="onPaste($event)"
1486
- [innerHTML]="content"></span>
1487
- </ng-container>
1488
- `, standalone: false, styles: ["p,span{margin:0;white-space:pre-wrap}[contenteditable]{outline:none;cursor:text}\n"] }]
1409
+ args: [{ selector: 'p[iox-text],span[iox-text]', template: ``, host: {
1410
+ '[class]': "'iox-node-' + nodeId",
1411
+ '[innerHTML]': 'content',
1412
+ '[attr.contenteditable]': "editing ? 'true' : null",
1413
+ '(pointerdown)': 'onPointerDown($event)',
1414
+ '(mousedown)': 'onMouseDown($event)',
1415
+ '(dblclick)': 'startEdit($event)',
1416
+ '(blur)': 'commitEdit($event)',
1417
+ '(keydown)': 'onKeyDown($event)',
1418
+ '(paste)': 'onPaste($event)',
1419
+ }, standalone: false, styles: [":host{margin:0;white-space:pre-wrap}:host[contenteditable]{outline:none;cursor:text}\n"] }]
1489
1420
  }], ctorParameters: () => [{ type: undefined, decorators: [{
1490
1421
  type: Optional
1491
1422
  }, {
@@ -1509,11 +1440,11 @@ class SectionComponent {
1509
1440
  this.nodeId = '';
1510
1441
  }
1511
1442
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: SectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1512
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: SectionComponent, isStandalone: false, selector: "section[iox-section]", 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{display:block;position:relative;box-sizing:border-box}\n"] }); }
1443
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: SectionComponent, isStandalone: false, selector: "section[iox-section]", 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"] }); }
1513
1444
  }
1514
1445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: SectionComponent, decorators: [{
1515
1446
  type: Component,
1516
- args: [{ selector: 'section[iox-section]', template: `<ng-container #childrenHost></ng-container>`, host: { '[class]': "'iox-node-' + nodeId" }, standalone: false, styles: [":host{display:block;position:relative;box-sizing:border-box}\n"] }]
1447
+ args: [{ selector: 'section[iox-section]', template: `<ng-container #childrenHost></ng-container>`, host: { '[class]': "'iox-node-' + nodeId" }, standalone: false, styles: [":host{box-sizing:border-box}\n"] }]
1517
1448
  }], propDecorators: { nodeId: [{
1518
1449
  type: Input
1519
1450
  }], childrenHost: [{
@@ -1527,11 +1458,11 @@ class ContainerComponent {
1527
1458
  this.nodeId = '';
1528
1459
  }
1529
1460
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: ContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1530
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", 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{display:block;position:relative;box-sizing:border-box}\n"] }); }
1461
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", 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"] }); }
1531
1462
  }
1532
1463
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: ContainerComponent, decorators: [{
1533
1464
  type: Component,
1534
- args: [{ selector: 'div[iox-container]', template: `<ng-container #childrenHost></ng-container>`, host: { '[class]': "'iox-node-' + nodeId" }, standalone: false, styles: [":host{display:block;position:relative;box-sizing:border-box}\n"] }]
1465
+ 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"] }]
1535
1466
  }], propDecorators: { nodeId: [{
1536
1467
  type: Input
1537
1468
  }], childrenHost: [{
@@ -1567,7 +1498,7 @@ class LinkedContainerComponent {
1567
1498
  return this.pageRoute || '#';
1568
1499
  }
1569
1500
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: LinkedContainerComponent, deps: [{ token: i0.ElementRef }, { token: IS_PREVIEW, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1570
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: LinkedContainerComponent, isStandalone: false, selector: "a[iox-linked-container]", inputs: { nodeId: "nodeId", linkType: "linkType", url: "url", pageRoute: "pageRoute", target: "target" }, host: { properties: { "attr.href": "resolvedHref", "attr.target": "target", "class": "'linked-container-root 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{display:block;position:relative;box-sizing:border-box;text-decoration:none;color:inherit;cursor:pointer}\n"] }); }
1501
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: LinkedContainerComponent, isStandalone: false, selector: "a[iox-linked-container]", inputs: { nodeId: "nodeId", linkType: "linkType", url: "url", pageRoute: "pageRoute", target: "target" }, host: { properties: { "attr.href": "resolvedHref", "attr.target": "target", "class": "'linked-container-root 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;text-decoration:none;cursor:pointer}\n"] }); }
1571
1502
  }
1572
1503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: LinkedContainerComponent, decorators: [{
1573
1504
  type: Component,
@@ -1575,7 +1506,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
1575
1506
  '[attr.href]': 'resolvedHref',
1576
1507
  '[attr.target]': 'target',
1577
1508
  '[class]': "'linked-container-root iox-node-' + nodeId",
1578
- }, standalone: false, styles: [":host{display:block;position:relative;box-sizing:border-box;text-decoration:none;color:inherit;cursor:pointer}\n"] }]
1509
+ }, standalone: false, styles: [":host{box-sizing:border-box;text-decoration:none;cursor:pointer}\n"] }]
1579
1510
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
1580
1511
  type: Optional
1581
1512
  }, {
@@ -1627,6 +1558,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
1627
1558
  args: ['childrenHost', { read: ViewContainerRef, static: true }]
1628
1559
  }] } });
1629
1560
 
1561
+ /**
1562
+ * Directive-host ButtonBlock: the real `<a>`/`<button>` IS the host — no `app-button-block`
1563
+ * wrapper, no inner/outer split. The tag is chosen by whoever CREATES the component (engine
1564
+ * passes `hostElement`: `<a>` when `tag==='a'`, else `<button>`), NOT an internal `*ngIf`.
1565
+ * The `iox-btn-block` class (UA resets: inline-flex, color/font inherit, no border) matches the
1566
+ * string renderer and lives in the engine's global styles.scss — kept OFF `:host` so styleProps
1567
+ * (`.iox-node-{id}`) can override it. Children render into the host via `childrenHost`.
1568
+ */
1630
1569
  class ButtonBlockComponent {
1631
1570
  constructor() {
1632
1571
  this.tag = 'button';
@@ -1635,39 +1574,17 @@ class ButtonBlockComponent {
1635
1574
  this.type = 'button';
1636
1575
  this.nodeId = '';
1637
1576
  }
1638
- get childrenHost() {
1639
- return this.tag === 'a' ? this.linkHost : this.buttonHost;
1640
- }
1641
1577
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: ButtonBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1642
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: ButtonBlockComponent, isStandalone: false, selector: "app-button-block", inputs: { tag: "tag", href: "href", target: "target", type: "type", nodeId: "nodeId" }, viewQueries: [{ propertyName: "buttonHost", first: true, predicate: ["buttonHost"], descendants: true, read: ViewContainerRef }, { propertyName: "linkHost", first: true, predicate: ["linkHost"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
1643
- <button *ngIf="tag !== 'a'"
1644
- [ngClass]="'iox-node-' + nodeId"
1645
- [attr.type]="type">
1646
- <ng-container #buttonHost></ng-container>
1647
- </button>
1648
- <a *ngIf="tag === 'a'"
1649
- [ngClass]="'iox-node-' + nodeId"
1650
- [attr.href]="href || null"
1651
- [attr.target]="target || null">
1652
- <ng-container #linkHost></ng-container>
1653
- </a>
1654
- `, isInline: true, styles: ["button,a{width:100%;font:inherit;color:inherit;text-decoration:none;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1578
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: ButtonBlockComponent, isStandalone: false, selector: "a[iox-button-block],button[iox-button-block]", inputs: { tag: "tag", href: "href", target: "target", type: "type", nodeId: "nodeId" }, host: { properties: { "class": "'iox-btn-block iox-node-' + nodeId", "attr.href": "tag === 'a' ? (href || null) : null", "attr.target": "tag === 'a' ? (target || null) : null", "attr.type": "tag === 'a' ? null : type" } }, 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"] }); }
1655
1579
  }
1656
1580
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: ButtonBlockComponent, decorators: [{
1657
1581
  type: Component,
1658
- args: [{ selector: 'app-button-block', template: `
1659
- <button *ngIf="tag !== 'a'"
1660
- [ngClass]="'iox-node-' + nodeId"
1661
- [attr.type]="type">
1662
- <ng-container #buttonHost></ng-container>
1663
- </button>
1664
- <a *ngIf="tag === 'a'"
1665
- [ngClass]="'iox-node-' + nodeId"
1666
- [attr.href]="href || null"
1667
- [attr.target]="target || null">
1668
- <ng-container #linkHost></ng-container>
1669
- </a>
1670
- `, standalone: false, styles: ["button,a{width:100%;font:inherit;color:inherit;text-decoration:none;box-sizing:border-box}\n"] }]
1582
+ args: [{ selector: 'a[iox-button-block],button[iox-button-block]', template: `<ng-container #childrenHost></ng-container>`, host: {
1583
+ '[class]': "'iox-btn-block iox-node-' + nodeId",
1584
+ '[attr.href]': "tag === 'a' ? (href || null) : null",
1585
+ '[attr.target]': "tag === 'a' ? (target || null) : null",
1586
+ '[attr.type]': "tag === 'a' ? null : type",
1587
+ }, standalone: false, styles: [":host{box-sizing:border-box}\n"] }]
1671
1588
  }], propDecorators: { tag: [{
1672
1589
  type: Input
1673
1590
  }], href: [{
@@ -1678,12 +1595,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
1678
1595
  type: Input
1679
1596
  }], nodeId: [{
1680
1597
  type: Input
1681
- }], buttonHost: [{
1682
- type: ViewChild,
1683
- args: ['buttonHost', { read: ViewContainerRef, static: false }]
1684
- }], linkHost: [{
1598
+ }], childrenHost: [{
1685
1599
  type: ViewChild,
1686
- args: ['linkHost', { read: ViewContainerRef, static: false }]
1600
+ args: ['childrenHost', { read: ViewContainerRef, static: true }]
1687
1601
  }] } });
1688
1602
 
1689
1603
  class ClientSliderContainerComponent {
@@ -1915,12 +1829,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
1915
1829
  }] } });
1916
1830
 
1917
1831
  /**
1918
- * Client-engine List. Renders a real `<ul>`/`<ol>` (chosen by the `htmlTag` trait) with the
1919
- * shared `iox-node-{id}` class, and inserts children into it via `childrenHost`. `:host` uses
1920
- * `display: contents` so the `<ul>`/`<ol>` is the effective layout child of its parent.
1921
- *
1922
- * The host is chosen from a `*ngIf` branch, so its ViewContainerRef only resolves after change
1923
- * detection — ClientTreeRendererService detects changes before reading `childrenHost`.
1832
+ * Directive-host List: the real `<ul>`/`<ol>` IS the host — no `iox-list` wrapper, no
1833
+ * inner/outer split. The tag is chosen by whoever CREATES the component (engine passes
1834
+ * `hostElement: document.createElement(htmlTag)`), NOT an internal `*ngIf`. Children render
1835
+ * into the host via `childrenHost`. `start`/`reversed` are host attrs (only meaningful on `<ol>`).
1924
1836
  */
1925
1837
  class ClientListComponent {
1926
1838
  constructor() {
@@ -1929,33 +1841,16 @@ class ClientListComponent {
1929
1841
  this.reversed = false;
1930
1842
  this.nodeId = '';
1931
1843
  }
1932
- get childrenHost() {
1933
- return this.htmlTag === 'ol' ? this.olHost : this.ulHost;
1934
- }
1935
1844
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: ClientListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1936
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: ClientListComponent, isStandalone: false, selector: "iox-list", inputs: { htmlTag: "htmlTag", start: "start", reversed: "reversed", nodeId: "nodeId" }, viewQueries: [{ propertyName: "olHost", first: true, predicate: ["olHost"], descendants: true, read: ViewContainerRef }, { propertyName: "ulHost", first: true, predicate: ["ulHost"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
1937
- <ol *ngIf="htmlTag === 'ol'" [ngClass]="'iox-node-' + nodeId"
1938
- [attr.start]="start !== '' && start != null ? start : null"
1939
- [attr.reversed]="reversed ? '' : null">
1940
- <ng-container #olHost></ng-container>
1941
- </ol>
1942
- <ul *ngIf="htmlTag !== 'ol'" [ngClass]="'iox-node-' + nodeId">
1943
- <ng-container #ulHost></ng-container>
1944
- </ul>
1945
- `, isInline: true, styles: [":host{display:contents}ul,ol{margin:0;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1845
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: ClientListComponent, isStandalone: false, selector: "ul[iox-list],ol[iox-list]", inputs: { htmlTag: "htmlTag", start: "start", reversed: "reversed", nodeId: "nodeId" }, host: { properties: { "class": "'iox-node-' + nodeId", "attr.start": "htmlTag === 'ol' && start !== '' && start != null ? start : null", "attr.reversed": "htmlTag === 'ol' && reversed ? '' : null" } }, 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{margin:0;box-sizing:border-box}\n"] }); }
1946
1846
  }
1947
1847
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: ClientListComponent, decorators: [{
1948
1848
  type: Component,
1949
- args: [{ selector: 'iox-list', template: `
1950
- <ol *ngIf="htmlTag === 'ol'" [ngClass]="'iox-node-' + nodeId"
1951
- [attr.start]="start !== '' && start != null ? start : null"
1952
- [attr.reversed]="reversed ? '' : null">
1953
- <ng-container #olHost></ng-container>
1954
- </ol>
1955
- <ul *ngIf="htmlTag !== 'ol'" [ngClass]="'iox-node-' + nodeId">
1956
- <ng-container #ulHost></ng-container>
1957
- </ul>
1958
- `, standalone: false, styles: [":host{display:contents}ul,ol{margin:0;box-sizing:border-box}\n"] }]
1849
+ args: [{ selector: 'ul[iox-list],ol[iox-list]', template: `<ng-container #childrenHost></ng-container>`, host: {
1850
+ '[class]': "'iox-node-' + nodeId",
1851
+ '[attr.start]': "htmlTag === 'ol' && start !== '' && start != null ? start : null",
1852
+ '[attr.reversed]': "htmlTag === 'ol' && reversed ? '' : null",
1853
+ }, standalone: false, styles: [":host{margin:0;box-sizing:border-box}\n"] }]
1959
1854
  }], propDecorators: { htmlTag: [{
1960
1855
  type: Input
1961
1856
  }], start: [{
@@ -1964,29 +1859,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
1964
1859
  type: Input
1965
1860
  }], nodeId: [{
1966
1861
  type: Input
1967
- }], olHost: [{
1968
- type: ViewChild,
1969
- args: ['olHost', { read: ViewContainerRef }]
1970
- }], ulHost: [{
1862
+ }], childrenHost: [{
1971
1863
  type: ViewChild,
1972
- args: ['ulHost', { read: ViewContainerRef }]
1864
+ args: ['childrenHost', { read: ViewContainerRef, static: true }]
1973
1865
  }] } });
1974
1866
 
1975
1867
  /**
1976
- * Client-engine List item. Renders a real `<li>` with the shared `iox-node-{id}` class.
1977
- * `:host { display: contents }` removes the `iox-list-item` wrapper from the box tree so the
1978
- * `<li>` is a proper (marker-bearing) child of the parent `<ul>`/`<ol>`.
1868
+ * Directive-host List item: the real `<li>` IS the host — no `iox-list-item` wrapper, no
1869
+ * inner/outer split. Children render into the `<li>` via `childrenHost`. Fixed tag (`<li>`),
1870
+ * so the engine creates it with `vcr.createComponent` (no `hostElement` needed).
1979
1871
  */
1980
1872
  class ClientListItemComponent {
1981
1873
  constructor() {
1982
1874
  this.nodeId = '';
1983
1875
  }
1984
1876
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: ClientListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1985
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: ClientListItemComponent, isStandalone: false, selector: "iox-list-item", inputs: { nodeId: "nodeId" }, viewQueries: [{ propertyName: "childrenHost", first: true, predicate: ["childrenHost"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `<li [ngClass]="'iox-node-' + nodeId"><ng-container #childrenHost></ng-container></li>`, isInline: true, styles: [":host{display:contents}li{box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
1877
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.11", type: ClientListItemComponent, isStandalone: false, selector: "li[iox-list-item]", 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"] }); }
1986
1878
  }
1987
1879
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: ClientListItemComponent, decorators: [{
1988
1880
  type: Component,
1989
- args: [{ selector: 'iox-list-item', template: `<li [ngClass]="'iox-node-' + nodeId"><ng-container #childrenHost></ng-container></li>`, standalone: false, styles: [":host{display:contents}li{box-sizing:border-box}\n"] }]
1881
+ args: [{ selector: 'li[iox-list-item]', template: `<ng-container #childrenHost></ng-container>`, host: { '[class]': "'iox-node-' + nodeId" }, standalone: false, styles: [":host{box-sizing:border-box}\n"] }]
1990
1882
  }], propDecorators: { nodeId: [{
1991
1883
  type: Input
1992
1884
  }], childrenHost: [{
@@ -2223,6 +2115,15 @@ function renderDefaultDeclarations(type, styleProps, hasHoverState) {
2223
2115
  out.push('object-fit: cover');
2224
2116
  out.push('height: auto');
2225
2117
  }
2118
+ // Containers default to a positioning context (for absolutely-positioned children). These live
2119
+ // in `.iox-node` (not the component `:host`) so an explicit styleProps value always wins.
2120
+ if ((type === 'Container' || type === 'Section' || type === 'LinkedContainer') && sp['position'] === undefined) {
2121
+ out.push('position: relative');
2122
+ }
2123
+ // LinkedContainer is an <a> (inline by default) → default it to block so children lay out.
2124
+ if (type === 'LinkedContainer' && sp['display'] === undefined) {
2125
+ out.push('display: block');
2126
+ }
2226
2127
  return out;
2227
2128
  }
2228
2129