@3ddv/software-division-components 2.0.9 → 2.0.10

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.
@@ -172,11 +172,11 @@ class NeighborsComponent {
172
172
  this.sectionChange.emit({ direction, sectionId: section });
173
173
  }
174
174
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: NeighborsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
175
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: NeighborsComponent, isStandalone: true, selector: "sdc-neighbors", inputs: { neighborsData: { classPropertyName: "neighborsData", publicName: "neighborsData", isSignal: true, isRequired: true, transformFunction: null }, currentSectionId: { classPropertyName: "currentSectionId", publicName: "currentSectionId", isSignal: true, isRequired: true, transformFunction: null }, translateTdcToMmc: { classPropertyName: "translateTdcToMmc", publicName: "translateTdcToMmc", isSignal: true, isRequired: true, transformFunction: null }, translateMmcToTdc: { classPropertyName: "translateMmcToTdc", publicName: "translateMmcToTdc", isSignal: true, isRequired: true, transformFunction: null }, hasAvailability: { classPropertyName: "hasAvailability", publicName: "hasAvailability", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, showElement: { classPropertyName: "showElement", publicName: "showElement", isSignal: true, isRequired: false, transformFunction: null }, modeLr: { classPropertyName: "modeLr", publicName: "modeLr", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sectionChange: "sectionChange" }, viewQueries: [{ propertyName: "neighborsContainer", first: true, predicate: ["neighborsContainer"], descendants: true }, { propertyName: "currentSection", first: true, predicate: ["currentSection"], descendants: true }, { propertyName: "currentSection3d", first: true, predicate: ["currentSection3d"], descendants: true }, { propertyName: "leftSectionElement", first: true, predicate: ["leftSectionNumber"], descendants: true }, { propertyName: "rightSectionElement", first: true, predicate: ["rightSectionNumber"], descendants: true }], ngImport: i0, template: "<div #neighborsContainer class=\"neighbors-container\" [class]=\"computedClass()\" [class.hidden]=\"!showElement()\">\n <!-- LEFT SECTION BUTTON -->\n @if (leftSection) {\n <div\n class=\"neighbor-button-left neighbor-button\"\n tabindex=\"0\"\n (click)=\"navigateToSection(leftSection!)\"\n (keypress.enter)=\"navigateToSection(leftSection!)\">\n <i class=\"neighbor-button-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.75 19.5 8.25 12l7.5-7.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </i>\n </div>\n }\n <div class=\"current-section-wrapper\">\n @if (isLoading()) {\n <p class=\"current-section-loading\">\n <span>Loading</span>\n </p>\n } @else {\n @if (section) {\n <h3 class=\"current-section-text\">\n <span class=\"prefix\">Section </span>\n <span #currentSection class=\"section-number\">{{ section }}</span>\n </h3>\n }\n }\n </div>\n\n <!-- RIGHT SECTION BUTTON -->\n @if (rightSection) {\n <div\n class=\"neighbor-button-right neighbor-button\"\n tabindex=\"1\"\n (click)=\"navigateToSection(rightSection!)\"\n (keypress.enter)=\"navigateToSection(rightSection!)\">\n <i class=\"neighbor-button-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"m8.25 4.5 7.5 7.5-7.5 7.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </i>\n </div>\n }\n</div>\n", styles: [".sdc-neighbors{--sdc-neighbors-background-color: transparent;--sdc-neighbors-text-color: var(--color-pure-black);--sdc-neighbors-border-radius: 1rem;--sdc-neighbors-padding-x: var(--space-3);--sdc-neighbors-padding-y: var(--space-2_5);--sdc-neighbors-height: var(--space-6);--sdc-neighbors-max-width: 25rem;--sdc-neighbors-button-width: 8rem;--sdc-neighbors-button-height: var(--space-6);--sdc-neighbors-button-icon-color: var(--color-pure-black);--sdc-neighbors-button-hover-background-color: #f5f5f5;--sdc-neighbors-button-text-font-weight: var(--font-medium);--sdc-neighbors-button-text-font-size: var(--text-sm);--sdc-neighbors-button-text-transform: none;--sdc-neighbors-prefix-opacity: 1;--sdc-neighbors-current-section-min-width: 6rem;--sdc-neighbors-current-section-loading-font-weight: var(--font-semibold);--sdc-neighbors-current-section-loading-font-size: var(--text-sm);--sdc-neighbors-current-section-text-font-weight: var(--font-semibold);--sdc-neighbors-current-section-text-font-size: var(--text-sm);--sdc-neighbors-current-section-text-transform: none}.neighbors-container{position:relative;display:flex;justify-content:center;align-items:center;background-color:var(--sdc-neighbors-background-color);margin-left:auto;margin-right:auto;padding-left:var(--sdc-neighbors-padding-x);padding-right:var(--sdc-neighbors-padding-x);padding-top:var(--sdc-neighbors-padding-y);padding-bottom:var(--sdc-neighbors-padding-y);border-radius:var(--sdc-neighbors-border-radius);height:var(--sdc-neighbors-height);max-width:var(--sdc-neighbors-max-width);pointer-events:auto}@media(min-width:640px){.neighbors-container{--sdc-neighbors-height: var(--space-8)}}.neighbor-button{position:relative;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;background-color:#fff;border-radius:50%;transition-property:opacity,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;cursor:pointer;box-shadow:0 1px 3px #0000001a}@media(min-width:640px){.neighbor-button{width:3rem;height:3rem}}.neighbor-button-left{margin-right:.75rem}.neighbor-button-right{margin-left:.75rem}.neighbor-button:hover{background-color:var(--sdc-neighbors-button-hover-background-color)}.neighbor-button-icon{display:flex;align-items:center;justify-content:center;color:var(--sdc-neighbors-button-icon-color)}.neighbor-button-icon svg{width:1rem;height:1rem}.current-section-text .section-number{font-weight:var(--font-bold);white-space:nowrap}.current-section-wrapper{display:flex;justify-content:center;align-items:center;margin-left:auto;margin-right:auto;min-width:var(--sdc-neighbors-current-section-min-width);background-color:#fff;border-radius:var(--sdc-neighbors-border-radius);padding:.75rem 1rem;cursor:default;box-shadow:0 1px 3px #0000001a}@media(min-width:640px){.current-section-wrapper{--sdc-neighbors-current-section-min-width: 14rem}}.current-section-loading{font-weight:var(--sdc-neighbors-current-section-loading-font-weight);color:var(--sdc-neighbors-text-color);font-size:var(--sdc-neighbors-current-section-loading-font-size)}.current-section-text{display:flex;font-weight:var(--sdc-neighbors-current-section-text-font-weight);color:var(--sdc-neighbors-text-color);font-size:var(--sdc-neighbors-current-section-text-font-size);text-transform:var(--sdc-neighbors-current-section-text-transform)}.current-section-text .prefix{opacity:var(--sdc-neighbors-prefix-opacity);margin-right:.35rem}.current-section-text .sm-prefix{display:none}@media(min-width:640px){.current-section-text .sm-prefix{display:block}}.current-section-text .xs-prefix{display:block}@media(min-width:640px){.current-section-text .xs-prefix{display:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
175
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: NeighborsComponent, isStandalone: true, selector: "sdc-neighbors", inputs: { neighborsData: { classPropertyName: "neighborsData", publicName: "neighborsData", isSignal: true, isRequired: true, transformFunction: null }, currentSectionId: { classPropertyName: "currentSectionId", publicName: "currentSectionId", isSignal: true, isRequired: true, transformFunction: null }, translateTdcToMmc: { classPropertyName: "translateTdcToMmc", publicName: "translateTdcToMmc", isSignal: true, isRequired: true, transformFunction: null }, translateMmcToTdc: { classPropertyName: "translateMmcToTdc", publicName: "translateMmcToTdc", isSignal: true, isRequired: true, transformFunction: null }, hasAvailability: { classPropertyName: "hasAvailability", publicName: "hasAvailability", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, showElement: { classPropertyName: "showElement", publicName: "showElement", isSignal: true, isRequired: false, transformFunction: null }, modeLr: { classPropertyName: "modeLr", publicName: "modeLr", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sectionChange: "sectionChange" }, viewQueries: [{ propertyName: "neighborsContainer", first: true, predicate: ["neighborsContainer"], descendants: true }, { propertyName: "currentSection", first: true, predicate: ["currentSection"], descendants: true }, { propertyName: "currentSection3d", first: true, predicate: ["currentSection3d"], descendants: true }, { propertyName: "leftSectionElement", first: true, predicate: ["leftSectionNumber"], descendants: true }, { propertyName: "rightSectionElement", first: true, predicate: ["rightSectionNumber"], descendants: true }], ngImport: i0, template: "<div #neighborsContainer class=\"neighbors-container\" [class]=\"computedClass()\" [class.hidden]=\"!showElement()\">\n <!-- LEFT SECTION BUTTON -->\n @if (leftSection) {\n <div\n class=\"neighbor-button-left neighbor-button\"\n [class.is-none]=\"leftSection === 'none'\"\n tabindex=\"0\"\n (click)=\"navigateToSection(leftSection!)\"\n (keypress.enter)=\"navigateToSection(leftSection!)\">\n <!-- ARROW ICON -->\n <div class=\"neighbor-button-icon\">\n <i>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"3\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 19.5 8.25 12l7.5-7.5\" />\n </svg>\n </i>\n </div>\n\n <!-- SECTION LABEL -->\n <div class=\"neighbor-button-label\">\n <p>\n <span class=\"prefix\"> {{ modeLr() ? 'Left Section' : 'Section' }}&nbsp; </span>\n @if (leftSection !== 'none' && !modeLr()) {\n <span #leftSectionNumber class=\"section-number\">\n {{ leftSectionLabel() }}\n </span>\n }\n </p>\n </div>\n </div>\n }\n\n <!-- CURRENT SECTION TEXT -->\n <div class=\"current-section-wrapper\">\n @if (isLoading()) {\n <p class=\"current-section-loading\">\n <span>Loading</span>\n </p>\n } @else {\n @if (section) {\n <h3 class=\"current-section-text\">\n <span class=\"prefix\">Section&nbsp;</span>\n <span #currentSection class=\"section-number\">{{ section }}</span>\n </h3>\n }\n }\n </div>\n\n <!-- RIGHT SECTION BUTTON -->\n @if (rightSection) {\n <div\n class=\"neighbor-button-right neighbor-button\"\n [class.is-none]=\"rightSection === 'none'\"\n tabindex=\"1\"\n (click)=\"navigateToSection(rightSection!)\"\n (keypress.enter)=\"navigateToSection(rightSection!)\">\n <!-- ARROW ICON -->\n <div class=\"neighbor-button-icon\">\n <i>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"3\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m8.25 4.5 7.5 7.5-7.5 7.5\" />\n </svg>\n </i>\n </div>\n\n <!-- SECTION LABEL -->\n <div class=\"neighbor-button-label\">\n <p>\n <span class=\"prefix\"> {{ modeLr() ? 'Right Section' : 'Section' }}&nbsp; </span>\n @if (rightSection !== 'none' && !modeLr()) {\n <span #rightSectionNumber class=\"section-number\">\n {{ rightSectionLabel() }}\n </span>\n }\n </p>\n </div>\n </div>\n }\n</div>\n", styles: [".sdc-neighbors{--sdc-neighbors-background-color: rgba(0, 0, 0, .85);--sdc-neighbors-text-color: #ffffff;--sdc-neighbors-border-radius: 9999px;--sdc-neighbors-padding-x: .75rem;--sdc-neighbors-padding-y: .625rem;--sdc-neighbors-height: 2rem;--sdc-neighbors-max-width: 10rem;--sdc-neighbors-button-width: 75px;--sdc-neighbors-button-height: 2rem;--sdc-neighbors-button-offset: -31%;--sdc-neighbors-button-icon-color: #ffffff;--sdc-neighbors-button-hover-background-color: rgba(0, 0, 0, .85);--sdc-neighbors-button-text-font-weight: 600;--sdc-neighbors-button-text-font-size: .625rem;--sdc-neighbors-button-text-transform: uppercase;--sdc-neighbors-prefix-opacity: .7;--sdc-neighbors-current-section-loading-font-weight: 600;--sdc-neighbors-current-section-loading-font-size: .75rem;--sdc-neighbors-current-section-text-font-weight: 600;--sdc-neighbors-current-section-text-font-size: .625rem;--sdc-neighbors-current-section-text-transform: uppercase}.neighbors-container{position:relative;display:flex;justify-content:center;align-items:center;background-color:var(--sdc-neighbors-background-color);margin-left:auto;margin-right:auto;padding-left:var(--sdc-neighbors-padding-x);padding-right:var(--sdc-neighbors-padding-x);padding-top:var(--sdc-neighbors-padding-y);padding-bottom:var(--sdc-neighbors-padding-y);border-radius:var(--sdc-neighbors-border-radius);height:var(--sdc-neighbors-height);max-width:var(--sdc-neighbors-max-width);pointer-events:auto}.neighbor-button{position:absolute;width:var(--sdc-neighbors-button-width);height:var(--sdc-neighbors-button-height);display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:opacity .15s cubic-bezier(.4,0,.2,1)}.neighbor-button-left{left:var(--sdc-neighbors-button-offset);flex-direction:row-reverse}.neighbor-button-right{right:var(--sdc-neighbors-button-offset);flex-direction:row}.neighbor-button.is-none{opacity:0;pointer-events:none}.neighbor-button-icon{display:flex;align-items:center;height:100%;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.neighbor-button:hover .neighbor-button-icon{background-color:var(--sdc-neighbors-button-hover-background-color)}.neighbor-button-icon i{display:block;color:var(--sdc-neighbors-button-icon-color);margin-top:auto;margin-bottom:auto}.neighbor-button-icon svg{width:.875rem;height:.875rem}.neighbor-button-label{opacity:0;transition:opacity .15s cubic-bezier(.4,0,.2,1);display:flex;flex-grow:1;height:100%;align-items:center;background-color:var(--sdc-neighbors-button-hover-background-color)}.neighbor-button:hover .neighbor-button-label{opacity:1}.neighbor-button-left .neighbor-button-label{padding-left:1.25rem;padding-right:.5rem;border-top-left-radius:9999px;border-bottom-left-radius:9999px}.neighbor-button-right .neighbor-button-label{padding-left:.5rem;padding-right:1.25rem;border-top-right-radius:9999px;border-bottom-right-radius:9999px}.neighbor-button-label p{color:var(--sdc-neighbors-text-color);font-size:var(--sdc-neighbors-button-text-font-size);font-weight:var(--sdc-neighbors-button-text-font-weight);text-transform:var(--sdc-neighbors-button-text-transform)}.neighbor-button-label .prefix{opacity:var(--sdc-neighbors-prefix-opacity);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:calc(var(--sdc-neighbors-button-width) - 1.875rem)}.neighbor-button-label .section-number{white-space:nowrap}.current-section-wrapper{display:block;margin-left:auto;margin-right:auto;cursor:default;min-width:0;overflow:hidden}.current-section-loading{font-weight:var(--sdc-neighbors-current-section-loading-font-weight);font-size:var(--sdc-neighbors-current-section-loading-font-size);color:var(--sdc-neighbors-text-color)}.current-section-text{display:flex;font-weight:var(--sdc-neighbors-current-section-text-font-weight);font-size:var(--sdc-neighbors-current-section-text-font-size);color:var(--sdc-neighbors-text-color);text-transform:var(--sdc-neighbors-current-section-text-transform);overflow:hidden;min-width:0}.current-section-text .prefix{opacity:var(--sdc-neighbors-prefix-opacity);flex-shrink:0;white-space:nowrap}.current-section-text .section-number{display:inline-block;max-width:3rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.current-section-text .prefix,.neighbor-button-label .prefix{display:none}.neighbors-container{max-width:7.5rem}.current-section-text .section-number{max-width:2.5rem}.neighbor-button{width:60px}}@media(max-width:420px){.neighbors-container{max-width:6rem}.current-section-text .section-number{max-width:2rem}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
176
176
  }
177
177
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: NeighborsComponent, decorators: [{
178
178
  type: Component,
179
- args: [{ selector: 'sdc-neighbors', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #neighborsContainer class=\"neighbors-container\" [class]=\"computedClass()\" [class.hidden]=\"!showElement()\">\n <!-- LEFT SECTION BUTTON -->\n @if (leftSection) {\n <div\n class=\"neighbor-button-left neighbor-button\"\n tabindex=\"0\"\n (click)=\"navigateToSection(leftSection!)\"\n (keypress.enter)=\"navigateToSection(leftSection!)\">\n <i class=\"neighbor-button-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.75 19.5 8.25 12l7.5-7.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </i>\n </div>\n }\n <div class=\"current-section-wrapper\">\n @if (isLoading()) {\n <p class=\"current-section-loading\">\n <span>Loading</span>\n </p>\n } @else {\n @if (section) {\n <h3 class=\"current-section-text\">\n <span class=\"prefix\">Section </span>\n <span #currentSection class=\"section-number\">{{ section }}</span>\n </h3>\n }\n }\n </div>\n\n <!-- RIGHT SECTION BUTTON -->\n @if (rightSection) {\n <div\n class=\"neighbor-button-right neighbor-button\"\n tabindex=\"1\"\n (click)=\"navigateToSection(rightSection!)\"\n (keypress.enter)=\"navigateToSection(rightSection!)\">\n <i class=\"neighbor-button-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"m8.25 4.5 7.5 7.5-7.5 7.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </i>\n </div>\n }\n</div>\n", styles: [".sdc-neighbors{--sdc-neighbors-background-color: transparent;--sdc-neighbors-text-color: var(--color-pure-black);--sdc-neighbors-border-radius: 1rem;--sdc-neighbors-padding-x: var(--space-3);--sdc-neighbors-padding-y: var(--space-2_5);--sdc-neighbors-height: var(--space-6);--sdc-neighbors-max-width: 25rem;--sdc-neighbors-button-width: 8rem;--sdc-neighbors-button-height: var(--space-6);--sdc-neighbors-button-icon-color: var(--color-pure-black);--sdc-neighbors-button-hover-background-color: #f5f5f5;--sdc-neighbors-button-text-font-weight: var(--font-medium);--sdc-neighbors-button-text-font-size: var(--text-sm);--sdc-neighbors-button-text-transform: none;--sdc-neighbors-prefix-opacity: 1;--sdc-neighbors-current-section-min-width: 6rem;--sdc-neighbors-current-section-loading-font-weight: var(--font-semibold);--sdc-neighbors-current-section-loading-font-size: var(--text-sm);--sdc-neighbors-current-section-text-font-weight: var(--font-semibold);--sdc-neighbors-current-section-text-font-size: var(--text-sm);--sdc-neighbors-current-section-text-transform: none}.neighbors-container{position:relative;display:flex;justify-content:center;align-items:center;background-color:var(--sdc-neighbors-background-color);margin-left:auto;margin-right:auto;padding-left:var(--sdc-neighbors-padding-x);padding-right:var(--sdc-neighbors-padding-x);padding-top:var(--sdc-neighbors-padding-y);padding-bottom:var(--sdc-neighbors-padding-y);border-radius:var(--sdc-neighbors-border-radius);height:var(--sdc-neighbors-height);max-width:var(--sdc-neighbors-max-width);pointer-events:auto}@media(min-width:640px){.neighbors-container{--sdc-neighbors-height: var(--space-8)}}.neighbor-button{position:relative;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;background-color:#fff;border-radius:50%;transition-property:opacity,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;cursor:pointer;box-shadow:0 1px 3px #0000001a}@media(min-width:640px){.neighbor-button{width:3rem;height:3rem}}.neighbor-button-left{margin-right:.75rem}.neighbor-button-right{margin-left:.75rem}.neighbor-button:hover{background-color:var(--sdc-neighbors-button-hover-background-color)}.neighbor-button-icon{display:flex;align-items:center;justify-content:center;color:var(--sdc-neighbors-button-icon-color)}.neighbor-button-icon svg{width:1rem;height:1rem}.current-section-text .section-number{font-weight:var(--font-bold);white-space:nowrap}.current-section-wrapper{display:flex;justify-content:center;align-items:center;margin-left:auto;margin-right:auto;min-width:var(--sdc-neighbors-current-section-min-width);background-color:#fff;border-radius:var(--sdc-neighbors-border-radius);padding:.75rem 1rem;cursor:default;box-shadow:0 1px 3px #0000001a}@media(min-width:640px){.current-section-wrapper{--sdc-neighbors-current-section-min-width: 14rem}}.current-section-loading{font-weight:var(--sdc-neighbors-current-section-loading-font-weight);color:var(--sdc-neighbors-text-color);font-size:var(--sdc-neighbors-current-section-loading-font-size)}.current-section-text{display:flex;font-weight:var(--sdc-neighbors-current-section-text-font-weight);color:var(--sdc-neighbors-text-color);font-size:var(--sdc-neighbors-current-section-text-font-size);text-transform:var(--sdc-neighbors-current-section-text-transform)}.current-section-text .prefix{opacity:var(--sdc-neighbors-prefix-opacity);margin-right:.35rem}.current-section-text .sm-prefix{display:none}@media(min-width:640px){.current-section-text .sm-prefix{display:block}}.current-section-text .xs-prefix{display:block}@media(min-width:640px){.current-section-text .xs-prefix{display:none}}\n"] }]
179
+ args: [{ selector: 'sdc-neighbors', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #neighborsContainer class=\"neighbors-container\" [class]=\"computedClass()\" [class.hidden]=\"!showElement()\">\n <!-- LEFT SECTION BUTTON -->\n @if (leftSection) {\n <div\n class=\"neighbor-button-left neighbor-button\"\n [class.is-none]=\"leftSection === 'none'\"\n tabindex=\"0\"\n (click)=\"navigateToSection(leftSection!)\"\n (keypress.enter)=\"navigateToSection(leftSection!)\">\n <!-- ARROW ICON -->\n <div class=\"neighbor-button-icon\">\n <i>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"3\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 19.5 8.25 12l7.5-7.5\" />\n </svg>\n </i>\n </div>\n\n <!-- SECTION LABEL -->\n <div class=\"neighbor-button-label\">\n <p>\n <span class=\"prefix\"> {{ modeLr() ? 'Left Section' : 'Section' }}&nbsp; </span>\n @if (leftSection !== 'none' && !modeLr()) {\n <span #leftSectionNumber class=\"section-number\">\n {{ leftSectionLabel() }}\n </span>\n }\n </p>\n </div>\n </div>\n }\n\n <!-- CURRENT SECTION TEXT -->\n <div class=\"current-section-wrapper\">\n @if (isLoading()) {\n <p class=\"current-section-loading\">\n <span>Loading</span>\n </p>\n } @else {\n @if (section) {\n <h3 class=\"current-section-text\">\n <span class=\"prefix\">Section&nbsp;</span>\n <span #currentSection class=\"section-number\">{{ section }}</span>\n </h3>\n }\n }\n </div>\n\n <!-- RIGHT SECTION BUTTON -->\n @if (rightSection) {\n <div\n class=\"neighbor-button-right neighbor-button\"\n [class.is-none]=\"rightSection === 'none'\"\n tabindex=\"1\"\n (click)=\"navigateToSection(rightSection!)\"\n (keypress.enter)=\"navigateToSection(rightSection!)\">\n <!-- ARROW ICON -->\n <div class=\"neighbor-button-icon\">\n <i>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"3\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m8.25 4.5 7.5 7.5-7.5 7.5\" />\n </svg>\n </i>\n </div>\n\n <!-- SECTION LABEL -->\n <div class=\"neighbor-button-label\">\n <p>\n <span class=\"prefix\"> {{ modeLr() ? 'Right Section' : 'Section' }}&nbsp; </span>\n @if (rightSection !== 'none' && !modeLr()) {\n <span #rightSectionNumber class=\"section-number\">\n {{ rightSectionLabel() }}\n </span>\n }\n </p>\n </div>\n </div>\n }\n</div>\n", styles: [".sdc-neighbors{--sdc-neighbors-background-color: rgba(0, 0, 0, .85);--sdc-neighbors-text-color: #ffffff;--sdc-neighbors-border-radius: 9999px;--sdc-neighbors-padding-x: .75rem;--sdc-neighbors-padding-y: .625rem;--sdc-neighbors-height: 2rem;--sdc-neighbors-max-width: 10rem;--sdc-neighbors-button-width: 75px;--sdc-neighbors-button-height: 2rem;--sdc-neighbors-button-offset: -31%;--sdc-neighbors-button-icon-color: #ffffff;--sdc-neighbors-button-hover-background-color: rgba(0, 0, 0, .85);--sdc-neighbors-button-text-font-weight: 600;--sdc-neighbors-button-text-font-size: .625rem;--sdc-neighbors-button-text-transform: uppercase;--sdc-neighbors-prefix-opacity: .7;--sdc-neighbors-current-section-loading-font-weight: 600;--sdc-neighbors-current-section-loading-font-size: .75rem;--sdc-neighbors-current-section-text-font-weight: 600;--sdc-neighbors-current-section-text-font-size: .625rem;--sdc-neighbors-current-section-text-transform: uppercase}.neighbors-container{position:relative;display:flex;justify-content:center;align-items:center;background-color:var(--sdc-neighbors-background-color);margin-left:auto;margin-right:auto;padding-left:var(--sdc-neighbors-padding-x);padding-right:var(--sdc-neighbors-padding-x);padding-top:var(--sdc-neighbors-padding-y);padding-bottom:var(--sdc-neighbors-padding-y);border-radius:var(--sdc-neighbors-border-radius);height:var(--sdc-neighbors-height);max-width:var(--sdc-neighbors-max-width);pointer-events:auto}.neighbor-button{position:absolute;width:var(--sdc-neighbors-button-width);height:var(--sdc-neighbors-button-height);display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:opacity .15s cubic-bezier(.4,0,.2,1)}.neighbor-button-left{left:var(--sdc-neighbors-button-offset);flex-direction:row-reverse}.neighbor-button-right{right:var(--sdc-neighbors-button-offset);flex-direction:row}.neighbor-button.is-none{opacity:0;pointer-events:none}.neighbor-button-icon{display:flex;align-items:center;height:100%;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.neighbor-button:hover .neighbor-button-icon{background-color:var(--sdc-neighbors-button-hover-background-color)}.neighbor-button-icon i{display:block;color:var(--sdc-neighbors-button-icon-color);margin-top:auto;margin-bottom:auto}.neighbor-button-icon svg{width:.875rem;height:.875rem}.neighbor-button-label{opacity:0;transition:opacity .15s cubic-bezier(.4,0,.2,1);display:flex;flex-grow:1;height:100%;align-items:center;background-color:var(--sdc-neighbors-button-hover-background-color)}.neighbor-button:hover .neighbor-button-label{opacity:1}.neighbor-button-left .neighbor-button-label{padding-left:1.25rem;padding-right:.5rem;border-top-left-radius:9999px;border-bottom-left-radius:9999px}.neighbor-button-right .neighbor-button-label{padding-left:.5rem;padding-right:1.25rem;border-top-right-radius:9999px;border-bottom-right-radius:9999px}.neighbor-button-label p{color:var(--sdc-neighbors-text-color);font-size:var(--sdc-neighbors-button-text-font-size);font-weight:var(--sdc-neighbors-button-text-font-weight);text-transform:var(--sdc-neighbors-button-text-transform)}.neighbor-button-label .prefix{opacity:var(--sdc-neighbors-prefix-opacity);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:calc(var(--sdc-neighbors-button-width) - 1.875rem)}.neighbor-button-label .section-number{white-space:nowrap}.current-section-wrapper{display:block;margin-left:auto;margin-right:auto;cursor:default;min-width:0;overflow:hidden}.current-section-loading{font-weight:var(--sdc-neighbors-current-section-loading-font-weight);font-size:var(--sdc-neighbors-current-section-loading-font-size);color:var(--sdc-neighbors-text-color)}.current-section-text{display:flex;font-weight:var(--sdc-neighbors-current-section-text-font-weight);font-size:var(--sdc-neighbors-current-section-text-font-size);color:var(--sdc-neighbors-text-color);text-transform:var(--sdc-neighbors-current-section-text-transform);overflow:hidden;min-width:0}.current-section-text .prefix{opacity:var(--sdc-neighbors-prefix-opacity);flex-shrink:0;white-space:nowrap}.current-section-text .section-number{display:inline-block;max-width:3rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.current-section-text .prefix,.neighbor-button-label .prefix{display:none}.neighbors-container{max-width:7.5rem}.current-section-text .section-number{max-width:2.5rem}.neighbor-button{width:60px}}@media(max-width:420px){.neighbors-container{max-width:6rem}.current-section-text .section-number{max-width:2rem}}\n"] }]
180
180
  }], propDecorators: { neighborsContainer: [{
181
181
  type: ViewChild,
182
182
  args: ['neighborsContainer']
@@ -1 +1 @@
1
- {"version":3,"file":"3ddv-software-division-components-dvm-neighbors.mjs","sources":["../../dvm/neighbors/neighbors.component.ts","../../dvm/neighbors/neighbors.component.html","../../dvm/neighbors/3ddv-software-division-components-dvm-neighbors.ts"],"sourcesContent":["import { ThemeClass } from '@3ddv/software-division-components/shared';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n input,\r\n OnDestroy,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { Direction, HasAvailabilityFn, NeighborsData, SectionChangeEvent, TranslateSectionIdFn } from './types';\r\n\r\n@Component({\r\n selector: 'sdc-neighbors',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './neighbors.component.html',\r\n styleUrl: './neighbors.component.css',\r\n})\r\nexport class NeighborsComponent implements OnDestroy {\r\n // VIEWCHILD\r\n @ViewChild('neighborsContainer')\r\n public readonly neighborsContainer!: ElementRef<HTMLDivElement>;\r\n\r\n @ViewChild('currentSection', { static: false })\r\n public readonly currentSection!: ElementRef<HTMLSpanElement>;\r\n\r\n @ViewChild('currentSection3d', { static: false })\r\n public readonly currentSection3d!: ElementRef<HTMLSpanElement>;\r\n\r\n @ViewChild('leftSectionNumber', { static: false })\r\n public readonly leftSectionElement!: ElementRef<HTMLSpanElement>;\r\n\r\n @ViewChild('rightSectionNumber', { static: false })\r\n public readonly rightSectionElement!: ElementRef<HTMLSpanElement>;\r\n\r\n // SERVICES\r\n private readonly cdr: ChangeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n // REQUIRED INPUTS\r\n public readonly neighborsData = input.required<NeighborsData>();\r\n public readonly currentSectionId = input.required<string | null>();\r\n public readonly translateTdcToMmc = input.required<TranslateSectionIdFn>();\r\n public readonly translateMmcToTdc = input.required<TranslateSectionIdFn>();\r\n public readonly hasAvailability = input.required<HasAvailabilityFn>();\r\n\r\n // OPTIONAL INPUTS\r\n public readonly isLoading = input<boolean>(false);\r\n public readonly showElement = input<boolean>(true);\r\n public readonly modeLr = input<boolean>(false);\r\n public readonly className = input<string>('');\r\n public readonly theme = input<ThemeClass>('theme-sdc');\r\n\r\n // OUTPUTS\r\n @Output() sectionChange = new EventEmitter<SectionChangeEvent>();\r\n\r\n /**\r\n * Computed class string that combines theme and user classes.\r\n */\r\n protected readonly computedClass = computed(() => {\r\n const themeClass = this.theme();\r\n const className = this.className();\r\n return Array.from(new Set(['sdc-neighbors', themeClass, className]))\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n // COMPONENT STATE\r\n private readonly subscriptions: Subscription[] = [];\r\n\r\n // COMPUTED STATE\r\n protected readonly leftSectionId = computed(() => {\r\n try {\r\n const currentId = this.currentSectionId();\r\n if (!currentId) return null;\r\n return this.findAvailableNeighbor('prev', currentId);\r\n } catch (error) {\r\n return null;\r\n }\r\n });\r\n\r\n protected readonly rightSectionId = computed(() => {\r\n try {\r\n const currentId = this.currentSectionId();\r\n if (!currentId) return null;\r\n return this.findAvailableNeighbor('next', currentId);\r\n } catch (error) {\r\n return null;\r\n }\r\n });\r\n\r\n protected readonly currentSectionLabel = computed(() => {\r\n try {\r\n const currentId = this.currentSectionId();\r\n if (!currentId) return 'Loading';\r\n\r\n // Translate TDC ID to MMC ID for display\r\n const mmcId = this.translateTdcToMmc()(currentId);\r\n if (!mmcId) return currentId; // Fallback to TDC ID if translation fails\r\n\r\n // Extract section number from MMC ID (assuming format like \"S_31\" or similar)\r\n return mmcId.replace(/^S_/, '');\r\n } catch (error) {\r\n return 'Loading';\r\n }\r\n });\r\n\r\n protected readonly leftSectionLabel = computed(() => {\r\n try {\r\n const leftId = this.leftSectionId();\r\n if (!leftId) return null;\r\n\r\n // Translate TDC ID to MMC ID for display\r\n const mmcId = this.translateTdcToMmc()(leftId);\r\n if (!mmcId) return leftId; // Fallback to TDC ID if translation fails\r\n\r\n // Extract section number from MMC ID\r\n return mmcId.replace(/^S_/, '');\r\n } catch (error) {\r\n return null;\r\n }\r\n });\r\n\r\n protected readonly rightSectionLabel = computed(() => {\r\n try {\r\n const rightId = this.rightSectionId();\r\n if (!rightId) return null;\r\n\r\n // Translate TDC ID to MMC ID for display\r\n const mmcId = this.translateTdcToMmc()(rightId);\r\n if (!mmcId) return rightId; // Fallback to TDC ID if translation fails\r\n\r\n // Extract section number from MMC ID\r\n return mmcId.replace(/^S_/, '');\r\n } catch (error) {\r\n return null;\r\n }\r\n });\r\n\r\n // NEIGHBOR RESOLUTION ALGORITHM\r\n private findAvailableNeighbor(type: Direction, currentSectionTdcId: string): string | null {\r\n try {\r\n const neighborKey = type === 'prev' ? 'l' : 'r';\r\n const noNeighborValue = 'none';\r\n\r\n // 1. Translate TDC → MMC\r\n const currentSectionMmcId = this.translateTdcToMmc()(currentSectionTdcId);\r\n if (!currentSectionMmcId) return null;\r\n\r\n // 2. Look up neighbor in data\r\n const neighbors = this.neighborsData();\r\n const neighbor = neighbors[currentSectionMmcId];\r\n const neighborSectionMmcId = neighbor ? neighbor[neighborKey] : noNeighborValue;\r\n\r\n // 3. Handle 'none' boundary\r\n if (neighborSectionMmcId === noNeighborValue) {\r\n return null;\r\n }\r\n\r\n // 4. Translate MMC → TDC\r\n const neighborSectionTdcId = this.translateMmcToTdc()(neighborSectionMmcId);\r\n if (!neighborSectionTdcId) return null;\r\n\r\n // 5. Check availability\r\n if (this.hasAvailability()(neighborSectionTdcId)) {\r\n return neighborSectionTdcId;\r\n }\r\n\r\n // 6. Recursively find next available (skip unavailable sections)\r\n return this.findAvailableNeighbor(type, neighborSectionTdcId);\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n // GETTERS\r\n public get leftSection(): string | null {\r\n return this.leftSectionId();\r\n }\r\n\r\n public get rightSection(): string | null {\r\n return this.rightSectionId();\r\n }\r\n\r\n public get section(): string | null {\r\n return this.currentSectionLabel();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach((sub: Subscription): void => sub.unsubscribe());\r\n }\r\n\r\n // METHODS\r\n public navigateToSection(section: string): void {\r\n if (section === 'none' || !section) {\r\n return;\r\n }\r\n\r\n const leftId = this.leftSectionId();\r\n const rightId = this.rightSectionId();\r\n\r\n let direction: Direction;\r\n if (section === leftId) {\r\n direction = 'prev';\r\n } else if (section === rightId) {\r\n direction = 'next';\r\n } else {\r\n return;\r\n }\r\n\r\n this.sectionChange.emit({ direction, sectionId: section });\r\n }\r\n}\r\n","<div #neighborsContainer class=\"neighbors-container\" [class]=\"computedClass()\" [class.hidden]=\"!showElement()\">\n <!-- LEFT SECTION BUTTON -->\n @if (leftSection) {\n <div\n class=\"neighbor-button-left neighbor-button\"\n tabindex=\"0\"\n (click)=\"navigateToSection(leftSection!)\"\n (keypress.enter)=\"navigateToSection(leftSection!)\">\n <i class=\"neighbor-button-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.75 19.5 8.25 12l7.5-7.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </i>\n </div>\n }\n <div class=\"current-section-wrapper\">\n @if (isLoading()) {\n <p class=\"current-section-loading\">\n <span>Loading</span>\n </p>\n } @else {\n @if (section) {\n <h3 class=\"current-section-text\">\n <span class=\"prefix\">Section </span>\n <span #currentSection class=\"section-number\">{{ section }}</span>\n </h3>\n }\n }\n </div>\n\n <!-- RIGHT SECTION BUTTON -->\n @if (rightSection) {\n <div\n class=\"neighbor-button-right neighbor-button\"\n tabindex=\"1\"\n (click)=\"navigateToSection(rightSection!)\"\n (keypress.enter)=\"navigateToSection(rightSection!)\">\n <i class=\"neighbor-button-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"m8.25 4.5 7.5 7.5-7.5 7.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </i>\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"3ddv-software-division-components-dvm-neighbors.mjs","sources":["../../dvm/neighbors/neighbors.component.ts","../../dvm/neighbors/neighbors.component.html","../../dvm/neighbors/3ddv-software-division-components-dvm-neighbors.ts"],"sourcesContent":["import { ThemeClass } from '@3ddv/software-division-components/shared';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n input,\r\n OnDestroy,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { Direction, HasAvailabilityFn, NeighborsData, SectionChangeEvent, TranslateSectionIdFn } from './types';\r\n\r\n@Component({\r\n selector: 'sdc-neighbors',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './neighbors.component.html',\r\n styleUrl: './neighbors.component.css',\r\n})\r\nexport class NeighborsComponent implements OnDestroy {\r\n // VIEWCHILD\r\n @ViewChild('neighborsContainer')\r\n public readonly neighborsContainer!: ElementRef<HTMLDivElement>;\r\n\r\n @ViewChild('currentSection', { static: false })\r\n public readonly currentSection!: ElementRef<HTMLSpanElement>;\r\n\r\n @ViewChild('currentSection3d', { static: false })\r\n public readonly currentSection3d!: ElementRef<HTMLSpanElement>;\r\n\r\n @ViewChild('leftSectionNumber', { static: false })\r\n public readonly leftSectionElement!: ElementRef<HTMLSpanElement>;\r\n\r\n @ViewChild('rightSectionNumber', { static: false })\r\n public readonly rightSectionElement!: ElementRef<HTMLSpanElement>;\r\n\r\n // SERVICES\r\n private readonly cdr: ChangeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n // REQUIRED INPUTS\r\n public readonly neighborsData = input.required<NeighborsData>();\r\n public readonly currentSectionId = input.required<string | null>();\r\n public readonly translateTdcToMmc = input.required<TranslateSectionIdFn>();\r\n public readonly translateMmcToTdc = input.required<TranslateSectionIdFn>();\r\n public readonly hasAvailability = input.required<HasAvailabilityFn>();\r\n\r\n // OPTIONAL INPUTS\r\n public readonly isLoading = input<boolean>(false);\r\n public readonly showElement = input<boolean>(true);\r\n public readonly modeLr = input<boolean>(false);\r\n public readonly className = input<string>('');\r\n public readonly theme = input<ThemeClass>('theme-sdc');\r\n\r\n // OUTPUTS\r\n @Output() sectionChange = new EventEmitter<SectionChangeEvent>();\r\n\r\n /**\r\n * Computed class string that combines theme and user classes.\r\n */\r\n protected readonly computedClass = computed(() => {\r\n const themeClass = this.theme();\r\n const className = this.className();\r\n return Array.from(new Set(['sdc-neighbors', themeClass, className]))\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n // COMPONENT STATE\r\n private readonly subscriptions: Subscription[] = [];\r\n\r\n // COMPUTED STATE\r\n protected readonly leftSectionId = computed(() => {\r\n try {\r\n const currentId = this.currentSectionId();\r\n if (!currentId) return null;\r\n return this.findAvailableNeighbor('prev', currentId);\r\n } catch (error) {\r\n return null;\r\n }\r\n });\r\n\r\n protected readonly rightSectionId = computed(() => {\r\n try {\r\n const currentId = this.currentSectionId();\r\n if (!currentId) return null;\r\n return this.findAvailableNeighbor('next', currentId);\r\n } catch (error) {\r\n return null;\r\n }\r\n });\r\n\r\n protected readonly currentSectionLabel = computed(() => {\r\n try {\r\n const currentId = this.currentSectionId();\r\n if (!currentId) return 'Loading';\r\n\r\n // Translate TDC ID to MMC ID for display\r\n const mmcId = this.translateTdcToMmc()(currentId);\r\n if (!mmcId) return currentId; // Fallback to TDC ID if translation fails\r\n\r\n // Extract section number from MMC ID (assuming format like \"S_31\" or similar)\r\n return mmcId.replace(/^S_/, '');\r\n } catch (error) {\r\n return 'Loading';\r\n }\r\n });\r\n\r\n protected readonly leftSectionLabel = computed(() => {\r\n try {\r\n const leftId = this.leftSectionId();\r\n if (!leftId) return null;\r\n\r\n // Translate TDC ID to MMC ID for display\r\n const mmcId = this.translateTdcToMmc()(leftId);\r\n if (!mmcId) return leftId; // Fallback to TDC ID if translation fails\r\n\r\n // Extract section number from MMC ID\r\n return mmcId.replace(/^S_/, '');\r\n } catch (error) {\r\n return null;\r\n }\r\n });\r\n\r\n protected readonly rightSectionLabel = computed(() => {\r\n try {\r\n const rightId = this.rightSectionId();\r\n if (!rightId) return null;\r\n\r\n // Translate TDC ID to MMC ID for display\r\n const mmcId = this.translateTdcToMmc()(rightId);\r\n if (!mmcId) return rightId; // Fallback to TDC ID if translation fails\r\n\r\n // Extract section number from MMC ID\r\n return mmcId.replace(/^S_/, '');\r\n } catch (error) {\r\n return null;\r\n }\r\n });\r\n\r\n // NEIGHBOR RESOLUTION ALGORITHM\r\n private findAvailableNeighbor(type: Direction, currentSectionTdcId: string): string | null {\r\n try {\r\n const neighborKey = type === 'prev' ? 'l' : 'r';\r\n const noNeighborValue = 'none';\r\n\r\n // 1. Translate TDC → MMC\r\n const currentSectionMmcId = this.translateTdcToMmc()(currentSectionTdcId);\r\n if (!currentSectionMmcId) return null;\r\n\r\n // 2. Look up neighbor in data\r\n const neighbors = this.neighborsData();\r\n const neighbor = neighbors[currentSectionMmcId];\r\n const neighborSectionMmcId = neighbor ? neighbor[neighborKey] : noNeighborValue;\r\n\r\n // 3. Handle 'none' boundary\r\n if (neighborSectionMmcId === noNeighborValue) {\r\n return null;\r\n }\r\n\r\n // 4. Translate MMC → TDC\r\n const neighborSectionTdcId = this.translateMmcToTdc()(neighborSectionMmcId);\r\n if (!neighborSectionTdcId) return null;\r\n\r\n // 5. Check availability\r\n if (this.hasAvailability()(neighborSectionTdcId)) {\r\n return neighborSectionTdcId;\r\n }\r\n\r\n // 6. Recursively find next available (skip unavailable sections)\r\n return this.findAvailableNeighbor(type, neighborSectionTdcId);\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n // GETTERS\r\n public get leftSection(): string | null {\r\n return this.leftSectionId();\r\n }\r\n\r\n public get rightSection(): string | null {\r\n return this.rightSectionId();\r\n }\r\n\r\n public get section(): string | null {\r\n return this.currentSectionLabel();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach((sub: Subscription): void => sub.unsubscribe());\r\n }\r\n\r\n // METHODS\r\n public navigateToSection(section: string): void {\r\n if (section === 'none' || !section) {\r\n return;\r\n }\r\n\r\n const leftId = this.leftSectionId();\r\n const rightId = this.rightSectionId();\r\n\r\n let direction: Direction;\r\n if (section === leftId) {\r\n direction = 'prev';\r\n } else if (section === rightId) {\r\n direction = 'next';\r\n } else {\r\n return;\r\n }\r\n\r\n this.sectionChange.emit({ direction, sectionId: section });\r\n }\r\n}\r\n","<div #neighborsContainer class=\"neighbors-container\" [class]=\"computedClass()\" [class.hidden]=\"!showElement()\">\n <!-- LEFT SECTION BUTTON -->\n @if (leftSection) {\n <div\n class=\"neighbor-button-left neighbor-button\"\n [class.is-none]=\"leftSection === 'none'\"\n tabindex=\"0\"\n (click)=\"navigateToSection(leftSection!)\"\n (keypress.enter)=\"navigateToSection(leftSection!)\">\n <!-- ARROW ICON -->\n <div class=\"neighbor-button-icon\">\n <i>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"3\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 19.5 8.25 12l7.5-7.5\" />\n </svg>\n </i>\n </div>\n\n <!-- SECTION LABEL -->\n <div class=\"neighbor-button-label\">\n <p>\n <span class=\"prefix\"> {{ modeLr() ? 'Left Section' : 'Section' }}&nbsp; </span>\n @if (leftSection !== 'none' && !modeLr()) {\n <span #leftSectionNumber class=\"section-number\">\n {{ leftSectionLabel() }}\n </span>\n }\n </p>\n </div>\n </div>\n }\n\n <!-- CURRENT SECTION TEXT -->\n <div class=\"current-section-wrapper\">\n @if (isLoading()) {\n <p class=\"current-section-loading\">\n <span>Loading</span>\n </p>\n } @else {\n @if (section) {\n <h3 class=\"current-section-text\">\n <span class=\"prefix\">Section&nbsp;</span>\n <span #currentSection class=\"section-number\">{{ section }}</span>\n </h3>\n }\n }\n </div>\n\n <!-- RIGHT SECTION BUTTON -->\n @if (rightSection) {\n <div\n class=\"neighbor-button-right neighbor-button\"\n [class.is-none]=\"rightSection === 'none'\"\n tabindex=\"1\"\n (click)=\"navigateToSection(rightSection!)\"\n (keypress.enter)=\"navigateToSection(rightSection!)\">\n <!-- ARROW ICON -->\n <div class=\"neighbor-button-icon\">\n <i>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"3\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m8.25 4.5 7.5 7.5-7.5 7.5\" />\n </svg>\n </i>\n </div>\n\n <!-- SECTION LABEL -->\n <div class=\"neighbor-button-label\">\n <p>\n <span class=\"prefix\"> {{ modeLr() ? 'Right Section' : 'Section' }}&nbsp; </span>\n @if (rightSection !== 'none' && !modeLr()) {\n <span #rightSectionNumber class=\"section-number\">\n {{ rightSectionLabel() }}\n </span>\n }\n </p>\n </div>\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -572,6 +572,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
572
572
  class SeatPopoverComponent extends BasePopoverComponent {
573
573
  data;
574
574
  showLoader = true;
575
+ load3dView = new EventEmitter();
575
576
  thumbnailProvider = inject(THUMBNAIL_PROVIDER, { optional: true });
576
577
  cdr = inject(ChangeDetectorRef);
577
578
  thumbnail;
@@ -611,16 +612,21 @@ class SeatPopoverComponent extends BasePopoverComponent {
611
612
  onLeave(event) {
612
613
  this.onMouseLeave(event);
613
614
  }
615
+ onLoad3dView() {
616
+ this.load3dView.emit();
617
+ }
614
618
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: SeatPopoverComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
615
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: SeatPopoverComponent, isStandalone: true, selector: "sdc-seat-popover", inputs: { data: "data", showLoader: "showLoader" }, usesInheritance: true, ngImport: i0, template: "<div\n (mouseenter)=\"onEnter($event)\"\n (mouseleave)=\"onLeave($event)\"\n class=\"sdc-seat-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div class=\"sdc-thumbnail-image\" [style.background-image]=\"'url(' + thumbnail + ')'\"></div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ formattedSection }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Row:</span>\n {{ data.row }}\n </h5>\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Seat:</span>\n {{ formattedSeat }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span>\n {{ data.price | currency: 'USD' }}\n </h5>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.sdc-seat-popover{width:var(--sdc-popover-width, 20rem);height:auto;color:var(--sdc-popover-text-color, #ffffff);background-color:var(--sdc-popover-bg-color, #000000);border-radius:var(--sdc-popover-border-radius, .75rem);overflow:hidden}.sdc-popover-thumbnail{width:100%;height:var(--sdc-popover-thumbnail-height, 12rem);position:relative}.sdc-thumbnail-image{width:100%;height:100%;background-position:center;background-size:cover;background-repeat:no-repeat}.sdc-popover-loader{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sdc-spinner{display:inline-block;width:80px;height:80px}.sdc-spinner:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 16px;border-radius:50%;border:3px solid var(--sdc-spinner-color, #fff);border-color:var(--sdc-spinner-color, #fff) transparent var(--sdc-spinner-color, #fff) transparent;animation:sdc-spinner-rotate 1.2s linear infinite}@keyframes sdc-spinner-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdc-popover-content{padding:.75rem}.sdc-popover-grid{display:flex;gap:1.25rem}.sdc-popover-col-left{flex:1}.sdc-popover-col-right{flex:1;text-align:right;min-width:max-content}.sdc-popover-label{margin:.25rem 0;font-size:var(--sdc-popover-label-font-size, .875rem);line-height:1.25rem;font-weight:var(--sdc-popover-label-font-weight, 700)}.sdc-popover-label-text{font-weight:var(--sdc-popover-label-text-font-weight, 400)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
619
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: SeatPopoverComponent, isStandalone: true, selector: "sdc-seat-popover", inputs: { data: "data", showLoader: "showLoader" }, outputs: { load3dView: "load3dView" }, usesInheritance: true, ngImport: i0, template: "<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-seat-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ formattedSection }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Row:</span>\n {{ data.row }}\n </h5>\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Seat:</span>\n {{ formattedSeat }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span>\n {{ data.price | currency: 'USD' }}\n </h5>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.sdc-seat-popover{width:var(--sdc-popover-width, 20rem);height:auto;color:var(--sdc-popover-text-color, #ffffff);background-color:var(--sdc-popover-bg-color, #000000);border-radius:var(--sdc-popover-border-radius, .75rem);overflow:hidden}.sdc-popover-thumbnail{width:100%;height:var(--sdc-popover-thumbnail-height, 12rem);position:relative}.sdc-thumbnail-image{width:100%;height:100%;background-position:center;background-size:cover;background-repeat:no-repeat}.sdc-popover-loader{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sdc-spinner{display:inline-block;width:80px;height:80px}.sdc-spinner:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 16px;border-radius:50%;border:3px solid var(--sdc-spinner-color, #fff);border-color:var(--sdc-spinner-color, #fff) transparent var(--sdc-spinner-color, #fff) transparent;animation:sdc-spinner-rotate 1.2s linear infinite}@keyframes sdc-spinner-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdc-popover-content{padding:.75rem}.sdc-popover-grid{display:flex;gap:1.25rem}.sdc-popover-col-left{flex:1}.sdc-popover-col-right{flex:1;text-align:right;min-width:max-content}.sdc-popover-label{margin:.25rem 0;font-size:var(--sdc-popover-label-font-size, .875rem);line-height:1.25rem;font-weight:var(--sdc-popover-label-font-weight, 700)}.sdc-popover-label-text{font-weight:var(--sdc-popover-label-text-font-weight, 400)}.sdc-thumbnail-clickable{cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:8px}.sdc-thumbnail-overlay-text{font-size:var(--sdc-thumbnail-overlay-font-size, 12px);color:var(--sdc-thumbnail-overlay-color, #ffffff);background-color:var(--sdc-thumbnail-overlay-bg, rgba(0, 0, 0, .5));padding:4px 8px;border-radius:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
616
620
  }
617
621
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: SeatPopoverComponent, decorators: [{
618
622
  type: Component,
619
- args: [{ selector: 'sdc-seat-popover', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, CurrencyPipe], template: "<div\n (mouseenter)=\"onEnter($event)\"\n (mouseleave)=\"onLeave($event)\"\n class=\"sdc-seat-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div class=\"sdc-thumbnail-image\" [style.background-image]=\"'url(' + thumbnail + ')'\"></div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ formattedSection }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Row:</span>\n {{ data.row }}\n </h5>\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Seat:</span>\n {{ formattedSeat }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span>\n {{ data.price | currency: 'USD' }}\n </h5>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.sdc-seat-popover{width:var(--sdc-popover-width, 20rem);height:auto;color:var(--sdc-popover-text-color, #ffffff);background-color:var(--sdc-popover-bg-color, #000000);border-radius:var(--sdc-popover-border-radius, .75rem);overflow:hidden}.sdc-popover-thumbnail{width:100%;height:var(--sdc-popover-thumbnail-height, 12rem);position:relative}.sdc-thumbnail-image{width:100%;height:100%;background-position:center;background-size:cover;background-repeat:no-repeat}.sdc-popover-loader{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sdc-spinner{display:inline-block;width:80px;height:80px}.sdc-spinner:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 16px;border-radius:50%;border:3px solid var(--sdc-spinner-color, #fff);border-color:var(--sdc-spinner-color, #fff) transparent var(--sdc-spinner-color, #fff) transparent;animation:sdc-spinner-rotate 1.2s linear infinite}@keyframes sdc-spinner-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdc-popover-content{padding:.75rem}.sdc-popover-grid{display:flex;gap:1.25rem}.sdc-popover-col-left{flex:1}.sdc-popover-col-right{flex:1;text-align:right;min-width:max-content}.sdc-popover-label{margin:.25rem 0;font-size:var(--sdc-popover-label-font-size, .875rem);line-height:1.25rem;font-weight:var(--sdc-popover-label-font-weight, 700)}.sdc-popover-label-text{font-weight:var(--sdc-popover-label-text-font-weight, 400)}\n"] }]
623
+ args: [{ selector: 'sdc-seat-popover', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, CurrencyPipe], template: "<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-seat-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ formattedSection }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Row:</span>\n {{ data.row }}\n </h5>\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Seat:</span>\n {{ formattedSeat }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span>\n {{ data.price | currency: 'USD' }}\n </h5>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.sdc-seat-popover{width:var(--sdc-popover-width, 20rem);height:auto;color:var(--sdc-popover-text-color, #ffffff);background-color:var(--sdc-popover-bg-color, #000000);border-radius:var(--sdc-popover-border-radius, .75rem);overflow:hidden}.sdc-popover-thumbnail{width:100%;height:var(--sdc-popover-thumbnail-height, 12rem);position:relative}.sdc-thumbnail-image{width:100%;height:100%;background-position:center;background-size:cover;background-repeat:no-repeat}.sdc-popover-loader{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sdc-spinner{display:inline-block;width:80px;height:80px}.sdc-spinner:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 16px;border-radius:50%;border:3px solid var(--sdc-spinner-color, #fff);border-color:var(--sdc-spinner-color, #fff) transparent var(--sdc-spinner-color, #fff) transparent;animation:sdc-spinner-rotate 1.2s linear infinite}@keyframes sdc-spinner-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdc-popover-content{padding:.75rem}.sdc-popover-grid{display:flex;gap:1.25rem}.sdc-popover-col-left{flex:1}.sdc-popover-col-right{flex:1;text-align:right;min-width:max-content}.sdc-popover-label{margin:.25rem 0;font-size:var(--sdc-popover-label-font-size, .875rem);line-height:1.25rem;font-weight:var(--sdc-popover-label-font-weight, 700)}.sdc-popover-label-text{font-weight:var(--sdc-popover-label-text-font-weight, 400)}.sdc-thumbnail-clickable{cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:8px}.sdc-thumbnail-overlay-text{font-size:var(--sdc-thumbnail-overlay-font-size, 12px);color:var(--sdc-thumbnail-overlay-color, #ffffff);background-color:var(--sdc-thumbnail-overlay-bg, rgba(0, 0, 0, .5));padding:4px 8px;border-radius:4px}\n"] }]
620
624
  }], propDecorators: { data: [{
621
625
  type: Input
622
626
  }], showLoader: [{
623
627
  type: Input
628
+ }], load3dView: [{
629
+ type: Output
624
630
  }] } });
625
631
 
626
632
  class SectionPopoverComponent extends BasePopoverComponent {
@@ -630,6 +636,7 @@ class SectionPopoverComponent extends BasePopoverComponent {
630
636
  showOpenSeatMap = true;
631
637
  excludeSeatMapSections = ['S_BLCHADA', 'S_Bleacher'];
632
638
  isTicketFeeEnabled = false;
639
+ isAdaEnabled = true;
633
640
  load3dView = new EventEmitter();
634
641
  selectForBA = new EventEmitter();
635
642
  openSeatMap = new EventEmitter();
@@ -638,7 +645,7 @@ class SectionPopoverComponent extends BasePopoverComponent {
638
645
  thumbnail;
639
646
  isLoadingThumbnail = true;
640
647
  ngOnInit() {
641
- super.ngOnInit(); // Initialize base component timer logic
648
+ super.ngOnInit(); // Initialize basse component timer logic
642
649
  if (this.data.thumbnail) {
643
650
  this.thumbnail = this.data.thumbnail;
644
651
  this.isLoadingThumbnail = false;
@@ -691,11 +698,11 @@ class SectionPopoverComponent extends BasePopoverComponent {
691
698
  this.openSeatMap.emit();
692
699
  }
693
700
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: SectionPopoverComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
694
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: SectionPopoverComponent, isStandalone: true, selector: "sdc-section-popover", inputs: { data: "data", showLoader: "showLoader", showBestAvailable: "showBestAvailable", showOpenSeatMap: "showOpenSeatMap", excludeSeatMapSections: "excludeSeatMapSections", isTicketFeeEnabled: "isTicketFeeEnabled" }, outputs: { load3dView: "load3dView", selectForBA: "selectForBA", openSeatMap: "openSeatMap" }, usesInheritance: true, ngImport: i0, template: "<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-section-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ data.section }}\n </h5>\n @if (isTicketFeeEnabled && priceRangeWithFees) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeWithFees }}\n </h5>\n } @else {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeDisplay }}\n </h5>\n }\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available Seats:</span>\n {{ data.availableQuantity }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available ADA Seats:</span>\n {{ data.adaQuantity }}\n </h5>\n </div>\n </div>\n\n <div class=\"sdc-popover-actions\">\n @if (showBestAvailable) {\n <button class=\"sdc-popover-btn sdc-popover-btn-primary sdc-popover-btn-mobile-only\" (click)=\"onSelectForBA()\">\n {{ data.isSelectedForBA ? 'Deselect' : 'Select' }}\n </button>\n }\n @if (shouldShowSeatMapButton) {\n <button class=\"sdc-popover-btn sdc-popover-btn-secondary\" (click)=\"onOpenSeatMap()\">Open Seat Map</button>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.sdc-section-popover{width:var(--sdc-popover-width, 20rem);height:auto;color:var(--sdc-popover-text-color, #ffffff);background-color:var(--sdc-popover-bg-color, #000000);border-radius:var(--sdc-popover-border-radius, .75rem);overflow:hidden}.sdc-popover-thumbnail{width:100%;height:var(--sdc-popover-thumbnail-height, 12rem);position:relative}.sdc-thumbnail-image{width:100%;height:100%;background-position:center;background-size:cover;background-repeat:no-repeat}.sdc-thumbnail-clickable{cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:8px}.sdc-thumbnail-overlay-text{font-size:var(--sdc-thumbnail-overlay-font-size, 12px);color:var(--sdc-thumbnail-overlay-color, #ffffff);background-color:var(--sdc-thumbnail-overlay-bg, rgba(0, 0, 0, .5));padding:4px 8px;border-radius:4px}.sdc-popover-loader{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sdc-spinner{display:inline-block;width:80px;height:80px}.sdc-spinner:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 24px;border-radius:50%;border:3px solid var(--sdc-spinner-color, #fff);border-color:var(--sdc-spinner-color, #fff) transparent var(--sdc-spinner-color, #fff) transparent;animation:sdc-spinner-rotate 1.2s linear infinite}@keyframes sdc-spinner-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdc-popover-content{padding:.75rem}.sdc-popover-grid{display:flex;gap:1.25rem}.sdc-popover-col-left{flex:1}.sdc-popover-col-right{flex:1;text-align:right;min-width:max-content}.sdc-popover-label{margin:.25rem 0;font-size:var(--sdc-popover-label-font-size, .875rem);line-height:1.25rem;font-weight:var(--sdc-popover-label-font-weight, 700)}.sdc-popover-label-text{font-weight:var(--sdc-popover-label-text-font-weight, 400)}.sdc-popover-actions{padding:.5rem 0;display:flex;justify-content:center;gap:.5rem}.sdc-popover-btn{border:none;border-radius:var(--sdc-btn-border-radius, 4px);padding:.5rem 1rem;height:var(--sdc-btn-height, 2.25rem);font-size:var(--sdc-btn-font-size, .75rem);cursor:pointer;transition:transform .15s cubic-bezier(.4,0,.2,1)}.sdc-popover-btn:hover:not(:disabled){transform:scale(.95)}.sdc-popover-btn:disabled{opacity:.3;cursor:not-allowed}.sdc-popover-btn-primary{background-color:var(--sdc-btn-primary-bg, #007bff);color:var(--sdc-btn-primary-color, white);margin-right:.5rem}.sdc-popover-btn-secondary{background-color:var(--sdc-btn-secondary-bg, white);color:var(--sdc-btn-secondary-color, #007bff);border:1px solid var(--sdc-btn-secondary-border, #007bff)}.sdc-popover-btn-secondary:hover:not(:disabled){color:var(--sdc-btn-secondary-hover-color, #0056b3)}.sdc-popover-btn-mobile-only{display:block}@media(min-width:768px){.sdc-popover-btn-mobile-only{display:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
701
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: SectionPopoverComponent, isStandalone: true, selector: "sdc-section-popover", inputs: { data: "data", showLoader: "showLoader", showBestAvailable: "showBestAvailable", showOpenSeatMap: "showOpenSeatMap", excludeSeatMapSections: "excludeSeatMapSections", isTicketFeeEnabled: "isTicketFeeEnabled", isAdaEnabled: "isAdaEnabled" }, outputs: { load3dView: "load3dView", selectForBA: "selectForBA", openSeatMap: "openSeatMap" }, usesInheritance: true, ngImport: i0, template: "<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-section-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ data.section }}\n </h5>\n @if (isTicketFeeEnabled && priceRangeWithFees) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeWithFees }}\n </h5>\n } @else {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeDisplay }}\n </h5>\n }\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available Seats:</span>\n {{ data.availableQuantity }}\n </h5>\n @if (isAdaEnabled) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available ADA Seats:</span>\n {{ data.adaQuantity }}\n </h5>\n }\n </div>\n </div>\n\n <div class=\"sdc-popover-actions\">\n @if (showBestAvailable) {\n <button class=\"sdc-popover-btn sdc-popover-btn-primary sdc-popover-btn-mobile-only\" (click)=\"onSelectForBA()\">\n {{ data.isSelectedForBA ? 'Deselect' : 'Select' }}\n </button>\n }\n @if (shouldShowSeatMapButton) {\n <button class=\"sdc-popover-btn sdc-popover-btn-secondary\" (click)=\"onOpenSeatMap()\">Open Seat Map</button>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.sdc-section-popover{width:var(--sdc-popover-width, 20rem);height:auto;color:var(--sdc-popover-text-color, #ffffff);background-color:var(--sdc-popover-bg-color, #000000);border-radius:var(--sdc-popover-border-radius, .75rem);overflow:hidden}.sdc-popover-thumbnail{width:100%;height:var(--sdc-popover-thumbnail-height, 12rem);position:relative}.sdc-thumbnail-image{width:100%;height:100%;background-position:center;background-size:cover;background-repeat:no-repeat}.sdc-thumbnail-clickable{cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:8px}.sdc-thumbnail-overlay-text{font-size:var(--sdc-thumbnail-overlay-font-size, 12px);color:var(--sdc-thumbnail-overlay-color, #ffffff);background-color:var(--sdc-thumbnail-overlay-bg, rgba(0, 0, 0, .5));padding:4px 8px;border-radius:4px}.sdc-popover-loader{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sdc-spinner{display:inline-block;width:80px;height:80px}.sdc-spinner:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 24px;border-radius:50%;border:3px solid var(--sdc-spinner-color, #fff);border-color:var(--sdc-spinner-color, #fff) transparent var(--sdc-spinner-color, #fff) transparent;animation:sdc-spinner-rotate 1.2s linear infinite}@keyframes sdc-spinner-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdc-popover-content{padding:.75rem}.sdc-popover-grid{display:flex;gap:1.25rem}.sdc-popover-col-left{flex:1}.sdc-popover-col-right{flex:1;text-align:right;min-width:max-content}.sdc-popover-label{margin:.25rem 0;font-size:var(--sdc-popover-label-font-size, .875rem);line-height:1.25rem;font-weight:var(--sdc-popover-label-font-weight, 700);display:flex;flex-wrap:wrap;column-gap:5px}.sdc-popover-label-text{font-weight:var(--sdc-popover-label-text-font-weight, 400)}.sdc-popover-actions{padding:.5rem 0;display:flex;justify-content:center;gap:.5rem}.sdc-popover-btn{border:none;border-radius:var(--sdc-btn-border-radius, 4px);padding:.5rem 1rem;height:var(--sdc-btn-height, 2.25rem);font-size:var(--sdc-btn-font-size, .75rem);cursor:pointer;transition:transform .15s cubic-bezier(.4,0,.2,1)}.sdc-popover-btn:hover:not(:disabled){transform:scale(.95)}.sdc-popover-btn:disabled{opacity:.3;cursor:not-allowed}.sdc-popover-btn-primary{background-color:var(--sdc-btn-primary-bg, #007bff);color:var(--sdc-btn-primary-color, white);margin-right:.5rem}.sdc-popover-btn-secondary{background-color:var(--sdc-btn-secondary-bg, white);color:var(--sdc-btn-secondary-color, #007bff);border:1px solid var(--sdc-btn-secondary-border, #007bff)}.sdc-popover-btn-secondary:hover:not(:disabled){color:var(--sdc-btn-secondary-hover-color, #0056b3)}.sdc-popover-btn-mobile-only{display:block}@media(min-width:768px){.sdc-popover-btn-mobile-only{display:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
695
702
  }
696
703
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: SectionPopoverComponent, decorators: [{
697
704
  type: Component,
698
- args: [{ selector: 'sdc-section-popover', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-section-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ data.section }}\n </h5>\n @if (isTicketFeeEnabled && priceRangeWithFees) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeWithFees }}\n </h5>\n } @else {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeDisplay }}\n </h5>\n }\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available Seats:</span>\n {{ data.availableQuantity }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available ADA Seats:</span>\n {{ data.adaQuantity }}\n </h5>\n </div>\n </div>\n\n <div class=\"sdc-popover-actions\">\n @if (showBestAvailable) {\n <button class=\"sdc-popover-btn sdc-popover-btn-primary sdc-popover-btn-mobile-only\" (click)=\"onSelectForBA()\">\n {{ data.isSelectedForBA ? 'Deselect' : 'Select' }}\n </button>\n }\n @if (shouldShowSeatMapButton) {\n <button class=\"sdc-popover-btn sdc-popover-btn-secondary\" (click)=\"onOpenSeatMap()\">Open Seat Map</button>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.sdc-section-popover{width:var(--sdc-popover-width, 20rem);height:auto;color:var(--sdc-popover-text-color, #ffffff);background-color:var(--sdc-popover-bg-color, #000000);border-radius:var(--sdc-popover-border-radius, .75rem);overflow:hidden}.sdc-popover-thumbnail{width:100%;height:var(--sdc-popover-thumbnail-height, 12rem);position:relative}.sdc-thumbnail-image{width:100%;height:100%;background-position:center;background-size:cover;background-repeat:no-repeat}.sdc-thumbnail-clickable{cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:8px}.sdc-thumbnail-overlay-text{font-size:var(--sdc-thumbnail-overlay-font-size, 12px);color:var(--sdc-thumbnail-overlay-color, #ffffff);background-color:var(--sdc-thumbnail-overlay-bg, rgba(0, 0, 0, .5));padding:4px 8px;border-radius:4px}.sdc-popover-loader{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sdc-spinner{display:inline-block;width:80px;height:80px}.sdc-spinner:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 24px;border-radius:50%;border:3px solid var(--sdc-spinner-color, #fff);border-color:var(--sdc-spinner-color, #fff) transparent var(--sdc-spinner-color, #fff) transparent;animation:sdc-spinner-rotate 1.2s linear infinite}@keyframes sdc-spinner-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdc-popover-content{padding:.75rem}.sdc-popover-grid{display:flex;gap:1.25rem}.sdc-popover-col-left{flex:1}.sdc-popover-col-right{flex:1;text-align:right;min-width:max-content}.sdc-popover-label{margin:.25rem 0;font-size:var(--sdc-popover-label-font-size, .875rem);line-height:1.25rem;font-weight:var(--sdc-popover-label-font-weight, 700)}.sdc-popover-label-text{font-weight:var(--sdc-popover-label-text-font-weight, 400)}.sdc-popover-actions{padding:.5rem 0;display:flex;justify-content:center;gap:.5rem}.sdc-popover-btn{border:none;border-radius:var(--sdc-btn-border-radius, 4px);padding:.5rem 1rem;height:var(--sdc-btn-height, 2.25rem);font-size:var(--sdc-btn-font-size, .75rem);cursor:pointer;transition:transform .15s cubic-bezier(.4,0,.2,1)}.sdc-popover-btn:hover:not(:disabled){transform:scale(.95)}.sdc-popover-btn:disabled{opacity:.3;cursor:not-allowed}.sdc-popover-btn-primary{background-color:var(--sdc-btn-primary-bg, #007bff);color:var(--sdc-btn-primary-color, white);margin-right:.5rem}.sdc-popover-btn-secondary{background-color:var(--sdc-btn-secondary-bg, white);color:var(--sdc-btn-secondary-color, #007bff);border:1px solid var(--sdc-btn-secondary-border, #007bff)}.sdc-popover-btn-secondary:hover:not(:disabled){color:var(--sdc-btn-secondary-hover-color, #0056b3)}.sdc-popover-btn-mobile-only{display:block}@media(min-width:768px){.sdc-popover-btn-mobile-only{display:none}}\n"] }]
705
+ args: [{ selector: 'sdc-section-popover', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-section-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ data.section }}\n </h5>\n @if (isTicketFeeEnabled && priceRangeWithFees) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeWithFees }}\n </h5>\n } @else {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeDisplay }}\n </h5>\n }\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available Seats:</span>\n {{ data.availableQuantity }}\n </h5>\n @if (isAdaEnabled) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available ADA Seats:</span>\n {{ data.adaQuantity }}\n </h5>\n }\n </div>\n </div>\n\n <div class=\"sdc-popover-actions\">\n @if (showBestAvailable) {\n <button class=\"sdc-popover-btn sdc-popover-btn-primary sdc-popover-btn-mobile-only\" (click)=\"onSelectForBA()\">\n {{ data.isSelectedForBA ? 'Deselect' : 'Select' }}\n </button>\n }\n @if (shouldShowSeatMapButton) {\n <button class=\"sdc-popover-btn sdc-popover-btn-secondary\" (click)=\"onOpenSeatMap()\">Open Seat Map</button>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.sdc-section-popover{width:var(--sdc-popover-width, 20rem);height:auto;color:var(--sdc-popover-text-color, #ffffff);background-color:var(--sdc-popover-bg-color, #000000);border-radius:var(--sdc-popover-border-radius, .75rem);overflow:hidden}.sdc-popover-thumbnail{width:100%;height:var(--sdc-popover-thumbnail-height, 12rem);position:relative}.sdc-thumbnail-image{width:100%;height:100%;background-position:center;background-size:cover;background-repeat:no-repeat}.sdc-thumbnail-clickable{cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:8px}.sdc-thumbnail-overlay-text{font-size:var(--sdc-thumbnail-overlay-font-size, 12px);color:var(--sdc-thumbnail-overlay-color, #ffffff);background-color:var(--sdc-thumbnail-overlay-bg, rgba(0, 0, 0, .5));padding:4px 8px;border-radius:4px}.sdc-popover-loader{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sdc-spinner{display:inline-block;width:80px;height:80px}.sdc-spinner:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 24px;border-radius:50%;border:3px solid var(--sdc-spinner-color, #fff);border-color:var(--sdc-spinner-color, #fff) transparent var(--sdc-spinner-color, #fff) transparent;animation:sdc-spinner-rotate 1.2s linear infinite}@keyframes sdc-spinner-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdc-popover-content{padding:.75rem}.sdc-popover-grid{display:flex;gap:1.25rem}.sdc-popover-col-left{flex:1}.sdc-popover-col-right{flex:1;text-align:right;min-width:max-content}.sdc-popover-label{margin:.25rem 0;font-size:var(--sdc-popover-label-font-size, .875rem);line-height:1.25rem;font-weight:var(--sdc-popover-label-font-weight, 700);display:flex;flex-wrap:wrap;column-gap:5px}.sdc-popover-label-text{font-weight:var(--sdc-popover-label-text-font-weight, 400)}.sdc-popover-actions{padding:.5rem 0;display:flex;justify-content:center;gap:.5rem}.sdc-popover-btn{border:none;border-radius:var(--sdc-btn-border-radius, 4px);padding:.5rem 1rem;height:var(--sdc-btn-height, 2.25rem);font-size:var(--sdc-btn-font-size, .75rem);cursor:pointer;transition:transform .15s cubic-bezier(.4,0,.2,1)}.sdc-popover-btn:hover:not(:disabled){transform:scale(.95)}.sdc-popover-btn:disabled{opacity:.3;cursor:not-allowed}.sdc-popover-btn-primary{background-color:var(--sdc-btn-primary-bg, #007bff);color:var(--sdc-btn-primary-color, white);margin-right:.5rem}.sdc-popover-btn-secondary{background-color:var(--sdc-btn-secondary-bg, white);color:var(--sdc-btn-secondary-color, #007bff);border:1px solid var(--sdc-btn-secondary-border, #007bff)}.sdc-popover-btn-secondary:hover:not(:disabled){color:var(--sdc-btn-secondary-hover-color, #0056b3)}.sdc-popover-btn-mobile-only{display:block}@media(min-width:768px){.sdc-popover-btn-mobile-only{display:none}}\n"] }]
699
706
  }], propDecorators: { data: [{
700
707
  type: Input
701
708
  }], showLoader: [{
@@ -708,6 +715,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
708
715
  type: Input
709
716
  }], isTicketFeeEnabled: [{
710
717
  type: Input
718
+ }], isAdaEnabled: [{
719
+ type: Input
711
720
  }], load3dView: [{
712
721
  type: Output
713
722
  }], selectForBA: [{
@@ -893,7 +902,7 @@ class PopoverComponent {
893
902
  };
894
903
  }
895
904
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
896
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: PopoverComponent, isStandalone: true, selector: "sdc-map-popover", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: false, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { load3dView: "load3dView", selectSectionForBA: "selectSectionForBA", openSeatMap: "openSeatMap" }, ngImport: i0, template: "<!-- SECTION POPOVER -->\n@if (sectionData) {\n <sdc-section-popover\n [data]=\"sectionData\"\n id=\"pano-view\"\n [popoverId]=\"'popover-' + node.id\"\n [showBestAvailable]=\"true\"\n [showOpenSeatMap]=\"true\"\n [excludeSeatMapSections]=\"['S_BLCHADA', 'S_Bleacher']\"\n (mouseEnter)=\"onEnter($event)\"\n (mouseLeave)=\"onLeave($event)\"\n (load3dView)=\"onLoad3dView()\"\n (selectForBA)=\"onSelectSectionForBA($event)\"\n (openSeatMap)=\"onOpenSeatMap()\">\n </sdc-section-popover>\n}\n\n<!-- SEAT POPOVER -->\n@if (seatData) {\n <sdc-seat-popover\n id=\"pano-view\"\n [data]=\"seatData\"\n [popoverId]=\"'popover-' + node.id\"\n (mouseEnter)=\"onEnter($event)\"\n (mouseLeave)=\"onLeave($event)\">\n </sdc-seat-popover>\n}\n", styles: [".lds-dual-ring{display:inline-block;width:80px;height:80px}.lds-dual-ring:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 16px;border-radius:50%;border:3px solid #fff;border-color:#fff transparent #fff transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}h5{margin:.25rem 0;font-size:.875rem;line-height:1.25rem}.font-normal{font-weight:400}.w-80{width:20rem}.h-48{height:12rem}.h-auto{height:auto}.text-white{color:#fff}.bg-black{background-color:#000}.rounded-xl{border-radius:.75rem}.overflow-hidden{overflow:hidden}.w-full{width:100%}.h-full{height:100%}.bg-center{background-position:center}.bg-cover{background-size:cover}.bg-no-repeat{background-repeat:no-repeat}.flex{display:flex}.justify-center{justify-content:center}.items-center{align-items:center}.px-3{padding-left:.75rem;padding-right:.75rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.w-1\\/2{width:50%}.mr-5{margin-right:1.25rem}.min-w-max{min-width:max-content}.text-right{text-align:right}.viewer3d-image{cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:8px;font-size:12px}.btn-main{background-color:#007bff;color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;cursor:pointer}.btn-white{background-color:#fff;color:#007bff;border:1px solid #007bff;border-radius:4px;padding:.5rem 1rem;cursor:pointer}.btn-white:hover{color:#0056b3}.tooltip-img{background-position:center;background-size:cover;background-repeat:no-repeat}.block{display:block}.md\\\\:hidden{display:none}@media(min-width:768px){.md\\\\:hidden{display:none}}.text-main{color:#007bff}.text-main-accent{color:#0056b3}.mr-2{margin-right:.5rem}.h-9{height:2.25rem}.text-xs{font-size:.75rem;line-height:1rem}.disabled\\\\:opacity-30:disabled{opacity:.3}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover\\\\:scale-95:hover{transform:scale(.95)}.disabled\\\\:hover\\\\:transform-none:disabled:hover{transform:none}.hover\\\\:text-main-accent:hover{color:#0056b3}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SeatPopoverComponent, selector: "sdc-seat-popover", inputs: ["data", "showLoader"] }, { kind: "component", type: SectionPopoverComponent, selector: "sdc-section-popover", inputs: ["data", "showLoader", "showBestAvailable", "showOpenSeatMap", "excludeSeatMapSections", "isTicketFeeEnabled"], outputs: ["load3dView", "selectForBA", "openSeatMap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
905
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: PopoverComponent, isStandalone: true, selector: "sdc-map-popover", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: false, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { load3dView: "load3dView", selectSectionForBA: "selectSectionForBA", openSeatMap: "openSeatMap" }, ngImport: i0, template: "<!-- SECTION POPOVER -->\n@if (sectionData) {\n <sdc-section-popover\n [data]=\"sectionData\"\n id=\"pano-view\"\n [popoverId]=\"'popover-' + node.id\"\n [showBestAvailable]=\"true\"\n [showOpenSeatMap]=\"true\"\n [excludeSeatMapSections]=\"['S_BLCHADA', 'S_Bleacher']\"\n (mouseEnter)=\"onEnter($event)\"\n (mouseLeave)=\"onLeave($event)\"\n (load3dView)=\"onLoad3dView()\"\n (selectForBA)=\"onSelectSectionForBA($event)\"\n (openSeatMap)=\"onOpenSeatMap()\">\n </sdc-section-popover>\n}\n\n<!-- SEAT POPOVER -->\n@if (seatData) {\n <sdc-seat-popover\n id=\"pano-view\"\n [data]=\"seatData\"\n [popoverId]=\"'popover-' + node.id\"\n (mouseEnter)=\"onEnter($event)\"\n (mouseLeave)=\"onLeave($event)\">\n </sdc-seat-popover>\n}\n", styles: [".lds-dual-ring{display:inline-block;width:80px;height:80px}.lds-dual-ring:after{content:\" \";display:block;width:32px;height:32px;margin:16px 8px 8px 16px;border-radius:50%;border:3px solid #fff;border-color:#fff transparent #fff transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}h5{margin:.25rem 0;font-size:.875rem;line-height:1.25rem}.font-normal{font-weight:400}.w-80{width:20rem}.h-48{height:12rem}.h-auto{height:auto}.text-white{color:#fff}.bg-black{background-color:#000}.rounded-xl{border-radius:.75rem}.overflow-hidden{overflow:hidden}.w-full{width:100%}.h-full{height:100%}.bg-center{background-position:center}.bg-cover{background-size:cover}.bg-no-repeat{background-repeat:no-repeat}.flex{display:flex}.justify-center{justify-content:center}.items-center{align-items:center}.px-3{padding-left:.75rem;padding-right:.75rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.w-1\\/2{width:50%}.mr-5{margin-right:1.25rem}.min-w-max{min-width:max-content}.text-right{text-align:right}.viewer3d-image{cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:8px;font-size:12px}.btn-main{background-color:#007bff;color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;cursor:pointer}.btn-white{background-color:#fff;color:#007bff;border:1px solid #007bff;border-radius:4px;padding:.5rem 1rem;cursor:pointer}.btn-white:hover{color:#0056b3}.tooltip-img{background-position:center;background-size:cover;background-repeat:no-repeat}.block{display:block}.md\\\\:hidden{display:none}@media(min-width:768px){.md\\\\:hidden{display:none}}.text-main{color:#007bff}.text-main-accent{color:#0056b3}.mr-2{margin-right:.5rem}.h-9{height:2.25rem}.text-xs{font-size:.75rem;line-height:1rem}.disabled\\\\:opacity-30:disabled{opacity:.3}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover\\\\:scale-95:hover{transform:scale(.95)}.disabled\\\\:hover\\\\:transform-none:disabled:hover{transform:none}.hover\\\\:text-main-accent:hover{color:#0056b3}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SeatPopoverComponent, selector: "sdc-seat-popover", inputs: ["data", "showLoader"], outputs: ["load3dView"] }, { kind: "component", type: SectionPopoverComponent, selector: "sdc-section-popover", inputs: ["data", "showLoader", "showBestAvailable", "showOpenSeatMap", "excludeSeatMapSections", "isTicketFeeEnabled", "isAdaEnabled"], outputs: ["load3dView", "selectForBA", "openSeatMap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
897
906
  }
898
907
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: PopoverComponent, decorators: [{
899
908
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"3ddv-software-division-components-dvm-popover.mjs","sources":["../../dvm/popover/popover.config.ts","../../dvm/popover/popover.service.ts","../../dvm/popover/base-popover.component.ts","../../dvm/popover/seat-popover/seat-popover.component.ts","../../dvm/popover/seat-popover/seat-popover.component.html","../../dvm/popover/section-popover/section-popover.component.ts","../../dvm/popover/section-popover/section-popover.component.html","../../dvm/popover/types.ts","../../dvm/popover/popover.component.ts","../../dvm/popover/popover.component.html","../../dvm/popover/services/popover-manager.service.ts","../../dvm/popover/services/dvm-popover-positioner.service.ts","../../dvm/popover/transformers/base-popover-data-transformer.ts","../../dvm/popover/public-api.ts","../../dvm/popover/3ddv-software-division-components-dvm-popover.ts"],"sourcesContent":["import type { MapViewerService, Viewer3dService } from '@3ddv/ngx-dvm-internal';\nimport { InjectionToken } from '@angular/core';\nimport type { IThumbnailProvider, IPopoverPositioner, IPopoverManager } from './types';\n\n// This is a placeholder based on usage in popover.component.ts\nexport type Configuration = {\n dvmData: {\n venueId: string;\n };\n};\n\nexport type IDvmFormatter = {\n transform(value: string, ...args: unknown[]): string;\n};\n\nexport type IConfigurationService = {\n configuration: Configuration;\n};\n\nexport type IDvmService = {\n readonly viewer3dService: Viewer3dService;\n readonly viewerService: MapViewerService\n};\n\nexport const DVM_FORMATTER = new InjectionToken<IDvmFormatter>('DvmFormatter');\nexport const CONFIGURATION_SERVICE = new InjectionToken<IConfigurationService>('ConfigurationService');\nexport const DVM_SERVICE = new InjectionToken<IDvmService>('DvmService');\nexport const THUMBNAIL_PROVIDER = new InjectionToken<IThumbnailProvider>('ThumbnailProvider');\nexport const POPOVER_POSITIONER = new InjectionToken<IPopoverPositioner>('PopoverPositioner');\nexport const POPOVER_MANAGER = new InjectionToken<IPopoverManager>('PopoverManager');\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n ComponentRef,\n createComponent,\n createEnvironmentInjector,\n ElementRef,\n EnvironmentInjector,\n inject,\n Injectable,\n TemplateRef,\n} from '@angular/core';\nimport { of } from 'rxjs';\nimport {\n arrow,\n autoPlacement,\n autoUpdate,\n computePosition,\n ComputePositionConfig,\n detectOverflow,\n flip,\n hide,\n inline,\n Middleware,\n offset,\n shift,\n size,\n VirtualElement,\n} from '@floating-ui/dom';\nimport { MiddlewareOptions, PopoverInstance, PopoverOptions } from './types';\nimport { CONFIGURATION_SERVICE, DVM_FORMATTER, DVM_SERVICE } from './popover.config';\nimport type { IConfigurationService, IDvmFormatter, IDvmService } from './popover.config';\n\nexport interface PopoverContentProjection {\n thumbnail?: TemplateRef<unknown> | string;\n content?: TemplateRef<unknown> | string;\n price?: TemplateRef<unknown> | string;\n}\n\nexport interface PopoverServiceOptions {\n providers?: any[];\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PopoverService {\n // SERVICES\n private readonly appReference: ApplicationRef = inject(ApplicationRef);\n private readonly envInjector: EnvironmentInjector = inject(EnvironmentInjector);\n private readonly document: Document = inject(DOCUMENT);\n\n // POPOVER STATE\n private readonly popoverInstances: Map<string, PopoverInstance> = new Map<string, PopoverInstance>();\n private readonly popoverOptions: Partial<ComputePositionConfig> = {\n placement: 'bottom',\n strategy: 'absolute',\n middleware: [],\n };\n\n private popoverTimerTimeInMs = 300;\n private currentPopoverId = '';\n private popoverTimer: ReturnType<typeof setTimeout> | null = null;\n private popoverInstancesWithTimers: Map<string, PopoverInstance> = new Map();\n\n // Default mock providers for when no custom providers are provided\n private readonly defaultMockProviders = [\n {\n provide: CONFIGURATION_SERVICE,\n useValue: {\n configuration: {\n dvmData: {\n venueId: 'default-venue',\n },\n },\n } as IConfigurationService,\n },\n {\n provide: DVM_FORMATTER,\n useValue: {\n transform: (value: string) => value.replace(/-/g, ' ').toUpperCase(),\n } as IDvmFormatter,\n },\n {\n provide: DVM_SERVICE,\n useValue: {\n viewer3dService: {\n isInitialized: () => true,\n getThumbnail: () => of('https://via.placeholder.com/275x124/1a1a1a/ffffff?text=Default+Thumbnail'),\n },\n } as any,\n },\n ];\n\n // METHODS\n public setTimer(): void {\n const myId = this.currentPopoverId;\n this.clearTimer();\n this.popoverTimer = setTimeout(() => {\n if (this.currentPopoverId !== myId) {\n return;\n }\n this.destroyAllPopovers();\n this.popoverTimer = null;\n }, this.popoverTimerTimeInMs);\n }\n\n public clearTimer(): void {\n if (this.popoverTimer !== null) {\n clearTimeout(this.popoverTimer);\n this.popoverTimer = null;\n }\n }\n\n /**\n * Sets a timer for a specific popover instance to auto-hide it after the specified delay.\n * @param popoverId - The ID of the popover to set timer for\n * @param delayMs - Delay in milliseconds (optional, defaults to configured delay)\n */\n public setPopoverTimer(popoverId: string, delayMs?: number): void {\n this.clearPopoverTimer(popoverId);\n const delay = delayMs ?? this.popoverTimerTimeInMs;\n\n this.popoverTimer = setTimeout(() => {\n this.destroyPopover(popoverId);\n }, delay);\n }\n\n /**\n * Clears the timer for a specific popover instance.\n * @param popoverId - The ID of the popover to clear timer for\n */\n public clearPopoverTimer(popoverId: string): void {\n if (this.popoverTimer !== null) {\n clearTimeout(this.popoverTimer);\n this.popoverTimer = null;\n }\n }\n\n /**\n * Configures the default timer delay for popovers.\n * @param delayMs - Delay in milliseconds\n */\n public setTimerDelay(delayMs: number): void {\n this.popoverTimerTimeInMs = delayMs;\n }\n\n /**\n * Crea un popover y lo añade al DOM, usando un elemento de referencia y contenido HTML o string.\n * Si ya existe un popover con el mismo ID, lo destruye antes de crear uno nuevo.\n *\n * @param popoverId Identificador único del popover.\n * @param reference Elemento de referencia para posicionar el popover (HTMLElement, Element, VirtualElement o ElementRef).\n * @param content Contenido del popover (HTMLElement o string HTML).\n * @param options Opciones de configuración para el posicionamiento (placement, strategy, middleware, etc).\n * @returns Instancia del popover creado.\n */\n public createPopover(\n popoverId: string,\n reference: HTMLElement | Element | VirtualElement | (ElementRef & VirtualElement),\n content: HTMLElement | string,\n options: Partial<PopoverOptions> = {}\n ): PopoverInstance<unknown> {\n this.clearTimer();\n // Comprobamos si ya existe una instancia de Popover con el mismo ID\n this.checkPopoverInstance(popoverId ?? '');\n this.currentPopoverId = popoverId;\n\n const id: string = popoverId ?? `popover-${Date.now()}`; // ID unico del popover, proporcionado o auto\n const referenceElement: unknown = reference instanceof ElementRef ? reference.nativeElement : reference; // Elemento de referencia\n const popoverElement: HTMLElement = this.createPopoverElement(content); // Elemento Popover\n const finalOptions: Partial<ComputePositionConfig> = {\n // Opciones finales de posicionamiento\n placement: options.placement || this.popoverOptions.placement,\n strategy: options.strategy || this.popoverOptions.strategy,\n middleware: options.middleware ? this.setMiddlewares(options.middleware) : this.popoverOptions.middleware,\n };\n\n // Añadimos el Popover al DOM\n this.document.body.append(popoverElement);\n\n // Creamos la instancia del Popover\n const instance: PopoverInstance = {\n id,\n element: popoverElement,\n reference: referenceElement as HTMLElement | Element | VirtualElement,\n update: async () => this.calculatePosition(instance, finalOptions),\n };\n\n // Calculamos la posicion del Popover\n void this.calculatePosition(instance, finalOptions);\n\n // Añadimos la función de autoUpdate en la propiedad cleanup del Popover ( se llama al destruir el Popover )\n instance.cleanup = autoUpdate(referenceElement as HTMLElement, popoverElement, () => instance.update!());\n\n // Añadimos la instancia del Popover al mapa de instancias\n this.popoverInstances.set(id, instance);\n\n return instance;\n }\n\n /**\n * Crea un popover que contiene un componente Angular con soporte para proyección de contenido.\n * Si ya existe un popover con el mismo ID, lo destruye antes de crear uno nuevo.\n *\n * @param popoverId Identificador único del popover.\n * @param reference Elemento de referencia para posicionar el popover (HTMLElement, Element, VirtualElement o ElementRef).\n * @param component Clase del componente Angular a renderizar dentro del popover.\n * @param inputs Propiedades de entrada para el componente.\n * @param contentProjection Contenido proyectado para los slots del popover.\n * @param options Opciones de configuración para el posicionamiento (placement, strategy, middleware, etc).\n * @returns Instancia del popover creado, incluyendo la referencia al componente.\n */\n public createPopoverComponentWithContent<T>(\n popoverId: string,\n reference: HTMLElement | Element | VirtualElement | (ElementRef & VirtualElement),\n component: new (...arguments_: unknown[]) => T,\n inputs?: Partial<T>,\n contentProjection?: PopoverContentProjection,\n options: Partial<PopoverOptions> = {},\n serviceOptions: PopoverServiceOptions = {}\n ): PopoverInstance {\n this.clearTimer();\n // Comprobamos si ya existe una instancia de Popover con el mismo ID\n this.checkPopoverInstance(popoverId ?? '');\n this.currentPopoverId = popoverId;\n\n const referenceElement: unknown = reference instanceof ElementRef ? reference.nativeElement : reference;\n const popoverElement: HTMLElement = this.createPopoverElement();\n\n // Create a custom environment injector with the required providers\n const providers = serviceOptions.providers || this.defaultMockProviders;\n const customInjector = createEnvironmentInjector(providers, this.envInjector);\n\n const componentReference: ComponentRef<T> = createComponent(component, {\n environmentInjector: customInjector,\n hostElement: popoverElement,\n });\n\n const finalOptions: Partial<ComputePositionConfig> = {\n placement: options.placement || this.popoverOptions.placement,\n strategy: options.strategy || this.popoverOptions.strategy,\n middleware: options.middleware ? this.setMiddlewares(options.middleware) : this.popoverOptions.middleware,\n };\n\n // Añadimos el Popover al DOM\n this.document.body.append(popoverElement);\n\n // Si tiene inputs, los asignamos al componente\n if (inputs) {\n for (const [key, value] of Object.entries(inputs)) {\n componentReference.setInput(key, value);\n }\n }\n\n // Procesamos la proyección de contenido\n if (contentProjection) {\n this.processContentProjection(componentReference, contentProjection);\n }\n\n // Encendemos el detectChanges del componente para que se renderice\n componentReference.changeDetectorRef.detectChanges();\n\n // Añadimos el componente al DOM\n this.appReference.attachView(componentReference.hostView);\n\n // Creamos la instancia del Popover\n const instance: PopoverInstance = {\n id: popoverId,\n element: popoverElement,\n reference: referenceElement as HTMLElement | Element | VirtualElement,\n componentRef: componentReference as ComponentRef<unknown>,\n update: async () => this.calculatePosition(instance, finalOptions),\n };\n\n const arrowElement = document.querySelector('#arrow')!;\n finalOptions.middleware?.push(arrow({ element: arrowElement }));\n\n // Calculamos la posicion del Popover\n void this.calculatePosition(instance, finalOptions);\n\n // Proporcionamos la función de autoUpdate en la propiedad cleanup del Popover\n instance.cleanup = autoUpdate(referenceElement as HTMLElement, popoverElement, () => instance.update!());\n\n // Añadimos la instancia del Popover al mapa de instancias\n this.popoverInstances.set(popoverId, instance);\n\n return instance;\n }\n\n /**\n * Crea un popover que contiene un componente Angular, lo añade al DOM y lo posiciona.\n * Si ya existe un popover con el mismo ID, lo destruye antes de crear uno nuevo.\n *\n * @param popoverId Identificador único del popover.\n * @param reference Elemento de referencia para posicionar el popover (HTMLElement, Element, VirtualElement o ElementRef).\n * @param component Clase del componente Angular a renderizar dentro del popover.\n * @param inputs Propiedades de entrada para el componente.\n * @param options Opciones de configuración para el posicionamiento (placement, strategy, middleware, etc).\n * @returns Instancia del popover creado, incluyendo la referencia al componente.\n */\n public createPopoverComponent<T>(\n popoverId: string,\n reference: HTMLElement | Element | VirtualElement | (ElementRef & VirtualElement),\n component: new (...arguments_: unknown[]) => T,\n inputs?: Partial<T>,\n options: Partial<PopoverOptions> = {},\n serviceOptions: PopoverServiceOptions = {}\n ): PopoverInstance {\n this.clearTimer();\n // Comprobamos si ya existe una instancia de Popover con el mismo ID\n this.checkPopoverInstance(popoverId ?? '');\n this.currentPopoverId = popoverId;\n\n const referenceElement: unknown = reference instanceof ElementRef ? reference.nativeElement : reference; // Elemento de referencia\n const popoverElement: HTMLElement = this.createPopoverElement(); // Elemento Popover\n\n // Create a custom environment injector with the required providers\n const providers = serviceOptions.providers || this.defaultMockProviders;\n const customInjector = createEnvironmentInjector(providers, this.envInjector);\n\n const componentReference: ComponentRef<T> = createComponent(component, {\n environmentInjector: customInjector,\n hostElement: popoverElement,\n }); // Instancia del componente Popover\n const finalOptions: Partial<ComputePositionConfig> = {\n // Opciones de posicionamiento\n placement: options.placement || this.popoverOptions.placement,\n strategy: options.strategy || this.popoverOptions.strategy,\n middleware: options.middleware ? this.setMiddlewares(options.middleware) : this.popoverOptions.middleware,\n };\n\n // Añadimos el Popover al DOM\n this.document.body.append(popoverElement);\n\n // Si tiene inputs, los asignamos al componente\n if (inputs) {\n for (const [key, value] of Object.entries(inputs)) {\n componentReference.setInput(key, value);\n }\n }\n\n // Encendemos el detectChanges del componente para que se renderice\n componentReference.changeDetectorRef.detectChanges();\n\n // Añadimos el componente al DOM\n this.appReference.attachView(componentReference.hostView);\n\n // Creamos la instancia del Popover\n const instance: PopoverInstance = {\n id: popoverId,\n element: popoverElement,\n reference: referenceElement as HTMLElement | Element | VirtualElement,\n componentRef: componentReference as ComponentRef<unknown>,\n update: async () => this.calculatePosition(instance, finalOptions),\n };\n\n const arrowElement = document.querySelector('#arrow')!;\n finalOptions.middleware?.push(arrow({ element: arrowElement }));\n\n // Calculamos la posicion del Popover\n void this.calculatePosition(instance, finalOptions);\n\n // Proporcionamos la función de autoUpdate en la propiedad cleanup del Popover ( se llama al destruir el Popover )\n instance.cleanup = autoUpdate(referenceElement as HTMLElement, popoverElement, () => instance.update!());\n\n // Añadimos la instancia del Popover al mapa de instancias\n this.popoverInstances.set(popoverId, instance);\n\n return instance;\n }\n\n /**\n * Destruye un popover existente por su ID, eliminando su elemento del DOM y limpiando recursos.\n *\n * @param id Identificador del popover a destruir.\n */\n public destroyPopover(id: string): void {\n // Comprobamos si existe la instancia del Popover\n const instance: PopoverInstance | undefined = this.popoverInstances.get(id);\n\n if (!instance) {\n return;\n }\n\n // Llamamos a la función de cleanup para eliminar el autoUpdate\n instance.cleanup?.();\n\n // Si hay comoponente, lo eliminamos del DOM\n if (instance.componentRef) {\n this.appReference.detachView(instance.componentRef.hostView);\n instance.componentRef.destroy();\n }\n\n // Si hay elemento, lo eliminamos del DOM\n if (instance.element && instance.element.parentNode) {\n instance.element.remove();\n }\n\n // Eliminamos instancia del mapa\n this.popoverInstances.delete(id);\n }\n\n /**\n * Destruye todos los popovers existentes, eliminando sus elementos del DOM y limpiando recursos.\n */\n public destroyAllPopovers(): void {\n for (const id of this.popoverInstances.keys()) {\n this.destroyPopover(id);\n }\n }\n /**\n * Crea el elemento HTML base del popover, opcionalmente con contenido.\n *\n * @param content Contenido a insertar en el popover (string, HTMLElement o ElementRef).\n * @returns Elemento HTML del popover.\n */\n private createPopoverElement(content?: string | HTMLElement | ElementRef): HTMLElement {\n // Creamos el elemento Popover\n const popoverElement: HTMLElement = this.document.createElement('div');\n\n // Añadimos la clase Popover al elemento\n popoverElement.classList.add('popover');\n\n // Si se proporciona contenido, lo añadimos al Popover, si no, lo dejamos vacío\n if (!content) {\n return popoverElement;\n }\n\n if (typeof content === 'string') {\n popoverElement.innerHTML = content;\n } else {\n const element = content instanceof ElementRef ? content.nativeElement : content;\n\n popoverElement.append(element as HTMLElement);\n }\n\n return popoverElement;\n }\n\n /**\n * Verifica si existe una instancia de popover con el ID dado y la destruye si es así.\n *\n * @param id Identificador del popover a comprobar.\n */\n private checkPopoverInstance(id: string): void {\n if (this.popoverInstances.has(id)) {\n this.destroyPopover(id);\n }\n }\n\n /**\n * Calcula y aplica la posición del popover respecto a su elemento de referencia,\n * usando las opciones de Floating UI.\n *\n * @param instance Instancia del popover a posicionar.\n * @param options Opciones de configuración para el posicionamiento.\n */\n private async calculatePosition(\n instance: PopoverInstance,\n options: Partial<ComputePositionConfig> = {}\n ): Promise<void> {\n // Desestructuramos las opciones\n const { placement, strategy, middleware } = options;\n\n try {\n // Calculamos la posicion del Popover en base a la referencia y el elemento Popover y las opciones proporcionadas\n const { x, y } = await computePosition(instance.reference, instance.element, {\n placement,\n strategy,\n middleware,\n });\n\n // Asignamos la posicion al elemento Popover\n Object.assign(instance.element.style, {\n position: strategy,\n top: `${y}px`,\n left: `${x}px`,\n });\n } catch (error) {\n console.error('Error positioning popover', error);\n }\n }\n\n /**\n * Procesa la proyección de contenido para el componente popover.\n *\n * @param componentRef Referencia al componente creado\n * @param contentProjection Contenido a proyectar en los slots\n */\n private processContentProjection<T>(\n componentRef: ComponentRef<T>,\n contentProjection: PopoverContentProjection\n ): void {\n const componentInstance = componentRef.instance as any;\n\n // Procesamos cada slot de contenido\n if (contentProjection.thumbnail) {\n this.setContentProjection(componentInstance, 'hasThumbnailProjection', contentProjection.thumbnail);\n }\n\n if (contentProjection.content) {\n this.setContentProjection(componentInstance, 'hasContentProjection', contentProjection.content);\n }\n\n if (contentProjection.price) {\n this.setContentProjection(componentInstance, 'hasPriceProjection', contentProjection.price);\n }\n }\n\n /**\n * Establece la proyección de contenido para un slot específico.\n *\n * @param componentInstance Instancia del componente\n * @param projectionFlag Flag que indica si hay proyección\n * @param content Contenido a proyectar\n */\n private setContentProjection(\n componentInstance: any,\n projectionFlag: string,\n content: TemplateRef<unknown> | string\n ): void {\n // Marcamos que hay proyección de contenido\n componentInstance[projectionFlag] = true;\n\n // Si es un TemplateRef, lo almacenamos para uso posterior\n if (content instanceof TemplateRef) {\n componentInstance[`${projectionFlag}Template`] = content;\n } else if (typeof content === 'string') {\n // Si es string, lo almacenamos como HTML\n componentInstance[`${projectionFlag}Html`] = content;\n }\n }\n\n /**\n * Set Middlewares\n * Método que recibe un objeto de opciones de middleware y devuelve un array de middlewares cargados con sus opciones.\n *\n * Para ello, necesitamos establecer un orden de aplicación de los middlewares, ya que la computación de la posición\n * depende del estado de los middlewares aplicados anteriormente. Además, como son funciones, hacemos switch para\n * cargar el middleware correspondiente en cada caso a excepción de detectOverflow, que es un middleware especial\n * que no se aplica directamente, sino que se ejecuta como una función asíncrona sobre el estado devuelto de los middlewares (si los hay).\n *\n * @param middleware\n * @returns {Middleware[]}\n */\n private setMiddlewares(middleware: MiddlewareOptions): Middleware[] {\n // Array de Middlewares y orden de aplicación de los mismos\n // https://floating-ui.com/docs/middleware#ordering\n\n const middlewares: Middleware[] = [];\n const order: (keyof MiddlewareOptions)[] = [\n 'offset',\n 'shift',\n 'flip',\n 'arrow',\n 'size',\n 'autoPlacement',\n 'inline',\n 'hide',\n 'detectOverflow',\n ];\n\n // Recorremos el array de orden y aplicamos los middlewares en el orden indicado\n for (const key of order as (keyof MiddlewareOptions)[]) {\n if (!middleware[key]) {\n continue;\n }\n\n switch (key) {\n case 'offset': {\n middlewares.push(offset(middleware.offset));\n break;\n }\n\n case 'shift': {\n middlewares.push(shift(middleware.shift));\n break;\n }\n\n case 'flip': {\n middlewares.push(flip(middleware.flip));\n break;\n }\n\n case 'arrow': {\n middlewares.push(arrow(middleware.arrow!));\n break;\n }\n\n case 'size': {\n middlewares.push(size(middleware.size));\n break;\n }\n\n case 'autoPlacement': {\n middlewares.push(autoPlacement(middleware.autoPlacement));\n break;\n }\n\n case 'hide': {\n middlewares.push(hide(middleware.hide));\n break;\n }\n\n case 'inline': {\n middlewares.push(inline(middleware.inline));\n break;\n }\n\n case 'detectOverflow': {\n const overflowMiddleware: Middleware = {\n name: 'detectOverflow',\n async fn(state) {\n await detectOverflow(state, middleware.detectOverflow);\n return {};\n },\n };\n middlewares.push(overflowMiddleware);\n break;\n }\n }\n }\n\n return middlewares;\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, inject, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { PopoverService } from './popover.service';\n\n/**\n * Base component for popovers that provides timer functionality.\n * Extend this component to create timer-aware popovers.\n */\n@Component({\n template: '', // Abstract component\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport abstract class BasePopoverComponent implements OnInit, OnDestroy {\n @Input() popoverId: string = '';\n @Input() autoHideDelay: number = 300; // milliseconds\n @Input() enableAutoHide: boolean = true;\n\n @Output() mouseEnter = new EventEmitter<MouseEvent>();\n @Output() mouseLeave = new EventEmitter<MouseEvent>();\n @Output() popoverHidden = new EventEmitter<void>();\n\n protected readonly popoverService = inject(PopoverService);\n protected readonly cdr = inject(ChangeDetectorRef);\n\n private isMouseOver = false;\n\n ngOnInit(): void {\n if (this.enableAutoHide && this.popoverId) {\n this.startAutoHideTimer();\n }\n }\n\n ngOnDestroy(): void {\n if (this.popoverId) {\n this.popoverService.clearPopoverTimer(this.popoverId);\n }\n }\n\n protected onMouseEnter(event: MouseEvent): void {\n this.isMouseOver = true;\n this.clearAutoHideTimer();\n this.mouseEnter.emit(event);\n }\n\n protected onMouseLeave(event: MouseEvent): void {\n this.isMouseOver = false;\n if (this.enableAutoHide) {\n this.startAutoHideTimer();\n }\n this.mouseLeave.emit(event);\n }\n\n protected hidePopover(): void {\n if (this.popoverId) {\n this.popoverService.destroyPopover(this.popoverId);\n this.popoverHidden.emit();\n }\n }\n\n private startAutoHideTimer(): void {\n if (this.popoverId && !this.isMouseOver) {\n this.popoverService.setPopoverTimer(this.popoverId, this.autoHideDelay);\n }\n }\n\n private clearAutoHideTimer(): void {\n if (this.popoverId) {\n this.popoverService.clearPopoverTimer(this.popoverId);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { CommonModule, CurrencyPipe } from '@angular/common';\nimport { type SeatPopoverData } from '../types';\nimport { THUMBNAIL_PROVIDER } from '../popover.config';\nimport { BasePopoverComponent } from '../base-popover.component';\n\n@Component({\n selector: 'sdc-seat-popover',\n templateUrl: './seat-popover.component.html',\n styleUrl: './seat-popover.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, CurrencyPipe],\n})\nexport class SeatPopoverComponent extends BasePopoverComponent implements OnInit {\n @Input() data!: SeatPopoverData;\n @Input() showLoader: boolean = true;\n\n private readonly thumbnailProvider = inject(THUMBNAIL_PROVIDER, { optional: true });\n protected override readonly cdr = inject(ChangeDetectorRef);\n\n protected thumbnail?: string;\n protected isLoadingThumbnail = true;\n\n override ngOnInit(): void {\n super.ngOnInit(); // Initialize base component timer logic\n\n if (this.data.thumbnail) {\n this.thumbnail = this.data.thumbnail;\n this.isLoadingThumbnail = false;\n } else if (this.thumbnailProvider && this.showLoader) {\n this.loadThumbnail();\n }\n }\n\n private loadThumbnail(): void {\n this.thumbnailProvider!.getThumbnail(this.data.id).subscribe({\n next: url => {\n this.thumbnail = url;\n this.isLoadingThumbnail = false;\n this.cdr.markForCheck();\n },\n error: () => {\n this.isLoadingThumbnail = false;\n this.cdr.markForCheck();\n },\n });\n }\n\n protected get formattedSection(): string {\n return this.data.section.includes('_') ? this.data.section.split('_')[1].split('-')[0] : this.data.section;\n }\n\n protected get formattedSeat(): string {\n return this.data.seat.split('-')[2] || this.data.seat;\n }\n\n protected onEnter(event: MouseEvent): void {\n this.onMouseEnter(event);\n }\n\n protected onLeave(event: MouseEvent): void {\n this.onMouseLeave(event);\n }\n}\n","<div\n (mouseenter)=\"onEnter($event)\"\n (mouseleave)=\"onLeave($event)\"\n class=\"sdc-seat-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div class=\"sdc-thumbnail-image\" [style.background-image]=\"'url(' + thumbnail + ')'\"></div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ formattedSection }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Row:</span>\n {{ data.row }}\n </h5>\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Seat:</span>\n {{ formattedSeat }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span>\n {{ data.price | currency: 'USD' }}\n </h5>\n </div>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { BasePopoverComponent } from '../base-popover.component';\nimport { THUMBNAIL_PROVIDER } from '../popover.config';\nimport { type SectionPopoverData } from '../types';\n\n@Component({\n selector: 'sdc-section-popover',\n templateUrl: './section-popover.component.html',\n styleUrl: './section-popover.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule],\n})\nexport class SectionPopoverComponent extends BasePopoverComponent implements OnInit {\n @Input() data!: SectionPopoverData;\n @Input() showLoader: boolean = true;\n @Input() showBestAvailable: boolean = false;\n @Input() showOpenSeatMap: boolean = true;\n @Input() excludeSeatMapSections: string[] = ['S_BLCHADA', 'S_Bleacher'];\n @Input() isTicketFeeEnabled: boolean = false;\n\n @Output() load3dView = new EventEmitter<void>();\n @Output() selectForBA = new EventEmitter<boolean>();\n @Output() openSeatMap = new EventEmitter<void>();\n\n private readonly thumbnailProvider = inject(THUMBNAIL_PROVIDER, { optional: true });\n protected override readonly cdr = inject(ChangeDetectorRef);\n\n protected thumbnail?: string;\n protected isLoadingThumbnail = true;\n\n override ngOnInit(): void {\n super.ngOnInit(); // Initialize base component timer logic\n\n if (this.data.thumbnail) {\n this.thumbnail = this.data.thumbnail;\n this.isLoadingThumbnail = false;\n } else if (this.thumbnailProvider && this.showLoader) {\n this.loadThumbnail();\n }\n }\n\n private loadThumbnail(): void {\n this.thumbnailProvider!.getThumbnail(this.data.id).subscribe({\n next: url => {\n this.thumbnail = url;\n this.isLoadingThumbnail = false;\n this.cdr.markForCheck();\n },\n error: () => {\n this.isLoadingThumbnail = false;\n this.cdr.markForCheck();\n },\n });\n }\n\n protected get priceRangeDisplay(): string {\n const { min, max } = this.data.priceRange;\n return min === max ? min.toString() : `${min} - ${max}`;\n }\n\n protected get priceRangeWithFees(): string | undefined {\n if (this.isTicketFeeEnabled && this.data.priceRangeWithFees) {\n return this.data.priceRangeWithFees;\n }\n return undefined;\n }\n\n protected get shouldShowSeatMapButton(): boolean {\n return (\n this.showOpenSeatMap &&\n !this.excludeSeatMapSections.includes(this.data.section) &&\n this.data.type !== 'general_admission'\n );\n }\n\n protected onEnter(event: MouseEvent): void {\n this.onMouseEnter(event);\n }\n\n protected onLeave(event: MouseEvent): void {\n this.onMouseLeave(event);\n }\n\n protected onLoad3dView(): void {\n this.load3dView.emit();\n }\n\n protected onSelectForBA(): void {\n this.selectForBA.emit(!this.data.isSelectedForBA);\n }\n\n protected onOpenSeatMap(): void {\n this.openSeatMap.emit();\n }\n}\n","<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-section-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ data.section }}\n </h5>\n @if (isTicketFeeEnabled && priceRangeWithFees) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeWithFees }}\n </h5>\n } @else {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeDisplay }}\n </h5>\n }\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available Seats:</span>\n {{ data.availableQuantity }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available ADA Seats:</span>\n {{ data.adaQuantity }}\n </h5>\n </div>\n </div>\n\n <div class=\"sdc-popover-actions\">\n @if (showBestAvailable) {\n <button class=\"sdc-popover-btn sdc-popover-btn-primary sdc-popover-btn-mobile-only\" (click)=\"onSelectForBA()\">\n {{ data.isSelectedForBA ? 'Deselect' : 'Select' }}\n </button>\n }\n @if (shouldShowSeatMapButton) {\n <button class=\"sdc-popover-btn sdc-popover-btn-secondary\" (click)=\"onOpenSeatMap()\">Open Seat Map</button>\n }\n </div>\n </div>\n</div>\n","import { ComponentRef, ElementRef, Type, ViewContainerRef } from '@angular/core';\nimport {\n ArrowOptions,\n AutoPlacementOptions,\n ComputePositionConfig,\n DetectOverflowOptions,\n FlipOptions,\n HideOptions,\n InlineOptions,\n OffsetOptions,\n Placement,\n ShiftOptions,\n SizeOptions,\n VirtualElement,\n} from '@floating-ui/dom';\nimport { Observable } from 'rxjs';\nimport type { MapViewerNode } from '@3ddv/dvm-internal';\n\nexport type PopoverPlacement = Placement;\n\nexport interface PopoverInstance<T = unknown> {\n id: string;\n element: HTMLElement;\n reference: HTMLElement | Element | VirtualElement | (ElementRef & VirtualElement);\n componentRef?: ComponentRef<T>;\n update?: () => void;\n cleanup?: () => void;\n}\n\nexport interface PopoverOptions extends Omit<ComputePositionConfig, 'middleware'> {\n middleware?: MiddlewareOptions;\n}\n\nexport interface MiddlewareOptions {\n offset?: OffsetOptions;\n shift?: ShiftOptions;\n flip?: FlipOptions;\n arrow?: ArrowOptions;\n size?: SizeOptions;\n autoPlacement?: AutoPlacementOptions;\n hide?: HideOptions;\n inline?: InlineOptions;\n detectOverflow?: DetectOverflowOptions;\n}\n\nexport enum AppNodes {\n Section = 'section',\n Row = 'row',\n Seat = 'seat',\n Ga = 'general_admission',\n Vip = 'vip',\n}\n\n// Seat popover data interface\nexport interface SeatPopoverData {\n id: string;\n section: string;\n row: string;\n seat: string;\n price: number;\n thumbnail?: string;\n}\n\n// Section popover data interface\nexport interface SectionPopoverData {\n id: string;\n section: string;\n priceRange: { min: number; max: number };\n availableQuantity: number;\n adaQuantity: number;\n thumbnail?: string;\n type?: 'section' | 'general_admission';\n isSelectedForBA?: boolean;\n priceRangeWithFees?: string;\n}\n\n// Thumbnail provider interface\nexport interface IThumbnailProvider {\n getThumbnail(nodeId: string): Observable<string>;\n}\n\n// Popover positioning interface\nexport interface IPopoverPositioner {\n calculatePlacement(node: MapViewerNode, container: HTMLElement): Placement;\n calculateOffset(node: MapViewerNode): number[];\n}\n\n// Popover manager interfaces\nexport interface IPopoverManager {\n showPopover<T>(config: PopoverConfig<T>): void;\n hidePopover(nodeId: string): void;\n clearAll(): void;\n}\n\nexport interface PopoverConfig<T> {\n nodeId: string;\n node: MapViewerNode;\n container: ViewContainerRef;\n tooltip: HTMLElement;\n containerElement: HTMLElement;\n component: Type<T>;\n componentInputs?: Partial<T>;\n eventHandlers?: Record<string, (...args: any[]) => void>;\n}\n","import type { MapViewerNode, Viewer3dLoadView3dOptions } from '@3ddv/dvm-internal';\nimport type { Viewer3dService } from '@3ddv/ngx-dvm-internal';\nimport { ThemeClass } from '@3ddv/software-division-components/shared';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnInit,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n CONFIGURATION_SERVICE,\n DVM_FORMATTER,\n DVM_SERVICE,\n IConfigurationService,\n IDvmFormatter,\n IDvmService,\n} from './popover.config';\nimport { PopoverService } from './popover.service';\nimport { SeatPopoverComponent } from './seat-popover/seat-popover.component';\nimport { SectionPopoverComponent } from './section-popover/section-popover.component';\nimport { AppNodes, SeatPopoverData, SectionPopoverData } from './types';\n\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sdc-map-popover',\n standalone: true,\n imports: [CommonModule, SeatPopoverComponent, SectionPopoverComponent],\n templateUrl: './popover.component.html',\n styleUrl: './popover.component.css',\n})\nexport class PopoverComponent implements OnInit {\n // INPUTS\n /**\n * The node to attach the popover to.\n */\n @Input()\n public readonly node!: MapViewerNode;\n\n /**\n * The current theme applied to the component.\n */\n public readonly theme = input<ThemeClass>('theme-sdc');\n\n // OUTPUTS\n /**\n * Emitted when the 3D view should be loaded.\n */\n public readonly load3dView = output<{ node: MapViewerNode; section: string | undefined }>();\n\n /**\n * Emitted when a section should be selected/deselected for best available.\n */\n public readonly selectSectionForBA = output<{\n node: MapViewerNode;\n section: string | undefined;\n selected: boolean;\n }>();\n\n /**\n * Emitted when the seat map should be opened.\n */\n public readonly openSeatMap = output<{ node: MapViewerNode; section: string | undefined }>();\n\n // SERVICES\n private readonly dvm: IDvmService = inject(DVM_SERVICE);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly format: IDvmFormatter = inject(DVM_FORMATTER);\n private readonly configurationService: IConfigurationService = inject(CONFIGURATION_SERVICE);\n protected readonly popoverService = inject(PopoverService);\n\n // COMPONENT STATE\n protected readonly Nodes: typeof AppNodes = AppNodes;\n protected thumbnail!: string | undefined;\n protected section!: string | undefined;\n protected row!: string | undefined;\n protected seat!: string | undefined;\n protected prices!: string[] | undefined;\n\n // Section popover specific properties\n protected availableQuantity: number = 0;\n protected adaQuantity: number = 0;\n protected includedSectionForBA: boolean = false;\n\n // Transformed data for new components\n protected get seatData(): SeatPopoverData | null {\n if (this.node?.type === AppNodes.Seat) {\n return this.transformToSeatData();\n }\n return null;\n }\n\n protected get sectionData(): SectionPopoverData | null {\n if (this.node?.type === AppNodes.Section || this.node?.type === AppNodes.Ga) {\n return this.transformToSectionData();\n }\n return null;\n }\n\n // LC METHODS\n public ngOnInit(): void {\n this.initComponent();\n }\n\n protected onEnter(_: MouseEvent): void {\n this.popoverService.clearTimer();\n }\n\n protected onLeave(_: MouseEvent): void {\n this.popoverService.setTimer();\n }\n\n // GETTERS\n protected get price(): string | undefined {\n return this.prices // Existen precios?\n ? this.prices.length > 1 // Existen precios, pero más de uno?\n ? Math.min(...this.prices.map(price => Number.parseInt(price))).toString()\n : this.prices[0] // Si lo hay, sacamos el minimo, si no seteamos el primero ( y unico xd )\n : undefined; // No existen precios\n }\n\n protected get priceRange(): string {\n if (!this.prices || this.prices.length === 0) {\n return '';\n }\n\n let priceRange = this.prices[0];\n if (this.prices.length > 1 && this.prices[0] !== this.prices[1]) {\n priceRange = `${this.prices[0]} - ${this.prices[1]}`;\n }\n return priceRange;\n }\n\n // METHODS\n private initComponent(): void {\n this.setTexts();\n this.getThumbnail();\n // this.getPrice();\n }\n\n private setTexts(): void {\n const nodeId: string[] = this.format.transform(this.node?.id).split(' ');\n // const translated = this.translationData()[this.node().id.split('-')[0]];\n this.section = nodeId[0];\n this.row = nodeId[1] ?? null;\n this.seat = nodeId[2] ?? null;\n }\n\n private getThumbnail(): void {\n const viewer3dService: Viewer3dService = this.dvm.viewer3dService;\n const options: Viewer3dLoadView3dOptions = {\n // eslint-disable-next-line camelcase\n venue_id: this.configurationService.configuration.dvmData.venueId,\n // eslint-disable-next-line camelcase\n view_id: this.node?.id,\n };\n\n if (!viewer3dService?.isInitialized()) {\n return;\n }\n\n viewer3dService.getThumbnail(options, true).subscribe((thumbnailUrl: string): void => {\n this.thumbnail = thumbnailUrl;\n this.cdr.markForCheck();\n });\n }\n\n // Section popover methods\n protected onLoad3dView(): void {\n this.load3dView.emit({\n node: this.node,\n section: this.section,\n });\n }\n\n protected onSelectSectionForBA(selected: boolean): void {\n this.includedSectionForBA = selected;\n this.selectSectionForBA.emit({\n node: this.node,\n section: this.section,\n selected: this.includedSectionForBA,\n });\n }\n\n protected onOpenSeatMap(): void {\n this.openSeatMap.emit({\n node: this.node,\n section: this.section,\n });\n }\n\n // Data transformation methods\n private transformToSeatData(): SeatPopoverData {\n const nodeId: string[] = this.format.transform(this.node?.id).split(' ');\n const section = nodeId[0];\n const row = nodeId[1] ?? '';\n const seat = nodeId[2] ?? '';\n\n return {\n id: this.node.id,\n section: section,\n row: row,\n seat: seat,\n price: this.price ? Number.parseFloat(this.price) : 0,\n thumbnail: this.thumbnail,\n };\n }\n\n private transformToSectionData(): SectionPopoverData {\n const nodeId: string[] = this.format.transform(this.node?.id).split(' ');\n const section = nodeId[0];\n\n // Parse price range from existing prices array\n let priceRange = { min: 0, max: 0 };\n if (this.prices && this.prices.length > 0) {\n const minPrice = Number.parseFloat(this.prices[0]);\n const maxPrice = this.prices.length > 1 ? Number.parseFloat(this.prices[1]) : minPrice;\n priceRange = { min: minPrice, max: maxPrice };\n }\n\n return {\n id: this.node.id,\n section: section,\n priceRange: priceRange,\n availableQuantity: this.availableQuantity,\n adaQuantity: this.adaQuantity,\n thumbnail: this.thumbnail,\n type: this.node.type === AppNodes.Ga ? 'general_admission' : 'section',\n isSelectedForBA: this.includedSectionForBA,\n };\n }\n}\n","<!-- SECTION POPOVER -->\n@if (sectionData) {\n <sdc-section-popover\n [data]=\"sectionData\"\n id=\"pano-view\"\n [popoverId]=\"'popover-' + node.id\"\n [showBestAvailable]=\"true\"\n [showOpenSeatMap]=\"true\"\n [excludeSeatMapSections]=\"['S_BLCHADA', 'S_Bleacher']\"\n (mouseEnter)=\"onEnter($event)\"\n (mouseLeave)=\"onLeave($event)\"\n (load3dView)=\"onLoad3dView()\"\n (selectForBA)=\"onSelectSectionForBA($event)\"\n (openSeatMap)=\"onOpenSeatMap()\">\n </sdc-section-popover>\n}\n\n<!-- SEAT POPOVER -->\n@if (seatData) {\n <sdc-seat-popover\n id=\"pano-view\"\n [data]=\"seatData\"\n [popoverId]=\"'popover-' + node.id\"\n (mouseEnter)=\"onEnter($event)\"\n (mouseLeave)=\"onLeave($event)\">\n </sdc-seat-popover>\n}\n","import { inject, Injectable, Inject } from '@angular/core';\nimport { createPopper } from '@popperjs/core';\nimport type { IPopoverManager, IPopoverPositioner, PopoverConfig } from '../types';\nimport { POPOVER_POSITIONER } from '../popover.config';\n\n/**\n * Generic popover manager service that handles popover lifecycle and positioning.\n * This service is DVM-agnostic and delegates positioning logic to IPopoverPositioner.\n */\n@Injectable()\nexport class PopoverManagerService implements IPopoverManager {\n private currentPopoverId: string = '';\n private tooltip?: HTMLElement;\n private readonly positioner: IPopoverPositioner;\n\n constructor(@Inject(POPOVER_POSITIONER) positioner: IPopoverPositioner) {\n this.positioner = positioner;\n }\n\n /**\n * Shows a popover with the specified configuration.\n * @param config - Configuration for the popover including component, data, and positioning\n */\n showPopover<T>(config: PopoverConfig<T>): void {\n config.container.clear();\n this.currentPopoverId = config.nodeId;\n this.tooltip = config.tooltip;\n\n const componentRef = config.container.createComponent(config.component);\n\n if (config.componentInputs) {\n Object.entries(config.componentInputs).forEach(([key, value]) => {\n (componentRef.instance as any)[key] = value;\n });\n }\n\n if (config.eventHandlers) {\n Object.entries(config.eventHandlers).forEach(([key, handler]) => {\n const instance = componentRef.instance as any;\n if (instance[key] && typeof instance[key].subscribe === 'function') {\n instance[key].subscribe(handler);\n }\n });\n }\n\n const placement = this.positioner.calculatePlacement(config.node, config.containerElement);\n const offset = this.positioner.calculateOffset(config.node);\n\n createPopper(config.node, this.tooltip, {\n placement,\n modifiers: [\n {\n name: 'offset',\n options: {\n offset,\n },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: [],\n },\n },\n ],\n });\n\n this.tooltip.setAttribute('data-show', '');\n }\n\n /**\n * Hides the popover for the specified node ID.\n * @param nodeId - The node ID of the popover to hide\n */\n hidePopover(nodeId: string): void {\n if (this.currentPopoverId === nodeId) {\n this.tooltip?.removeAttribute('data-show');\n }\n }\n\n /**\n * Clears all popovers.\n */\n clearAll(): void {\n this.tooltip?.removeAttribute('data-show');\n this.currentPopoverId = '';\n }\n}\n\n","import { inject, Injectable, Inject } from '@angular/core';\nimport type { MapViewerNode, V2 } from '@3ddv/dvm-internal';\nimport { Placement } from '@floating-ui/dom';\nimport { IPopoverPositioner } from '../types';\nimport { DVM_SERVICE, CONFIGURATION_SERVICE } from '../popover.config';\nimport type { IDvmService, IConfigurationService } from '../popover.config';\n\n/**\n * DVM-specific positioning service for popovers.\n * Handles calculation of popover placement and offset based on DVM node properties.\n */\n@Injectable()\nexport class DvmPopoverPositionerService implements IPopoverPositioner {\n private readonly dvmService: IDvmService;\n private readonly configService: IConfigurationService;\n\n constructor(\n @Inject(DVM_SERVICE) dvmService: IDvmService,\n @Inject(CONFIGURATION_SERVICE) configService: IConfigurationService\n ) {\n this.dvmService = dvmService;\n this.configService = configService;\n }\n\n /**\n * Calculates the optimal placement for a popover based on node position.\n * @param node - The MapViewerNode to position relative to\n * @param container - The container element for positioning reference\n * @returns The calculated placement ('top' or 'bottom')\n */\n calculatePlacement(node: MapViewerNode, container: HTMLElement): Placement {\n if (!node.aabb) {\n throw new Error('Node AABB is not defined');\n }\n\n const nodeSceneCenter: [number, number] = [\n node.aabb[0] + node.aabb[2] / 2,\n node.aabb[1] + node.aabb[3] / 2,\n ];\n\n const nodeDomCenter: V2 = this.dvmService.viewerService.fromSceneToDom(nodeSceneCenter)!;\n\n if (nodeDomCenter[1] > container.offsetHeight / 2) {\n return 'top';\n } else {\n return 'bottom';\n }\n }\n\n /**\n * Calculates the offset for popover positioning based on node type and configuration.\n * @param node - The MapViewerNode to calculate offset for\n * @returns An array of [x, y] offset values\n */\n calculateOffset(node: MapViewerNode): number[] {\n if (node.type === 'seat') {\n return [0, 6];\n }\n\n if (node.type === 'section' || node.type === 'general_admission') {\n const dvmData = this.configService.configuration.dvmData as any;\n const sectionOffsets = dvmData?.sectionOffsets || {};\n const nodeId = node.id as keyof typeof sectionOffsets;\n const nodeOriginalId = node.original_id as keyof typeof sectionOffsets;\n const dvmOffset = sectionOffsets[nodeId] ?? sectionOffsets[nodeOriginalId];\n\n return dvmOffset ?? [0, 0];\n }\n\n return [0, 0];\n }\n}\n\n","import { SeatPopoverData, SectionPopoverData } from '../types';\n\n/**\n * Abstract base class for transforming data from source format to target popover format.\n * Apps can extend this class to implement their own data transformation logic.\n */\nexport abstract class BasePopoverDataTransformer<TSource, TTarget> {\n /**\n * Transforms source data to target popover data format.\n * @param source - The source data to transform\n * @param context - Optional context for additional transformation logic\n * @returns The transformed data in target format\n */\n abstract transform(source: TSource, context?: any): TTarget;\n}\n\n/**\n * Abstract base class for transforming seat data to SeatPopoverData format.\n * Apps should extend this class and implement the transform method with their\n * specific seat data models.\n */\nexport abstract class BaseSeatDataTransformer<TSource> extends BasePopoverDataTransformer<\n TSource,\n SeatPopoverData\n> {}\n\n/**\n * Abstract base class for transforming section data to SectionPopoverData format.\n * Apps should extend this class and implement the transform method with their\n * specific section data models.\n */\nexport abstract class BaseSectionDataTransformer<TSource> extends BasePopoverDataTransformer<\n TSource,\n SectionPopoverData\n> {}\n\n","/*\n * Public API Surface of software-division-components\n */\n\nexport * from './popover.component';\nexport * from './popover.config';\nexport * from './popover.service';\nexport type * from './types';\nexport * from './base-popover.component';\nexport * from './seat-popover/seat-popover.component';\nexport * from './section-popover/section-popover.component';\nexport * from './services/popover-manager.service';\nexport * from './services/dvm-popover-positioner.service';\nexport * from './transformers/base-popover-data-transformer';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"3ddv-software-division-components-dvm-popover.mjs","sources":["../../dvm/popover/popover.config.ts","../../dvm/popover/popover.service.ts","../../dvm/popover/base-popover.component.ts","../../dvm/popover/seat-popover/seat-popover.component.ts","../../dvm/popover/seat-popover/seat-popover.component.html","../../dvm/popover/section-popover/section-popover.component.ts","../../dvm/popover/section-popover/section-popover.component.html","../../dvm/popover/types.ts","../../dvm/popover/popover.component.ts","../../dvm/popover/popover.component.html","../../dvm/popover/services/popover-manager.service.ts","../../dvm/popover/services/dvm-popover-positioner.service.ts","../../dvm/popover/transformers/base-popover-data-transformer.ts","../../dvm/popover/public-api.ts","../../dvm/popover/3ddv-software-division-components-dvm-popover.ts"],"sourcesContent":["import type { MapViewerService, Viewer3dService } from '@3ddv/ngx-dvm-internal';\nimport { InjectionToken } from '@angular/core';\nimport type { IThumbnailProvider, IPopoverPositioner, IPopoverManager } from './types';\n\n// This is a placeholder based on usage in popover.component.ts\nexport type Configuration = {\n dvmData: {\n venueId: string;\n };\n};\n\nexport type IDvmFormatter = {\n transform(value: string, ...args: unknown[]): string;\n};\n\nexport type IConfigurationService = {\n configuration: Configuration;\n};\n\nexport type IDvmService = {\n readonly viewer3dService: Viewer3dService;\n readonly viewerService: MapViewerService\n};\n\nexport const DVM_FORMATTER = new InjectionToken<IDvmFormatter>('DvmFormatter');\nexport const CONFIGURATION_SERVICE = new InjectionToken<IConfigurationService>('ConfigurationService');\nexport const DVM_SERVICE = new InjectionToken<IDvmService>('DvmService');\nexport const THUMBNAIL_PROVIDER = new InjectionToken<IThumbnailProvider>('ThumbnailProvider');\nexport const POPOVER_POSITIONER = new InjectionToken<IPopoverPositioner>('PopoverPositioner');\nexport const POPOVER_MANAGER = new InjectionToken<IPopoverManager>('PopoverManager');\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n ComponentRef,\n createComponent,\n createEnvironmentInjector,\n ElementRef,\n EnvironmentInjector,\n inject,\n Injectable,\n TemplateRef,\n} from '@angular/core';\nimport { of } from 'rxjs';\nimport {\n arrow,\n autoPlacement,\n autoUpdate,\n computePosition,\n ComputePositionConfig,\n detectOverflow,\n flip,\n hide,\n inline,\n Middleware,\n offset,\n shift,\n size,\n VirtualElement,\n} from '@floating-ui/dom';\nimport { MiddlewareOptions, PopoverInstance, PopoverOptions } from './types';\nimport { CONFIGURATION_SERVICE, DVM_FORMATTER, DVM_SERVICE } from './popover.config';\nimport type { IConfigurationService, IDvmFormatter, IDvmService } from './popover.config';\n\nexport interface PopoverContentProjection {\n thumbnail?: TemplateRef<unknown> | string;\n content?: TemplateRef<unknown> | string;\n price?: TemplateRef<unknown> | string;\n}\n\nexport interface PopoverServiceOptions {\n providers?: any[];\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PopoverService {\n // SERVICES\n private readonly appReference: ApplicationRef = inject(ApplicationRef);\n private readonly envInjector: EnvironmentInjector = inject(EnvironmentInjector);\n private readonly document: Document = inject(DOCUMENT);\n\n // POPOVER STATE\n private readonly popoverInstances: Map<string, PopoverInstance> = new Map<string, PopoverInstance>();\n private readonly popoverOptions: Partial<ComputePositionConfig> = {\n placement: 'bottom',\n strategy: 'absolute',\n middleware: [],\n };\n\n private popoverTimerTimeInMs = 300;\n private currentPopoverId = '';\n private popoverTimer: ReturnType<typeof setTimeout> | null = null;\n private popoverInstancesWithTimers: Map<string, PopoverInstance> = new Map();\n\n // Default mock providers for when no custom providers are provided\n private readonly defaultMockProviders = [\n {\n provide: CONFIGURATION_SERVICE,\n useValue: {\n configuration: {\n dvmData: {\n venueId: 'default-venue',\n },\n },\n } as IConfigurationService,\n },\n {\n provide: DVM_FORMATTER,\n useValue: {\n transform: (value: string) => value.replace(/-/g, ' ').toUpperCase(),\n } as IDvmFormatter,\n },\n {\n provide: DVM_SERVICE,\n useValue: {\n viewer3dService: {\n isInitialized: () => true,\n getThumbnail: () => of('https://via.placeholder.com/275x124/1a1a1a/ffffff?text=Default+Thumbnail'),\n },\n } as any,\n },\n ];\n\n // METHODS\n public setTimer(): void {\n const myId = this.currentPopoverId;\n this.clearTimer();\n this.popoverTimer = setTimeout(() => {\n if (this.currentPopoverId !== myId) {\n return;\n }\n this.destroyAllPopovers();\n this.popoverTimer = null;\n }, this.popoverTimerTimeInMs);\n }\n\n public clearTimer(): void {\n if (this.popoverTimer !== null) {\n clearTimeout(this.popoverTimer);\n this.popoverTimer = null;\n }\n }\n\n /**\n * Sets a timer for a specific popover instance to auto-hide it after the specified delay.\n * @param popoverId - The ID of the popover to set timer for\n * @param delayMs - Delay in milliseconds (optional, defaults to configured delay)\n */\n public setPopoverTimer(popoverId: string, delayMs?: number): void {\n this.clearPopoverTimer(popoverId);\n const delay = delayMs ?? this.popoverTimerTimeInMs;\n\n this.popoverTimer = setTimeout(() => {\n this.destroyPopover(popoverId);\n }, delay);\n }\n\n /**\n * Clears the timer for a specific popover instance.\n * @param popoverId - The ID of the popover to clear timer for\n */\n public clearPopoverTimer(popoverId: string): void {\n if (this.popoverTimer !== null) {\n clearTimeout(this.popoverTimer);\n this.popoverTimer = null;\n }\n }\n\n /**\n * Configures the default timer delay for popovers.\n * @param delayMs - Delay in milliseconds\n */\n public setTimerDelay(delayMs: number): void {\n this.popoverTimerTimeInMs = delayMs;\n }\n\n /**\n * Crea un popover y lo añade al DOM, usando un elemento de referencia y contenido HTML o string.\n * Si ya existe un popover con el mismo ID, lo destruye antes de crear uno nuevo.\n *\n * @param popoverId Identificador único del popover.\n * @param reference Elemento de referencia para posicionar el popover (HTMLElement, Element, VirtualElement o ElementRef).\n * @param content Contenido del popover (HTMLElement o string HTML).\n * @param options Opciones de configuración para el posicionamiento (placement, strategy, middleware, etc).\n * @returns Instancia del popover creado.\n */\n public createPopover(\n popoverId: string,\n reference: HTMLElement | Element | VirtualElement | (ElementRef & VirtualElement),\n content: HTMLElement | string,\n options: Partial<PopoverOptions> = {}\n ): PopoverInstance<unknown> {\n this.clearTimer();\n // Comprobamos si ya existe una instancia de Popover con el mismo ID\n this.checkPopoverInstance(popoverId ?? '');\n this.currentPopoverId = popoverId;\n\n const id: string = popoverId ?? `popover-${Date.now()}`; // ID unico del popover, proporcionado o auto\n const referenceElement: unknown = reference instanceof ElementRef ? reference.nativeElement : reference; // Elemento de referencia\n const popoverElement: HTMLElement = this.createPopoverElement(content); // Elemento Popover\n const finalOptions: Partial<ComputePositionConfig> = {\n // Opciones finales de posicionamiento\n placement: options.placement || this.popoverOptions.placement,\n strategy: options.strategy || this.popoverOptions.strategy,\n middleware: options.middleware ? this.setMiddlewares(options.middleware) : this.popoverOptions.middleware,\n };\n\n // Añadimos el Popover al DOM\n this.document.body.append(popoverElement);\n\n // Creamos la instancia del Popover\n const instance: PopoverInstance = {\n id,\n element: popoverElement,\n reference: referenceElement as HTMLElement | Element | VirtualElement,\n update: async () => this.calculatePosition(instance, finalOptions),\n };\n\n // Calculamos la posicion del Popover\n void this.calculatePosition(instance, finalOptions);\n\n // Añadimos la función de autoUpdate en la propiedad cleanup del Popover ( se llama al destruir el Popover )\n instance.cleanup = autoUpdate(referenceElement as HTMLElement, popoverElement, () => instance.update!());\n\n // Añadimos la instancia del Popover al mapa de instancias\n this.popoverInstances.set(id, instance);\n\n return instance;\n }\n\n /**\n * Crea un popover que contiene un componente Angular con soporte para proyección de contenido.\n * Si ya existe un popover con el mismo ID, lo destruye antes de crear uno nuevo.\n *\n * @param popoverId Identificador único del popover.\n * @param reference Elemento de referencia para posicionar el popover (HTMLElement, Element, VirtualElement o ElementRef).\n * @param component Clase del componente Angular a renderizar dentro del popover.\n * @param inputs Propiedades de entrada para el componente.\n * @param contentProjection Contenido proyectado para los slots del popover.\n * @param options Opciones de configuración para el posicionamiento (placement, strategy, middleware, etc).\n * @returns Instancia del popover creado, incluyendo la referencia al componente.\n */\n public createPopoverComponentWithContent<T>(\n popoverId: string,\n reference: HTMLElement | Element | VirtualElement | (ElementRef & VirtualElement),\n component: new (...arguments_: unknown[]) => T,\n inputs?: Partial<T>,\n contentProjection?: PopoverContentProjection,\n options: Partial<PopoverOptions> = {},\n serviceOptions: PopoverServiceOptions = {}\n ): PopoverInstance {\n this.clearTimer();\n // Comprobamos si ya existe una instancia de Popover con el mismo ID\n this.checkPopoverInstance(popoverId ?? '');\n this.currentPopoverId = popoverId;\n\n const referenceElement: unknown = reference instanceof ElementRef ? reference.nativeElement : reference;\n const popoverElement: HTMLElement = this.createPopoverElement();\n\n // Create a custom environment injector with the required providers\n const providers = serviceOptions.providers || this.defaultMockProviders;\n const customInjector = createEnvironmentInjector(providers, this.envInjector);\n\n const componentReference: ComponentRef<T> = createComponent(component, {\n environmentInjector: customInjector,\n hostElement: popoverElement,\n });\n\n const finalOptions: Partial<ComputePositionConfig> = {\n placement: options.placement || this.popoverOptions.placement,\n strategy: options.strategy || this.popoverOptions.strategy,\n middleware: options.middleware ? this.setMiddlewares(options.middleware) : this.popoverOptions.middleware,\n };\n\n // Añadimos el Popover al DOM\n this.document.body.append(popoverElement);\n\n // Si tiene inputs, los asignamos al componente\n if (inputs) {\n for (const [key, value] of Object.entries(inputs)) {\n componentReference.setInput(key, value);\n }\n }\n\n // Procesamos la proyección de contenido\n if (contentProjection) {\n this.processContentProjection(componentReference, contentProjection);\n }\n\n // Encendemos el detectChanges del componente para que se renderice\n componentReference.changeDetectorRef.detectChanges();\n\n // Añadimos el componente al DOM\n this.appReference.attachView(componentReference.hostView);\n\n // Creamos la instancia del Popover\n const instance: PopoverInstance = {\n id: popoverId,\n element: popoverElement,\n reference: referenceElement as HTMLElement | Element | VirtualElement,\n componentRef: componentReference as ComponentRef<unknown>,\n update: async () => this.calculatePosition(instance, finalOptions),\n };\n\n const arrowElement = document.querySelector('#arrow')!;\n finalOptions.middleware?.push(arrow({ element: arrowElement }));\n\n // Calculamos la posicion del Popover\n void this.calculatePosition(instance, finalOptions);\n\n // Proporcionamos la función de autoUpdate en la propiedad cleanup del Popover\n instance.cleanup = autoUpdate(referenceElement as HTMLElement, popoverElement, () => instance.update!());\n\n // Añadimos la instancia del Popover al mapa de instancias\n this.popoverInstances.set(popoverId, instance);\n\n return instance;\n }\n\n /**\n * Crea un popover que contiene un componente Angular, lo añade al DOM y lo posiciona.\n * Si ya existe un popover con el mismo ID, lo destruye antes de crear uno nuevo.\n *\n * @param popoverId Identificador único del popover.\n * @param reference Elemento de referencia para posicionar el popover (HTMLElement, Element, VirtualElement o ElementRef).\n * @param component Clase del componente Angular a renderizar dentro del popover.\n * @param inputs Propiedades de entrada para el componente.\n * @param options Opciones de configuración para el posicionamiento (placement, strategy, middleware, etc).\n * @returns Instancia del popover creado, incluyendo la referencia al componente.\n */\n public createPopoverComponent<T>(\n popoverId: string,\n reference: HTMLElement | Element | VirtualElement | (ElementRef & VirtualElement),\n component: new (...arguments_: unknown[]) => T,\n inputs?: Partial<T>,\n options: Partial<PopoverOptions> = {},\n serviceOptions: PopoverServiceOptions = {}\n ): PopoverInstance {\n this.clearTimer();\n // Comprobamos si ya existe una instancia de Popover con el mismo ID\n this.checkPopoverInstance(popoverId ?? '');\n this.currentPopoverId = popoverId;\n\n const referenceElement: unknown = reference instanceof ElementRef ? reference.nativeElement : reference; // Elemento de referencia\n const popoverElement: HTMLElement = this.createPopoverElement(); // Elemento Popover\n\n // Create a custom environment injector with the required providers\n const providers = serviceOptions.providers || this.defaultMockProviders;\n const customInjector = createEnvironmentInjector(providers, this.envInjector);\n\n const componentReference: ComponentRef<T> = createComponent(component, {\n environmentInjector: customInjector,\n hostElement: popoverElement,\n }); // Instancia del componente Popover\n const finalOptions: Partial<ComputePositionConfig> = {\n // Opciones de posicionamiento\n placement: options.placement || this.popoverOptions.placement,\n strategy: options.strategy || this.popoverOptions.strategy,\n middleware: options.middleware ? this.setMiddlewares(options.middleware) : this.popoverOptions.middleware,\n };\n\n // Añadimos el Popover al DOM\n this.document.body.append(popoverElement);\n\n // Si tiene inputs, los asignamos al componente\n if (inputs) {\n for (const [key, value] of Object.entries(inputs)) {\n componentReference.setInput(key, value);\n }\n }\n\n // Encendemos el detectChanges del componente para que se renderice\n componentReference.changeDetectorRef.detectChanges();\n\n // Añadimos el componente al DOM\n this.appReference.attachView(componentReference.hostView);\n\n // Creamos la instancia del Popover\n const instance: PopoverInstance = {\n id: popoverId,\n element: popoverElement,\n reference: referenceElement as HTMLElement | Element | VirtualElement,\n componentRef: componentReference as ComponentRef<unknown>,\n update: async () => this.calculatePosition(instance, finalOptions),\n };\n\n const arrowElement = document.querySelector('#arrow')!;\n finalOptions.middleware?.push(arrow({ element: arrowElement }));\n\n // Calculamos la posicion del Popover\n void this.calculatePosition(instance, finalOptions);\n\n // Proporcionamos la función de autoUpdate en la propiedad cleanup del Popover ( se llama al destruir el Popover )\n instance.cleanup = autoUpdate(referenceElement as HTMLElement, popoverElement, () => instance.update!());\n\n // Añadimos la instancia del Popover al mapa de instancias\n this.popoverInstances.set(popoverId, instance);\n\n return instance;\n }\n\n /**\n * Destruye un popover existente por su ID, eliminando su elemento del DOM y limpiando recursos.\n *\n * @param id Identificador del popover a destruir.\n */\n public destroyPopover(id: string): void {\n // Comprobamos si existe la instancia del Popover\n const instance: PopoverInstance | undefined = this.popoverInstances.get(id);\n\n if (!instance) {\n return;\n }\n\n // Llamamos a la función de cleanup para eliminar el autoUpdate\n instance.cleanup?.();\n\n // Si hay comoponente, lo eliminamos del DOM\n if (instance.componentRef) {\n this.appReference.detachView(instance.componentRef.hostView);\n instance.componentRef.destroy();\n }\n\n // Si hay elemento, lo eliminamos del DOM\n if (instance.element && instance.element.parentNode) {\n instance.element.remove();\n }\n\n // Eliminamos instancia del mapa\n this.popoverInstances.delete(id);\n }\n\n /**\n * Destruye todos los popovers existentes, eliminando sus elementos del DOM y limpiando recursos.\n */\n public destroyAllPopovers(): void {\n for (const id of this.popoverInstances.keys()) {\n this.destroyPopover(id);\n }\n }\n /**\n * Crea el elemento HTML base del popover, opcionalmente con contenido.\n *\n * @param content Contenido a insertar en el popover (string, HTMLElement o ElementRef).\n * @returns Elemento HTML del popover.\n */\n private createPopoverElement(content?: string | HTMLElement | ElementRef): HTMLElement {\n // Creamos el elemento Popover\n const popoverElement: HTMLElement = this.document.createElement('div');\n\n // Añadimos la clase Popover al elemento\n popoverElement.classList.add('popover');\n\n // Si se proporciona contenido, lo añadimos al Popover, si no, lo dejamos vacío\n if (!content) {\n return popoverElement;\n }\n\n if (typeof content === 'string') {\n popoverElement.innerHTML = content;\n } else {\n const element = content instanceof ElementRef ? content.nativeElement : content;\n\n popoverElement.append(element as HTMLElement);\n }\n\n return popoverElement;\n }\n\n /**\n * Verifica si existe una instancia de popover con el ID dado y la destruye si es así.\n *\n * @param id Identificador del popover a comprobar.\n */\n private checkPopoverInstance(id: string): void {\n if (this.popoverInstances.has(id)) {\n this.destroyPopover(id);\n }\n }\n\n /**\n * Calcula y aplica la posición del popover respecto a su elemento de referencia,\n * usando las opciones de Floating UI.\n *\n * @param instance Instancia del popover a posicionar.\n * @param options Opciones de configuración para el posicionamiento.\n */\n private async calculatePosition(\n instance: PopoverInstance,\n options: Partial<ComputePositionConfig> = {}\n ): Promise<void> {\n // Desestructuramos las opciones\n const { placement, strategy, middleware } = options;\n\n try {\n // Calculamos la posicion del Popover en base a la referencia y el elemento Popover y las opciones proporcionadas\n const { x, y } = await computePosition(instance.reference, instance.element, {\n placement,\n strategy,\n middleware,\n });\n\n // Asignamos la posicion al elemento Popover\n Object.assign(instance.element.style, {\n position: strategy,\n top: `${y}px`,\n left: `${x}px`,\n });\n } catch (error) {\n console.error('Error positioning popover', error);\n }\n }\n\n /**\n * Procesa la proyección de contenido para el componente popover.\n *\n * @param componentRef Referencia al componente creado\n * @param contentProjection Contenido a proyectar en los slots\n */\n private processContentProjection<T>(\n componentRef: ComponentRef<T>,\n contentProjection: PopoverContentProjection\n ): void {\n const componentInstance = componentRef.instance as any;\n\n // Procesamos cada slot de contenido\n if (contentProjection.thumbnail) {\n this.setContentProjection(componentInstance, 'hasThumbnailProjection', contentProjection.thumbnail);\n }\n\n if (contentProjection.content) {\n this.setContentProjection(componentInstance, 'hasContentProjection', contentProjection.content);\n }\n\n if (contentProjection.price) {\n this.setContentProjection(componentInstance, 'hasPriceProjection', contentProjection.price);\n }\n }\n\n /**\n * Establece la proyección de contenido para un slot específico.\n *\n * @param componentInstance Instancia del componente\n * @param projectionFlag Flag que indica si hay proyección\n * @param content Contenido a proyectar\n */\n private setContentProjection(\n componentInstance: any,\n projectionFlag: string,\n content: TemplateRef<unknown> | string\n ): void {\n // Marcamos que hay proyección de contenido\n componentInstance[projectionFlag] = true;\n\n // Si es un TemplateRef, lo almacenamos para uso posterior\n if (content instanceof TemplateRef) {\n componentInstance[`${projectionFlag}Template`] = content;\n } else if (typeof content === 'string') {\n // Si es string, lo almacenamos como HTML\n componentInstance[`${projectionFlag}Html`] = content;\n }\n }\n\n /**\n * Set Middlewares\n * Método que recibe un objeto de opciones de middleware y devuelve un array de middlewares cargados con sus opciones.\n *\n * Para ello, necesitamos establecer un orden de aplicación de los middlewares, ya que la computación de la posición\n * depende del estado de los middlewares aplicados anteriormente. Además, como son funciones, hacemos switch para\n * cargar el middleware correspondiente en cada caso a excepción de detectOverflow, que es un middleware especial\n * que no se aplica directamente, sino que se ejecuta como una función asíncrona sobre el estado devuelto de los middlewares (si los hay).\n *\n * @param middleware\n * @returns {Middleware[]}\n */\n private setMiddlewares(middleware: MiddlewareOptions): Middleware[] {\n // Array de Middlewares y orden de aplicación de los mismos\n // https://floating-ui.com/docs/middleware#ordering\n\n const middlewares: Middleware[] = [];\n const order: (keyof MiddlewareOptions)[] = [\n 'offset',\n 'shift',\n 'flip',\n 'arrow',\n 'size',\n 'autoPlacement',\n 'inline',\n 'hide',\n 'detectOverflow',\n ];\n\n // Recorremos el array de orden y aplicamos los middlewares en el orden indicado\n for (const key of order as (keyof MiddlewareOptions)[]) {\n if (!middleware[key]) {\n continue;\n }\n\n switch (key) {\n case 'offset': {\n middlewares.push(offset(middleware.offset));\n break;\n }\n\n case 'shift': {\n middlewares.push(shift(middleware.shift));\n break;\n }\n\n case 'flip': {\n middlewares.push(flip(middleware.flip));\n break;\n }\n\n case 'arrow': {\n middlewares.push(arrow(middleware.arrow!));\n break;\n }\n\n case 'size': {\n middlewares.push(size(middleware.size));\n break;\n }\n\n case 'autoPlacement': {\n middlewares.push(autoPlacement(middleware.autoPlacement));\n break;\n }\n\n case 'hide': {\n middlewares.push(hide(middleware.hide));\n break;\n }\n\n case 'inline': {\n middlewares.push(inline(middleware.inline));\n break;\n }\n\n case 'detectOverflow': {\n const overflowMiddleware: Middleware = {\n name: 'detectOverflow',\n async fn(state) {\n await detectOverflow(state, middleware.detectOverflow);\n return {};\n },\n };\n middlewares.push(overflowMiddleware);\n break;\n }\n }\n }\n\n return middlewares;\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, inject, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { PopoverService } from './popover.service';\n\n/**\n * Base component for popovers that provides timer functionality.\n * Extend this component to create timer-aware popovers.\n */\n@Component({\n template: '', // Abstract component\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport abstract class BasePopoverComponent implements OnInit, OnDestroy {\n @Input() popoverId: string = '';\n @Input() autoHideDelay: number = 300; // milliseconds\n @Input() enableAutoHide: boolean = true;\n\n @Output() mouseEnter = new EventEmitter<MouseEvent>();\n @Output() mouseLeave = new EventEmitter<MouseEvent>();\n @Output() popoverHidden = new EventEmitter<void>();\n\n protected readonly popoverService = inject(PopoverService);\n protected readonly cdr = inject(ChangeDetectorRef);\n\n private isMouseOver = false;\n\n ngOnInit(): void {\n if (this.enableAutoHide && this.popoverId) {\n this.startAutoHideTimer();\n }\n }\n\n ngOnDestroy(): void {\n if (this.popoverId) {\n this.popoverService.clearPopoverTimer(this.popoverId);\n }\n }\n\n protected onMouseEnter(event: MouseEvent): void {\n this.isMouseOver = true;\n this.clearAutoHideTimer();\n this.mouseEnter.emit(event);\n }\n\n protected onMouseLeave(event: MouseEvent): void {\n this.isMouseOver = false;\n if (this.enableAutoHide) {\n this.startAutoHideTimer();\n }\n this.mouseLeave.emit(event);\n }\n\n protected hidePopover(): void {\n if (this.popoverId) {\n this.popoverService.destroyPopover(this.popoverId);\n this.popoverHidden.emit();\n }\n }\n\n private startAutoHideTimer(): void {\n if (this.popoverId && !this.isMouseOver) {\n this.popoverService.setPopoverTimer(this.popoverId, this.autoHideDelay);\n }\n }\n\n private clearAutoHideTimer(): void {\n if (this.popoverId) {\n this.popoverService.clearPopoverTimer(this.popoverId);\n }\n }\n}\n","import { CommonModule, CurrencyPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { BasePopoverComponent } from '../base-popover.component';\nimport { THUMBNAIL_PROVIDER } from '../popover.config';\nimport { type SeatPopoverData } from '../types';\n\n@Component({\n selector: 'sdc-seat-popover',\n templateUrl: './seat-popover.component.html',\n styleUrl: './seat-popover.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, CurrencyPipe],\n})\nexport class SeatPopoverComponent extends BasePopoverComponent implements OnInit {\n @Input() data!: SeatPopoverData;\n @Input() showLoader: boolean = true;\n @Output() load3dView = new EventEmitter<void>();\n\n private readonly thumbnailProvider = inject(THUMBNAIL_PROVIDER, { optional: true });\n protected override readonly cdr = inject(ChangeDetectorRef);\n\n protected thumbnail?: string;\n protected isLoadingThumbnail = true;\n\n override ngOnInit(): void {\n super.ngOnInit(); // Initialize base component timer logic\n\n if (this.data.thumbnail) {\n this.thumbnail = this.data.thumbnail;\n this.isLoadingThumbnail = false;\n } else if (this.thumbnailProvider && this.showLoader) {\n this.loadThumbnail();\n }\n }\n\n private loadThumbnail(): void {\n this.thumbnailProvider!.getThumbnail(this.data.id).subscribe({\n next: url => {\n this.thumbnail = url;\n this.isLoadingThumbnail = false;\n this.cdr.markForCheck();\n },\n error: () => {\n this.isLoadingThumbnail = false;\n this.cdr.markForCheck();\n },\n });\n }\n\n protected get formattedSection(): string {\n return this.data.section.includes('_') ? this.data.section.split('_')[1].split('-')[0] : this.data.section;\n }\n\n protected get formattedSeat(): string {\n return this.data.seat.split('-')[2] || this.data.seat;\n }\n\n protected onEnter(event: MouseEvent): void {\n this.onMouseEnter(event);\n }\n\n protected onLeave(event: MouseEvent): void {\n this.onMouseLeave(event);\n }\n\n protected onLoad3dView(): void {\n this.load3dView.emit();\n }\n}\n","<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-seat-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ formattedSection }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Row:</span>\n {{ data.row }}\n </h5>\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Seat:</span>\n {{ formattedSeat }}\n </h5>\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span>\n {{ data.price | currency: 'USD' }}\n </h5>\n </div>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { BasePopoverComponent } from '../base-popover.component';\nimport { THUMBNAIL_PROVIDER } from '../popover.config';\nimport { type SectionPopoverData } from '../types';\n\n@Component({\n selector: 'sdc-section-popover',\n templateUrl: './section-popover.component.html',\n styleUrl: './section-popover.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule],\n})\nexport class SectionPopoverComponent extends BasePopoverComponent implements OnInit {\n @Input() data!: SectionPopoverData;\n @Input() showLoader: boolean = true;\n @Input() showBestAvailable: boolean = false;\n @Input() showOpenSeatMap: boolean = true;\n @Input() excludeSeatMapSections: string[] = ['S_BLCHADA', 'S_Bleacher'];\n @Input() isTicketFeeEnabled: boolean = false;\n @Input() isAdaEnabled: boolean = true;\n\n @Output() load3dView = new EventEmitter<void>();\n @Output() selectForBA = new EventEmitter<boolean>();\n @Output() openSeatMap = new EventEmitter<void>();\n\n private readonly thumbnailProvider = inject(THUMBNAIL_PROVIDER, { optional: true });\n protected override readonly cdr = inject(ChangeDetectorRef);\n\n protected thumbnail?: string;\n protected isLoadingThumbnail = true;\n\n override ngOnInit(): void {\n super.ngOnInit(); // Initialize basse component timer logic\n\n if (this.data.thumbnail) {\n this.thumbnail = this.data.thumbnail;\n this.isLoadingThumbnail = false;\n } else if (this.thumbnailProvider && this.showLoader) {\n this.loadThumbnail();\n }\n }\n\n private loadThumbnail(): void {\n this.thumbnailProvider!.getThumbnail(this.data.id).subscribe({\n next: url => {\n this.thumbnail = url;\n this.isLoadingThumbnail = false;\n this.cdr.markForCheck();\n },\n error: () => {\n this.isLoadingThumbnail = false;\n this.cdr.markForCheck();\n },\n });\n }\n\n protected get priceRangeDisplay(): string {\n const { min, max } = this.data.priceRange;\n return min === max ? min.toString() : `${min} - ${max}`;\n }\n\n protected get priceRangeWithFees(): string | undefined {\n if (this.isTicketFeeEnabled && this.data.priceRangeWithFees) {\n return this.data.priceRangeWithFees;\n }\n return undefined;\n }\n\n protected get shouldShowSeatMapButton(): boolean {\n return (\n this.showOpenSeatMap &&\n !this.excludeSeatMapSections.includes(this.data.section) &&\n this.data.type !== 'general_admission'\n );\n }\n\n protected onEnter(event: MouseEvent): void {\n this.onMouseEnter(event);\n }\n\n protected onLeave(event: MouseEvent): void {\n this.onMouseLeave(event);\n }\n\n protected onLoad3dView(): void {\n this.load3dView.emit();\n }\n\n protected onSelectForBA(): void {\n this.selectForBA.emit(!this.data.isSelectedForBA);\n }\n\n protected onOpenSeatMap(): void {\n this.openSeatMap.emit();\n }\n}\n","<div (mouseenter)=\"onEnter($event)\" (mouseleave)=\"onLeave($event)\" class=\"sdc-section-popover\">\n <div class=\"sdc-popover-thumbnail\">\n @if (isLoadingThumbnail && showLoader) {\n <div class=\"sdc-popover-loader\">\n <div class=\"sdc-spinner\"></div>\n </div>\n }\n @if (thumbnail && !isLoadingThumbnail) {\n <div\n class=\"sdc-thumbnail-image sdc-thumbnail-clickable\"\n [style.background-image]=\"'url(' + thumbnail + ')'\"\n (click)=\"onLoad3dView()\">\n <span class=\"sdc-thumbnail-overlay-text\">Click to open view</span>\n </div>\n }\n </div>\n\n <div class=\"sdc-popover-content\">\n <div class=\"sdc-popover-grid\">\n <div class=\"sdc-popover-col-left\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Section:</span>\n {{ data.section }}\n </h5>\n @if (isTicketFeeEnabled && priceRangeWithFees) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeWithFees }}\n </h5>\n } @else {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Price:</span> $ {{ priceRangeDisplay }}\n </h5>\n }\n </div>\n <div class=\"sdc-popover-col-right\">\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available Seats:</span>\n {{ data.availableQuantity }}\n </h5>\n @if (isAdaEnabled) {\n <h5 class=\"sdc-popover-label\">\n <span class=\"sdc-popover-label-text\">Available ADA Seats:</span>\n {{ data.adaQuantity }}\n </h5>\n }\n </div>\n </div>\n\n <div class=\"sdc-popover-actions\">\n @if (showBestAvailable) {\n <button class=\"sdc-popover-btn sdc-popover-btn-primary sdc-popover-btn-mobile-only\" (click)=\"onSelectForBA()\">\n {{ data.isSelectedForBA ? 'Deselect' : 'Select' }}\n </button>\n }\n @if (shouldShowSeatMapButton) {\n <button class=\"sdc-popover-btn sdc-popover-btn-secondary\" (click)=\"onOpenSeatMap()\">Open Seat Map</button>\n }\n </div>\n </div>\n</div>\n","import { ComponentRef, ElementRef, Type, ViewContainerRef } from '@angular/core';\nimport {\n ArrowOptions,\n AutoPlacementOptions,\n ComputePositionConfig,\n DetectOverflowOptions,\n FlipOptions,\n HideOptions,\n InlineOptions,\n OffsetOptions,\n Placement,\n ShiftOptions,\n SizeOptions,\n VirtualElement,\n} from '@floating-ui/dom';\nimport { Observable } from 'rxjs';\nimport type { MapViewerNode } from '@3ddv/dvm-internal';\n\nexport type PopoverPlacement = Placement;\n\nexport interface PopoverInstance<T = unknown> {\n id: string;\n element: HTMLElement;\n reference: HTMLElement | Element | VirtualElement | (ElementRef & VirtualElement);\n componentRef?: ComponentRef<T>;\n update?: () => void;\n cleanup?: () => void;\n}\n\nexport interface PopoverOptions extends Omit<ComputePositionConfig, 'middleware'> {\n middleware?: MiddlewareOptions;\n}\n\nexport interface MiddlewareOptions {\n offset?: OffsetOptions;\n shift?: ShiftOptions;\n flip?: FlipOptions;\n arrow?: ArrowOptions;\n size?: SizeOptions;\n autoPlacement?: AutoPlacementOptions;\n hide?: HideOptions;\n inline?: InlineOptions;\n detectOverflow?: DetectOverflowOptions;\n}\n\nexport enum AppNodes {\n Section = 'section',\n Row = 'row',\n Seat = 'seat',\n Ga = 'general_admission',\n Vip = 'vip',\n}\n\n// Seat popover data interface\nexport interface SeatPopoverData {\n id: string;\n section: string;\n row: string;\n seat: string;\n price: number;\n thumbnail?: string;\n}\n\n// Section popover data interface\nexport interface SectionPopoverData {\n id: string;\n section: string;\n priceRange: { min: number; max: number };\n availableQuantity: number;\n adaQuantity: number;\n thumbnail?: string;\n type?: 'section' | 'general_admission';\n isSelectedForBA?: boolean;\n priceRangeWithFees?: string;\n}\n\n// Thumbnail provider interface\nexport interface IThumbnailProvider {\n getThumbnail(nodeId: string): Observable<string>;\n}\n\n// Popover positioning interface\nexport interface IPopoverPositioner {\n calculatePlacement(node: MapViewerNode, container: HTMLElement): Placement;\n calculateOffset(node: MapViewerNode): number[];\n}\n\n// Popover manager interfaces\nexport interface IPopoverManager {\n showPopover<T>(config: PopoverConfig<T>): void;\n hidePopover(nodeId: string): void;\n clearAll(): void;\n}\n\nexport interface PopoverConfig<T> {\n nodeId: string;\n node: MapViewerNode;\n container: ViewContainerRef;\n tooltip: HTMLElement;\n containerElement: HTMLElement;\n component: Type<T>;\n componentInputs?: Partial<T>;\n eventHandlers?: Record<string, (...args: any[]) => void>;\n}\n","import type { MapViewerNode, Viewer3dLoadView3dOptions } from '@3ddv/dvm-internal';\nimport type { Viewer3dService } from '@3ddv/ngx-dvm-internal';\nimport { ThemeClass } from '@3ddv/software-division-components/shared';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnInit,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n CONFIGURATION_SERVICE,\n DVM_FORMATTER,\n DVM_SERVICE,\n IConfigurationService,\n IDvmFormatter,\n IDvmService,\n} from './popover.config';\nimport { PopoverService } from './popover.service';\nimport { SeatPopoverComponent } from './seat-popover/seat-popover.component';\nimport { SectionPopoverComponent } from './section-popover/section-popover.component';\nimport { AppNodes, SeatPopoverData, SectionPopoverData } from './types';\n\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sdc-map-popover',\n standalone: true,\n imports: [CommonModule, SeatPopoverComponent, SectionPopoverComponent],\n templateUrl: './popover.component.html',\n styleUrl: './popover.component.css',\n})\nexport class PopoverComponent implements OnInit {\n // INPUTS\n /**\n * The node to attach the popover to.\n */\n @Input()\n public readonly node!: MapViewerNode;\n\n /**\n * The current theme applied to the component.\n */\n public readonly theme = input<ThemeClass>('theme-sdc');\n\n // OUTPUTS\n /**\n * Emitted when the 3D view should be loaded.\n */\n public readonly load3dView = output<{ node: MapViewerNode; section: string | undefined }>();\n\n /**\n * Emitted when a section should be selected/deselected for best available.\n */\n public readonly selectSectionForBA = output<{\n node: MapViewerNode;\n section: string | undefined;\n selected: boolean;\n }>();\n\n /**\n * Emitted when the seat map should be opened.\n */\n public readonly openSeatMap = output<{ node: MapViewerNode; section: string | undefined }>();\n\n // SERVICES\n private readonly dvm: IDvmService = inject(DVM_SERVICE);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly format: IDvmFormatter = inject(DVM_FORMATTER);\n private readonly configurationService: IConfigurationService = inject(CONFIGURATION_SERVICE);\n protected readonly popoverService = inject(PopoverService);\n\n // COMPONENT STATE\n protected readonly Nodes: typeof AppNodes = AppNodes;\n protected thumbnail!: string | undefined;\n protected section!: string | undefined;\n protected row!: string | undefined;\n protected seat!: string | undefined;\n protected prices!: string[] | undefined;\n\n // Section popover specific properties\n protected availableQuantity: number = 0;\n protected adaQuantity: number = 0;\n protected includedSectionForBA: boolean = false;\n\n // Transformed data for new components\n protected get seatData(): SeatPopoverData | null {\n if (this.node?.type === AppNodes.Seat) {\n return this.transformToSeatData();\n }\n return null;\n }\n\n protected get sectionData(): SectionPopoverData | null {\n if (this.node?.type === AppNodes.Section || this.node?.type === AppNodes.Ga) {\n return this.transformToSectionData();\n }\n return null;\n }\n\n // LC METHODS\n public ngOnInit(): void {\n this.initComponent();\n }\n\n protected onEnter(_: MouseEvent): void {\n this.popoverService.clearTimer();\n }\n\n protected onLeave(_: MouseEvent): void {\n this.popoverService.setTimer();\n }\n\n // GETTERS\n protected get price(): string | undefined {\n return this.prices // Existen precios?\n ? this.prices.length > 1 // Existen precios, pero más de uno?\n ? Math.min(...this.prices.map(price => Number.parseInt(price))).toString()\n : this.prices[0] // Si lo hay, sacamos el minimo, si no seteamos el primero ( y unico xd )\n : undefined; // No existen precios\n }\n\n protected get priceRange(): string {\n if (!this.prices || this.prices.length === 0) {\n return '';\n }\n\n let priceRange = this.prices[0];\n if (this.prices.length > 1 && this.prices[0] !== this.prices[1]) {\n priceRange = `${this.prices[0]} - ${this.prices[1]}`;\n }\n return priceRange;\n }\n\n // METHODS\n private initComponent(): void {\n this.setTexts();\n this.getThumbnail();\n // this.getPrice();\n }\n\n private setTexts(): void {\n const nodeId: string[] = this.format.transform(this.node?.id).split(' ');\n // const translated = this.translationData()[this.node().id.split('-')[0]];\n this.section = nodeId[0];\n this.row = nodeId[1] ?? null;\n this.seat = nodeId[2] ?? null;\n }\n\n private getThumbnail(): void {\n const viewer3dService: Viewer3dService = this.dvm.viewer3dService;\n const options: Viewer3dLoadView3dOptions = {\n // eslint-disable-next-line camelcase\n venue_id: this.configurationService.configuration.dvmData.venueId,\n // eslint-disable-next-line camelcase\n view_id: this.node?.id,\n };\n\n if (!viewer3dService?.isInitialized()) {\n return;\n }\n\n viewer3dService.getThumbnail(options, true).subscribe((thumbnailUrl: string): void => {\n this.thumbnail = thumbnailUrl;\n this.cdr.markForCheck();\n });\n }\n\n // Section popover methods\n protected onLoad3dView(): void {\n this.load3dView.emit({\n node: this.node,\n section: this.section,\n });\n }\n\n protected onSelectSectionForBA(selected: boolean): void {\n this.includedSectionForBA = selected;\n this.selectSectionForBA.emit({\n node: this.node,\n section: this.section,\n selected: this.includedSectionForBA,\n });\n }\n\n protected onOpenSeatMap(): void {\n this.openSeatMap.emit({\n node: this.node,\n section: this.section,\n });\n }\n\n // Data transformation methods\n private transformToSeatData(): SeatPopoverData {\n const nodeId: string[] = this.format.transform(this.node?.id).split(' ');\n const section = nodeId[0];\n const row = nodeId[1] ?? '';\n const seat = nodeId[2] ?? '';\n\n return {\n id: this.node.id,\n section: section,\n row: row,\n seat: seat,\n price: this.price ? Number.parseFloat(this.price) : 0,\n thumbnail: this.thumbnail,\n };\n }\n\n private transformToSectionData(): SectionPopoverData {\n const nodeId: string[] = this.format.transform(this.node?.id).split(' ');\n const section = nodeId[0];\n\n // Parse price range from existing prices array\n let priceRange = { min: 0, max: 0 };\n if (this.prices && this.prices.length > 0) {\n const minPrice = Number.parseFloat(this.prices[0]);\n const maxPrice = this.prices.length > 1 ? Number.parseFloat(this.prices[1]) : minPrice;\n priceRange = { min: minPrice, max: maxPrice };\n }\n\n return {\n id: this.node.id,\n section: section,\n priceRange: priceRange,\n availableQuantity: this.availableQuantity,\n adaQuantity: this.adaQuantity,\n thumbnail: this.thumbnail,\n type: this.node.type === AppNodes.Ga ? 'general_admission' : 'section',\n isSelectedForBA: this.includedSectionForBA,\n };\n }\n}\n","<!-- SECTION POPOVER -->\n@if (sectionData) {\n <sdc-section-popover\n [data]=\"sectionData\"\n id=\"pano-view\"\n [popoverId]=\"'popover-' + node.id\"\n [showBestAvailable]=\"true\"\n [showOpenSeatMap]=\"true\"\n [excludeSeatMapSections]=\"['S_BLCHADA', 'S_Bleacher']\"\n (mouseEnter)=\"onEnter($event)\"\n (mouseLeave)=\"onLeave($event)\"\n (load3dView)=\"onLoad3dView()\"\n (selectForBA)=\"onSelectSectionForBA($event)\"\n (openSeatMap)=\"onOpenSeatMap()\">\n </sdc-section-popover>\n}\n\n<!-- SEAT POPOVER -->\n@if (seatData) {\n <sdc-seat-popover\n id=\"pano-view\"\n [data]=\"seatData\"\n [popoverId]=\"'popover-' + node.id\"\n (mouseEnter)=\"onEnter($event)\"\n (mouseLeave)=\"onLeave($event)\">\n </sdc-seat-popover>\n}\n","import { inject, Injectable, Inject } from '@angular/core';\nimport { createPopper } from '@popperjs/core';\nimport type { IPopoverManager, IPopoverPositioner, PopoverConfig } from '../types';\nimport { POPOVER_POSITIONER } from '../popover.config';\n\n/**\n * Generic popover manager service that handles popover lifecycle and positioning.\n * This service is DVM-agnostic and delegates positioning logic to IPopoverPositioner.\n */\n@Injectable()\nexport class PopoverManagerService implements IPopoverManager {\n private currentPopoverId: string = '';\n private tooltip?: HTMLElement;\n private readonly positioner: IPopoverPositioner;\n\n constructor(@Inject(POPOVER_POSITIONER) positioner: IPopoverPositioner) {\n this.positioner = positioner;\n }\n\n /**\n * Shows a popover with the specified configuration.\n * @param config - Configuration for the popover including component, data, and positioning\n */\n showPopover<T>(config: PopoverConfig<T>): void {\n config.container.clear();\n this.currentPopoverId = config.nodeId;\n this.tooltip = config.tooltip;\n\n const componentRef = config.container.createComponent(config.component);\n\n if (config.componentInputs) {\n Object.entries(config.componentInputs).forEach(([key, value]) => {\n (componentRef.instance as any)[key] = value;\n });\n }\n\n if (config.eventHandlers) {\n Object.entries(config.eventHandlers).forEach(([key, handler]) => {\n const instance = componentRef.instance as any;\n if (instance[key] && typeof instance[key].subscribe === 'function') {\n instance[key].subscribe(handler);\n }\n });\n }\n\n const placement = this.positioner.calculatePlacement(config.node, config.containerElement);\n const offset = this.positioner.calculateOffset(config.node);\n\n createPopper(config.node, this.tooltip, {\n placement,\n modifiers: [\n {\n name: 'offset',\n options: {\n offset,\n },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: [],\n },\n },\n ],\n });\n\n this.tooltip.setAttribute('data-show', '');\n }\n\n /**\n * Hides the popover for the specified node ID.\n * @param nodeId - The node ID of the popover to hide\n */\n hidePopover(nodeId: string): void {\n if (this.currentPopoverId === nodeId) {\n this.tooltip?.removeAttribute('data-show');\n }\n }\n\n /**\n * Clears all popovers.\n */\n clearAll(): void {\n this.tooltip?.removeAttribute('data-show');\n this.currentPopoverId = '';\n }\n}\n\n","import { inject, Injectable, Inject } from '@angular/core';\nimport type { MapViewerNode, V2 } from '@3ddv/dvm-internal';\nimport { Placement } from '@floating-ui/dom';\nimport { IPopoverPositioner } from '../types';\nimport { DVM_SERVICE, CONFIGURATION_SERVICE } from '../popover.config';\nimport type { IDvmService, IConfigurationService } from '../popover.config';\n\n/**\n * DVM-specific positioning service for popovers.\n * Handles calculation of popover placement and offset based on DVM node properties.\n */\n@Injectable()\nexport class DvmPopoverPositionerService implements IPopoverPositioner {\n private readonly dvmService: IDvmService;\n private readonly configService: IConfigurationService;\n\n constructor(\n @Inject(DVM_SERVICE) dvmService: IDvmService,\n @Inject(CONFIGURATION_SERVICE) configService: IConfigurationService\n ) {\n this.dvmService = dvmService;\n this.configService = configService;\n }\n\n /**\n * Calculates the optimal placement for a popover based on node position.\n * @param node - The MapViewerNode to position relative to\n * @param container - The container element for positioning reference\n * @returns The calculated placement ('top' or 'bottom')\n */\n calculatePlacement(node: MapViewerNode, container: HTMLElement): Placement {\n if (!node.aabb) {\n throw new Error('Node AABB is not defined');\n }\n\n const nodeSceneCenter: [number, number] = [\n node.aabb[0] + node.aabb[2] / 2,\n node.aabb[1] + node.aabb[3] / 2,\n ];\n\n const nodeDomCenter: V2 = this.dvmService.viewerService.fromSceneToDom(nodeSceneCenter)!;\n\n if (nodeDomCenter[1] > container.offsetHeight / 2) {\n return 'top';\n } else {\n return 'bottom';\n }\n }\n\n /**\n * Calculates the offset for popover positioning based on node type and configuration.\n * @param node - The MapViewerNode to calculate offset for\n * @returns An array of [x, y] offset values\n */\n calculateOffset(node: MapViewerNode): number[] {\n if (node.type === 'seat') {\n return [0, 6];\n }\n\n if (node.type === 'section' || node.type === 'general_admission') {\n const dvmData = this.configService.configuration.dvmData as any;\n const sectionOffsets = dvmData?.sectionOffsets || {};\n const nodeId = node.id as keyof typeof sectionOffsets;\n const nodeOriginalId = node.original_id as keyof typeof sectionOffsets;\n const dvmOffset = sectionOffsets[nodeId] ?? sectionOffsets[nodeOriginalId];\n\n return dvmOffset ?? [0, 0];\n }\n\n return [0, 0];\n }\n}\n\n","import { SeatPopoverData, SectionPopoverData } from '../types';\n\n/**\n * Abstract base class for transforming data from source format to target popover format.\n * Apps can extend this class to implement their own data transformation logic.\n */\nexport abstract class BasePopoverDataTransformer<TSource, TTarget> {\n /**\n * Transforms source data to target popover data format.\n * @param source - The source data to transform\n * @param context - Optional context for additional transformation logic\n * @returns The transformed data in target format\n */\n abstract transform(source: TSource, context?: any): TTarget;\n}\n\n/**\n * Abstract base class for transforming seat data to SeatPopoverData format.\n * Apps should extend this class and implement the transform method with their\n * specific seat data models.\n */\nexport abstract class BaseSeatDataTransformer<TSource> extends BasePopoverDataTransformer<\n TSource,\n SeatPopoverData\n> {}\n\n/**\n * Abstract base class for transforming section data to SectionPopoverData format.\n * Apps should extend this class and implement the transform method with their\n * specific section data models.\n */\nexport abstract class BaseSectionDataTransformer<TSource> extends BasePopoverDataTransformer<\n TSource,\n SectionPopoverData\n> {}\n\n","/*\n * Public API Surface of software-division-components\n */\n\nexport * from './popover.component';\nexport * from './popover.config';\nexport * from './popover.service';\nexport type * from './types';\nexport * from './base-popover.component';\nexport * from './seat-popover/seat-popover.component';\nexport * from './section-popover/section-popover.component';\nexport * from './services/popover-manager.service';\nexport * from './services/dvm-popover-positioner.service';\nexport * from './transformers/base-popover-data-transformer';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;MAwBa,aAAa,GAAG,IAAI,cAAc,CAAgB,cAAc;MAChE,qBAAqB,GAAG,IAAI,cAAc,CAAwB,sBAAsB;MACxF,WAAW,GAAG,IAAI,cAAc,CAAc,YAAY;MAC1D,kBAAkB,GAAG,IAAI,cAAc,CAAqB,mBAAmB;MAC/E,kBAAkB,GAAG,IAAI,cAAc,CAAqB,mBAAmB;MAC/E,eAAe,GAAG,IAAI,cAAc,CAAkB,gBAAgB;;MCiBtE,cAAc,CAAA;;AAER,IAAA,YAAY,GAAmB,MAAM,CAAC,cAAc,CAAC;AACrD,IAAA,WAAW,GAAwB,MAAM,CAAC,mBAAmB,CAAC;AAC9D,IAAA,QAAQ,GAAa,MAAM,CAAC,QAAQ,CAAC;;AAGrC,IAAA,gBAAgB,GAAiC,IAAI,GAAG,EAA2B;AACnF,IAAA,cAAc,GAAmC;AAChE,QAAA,SAAS,EAAE,QAAQ;AACnB,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,UAAU,EAAE,EAAE;KACf;IAEO,oBAAoB,GAAG,GAAG;IAC1B,gBAAgB,GAAG,EAAE;IACrB,YAAY,GAAyC,IAAI;AACzD,IAAA,0BAA0B,GAAiC,IAAI,GAAG,EAAE;;AAG3D,IAAA,oBAAoB,GAAG;AACtC,QAAA;AACE,YAAA,OAAO,EAAE,qBAAqB;AAC9B,YAAA,QAAQ,EAAE;AACR,gBAAA,aAAa,EAAE;AACb,oBAAA,OAAO,EAAE;AACP,wBAAA,OAAO,EAAE,eAAe;AACzB,qBAAA;AACF,iBAAA;AACuB,aAAA;AAC3B,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,aAAa;AACtB,YAAA,QAAQ,EAAE;AACR,gBAAA,SAAS,EAAE,CAAC,KAAa,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;AACpD,aAAA;AACnB,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,WAAW;AACpB,YAAA,QAAQ,EAAE;AACR,gBAAA,eAAe,EAAE;AACf,oBAAA,aAAa,EAAE,MAAM,IAAI;AACzB,oBAAA,YAAY,EAAE,MAAM,EAAE,CAAC,0EAA0E,CAAC;AACnG,iBAAA;AACK,aAAA;AACT,SAAA;KACF;;IAGM,QAAQ,GAAA;AACb,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB;QAClC,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAClC,YAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;gBAClC;YACF;YACA,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AAC1B,QAAA,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC;IAC/B;IAEO,UAAU,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE;AAC9B,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;IACF;AAEA;;;;AAIG;IACI,eAAe,CAAC,SAAiB,EAAE,OAAgB,EAAA;AACxD,QAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;AACjC,QAAA,MAAM,KAAK,GAAG,OAAO,IAAI,IAAI,CAAC,oBAAoB;AAElD,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAClC,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;QAChC,CAAC,EAAE,KAAK,CAAC;IACX;AAEA;;;AAGG;AACI,IAAA,iBAAiB,CAAC,SAAiB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE;AAC9B,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;IACF;AAEA;;;AAGG;AACI,IAAA,aAAa,CAAC,OAAe,EAAA;AAClC,QAAA,IAAI,CAAC,oBAAoB,GAAG,OAAO;IACrC;AAEA;;;;;;;;;AASG;IACI,aAAa,CAClB,SAAiB,EACjB,SAAiF,EACjF,OAA6B,EAC7B,UAAmC,EAAE,EAAA;QAErC,IAAI,CAAC,UAAU,EAAE;;AAEjB,QAAA,IAAI,CAAC,oBAAoB,CAAC,SAAS,IAAI,EAAE,CAAC;AAC1C,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AAEjC,QAAA,MAAM,EAAE,GAAW,SAAS,IAAI,CAAA,QAAA,EAAW,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE,CAAC;AACxD,QAAA,MAAM,gBAAgB,GAAY,SAAS,YAAY,UAAU,GAAG,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC;QACxG,MAAM,cAAc,GAAgB,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACvE,QAAA,MAAM,YAAY,GAAmC;;YAEnD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS;YAC7D,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ;YAC1D,UAAU,EAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU;SAC1G;;QAGD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;;AAGzC,QAAA,MAAM,QAAQ,GAAoB;YAChC,EAAE;AACF,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,SAAS,EAAE,gBAA0D;AACrE,YAAA,MAAM,EAAE,YAAY,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC;SACnE;;QAGD,KAAK,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC;;AAGnD,QAAA,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,gBAA+B,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,MAAO,EAAE,CAAC;;QAGxG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC;AAEvC,QAAA,OAAO,QAAQ;IACjB;AAEA;;;;;;;;;;;AAWG;AACI,IAAA,iCAAiC,CACtC,SAAiB,EACjB,SAAiF,EACjF,SAA8C,EAC9C,MAAmB,EACnB,iBAA4C,EAC5C,OAAA,GAAmC,EAAE,EACrC,iBAAwC,EAAE,EAAA;QAE1C,IAAI,CAAC,UAAU,EAAE;;AAEjB,QAAA,IAAI,CAAC,oBAAoB,CAAC,SAAS,IAAI,EAAE,CAAC;AAC1C,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AAEjC,QAAA,MAAM,gBAAgB,GAAY,SAAS,YAAY,UAAU,GAAG,SAAS,CAAC,aAAa,GAAG,SAAS;AACvG,QAAA,MAAM,cAAc,GAAgB,IAAI,CAAC,oBAAoB,EAAE;;QAG/D,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,IAAI,IAAI,CAAC,oBAAoB;QACvE,MAAM,cAAc,GAAG,yBAAyB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;AAE7E,QAAA,MAAM,kBAAkB,GAAoB,eAAe,CAAC,SAAS,EAAE;AACrE,YAAA,mBAAmB,EAAE,cAAc;AACnC,YAAA,WAAW,EAAE,cAAc;AAC5B,SAAA,CAAC;AAEF,QAAA,MAAM,YAAY,GAAmC;YACnD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS;YAC7D,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ;YAC1D,UAAU,EAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU;SAC1G;;QAGD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;;QAGzC,IAAI,MAAM,EAAE;AACV,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACjD,gBAAA,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;YACzC;QACF;;QAGA,IAAI,iBAAiB,EAAE;AACrB,YAAA,IAAI,CAAC,wBAAwB,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;QACtE;;AAGA,QAAA,kBAAkB,CAAC,iBAAiB,CAAC,aAAa,EAAE;;QAGpD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC;;AAGzD,QAAA,MAAM,QAAQ,GAAoB;AAChC,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,SAAS,EAAE,gBAA0D;AACrE,YAAA,YAAY,EAAE,kBAA2C;AACzD,YAAA,MAAM,EAAE,YAAY,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC;SACnE;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAE;AACtD,QAAA,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;;QAG/D,KAAK,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC;;AAGnD,QAAA,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,gBAA+B,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,MAAO,EAAE,CAAC;;QAGxG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;AAE9C,QAAA,OAAO,QAAQ;IACjB;AAEA;;;;;;;;;;AAUG;AACI,IAAA,sBAAsB,CAC3B,SAAiB,EACjB,SAAiF,EACjF,SAA8C,EAC9C,MAAmB,EACnB,OAAA,GAAmC,EAAE,EACrC,iBAAwC,EAAE,EAAA;QAE1C,IAAI,CAAC,UAAU,EAAE;;AAEjB,QAAA,IAAI,CAAC,oBAAoB,CAAC,SAAS,IAAI,EAAE,CAAC;AAC1C,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AAEjC,QAAA,MAAM,gBAAgB,GAAY,SAAS,YAAY,UAAU,GAAG,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC;QACxG,MAAM,cAAc,GAAgB,IAAI,CAAC,oBAAoB,EAAE,CAAC;;QAGhE,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,IAAI,IAAI,CAAC,oBAAoB;QACvE,MAAM,cAAc,GAAG,yBAAyB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;AAE7E,QAAA,MAAM,kBAAkB,GAAoB,eAAe,CAAC,SAAS,EAAE;AACrE,YAAA,mBAAmB,EAAE,cAAc;AACnC,YAAA,WAAW,EAAE,cAAc;SAC5B,CAAC,CAAC;AACH,QAAA,MAAM,YAAY,GAAmC;;YAEnD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS;YAC7D,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ;YAC1D,UAAU,EAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU;SAC1G;;QAGD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;;QAGzC,IAAI,MAAM,EAAE;AACV,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACjD,gBAAA,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;YACzC;QACF;;AAGA,QAAA,kBAAkB,CAAC,iBAAiB,CAAC,aAAa,EAAE;;QAGpD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC;;AAGzD,QAAA,MAAM,QAAQ,GAAoB;AAChC,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,SAAS,EAAE,gBAA0D;AACrE,YAAA,YAAY,EAAE,kBAA2C;AACzD,YAAA,MAAM,EAAE,YAAY,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC;SACnE;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAE;AACtD,QAAA,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;;QAG/D,KAAK,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC;;AAGnD,QAAA,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,gBAA+B,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC,MAAO,EAAE,CAAC;;QAGxG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;AAE9C,QAAA,OAAO,QAAQ;IACjB;AAEA;;;;AAIG;AACI,IAAA,cAAc,CAAC,EAAU,EAAA;;QAE9B,MAAM,QAAQ,GAAgC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAE3E,IAAI,CAAC,QAAQ,EAAE;YACb;QACF;;AAGA,QAAA,QAAQ,CAAC,OAAO,IAAI;;AAGpB,QAAA,IAAI,QAAQ,CAAC,YAAY,EAAE;YACzB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC;AAC5D,YAAA,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE;QACjC;;QAGA,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE;AACnD,YAAA,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;QAC3B;;AAGA,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;IAClC;AAEA;;AAEG;IACI,kBAAkB,GAAA;QACvB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE;AAC7C,YAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzB;IACF;AACA;;;;;AAKG;AACK,IAAA,oBAAoB,CAAC,OAA2C,EAAA;;QAEtE,MAAM,cAAc,GAAgB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;;AAGtE,QAAA,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;;QAGvC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,cAAc;QACvB;AAEA,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,YAAA,cAAc,CAAC,SAAS,GAAG,OAAO;QACpC;aAAO;AACL,YAAA,MAAM,OAAO,GAAG,OAAO,YAAY,UAAU,GAAG,OAAO,CAAC,aAAa,GAAG,OAAO;AAE/E,YAAA,cAAc,CAAC,MAAM,CAAC,OAAsB,CAAC;QAC/C;AAEA,QAAA,OAAO,cAAc;IACvB;AAEA;;;;AAIG;AACK,IAAA,oBAAoB,CAAC,EAAU,EAAA;QACrC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzB;IACF;AAEA;;;;;;AAMG;AACK,IAAA,MAAM,iBAAiB,CAC7B,QAAyB,EACzB,UAA0C,EAAE,EAAA;;QAG5C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO;AAEnD,QAAA,IAAI;;AAEF,YAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE;gBAC3E,SAAS;gBACT,QAAQ;gBACR,UAAU;AACX,aAAA,CAAC;;YAGF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;AACpC,gBAAA,QAAQ,EAAE,QAAQ;gBAClB,GAAG,EAAE,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;gBACb,IAAI,EAAE,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;AACf,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC;QACnD;IACF;AAEA;;;;;AAKG;IACK,wBAAwB,CAC9B,YAA6B,EAC7B,iBAA2C,EAAA;AAE3C,QAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAe;;AAGtD,QAAA,IAAI,iBAAiB,CAAC,SAAS,EAAE;YAC/B,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,iBAAiB,CAAC,SAAS,CAAC;QACrG;AAEA,QAAA,IAAI,iBAAiB,CAAC,OAAO,EAAE;YAC7B,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,OAAO,CAAC;QACjG;AAEA,QAAA,IAAI,iBAAiB,CAAC,KAAK,EAAE;YAC3B,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,KAAK,CAAC;QAC7F;IACF;AAEA;;;;;;AAMG;AACK,IAAA,oBAAoB,CAC1B,iBAAsB,EACtB,cAAsB,EACtB,OAAsC,EAAA;;AAGtC,QAAA,iBAAiB,CAAC,cAAc,CAAC,GAAG,IAAI;;AAGxC,QAAA,IAAI,OAAO,YAAY,WAAW,EAAE;AAClC,YAAA,iBAAiB,CAAC,CAAA,EAAG,cAAc,UAAU,CAAC,GAAG,OAAO;QAC1D;AAAO,aAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;;AAEtC,YAAA,iBAAiB,CAAC,CAAA,EAAG,cAAc,MAAM,CAAC,GAAG,OAAO;QACtD;IACF;AAEA;;;;;;;;;;;AAWG;AACK,IAAA,cAAc,CAAC,UAA6B,EAAA;;;QAIlD,MAAM,WAAW,GAAiB,EAAE;AACpC,QAAA,MAAM,KAAK,GAAgC;YACzC,QAAQ;YACR,OAAO;YACP,MAAM;YACN,OAAO;YACP,MAAM;YACN,eAAe;YACf,QAAQ;YACR,MAAM;YACN,gBAAgB;SACjB;;AAGD,QAAA,KAAK,MAAM,GAAG,IAAI,KAAoC,EAAE;AACtD,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACpB;YACF;YAEA,QAAQ,GAAG;gBACT,KAAK,QAAQ,EAAE;oBACb,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC3C;gBACF;gBAEA,KAAK,OAAO,EAAE;oBACZ,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBACzC;gBACF;gBAEA,KAAK,MAAM,EAAE;oBACX,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACvC;gBACF;gBAEA,KAAK,OAAO,EAAE;oBACZ,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAM,CAAC,CAAC;oBAC1C;gBACF;gBAEA,KAAK,MAAM,EAAE;oBACX,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACvC;gBACF;gBAEA,KAAK,eAAe,EAAE;oBACpB,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;oBACzD;gBACF;gBAEA,KAAK,MAAM,EAAE;oBACX,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACvC;gBACF;gBAEA,KAAK,QAAQ,EAAE;oBACb,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC3C;gBACF;gBAEA,KAAK,gBAAgB,EAAE;AACrB,oBAAA,MAAM,kBAAkB,GAAe;AACrC,wBAAA,IAAI,EAAE,gBAAgB;wBACtB,MAAM,EAAE,CAAC,KAAK,EAAA;4BACZ,MAAM,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC;AACtD,4BAAA,OAAO,EAAE;wBACX,CAAC;qBACF;AACD,oBAAA,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC;oBACpC;gBACF;;QAEJ;AAEA,QAAA,OAAO,WAAW;IACpB;uGAnkBW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC1CD;;;AAGG;MAKmB,oBAAoB,CAAA;IAC/B,SAAS,GAAW,EAAE;AACtB,IAAA,aAAa,GAAW,GAAG,CAAC;IAC5B,cAAc,GAAY,IAAI;AAE7B,IAAA,UAAU,GAAG,IAAI,YAAY,EAAc;AAC3C,IAAA,UAAU,GAAG,IAAI,YAAY,EAAc;AAC3C,IAAA,aAAa,GAAG,IAAI,YAAY,EAAQ;AAE/B,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE1C,WAAW,GAAG,KAAK;IAE3B,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE;YACzC,IAAI,CAAC,kBAAkB,EAAE;QAC3B;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;QACvD;IACF;AAEU,IAAA,YAAY,CAAC,KAAiB,EAAA;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEU,IAAA,YAAY,CAAC,KAAiB,EAAA;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,kBAAkB,EAAE;QAC3B;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;AAClD,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;QAC3B;IACF;IAEQ,kBAAkB,GAAA;QACxB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACvC,YAAA,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;QACzE;IACF;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;QACvD;IACF;uGAzDoB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,+QAH9B,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGQ,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;oBACT,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA;;sBAEE;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;;ACKG,MAAO,oBAAqB,SAAQ,oBAAoB,CAAA;AACnD,IAAA,IAAI;IACJ,UAAU,GAAY,IAAI;AACzB,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;IAE9B,iBAAiB,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACvD,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEjD,IAAA,SAAS;IACT,kBAAkB,GAAG,IAAI;IAE1B,QAAQ,GAAA;AACf,QAAA,KAAK,CAAC,QAAQ,EAAE,CAAC;AAEjB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS;AACpC,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;QACjC;aAAO,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,UAAU,EAAE;YACpD,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,iBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;YAC3D,IAAI,EAAE,GAAG,IAAG;AACV,gBAAA,IAAI,CAAC,SAAS,GAAG,GAAG;AACpB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB,CAAC;AACF,SAAA,CAAC;IACJ;AAEA,IAAA,IAAc,gBAAgB,GAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;IAC5G;AAEA,IAAA,IAAc,aAAa,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI;IACvD;AAEU,IAAA,OAAO,CAAC,KAAiB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;IAC1B;AAEU,IAAA,OAAO,CAAC,KAAiB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;IAC1B;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;uGAtDW,oBAAoB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBjC,+7CA0CA,EAAA,MAAA,EAAA,CAAA,uwDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACE,kBAAkB,EAAA,eAAA,EAGX,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,+7CAAA,EAAA,MAAA,EAAA,CAAA,uwDAAA,CAAA,EAAA;;sBAGpC;;sBACA;;sBACA;;;AEHG,MAAO,uBAAwB,SAAQ,oBAAoB,CAAA;AACtD,IAAA,IAAI;IACJ,UAAU,GAAY,IAAI;IAC1B,iBAAiB,GAAY,KAAK;IAClC,eAAe,GAAY,IAAI;AAC/B,IAAA,sBAAsB,GAAa,CAAC,WAAW,EAAE,YAAY,CAAC;IAC9D,kBAAkB,GAAY,KAAK;IACnC,YAAY,GAAY,IAAI;AAE3B,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAW;AACzC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAQ;IAE/B,iBAAiB,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACvD,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEjD,IAAA,SAAS;IACT,kBAAkB,GAAG,IAAI;IAE1B,QAAQ,GAAA;AACf,QAAA,KAAK,CAAC,QAAQ,EAAE,CAAC;AAEjB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS;AACpC,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;QACjC;aAAO,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,UAAU,EAAE;YACpD,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,iBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;YAC3D,IAAI,EAAE,GAAG,IAAG;AACV,gBAAA,IAAI,CAAC,SAAS,GAAG,GAAG;AACpB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB,CAAC;AACF,SAAA,CAAC;IACJ;AAEA,IAAA,IAAc,iBAAiB,GAAA;QAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU;AACzC,QAAA,OAAO,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;IACzD;AAEA,IAAA,IAAc,kBAAkB,GAAA;QAC9B,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC3D,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB;QACrC;AACA,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,IAAc,uBAAuB,GAAA;QACnC,QACE,IAAI,CAAC,eAAe;YACpB,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACxD,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,mBAAmB;IAE1C;AAEU,IAAA,OAAO,CAAC,KAAiB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;IAC1B;AAEU,IAAA,OAAO,CAAC,KAAiB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;IAC1B;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEU,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;IACnD;IAEU,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;IACzB;uGAlFW,uBAAuB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBpC,qtEA4DA,EAAA,MAAA,EAAA,CAAA,gwFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvCY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEX,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBARnC,SAAS;+BACE,qBAAqB,EAAA,eAAA,EAGd,uBAAuB,CAAC,MAAM,cACnC,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,qtEAAA,EAAA,MAAA,EAAA,CAAA,gwFAAA,CAAA,EAAA;;sBAGtB;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;;AEWH,IAAY,QAMX;AAND,CAAA,UAAY,QAAQ,EAAA;AAClB,IAAA,QAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,QAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,QAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,QAAA,CAAA,IAAA,CAAA,GAAA,mBAAwB;AACxB,IAAA,QAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACb,CAAC,EANW,QAAQ,KAAR,QAAQ,GAAA,EAAA,CAAA,CAAA;;MCVP,gBAAgB,CAAA;;AAE3B;;AAEG;AAEa,IAAA,IAAI;AAEpB;;AAEG;AACa,IAAA,KAAK,GAAG,KAAK,CAAa,WAAW,iDAAC;;AAGtD;;AAEG;IACa,UAAU,GAAG,MAAM,EAAwD;AAE3F;;AAEG;IACa,kBAAkB,GAAG,MAAM,EAIvC;AAEJ;;AAEG;IACa,WAAW,GAAG,MAAM,EAAwD;;AAG3E,IAAA,GAAG,GAAgB,MAAM,CAAC,WAAW,CAAC;AACtC,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,MAAM,GAAkB,MAAM,CAAC,aAAa,CAAC;AAC7C,IAAA,oBAAoB,GAA0B,MAAM,CAAC,qBAAqB,CAAC;AACzE,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;IAGvC,KAAK,GAAoB,QAAQ;AAC1C,IAAA,SAAS;AACT,IAAA,OAAO;AACP,IAAA,GAAG;AACH,IAAA,IAAI;AACJ,IAAA,MAAM;;IAGN,iBAAiB,GAAW,CAAC;IAC7B,WAAW,GAAW,CAAC;IACvB,oBAAoB,GAAY,KAAK;;AAG/C,IAAA,IAAc,QAAQ,GAAA;QACpB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE;AACrC,YAAA,OAAO,IAAI,CAAC,mBAAmB,EAAE;QACnC;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAc,WAAW,GAAA;QACvB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,EAAE,EAAE;AAC3E,YAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE;QACtC;AACA,QAAA,OAAO,IAAI;IACb;;IAGO,QAAQ,GAAA;QACb,IAAI,CAAC,aAAa,EAAE;IACtB;AAEU,IAAA,OAAO,CAAC,CAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;IAClC;AAEU,IAAA,OAAO,CAAC,CAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;IAChC;;AAGA,IAAA,IAAc,KAAK,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,MAAM;cACd,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;kBACpB,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;kBACtE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAClB,cAAE,SAAS,CAAC;IAChB;AAEA,IAAA,IAAc,UAAU,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5C,YAAA,OAAO,EAAE;QACX;QAEA,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;AAC/D,YAAA,UAAU,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACtD;AACA,QAAA,OAAO,UAAU;IACnB;;IAGQ,aAAa,GAAA;QACnB,IAAI,CAAC,QAAQ,EAAE;QACf,IAAI,CAAC,YAAY,EAAE;;IAErB;IAEQ,QAAQ,GAAA;AACd,QAAA,MAAM,MAAM,GAAa,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;;AAExE,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;QAC5B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;IAC/B;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,eAAe,GAAoB,IAAI,CAAC,GAAG,CAAC,eAAe;AACjE,QAAA,MAAM,OAAO,GAA8B;;YAEzC,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO;;AAEjE,YAAA,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE;SACvB;AAED,QAAA,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,EAAE;YACrC;QACF;AAEA,QAAA,eAAe,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,YAAoB,KAAU;AACnF,YAAA,IAAI,CAAC,SAAS,GAAG,YAAY;AAC7B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC,CAAC;IACJ;;IAGU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,SAAA,CAAC;IACJ;AAEU,IAAA,oBAAoB,CAAC,QAAiB,EAAA;AAC9C,QAAA,IAAI,CAAC,oBAAoB,GAAG,QAAQ;AACpC,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,oBAAoB;AACpC,SAAA,CAAC;IACJ;IAEU,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,SAAA,CAAC;IACJ;;IAGQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,MAAM,GAAa,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACxE,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE;QAE5B,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;AAChB,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,GAAG,EAAE,GAAG;AACR,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACrD,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B;IACH;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,MAAM,GAAa,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACxE,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;;QAGzB,IAAI,UAAU,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;AACnC,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ;YACtF,UAAU,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE;QAC/C;QAEA,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;AAChB,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,UAAU,EAAE,UAAU;YACtB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,GAAG,mBAAmB,GAAG,SAAS;YACtE,eAAe,EAAE,IAAI,CAAC,oBAAoB;SAC3C;IACH;uGAvMW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,kbCnC7B,+wBA2BA,EAAA,MAAA,EAAA,CAAA,ilEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,sHAAE,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,oBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAI1D,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,CAAC,EAAA,QAAA,EAAA,+wBAAA,EAAA,MAAA,EAAA,CAAA,ilEAAA,CAAA,EAAA;;sBASrE;;;AEnCH;;;AAGG;MAEU,qBAAqB,CAAA;IACxB,gBAAgB,GAAW,EAAE;AAC7B,IAAA,OAAO;AACE,IAAA,UAAU;AAE3B,IAAA,WAAA,CAAwC,UAA8B,EAAA;AACpE,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;AAEA;;;AAGG;AACH,IAAA,WAAW,CAAI,MAAwB,EAAA;AACrC,QAAA,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM;AACrC,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAE7B,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;AAEvE,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;AAC1B,YAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC7D,gBAAA,YAAY,CAAC,QAAgB,CAAC,GAAG,CAAC,GAAG,KAAK;AAC7C,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,CAAC,aAAa,EAAE;AACxB,YAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,KAAI;AAC9D,gBAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAe;AAC7C,gBAAA,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,UAAU,EAAE;oBAClE,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;gBAClC;AACF,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC;AAC1F,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;QAE3D,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YACtC,SAAS;AACT,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,OAAO,EAAE;wBACP,MAAM;AACP,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,OAAO,EAAE;AACP,wBAAA,kBAAkB,EAAE,EAAE;AACvB,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;IAC5C;AAEA;;;AAGG;AACH,IAAA,WAAW,CAAC,MAAc,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,MAAM,EAAE;AACpC,YAAA,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC;QAC5C;IACF;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC;AAC1C,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;IAC5B;AA3EW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,kBAKZ,kBAAkB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAL3B,qBAAqB,EAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC;;0BAMc,MAAM;2BAAC,kBAAkB;;;ACRxC;;;AAGG;MAEU,2BAA2B,CAAA;AACrB,IAAA,UAAU;AACV,IAAA,aAAa;IAE9B,WAAA,CACuB,UAAuB,EACb,aAAoC,EAAA;AAEnE,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa;IACpC;AAEA;;;;;AAKG;IACH,kBAAkB,CAAC,IAAmB,EAAE,SAAsB,EAAA;AAC5D,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;QAC7C;AAEA,QAAA,MAAM,eAAe,GAAqB;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;SAChC;AAED,QAAA,MAAM,aAAa,GAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAAC,eAAe,CAAE;QAExF,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,YAAY,GAAG,CAAC,EAAE;AACjD,YAAA,OAAO,KAAK;QACd;aAAO;AACL,YAAA,OAAO,QAAQ;QACjB;IACF;AAEA;;;;AAIG;AACH,IAAA,eAAe,CAAC,IAAmB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;AACxB,YAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QACf;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,OAAc;AAC/D,YAAA,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,EAAE;AACpD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAiC;AACrD,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAA0C;YACtE,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,cAAc,CAAC;AAE1E,YAAA,OAAO,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5B;AAEA,QAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACf;uGA1DW,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAK5B,WAAW,EAAA,EAAA,EAAA,KAAA,EACX,qBAAqB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GANpB,2BAA2B,EAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC;;0BAMI,MAAM;2BAAC,WAAW;;0BAClB,MAAM;2BAAC,qBAAqB;;;AChBjC;;;AAGG;MACmB,0BAA0B,CAAA;AAQ/C;AAED;;;;AAIG;AACG,MAAgB,uBAAiC,SAAQ,0BAG9D,CAAA;AAAG;AAEJ;;;;AAIG;AACG,MAAgB,0BAAoC,SAAQ,0BAGjE,CAAA;AAAG;;AClCJ;;AAEG;;ACFH;;AAEG;;;;"}
@@ -4,10 +4,11 @@ import { inject, ElementRef, input, signal, effect, ChangeDetectionStrategy, Vie
4
4
  import { DomSanitizer } from '@angular/platform-browser';
5
5
  import { map, shareReplay } from 'rxjs';
6
6
 
7
+ const iconCache = new Map();
7
8
  class SvgIconComponent {
8
9
  // DI
9
10
  http = inject(HttpClient);
10
- cache = new Map();
11
+ cache = iconCache;
11
12
  sanitizer = inject(DomSanitizer);
12
13
  elementRef = inject(ElementRef);
13
14
  // INPUTS / OUTPUTS
@@ -1 +1 @@
1
- {"version":3,"file":"3ddv-software-division-components-generic-icon.mjs","sources":["../../generic/icon/icon.component.ts","../../generic/icon/icon.component.html","../../generic/icon/lib/ui-icon-helm/src/lib/hlm-icon.token.ts","../../generic/icon/lib/ui-icon-helm/src/lib/hlm-icon.ts","../../generic/icon/lib/ui-icon-helm/src/index.ts","../../generic/icon/public-api.ts","../../generic/icon/3ddv-software-division-components-generic-icon.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { map, Observable, shareReplay } from 'rxjs';\n\n@Component({\n selector: 'sdc-svg-icon',\n templateUrl: './icon.component.html',\n styleUrl: './icon.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'className()',\n },\n})\nexport class SvgIconComponent {\n // DI\n private readonly http = inject(HttpClient);\n private readonly cache = new Map<string, Observable<string>>();\n private readonly sanitizer = inject(DomSanitizer);\n private readonly elementRef = inject(ElementRef);\n\n // INPUTS / OUTPUTS\n public readonly name = input.required<string>();\n public readonly iconFolder = input<string>();\n public readonly className = input<string>('');\n public readonly color = input<string>('currentColor');\n public readonly strokeWidth = input<number>(1);\n\n // STATE\n public readonly svgContent = signal<SafeHtml | null>(null);\n\n public constructor() {\n effect(() => {\n this.getIcon(this.name()).subscribe({\n next: svg => {\n const element = this.elementRef.nativeElement as HTMLElement;\n\n // Apply dynamic properties\n element.style.setProperty('--icon-color', this.resolveColor(this.color()));\n element.style.setProperty('--icon-stroke-width', this.strokeWidth().toString());\n\n this.svgContent.set(this.sanitizer.bypassSecurityTrustHtml(svg));\n },\n error: (error: unknown) => {\n console.error('Failed to load icon:', error);\n // Optional: set a minimal fallback SVG or clear content\n this.svgContent.set(\n this.sanitizer.bypassSecurityTrustHtml(\n `<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 8v4m0 4h.01\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/></svg>`\n )\n );\n },\n });\n });\n }\n\n public getIcon(name: string): Observable<string> {\n if (!this.cache.has(name)) {\n const folder = this.iconFolder() ?? 'assets';\n const icon$ = this.http.get(`/${folder}/${name}.svg`, { responseType: 'text' }).pipe(\n map(svg => this.sanitizeSvg(svg)),\n shareReplay({ bufferSize: 1, refCount: true })\n );\n\n this.cache.set(name, icon$);\n }\n\n return this.cache.get(name)!;\n }\n\n private sanitizeSvg(svg: string): string {\n return (\n svg\n // Remove any existing width/height attributes to make the SVG more flexible\n .replace(/\\swidth=\"[^\"]*\"/g, '')\n .replace(/\\sheight=\"[^\"]*\"/g, '')\n // Strip hardcoded fill/stroke so CSS variable takes effect\n .replace(/\\sfill=\"(?!none)[^\"]*\"/g, '')\n .replace(/\\sstroke=\"(?!none)[^\"]*\"/g, '')\n );\n }\n\n /**\n * Resolves the color input to a valid CSS value.\n * - Already-valid CSS values (var(), #hex, rgb(), hsl(), currentColor) pass through unchanged.\n * - A raw CSS variable name starting with \"--\" is wrapped: \"--my-var\" → \"var(--my-var)\".\n * - Any other string is treated as a design-token name and resolved via the\n * \"--color-\" prefix convention: \"accent\" → \"var(--color-accent)\".\n */\n private resolveColor(color: string): string {\n const passThroughPrefixes = ['currentColor', 'var(', '#', 'rgb(', 'rgba(', 'hsl(', 'hsla('];\n\n if (passThroughPrefixes.some(prefix => color.startsWith(prefix))) {\n return color;\n }\n\n if (color.startsWith('--')) {\n return `var(${color})`;\n }\n\n return `var(--color-${color})`;\n }\n}\n","@if (svgContent(); as content) {\n <span class=\"inline-block app-svg-icon\" [innerHTML]=\"content\"></span>\n}\n","import { InjectionToken, ValueProvider, inject } from '@angular/core';\nimport type { IconSize } from './hlm-icon';\n\nexport interface HlmIconConfig {\n size: IconSize;\n}\n\nconst defaultConfig: HlmIconConfig = {\n size: 'base',\n};\n\nconst HlmIconConfigToken = new InjectionToken<HlmIconConfig>('HlmIconConfig');\n\nexport function provideHlmIconConfig(config: Partial<HlmIconConfig>): ValueProvider {\n return { provide: HlmIconConfigToken, useValue: { ...defaultConfig, ...config } };\n}\n\nexport function injectHlmIconConfig(): HlmIconConfig {\n return inject(HlmIconConfigToken, { optional: true }) ?? defaultConfig;\n}\n","import { Directive, computed, input } from '@angular/core';\nimport { injectHlmIconConfig } from './hlm-icon.token';\n\nexport type IconSize = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | 'none' | (Record<never, never> & string);\n\n@Directive({\n selector: 'ng-icon[hlm]',\n standalone: true,\n host: {\n '[style.--ng-icon__size]': '_computedSize()',\n },\n})\nexport class HlmIcon {\n private readonly _config = injectHlmIconConfig();\n public readonly size = input<IconSize>(this._config.size);\n public readonly variant = input<'light' | 'dark'>('light');\n\n protected readonly _computedSize = computed(() => {\n const size = this.size();\n\n switch (size) {\n case 'xs':\n return '12px';\n case 'sm':\n return '16px';\n case 'base':\n return '24px';\n case 'lg':\n return '32px';\n case 'xl':\n return '48px';\n default: {\n return size;\n }\n }\n });\n}\n","import { NgModule } from '@angular/core';\nimport { HlmIcon } from './lib/hlm-icon';\n\nexport * from './lib/hlm-icon';\nexport * from './lib/hlm-icon.token';\n\n@NgModule({\n imports: [HlmIcon],\n exports: [HlmIcon],\n})\nexport class HlmIconModule {}\n","/*\n * Public API Surface of software-division-components\n */\n\nexport * from './icon.component';\nexport { HlmIcon, HlmIconModule } from './lib/ui-icon-helm/src';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"3ddv-software-division-components-generic-icon.mjs","sources":["../../generic/icon/icon.component.ts","../../generic/icon/icon.component.html","../../generic/icon/lib/ui-icon-helm/src/lib/hlm-icon.token.ts","../../generic/icon/lib/ui-icon-helm/src/lib/hlm-icon.ts","../../generic/icon/lib/ui-icon-helm/src/index.ts","../../generic/icon/public-api.ts","../../generic/icon/3ddv-software-division-components-generic-icon.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { map, Observable, shareReplay } from 'rxjs';\n\nconst iconCache = new Map<string, Observable<string>>();\n\n@Component({\n selector: 'sdc-svg-icon',\n templateUrl: './icon.component.html',\n styleUrl: './icon.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'className()',\n },\n})\nexport class SvgIconComponent {\n // DI\n private readonly http = inject(HttpClient);\n private readonly cache = iconCache;\n private readonly sanitizer = inject(DomSanitizer);\n private readonly elementRef = inject(ElementRef);\n\n // INPUTS / OUTPUTS\n public readonly name = input.required<string>();\n public readonly iconFolder = input<string>();\n public readonly className = input<string>('');\n public readonly color = input<string>('currentColor');\n public readonly strokeWidth = input<number>(1);\n\n // STATE\n public readonly svgContent = signal<SafeHtml | null>(null);\n\n public constructor() {\n effect(() => {\n this.getIcon(this.name()).subscribe({\n next: svg => {\n const element = this.elementRef.nativeElement as HTMLElement;\n\n // Apply dynamic properties\n element.style.setProperty('--icon-color', this.resolveColor(this.color()));\n element.style.setProperty('--icon-stroke-width', this.strokeWidth().toString());\n\n this.svgContent.set(this.sanitizer.bypassSecurityTrustHtml(svg));\n },\n error: (error: unknown) => {\n console.error('Failed to load icon:', error);\n // Optional: set a minimal fallback SVG or clear content\n this.svgContent.set(\n this.sanitizer.bypassSecurityTrustHtml(\n `<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 8v4m0 4h.01\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/></svg>`\n )\n );\n },\n });\n });\n }\n\n public getIcon(name: string): Observable<string> {\n if (!this.cache.has(name)) {\n const folder = this.iconFolder() ?? 'assets';\n const icon$ = this.http.get(`/${folder}/${name}.svg`, { responseType: 'text' }).pipe(\n map(svg => this.sanitizeSvg(svg)),\n shareReplay({ bufferSize: 1, refCount: true })\n );\n\n this.cache.set(name, icon$);\n }\n\n return this.cache.get(name)!;\n }\n\n private sanitizeSvg(svg: string): string {\n return (\n svg\n // Remove any existing width/height attributes to make the SVG more flexible\n .replace(/\\swidth=\"[^\"]*\"/g, '')\n .replace(/\\sheight=\"[^\"]*\"/g, '')\n // Strip hardcoded fill/stroke so CSS variable takes effect\n .replace(/\\sfill=\"(?!none)[^\"]*\"/g, '')\n .replace(/\\sstroke=\"(?!none)[^\"]*\"/g, '')\n );\n }\n\n /**\n * Resolves the color input to a valid CSS value.\n * - Already-valid CSS values (var(), #hex, rgb(), hsl(), currentColor) pass through unchanged.\n * - A raw CSS variable name starting with \"--\" is wrapped: \"--my-var\" → \"var(--my-var)\".\n * - Any other string is treated as a design-token name and resolved via the\n * \"--color-\" prefix convention: \"accent\" → \"var(--color-accent)\".\n */\n private resolveColor(color: string): string {\n const passThroughPrefixes = ['currentColor', 'var(', '#', 'rgb(', 'rgba(', 'hsl(', 'hsla('];\n\n if (passThroughPrefixes.some(prefix => color.startsWith(prefix))) {\n return color;\n }\n\n if (color.startsWith('--')) {\n return `var(${color})`;\n }\n\n return `var(--color-${color})`;\n }\n}\n","@if (svgContent(); as content) {\n <span class=\"inline-block app-svg-icon\" [innerHTML]=\"content\"></span>\n}\n","import { InjectionToken, ValueProvider, inject } from '@angular/core';\nimport type { IconSize } from './hlm-icon';\n\nexport interface HlmIconConfig {\n size: IconSize;\n}\n\nconst defaultConfig: HlmIconConfig = {\n size: 'base',\n};\n\nconst HlmIconConfigToken = new InjectionToken<HlmIconConfig>('HlmIconConfig');\n\nexport function provideHlmIconConfig(config: Partial<HlmIconConfig>): ValueProvider {\n return { provide: HlmIconConfigToken, useValue: { ...defaultConfig, ...config } };\n}\n\nexport function injectHlmIconConfig(): HlmIconConfig {\n return inject(HlmIconConfigToken, { optional: true }) ?? defaultConfig;\n}\n","import { Directive, computed, input } from '@angular/core';\nimport { injectHlmIconConfig } from './hlm-icon.token';\n\nexport type IconSize = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | 'none' | (Record<never, never> & string);\n\n@Directive({\n selector: 'ng-icon[hlm]',\n standalone: true,\n host: {\n '[style.--ng-icon__size]': '_computedSize()',\n },\n})\nexport class HlmIcon {\n private readonly _config = injectHlmIconConfig();\n public readonly size = input<IconSize>(this._config.size);\n public readonly variant = input<'light' | 'dark'>('light');\n\n protected readonly _computedSize = computed(() => {\n const size = this.size();\n\n switch (size) {\n case 'xs':\n return '12px';\n case 'sm':\n return '16px';\n case 'base':\n return '24px';\n case 'lg':\n return '32px';\n case 'xl':\n return '48px';\n default: {\n return size;\n }\n }\n });\n}\n","import { NgModule } from '@angular/core';\nimport { HlmIcon } from './lib/hlm-icon';\n\nexport * from './lib/hlm-icon';\nexport * from './lib/hlm-icon.token';\n\n@NgModule({\n imports: [HlmIcon],\n exports: [HlmIcon],\n})\nexport class HlmIconModule {}\n","/*\n * Public API Surface of software-division-components\n */\n\nexport * from './icon.component';\nexport { HlmIcon, HlmIconModule } from './lib/ui-icon-helm/src';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAcA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B;MAY1C,gBAAgB,CAAA;;AAEV,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;IACzB,KAAK,GAAG,SAAS;AACjB,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGhC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAU;IAC/B,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC5B,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;AAC7B,IAAA,KAAK,GAAG,KAAK,CAAS,cAAc,iDAAC;AACrC,IAAA,WAAW,GAAG,KAAK,CAAS,CAAC,uDAAC;;AAG9B,IAAA,UAAU,GAAG,MAAM,CAAkB,IAAI,sDAAC;AAE1D,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC;gBAClC,IAAI,EAAE,GAAG,IAAG;AACV,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAA4B;;AAG5D,oBAAA,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1E,oBAAA,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC;AAE/E,oBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;gBAClE,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,KAAc,KAAI;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC;;oBAE5C,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB,IAAI,CAAC,SAAS,CAAC,uBAAuB,CACpC,CAAA;AAC0G,uHAAA,CAAA,CAC3G,CACF;gBACH,CAAC;AACF,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEO,IAAA,OAAO,CAAC,IAAY,EAAA;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,QAAQ;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,CAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAClF,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EACjC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;QAC7B;QAEA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE;IAC9B;AAEQ,IAAA,WAAW,CAAC,GAAW,EAAA;AAC7B,QAAA,QACE;;AAEG,aAAA,OAAO,CAAC,kBAAkB,EAAE,EAAE;AAC9B,aAAA,OAAO,CAAC,mBAAmB,EAAE,EAAE;;AAE/B,aAAA,OAAO,CAAC,yBAAyB,EAAE,EAAE;AACrC,aAAA,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;IAE/C;AAEA;;;;;;AAMG;AACK,IAAA,YAAY,CAAC,KAAa,EAAA;AAChC,QAAA,MAAM,mBAAmB,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAE3F,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE;AAChE,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC1B,OAAO,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,CAAG;QACxB;QAEA,OAAO,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,CAAG;IAChC;uGAxFW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,uwBC1B7B,oHAGA,EAAA,MAAA,EAAA,CAAA,kKAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDuBa,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAV5B,SAAS;+BACE,cAAc,EAAA,aAAA,EAGT,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,aAAa;AACzB,qBAAA,EAAA,QAAA,EAAA,oHAAA,EAAA,MAAA,EAAA,CAAA,kKAAA,CAAA,EAAA;;;AEjBH,MAAM,aAAa,GAAkB;AACnC,IAAA,IAAI,EAAE,MAAM;CACb;AAED,MAAM,kBAAkB,GAAG,IAAI,cAAc,CAAgB,eAAe,CAAC;AAEvE,SAAU,oBAAoB,CAAC,MAA8B,EAAA;AACjE,IAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,EAAE;AACnF;SAEgB,mBAAmB,GAAA;AACjC,IAAA,OAAO,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,aAAa;AACxE;;MCPa,OAAO,CAAA;IACD,OAAO,GAAG,mBAAmB,EAAE;IAChC,IAAI,GAAG,KAAK,CAAW,IAAI,CAAC,OAAO,CAAC,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACzC,IAAA,OAAO,GAAG,KAAK,CAAmB,OAAO,mDAAC;AAEvC,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QAExB,QAAQ,IAAI;AACV,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,MAAM;YACf,SAAS;AACP,gBAAA,OAAO,IAAI;YACb;;AAEJ,IAAA,CAAC,yDAAC;uGAvBS,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAP,OAAO,EAAA,UAAA,EAAA,CAAA;kBAPnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,yBAAyB,EAAE,iBAAiB;AAC7C,qBAAA;AACF,iBAAA;;;MCDY,aAAa,CAAA;uGAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAAb,aAAa,EAAA,OAAA,EAAA,CAHd,OAAO,CAAA,EAAA,OAAA,EAAA,CACP,OAAO,CAAA,EAAA,CAAA;wGAEN,aAAa,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,OAAO,CAAC;oBAClB,OAAO,EAAE,CAAC,OAAO,CAAC;AACnB,iBAAA;;;ACTD;;AAEG;;ACFH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3ddv/software-division-components",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "main": "./fesm2022/3ddv-software-division-components.mjs",
5
5
  "module": "fesm2022/3ddv-software-division-components.mjs",
6
6
  "typings": "types/3ddv-software-division-components.d.ts",
@@ -330,6 +330,7 @@ declare abstract class BasePopoverComponent implements OnInit, OnDestroy {
330
330
  declare class SeatPopoverComponent extends BasePopoverComponent implements OnInit {
331
331
  data: SeatPopoverData;
332
332
  showLoader: boolean;
333
+ load3dView: EventEmitter<void>;
333
334
  private readonly thumbnailProvider;
334
335
  protected readonly cdr: ChangeDetectorRef;
335
336
  protected thumbnail?: string;
@@ -340,8 +341,9 @@ declare class SeatPopoverComponent extends BasePopoverComponent implements OnIni
340
341
  protected get formattedSeat(): string;
341
342
  protected onEnter(event: MouseEvent): void;
342
343
  protected onLeave(event: MouseEvent): void;
344
+ protected onLoad3dView(): void;
343
345
  static ɵfac: i0.ɵɵFactoryDeclaration<SeatPopoverComponent, never>;
344
- static ɵcmp: i0.ɵɵComponentDeclaration<SeatPopoverComponent, "sdc-seat-popover", never, { "data": { "alias": "data"; "required": false; }; "showLoader": { "alias": "showLoader"; "required": false; }; }, {}, never, never, true, never>;
346
+ static ɵcmp: i0.ɵɵComponentDeclaration<SeatPopoverComponent, "sdc-seat-popover", never, { "data": { "alias": "data"; "required": false; }; "showLoader": { "alias": "showLoader"; "required": false; }; }, { "load3dView": "load3dView"; }, never, never, true, never>;
345
347
  }
346
348
 
347
349
  declare class SectionPopoverComponent extends BasePopoverComponent implements OnInit {
@@ -351,6 +353,7 @@ declare class SectionPopoverComponent extends BasePopoverComponent implements On
351
353
  showOpenSeatMap: boolean;
352
354
  excludeSeatMapSections: string[];
353
355
  isTicketFeeEnabled: boolean;
356
+ isAdaEnabled: boolean;
354
357
  load3dView: EventEmitter<void>;
355
358
  selectForBA: EventEmitter<boolean>;
356
359
  openSeatMap: EventEmitter<void>;
@@ -369,7 +372,7 @@ declare class SectionPopoverComponent extends BasePopoverComponent implements On
369
372
  protected onSelectForBA(): void;
370
373
  protected onOpenSeatMap(): void;
371
374
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionPopoverComponent, never>;
372
- static ɵcmp: i0.ɵɵComponentDeclaration<SectionPopoverComponent, "sdc-section-popover", never, { "data": { "alias": "data"; "required": false; }; "showLoader": { "alias": "showLoader"; "required": false; }; "showBestAvailable": { "alias": "showBestAvailable"; "required": false; }; "showOpenSeatMap": { "alias": "showOpenSeatMap"; "required": false; }; "excludeSeatMapSections": { "alias": "excludeSeatMapSections"; "required": false; }; "isTicketFeeEnabled": { "alias": "isTicketFeeEnabled"; "required": false; }; }, { "load3dView": "load3dView"; "selectForBA": "selectForBA"; "openSeatMap": "openSeatMap"; }, never, never, true, never>;
375
+ static ɵcmp: i0.ɵɵComponentDeclaration<SectionPopoverComponent, "sdc-section-popover", never, { "data": { "alias": "data"; "required": false; }; "showLoader": { "alias": "showLoader"; "required": false; }; "showBestAvailable": { "alias": "showBestAvailable"; "required": false; }; "showOpenSeatMap": { "alias": "showOpenSeatMap"; "required": false; }; "excludeSeatMapSections": { "alias": "excludeSeatMapSections"; "required": false; }; "isTicketFeeEnabled": { "alias": "isTicketFeeEnabled"; "required": false; }; "isAdaEnabled": { "alias": "isAdaEnabled"; "required": false; }; }, { "load3dView": "load3dView"; "selectForBA": "selectForBA"; "openSeatMap": "openSeatMap"; }, never, never, true, never>;
373
376
  }
374
377
 
375
378
  /**