q2-tecton-elements 1.45.3 → 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/dist/cjs/click-elsewhere_2.cjs.entry.js +1 -1
  2. package/dist/cjs/click-elsewhere_2.cjs.entry.js.map +1 -1
  3. package/dist/cjs/{index-0430339e.js → index-c385e32f.js} +1 -1
  4. package/dist/cjs/{index-0430339e.js.map → index-c385e32f.js.map} +1 -1
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/q2-btn_2.cjs.entry.js +2 -1
  7. package/dist/cjs/q2-btn_2.cjs.entry.js.map +1 -1
  8. package/dist/cjs/q2-calendar.cjs.entry.js +3 -3
  9. package/dist/cjs/q2-calendar.cjs.entry.js.map +1 -1
  10. package/dist/cjs/q2-carousel.cjs.entry.js +33 -2
  11. package/dist/cjs/q2-carousel.cjs.entry.js.map +1 -1
  12. package/dist/cjs/q2-currency.cjs.entry.js +1 -1
  13. package/dist/cjs/q2-currency.cjs.entry.js.map +1 -1
  14. package/dist/cjs/q2-dropdown.cjs.entry.js +1 -1
  15. package/dist/cjs/q2-dropdown.cjs.entry.js.map +1 -1
  16. package/dist/cjs/q2-input.cjs.entry.js +17 -10
  17. package/dist/cjs/q2-input.cjs.entry.js.map +1 -1
  18. package/dist/cjs/q2-item.cjs.entry.js +1 -1
  19. package/dist/cjs/q2-item.cjs.entry.js.map +1 -1
  20. package/dist/cjs/q2-list.cjs.entry.js +1 -1
  21. package/dist/cjs/q2-list.cjs.entry.js.map +1 -1
  22. package/dist/cjs/q2-optgroup.cjs.entry.js +59 -0
  23. package/dist/cjs/q2-optgroup.cjs.entry.js.map +1 -0
  24. package/dist/cjs/{q2-optgroup_2.cjs.entry.js → q2-option.cjs.entry.js} +1 -52
  25. package/dist/cjs/q2-option.cjs.entry.js.map +1 -0
  26. package/dist/cjs/q2-pagination.cjs.entry.js +22 -3
  27. package/dist/cjs/q2-pagination.cjs.entry.js.map +1 -1
  28. package/dist/cjs/q2-pill.cjs.entry.js +2 -2
  29. package/dist/cjs/q2-pill.cjs.entry.js.map +1 -1
  30. package/dist/cjs/q2-relative-time.cjs.entry.js +2 -2
  31. package/dist/cjs/q2-section.cjs.entry.js +2 -2
  32. package/dist/cjs/q2-select.cjs.entry.js +4 -5
  33. package/dist/cjs/q2-select.cjs.entry.js.map +1 -1
  34. package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
  35. package/dist/cjs/q2-stepper-pane.cjs.entry.js.map +1 -1
  36. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +6 -6
  37. package/dist/cjs/q2-stepper-vertical.cjs.entry.js.map +1 -1
  38. package/dist/cjs/q2-stepper.cjs.entry.js +2 -2
  39. package/dist/cjs/q2-stepper.cjs.entry.js.map +1 -1
  40. package/dist/cjs/q2-tab-container.cjs.entry.js +2 -2
  41. package/dist/cjs/q2-tab-container.cjs.entry.js.map +1 -1
  42. package/dist/cjs/q2-tab-pane.cjs.entry.js +1 -1
  43. package/dist/cjs/q2-tag.cjs.entry.js +1 -1
  44. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  45. package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
  46. package/dist/cjs/q2-textarea.cjs.entry.js.map +1 -1
  47. package/dist/cjs/tecton-tab-pane.cjs.entry.js +2 -2
  48. package/dist/collection/components/click-elsewhere/click-elsewhere.js.map +1 -1
  49. package/dist/collection/components/q2-btn/q2-btn.js +29 -5
  50. package/dist/collection/components/q2-btn/q2-btn.js.map +1 -1
  51. package/dist/collection/components/q2-calendar/q2-calendar.css +3 -0
  52. package/dist/collection/components/q2-calendar/q2-calendar.js +1 -1
  53. package/dist/collection/components/q2-calendar/q2-calendar.js.map +1 -1
  54. package/dist/collection/components/q2-carousel/q2-carousel.js +33 -2
  55. package/dist/collection/components/q2-carousel/q2-carousel.js.map +1 -1
  56. package/dist/collection/components/q2-currency/q2-currency.css +4 -0
  57. package/dist/collection/components/q2-data-table/q2-data-table.js +6 -6
  58. package/dist/collection/components/q2-dropdown/q2-dropdown.js +1 -1
  59. package/dist/collection/components/q2-dropdown/q2-dropdown.js.map +1 -1
  60. package/dist/collection/components/q2-input/q2-input.js +43 -15
  61. package/dist/collection/components/q2-input/q2-input.js.map +1 -1
  62. package/dist/collection/components/q2-item/q2-item.css +11 -11
  63. package/dist/collection/components/q2-list/q2-list.css +8 -5
  64. package/dist/collection/components/q2-option-list/q2-option-list.js +2 -2
  65. package/dist/collection/components/q2-pagination/q2-pagination.css +17 -2
  66. package/dist/collection/components/q2-pagination/q2-pagination.js +53 -2
  67. package/dist/collection/components/q2-pagination/q2-pagination.js.map +1 -1
  68. package/dist/collection/components/q2-pill/q2-pill.js +2 -2
  69. package/dist/collection/components/q2-pill/q2-pill.js.map +1 -1
  70. package/dist/collection/components/q2-popover/q2-popover.js +1 -1
  71. package/dist/collection/components/q2-relative-time/q2-relative-time.js +1 -1
  72. package/dist/collection/components/q2-section/q2-section.js +2 -2
  73. package/dist/collection/components/q2-select/q2-select.js +21 -5
  74. package/dist/collection/components/q2-select/q2-select.js.map +1 -1
  75. package/dist/collection/components/q2-stepper/q2-stepper.js +2 -2
  76. package/dist/collection/components/q2-stepper/q2-stepper.js.map +1 -1
  77. package/dist/collection/components/q2-stepper-pane/q2-stepper-pane.js +4 -4
  78. package/dist/collection/components/q2-stepper-pane/q2-stepper-pane.js.map +1 -1
  79. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.js +6 -6
  80. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.js.map +1 -1
  81. package/dist/collection/components/q2-tab-container/q2-tab-container.js +2 -2
  82. package/dist/collection/components/q2-tab-container/q2-tab-container.js.map +1 -1
  83. package/dist/collection/components/q2-tab-pane/q2-tab-pane.js +1 -1
  84. package/dist/collection/components/q2-tag/q2-tag.js +1 -1
  85. package/dist/collection/components/q2-textarea/q2-textarea.css +2 -2
  86. package/dist/collection/components/tecton-tab-pane/tecton-tab-pane.js +2 -2
  87. package/dist/components/click-elsewhere2.js.map +1 -1
  88. package/dist/components/index2.js +1 -1
  89. package/dist/components/q2-btn2.js +4 -2
  90. package/dist/components/q2-btn2.js.map +1 -1
  91. package/dist/components/q2-calendar.js +2 -2
  92. package/dist/components/q2-calendar.js.map +1 -1
  93. package/dist/components/q2-carousel.js +33 -2
  94. package/dist/components/q2-carousel.js.map +1 -1
  95. package/dist/components/q2-currency.js +1 -1
  96. package/dist/components/q2-currency.js.map +1 -1
  97. package/dist/components/q2-dropdown.js +1 -1
  98. package/dist/components/q2-dropdown.js.map +1 -1
  99. package/dist/components/q2-input2.js +20 -12
  100. package/dist/components/q2-input2.js.map +1 -1
  101. package/dist/components/q2-item.js +1 -1
  102. package/dist/components/q2-item.js.map +1 -1
  103. package/dist/components/q2-list.js +1 -1
  104. package/dist/components/q2-list.js.map +1 -1
  105. package/dist/components/q2-message2.js +1 -1
  106. package/dist/components/q2-option-list2.js +1 -1
  107. package/dist/components/q2-pagination.js +64 -13
  108. package/dist/components/q2-pagination.js.map +1 -1
  109. package/dist/components/q2-pill.js +2 -2
  110. package/dist/components/q2-pill.js.map +1 -1
  111. package/dist/components/q2-popover2.js +2 -2
  112. package/dist/components/q2-relative-time.js +1 -1
  113. package/dist/components/q2-section.js +2 -2
  114. package/dist/components/q2-select.js +1 -711
  115. package/dist/components/q2-select.js.map +1 -1
  116. package/dist/components/q2-select2.js +715 -0
  117. package/dist/components/q2-select2.js.map +1 -0
  118. package/dist/components/q2-stepper-pane.js +2 -2
  119. package/dist/components/q2-stepper-pane.js.map +1 -1
  120. package/dist/components/q2-stepper-vertical.js +6 -6
  121. package/dist/components/q2-stepper-vertical.js.map +1 -1
  122. package/dist/components/q2-stepper.js +2 -2
  123. package/dist/components/q2-stepper.js.map +1 -1
  124. package/dist/components/q2-tab-container.js +2 -2
  125. package/dist/components/q2-tab-container.js.map +1 -1
  126. package/dist/components/q2-tab-pane.js +1 -1
  127. package/dist/components/q2-tag.js +1 -1
  128. package/dist/components/q2-textarea.js +1 -1
  129. package/dist/components/q2-textarea.js.map +1 -1
  130. package/dist/components/tecton-tab-pane.js +2 -2
  131. package/dist/esm/click-elsewhere_2.entry.js +1 -1
  132. package/dist/esm/click-elsewhere_2.entry.js.map +1 -1
  133. package/dist/esm/{index-e940b40e.js → index-f0dfb099.js} +1 -1
  134. package/dist/esm/{index-e940b40e.js.map → index-f0dfb099.js.map} +1 -1
  135. package/dist/esm/loader.js +1 -1
  136. package/dist/esm/q2-btn_2.entry.js +2 -1
  137. package/dist/esm/q2-btn_2.entry.js.map +1 -1
  138. package/dist/esm/q2-calendar.entry.js +3 -3
  139. package/dist/esm/q2-calendar.entry.js.map +1 -1
  140. package/dist/esm/q2-carousel.entry.js +33 -2
  141. package/dist/esm/q2-carousel.entry.js.map +1 -1
  142. package/dist/esm/q2-currency.entry.js +1 -1
  143. package/dist/esm/q2-currency.entry.js.map +1 -1
  144. package/dist/esm/q2-dropdown.entry.js +1 -1
  145. package/dist/esm/q2-dropdown.entry.js.map +1 -1
  146. package/dist/esm/q2-input.entry.js +17 -10
  147. package/dist/esm/q2-input.entry.js.map +1 -1
  148. package/dist/esm/q2-item.entry.js +1 -1
  149. package/dist/esm/q2-item.entry.js.map +1 -1
  150. package/dist/esm/q2-list.entry.js +1 -1
  151. package/dist/esm/q2-list.entry.js.map +1 -1
  152. package/dist/esm/q2-optgroup.entry.js +55 -0
  153. package/dist/esm/q2-optgroup.entry.js.map +1 -0
  154. package/dist/esm/{q2-optgroup_2.entry.js → q2-option.entry.js} +3 -53
  155. package/dist/esm/q2-option.entry.js.map +1 -0
  156. package/dist/esm/q2-pagination.entry.js +22 -3
  157. package/dist/esm/q2-pagination.entry.js.map +1 -1
  158. package/dist/esm/q2-pill.entry.js +2 -2
  159. package/dist/esm/q2-pill.entry.js.map +1 -1
  160. package/dist/esm/q2-relative-time.entry.js +2 -2
  161. package/dist/esm/q2-section.entry.js +2 -2
  162. package/dist/esm/q2-select.entry.js +4 -5
  163. package/dist/esm/q2-select.entry.js.map +1 -1
  164. package/dist/esm/q2-stepper-pane.entry.js +2 -2
  165. package/dist/esm/q2-stepper-pane.entry.js.map +1 -1
  166. package/dist/esm/q2-stepper-vertical.entry.js +6 -6
  167. package/dist/esm/q2-stepper-vertical.entry.js.map +1 -1
  168. package/dist/esm/q2-stepper.entry.js +2 -2
  169. package/dist/esm/q2-stepper.entry.js.map +1 -1
  170. package/dist/esm/q2-tab-container.entry.js +2 -2
  171. package/dist/esm/q2-tab-container.entry.js.map +1 -1
  172. package/dist/esm/q2-tab-pane.entry.js +1 -1
  173. package/dist/esm/q2-tag.entry.js +1 -1
  174. package/dist/esm/q2-tecton-elements.js +1 -1
  175. package/dist/esm/q2-textarea.entry.js +1 -1
  176. package/dist/esm/q2-textarea.entry.js.map +1 -1
  177. package/dist/esm/tecton-tab-pane.entry.js +2 -2
  178. package/dist/q2-tecton-elements/{p-685b821c.entry.js → p-0eff37c6.entry.js} +2 -2
  179. package/dist/q2-tecton-elements/{p-fcc84527.entry.js → p-12326313.entry.js} +2 -2
  180. package/dist/q2-tecton-elements/p-12326313.entry.js.map +1 -0
  181. package/dist/q2-tecton-elements/p-176ad382.entry.js +2 -0
  182. package/dist/q2-tecton-elements/p-176ad382.entry.js.map +1 -0
  183. package/dist/q2-tecton-elements/{p-f4d77672.entry.js → p-195a133c.entry.js} +2 -2
  184. package/dist/q2-tecton-elements/p-1b37b8c6.entry.js +2 -0
  185. package/dist/q2-tecton-elements/p-1b37b8c6.entry.js.map +1 -0
  186. package/dist/q2-tecton-elements/{p-bfe9d688.entry.js → p-1c4aa7e3.entry.js} +2 -2
  187. package/dist/q2-tecton-elements/p-1c4aa7e3.entry.js.map +1 -0
  188. package/dist/q2-tecton-elements/p-1e927478.entry.js +2 -0
  189. package/dist/q2-tecton-elements/p-1e927478.entry.js.map +1 -0
  190. package/dist/q2-tecton-elements/p-36398b59.entry.js +2 -0
  191. package/dist/q2-tecton-elements/p-36398b59.entry.js.map +1 -0
  192. package/dist/q2-tecton-elements/{p-7ce6e587.js → p-3c42c90f.js} +1 -1
  193. package/dist/q2-tecton-elements/p-66af375f.entry.js +2 -0
  194. package/dist/q2-tecton-elements/p-66af375f.entry.js.map +1 -0
  195. package/dist/q2-tecton-elements/p-6ebe37ea.entry.js +2 -0
  196. package/dist/q2-tecton-elements/p-6ebe37ea.entry.js.map +1 -0
  197. package/dist/q2-tecton-elements/p-79df783e.entry.js +2 -0
  198. package/dist/q2-tecton-elements/p-79df783e.entry.js.map +1 -0
  199. package/dist/q2-tecton-elements/p-7e1dc7e8.entry.js +2 -0
  200. package/dist/q2-tecton-elements/p-7e1dc7e8.entry.js.map +1 -0
  201. package/dist/q2-tecton-elements/{p-05b015a8.entry.js → p-87bbeb9c.entry.js} +2 -2
  202. package/dist/q2-tecton-elements/{p-05b015a8.entry.js.map → p-87bbeb9c.entry.js.map} +1 -1
  203. package/dist/q2-tecton-elements/p-89305707.entry.js +2 -0
  204. package/dist/q2-tecton-elements/p-89305707.entry.js.map +1 -0
  205. package/dist/q2-tecton-elements/{p-debd5249.entry.js → p-ad274c67.entry.js} +2 -2
  206. package/dist/q2-tecton-elements/{p-debd5249.entry.js.map → p-ad274c67.entry.js.map} +1 -1
  207. package/dist/q2-tecton-elements/{p-68556733.entry.js → p-c56b58e9.entry.js} +2 -2
  208. package/dist/q2-tecton-elements/p-c56b58e9.entry.js.map +1 -0
  209. package/dist/q2-tecton-elements/{p-2436c843.entry.js → p-cb4f9b33.entry.js} +2 -2
  210. package/dist/q2-tecton-elements/p-cb4f9b33.entry.js.map +1 -0
  211. package/dist/q2-tecton-elements/{p-5dc5c4e2.entry.js → p-d013e05d.entry.js} +2 -2
  212. package/dist/q2-tecton-elements/p-d013e05d.entry.js.map +1 -0
  213. package/dist/q2-tecton-elements/p-d1522382.entry.js +2 -0
  214. package/dist/q2-tecton-elements/p-d1522382.entry.js.map +1 -0
  215. package/dist/q2-tecton-elements/{p-63192fac.entry.js → p-da7fc914.entry.js} +2 -2
  216. package/dist/q2-tecton-elements/p-e3230823.entry.js +2 -0
  217. package/dist/q2-tecton-elements/p-e3230823.entry.js.map +1 -0
  218. package/dist/q2-tecton-elements/{p-b376c111.entry.js → p-e47dbfbe.entry.js} +2 -2
  219. package/dist/q2-tecton-elements/{p-a214077c.entry.js → p-e4a2469f.entry.js} +2 -2
  220. package/dist/q2-tecton-elements/p-fc9f43f8.entry.js +2 -0
  221. package/dist/q2-tecton-elements/p-fc9f43f8.entry.js.map +1 -0
  222. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  223. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js.map +1 -1
  224. package/dist/test/elements/q2-calendar-test.e2e.js +1 -1
  225. package/dist/test/elements/q2-calendar-test.e2e.js.map +1 -1
  226. package/dist/test/elements/q2-carousel-test.e2e.js +67 -1
  227. package/dist/test/elements/q2-carousel-test.e2e.js.map +1 -1
  228. package/dist/test/elements/q2-detail/q2-list-test.e2e.js +1 -1
  229. package/dist/test/elements/q2-detail/q2-list-test.e2e.js.map +1 -1
  230. package/dist/test/elements/q2-input-test.e2e.js +25 -2
  231. package/dist/test/elements/q2-input-test.e2e.js.map +1 -1
  232. package/dist/test/elements/q2-pagination-test.e2e.js +22 -0
  233. package/dist/test/elements/q2-pagination-test.e2e.js.map +1 -1
  234. package/dist/test/elements/q2-pill-test.e2e.js +21 -2
  235. package/dist/test/elements/q2-pill-test.e2e.js.map +1 -1
  236. package/dist/test/elements/q2-select-test.e2e.js +26 -8
  237. package/dist/test/elements/q2-select-test.e2e.js.map +1 -1
  238. package/dist/test/elements/q2-stepper-test.e2e.js +10 -17
  239. package/dist/test/elements/q2-stepper-test.e2e.js.map +1 -1
  240. package/dist/test/elements/q2-stepper-vertical-test.e2e.js +20 -4
  241. package/dist/test/elements/q2-stepper-vertical-test.e2e.js.map +1 -1
  242. package/dist/test/elements/q2-tab-container-test.e2e.js +10 -4
  243. package/dist/test/elements/q2-tab-container-test.e2e.js.map +1 -1
  244. package/dist/types/components/q2-btn/q2-btn.d.ts +14 -3
  245. package/dist/types/components/q2-carousel/q2-carousel.d.ts +2 -0
  246. package/dist/types/components/q2-input/q2-input.d.ts +10 -3
  247. package/dist/types/components.d.ts +50 -4
  248. package/package.json +3 -3
  249. package/dist/cjs/q2-optgroup_2.cjs.entry.js.map +0 -1
  250. package/dist/esm/q2-optgroup_2.entry.js.map +0 -1
  251. package/dist/q2-tecton-elements/p-1c17d118.entry.js +0 -2
  252. package/dist/q2-tecton-elements/p-1c17d118.entry.js.map +0 -1
  253. package/dist/q2-tecton-elements/p-2436c843.entry.js.map +0 -1
  254. package/dist/q2-tecton-elements/p-3b1ea100.entry.js +0 -2
  255. package/dist/q2-tecton-elements/p-3b1ea100.entry.js.map +0 -1
  256. package/dist/q2-tecton-elements/p-445990a8.entry.js +0 -2
  257. package/dist/q2-tecton-elements/p-445990a8.entry.js.map +0 -1
  258. package/dist/q2-tecton-elements/p-4b81a121.entry.js +0 -2
  259. package/dist/q2-tecton-elements/p-4b81a121.entry.js.map +0 -1
  260. package/dist/q2-tecton-elements/p-50bd4437.entry.js +0 -2
  261. package/dist/q2-tecton-elements/p-50bd4437.entry.js.map +0 -1
  262. package/dist/q2-tecton-elements/p-5dc5c4e2.entry.js.map +0 -1
  263. package/dist/q2-tecton-elements/p-68556733.entry.js.map +0 -1
  264. package/dist/q2-tecton-elements/p-7c12ba02.entry.js +0 -2
  265. package/dist/q2-tecton-elements/p-7c12ba02.entry.js.map +0 -1
  266. package/dist/q2-tecton-elements/p-a977e723.entry.js +0 -2
  267. package/dist/q2-tecton-elements/p-a977e723.entry.js.map +0 -1
  268. package/dist/q2-tecton-elements/p-b3d10d52.entry.js +0 -2
  269. package/dist/q2-tecton-elements/p-b3d10d52.entry.js.map +0 -1
  270. package/dist/q2-tecton-elements/p-bfe9d688.entry.js.map +0 -1
  271. package/dist/q2-tecton-elements/p-bffda54d.entry.js +0 -2
  272. package/dist/q2-tecton-elements/p-bffda54d.entry.js.map +0 -1
  273. package/dist/q2-tecton-elements/p-cadceb00.entry.js +0 -2
  274. package/dist/q2-tecton-elements/p-cadceb00.entry.js.map +0 -1
  275. package/dist/q2-tecton-elements/p-d1a9ed3d.entry.js +0 -2
  276. package/dist/q2-tecton-elements/p-d1a9ed3d.entry.js.map +0 -1
  277. package/dist/q2-tecton-elements/p-fcc84527.entry.js.map +0 -1
  278. /package/dist/q2-tecton-elements/{p-685b821c.entry.js.map → p-0eff37c6.entry.js.map} +0 -0
  279. /package/dist/q2-tecton-elements/{p-f4d77672.entry.js.map → p-195a133c.entry.js.map} +0 -0
  280. /package/dist/q2-tecton-elements/{p-7ce6e587.js.map → p-3c42c90f.js.map} +0 -0
  281. /package/dist/q2-tecton-elements/{p-63192fac.entry.js.map → p-da7fc914.entry.js.map} +0 -0
  282. /package/dist/q2-tecton-elements/{p-b376c111.entry.js.map → p-e47dbfbe.entry.js.map} +0 -0
  283. /package/dist/q2-tecton-elements/{p-a214077c.entry.js.map → p-e4a2469f.entry.js.map} +0 -0
  284. /package/dist/types/workspace/workspace/{tecton-production_release_1.45.x → _Gitlab_tecton-production_master}/packages/q2-tecton-elements/.stencil/test/elements/q2-detail/slot-component.d.ts +0 -0
  285. /package/dist/types/workspace/workspace/{tecton-production_release_1.45.x → _Gitlab_tecton-production_master}/packages/q2-tecton-elements/.stencil/test/helpers.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"names":["formatDateISO","value","date","Date","isValidDate","formatISO","representation","memoizedFormatDateShort","formatDateShort","isoDate","toISOString","Intl","DateTimeFormat","month","day","year","timeZone","resolvedOptions","format","memoizedFormatDateLong","formatDateLong","memoizedFormatDateFull","formatDateFull","weekday","convertMomentFormat","stringFormat","replace","stringToDate","isString","undefined","result","dateParts","split","map","part","padStart","isIsoString","length","isCompleteDate","isPartialDate","isStandardSlashDate","includes","unshift","pop","UTC","parseInt","now","yearNumber","monthNumber","dayNumber","getFullYear","removeTimezoneOffset","timeZoneOffset","getTimezoneOffset","setMinutes","Math","abs","stringArrayToDate","dateArray","Array","isArray","setupMonthYear","monthIndex","getMonth","selectedYear","validateInput","input","validDays","validDates","invalidDates","startDate","endDate","formatString","assume","isValid","isAvailable","messageType","message","loc","inputDate","buildInputDate","getDate","calendarPosition","monthName","getMonths","getDay","isoString","isNotValidDate","isInvalidDate","isBeforeStartDate","isAfterEndDate","isInvalid","Number","twoDigitDay","fourDigitYear","assumeYear","monthDay","mm","dd","nowLocal","assumedYear","slice","toString","handleMissingZeros","match","sp","reorderDateString","firstDayOfWeekInMonth","getDays","getDaysOfWeek","generateDatesFromMonthYear","daysInMonth","getDaysInMonth","keys","reduce","acc","stepIndex","push","getValidDaysOfWeek","checksum","sunValid","monValid","tuesValid","wedsValid","thursValid","friValid","satValid","ret","validateAgainstChecksum","validDaysOfWeek","newDate","validateAgainstBlacklist","validateAgainstWhitelist","some","validDate","isSameDay","buildDates","selectedMonthYear","currentSelection","dateValidators","typedValue","validationFns","baseValidation","bind","generateDateList","isIncompleteDate","datesInMonth","dayInMonth","dateIndex","fn","dayState","getDayState","classList","generateClassesForCalDay","Object","assign","integer","isEmpty","isActivity","startOfMonthEmpties","addEmptiesMonthStart","endOfMonthEmpties","addEmptiesMonthEnd","isNewDateBeforeStartDate","isAfter","isNewDateAfterEndDate","isBefore","isNowAfterCutoffTime","cutOffTime","currentDate","isSelected","isToday","isStartDate","isEndDate","classes","join","monthStartDayOfWeek","addEmptyDates","monthEndDayOfWeek","emptyDate","from","to","q2CalendarCss","Q2CalendarStyle0","Q2Calendar","this","formatModifier","defaultFormatString","scheduledAfterRender","internalError","dayAbbrStrings","dayStrings","monthStrings","closeCalendar","open","focusInput","openCalendar","readonly","dateValue","dateList","buildDateList","toggleCalendar","onClickElsewhere","event","target","localName","stopPropagation","onPopupKeyup","key","onInputBlur","onInputInput","detail","onInputKeydown","preventDefault","activateDay","onInputKeyup","disabled","isTypeable","daysOfWeekChecksum","yyyy","validateDate","setCompleteInput","change","emit","keyboardSelection","setHints","onInputChange","defaultHintMessage","valueOnBlur","onInputFocus","controlElement","tmpTypedValue","onInputClick","onRefocus","_a","btnPrevMonth","dispatchEvent","FocusEvent","goToMonthYear","checkActiveCellForBlankness","selectDate","find","invalid","success","onDateSelection","dateCell","closest","clickedDate","dataset","onHeaderControlKeydown","generateDateFromDay","hasSelectedCell","calendarBody","querySelector","onDateKeydown","currentDay","addDays","shiftKey","connectedCallback","componentWillLoad","popDirectionHandler","handleAriaLabel","componentDidRender","setTimeout","forEach","componentDidLoad","overrideFocus","hostElement","selectedDate","selectedCell","innerInputField","_b","shadowRoot","innerInputContainer","typeable","canClear","clearable","currentWeeks","weeks","accum","item","index","chunkIndex","floor","formattedValue","displayFormat","computedPlaceholder","disabledMsg","buttonLabel","placeholder","isMoment","toDate","isMomentString","test","ct","cutoffTime","errorList","errors","list","filter","error","concat","hintList","hints","hintMessageType","hintMessage","hint","defaultChangeHandler","onchange","defaultErrorHandler","onerror","defaultSuccessHandler","onsuccess","delegateFocus","isEventFromElement","focus","handleClear","popoverStateHandler","_togglePopover","toggleElement","btnCalendarToggle","click","openPopover","closePopover","setValue","waitForNextPaint","tableCell","calendarTable","typeValue","formattedDate","InputEvent","KeyboardEvent","handleRenamedProp","ariaLabelObserver","typeableChanged","valueObserver","newValue","shortFormattedValue","daysOfWeekChecksumObserver","validDatesObserver","invalidDatesObserver","startDateObserver","endDateObserver","cutoffTimeObserver","monthYear","isSelectedMonthAndYear","calculationDateList","dateValueDayOfMonth","_c","isDateValueInvalid","errorCode","console","warn","activeElement","tagName","hasAttribute","calendarCells","querySelectorAll","indexOfCell","indexOf","dayToFocus","cell","focusDay","render","h","class","onChange","inputField","ref","el","popoverElement","direction","popoverDirection","minHeight","popoverMinHeight","align","popoverAlignment","mode","popoverMode","block","hintField","calendarPopover","hintMessageElement","type","present","label","hideLabel","optional","ariaExpanded","onClick","onInput","onKeyDown","onKeyUp","onBlur","onFocus","pseudo","_role","slot","calendarLabel","elm","btnNextMonth","btnPrevYear","btnNextYear","id","calendarDays","disclaimer","role","scope","week","ariaLabel","tabindex"],"sources":["src/components/q2-calendar/q2-calendar-helpers.ts","src/components/q2-calendar/q2-calendar-validation.ts","src/components/q2-calendar/q2-calendar.scss?tag=q2-calendar&encapsulation=shadow","src/components/q2-calendar/q2-calendar.tsx"],"sourcesContent":["import { isValid as isValidDate, formatISO, setMinutes } from 'date-fns';\nimport { loc } from '../../utils';\nimport { ISelectedMonthYear, InputValidation } from './q2-calendar-types';\n\nexport interface IMomentLikeObject {\n toDate(): Date;\n}\n\nexport function formatDateISO(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n\n return formatISO(date, { representation: 'date' });\n}\n\nlet memoizedFormatDateShort: Intl.DateTimeFormat;\nexport function formatDateShort(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n\n const isoDate = date.toISOString();\n if (!memoizedFormatDateShort) {\n memoizedFormatDateShort = new Intl.DateTimeFormat('en-US', {\n month: '2-digit',\n day: '2-digit',\n year: 'numeric',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n }\n\n return memoizedFormatDateShort.format(new Date(isoDate));\n}\n\nlet memoizedFormatDateLong: Intl.DateTimeFormat;\nexport function formatDateLong(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n if (!memoizedFormatDateLong) {\n memoizedFormatDateLong = new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n\n return memoizedFormatDateLong.format(date);\n}\n\nlet memoizedFormatDateFull: Intl.DateTimeFormat;\nexport function formatDateFull(value: string | Date) {\n if (!value) return;\n const date = new Date(value);\n if (!isValidDate(date)) return;\n if (!memoizedFormatDateFull) {\n memoizedFormatDateFull = new Intl.DateTimeFormat('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n weekday: 'long',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n }\n\n return memoizedFormatDateFull.format(date);\n}\n\nexport function convertMomentFormat(stringFormat: string) {\n return stringFormat\n .replace(/[d]/g, 'E')\n .replace(/[D]/g, 'd')\n .replace(/[Y]/g, 'y')\n .replace(/[l]/g, 'P')\n .replace(/[W]/g, 'I');\n}\n\nexport function stringToDate(date: string | null | void): Date | undefined {\n const isString = typeof date === 'string';\n if (!isString && date && isValidDate(new Date(date || undefined))) {\n date = formatDateISO(date);\n } else if (!date || !isValidDate(new Date(date))) {\n return undefined;\n }\n\n let result: Date;\n const dateParts = date.split(/[\\/\\-]/).map(part => part.padStart(2, '0'));\n const isIsoString = isString && date.length >= 24 && date[10] === 'T';\n const isCompleteDate = dateParts.length === 3;\n const isPartialDate = dateParts.length < 3;\n if (isIsoString) {\n date = date.split('T')[0];\n result = new Date(date);\n } else if (isCompleteDate) {\n const isStandardSlashDate = date.includes('/') && dateParts[2].length === 4;\n\n // Reorder mm/dd/yyyy dates for ISO formatting\n // [mm, dd, yyyy] -> [yyyy, mm, dd]\n if (isStandardSlashDate) dateParts.unshift(dateParts.pop());\n\n result = new Date(Date.UTC(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2])));\n } else if (isPartialDate) {\n const now = new Date();\n\n let yearNumber: number;\n let monthNumber: string;\n let dayNumber: string;\n switch (dateParts.length) {\n case 1:\n yearNumber = now.getFullYear();\n monthNumber = dateParts[0];\n dayNumber = '01';\n break;\n\n case 2:\n yearNumber = now.getFullYear();\n monthNumber = dateParts[0];\n dayNumber = dateParts[1];\n break;\n }\n\n result = new Date(`${yearNumber}-${monthNumber}-${dayNumber}`);\n }\n\n if (!isValidDate(result)) return undefined;\n\n // result = setHours(result, 0);\n result = removeTimezoneOffset(result);\n\n return isValidDate(result) ? result : undefined;\n}\n\nexport function removeTimezoneOffset(date: Date) {\n const timeZoneOffset = date.getTimezoneOffset();\n // Minutes compensation for some timezones like India, Central Australia and etc use GMT+5:30, GMT+9:30\n return setMinutes(date, timeZoneOffset + Math.abs(timeZoneOffset % 60));\n}\n\nexport function stringArrayToDate(dateArray: string[]): Date[] {\n if (!Array.isArray(dateArray) || dateArray.length === 0) {\n return [];\n }\n return dateArray.map(date => stringToDate(date));\n}\n\nexport function setupMonthYear(value: Date | undefined = new Date()): ISelectedMonthYear {\n return {\n monthIndex: value.getMonth(),\n selectedYear: value.getFullYear(),\n };\n}\n\nexport function validateInput(\n input: string = '',\n validDays: number[] = [],\n validDates: string[] = [], // white list\n invalidDates: string[] = [], // black list\n startDate: string,\n endDate: string,\n formatString: string = 'mm/dd/yyyy',\n assume: string\n): InputValidation {\n let isValid: boolean = true;\n let isAvailable: boolean = false;\n let messageType: string = 'info';\n let message: string = `${loc('tecton.element.calendar.hint.format')}: ${formatString}`;\n if (!input) {\n return { isValid, inputDate: new Date(''), isAvailable, messageType, message };\n }\n\n const inputDate = buildInputDate(input, assume);\n const month = inputDate.getMonth() + 1;\n const date = inputDate.getDate();\n const year = inputDate.getFullYear();\n const calendarPosition = [month, date, year];\n\n if (isValidDate(inputDate)) {\n const monthName = getMonths()[inputDate.getMonth()];\n\n if (input.length === 10) {\n isValid = true;\n messageType = null;\n message = null;\n }\n\n isAvailable = validDays.includes(inputDate.getDay());\n const isoString = formatDateISO(inputDate);\n\n if (isAvailable) {\n const isNotValidDate = validDates.length && !validDates.includes(isoString);\n const isInvalidDate = invalidDates.length && invalidDates.includes(isoString);\n const isBeforeStartDate = startDate && startDate > isoString;\n const isAfterEndDate = endDate && endDate < isoString;\n\n if (isNotValidDate || isInvalidDate || isBeforeStartDate || isAfterEndDate) {\n isAvailable = false;\n }\n }\n\n if (input.length >= 5 && !isAvailable) {\n isValid = false;\n messageType = 'error';\n const isInvalid = !monthName || !date || !year;\n message = isInvalid\n ? `${loc('tecton.element.calendar.hint.invalidDate')}: ${formatString}`\n : loc('tecton.element.calendar.hint.notAvailableDate', [formatDateLong(inputDate)]);\n }\n } else {\n isValid = false;\n messageType = 'error';\n message = `${loc('tecton.element.calendar.hint.invalidDate')}: ${formatString}`;\n }\n\n return {\n isValid,\n messageType,\n message,\n inputDate,\n isAvailable,\n calendarPosition,\n };\n}\n\nexport function buildInputDate(input: string, assume: string) {\n const now = new Date();\n // eslint-disable-next-line prefer-const\n let [month, day, year] = input.split('/');\n if (month === '0') month = '01';\n if (day === '0') day = '01';\n if (input.length === 10) {\n return new Date(input);\n } else if (month && day && Number(day) > 0) {\n const twoDigitDay = Number(day) < 10 ? `0${Number(day)}` : day;\n const fourDigitYear = !year || year.length < 4 ? assumeYear(month, day, assume) : year;\n return new Date(`${month}/${twoDigitDay}/${fourDigitYear}`);\n } else if (month) {\n return new Date(`${month}/01/${now.getFullYear()}`);\n }\n}\n\nfunction assumeYear(month: string, day: string, assume: string): string {\n const monthDay = `${month}/${day}`;\n const now = new Date();\n const mm: string = now.getMonth() < 9 ? `0${now.getMonth() + 1}` : `${now.getMonth() + 1}`;\n const dd: string = now.getDate() < 10 ? `0${now.getDate()}` : `${now.getDate()}`;\n const nowLocal = `${mm}/${dd}/${now.getFullYear()}`;\n let assumedYear = now.getFullYear();\n if (assume === 'future' && nowLocal.slice(0, 5) > monthDay) {\n assumedYear = now.getFullYear() + 1;\n } else if (assume === 'past' && nowLocal.slice(0, 5) < monthDay) {\n assumedYear = now.getFullYear() - 1;\n }\n return assumedYear.toString();\n}\n\nexport function handleMissingZeros(input): string {\n if (!input) {\n return '';\n }\n if (input.match(/^[1-9]\\/$/)) {\n return `0${input}/`;\n } else if (input.match(/^[0-9]{2}\\/[1-9]{1}\\/$/)) {\n const sp = input.split('/');\n return `${sp[0]}/0${sp[1]}/`;\n }\n return input;\n}\n\nexport function reorderDateString(input: string): string {\n const dateParts = (input || '').split('-');\n if (dateParts.length !== 3) return '';\n return `${dateParts[1]}/${dateParts[2]}/${dateParts[0]}`;\n}\n\nexport function firstDayOfWeekInMonth(month: number, year: number): number {\n return new Date(year, month, 1, 1, 1, 1, 1).getDay();\n}\n\nexport function getDays(): string[] {\n return [\n loc('tecton.element.calendar.days.short.Sunday'),\n loc('tecton.element.calendar.days.short.Monday'),\n loc('tecton.element.calendar.days.short.Tuesday'),\n loc('tecton.element.calendar.days.short.Wednesday'),\n loc('tecton.element.calendar.days.short.Thursday'),\n loc('tecton.element.calendar.days.short.Friday'),\n loc('tecton.element.calendar.days.short.Saturday'),\n ];\n}\n\nexport function getDaysOfWeek(): string[] {\n return [\n loc('tecton.element.calendar.days.Sunday'),\n loc('tecton.element.calendar.days.Monday'),\n loc('tecton.element.calendar.days.Tuesday'),\n loc('tecton.element.calendar.days.Wednesday'),\n loc('tecton.element.calendar.days.Thursday'),\n loc('tecton.element.calendar.days.Friday'),\n loc('tecton.element.calendar.days.Saturday'),\n ];\n}\n\nexport function getMonths(): string[] {\n return [\n loc('tecton.element.calendar.months.January'),\n loc('tecton.element.calendar.months.February'),\n loc('tecton.element.calendar.months.March'),\n loc('tecton.element.calendar.months.April'),\n loc('tecton.element.calendar.months.May'),\n loc('tecton.element.calendar.months.June'),\n loc('tecton.element.calendar.months.July'),\n loc('tecton.element.calendar.months.August'),\n loc('tecton.element.calendar.months.September'),\n loc('tecton.element.calendar.months.October'),\n loc('tecton.element.calendar.months.November'),\n loc('tecton.element.calendar.months.December'),\n ];\n}\n","import { firstDayOfWeekInMonth } from './q2-calendar-helpers';\nimport { getDaysInMonth, isSameDay, isBefore, isAfter, isValid as isValidDate } from 'date-fns';\nimport { CalendarDay, DateEmpty, Year, IDateValidators, ISelectedMonthYear } from './q2-calendar-types';\n\n// Validation Helpers\nexport type DateList = CalendarDay[];\nexport type IsValid = boolean;\nexport type IsActivityDate = boolean;\nexport type DateValidation = (date: Date) => IsValid;\n\nexport function generateDatesFromMonthYear(month: number, year: Year): Date[] {\n const daysInMonth = getDaysInMonth(new Date(year, month));\n\n return [...Array(daysInMonth).keys()].reduce((acc, stepIndex) => {\n acc.push(new Date(year, month, stepIndex + 1));\n return acc;\n }, []);\n}\n\nexport function getValidDaysOfWeek(checksum: number = 127): number[] {\n /* tslint:disable:no-bitwise */\n const sunValid = checksum & 1;\n const monValid = checksum & 2;\n const tuesValid = checksum & 4;\n const wedsValid = checksum & 8;\n const thursValid = checksum & 16;\n const friValid = checksum & 32;\n const satValid = checksum & 64;\n /* tslint:enable:no-bitwise */\n const ret = [];\n\n if (checksum <= 0) return ret;\n if (sunValid) ret.push(0);\n if (monValid) ret.push(1);\n if (tuesValid) ret.push(2);\n if (wedsValid) ret.push(3);\n if (thursValid) ret.push(4);\n if (friValid) ret.push(5);\n if (satValid) ret.push(6);\n\n return ret;\n}\n\nexport function validateAgainstChecksum(validDaysOfWeek: number[], newDate: Date): IsValid {\n return validDaysOfWeek.includes(newDate.getDay());\n}\n\nexport function validateAgainstBlacklist(invalidDates: Date[], newDate: Date): IsValid {\n return !validateAgainstWhitelist(invalidDates, newDate);\n}\n\nexport function validateAgainstWhitelist(validDates: Date[], newDate: Date): IsValid {\n return validDates.some(validDate => isSameDay(validDate, newDate));\n}\n\nexport function buildDates(\n validDaysOfWeek: number[],\n validDates: Date[],\n invalidDates: Date[],\n selectedMonthYear: ISelectedMonthYear,\n currentSelection: Date | undefined,\n dateValidators: IDateValidators,\n typedValue: string\n): DateList {\n const validationFns = [baseValidation.bind(null, dateValidators, new Date())];\n if (validDates?.length) {\n validationFns.push(validateAgainstWhitelist.bind(null, validDates));\n } else {\n validationFns.push(validateAgainstChecksum.bind(null, validDaysOfWeek));\n }\n validationFns.push(validateAgainstBlacklist.bind(null, invalidDates));\n\n return generateDateList(selectedMonthYear, currentSelection, dateValidators, validationFns, typedValue);\n}\n\nexport function generateDateList(\n { monthIndex, selectedYear }: ISelectedMonthYear,\n currentSelection: Date | undefined,\n dateValidators: IDateValidators,\n validationFns: DateValidation[],\n typedValue: string\n): DateList {\n const isIncompleteDate = !isValidDate(new Date(typedValue));\n const datesInMonth = generateDatesFromMonthYear(monthIndex, selectedYear).map((dayInMonth, dateIndex) => {\n const isInvalid = validationFns.some(fn => !fn(dayInMonth));\n const dayState = getDayState(dayInMonth, dateValidators, currentSelection);\n const classList = generateClassesForCalDay({\n ...dayState,\n isInvalid,\n isIncompleteDate,\n });\n\n return {\n ...dayState,\n isValid: !isInvalid,\n date: dayInMonth,\n integer: dateIndex + 1,\n isEmpty: false,\n isActivity: false,\n classList,\n };\n });\n\n const startOfMonthEmpties = addEmptiesMonthStart(firstDayOfWeekInMonth(monthIndex, selectedYear));\n const endOfMonthEmpties = addEmptiesMonthEnd((startOfMonthEmpties.length + datesInMonth.length) % 7);\n\n return [...startOfMonthEmpties, ...datesInMonth, ...endOfMonthEmpties] as CalendarDay[];\n}\n\nexport function baseValidation(dateValidators: IDateValidators, now: Date, newDate: Date): boolean {\n const isNewDateBeforeStartDate = isAfter(dateValidators?.startDate, newDate);\n const isNewDateAfterEndDate = isBefore(dateValidators?.endDate, newDate);\n const isNowAfterCutoffTime = isSameDay(now, newDate) && isAfter(now, dateValidators?.cutOffTime);\n\n return !(isNewDateBeforeStartDate || isNowAfterCutoffTime || isNewDateAfterEndDate);\n}\n\nexport function getDayState(dayInMonth: Date, dateValidators: IDateValidators, currentDate: Date | undefined) {\n if (!currentDate) currentDate = new Date();\n const isSelected = currentDate && isSameDay(currentDate, dayInMonth);\n const isToday = isSameDay(dayInMonth, new Date());\n const isStartDate = isSameDay(dayInMonth, dateValidators?.startDate);\n const isEndDate = isSameDay(dayInMonth, dateValidators?.endDate);\n\n return { isSelected, isToday, isStartDate, isEndDate };\n}\n\nexport function generateClassesForCalDay({\n isInvalid,\n isSelected,\n isEndDate,\n isStartDate,\n isToday,\n isIncompleteDate,\n}: {\n isInvalid: boolean;\n isSelected: boolean;\n isEndDate: boolean;\n isStartDate: boolean;\n isToday: boolean;\n isIncompleteDate: boolean;\n}): string {\n const classes = [];\n if (!isInvalid) classes.push('is-valid');\n if (isSelected) classes.push('is-selected');\n if (isEndDate) classes.push('is-end-date');\n if (isStartDate) classes.push('is-start-date');\n if (isToday) classes.push('is-today');\n if (isSelected && isInvalid && !isIncompleteDate) classes.push('is-unavailable');\n\n return classes.join(' ');\n}\n\nexport function addEmptiesMonthStart(monthStartDayOfWeek: number): DateEmpty[] {\n return addEmptyDates(0, monthStartDayOfWeek);\n}\n\nexport function addEmptiesMonthEnd(monthEndDayOfWeek: number): DateEmpty[] {\n if (monthEndDayOfWeek === 0) return [];\n return addEmptyDates(monthEndDayOfWeek, 7);\n}\n\nexport const emptyDate: DateEmpty = {\n date: null,\n integer: null,\n isActivity: false,\n isEmpty: true,\n isValid: false,\n isToday: false,\n isSelected: false,\n isStartDate: false,\n isEndDate: false,\n classList: '',\n};\n\nexport function addEmptyDates(from: number, to: number): DateEmpty[] {\n if (from === 7) from = 0;\n return [...Array(to - from).keys()].map(() => ({ ...emptyDate }) as DateEmpty);\n}\n","@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n:host {\n display: block;\n}\n\n:host[hidden] {\n display: none;\n}\n\nclick-elsewhere {\n position: relative;\n display: block;\n}\n\nq2-input {\n margin: 0;\n cursor: pointer;\n}\n\nq2-popover {\n --comp-min-tappable-size: 44px;\n --comp-table-border-spacing: 2px;\n --comp-min-tappable-size-and-spacing: calc(var(--comp-min-tappable-size) + var(--comp-table-border-spacing));\n --comp-popover-padding: #{var-list(var-prefixer(calendar-popover-padding), --app-scale-1x, 5px)};\n --comp-min-table-width: calc(var(--comp-min-tappable-size-and-spacing) * 7);\n --comp-table-container-border-spacing: calc(var(--comp-table-border-spacing) * 2);\n --comp-popover-total-padding: calc(var(--comp-popover-padding) * 2);\n\n --tct-popover-min-width: calc(\n var(--comp-min-table-width) + var(--comp-table-container-border-spacing) + var(--comp-popover-total-padding)\n );\n}\n\n.calendar-field-popup {\n padding: var(--comp-popover-padding);\n}\n\n.calendar-label {\n --comp-label-padding: #{var-list(\n --tct-calendar-label-padding,\n unquote('#{var-list(var-prefixer(calendar-label-vertical-padding), --tct-scale-2, --app-scale-2x, 10px)} 0')\n )};\n font-size: var-list(var-prefixer(calendar-label-font-size), 16px);\n flex: 1 1;\n flex-basis: calc(100% - var-list(--tct-btn-icon-width, 44px));\n margin: 0;\n padding: var(--comp-label-padding);\n}\n\n.cal-month-heading {\n padding: 0 0 0.75rem;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: var-list(var-prefixer(calendar-month-font-size), 16px);\n font-weight: var-list(var-prefixer(calendar-month-font-weight), 600);\n text-align: center;\n}\n\n.cal-month-text {\n min-width: 82px;\n display: inline-block;\n}\n\n.cal-year-text {\n min-width: 50px;\n display: inline-block;\n}\n\ntable {\n width: 100%;\n margin-bottom: 2px;\n text-align: center;\n border-spacing: var(--comp-table-border-spacing);\n}\n\nth {\n font-size: var-list(var-prefixer(calendar-day-heading-font-size), inherit);\n font-weight: var-list(var-prefixer(calendar-day-heading-font-weight), 600);\n width: 14.285714%;\n}\n\ntd {\n height: var(--comp-min-tappable-size);\n cursor: pointer;\n border: var-list(var-prefixer(calendar-day-border), 0);\n border-radius: var-list(var-prefixer(calendar-day-border-radius));\n\n &.is-unavailable {\n border: 1px solid var-list(--tct-input-error-border-color, --const-stoplight-alert, #d20a0a);\n }\n\n &.is-valid:hover {\n border: var-list(var-prefixer(calendar-day-hover-border), var-prefixer(calendar-day-border) 0);\n border-radius: var-list(\n var-prefixer(calendar-day-hover-border-radius),\n var-prefixer(calendar-day-border-radius)\n );\n\n background: var-list(\n --tct-calendar-day-hover-background,\n var-prefixer(calendar-day-hover-bg),\n --tct-gray-14,\n --app-gray14,\n --tct-gray-l4,\n --app-gray-l4,\n #f2f2f2\n );\n color: var-list(var-prefixer(calendar-day-hover-font-color), inherit);\n }\n\n &[aria-hidden],\n &[aria-disabled] {\n pointer-events: none;\n cursor: not-allowed;\n }\n\n &[aria-disabled] {\n opacity: var-list(var-prefixer(calendar-day-disabled-opacity), --app-disabled-opacity, 0.4);\n }\n\n &[aria-selected] {\n border: var-list(var-prefixer(calendar-day-selected-border), var-prefixer(calendar-day-border) 0);\n border-radius: var-list(\n var-prefixer(calendar-day-selected-border-radius),\n var-prefixer(calendar-day-border-radius)\n );\n background: var-list(\n --tct-calendar-day-selected-background,\n var-prefixer(calendar-day-selected-bg),\n --tct-calendar-day-hover-background, \n var-prefixer(calendar-day-hover-bg),\n var-prefixer(gray-14),\n --tct-gray-l4,\n --app-gray-l4,\n #f2f2f2\n );\n color: var-list(\n var-prefixer(calendar-day-selected-font-color),\n var-prefixer(calendar-day-hover-font-color),\n inherit\n );\n box-shadow: 0 0 0 2px\n var-list(\n var-prefixer(calendar-day-selected-outline-color),\n --tct-stoplight-info,\n --const-stoplight-info,\n #0079c1\n );\n \n }\n &[aria-selected]:focus {\n box-shadow: 0 0 0 2px\n var-list(\n var-prefixer(calendar-day-selected-outline-color),\n --tct-stoplight-info,\n --const-stoplight-info,\n #0079c1\n ),\n 0 0 0 4px var(--const-focus-color, #0066cc)\n }\n}\n\n.today-decorator {\n text-transform: uppercase;\n font-weight: 700;\n font-size: 10px;\n height: 12px;\n}\n\n\n.calendar-disclaimer {\n font-size: var-list(\n var-prefixer(calendar-disclaimer-font-size),\n --tct-font-size-small,\n --app-font-size-small,\n 12px\n );\n border-style: solid;\n border-width: var-list(var-prefixer(calendar-disclaimer-border-width), unquote('1px 0 0 0'));\n border-color: var-list(\n var-prefixer(calendar-disclaimer-border-color),\n var-prefixer(gray-13),\n --tct-gray-l3,\n --app-gray-l3,\n #e6e6e6\n );\n padding: var-list(--tct-calendar-disclaimer-padding, --tct-scale-2, --app-scale-2x, 10px);\n text-align: left;\n}\n","import {\n Component,\n ComponentInterface,\n Prop,\n Element,\n State,\n Event,\n EventEmitter,\n Listen,\n Watch,\n Method,\n h,\n} from '@stencil/core';\nimport { ISelectedMonthYear, CalendarDay, IDateValidators } from './q2-calendar-types';\nimport { addDays, isSameDay, format, isValid as isValidDate } from 'date-fns';\nimport {\n stringToDate,\n setupMonthYear,\n getMonths,\n getDays,\n getDaysOfWeek,\n stringArrayToDate,\n convertMomentFormat,\n validateInput,\n handleMissingZeros,\n formatDateISO,\n formatDateShort,\n IMomentLikeObject,\n removeTimezoneOffset,\n reorderDateString,\n formatDateFull,\n} from './q2-calendar-helpers';\nimport { buildDates, getValidDaysOfWeek, DateList } from './q2-calendar-validation';\nimport {\n handleAriaLabel,\n loc,\n overrideFocus,\n isEventFromElement,\n handleRenamedProp,\n waitForNextPaint,\n} from '../../utils';\nimport { IEventDetail } from '../q2-input/q2-input-types';\nimport { Q2InputCustomEvent } from 'src/components';\n\n@Component({ tag: 'q2-calendar', shadow: true, styleUrl: 'q2-calendar.scss' })\nexport class Q2Calendar implements ComponentInterface {\n /**\n * Detects the year automatically based on today's date when the user presses the `Escape` key or the `Blur` mouse event occurs.\n * Setting `future` or `past` as the value will increase or decrease the year by one, respectively.\n */\n @Prop({ reflect: true }) assume: 'current' | 'future' | 'past' = 'current';\n\n /** A label shown at the top of the popover date picker. */\n @Prop({ reflect: true }) calendarLabel: string;\n\n /** Display a button in the input field allowing the user to clear their selection. */\n @Prop({ reflect: true }) clearable: boolean;\n\n /**\n * Specifies a time of day after which a date is no longer valid.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true }) cutoffTime: string;\n\n /**\n * The most concise way to define valid days of the week for calendar. Each day of the week has a checksum value:\n *\n * - Sunday = 1\n * - Monday = 2\n * - Tuesday = 4\n * - Wednesday = 8\n * - Thursday = 16\n * - Friday = 32\n * - Saturday = 64\n *\n * Add the checksum values of your desired valid days together, and set `daysOfWeekChecksum` to that summed value.\n *\n * **Example:**\n * @snippet\n * element.daysOfWeekChecksum = 127 // All days of the week are valid\n * element.daysOfWeekChecksum = 62; // Only weekdays are valid\n * element.daysOfWeekChecksum = 65; // Only Saturday and Sunday are valid\n *\n */\n @Prop({ reflect: true }) daysOfWeekChecksum: number;\n\n /** Disable the input field. */\n @Prop({ reflect: true }) disabled: boolean;\n\n /**\n * Text that displays as the placeholder when the field is marked `disabled`.\n * @localizable\n */\n @Prop({ reflect: true }) disabledMsg: string;\n\n /** Text that appears at the bottom of the popover date picker. */\n @Prop({ reflect: true }) disclaimer: string;\n\n /**\n * Determines the display format of the date field value.\n *\n * Must follow the [date-fns](https://date-fns.org/v2.28.0/docs/format) token specification.\n */\n @Prop({ reflect: true }) displayFormat: string;\n\n /**\n * Defines the last selectable date in the date picker popover.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true }) endDate: string;\n\n /**\n * Each item in the `errors` array will appear below the input field when the field is focused and `typeable` is `true`.\n * @localizable\n */\n @Prop({ mutable: true }) errors: string[];\n\n /** Hide the input field's ` <label> ` element from view. */\n @Prop({ reflect: true, mutable: true }) hideLabel: boolean;\n\n /**\n * Each item in the `hints` array will appear below the input field when the field is focused and `typeable` is true.\n * @localizable\n */\n @Prop({ mutable: true }) hints: string[];\n\n /** Show error styles when the calendar is in an errant state. */\n @Prop({ reflect: true, mutable: true }) invalid: boolean;\n\n /**\n * Defines an explicit date blacklist.\n *\n * @warning\n * Must be a valid ISO date string.\n *\n * @info\n * When explicit date definitions like `invalidDates` is used, other date validity methods like `daysOfWeekChecksum` are overriden.\n */\n @Prop() invalidDates: string[];\n\n /** The visible label for the `q2-calendar` input field. */\n @Prop({ reflect: true, mutable: true }) label: string;\n\n /** Determine whether the popover is open or closed. */\n @Prop({ reflect: true, mutable: true }) open: boolean;\n\n /** Appends \"(optional)\" to the label and sets `aria-required=\"false\"`. */\n @Prop({ reflect: true }) optional: boolean;\n\n /**\n * Text that appears within the input field when it is blurred and empty.\n * Placeholder text disappears when the user focuses on the field and provides input.\n */\n @Prop({ reflect: true }) placeholder: string;\n\n /** Aligns the popover date picker to the left or right side of the input field. */\n @Prop() popoverAlignment: 'left' | 'right';\n\n /**\n * Force the direction of the popover date picker when it opens.\n * If no value is passed, the component will auto-detect the direction based on available space.\n */\n @Prop({ mutable: true }) popoverDirection: 'up' | 'down';\n\n /**\n * Determines the display mode of the popover.\n *\n * Providing a value of `legacy` instructs the popover to use absolute positioning instead of fixed positioning.\n *\n * @info\n * This is a temporary solution to work around styling issues related to using fixed positioning for the popover\n * when nested inside of elements with transform properties. This will be removed once the popover API is available\n * for use.\n */\n @Prop({ mutable: true }) popoverMode: 'legacy' = null;\n\n /** @deprecated */\n @Prop() popoverMinHeight: number = 355;\n\n /**\n * The field's content is not editable, but the field remains focusable.\n *\n * Appends \"(readonly)\" to the field label. Supersedes `optional` if both are `true`.\n */\n @Prop({ reflect: true }) readonly: boolean;\n\n /**\n * Defines the first selectabe date in the date picker popover.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true }) startDate: string;\n\n /** The user can type in the field. Only available in desktop browsers. */\n @Prop({ reflect: true }) typeable: boolean;\n\n /**\n * Defines an explicit date whitelist.\n *\n * @warning\n * Must be a valid ISO date string.\n *\n * @info\n * When explicit date definitions like `validDates` is used, other date validity methods like `daysOfWeekChecksum` are overriden.\n */\n @Prop() validDates: string[];\n\n /**\n * The value of the `q2-calendar` element, e.g. the selected date.\n *\n * **How to change or clear the value with javascript:**\n * @snippet\n * // change date\n * element.value = '2022-12-21';\n * // clear date\n * element.value = null;\n */\n @Prop({ mutable: true, reflect: true }) value: string | { toDate(): Date };\n\n /** @deprecated */\n @Prop({ reflect: true }) popDirection: 'up' | 'down';\n /** @deprecated */\n @Prop() onsuccess: (e: CustomEvent) => void;\n /** @deprecated */\n @Prop({ reflect: true }) buttonLabel: string;\n /** @deprecated */\n @Prop({ reflect: true, mutable: true }) ariaLabel: string;\n\n @Element() hostElement: HTMLElement;\n\n @State() keyboardSelection: boolean = false;\n @State() typedValue: string = '';\n @State() dateList: CalendarDay[];\n @State() hintMessage: string = this.defaultHintMessage;\n @State() hintMessageType: 'info' | 'error' = 'info';\n formatModifier: string = 'M/D/YYYY'; // To allow missing leading zero, 4/3/2021 => converts into 04/03/2021\n hintMessageElement: HTMLQ2MessageElement;\n controlElement: HTMLQ2InputElement;\n btnCalendarToggle: HTMLQ2BtnElement;\n calendarTable: HTMLTableElement;\n btnPrevMonth: HTMLQ2BtnElement;\n btnNextMonth: HTMLQ2BtnElement;\n btnPrevYear: HTMLQ2BtnElement;\n btnNextYear: HTMLQ2BtnElement;\n calendarBody: HTMLDivElement;\n defaultFormatString = 'mm/dd/yyyy';\n selectedMonthYear: ISelectedMonthYear;\n scheduledAfterRender: (() => void)[] = [];\n privatePopDirection: 'up' | 'down';\n popoverElement?: HTMLQ2PopoverElement;\n internalError: string = '';\n valueOnBlur: string | { toDate(): Date };\n\n connectedCallback() {\n this.selectedMonthYear = setupMonthYear(this.dateValue);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n if (this.value && this.isTypeable && !this.typedValue) {\n this.typedValue = reorderDateString(this.value as string);\n }\n this.validateDate();\n }\n\n componentWillLoad() {\n this.popDirectionHandler();\n handleAriaLabel(this);\n }\n\n componentDidRender() {\n setTimeout(() => {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n }, 25);\n }\n\n componentDidLoad(): void {\n overrideFocus(this.hostElement);\n }\n\n dayAbbrStrings = getDays();\n dayStrings = getDaysOfWeek();\n monthStrings = getMonths();\n\n get selectedDate() {\n const selectedCell = this.calendarBody?.querySelector<HTMLTableCellElement>('[aria-selected=\"true\"]');\n return selectedCell ? removeTimezoneOffset(new Date(selectedCell.dataset.date)) : null;\n }\n\n get innerInputField(): HTMLInputElement | HTMLButtonElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-field');\n }\n\n get innerInputContainer(): HTMLElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-container');\n }\n\n get defaultHintMessage() {\n return this.typeable\n ? loc('tecton.element.calendar.hint.format') + ': ' + this.defaultFormatString\n : loc('tecton.element.calendar.hint.select');\n }\n\n get canClear() {\n if (this.isTypeable) {\n return this.clearable && !!this.typedValue;\n } else {\n return this.clearable && !!this.value;\n }\n }\n\n get currentWeeks() {\n const weeks = this.dateList.reduce<CalendarDay[][]>((accum, item, index) => {\n const chunkIndex = Math.floor(index / 7);\n\n if (!accum[chunkIndex]) {\n accum[chunkIndex] = [];\n }\n\n accum[chunkIndex].push(item);\n\n return accum;\n }, []);\n\n return weeks;\n }\n\n get formattedValue() {\n const { typedValue, dateValue, displayFormat, isTypeable } = this;\n if (isTypeable) return typedValue;\n\n if (dateValue === undefined) return '';\n if (displayFormat) return format(dateValue, convertMomentFormat(displayFormat));\n\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n }).format(dateValue);\n }\n\n get computedPlaceholder(): string {\n if (this.disabled && this.disabledMsg) {\n return loc(this.disabledMsg);\n }\n\n if (this.buttonLabel && (this.disabled || this.placeholder)) {\n return loc(this.buttonLabel);\n }\n\n return (this.placeholder && loc(this.placeholder)) || '';\n }\n\n get dateValue(): Date | undefined {\n if (this.isTypeable) {\n return stringToDate(this.typedValue);\n } else {\n let { value } = this;\n const isMoment = value && typeof value !== 'string' && 'toDate' in value;\n if (isMoment) return (value as IMomentLikeObject).toDate();\n\n // stringified moment value assigned in html template e.g.) handlebar\n const isMomentString =\n typeof value === 'string' && value.split(' ').length === 6 && /GMT-\\d{4}/g.test(value);\n if (isMomentString) {\n value = formatDateISO(value as string);\n }\n\n return stringToDate(value as string);\n }\n }\n\n get dateValidators(): IDateValidators {\n const ct = new Date(this.cutoffTime || ''); // should fallback to InvalidDate\n return {\n startDate: stringToDate(this.startDate),\n endDate: stringToDate(this.endDate),\n cutOffTime: isValidDate(ct) ? ct : undefined,\n };\n }\n\n get isTypeable(): boolean {\n return this.typeable;\n }\n\n get errorList() {\n const { errors, internalError, invalid } = this;\n let list = [];\n if (internalError) {\n list = [internalError];\n }\n if (Array.isArray(errors) && errors.length) {\n list = errors\n .filter(error => !!error)\n .map(error => loc(error))\n .concat(list);\n } else if (!internalError && invalid) {\n return ['tecton.element.calendar.invalid'];\n }\n return list;\n }\n\n get hintList() {\n const { hints, hintMessageType, hintMessage } = this;\n if (Array.isArray(hints) && hints.length) return hints.filter(hint => !!hint).map(hint => loc(hint));\n if (hintMessageType === 'info' && hintMessage) return [hintMessage];\n return [];\n }\n\n //////// Host Element Events ////////\n @Listen('change')\n defaultChangeHandler(event: CustomEvent) {\n if (event.target === this.hostElement && !this.hostElement.onchange && !!event.detail) {\n this.value = event.detail.value;\n }\n }\n\n @Listen('error')\n defaultErrorHandler(event: CustomEvent) {\n if (event.target === this.hostElement && !this.hostElement.onerror) {\n if (this.hintMessageType === 'error' && this.hintMessage) {\n this.internalError = this.hintMessage;\n } else {\n this.internalError = loc('tecton.element.calendar.hint.invalidDate');\n }\n }\n }\n\n @Listen('success')\n defaultSuccessHandler(event: CustomEvent) {\n if (event.target !== this.hostElement) {\n return;\n }\n\n if (typeof this.onsuccess === 'function') {\n this.onsuccess(event);\n } else {\n this.internalError = '';\n if (this.hintMessageType === 'error' && this.hintMessage) {\n this.hintMessage = null;\n this.hintMessageType = null;\n this.invalid = false;\n }\n }\n }\n\n @Listen('focus')\n delegateFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n this.controlElement.shadowRoot.querySelector<HTMLElement>('.input-field').focus();\n }\n\n @Listen('clear')\n handleClear() {\n this.change.emit({ value: null });\n this.value = null;\n this.typedValue = '';\n }\n\n @Listen('popoverStateChanged')\n popoverStateHandler({ detail: { open } }: CustomEvent<{ open: boolean }>) {\n if (this.open !== open) this.open = open;\n }\n\n /// Methods ///\n _togglePopover() {\n const toggleElement = this.typeable ? this.btnCalendarToggle : this.innerInputField;\n toggleElement?.click();\n toggleElement?.focus();\n toggleElement.dispatchEvent(new FocusEvent('focus'));\n }\n\n /**\n * Emulates clicking the `<input>` to display the popover if it is hidden.\n *\n * @testOnly\n */\n @Method()\n async openPopover() {\n if (this.open) return;\n this._togglePopover();\n }\n\n /**\n * Emulates clicking the `<input>` to hide the popover if it is visible.\n *\n * @testOnly\n */\n @Method()\n async closePopover() {\n if (!this.open) return;\n this._togglePopover();\n }\n\n /**\n * Emulates clicking the `<input>` to display the popover, moving to the correct month and year, and clicking the\n * provided date.\n *\n * While a `string` value can be passed, we recommended passing a `Date` object. If the value is invalid, the method\n * will not select the date.\n *\n * @testOnly\n */\n @Method()\n async setValue(value: string | Date) {\n const date = typeof value === 'string' ? stringToDate(value) : value;\n if (!isValidDate(date)) return;\n\n await this.openPopover();\n await waitForNextPaint();\n\n this.goToMonthYear(date.getMonth(), date.getFullYear());\n await waitForNextPaint();\n const tableCell = this.calendarTable?.querySelector<HTMLTableCellElement>(\n `td[data-date=\"${formatDateISO(date)}\"]`\n );\n tableCell?.click();\n }\n\n /**\n * Emulates focusing the `<input>`, entering the provided value, and emitting an `input` event.\n *\n * While a `string` value can be passed, we recommended passing a `Date` object. If the value is invalid, the method\n * will not select the date.\n *\n * @warning\n * Only applicable when the input is typeable.\n *\n * @testOnly\n */\n @Method()\n async typeValue(value: string | Date) {\n if (!this.typeable) return;\n\n const date = typeof value === 'string' ? stringToDate(value) : value;\n const formattedDate = formatDateShort(date);\n if (!isValidDate(date)) return;\n\n const { innerInputField, controlElement } = this;\n innerInputField.focus();\n innerInputField.dispatchEvent(new FocusEvent('focus'));\n innerInputField.value = formattedDate;\n innerInputField.dispatchEvent(new InputEvent('input'));\n controlElement.dispatchEvent(new KeyboardEvent('keyup'));\n }\n\n //////// Observers //////////\n @Watch('popDirection')\n popDirectionHandler() {\n handleRenamedProp(this, 'popDirection', 'popoverDirection');\n }\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n @Watch('typeable')\n typeableChanged() {\n this.valueObserver(this.value);\n }\n\n @Watch('value')\n valueObserver(newValue: string | IMomentLikeObject) {\n // resetting by empty string\n if (newValue === '') {\n this.value = undefined;\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n return;\n }\n const isMoment = newValue && typeof newValue !== 'string' && 'toDate' in newValue;\n const newDate = isMoment ? (newValue as IMomentLikeObject).toDate() : stringToDate(newValue as string);\n const shortFormattedValue = formatDateShort(newDate);\n if (this.isTypeable) {\n this.typedValue = shortFormattedValue;\n } else {\n this.controlElement.value = shortFormattedValue;\n this.selectedMonthYear = setupMonthYear(newDate);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n // reset hint when value is cleared\n if (this.invalid) return;\n\n if (shortFormattedValue) {\n this.setHints({\n isValid: true,\n message: null,\n messageType: null,\n });\n } else {\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n }\n }\n\n @Watch('daysOfWeekChecksum')\n daysOfWeekChecksumObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('validDates')\n validDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('invalidDates')\n invalidDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('startDate')\n startDateObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('endDate')\n endDateObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('cutoffTime')\n cutoffTimeObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n ///////// Event /////////\n /**\n * Emitted when a date is selected or typed in the input field.\n * @legacyEvent\n */\n @Event() change: EventEmitter<{\n // ISO formatted date\n value: string | null;\n }>;\n\n /**\n * Emitted when an invalid date is entered into the field.\n */\n @Event() error: EventEmitter<{ errors: { message: string; errorCode: string }[] }>;\n\n /**\n * Emitted when a valid date is entered or selected.\n */\n @Event() success: EventEmitter<{\n // ISO formatted date\n value: string;\n }>;\n\n ///// Actions ////////\n\n buildDateList(monthYear: ISelectedMonthYear): DateList {\n const invalidDates = stringArrayToDate(this.invalidDates);\n const validDaysOfWeek = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const validDates = stringArrayToDate(this.validDates);\n return buildDates(\n validDaysOfWeek,\n validDates,\n invalidDates,\n monthYear,\n this.dateValue,\n this.dateValidators,\n this.typedValue\n );\n }\n\n validateDate() {\n try {\n if (!!this.value) {\n const { dateValue } = this;\n const month = dateValue?.getMonth() ?? undefined;\n const year = dateValue?.getFullYear() ?? undefined;\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n\n const isSelectedMonthAndYear = month === monthIndex && year === selectedYear;\n let calculationDateList = [];\n\n if (!dateValue) {\n calculationDateList = [];\n } else if (isSelectedMonthAndYear) {\n calculationDateList = this.dateList;\n } else {\n calculationDateList = this.buildDateList({\n monthIndex: month,\n selectedYear: year,\n });\n }\n\n const dateValueDayOfMonth = dateValue?.getDate() ?? undefined;\n const isDateValueInvalid = dateValueDayOfMonth\n ? !calculationDateList.find(({ integer }) => integer === dateValueDayOfMonth).isValid\n : true;\n if (isDateValueInvalid) {\n this.error.emit({\n errors: [\n {\n message: `Value passed is invalid: The date ${this.value} is not valid`,\n errorCode: 'generalInvalid',\n },\n ],\n });\n } else {\n this.success.emit({ value: formatDateISO(dateValue) });\n }\n }\n } catch (error) {\n console.warn('Invalid moment value ', this.dateValue);\n }\n }\n\n focusInput() {\n this.controlElement?.focus();\n }\n\n closeCalendar = () => {\n if (!this.open) return;\n this.open = false;\n this.focusInput();\n };\n\n openCalendar = () => {\n if (this.readonly || this.open) return;\n this.selectedMonthYear = setupMonthYear(this.dateValue);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.open = true;\n };\n\n toggleCalendar = () => {\n if (this.readonly) return;\n if (this.open) {\n this.closeCalendar();\n } else {\n this.openCalendar();\n }\n };\n\n onClickElsewhere = (event: CustomEvent) => {\n const target = event.target as HTMLClickElsewhereElement;\n if (target.localName === 'click-elsewhere') {\n event.stopPropagation();\n this.closeCalendar();\n }\n };\n\n onPopupKeyup = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.key === 'Esc') {\n this.onInputBlur();\n this.closeCalendar();\n }\n };\n\n onInputInput = ({ detail: { value } }: Q2InputCustomEvent<IEventDetail> & InputEvent) => {\n this.typedValue = value;\n };\n\n onInputKeydown = (event: KeyboardEvent) => {\n const { dateValue } = this;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n break;\n }\n };\n\n onInputKeyup = (event: KeyboardEvent) => {\n if (this.disabled) {\n return;\n }\n\n switch (event.key) {\n case 'Escape':\n this.onInputBlur();\n this.closeCalendar();\n break;\n }\n\n if (!this.isTypeable) return;\n\n // handle missing zero in month and date\n this.typedValue = handleMissingZeros(this.typedValue);\n const { typedValue } = this;\n const validDays = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const { isValid, message, messageType, inputDate, isAvailable, calendarPosition } = validateInput(\n typedValue,\n validDays,\n this.validDates,\n this.invalidDates,\n this.startDate,\n this.endDate,\n this.defaultFormatString,\n this.assume\n );\n\n if (calendarPosition) {\n const [mm, dd, yyyy] = calendarPosition;\n const date = new Date(yyyy, mm - 1, dd);\n if (isValidDate(date)) {\n this.selectedMonthYear = setupMonthYear(date);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n }\n\n if (event.key === 'Enter') {\n if (\n isValid ||\n (typedValue &&\n typedValue.length > 4 && // at least mm/dd provided\n inputDate &&\n isValidDate(inputDate) &&\n isAvailable)\n ) {\n this.setCompleteInput(inputDate);\n } else if (this.value) {\n this.value = null;\n this.change.emit({ value: null });\n this.typedValue = typedValue;\n }\n\n if (this.keyboardSelection) {\n this.keyboardSelection = false;\n this.closeCalendar();\n } else {\n this.toggleCalendar();\n }\n } else {\n this.setHints({ isValid, message, messageType });\n }\n };\n\n onInputChange = (event: Event) => {\n event.stopPropagation();\n };\n\n onInputBlur = () => {\n if (!this.isTypeable) return;\n\n const validDays = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const { typedValue } = this;\n const { isValid, inputDate, isAvailable } = validateInput(\n this.typedValue,\n validDays,\n this.validDates,\n this.invalidDates,\n this.startDate,\n this.endDate,\n this.defaultFormatString,\n this.assume\n );\n\n if (!typedValue && inputDate?.toString() === 'Invalid Date') {\n // initial/clear state\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n } else if (\n isValid ||\n (typedValue &&\n typedValue.length > 4 && // at least mm/dd provided\n inputDate &&\n isValidDate(inputDate) &&\n isAvailable)\n ) {\n this.setCompleteInput(inputDate);\n } else if (this.value) {\n this.valueOnBlur = this.value;\n this.value = null;\n this.change.emit({ value: null });\n this.typedValue = typedValue;\n }\n };\n\n onInputFocus = (event: FocusEvent) => {\n if (!this.isTypeable) return;\n if (event.target === this.controlElement) {\n if (this.valueOnBlur && !this.value) {\n const tmpTypedValue = this.typedValue;\n this.value = this.valueOnBlur;\n this.typedValue = tmpTypedValue;\n this.valueOnBlur = null;\n }\n this.closeCalendar();\n }\n };\n\n onInputClick = () => {\n if (this.disabled) return;\n this.toggleCalendar();\n };\n\n onRefocus = () => {\n this.btnPrevMonth?.dispatchEvent(new FocusEvent('focus'));\n };\n\n goToMonthYear = (monthIndex: number, year: number) => {\n if (monthIndex < 0) {\n monthIndex = 11;\n year--;\n } else if (monthIndex > 11) {\n monthIndex = 0;\n year++;\n }\n this.selectedMonthYear = {\n monthIndex,\n selectedYear: year,\n };\n this.dateList = this.buildDateList(this.selectedMonthYear);\n\n this.scheduledAfterRender.push(() => this.checkActiveCellForBlankness());\n };\n\n checkActiveCellForBlankness() {\n const activeElement = this.hostElement.shadowRoot.activeElement;\n if (!activeElement || activeElement.tagName !== 'TD' || !activeElement.hasAttribute('aria-hidden')) return;\n\n const { calendarBody } = this;\n const calendarCells = Array.from(calendarBody.querySelectorAll<Element>('td'));\n const indexOfCell = Array.from(calendarCells).indexOf(activeElement);\n\n const dayToFocus =\n indexOfCell < 15 ? 1 : calendarCells.filter(cell => !cell.hasAttribute('aria-hidden')).length;\n\n this.focusDay(this.generateDateFromDay(dayToFocus));\n }\n\n selectDate = (newDate: Date) => {\n const { isValid } = this.dateList.find(({ date }) => isSameDay(date, newDate));\n if (!isValid) return;\n this.change.emit({ value: formatDateISO(newDate) });\n this.typedValue = formatDateShort(newDate);\n this.invalid = false;\n this.success.emit({ value: formatDateISO(newDate) });\n };\n\n onDateSelection = (event: MouseEvent) => {\n const dateCell = (event.target as HTMLElement).closest<HTMLElement>('td:not([aria-hidden])');\n if (!dateCell) return;\n const clickedDate = removeTimezoneOffset(new Date(dateCell.dataset.date));\n this.selectDate(clickedDate);\n this.closeCalendar();\n };\n\n generateDateFromDay(day: number) {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n return new Date(selectedYear, monthIndex, day);\n }\n\n onHeaderControlKeydown = (event: KeyboardEvent) => {\n const currentDate = this.generateDateFromDay(1);\n const hasSelectedCell = this.calendarBody?.querySelector<HTMLTableCellElement>('[aria-selected=\"true\"]');\n\n if (event.key === 'Tab' && !hasSelectedCell) {\n event.preventDefault();\n this.activateDay(currentDate);\n }\n };\n\n onDateKeydown = (event: KeyboardEvent) => {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n const currentDay = parseInt((event.target as HTMLElement).dataset.day);\n const currentDate = this.generateDateFromDay(currentDay);\n\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -7));\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 7));\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 1));\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -1));\n break;\n\n case 'PageUp':\n event.preventDefault();\n if (event.shiftKey) this.goToMonthYear(monthIndex, selectedYear - 1);\n else this.goToMonthYear(monthIndex - 1, selectedYear);\n break;\n\n case 'PageDown':\n event.preventDefault();\n if (event.shiftKey) this.goToMonthYear(monthIndex, selectedYear + 1);\n else this.goToMonthYear(monthIndex + 1, selectedYear);\n break;\n\n case 'Home':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -currentDate.getDay()));\n break;\n\n case 'End':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 6 - currentDate.getDay()));\n break;\n\n case 'Escape':\n event.preventDefault();\n this.closeCalendar();\n this.focusInput();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (!this.dateList.find(({ date }) => isSameDay(date, currentDate)).isValid) return;\n this.selectDate(currentDate);\n this.closeCalendar();\n this.focusInput();\n break;\n\n case ' ':\n event.preventDefault();\n if (!this.dateList.find(({ date }) => isSameDay(date, currentDate)).isValid) return;\n this.selectDate(currentDate);\n this.focusInput();\n break;\n }\n };\n\n activateDay(date: Date) {\n this.goToMonthYear(date.getMonth(), date.getFullYear());\n this.scheduledAfterRender.push(() => this.focusDay(date));\n }\n\n async focusDay(date: Date) {\n if (!date) return;\n await waitForNextPaint();\n this.calendarBody.querySelector<HTMLElement>(`td[data-day=\"${date.getDate()}\"]`)?.focus();\n }\n\n render() {\n return (\n <click-elsewhere\n class={this.open ? 'dropdown-open' : undefined}\n onChange={this.onClickElsewhere}\n >\n {this.inputField()}\n <q2-popover\n ref={el => (this.popoverElement = el)}\n controlElement={this.innerInputContainer}\n open={this.open}\n direction={this.popoverDirection}\n minHeight={this.popoverMinHeight}\n align={this.popoverAlignment}\n mode={this.popoverMode || undefined}\n block\n >\n {this.hintField()}\n {this.calendarPopover()}\n </q2-popover>\n </click-elsewhere>\n );\n }\n\n hintField() {\n if (!this.hintMessage) return;\n\n return (\n <q2-message\n class=\"calendar-hint sr\"\n ref={el => (this.hintMessageElement = el)}\n type={this.hintMessageType}\n >\n {this.hintMessage}\n </q2-message>\n );\n }\n\n setHints({ isValid, message, messageType }) {\n if (message === this.hintMessage) return this.hintMessageElement?.present();\n this.invalid = !isValid;\n this.hintMessage = message;\n this.hintMessageType = messageType;\n if (messageType === 'error' && message) {\n this.internalError = message;\n this.error.emit({\n errors: [\n {\n message,\n errorCode: 'generalInvalid',\n },\n ],\n });\n }\n }\n\n setCompleteInput(inputDate: Date) {\n const formattedDate = formatDateShort(inputDate);\n this.change.emit({ value: formatDateISO(inputDate) });\n this.typedValue = formattedDate;\n this.internalError = null;\n this.setHints({\n isValid: true,\n message: null,\n messageType: null,\n });\n }\n\n inputField() {\n const { isTypeable } = this;\n return (\n <q2-input\n ref={el => (this.controlElement = el)}\n class=\"calendar-input-field\"\n value={this.formattedValue}\n label={loc(this.label)}\n hideLabel={this.hideLabel}\n disabled={!!this.disabled}\n readonly={!!this.readonly}\n clearable={this.canClear}\n placeholder={this.computedPlaceholder}\n optional={!!this.optional}\n ariaExpanded={`${!!this.open}`}\n hints={this.hintList}\n errors={this.errorList}\n onClick={isTypeable ? undefined : this.onInputClick}\n onChange={this.onInputChange}\n onInput={this.onInputInput}\n onKeyDown={this.onInputKeydown}\n onKeyUp={this.onInputKeyup}\n onBlur={this.onInputBlur}\n onFocus={this.onInputFocus}\n icon-right={isTypeable ? undefined : 'calendar'}\n format-modifier={isTypeable ? this.formatModifier : this.displayFormat || this.formatModifier}\n pseudo={!isTypeable}\n type=\"date\"\n hide-messages={!isTypeable}\n test-id=\"inputAndCalendarToggle\"\n _role=\"combobox\"\n >\n {isTypeable && (\n <q2-btn\n ref={el => (this.btnCalendarToggle = el)}\n slot=\"input-right\"\n onClick={this.onInputClick}\n test-id=\"calendarToggle\"\n label=\"tecton.element.calendar.toggleAriaLabel\"\n hide-label\n >\n <q2-icon type=\"calendar\" />\n </q2-btn>\n )}\n </q2-input>\n );\n }\n\n calendarPopover() {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n return (\n <div\n class=\"calendar-field-popup\"\n onKeyUp={this.onPopupKeyup}\n >\n {this.calendarLabel && <p class=\"calendar-label\">{loc(this.calendarLabel)}</p>}\n <div class=\"cal-month-heading\">\n <q2-btn\n label={loc('tecton.element.calendar.previousMonth')}\n hide-label\n ref={elm => (this.btnPrevMonth = elm)}\n class=\"cal-nav-btn prev-month\"\n test-id=\"previousMonthButton\"\n onClick={() => this.goToMonthYear(monthIndex - 1, selectedYear)}\n >\n <q2-icon type=\"chevron-left\" />\n </q2-btn>\n <span class=\"cal-month-text\">{this.monthStrings[monthIndex]}</span>\n <q2-btn\n label={loc('tecton.element.calendar.nextMonth')}\n hide-label\n class=\"cal-nav-btn next-month\"\n ref={elm => (this.btnNextMonth = elm)}\n test-id=\"nextMonthButton\"\n onClick={() => this.goToMonthYear(monthIndex + 1, selectedYear)}\n >\n <q2-icon type=\"chevron-right\" />\n </q2-btn>\n <q2-btn\n label={loc('tecton.element.calendar.previousYear')}\n hide-label\n class=\"cal-nav-btn prev-year\"\n ref={elm => (this.btnPrevYear = elm)}\n test-id=\"previousYearButton\"\n onClick={() => this.goToMonthYear(monthIndex, selectedYear - 1)}\n >\n <q2-icon type=\"chevron-left\" />\n </q2-btn>\n <span class=\"cal-year-text\">{this.selectedMonthYear.selectedYear}</span>\n <q2-btn\n label={loc('tecton.element.calendar.nextYear')}\n hide-label\n class=\"cal-nav-btn next-year\"\n ref={elm => (this.btnNextYear = elm)}\n test-id=\"nextYearButton\"\n onClick={() => this.goToMonthYear(monthIndex, selectedYear + 1)}\n onKeyDown={this.onHeaderControlKeydown}\n >\n <q2-icon type=\"chevron-right\" />\n </q2-btn>\n </div>\n <div\n class=\"sr\"\n aria-live=\"polite\"\n id=\"table-label\"\n >\n {`${this.monthStrings[monthIndex]} ${selectedYear}`}\n </div>\n {this.calendarDays()}\n {this.disclaimer && <div class=\"calendar-disclaimer\">{loc(this.disclaimer)}</div>}\n <q2-btn\n class=\"sr refocus-popup\"\n onFocus={this.onRefocus}\n />\n </div>\n );\n }\n\n calendarDays() {\n return (\n <table\n role=\"grid\"\n aria-labelledby=\"table-label\"\n ref={ref => (this.calendarTable = ref)}\n >\n <thead>\n <tr>\n {[...Array(7).keys()].map(index => (\n <th\n scope=\"col\"\n aria-label={this.dayStrings[index]}\n >\n {this.dayAbbrStrings[index]}\n </th>\n ))}\n </tr>\n </thead>\n <tbody\n onClick={this.onDateSelection}\n onKeyDown={this.onDateKeydown}\n ref={elm => (this.calendarBody = elm)}\n test-id=\"calendarTableBody\"\n >\n {this.currentWeeks.map(week => (\n <tr>\n {week.map(day => {\n let ariaLabel = '';\n if (day.isToday) ariaLabel = `${loc('tecton.element.calendar.today')}, `;\n ariaLabel += formatDateFull(day.date);\n if (day.isSelected) ariaLabel += ` (${loc('tecton.element.calendar.selected')})`;\n return (\n <td\n class={day.classList}\n aria-hidden={day.isEmpty ? 'true' : undefined}\n tabindex={day.isSelected ? 0 : -1}\n role={day.isSelected ? 'gridcell' : undefined}\n aria-selected={day.isSelected ? 'true' : undefined}\n aria-disabled={day.isValid ? undefined : 'true'}\n data-day={day.integer || undefined}\n data-date={day.date ? formatDateISO(day.date) : undefined}\n >\n {day?.isToday && (\n <div\n class=\"today-decorator\"\n aria-hidden=\"true\"\n >\n {loc('tecton.element.calendar.today')}\n </div>\n )}\n <div aria-label={ariaLabel}>{day?.integer ?? ''}</div>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as t,c as a,h as e,F as i,g as r}from"./p-a5f18e27.js";import{c as o,l as n,i as s,o as c}from"./p-42302f6f.js";const l="*{box-sizing:border-box}*:active{outline:none}*:focus{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{display:block;position:relative}button{cursor:pointer;margin:0}.tab-container{position:relative}ul{--comp-container-padding:var(--tct-scale-1, var(--app-scale-1x, 5px)) var(--tct-scale-1, var(--app-scale-1x, 5px)) 0;padding:var(--tct-tab-container-padding, var(--t-tab-container-padding, var(--comp-container-padding)));margin:var(--tct-tab-container-margin, var(--t-tab-container-margin, 0));display:flex;gap:var(--tct-tab-gap, var(--t-tab-gap, var(--tct-scale-1, var(--app-scale-1x, 5px))));list-style:none;border-bottom:1px solid var(--tct-tab-container-border-color, var(--t-tab-container-border-color, var(--tct-gray-11, var(--t-gray-11, var(--tct-gray-l1, var(--app-gray-l1, #cccccc))))));overflow-x:auto;align-items:center;scrollbar-width:none;scrollbar-color:transparent}ul::-webkit-scrollbar{width:0;height:0}ul::-webkit-scrollbar-thumb{background:transparent}ul::-webkit-scrollbar-track{background:transparent}@media print{ul.no-print{display:none}}li{flex:0 0 auto}li button{background:var(--tct-tab-inactive-background, var(--tct-tab-inactive-bg-color, var(--t-tab-inactive-bg-color, transparent)));border-width:var(--tct-tab-inactive-border-width, var(--t-tab-inactive-border-width, 0 0 3px 0));border-color:var(--tct-tab-inactive-border-color, var(--t-tab-inactive-border-color, transparent));border-style:var(--tct-tab-inactive-border-style, var(--t-tab-inactive-border-style, solid));border-radius:var(--tct-tab-border-radius, var(--t-tab-border-radius, 0));width:var(--tct-tab-width, var(--t-tab-width, 100%));text-align:var(--tct-tab-text-align, var(--t-tab-text-align, center));text-decoration:var(--tct-tab-text-decoration, var(--t-tab-text-decoration, none));padding:var(--tct-tab-padding, var(--t-tab-padding, var(--tct-scale-2, var(--app-scale-2x, 10px))));color:var(--tct-tab-inactive-color, var(--t-tab-inactive-color, inherit));font-size:var(--tct-tab-font-size, var(--t-tab-font-size, 17px));display:block;transition:color var(--tct-tween-2, var(--app-tween-2, 0.4s ease)), border-color var(--tct-tween-1, var(--app-tween-1, 0.2s ease))}:host([type=section]) li button{--comp-tab-section-padding:var(--tct-scale-2, var(--app-scale-2x, 10px)) var(--tct-scale-1, var(--app-scale-1x, 5px));font-size:var(--tct-tab-section-font-size, inherit);padding:var(--tct-tab-section-padding, var(--t-tab-section-padding, var(--comp-tab-section-padding)))}li button:hover{color:var(--tct-tab-hover-color, var(--t-tab-hover-color, var(--tct-tab-active-color, var(--t-tab-active-color, #2e2e2e))));background:var(--tct-tab-hover-background, var(--tct-tab-hover-bg-color, var(--t-tab-hover-bg-color, inherit)));width:var(--tct-tab-hover-width, var(--t-tab-hover-width, 100%))}li button[aria-selected=true]{color:var(--tct-tab-active-color, var(--t-tab-active-color, #2e2e2e));border-color:var(--tct-tab-active-border-color, var(--t-tab-active-border-color, currentcolor));border-style:var(--tct-tab-active-border-style, var(--t-tab-active-border-style, solid));width:var(--tct-tab-active-width, var(--t-tab-active-width, 100%));background:var(--tct-tab-active-background, var(--tct-tab-active-bg-color, var(--t-tab-active-bg-color, inherit)))}:host([color=alt]) li button{color:var(--tct-tab-alt-inactive-color, var(--t-tab-alt-inactive-color, inherit))}:host([color=alt]) li button:hover,:host([color=alt]) li button[aria-selected=true]{color:var(--tct-tab-alt-active-color, var(--t-tab-alt-active-color, inherit))}@media screen and (max-width: 767px){li button{--comp-tab-padding:var(--tct-scale-2, var(--app-scale-2x, 10px)) var(--tct-scale-1, var(--app-scale-1x, 5px));font-size:inherit;padding:var(--tct-tab-padding, var(--t-tab-padding, var(--comp-tab-padding)))}}.tab-content{--comp-tab-content-padding:var(--tct-scale-2, var(--app-scale-2x, 10px)) 0;padding:var(--tct-tab-content-padding, var(--t-tab-content-padding, var(--comp-tab-content-padding)))}.tab-content:focus{outline:none;box-shadow:none}.gradient-left,.gradient-right{z-index:1;position:absolute;top:0;height:100%;width:44px}.gradient-left{background-image:linear-gradient(to left, var(--t-base-a0), var(--t-base-a2) 10%, var(--t-base) 100%);left:0}.gradient-right{background-image:linear-gradient(to right, var(--t-base-a0), var(--t-base-a2) 10%, var(--t-base) 100%);right:0}.btn-left,.btn-right{--tct-icon-size:18px;--tct-btn-icon-hover-background:transparent;--tct-btn-icon-width:22px;--tct-icon-stroke-primary:var(--tct-stepper-scroll-arrow-color, var(--t-stepper-scroll-arrow-color, var(--t-text, #4d4d4d)));position:absolute;top:calc(50% - 22px);z-index:2}.btn-left q2-icon,.btn-right q2-icon{--tct-icon-stroke-width:3}.btn-left{left:0}.btn-right{right:0}.tab-pane-badge{display:flex;justify-content:space-between;align-items:center}.tab-pane-badge q2-badge{margin-left:5px;margin-right:5px}";const b=l;const d=class{constructor(e){t(this,e);this.change=a(this,"change",7);this.settled=a(this,"settled",7);this.guid=o();this.scheduledAfterRender=[];this.lastScrolled=new Date(null).getTime();this.updateTabData=()=>{this.updateTabPaneProps();this.setTabs()};this.updateTabPaneProps=()=>{this.tabPanes.forEach(((t,a)=>{t.selected=t.value===this.selectedTabValue;t.guid=this.guid;t.index=a}))};this.setTabs=()=>{this.tabs=this.tabPanes.map((({label:t,value:a,badgeCount:e,badgeDescription:i,badgeTheme:r,badgeStatus:o})=>({label:t&&n(t)||"",value:a,badgeCount:e,badgeDescription:i,badgeTheme:r,badgeStatus:o})))};this.onTabClick=t=>{const a=t.target.closest('button[role="tab"]').dataset.value;const e=this.value===a;if(e)return;this.change.emit({value:a})};this.onTabKeyDown=t=>{const a=t.target.dataset.value;switch(t.key){case"ArrowRight":t.preventDefault();this.moveToAdjacentTab(a,"next");break;case"ArrowLeft":t.preventDefault();this.moveToAdjacentTab(a,"prev");break;case"Home":t.preventDefault();this.moveToAdjacentTab(a,"first");break;case"End":t.preventDefault();this.moveToAdjacentTab(a,"last");break;case"Space":case"Enter":t.preventDefault();this.change.emit({value:a});break}};this.moveToAdjacentTab=(t,a)=>{const e=this.tabs.map((({value:t})=>t)).indexOf(t);let i;switch(a){case"next":i=Math.min(e+1,this.tabs.length-1);break;case"prev":i=Math.max(e-1,0);break;case"first":i=0;break;case"last":i=this.tabs.length-1;break}if(e===i)return;this.moveFocus(i,false)};this.moveFocus=(t,a=true)=>{const e=this.tabs[t].value;const i=this.listElement.querySelector(`[data-value="${e}"]`);i.focus({preventScroll:a});const r=i.offsetLeft-this.listElement.clientWidth/2;this.listElement.scrollTo({left:r,behavior:"smooth"});return i};this.checkScrollState=()=>{if(!this.listElement)return;const{scrollLeft:t,scrollWidth:a,clientWidth:e}=this.listElement;this.scrollEnabled=a>e;this.showScrollLeft=t>0;this.showScrollRight=a>Math.ceil(t)+e};this.onScrollBtnClick=t=>{const{scrollLeft:a,scrollWidth:e,clientWidth:i}=this.listElement;const r=Math.floor(i/2);let o=0;if(t==="left"){o=-Math.min(r,Math.abs(a))}else{o=Math.min(r,Math.abs(e-a-i))}this.listElement.scrollBy({left:o,behavior:"smooth"})};this.onSlotChange=()=>{this.checkScrollState()};this.color=undefined;this.name=undefined;this.noPrint=false;this.type=undefined;this.value=undefined;this.hasLeft=false;this.hasRight=false;this.scrollEnabled=false;this.showScrollLeft=false;this.showScrollRight=false;this.tabs=undefined}resizeIframe(){var t,a;return(a=(t=window.TectonElements)===null||t===void 0?void 0:t.resizeIframe)===null||a===void 0?void 0:a.call(t)}get tabPanes(){const t=this.hostElement.querySelectorAll("q2-tab-pane, tecton-tab-pane");if(t.length===0){return[]}return Array.from(t).filter((t=>t.name===this.name))}get selectedTabValue(){return this.value||this.tabPanes[0].value||""}get tabList(){return this.hostElement.shadowRoot.querySelector(".tab-list")}defaultChangeHandler(t){if(t.target===this.hostElement&&!this.hostElement.onchange){this.value=t.detail.value}}onResize(){this.checkScrollState()}onFocus(t){if(!s(t,this.hostElement))return;const a=this.tabs.findIndex((t=>t.value===this.selectedTabValue));this.moveFocus(a)}onBadge(){this.setTabs()}componentWillLoad(){const t=new MutationObserver(this.updateTabData);t.observe(this.hostElement,{childList:true,attributes:true});this.mutationObserver=t;this.resizeObserver=new ResizeObserver((()=>this.checkScrollState()));this.updateTabData()}componentDidRender(){this.scheduledAfterRender.forEach((t=>t()));this.scheduledAfterRender=[];this.settled.emit()}componentDidLoad(){var t;(t=this.resizeObserver)===null||t===void 0?void 0:t.observe(this.listElement);this.checkScrollState();c(this.hostElement);const a=this.tabs.findIndex((t=>t.value===this.value));this.scheduledAfterRender.push((()=>{const t=this.tabs.length>0;if(!t)return;const e=this.moveFocus(Math.max(a,0));this.value=e.dataset.value;e.blur()}))}disconnectedCallback(){this.resizeObserver.disconnect();this.mutationObserver.disconnect();this.resizeObserver=null;this.mutationObserver=null}valueObserver(){this.updateTabData();this.scheduledAfterRender.push(this.resizeIframe);const t=this.tabs.findIndex((t=>t.value===this.value));if(t>-1){this.scheduledAfterRender.push((()=>this.moveFocus(t,false)))}}nameObserver(){this.updateTabData()}render(){return e(i,{key:"1d47fe831e541ada6eef63809436a6dfe99c8ba6"},e("div",{key:"b9b35b33f9c9043544d134223ad6fad27ff80c05",class:"tab-container"},this.scrollEnabled&&e(i,{key:"f7148ae6605303f29efc81c8888abeefe5783127"},e("div",{key:"7121a3544b0be5e8a4820350bd81a43da4ed0c0d",class:"gradient-left",hidden:!this.showScrollLeft}),e("div",{key:"576fb473a9a07d817ff44452bc4c80097fa775cd",class:"gradient-right",hidden:!this.showScrollRight}),e("q2-btn",{key:"d0e7b29902d00749640bd1788276c22a2f84c5c0",class:"btn-left",hidden:!this.showScrollLeft,onClick:()=>this.onScrollBtnClick("left")},e("q2-icon",{key:"a44d0b2652139edd4a58825d325092bfb1115015",type:"chevron-left",label:"scroll left"})),e("q2-btn",{key:"d37c47ef7d89e086e8fd5190a4565da80f7f4cc0",class:"btn-right",hidden:!this.showScrollRight,onClick:()=>this.onScrollBtnClick("right")},e("q2-icon",{key:"a6d2c83b5e8c7dcdd3fe9e745ae4f0a9c44ec027",type:"chevron-right",label:"scroll right"}))),e("ul",{key:"98fa557d17f6bb32ec360c11b742880bd8c14c6c",onScroll:this.checkScrollState,ref:t=>this.listElement=t,class:this.noPrint?"no-print":null,role:"tablist"},this.tabs.map(((t,a)=>this.generateTab(t,a))))),e("div",{key:"a37e19900b2430147b7cbf482225d4a2a8854a6a",class:"tab-content"},e("slot",{key:"0eb4151d2ea58a629952e0076162305c78b1f9a9",onSlotchange:()=>this.onSlotChange()})))}generateTab(t,a){const{label:i,value:r}=t;const o=this.selectedTabValue===r;return e("li",{role:"presentation"},e("button",{id:`tab-${this.guid}-${a}`,"data-value":r,"test-id":"tabLink",tabIndex:o?0:-1,role:"tab","aria-selected":o?"true":"false","aria-controls":`tab-pane-${this.guid}-${a}`,onClick:this.onTabClick,onKeyDown:this.onTabKeyDown},t.badgeCount===undefined?i:this.generateTabWithBadge(t,o)))}generateTabWithBadge(t,a){let i;if(!t.badgeStatus&&a)i=t.badgeTheme||"primary";let r;if(t.badgeDescription)r=n(t.badgeDescription);else if(t.badgeStatus)r=n(`tecton.element.tab.pane.${t.badgeStatus}`,[t.badgeCount]);else r=n("tecton.element.tab.pane.new");return e("div",{class:"tab-pane-badge","aria-label":`${t.label}, ${t.badgeCount} ${r}`},t.label,e("q2-badge",{value:t.badgeCount,theme:i,status:t.badgeStatus}))}get hostElement(){return r(this)}static get watchers(){return{value:["valueObserver"],name:["nameObserver"]}}};d.style=b;export{d as q2_tab_container};
2
- //# sourceMappingURL=p-debd5249.entry.js.map
1
+ import{r as t,c as a,h as e,F as i,g as r}from"./p-a5f18e27.js";import{c as o,l as n,i as s,o as c}from"./p-42302f6f.js";const l="*{box-sizing:border-box}*:active{outline:none}*:focus{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{display:block;position:relative}button{cursor:pointer;margin:0}.tab-container{position:relative}ul{--comp-container-padding:var(--tct-scale-1, var(--app-scale-1x, 5px)) var(--tct-scale-1, var(--app-scale-1x, 5px)) 0;padding:var(--tct-tab-container-padding, var(--t-tab-container-padding, var(--comp-container-padding)));margin:var(--tct-tab-container-margin, var(--t-tab-container-margin, 0));display:flex;gap:var(--tct-tab-gap, var(--t-tab-gap, var(--tct-scale-1, var(--app-scale-1x, 5px))));list-style:none;border-bottom:1px solid var(--tct-tab-container-border-color, var(--t-tab-container-border-color, var(--tct-gray-11, var(--t-gray-11, var(--tct-gray-l1, var(--app-gray-l1, #cccccc))))));overflow-x:auto;align-items:center;scrollbar-width:none;scrollbar-color:transparent}ul::-webkit-scrollbar{width:0;height:0}ul::-webkit-scrollbar-thumb{background:transparent}ul::-webkit-scrollbar-track{background:transparent}@media print{ul.no-print{display:none}}li{flex:0 0 auto}li button{background:var(--tct-tab-inactive-background, var(--tct-tab-inactive-bg-color, var(--t-tab-inactive-bg-color, transparent)));border-width:var(--tct-tab-inactive-border-width, var(--t-tab-inactive-border-width, 0 0 3px 0));border-color:var(--tct-tab-inactive-border-color, var(--t-tab-inactive-border-color, transparent));border-style:var(--tct-tab-inactive-border-style, var(--t-tab-inactive-border-style, solid));border-radius:var(--tct-tab-border-radius, var(--t-tab-border-radius, 0));width:var(--tct-tab-width, var(--t-tab-width, 100%));text-align:var(--tct-tab-text-align, var(--t-tab-text-align, center));text-decoration:var(--tct-tab-text-decoration, var(--t-tab-text-decoration, none));padding:var(--tct-tab-padding, var(--t-tab-padding, var(--tct-scale-2, var(--app-scale-2x, 10px))));color:var(--tct-tab-inactive-color, var(--t-tab-inactive-color, inherit));font-size:var(--tct-tab-font-size, var(--t-tab-font-size, 17px));display:block;transition:color var(--tct-tween-2, var(--app-tween-2, 0.4s ease)), border-color var(--tct-tween-1, var(--app-tween-1, 0.2s ease))}:host([type=section]) li button{--comp-tab-section-padding:var(--tct-scale-2, var(--app-scale-2x, 10px)) var(--tct-scale-1, var(--app-scale-1x, 5px));font-size:var(--tct-tab-section-font-size, inherit);padding:var(--tct-tab-section-padding, var(--t-tab-section-padding, var(--comp-tab-section-padding)))}li button:hover{color:var(--tct-tab-hover-color, var(--t-tab-hover-color, var(--tct-tab-active-color, var(--t-tab-active-color, #2e2e2e))));background:var(--tct-tab-hover-background, var(--tct-tab-hover-bg-color, var(--t-tab-hover-bg-color, inherit)));width:var(--tct-tab-hover-width, var(--t-tab-hover-width, 100%))}li button[aria-selected=true]{color:var(--tct-tab-active-color, var(--t-tab-active-color, #2e2e2e));border-color:var(--tct-tab-active-border-color, var(--t-tab-active-border-color, currentcolor));border-style:var(--tct-tab-active-border-style, var(--t-tab-active-border-style, solid));width:var(--tct-tab-active-width, var(--t-tab-active-width, 100%));background:var(--tct-tab-active-background, var(--tct-tab-active-bg-color, var(--t-tab-active-bg-color, inherit)))}:host([color=alt]) li button{color:var(--tct-tab-alt-inactive-color, var(--t-tab-alt-inactive-color, inherit))}:host([color=alt]) li button:hover,:host([color=alt]) li button[aria-selected=true]{color:var(--tct-tab-alt-active-color, var(--t-tab-alt-active-color, inherit))}@media screen and (max-width: 767px){li button{--comp-tab-padding:var(--tct-scale-2, var(--app-scale-2x, 10px)) var(--tct-scale-1, var(--app-scale-1x, 5px));font-size:inherit;padding:var(--tct-tab-padding, var(--t-tab-padding, var(--comp-tab-padding)))}}.tab-content{--comp-tab-content-padding:var(--tct-scale-2, var(--app-scale-2x, 10px)) 0;padding:var(--tct-tab-content-padding, var(--t-tab-content-padding, var(--comp-tab-content-padding)))}.tab-content:focus{outline:none;box-shadow:none}.gradient-left,.gradient-right{z-index:1;position:absolute;top:0;height:100%;width:44px}.gradient-left{background-image:linear-gradient(to left, var(--t-base-a0), var(--t-base-a2) 10%, var(--t-base) 100%);left:0}.gradient-right{background-image:linear-gradient(to right, var(--t-base-a0), var(--t-base-a2) 10%, var(--t-base) 100%);right:0}.btn-left,.btn-right{--tct-icon-size:18px;--tct-btn-icon-hover-background:transparent;--tct-btn-icon-width:22px;--tct-icon-stroke-primary:var(--tct-stepper-scroll-arrow-color, var(--t-stepper-scroll-arrow-color, var(--t-text, #4d4d4d)));position:absolute;top:calc(50% - 22px);z-index:2}.btn-left q2-icon,.btn-right q2-icon{--tct-icon-stroke-width:3}.btn-left{left:0}.btn-right{right:0}.tab-pane-badge{display:flex;justify-content:space-between;align-items:center}.tab-pane-badge q2-badge{margin-left:5px;margin-right:5px}";const d=l;const b=class{constructor(e){t(this,e);this.change=a(this,"change",7);this.settled=a(this,"settled",7);this.guid=o();this.scheduledAfterRender=[];this.lastScrolled=new Date(null).getTime();this.updateTabData=()=>{this.updateTabPaneProps();this.setTabs()};this.updateTabPaneProps=()=>{this.tabPanes.forEach(((t,a)=>{t.selected=t.value===this.selectedTabValue;t.guid=this.guid;t.index=a}))};this.setTabs=()=>{this.tabs=this.tabPanes.map((({label:t,value:a,badgeCount:e,badgeDescription:i,badgeTheme:r,badgeStatus:o})=>({label:t&&n(t)||"",value:a,badgeCount:e,badgeDescription:i,badgeTheme:r,badgeStatus:o})))};this.onTabClick=t=>{const a=t.target.closest('button[role="tab"]').dataset.value;const e=this.value===a;if(e)return;this.change.emit({value:a})};this.onTabKeyDown=t=>{const a=t.target.dataset.value;switch(t.key){case"ArrowRight":t.preventDefault();this.moveToAdjacentTab(a,"next");break;case"ArrowLeft":t.preventDefault();this.moveToAdjacentTab(a,"prev");break;case"Home":t.preventDefault();this.moveToAdjacentTab(a,"first");break;case"End":t.preventDefault();this.moveToAdjacentTab(a,"last");break;case"Space":case"Enter":t.preventDefault();this.change.emit({value:a});break}};this.moveToAdjacentTab=(t,a)=>{const e=this.tabs.map((({value:t})=>t)).indexOf(t);let i;switch(a){case"next":i=Math.min(e+1,this.tabs.length-1);break;case"prev":i=Math.max(e-1,0);break;case"first":i=0;break;case"last":i=this.tabs.length-1;break}if(e===i)return;this.moveFocus(i,false)};this.moveFocus=(t,a=true)=>{const e=this.tabs[t].value;const i=this.listElement.querySelector(`[data-value="${e}"]`);i.focus({preventScroll:a});const r=i.offsetLeft-this.listElement.clientWidth/2;this.listElement.scrollTo({left:r,behavior:"smooth"});return i};this.checkScrollState=()=>{if(!this.listElement)return;const{scrollLeft:t,scrollWidth:a,clientWidth:e}=this.listElement;this.scrollEnabled=a>e;this.showScrollLeft=t>0;this.showScrollRight=a>Math.ceil(t)+e};this.onScrollBtnClick=t=>{const{scrollLeft:a,scrollWidth:e,clientWidth:i}=this.listElement;const r=Math.floor(i/2);let o=0;if(t==="left"){o=-Math.min(r,Math.abs(a))}else{o=Math.min(r,Math.abs(e-a-i))}this.listElement.scrollBy({left:o,behavior:"smooth"})};this.onSlotChange=()=>{this.checkScrollState()};this.color=undefined;this.name=undefined;this.noPrint=false;this.type=undefined;this.value=undefined;this.hasLeft=false;this.hasRight=false;this.scrollEnabled=false;this.showScrollLeft=false;this.showScrollRight=false;this.tabs=undefined}resizeIframe(){var t,a;return(a=(t=window.TectonElements)===null||t===void 0?void 0:t.resizeIframe)===null||a===void 0?void 0:a.call(t)}get tabPanes(){const t=this.hostElement.querySelectorAll("q2-tab-pane, tecton-tab-pane");if(t.length===0){return[]}return Array.from(t).filter((t=>t.name===this.name))}get selectedTabValue(){return this.value||this.tabPanes[0].value||""}get tabList(){return this.hostElement.shadowRoot.querySelector(".tab-list")}defaultChangeHandler(t){if(t.target===this.hostElement&&!this.hostElement.onchange){this.value=t.detail.value}}onResize(){this.checkScrollState()}onFocus(t){if(!s(t,this.hostElement))return;const a=this.tabs.findIndex((t=>t.value===this.selectedTabValue));this.moveFocus(a)}onBadge(){this.setTabs()}componentWillLoad(){const t=new MutationObserver(this.updateTabData);t.observe(this.hostElement,{childList:true,attributes:true});this.mutationObserver=t;this.resizeObserver=new ResizeObserver((()=>this.checkScrollState()));this.updateTabData()}componentDidRender(){this.scheduledAfterRender.forEach((t=>t()));this.scheduledAfterRender=[];this.settled.emit()}componentDidLoad(){var t;(t=this.resizeObserver)===null||t===void 0?void 0:t.observe(this.listElement);this.checkScrollState();c(this.hostElement);const a=this.tabs.findIndex((t=>t.value===this.value));this.scheduledAfterRender.push((()=>{const t=this.tabs.length>0;if(!t)return;const e=this.moveFocus(Math.max(a,0));this.value=e.dataset.value;e.blur()}))}disconnectedCallback(){this.resizeObserver.disconnect();this.mutationObserver.disconnect();this.resizeObserver=null;this.mutationObserver=null}valueObserver(){this.updateTabData();this.scheduledAfterRender.push(this.resizeIframe);const t=this.tabs.findIndex((t=>t.value===this.value));if(t>-1){this.scheduledAfterRender.push((()=>this.moveFocus(t,false)))}}nameObserver(){this.updateTabData()}render(){return e(i,{key:"5a9cc3b2466e29ff64d7b0506b89e89d777a7a7d"},e("div",{key:"63f7e28716ee2195363f63f9fd41eaa758ca1c3f",class:"tab-container"},this.scrollEnabled&&e(i,{key:"0491dd8fee1dab104fa9d170ffd49a2a2d95579b"},e("div",{key:"976dfb9eb894142949e6202562b3ad31a42325d0",class:"gradient-left",hidden:!this.showScrollLeft}),e("div",{key:"1991bd548c8482e7f4e34a1c2542e263585d0ac4",class:"gradient-right",hidden:!this.showScrollRight}),e("q2-btn",{key:"a0926317f917971aaa562ce6296ca3e34256fb80",class:"btn-left",hidden:!this.showScrollLeft,onClick:()=>this.onScrollBtnClick("left")},e("q2-icon",{key:"9ed6e899772c6958a19ff1352c26265b3b50c6f9",type:"chevron-left",label:"scroll left"})),e("q2-btn",{key:"f7d4a139b2866fc76cb426a85a3059470a159d8e",class:"btn-right",hidden:!this.showScrollRight,onClick:()=>this.onScrollBtnClick("right")},e("q2-icon",{key:"8af25bc00dda9ac2716ebcb0ec04dfafdb0e2699",type:"chevron-right",label:"scroll right"}))),e("ul",{key:"5c0ad5e0744f98261fe60ab15b3d719e8f35a1ed",onScroll:this.checkScrollState,ref:t=>this.listElement=t,class:this.noPrint?"no-print":null,role:"tablist"},this.tabs.map(((t,a)=>this.generateTab(t,a))))),e("div",{key:"7d7c6c023f54aaf2da275127239efd69721b7494",class:"tab-content"},e("slot",{key:"d98858bf6f71b3587ec49e063541bda7e843f143",onSlotchange:()=>this.onSlotChange()})))}generateTab(t,a){const{label:i,value:r}=t;const o=this.selectedTabValue===r;return e("li",{role:"presentation"},e("button",{id:`tab-${this.guid}-${a}`,"data-value":r,"test-id":"tabLink",tabIndex:o?0:-1,role:"tab","aria-selected":o?"true":"false",onClick:this.onTabClick,onKeyDown:this.onTabKeyDown},t.badgeCount===undefined?i:this.generateTabWithBadge(t,o)))}generateTabWithBadge(t,a){let i;if(!t.badgeStatus&&a)i=t.badgeTheme||"primary";let r;if(t.badgeDescription)r=n(t.badgeDescription);else if(t.badgeStatus)r=n(`tecton.element.tab.pane.${t.badgeStatus}`,[t.badgeCount]);else r=n("tecton.element.tab.pane.new");return e("div",{class:"tab-pane-badge","aria-label":`${t.label}, ${t.badgeCount} ${r}`},t.label,e("q2-badge",{value:t.badgeCount,theme:i,status:t.badgeStatus}))}get hostElement(){return r(this)}static get watchers(){return{value:["valueObserver"],name:["nameObserver"]}}};b.style=d;export{b as q2_tab_container};
2
+ //# sourceMappingURL=p-ad274c67.entry.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["q2TabContainerCss","Q2TabContainerStyle0","Q2TabContainer","this","guid","createGuid","scheduledAfterRender","lastScrolled","Date","getTime","updateTabData","updateTabPaneProps","setTabs","tabPanes","forEach","tab","index","selected","value","selectedTabValue","tabs","map","label","badgeCount","badgeDescription","badgeTheme","badgeStatus","loc","onTabClick","event","targetValue","target","closest","dataset","isAlreadySelected","change","emit","onTabKeyDown","key","preventDefault","moveToAdjacentTab","direction","indexOf","newIndex","Math","min","length","max","moveFocus","preventScroll","focusedValue","focusedTab","listElement","querySelector","focus","left","offsetLeft","clientWidth","scrollTo","behavior","checkScrollState","scrollLeft","scrollWidth","scrollEnabled","showScrollLeft","showScrollRight","ceil","onScrollBtnClick","halfWidth","floor","scrollAmount","abs","scrollBy","onSlotChange","resizeIframe","_b","_a","window","TectonElements","call","hostElement","querySelectorAll","Array","from","filter","pane","name","tabList","shadowRoot","defaultChangeHandler","onchange","detail","onResize","onFocus","isEventFromElement","findIndex","el","onBadge","componentWillLoad","observer","MutationObserver","observe","childList","attributes","mutationObserver","resizeObserver","ResizeObserver","componentDidRender","fn","settled","componentDidLoad","overrideFocus","push","hasTabs","blur","disconnectedCallback","disconnect","valueObserver","nameObserver","render","h","Fragment","class","hidden","onClick","type","onScroll","ref","noPrint","role","generateTab","onSlotchange","isSelected","id","tabIndex","onKeyDown","undefined","generateTabWithBadge","theme","description","status"],"sources":["src/components/q2-tab-container/q2-tab-container.scss?tag=q2-tab-container&encapsulation=shadow","src/components/q2-tab-container/q2-tab-container.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n:host {\n display: block;\n position: relative;\n}\n\nbutton {\n cursor: pointer;\n margin: 0;\n}\n\n.tab-container {\n position: relative;\n}\n\nul {\n --comp-container-padding: #{var-list(--tct-scale-1, --app-scale-1x, 5px)\n var-list(--tct-scale-1, --app-scale-1x, 5px) 0};\n padding: var-list(var-prefixer(tab-container-padding), --comp-container-padding);\n margin: var-list(var-prefixer(tab-container-margin), 0);\n display: flex;\n gap: var-list(var-prefixer(tab-gap), --tct-scale-1, --app-scale-1x, 5px);\n list-style: none;\n border-bottom: 1px solid\n var-list(\n var-prefixer(tab-container-border-color),\n --tct-gray-11,\n --t-gray-11,\n --tct-gray-l1,\n --app-gray-l1,\n #cccccc\n );\n overflow-x: auto;\n align-items: center;\n @include hidden-scrollbar();\n\n @media print {\n &.no-print {\n display: none;\n }\n }\n}\n\nli {\n flex: 0 0 auto;\n\n button {\n background: var-list(--tct-tab-inactive-background, var-prefixer(tab-inactive-bg-color), transparent);\n border-width: var-list(var-prefixer(tab-inactive-border-width), unquote('0 0 3px 0'));\n border-color: var-list(var-prefixer(tab-inactive-border-color), transparent);\n border-style: var-list(var-prefixer(tab-inactive-border-style), solid);\n border-radius: var-list(var-prefixer(tab-border-radius), 0);\n width: var-list(var-prefixer(tab-width), 100%);\n text-align: var-list(var-prefixer(tab-text-align), center);\n text-decoration: var-list(var-prefixer(tab-text-decoration), none);\n padding: var-list(var-prefixer(tab-padding), --tct-scale-2, --app-scale-2x, 10px);\n color: var-list(var-prefixer(tab-inactive-color), inherit);\n font-size: var-list(var-prefixer(tab-font-size), 17px);\n display: block;\n transition:\n color var-list(--tct-tween-2, --app-tween-2, unquote('0.4s ease')),\n border-color var-list(--tct-tween-1, --app-tween-1, unquote('0.2s ease'));\n\n :host([type='section']) & {\n --comp-tab-section-padding: #{var-list(--tct-scale-2, --app-scale-2x, 10px)\n var-list(--tct-scale-1, --app-scale-1x, 5px)};\n font-size: var-list(--tct-tab-section-font-size, inherit);\n padding: var-list(var-prefixer(tab-section-padding), --comp-tab-section-padding);\n }\n\n &:hover {\n color: var-list(var-prefixer(tab-hover-color), var-prefixer(tab-active-color), #2e2e2e);\n background: var-list(--tct-tab-hover-background, var-prefixer(tab-hover-bg-color), inherit);\n width: var-list(var-prefixer(tab-hover-width), 100%);\n }\n\n &[aria-selected='true'] {\n color: var-list(var-prefixer(tab-active-color), #2e2e2e);\n border-color: var-list(var-prefixer(tab-active-border-color), currentcolor);\n border-style: var-list(var-prefixer(tab-active-border-style), solid);\n width: var-list(var-prefixer(tab-active-width), 100%);\n background: var-list(--tct-tab-active-background, var-prefixer(tab-active-bg-color), inherit);\n }\n\n :host([color='alt']) & {\n color: var-list(var-prefixer(tab-alt-inactive-color), inherit);\n\n &:hover,\n &[aria-selected='true'] {\n color: var-list(var-prefixer(tab-alt-active-color), inherit);\n }\n }\n\n @media screen and (max-width: 767px) {\n --comp-tab-padding: #{var-list(--tct-scale-2, --app-scale-2x, 10px)\n var-list(--tct-scale-1, --app-scale-1x, 5px)};\n font-size: inherit;\n padding: var-list(var-prefixer(tab-padding), --comp-tab-padding);\n }\n }\n}\n\n.tab-content {\n --comp-tab-content-padding: #{var-list(--tct-scale-2, --app-scale-2x, 10px) 0};\n padding: var-list(var-prefixer(tab-content-padding), --comp-tab-content-padding);\n\n &:focus {\n outline: none;\n box-shadow: none;\n }\n}\n\n.gradient-left,\n.gradient-right {\n z-index: 1;\n position: absolute;\n top: 0;\n height: 100%;\n width: 44px;\n}\n\n.gradient-left {\n background-image: linear-gradient(to left, var(--t-base-a0), var(--t-base-a2) 10%, var(--t-base) 100%);\n left: 0;\n}\n\n.gradient-right {\n background-image: linear-gradient(to right, var(--t-base-a0), var(--t-base-a2) 10%, var(--t-base) 100%);\n right: 0;\n}\n\n.btn-left,\n.btn-right {\n --tct-icon-size: 18px;\n --tct-btn-icon-hover-background: transparent;\n --tct-btn-icon-width: 22px;\n --tct-icon-stroke-primary: #{var-list(var-prefixer(stepper-scroll-arrow-color), --t-text, #4d4d4d)};\n\n position: absolute;\n top: calc(50% - 22px);\n z-index: 2;\n q2-icon {\n --tct-icon-stroke-width: 3;\n }\n}\n\n.btn-left {\n left: 0;\n}\n\n.btn-right {\n right: 0;\n}\n\n.tab-pane-badge {\n display: flex;\n justify-content: space-between;\n align-items: center;\n q2-badge {\n margin-left: 5px;\n margin-right: 5px;\n }\n}\n","import {\n Component,\n ComponentInterface,\n Prop,\n Element,\n Event,\n EventEmitter,\n State,\n Listen,\n Watch,\n h,\n Fragment,\n} from '@stencil/core';\nimport { createGuid, loc, overrideFocus, isEventFromElement } from 'src/utils';\nimport { JSX } from '../../components';\nimport { Q2Badge } from '../q2-badge/q2-badge';\n\ntype TabPane = {\n label: string;\n value: string;\n badgeCount: number;\n badgeDescription: string;\n badgeTheme: Q2Badge['theme'];\n badgeStatus: Q2Badge['status'];\n};\n\n@Component({ tag: 'q2-tab-container', shadow: true, styleUrl: 'q2-tab-container.scss' })\nexport class Q2TabContainer implements ComponentInterface {\n /**\n * Controls which variables are used to color the tab controls.\n *\n * - `undefined` (default)\n * - Uses `--t-tab-active` and `--t-tab-inactive`.\n * - `alt`\n * - Uses `--t-tab-alt-active` and `--t-tab-alt-inactive`.\n * - The default fallback for these variables is `inherit`.\n */\n @Prop({ reflect: true }) color: 'alt' | undefined;\n\n /**\n * Used to establish a relationship between `q2-tab-container` and its associated tab panes.\n * @warning\n * The element can fail if this property is not set. Nested tab containers without the `name` property will not render correctly.\n */\n @Prop({ reflect: true }) name: string;\n\n /** Controls visibility of tab list in a print view. Tab content will still be visible even if `noPrint` is true. */\n @Prop({ reflect: true }) noPrint: boolean = false;\n\n /** Determines the font size of the tab controls. */\n @Prop({ reflect: true }) type: 'main' | 'section';\n\n /** Corresponds to the value of the selected tab pane. */\n @Prop({ reflect: true, mutable: true }) value: string;\n\n @Element() hostElement: HTMLElement;\n\n /**\n * Emitted when the selected tab changes.\n * @legacyEvent\n */\n @Event() change: EventEmitter<{ value: string }>;\n\n /**\n * Emitted when the component has finished rendering.\n * @private\n */\n @Event() settled: EventEmitter<undefined>;\n\n guid: number = createGuid();\n scheduledAfterRender: (() => void)[] = [];\n listElement: HTMLUListElement;\n mutationObserver: MutationObserver;\n resizeObserver: ResizeObserver;\n lastScrolled: number = new Date(null).getTime();\n @State() hasLeft: boolean = false;\n @State() hasRight: boolean = false;\n @State() scrollEnabled: boolean = false;\n @State() showScrollLeft: boolean = false;\n @State() showScrollRight: boolean = false;\n @State() tabs: TabPane[];\n\n resizeIframe() {\n return window.TectonElements?.resizeIframe?.();\n }\n\n get tabPanes() {\n const tabPanes = this.hostElement.querySelectorAll<HTMLQ2TabPaneElement | HTMLTectonTabPaneElement>(\n 'q2-tab-pane, tecton-tab-pane'\n );\n\n if (tabPanes.length === 0) {\n return [];\n }\n\n return Array.from(tabPanes).filter(pane => pane.name === this.name);\n }\n\n get selectedTabValue() {\n return this.value || this.tabPanes[0].value || '';\n }\n\n get tabList() {\n return this.hostElement.shadowRoot.querySelector('.tab-list');\n }\n\n ///////// Default Handler /////////\n @Listen('change')\n defaultChangeHandler(event: CustomEvent) {\n if (event.target === this.hostElement && !this.hostElement.onchange) {\n this.value = event.detail.value;\n }\n }\n\n @Listen('resize', { target: 'window' })\n onResize() {\n this.checkScrollState();\n }\n\n @Listen('focus')\n onFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n const index = this.tabs.findIndex(el => el.value === this.selectedTabValue);\n this.moveFocus(index);\n }\n\n @Listen('badge')\n onBadge() {\n this.setTabs();\n }\n\n ///////// Lifecycle Hooks /////////\n componentWillLoad() {\n const observer = new MutationObserver(this.updateTabData);\n observer.observe(this.hostElement, { childList: true, attributes: true });\n this.mutationObserver = observer;\n this.resizeObserver = new ResizeObserver(() => this.checkScrollState());\n this.updateTabData();\n }\n\n componentDidRender() {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n this.settled.emit();\n }\n\n componentDidLoad() {\n this.resizeObserver?.observe(this.listElement);\n this.checkScrollState();\n overrideFocus(this.hostElement);\n const index = this.tabs.findIndex(el => el.value === this.value);\n this.scheduledAfterRender.push(() => {\n const hasTabs = this.tabs.length > 0;\n if (!hasTabs) return;\n const tab = this.moveFocus(Math.max(index, 0));\n this.value = tab.dataset.value;\n tab.blur();\n });\n }\n\n disconnectedCallback() {\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n this.resizeObserver = null;\n this.mutationObserver = null;\n }\n\n ///////// Observers /////////\n @Watch('value')\n valueObserver() {\n this.updateTabData();\n this.scheduledAfterRender.push(this.resizeIframe);\n const index = this.tabs.findIndex(el => el.value === this.value);\n if (index > -1) {\n this.scheduledAfterRender.push(() => this.moveFocus(index, false));\n }\n }\n\n @Watch('name')\n nameObserver() {\n this.updateTabData();\n }\n\n ///////// Actions /////////\n updateTabData = () => {\n this.updateTabPaneProps();\n this.setTabs();\n };\n\n updateTabPaneProps = () => {\n this.tabPanes.forEach((tab, index) => {\n tab.selected = tab.value === this.selectedTabValue;\n tab.guid = this.guid;\n tab.index = index;\n });\n };\n\n setTabs = () => {\n this.tabs = this.tabPanes.map(({ label, value, badgeCount, badgeDescription, badgeTheme, badgeStatus }) => ({\n label: (label && loc(label)) || '',\n value,\n badgeCount,\n badgeDescription,\n badgeTheme,\n badgeStatus,\n }));\n };\n\n onTabClick = (event: MouseEvent) => {\n const targetValue = ((event.target as HTMLButtonElement).closest('button[role=\"tab\"]') as HTMLButtonElement)\n .dataset.value;\n const isAlreadySelected = this.value === targetValue;\n if (isAlreadySelected) return;\n\n this.change.emit({\n value: targetValue,\n });\n };\n\n onTabKeyDown = (event: KeyboardEvent) => {\n const value = (event.target as HTMLElement).dataset.value;\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.moveToAdjacentTab(value, 'next');\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.moveToAdjacentTab(value, 'prev');\n break;\n\n case 'Home':\n event.preventDefault();\n this.moveToAdjacentTab(value, 'first');\n break;\n\n case 'End':\n event.preventDefault();\n this.moveToAdjacentTab(value, 'last');\n break;\n\n case 'Space':\n case 'Enter':\n event.preventDefault();\n this.change.emit({ value });\n break;\n }\n };\n\n moveToAdjacentTab = (value: string, direction: 'next' | 'prev' | 'first' | 'last') => {\n const index = this.tabs.map(({ value }) => value).indexOf(value);\n\n let newIndex;\n switch (direction) {\n case 'next':\n newIndex = Math.min(index + 1, this.tabs.length - 1);\n break;\n\n case 'prev':\n newIndex = Math.max(index - 1, 0);\n break;\n\n case 'first':\n newIndex = 0;\n break;\n\n case 'last':\n newIndex = this.tabs.length - 1;\n break;\n }\n\n if (index === newIndex) return;\n\n this.moveFocus(newIndex, false);\n };\n\n moveFocus = (index: number, preventScroll: boolean = true) => {\n const focusedValue = this.tabs[index].value;\n const focusedTab = this.listElement.querySelector<HTMLButtonElement>(`[data-value=\"${focusedValue}\"]`);\n focusedTab.focus({ preventScroll });\n\n const left = focusedTab.offsetLeft - this.listElement.clientWidth / 2;\n this.listElement.scrollTo({\n left,\n behavior: 'smooth',\n });\n\n return focusedTab;\n };\n\n checkScrollState = () => {\n if (!this.listElement) return;\n const { scrollLeft, scrollWidth, clientWidth } = this.listElement;\n this.scrollEnabled = scrollWidth > clientWidth;\n this.showScrollLeft = scrollLeft > 0;\n this.showScrollRight = scrollWidth > Math.ceil(scrollLeft) + clientWidth;\n };\n\n onScrollBtnClick = (direction?: 'left' | 'right') => {\n const { scrollLeft, scrollWidth, clientWidth } = this.listElement;\n const halfWidth = Math.floor(clientWidth / 2);\n let scrollAmount: number = 0;\n if (direction === 'left') {\n scrollAmount = -Math.min(halfWidth, Math.abs(scrollLeft));\n } else {\n scrollAmount = Math.min(halfWidth, Math.abs(scrollWidth - scrollLeft - clientWidth));\n }\n this.listElement.scrollBy({ left: scrollAmount, behavior: 'smooth' });\n };\n\n onSlotChange = () => {\n this.checkScrollState();\n };\n\n ///////// View Methods /////////\n render() {\n return (\n <Fragment>\n <div class=\"tab-container\">\n {this.scrollEnabled && (\n <Fragment>\n <div\n class=\"gradient-left\"\n hidden={!this.showScrollLeft}\n ></div>\n <div\n class=\"gradient-right\"\n hidden={!this.showScrollRight}\n ></div>\n\n <q2-btn\n class=\"btn-left\"\n hidden={!this.showScrollLeft}\n onClick={() => this.onScrollBtnClick('left')}\n >\n <q2-icon\n type=\"chevron-left\"\n label=\"scroll left\"\n ></q2-icon>\n </q2-btn>\n\n <q2-btn\n class=\"btn-right\"\n hidden={!this.showScrollRight}\n onClick={() => this.onScrollBtnClick('right')}\n >\n <q2-icon\n type=\"chevron-right\"\n label=\"scroll right\"\n ></q2-icon>\n </q2-btn>\n </Fragment>\n )}\n\n <ul\n onScroll={this.checkScrollState}\n ref={el => (this.listElement = el)}\n class={this.noPrint ? 'no-print' : null}\n role=\"tablist\"\n >\n {this.tabs.map((tab, index) => this.generateTab(tab, index))}\n </ul>\n </div>\n <div class=\"tab-content\">\n <slot onSlotchange={() => this.onSlotChange()} />\n </div>\n </Fragment>\n );\n }\n\n generateTab(tab: TabPane, index: number): JSX.IntrinsicElements {\n const { label, value } = tab;\n const isSelected = this.selectedTabValue === value;\n return (\n <li role=\"presentation\">\n <button\n id={`tab-${this.guid}-${index}`}\n data-value={value}\n test-id=\"tabLink\"\n tabIndex={isSelected ? 0 : -1}\n role=\"tab\"\n aria-selected={isSelected ? 'true' : 'false'}\n aria-controls={`tab-pane-${this.guid}-${index}`}\n onClick={this.onTabClick}\n onKeyDown={this.onTabKeyDown}\n >\n {tab.badgeCount === undefined ? label : this.generateTabWithBadge(tab, isSelected)}\n </button>\n </li>\n );\n }\n\n generateTabWithBadge(tab: TabPane, isSelected: boolean): JSX.IntrinsicElements {\n let theme;\n if (!tab.badgeStatus && isSelected) theme = tab.badgeTheme || 'primary';\n let description;\n if (tab.badgeDescription) description = loc(tab.badgeDescription);\n else if (tab.badgeStatus) description = loc(`tecton.element.tab.pane.${tab.badgeStatus}`, [tab.badgeCount]);\n else description = loc('tecton.element.tab.pane.new');\n\n return (\n <div\n class=\"tab-pane-badge\"\n aria-label={`${tab.label}, ${tab.badgeCount} ${description}`}\n >\n {tab.label}\n <q2-badge\n value={tab.badgeCount}\n theme={theme}\n status={tab.badgeStatus}\n />\n </div>\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["q2TabContainerCss","Q2TabContainerStyle0","Q2TabContainer","this","guid","createGuid","scheduledAfterRender","lastScrolled","Date","getTime","updateTabData","updateTabPaneProps","setTabs","tabPanes","forEach","tab","index","selected","value","selectedTabValue","tabs","map","label","badgeCount","badgeDescription","badgeTheme","badgeStatus","loc","onTabClick","event","targetValue","target","closest","dataset","isAlreadySelected","change","emit","onTabKeyDown","key","preventDefault","moveToAdjacentTab","direction","indexOf","newIndex","Math","min","length","max","moveFocus","preventScroll","focusedValue","focusedTab","listElement","querySelector","focus","left","offsetLeft","clientWidth","scrollTo","behavior","checkScrollState","scrollLeft","scrollWidth","scrollEnabled","showScrollLeft","showScrollRight","ceil","onScrollBtnClick","halfWidth","floor","scrollAmount","abs","scrollBy","onSlotChange","resizeIframe","_b","_a","window","TectonElements","call","hostElement","querySelectorAll","Array","from","filter","pane","name","tabList","shadowRoot","defaultChangeHandler","onchange","detail","onResize","onFocus","isEventFromElement","findIndex","el","onBadge","componentWillLoad","observer","MutationObserver","observe","childList","attributes","mutationObserver","resizeObserver","ResizeObserver","componentDidRender","fn","settled","componentDidLoad","overrideFocus","push","hasTabs","blur","disconnectedCallback","disconnect","valueObserver","nameObserver","render","h","Fragment","class","hidden","onClick","type","onScroll","ref","noPrint","role","generateTab","onSlotchange","isSelected","id","tabIndex","onKeyDown","undefined","generateTabWithBadge","theme","description","status"],"sources":["src/components/q2-tab-container/q2-tab-container.scss?tag=q2-tab-container&encapsulation=shadow","src/components/q2-tab-container/q2-tab-container.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n:host {\n display: block;\n position: relative;\n}\n\nbutton {\n cursor: pointer;\n margin: 0;\n}\n\n.tab-container {\n position: relative;\n}\n\nul {\n --comp-container-padding: #{var-list(--tct-scale-1, --app-scale-1x, 5px)\n var-list(--tct-scale-1, --app-scale-1x, 5px) 0};\n padding: var-list(var-prefixer(tab-container-padding), --comp-container-padding);\n margin: var-list(var-prefixer(tab-container-margin), 0);\n display: flex;\n gap: var-list(var-prefixer(tab-gap), --tct-scale-1, --app-scale-1x, 5px);\n list-style: none;\n border-bottom: 1px solid\n var-list(\n var-prefixer(tab-container-border-color),\n --tct-gray-11,\n --t-gray-11,\n --tct-gray-l1,\n --app-gray-l1,\n #cccccc\n );\n overflow-x: auto;\n align-items: center;\n @include hidden-scrollbar();\n\n @media print {\n &.no-print {\n display: none;\n }\n }\n}\n\nli {\n flex: 0 0 auto;\n\n button {\n background: var-list(--tct-tab-inactive-background, var-prefixer(tab-inactive-bg-color), transparent);\n border-width: var-list(var-prefixer(tab-inactive-border-width), unquote('0 0 3px 0'));\n border-color: var-list(var-prefixer(tab-inactive-border-color), transparent);\n border-style: var-list(var-prefixer(tab-inactive-border-style), solid);\n border-radius: var-list(var-prefixer(tab-border-radius), 0);\n width: var-list(var-prefixer(tab-width), 100%);\n text-align: var-list(var-prefixer(tab-text-align), center);\n text-decoration: var-list(var-prefixer(tab-text-decoration), none);\n padding: var-list(var-prefixer(tab-padding), --tct-scale-2, --app-scale-2x, 10px);\n color: var-list(var-prefixer(tab-inactive-color), inherit);\n font-size: var-list(var-prefixer(tab-font-size), 17px);\n display: block;\n transition:\n color var-list(--tct-tween-2, --app-tween-2, unquote('0.4s ease')),\n border-color var-list(--tct-tween-1, --app-tween-1, unquote('0.2s ease'));\n\n :host([type='section']) & {\n --comp-tab-section-padding: #{var-list(--tct-scale-2, --app-scale-2x, 10px)\n var-list(--tct-scale-1, --app-scale-1x, 5px)};\n font-size: var-list(--tct-tab-section-font-size, inherit);\n padding: var-list(var-prefixer(tab-section-padding), --comp-tab-section-padding);\n }\n\n &:hover {\n color: var-list(var-prefixer(tab-hover-color), var-prefixer(tab-active-color), #2e2e2e);\n background: var-list(--tct-tab-hover-background, var-prefixer(tab-hover-bg-color), inherit);\n width: var-list(var-prefixer(tab-hover-width), 100%);\n }\n\n &[aria-selected='true'] {\n color: var-list(var-prefixer(tab-active-color), #2e2e2e);\n border-color: var-list(var-prefixer(tab-active-border-color), currentcolor);\n border-style: var-list(var-prefixer(tab-active-border-style), solid);\n width: var-list(var-prefixer(tab-active-width), 100%);\n background: var-list(--tct-tab-active-background, var-prefixer(tab-active-bg-color), inherit);\n }\n\n :host([color='alt']) & {\n color: var-list(var-prefixer(tab-alt-inactive-color), inherit);\n\n &:hover,\n &[aria-selected='true'] {\n color: var-list(var-prefixer(tab-alt-active-color), inherit);\n }\n }\n\n @media screen and (max-width: 767px) {\n --comp-tab-padding: #{var-list(--tct-scale-2, --app-scale-2x, 10px)\n var-list(--tct-scale-1, --app-scale-1x, 5px)};\n font-size: inherit;\n padding: var-list(var-prefixer(tab-padding), --comp-tab-padding);\n }\n }\n}\n\n.tab-content {\n --comp-tab-content-padding: #{var-list(--tct-scale-2, --app-scale-2x, 10px) 0};\n padding: var-list(var-prefixer(tab-content-padding), --comp-tab-content-padding);\n\n &:focus {\n outline: none;\n box-shadow: none;\n }\n}\n\n.gradient-left,\n.gradient-right {\n z-index: 1;\n position: absolute;\n top: 0;\n height: 100%;\n width: 44px;\n}\n\n.gradient-left {\n background-image: linear-gradient(to left, var(--t-base-a0), var(--t-base-a2) 10%, var(--t-base) 100%);\n left: 0;\n}\n\n.gradient-right {\n background-image: linear-gradient(to right, var(--t-base-a0), var(--t-base-a2) 10%, var(--t-base) 100%);\n right: 0;\n}\n\n.btn-left,\n.btn-right {\n --tct-icon-size: 18px;\n --tct-btn-icon-hover-background: transparent;\n --tct-btn-icon-width: 22px;\n --tct-icon-stroke-primary: #{var-list(var-prefixer(stepper-scroll-arrow-color), --t-text, #4d4d4d)};\n\n position: absolute;\n top: calc(50% - 22px);\n z-index: 2;\n q2-icon {\n --tct-icon-stroke-width: 3;\n }\n}\n\n.btn-left {\n left: 0;\n}\n\n.btn-right {\n right: 0;\n}\n\n.tab-pane-badge {\n display: flex;\n justify-content: space-between;\n align-items: center;\n q2-badge {\n margin-left: 5px;\n margin-right: 5px;\n }\n}\n","import {\n Component,\n ComponentInterface,\n Prop,\n Element,\n Event,\n EventEmitter,\n State,\n Listen,\n Watch,\n h,\n Fragment,\n} from '@stencil/core';\nimport { createGuid, loc, overrideFocus, isEventFromElement } from 'src/utils';\nimport { JSX } from '../../components';\nimport { Q2Badge } from '../q2-badge/q2-badge';\n\ntype TabPane = {\n label: string;\n value: string;\n badgeCount: number;\n badgeDescription: string;\n badgeTheme: Q2Badge['theme'];\n badgeStatus: Q2Badge['status'];\n};\n\n@Component({ tag: 'q2-tab-container', shadow: true, styleUrl: 'q2-tab-container.scss' })\nexport class Q2TabContainer implements ComponentInterface {\n /**\n * Controls which variables are used to color the tab controls.\n *\n * - `undefined` (default)\n * - Uses `--t-tab-active` and `--t-tab-inactive`.\n * - `alt`\n * - Uses `--t-tab-alt-active` and `--t-tab-alt-inactive`.\n * - The default fallback for these variables is `inherit`.\n */\n @Prop({ reflect: true }) color: 'alt' | undefined;\n\n /**\n * Used to establish a relationship between `q2-tab-container` and its associated tab panes.\n * @warning\n * The element can fail if this property is not set. Nested tab containers without the `name` property will not render correctly.\n */\n @Prop({ reflect: true }) name: string;\n\n /** Controls visibility of tab list in a print view. Tab content will still be visible even if `noPrint` is true. */\n @Prop({ reflect: true }) noPrint: boolean = false;\n\n /** Determines the font size of the tab controls. */\n @Prop({ reflect: true }) type: 'main' | 'section';\n\n /** Corresponds to the value of the selected tab pane. */\n @Prop({ reflect: true, mutable: true }) value: string;\n\n @Element() hostElement: HTMLElement;\n\n /**\n * Emitted when the selected tab changes.\n * @legacyEvent\n */\n @Event() change: EventEmitter<{ value: string }>;\n\n /**\n * Emitted when the component has finished rendering.\n * @private\n */\n @Event() settled: EventEmitter<undefined>;\n\n guid: number = createGuid();\n scheduledAfterRender: (() => void)[] = [];\n listElement: HTMLUListElement;\n mutationObserver: MutationObserver;\n resizeObserver: ResizeObserver;\n lastScrolled: number = new Date(null).getTime();\n @State() hasLeft: boolean = false;\n @State() hasRight: boolean = false;\n @State() scrollEnabled: boolean = false;\n @State() showScrollLeft: boolean = false;\n @State() showScrollRight: boolean = false;\n @State() tabs: TabPane[];\n\n resizeIframe() {\n return window.TectonElements?.resizeIframe?.();\n }\n\n get tabPanes() {\n const tabPanes = this.hostElement.querySelectorAll<HTMLQ2TabPaneElement | HTMLTectonTabPaneElement>(\n 'q2-tab-pane, tecton-tab-pane'\n );\n\n if (tabPanes.length === 0) {\n return [];\n }\n\n return Array.from(tabPanes).filter(pane => pane.name === this.name);\n }\n\n get selectedTabValue() {\n return this.value || this.tabPanes[0].value || '';\n }\n\n get tabList() {\n return this.hostElement.shadowRoot.querySelector('.tab-list');\n }\n\n ///////// Default Handler /////////\n @Listen('change')\n defaultChangeHandler(event: CustomEvent) {\n if (event.target === this.hostElement && !this.hostElement.onchange) {\n this.value = event.detail.value;\n }\n }\n\n @Listen('resize', { target: 'window' })\n onResize() {\n this.checkScrollState();\n }\n\n @Listen('focus')\n onFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n const index = this.tabs.findIndex(el => el.value === this.selectedTabValue);\n this.moveFocus(index);\n }\n\n @Listen('badge')\n onBadge() {\n this.setTabs();\n }\n\n ///////// Lifecycle Hooks /////////\n componentWillLoad() {\n const observer = new MutationObserver(this.updateTabData);\n observer.observe(this.hostElement, { childList: true, attributes: true });\n this.mutationObserver = observer;\n this.resizeObserver = new ResizeObserver(() => this.checkScrollState());\n this.updateTabData();\n }\n\n componentDidRender() {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n this.settled.emit();\n }\n\n componentDidLoad() {\n this.resizeObserver?.observe(this.listElement);\n this.checkScrollState();\n overrideFocus(this.hostElement);\n const index = this.tabs.findIndex(el => el.value === this.value);\n this.scheduledAfterRender.push(() => {\n const hasTabs = this.tabs.length > 0;\n if (!hasTabs) return;\n const tab = this.moveFocus(Math.max(index, 0));\n this.value = tab.dataset.value;\n tab.blur();\n });\n }\n\n disconnectedCallback() {\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n this.resizeObserver = null;\n this.mutationObserver = null;\n }\n\n ///////// Observers /////////\n @Watch('value')\n valueObserver() {\n this.updateTabData();\n this.scheduledAfterRender.push(this.resizeIframe);\n const index = this.tabs.findIndex(el => el.value === this.value);\n if (index > -1) {\n this.scheduledAfterRender.push(() => this.moveFocus(index, false));\n }\n }\n\n @Watch('name')\n nameObserver() {\n this.updateTabData();\n }\n\n ///////// Actions /////////\n updateTabData = () => {\n this.updateTabPaneProps();\n this.setTabs();\n };\n\n updateTabPaneProps = () => {\n this.tabPanes.forEach((tab, index) => {\n tab.selected = tab.value === this.selectedTabValue;\n tab.guid = this.guid;\n tab.index = index;\n });\n };\n\n setTabs = () => {\n this.tabs = this.tabPanes.map(({ label, value, badgeCount, badgeDescription, badgeTheme, badgeStatus }) => ({\n label: (label && loc(label)) || '',\n value,\n badgeCount,\n badgeDescription,\n badgeTheme,\n badgeStatus,\n }));\n };\n\n onTabClick = (event: MouseEvent) => {\n const targetValue = ((event.target as HTMLButtonElement).closest('button[role=\"tab\"]') as HTMLButtonElement)\n .dataset.value;\n const isAlreadySelected = this.value === targetValue;\n if (isAlreadySelected) return;\n\n this.change.emit({\n value: targetValue,\n });\n };\n\n onTabKeyDown = (event: KeyboardEvent) => {\n const value = (event.target as HTMLElement).dataset.value;\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.moveToAdjacentTab(value, 'next');\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.moveToAdjacentTab(value, 'prev');\n break;\n\n case 'Home':\n event.preventDefault();\n this.moveToAdjacentTab(value, 'first');\n break;\n\n case 'End':\n event.preventDefault();\n this.moveToAdjacentTab(value, 'last');\n break;\n\n case 'Space':\n case 'Enter':\n event.preventDefault();\n this.change.emit({ value });\n break;\n }\n };\n\n moveToAdjacentTab = (value: string, direction: 'next' | 'prev' | 'first' | 'last') => {\n const index = this.tabs.map(({ value }) => value).indexOf(value);\n\n let newIndex;\n switch (direction) {\n case 'next':\n newIndex = Math.min(index + 1, this.tabs.length - 1);\n break;\n\n case 'prev':\n newIndex = Math.max(index - 1, 0);\n break;\n\n case 'first':\n newIndex = 0;\n break;\n\n case 'last':\n newIndex = this.tabs.length - 1;\n break;\n }\n\n if (index === newIndex) return;\n\n this.moveFocus(newIndex, false);\n };\n\n moveFocus = (index: number, preventScroll: boolean = true) => {\n const focusedValue = this.tabs[index].value;\n const focusedTab = this.listElement.querySelector<HTMLButtonElement>(`[data-value=\"${focusedValue}\"]`);\n focusedTab.focus({ preventScroll });\n\n const left = focusedTab.offsetLeft - this.listElement.clientWidth / 2;\n this.listElement.scrollTo({\n left,\n behavior: 'smooth',\n });\n\n return focusedTab;\n };\n\n checkScrollState = () => {\n if (!this.listElement) return;\n const { scrollLeft, scrollWidth, clientWidth } = this.listElement;\n this.scrollEnabled = scrollWidth > clientWidth;\n this.showScrollLeft = scrollLeft > 0;\n this.showScrollRight = scrollWidth > Math.ceil(scrollLeft) + clientWidth;\n };\n\n onScrollBtnClick = (direction?: 'left' | 'right') => {\n const { scrollLeft, scrollWidth, clientWidth } = this.listElement;\n const halfWidth = Math.floor(clientWidth / 2);\n let scrollAmount: number = 0;\n if (direction === 'left') {\n scrollAmount = -Math.min(halfWidth, Math.abs(scrollLeft));\n } else {\n scrollAmount = Math.min(halfWidth, Math.abs(scrollWidth - scrollLeft - clientWidth));\n }\n this.listElement.scrollBy({ left: scrollAmount, behavior: 'smooth' });\n };\n\n onSlotChange = () => {\n this.checkScrollState();\n };\n\n ///////// View Methods /////////\n render() {\n return (\n <Fragment>\n <div class=\"tab-container\">\n {this.scrollEnabled && (\n <Fragment>\n <div\n class=\"gradient-left\"\n hidden={!this.showScrollLeft}\n ></div>\n <div\n class=\"gradient-right\"\n hidden={!this.showScrollRight}\n ></div>\n\n <q2-btn\n class=\"btn-left\"\n hidden={!this.showScrollLeft}\n onClick={() => this.onScrollBtnClick('left')}\n >\n <q2-icon\n type=\"chevron-left\"\n label=\"scroll left\"\n ></q2-icon>\n </q2-btn>\n\n <q2-btn\n class=\"btn-right\"\n hidden={!this.showScrollRight}\n onClick={() => this.onScrollBtnClick('right')}\n >\n <q2-icon\n type=\"chevron-right\"\n label=\"scroll right\"\n ></q2-icon>\n </q2-btn>\n </Fragment>\n )}\n\n <ul\n onScroll={this.checkScrollState}\n ref={el => (this.listElement = el)}\n class={this.noPrint ? 'no-print' : null}\n role=\"tablist\"\n >\n {this.tabs.map((tab, index) => this.generateTab(tab, index))}\n </ul>\n </div>\n <div class=\"tab-content\">\n <slot onSlotchange={() => this.onSlotChange()} />\n </div>\n </Fragment>\n );\n }\n\n generateTab(tab: TabPane, index: number): JSX.IntrinsicElements {\n const { label, value } = tab;\n const isSelected = this.selectedTabValue === value;\n return (\n <li role=\"presentation\">\n <button\n id={`tab-${this.guid}-${index}`}\n data-value={value}\n test-id=\"tabLink\"\n tabIndex={isSelected ? 0 : -1}\n role=\"tab\"\n aria-selected={isSelected ? 'true' : 'false'}\n onClick={this.onTabClick}\n onKeyDown={this.onTabKeyDown}\n >\n {tab.badgeCount === undefined ? label : this.generateTabWithBadge(tab, isSelected)}\n </button>\n </li>\n );\n }\n\n generateTabWithBadge(tab: TabPane, isSelected: boolean): JSX.IntrinsicElements {\n let theme;\n if (!tab.badgeStatus && isSelected) theme = tab.badgeTheme || 'primary';\n let description;\n if (tab.badgeDescription) description = loc(tab.badgeDescription);\n else if (tab.badgeStatus) description = loc(`tecton.element.tab.pane.${tab.badgeStatus}`, [tab.badgeCount]);\n else description = loc('tecton.element.tab.pane.new');\n\n return (\n <div\n class=\"tab-pane-badge\"\n aria-label={`${tab.label}, ${tab.badgeCount} ${description}`}\n >\n {tab.label}\n <q2-badge\n value={tab.badgeCount}\n theme={theme}\n status={tab.badgeStatus}\n />\n </div>\n );\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as t,c as o,g as i,h as e}from"./p-a5f18e27.js";import{t as r,w as s}from"./p-42302f6f.js";const n=class{constructor(i){t(this,i);this.change=o(this,"change",7);this.mouseEventList=["mousedown","dragstart","touchstart"];this.isCurrentlyFocused=false;this.mouseHandler=t=>{const o=this.shadowContains(this.findActiveElement());const i=this.shadowContains(this.shadowEventTarget(t))||this.originatesInSlots(t.target);if(!i&&(this.isCurrentlyFocused||o)){this.isCurrentlyFocused=false;this.change.emit();return}this.isCurrentlyFocused=i||o};this.windowBlurHandler=()=>{const t=this.findActiveElement();if(t===document.body&&this.isCurrentlyFocused||t!==document.body&&(t===null||t===void 0?void 0:t.tagName)==="IFRAME"){this.isCurrentlyFocused=false;this.change.emit();return}}}componentWillLoad(){}connectedCallback(){this.mouseEventList.forEach((t=>{document.addEventListener(t,this.mouseHandler)}));window.addEventListener("blur",this.windowBlurHandler)}disconnectedCallback(){this.mouseEventList.forEach((t=>{document.removeEventListener(t,this.mouseHandler)}));window.removeEventListener("blur",this.windowBlurHandler)}findActiveElement(){let t=document.activeElement;while(true){if(!t||!t.shadowRoot){return t}t=t.shadowRoot.activeElement}}shadowEventTarget(t){return t.composedPath()[0]||t.target}shadowContains(t){while(true){if(t===this.hostElement){return true}if(!t){return false}t=t.parentNode||t.host}}originatesInSlots(t){const o=this.hostElement.querySelectorAll("slot");for(const i of Array.from(o)){const o=i&&i.assignedNodes&&i.assignedNodes()||this.hostElement.childNodes;for(const i of Array.from(o)){if(i.contains(t)){return true}}}return false}get hostElement(){return i(this)}};const a="*{box-sizing:border-box}*:active{outline:none}*:focus{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}.container{display:none}.show{display:block;position:fixed;z-index:var(--tct-popover-z-index, 50);margin:0;padding:0;overflow:auto;background:var(--tct-popover-background, var(--app-white, #ffffff));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-1, 0 2px 4px rgba(0, 0, 0, 0.3)));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, 3px)));--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}:host([block]) .show{right:unset;width:var(--comp-pop-width);min-width:var(--tct-popover-min-width, unset)}:host([align=left]) .show{left:var(--comp-pop-left);right:unset}:host([align=right]) .show{right:var(--comp-pop-right);left:unset}.show.down{top:var(--tct-popover-top, var(--comp-pop-top));bottom:unset}.show.up{top:unset;bottom:var(--comp-pop-bottom)}.show.legacy{position:absolute}.show::-webkit-scrollbar{width:var(--comp-scrollbar-size);height:var(--comp-scrollbar-size);margin:5px}.show::-webkit-scrollbar-thumb{background:var(--comp-scrollbar-color);border-radius:var(--comp-scrollbar-border-radius)}.show::-webkit-scrollbar-track{background:transparent;border-radius:var(--comp-scrollbar-border-radius)}click-elsewhere{position:relative;display:block}";const c=a;const p=class{constructor(i){t(this,i);this.popoverStateChanged=o(this,"popoverStateChanged",7);this.displayBuffer=10;this.orientationChanged=false;this.handleMinHeight=()=>{if(this.minHeight){r(this,"minHeight","prop")}};this.viewPortChanged=()=>{if(!this.open)return;this.determinePopDirection()};this.viewPortOrientationChanged=()=>{this.orientationChanged=true;this.viewPortChanged()};this.setFixedCSSProperties=async()=>{var t,o;const{controlElement:i,containerElement:e,currentDirection:r}=this;const{top:n,bottom:a,left:c,right:p}=(o=(t=i===null||i===void 0?void 0:i.getBoundingClientRect)===null||t===void 0?void 0:t.call(i))!==null&&o!==void 0?o:{top:0,bottom:0,left:0,right:0};const h=c;const l=window.visualViewport.width-p;if(this.block)e.style.setProperty("--comp-pop-width",`${i.offsetWidth||0}px`);e.style.setProperty("--comp-pop-left",`${h}px`);e.style.setProperty("--comp-pop-right",`${l}px`);if(r==="up"){e.style.setProperty("--comp-pop-bottom",`${window.visualViewport.height-n}px`)}if(r==="down"){e.style.setProperty("--comp-pop-top",`${a}px`)}await s();e.style.setProperty("--comp-pop-opacity","1")};this.setAbsoluteCSSProperties=async()=>{const{controlElement:t,containerElement:o,currentDirection:i,align:e}=this;if(e==="right"){o.style.setProperty("--comp-pop-right","0");o.style.setProperty("--comp-pop-left","unset")}else{o.style.setProperty("--comp-pop-left","0");o.style.setProperty("--comp-pop-right","unset")}if(this.block){o.style.setProperty("--comp-pop-width","100%")}if(i==="up"){const i=getComputedStyle(t);const e=parseInt(i.height||"0")+parseInt(i.borderTopWidth||"0")+parseInt(i.borderBottomWidth||"0");o.style.setProperty("--comp-pop-bottom",`${e}px`)}await s();o.style.setProperty("--comp-pop-opacity","1")};this.direction=undefined;this.align=undefined;this.open=undefined;this.block=undefined;this.controlElement=undefined;this.mode=null;this.minHeight=undefined;this.currentDirection=undefined;this.show=false}componentDidLoad(){this.handleMinHeight();if(this.open)this.determinePopDirection()}disconnectedCallback(){this.removeViewportListeners()}async toggle(){this.open=!this.open}async scrollContainerTo(t){this.containerElement.scrollTo(t)}async openChanged(t){this.popoverStateChanged.emit({open:t});if(t){this.addViewportListeners();this.determinePopDirection()}else{this.removeViewportListeners();this.currentDirection=undefined;this.show=false;await s();this.clearCSSProperties()}}minHeightProvided(){this.handleMinHeight()}popoverStateHandler(t){const{detail:{open:o}}=t;if(o===this.open)return;this.open=o;t.stopPropagation()}get actualDirection(){const{direction:t}=this;switch(t){case"up":case"down":return t;default:return undefined}}get isModule(){var t,o;const i=window!==window.top;const e=Object.keys((o=(t=window.Tecton)===null||t===void 0?void 0:t.platformDimensions)!==null&&o!==void 0?o:{}).length>0;return i&&e}addViewportListeners(){var t;window.addEventListener("resize",this.viewPortOrientationChanged);window.addEventListener("scroll",this.viewPortChanged,{passive:true,capture:true});(t=screen===null||screen===void 0?void 0:screen.orientation)===null||t===void 0?void 0:t.addEventListener("change",this.viewPortOrientationChanged);window.addEventListener("orientationchange",this.viewPortOrientationChanged)}removeViewportListeners(){var t;window.removeEventListener("resize",this.viewPortOrientationChanged);window.removeEventListener("scroll",this.viewPortChanged);(t=screen===null||screen===void 0?void 0:screen.orientation)===null||t===void 0?void 0:t.removeEventListener("orientationchange",this.viewPortOrientationChanged);window.removeEventListener("orientationchange",this.viewPortOrientationChanged)}clearCSSProperties(){this.containerElement.style.removeProperty("--comp-pop-max-height");this.containerElement.style.removeProperty("--comp-pop-top");this.containerElement.style.removeProperty("--comp-pop-bottom");this.containerElement.style.removeProperty("--comp-pop-left");this.containerElement.style.removeProperty("--comp-pop-right");this.containerElement.style.removeProperty("--comp-pop-width");this.containerElement.style.removeProperty("--comp-pop-opacity")}setDirectionAndShow(t){const o=this.open;if(!o)return;this.currentDirection=t;this.show=true;if(this.mode==="legacy"){this.setAbsoluteCSSProperties()}else{this.setFixedCSSProperties()}}async determinePopDirection(){var t,o,i;const{containerElement:e,controlElement:r,actualDirection:n,displayBuffer:a}=this;if(e)e.style.maxHeight=null;await s();const{isModule:c}=this;const{top:p,bottom:h}=(o=(t=r===null||r===void 0?void 0:r.getBoundingClientRect)===null||t===void 0?void 0:t.call(r))!==null&&o!==void 0?o:{top:0,bottom:0};let l;let d;let u;if(c){const t=(i=window.Tecton)===null||i===void 0?void 0:i.platformDimensions;const o=window.visualViewport.height-h;const e=t.innerHeight-(t.outletOffset+h);const r=o<e;l=t.innerHeight;d=(t.outletOffset>0?p:p+t.outletOffset)-a;u=r?o-a:e-a}else{l=window.visualViewport.height;d=p-a;u=l-h-a}const f=d>u?"up":"down";const m=!e.style.getPropertyValue("--comp-pop-max-height")||this.orientationChanged;this.orientationChanged=false;const w=this.currentDirection||n||f;switch(w){case"up":if(m){e.style.setProperty("--comp-pop-max-height",`${d}px`)}this.setDirectionAndShow("up");break;case"down":if(m){e.style.setProperty("--comp-pop-max-height",`${u}px`)}this.setDirectionAndShow("down");break}}render(){const t=["container",this.currentDirection];if(this.show)t.push("show");if(this.mode==="legacy")t.push("legacy");return e("div",{key:"a96d0c6516ae6d7c279aa7b550cb5c41260ea618",ref:t=>this.containerElement=t,class:t.join(" "),"test-id":"outerContainer"},e("div",{key:"8700a956386ec2c0580be9751673fec1cb2f6b20",ref:t=>this.contentElement=t,class:"content"},e("slot",{key:"aeb04e94b887bd1af446ce443fb492a29bb9e0d6"})))}get hostElement(){return i(this)}static get watchers(){return{open:["openChanged"],minHeight:["minHeightProvided"]}}};p.style=c;export{n as click_elsewhere,p as q2_popover};
2
- //# sourceMappingURL=p-68556733.entry.js.map
1
+ import{r as t,c as o,g as i,h as e}from"./p-a5f18e27.js";import{t as r,w as s}from"./p-42302f6f.js";const n=class{constructor(i){t(this,i);this.change=o(this,"change",7);this.mouseEventList=["mousedown","dragstart","touchstart"];this.isCurrentlyFocused=false;this.mouseHandler=t=>{const o=this.shadowContains(this.findActiveElement());const i=this.shadowContains(this.shadowEventTarget(t))||this.originatesInSlots(t.target);if(!i&&(this.isCurrentlyFocused||o)){this.isCurrentlyFocused=false;this.change.emit();return}this.isCurrentlyFocused=i||o};this.windowBlurHandler=()=>{const t=this.findActiveElement();if(t===document.body&&this.isCurrentlyFocused||t!==document.body&&(t===null||t===void 0?void 0:t.tagName)==="IFRAME"){this.isCurrentlyFocused=false;this.change.emit();return}}}componentWillLoad(){}connectedCallback(){this.mouseEventList.forEach((t=>{document.addEventListener(t,this.mouseHandler)}));window.addEventListener("blur",this.windowBlurHandler)}disconnectedCallback(){this.mouseEventList.forEach((t=>{document.removeEventListener(t,this.mouseHandler)}));window.removeEventListener("blur",this.windowBlurHandler)}findActiveElement(){let t=document.activeElement;while(true){if(!t||!t.shadowRoot){return t}t=t.shadowRoot.activeElement}}shadowEventTarget(t){return t.composedPath()[0]||t.target}shadowContains(t){while(true){if(t===this.hostElement){return true}if(!t){return false}t=t.parentNode||t.host}}originatesInSlots(t){const o=this.hostElement.querySelectorAll("slot");for(const i of Array.from(o)){const o=i&&i.assignedNodes&&i.assignedNodes()||this.hostElement.childNodes;for(const i of Array.from(o)){if(i.contains(t)){return true}}}return false}get hostElement(){return i(this)}};const a="*{box-sizing:border-box}*:active{outline:none}*:focus{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}.container{display:none}.show{display:block;position:fixed;z-index:var(--tct-popover-z-index, 50);margin:0;padding:0;overflow:auto;background:var(--tct-popover-background, var(--app-white, #ffffff));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-1, 0 2px 4px rgba(0, 0, 0, 0.3)));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, 3px)));--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}:host([block]) .show{right:unset;width:var(--comp-pop-width);min-width:var(--tct-popover-min-width, unset)}:host([align=left]) .show{left:var(--comp-pop-left);right:unset}:host([align=right]) .show{right:var(--comp-pop-right);left:unset}.show.down{top:var(--tct-popover-top, var(--comp-pop-top));bottom:unset}.show.up{top:unset;bottom:var(--comp-pop-bottom)}.show.legacy{position:absolute}.show::-webkit-scrollbar{width:var(--comp-scrollbar-size);height:var(--comp-scrollbar-size);margin:5px}.show::-webkit-scrollbar-thumb{background:var(--comp-scrollbar-color);border-radius:var(--comp-scrollbar-border-radius)}.show::-webkit-scrollbar-track{background:transparent;border-radius:var(--comp-scrollbar-border-radius)}click-elsewhere{position:relative;display:block}";const c=a;const p=class{constructor(i){t(this,i);this.popoverStateChanged=o(this,"popoverStateChanged",7);this.displayBuffer=10;this.orientationChanged=false;this.handleMinHeight=()=>{if(this.minHeight){r(this,"minHeight","prop")}};this.viewPortChanged=()=>{if(!this.open)return;this.determinePopDirection()};this.viewPortOrientationChanged=()=>{this.orientationChanged=true;this.viewPortChanged()};this.setFixedCSSProperties=async()=>{var t,o;const{controlElement:i,containerElement:e,currentDirection:r}=this;const{top:n,bottom:a,left:c,right:p}=(o=(t=i===null||i===void 0?void 0:i.getBoundingClientRect)===null||t===void 0?void 0:t.call(i))!==null&&o!==void 0?o:{top:0,bottom:0,left:0,right:0};const h=c;const l=window.visualViewport.width-p;if(this.block)e.style.setProperty("--comp-pop-width",`${i.offsetWidth||0}px`);e.style.setProperty("--comp-pop-left",`${h}px`);e.style.setProperty("--comp-pop-right",`${l}px`);if(r==="up"){e.style.setProperty("--comp-pop-bottom",`${window.visualViewport.height-n}px`)}if(r==="down"){e.style.setProperty("--comp-pop-top",`${a}px`)}await s();e.style.setProperty("--comp-pop-opacity","1")};this.setAbsoluteCSSProperties=async()=>{const{controlElement:t,containerElement:o,currentDirection:i,align:e}=this;if(e==="right"){o.style.setProperty("--comp-pop-right","0");o.style.setProperty("--comp-pop-left","unset")}else{o.style.setProperty("--comp-pop-left","0");o.style.setProperty("--comp-pop-right","unset")}if(this.block){o.style.setProperty("--comp-pop-width","100%")}if(i==="up"){const i=getComputedStyle(t);const e=parseInt(i.height||"0")+parseInt(i.borderTopWidth||"0")+parseInt(i.borderBottomWidth||"0");o.style.setProperty("--comp-pop-bottom",`${e}px`)}await s();o.style.setProperty("--comp-pop-opacity","1")};this.direction=undefined;this.align=undefined;this.open=undefined;this.block=undefined;this.controlElement=undefined;this.mode=null;this.minHeight=undefined;this.currentDirection=undefined;this.show=false}componentDidLoad(){this.handleMinHeight();if(this.open)this.determinePopDirection()}disconnectedCallback(){this.removeViewportListeners()}async toggle(){this.open=!this.open}async scrollContainerTo(t){this.containerElement.scrollTo(t)}async openChanged(t){this.popoverStateChanged.emit({open:t});if(t){this.addViewportListeners();this.determinePopDirection()}else{this.removeViewportListeners();this.currentDirection=undefined;this.show=false;await s();this.clearCSSProperties()}}minHeightProvided(){this.handleMinHeight()}popoverStateHandler(t){const{detail:{open:o}}=t;if(o===this.open)return;this.open=o;t.stopPropagation()}get actualDirection(){const{direction:t}=this;switch(t){case"up":case"down":return t;default:return undefined}}get isModule(){var t,o;const i=window!==window.top;const e=Object.keys((o=(t=window.Tecton)===null||t===void 0?void 0:t.platformDimensions)!==null&&o!==void 0?o:{}).length>0;return i&&e}addViewportListeners(){var t;window.addEventListener("resize",this.viewPortOrientationChanged);window.addEventListener("scroll",this.viewPortChanged,{passive:true,capture:true});(t=screen===null||screen===void 0?void 0:screen.orientation)===null||t===void 0?void 0:t.addEventListener("change",this.viewPortOrientationChanged);window.addEventListener("orientationchange",this.viewPortOrientationChanged)}removeViewportListeners(){var t;window.removeEventListener("resize",this.viewPortOrientationChanged);window.removeEventListener("scroll",this.viewPortChanged);(t=screen===null||screen===void 0?void 0:screen.orientation)===null||t===void 0?void 0:t.removeEventListener("orientationchange",this.viewPortOrientationChanged);window.removeEventListener("orientationchange",this.viewPortOrientationChanged)}clearCSSProperties(){this.containerElement.style.removeProperty("--comp-pop-max-height");this.containerElement.style.removeProperty("--comp-pop-top");this.containerElement.style.removeProperty("--comp-pop-bottom");this.containerElement.style.removeProperty("--comp-pop-left");this.containerElement.style.removeProperty("--comp-pop-right");this.containerElement.style.removeProperty("--comp-pop-width");this.containerElement.style.removeProperty("--comp-pop-opacity")}setDirectionAndShow(t){const o=this.open;if(!o)return;this.currentDirection=t;this.show=true;if(this.mode==="legacy"){this.setAbsoluteCSSProperties()}else{this.setFixedCSSProperties()}}async determinePopDirection(){var t,o,i;const{containerElement:e,controlElement:r,actualDirection:n,displayBuffer:a}=this;if(e)e.style.maxHeight=null;await s();const{isModule:c}=this;const{top:p,bottom:h}=(o=(t=r===null||r===void 0?void 0:r.getBoundingClientRect)===null||t===void 0?void 0:t.call(r))!==null&&o!==void 0?o:{top:0,bottom:0};let l;let d;let u;if(c){const t=(i=window.Tecton)===null||i===void 0?void 0:i.platformDimensions;const o=window.visualViewport.height-h;const e=t.innerHeight-(t.outletOffset+h);const r=o<e;l=t.innerHeight;d=(t.outletOffset>0?p:p+t.outletOffset)-a;u=r?o-a:e-a}else{l=window.visualViewport.height;d=p-a;u=l-h-a}const f=d>u?"up":"down";const m=!e.style.getPropertyValue("--comp-pop-max-height")||this.orientationChanged;this.orientationChanged=false;const w=this.currentDirection||n||f;switch(w){case"up":if(m){e.style.setProperty("--comp-pop-max-height",`${d}px`)}this.setDirectionAndShow("up");break;case"down":if(m){e.style.setProperty("--comp-pop-max-height",`${u}px`)}this.setDirectionAndShow("down");break}}render(){const t=["container",this.currentDirection];if(this.show)t.push("show");if(this.mode==="legacy")t.push("legacy");return e("div",{key:"fe42de88a749c3ada361f2616a8f3b2559cb222e",ref:t=>this.containerElement=t,class:t.join(" "),"test-id":"outerContainer"},e("div",{key:"b6a51c4612e0ab2615419896c89b49bc4a00baec",ref:t=>this.contentElement=t,class:"content"},e("slot",{key:"0a9780e4386d95df7eb8334e788f6a451738c995"})))}get hostElement(){return i(this)}static get watchers(){return{open:["openChanged"],minHeight:["minHeightProvided"]}}};p.style=c;export{n as click_elsewhere,p as q2_popover};
2
+ //# sourceMappingURL=p-c56b58e9.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ClickElsewhere","constructor","hostRef","this","mouseEventList","isCurrentlyFocused","mouseHandler","event","shadowContains","findActiveElement","aboutToBeFocused","shadowEventTarget","originatesInSlots","target","change","emit","windowBlurHandler","activeElement","document","body","tagName","componentWillLoad","connectedCallback","forEach","eventName","addEventListener","window","disconnectedCallback","removeEventListener","workingElement","shadowRoot","composedPath","child","hostElement","parentNode","host","slots","querySelectorAll","currentSlot","Array","from","lightNodes","assignedNodes","childNodes","currentNode","contains","q2PopoverCss","Q2PopoverStyle0","Q2Popover","displayBuffer","orientationChanged","handleMinHeight","minHeight","handleDeprecationWarning","viewPortChanged","open","determinePopDirection","viewPortOrientationChanged","setFixedCSSProperties","async","controlElement","containerElement","currentDirection","top","controlTop","bottom","controlBottom","left","controlLeft","right","controlRight","_b","_a","getBoundingClientRect","call","popoverLeft","popoverRight","visualViewport","width","block","style","setProperty","offsetWidth","height","waitForNextPaint","setAbsoluteCSSProperties","align","controlStyle","getComputedStyle","controlSize","parseInt","borderTopWidth","borderBottomWidth","undefined","componentDidLoad","removeViewportListeners","toggle","scrollContainerTo","options","scrollTo","openChanged","popoverStateChanged","addViewportListeners","show","clearCSSProperties","minHeightProvided","popoverStateHandler","detail","stopPropagation","actualDirection","direction","isModule","isIframe","hasPlatformDimensions","Object","keys","Tecton","platformDimensions","length","passive","capture","screen","orientation","removeProperty","setDirectionAndShow","isOpen","mode","maxHeight","windowHeight","maxSpaceAbove","maxSpaceBelow","_c","distanceToIframeBottom","viewableSpaceBelow","innerHeight","outletOffset","isIframeShorterThanWindow","directionWithMostSpace","shouldUpdateMaxHeight","getPropertyValue","currentOrDetermineDirection","render","containerClasses","push","h","key","ref","el","class","join","contentElement"],"sources":["src/components/click-elsewhere/click-elsewhere.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';\n\n@Component({\n tag: 'click-elsewhere',\n shadow: false,\n})\nexport class ClickElsewhere implements ComponentInterface {\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 isCurrentlyFocused: boolean = false;\n\n @Element() hostElement: HTMLElement;\n\n /**\n * Emitted when the user clicks outside the element\n */\n @Event() change: EventEmitter;\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 /* 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 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 shadowEventTarget(event: any): Element {\n return event.composedPath()[0] || event.target;\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 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 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 this.change.emit();\n return;\n }\n this.isCurrentlyFocused = aboutToBeFocused || isCurrentlyFocused;\n };\n\n windowBlurHandler = (): void => {\n const activeElement = this.findActiveElement();\n if (\n (activeElement === document.body && this.isCurrentlyFocused) || // clicked parent frame\n (activeElement !== document.body && activeElement?.tagName === 'IFRAME') // clicked child frame\n ) {\n this.isCurrentlyFocused = false;\n this.change.emit();\n return;\n }\n };\n}\n","@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n.container {\n display: none;\n}\n\n.show {\n display: block;\n position: fixed;\n z-index: var-list(--tct-popover-z-index, 50);\n margin: 0;\n padding: 0;\n overflow: auto;\n background: var-list(--tct-popover-background, --app-white, #ffffff);\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(--tct-popover-box-shadow, --app-shadow-1, unquote('0 2px 4px rgba(0, 0, 0, 0.3)'));\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 following --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 :host([block]) & {\n right: unset;\n width: var(--comp-pop-width);\n min-width: var-list(--tct-popover-min-width, unset);\n }\n\n :host([align='left']) & {\n left: var(--comp-pop-left);\n right: unset;\n }\n\n :host([align='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 &.legacy {\n position: absolute;\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 } from '../../utils';\n\n@Component({ tag: 'q2-popover', shadow: true, styleUrl: 'q2-popover.scss' })\nexport class Q2Popover implements ComponentInterface {\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 }) direction: 'up' | 'down';\n\n /** Aligns the popover to the left or right side of the control element. */\n @Prop({ reflect: true }) align: 'left' | 'right';\n\n /** Controls whether the popover is open or closed. */\n @Prop({ reflect: true, mutable: true }) open: boolean;\n\n /** Indicates the popover will match the width of its parent element. */\n @Prop({ reflect: true }) block: boolean;\n\n /** The element that controls the popover's behavior. */\n @Prop() controlElement: HTMLElement;\n\n @Prop() mode: 'legacy' = null;\n\n /** @deprecated */\n @Prop() minHeight: number;\n\n @Element() hostElement: HTMLElement;\n\n /**\n * Emitted when the popover is opened or closed.\n */\n @Event() popoverStateChanged: EventEmitter<{ open: boolean }>;\n\n @State() currentDirection: 'down' | 'up' = undefined;\n // remove `show` when Popover API is supported in iOS\n @State() show: boolean = false;\n\n containerElement: HTMLDivElement;\n contentElement: HTMLDivElement;\n\n /**\n * The number of pixels to leave between the popover and the edge of the viewport\n */\n displayBuffer = 10;\n\n /** remove when Popover API is supported in iOS */\n orientationChanged: boolean = false;\n\n /// Lifecycle hooks ///\n componentDidLoad() {\n this.handleMinHeight();\n if (this.open) this.determinePopDirection();\n }\n\n disconnectedCallback() {\n this.removeViewportListeners();\n }\n\n /// Methods ///\n @Method()\n async toggle() {\n this.open = !this.open;\n }\n\n @Method()\n async scrollContainerTo(options: ScrollToOptions) {\n this.containerElement.scrollTo(options);\n }\n\n /// Watchers ///\n @Watch('open')\n async openChanged(open: boolean) {\n this.popoverStateChanged.emit({ open });\n\n if (open) {\n this.addViewportListeners();\n this.determinePopDirection();\n } else {\n this.removeViewportListeners();\n this.currentDirection = undefined;\n this.show = false;\n await waitForNextPaint();\n this.clearCSSProperties();\n }\n }\n\n @Watch('minHeight')\n minHeightProvided() {\n this.handleMinHeight();\n }\n\n /// Listeners ///\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 /// Getters ///\n get actualDirection(): '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 isModule() {\n const isIframe = window !== window.top;\n const hasPlatformDimensions = Object.keys(window.Tecton?.platformDimensions ?? {}).length > 0;\n return isIframe && hasPlatformDimensions;\n }\n\n /// Helpers ///\n handleMinHeight = () => {\n if (this.minHeight) {\n handleDeprecationWarning(this, 'minHeight', 'prop');\n }\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 addViewportListeners() {\n window.addEventListener('resize', this.viewPortOrientationChanged);\n // #region remove when Popover API is supported in iOS\n window.addEventListener('scroll', this.viewPortChanged, { passive: true, capture: true });\n screen?.orientation?.addEventListener('change', this.viewPortOrientationChanged);\n window.addEventListener('orientationchange', this.viewPortOrientationChanged);\n // #endregion\n }\n\n removeViewportListeners() {\n window.removeEventListener('resize', this.viewPortOrientationChanged);\n // #region remove when Popover API is supported in iOS\n window.removeEventListener('scroll', this.viewPortChanged);\n screen?.orientation?.removeEventListener('orientationchange', this.viewPortOrientationChanged);\n window.removeEventListener('orientationchange', this.viewPortOrientationChanged);\n // #endregion\n }\n\n setFixedCSSProperties = async () => {\n const { controlElement, containerElement, currentDirection } = this;\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 const popoverLeft: number = controlLeft;\n const popoverRight: number = window.visualViewport.width - controlRight;\n\n if (this.block) containerElement.style.setProperty('--comp-pop-width', `${controlElement.offsetWidth || 0}px`);\n containerElement.style.setProperty('--comp-pop-left', `${popoverLeft}px`);\n containerElement.style.setProperty('--comp-pop-right', `${popoverRight}px`);\n\n if (currentDirection === 'up') {\n containerElement.style.setProperty('--comp-pop-bottom', `${window.visualViewport.height - controlTop}px`);\n }\n if (currentDirection === 'down') {\n containerElement.style.setProperty('--comp-pop-top', `${controlBottom}px`);\n }\n\n // Wait for one paint to prevent layout thrashing\n await waitForNextPaint();\n containerElement.style.setProperty('--comp-pop-opacity', '1');\n };\n\n setAbsoluteCSSProperties = async () => {\n const { controlElement, containerElement, currentDirection, align } = this;\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 containerElement.style.setProperty('--comp-pop-opacity', '1');\n };\n\n clearCSSProperties() {\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 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) return;\n\n this.currentDirection = direction;\n this.show = true;\n if (this.mode === 'legacy') {\n this.setAbsoluteCSSProperties();\n } else {\n this.setFixedCSSProperties();\n }\n }\n\n async determinePopDirection() {\n const { containerElement, controlElement, actualDirection, displayBuffer } = this;\n if (containerElement) containerElement.style.maxHeight = null;\n\n await waitForNextPaint();\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\n if (isModule) {\n const platformDimensions = window.Tecton?.platformDimensions;\n const distanceToIframeBottom = window.visualViewport.height - controlBottom;\n const viewableSpaceBelow =\n platformDimensions.innerHeight - (platformDimensions.outletOffset + controlBottom);\n const isIframeShorterThanWindow = distanceToIframeBottom < viewableSpaceBelow;\n windowHeight = platformDimensions.innerHeight;\n // If the top of the module is below the top of the window we just use the controlTop\n // Otherwise we need to add the outletOffset to the controlTop\n maxSpaceAbove =\n (platformDimensions.outletOffset > 0 ? controlTop : controlTop + platformDimensions.outletOffset) -\n displayBuffer;\n maxSpaceBelow = isIframeShorterThanWindow\n ? distanceToIframeBottom - displayBuffer\n : viewableSpaceBelow - displayBuffer;\n } else {\n windowHeight = window.visualViewport.height;\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 || actualDirection || directionWithMostSpace;\n\n switch (currentOrDetermineDirection) {\n case 'up':\n if (shouldUpdateMaxHeight) {\n containerElement.style.setProperty('--comp-pop-max-height', `${maxSpaceAbove}px`);\n }\n this.setDirectionAndShow('up');\n break;\n case 'down':\n if (shouldUpdateMaxHeight) {\n containerElement.style.setProperty('--comp-pop-max-height', `${maxSpaceBelow}px`);\n }\n this.setDirectionAndShow('down');\n break;\n default:\n break;\n }\n }\n\n /// DOM ///\n render() {\n const containerClasses = ['container', this.currentDirection];\n if (this.show) containerClasses.push('show');\n if (this.mode === 'legacy') containerClasses.push('legacy');\n\n return (\n <div\n ref={el => (this.containerElement = el)}\n class={containerClasses.join(' ')}\n test-id=\"outerContainer\"\n >\n <div\n ref={el => (this.contentElement = el)}\n class=\"content\"\n >\n <slot />\n </div>\n </div>\n );\n }\n}\n"],"mappings":"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"}