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.
Files changed (197) hide show
  1. package/dist/bundle-report.json +262 -217
  2. package/dist/cjs/click-elsewhere.q2-option-list.q2-popover.entry.cjs.js.map +1 -1
  3. package/dist/cjs/click-elsewhere_3.cjs.entry.js +12 -7
  4. package/dist/cjs/click-elsewhere_3.cjs.entry.js.map +1 -1
  5. package/dist/cjs/{index-DmGkqdX2.js → index-De6jFdo_.js} +33 -22
  6. package/dist/cjs/index-De6jFdo_.js.map +1 -0
  7. package/dist/cjs/loader.cjs.js +1 -1
  8. package/dist/cjs/q2-action-group_2.cjs.entry.js +1 -1
  9. package/dist/cjs/q2-action-sheet.cjs.entry.js +1 -1
  10. package/dist/cjs/q2-badge.cjs.entry.js +1 -1
  11. package/dist/cjs/q2-btn_2.cjs.entry.js +1 -1
  12. package/dist/cjs/q2-calendar.cjs.entry.js +1 -1
  13. package/dist/cjs/q2-card-image.cjs.entry.js +1 -1
  14. package/dist/cjs/q2-card.cjs.entry.js +2 -2
  15. package/dist/cjs/q2-card.cjs.entry.js.map +1 -1
  16. package/dist/cjs/q2-card.entry.cjs.js.map +1 -1
  17. package/dist/cjs/q2-carousel-pane.cjs.entry.js +1 -1
  18. package/dist/cjs/q2-carousel.cjs.entry.js +1 -1
  19. package/dist/cjs/q2-chart-area.cjs.entry.js +1 -1
  20. package/dist/cjs/q2-chart-bar.cjs.entry.js +1 -1
  21. package/dist/cjs/q2-chart-donut.cjs.entry.js +1 -1
  22. package/dist/cjs/q2-checkbox-group.cjs.entry.js +1 -1
  23. package/dist/cjs/q2-checkbox.q2-tag.entry.cjs.js.map +1 -1
  24. package/dist/cjs/q2-checkbox_2.cjs.entry.js +47 -5
  25. package/dist/cjs/q2-checkbox_2.cjs.entry.js.map +1 -1
  26. package/dist/cjs/q2-context.cjs.entry.js +1 -1
  27. package/dist/cjs/q2-data-table.cjs.entry.js +1 -1
  28. package/dist/cjs/q2-detail.cjs.entry.js +1 -1
  29. package/dist/cjs/q2-dropdown-item.cjs.entry.js +1 -1
  30. package/dist/cjs/q2-dropdown.cjs.entry.js +1 -1
  31. package/dist/cjs/q2-editable-field.cjs.entry.js +1 -1
  32. package/dist/cjs/q2-file-picker.cjs.entry.js +1 -1
  33. package/dist/cjs/q2-icon.cjs.entry.js +1 -1
  34. package/dist/cjs/q2-input.cjs.entry.js +1 -1
  35. package/dist/cjs/q2-item.cjs.entry.js +1 -1
  36. package/dist/cjs/q2-link_2.cjs.entry.js +1 -1
  37. package/dist/cjs/q2-loc.cjs.entry.js +1 -1
  38. package/dist/cjs/q2-message.cjs.entry.js +1 -1
  39. package/dist/cjs/q2-meter.cjs.entry.js +1 -1
  40. package/dist/cjs/q2-modal.cjs.entry.js +1 -1
  41. package/dist/cjs/q2-month-picker.cjs.entry.js +1 -1
  42. package/dist/cjs/q2-optgroup.cjs.entry.js +1 -1
  43. package/dist/cjs/q2-option.cjs.entry.js +1 -1
  44. package/dist/cjs/q2-otp.cjs.entry.js +1 -1
  45. package/dist/cjs/q2-pagination.cjs.entry.js +1 -1
  46. package/dist/cjs/q2-pill.cjs.entry.js +1 -1
  47. package/dist/cjs/q2-radio-group.cjs.entry.js +1 -1
  48. package/dist/cjs/q2-radio.cjs.entry.js +1 -1
  49. package/dist/cjs/q2-relative-time.cjs.entry.js +1 -1
  50. package/dist/cjs/q2-section.cjs.entry.js +1 -1
  51. package/dist/cjs/q2-select.cjs.entry.js +1 -1
  52. package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
  53. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +1 -1
  54. package/dist/cjs/q2-stepper.cjs.entry.js +1 -1
  55. package/dist/cjs/q2-tab-container.cjs.entry.js +1 -1
  56. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  57. package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
  58. package/dist/cjs/q2-toast.cjs.entry.js +1 -1
  59. package/dist/cjs/q2-tooltip.cjs.entry.js +1 -1
  60. package/dist/collection/components/q2-card/q2-card.css +4 -2
  61. package/dist/collection/components/q2-checkbox/q2-checkbox.css +20 -4
  62. package/dist/collection/components/q2-checkbox/q2-checkbox.js +53 -3
  63. package/dist/collection/components/q2-checkbox/q2-checkbox.js.map +1 -1
  64. package/dist/collection/components/q2-popover/q2-popover.css +1 -1
  65. package/dist/collection/components/q2-popover/q2-popover.js +11 -6
  66. package/dist/collection/components/q2-popover/q2-popover.js.map +1 -1
  67. package/dist/collection/utils/index.js +30 -20
  68. package/dist/collection/utils/index.js.map +1 -1
  69. package/dist/components/index2.js +31 -21
  70. package/dist/components/index2.js.map +1 -1
  71. package/dist/components/q2-card.js +1 -1
  72. package/dist/components/q2-card.js.map +1 -1
  73. package/dist/components/q2-checkbox2.js +51 -6
  74. package/dist/components/q2-checkbox2.js.map +1 -1
  75. package/dist/components/q2-popover2.js +12 -7
  76. package/dist/components/q2-popover2.js.map +1 -1
  77. package/dist/components/q2-select2.js +1 -1
  78. package/dist/esm/click-elsewhere.q2-option-list.q2-popover.entry.js.map +1 -1
  79. package/dist/esm/click-elsewhere_3.entry.js +12 -7
  80. package/dist/esm/click-elsewhere_3.entry.js.map +1 -1
  81. package/dist/esm/{index-C5gj0T_3.js → index-CSlW4ulM.js} +33 -23
  82. package/dist/esm/index-CSlW4ulM.js.map +1 -0
  83. package/dist/esm/loader.js +1 -1
  84. package/dist/esm/q2-action-group_2.entry.js +1 -1
  85. package/dist/esm/q2-action-sheet.entry.js +1 -1
  86. package/dist/esm/q2-badge.entry.js +1 -1
  87. package/dist/esm/q2-btn_2.entry.js +1 -1
  88. package/dist/esm/q2-calendar.entry.js +1 -1
  89. package/dist/esm/q2-card-image.entry.js +1 -1
  90. package/dist/esm/q2-card.entry.js +2 -2
  91. package/dist/esm/q2-card.entry.js.map +1 -1
  92. package/dist/esm/q2-carousel-pane.entry.js +1 -1
  93. package/dist/esm/q2-carousel.entry.js +1 -1
  94. package/dist/esm/q2-chart-area.entry.js +1 -1
  95. package/dist/esm/q2-chart-bar.entry.js +1 -1
  96. package/dist/esm/q2-chart-donut.entry.js +1 -1
  97. package/dist/esm/q2-checkbox-group.entry.js +1 -1
  98. package/dist/esm/q2-checkbox.q2-tag.entry.js.map +1 -1
  99. package/dist/esm/q2-checkbox_2.entry.js +47 -5
  100. package/dist/esm/q2-checkbox_2.entry.js.map +1 -1
  101. package/dist/esm/q2-context.entry.js +1 -1
  102. package/dist/esm/q2-data-table.entry.js +1 -1
  103. package/dist/esm/q2-detail.entry.js +1 -1
  104. package/dist/esm/q2-dropdown-item.entry.js +1 -1
  105. package/dist/esm/q2-dropdown.entry.js +1 -1
  106. package/dist/esm/q2-editable-field.entry.js +1 -1
  107. package/dist/esm/q2-file-picker.entry.js +1 -1
  108. package/dist/esm/q2-icon.entry.js +1 -1
  109. package/dist/esm/q2-input.entry.js +1 -1
  110. package/dist/esm/q2-item.entry.js +1 -1
  111. package/dist/esm/q2-link_2.entry.js +1 -1
  112. package/dist/esm/q2-loc.entry.js +1 -1
  113. package/dist/esm/q2-message.entry.js +1 -1
  114. package/dist/esm/q2-meter.entry.js +1 -1
  115. package/dist/esm/q2-modal.entry.js +1 -1
  116. package/dist/esm/q2-month-picker.entry.js +1 -1
  117. package/dist/esm/q2-optgroup.entry.js +1 -1
  118. package/dist/esm/q2-option.entry.js +1 -1
  119. package/dist/esm/q2-otp.entry.js +1 -1
  120. package/dist/esm/q2-pagination.entry.js +1 -1
  121. package/dist/esm/q2-pill.entry.js +1 -1
  122. package/dist/esm/q2-radio-group.entry.js +1 -1
  123. package/dist/esm/q2-radio.entry.js +1 -1
  124. package/dist/esm/q2-relative-time.entry.js +1 -1
  125. package/dist/esm/q2-section.entry.js +1 -1
  126. package/dist/esm/q2-select.entry.js +1 -1
  127. package/dist/esm/q2-stepper-pane.entry.js +1 -1
  128. package/dist/esm/q2-stepper-vertical.entry.js +1 -1
  129. package/dist/esm/q2-stepper.entry.js +1 -1
  130. package/dist/esm/q2-tab-container.entry.js +1 -1
  131. package/dist/esm/q2-tecton-elements.js +1 -1
  132. package/dist/esm/q2-textarea.entry.js +1 -1
  133. package/dist/esm/q2-toast.entry.js +1 -1
  134. package/dist/esm/q2-tooltip.entry.js +1 -1
  135. package/dist/q2-tecton-elements/click-elsewhere.q2-option-list.q2-popover.entry.esm.js.map +1 -1
  136. package/dist/q2-tecton-elements/click-elsewhere_3.entry.js +29 -24
  137. package/dist/q2-tecton-elements/click-elsewhere_3.entry.js.map +1 -1
  138. package/dist/q2-tecton-elements/{index-C5gj0T_3.js → index-CSlW4ulM.js} +36 -24
  139. package/dist/q2-tecton-elements/index-CSlW4ulM.js.map +1 -0
  140. package/dist/q2-tecton-elements/q2-action-group_2.entry.js +1 -1
  141. package/dist/q2-tecton-elements/q2-action-sheet.entry.js +1 -1
  142. package/dist/q2-tecton-elements/q2-badge.entry.js +1 -1
  143. package/dist/q2-tecton-elements/q2-btn_2.entry.js +1 -1
  144. package/dist/q2-tecton-elements/q2-calendar.entry.js +1 -1
  145. package/dist/q2-tecton-elements/q2-card-image.entry.js +1 -1
  146. package/dist/q2-tecton-elements/q2-card.entry.esm.js.map +1 -1
  147. package/dist/q2-tecton-elements/q2-card.entry.js +2 -2
  148. package/dist/q2-tecton-elements/q2-card.entry.js.map +1 -1
  149. package/dist/q2-tecton-elements/q2-carousel-pane.entry.js +1 -1
  150. package/dist/q2-tecton-elements/q2-carousel.entry.js +1 -1
  151. package/dist/q2-tecton-elements/q2-chart-area.entry.js +1 -1
  152. package/dist/q2-tecton-elements/q2-chart-bar.entry.js +3 -3
  153. package/dist/q2-tecton-elements/q2-chart-donut.entry.js +4 -4
  154. package/dist/q2-tecton-elements/q2-checkbox-group.entry.js +1 -1
  155. package/dist/q2-tecton-elements/q2-checkbox.q2-tag.entry.esm.js.map +1 -1
  156. package/dist/q2-tecton-elements/q2-checkbox_2.entry.js +62 -23
  157. package/dist/q2-tecton-elements/q2-checkbox_2.entry.js.map +1 -1
  158. package/dist/q2-tecton-elements/q2-context.entry.js +1 -1
  159. package/dist/q2-tecton-elements/q2-data-table.entry.js +1 -1
  160. package/dist/q2-tecton-elements/q2-detail.entry.js +1 -1
  161. package/dist/q2-tecton-elements/q2-dropdown-item.entry.js +1 -1
  162. package/dist/q2-tecton-elements/q2-dropdown.entry.js +1 -1
  163. package/dist/q2-tecton-elements/q2-editable-field.entry.js +1 -1
  164. package/dist/q2-tecton-elements/q2-file-picker.entry.js +1 -1
  165. package/dist/q2-tecton-elements/q2-icon.entry.js +41 -41
  166. package/dist/q2-tecton-elements/q2-input.entry.js +1 -1
  167. package/dist/q2-tecton-elements/q2-item.entry.js +1 -1
  168. package/dist/q2-tecton-elements/q2-link_2.entry.js +1 -1
  169. package/dist/q2-tecton-elements/q2-loc.entry.js +1 -1
  170. package/dist/q2-tecton-elements/q2-message.entry.js +1 -1
  171. package/dist/q2-tecton-elements/q2-meter.entry.js +1 -1
  172. package/dist/q2-tecton-elements/q2-modal.entry.js +1 -1
  173. package/dist/q2-tecton-elements/q2-month-picker.entry.js +1 -1
  174. package/dist/q2-tecton-elements/q2-optgroup.entry.js +1 -1
  175. package/dist/q2-tecton-elements/q2-option.entry.js +1 -1
  176. package/dist/q2-tecton-elements/q2-otp.entry.js +1 -1
  177. package/dist/q2-tecton-elements/q2-pagination.entry.js +1 -1
  178. package/dist/q2-tecton-elements/q2-pill.entry.js +1 -1
  179. package/dist/q2-tecton-elements/q2-radio-group.entry.js +1 -1
  180. package/dist/q2-tecton-elements/q2-radio.entry.js +1 -1
  181. package/dist/q2-tecton-elements/q2-relative-time.entry.js +4 -4
  182. package/dist/q2-tecton-elements/q2-section.entry.js +1 -1
  183. package/dist/q2-tecton-elements/q2-select.entry.js +1 -1
  184. package/dist/q2-tecton-elements/q2-stepper-pane.entry.js +1 -1
  185. package/dist/q2-tecton-elements/q2-stepper-vertical.entry.js +1 -1
  186. package/dist/q2-tecton-elements/q2-stepper.entry.js +1 -1
  187. package/dist/q2-tecton-elements/q2-tab-container.entry.js +1 -1
  188. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  189. package/dist/q2-tecton-elements/q2-textarea.entry.js +1 -1
  190. package/dist/q2-tecton-elements/q2-toast.entry.js +1 -1
  191. package/dist/q2-tecton-elements/q2-tooltip.entry.js +1 -1
  192. package/dist/types/components/q2-checkbox/q2-checkbox.d.ts +11 -0
  193. package/dist/types/utils/index.d.ts +8 -2
  194. package/package.json +3 -3
  195. package/dist/cjs/index-DmGkqdX2.js.map +0 -1
  196. package/dist/esm/index-C5gj0T_3.js.map +0 -1
  197. 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, g as m } from "./index-C5gj0T_3.js";
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 b = class {
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 v = "*{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}";
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 w = class {
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
- w.style = v;
699
+ g.style = w;
700
700
 
701
- const g = "*{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: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}";
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 k = class {
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 m = ((e = window === null || window === void 0 ? void 0 : window.visualViewport) === null || e === void 0 ? void 0 : e.width) - d;
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", `${m - window.scrollX}px`);
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 + window.scrollX}px`);
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 b = r && f(this.hostElement);
779
+ const k = r && m(this.hostElement);
776
780
  if (n === "up") {
777
- if (r && !b) {
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 - window.scrollY}px`);
784
+ s.style.setProperty("--comp-pop-bottom", `${window.innerHeight - h - g}px`);
781
785
  }
