@vectoriox/iox-ui 4.42.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, HostListener, Output, Input, Directive, NgModule, Injectable, ViewChild, Component, Host, Optional, inject, NgZone, Inject, InjectionToken, PLATFORM_ID, ChangeDetectionStrategy, ViewContainerRef, reflectComponentType, signal, computed } from '@angular/core';
2
+ import { EventEmitter, HostListener, Output, Input, Directive, NgModule, Injectable, ViewChild, Component, Host, Optional, inject, NgZone, InjectionToken, Inject, ChangeDetectionStrategy, ViewContainerRef, PLATFORM_ID, reflectComponentType, signal, computed } from '@angular/core';
3
3
  import * as i2 from '@angular/animations';
4
4
  import { style, animate } from '@angular/animations';
5
- import { Subject, fromEvent, of } from 'rxjs';
5
+ import { Subject, fromEvent } from 'rxjs';
6
6
  import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
7
- import * as i1$2 from '@angular/common';
7
+ import * as i1 from '@angular/common';
8
8
  import { CommonModule, isPlatformBrowser } from '@angular/common';
9
9
  import Lenis from 'lenis';
10
- import * as i1 from 'ngx-cookie-service';
11
- import { CookieService } from 'ngx-cookie-service';
12
- import * as i1$1 from '@angular/common/http';
13
- import { map } from 'rxjs/operators';
14
10
 
15
11
  class ViewPositionDirective {
16
12
  constructor(_elr) {
@@ -539,324 +535,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
539
535
  args: [{ providedIn: 'root' }]
540
536
  }] });
541
537
 
