@vectoriox/iox-builder 1.5.7 → 1.5.8

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.
@@ -1407,9 +1407,14 @@ class InteractionEngineService {
1407
1407
  }
1408
1408
  // ── Private ──────────────────────────────────────────────
1409
1409
  attachInteraction(node, ix, element) {
1410
- // In builder mode, automatic triggers don't auto-fire — use the play button instead.
1410
+ // In builder mode, scroll-based and time-based triggers don't auto-fire — use the
1411
+ // play button instead. viewportEnter is skipped because the IntersectionObserver
1412
+ // fires immediately (element is visible in the canvas) and its WAAPI animation +
1413
+ // the overlay ResizeObserver feedback loop triggers NG0103 during synchronize().
1411
1414
  // Click/hover remain active so users can test those interactions on the canvas.
1412
- if (this.isBuilderMode() && (ix.trigger === 'pageLoad' || ix.trigger === 'scrollProgress')) {
1415
+ if (this.isBuilderMode() && (ix.trigger === 'pageLoad' ||
1416
+ ix.trigger === 'scrollProgress' ||
1417
+ ix.trigger === 'viewportEnter')) {
1413
1418
  return () => { };
1414
1419
  }
1415
1420
  switch (ix.trigger) {
@@ -5554,6 +5559,7 @@ class SliderContainerComponent {
5554
5559
  this._orgId = 'default';
5555
5560
  this.instanceRegistry = inject(ComponentInstanceRegistryService);
5556
5561
  this.interactionEngine = inject(InteractionEngineService);
5562
+ this.ngZone = inject(NgZone);
5557
5563
  this.isPreview = !!isPreview;
5558
5564
  }
5559
5565
  ngOnInit() {
@@ -5572,7 +5578,11 @@ class SliderContainerComponent {
5572
5578
  }
5573
5579
  }
5574
5580
  ngAfterViewInit() {
5575
- this._initRafId = requestAnimationFrame(() => this._initSwiper());
5581
+ // Run outside Angular's zone so Swiper's internal ResizeObserver, MutationObserver,
5582
+ // and RAF-based animation loops don't trigger unnecessary CD ticks.
5583
+ this.ngZone.runOutsideAngular(() => {
5584
+ this._initRafId = requestAnimationFrame(() => this._initSwiper());
5585
+ });
5576
5586
  }
5577
5587
  ngOnChanges(changes) {
5578
5588
  if (!this._swiper)
@@ -5600,7 +5610,9 @@ class SliderContainerComponent {
5600
5610
  const hasConfigChange = Object.keys(changes).some(k => relevantKeys.has(k));
5601
5611
  if (hasConfigChange) {
5602
5612
  this._destroySwiper();
5603
- this._initRafId = requestAnimationFrame(() => this._initSwiper());
5613
+ this.ngZone.runOutsideAngular(() => {
5614
+ this._initRafId = requestAnimationFrame(() => this._initSwiper());
5615
+ });
5604
5616
  }
5605
5617
  }
5606
5618
  ngOnDestroy() {
@@ -5615,9 +5627,10 @@ class SliderContainerComponent {
5615
5627
  if (this._source)
5616
5628
  return; // repeat mode: drops disabled, slides come from data source
5617
5629
  this.dragEngine.handleDrop(this.children, event, this.dropListId, this.cdr);
5618
- // Sync Swiper's internal slide list after drag-drop reorder
5619
5630
  if (this._swiper) {
5620
- requestAnimationFrame(() => this._swiper?.update());
5631
+ this.ngZone.runOutsideAngular(() => {
5632
+ requestAnimationFrame(() => this._swiper?.update());
5633
+ });
5621
5634
  }
5622
5635
  }
5623
5636
  // ── Data fetching ───────────────────────────────────────────────────────────
@@ -5692,7 +5705,9 @@ class SliderContainerComponent {
5692
5705
  }
5693
5706
  _scheduleReinit() {
5694
5707
  this._destroySwiper();
5695
- this._initRafId = requestAnimationFrame(() => this._initSwiper());
5708
+ this.ngZone.runOutsideAngular(() => {
5709
+ this._initRafId = requestAnimationFrame(() => this._initSwiper());
5710
+ });
5696
5711
  }
5697
5712
  // ── Swiper lifecycle ────────────────────────────────────────────────────────
5698
5713
  async _initSwiper() {