782
786
  }
783
787
  if (n === "down") {
784
- if (r && !b) {
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 + window.scrollY}px`);
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 (f(this.hostElement) && !m()) {
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 m = a && f(this.hostElement);
956
- if (a && !m) {
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 (m()) t.push("mobile");
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: "4e167b9b7cd781936214e26f1bb1877816c539ad",
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: "6dfd13872cebe82c68d3f7282486b0d9d7e016bd",
1048
+ key: "458c91b003ec3f1bb2a42ac00c8ef829b4ef426b",
1044
1049
  ref: t => this.contentElement = t,
1045
1050
  class: "content"
1046
1051
  }, o("slot", {
1047
- key: "c682610288f06eaa2944fc5f0bef7a0eb145509d"
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
- k.style = g;
1066
+ x.style = k;
1062
1067
 
1063
- export { b as click_elsewhere, w as q2_option_list, k as q2_popover };
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":";;;;;;;;MAOaA,IAAc;EAJ3B,WAAAC,CAAAC;;;;;QAOIC,KAAkBC,qBAAY;;;eAI9BD,KAAcE,iBAAa,EAAC,aAAa,aAAa;IA4DtDF,KAAAG,eAAgBC;MACZ,MAAMH,IAAqBD,KAAKK,eAAeL,KAAKM;MACpD,MAAMC,IACFP,KAAKK,eAAeL,KAAKQ,kBAAkBJ,OAAWJ,KAAKS,kBAAkBL,EAAMM;MAEvF,KAAKH,MAAqBP,KAAKC,sBAAsBA,IAAqB;QACtED,KAAKC,qBAAqB;QAC1BU,EAAWX,MAAM,EAAC,UAAU;QAC5B;;MAEJA,KAAKC,qBAAqBM,KAAoBN;AAAkB;IAuCpED,KAAiBY,oBAAG;MAChB,KAAKZ,KAAKC,oBAAoB;MAC9BD,KAAKC,qBAAqB;MAC1BU,EAAWX,MAAM,EAAC,UAAU;AAAa;AAEhD;;;;EArFG,iBAAAa;IACIb,KAAKE,eAAeY,SAASC;MACzBC,SAASC,iBAAiBF,GAAWf,KAAKG;AAAa;IAE3De,OAAOD,iBAAiB,QAAQjB,KAAKY;;EAGzC,oBAAAO;IACInB,KAAKE,eAAeY,SAASC;MACzBC,SAASI,oBAAoBL,GAAWf,KAAKG;AAAa;IAE9De,OAAOE,oBAAoB,QAAQpB,KAAKY;;;iCAK5C,iBAAAS,IAAiB;;;EAKjB,iBAAAf;IACI,IAAIgB,IAAiBN,SAASO;IAC9B,OAAO,MAAM;MACT,KAAKD,MAAmBA,EAAeE,YAAY;QAC/C,OAAOF;;MAEXA,IAAiBA,EAAeE,WAAWD;;;EAiBnD,iBAAAd,CAAkBC;IACd,MAAMe,IAAQzB,KAAK0B,YAAYC,iBAAiB;IAChD,KAAK,MAAMC,KAAeC,MAAMC,KAAKL,IAAQ;MACzC,MAAMM,IACDH,KAAeA,EAAYI,iBAAiBJ,EAAYI,mBACzDhC,KAAK0B,YAAYO;MAErB,KAAK,MAAMC,KAAeL,MAAMC,KAAKC,IAAa;QAC9C,IAAIG,EAAYC,SAASzB,IAAS;UAC9B,OAAO;;;;IAInB,OAAO;;EAGX,cAAAL,CAAe+B;;;;IAKX,OAAO,MAAM;MACT,IAAIA,MAAUpC,KAAK0B,aAAa;QAC5B,OAAO;;MAEX,KAAKU,GAAO;QACR,OAAO;;MAEXA,IAAQA,EAAMC,cAAcD,EAAME;;;EAI1C,iBAAA9B,CAAkBJ;IACd,OAAOA,EAAMmC,eAAe,MAAMnC,EAAMM;;;;;;;ACxHxB,SAAA8B,oBAAoBC;EACxC,OAAOA,EAAYC,QAAQ,uBAAuB;AACtD;;ACFA,MAAMC,IAAkB;;MCgCXC,IAAY;EADzB,WAAA9C,CAAAC;;;;;;IAMIC,KAAA6C,WAGI;MACAC,OAAO;MACPC,eAAe,IAAIC;;IAGvBhD,KAAoBiD,uBAAmB;kGAgCvCjD,KAAAkD,QAAgBC,EAAI;6DAgBpBnD,KAAeoD,kBAAkB;wDAQjCpD,KAAIqD,OAAuB;IAmM3BrD,KAAAsD,eAAgBlD;MACZ,MAAMM,IAASN,EAAMM;MACrB,MAAM6C,IAAS7C,EAAO8C,QAClB;MAEJxD,KAAKyD,aAAaF;MAClB,IAAIvD,KAAK0D,UAAU;MACnB1D,KAAK2D,aAAaC,KAAK;QAAEC,MAAM;QAAOC,QAAQ;;AAAW;kDAI7D9D,KAAA+D,yBAA0B3D;MACtB,OAAM4D,KAAEA,KAAQ5D;;YAGhB,MAAM6D,IAAmB,EAAC,SAAS,WAAW,OAAO;MACrD,IAAIA,EAAiBC,SAASF,IAAM;MAEpC5D,EAAM+D;MACN,OAAMC,aAAEA,GAAWC,cAAEA,GAAYC,YAAEA,KAAetE;MAElD,IAAIuE;MACJ,QAAQP;OACJ,KAAK;QACD,IAAIhE,KAAKwE,cAAc;UACnB,IAAIH,GAAc;UAElBrE,KAAKyE,cAAcT,GAAK;UACxB;eACG,IAAIhE,KAAKqD,SAAS,QAAQ;UAC7BrD,KAAKoE,cAAc;UACnBpE,KAAK0E,8BAA8B;eAChC;UACH1E,KAAK2E;UACLC,GAAU,MAAM5E,KAAK2D,aAAaC,KAAK;YAAEC,MAAM;YAAMC,QAAQ;;;QAEjE;;OAEJ,KAAK;QACD,IAAI9D,KAAKqD,SAAS,QAAQ;UACtBrD,KAAKoE,cAAc;UACnBpE,KAAK0E,8BAA8B;eAChC;UACH1E,KAAK2E;UACLC,GAAU,MAAM5E,KAAK2D,aAAaC,KAAK;YAAEC,MAAM;YAAMC,QAAQ;;;QAEjE;;OAEJ,KAAK;QACD1D,EAAMyE;QACNN,MAAcvE,KAAKoD,gBAAgB0B,SAAS9E,KAAK+E,0BAA0B/E,KAAKgF,qBAAoB;QACpG,IAAIT,OAAc,GAAI;QACtBvE,KAAK0E,8BAA8BH;QACnC;;OAEJ,KAAK;QACDnE,EAAMyE;QACNN,MAAcvE,KAAKoD,gBAAgB0B,SAAS9E,KAAK+E,0BAA0B/E,KAAKgF,oBAAoB;QACpG,IAAIT,OAAc,GAAI;QACtBvE,KAAK0E,8BAA8BH;QACnC;;OAEJ,KAAK;QACDnE,EAAMyE;QACN7E,KAAK0E,8BAA8B;QACnC;;OAEJ,KAAK;QACDtE,EAAMyE;QACN7E,KAAK0E,8BAA8BJ,EAAWQ,SAAS;QACvD;;OAEJ,KAAK;QACD1E,EAAMyE;QACN7E,KAAK0E,8BAA8BO,KAAKC,KAAKd,KAAe,KAAK,IAAI;QACrE;;OAEJ,KAAK;QACDhE,EAAMyE;QACN7E,KAAK0E,8BAA8BO,KAAKE,KAAKf,KAAe,KAAK,IAAIE,EAAWQ,SAAS;QACzF;;OAEJ,KAAK;QACD9E,KAAK2D,aAAaC,KAAK;UAAEC,MAAM;UAAOC,QAAQ;;QAC9C;;OAEJ,KAAK;OACL,KAAK;QACD,IAAI9D,KAAKoF,UAAUpF,KAAKqF,iBAAiB;QACzCrF,KAAK2D,aAAaC,KAAK;UAAEC,MAAM;UAAOC,QAAQ;;QAC9C;;OAEJ;QACI,IAAIO,GAAc;QAClB,KAAKL,EAAIsB,MAAM,WAAW;QAE1BtF,KAAKyE,cAAcT,GAAK;QACxB;;;iDAMZhE,KAAAuF,kBAAmBnF;MACf,OAAMoF,eAAEA,KAAkBpF;MAC1B,MAAMqF,IAAmBzF,KAAKsE,WAAWJ,SAASsB;MAClD,MAAME,KAAgBD,KAAoBzF,KAAK0B,YAAYS,SAASqD;MACpE,IAAIC,KAAoBC,GAAc;QAClCtF,EAAM+D;;;IAmEdnE,KAAA2F,yBAA0BvF;MACtBA,EAAM+D;MACN,OAAMC,aAAEA,GAAWC,cAAEA,GAAYC,YAAEA,GAAUsB,mBAAEA,GAAiBlC,UAAEA,KAAa1D;MAC/E,OAAMgE,KAAEA,GAAG6B,UAAEA,KAAazF;MAE1B,IAAI0F;MACJ,QAAQ9B;OACJ,KAAK;QACD,IAAIhE,KAAKwE,iBAAiBxE,KAAK0D,UAAU;UACrC,IAAIW,GAAc;UAElBrE,KAAKyE,cAAcT,GAAK;UACxB;;QAGJ8B,IAAYxB,EAAWyB,MAAKC,KAAWA,EAAQC;QAC/C,KAAKH,KAAaA,EAAUI,UAAU;QACtClG,KAAKyD,aAAaqC;QAClB,IAAIpC,GAAU;QACd1D,KAAK0B,YAAYT,iBACb,aACA;UACIjB,KAAK2D,aAAaC,KAAK;YAAEC,MAAM;YAAOC,QAAQ;;AAAW,YAE7D;UAAEqC,MAAM;;QAGZ;;OAEJ,KAAK;QACDL,IAAYxB,EAAWyB,MAAKC,KAAWA,EAAQC;QAC/C,KAAKH,KAAaA,EAAUI,UAAU;QACtClG,KAAKyD,aAAaqC;QAClB,IAAIpC,GAAU;QACd1D,KAAK0B,YAAYT,iBACb,aACA;UACIjB,KAAK2D,aAAaC,KAAK;YAAEC,MAAM;YAAOC,QAAQ;;AAAW,YAE7D;UAAEqC,MAAM;;QAEZ;;OAEJ,KAAK;OACL,KAAK;;QAED,MAAMC,IAAgBpF,SAASO;QAC/B,MAAM8E,IAAkBrG,KAAKsE,WAAWgC,MAAKC,KAAOA,MAAQH;QAC5D,KAAKC,GAAiB;QAEtBjG,EAAMyE;QACN,IAAIb,MAAQ,WAAW;UACnB,MAAMwC,IAAqBZ,EAAkB;UAC7C,MAAMa,IAA6BD,EAAmBP;UACtD,IAAIQ,GAA4B;UAChC,IAAIrC,MAAgBsC,WAAW;YAC3B1G,KAAK2E;YACL;iBACG;YACH,MAAMJ,IAAYvE,KAAKgF,qBAAoB;YAC3C,IAAIT,OAAc,GAAI;YACtBvE,KAAK2G,4BAA4BpC,IAAYH;YAC7C;;eAED;;UAEH,MAAMwC,IAAoBhB,EAAkBA,EAAkBd,SAAS;UACvE,MAAM+B,IAA4BD,EAAkBX;UACpD,IAAIY,GAA2B;UAC/B,IAAIzC,MAAgBsC,WAAW;YAC3B1G,KAAK2E;YACL;iBACG;YACH,MAAMJ,IAAYvE,KAAKgF,oBAAoB;YAC3C,IAAIT,OAAc,GAAI;YACtBvE,KAAK2G,4BAA4BpC,IAAYH;YAC7C;;;;OAIZ,KAAK;QACDhE,EAAMyE;QACN7E,KAAK0E,8BAA8B;QACnC;;OAEJ,KAAK;QACDtE,EAAMyE;QACN7E,KAAK0E,8BAA8BJ,EAAWQ,SAAS;QACvD;;OAEJ,KAAK;QACD1E,EAAMyE;QACN7E,KAAK0E,8BAA8BO,KAAKC,IAAId,IAAc,IAAI;QAC9D;;OAEJ,KAAK;QACDhE,EAAMyE;QACN7E,KAAK0E,8BAA8BO,KAAKE,IAAIf,IAAc,IAAIE,EAAWQ,SAAS;QAClF;;OAEJ,KAAK;QACD,IAAIe,GAAU;QACd,IAAI7F,KAAK0D,YAAY1D,KAAKqD,SAAS,WAAW;QAC9C,IAAIrD,KAAKqD,SAAS,QAAQ;UACtBrD,KAAK2D,aAAaC,KAAK;YAAEC,MAAM;YAAOC,QAAQ;;UAC9C;;QAGJgC,IAAYxB,EAAWyB,MAAKC,KAAWA,EAAQC;QAC/C,KAAKH,KAAaA,EAAUI,UAAU;QACtClG,KAAKyD,aAAaqC;QAClB;;OAEJ,KAAK;OACL,KAAK;QACD,IAAI9F,KAAKoF,UAAUpF,KAAKqF,iBAAiB;QACzCrF,KAAK2D,aAAaC,KAAK;UAAEC,MAAM;UAAOC,QAAQ;;QAC9C;;OAEJ;QACI,IAAIO,GAAc;QAClB,KAAKL,EAAIsB,MAAM,WAAW;QAE1BtF,KAAKyE,cAAcT,GAAK;QACxB;;;IAgCZhE,KAAA8G,iBAAiB,CAACC,GAAkBC;;MAEhC,MAAMC,UAAU;QACZjH,KAAKkH,aAAalH,KAAKkH,eAAeR,YAAY,KAAK1G,KAAKoE,eAAe,KAAK;QAChF,MAAM+C,IAAOnH,KAAKsE,WAAW8C,KAAI,CAACpB,GAASqB,OAAK;UAAQrB;UAASqB;;QACjE,OAAO,KAAIF,EAAKG,MAAMtH,KAAKkH,gBAAgBC,EAAKG,MAAM,GAAGtH,KAAKkH;AAAY;MAG9E,MAAMK,aAAa;QACf,MAAMC,IAAM,IAAIxE;QAChB,IAAIwE,EAAIC,YAAYzH,KAAK6C,SAASE,cAAc0E,YAAY,KAAM;;UAE9DzH,KAAK6C,SAASC,MAAMgC,SAAS;;QAEjC,IAAI9E,KAAK6C,SAASC,MAAMgC,WAAW,KAAK9E,KAAK6C,SAASC,MAAM,OAAOiE,GAAU;UACzE/G,KAAK6C,SAASC,MAAM4E,KAAKX;;QAE7B/G,KAAK6C,SAASE,gBAAgByE;AAAG;MAGrC,MAAMG,cAAeR;QACjB,MAAMS,IAAS5H,KAAK6C,SAASC,MAAM+E,KAAK;QACxC,MAAMC,IAAkBtF,oBAAoBoF;QAC5C,OAAOT,EAAKpB,MAAKgC,MAERA,EAAE/B,QAAQE,YACX6B,EAAE/B,QAAQgC,YACTD,EAAE/B,QAAQgC,QAAQ1C,MAAM,IAAI2C,OAAO,IAAIH,KAAmB,SACvDC,EAAE/B,QAAQgC,QAAQtF,QAAQ,OAAO,IAAI4C,MAAM,IAAI2C,OAAO,IAAIH,KAAmB;AAEvF;MAGN,MAAMI,WAAW,EAAGb;QAChB,IAAIrH,KAAK0D,UAAU;;UAEf1D,KAAK0E,8BAA8B2C;eAChC;UACHrH,KAAKoE,cAAciD;UACnB,IAAIL,GAAc;YACdhH,KAAKyD,aAAazD,KAAKsE,WAAW+C;YAClCrH,KAAK2D,aAAaC,KAAK;cAAEC,MAAM;cAAOC,QAAQ;;iBAC3C9D,KAAKqF,iBAAiBgC;;;MAIrCE;MACA,MAAMY,IAAUR,YAAYV;MAC5B,IAAIkB,GAAS;QACTD,SAASC;;;AAiHpB;;;EAvoBG,iBAAA9G;IACI+G,EAAiBpI,KAAK0B,aAAa;IACnC1B,KAAKqI,eAAerI,KAAK0B,YAAYC,iBACjC,6GACFmD;;EAGN,gBAAAwD;IACIC,EAAcvI,KAAK0B;IACnB1B,KAAKwI;IACLxI,KAAKyI;IACLzI,KAAK0I,MAAM9E;;EAGf,kBAAA+E;IACI3I,KAAKiD,qBAAqBnC,SAAQ8H,KAAMA;IACxC5I,KAAKiD,uBAAuB;;;;EAOhC,WAAA4F,CAAYzI;IACRA,EAAM+D;;EAIV,aAAA2E,CAAc1I;IACV,KAAK2I,EAAmB3I,GAAOJ,KAAK0B,cAAc;IAClD1B,KAAK2D,aAAaC,KAAK;MAAEC,MAAM;MAAMC,QAAQ;;IAC7C,OAAMM,aAAEA,KAAgBpE;IACxB,WAAWoE,MAAgB,YAAYA,KAAc,GAAI;MACrDpE,KAAKgJ;MACLhJ,KAAKiJ;WACF;MACHjJ,KAAK2E;;;;;EAQb,iBAAMuE;IACF,OAAOlJ,KAAKmJ;;EAIhB,gBAAMC;IACF,OAAOpJ,KAAKsE;;EAIhB,2BAAM+E,CAAsBjJ;IACxBJ,KAAK+D,uBAAuB3D;;EAIhC,sBAAMiF,CAAiBgC;IACnBrH,KAAKoE,cAAciD;IACnBrH,KAAKgJ;IACLhJ,KAAKiJ;;EAIT,6BAAMtE;IACF3E,KAAKoE,cAAcpE,KAAK+E;IACxB/E,KAAKgJ;IACLhJ,KAAKiJ;;;;EAOT,sBAAAR;IACI,IAAIzI,KAAK0D,UAAU;MACf1D,KAAKsJ;WACF;MACHtJ,KAAKuJ;;;EAKb,mBAAAC,CAAoBC;IAChB,IAAIA,KAAgBzJ,KAAKoD,gBAAgB0B,WAAW,GAAG;MACnD9E,KAAKyJ,eAAe;MACpB;;IAEJzJ,KAAKsE,WAAWxD,SAAQyC;MACpB,MAAM,wBAAwBA,IAAS;MACvCA,EAAOmG,qBAAqBD,KAAgBlG,EAAOoG,WAAW;AAAK;;;;EAO3E,eAAIR;IACA,MAAMS,IAAW5J,KAAK6J,YAAY7J,KAAK0B;IACvC,MAAMoI,IAAe,IAAIC,IAAI,EAAC,eAAe,aAAa;IAC1D,OAAOH,EAASI,QAAOhE,KAAW8D,EAAaG,IAAIjE,EAAQkE;;EAM/D,cAAI5F;IACA,MAAM6F,IAAWnK,KAAKmJ;IAEtB,MAAMiB,iBACFC,KAEOA,EAASC,QAAO,CAACC,GAAKvE;MACzB,IAAIA,EAAQkE,YAAY,eAAelE,EAAQkE,YAAY,oBAAoB;QAC3E,OAAQlE,EAAgCwE,YAAYD,IAAM,KAAIA,GAAKvE;aAChE,IAAIA,EAAQkE,YAAY,eAAe;QAC1C,OAAO,KAAIK,MAAQH,eAAevI,MAAMC,KAAKkE,EAAQyE;aAClD;QACH,OAAOF;;QAEZ;IAGP,OAAOH,eAAeD;;EAG1B,qBAAIvE;IACA,OAAO5F,KAAKsE,WAAW0F,QACnBzG,MACKA,EAAOmH,aACL,wBAAwBnH,OAAYA,EAAOmG,wBAC7CnG,EAAO2C,eACL,mBAAmB3C,OAAYA,EAAOoH;;EAIrD,2BAAAhE,CAA4BiE;IACxB5K,KAAKoE,eAAewG;IACpB5K,KAAKgJ;IACLhJ,KAAKiJ;IACLjJ,KAAK6K;;EAGT,YAAArC;IACI,OAAMnF,MAAEA,KAASrD;IACjB,KAAKqD,GAAM;IACX,MAAMyH,IAAazH,MAAS,SAAS,aAAa;IAClDrD,KAAKsE,WAAWxD,SAAQyC;MACpBA,EAAOwH,OAAOD;AAAU;;EAoHhC,oBAAAE,CAAqBzH;IACjB,OAAMqC,mBAAEA,GAAiBtB,YAAEA,KAAetE;IAC1C,MAAMiL,IAAgBrF,EAAkBd,SAAS;IACjD,IAAImG,GAAe;MACfjL,KAAKyJ,eAAe;MACpB;;IAGJ,MAAMyB,IAA6BtF,EAAkBuF,QAAQ5H;IAC7D,MAAM6H,IAA0BF,IAC1BA,IAA6B,IAC7BA,IAA6B;IACnC,MAAMG,IAAqBzF,EAAkBwF;IAC7C,MAAME,IAAmBhH,EAAW6G,QAAQE;IAE5CrL,KAAKoE,cAAckH;IACnBtL,KAAKiJ;IACLjJ,KAAKiD,qBAAqByE,MAAK;MAC3B,MAAM,wBAAwBnE,IAAS;MACvCA,EAAOmG,sBAAsBnG,EAAOoG;AAAQ;;EAIpD,qBAAA5E;IACI,OAAMT,YAAEA,KAAetE;IACvB,MAAMuL,IAAgBjH,EAAWkH,WAAUxF,KAChC,cAAcA,KAAWA,EAAQ2D;IAE5C,IAAI4B,KAAgB,GAAI,OAAOA;IAE/B,MAAME,IAAenH,EAAWkH,WAAUxF,MAAYA,EAAQ0E;IAC9D,IAAIe,KAAe,GAAI,OAAOA;IAE9B,OAAO;;EAGX,mBAAAzG,CAAoB0G;IAChB,OAAM9F,mBAAEA,GAAiBtB,YAAEA,GAAUF,aAAEA,KAAgBpE;IACvD,MAAM2L,IAAerH,EAAWF;IAChC,MAAMwH,IAA2BhG,EAAkBuF,QAAQQ;IAC3D,IAAIE,IAAyBD,IAA2BF;IAExD,IAAIG,IAAyB,GAAG;MAC5BA,IAAyBjG,EAAkBd,SAAS;WACjD,IAAI+G,IAAyBjG,EAAkBd,SAAS,GAAG;MAC9D+G,IAAyB;;IAG7B,MAAMC,IAAoBlG,EAAkBiG;IAC5C,OAAOvH,EAAW6G,QAAQW;;EAG9B,WAAAjC,CAAY7D;;IACR,MAAM+F,IAAO/F,EAAQgG,cAAc;IACnC,MAAMC,KAAmBC,IAAAH,MAAI,QAAJA,WAAI,aAAJA,EAAME,wBAAsB,QAAAC,WAAA,IAAAA,IAAArK,MAAMC,KAAKkE,EAAQyE;IACxE,MAAM0B,MAAmBF,EAAiBnH,UAAUmH,EAAiB,GAAG/B,YAAY;IACpF,IAAIiC,GAAgB;MAChB,OAAOnM,KAAK6J,YAAYoC,EAAiB;WACtC;MACH,OAAOA;;;EAoIf,mCAAMvH,CAA8BN;IAChC,IAAIpE,KAAKkG,UAAU;IACnBlG,KAAK2D,aAAaC,KAAK;MAAEC,MAAM;MAAMC,QAAQ;;UACvCsI;IACNpM,KAAKoE,cAAcA;IACnBpE,KAAKgJ;IACLhJ,KAAKiJ;IACLjJ,KAAK6K;;EAGT,UAAAwB;IACI,IAAIrM,KAAKsM,mBAAmB;MACxBC,aAAavM,KAAKsM;;IAGtBtM,KAAKsM,oBAAoBpL,OAAOsL,YAAW;MACvCxM,KAAKwE,eAAe;AAAI,QACzB;;EAGP,oBAAAqG;IACI,MAAMc,IAAe3L,KAAKsE,WAAWtE,KAAKoE;IAC1C,KAAKuH,GAAc;IACnB,OAAMc,SAAEA,GAAOC,SAAEA,KAAYxL;IAC7ByK,EAAagB,eAAe;MAAEC,OAAO;;IACrC1L,OAAO2L,SAASJ,GAASC;;EAwD7B,aAAAjI,CAAcT,GAAagD;IACvBhH,KAAKwE,eAAeR;IACpBhE,KAAK8G,eAAe9C,GAAKgD;;EAG7B,YAAAvD,CAAaqJ;IACT,OAAMpJ,UAAEA,GAAQ0B,UAAEA,GAAQqE,cAAEA,KAAiBzJ;IAC7C,KACK8M,KACDA,EAAe5G,YACd,mBAAmB4G,KAAkBA,EAAenC,eAErD;IACJ,MAAMoC,IAAgBD,EAAeE;IACrC,MAAMC,IACF,aAAaH,KAAkBA,EAAe9E,UACxC8E,EAAe9E,UACf8E,EAAeI,UAAUC;IACnC,MAAMC,IAAc;MAChBJ,OAAOD;MACP/E,SAASiF;;IAGb,IAAII,IAAwB;IAC5B,IAAI3J,GAAU;MACV,OAAMN,iBAAEA,KAAoBpD;MAC5B,MAAMsN,IAAoBlK,EAAgB2C,MAAKxC,KAAUA,EAAOyJ,UAAUD;MAE1E,IAAIO,GAAmB;QACnBD,IAASjK,EAAgB4G,QAAO,EAAGgD,cAAYA,MAAUD;aACtD;QACHM,IAAS,KAAIjK,GAAiBgK;;MAGlC,IAAI3D,GAAczJ,KAAKgL,qBAAqB8B;WACzC;MACHO,IAAS,EAACD;;IAGd,IAAIhI,GAAUpF,KAAKqF,iBAAiB,YAC/BrF,KAAKoD,kBAAkBiK;IAE5B1M,EAAWX,MAAM,EAAC,UAAU,eAAc;MAAEgN,OAAOD;MAAeM;;;EAGtE,eAAArE;IACI,MAAM5E,IAAcpE,KAAKoE;IAEzBpE,KAAKsE,WAAWxD,SAAQ,CAACkF,GAASuH;MAC9BvH,EAAQC,SAAS7B,MAAgBmJ;AAAY;;EAIrD,gBAAAtE;IACI,MAAM1F,IAASvD,KAAKsE,WAAWtE,KAAKoE;IACpC,KAAKb,GAAQ;IAEb,MAAMiK,IAAkBC,EAAUlK;IAClC,IAAIiK,GAAiBjK,EAAOmK,MAAM;MAAEC,eAAe;aAC9C/I,GAAU,MAAMrB,EAAOmK,MAAM;MAAEC,eAAe;;;EAGvD,yBAAArE;IACI,OAAMhF,YAAEA,GAAUlB,iBAAEA,KAAoBpD;IACxC,MAAM4N,IAAiBxK,EAAgBgE,KAAI,EAAG4F,cAAYA;IAC1D,IAAIhN,KAAKoF,UAAU;IACnBd,EAAWxD,SAAQkF;MACf,MAAM,cAAcA,IAAU;MAC9BA,EAAQ2D,WAAWiE,EAAe1J,SAAS8B,EAAQgH;AAAM;;EAIjE,uBAAAzD;;IACI,OAAMjF,YAAEA,GAAUlB,iBAAEA,KAAoBpD;IACxC,MAAM+M,MAAgBb,IAAA9I,EAAgB,QAAI,QAAA8I,WAAA,aAAAA,EAAAc,UAAStG;IACnD,IAAI1G,KAAKoF,UAAU;IACnBd,EAAWxD,SAAQkF;MACf,MAAM,cAAcA,IAAU;MAC9BA,EAAQ2D,WAAW3D,EAAQgH,UAAUD;AAAa;;;;EAO1D,MAAAc;IACI,OACIC,EAACC,GAAI;MAAA/J,KAAA;OACD8J,EACI;MAAA9J,KAAA;MAAAgK,OAAM;MACNC,KAAKC,KAAOlO,KAAKmO,iBAAiBD;MAClCE,YAAYpO,KAAKuF;OAEjBuI,EACI;MAAA9J,KAAA;MAAAgK,OAAM;MACM,cAAA7K,EAAI,mCAAmC,EAACnD,KAAKkD;MACnC,wBAAAlD,KAAKqD,SAAS,SAASqD,YAAY1G,KAAK0D,WAAW,SAASgD;MAClFqE,MAAM/K,KAAKqD,QAAQ;MACnBgL,WAAWrO,KAAK2F;MAChB2I,SAAStO,KAAKsD;OAEdwK,EAAA;MAAA9J,KAAA;;;;;;;;;;;;;;;;AC7wBxB,MAAMuK,IAAe;;MCwDRC,IAAS;EADtB,WAAA1O,CAAAC;;;;;;eASIC,KAAayO,gBAAG;IAChBzO,KAAkB0O,qBAAY;IAC9B1O,KAAuB2O,0BAAwB;;;QAY/C3O,KAAc4O,iBAAmC;IAGjD5O,KAAgB6O,mBAAkBnI;;QAIlC1G,KAAI8O,OAAY;;;mFAOhB9O,KAAK+O,QAAqB;IA6B1B/O,KAAIgP,OAAa;IAmQjBhP,KAAeiP,kBAAG;MACd,IAAIjP,KAAKkP,WAAW;QAChBC,EAAyBnP,MAAM,aAAa;;;IAIpDA,KAAAoP,2BAA4BhP;MACxBO,EAAWX,MAAM,EAAC,uBAAuB,4BAA2B;QAAE6D,MAAMzD,EAAMiP,aAAa;;AAAS;IAW5GrP,KAAwBsP,2BAAGC;MACvB,OAAMC,gBAAEA,GAAcC,kBAAEA,GAAgBZ,kBAAEA,GAAgBE,OAAEA,KAAU/O;MACtE,KAAKyP,GAAkB;MAEvB,IAAIV,MAAU,SAAS;QACnBU,EAAiBC,MAAMC,YAAY,oBAAoB;QACvDF,EAAiBC,MAAMC,YAAY,mBAAmB;aACnD;QACHF,EAAiBC,MAAMC,YAAY,mBAAmB;QACtDF,EAAiBC,MAAMC,YAAY,oBAAoB;;MAG3D,IAAI3P,KAAK4M,OAAO;QACZ6C,EAAiBC,MAAMC,YAAY,oBAAoB;;MAG3D,IAAId,MAAqB,MAAM;QAC3B,MAAMe,IAAeC,iBAAiBL;QACtC,MAAMM,IACFC,SAASH,EAAaI,UAAU,OAChCD,SAASH,EAAaK,kBAAkB,OACxCF,SAASH,EAAaM,qBAAqB;QAE/CT,EAAiBC,MAAMC,YAAY,qBAAqB,GAAGG;;;kBAIzD1D;MACN,IAAIpM,KAAKyP,kBAAkBA,EAAiBC,MAAMC,YAAY,sBAAsB;AAAI;IAmB5F3P,KAA0BmQ,6BAAGZ;;MACzB,OAAMC,gBAAEA,GAAcC,kBAAEA,GAAgBZ,kBAAEA,GAAgBuB,UAAEA,GAAQrB,OAAEA,KAAU/O;MAChF,KAAKyP,GAAkB;MACvB,OACIY,KAAKC,GACLC,QAAQC,GACRC,MAAMC,GACNC,OAAOC,MACPC,KAAA3E,IAAAsD,MAAc,QAAdA,WAAc,aAAdA,EAAgBsB,2BAAqB,QAAA5E,WAAA,aAAAA,EAAA6E,KAAAvB,QAAQ,QAAAqB,WAAA,IAAAA,IAAA;QAC7CR,KAAK;QACLE,QAAQ;QACRE,MAAM;QACNE,OAAO;;MAGX,MAAMK,IAAsBN;MAC5B,MAAMO,MAAuBC,IAAAhQ,WAAA,QAAAA,gBAAA,aAAAA,OAAQiQ,oBAAc,QAAAD,WAAA,aAAAA,EAAEE,SAAQR;MAC7D,MAAMS,IAAuBC,EAAyB9B;MACtD,MAAM/C,IAAU4E,IAAuB,IAAInQ,OAAOuL;MAClD,MAAMC,IAAU2E,IAAuB,IAAInQ,OAAOwL;MAClD+C,EAAiBC,MAAMC,YAAY,uBAAuB0B,IAAuB,UAAU;MAE3F,IAAItC,MAAU,SAAS;QACnBU,EAAiBC,MAAMC,YAAY,oBAAoB,GAAGsB,IAAexE;QACzEgD,EAAiBC,MAAMC,YAAY,mBAAmB;aACnD;QACHF,EAAiBC,MAAMC,YAAY,mBAAmB,GAAGqB,IAAcvE;QACvEgD,EAAiBC,MAAMC,YAAY,oBAAoB;;MAG3D,IAAI3P,KAAK4M,OAAO6C,EAAiBC,MAAMC,YAAY,oBAAoB,IAAGH,MAAc,QAAdA,WAAc,aAAdA,EAAgB+B,gBAAe;MAEzG,MAAMC,IAAqBpB,KAAYqB,EAAwBzR,KAAK0B;MAEpE,IAAImN,MAAqB,MAAM;QAC3B,IAAIuB,MAAaoB,GAAoB;UACjC/B,EAAiBC,MAAMC,YAAY,qBAAqB,GAAGzO,OAAOwQ,cAAcpB;eAC7E;UACHb,EAAiBC,MAAMC,YACnB,qBACA,GAAGzO,OAAOwQ,cAAcpB,IAAa5D;;;MAKjD,IAAImC,MAAqB,QAAQ;QAC7B,IAAIuB,MAAaoB,GAAoB;UACjC/B,EAAiBC,MAAMC,YAAY,kBAAkB,GAAGa;eACrD;UACHf,EAAiBC,MAAMC,YAAY,kBAAkB,GAAGa,IAAgB9D;;;;kBAK1EN;MACN,IAAIpM,KAAKyP,kBAAkBA,EAAiBC,MAAMC,YAAY,sBAAsB;AAAI;IAG5F3P,KAAe2R,kBAAG;MACd,KAAK3R,KAAK6D,MAAM;MAChB7D,KAAK4R;AAAuB;IAGhC5R,KAA0B6R,6BAAG;MACzB7R,KAAK0O,qBAAqB;MAC1B1O,KAAK2R;AAAiB;AAkC7B;;;EA9YG,oBAAAxQ;;IACInB,KAAK8R;IACL,IAAI9R,KAAK2O,yBAAyB;MAC9B3O,KAAK2O;MACL3O,KAAK2O,0BAA0B;;KAEnCzC,IAAAlM,KAAKyP,sBAAgB,QAAAvD,WAAA,aAAAA,EAAE9K,oBAAoB,UAAUpB,KAAKoP;IAC1DpP,KAAKyP,mBAAmB;IACxBzP,KAAKmO,iBAAiB;IACtBnO,KAAKwP,iBAAiB;;EAG1B,iBAAAnO;IACI,KAAKrB,KAAK+R,oBAAoB;MAC1BC,QAAQC,KACJ;MAEJjS,KAAKgP,OAAO;;;EAIpB,gBAAA1G;;IACItI,KAAKiP;IACL,IAAIjP,KAAK+R,qBAAoB7F,IAAAlM,KAAKyP,sBAAgB,QAAAvD,WAAA,aAAAA,EAAEjL,iBAAiB,UAAUjB,KAAKoP;IACpF,IAAIpP,KAAK6D,MAAM7D,KAAK4R;;;;EAOxB,mBAAAM,CAAoB9R;IAChB,OACI+R,SAAQtO,MAAEA,MACVzD;IACJ,IAAIyD,MAAS7D,KAAK6D,MAAM;IAExB7D,KAAK6D,OAAOA;IACZzD,EAAM+D;;;;EAOV,uBAAMiO,CAAkBC;;KACpBnG,IAAAlM,KAAKyP,sBAAgB,QAAAvD,WAAA,aAAAA,EAAEW,SAASwF;;EAIpC,YAAMC;IACFtS,KAAK6D,QAAQ7D,KAAK6D;;;;EAOtB,iBAAA0O;IACIvS,KAAKiP;;EAIT,iBAAMuD,CAAY3O;;IACdlD,EAAWX,MAAM,EAAC,uBAAuB,4BAA2B;MAAE6D;;IAEtE,IAAIA,GAAM;MACN7D,KAAK4O,iBAAiB;MACtB5O,KAAKyS;MACLzS,KAAK4R;WACF;MACH5R,KAAK4O,iBAAiB;MACtB5O,KAAK8R;;kBAGC,IAAIY,SAAcC;QACpB,KAAK3S,KAAKyP,kBAAkB;UACxBkD;UACA;;QAEJ,MAAMC,qBAAqB;UACvB5S,KAAK2O,0BAA0B;UAC/BgE;AAAS;QAEb3S,KAAK2O,0BAA0BiE;QAC/B5S,KAAKyP,iBAAiBxO,iBAAiB,gBAAgB2R,oBAAoB;UAAEzM,MAAM;;AAAO;MAG9F,IAAInG,KAAK6D,MAAM;MAEf,KAAK7D,KAAKyP,kBAAkB;MAC5B,IAAIzP,KAAK6D,MAAM;MAEf7D,KAAK6O,mBAAmBnI;MACxB1G,KAAK4O,iBAAiB;MACtB,IAAI5O,KAAKgP,SAAS,aAAahP,KAAK+R,oBAAoB;QACpD/R,KAAK8O,OAAO;aACT;SACH5C,IAAAlM,KAAKyP,sBAAkB,QAAAvD,WAAA,aAAAA,EAAA2G;;YAGrBzG;MACNpM,KAAK8S;;;;;EAOb,YAAI1C;;IACA,MAAM2C,IAAW7R,WAAWA,OAAOmP;IACnC,MAAM2C,IAAwBC,OAAOC,MAAKrC,KAAA3E,IAAAhL,OAAOiS,YAAQ,QAAAjH,WAAA,aAAAA,EAAAkH,wBAAkB,QAAAvC,WAAA,IAAAA,IAAI,IAAI/L,SAAS;IAC5F,OAAOiO,KAAYC;;EAGvB,qBAAIK;IACA,OAAM3H,WAAEA,KAAc1L;IACtB,QAAQ0L;KACJ,KAAK;KACL,KAAK;MACD,OAAOA;;KACX;MACI,OAAOhF;;;EAInB,sBAAIqL;IACA,OAAOkB,OAAOK,OAAOC,YAAYC,WAAW;;EAGhD,sBAAIC;IACA,OAAMC,WAAEA,KAAc1T;IACtB,OAAO2T,MAAMD,KAAahN,YAAYgN;;EAG1C,oBAAAjB;;IACIvR,OAAOD,iBAAiB,UAAUjB,KAAK6R;IACvCV,mBAAA,QAAAA,wBAAA,aAAAA,eAAgBlQ,iBAAiB,UAAUjB,KAAK2R;IAChD,IAAIF,EAAwBzR,KAAK0B,iBAAiBkS,KAAY;MAC1D1S,OAAOD,iBAAiB,UAAUjB,KAAK2R,iBAAiB;QAAEkC,SAAS;QAAMC,SAAS;;;KAEtF5H,IAAA6H,WAAA,QAAAA,gBAAA,aAAAA,OAAQC,iBAAW,QAAA9H,WAAA,aAAAA,EAAEjL,iBAAiB,qBAAqBjB,KAAK6R;IAChE3Q,OAAOD,iBAAiB,qBAAqBjB,KAAK6R;;EAGtD,kBAAAiB;IACI,KAAK9S,KAAKyP,kBAAkB;IAC5BzP,KAAKyP,iBAAiBC,MAAMuE,eAAe;IAC3CjU,KAAKyP,iBAAiBC,MAAMuE,eAAe;IAC3CjU,KAAKyP,iBAAiBC,MAAMuE,eAAe;IAC3CjU,KAAKyP,iBAAiBC,MAAMuE,eAAe;IAC3CjU,KAAKyP,iBAAiBC,MAAMuE,eAAe;IAC3CjU,KAAKyP,iBAAiBC,MAAMuE,eAAe;IAC3CjU,KAAKyP,iBAAiBC,MAAMuE,eAAe;IAC3CjU,KAAKyP,iBAAiBC,MAAMuE,eAAe;;EAG/C,2BAAMrC;;IACF,OAAMnC,kBAAEA,GAAgBD,gBAAEA,GAAc6D,mBAAEA,GAAiB5E,eAAEA,KAAkBzO;IAC/E,IAAIyP,GAAkBA,EAAiBC,MAAMgE,YAAY;UACnDtH;IACN,KAAKpM,KAAKyP,kBAAkB;IAE5B,OAAMW,UAAEA,KAAapQ;IACrB,OAAQqQ,KAAKC,GAAYC,QAAQC,MAAkBK,KAAA3E,IAAAsD,MAAc,QAAdA,WAAc,aAAdA,EAAgBsB,2BAAqB,QAAA5E,WAAA,aAAAA,EAAA6E,KAAAvB,QAAQ,QAAAqB,WAAA,IAAAA,IAAA;MAC5FR,KAAK;MACLE,QAAQ;;IAGZ,IAAI2D;IACJ,IAAIC;IACJ,IAAIC;IACJ,MAAM5C,IAAqBpB,KAAYqB,EAAwBzR,KAAK0B;IACpE,IAAI0O,MAAaoB,GAAoB;MACjC,OAAM6C,cACFA,IAAe,GAAC3C,aAChBA,IAAcxQ,OAAOwQ,aACrBrB,KAAKiE,IAAe,GACpB/D,QAAQgE,IAAkB,OAC1BrD,IAAAhQ,OAAOiS,YAAM,QAAAjC,WAAA,aAAAA,EAAEkC,uBAAsB;MAEzC,MAAMoB,IAAyBtT,OAAOwQ,cAAclB;;YAGpD,MAAMiE,IAAmBJ,IAAe,IAAI/D,IAAaA,IAAa+D,IAAeC;MACrF,MAAMI,IAAsBL,IAAe7D,IAAgB8D;;YAG3D,MAAMK,IAAqBF;MAC3B,MAAMG,IAAqBlD,IAAc6C,IAAkBG;;YAG3D,MAAMG,IAA4BL,IAAyBI;MAC3DT,IAAgBQ,IAAqBlG;MACrC2F,IAAgBS,IACVL,IAAyB/F,IACzBmG,IAAqBnG;WACxB;MACHyF,IAAehT,OAAOwQ;MACtByC,IAAgB7D,IAAa7B;MAC7B2F,IAAgBF,IAAe1D,IAAgB/B;;IAGnD,MAAMqG,IAAwCX,IAAgBC,IAAgB,OAAO;;QAGrF,MAAMW,MACDtF,MAAA,QAAAA,WAAgB,aAAhBA,EAAkBC,MAAMsF,iBAAiB,6BAA4BhV,KAAK0O;;QAE/E1O,KAAK0O,qBAAqB;IAC1B,MAAMuG,IAA8BjV,KAAK6O,oBAAoBwE,KAAqByB;IAElF,QAAQG;KACJ,KAAK;MACD,IAAIF,KAAyBtF,GAAkB;QAC3C,MAAMyF,IAAoBlV,KAAKyT,sBAAsBU;QACrD,MAAMT,IAAYzO,KAAKE,IAAIgP,GAAee;QAC1CzF,EAAiBC,MAAMC,YAAY,yBAAyB,GAAG+D;;MAEnE1T,KAAKmV,oBAAoB;MACzB;;KACJ,KAAK;MACD,IAAIJ,KAAyBtF,GAAkB;QAC3C,MAAMyF,IAAoBlV,KAAKyT,sBAAsBW;QACrD,MAAMV,IAAYzO,KAAKE,IAAIiP,GAAec;QAC1CzF,EAAiBC,MAAMC,YAAY,yBAAyB,GAAG+D;;MAEnE1T,KAAKmV,oBAAoB;MACzB;;;EAgBZ,uBAAArD;;IACI5Q,OAAOE,oBAAoB,UAAUpB,KAAK6R;IAC1CV,mBAAA,QAAAA,wBAAA,aAAAA,eAAgB/P,oBAAoB,UAAUpB,KAAK2R;IACnDzQ,OAAOE,oBAAoB,UAAUpB,KAAK2R,iBAAiB;MAAEmC,SAAS;;KACtE5H,IAAA6H,WAAA,QAAAA,gBAAA,aAAAA,OAAQC,iBAAW,QAAA9H,WAAA,aAAAA,EAAE9K,oBAAoB,qBAAqBpB,KAAK6R;IACnE3Q,OAAOE,oBAAoB,qBAAqBpB,KAAK6R;;EAkCzD,mBAAAsD,CAAoBzJ;;;;QAGhB,MAAM0J,IAASpV,KAAK6D;IACpB,KAAKuR,MAAWpV,KAAKyP,kBAAkB;IAEvCzP,KAAK6O,mBAAmBnD;IACxB,IAAI1L,KAAKgP,SAAS,aAAahP,KAAK+R,oBAAoB;MACpD/R,KAAK8O,OAAO;MACZ9O,KAAKsP;WACF;MACHtP,KAAKmQ;OACLjE,IAAAlM,KAAKyP,sBAAkB,QAAAvD,WAAA,aAAAA,EAAAmJ;;;;;EA2E/B,MAAAxH;IACI,MAAMyH,IAAmB,EAAC,aAAatV,KAAK6O,kBAAkB7O,KAAK+O;IACnE,IAAI6E,KAAY0B,EAAiB5N,KAAK;IACtC,IAAI1H,KAAK8O,MAAMwG,EAAiB5N,KAAK;IACrC,IAAI1H,KAAK4M,OAAO0I,EAAiB5N,KAAK;IACtC,IAAI1H,KAAKgP,SAAS,UAAUsG,EAAiB5N,KAAK;IAClD,IAAI1H,KAAK4O,mBAAmB,WAAW0G,EAAiB5N,KAAK;IAC7D,IAAI1H,KAAK4O,mBAAmB,WAAW0G,EAAiB5N,KAAK;IAE7D,OACIoG,EAAA;MAAA9J,KAAA;MACIiK,KAAKC,KAAOlO,KAAKyP,mBAAmBvB;MACpCF,OAAOsH,EAAiBzN,KAAK;MACrB;MACR0N,WAAU;MACVC,SAAQ;OAER1H,EAAA;MAAA9J,KAAA;MACIiK,KAAKC,KAAOlO,KAAKmO,iBAAiBD;MAClCF,OAAM;OAENF,EAAQ;MAAA9J,KAAA","ignoreList":[]}