q2-tecton-elements 1.68.0 → 1.68.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle-report.json +262 -217
- package/dist/cjs/click-elsewhere.q2-option-list.q2-popover.entry.cjs.js.map +1 -1
- package/dist/cjs/click-elsewhere_3.cjs.entry.js +12 -7
- package/dist/cjs/click-elsewhere_3.cjs.entry.js.map +1 -1
- package/dist/cjs/{index-DmGkqdX2.js → index-De6jFdo_.js} +33 -22
- package/dist/cjs/index-De6jFdo_.js.map +1 -0
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/q2-action-group_2.cjs.entry.js +1 -1
- package/dist/cjs/q2-action-sheet.cjs.entry.js +1 -1
- package/dist/cjs/q2-badge.cjs.entry.js +1 -1
- package/dist/cjs/q2-btn_2.cjs.entry.js +1 -1
- package/dist/cjs/q2-calendar.cjs.entry.js +1 -1
- package/dist/cjs/q2-card-image.cjs.entry.js +1 -1
- package/dist/cjs/q2-card.cjs.entry.js +2 -2
- package/dist/cjs/q2-card.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-card.entry.cjs.js.map +1 -1
- package/dist/cjs/q2-carousel-pane.cjs.entry.js +1 -1
- package/dist/cjs/q2-carousel.cjs.entry.js +1 -1
- package/dist/cjs/q2-chart-area.cjs.entry.js +1 -1
- package/dist/cjs/q2-chart-bar.cjs.entry.js +1 -1
- package/dist/cjs/q2-chart-donut.cjs.entry.js +1 -1
- package/dist/cjs/q2-checkbox-group.cjs.entry.js +1 -1
- package/dist/cjs/q2-checkbox.q2-tag.entry.cjs.js.map +1 -1
- package/dist/cjs/q2-checkbox_2.cjs.entry.js +47 -5
- package/dist/cjs/q2-checkbox_2.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-context.cjs.entry.js +1 -1
- package/dist/cjs/q2-data-table.cjs.entry.js +1 -1
- package/dist/cjs/q2-detail.cjs.entry.js +1 -1
- package/dist/cjs/q2-dropdown-item.cjs.entry.js +1 -1
- package/dist/cjs/q2-dropdown.cjs.entry.js +1 -1
- package/dist/cjs/q2-editable-field.cjs.entry.js +1 -1
- package/dist/cjs/q2-file-picker.cjs.entry.js +1 -1
- package/dist/cjs/q2-icon.cjs.entry.js +1 -1
- package/dist/cjs/q2-input.cjs.entry.js +1 -1
- package/dist/cjs/q2-item.cjs.entry.js +1 -1
- package/dist/cjs/q2-link_2.cjs.entry.js +1 -1
- package/dist/cjs/q2-loc.cjs.entry.js +1 -1
- package/dist/cjs/q2-message.cjs.entry.js +1 -1
- package/dist/cjs/q2-meter.cjs.entry.js +1 -1
- package/dist/cjs/q2-modal.cjs.entry.js +1 -1
- package/dist/cjs/q2-month-picker.cjs.entry.js +1 -1
- package/dist/cjs/q2-optgroup.cjs.entry.js +1 -1
- package/dist/cjs/q2-option.cjs.entry.js +1 -1
- package/dist/cjs/q2-otp.cjs.entry.js +1 -1
- package/dist/cjs/q2-pagination.cjs.entry.js +1 -1
- package/dist/cjs/q2-pill.cjs.entry.js +1 -1
- package/dist/cjs/q2-radio-group.cjs.entry.js +1 -1
- package/dist/cjs/q2-radio.cjs.entry.js +1 -1
- package/dist/cjs/q2-relative-time.cjs.entry.js +1 -1
- package/dist/cjs/q2-section.cjs.entry.js +1 -1
- package/dist/cjs/q2-select.cjs.entry.js +1 -1
- package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
- package/dist/cjs/q2-stepper-vertical.cjs.entry.js +1 -1
- package/dist/cjs/q2-stepper.cjs.entry.js +1 -1
- package/dist/cjs/q2-tab-container.cjs.entry.js +1 -1
- package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
- package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
- package/dist/cjs/q2-toast.cjs.entry.js +1 -1
- package/dist/cjs/q2-tooltip.cjs.entry.js +1 -1
- package/dist/collection/components/q2-card/q2-card.css +4 -2
- package/dist/collection/components/q2-checkbox/q2-checkbox.css +20 -4
- package/dist/collection/components/q2-checkbox/q2-checkbox.js +53 -3
- package/dist/collection/components/q2-checkbox/q2-checkbox.js.map +1 -1
- package/dist/collection/components/q2-popover/q2-popover.css +1 -1
- package/dist/collection/components/q2-popover/q2-popover.js +11 -6
- package/dist/collection/components/q2-popover/q2-popover.js.map +1 -1
- package/dist/collection/utils/index.js +30 -20
- package/dist/collection/utils/index.js.map +1 -1
- package/dist/components/index2.js +31 -21
- package/dist/components/index2.js.map +1 -1
- package/dist/components/q2-card.js +1 -1
- package/dist/components/q2-card.js.map +1 -1
- package/dist/components/q2-checkbox2.js +51 -6
- package/dist/components/q2-checkbox2.js.map +1 -1
- package/dist/components/q2-popover2.js +12 -7
- package/dist/components/q2-popover2.js.map +1 -1
- package/dist/components/q2-select2.js +1 -1
- package/dist/esm/click-elsewhere.q2-option-list.q2-popover.entry.js.map +1 -1
- package/dist/esm/click-elsewhere_3.entry.js +12 -7
- package/dist/esm/click-elsewhere_3.entry.js.map +1 -1
- package/dist/esm/{index-C5gj0T_3.js → index-CSlW4ulM.js} +33 -23
- package/dist/esm/index-CSlW4ulM.js.map +1 -0
- package/dist/esm/loader.js +1 -1
- package/dist/esm/q2-action-group_2.entry.js +1 -1
- package/dist/esm/q2-action-sheet.entry.js +1 -1
- package/dist/esm/q2-badge.entry.js +1 -1
- package/dist/esm/q2-btn_2.entry.js +1 -1
- package/dist/esm/q2-calendar.entry.js +1 -1
- package/dist/esm/q2-card-image.entry.js +1 -1
- package/dist/esm/q2-card.entry.js +2 -2
- package/dist/esm/q2-card.entry.js.map +1 -1
- package/dist/esm/q2-carousel-pane.entry.js +1 -1
- package/dist/esm/q2-carousel.entry.js +1 -1
- package/dist/esm/q2-chart-area.entry.js +1 -1
- package/dist/esm/q2-chart-bar.entry.js +1 -1
- package/dist/esm/q2-chart-donut.entry.js +1 -1
- package/dist/esm/q2-checkbox-group.entry.js +1 -1
- package/dist/esm/q2-checkbox.q2-tag.entry.js.map +1 -1
- package/dist/esm/q2-checkbox_2.entry.js +47 -5
- package/dist/esm/q2-checkbox_2.entry.js.map +1 -1
- package/dist/esm/q2-context.entry.js +1 -1
- package/dist/esm/q2-data-table.entry.js +1 -1
- package/dist/esm/q2-detail.entry.js +1 -1
- package/dist/esm/q2-dropdown-item.entry.js +1 -1
- package/dist/esm/q2-dropdown.entry.js +1 -1
- package/dist/esm/q2-editable-field.entry.js +1 -1
- package/dist/esm/q2-file-picker.entry.js +1 -1
- package/dist/esm/q2-icon.entry.js +1 -1
- package/dist/esm/q2-input.entry.js +1 -1
- package/dist/esm/q2-item.entry.js +1 -1
- package/dist/esm/q2-link_2.entry.js +1 -1
- package/dist/esm/q2-loc.entry.js +1 -1
- package/dist/esm/q2-message.entry.js +1 -1
- package/dist/esm/q2-meter.entry.js +1 -1
- package/dist/esm/q2-modal.entry.js +1 -1
- package/dist/esm/q2-month-picker.entry.js +1 -1
- package/dist/esm/q2-optgroup.entry.js +1 -1
- package/dist/esm/q2-option.entry.js +1 -1
- package/dist/esm/q2-otp.entry.js +1 -1
- package/dist/esm/q2-pagination.entry.js +1 -1
- package/dist/esm/q2-pill.entry.js +1 -1
- package/dist/esm/q2-radio-group.entry.js +1 -1
- package/dist/esm/q2-radio.entry.js +1 -1
- package/dist/esm/q2-relative-time.entry.js +1 -1
- package/dist/esm/q2-section.entry.js +1 -1
- package/dist/esm/q2-select.entry.js +1 -1
- package/dist/esm/q2-stepper-pane.entry.js +1 -1
- package/dist/esm/q2-stepper-vertical.entry.js +1 -1
- package/dist/esm/q2-stepper.entry.js +1 -1
- package/dist/esm/q2-tab-container.entry.js +1 -1
- package/dist/esm/q2-tecton-elements.js +1 -1
- package/dist/esm/q2-textarea.entry.js +1 -1
- package/dist/esm/q2-toast.entry.js +1 -1
- package/dist/esm/q2-tooltip.entry.js +1 -1
- package/dist/q2-tecton-elements/click-elsewhere.q2-option-list.q2-popover.entry.esm.js.map +1 -1
- package/dist/q2-tecton-elements/click-elsewhere_3.entry.js +29 -24
- package/dist/q2-tecton-elements/click-elsewhere_3.entry.js.map +1 -1
- package/dist/q2-tecton-elements/{index-C5gj0T_3.js → index-CSlW4ulM.js} +36 -24
- package/dist/q2-tecton-elements/index-CSlW4ulM.js.map +1 -0
- package/dist/q2-tecton-elements/q2-action-group_2.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-action-sheet.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-badge.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-btn_2.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-calendar.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-card-image.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-card.entry.esm.js.map +1 -1
- package/dist/q2-tecton-elements/q2-card.entry.js +2 -2
- package/dist/q2-tecton-elements/q2-card.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-carousel-pane.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-carousel.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-chart-area.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-chart-bar.entry.js +3 -3
- package/dist/q2-tecton-elements/q2-chart-donut.entry.js +4 -4
- package/dist/q2-tecton-elements/q2-checkbox-group.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-checkbox.q2-tag.entry.esm.js.map +1 -1
- package/dist/q2-tecton-elements/q2-checkbox_2.entry.js +62 -23
- package/dist/q2-tecton-elements/q2-checkbox_2.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-context.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-data-table.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-detail.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-dropdown-item.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-dropdown.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-editable-field.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-file-picker.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-icon.entry.js +41 -41
- package/dist/q2-tecton-elements/q2-input.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-item.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-link_2.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-loc.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-message.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-meter.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-modal.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-month-picker.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-optgroup.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-option.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-otp.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-pagination.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-pill.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-radio-group.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-radio.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-relative-time.entry.js +4 -4
- package/dist/q2-tecton-elements/q2-section.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-select.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-stepper-pane.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-stepper-vertical.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-stepper.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-tab-container.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
- package/dist/q2-tecton-elements/q2-textarea.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-toast.entry.js +1 -1
- package/dist/q2-tecton-elements/q2-tooltip.entry.js +1 -1
- package/dist/types/components/q2-checkbox/q2-checkbox.d.ts +11 -0
- package/dist/types/utils/index.d.ts +8 -2
- package/package.json +3 -3
- package/dist/cjs/index-DmGkqdX2.js.map +0 -1
- package/dist/esm/index-C5gj0T_3.js.map +0 -1
- package/dist/q2-tecton-elements/index-C5gj0T_3.js.map +0 -1
|
@@ -4,9 +4,9 @@ import { m as n } from "./mirror-emit-DUjY_ucm.js";
|
|
|
4
4
|
|
|
5
5
|
import { b as r } from "./component-DaQM9u3s.js";
|
|
6
6
|
|
|
7
|
-
import { l as a, n as h, o as c, i as l, w as p, v as d, q as u, x as f,
|
|
7
|
+
import { l as a, n as h, o as c, i as l, w as p, v as d, q as u, x as f, y as m, g as b } from "./index-CSlW4ulM.js";
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const v = class {
|
|
10
10
|
constructor(e) {
|
|
11
11
|
t(this, e);
|
|
12
12
|
this.change = i(this, "change", 7);
|
|
@@ -98,9 +98,9 @@ function sanitizeRegexString(t) {
|
|
|
98
98
|
return t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
const
|
|
101
|
+
const w = "*{box-sizing:border-box}*:active{outline:none}*:focus-visible{outline:none;box-shadow:var(--const-double-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #0066cc)}:host{box-shadow:none !important}::-moz-focus-inner{border:none}input,textarea,button{font-family:inherit;font-size:inherit;font-stretch:inherit}:host(.sr),:host(.sr) button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.sr,.sr button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none}:host([hidden]){display:none}.invisible{visibility:hidden}:host{position:relative;width:100%;display:block;line-height:var(--tct-option-list-line-height, var(--t-option-list-line-height, var(--app-line-height, 1.428571429em)))}.content{text-align:start}:host([is-sizeable]) .content{display:block;height:auto}";
|
|
102
102
|
|
|
103
|
-
const
|
|
103
|
+
const g = class {
|
|
104
104
|
constructor(e) {
|
|
105
105
|
t(this, e);
|
|
106
106
|
this.change = i(this, "change", 7);
|
|
@@ -696,11 +696,11 @@ const w = class {
|
|
|
696
696
|
}
|
|
697
697
|
};
|
|
698
698
|
|
|
699
|
-
|
|
699
|
+
g.style = w;
|
|
700
700
|
|
|
701
|
-
const
|
|
701
|
+
const k = "*{box-sizing:border-box}*:active{outline:none}*:focus-visible{outline:none;box-shadow:var(--const-double-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #0066cc)}:host{box-shadow:none !important}::-moz-focus-inner{border:none}input,textarea,button{font-family:inherit;font-size:inherit;font-stretch:inherit}:host(.sr),:host(.sr) button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.sr,.sr button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none}:host([hidden]){display:none}.invisible{visibility:hidden}.legacy.container{display:none}.legacy.show{display:block;z-index:var(--tct-popover-z-index, 50)}@keyframes popoverOpen{from{opacity:0;transform:scale(0.95)}to{opacity:1;transform:scale(1)}}@keyframes popoverClose{from{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(0.95)}}:popover-open,.show{position:var(--comp-pop-position, absolute);margin:0;padding:var(--tct-popover-padding, 0);overflow:auto;background:var(--tct-popover-background, var(--app-white, #ffffff));backdrop-filter:var(--tct-popover-backdrop-filter, none);color:var(--tct-popover-font-color, var(--t-text, #4d4d4d));min-width:var(--tct-popover-min-width, 135px);margin-block:var(--tct-popover-margin-block, 0);box-shadow:var(--tct-popover-box-shadow, var(--app-shadow-3, 0px 0px 2px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.14)));border-width:var(--tct-popover-border-width, 0);border-style:solid;border-color:var(--tct-popover-border-color, transparent);border-radius:var(--tct-popover-border-radius, 0);max-height:var(--comp-pop-max-height);left:var(--comp-pop-left);opacity:var(--comp-pop-opacity, 0);--comp-scrollbar-size:var(--tct-scrollbar-size, var(--t-scrollbar-size, var(--app-scale-1x, 5px)));--comp-scrollbar-border-radius:var(--tct-scrollbar-border-radius, var(--t-scrollbar-border-radius, var(--app-border-radius-1, 4px)));--comp-scrollbar-color:var(--tct-scrollbar-color, var(--t-scrollbar-color, var(--t-a11y-gray-color, #747474)));scrollbar-width:thin;scrollbar-color:var(--comp-scrollbar-color) transparent}:popover-open.animating-open,.show.animating-open{animation-name:popoverOpen;animation-duration:var(--tct-popover-open-animation-duration, var(--t-tween-time-in-1, 150ms));animation-timing-function:var(--tct-popover-open-animation-timing-function, ease-out);animation-fill-mode:var(--tct-popover-open-animation-fill-mode, forwards)}:popover-open.animating-close,.show.animating-close{animation-name:popoverClose;animation-duration:var(--tct-popover-close-animation-duration, var(--t-tween-time-out-1, 100ms));animation-timing-function:var(--tct-popover-close-animation-timing-function, ease-in);animation-fill-mode:var(--tct-popover-close-animation-fill-mode, forwards)}@media (prefers-reduced-motion: reduce){:popover-open.animating-open,:popover-open.animating-close,.show.animating-open,.show.animating-close{animation:none}}:popover-open.block,.show.block{right:unset;width:var(--comp-pop-width);min-width:var(--tct-popover-min-width, unset)}:popover-open.left,.show.left{left:var(--comp-pop-left);right:unset}:popover-open.right,.show.right{right:var(--comp-pop-right);left:unset}:popover-open.down,.show.down{top:var(--tct-popover-top, var(--comp-pop-top));bottom:unset}:popover-open.up,.show.up{top:unset;bottom:var(--comp-pop-bottom)}:popover-open.down.left:not(.mobile),.show.down.left:not(.mobile){transform-origin:top left}:popover-open.down.right:not(.mobile),.show.down.right:not(.mobile){transform-origin:top right}:popover-open.up.left:not(.mobile),.show.up.left:not(.mobile){transform-origin:bottom left}:popover-open.up.right:not(.mobile),.show.up.right:not(.mobile){transform-origin:bottom right}:popover-open.mobile.down,.show.mobile.down{transform-origin:center top}:popover-open.mobile.up,.show.mobile.up{transform-origin:center bottom}:popover-open::-webkit-scrollbar,.show::-webkit-scrollbar{width:var(--comp-scrollbar-size);height:var(--comp-scrollbar-size);margin:5px}:popover-open::-webkit-scrollbar-thumb,.show::-webkit-scrollbar-thumb{background:var(--comp-scrollbar-color);border-radius:var(--comp-scrollbar-border-radius)}:popover-open::-webkit-scrollbar-track,.show::-webkit-scrollbar-track{background:transparent;border-radius:var(--comp-scrollbar-border-radius)}click-elsewhere{position:relative;display:block}";
|
|
702
702
|
|
|
703
|
-
const
|
|
703
|
+
const x = class {
|
|
704
704
|
constructor(e) {
|
|
705
705
|
t(this, e);
|
|
706
706
|
this.popoverStateChanged = i(this, "popoverStateChanged", 7);
|
|
@@ -763,28 +763,32 @@ const k = class {
|
|
|
763
763
|
right: 0
|
|
764
764
|
};
|
|
765
765
|
const u = l;
|
|
766
|
-
const
|
|
766
|
+
const b = ((e = window === null || window === void 0 ? void 0 : window.visualViewport) === null || e === void 0 ? void 0 : e.width) - d;
|
|
767
|
+
const v = f(o);
|
|
768
|
+
const w = v ? 0 : window.scrollX;
|
|
769
|
+
const g = v ? 0 : window.scrollY;
|
|
770
|
+
s.style.setProperty("--comp-pop-position", v ? "fixed" : "absolute");
|
|
767
771
|
if (a === "right") {
|
|
768
|
-
s.style.setProperty("--comp-pop-right", `${
|
|
772
|
+
s.style.setProperty("--comp-pop-right", `${b - w}px`);
|
|
769
773
|
s.style.setProperty("--comp-pop-left", "unset");
|
|
770
774
|
} else {
|
|
771
|
-
s.style.setProperty("--comp-pop-left", `${u +
|
|
775
|
+
s.style.setProperty("--comp-pop-left", `${u + w}px`);
|
|
772
776
|
s.style.setProperty("--comp-pop-right", "unset");
|
|
773
777
|
}
|
|
774
778
|
if (this.block) s.style.setProperty("--comp-pop-width", `${(o === null || o === void 0 ? void 0 : o.offsetWidth) || 0}px`);
|
|
775
|
-
const
|
|
779
|
+
const k = r && m(this.hostElement);
|
|
776
780
|
if (n === "up") {
|
|
777
|
-
if (r && !
|
|
781
|
+
if (r && !k) {
|
|
778
782
|
s.style.setProperty("--comp-pop-bottom", `${window.innerHeight - h}px`);
|
|
779
783
|
} else {
|
|
780
|
-
s.style.setProperty("--comp-pop-bottom", `${window.innerHeight - h -
|
|
784
|
+
s.style.setProperty("--comp-pop-bottom", `${window.innerHeight - h - g}px`);
|
|
781
785
|
}
|
|
782
786
|
}
|
|
783
787
|
if (n === "down") {
|
|
784
|
-
if (r && !
|
|
788
|
+
if (r && !k) {
|
|
785
789
|
s.style.setProperty("--comp-pop-top", `${c}px`);
|
|
786
790
|
} else {
|
|
787
|
-
s.style.setProperty("--comp-pop-top", `${c +
|
|
791
|
+
s.style.setProperty("--comp-pop-top", `${c + g}px`);
|
|
788
792
|
}
|
|
789
793
|
}
|
|
790
794
|
// Wait for one paint to prevent layout thrashing
|
|
@@ -919,7 +923,7 @@ const k = class {
|
|
|
919
923
|
var t;
|
|
920
924
|
window.addEventListener("resize", this.viewPortOrientationChanged);
|
|
921
925
|
visualViewport === null || visualViewport === void 0 ? void 0 : visualViewport.addEventListener("resize", this.viewPortChanged);
|
|
922
|
-
if (
|
|
926
|
+
if (m(this.hostElement) && !b()) {
|
|
923
927
|
window.addEventListener("scroll", this.viewPortChanged, {
|
|
924
928
|
passive: true,
|
|
925
929
|
capture: true
|
|
@@ -937,6 +941,7 @@ const k = class {
|
|
|
937
941
|
this.containerElement.style.removeProperty("--comp-pop-right");
|
|
938
942
|
this.containerElement.style.removeProperty("--comp-pop-width");
|
|
939
943
|
this.containerElement.style.removeProperty("--comp-pop-opacity");
|
|
944
|
+
this.containerElement.style.removeProperty("--comp-pop-position");
|
|
940
945
|
}
|
|
941
946
|
async determinePopDirection() {
|
|
942
947
|
var t, i, e;
|
|
@@ -952,8 +957,8 @@ const k = class {
|
|
|
952
957
|
let l;
|
|
953
958
|
let d;
|
|
954
959
|
let u;
|
|
955
|
-
const
|
|
956
|
-
if (a && !
|
|
960
|
+
const f = a && m(this.hostElement);
|
|
961
|
+
if (a && !f) {
|
|
957
962
|
const {outletOffset: t = 0, innerHeight: i = window.innerHeight, top: o = 0, bottom: s = 0} = ((e = window.Tecton) === null || e === void 0 ? void 0 : e.platformDimensions) || {};
|
|
958
963
|
const n = window.innerHeight - c;
|
|
959
964
|
// controlElement position visually on the page
|
|
@@ -1026,25 +1031,25 @@ const k = class {
|
|
|
1026
1031
|
// #region Render Methods
|
|
1027
1032
|
render() {
|
|
1028
1033
|
const t = [ "container", this.currentDirection, this.align ];
|
|
1029
|
-
if (
|
|
1034
|
+
if (b()) t.push("mobile");
|
|
1030
1035
|
if (this.show) t.push("show");
|
|
1031
1036
|
if (this.block) t.push("block");
|
|
1032
1037
|
if (this.mode === "legacy") t.push("legacy");
|
|
1033
1038
|
if (this.animationState === "opening") t.push("animating-open");
|
|
1034
1039
|
if (this.animationState === "closing") t.push("animating-close");
|
|
1035
1040
|
return o("div", {
|
|
1036
|
-
key: "
|
|
1041
|
+
key: "5823437bbcde2c978f4bd48ee798466bc08ec243",
|
|
1037
1042
|
ref: t => this.containerElement = t,
|
|
1038
1043
|
class: t.join(" "),
|
|
1039
1044
|
"test-id": "outerContainer",
|
|
1040
1045
|
tabIndex: -1,
|
|
1041
1046
|
popover: "manual"
|
|
1042
1047
|
}, o("div", {
|
|
1043
|
-
key: "
|
|
1048
|
+
key: "458c91b003ec3f1bb2a42ac00c8ef829b4ef426b",
|
|
1044
1049
|
ref: t => this.contentElement = t,
|
|
1045
1050
|
class: "content"
|
|
1046
1051
|
}, o("slot", {
|
|
1047
|
-
key: "
|
|
1052
|
+
key: "0c43b1c8ee25116b9ed33627e2fefb802e645bbd"
|
|
1048
1053
|
})));
|
|
1049
1054
|
}
|
|
1050
1055
|
get hostElement() {
|
|
@@ -1058,8 +1063,8 @@ const k = class {
|
|
|
1058
1063
|
}
|
|
1059
1064
|
};
|
|
1060
1065
|
|
|
1061
|
-
|
|
1066
|
+
x.style = k;
|
|
1062
1067
|
|
|
1063
|
-
export {
|
|
1068
|
+
export { v as click_elsewhere, g as q2_option_list, x as q2_popover };
|
|
1064
1069
|
//# sourceMappingURL=click-elsewhere.q2-option-list.q2-popover.entry.esm.js.map
|
|
1065
1070
|
//# sourceMappingURL=click-elsewhere_3.entry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ClickElsewhere","constructor","hostRef","this","isCurrentlyFocused","mouseEventList","mouseHandler","event","shadowContains","findActiveElement","aboutToBeFocused","shadowEventTarget","originatesInSlots","target","mirrorEmit","windowBlurHandler","connectedCallback","forEach","eventName","document","addEventListener","window","disconnectedCallback","removeEventListener","componentWillLoad","workingElement","activeElement","shadowRoot","slots","hostElement","querySelectorAll","currentSlot","Array","from","lightNodes","assignedNodes","childNodes","currentNode","contains","child","parentNode","host","composedPath","sanitizeRegexString","regexString","replace","q2OptionListCss","Q2OptionList","keyStore","queue","lastPressedAt","Date","scheduledAfterRender","label","loc","selectedOptions","type","clickHandler","option","closest","selectOption","multiple","popoverState","emit","open","action","externalKeydownHandler","key","modifierOnlyKeys","includes","stopPropagation","activeIndex","customSearch","allOptions","nextIndex","searchString","searchOptions","openDropdownWithActiveElement","setDefaultActiveElement","nextPaint","preventDefault","length","getDefaultActiveIndex","getNextVisibleIndex","Math","max","min","noSelect","setActiveElement","match","focusoutHandler","relatedTarget","isInQ2OptionList","isInLightDom","internalKeydownHandler","allVisibleOptions","shiftKey","newOption","find","element","active","disabled","once","focusedOption","isOptionFocused","some","opt","firstVisibleOption","isFirstVisibleOptionActive","undefined","adjustActiveOptionAndScroll","lastVisibleOption","isLastVisibleOptionActive","searchAndFocus","keyValue","shouldSelect","reorder","pivotIndex","list","map","index","slice","buildQueue","now","getTime","push","searchIndex","keyStr","join","sanitizedKeyStr","v","display","RegExp","setFocus","matched","hasValidAncestor","hasOptions","componentDidLoad","overrideFocus","checkOptions","selectedOptionsUpdated","ready","componentDidRender","fn","handleClick","delegateFocus","isEventFromElement","setActiveOption","setFocusedOption","getContents","allContents","getOptions","handleExternalKeydown","updateMultipleOptionAttrs","updateSingleOptionAttrs","showSelectedUpdated","showSelected","_multiSelectHidden","selected","rootSlot","getRootSlot","acceptedTags","Set","filter","has","tagName","contents","extractOptions","elements","reduce","acc","separator","children","hidden","disabledGroup","numToAdd","scrollToActiveOption","optionRole","role","focusSelectedSibling","hasNoSiblings","selectedOptionVisibleIndex","indexOf","nextVisibleSiblingIndex","nextVisibleSibling","nextSiblingIndex","firstSelected","findIndex","firstEnabled","direction","activeOption","visibleActiveOptionIndex","nextVisibleOptionIndex","nextVisibleOption","slot","querySelector","assignedElements","_a","hasAnotherSlot","waitForNextPaint","resetTimer","searchStringTimer","clearTimeout","setTimeout","scrollX","scrollY","scrollIntoView","block","scrollTo","selectedOption","selectedValue","value","displayValue","innerText","trim","valueObject","values","isAlreadySelected","elementIndex","isOptionVisible","isVisible","focus","preventScroll","selectedValues","render","h","Host","class","ref","el","contentElement","onFocusout","onKeyDown","onClick","q2PopoverCss","Q2Popover","displayBuffer","orientationChanged","pendingAnimationResolve","animationState","currentDirection","show","align","mode","handleMinHeight","minHeight","handleDeprecationWarning","handlePopoverToggleEvent","newState","setAbsoluteCSSProperties","async","controlElement","containerElement","style","setProperty","controlStyle","getComputedStyle","controlSize","parseInt","height","borderTopWidth","borderBottomWidth","setPopoverAPICSSProperties","isModule","top","controlTop","bottom","controlBottom","left","controlLeft","right","controlRight","_b","getBoundingClientRect","call","popoverLeft","popoverRight","_c","visualViewport","width","offsetWidth","isScrollableIframe","isInScrollableContainer","innerHeight","viewPortChanged","determinePopDirection","viewPortOrientationChanged","removeViewportListeners","supportsPopoverAPI","console","warn","popoverStateHandler","detail","scrollContainerTo","options","toggle","minHeightProvided","openChanged","addViewportListeners","Promise","resolve","handleAnimationEnd","hidePopover","clearCSSProperties","isIframe","hasPlatformDimensions","Object","keys","Tecton","platformDimensions","providedDirection","hasOwn","HTMLElement","prototype","validatedMaxHeight","maxHeight","isNaN","isMobile","passive","capture","screen","orientation","removeProperty","windowHeight","maxSpaceAbove","maxSpaceBelow","outletOffset","topBarHeight","bottomBarHeight","distanceToIframeBottom","visualControlTop","visualControlBottom","viewableSpaceAbove","viewableSpaceBelow","isIframeShorterThanWindow","directionWithMostSpace","shouldUpdateMaxHeight","getPropertyValue","currentOrDetermineDirection","priorityMaxHeight","setDirectionAndShow","isOpen","showPopover","containerClasses","tabIndex","popover"],"sources":["src/components/click-elsewhere/click-elsewhere.tsx","src/utils/sanitize-regex-string.ts","src/components/q2-option-list/q2-option-list.scss?tag=q2-option-list&encapsulation=shadow","src/components/q2-option-list/q2-option-list.tsx","src/components/q2-popover/q2-popover.scss?tag=q2-popover&encapsulation=shadow","src/components/q2-popover/q2-popover.tsx"],"sourcesContent":["import { Component, ComponentInterface, Element, Event, EventEmitter } from '@stencil/core';\nimport mirrorEmit from '@/utils/mirror-emit';\n\n@Component({\n tag: 'click-elsewhere',\n shadow: false,\n})\nexport class ClickElsewhere implements ComponentInterface {\n // #region Own Properties\n\n isCurrentlyFocused: boolean = false;\n /**\n * Listens for mouse and window events that happen outside this click-elsewhere element so we can close popovers when users click outside them\n */\n mouseEventList: string[] = ['mousedown', 'dragstart', 'touchstart'];\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when the user clicks outside the element\n * @deprecated Use 'tctChange' instead\n */\n @Event()\n change: EventEmitter;\n\n /**\n * Emitted when the user clicks outside the element\n */\n @Event()\n tctChange: EventEmitter;\n\n // #endregion\n // #region Component Lifecycle Events\n\n /* tslint:enable:no-empty */\n\n connectedCallback() {\n this.mouseEventList.forEach((eventName: string) => {\n document.addEventListener(eventName, this.mouseHandler);\n });\n window.addEventListener('blur', this.windowBlurHandler);\n }\n\n disconnectedCallback() {\n this.mouseEventList.forEach((eventName: string) => {\n document.removeEventListener(eventName, this.mouseHandler);\n });\n window.removeEventListener('blur', this.windowBlurHandler);\n }\n\n /* TODO: Stencil/Rollup is having issues compiling without this here. Will try to remove in future Stencil upgrade. */\n /* tslint:disable:no-empty */\n componentWillLoad() {}\n\n // #endregion\n // #region Local Methods\n\n findActiveElement(): Element | null {\n let workingElement = document.activeElement!;\n while (true) {\n if (!workingElement || !workingElement.shadowRoot) {\n return workingElement;\n }\n workingElement = workingElement.shadowRoot.activeElement;\n }\n }\n\n mouseHandler = (event: Event): void => {\n const isCurrentlyFocused = this.shadowContains(this.findActiveElement());\n const aboutToBeFocused =\n this.shadowContains(this.shadowEventTarget(event)) || this.originatesInSlots(event.target as Element);\n\n if (!aboutToBeFocused && (this.isCurrentlyFocused || isCurrentlyFocused)) {\n this.isCurrentlyFocused = false;\n mirrorEmit(this, ['change', 'tctChange']);\n return;\n }\n this.isCurrentlyFocused = aboutToBeFocused || isCurrentlyFocused;\n };\n\n originatesInSlots(target: Element): boolean {\n const slots = this.hostElement.querySelectorAll('slot');\n for (const currentSlot of Array.from(slots)) {\n const lightNodes =\n (currentSlot && currentSlot.assignedNodes && currentSlot.assignedNodes()) ||\n this.hostElement.childNodes;\n\n for (const currentNode of Array.from(lightNodes)) {\n if (currentNode.contains(target)) {\n return true;\n }\n }\n }\n return false;\n }\n\n shadowContains(child: any): boolean {\n /**\n * shadow-dom enabled version of Node.contains()\n */\n\n while (true) {\n if (child === this.hostElement) {\n return true;\n }\n if (!child) {\n return false;\n }\n child = child.parentNode || child.host;\n }\n }\n\n shadowEventTarget(event: any): Element {\n return event.composedPath()[0] || event.target;\n }\n\n windowBlurHandler = (): void => {\n if (!this.isCurrentlyFocused) return;\n this.isCurrentlyFocused = false;\n mirrorEmit(this, ['change', 'tctChange']);\n };\n}\n","export default function sanitizeRegexString(regexString: string) {\n return regexString.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import './variables';\n\n:host {\n position: relative;\n width: 100%;\n display: block;\n line-height: var-list(var-prefixer(option-list-line-height),--app-line-height, 1.428571429em);\n}\n\n.content {\n text-align: start;\n\n :host([is-sizeable]) & {\n display: block;\n height: auto;\n }\n}\n","import { hasValidAncestor } from '@/utils/component';\nimport sanitizeRegexString from '@/utils/sanitize-regex-string';\nimport {\n Component,\n Prop,\n h,\n Event,\n State,\n Element,\n ComponentInterface,\n Host,\n EventEmitter,\n Method,\n Watch,\n Listen,\n} from '@stencil/core';\nimport { isEventFromElement, isVisible, loc, nextPaint, overrideFocus, waitForNextPaint } from 'src/utils';\nimport mirrorEmit from '@/utils/mirror-emit';\n\nexport interface OptionValue {\n value: string;\n display?: string;\n}\n\nexport type ValidOptionElements = HTMLQ2OptionElement | HTMLQ2DropdownItemElement;\n\n/**\n * @name Option List\n * @category Forms\n * @summary Use internally by Select and Dropdown for rendering searchable option lists.\n */\n@Component({ tag: 'q2-option-list', shadow: true, styleUrl: 'q2-option-list.scss' })\nexport class Q2OptionList implements ComponentInterface {\n // #region Own Properties\n\n activeIndex: number;\n contentElement: HTMLElement;\n keyStore: {\n queue: string[];\n lastPressedAt: Date;\n } = {\n queue: [],\n lastPressedAt: new Date(),\n };\n pivotIndex: number;\n scheduledAfterRender: (() => void)[] = [];\n searchString: string;\n searchStringTimer: number;\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n hasOptions: boolean;\n\n // #endregion\n // #region Public Property API\n\n @Prop({ reflect: true })\n align: 'left' | 'right';\n\n /** Indicates a custom search is being implemented for the option list. */\n @Prop({ reflect: true })\n customSearch: boolean;\n\n /** Disables the option list. */\n @Prop({ reflect: true })\n disabled: boolean;\n\n /** Determines the label that is applied to the option list for accessibility purposes. */\n @Prop()\n label: string = loc('tecton.element.optionList.label');\n\n /**\n * Enables the multi-select ability for the option list.\n * @info\n * Only applicable when options are provided.\n */\n @Prop({ reflect: true })\n multiple: boolean;\n\n /** Disables the logic that handles selecting and focusing an option in the option list. */\n @Prop({ reflect: true })\n noSelect: boolean;\n\n /** A list of the selected options on the element. */\n @Prop({ mutable: true })\n selectedOptions: OptionValue[] = [];\n\n /** Applies focus to the selected option. */\n @Prop({ reflect: true, mutable: true })\n showSelected: boolean;\n\n /** Translates to the role of the option list */\n @Prop()\n type: 'menu' | 'listbox' = 'listbox';\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when an option is selected or deselected.\n *\n * When the multi-select is enabled, the `value` property will be `undefined` and the `selectedOptions` property\n * will contain the selected option values.\n * @deprecated Use 'tctChange' instead\n */\n @Event()\n change: EventEmitter<{ value: string; values: OptionValue[] }>;\n\n /**\n * Emitted to indicate the intended state of the popover.\n * @private\n */\n @Event()\n popoverState: EventEmitter<{ open: boolean; action: 'close' | 'select' | 'open' }>;\n\n /**\n * Emitted when the component has finished rendering.\n * @private\n */\n @Event({ bubbles: false })\n ready: EventEmitter<undefined>;\n\n /**\n * Emitted when an option is selected or deselected.\n *\n * When the multi-select is enabled, the `value` property will be `undefined` and the `selectedOptions` property\n * will contain the selected option values.\n */\n @Event()\n tctChange: EventEmitter<{ value: string; values: OptionValue[] }>;\n\n // #endregion\n // #region Component Lifecycle Events\n\n componentWillLoad() {\n hasValidAncestor(this.hostElement, 'q2-select, q2-dropdown, q2-pill, q2-popover, q2-action-sheet');\n this.hasOptions = !!this.hostElement.querySelectorAll(\n 'q2-option:not([separator]):not([separator=true]), q2-dropdown-item:not([separator]):not([separator=true])'\n ).length;\n }\n\n componentDidLoad(): void {\n overrideFocus(this.hostElement);\n this.checkOptions();\n this.selectedOptionsUpdated();\n this.ready.emit();\n }\n\n componentDidRender() {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n }\n\n // #endregion\n // #region Listeners\n\n @Listen('click')\n handleClick(event: MouseEvent) {\n event.stopPropagation();\n }\n\n @Listen('focus')\n delegateFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n this.popoverState.emit({ open: true, action: 'open' });\n const { activeIndex } = this;\n if (typeof activeIndex === 'number' && activeIndex > -1) {\n this.setActiveOption();\n this.setFocusedOption();\n } else {\n this.setDefaultActiveElement();\n }\n }\n\n // #endregion\n // #region Public Methods API\n\n @Method()\n async getContents(): Promise<(HTMLQ2OptgroupElement | ValidOptionElements)[]> {\n return this.allContents;\n }\n\n @Method()\n async getOptions(): Promise<ValidOptionElements[]> {\n return this.allOptions;\n }\n\n @Method()\n async handleExternalKeydown(event: KeyboardEvent) {\n this.externalKeydownHandler(event);\n }\n\n @Method()\n async setActiveElement(index: number) {\n this.activeIndex = index;\n this.setActiveOption();\n this.setFocusedOption();\n }\n\n @Method()\n async setDefaultActiveElement() {\n this.activeIndex = this.getDefaultActiveIndex();\n this.setActiveOption();\n this.setFocusedOption();\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('selectedOptions')\n selectedOptionsUpdated() {\n if (this.multiple) {\n this.updateMultipleOptionAttrs();\n } else {\n this.updateSingleOptionAttrs();\n }\n }\n\n @Watch('showSelected')\n showSelectedUpdated(showSelected: boolean) {\n if (showSelected && this.selectedOptions.length === 0) {\n this.showSelected = false;\n return;\n }\n this.allOptions.forEach(option => {\n if (!('_multiSelectHidden' in option)) return;\n option._multiSelectHidden = showSelected ? !option.selected : false;\n });\n }\n\n // #endregion\n // #region Local Methods\n\n get allContents(): (HTMLQ2OptgroupElement | ValidOptionElements)[] {\n const rootSlot = this.getRootSlot(this.hostElement);\n const acceptedTags = new Set(['Q2-OPTGROUP', 'Q2-OPTION', 'Q2-DROPDOWN-ITEM']);\n return rootSlot.filter(element => acceptedTags.has(element.tagName)) as (\n | HTMLQ2OptgroupElement\n | ValidOptionElements\n )[];\n }\n\n get allOptions(): ValidOptionElements[] {\n const contents = this.allContents;\n\n const extractOptions = (\n elements: (HTMLQ2OptgroupElement | ValidOptionElements | Element)[]\n ): ValidOptionElements[] => {\n return elements.reduce((acc, element) => {\n if (element.tagName === 'Q2-OPTION' || element.tagName === 'Q2-DROPDOWN-ITEM') {\n return (element as ValidOptionElements).separator ? acc : [...acc, element];\n } else if (element.tagName === 'Q2-OPTGROUP') {\n return [...acc, ...extractOptions(Array.from(element.children))];\n } else {\n return acc;\n }\n }, []);\n };\n\n return extractOptions(contents);\n }\n\n get allVisibleOptions(): ValidOptionElements[] {\n return this.allOptions.filter(\n option =>\n !option.hidden &&\n (!('_multiSelectHidden' in option) || !option._multiSelectHidden) &&\n !option.disabled &&\n (!('disabledGroup' in option) || !option.disabledGroup)\n );\n }\n\n adjustActiveOptionAndScroll(numToAdd: number) {\n this.activeIndex += numToAdd;\n this.setActiveOption();\n this.setFocusedOption();\n this.scrollToActiveOption();\n }\n\n checkOptions() {\n const { type } = this;\n if (!type) return;\n const optionRole = type === 'menu' ? 'menuitem' : 'option';\n this.allOptions.forEach(option => {\n option.role = optionRole;\n });\n }\n\n clickHandler = (event: Event) => {\n const target = event.target as ValidOptionElements;\n const option = target.closest<ValidOptionElements>(\n 'q2-option:not([separator]):not([separator=true]), q2-dropdown-item:not([separator]):not([separator=true])'\n );\n this.selectOption(option);\n if (this.multiple) return;\n this.popoverState.emit({ open: false, action: 'select' });\n };\n\n /* tslint:disable:cyclomatic-complexity */\n externalKeydownHandler = (event: KeyboardEvent) => {\n const { key } = event;\n\n // Allow modifier-only keys to propagate without being handled\n const modifierOnlyKeys = ['Shift', 'Control', 'Alt', 'Meta'];\n if (modifierOnlyKeys.includes(key)) return;\n\n event.stopPropagation();\n const { activeIndex, customSearch, allOptions } = this;\n\n let nextIndex;\n switch (key) {\n case ' ':\n if (this.searchString) {\n if (customSearch) break;\n\n this.searchOptions(key, true);\n break;\n } else if (this.type === 'menu') {\n this.activeIndex = 0;\n this.openDropdownWithActiveElement(0);\n } else {\n this.setDefaultActiveElement();\n nextPaint(() => this.popoverState.emit({ open: true, action: 'open' }));\n }\n break;\n\n case 'Enter':\n if (this.type === 'menu') {\n this.activeIndex = 0;\n this.openDropdownWithActiveElement(0);\n } else {\n this.setDefaultActiveElement();\n nextPaint(() => this.popoverState.emit({ open: true, action: 'open' }));\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n nextIndex = !!this.selectedOptions.length ? this.getDefaultActiveIndex() : this.getNextVisibleIndex(-1);\n if (nextIndex === -1) break;\n this.openDropdownWithActiveElement(nextIndex);\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n nextIndex = !!this.selectedOptions.length ? this.getDefaultActiveIndex() : this.getNextVisibleIndex(1);\n if (nextIndex === -1) break;\n this.openDropdownWithActiveElement(nextIndex);\n break;\n\n case 'Home':\n event.preventDefault();\n this.openDropdownWithActiveElement(0);\n break;\n\n case 'End':\n event.preventDefault();\n this.openDropdownWithActiveElement(allOptions.length - 1);\n break;\n\n case 'PageUp':\n event.preventDefault();\n this.openDropdownWithActiveElement(Math.max((activeIndex || 0) - 10, 0));\n break;\n\n case 'PageDown':\n event.preventDefault();\n this.openDropdownWithActiveElement(Math.min((activeIndex || 0) + 10, allOptions.length - 1));\n break;\n\n case 'Tab':\n this.popoverState.emit({ open: false, action: 'close' });\n break;\n\n case 'Esc':\n case 'Escape':\n if (this.noSelect) this.setActiveElement(null);\n this.popoverState.emit({ open: false, action: 'close' });\n break;\n\n default:\n if (customSearch) break;\n if (!key.match(/^[\\w]$/)) break;\n\n this.searchOptions(key, true);\n break;\n }\n };\n\n /* tslint:enable:cyclomatic-complexity */\n\n focusoutHandler = (event: FocusEvent) => {\n const { relatedTarget } = event as unknown as { relatedTarget: ValidOptionElements };\n const isInQ2OptionList = this.allOptions.includes(relatedTarget);\n const isInLightDom = !isInQ2OptionList && this.hostElement.contains(relatedTarget);\n if (isInQ2OptionList || isInLightDom) {\n event.stopPropagation();\n }\n };\n\n focusSelectedSibling(option: ValidOptionElements) {\n const { allVisibleOptions, allOptions } = this;\n const hasNoSiblings = allVisibleOptions.length < 2;\n if (hasNoSiblings) {\n this.showSelected = false;\n return;\n }\n\n const selectedOptionVisibleIndex = allVisibleOptions.indexOf(option);\n const nextVisibleSiblingIndex = selectedOptionVisibleIndex\n ? selectedOptionVisibleIndex - 1\n : selectedOptionVisibleIndex + 1;\n const nextVisibleSibling = allVisibleOptions[nextVisibleSiblingIndex];\n const nextSiblingIndex = allOptions.indexOf(nextVisibleSibling);\n\n this.activeIndex = nextSiblingIndex;\n this.setFocusedOption();\n this.scheduledAfterRender.push(() => {\n if (!('_multiSelectHidden' in option)) return;\n option._multiSelectHidden = !option.selected;\n });\n }\n\n getDefaultActiveIndex() {\n const { allOptions } = this;\n const firstSelected = allOptions.findIndex(element => {\n return 'selected' in element && element.selected;\n });\n if (firstSelected > -1) return firstSelected;\n\n const firstEnabled = allOptions.findIndex(element => !element.hidden);\n if (firstEnabled > -1) return firstEnabled;\n\n return 0;\n }\n\n getNextVisibleIndex(direction) {\n const { allVisibleOptions, allOptions, activeIndex } = this;\n const activeOption = allOptions[activeIndex];\n const visibleActiveOptionIndex = allVisibleOptions.indexOf(activeOption);\n let nextVisibleOptionIndex = visibleActiveOptionIndex + direction;\n\n if (nextVisibleOptionIndex < 0) {\n nextVisibleOptionIndex = allVisibleOptions.length - 1;\n } else if (nextVisibleOptionIndex > allVisibleOptions.length - 1) {\n nextVisibleOptionIndex = 0;\n }\n\n const nextVisibleOption = allVisibleOptions[nextVisibleOptionIndex];\n return allOptions.indexOf(nextVisibleOption);\n }\n\n getRootSlot(element: Element): Element[] {\n const slot = element.querySelector('slot');\n const assignedElements = slot?.assignedElements() ?? Array.from(element.children);\n const hasAnotherSlot = !!assignedElements.length && assignedElements[0].tagName === 'SLOT';\n if (hasAnotherSlot) {\n return this.getRootSlot(assignedElements[0]);\n } else {\n return assignedElements;\n }\n }\n\n internalKeydownHandler = (event: KeyboardEvent) => {\n event.stopPropagation();\n const { activeIndex, customSearch, allOptions, allVisibleOptions, multiple } = this;\n const { key, shiftKey } = event;\n\n let newOption: ValidOptionElements;\n switch (key) {\n case ' ':\n if (this.searchString && !this.multiple) {\n if (customSearch) break;\n\n this.searchOptions(key, false);\n break;\n }\n\n newOption = allOptions.find(element => element.active);\n if (!newOption || newOption.disabled) break;\n this.selectOption(newOption);\n if (multiple) break;\n this.hostElement.addEventListener(\n 'tctClick',\n () => {\n this.popoverState.emit({ open: false, action: 'select' });\n },\n { once: true }\n );\n\n break;\n\n case 'Enter':\n newOption = allOptions.find(element => element.active);\n if (!newOption || newOption.disabled) break;\n this.selectOption(newOption);\n if (multiple) break;\n this.hostElement.addEventListener(\n 'tctClick',\n () => {\n this.popoverState.emit({ open: false, action: 'select' });\n },\n { once: true }\n );\n break;\n\n case 'ArrowUp':\n case 'ArrowDown':\n // Guard: only process if an option is currently focused\n const focusedOption = document.activeElement;\n const isOptionFocused = this.allOptions.some(opt => opt === focusedOption);\n if (!isOptionFocused) return;\n\n event.preventDefault();\n if (key === 'ArrowUp') {\n const firstVisibleOption = allVisibleOptions[0];\n const isFirstVisibleOptionActive = firstVisibleOption.active;\n if (isFirstVisibleOptionActive) break;\n if (activeIndex === undefined) {\n this.setDefaultActiveElement();\n break;\n } else {\n const nextIndex = this.getNextVisibleIndex(-1);\n if (nextIndex === -1) break;\n this.adjustActiveOptionAndScroll(nextIndex - activeIndex);\n break;\n }\n } else {\n // ArrowDown\n const lastVisibleOption = allVisibleOptions[allVisibleOptions.length - 1];\n const isLastVisibleOptionActive = lastVisibleOption.active;\n if (isLastVisibleOptionActive) break;\n if (activeIndex === undefined) {\n this.setDefaultActiveElement();\n break;\n } else {\n const nextIndex = this.getNextVisibleIndex(1);\n if (nextIndex === -1) break;\n this.adjustActiveOptionAndScroll(nextIndex - activeIndex);\n break;\n }\n }\n\n case 'Home':\n event.preventDefault();\n this.openDropdownWithActiveElement(0);\n break;\n\n case 'End':\n event.preventDefault();\n this.openDropdownWithActiveElement(allOptions.length - 1);\n break;\n\n case 'PageUp':\n event.preventDefault();\n this.openDropdownWithActiveElement(Math.max(activeIndex - 10, 0));\n break;\n\n case 'PageDown':\n event.preventDefault();\n this.openDropdownWithActiveElement(Math.min(activeIndex + 10, allOptions.length - 1));\n break;\n\n case 'Tab':\n if (shiftKey) break;\n if (this.multiple && this.type === 'listbox') break;\n if (this.type === 'menu') {\n this.popoverState.emit({ open: false, action: 'close' });\n break;\n }\n\n newOption = allOptions.find(element => element.active);\n if (!newOption || newOption.disabled) return;\n this.selectOption(newOption);\n break;\n\n case 'Esc':\n case 'Escape':\n if (this.noSelect) this.setActiveElement(null);\n this.popoverState.emit({ open: false, action: 'close' });\n break;\n\n default:\n if (customSearch) break;\n if (!key.match(/^[\\w]$/)) break;\n\n this.searchOptions(key, false);\n break;\n }\n };\n\n async openDropdownWithActiveElement(activeIndex: number) {\n if (this.disabled) return;\n this.popoverState.emit({ open: true, action: 'open' });\n await waitForNextPaint();\n this.activeIndex = activeIndex;\n this.setActiveOption();\n this.setFocusedOption();\n this.scrollToActiveOption();\n }\n\n resetTimer() {\n if (this.searchStringTimer) {\n clearTimeout(this.searchStringTimer);\n }\n\n this.searchStringTimer = window.setTimeout(() => {\n this.searchString = null;\n }, 2000);\n }\n\n scrollToActiveOption() {\n const activeOption = this.allOptions[this.activeIndex];\n if (!activeOption) return;\n const { scrollX, scrollY } = window;\n activeOption.scrollIntoView({ block: 'center' });\n window.scrollTo(scrollX, scrollY);\n }\n\n searchAndFocus = (keyValue: string, shouldSelect: boolean) => {\n // pseudo search in non-searchable select\n const reorder = () => {\n this.pivotIndex = this.pivotIndex === undefined ? 0 : (this.activeIndex || 0) + 1;\n const list = this.allOptions.map((element, index) => ({ element, index }));\n return [...list.slice(this.pivotIndex), ...list.slice(0, this.pivotIndex)];\n };\n\n const buildQueue = () => {\n const now = new Date();\n if (now.getTime() - this.keyStore.lastPressedAt.getTime() > 1000) {\n // empty stored keys if delay > 1s\n this.keyStore.queue.length = 0;\n }\n if (this.keyStore.queue.length !== 1 || this.keyStore.queue[0] !== keyValue) {\n this.keyStore.queue.push(keyValue);\n }\n this.keyStore.lastPressedAt = now;\n };\n\n const searchIndex = (list: any[]) => {\n const keyStr = this.keyStore.queue.join('');\n const sanitizedKeyStr = sanitizeRegexString(keyStr);\n return list.find(v => {\n return (\n !v.element.disabled &&\n v.element.display &&\n (v.element.display.match(new RegExp(`^${sanitizedKeyStr}`, 'i')) ||\n v.element.display.replace(/\\s/g, '').match(new RegExp(`^${sanitizedKeyStr}`, 'i')))\n );\n });\n };\n\n const setFocus = ({ index }) => {\n if (this.multiple) {\n // multiple: should open to make sure that which options are selected\n this.openDropdownWithActiveElement(index);\n } else {\n this.activeIndex = index;\n if (shouldSelect) {\n this.selectOption(this.allOptions[index]);\n this.popoverState.emit({ open: false, action: 'select' });\n } else this.setActiveElement(index);\n }\n };\n\n buildQueue();\n const matched = searchIndex(reorder());\n if (matched) {\n setFocus(matched);\n }\n };\n\n searchOptions(key: string, shouldSelect?: boolean) {\n this.searchString = key;\n this.searchAndFocus(key, shouldSelect);\n }\n\n selectOption(selectedOption: ValidOptionElements) {\n const { multiple, noSelect, showSelected } = this;\n if (\n !selectedOption ||\n selectedOption.disabled ||\n ('disabledGroup' in selectedOption && selectedOption.disabledGroup)\n )\n return;\n const selectedValue = selectedOption.value;\n const displayValue =\n 'display' in selectedOption && selectedOption.display\n ? selectedOption.display\n : selectedOption.innerText.trim();\n const valueObject = {\n value: selectedValue,\n display: displayValue,\n };\n\n let values: OptionValue[] = [];\n if (multiple) {\n const { selectedOptions } = this;\n const isAlreadySelected = selectedOptions.find(option => option.value === selectedValue);\n\n if (isAlreadySelected) {\n values = selectedOptions.filter(({ value }) => value !== selectedValue);\n } else {\n values = [...selectedOptions, valueObject];\n }\n\n if (showSelected) this.focusSelectedSibling(selectedOption);\n } else {\n values = [valueObject];\n }\n\n if (noSelect) this.setActiveElement(null);\n else this.selectedOptions = values;\n\n mirrorEmit(this, ['change', 'tctChange'], { value: selectedValue, values });\n }\n\n setActiveOption() {\n const activeIndex = this.activeIndex;\n\n this.allOptions.forEach((element, elementIndex) => {\n element.active = activeIndex === elementIndex;\n });\n }\n\n setFocusedOption() {\n const option = this.allOptions[this.activeIndex];\n if (!option) return;\n\n const isOptionVisible = isVisible(option);\n if (isOptionVisible) option.focus({ preventScroll: true });\n else nextPaint(() => option.focus({ preventScroll: true }));\n }\n\n updateMultipleOptionAttrs() {\n const { allOptions, selectedOptions } = this;\n const selectedValues = selectedOptions.map(({ value }) => value);\n if (this.noSelect) return;\n allOptions.forEach(element => {\n if (!('selected' in element)) return;\n element.selected = selectedValues.includes(element.value);\n });\n }\n\n updateSingleOptionAttrs() {\n const { allOptions, selectedOptions } = this;\n const selectedValue = selectedOptions[0]?.value || undefined;\n if (this.noSelect) return;\n allOptions.forEach(element => {\n if (!('selected' in element)) return;\n element.selected = element.value === selectedValue;\n });\n }\n\n // #endregion\n // #region Render Methods\n\n render() {\n return (\n <Host>\n <div\n class=\"content\"\n ref={el => (this.contentElement = el)}\n onFocusout={this.focusoutHandler}\n >\n <div\n class=\"options\"\n aria-label={loc('tecton.element.optionList.label', [this.label])}\n aria-multiselectable={this.type === 'menu' ? undefined : this.multiple ? 'true' : undefined}\n role={this.type || 'listbox'}\n onKeyDown={this.internalKeydownHandler}\n onClick={this.clickHandler}\n >\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n\n // #endregion\n}\n","@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import './variables';\n\n.legacy {\n &.container {\n display: none;\n }\n\n &.show {\n display: block;\n z-index: var-list(--tct-popover-z-index, 50);\n }\n}\n\n@keyframes popoverOpen {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@keyframes popoverClose {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n}\n\n:popover-open,\n.show {\n position: absolute;\n margin: 0;\n padding: var-list(--tct-popover-padding, 0);\n overflow: auto;\n background: var-list(--tct-popover-background, --app-white, #ffffff);\n backdrop-filter: var-list(--tct-popover-backdrop-filter, none);\n color: var-list(--tct-popover-font-color, --t-text, #4d4d4d);\n min-width: var-list(--tct-popover-min-width, 135px);\n margin-block: var-list(--tct-popover-margin-block, 0);\n box-shadow: var-list(\n --tct-popover-box-shadow,\n --app-shadow-3,\n unquote('0px 0px 2px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.14)')\n );\n border-width: var-list(--tct-popover-border-width, 0);\n border-style: solid;\n border-color: var-list(--tct-popover-border-color, transparent);\n border-radius: var-list(--tct-popover-border-radius, 0);\n // the --comp variables are set via JS\n max-height: var(--comp-pop-max-height);\n left: var(--comp-pop-left);\n opacity: var(--comp-pop-opacity, 0);\n\n &.animating-open {\n animation-name: popoverOpen;\n animation-duration: var-list(--tct-popover-open-animation-duration, --t-tween-time-in-1, 150ms);\n animation-timing-function: var-list(--tct-popover-open-animation-timing-function, ease-out);\n animation-fill-mode: var-list(--tct-popover-open-animation-fill-mode, forwards);\n }\n\n &.animating-close {\n animation-name: popoverClose;\n animation-duration: var-list(--tct-popover-close-animation-duration, --t-tween-time-out-1, 100ms);\n animation-timing-function: var-list(--tct-popover-close-animation-timing-function, ease-in);\n animation-fill-mode: var-list(--tct-popover-close-animation-fill-mode, forwards);\n }\n\n // Respect user's motion preferences\n @media (prefers-reduced-motion: reduce) {\n &.animating-open,\n &.animating-close {\n animation: none;\n }\n }\n\n &.block {\n right: unset;\n width: var(--comp-pop-width);\n min-width: var-list(--tct-popover-min-width, unset);\n }\n\n &.left {\n left: var(--comp-pop-left);\n right: unset;\n }\n\n &.right {\n right: var(--comp-pop-right);\n left: unset;\n }\n\n &.down {\n top: var-list(--tct-popover-top, --comp-pop-top);\n bottom: unset;\n }\n\n &.up {\n top: unset;\n bottom: var(--comp-pop-bottom);\n }\n\n // Desktop: corner-based transform origin\n &.down.left:not(.mobile) {\n transform-origin: top left;\n }\n\n &.down.right:not(.mobile) {\n transform-origin: top right;\n }\n\n &.up.left:not(.mobile) {\n transform-origin: bottom left;\n }\n\n &.up.right:not(.mobile) {\n transform-origin: bottom right;\n }\n\n // Mobile: center-based transform origin\n &.mobile.down {\n transform-origin: center top;\n }\n\n &.mobile.up {\n transform-origin: center bottom;\n }\n\n @include tiny-scrollbar();\n}\n\nclick-elsewhere {\n position: relative;\n display: block;\n}\n","import {\n Component,\n Prop,\n h,\n ComponentInterface,\n Element,\n Watch,\n Method,\n Listen,\n EventEmitter,\n Event,\n State,\n} from '@stencil/core';\nimport { handleDeprecationWarning, waitForNextPaint, isMobile, isInScrollableContainer } from '../../utils';\nimport mirrorEmit from '@/utils/mirror-emit';\n\n/**\n * ***********\n * * WARNING *\n * ***********\n * Touching this file obligates you to manually test thoroughly, because Puppeteer can't capture every edgecase.\n *\n * Each of the following Scenarios must be tested on each Device, in each Environment.\n *\n * Scenarios:\n * - Q2 Select searchable\n * - Q2 Select non-searchable\n *\n * Orientations:\n * - Portrait\n * - Landscape\n *\n * Devices:\n * - iOS Safari\n * - Android Chrome\n * - MacOS Safari\n * - Chrome\n * - Firefox\n *\n * Environments:\n * - Standard (Outside of Iframe)\n * - SDK Extension (Inside of Iframe)\n */\n\n/**\n * @name Popover\n * @category Display\n * @summary Use for positioning floating content relative to a trigger element.\n */\n@Component({ tag: 'q2-popover', shadow: true, styleUrl: 'q2-popover.scss' })\nexport class Q2Popover implements ComponentInterface {\n // #region Own Properties\n\n containerElement: HTMLDivElement;\n contentElement: HTMLDivElement;\n /**\n * The number of pixels to leave between the popover and the edge of the viewport\n */\n displayBuffer = 10;\n orientationChanged: boolean = false;\n pendingAnimationResolve: (() => void) | null = null;\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n animationState: 'idle' | 'opening' | 'closing' = 'idle';\n\n @State()\n currentDirection: 'down' | 'up' = undefined;\n\n // remove `show` when we transitiong fully to Popover API and get rid of 'legacy' mode\n @State()\n show: boolean = false;\n\n // #endregion\n // #region Public Property API\n\n /** Aligns the popover to the left or right side of the control element. */\n @Prop({ reflect: true })\n align: 'left' | 'right' = 'left';\n\n /** Indicates the popover will match the width of its parent element. */\n @Prop({ reflect: true })\n block: boolean;\n\n /** The element that controls the popover's behavior. */\n @Prop()\n controlElement: HTMLElement;\n\n /**\n * Force the direction of the popover when it opens.\n * If no value is passed, the component will auto-detect the direction based on available space.\n */\n @Prop({ reflect: true })\n direction: 'up' | 'down';\n\n /**\n * Force the maximum height of the popover. This value will be interpreted as pixels.\n * If no value is passed, or the value exceeds available space, the component will auto-detect the maximum height based on available space.\n */\n @Prop()\n maxHeight: number;\n\n /** @deprecated */\n @Prop()\n minHeight: number;\n\n @Prop()\n mode: 'legacy' = null;\n\n /** Controls whether the popover is open or closed. */\n @Prop({ reflect: true, mutable: true })\n open: boolean;\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when the popover is opened or closed.\n * @deprecated Use 'tctPopoverStateChanged' instead\n */\n @Event()\n popoverStateChanged: EventEmitter<{ open: boolean }>;\n\n /**\n * Emitted when the popover is opened or closed.\n */\n @Event()\n tctPopoverStateChanged: EventEmitter<{ open: boolean }>;\n\n // #endregion\n // #region Component Lifecycle Events\n\n disconnectedCallback() {\n this.removeViewportListeners();\n if (this.pendingAnimationResolve) {\n this.pendingAnimationResolve();\n this.pendingAnimationResolve = null;\n }\n this.containerElement?.removeEventListener('toggle', this.handlePopoverToggleEvent);\n this.containerElement = null;\n this.contentElement = null;\n this.controlElement = null;\n }\n\n componentWillLoad() {\n if (!this.supportsPopoverAPI) {\n console.warn(\n 'The Popover API is not supported in this browser. Please update your browser to the latest version. The component will use legacy mode.'\n );\n this.mode = 'legacy';\n }\n }\n\n componentDidLoad() {\n this.handleMinHeight();\n if (this.supportsPopoverAPI) this.containerElement?.addEventListener('toggle', this.handlePopoverToggleEvent);\n if (this.open) this.determinePopDirection();\n }\n\n // #endregion\n // #region Listeners\n\n @Listen('popoverState')\n popoverStateHandler(event: CustomEvent<{ open: boolean }>) {\n const {\n detail: { open },\n } = event;\n if (open === this.open) return;\n\n this.open = open;\n event.stopPropagation();\n }\n\n // #endregion\n // #region Public Methods API\n\n @Method()\n async scrollContainerTo(options: ScrollToOptions) {\n this.containerElement?.scrollTo(options);\n }\n\n @Method()\n async toggle() {\n this.open = !this.open;\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('minHeight')\n minHeightProvided() {\n this.handleMinHeight();\n }\n\n @Watch('open')\n async openChanged(open: boolean) {\n mirrorEmit(this, ['popoverStateChanged', 'tctPopoverStateChanged'], { open });\n\n if (open) {\n this.animationState = 'opening';\n this.addViewportListeners();\n this.determinePopDirection();\n } else {\n this.animationState = 'closing';\n this.removeViewportListeners();\n\n // Wait for close animation to complete\n await new Promise<void>(resolve => {\n if (!this.containerElement) {\n resolve();\n return;\n }\n const handleAnimationEnd = () => {\n this.pendingAnimationResolve = null;\n resolve();\n };\n this.pendingAnimationResolve = handleAnimationEnd;\n this.containerElement.addEventListener('animationend', handleAnimationEnd, { once: true });\n });\n\n if (this.open) return;\n\n if (!this.containerElement) return;\n if (this.open) return;\n\n this.currentDirection = undefined;\n this.animationState = 'idle';\n if (this.mode === 'legacy' || !this.supportsPopoverAPI) {\n this.show = false;\n } else {\n this.containerElement?.hidePopover();\n }\n\n await waitForNextPaint();\n this.clearCSSProperties();\n }\n }\n\n // #endregion\n // #region Local Methods\n\n get isModule(): boolean {\n const isIframe = window !== window.top;\n const hasPlatformDimensions = Object.keys(window.Tecton?.platformDimensions ?? {}).length > 0;\n return isIframe && hasPlatformDimensions;\n }\n\n get providedDirection(): 'up' | 'down' | undefined {\n const { direction } = this;\n switch (direction) {\n case 'up':\n case 'down':\n return direction;\n default:\n return undefined;\n }\n }\n\n get supportsPopoverAPI(): boolean {\n return Object.hasOwn(HTMLElement.prototype, 'popover');\n }\n\n get validatedMaxHeight(): number | undefined {\n const { maxHeight } = this;\n return isNaN(maxHeight) ? undefined : maxHeight;\n }\n\n addViewportListeners() {\n window.addEventListener('resize', this.viewPortOrientationChanged);\n visualViewport?.addEventListener('resize', this.viewPortChanged);\n if (isInScrollableContainer(this.hostElement) && !isMobile()) {\n window.addEventListener('scroll', this.viewPortChanged, { passive: true, capture: true });\n }\n screen?.orientation?.addEventListener('orientationchange', this.viewPortOrientationChanged);\n window.addEventListener('orientationchange', this.viewPortOrientationChanged);\n }\n\n clearCSSProperties() {\n if (!this.containerElement) return;\n this.containerElement.style.removeProperty('--comp-pop-max-height');\n this.containerElement.style.removeProperty('--comp-pop-top');\n this.containerElement.style.removeProperty('--comp-pop-bottom');\n this.containerElement.style.removeProperty('--comp-pop-left');\n this.containerElement.style.removeProperty('--comp-pop-right');\n this.containerElement.style.removeProperty('--comp-pop-width');\n this.containerElement.style.removeProperty('--comp-pop-opacity');\n }\n\n async determinePopDirection() {\n const { containerElement, controlElement, providedDirection, displayBuffer } = this;\n if (containerElement) containerElement.style.maxHeight = null;\n await waitForNextPaint();\n if (!this.containerElement) return;\n\n const { isModule } = this;\n const { top: controlTop, bottom: controlBottom } = controlElement?.getBoundingClientRect?.() ?? {\n top: 0,\n bottom: 0,\n };\n\n let windowHeight: number;\n let maxSpaceAbove: number;\n let maxSpaceBelow: number;\n const isScrollableIframe = isModule && isInScrollableContainer(this.hostElement);\n if (isModule && !isScrollableIframe) {\n const {\n outletOffset = 0,\n innerHeight = window.innerHeight,\n top: topBarHeight = 0,\n bottom: bottomBarHeight = 0,\n } = window.Tecton?.platformDimensions || {};\n\n const distanceToIframeBottom = window.innerHeight - controlBottom;\n\n // controlElement position visually on the page\n const visualControlTop = outletOffset > 0 ? controlTop : controlTop + outletOffset - topBarHeight;\n const visualControlBottom = outletOffset + controlBottom - topBarHeight;\n\n // visual space around the controlElement\n const viewableSpaceAbove = visualControlTop;\n const viewableSpaceBelow = innerHeight - bottomBarHeight - visualControlBottom;\n\n // calculate space above and below controlElement\n const isIframeShorterThanWindow = distanceToIframeBottom < viewableSpaceBelow;\n maxSpaceAbove = viewableSpaceAbove - displayBuffer;\n maxSpaceBelow = isIframeShorterThanWindow\n ? distanceToIframeBottom - displayBuffer\n : viewableSpaceBelow - displayBuffer;\n } else {\n windowHeight = window.innerHeight;\n maxSpaceAbove = controlTop - displayBuffer;\n maxSpaceBelow = windowHeight - controlBottom - displayBuffer;\n }\n\n const directionWithMostSpace: 'up' | 'down' = maxSpaceAbove > maxSpaceBelow ? 'up' : 'down';\n\n // We do not want to update the max height once the popover is open unless the page orientation shifts (resize or mobile use cases)\n const shouldUpdateMaxHeight =\n !containerElement?.style.getPropertyValue('--comp-pop-max-height') || this.orientationChanged;\n // we do not want to constantly update the max-height after an orientation change, so we switch this back to false\n this.orientationChanged = false;\n const currentOrDetermineDirection = this.currentDirection || providedDirection || directionWithMostSpace;\n\n switch (currentOrDetermineDirection) {\n case 'up':\n if (shouldUpdateMaxHeight && containerElement) {\n const priorityMaxHeight = this.validatedMaxHeight || maxSpaceAbove;\n const maxHeight = Math.min(maxSpaceAbove, priorityMaxHeight);\n containerElement.style.setProperty('--comp-pop-max-height', `${maxHeight}px`);\n }\n this.setDirectionAndShow('up');\n break;\n case 'down':\n if (shouldUpdateMaxHeight && containerElement) {\n const priorityMaxHeight = this.validatedMaxHeight || maxSpaceBelow;\n const maxHeight = Math.min(maxSpaceBelow, priorityMaxHeight);\n containerElement.style.setProperty('--comp-pop-max-height', `${maxHeight}px`);\n }\n this.setDirectionAndShow('down');\n break;\n default:\n break;\n }\n }\n\n handleMinHeight = () => {\n if (this.minHeight) {\n handleDeprecationWarning(this, 'minHeight', 'prop');\n }\n };\n\n handlePopoverToggleEvent = (event: ToggleEvent) => {\n mirrorEmit(this, ['popoverStateChanged', 'tctPopoverStateChanged'], { open: event.newState === 'open' });\n };\n\n removeViewportListeners() {\n window.removeEventListener('resize', this.viewPortOrientationChanged);\n visualViewport?.removeEventListener('resize', this.viewPortChanged);\n window.removeEventListener('scroll', this.viewPortChanged, { capture: true });\n screen?.orientation?.removeEventListener('orientationchange', this.viewPortOrientationChanged);\n window.removeEventListener('orientationchange', this.viewPortOrientationChanged);\n }\n\n setAbsoluteCSSProperties = async () => {\n const { controlElement, containerElement, currentDirection, align } = this;\n if (!containerElement) return;\n\n if (align === 'right') {\n containerElement.style.setProperty('--comp-pop-right', '0');\n containerElement.style.setProperty('--comp-pop-left', 'unset');\n } else {\n containerElement.style.setProperty('--comp-pop-left', '0');\n containerElement.style.setProperty('--comp-pop-right', 'unset');\n }\n\n if (this.block) {\n containerElement.style.setProperty('--comp-pop-width', '100%');\n }\n\n if (currentDirection === 'up') {\n const controlStyle = getComputedStyle(controlElement);\n const controlSize =\n parseInt(controlStyle.height || '0') +\n parseInt(controlStyle.borderTopWidth || '0') +\n parseInt(controlStyle.borderBottomWidth || '0');\n\n containerElement.style.setProperty('--comp-pop-bottom', `${controlSize}px`);\n }\n\n // Wait for one paint to prevent layout thrashing\n await waitForNextPaint();\n if (this.containerElement) containerElement.style.setProperty('--comp-pop-opacity', '1');\n };\n\n setDirectionAndShow(direction: 'up' | 'down') {\n // Due to some runtime inconsistency across devices/browsers we need to add one more check here because the\n // popover can be closed between the time the popover is opened and the time the direction is determined\n const isOpen = this.open;\n if (!isOpen || !this.containerElement) return;\n\n this.currentDirection = direction;\n if (this.mode === 'legacy' || !this.supportsPopoverAPI) {\n this.show = true;\n this.setAbsoluteCSSProperties();\n } else {\n this.setPopoverAPICSSProperties();\n this.containerElement?.showPopover();\n }\n }\n\n setPopoverAPICSSProperties = async () => {\n const { controlElement, containerElement, currentDirection, isModule, align } = this;\n if (!containerElement) return;\n const {\n top: controlTop,\n bottom: controlBottom,\n left: controlLeft,\n right: controlRight,\n } = controlElement?.getBoundingClientRect?.() ?? {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n\n const popoverLeft: number = controlLeft;\n const popoverRight: number = window?.visualViewport?.width - controlRight;\n\n if (align === 'right') {\n containerElement.style.setProperty('--comp-pop-right', `${popoverRight - window.scrollX}px`);\n containerElement.style.setProperty('--comp-pop-left', 'unset');\n } else {\n containerElement.style.setProperty('--comp-pop-left', `${popoverLeft + window.scrollX}px`);\n containerElement.style.setProperty('--comp-pop-right', 'unset');\n }\n\n if (this.block) containerElement.style.setProperty('--comp-pop-width', `${controlElement?.offsetWidth || 0}px`);\n\n const isScrollableIframe = isModule && isInScrollableContainer(this.hostElement);\n\n if (currentDirection === 'up') {\n if (isModule && !isScrollableIframe) {\n containerElement.style.setProperty('--comp-pop-bottom', `${window.innerHeight - controlTop}px`);\n } else {\n containerElement.style.setProperty(\n '--comp-pop-bottom',\n `${window.innerHeight - controlTop - window.scrollY}px`\n );\n }\n }\n\n if (currentDirection === 'down') {\n if (isModule && !isScrollableIframe) {\n containerElement.style.setProperty('--comp-pop-top', `${controlBottom}px`);\n } else {\n containerElement.style.setProperty('--comp-pop-top', `${controlBottom + window.scrollY}px`);\n }\n }\n\n // Wait for one paint to prevent layout thrashing\n await waitForNextPaint();\n if (this.containerElement) containerElement.style.setProperty('--comp-pop-opacity', '1');\n };\n\n viewPortChanged = () => {\n if (!this.open) return;\n this.determinePopDirection();\n };\n\n viewPortOrientationChanged = () => {\n this.orientationChanged = true;\n this.viewPortChanged();\n };\n\n // #endregion\n // #region Render Methods\n\n render() {\n const containerClasses = ['container', this.currentDirection, this.align];\n if (isMobile()) containerClasses.push('mobile');\n if (this.show) containerClasses.push('show');\n if (this.block) containerClasses.push('block');\n if (this.mode === 'legacy') containerClasses.push('legacy');\n if (this.animationState === 'opening') containerClasses.push('animating-open');\n if (this.animationState === 'closing') containerClasses.push('animating-close');\n\n return (\n <div\n ref={el => (this.containerElement = el)}\n class={containerClasses.join(' ')}\n test-id=\"outerContainer\"\n tabIndex={-1}\n popover=\"manual\"\n >\n <div\n ref={el => (this.contentElement = el)}\n class=\"content\"\n >\n <slot />\n </div>\n </div>\n );\n }\n\n // #endregion\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["ClickElsewhere","constructor","hostRef","this","isCurrentlyFocused","mouseEventList","mouseHandler","event","shadowContains","findActiveElement","aboutToBeFocused","shadowEventTarget","originatesInSlots","target","mirrorEmit","windowBlurHandler","connectedCallback","forEach","eventName","document","addEventListener","window","disconnectedCallback","removeEventListener","componentWillLoad","workingElement","activeElement","shadowRoot","slots","hostElement","querySelectorAll","currentSlot","Array","from","lightNodes","assignedNodes","childNodes","currentNode","contains","child","parentNode","host","composedPath","sanitizeRegexString","regexString","replace","q2OptionListCss","Q2OptionList","keyStore","queue","lastPressedAt","Date","scheduledAfterRender","label","loc","selectedOptions","type","clickHandler","option","closest","selectOption","multiple","popoverState","emit","open","action","externalKeydownHandler","key","modifierOnlyKeys","includes","stopPropagation","activeIndex","customSearch","allOptions","nextIndex","searchString","searchOptions","openDropdownWithActiveElement","setDefaultActiveElement","nextPaint","preventDefault","length","getDefaultActiveIndex","getNextVisibleIndex","Math","max","min","noSelect","setActiveElement","match","focusoutHandler","relatedTarget","isInQ2OptionList","isInLightDom","internalKeydownHandler","allVisibleOptions","shiftKey","newOption","find","element","active","disabled","once","focusedOption","isOptionFocused","some","opt","firstVisibleOption","isFirstVisibleOptionActive","undefined","adjustActiveOptionAndScroll","lastVisibleOption","isLastVisibleOptionActive","searchAndFocus","keyValue","shouldSelect","reorder","pivotIndex","list","map","index","slice","buildQueue","now","getTime","push","searchIndex","keyStr","join","sanitizedKeyStr","v","display","RegExp","setFocus","matched","hasValidAncestor","hasOptions","componentDidLoad","overrideFocus","checkOptions","selectedOptionsUpdated","ready","componentDidRender","fn","handleClick","delegateFocus","isEventFromElement","setActiveOption","setFocusedOption","getContents","allContents","getOptions","handleExternalKeydown","updateMultipleOptionAttrs","updateSingleOptionAttrs","showSelectedUpdated","showSelected","_multiSelectHidden","selected","rootSlot","getRootSlot","acceptedTags","Set","filter","has","tagName","contents","extractOptions","elements","reduce","acc","separator","children","hidden","disabledGroup","numToAdd","scrollToActiveOption","optionRole","role","focusSelectedSibling","hasNoSiblings","selectedOptionVisibleIndex","indexOf","nextVisibleSiblingIndex","nextVisibleSibling","nextSiblingIndex","firstSelected","findIndex","firstEnabled","direction","activeOption","visibleActiveOptionIndex","nextVisibleOptionIndex","nextVisibleOption","slot","querySelector","assignedElements","_a","hasAnotherSlot","waitForNextPaint","resetTimer","searchStringTimer","clearTimeout","setTimeout","scrollX","scrollY","scrollIntoView","block","scrollTo","selectedOption","selectedValue","value","displayValue","innerText","trim","valueObject","values","isAlreadySelected","elementIndex","isOptionVisible","isVisible","focus","preventScroll","selectedValues","render","h","Host","class","ref","el","contentElement","onFocusout","onKeyDown","onClick","q2PopoverCss","Q2Popover","displayBuffer","orientationChanged","pendingAnimationResolve","animationState","currentDirection","show","align","mode","handleMinHeight","minHeight","handleDeprecationWarning","handlePopoverToggleEvent","newState","setAbsoluteCSSProperties","async","controlElement","containerElement","style","setProperty","controlStyle","getComputedStyle","controlSize","parseInt","height","borderTopWidth","borderBottomWidth","setPopoverAPICSSProperties","isModule","top","controlTop","bottom","controlBottom","left","controlLeft","right","controlRight","_b","getBoundingClientRect","call","popoverLeft","popoverRight","_c","visualViewport","width","fixedPositionContext","isInFixedPositionContext","offsetWidth","isScrollableIframe","isInScrollableContainer","innerHeight","viewPortChanged","determinePopDirection","viewPortOrientationChanged","removeViewportListeners","supportsPopoverAPI","console","warn","popoverStateHandler","detail","scrollContainerTo","options","toggle","minHeightProvided","openChanged","addViewportListeners","Promise","resolve","handleAnimationEnd","hidePopover","clearCSSProperties","isIframe","hasPlatformDimensions","Object","keys","Tecton","platformDimensions","providedDirection","hasOwn","HTMLElement","prototype","validatedMaxHeight","maxHeight","isNaN","isMobile","passive","capture","screen","orientation","removeProperty","windowHeight","maxSpaceAbove","maxSpaceBelow","outletOffset","topBarHeight","bottomBarHeight","distanceToIframeBottom","visualControlTop","visualControlBottom","viewableSpaceAbove","viewableSpaceBelow","isIframeShorterThanWindow","directionWithMostSpace","shouldUpdateMaxHeight","getPropertyValue","currentOrDetermineDirection","priorityMaxHeight","setDirectionAndShow","isOpen","showPopover","containerClasses","tabIndex","popover"],"sources":["src/components/click-elsewhere/click-elsewhere.tsx","src/utils/sanitize-regex-string.ts","src/components/q2-option-list/q2-option-list.scss?tag=q2-option-list&encapsulation=shadow","src/components/q2-option-list/q2-option-list.tsx","src/components/q2-popover/q2-popover.scss?tag=q2-popover&encapsulation=shadow","src/components/q2-popover/q2-popover.tsx"],"sourcesContent":["import { Component, ComponentInterface, Element, Event, EventEmitter } from '@stencil/core';\nimport mirrorEmit from '@/utils/mirror-emit';\n\n@Component({\n tag: 'click-elsewhere',\n shadow: false,\n})\nexport class ClickElsewhere implements ComponentInterface {\n // #region Own Properties\n\n isCurrentlyFocused: boolean = false;\n /**\n * Listens for mouse and window events that happen outside this click-elsewhere element so we can close popovers when users click outside them\n */\n mouseEventList: string[] = ['mousedown', 'dragstart', 'touchstart'];\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when the user clicks outside the element\n * @deprecated Use 'tctChange' instead\n */\n @Event()\n change: EventEmitter;\n\n /**\n * Emitted when the user clicks outside the element\n */\n @Event()\n tctChange: EventEmitter;\n\n // #endregion\n // #region Component Lifecycle Events\n\n /* tslint:enable:no-empty */\n\n connectedCallback() {\n this.mouseEventList.forEach((eventName: string) => {\n document.addEventListener(eventName, this.mouseHandler);\n });\n window.addEventListener('blur', this.windowBlurHandler);\n }\n\n disconnectedCallback() {\n this.mouseEventList.forEach((eventName: string) => {\n document.removeEventListener(eventName, this.mouseHandler);\n });\n window.removeEventListener('blur', this.windowBlurHandler);\n }\n\n /* TODO: Stencil/Rollup is having issues compiling without this here. Will try to remove in future Stencil upgrade. */\n /* tslint:disable:no-empty */\n componentWillLoad() {}\n\n // #endregion\n // #region Local Methods\n\n findActiveElement(): Element | null {\n let workingElement = document.activeElement!;\n while (true) {\n if (!workingElement || !workingElement.shadowRoot) {\n return workingElement;\n }\n workingElement = workingElement.shadowRoot.activeElement;\n }\n }\n\n mouseHandler = (event: Event): void => {\n const isCurrentlyFocused = this.shadowContains(this.findActiveElement());\n const aboutToBeFocused =\n this.shadowContains(this.shadowEventTarget(event)) || this.originatesInSlots(event.target as Element);\n\n if (!aboutToBeFocused && (this.isCurrentlyFocused || isCurrentlyFocused)) {\n this.isCurrentlyFocused = false;\n mirrorEmit(this, ['change', 'tctChange']);\n return;\n }\n this.isCurrentlyFocused = aboutToBeFocused || isCurrentlyFocused;\n };\n\n originatesInSlots(target: Element): boolean {\n const slots = this.hostElement.querySelectorAll('slot');\n for (const currentSlot of Array.from(slots)) {\n const lightNodes =\n (currentSlot && currentSlot.assignedNodes && currentSlot.assignedNodes()) ||\n this.hostElement.childNodes;\n\n for (const currentNode of Array.from(lightNodes)) {\n if (currentNode.contains(target)) {\n return true;\n }\n }\n }\n return false;\n }\n\n shadowContains(child: any): boolean {\n /**\n * shadow-dom enabled version of Node.contains()\n */\n\n while (true) {\n if (child === this.hostElement) {\n return true;\n }\n if (!child) {\n return false;\n }\n child = child.parentNode || child.host;\n }\n }\n\n shadowEventTarget(event: any): Element {\n return event.composedPath()[0] || event.target;\n }\n\n windowBlurHandler = (): void => {\n if (!this.isCurrentlyFocused) return;\n this.isCurrentlyFocused = false;\n mirrorEmit(this, ['change', 'tctChange']);\n };\n}\n","export default function sanitizeRegexString(regexString: string) {\n return regexString.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import './variables';\n\n:host {\n position: relative;\n width: 100%;\n display: block;\n line-height: var-list(var-prefixer(option-list-line-height),--app-line-height, 1.428571429em);\n}\n\n.content {\n text-align: start;\n\n :host([is-sizeable]) & {\n display: block;\n height: auto;\n }\n}\n","import { hasValidAncestor } from '@/utils/component';\nimport sanitizeRegexString from '@/utils/sanitize-regex-string';\nimport {\n Component,\n Prop,\n h,\n Event,\n State,\n Element,\n ComponentInterface,\n Host,\n EventEmitter,\n Method,\n Watch,\n Listen,\n} from '@stencil/core';\nimport { isEventFromElement, isVisible, loc, nextPaint, overrideFocus, waitForNextPaint } from 'src/utils';\nimport mirrorEmit from '@/utils/mirror-emit';\n\nexport interface OptionValue {\n value: string;\n display?: string;\n}\n\nexport type ValidOptionElements = HTMLQ2OptionElement | HTMLQ2DropdownItemElement;\n\n/**\n * @name Option List\n * @category Forms\n * @summary Use internally by Select and Dropdown for rendering searchable option lists.\n */\n@Component({ tag: 'q2-option-list', shadow: true, styleUrl: 'q2-option-list.scss' })\nexport class Q2OptionList implements ComponentInterface {\n // #region Own Properties\n\n activeIndex: number;\n contentElement: HTMLElement;\n keyStore: {\n queue: string[];\n lastPressedAt: Date;\n } = {\n queue: [],\n lastPressedAt: new Date(),\n };\n pivotIndex: number;\n scheduledAfterRender: (() => void)[] = [];\n searchString: string;\n searchStringTimer: number;\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n hasOptions: boolean;\n\n // #endregion\n // #region Public Property API\n\n @Prop({ reflect: true })\n align: 'left' | 'right';\n\n /** Indicates a custom search is being implemented for the option list. */\n @Prop({ reflect: true })\n customSearch: boolean;\n\n /** Disables the option list. */\n @Prop({ reflect: true })\n disabled: boolean;\n\n /** Determines the label that is applied to the option list for accessibility purposes. */\n @Prop()\n label: string = loc('tecton.element.optionList.label');\n\n /**\n * Enables the multi-select ability for the option list.\n * @info\n * Only applicable when options are provided.\n */\n @Prop({ reflect: true })\n multiple: boolean;\n\n /** Disables the logic that handles selecting and focusing an option in the option list. */\n @Prop({ reflect: true })\n noSelect: boolean;\n\n /** A list of the selected options on the element. */\n @Prop({ mutable: true })\n selectedOptions: OptionValue[] = [];\n\n /** Applies focus to the selected option. */\n @Prop({ reflect: true, mutable: true })\n showSelected: boolean;\n\n /** Translates to the role of the option list */\n @Prop()\n type: 'menu' | 'listbox' = 'listbox';\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when an option is selected or deselected.\n *\n * When the multi-select is enabled, the `value` property will be `undefined` and the `selectedOptions` property\n * will contain the selected option values.\n * @deprecated Use 'tctChange' instead\n */\n @Event()\n change: EventEmitter<{ value: string; values: OptionValue[] }>;\n\n /**\n * Emitted to indicate the intended state of the popover.\n * @private\n */\n @Event()\n popoverState: EventEmitter<{ open: boolean; action: 'close' | 'select' | 'open' }>;\n\n /**\n * Emitted when the component has finished rendering.\n * @private\n */\n @Event({ bubbles: false })\n ready: EventEmitter<undefined>;\n\n /**\n * Emitted when an option is selected or deselected.\n *\n * When the multi-select is enabled, the `value` property will be `undefined` and the `selectedOptions` property\n * will contain the selected option values.\n */\n @Event()\n tctChange: EventEmitter<{ value: string; values: OptionValue[] }>;\n\n // #endregion\n // #region Component Lifecycle Events\n\n componentWillLoad() {\n hasValidAncestor(this.hostElement, 'q2-select, q2-dropdown, q2-pill, q2-popover, q2-action-sheet');\n this.hasOptions = !!this.hostElement.querySelectorAll(\n 'q2-option:not([separator]):not([separator=true]), q2-dropdown-item:not([separator]):not([separator=true])'\n ).length;\n }\n\n componentDidLoad(): void {\n overrideFocus(this.hostElement);\n this.checkOptions();\n this.selectedOptionsUpdated();\n this.ready.emit();\n }\n\n componentDidRender() {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n }\n\n // #endregion\n // #region Listeners\n\n @Listen('click')\n handleClick(event: MouseEvent) {\n event.stopPropagation();\n }\n\n @Listen('focus')\n delegateFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n this.popoverState.emit({ open: true, action: 'open' });\n const { activeIndex } = this;\n if (typeof activeIndex === 'number' && activeIndex > -1) {\n this.setActiveOption();\n this.setFocusedOption();\n } else {\n this.setDefaultActiveElement();\n }\n }\n\n // #endregion\n // #region Public Methods API\n\n @Method()\n async getContents(): Promise<(HTMLQ2OptgroupElement | ValidOptionElements)[]> {\n return this.allContents;\n }\n\n @Method()\n async getOptions(): Promise<ValidOptionElements[]> {\n return this.allOptions;\n }\n\n @Method()\n async handleExternalKeydown(event: KeyboardEvent) {\n this.externalKeydownHandler(event);\n }\n\n @Method()\n async setActiveElement(index: number) {\n this.activeIndex = index;\n this.setActiveOption();\n this.setFocusedOption();\n }\n\n @Method()\n async setDefaultActiveElement() {\n this.activeIndex = this.getDefaultActiveIndex();\n this.setActiveOption();\n this.setFocusedOption();\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('selectedOptions')\n selectedOptionsUpdated() {\n if (this.multiple) {\n this.updateMultipleOptionAttrs();\n } else {\n this.updateSingleOptionAttrs();\n }\n }\n\n @Watch('showSelected')\n showSelectedUpdated(showSelected: boolean) {\n if (showSelected && this.selectedOptions.length === 0) {\n this.showSelected = false;\n return;\n }\n this.allOptions.forEach(option => {\n if (!('_multiSelectHidden' in option)) return;\n option._multiSelectHidden = showSelected ? !option.selected : false;\n });\n }\n\n // #endregion\n // #region Local Methods\n\n get allContents(): (HTMLQ2OptgroupElement | ValidOptionElements)[] {\n const rootSlot = this.getRootSlot(this.hostElement);\n const acceptedTags = new Set(['Q2-OPTGROUP', 'Q2-OPTION', 'Q2-DROPDOWN-ITEM']);\n return rootSlot.filter(element => acceptedTags.has(element.tagName)) as (\n | HTMLQ2OptgroupElement\n | ValidOptionElements\n )[];\n }\n\n get allOptions(): ValidOptionElements[] {\n const contents = this.allContents;\n\n const extractOptions = (\n elements: (HTMLQ2OptgroupElement | ValidOptionElements | Element)[]\n ): ValidOptionElements[] => {\n return elements.reduce((acc, element) => {\n if (element.tagName === 'Q2-OPTION' || element.tagName === 'Q2-DROPDOWN-ITEM') {\n return (element as ValidOptionElements).separator ? acc : [...acc, element];\n } else if (element.tagName === 'Q2-OPTGROUP') {\n return [...acc, ...extractOptions(Array.from(element.children))];\n } else {\n return acc;\n }\n }, []);\n };\n\n return extractOptions(contents);\n }\n\n get allVisibleOptions(): ValidOptionElements[] {\n return this.allOptions.filter(\n option =>\n !option.hidden &&\n (!('_multiSelectHidden' in option) || !option._multiSelectHidden) &&\n !option.disabled &&\n (!('disabledGroup' in option) || !option.disabledGroup)\n );\n }\n\n adjustActiveOptionAndScroll(numToAdd: number) {\n this.activeIndex += numToAdd;\n this.setActiveOption();\n this.setFocusedOption();\n this.scrollToActiveOption();\n }\n\n checkOptions() {\n const { type } = this;\n if (!type) return;\n const optionRole = type === 'menu' ? 'menuitem' : 'option';\n this.allOptions.forEach(option => {\n option.role = optionRole;\n });\n }\n\n clickHandler = (event: Event) => {\n const target = event.target as ValidOptionElements;\n const option = target.closest<ValidOptionElements>(\n 'q2-option:not([separator]):not([separator=true]), q2-dropdown-item:not([separator]):not([separator=true])'\n );\n this.selectOption(option);\n if (this.multiple) return;\n this.popoverState.emit({ open: false, action: 'select' });\n };\n\n /* tslint:disable:cyclomatic-complexity */\n externalKeydownHandler = (event: KeyboardEvent) => {\n const { key } = event;\n\n // Allow modifier-only keys to propagate without being handled\n const modifierOnlyKeys = ['Shift', 'Control', 'Alt', 'Meta'];\n if (modifierOnlyKeys.includes(key)) return;\n\n event.stopPropagation();\n const { activeIndex, customSearch, allOptions } = this;\n\n let nextIndex;\n switch (key) {\n case ' ':\n if (this.searchString) {\n if (customSearch) break;\n\n this.searchOptions(key, true);\n break;\n } else if (this.type === 'menu') {\n this.activeIndex = 0;\n this.openDropdownWithActiveElement(0);\n } else {\n this.setDefaultActiveElement();\n nextPaint(() => this.popoverState.emit({ open: true, action: 'open' }));\n }\n break;\n\n case 'Enter':\n if (this.type === 'menu') {\n this.activeIndex = 0;\n this.openDropdownWithActiveElement(0);\n } else {\n this.setDefaultActiveElement();\n nextPaint(() => this.popoverState.emit({ open: true, action: 'open' }));\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n nextIndex = !!this.selectedOptions.length ? this.getDefaultActiveIndex() : this.getNextVisibleIndex(-1);\n if (nextIndex === -1) break;\n this.openDropdownWithActiveElement(nextIndex);\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n nextIndex = !!this.selectedOptions.length ? this.getDefaultActiveIndex() : this.getNextVisibleIndex(1);\n if (nextIndex === -1) break;\n this.openDropdownWithActiveElement(nextIndex);\n break;\n\n case 'Home':\n event.preventDefault();\n this.openDropdownWithActiveElement(0);\n break;\n\n case 'End':\n event.preventDefault();\n this.openDropdownWithActiveElement(allOptions.length - 1);\n break;\n\n case 'PageUp':\n event.preventDefault();\n this.openDropdownWithActiveElement(Math.max((activeIndex || 0) - 10, 0));\n break;\n\n case 'PageDown':\n event.preventDefault();\n this.openDropdownWithActiveElement(Math.min((activeIndex || 0) + 10, allOptions.length - 1));\n break;\n\n case 'Tab':\n this.popoverState.emit({ open: false, action: 'close' });\n break;\n\n case 'Esc':\n case 'Escape':\n if (this.noSelect) this.setActiveElement(null);\n this.popoverState.emit({ open: false, action: 'close' });\n break;\n\n default:\n if (customSearch) break;\n if (!key.match(/^[\\w]$/)) break;\n\n this.searchOptions(key, true);\n break;\n }\n };\n\n /* tslint:enable:cyclomatic-complexity */\n\n focusoutHandler = (event: FocusEvent) => {\n const { relatedTarget } = event as unknown as { relatedTarget: ValidOptionElements };\n const isInQ2OptionList = this.allOptions.includes(relatedTarget);\n const isInLightDom = !isInQ2OptionList && this.hostElement.contains(relatedTarget);\n if (isInQ2OptionList || isInLightDom) {\n event.stopPropagation();\n }\n };\n\n focusSelectedSibling(option: ValidOptionElements) {\n const { allVisibleOptions, allOptions } = this;\n const hasNoSiblings = allVisibleOptions.length < 2;\n if (hasNoSiblings) {\n this.showSelected = false;\n return;\n }\n\n const selectedOptionVisibleIndex = allVisibleOptions.indexOf(option);\n const nextVisibleSiblingIndex = selectedOptionVisibleIndex\n ? selectedOptionVisibleIndex - 1\n : selectedOptionVisibleIndex + 1;\n const nextVisibleSibling = allVisibleOptions[nextVisibleSiblingIndex];\n const nextSiblingIndex = allOptions.indexOf(nextVisibleSibling);\n\n this.activeIndex = nextSiblingIndex;\n this.setFocusedOption();\n this.scheduledAfterRender.push(() => {\n if (!('_multiSelectHidden' in option)) return;\n option._multiSelectHidden = !option.selected;\n });\n }\n\n getDefaultActiveIndex() {\n const { allOptions } = this;\n const firstSelected = allOptions.findIndex(element => {\n return 'selected' in element && element.selected;\n });\n if (firstSelected > -1) return firstSelected;\n\n const firstEnabled = allOptions.findIndex(element => !element.hidden);\n if (firstEnabled > -1) return firstEnabled;\n\n return 0;\n }\n\n getNextVisibleIndex(direction) {\n const { allVisibleOptions, allOptions, activeIndex } = this;\n const activeOption = allOptions[activeIndex];\n const visibleActiveOptionIndex = allVisibleOptions.indexOf(activeOption);\n let nextVisibleOptionIndex = visibleActiveOptionIndex + direction;\n\n if (nextVisibleOptionIndex < 0) {\n nextVisibleOptionIndex = allVisibleOptions.length - 1;\n } else if (nextVisibleOptionIndex > allVisibleOptions.length - 1) {\n nextVisibleOptionIndex = 0;\n }\n\n const nextVisibleOption = allVisibleOptions[nextVisibleOptionIndex];\n return allOptions.indexOf(nextVisibleOption);\n }\n\n getRootSlot(element: Element): Element[] {\n const slot = element.querySelector('slot');\n const assignedElements = slot?.assignedElements() ?? Array.from(element.children);\n const hasAnotherSlot = !!assignedElements.length && assignedElements[0].tagName === 'SLOT';\n if (hasAnotherSlot) {\n return this.getRootSlot(assignedElements[0]);\n } else {\n return assignedElements;\n }\n }\n\n internalKeydownHandler = (event: KeyboardEvent) => {\n event.stopPropagation();\n const { activeIndex, customSearch, allOptions, allVisibleOptions, multiple } = this;\n const { key, shiftKey } = event;\n\n let newOption: ValidOptionElements;\n switch (key) {\n case ' ':\n if (this.searchString && !this.multiple) {\n if (customSearch) break;\n\n this.searchOptions(key, false);\n break;\n }\n\n newOption = allOptions.find(element => element.active);\n if (!newOption || newOption.disabled) break;\n this.selectOption(newOption);\n if (multiple) break;\n this.hostElement.addEventListener(\n 'tctClick',\n () => {\n this.popoverState.emit({ open: false, action: 'select' });\n },\n { once: true }\n );\n\n break;\n\n case 'Enter':\n newOption = allOptions.find(element => element.active);\n if (!newOption || newOption.disabled) break;\n this.selectOption(newOption);\n if (multiple) break;\n this.hostElement.addEventListener(\n 'tctClick',\n () => {\n this.popoverState.emit({ open: false, action: 'select' });\n },\n { once: true }\n );\n break;\n\n case 'ArrowUp':\n case 'ArrowDown':\n // Guard: only process if an option is currently focused\n const focusedOption = document.activeElement;\n const isOptionFocused = this.allOptions.some(opt => opt === focusedOption);\n if (!isOptionFocused) return;\n\n event.preventDefault();\n if (key === 'ArrowUp') {\n const firstVisibleOption = allVisibleOptions[0];\n const isFirstVisibleOptionActive = firstVisibleOption.active;\n if (isFirstVisibleOptionActive) break;\n if (activeIndex === undefined) {\n this.setDefaultActiveElement();\n break;\n } else {\n const nextIndex = this.getNextVisibleIndex(-1);\n if (nextIndex === -1) break;\n this.adjustActiveOptionAndScroll(nextIndex - activeIndex);\n break;\n }\n } else {\n // ArrowDown\n const lastVisibleOption = allVisibleOptions[allVisibleOptions.length - 1];\n const isLastVisibleOptionActive = lastVisibleOption.active;\n if (isLastVisibleOptionActive) break;\n if (activeIndex === undefined) {\n this.setDefaultActiveElement();\n break;\n } else {\n const nextIndex = this.getNextVisibleIndex(1);\n if (nextIndex === -1) break;\n this.adjustActiveOptionAndScroll(nextIndex - activeIndex);\n break;\n }\n }\n\n case 'Home':\n event.preventDefault();\n this.openDropdownWithActiveElement(0);\n break;\n\n case 'End':\n event.preventDefault();\n this.openDropdownWithActiveElement(allOptions.length - 1);\n break;\n\n case 'PageUp':\n event.preventDefault();\n this.openDropdownWithActiveElement(Math.max(activeIndex - 10, 0));\n break;\n\n case 'PageDown':\n event.preventDefault();\n this.openDropdownWithActiveElement(Math.min(activeIndex + 10, allOptions.length - 1));\n break;\n\n case 'Tab':\n if (shiftKey) break;\n if (this.multiple && this.type === 'listbox') break;\n if (this.type === 'menu') {\n this.popoverState.emit({ open: false, action: 'close' });\n break;\n }\n\n newOption = allOptions.find(element => element.active);\n if (!newOption || newOption.disabled) return;\n this.selectOption(newOption);\n break;\n\n case 'Esc':\n case 'Escape':\n if (this.noSelect) this.setActiveElement(null);\n this.popoverState.emit({ open: false, action: 'close' });\n break;\n\n default:\n if (customSearch) break;\n if (!key.match(/^[\\w]$/)) break;\n\n this.searchOptions(key, false);\n break;\n }\n };\n\n async openDropdownWithActiveElement(activeIndex: number) {\n if (this.disabled) return;\n this.popoverState.emit({ open: true, action: 'open' });\n await waitForNextPaint();\n this.activeIndex = activeIndex;\n this.setActiveOption();\n this.setFocusedOption();\n this.scrollToActiveOption();\n }\n\n resetTimer() {\n if (this.searchStringTimer) {\n clearTimeout(this.searchStringTimer);\n }\n\n this.searchStringTimer = window.setTimeout(() => {\n this.searchString = null;\n }, 2000);\n }\n\n scrollToActiveOption() {\n const activeOption = this.allOptions[this.activeIndex];\n if (!activeOption) return;\n const { scrollX, scrollY } = window;\n activeOption.scrollIntoView({ block: 'center' });\n window.scrollTo(scrollX, scrollY);\n }\n\n searchAndFocus = (keyValue: string, shouldSelect: boolean) => {\n // pseudo search in non-searchable select\n const reorder = () => {\n this.pivotIndex = this.pivotIndex === undefined ? 0 : (this.activeIndex || 0) + 1;\n const list = this.allOptions.map((element, index) => ({ element, index }));\n return [...list.slice(this.pivotIndex), ...list.slice(0, this.pivotIndex)];\n };\n\n const buildQueue = () => {\n const now = new Date();\n if (now.getTime() - this.keyStore.lastPressedAt.getTime() > 1000) {\n // empty stored keys if delay > 1s\n this.keyStore.queue.length = 0;\n }\n if (this.keyStore.queue.length !== 1 || this.keyStore.queue[0] !== keyValue) {\n this.keyStore.queue.push(keyValue);\n }\n this.keyStore.lastPressedAt = now;\n };\n\n const searchIndex = (list: any[]) => {\n const keyStr = this.keyStore.queue.join('');\n const sanitizedKeyStr = sanitizeRegexString(keyStr);\n return list.find(v => {\n return (\n !v.element.disabled &&\n v.element.display &&\n (v.element.display.match(new RegExp(`^${sanitizedKeyStr}`, 'i')) ||\n v.element.display.replace(/\\s/g, '').match(new RegExp(`^${sanitizedKeyStr}`, 'i')))\n );\n });\n };\n\n const setFocus = ({ index }) => {\n if (this.multiple) {\n // multiple: should open to make sure that which options are selected\n this.openDropdownWithActiveElement(index);\n } else {\n this.activeIndex = index;\n if (shouldSelect) {\n this.selectOption(this.allOptions[index]);\n this.popoverState.emit({ open: false, action: 'select' });\n } else this.setActiveElement(index);\n }\n };\n\n buildQueue();\n const matched = searchIndex(reorder());\n if (matched) {\n setFocus(matched);\n }\n };\n\n searchOptions(key: string, shouldSelect?: boolean) {\n this.searchString = key;\n this.searchAndFocus(key, shouldSelect);\n }\n\n selectOption(selectedOption: ValidOptionElements) {\n const { multiple, noSelect, showSelected } = this;\n if (\n !selectedOption ||\n selectedOption.disabled ||\n ('disabledGroup' in selectedOption && selectedOption.disabledGroup)\n )\n return;\n const selectedValue = selectedOption.value;\n const displayValue =\n 'display' in selectedOption && selectedOption.display\n ? selectedOption.display\n : selectedOption.innerText.trim();\n const valueObject = {\n value: selectedValue,\n display: displayValue,\n };\n\n let values: OptionValue[] = [];\n if (multiple) {\n const { selectedOptions } = this;\n const isAlreadySelected = selectedOptions.find(option => option.value === selectedValue);\n\n if (isAlreadySelected) {\n values = selectedOptions.filter(({ value }) => value !== selectedValue);\n } else {\n values = [...selectedOptions, valueObject];\n }\n\n if (showSelected) this.focusSelectedSibling(selectedOption);\n } else {\n values = [valueObject];\n }\n\n if (noSelect) this.setActiveElement(null);\n else this.selectedOptions = values;\n\n mirrorEmit(this, ['change', 'tctChange'], { value: selectedValue, values });\n }\n\n setActiveOption() {\n const activeIndex = this.activeIndex;\n\n this.allOptions.forEach((element, elementIndex) => {\n element.active = activeIndex === elementIndex;\n });\n }\n\n setFocusedOption() {\n const option = this.allOptions[this.activeIndex];\n if (!option) return;\n\n const isOptionVisible = isVisible(option);\n if (isOptionVisible) option.focus({ preventScroll: true });\n else nextPaint(() => option.focus({ preventScroll: true }));\n }\n\n updateMultipleOptionAttrs() {\n const { allOptions, selectedOptions } = this;\n const selectedValues = selectedOptions.map(({ value }) => value);\n if (this.noSelect) return;\n allOptions.forEach(element => {\n if (!('selected' in element)) return;\n element.selected = selectedValues.includes(element.value);\n });\n }\n\n updateSingleOptionAttrs() {\n const { allOptions, selectedOptions } = this;\n const selectedValue = selectedOptions[0]?.value || undefined;\n if (this.noSelect) return;\n allOptions.forEach(element => {\n if (!('selected' in element)) return;\n element.selected = element.value === selectedValue;\n });\n }\n\n // #endregion\n // #region Render Methods\n\n render() {\n return (\n <Host>\n <div\n class=\"content\"\n ref={el => (this.contentElement = el)}\n onFocusout={this.focusoutHandler}\n >\n <div\n class=\"options\"\n aria-label={loc('tecton.element.optionList.label', [this.label])}\n aria-multiselectable={this.type === 'menu' ? undefined : this.multiple ? 'true' : undefined}\n role={this.type || 'listbox'}\n onKeyDown={this.internalKeydownHandler}\n onClick={this.clickHandler}\n >\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n\n // #endregion\n}\n","@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import './variables';\n\n.legacy {\n &.container {\n display: none;\n }\n\n &.show {\n display: block;\n z-index: var-list(--tct-popover-z-index, 50);\n }\n}\n\n@keyframes popoverOpen {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@keyframes popoverClose {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n}\n\n:popover-open,\n.show {\n position: var(--comp-pop-position, absolute);\n margin: 0;\n padding: var-list(--tct-popover-padding, 0);\n overflow: auto;\n background: var-list(--tct-popover-background, --app-white, #ffffff);\n backdrop-filter: var-list(--tct-popover-backdrop-filter, none);\n color: var-list(--tct-popover-font-color, --t-text, #4d4d4d);\n min-width: var-list(--tct-popover-min-width, 135px);\n margin-block: var-list(--tct-popover-margin-block, 0);\n box-shadow: var-list(\n --tct-popover-box-shadow,\n --app-shadow-3,\n unquote('0px 0px 2px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.14)')\n );\n border-width: var-list(--tct-popover-border-width, 0);\n border-style: solid;\n border-color: var-list(--tct-popover-border-color, transparent);\n border-radius: var-list(--tct-popover-border-radius, 0);\n // the --comp variables are set via JS\n max-height: var(--comp-pop-max-height);\n left: var(--comp-pop-left);\n opacity: var(--comp-pop-opacity, 0);\n\n &.animating-open {\n animation-name: popoverOpen;\n animation-duration: var-list(--tct-popover-open-animation-duration, --t-tween-time-in-1, 150ms);\n animation-timing-function: var-list(--tct-popover-open-animation-timing-function, ease-out);\n animation-fill-mode: var-list(--tct-popover-open-animation-fill-mode, forwards);\n }\n\n &.animating-close {\n animation-name: popoverClose;\n animation-duration: var-list(--tct-popover-close-animation-duration, --t-tween-time-out-1, 100ms);\n animation-timing-function: var-list(--tct-popover-close-animation-timing-function, ease-in);\n animation-fill-mode: var-list(--tct-popover-close-animation-fill-mode, forwards);\n }\n\n // Respect user's motion preferences\n @media (prefers-reduced-motion: reduce) {\n &.animating-open,\n &.animating-close {\n animation: none;\n }\n }\n\n &.block {\n right: unset;\n width: var(--comp-pop-width);\n min-width: var-list(--tct-popover-min-width, unset);\n }\n\n &.left {\n left: var(--comp-pop-left);\n right: unset;\n }\n\n &.right {\n right: var(--comp-pop-right);\n left: unset;\n }\n\n &.down {\n top: var-list(--tct-popover-top, --comp-pop-top);\n bottom: unset;\n }\n\n &.up {\n top: unset;\n bottom: var(--comp-pop-bottom);\n }\n\n // Desktop: corner-based transform origin\n &.down.left:not(.mobile) {\n transform-origin: top left;\n }\n\n &.down.right:not(.mobile) {\n transform-origin: top right;\n }\n\n &.up.left:not(.mobile) {\n transform-origin: bottom left;\n }\n\n &.up.right:not(.mobile) {\n transform-origin: bottom right;\n }\n\n // Mobile: center-based transform origin\n &.mobile.down {\n transform-origin: center top;\n }\n\n &.mobile.up {\n transform-origin: center bottom;\n }\n\n @include tiny-scrollbar();\n}\n\nclick-elsewhere {\n position: relative;\n display: block;\n}\n","import {\n Component,\n Prop,\n h,\n ComponentInterface,\n Element,\n Watch,\n Method,\n Listen,\n EventEmitter,\n Event,\n State,\n} from '@stencil/core';\nimport {\n handleDeprecationWarning,\n waitForNextPaint,\n isMobile,\n isInScrollableContainer,\n isInFixedPositionContext,\n} from '../../utils';\nimport mirrorEmit from '@/utils/mirror-emit';\n\n/**\n * ***********\n * * WARNING *\n * ***********\n * Touching this file obligates you to manually test thoroughly, because Puppeteer can't capture every edgecase.\n *\n * Each of the following Scenarios must be tested on each Device, in each Environment.\n *\n * Scenarios:\n * - Q2 Select searchable\n * - Q2 Select non-searchable\n *\n * Orientations:\n * - Portrait\n * - Landscape\n *\n * Devices:\n * - iOS Safari\n * - Android Chrome\n * - MacOS Safari\n * - Chrome\n * - Firefox\n *\n * Environments:\n * - Standard (Outside of Iframe)\n * - SDK Extension (Inside of Iframe)\n */\n\n/**\n * @name Popover\n * @category Display\n * @summary Use for positioning floating content relative to a trigger element.\n */\n@Component({ tag: 'q2-popover', shadow: true, styleUrl: 'q2-popover.scss' })\nexport class Q2Popover implements ComponentInterface {\n // #region Own Properties\n\n containerElement: HTMLDivElement;\n contentElement: HTMLDivElement;\n /**\n * The number of pixels to leave between the popover and the edge of the viewport\n */\n displayBuffer = 10;\n orientationChanged: boolean = false;\n pendingAnimationResolve: (() => void) | null = null;\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n animationState: 'idle' | 'opening' | 'closing' = 'idle';\n\n @State()\n currentDirection: 'down' | 'up' = undefined;\n\n // remove `show` when we transitiong fully to Popover API and get rid of 'legacy' mode\n @State()\n show: boolean = false;\n\n // #endregion\n // #region Public Property API\n\n /** Aligns the popover to the left or right side of the control element. */\n @Prop({ reflect: true })\n align: 'left' | 'right' = 'left';\n\n /** Indicates the popover will match the width of its parent element. */\n @Prop({ reflect: true })\n block: boolean;\n\n /** The element that controls the popover's behavior. */\n @Prop()\n controlElement: HTMLElement;\n\n /**\n * Force the direction of the popover when it opens.\n * If no value is passed, the component will auto-detect the direction based on available space.\n */\n @Prop({ reflect: true })\n direction: 'up' | 'down';\n\n /**\n * Force the maximum height of the popover. This value will be interpreted as pixels.\n * If no value is passed, or the value exceeds available space, the component will auto-detect the maximum height based on available space.\n */\n @Prop()\n maxHeight: number;\n\n /** @deprecated */\n @Prop()\n minHeight: number;\n\n @Prop()\n mode: 'legacy' = null;\n\n /** Controls whether the popover is open or closed. */\n @Prop({ reflect: true, mutable: true })\n open: boolean;\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when the popover is opened or closed.\n * @deprecated Use 'tctPopoverStateChanged' instead\n */\n @Event()\n popoverStateChanged: EventEmitter<{ open: boolean }>;\n\n /**\n * Emitted when the popover is opened or closed.\n */\n @Event()\n tctPopoverStateChanged: EventEmitter<{ open: boolean }>;\n\n // #endregion\n // #region Component Lifecycle Events\n\n disconnectedCallback() {\n this.removeViewportListeners();\n if (this.pendingAnimationResolve) {\n this.pendingAnimationResolve();\n this.pendingAnimationResolve = null;\n }\n this.containerElement?.removeEventListener('toggle', this.handlePopoverToggleEvent);\n this.containerElement = null;\n this.contentElement = null;\n this.controlElement = null;\n }\n\n componentWillLoad() {\n if (!this.supportsPopoverAPI) {\n console.warn(\n 'The Popover API is not supported in this browser. Please update your browser to the latest version. The component will use legacy mode.'\n );\n this.mode = 'legacy';\n }\n }\n\n componentDidLoad() {\n this.handleMinHeight();\n if (this.supportsPopoverAPI) this.containerElement?.addEventListener('toggle', this.handlePopoverToggleEvent);\n if (this.open) this.determinePopDirection();\n }\n\n // #endregion\n // #region Listeners\n\n @Listen('popoverState')\n popoverStateHandler(event: CustomEvent<{ open: boolean }>) {\n const {\n detail: { open },\n } = event;\n if (open === this.open) return;\n\n this.open = open;\n event.stopPropagation();\n }\n\n // #endregion\n // #region Public Methods API\n\n @Method()\n async scrollContainerTo(options: ScrollToOptions) {\n this.containerElement?.scrollTo(options);\n }\n\n @Method()\n async toggle() {\n this.open = !this.open;\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('minHeight')\n minHeightProvided() {\n this.handleMinHeight();\n }\n\n @Watch('open')\n async openChanged(open: boolean) {\n mirrorEmit(this, ['popoverStateChanged', 'tctPopoverStateChanged'], { open });\n\n if (open) {\n this.animationState = 'opening';\n this.addViewportListeners();\n this.determinePopDirection();\n } else {\n this.animationState = 'closing';\n this.removeViewportListeners();\n\n // Wait for close animation to complete\n await new Promise<void>(resolve => {\n if (!this.containerElement) {\n resolve();\n return;\n }\n const handleAnimationEnd = () => {\n this.pendingAnimationResolve = null;\n resolve();\n };\n this.pendingAnimationResolve = handleAnimationEnd;\n this.containerElement.addEventListener('animationend', handleAnimationEnd, { once: true });\n });\n\n if (this.open) return;\n\n if (!this.containerElement) return;\n if (this.open) return;\n\n this.currentDirection = undefined;\n this.animationState = 'idle';\n if (this.mode === 'legacy' || !this.supportsPopoverAPI) {\n this.show = false;\n } else {\n this.containerElement?.hidePopover();\n }\n\n await waitForNextPaint();\n this.clearCSSProperties();\n }\n }\n\n // #endregion\n // #region Local Methods\n\n get isModule(): boolean {\n const isIframe = window !== window.top;\n const hasPlatformDimensions = Object.keys(window.Tecton?.platformDimensions ?? {}).length > 0;\n return isIframe && hasPlatformDimensions;\n }\n\n get providedDirection(): 'up' | 'down' | undefined {\n const { direction } = this;\n switch (direction) {\n case 'up':\n case 'down':\n return direction;\n default:\n return undefined;\n }\n }\n\n get supportsPopoverAPI(): boolean {\n return Object.hasOwn(HTMLElement.prototype, 'popover');\n }\n\n get validatedMaxHeight(): number | undefined {\n const { maxHeight } = this;\n return isNaN(maxHeight) ? undefined : maxHeight;\n }\n\n addViewportListeners() {\n window.addEventListener('resize', this.viewPortOrientationChanged);\n visualViewport?.addEventListener('resize', this.viewPortChanged);\n if (isInScrollableContainer(this.hostElement) && !isMobile()) {\n window.addEventListener('scroll', this.viewPortChanged, { passive: true, capture: true });\n }\n screen?.orientation?.addEventListener('orientationchange', this.viewPortOrientationChanged);\n window.addEventListener('orientationchange', this.viewPortOrientationChanged);\n }\n\n clearCSSProperties() {\n if (!this.containerElement) return;\n this.containerElement.style.removeProperty('--comp-pop-max-height');\n this.containerElement.style.removeProperty('--comp-pop-top');\n this.containerElement.style.removeProperty('--comp-pop-bottom');\n this.containerElement.style.removeProperty('--comp-pop-left');\n this.containerElement.style.removeProperty('--comp-pop-right');\n this.containerElement.style.removeProperty('--comp-pop-width');\n this.containerElement.style.removeProperty('--comp-pop-opacity');\n this.containerElement.style.removeProperty('--comp-pop-position');\n }\n\n async determinePopDirection() {\n const { containerElement, controlElement, providedDirection, displayBuffer } = this;\n if (containerElement) containerElement.style.maxHeight = null;\n await waitForNextPaint();\n if (!this.containerElement) return;\n\n const { isModule } = this;\n const { top: controlTop, bottom: controlBottom } = controlElement?.getBoundingClientRect?.() ?? {\n top: 0,\n bottom: 0,\n };\n\n let windowHeight: number;\n let maxSpaceAbove: number;\n let maxSpaceBelow: number;\n const isScrollableIframe = isModule && isInScrollableContainer(this.hostElement);\n if (isModule && !isScrollableIframe) {\n const {\n outletOffset = 0,\n innerHeight = window.innerHeight,\n top: topBarHeight = 0,\n bottom: bottomBarHeight = 0,\n } = window.Tecton?.platformDimensions || {};\n\n const distanceToIframeBottom = window.innerHeight - controlBottom;\n\n // controlElement position visually on the page\n const visualControlTop = outletOffset > 0 ? controlTop : controlTop + outletOffset - topBarHeight;\n const visualControlBottom = outletOffset + controlBottom - topBarHeight;\n\n // visual space around the controlElement\n const viewableSpaceAbove = visualControlTop;\n const viewableSpaceBelow = innerHeight - bottomBarHeight - visualControlBottom;\n\n // calculate space above and below controlElement\n const isIframeShorterThanWindow = distanceToIframeBottom < viewableSpaceBelow;\n maxSpaceAbove = viewableSpaceAbove - displayBuffer;\n maxSpaceBelow = isIframeShorterThanWindow\n ? distanceToIframeBottom - displayBuffer\n : viewableSpaceBelow - displayBuffer;\n } else {\n windowHeight = window.innerHeight;\n maxSpaceAbove = controlTop - displayBuffer;\n maxSpaceBelow = windowHeight - controlBottom - displayBuffer;\n }\n\n const directionWithMostSpace: 'up' | 'down' = maxSpaceAbove > maxSpaceBelow ? 'up' : 'down';\n\n // We do not want to update the max height once the popover is open unless the page orientation shifts (resize or mobile use cases)\n const shouldUpdateMaxHeight =\n !containerElement?.style.getPropertyValue('--comp-pop-max-height') || this.orientationChanged;\n // we do not want to constantly update the max-height after an orientation change, so we switch this back to false\n this.orientationChanged = false;\n const currentOrDetermineDirection = this.currentDirection || providedDirection || directionWithMostSpace;\n\n switch (currentOrDetermineDirection) {\n case 'up':\n if (shouldUpdateMaxHeight && containerElement) {\n const priorityMaxHeight = this.validatedMaxHeight || maxSpaceAbove;\n const maxHeight = Math.min(maxSpaceAbove, priorityMaxHeight);\n containerElement.style.setProperty('--comp-pop-max-height', `${maxHeight}px`);\n }\n this.setDirectionAndShow('up');\n break;\n case 'down':\n if (shouldUpdateMaxHeight && containerElement) {\n const priorityMaxHeight = this.validatedMaxHeight || maxSpaceBelow;\n const maxHeight = Math.min(maxSpaceBelow, priorityMaxHeight);\n containerElement.style.setProperty('--comp-pop-max-height', `${maxHeight}px`);\n }\n this.setDirectionAndShow('down');\n break;\n default:\n break;\n }\n }\n\n handleMinHeight = () => {\n if (this.minHeight) {\n handleDeprecationWarning(this, 'minHeight', 'prop');\n }\n };\n\n handlePopoverToggleEvent = (event: ToggleEvent) => {\n mirrorEmit(this, ['popoverStateChanged', 'tctPopoverStateChanged'], { open: event.newState === 'open' });\n };\n\n removeViewportListeners() {\n window.removeEventListener('resize', this.viewPortOrientationChanged);\n visualViewport?.removeEventListener('resize', this.viewPortChanged);\n window.removeEventListener('scroll', this.viewPortChanged, { capture: true });\n screen?.orientation?.removeEventListener('orientationchange', this.viewPortOrientationChanged);\n window.removeEventListener('orientationchange', this.viewPortOrientationChanged);\n }\n\n setAbsoluteCSSProperties = async () => {\n const { controlElement, containerElement, currentDirection, align } = this;\n if (!containerElement) return;\n\n if (align === 'right') {\n containerElement.style.setProperty('--comp-pop-right', '0');\n containerElement.style.setProperty('--comp-pop-left', 'unset');\n } else {\n containerElement.style.setProperty('--comp-pop-left', '0');\n containerElement.style.setProperty('--comp-pop-right', 'unset');\n }\n\n if (this.block) {\n containerElement.style.setProperty('--comp-pop-width', '100%');\n }\n\n if (currentDirection === 'up') {\n const controlStyle = getComputedStyle(controlElement);\n const controlSize =\n parseInt(controlStyle.height || '0') +\n parseInt(controlStyle.borderTopWidth || '0') +\n parseInt(controlStyle.borderBottomWidth || '0');\n\n containerElement.style.setProperty('--comp-pop-bottom', `${controlSize}px`);\n }\n\n // Wait for one paint to prevent layout thrashing\n await waitForNextPaint();\n if (this.containerElement) containerElement.style.setProperty('--comp-pop-opacity', '1');\n };\n\n setDirectionAndShow(direction: 'up' | 'down') {\n // Due to some runtime inconsistency across devices/browsers we need to add one more check here because the\n // popover can be closed between the time the popover is opened and the time the direction is determined\n const isOpen = this.open;\n if (!isOpen || !this.containerElement) return;\n\n this.currentDirection = direction;\n if (this.mode === 'legacy' || !this.supportsPopoverAPI) {\n this.show = true;\n this.setAbsoluteCSSProperties();\n } else {\n this.setPopoverAPICSSProperties();\n this.containerElement?.showPopover();\n }\n }\n\n setPopoverAPICSSProperties = async () => {\n const { controlElement, containerElement, currentDirection, isModule, align } = this;\n if (!containerElement) return;\n const {\n top: controlTop,\n bottom: controlBottom,\n left: controlLeft,\n right: controlRight,\n } = controlElement?.getBoundingClientRect?.() ?? {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n\n const popoverLeft: number = controlLeft;\n const popoverRight: number = window?.visualViewport?.width - controlRight;\n const fixedPositionContext = isInFixedPositionContext(controlElement);\n const scrollX = fixedPositionContext ? 0 : window.scrollX;\n const scrollY = fixedPositionContext ? 0 : window.scrollY;\n containerElement.style.setProperty('--comp-pop-position', fixedPositionContext ? 'fixed' : 'absolute');\n\n if (align === 'right') {\n containerElement.style.setProperty('--comp-pop-right', `${popoverRight - scrollX}px`);\n containerElement.style.setProperty('--comp-pop-left', 'unset');\n } else {\n containerElement.style.setProperty('--comp-pop-left', `${popoverLeft + scrollX}px`);\n containerElement.style.setProperty('--comp-pop-right', 'unset');\n }\n\n if (this.block) containerElement.style.setProperty('--comp-pop-width', `${controlElement?.offsetWidth || 0}px`);\n\n const isScrollableIframe = isModule && isInScrollableContainer(this.hostElement);\n\n if (currentDirection === 'up') {\n if (isModule && !isScrollableIframe) {\n containerElement.style.setProperty('--comp-pop-bottom', `${window.innerHeight - controlTop}px`);\n } else {\n containerElement.style.setProperty(\n '--comp-pop-bottom',\n `${window.innerHeight - controlTop - scrollY}px`\n );\n }\n }\n\n if (currentDirection === 'down') {\n if (isModule && !isScrollableIframe) {\n containerElement.style.setProperty('--comp-pop-top', `${controlBottom}px`);\n } else {\n containerElement.style.setProperty('--comp-pop-top', `${controlBottom + scrollY}px`);\n }\n }\n\n // Wait for one paint to prevent layout thrashing\n await waitForNextPaint();\n if (this.containerElement) containerElement.style.setProperty('--comp-pop-opacity', '1');\n };\n\n viewPortChanged = () => {\n if (!this.open) return;\n this.determinePopDirection();\n };\n\n viewPortOrientationChanged = () => {\n this.orientationChanged = true;\n this.viewPortChanged();\n };\n\n // #endregion\n // #region Render Methods\n\n render() {\n const containerClasses = ['container', this.currentDirection, this.align];\n if (isMobile()) containerClasses.push('mobile');\n if (this.show) containerClasses.push('show');\n if (this.block) containerClasses.push('block');\n if (this.mode === 'legacy') containerClasses.push('legacy');\n if (this.animationState === 'opening') containerClasses.push('animating-open');\n if (this.animationState === 'closing') containerClasses.push('animating-close');\n\n return (\n <div\n ref={el => (this.containerElement = el)}\n class={containerClasses.join(' ')}\n test-id=\"outerContainer\"\n tabIndex={-1}\n popover=\"manual\"\n >\n <div\n ref={el => (this.contentElement = el)}\n class=\"content\"\n >\n <slot />\n </div>\n </div>\n );\n }\n\n // #endregion\n}\n"],"mappings":"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","ignoreList":[]}
|