542
- var PrivacyModelEvent;
543
- (function (PrivacyModelEvent) {
544
- PrivacyModelEvent[PrivacyModelEvent["OPEN"] = 1] = "OPEN";
545
- PrivacyModelEvent[PrivacyModelEvent["CLOSE"] = 2] = "CLOSE";
546
- })(PrivacyModelEvent || (PrivacyModelEvent = {}));
547
- class PrivacyModalService {
548
- constructor() {
549
- this.modalEvent = new Subject();
550
- this.decisionSubject = null;
551
- }
552
- registerModalEvent(func) {
553
- this.modalEvent.subscribe({
554
- next: (val) => {
555
- func(val);
556
- }
557
- });
558
- }
559
- openModal() {
560
- this.modalEvent.next(PrivacyModelEvent.OPEN);
561
- this.decisionSubject = new Subject();
562
- return this.decisionSubject;
563
- }
564
- closeModal() {
565
- this.modalEvent.next(PrivacyModelEvent.CLOSE);
566
- }
567
- notifyDecision(accepted) {
568
- if (this.decisionSubject) {
569
- this.decisionSubject.next(accepted);
570
- this.decisionSubject.complete();
571
- this.decisionSubject = null;
572
- }
573
- this.closeModal();
574
- }
575
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: PrivacyModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
576
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: PrivacyModalService }); }
577
- }
578
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: PrivacyModalService, decorators: [{
579
- type: Injectable
580
- }], ctorParameters: () => [] });
581
-
582
- class ConsentService {
583
- constructor(cookieService, httpClient, _privacyModalService, environment) {
584
- this.cookieService = cookieService;
585
- this.httpClient = httpClient;
586
- this._privacyModalService = _privacyModalService;
587
- this.environment = environment;
588
- this.WEB_USER = "webUser";
589
- }
590
- hasAnalyticsConsent() {
591
- const cookieValue = this.cookieService.get(this.WEB_USER);
592
- if (!cookieValue) {
593
- return false;
594
- }
595
- try {
596
- const parsedCookieValue = JSON.parse(cookieValue);
597
- return parsedCookieValue.user?.consent?.analyticsConsent === true;
598
- }
599
- catch {
600
- // Invalid JSON or unexpected structure: treat as no consent
601
- return false;
602
- }
603
- }
604
- checkAnalyticsConsent() {
605
- if (this.hasAnalyticsConsent()) {
606
- // Consent already given, return true immediately as Observable
607
- return of(true);
608
- }
609
- // No consent yet (or invalid/missing cookie) -> show modal
610
- return this._privacyModalService.openModal();
611
- }
612
- checkMarketingConsent() {
613
- let cookieValue = this.cookieService.get(this.WEB_USER);
614
- if (!cookieValue) {
615
- return false;
616
- }
617
- let parsedCookieValue = JSON.parse(cookieValue);
618
- return parsedCookieValue.user?.consent?.marketingConsent;
619
- }
620
- setConsent(analytics, marketing) {
621
- let cookieValue = this.cookieService.get(this.WEB_USER);
622
- let parsedCookieValue = cookieValue ? JSON.parse(cookieValue) : { user: { consent: {
623
- anonymousId: this.generateAnonymousId()
624
- } } };
625
- parsedCookieValue.user.consent.analyticsConsent = analytics;
626
- parsedCookieValue.user.consent.marketingConsent = marketing;
627
- this.cookieService.set(this.WEB_USER, JSON.stringify(parsedCookieValue));
628
- this.httpClient.post(`${this.environment.HOST}consent`, parsedCookieValue.user.consent)
629
- .subscribe({
630
- next: (response) => {
631
- console.log('Consent updated successfully:', response);
632
- },
633
- error: (error) => {
634
- console.error('Error updating consent:', error);
635
- }
636
- });
637
- }
638
- generateAnonymousId() {
639
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
640
- var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
641
- return v.toString(16);
642
- });
643
- }
644
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ConsentService, deps: [{ token: i1.CookieService }, { token: i1$1.HttpClient }, { token: PrivacyModalService }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
645
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ConsentService }); }
646
- }
647
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ConsentService, decorators: [{
648
- type: Injectable
649
- }], ctorParameters: () => [{ type: i1.CookieService }, { type: i1$1.HttpClient }, { type: PrivacyModalService }, { type: undefined, decorators: [{
650
- type: Inject,
651
- args: [ENVIRONMENT]
652
- }] }] });
653
-
654
- class PrivacyModalComponent {
655
- constructor(_privacyModalService, _consentService) {
656
- this._privacyModalService = _privacyModalService;
657
- this._consentService = _consentService;
658
- this.isOpen = false;
659
- this._privacyModalService.registerModalEvent((event) => {
660
- if (event == PrivacyModelEvent.CLOSE) {
661
- this.isOpen = false;
662
- }
663
- else {
664
- this.isOpen = true;
665
- }
666
- });
667
- }
668
- onAccept() {
669
- this._consentService.setConsent(true, true);
670
- this._privacyModalService.notifyDecision(true);
671
- this.isOpen = false;
672
- }
673
- onDecline() {
674
- this._privacyModalService.notifyDecision(false);
675
- this.isOpen = false;
676
- }
677
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: PrivacyModalComponent, deps: [{ token: PrivacyModalService }, { token: ConsentService }], target: i0.ɵɵFactoryTarget.Component }); }
678
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: PrivacyModalComponent, isStandalone: false, selector: "privacy-modal", ngImport: i0, template: "<div class=\"privacy-modal\" [ngClass]=\"{'open': isOpen, 'closed': !isOpen}\">\n <div class=\"modal-content\">\n <h2>\u05D0\u05E0\u05D7\u05E0\u05D5 \u05E9\u05D5\u05DE\u05E8\u05D9\u05DD \u05E2\u05DC \u05D4\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05E9\u05DC\u05DA</h2>\n <p dir=\"rtl\">\n <span>\n \u05D0\u05E0\u05D7\u05E0\u05D5 \u05DE\u05E9\u05DE\u05E9\u05D9\u05DD \u05D1\u05E7\u05D1\u05E6\u05D9 \n </span>\n <span>Cookies </span>\n <span>\u05DB\u05D3\u05D9 \u05DC\u05E9\u05E4\u05E8 \u05D0\u05EA \u05D7\u05D5\u05D5\u05D9\u05EA \u05D4\u05D2\u05DC\u05D9\u05E9\u05D4 \u05E9\u05DC\u05DA, \u05DC\u05E0\u05EA\u05D7 \u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1\u05D0\u05EA\u05E8 \u05D5\u05DC\u05D4\u05E6\u05D9\u05E2 \u05EA\u05D5\u05DB\u05DF \u05DE\u05D5\u05EA\u05D0\u05DD \u05D0\u05D9\u05E9\u05D9\u05EA.</span>\n <span> \u05DC\u05DE\u05D9\u05D3\u05E2 \u05E0\u05D5\u05E1\u05E3 \u05E2\u05DC \u05D0\u05D9\u05DA \u05D0\u05E0\u05D7\u05E0\u05D5 \u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05D1\u05DE\u05D9\u05D3\u05E2 \u05E9\u05DC\u05DA, \u05E8\u05D0\u05D4 \u05D0\u05EA <a target=\"_blank\" href=\"/privacy\">\u05DE\u05D3\u05D9\u05E0\u05D9\u05D5\u05EA \u05D4\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA </a> \u05E9\u05DC\u05E0\u05D5</span>\n </p>\n\n <div class=\"button-container\">\n <button class=\"accept-button\" (click)=\"onAccept()\">\u05D0\u05E0\u05D9 \u05DE\u05E1\u05DB\u05D9\u05DD</button>\n <button class=\"decline-button\" (click)=\"onDecline()\">\u05D0\u05E0\u05D9 \u05DC\u05D0 \u05DE\u05E1\u05DB\u05D9\u05DD</button>\n </div>\n </div>\n</div>\n", styles: [".privacy-modal{padding:2em;background:#fff;border-radius:8px;position:fixed;z-index:10000000000000;bottom:0;left:0;right:0;height:25vh;display:flex;align-items:center;justify-content:center;transform:translateY(100%);transition:transform .3s ease-in-out}.privacy-modal.open{transform:translateY(0);transition:transform .3s ease-in-out}.modal-content{width:40vw;text-align:right}.privacy-modal h2{margin-top:0;text-align:right;font-size:2.1vw;color:#6b4f3b}.privacy-modal p{font-size:1.3vw;color:#6b4f3b}.button-container{display:flex;justify-content:flex-end;margin-top:20px}.button-container button{border:0;margin-inline-start:15px;font-size:1vw}.button-container .accept-button{background:#6b4f3b;color:#fff;padding:.5em 1em;border-radius:4px;cursor:pointer}.button-container .accept-button:hover{background:#5b4332}.button-container .decline-button{background:transparent;color:#6b4f3b;padding:0;cursor:pointer;border-bottom:1px solid #fff}.button-container .decline-button:hover{border-bottom:1px solid #6b4f3b}@media(max-width:768px){.privacy-modal h2{font-size:8.2vw}.privacy-modal p{font-size:4.2vw}.privacy-modal .modal-content{width:80vw}.privacy-modal .button-container button{font-size:3.2vw}}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
679
- }
680
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: PrivacyModalComponent, decorators: [{
681
- type: Component,
682
- args: [{ selector: 'privacy-modal', standalone: false, template: "<div class=\"privacy-modal\" [ngClass]=\"{'open': isOpen, 'closed': !isOpen}\">\n <div class=\"modal-content\">\n <h2>\u05D0\u05E0\u05D7\u05E0\u05D5 \u05E9\u05D5\u05DE\u05E8\u05D9\u05DD \u05E2\u05DC \u05D4\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05E9\u05DC\u05DA</h2>\n <p dir=\"rtl\">\n <span>\n \u05D0\u05E0\u05D7\u05E0\u05D5 \u05DE\u05E9\u05DE\u05E9\u05D9\u05DD \u05D1\u05E7\u05D1\u05E6\u05D9 \n </span>\n <span>Cookies </span>\n <span>\u05DB\u05D3\u05D9 \u05DC\u05E9\u05E4\u05E8 \u05D0\u05EA \u05D7\u05D5\u05D5\u05D9\u05EA \u05D4\u05D2\u05DC\u05D9\u05E9\u05D4 \u05E9\u05DC\u05DA, \u05DC\u05E0\u05EA\u05D7 \u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1\u05D0\u05EA\u05E8 \u05D5\u05DC\u05D4\u05E6\u05D9\u05E2 \u05EA\u05D5\u05DB\u05DF \u05DE\u05D5\u05EA\u05D0\u05DD \u05D0\u05D9\u05E9\u05D9\u05EA.</span>\n <span> \u05DC\u05DE\u05D9\u05D3\u05E2 \u05E0\u05D5\u05E1\u05E3 \u05E2\u05DC \u05D0\u05D9\u05DA \u05D0\u05E0\u05D7\u05E0\u05D5 \u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05D1\u05DE\u05D9\u05D3\u05E2 \u05E9\u05DC\u05DA, \u05E8\u05D0\u05D4 \u05D0\u05EA <a target=\"_blank\" href=\"/privacy\">\u05DE\u05D3\u05D9\u05E0\u05D9\u05D5\u05EA \u05D4\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA </a> \u05E9\u05DC\u05E0\u05D5</span>\n </p>\n\n <div class=\"button-container\">\n <button class=\"accept-button\" (click)=\"onAccept()\">\u05D0\u05E0\u05D9 \u05DE\u05E1\u05DB\u05D9\u05DD</button>\n <button class=\"decline-button\" (click)=\"onDecline()\">\u05D0\u05E0\u05D9 \u05DC\u05D0 \u05DE\u05E1\u05DB\u05D9\u05DD</button>\n </div>\n </div>\n</div>\n", styles: [".privacy-modal{padding:2em;background:#fff;border-radius:8px;position:fixed;z-index:10000000000000;bottom:0;left:0;right:0;height:25vh;display:flex;align-items:center;justify-content:center;transform:translateY(100%);transition:transform .3s ease-in-out}.privacy-modal.open{transform:translateY(0);transition:transform .3s ease-in-out}.modal-content{width:40vw;text-align:right}.privacy-modal h2{margin-top:0;text-align:right;font-size:2.1vw;color:#6b4f3b}.privacy-modal p{font-size:1.3vw;color:#6b4f3b}.button-container{display:flex;justify-content:flex-end;margin-top:20px}.button-container button{border:0;margin-inline-start:15px;font-size:1vw}.button-container .accept-button{background:#6b4f3b;color:#fff;padding:.5em 1em;border-radius:4px;cursor:pointer}.button-container .accept-button:hover{background:#5b4332}.button-container .decline-button{background:transparent;color:#6b4f3b;padding:0;cursor:pointer;border-bottom:1px solid #fff}.button-container .decline-button:hover{border-bottom:1px solid #6b4f3b}@media(max-width:768px){.privacy-modal h2{font-size:8.2vw}.privacy-modal p{font-size:4.2vw}.privacy-modal .modal-content{width:80vw}.privacy-modal .button-container button{font-size:3.2vw}}\n"] }]
683
- }], ctorParameters: () => [{ type: PrivacyModalService }, { type: ConsentService }] });
684
-
685
- class WebSettingsService {
686
- constructor(httpClient, environment) {
687
- this.httpClient = httpClient;
688
- this.environment = environment;
689
- }
690
- getSettings() {
691
- // If the server injected a runtime config (window.__APP_CONFIG) use that first,
692
- // otherwise fall back to the compile-time environment.HOST.
693
- const runtimeHost = (typeof window !== 'undefined' && window.__APP_CONFIG && window.__APP_CONFIG.HOST) ? window.__APP_CONFIG.HOST : this.environment.HOST;
694
- return this.httpClient.get(`${runtimeHost}web/settings`);
695
- }
696
- configArrayToObject(arr) {
697
- return arr.reduce((acc, item) => {
698
- acc[item.key] = item.value;
699
- return acc;
700
- }, {});
701
- }
702
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: WebSettingsService, deps: [{ token: i1$1.HttpClient }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
703
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: WebSettingsService }); }
704
- }
705
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: WebSettingsService, decorators: [{
706
- type: Injectable
707
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: undefined, decorators: [{
708
- type: Inject,
709
- args: [ENVIRONMENT]
710
- }] }] });
711
-
712
- class ContentService {
713
- constructor(httpClient, environment) {
714
- this.httpClient = httpClient;
715
- this.environment = environment;
716
- this.appContent = {};
717
- }
718
- getContent(contentName, id) {
719
- if (this.appContent[contentName] && this.appContent[contentName].length) {
720
- if (id) {
721
- return of(this.findOne(this.appContent[contentName], id));
722
- }
723
- return of(this.appContent[contentName]);
724
- }
725
- return this.httpClient.get(`${this.environment.HOST}${contentName}`).pipe(map((content) => {
726
- if (contentName == this.environment.contentResource.SERVICES || contentName == this.environment.contentResource.PROJECTS) {
727
- content = content.map((item) => {
728
- item.id = item.name.replace(/ /g, "_");
729
- //item._id= item.name.replace(/ /g,"_");
730
- return item;
731
- });
732
- }
733
- this.appContent[contentName] = content;
734
- if (id) {
735
- return this.findOne(this.appContent[contentName], id);
736
- }
737
- return content;
738
- }));
739
- }
740
- findOne(arr, id) {
741
- for (let i = 0; i < arr.length; i++) {
742
- if (arr[i].id == id) {
743
- return arr[i];
744
- }
745
- }
746
- }
747
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ContentService, deps: [{ token: i1$1.HttpClient }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
748
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ContentService }); }
749
- }
750
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ContentService, decorators: [{
751
- type: Injectable
752
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: undefined, decorators: [{
753
- type: Inject,
754
- args: [ENVIRONMENT]
755
- }] }] });
756
-
757
- const ENVIRONMENT = new InjectionToken('environment');
758
- class CMSClientInfraModule {
759
- static forRoot(environment) {
760
- return {
761
- ngModule: CMSClientInfraModule,
762
- providers: [
763
- { provide: ENVIRONMENT, useValue: environment },
764
- ConsentService,
765
- ContentService,
766
- CookieService,
767
- WebSettingsService,
768
- PrivacyModalService
769
- ]
770
- };
771
- }
772
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: CMSClientInfraModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
773
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.31", ngImport: i0, type: CMSClientInfraModule, declarations: [PrivacyModalComponent], imports: [CommonModule], exports: [PrivacyModalComponent] }); }
774
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: CMSClientInfraModule, imports: [CommonModule] }); }
775
- }
776
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: CMSClientInfraModule, decorators: [{
777
- type: NgModule,
778
- args: [{
779
- declarations: [
780
- PrivacyModalComponent
781
- ],
782
- imports: [
783
- CommonModule
784
- ],
785
- exports: [PrivacyModalComponent]
786
- }]
787
- }] });
788
-
789
- class AnalyticsService {
790
- constructor(platformId) {
791
- this.platformId = platformId;
792
- this.gaScriptId = 'google-analytics-script';
793
- }
794
- applyGoogleAnalytics(appId) {
795
- if (!isPlatformBrowser(this.platformId))
796
- return;
797
- // 1. Establish the dataLayer and the CORRECT gtag function stub
798
- const win = window;
799
- win.dataLayer = win.dataLayer || [];
800
- // CRITICAL FIX: The Google library requires the special 'arguments' object,
801
- // NOT a standard array spread [...args].
802
- if (!win.gtag) {
803
- win.gtag = function () {
804
- win.dataLayer.push(arguments);
805
- };
806
- }
807
- // 2. Queue initial commands immediately (even before script loads)
808
- win.gtag('js', new Date());
809
- win.gtag('config', appId);
810
- // 3. Load the script if not already present
811
- if (!document.getElementById(this.gaScriptId)) {
812
- const script = document.createElement('script');
813
- script.id = this.gaScriptId;
814
- script.async = true;
815
- script.src = `https://www.googletagmanager.com/gtag/js?id=${appId}`;
816
- script.onload = () => {
817
- console.log('[Analytics] gtag.js script loaded and ready');
818
- };
819
- script.onerror = (e) => console.error('[Analytics] gtag.js failed to load', e);
820
- document.head.appendChild(script);
821
- }
822
- }
823
- // Helper to send events from your components
824
- sendEvent(eventName, params = {}) {
825
- if (isPlatformBrowser(this.platformId) && window.gtag) {
826
- window.gtag('event', eventName, params);
827
- }
828
- }
829
- // Synchronous page view sender that won't rely on internal ready Promise
830
- sendPageView(path) {
831
- if (!isPlatformBrowser(this.platformId))
832
- return;
833
- const win = window;
834
- try {
835
- if (win && win.gtag) {
836
- // Prefer gtag when available
837
- win.gtag('event', 'page_view', { page_path: path });
838
- return;
839
- }
840
- // Fallback: ensure dataLayer exists and push a native arguments-like object
841
- win.dataLayer = win.dataLayer || [];
842
- // Use a plain object that resembles gtag's usage if gtag not present
843
- win.dataLayer.push({ event: 'page_view', page_path: path });
844
- }
845
- catch (err) {
846
- console.warn('[Analytics] sendPageView failed', err);
847
- }
848
- }
849
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: AnalyticsService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
850
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: AnalyticsService, providedIn: 'root' }); }
851
- }
852
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: AnalyticsService, decorators: [{
853
- type: Injectable,
854
- args: [{ providedIn: 'root' }]
855
- }], ctorParameters: () => [{ type: Object, decorators: [{
856
- type: Inject,
857
- args: [PLATFORM_ID]
858
- }] }] });
859
-
860
538
  const IS_PREVIEW = new InjectionToken('IS_PREVIEW');
861
539
  const IOX_BUILDER_EVENTS = new InjectionToken('IOX_BUILDER_EVENTS');
862
540
 
@@ -933,7 +611,7 @@ class CardComponent {
933
611
  <h2>{{ title }}</h2>
934
612
  <p>{{ description }}</p>
935
613
  </div>
936
- `, 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$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
614
+ `, 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"] }] }); }
937
615
  }
938
616
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: CardComponent, decorators: [{
939
617
  type: Component,
@@ -1491,7 +1169,7 @@ class ClientRepeaterComponent {
1491
1169
  <div class="repeater-root" [ngClass]="['iox-node-' + nodeId]">
1492
1170
  <ng-container #childrenHost></ng-container>
1493
1171
  </div>
1494
- `, isInline: true, styles: [".repeater-root{position:relative;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
1172
+ `, isInline: true, styles: [".repeater-root{position:relative;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
1495
1173
  }
1496
1174
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ClientRepeaterComponent, decorators: [{
1497
1175
  type: Component,
@@ -2347,7 +2025,7 @@ class ClientSliderContainerComponent {
2347
2025
  <div *ngIf="enablePagination" class="swiper-pagination"></div>
2348
2026
  <div *ngIf="enableScrollbar" class="swiper-scrollbar"></div>
2349
2027
  </div>
2350
- `, isInline: true, styles: [".swiper{width:100%;height:100%;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
2028
+ `, isInline: true, styles: [".swiper{width:100%;height:100%;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
2351
2029
  }
2352
2030
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ClientSliderContainerComponent, decorators: [{
2353
2031
  type: Component,
@@ -3134,7 +2812,7 @@ class ClientGalleryComponent {
3134
2812
  [ngStyle]="slideStyle(i)"></div>
3135
2813
  <div class="iox-gallery__overlay"></div>
3136
2814
  </div>
3137
- `, 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$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
2815
+ `, 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"] }] }); }
3138
2816
  }
3139
2817
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: ClientGalleryComponent, decorators: [{
3140
2818
  type: Component,
@@ -4048,6 +3726,20 @@ class IoxFormComponent {
4048
3726
  this.name = '';
4049
3727
  this.renderState = FormRenderState.Idle;
4050
3728
  this.feedback = FeedbackTiming.Smart;
3729
+ /**
3730
+ * Move focus to the first field that failed, instead of leaving the visitor to hunt for red
3731
+ * text. On by default — the single most valuable thing a failed submit can do.
3732
+ */
3733
+ this.focusFirstProblem = true;
3734
+ /**
3735
+ * Speak the failure the moment it happens. Without this a screen-reader user only learns a
3736
+ * submit failed if they happen to tab back into the message — the error text is rendered, but
3737
+ * nothing directs them to it.
3738
+ */
3739
+ this.announceFailure = true;
3740
+ /** What the live region is currently saying. Empty between attempts so the same failure
3741
+ * announces again rather than being swallowed as an unchanged value. */
3742
+ this.announcement = '';
4051
3743
  /**
4052
3744
  * Emitted ONLY when client-side validation passes, carrying the collected values. The host
4053
3745
  * (builder canvas or engine runtime) owns the transport — posting, retries and the server's
@@ -4080,9 +3772,9 @@ class IoxFormComponent {
4080
3772
  event.preventDefault();
4081
3773
  this.runtime.configure(this.runtime.specNow(), this.feedback);
4082
3774
  if (!this.runtime.validateAll()) {
4083
- // Move the visitor TO the problem rather than leaving them to hunt for red text —
4084
- // the single most valuable thing a failed submit can do.
4085
- this.focusFirstInvalid();
3775
+ this.announce(this.runtime.state.errors);
3776
+ if (this.focusFirstProblem)
3777
+ this.focusFirstInvalid();
4086
3778
  this.validationFailed.emit(this.runtime.state.errors);
4087
3779
  return;
4088
3780
  }
@@ -4126,10 +3818,13 @@ class IoxFormComponent {
4126
3818
  if (response?.errors) {
4127
3819
  this.runtime.applyErrors(response.errors);
4128
3820
  this.renderState = FormRenderState.Idle;
4129
- this.focusFirstInvalid();
3821
+ this.announce(response.errors);
3822
+ if (this.focusFirstProblem)
3823
+ this.focusFirstInvalid();
4130
3824
  return;
4131
3825
  }
4132
3826
  this.renderState = FormRenderState.Error;
3827
+ this.announce(null);
4133
3828
  return;
4134
3829
  }
4135
3830
  this.renderState = FormRenderState.Success;
@@ -4152,6 +3847,22 @@ class IoxFormComponent {
4152
3847
  if (typeof form.reset === 'function')
4153
3848
  form.reset();
4154
3849
  }
3850
+ /**
3851
+ * Put the failure into the live region. Cleared first so two identical failures in a row are
3852
+ * two announcements, not one — a live region only speaks on CHANGE, and "same error again"
3853
+ * is exactly when a visitor most needs telling.
3854
+ */
3855
+ announce(errors) {
3856
+ if (!this.announceFailure)
3857
+ return;
3858
+ const count = errors ? Object.keys(errors).length : 0;
3859
+ const next = count
3860
+ ? `${count} ${count === 1 ? 'field needs' : 'fields need'} attention.`
3861
+ : 'That did not send.';
3862
+ this.announcement = '';
3863
+ // A microtask is enough for the empty value to be committed before the new one lands.
3864
+ Promise.resolve().then(() => { this.announcement = next; });
3865
+ }
4155
3866
  focusFirstInvalid() {
4156
3867
  const name = this.runtime.firstInvalidName();
4157
3868
  if (!name)
@@ -4168,12 +3879,20 @@ class IoxFormComponent {
4168
3879
  }
4169
3880
  }
4170
3881
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: IoxFormComponent, deps: [{ token: FormRuntimeService }, { token: i0.ElementRef }, { token: IOX_FORM_TRANSPORT, optional: true }, { token: IOX_FORM_NAVIGATOR, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
4171
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: IoxFormComponent, isStandalone: false, selector: "form[iox-form]", inputs: { nodeId: "nodeId", formId: "formId", name: "name", renderState: "renderState", feedback: "feedback" }, outputs: { formSubmit: "formSubmit", validationFailed: "validationFailed" }, host: { listeners: { "submit": "onSubmit($event)" }, properties: { "class": "'iox-form iox-node-' + nodeId", "attr.novalidate": "''", "attr.data-iox-form": "formId || null", "attr.data-iox-state": "renderState", "attr.aria-busy": "renderState === 'submitting' ? 'true' : null" } }, providers: [FormRuntimeService], viewQueries: [{ propertyName: "childrenHost", first: true, predicate: ["childrenHost"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
3882
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.31", type: IoxFormComponent, isStandalone: false, selector: "form[iox-form]", inputs: { nodeId: "nodeId", formId: "formId", name: "name", renderState: "renderState", feedback: "feedback", focusFirstProblem: "focusFirstProblem", announceFailure: "announceFailure" }, outputs: { formSubmit: "formSubmit", validationFailed: "validationFailed" }, host: { listeners: { "submit": "onSubmit($event)" }, properties: { "class": "'iox-form iox-node-' + nodeId", "attr.novalidate": "''", "attr.data-iox-form": "formId || null", "attr.data-iox-state": "renderState", "attr.aria-busy": "renderState === 'submitting' ? 'true' : null" } }, providers: [FormRuntimeService], viewQueries: [{ propertyName: "childrenHost", first: true, predicate: ["childrenHost"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
4172
3883
  <div class="iox-form__hp" aria-hidden="true">
4173
3884
  <input type="text" [attr.name]="honeypotField" tabindex="-1" autocomplete="off" />
4174
3885
  </div>
3886
+ <!-- Failure announcement (board 11). Visually hidden and always PRESENT — an aria-live
3887
+ region added to the DOM at the moment it gains text is not reliably announced; the
3888
+ region has to be there first and only its content change. -->
3889
+ <div *ngIf="announceFailure"
3890
+ class="iox-form__hp"
3891
+ role="status"
3892
+ aria-live="assertive"
3893
+ aria-atomic="true">{{ announcement }}</div>
4175
3894
  <ng-container #childrenHost></ng-container>
4176
- `, isInline: true, styles: [":host{box-sizing:border-box}.iox-form__hp{position:absolute;inset-inline-start:-9999px;width:1px;height:1px;overflow:hidden}\n"] }); }
3895
+ `, isInline: true, styles: [":host{box-sizing:border-box}.iox-form__hp{position:absolute;inset-inline-start:-9999px;width:1px;height:1px;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
4177
3896
  }
4178
3897
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImport: i0, type: IoxFormComponent, decorators: [{
4179
3898
  type: Component,
@@ -4181,6 +3900,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
4181
3900
  <div class="iox-form__hp" aria-hidden="true">
4182
3901
  <input type="text" [attr.name]="honeypotField" tabindex="-1" autocomplete="off" />
4183
3902
  </div>
3903
+ <!-- Failure announcement (board 11). Visually hidden and always PRESENT — an aria-live
3904
+ region added to the DOM at the moment it gains text is not reliably announced; the
3905
+ region has to be there first and only its content change. -->
3906
+ <div *ngIf="announceFailure"
3907
+ class="iox-form__hp"
3908
+ role="status"
3909
+ aria-live="assertive"
3910
+ aria-atomic="true">{{ announcement }}</div>
4184
3911
  <ng-container #childrenHost></ng-container>
4185
3912
  `, host: {
4186
3913
  '[class]': "'iox-form iox-node-' + nodeId",
@@ -4210,6 +3937,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.31", ngImpo
4210
3937
  type: Input
4211
3938
  }], feedback: [{
4212
3939
  type: Input
3940
+ }], focusFirstProblem: [{
3941
+ type: Input
3942
+ }], announceFailure: [{
3943
+ type: Input
4213
3944
  }], formSubmit: [{
4214
3945
  type: Output
4215
3946
  }], validationFailed: [{
@@ -7063,5 +6794,5 @@ function effectiveTransitionId(anim) {
7063
6794
  * Generated bundle index. Do not edit.
7064
6795
  */
7065
6796
 
7066
- export { AOSService, AnalyticsService, BREAKPOINTS, Breakpoint, BreakpointQueryKind, BuilderButtonComponent, BuilderDividerComponent, BuilderHeadingComponent, BuilderIconComponent, BuilderImageComponent, BuilderLinkComponent, BuilderSpacerComponent, ButtonBlockComponent, CMSClientInfraModule, CONTEXT_ACTION_TYPES, CardComponent, ClientGalleryComponent, ClientListComponent, ClientListItemComponent, ClientRepeaterComponent, ClientSliderContainerComponent, ClientSliderSlideComponent, ComponentInstanceRegistryService, ConsentService, ContainerComponent, ContentService, 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, ENVIRONMENT, 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, PrivacyModalComponent, PrivacyModalService, PrivacyModelEvent, 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, WebSettingsService, 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, styleKeyToKebab, variableAliases, variableItemsFrom, withContextSlots, wrapInBreakpointQuery, wrapInMediaQuery };
6797
+ 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, styleKeyToKebab, variableAliases, variableItemsFrom, withContextSlots, wrapInBreakpointQuery, wrapInMediaQuery };
7067
6798
  //# sourceMappingURL=vectoriox-iox-ui.mjs.map