q2-tecton-elements 1.45.2 → 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 (310) hide show
  1. package/dist/cjs/click-elsewhere_2.cjs.entry.js +36 -4
  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 +5 -4
  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 +2 -1
  15. package/dist/cjs/q2-dropdown.cjs.entry.js.map +1 -1
  16. package/dist/cjs/q2-icon.cjs.entry.js +5 -3
  17. package/dist/cjs/q2-icon.cjs.entry.js.map +1 -1
  18. package/dist/cjs/q2-input.cjs.entry.js +17 -10
  19. package/dist/cjs/q2-input.cjs.entry.js.map +1 -1
  20. package/dist/cjs/q2-item.cjs.entry.js +1 -1
  21. package/dist/cjs/q2-item.cjs.entry.js.map +1 -1
  22. package/dist/cjs/q2-list.cjs.entry.js +1 -1
  23. package/dist/cjs/q2-list.cjs.entry.js.map +1 -1
  24. package/dist/cjs/q2-optgroup.cjs.entry.js +59 -0
  25. package/dist/cjs/q2-optgroup.cjs.entry.js.map +1 -0
  26. package/dist/cjs/{q2-optgroup_2.cjs.entry.js → q2-option.cjs.entry.js} +1 -52
  27. package/dist/cjs/q2-option.cjs.entry.js.map +1 -0
  28. package/dist/cjs/q2-pagination.cjs.entry.js +22 -3
  29. package/dist/cjs/q2-pagination.cjs.entry.js.map +1 -1
  30. package/dist/cjs/q2-pill.cjs.entry.js +2 -2
  31. package/dist/cjs/q2-pill.cjs.entry.js.map +1 -1
  32. package/dist/cjs/q2-relative-time.cjs.entry.js +2 -2
  33. package/dist/cjs/q2-section.cjs.entry.js +2 -2
  34. package/dist/cjs/q2-select.cjs.entry.js +6 -6
  35. package/dist/cjs/q2-select.cjs.entry.js.map +1 -1
  36. package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
  37. package/dist/cjs/q2-stepper-pane.cjs.entry.js.map +1 -1
  38. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +6 -6
  39. package/dist/cjs/q2-stepper-vertical.cjs.entry.js.map +1 -1
  40. package/dist/cjs/q2-stepper.cjs.entry.js +2 -2
  41. package/dist/cjs/q2-stepper.cjs.entry.js.map +1 -1
  42. package/dist/cjs/q2-tab-container.cjs.entry.js +2 -2
  43. package/dist/cjs/q2-tab-container.cjs.entry.js.map +1 -1
  44. package/dist/cjs/q2-tab-pane.cjs.entry.js +1 -1
  45. package/dist/cjs/q2-tag.cjs.entry.js +1 -1
  46. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  47. package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
  48. package/dist/cjs/q2-textarea.cjs.entry.js.map +1 -1
  49. package/dist/cjs/tecton-tab-pane.cjs.entry.js +2 -2
  50. package/dist/collection/components/click-elsewhere/click-elsewhere.js.map +1 -1
  51. package/dist/collection/components/q2-btn/q2-btn.js +29 -5
  52. package/dist/collection/components/q2-btn/q2-btn.js.map +1 -1
  53. package/dist/collection/components/q2-calendar/q2-calendar.css +3 -0
  54. package/dist/collection/components/q2-calendar/q2-calendar.js +24 -2
  55. package/dist/collection/components/q2-calendar/q2-calendar.js.map +1 -1
  56. package/dist/collection/components/q2-carousel/q2-carousel.js +33 -2
  57. package/dist/collection/components/q2-carousel/q2-carousel.js.map +1 -1
  58. package/dist/collection/components/q2-currency/q2-currency.css +4 -0
  59. package/dist/collection/components/q2-data-table/q2-data-table.js +6 -6
  60. package/dist/collection/components/q2-dropdown/q2-dropdown.js +23 -1
  61. package/dist/collection/components/q2-dropdown/q2-dropdown.js.map +1 -1
  62. package/dist/collection/components/q2-icon/q2-icon.js +6 -4
  63. package/dist/collection/components/q2-icon/q2-icon.js.map +1 -1
  64. package/dist/collection/components/q2-input/q2-input.js +43 -15
  65. package/dist/collection/components/q2-input/q2-input.js.map +1 -1
  66. package/dist/collection/components/q2-item/q2-item.css +11 -11
  67. package/dist/collection/components/q2-list/q2-list.css +8 -5
  68. package/dist/collection/components/q2-option-list/q2-option-list.js +2 -2
  69. package/dist/collection/components/q2-pagination/q2-pagination.css +17 -2
  70. package/dist/collection/components/q2-pagination/q2-pagination.js +53 -2
  71. package/dist/collection/components/q2-pagination/q2-pagination.js.map +1 -1
  72. package/dist/collection/components/q2-pill/q2-pill.js +2 -2
  73. package/dist/collection/components/q2-pill/q2-pill.js.map +1 -1
  74. package/dist/collection/components/q2-popover/q2-popover.css +3 -0
  75. package/dist/collection/components/q2-popover/q2-popover.js +53 -3
  76. package/dist/collection/components/q2-popover/q2-popover.js.map +1 -1
  77. package/dist/collection/components/q2-relative-time/q2-relative-time.js +1 -1
  78. package/dist/collection/components/q2-section/q2-section.js +2 -2
  79. package/dist/collection/components/q2-select/q2-select.js +44 -6
  80. package/dist/collection/components/q2-select/q2-select.js.map +1 -1
  81. package/dist/collection/components/q2-stepper/q2-stepper.js +2 -2
  82. package/dist/collection/components/q2-stepper/q2-stepper.js.map +1 -1
  83. package/dist/collection/components/q2-stepper-pane/q2-stepper-pane.js +4 -4
  84. package/dist/collection/components/q2-stepper-pane/q2-stepper-pane.js.map +1 -1
  85. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.js +6 -6
  86. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.js.map +1 -1
  87. package/dist/collection/components/q2-tab-container/q2-tab-container.js +2 -2
  88. package/dist/collection/components/q2-tab-container/q2-tab-container.js.map +1 -1
  89. package/dist/collection/components/q2-tab-pane/q2-tab-pane.js +1 -1
  90. package/dist/collection/components/q2-tag/q2-tag.js +1 -1
  91. package/dist/collection/components/q2-textarea/q2-textarea.css +2 -2
  92. package/dist/collection/components/tecton-tab-pane/tecton-tab-pane.js +2 -2
  93. package/dist/components/click-elsewhere2.js.map +1 -1
  94. package/dist/components/index2.js +1 -1
  95. package/dist/components/q2-btn2.js +4 -2
  96. package/dist/components/q2-btn2.js.map +1 -1
  97. package/dist/components/q2-calendar.js +5 -3
  98. package/dist/components/q2-calendar.js.map +1 -1
  99. package/dist/components/q2-carousel.js +33 -2
  100. package/dist/components/q2-carousel.js.map +1 -1
  101. package/dist/components/q2-currency.js +1 -1
  102. package/dist/components/q2-currency.js.map +1 -1
  103. package/dist/components/q2-dropdown.js +3 -1
  104. package/dist/components/q2-dropdown.js.map +1 -1
  105. package/dist/components/q2-icon2.js +6 -4
  106. package/dist/components/q2-icon2.js.map +1 -1
  107. package/dist/components/q2-input2.js +20 -12
  108. package/dist/components/q2-input2.js.map +1 -1
  109. package/dist/components/q2-item.js +1 -1
  110. package/dist/components/q2-item.js.map +1 -1
  111. package/dist/components/q2-list.js +1 -1
  112. package/dist/components/q2-list.js.map +1 -1
  113. package/dist/components/q2-message2.js +1 -1
  114. package/dist/components/q2-option-list2.js +1 -1
  115. package/dist/components/q2-pagination.js +64 -13
  116. package/dist/components/q2-pagination.js.map +1 -1
  117. package/dist/components/q2-pill.js +2 -2
  118. package/dist/components/q2-pill.js.map +1 -1
  119. package/dist/components/q2-popover2.js +38 -5
  120. package/dist/components/q2-popover2.js.map +1 -1
  121. package/dist/components/q2-relative-time.js +1 -1
  122. package/dist/components/q2-section.js +2 -2
  123. package/dist/components/q2-select.js +1 -709
  124. package/dist/components/q2-select.js.map +1 -1
  125. package/dist/components/q2-select2.js +715 -0
  126. package/dist/components/q2-select2.js.map +1 -0
  127. package/dist/components/q2-stepper-pane.js +2 -2
  128. package/dist/components/q2-stepper-pane.js.map +1 -1
  129. package/dist/components/q2-stepper-vertical.js +6 -6
  130. package/dist/components/q2-stepper-vertical.js.map +1 -1
  131. package/dist/components/q2-stepper.js +2 -2
  132. package/dist/components/q2-stepper.js.map +1 -1
  133. package/dist/components/q2-tab-container.js +2 -2
  134. package/dist/components/q2-tab-container.js.map +1 -1
  135. package/dist/components/q2-tab-pane.js +1 -1
  136. package/dist/components/q2-tag.js +1 -1
  137. package/dist/components/q2-textarea.js +1 -1
  138. package/dist/components/q2-textarea.js.map +1 -1
  139. package/dist/components/tecton-tab-pane.js +2 -2
  140. package/dist/esm/click-elsewhere_2.entry.js +36 -4
  141. package/dist/esm/click-elsewhere_2.entry.js.map +1 -1
  142. package/dist/esm/{index-e940b40e.js → index-f0dfb099.js} +1 -1
  143. package/dist/esm/{index-e940b40e.js.map → index-f0dfb099.js.map} +1 -1
  144. package/dist/esm/loader.js +1 -1
  145. package/dist/esm/q2-btn_2.entry.js +2 -1
  146. package/dist/esm/q2-btn_2.entry.js.map +1 -1
  147. package/dist/esm/q2-calendar.entry.js +5 -4
  148. package/dist/esm/q2-calendar.entry.js.map +1 -1
  149. package/dist/esm/q2-carousel.entry.js +33 -2
  150. package/dist/esm/q2-carousel.entry.js.map +1 -1
  151. package/dist/esm/q2-currency.entry.js +1 -1
  152. package/dist/esm/q2-currency.entry.js.map +1 -1
  153. package/dist/esm/q2-dropdown.entry.js +2 -1
  154. package/dist/esm/q2-dropdown.entry.js.map +1 -1
  155. package/dist/esm/q2-icon.entry.js +6 -4
  156. package/dist/esm/q2-icon.entry.js.map +1 -1
  157. package/dist/esm/q2-input.entry.js +17 -10
  158. package/dist/esm/q2-input.entry.js.map +1 -1
  159. package/dist/esm/q2-item.entry.js +1 -1
  160. package/dist/esm/q2-item.entry.js.map +1 -1
  161. package/dist/esm/q2-list.entry.js +1 -1
  162. package/dist/esm/q2-list.entry.js.map +1 -1
  163. package/dist/esm/q2-optgroup.entry.js +55 -0
  164. package/dist/esm/q2-optgroup.entry.js.map +1 -0
  165. package/dist/esm/{q2-optgroup_2.entry.js → q2-option.entry.js} +3 -53
  166. package/dist/esm/q2-option.entry.js.map +1 -0
  167. package/dist/esm/q2-pagination.entry.js +22 -3
  168. package/dist/esm/q2-pagination.entry.js.map +1 -1
  169. package/dist/esm/q2-pill.entry.js +2 -2
  170. package/dist/esm/q2-pill.entry.js.map +1 -1
  171. package/dist/esm/q2-relative-time.entry.js +2 -2
  172. package/dist/esm/q2-section.entry.js +2 -2
  173. package/dist/esm/q2-select.entry.js +6 -6
  174. package/dist/esm/q2-select.entry.js.map +1 -1
  175. package/dist/esm/q2-stepper-pane.entry.js +2 -2
  176. package/dist/esm/q2-stepper-pane.entry.js.map +1 -1
  177. package/dist/esm/q2-stepper-vertical.entry.js +6 -6
  178. package/dist/esm/q2-stepper-vertical.entry.js.map +1 -1
  179. package/dist/esm/q2-stepper.entry.js +2 -2
  180. package/dist/esm/q2-stepper.entry.js.map +1 -1
  181. package/dist/esm/q2-tab-container.entry.js +2 -2
  182. package/dist/esm/q2-tab-container.entry.js.map +1 -1
  183. package/dist/esm/q2-tab-pane.entry.js +1 -1
  184. package/dist/esm/q2-tag.entry.js +1 -1
  185. package/dist/esm/q2-tecton-elements.js +1 -1
  186. package/dist/esm/q2-textarea.entry.js +1 -1
  187. package/dist/esm/q2-textarea.entry.js.map +1 -1
  188. package/dist/esm/tecton-tab-pane.entry.js +2 -2
  189. package/dist/q2-tecton-elements/{p-685b821c.entry.js → p-0eff37c6.entry.js} +2 -2
  190. package/dist/q2-tecton-elements/{p-fcc84527.entry.js → p-12326313.entry.js} +2 -2
  191. package/dist/q2-tecton-elements/p-12326313.entry.js.map +1 -0
  192. package/dist/q2-tecton-elements/p-176ad382.entry.js +2 -0
  193. package/dist/q2-tecton-elements/p-176ad382.entry.js.map +1 -0
  194. package/dist/q2-tecton-elements/{p-f4d77672.entry.js → p-195a133c.entry.js} +2 -2
  195. package/dist/q2-tecton-elements/p-1b37b8c6.entry.js +2 -0
  196. package/dist/q2-tecton-elements/p-1b37b8c6.entry.js.map +1 -0
  197. package/dist/q2-tecton-elements/p-1c4aa7e3.entry.js +2 -0
  198. package/dist/q2-tecton-elements/p-1c4aa7e3.entry.js.map +1 -0
  199. package/dist/q2-tecton-elements/p-1e927478.entry.js +2 -0
  200. package/dist/q2-tecton-elements/p-1e927478.entry.js.map +1 -0
  201. package/dist/q2-tecton-elements/p-36398b59.entry.js +2 -0
  202. package/dist/q2-tecton-elements/p-36398b59.entry.js.map +1 -0
  203. package/dist/q2-tecton-elements/{p-7ce6e587.js → p-3c42c90f.js} +1 -1
  204. package/dist/q2-tecton-elements/p-66af375f.entry.js +2 -0
  205. package/dist/q2-tecton-elements/p-66af375f.entry.js.map +1 -0
  206. package/dist/q2-tecton-elements/p-6ebe37ea.entry.js +2 -0
  207. package/dist/q2-tecton-elements/p-6ebe37ea.entry.js.map +1 -0
  208. package/dist/q2-tecton-elements/p-79df783e.entry.js +2 -0
  209. package/dist/q2-tecton-elements/p-79df783e.entry.js.map +1 -0
  210. package/dist/q2-tecton-elements/p-7e1dc7e8.entry.js +2 -0
  211. package/dist/q2-tecton-elements/p-7e1dc7e8.entry.js.map +1 -0
  212. package/dist/q2-tecton-elements/{p-05b015a8.entry.js → p-87bbeb9c.entry.js} +2 -2
  213. package/dist/q2-tecton-elements/{p-05b015a8.entry.js.map → p-87bbeb9c.entry.js.map} +1 -1
  214. package/dist/q2-tecton-elements/p-89305707.entry.js +2 -0
  215. package/dist/q2-tecton-elements/p-89305707.entry.js.map +1 -0
  216. package/dist/q2-tecton-elements/{p-debd5249.entry.js → p-ad274c67.entry.js} +2 -2
  217. package/dist/q2-tecton-elements/{p-debd5249.entry.js.map → p-ad274c67.entry.js.map} +1 -1
  218. package/dist/q2-tecton-elements/p-c56b58e9.entry.js +2 -0
  219. package/dist/q2-tecton-elements/p-c56b58e9.entry.js.map +1 -0
  220. package/dist/q2-tecton-elements/{p-2436c843.entry.js → p-cb4f9b33.entry.js} +2 -2
  221. package/dist/q2-tecton-elements/p-cb4f9b33.entry.js.map +1 -0
  222. package/dist/q2-tecton-elements/{p-5dc5c4e2.entry.js → p-d013e05d.entry.js} +2 -2
  223. package/dist/q2-tecton-elements/p-d013e05d.entry.js.map +1 -0
  224. package/dist/q2-tecton-elements/p-d1522382.entry.js +2 -0
  225. package/dist/q2-tecton-elements/p-d1522382.entry.js.map +1 -0
  226. package/dist/q2-tecton-elements/{p-63192fac.entry.js → p-da7fc914.entry.js} +2 -2
  227. package/dist/q2-tecton-elements/p-e3230823.entry.js +2 -0
  228. package/dist/q2-tecton-elements/p-e3230823.entry.js.map +1 -0
  229. package/dist/q2-tecton-elements/{p-b376c111.entry.js → p-e47dbfbe.entry.js} +2 -2
  230. package/dist/q2-tecton-elements/{p-a214077c.entry.js → p-e4a2469f.entry.js} +2 -2
  231. package/dist/q2-tecton-elements/p-f0813fb4.entry.js +2 -0
  232. package/dist/q2-tecton-elements/p-f0813fb4.entry.js.map +1 -0
  233. package/dist/q2-tecton-elements/p-fc9f43f8.entry.js +2 -0
  234. package/dist/q2-tecton-elements/p-fc9f43f8.entry.js.map +1 -0
  235. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  236. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js.map +1 -1
  237. package/dist/test/elements/q2-calendar-test.e2e.js +21 -1
  238. package/dist/test/elements/q2-calendar-test.e2e.js.map +1 -1
  239. package/dist/test/elements/q2-carousel-test.e2e.js +67 -1
  240. package/dist/test/elements/q2-carousel-test.e2e.js.map +1 -1
  241. package/dist/test/elements/q2-detail/q2-list-test.e2e.js +1 -1
  242. package/dist/test/elements/q2-detail/q2-list-test.e2e.js.map +1 -1
  243. package/dist/test/elements/q2-dropdown-test.e2e.js +30 -0
  244. package/dist/test/elements/q2-dropdown-test.e2e.js.map +1 -1
  245. package/dist/test/elements/q2-icon-test.e2e.js +17 -0
  246. package/dist/test/elements/q2-icon-test.e2e.js.map +1 -1
  247. package/dist/test/elements/q2-input-test.e2e.js +25 -2
  248. package/dist/test/elements/q2-input-test.e2e.js.map +1 -1
  249. package/dist/test/elements/q2-pagination-test.e2e.js +22 -0
  250. package/dist/test/elements/q2-pagination-test.e2e.js.map +1 -1
  251. package/dist/test/elements/q2-pill-test.e2e.js +21 -2
  252. package/dist/test/elements/q2-pill-test.e2e.js.map +1 -1
  253. package/dist/test/elements/q2-popover-test.spec.js +99 -13
  254. package/dist/test/elements/q2-popover-test.spec.js.map +1 -1
  255. package/dist/test/elements/q2-select-test.e2e.js +50 -8
  256. package/dist/test/elements/q2-select-test.e2e.js.map +1 -1
  257. package/dist/test/elements/q2-stepper-test.e2e.js +10 -17
  258. package/dist/test/elements/q2-stepper-test.e2e.js.map +1 -1
  259. package/dist/test/elements/q2-stepper-vertical-test.e2e.js +20 -4
  260. package/dist/test/elements/q2-stepper-vertical-test.e2e.js.map +1 -1
  261. package/dist/test/elements/q2-tab-container-test.e2e.js +10 -4
  262. package/dist/test/elements/q2-tab-container-test.e2e.js.map +1 -1
  263. package/dist/types/components/q2-btn/q2-btn.d.ts +14 -3
  264. package/dist/types/components/q2-carousel/q2-carousel.d.ts +2 -0
  265. package/dist/types/components/q2-icon/q2-icon.d.ts +1 -0
  266. package/dist/types/components/q2-input/q2-input.d.ts +10 -3
  267. package/dist/types/components/q2-popover/q2-popover.d.ts +3 -1
  268. package/dist/types/components.d.ts +82 -4
  269. package/package.json +3 -3
  270. package/dist/cjs/q2-optgroup_2.cjs.entry.js.map +0 -1
  271. package/dist/esm/q2-optgroup_2.entry.js.map +0 -1
  272. package/dist/q2-tecton-elements/p-1c17d118.entry.js +0 -2
  273. package/dist/q2-tecton-elements/p-1c17d118.entry.js.map +0 -1
  274. package/dist/q2-tecton-elements/p-2436c843.entry.js.map +0 -1
  275. package/dist/q2-tecton-elements/p-3b1ea100.entry.js +0 -2
  276. package/dist/q2-tecton-elements/p-3b1ea100.entry.js.map +0 -1
  277. package/dist/q2-tecton-elements/p-445990a8.entry.js +0 -2
  278. package/dist/q2-tecton-elements/p-445990a8.entry.js.map +0 -1
  279. package/dist/q2-tecton-elements/p-4a332c2a.entry.js +0 -2
  280. package/dist/q2-tecton-elements/p-4a332c2a.entry.js.map +0 -1
  281. package/dist/q2-tecton-elements/p-4b81a121.entry.js +0 -2
  282. package/dist/q2-tecton-elements/p-4b81a121.entry.js.map +0 -1
  283. package/dist/q2-tecton-elements/p-50bd4437.entry.js +0 -2
  284. package/dist/q2-tecton-elements/p-50bd4437.entry.js.map +0 -1
  285. package/dist/q2-tecton-elements/p-5dc5c4e2.entry.js.map +0 -1
  286. package/dist/q2-tecton-elements/p-7c12ba02.entry.js +0 -2
  287. package/dist/q2-tecton-elements/p-7c12ba02.entry.js.map +0 -1
  288. package/dist/q2-tecton-elements/p-7f663376.entry.js +0 -2
  289. package/dist/q2-tecton-elements/p-7f663376.entry.js.map +0 -1
  290. package/dist/q2-tecton-elements/p-a977e723.entry.js +0 -2
  291. package/dist/q2-tecton-elements/p-a977e723.entry.js.map +0 -1
  292. package/dist/q2-tecton-elements/p-b3d10d52.entry.js +0 -2
  293. package/dist/q2-tecton-elements/p-b3d10d52.entry.js.map +0 -1
  294. package/dist/q2-tecton-elements/p-c4c458b7.entry.js +0 -2
  295. package/dist/q2-tecton-elements/p-c4c458b7.entry.js.map +0 -1
  296. package/dist/q2-tecton-elements/p-d1a9ed3d.entry.js +0 -2
  297. package/dist/q2-tecton-elements/p-d1a9ed3d.entry.js.map +0 -1
  298. package/dist/q2-tecton-elements/p-f1281e3f.entry.js +0 -2
  299. package/dist/q2-tecton-elements/p-f1281e3f.entry.js.map +0 -1
  300. package/dist/q2-tecton-elements/p-f162c670.entry.js +0 -2
  301. package/dist/q2-tecton-elements/p-f162c670.entry.js.map +0 -1
  302. package/dist/q2-tecton-elements/p-fcc84527.entry.js.map +0 -1
  303. /package/dist/q2-tecton-elements/{p-685b821c.entry.js.map → p-0eff37c6.entry.js.map} +0 -0
  304. /package/dist/q2-tecton-elements/{p-f4d77672.entry.js.map → p-195a133c.entry.js.map} +0 -0
  305. /package/dist/q2-tecton-elements/{p-7ce6e587.js.map → p-3c42c90f.js.map} +0 -0
  306. /package/dist/q2-tecton-elements/{p-63192fac.entry.js.map → p-da7fc914.entry.js.map} +0 -0
  307. /package/dist/q2-tecton-elements/{p-b376c111.entry.js.map → p-e47dbfbe.entry.js.map} +0 -0
  308. /package/dist/q2-tecton-elements/{p-a214077c.entry.js.map → p-e4a2469f.entry.js.map} +0 -0
  309. /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
  310. /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
@@ -1 +0,0 @@
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","block","hintField","calendarPopover","hintMessageElement","type","present","label","hideLabel","optional","ariaExpanded","onClick","onInput","onKeyDown","onKeyUp","onBlur","onFocus","pseudo","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\n.today-decorator {\n text-transform: uppercase;\n font-weight: 700;\n font-size: 10px;\n height: 12px;\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 /** @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 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 >\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 +0,0 @@
1
- import{r as t,c as e,h as i,g as s}from"./p-a5f18e27.js";import{l as o,h as l,o as r,w as n,g as a,i as c,j as d}from"./p-42302f6f.js";import{s as h,a as p}from"./p-780a1d0e.js";const u="*{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}.q2-element-dropdown{display:none;position:absolute;background-color:var(--app-white, #ffffff);color:var(--t-text, #4d4d4d);left:0;width:100%;z-index:100;margin-top:1px;box-shadow:var(--app-shadow-1, 0 2px 4px rgba(0, 0, 0, 0.3));height:0;overflow:hidden;opacity:0;visibility:hidden;transition:opacity var(--app-tween-1, 0.2s ease);border-radius:var(--tct-dropdown-border-radius, --t-dropdown-border-radius, 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}.q2-element-dropdown::-webkit-scrollbar{width:var(--comp-scrollbar-size);height:var(--comp-scrollbar-size);margin:5px}.q2-element-dropdown::-webkit-scrollbar-thumb{background:var(--comp-scrollbar-color);border-radius:var(--comp-scrollbar-border-radius)}.q2-element-dropdown::-webkit-scrollbar-track{background:transparent;border-radius:var(--comp-scrollbar-border-radius)}.q2-element-dropdown.sizable{display:block;height:auto}.dropdown-open .q2-element-dropdown{display:block;height:auto;overflow:auto;opacity:1;visibility:visible}:host([alignment=right]) .q2-element-dropdown{left:auto;right:0}:host([block]) q2-btn,:host([block]){display:block}:host{--comp-select-margin:var(--tct-select-margin, var(--tct-select-margin-top, var(--t-select-margin-top, var(--app-scale-4, 30px))) 0 var(--tct-select-margin-bottom, var(--t-select-margin-bottom, var(--app-scale-4, 30px))));display:block;margin:var(--comp-select-margin)}.q2-select-container{position:relative;display:block}.q2-select-input{margin:0;--tct-input-min-height:var(--tct-select-input-min-height, var(--t-select-input-min-height));--tct-input-max-height:var(--tct-select-input-max-height, var(--t-select-input-max-height, none))}::slotted([slot=_selected-display]){width:100%;min-height:var(--comp-selected-display-height, 44px)}.custom-display-content{position:absolute;bottom:0;left:calc(var(--tct-scale-2, var(--app-scale-2x, 10px)) + 1px);height:44px;width:calc(100% - 34px - var(--tct-scale-3, var(--app-scale-3x, 15px)));overflow:hidden;cursor:pointer;transition:left var(--tct-tween-2, var(--app-tween-1, 0.2s ease))}.custom-display-content:not([hidden]){display:flex;align-items:center}.is-searchable.is-focused .custom-display-content,.is-searchable .custom-display-content:active{left:calc(var(--tct-scale-3, var(--app-scale-3x, 15px)) + 1px)}.has-error .custom-display-content{width:calc(100% - 68px - var(--tct-scale-3, var(--app-scale-3x, 15px)))}.popover-content{display:flex;flex-direction:column-reverse}.popover-bottom-container{position:sticky;bottom:0;z-index:5}.popover-top-container{position:sticky;top:0;z-index:5}.popover-top-container .multi-select-header{padding:var(--tct-scale-2, var(--app-scale-2x, 10px)) var(--tct-scale-2, var(--app-scale-2x, 10px));background:var(--app-white);display:flex;gap:var(--app-scale-2x, 10px);align-items:center}.popover-top-container .multi-select-header fieldset{margin:0;padding:0;border:0;display:flex;gap:var(--app-scale-2x, 10px)}.popover-top-container .multi-select-header legend{padding:0;float:left}.popover-top-container .multi-select-header label{cursor:pointer;padding:var(--tct-select-multi-select-option-padding, var(--t-select-multi-select-option-padding, var(--tct-btn-badge-padding, var(--t-btn-badge-padding, 2px 5px))));font-size:var(--tct-select-multi-select-option-font-size, var(--t-select-multi-select-option-font-size, var(--tct-btn-badge-font-size, var(--t-btn-badge-font-size, inherit))));border-radius:var(--tct-select-multi-select-option-radius, var(--t-select-multi-select-option-radius, var(--tct-btn-badge-border-radius, var(--t-btn-badge-border-radius, var(--app-border-radius-1, 3px)))));background:var(--tct-select-multi-select-option-background, var(--tct-select-multi-select-option-bg, var(--t-select-multi-select-option-bg, var(--tct-badge-background, var(--tct-btn-badge-bg, var(--t-btn-badge-bg, transparent))))));color:var(--tct-select-multi-select-option-color, var(--t-select-multi-select-option-color, var(--tct-btn-badge-font-color, var(--t-btn-badge-font-color, inherit))))}.popover-top-container .multi-select-header label:hover{background:var(--tct-select-multi-select-option-hover-background, var(--tct-select-multi-select-option-hover-background-color, var(--t-select-multi-select-option-hover-background-color, var(--tct-btn-badge-hover-bg, var(--t-btn-badge-hover-bg, var(--tct-gray-14, var(--t-gray-14, var(--app-gray-l3, #f2f2f2))))))));color:var(--tct-select-multi-select-option-hover-color, var(--tct-select-multi-select-option-color, var(--t-select-multi-select-option-color, var(--tct-btn-badge-hover-font-color, var(--t-btn-badge-hover-font-color, var(--tct-gray-5, var(--t-gray-5, var(--app-gray-d2, #404040))))))))}.popover-top-container .multi-select-header input:checked+label,.popover-top-container .multi-select-header input:checked+label:enabled:hover{background:var(--tct-select-multi-select-option-active-background, var(--tct-select-multi-select-option-active-background-color, var(--t-select-multi-select-option-active-background-color, var(--tct-btn-primary-bg, var(--t-btn-primary-bg, #2e2e2e)))));color:var(--tct-select-multi-select-option-active-color, var(--t-select-multi-select-option-active-color, var(--tct-btn-primary-font-color, var(--t-btn-primary-font-color, var(--app-white, #ffffff)))))}.popover-top-container .multi-select-header input:disabled+label{opacity:var(--tct-select-multi-select-option-disabled-opacity, var(--t-select-multi-select-option-disabled-opacity, var(--tct-btn-disabled-opacity, var(--t-btn-disabled-opacity, var(--app-disabled-opacity, 0.4)))));cursor:not-allowed}.popover-top-container .multi-select-header input:focus+label{box-shadow:var(--const-double-focus-ring)}";const v=u;const b=class{constructor(i){t(this,i);this.change=e(this,"change",7);this.input=e(this,"input",7);var s;this.scheduledAfterRender=[];this.showSelectedOptions=()=>{this.showSelected=true};this.showAllOptions=()=>{this.showSelected=false};this.onMutationObserved=()=>{const{hostElement:t,hasPopoverTop:e,hasPopoverBottom:i}=this;const s=t.querySelector(".custom-display-content");const o=t.shadowRoot.querySelector('slot[name="q2-select-display"]');const l=!!o?o.assignedNodes().length>0:s.children.length>0;if(this.hasCustomDisplay!==l){this.hasCustomDisplay=l}const r=t.shadowRoot.querySelector('slot[name="popover-top"]');const n=r.assignedNodes().length>0;if(e!==n){this.hasPopoverTop=n}const a=t.shadowRoot.querySelector('slot[name="popover-bottom"]');const c=a.assignedNodes().length>0;if(i!==c){this.hasPopoverBottom=c}this.checkSelectedOptions()};this.onOptionListChange=t=>{t.stopPropagation();const{values:e}=t.detail;if(e.length===0)this.showAllOptions();this.handleSelectionChanges(t.detail)};this.onPopoverState=({detail:{open:t,action:e}})=>{if(!t||this.searchText){if(e!=="select"){this.optionList.setActiveElement(null)}this.inputField.focus()}if(this.open===t)return;this.open=t};this.inputKeydownHandler=t=>{if(this.readonly||this.disabled)return;const e=t.key;const i=this.hasPopoverTop||this.hasPopoverBottom;const s=e==="Tab"&&t.shiftKey;if(i&&(e==="Tab"||e==="Enter"||s))return;if(h(this,t)){return this.executeActionSheet(t)}const o=["ArrowDown","ArrowUp","PageDown","PageUp","Home","End","Escape","Tab"];if(this.searchable&&!o.includes(e))return;if(this.shouldClearSearchText(t))this.clearSearchText();if(e===" ")t.preventDefault();this.optionList.handleExternalKeydown(t)};this.visibilityToggleKeyDown=t=>{const e=t.key;const i=e==="Tab"&&t.shiftKey;const s=["ArrowLeft","ArrowRight","ArrowUp","ArrowDown"].includes(e);if(s)t.stopPropagation();if(i){t.stopPropagation();if(this.hasPopoverTop)return;this.optionList.setDefaultActiveElement()}};this.inputClickHandler=async t=>{t.stopPropagation();if(h(this)){return this.executeActionSheet(t)}this.toggleDropdown();this.focusInput()};this.inputInputHandler=t=>{t.stopPropagation();const e=t.detail.value;const i=!!this.value;if(i)this.clearValue();if(!this.open)this.openDropdownWithoutActiveElement();this.prioritizeSearch=true;this.searchText=e;this.input.emit({query:e})};this.inputFocusHandler=()=>{this.inputFocused=true};this.inputBlurHandler=()=>{this.inputFocused=false};this.inputChangeHandler=t=>{t.stopPropagation()};this.clickedElsewhere=t=>{const e=t.target;if(e.localName!=="click-elsewhere")return;t.stopPropagation();if(!this.open)return;this.closeDropdown()};this.onCustomDisplayClick=t=>{t.stopPropagation();this.focusInput();this.toggleDropdown()};this.disabled=false;this.errors=undefined;this.hideLabel=undefined;this.hoist=!!((s=window.Tecton)===null||s===void 0?void 0:s.useActionSheets);this.invalid=undefined;this.label=undefined;this.listLabel=o("tecton.element.select.listLabel");this.minRows=3;this.multilineOptions=false;this.multiple=false;this.optional=false;this.placeholder=undefined;this.popDirection=undefined;this.readonly=false;this.searchable=false;this.selectedOptions=[];this.value=undefined;this.ariaLabel=undefined;this.open=false;this.showSelected=false;this.searchText="";this.hasCustomDisplay=false;this.hasPopoverTop=false;this.hasPopoverBottom=false;this.inputFocused=false;this.statusMessage=undefined;this.prioritizeSearch=false;this.structuredSelectedOptions=[]}componentWillLoad(){l(this);this.buildStructuredSelectedOptions();this.handleMultilineOptionsUpdate(this.multilineOptions,false)}componentDidLoad(){const t=new MutationObserver(this.onMutationObserved);t.observe(this.hostElement,{childList:true,subtree:true});this.mutationObserver=t;this.onMutationObserved();r(this.hostElement);setTimeout((()=>this.checkSelectedDisplay()),0)}componentDidRender(){setTimeout((()=>{this.scheduledAfterRender.forEach((t=>t()));this.scheduledAfterRender=[]}),25)}disconnectedCallback(){var t;(t=this.mutationObserver)===null||t===void 0?void 0:t.disconnect();this.mutationObserver=null}get innerInputField(){var t,e;return(e=(t=this.inputField)===null||t===void 0?void 0:t.shadowRoot)===null||e===void 0?void 0:e.querySelector(".input-field")}get innerInputContainer(){var t,e;return(e=(t=this.inputField)===null||t===void 0?void 0:t.shadowRoot)===null||e===void 0?void 0:e.querySelector(".input-container")}get badgeValue(){var t,e;if(!this.multiple)return null;const i=(e=(t=this.selectedOptions)===null||t===void 0?void 0:t.length)!==null&&e!==void 0?e:0;if(this.open&&this.searchable)return i?`${i}`:null;else return i>1?`+${i-1}`:null}get popoverMinHeight(){const{minRows:t}=this;const e=this.hostElement.querySelector("q2-option:not([hidden])");let i=e&&window.getComputedStyle(e).minHeight;if(!i||i==="0px")i="44px";return t*parseInt(i)}get selectedDisplay(){if(this.prioritizeSearch||this.searchText)return this.searchText;if(this.hasCustomDisplay)return"";return this.multiple?this.calculateMultiSelectSelectedDisplay():this.calculateSingleSelectSelectedDisplay()}get selectedDisplaySlot(){return this.hostElement.querySelector('[slot="_selected-display"]')}get firstSelectedValue(){var t;return this.multiple?(t=this.selectedOptions)===null||t===void 0?void 0:t[0]:this.value}get firstSelectedOptionElement(){const{firstSelectedValue:t}=this;return t?this.optionElements.find((({value:e})=>e===t)):null}get optionElements(){return Array.from(this.hostElement.querySelectorAll("q2-option"))}get wrapperClasses(){const{errors:t}=this;const e=["q2-select-container"];if(Array.isArray(t)&&t.length>0)e.push("has-error");if(this.inputFocused)e.push("is-focused");if(this.searchable)e.push("is-searchable");return e.join(" ")}buildStructuredSelectedOptions(){const{multiple:t,selectedOptions:e,value:i}=this;if(t){this.structuredSelectedOptions=!!(e===null||e===void 0?void 0:e.length)?e.map((t=>typeof t==="string"?{value:t}:t)):[]}else{this.structuredSelectedOptions=i?[{value:i}]:[]}}ariaLabelObserver(){l(this)}valueUpdated(){if(this.multiple)return;this.clearSearchText()}handleMultilineOptionsUpdate(t,e){if(t===e)return;this.optionElements.forEach((e=>e.multiline=t))}openChanged(t){this.scheduledAfterRender.push((async()=>{await n();const{popoverTopContainer:e,popoverElement:i}=this;const s=t&&(e===null||e===void 0?void 0:e.offsetHeight)||0;if(s){i.style.setProperty("--comp-popover-top-container-height",`${s}px`)}else{i.style.removeProperty("--comp-popover-top-container-height")}}))}_togglePopover(){const{innerInputField:t}=this;t===null||t===void 0?void 0:t.click();t===null||t===void 0?void 0:t.focus();t.dispatchEvent(new FocusEvent("focus"))}async openPopover(){if(this.open||this.disabled)return;this._togglePopover()}async closePopover(){if(!this.open||this.disabled)return;this._togglePopover()}async setValue(t,e={closePopover:true}){const i=new Set(Array.isArray(t)?t:[t]);if(!this.open){await this.openPopover();await n()}i.forEach((t=>{var e;(e=this.optionElements.find((e=>e.value===t)))===null||e===void 0?void 0:e.click()}));if(e.closePopover){await this.closePopover();await n()}}searchOptions(t){if(!this.searchable)return;const{innerInputField:e}=this;e.focus();e.dispatchEvent(new FocusEvent("focus"));e.value=t;e.dispatchEvent(new InputEvent("input"))}keydownHandler(t){this.inputKeydownHandler(t)}onHostElementChange(t){if(this.readonly||this.disabled)return;if(t.target!==this.hostElement||this.hostElement.onchange)return;if(this.multiple){this.value=null;this.selectedOptions=t.detail.selectedOptions}else{this.value=t.detail.value;this.selectedOptions=[]}}onHostElementInput(t){if(!this.searchable||t.target!==this.hostElement||this.hostElement.oninput)return;const e=this.optionElements;const i=this.searchText.trim().toLocaleLowerCase();let s=0;e.forEach((t=>{var e;if(i===""){t.hidden=false;return}const o=((e=t.firstElementChild)===null||e===void 0?void 0:e.tagName)==="Q2-CARD"?t.firstElementChild.title:null;const{display:l="",innerText:r=""}=t;const n=[l,o,r];const a=n.some((t=>{var e;return(e=t===null||t===void 0?void 0:t.toLocaleLowerCase().includes(i))!==null&&e!==void 0?e:false}));t.hidden=!a;if(a)s++}));const l=i?"tecton.element.select.searchable.results":"tecton.element.select.allOptions";const r=i?s:e.length;this.setStatusMessage(o(l,[r]))}delegateFocus(t){const e=a(t,this.hostElement);const i=this.prioritizeSearch=e&&this.searchable;if(i){this.clearSelectedDisplay()}else if(c(t,this.hostElement)){this.inputField.shadowRoot.querySelector(".input-field").focus()}}handleFocusout(t){const e=d(t,this.hostElement);if(e)this.closeDropdown();this.prioritizeSearch=!e&&this.searchable}handleSelectedDisplay(t){if(this.multiple)return;this.inputField.value=t.detail.display}async executeActionSheet(t){const e=await p(this,t);this.handleSelectionChanges(e)}handleSelectionChanges(t){const{value:e="",values:i=[]}=t;const s=i.map((t=>t.value));const{multiple:o}=this;if(!this.hostElement.onchange){this.selectedOptions=s}this.change.emit({value:o?undefined:e,selectedOptions:o?s:undefined})}clearValue(){const{multiple:t}=this;this.value="";this.selectedOptions=[];this.change.emit({value:t?undefined:"",selectedOptions:t?[]:undefined})}calculateMultiSelectSelectedDisplay(){var t,e,i;const{firstSelectedOptionElement:s,firstSelectedValue:l,multilineOptions:r}=this;if(!l)return"";if(s===null||s===void 0?void 0:s.display)return o(s.display);if(r&&this.searchable)return this.searchText;if(r)return"";return(i=(e=(t=s===null||s===void 0?void 0:s.textContent)===null||t===void 0?void 0:t.trim())!==null&&e!==void 0?e:s===null||s===void 0?void 0:s.value)!==null&&i!==void 0?i:l}calculateSingleSelectSelectedDisplay(){var t;const{firstSelectedOptionElement:e,multilineOptions:i}=this;if(i){return(e===null||e===void 0?void 0:e.display)&&o(e.display)||this.value||""}else{return(e===null||e===void 0?void 0:e.display)&&o(e.display)||((t=e===null||e===void 0?void 0:e.textContent)===null||t===void 0?void 0:t.trim())||this.value||""}}openDropdownWithoutActiveElement(){if(this.readonly||this.disabled)return;this.optionList.setActiveElement(null);this.open=true}closeDropdown(){this.open=false;this.clearSearchText()}clearSearchText(){if(!this.searchText)return;this.searchText="";this.input.emit({query:""})}toggleDropdown(){if(this.readonly||this.disabled)return;if(this.open&&!this.searchText){this.closeDropdown()}else{this.openDropdownWithoutActiveElement()}}focusInput(){var t;(t=this.inputField)===null||t===void 0?void 0:t.dispatchEvent(new FocusEvent("focus"))}setStatusMessage(t){clearTimeout(this.statusMessageTimer);this.statusMessage="";this.statusMessageTimer=setTimeout((()=>{this.statusMessage=t}),1e3)}checkSelectedOptions(){const{multiple:t,selectedOptions:e,value:i}=this;this.optionElements.forEach((s=>{if(t){s.selected=e.includes(s.value)}else{s.selected=s.value===i}}))}clearSelectedDisplay(){var t;(t=this.selectedDisplaySlot)===null||t===void 0?void 0:t.remove()}checkSelectedDisplay(){let t=this.selectedDisplaySlot;const{value:e,multiple:i,selectedOptions:s,multilineOptions:o,firstSelectedOptionElement:l,prioritizeSearch:r}=this;const n=!e&&i&&!(s===null||s===void 0?void 0:s.length);if(r||!o||n)return this.clearSelectedDisplay();if(!l||l.display)return this.clearSelectedDisplay();const a=l.firstElementChild.cloneNode(true);a.querySelectorAll("[hide-on-select]").forEach((t=>t.remove()));if(t){const e=t.clientHeight===0?"auto":`${t.clientHeight}px`;t.style.setProperty("--comp-selected-display-height",e);if(t.firstElementChild.outerHTML!==a.outerHTML){t.replaceChild(a,t.firstElementChild)}}else{t=document.createElement("div");t.slot="_selected-display";t.appendChild(a);this.hostElement.appendChild(t)}return t}checkSelectedDisplayHeight(){const{selectedDisplaySlot:t}=this;if(!t)return;t.style.setProperty("--comp-selected-display-height","44px")}shouldClearSearchText(t){return this.searchable&&!!this.searchText&&t.key==="Escape"}renderCustomDisplay(){const t=this.checkSelectedDisplay();if(!t)return;this.checkSelectedDisplayHeight();return i("slot",{name:"_selected-display",slot:"custom-display"})}render(){const t=!this.searchable;return i("click-elsewhere",{key:"ea84ffa024060b974a445ca53b1acfe9b25f4c34",class:this.wrapperClasses,onChange:this.clickedElsewhere},i("div",{key:"5852501629df47306293d549cb56591bd8333077","aria-live":"polite","aria-atomic":"true",role:"status",class:"sr"},this.statusMessage),i("q2-input",{key:"fe1475b30b825643485bc010b4cdeb415355831a",ref:t=>this.inputField=t,class:"q2-select-input",label:this.label&&o(this.label)||"",value:this.selectedDisplay,errors:Array.isArray(this.errors)&&this.errors.length>0&&this.errors.map((t=>o(t)))||this.invalid&&["tecton.element.select.invalid"]||[],disabled:this.disabled,optional:this.optional,readonly:this.readonly,placeholder:this.placeholder||undefined,hideLabel:this.hideLabel,ariaExpanded:`${this.open}`,ariaControls:"option-list",ariaHaspopup:"listbox",role:"combobox",pseudo:t,"test-id":"toggleDropdown","hide-messages":true,iconRight:"chevron-down",onClick:this.inputClickHandler,onInput:this.inputInputHandler,onKeyDown:this.inputKeydownHandler,onFocus:this.inputFocusHandler,onBlur:this.inputBlurHandler,onChange:this.inputChangeHandler,badgeValue:this.badgeValue,badgeTheme:this.inputFocused?"primary":undefined},this.renderCustomDisplay()),i("div",{key:"2e64e21b577da67b5180c54262d04b40c7d4fe0b",class:"custom-display-content",hidden:!this.hasCustomDisplay||!!this.searchText,onClick:this.onCustomDisplayClick},i("slot",{key:"c3f904c0e74b8d39cc18182df5e29b409cab1ca3",name:"q2-select-display"})),this.optionsDropdown())}optionsDropdown(){return i("q2-popover",{ref:t=>this.popoverElement=t,controlElement:this.innerInputContainer,open:this.open,minHeight:this.popoverMinHeight,direction:this.popDirection,block:true},i("div",{class:"popover-content"},i("q2-option-list",{onPopoverState:this.onPopoverState,ref:t=>this.optionList=t,type:"listbox",id:"option-list","show-selected":this.showSelected,label:this.listLabel,multiple:this.multiple,selectedOptions:this.structuredSelectedOptions,onChange:this.onOptionListChange},i("slot",null)),i("div",{class:"popover-top-container",ref:t=>this.popoverTopContainer=t,hidden:!this.multiple&&!this.hasPopoverTop,tabindex:"-1"},i("slot",{name:"popover-top"}),this.multiple&&this.visibilityToggle())),i("div",{class:"popover-bottom-container",hidden:!this.hasPopoverBottom,tabindex:"-1"},i("slot",{name:"popover-bottom"})))}visibilityToggle(){var t,e;const s=(e=(t=this.selectedOptions)===null||t===void 0?void 0:t.length)!==null&&e!==void 0?e:0;const{showSelected:l}=this;return i("div",{class:"multi-select-header"},i("fieldset",null,i("legend",{"aria-label":o("tecton.element.select.multiHeader.showing")},o("tecton.element.select.multiHeader.showing")),i("div",null,i("input",{class:"sr",type:"radio",id:"all",name:"viewDisplay",value:"all",checked:!l,"aria-label":o("tecton.element.select.multiHeader.allAriaLabel"),"test-id":"allOptionsButton",onClick:this.showAllOptions,onKeyDown:this.visibilityToggleKeyDown}),i("label",{htmlFor:"all"},o("tecton.element.select.multiHeader.all"))),i("div",null,i("input",{class:"sr",type:"radio",id:"selected",disabled:s===0,name:"viewDisplay",value:"selected","aria-label":o("tecton.element.select.multiHeader.selectedAriaLabel",[s]),checked:l,"test-id":"selectedOptionsButton",onClick:this.showSelectedOptions,onKeyDown:this.visibilityToggleKeyDown}),i("label",{htmlFor:"selected"},o("tecton.element.select.multiHeader.selected",[s])))))}get hostElement(){return s(this)}static get watchers(){return{value:["buildStructuredSelectedOptions","valueUpdated"],selectedOptions:["buildStructuredSelectedOptions"],ariaLabel:["ariaLabelObserver"],multilineOptions:["handleMultilineOptionsUpdate"],open:["openChanged"]}}};b.style=v;export{b as q2_select};
2
- //# sourceMappingURL=p-f162c670.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["q2SelectCss","Q2SelectStyle0","Q2Select","this","scheduledAfterRender","showSelectedOptions","showSelected","showAllOptions","onMutationObserved","hostElement","hasPopoverTop","hasPopoverBottom","slotContainer","querySelector","displaySlot","shadowRoot","hasCustomDisplay","assignedNodes","length","children","popTopSlot","topSlotHasNode","popBottomSlot","bottomSlotHasNode","checkSelectedOptions","onOptionListChange","event","stopPropagation","values","detail","handleSelectionChanges","onPopoverState","open","action","searchText","optionList","setActiveElement","inputField","focus","inputKeydownHandler","readonly","disabled","key","hasSlot","isShiftTab","shiftKey","shouldShowActionSheet","executeActionSheet","keysForOptionListToHandle","searchable","includes","shouldClearSearchText","clearSearchText","preventDefault","handleExternalKeydown","visibilityToggleKeyDown","isRadioControlKey","setDefaultActiveElement","inputClickHandler","async","toggleDropdown","focusInput","inputInputHandler","eventValue","value","shouldClearValue","clearValue","openDropdownWithoutActiveElement","prioritizeSearch","input","emit","query","inputFocusHandler","inputFocused","inputBlurHandler","inputChangeHandler","clickedElsewhere","target","localName","closeDropdown","onCustomDisplayClick","_a","window","Tecton","useActionSheets","loc","componentWillLoad","handleAriaLabel","buildStructuredSelectedOptions","handleMultilineOptionsUpdate","multilineOptions","componentDidLoad","observer","MutationObserver","observe","childList","subtree","mutationObserver","overrideFocus","setTimeout","checkSelectedDisplay","componentDidRender","forEach","fn","disconnectedCallback","disconnect","innerInputField","_b","innerInputContainer","badgeValue","multiple","optionsLength","selectedOptions","popoverMinHeight","minRows","firstOption","minHeight","getComputedStyle","parseInt","selectedDisplay","calculateMultiSelectSelectedDisplay","calculateSingleSelectSelectedDisplay","selectedDisplaySlot","firstSelectedValue","firstSelectedOptionElement","optionElements","find","Array","from","querySelectorAll","wrapperClasses","errors","classes","isArray","push","join","structuredSelectedOptions","map","option","ariaLabelObserver","valueUpdated","newValue","oldValue","element","multiline","openChanged","isOpen","waitForNextPaint","popoverTopContainer","popoverElement","height","offsetHeight","style","setProperty","removeProperty","_togglePopover","click","dispatchEvent","FocusEvent","openPopover","closePopover","setValue","options","valuesSet","Set","searchOptions","InputEvent","keydownHandler","onHostElementChange","onchange","onHostElementInput","oninput","trim","toLocaleLowerCase","matchedCount","hidden","title","firstElementChild","tagName","display","innerText","searchParams","matched","some","text","statusMessageLocString","count","setStatusMessage","delegateFocus","fromHost","isRelatedTargetWithinHost","clearSelectedDisplay","isEventFromElement","handleFocusout","isLeavingHost","isHostLosingFocus","handleSelectedDisplay","result","showActionSheetList","changeDetails","selectedOptionValues","change","undefined","_c","textContent","message","clearTimeout","statusMessageTimer","statusMessage","selected","remove","namedSlot","hasNoValue","selectionClone","cloneNode","clientHeight","outerHTML","replaceChild","document","createElement","slot","appendChild","checkSelectedDisplayHeight","renderCustomDisplay","hasSelectedDisplay","h","name","render","showAsPseudo","class","onChange","role","ref","el","label","error","invalid","optional","placeholder","hideLabel","ariaExpanded","ariaControls","ariaHaspopup","pseudo","iconRight","onClick","onInput","onKeyDown","onFocus","onBlur","badgeTheme","optionsDropdown","controlElement","direction","popDirection","block","type","id","listLabel","tabindex","visibilityToggle","selectedOptionsCount","checked","htmlFor"],"sources":["src/components/q2-select/q2-select.scss?tag=q2-select&encapsulation=shadow","src/components/q2-select/q2-select.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import '../../styles/dropdowns';\n\n:host {\n --comp-select-margin: #{var-list(\n --tct-select-margin,\n unquote(\n '#{var-list(var-prefixer(select-margin-top), --app-scale-4, 30px)} 0 #{var-list(var-prefixer(select-margin-bottom), --app-scale-4, 30px)}'\n )\n )};\n display: block;\n margin: var(--comp-select-margin);\n}\n\n.q2-select-container {\n position: relative;\n display: block;\n}\n\n.q2-select-input {\n margin: 0;\n\n --tct-input-min-height: #{var-list(var-prefixer(select-input-min-height))};\n --tct-input-max-height: #{var-list(var-prefixer(select-input-max-height), none)};\n}\n\n::slotted([slot='_selected-display']) {\n width: 100%;\n min-height: var(--comp-selected-display-height, 44px);\n}\n\n.custom-display-content {\n position: absolute;\n bottom: 0;\n left: calc(var-list(--tct-scale-2, --app-scale-2x, 10px) + 1px);\n height: 44px;\n width: calc(100% - 34px - var-list(--tct-scale-3, --app-scale-3x, 15px));\n overflow: hidden;\n cursor: pointer;\n transition: left var-list(--tct-tween-2, --app-tween-1, unquote('0.2s ease'));\n}\n\n.custom-display-content:not([hidden]) {\n display: flex;\n align-items: center;\n}\n\n.is-searchable.is-focused .custom-display-content,\n.is-searchable .custom-display-content:active {\n left: calc(var-list(--tct-scale-3, --app-scale-3x, 15px) + 1px);\n}\n\n.has-error .custom-display-content {\n width: calc(100% - 68px - var-list(--tct-scale-3, --app-scale-3x, 15px));\n}\n\n.popover-content {\n display: flex;\n flex-direction: column-reverse;\n}\n\n.popover-bottom-container {\n position: sticky;\n bottom: 0;\n z-index: 5;\n}\n\n.popover-top-container {\n position: sticky;\n top: 0;\n z-index: 5;\n .multi-select-header {\n padding: var(--tct-scale-2, var(--app-scale-2x, 10px)) var(--tct-scale-2, var(--app-scale-2x, 10px));\n background: var(--app-white);\n display: flex;\n gap: var-list(--app-scale-2x, 10px);\n align-items: center;\n\n fieldset {\n margin: 0;\n padding: 0;\n border: 0;\n display: flex;\n gap: var-list(--app-scale-2x, 10px);\n }\n\n legend {\n padding: 0;\n float: left;\n }\n\n label {\n cursor: pointer;\n padding: var-list(\n var-prefixer(select-multi-select-option-padding),\n var-prefixer(btn-badge-padding),\n unquote('2px 5px')\n );\n font-size: var-list(\n var-prefixer(select-multi-select-option-font-size),\n var-prefixer(btn-badge-font-size),\n inherit\n );\n border-radius: var-list(\n var-prefixer(select-multi-select-option-radius),\n var-prefixer(btn-badge-border-radius),\n --app-border-radius-1,\n 3px\n );\n background: var-list(\n --tct-select-multi-select-option-background,\n var-prefixer(select-multi-select-option-bg),\n --tct-badge-background,\n var-prefixer(btn-badge-bg),\n transparent\n );\n color: var-list(\n var-prefixer(select-multi-select-option-color),\n var-prefixer(btn-badge-font-color),\n inherit\n );\n\n &:hover {\n background: var-list(\n --tct-select-multi-select-option-hover-background,\n var-prefixer(select-multi-select-option-hover-background-color),\n var-prefixer(btn-badge-hover-bg),\n var-prefixer(gray-14),\n --app-gray-l3,\n #f2f2f2\n );\n color: var-list(\n --tct-select-multi-select-option-hover-color,\n var-prefixer(select-multi-select-option-color),\n var-prefixer(btn-badge-hover-font-color),\n var-prefixer(gray-5),\n --app-gray-d2,\n #404040\n );\n }\n }\n\n input {\n &:checked + label {\n &,\n &:enabled:hover {\n background: var-list(\n --tct-select-multi-select-option-active-background,\n var-prefixer(select-multi-select-option-active-background-color),\n var-prefixer(btn-primary-bg),\n #2e2e2e\n );\n color: var-list(\n var-prefixer(select-multi-select-option-active-color),\n var-prefixer(btn-primary-font-color),\n --app-white,\n #ffffff\n );\n }\n }\n\n &:disabled + label {\n opacity: var-list(\n var-prefixer(select-multi-select-option-disabled-opacity),\n var-prefixer(btn-disabled-opacity),\n --app-disabled-opacity,\n 0.4\n );\n cursor: not-allowed;\n }\n\n &:focus + label {\n box-shadow: var(--const-double-focus-ring);\n }\n }\n }\n}\n","import {\n Component,\n Prop,\n Element,\n h,\n Listen,\n State,\n EventEmitter,\n Event,\n ComponentInterface,\n Watch,\n Method,\n} from '@stencil/core';\nimport { IEventDetail, Q2InputCustomEvent, Q2OptionListCustomEvent } from 'src/components';\nimport {\n handleAriaLabel,\n isEventFromElement,\n isHostLosingFocus,\n isRelatedTargetWithinHost,\n loc,\n overrideFocus,\n waitForNextPaint,\n} from '../../utils';\nimport { IOptionValue } from '../q2-option-list/q2-option-list';\nimport { shouldShowActionSheet, showActionSheetList } from 'src/utils/action-sheet';\n\n@Component({ tag: 'q2-select', shadow: true, styleUrl: 'q2-select.scss' })\nexport class Q2Select implements ComponentInterface {\n /** Disables all interaction with the field and leverages the disabled visual style of `q2-input`. */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /**\n * The presence of `errors` will mark the field as invalid, putting it into an error state.\n * @localizable\n */\n @Prop() errors: string[];\n\n /**\n * Hide's the field's `<label>` element from view.\n * @warning\n * Only use when a visible label is impractical.\n */\n @Prop({ reflect: true, mutable: true }) hideLabel: boolean;\n\n /**\n * Instructs the component to use the action sheet workflow for displaying its options.\n *\n * For more information, see [Action Sheets](https://tecton.q2developer.com/guides/action-sheets/).\n * @warning\n * If your `q2-select` renders inside of an iframe, and you are using multiline/robust content options,\n * any custom CSS you apply to your options will not get passed up to the platform which displays the action sheet.\n * For this reason, we strongly suggest using the [q2-card](https://tecton.q2developer.com/ui/q2-card/) component since its styling is managed by Tecton.\n */\n @Prop() hoist: boolean = !!window.Tecton?.useActionSheets;\n\n /** Determines whether to show an error state. Its primary use-case is for an unfilled field. */\n @Prop({ reflect: true }) invalid: boolean;\n\n /**\n * The text that will be used as the label for the field.\n * @localizable\n */\n @Prop({ reflect: true, mutable: true }) label: string;\n\n /**\n * Determines the label that is applied to the option list for accessibility purposes.\n * @localizable\n */\n @Prop() listLabel: string = loc('tecton.element.select.listLabel');\n\n /** The minimum number of rows the component will try to display below or above the component when opened. */\n @Prop() minRows: number = 3;\n\n /** Enables text wrapping for `q2-option` elements. When `false`, the text truncates and does not wrap. */\n @Prop({ reflect: true }) multilineOptions: boolean = false;\n\n /** Enables multi-select functionality. */\n @Prop({ reflect: true }) multiple: boolean = false;\n\n /** Appends \"(optional)\" to the field label, and sets `aria-required` on the nested input tag to `false`. */\n @Prop({ reflect: true }) optional: boolean = false;\n\n /**\n * Text that appears within the field when it is blurred and empty.\n * Placeholder text disappears when the user selects an option.\n * @localizable\n */\n @Prop({ reflect: true }) placeholder: string;\n\n /** @deprecated */\n @Prop({ reflect: true }) popDirection: 'up' | 'down';\n\n /**\n * Appends \"(read only)\" to the field label, and field becomes unusable, but remains focusable.\n * Takes priority over `optional` if both are `true`.\n */\n @Prop({ reflect: true }) readonly: boolean = false;\n\n /** Enables search functionality. */\n @Prop({ reflect: true }) searchable: boolean = false;\n\n /**\n * Each item in this array should correspond to the value of a `q2-option` element.\n * This property is only relevant for `multiple` (i.e., multi-select) implementations.\n */\n @Prop({ mutable: true }) selectedOptions: string[] = [];\n\n /**\n * The current value for the select. This should correspond to the value of a nested q2-option element.\n * This property is only relevant for single-select implementations.\n */\n @Prop({ mutable: true }) value: string;\n\n /** @deprecated */\n @Prop({ reflect: true, mutable: true }) ariaLabel: string;\n\n @Element() hostElement: HTMLElement;\n\n @State() open: boolean = false;\n @State() showSelected: boolean = false;\n @State() searchText: string = '';\n @State() hasCustomDisplay: boolean = false;\n @State() hasPopoverTop: boolean = false;\n @State() hasPopoverBottom: boolean = false;\n @State() inputFocused: boolean = false;\n @State() statusMessage: string;\n @State() prioritizeSearch: boolean = false;\n @State() structuredSelectedOptions: IOptionValue[] = [];\n\n inputField?: HTMLQ2InputElement;\n optionList: HTMLQ2OptionListElement;\n popoverElement?: HTMLQ2PopoverElement;\n popoverTopContainer?: HTMLDivElement;\n scheduledAfterRender: (() => void)[] = [];\n mutationObserver: MutationObserver;\n\n /// Lifecycle Hooks ///\n componentWillLoad() {\n handleAriaLabel(this);\n this.buildStructuredSelectedOptions();\n this.handleMultilineOptionsUpdate(this.multilineOptions, false);\n }\n\n componentDidLoad() {\n const observer = new MutationObserver(this.onMutationObserved);\n observer.observe(this.hostElement, { childList: true, subtree: true });\n this.mutationObserver = observer;\n this.onMutationObserved();\n overrideFocus(this.hostElement);\n setTimeout(() => this.checkSelectedDisplay(), 0);\n }\n\n componentDidRender() {\n setTimeout(() => {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n }, 25);\n }\n\n disconnectedCallback() {\n this.mutationObserver?.disconnect();\n this.mutationObserver = null;\n }\n\n /// Getters ///\n get innerInputField(): HTMLInputElement | HTMLButtonElement {\n return this.inputField?.shadowRoot?.querySelector('.input-field');\n }\n\n get innerInputContainer(): HTMLElement {\n return this.inputField?.shadowRoot?.querySelector('.input-container');\n }\n\n get badgeValue(): string {\n if (!this.multiple) return null;\n const optionsLength = this.selectedOptions?.length ?? 0;\n if (this.open && this.searchable) return optionsLength ? `${optionsLength}` : null;\n else return optionsLength > 1 ? `+${optionsLength - 1}` : null;\n }\n\n get popoverMinHeight() {\n const { minRows } = this;\n const firstOption = this.hostElement.querySelector<HTMLQ2OptionElement>('q2-option:not([hidden])');\n let minHeight = firstOption && window.getComputedStyle(firstOption).minHeight;\n\n // Safari doesn't return a min-height for non-visible items\n if (!minHeight || minHeight === '0px') minHeight = '44px';\n\n return minRows * parseInt(minHeight);\n }\n\n get selectedDisplay() {\n if (this.prioritizeSearch || this.searchText) return this.searchText;\n if (this.hasCustomDisplay) return '';\n return this.multiple ? this.calculateMultiSelectSelectedDisplay() : this.calculateSingleSelectSelectedDisplay();\n }\n\n get selectedDisplaySlot() {\n return this.hostElement.querySelector<HTMLElement>('[slot=\"_selected-display\"]');\n }\n\n get firstSelectedValue() {\n return this.multiple ? this.selectedOptions?.[0] : this.value;\n }\n\n get firstSelectedOptionElement() {\n const { firstSelectedValue } = this;\n return firstSelectedValue ? this.optionElements.find(({ value }) => value === firstSelectedValue) : null;\n }\n\n get optionElements() {\n return Array.from(this.hostElement.querySelectorAll<HTMLQ2OptionElement>('q2-option'));\n }\n\n get wrapperClasses() {\n const { errors } = this;\n const classes = ['q2-select-container'];\n if (Array.isArray(errors) && errors.length > 0) classes.push('has-error');\n if (this.inputFocused) classes.push('is-focused');\n if (this.searchable) classes.push('is-searchable');\n return classes.join(' ');\n }\n\n /// Watchers ///\n @Watch('value')\n @Watch('selectedOptions')\n buildStructuredSelectedOptions() {\n const { multiple, selectedOptions, value } = this;\n if (multiple) {\n this.structuredSelectedOptions = !!selectedOptions?.length\n ? selectedOptions.map(option => (typeof option === 'string' ? { value: option } : option))\n : [];\n } else {\n this.structuredSelectedOptions = value ? [{ value }] : [];\n }\n }\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n @Watch('value')\n valueUpdated() {\n if (this.multiple) return;\n this.clearSearchText();\n }\n\n @Watch('multilineOptions')\n handleMultilineOptionsUpdate(newValue, oldValue) {\n if (newValue === oldValue) return;\n this.optionElements.forEach(element => (element.multiline = newValue));\n }\n\n @Watch('open')\n openChanged(isOpen: boolean) {\n this.scheduledAfterRender.push(async () => {\n await waitForNextPaint();\n const { popoverTopContainer, popoverElement } = this;\n const height = (isOpen && popoverTopContainer?.offsetHeight) || 0;\n if (height) {\n popoverElement.style.setProperty('--comp-popover-top-container-height', `${height}px`);\n } else {\n popoverElement.style.removeProperty('--comp-popover-top-container-height');\n }\n });\n }\n\n /// Events ///\n /**\n * Emitted when an option is selected or deselected.\n *\n * When the multi-select is enabled, the `value` property will be `undefined` and the `selectedOptions` property\n * will contain the selected option values.\n *\n * @legacyEvent\n */\n @Event() change: EventEmitter<{ value: string; selectedOptions: string[] }>;\n\n /**\n * Emitted when the input value changes.\n *\n * Requires the `searchable` prop to be set to `true`.\n */\n @Event() input: EventEmitter<{ query: string }>;\n\n /// Methods ///\n _togglePopover() {\n const { innerInputField } = this;\n innerInputField?.click();\n innerInputField?.focus();\n innerInputField.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 || this.disabled) 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 || this.disabled) return;\n this._togglePopover();\n }\n\n /**\n * Emulates clicking the `<input>` to display the popover and selecting the option(s) with the specified value(s).\n *\n * If the multi-select is enabled and the `closePopover` argument is `true` (default), the popover will be closed\n * after the option(s) are selected.\n *\n * @testOnly\n */\n @Method()\n async setValue(values: string | string[], options: { closePopover?: boolean } = { closePopover: true }) {\n const valuesSet = new Set(Array.isArray(values) ? values : [values]);\n if (!this.open) {\n await this.openPopover();\n await waitForNextPaint();\n }\n\n valuesSet.forEach(value => {\n this.optionElements.find(option => option.value === value)?.click();\n });\n\n if (options.closePopover) {\n await this.closePopover();\n await waitForNextPaint();\n }\n }\n\n /**\n * Emulates focusing the `<input>`, entering the provided value, and emitting an `input` event.\n *\n * @warning\n * Only applicable when the input is searchable.\n *\n * @testOnly\n */\n @Method()\n searchOptions(query: string) {\n if (!this.searchable) return;\n\n const { innerInputField } = this;\n innerInputField.focus();\n innerInputField.dispatchEvent(new FocusEvent('focus'));\n innerInputField.value = query;\n innerInputField.dispatchEvent(new InputEvent('input'));\n }\n\n /// Listeners ///\n @Listen('keydown')\n keydownHandler(event: KeyboardEvent) {\n this.inputKeydownHandler(event);\n }\n\n @Listen('change')\n onHostElementChange(event: CustomEvent<{ value: string; selectedOptions: string[] }>) {\n if (this.readonly || this.disabled) return;\n if (event.target !== this.hostElement || this.hostElement.onchange) return;\n if (this.multiple) {\n this.value = null;\n this.selectedOptions = event.detail.selectedOptions;\n } else {\n this.value = event.detail.value;\n this.selectedOptions = [];\n }\n }\n\n @Listen('input')\n onHostElementInput(event: CustomEvent) {\n if (!this.searchable || event.target !== this.hostElement || this.hostElement.oninput) return;\n const options = this.optionElements;\n const query = this.searchText.trim().toLocaleLowerCase();\n let matchedCount = 0;\n options.forEach(option => {\n if (query === '') {\n option.hidden = false;\n return;\n }\n\n const title =\n option.firstElementChild?.tagName === 'Q2-CARD'\n ? (option.firstElementChild as HTMLQ2CardElement).title\n : null;\n const { display = '', innerText = '' } = option;\n const searchParams = [display, title, innerText];\n const matched = searchParams.some(text => text?.toLocaleLowerCase().includes(query) ?? false);\n\n option.hidden = !matched;\n if (matched) matchedCount++;\n });\n\n const statusMessageLocString = query\n ? 'tecton.element.select.searchable.results'\n : 'tecton.element.select.allOptions';\n const count = query ? matchedCount : options.length;\n this.setStatusMessage(loc(statusMessageLocString, [count]));\n }\n\n @Listen('focus')\n delegateFocus(event: FocusEvent) {\n const fromHost = isRelatedTargetWithinHost(event, this.hostElement);\n const prioritizeSearch = (this.prioritizeSearch = fromHost && this.searchable);\n if (prioritizeSearch) {\n this.clearSelectedDisplay();\n } else if (isEventFromElement(event, this.hostElement)) {\n this.inputField.shadowRoot.querySelector<HTMLElement>('.input-field').focus();\n }\n }\n\n @Listen('focusout')\n handleFocusout(event: FocusEvent) {\n const isLeavingHost = isHostLosingFocus(event, this.hostElement);\n if (isLeavingHost) this.closeDropdown();\n this.prioritizeSearch = !isLeavingHost && this.searchable;\n }\n\n @Listen('displayChanged')\n handleSelectedDisplay(event: CustomEvent) {\n if (this.multiple) return;\n this.inputField.value = event.detail.display;\n }\n\n /// Helpers ///\n async executeActionSheet(event: MouseEvent | KeyboardEvent) {\n const result = await showActionSheetList(this, event);\n this.handleSelectionChanges(result);\n }\n\n handleSelectionChanges(changeDetails: { value?: string; values?: IOptionValue[] }) {\n const { value = '', values = [] } = changeDetails;\n const selectedOptionValues = values.map(value => value.value);\n const { multiple } = this;\n if (!this.hostElement.onchange) {\n this.selectedOptions = selectedOptionValues;\n }\n\n this.change.emit({\n value: multiple ? undefined : value,\n selectedOptions: multiple ? selectedOptionValues : undefined,\n });\n }\n\n showSelectedOptions = () => {\n this.showSelected = true;\n };\n\n showAllOptions = () => {\n this.showSelected = false;\n };\n\n clearValue() {\n const { multiple } = this;\n this.value = '';\n this.selectedOptions = [];\n this.change.emit({ value: multiple ? undefined : '', selectedOptions: multiple ? [] : undefined });\n }\n\n calculateMultiSelectSelectedDisplay() {\n const { firstSelectedOptionElement, firstSelectedValue, multilineOptions } = this;\n if (!firstSelectedValue) return '';\n if (firstSelectedOptionElement?.display) return loc(firstSelectedOptionElement.display);\n if (multilineOptions && this.searchable) return this.searchText;\n if (multilineOptions) return '';\n return (\n firstSelectedOptionElement?.textContent?.trim() ?? firstSelectedOptionElement?.value ?? firstSelectedValue\n );\n }\n\n calculateSingleSelectSelectedDisplay() {\n const { firstSelectedOptionElement, multilineOptions } = this;\n if (multilineOptions) {\n return (firstSelectedOptionElement?.display && loc(firstSelectedOptionElement.display)) || this.value || '';\n } else {\n return (\n (firstSelectedOptionElement?.display && loc(firstSelectedOptionElement.display)) ||\n firstSelectedOptionElement?.textContent?.trim() ||\n this.value ||\n ''\n );\n }\n }\n\n onMutationObserved = () => {\n const { hostElement, hasPopoverTop, hasPopoverBottom } = this;\n const slotContainer = hostElement.querySelector('.custom-display-content');\n const displaySlot = hostElement.shadowRoot.querySelector<HTMLSlotElement>('slot[name=\"q2-select-display\"]');\n const hasCustomDisplay = !!displaySlot\n ? displaySlot.assignedNodes().length > 0\n : slotContainer.children.length > 0;\n\n if (this.hasCustomDisplay !== hasCustomDisplay) {\n this.hasCustomDisplay = hasCustomDisplay;\n }\n\n const popTopSlot = hostElement.shadowRoot.querySelector<HTMLSlotElement>('slot[name=\"popover-top\"]');\n const topSlotHasNode = popTopSlot.assignedNodes().length > 0;\n if (hasPopoverTop !== topSlotHasNode) {\n this.hasPopoverTop = topSlotHasNode;\n }\n\n const popBottomSlot = hostElement.shadowRoot.querySelector<HTMLSlotElement>('slot[name=\"popover-bottom\"]');\n const bottomSlotHasNode = popBottomSlot.assignedNodes().length > 0;\n if (hasPopoverBottom !== bottomSlotHasNode) {\n this.hasPopoverBottom = bottomSlotHasNode;\n }\n\n this.checkSelectedOptions();\n };\n\n onOptionListChange = (event: Q2OptionListCustomEvent<{ value: string; values: IOptionValue[] }>) => {\n event.stopPropagation();\n const { values } = event.detail;\n\n if (values.length === 0) this.showAllOptions();\n this.handleSelectionChanges(event.detail);\n };\n\n openDropdownWithoutActiveElement() {\n if (this.readonly || this.disabled) return;\n this.optionList.setActiveElement(null);\n this.open = true;\n }\n\n closeDropdown() {\n this.open = false;\n this.clearSearchText();\n }\n\n clearSearchText() {\n if (!this.searchText) return;\n this.searchText = '';\n this.input.emit({ query: '' });\n }\n\n toggleDropdown() {\n if (this.readonly || this.disabled) return;\n\n if (this.open && !this.searchText) {\n this.closeDropdown();\n } else {\n this.openDropdownWithoutActiveElement();\n }\n }\n\n focusInput() {\n this.inputField?.dispatchEvent(new FocusEvent('focus'));\n }\n\n statusMessageTimer: NodeJS.Timeout;\n setStatusMessage(message) {\n clearTimeout(this.statusMessageTimer);\n this.statusMessage = '';\n this.statusMessageTimer = setTimeout(() => {\n this.statusMessage = message;\n }, 1000);\n }\n\n checkSelectedOptions() {\n const { multiple, selectedOptions, value } = this;\n this.optionElements.forEach(option => {\n if (multiple) {\n option.selected = selectedOptions.includes(option.value);\n } else {\n option.selected = option.value === value;\n }\n });\n }\n\n clearSelectedDisplay() {\n this.selectedDisplaySlot?.remove();\n }\n\n checkSelectedDisplay() {\n let namedSlot = this.selectedDisplaySlot;\n const { value, multiple, selectedOptions, multilineOptions, firstSelectedOptionElement, prioritizeSearch } =\n this;\n const hasNoValue = !value && multiple && !selectedOptions?.length;\n if (prioritizeSearch || !multilineOptions || hasNoValue) return this.clearSelectedDisplay();\n\n if (!firstSelectedOptionElement || firstSelectedOptionElement.display) return this.clearSelectedDisplay();\n\n // Clone selected option and remove elements with hide-on-select attribute\n const selectionClone = firstSelectedOptionElement.firstElementChild.cloneNode(true) as HTMLElement;\n selectionClone.querySelectorAll('[hide-on-select]').forEach(element => element.remove());\n\n if (namedSlot) {\n const height = namedSlot.clientHeight === 0 ? 'auto' : `${namedSlot.clientHeight}px`;\n namedSlot.style.setProperty('--comp-selected-display-height', height);\n if (namedSlot.firstElementChild.outerHTML !== selectionClone.outerHTML) {\n namedSlot.replaceChild(selectionClone, namedSlot.firstElementChild);\n }\n } else {\n namedSlot = document.createElement('div');\n namedSlot.slot = '_selected-display';\n namedSlot.appendChild(selectionClone);\n this.hostElement.appendChild(namedSlot);\n }\n return namedSlot;\n }\n\n checkSelectedDisplayHeight() {\n const { selectedDisplaySlot } = this;\n if (!selectedDisplaySlot) return;\n selectedDisplaySlot.style.setProperty('--comp-selected-display-height', '44px');\n }\n\n /// Event handlers ///\n onPopoverState = ({\n detail: { open, action },\n }: CustomEvent<{ open: boolean; action: 'close' | 'select' | 'open' }>) => {\n if (!open || this.searchText) {\n if (action !== 'select') {\n this.optionList.setActiveElement(null);\n }\n this.inputField.focus();\n }\n\n if (this.open === open) return;\n this.open = open;\n };\n\n inputKeydownHandler = (event: KeyboardEvent) => {\n if (this.readonly || this.disabled) return;\n const key = event.key;\n const hasSlot = this.hasPopoverTop || this.hasPopoverBottom;\n const isShiftTab = key === 'Tab' && event.shiftKey;\n if (hasSlot && (key === 'Tab' || key === 'Enter' || isShiftTab)) return;\n if (shouldShowActionSheet(this, event)) {\n return this.executeActionSheet(event);\n }\n\n const keysForOptionListToHandle = [\n 'ArrowDown',\n 'ArrowUp',\n 'PageDown',\n 'PageUp',\n 'Home',\n 'End',\n 'Escape',\n 'Tab',\n ];\n if (this.searchable && !keysForOptionListToHandle.includes(key)) return;\n if (this.shouldClearSearchText(event)) this.clearSearchText();\n\n // Prevent click event from firing when spacebar is pressed\n if (key === ' ') event.preventDefault();\n\n this.optionList.handleExternalKeydown(event);\n };\n\n shouldClearSearchText(event: KeyboardEvent) {\n return this.searchable && !!this.searchText && event.key === 'Escape';\n }\n\n visibilityToggleKeyDown = (event: KeyboardEvent) => {\n const key = event.key;\n const isShiftTab = key === 'Tab' && event.shiftKey;\n const isRadioControlKey = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(key);\n if (isRadioControlKey) event.stopPropagation();\n if (isShiftTab) {\n event.stopPropagation();\n // allows shift+tab keys to select the top slot when present\n if (this.hasPopoverTop) return;\n\n this.optionList.setDefaultActiveElement();\n }\n };\n\n inputClickHandler = async (event: MouseEvent) => {\n event.stopPropagation();\n if (shouldShowActionSheet(this)) {\n return this.executeActionSheet(event);\n }\n this.toggleDropdown();\n this.focusInput();\n };\n\n inputInputHandler = (event: Q2InputCustomEvent<IEventDetail> & InputEvent) => {\n event.stopPropagation();\n const eventValue = event.detail.value;\n const shouldClearValue = !!this.value;\n\n if (shouldClearValue) this.clearValue();\n if (!this.open) this.openDropdownWithoutActiveElement();\n\n this.prioritizeSearch = true;\n this.searchText = eventValue;\n this.input.emit({ query: eventValue });\n };\n\n inputFocusHandler = () => {\n this.inputFocused = true;\n };\n\n inputBlurHandler = () => {\n this.inputFocused = false;\n };\n\n inputChangeHandler = (event: Event) => {\n event.stopPropagation();\n };\n\n clickedElsewhere = (event: CustomEvent) => {\n const target = event.target as HTMLClickElsewhereElement;\n if (target.localName !== 'click-elsewhere') return;\n event.stopPropagation();\n if (!this.open) return;\n this.closeDropdown();\n };\n\n onCustomDisplayClick = (event: MouseEvent) => {\n event.stopPropagation();\n this.focusInput();\n this.toggleDropdown();\n };\n\n /// DOM ///\n renderCustomDisplay() {\n const hasSelectedDisplay = this.checkSelectedDisplay();\n if (!hasSelectedDisplay) return;\n this.checkSelectedDisplayHeight();\n\n return (\n <slot\n name=\"_selected-display\"\n slot=\"custom-display\"\n />\n );\n }\n\n render() {\n const showAsPseudo = !this.searchable;\n\n return (\n <click-elsewhere\n class={this.wrapperClasses}\n onChange={this.clickedElsewhere}\n >\n <div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n role=\"status\"\n class=\"sr\"\n >\n {this.statusMessage}\n </div>\n <q2-input\n ref={el => (this.inputField = el)}\n class=\"q2-select-input\"\n label={(this.label && loc(this.label)) || ''}\n value={this.selectedDisplay}\n errors={\n (Array.isArray(this.errors) &&\n this.errors.length > 0 &&\n this.errors.map(error => loc(error))) ||\n (this.invalid && ['tecton.element.select.invalid']) ||\n []\n }\n disabled={this.disabled}\n optional={this.optional}\n readonly={this.readonly}\n placeholder={this.placeholder || undefined}\n hideLabel={this.hideLabel}\n ariaExpanded={`${this.open}`}\n ariaControls=\"option-list\"\n ariaHaspopup=\"listbox\"\n role=\"combobox\"\n pseudo={showAsPseudo}\n test-id=\"toggleDropdown\"\n hide-messages\n iconRight=\"chevron-down\"\n onClick={this.inputClickHandler}\n onInput={this.inputInputHandler}\n onKeyDown={this.inputKeydownHandler}\n onFocus={this.inputFocusHandler}\n onBlur={this.inputBlurHandler}\n onChange={this.inputChangeHandler}\n badgeValue={this.badgeValue}\n badgeTheme={this.inputFocused ? 'primary' : undefined}\n >\n {this.renderCustomDisplay()}\n </q2-input>\n <div\n class=\"custom-display-content\"\n hidden={!this.hasCustomDisplay || !!this.searchText}\n onClick={this.onCustomDisplayClick}\n >\n <slot name=\"q2-select-display\" />\n </div>\n {this.optionsDropdown()}\n </click-elsewhere>\n );\n }\n\n optionsDropdown() {\n return (\n <q2-popover\n ref={el => (this.popoverElement = el)}\n controlElement={this.innerInputContainer}\n open={this.open}\n minHeight={this.popoverMinHeight}\n direction={this.popDirection}\n block\n >\n <div class=\"popover-content\">\n <q2-option-list\n onPopoverState={this.onPopoverState}\n ref={el => (this.optionList = el)}\n type=\"listbox\"\n id=\"option-list\"\n show-selected={this.showSelected}\n label={this.listLabel}\n multiple={this.multiple}\n selectedOptions={this.structuredSelectedOptions}\n onChange={this.onOptionListChange}\n >\n <slot />\n </q2-option-list>\n <div\n class=\"popover-top-container\"\n ref={el => (this.popoverTopContainer = el)}\n hidden={!this.multiple && !this.hasPopoverTop}\n tabindex=\"-1\"\n >\n <slot name=\"popover-top\"></slot>\n {this.multiple && this.visibilityToggle()}\n </div>\n </div>\n <div\n class=\"popover-bottom-container\"\n hidden={!this.hasPopoverBottom}\n tabindex=\"-1\"\n >\n <slot name=\"popover-bottom\" />\n </div>\n </q2-popover>\n );\n }\n\n visibilityToggle() {\n const selectedOptionsCount = this.selectedOptions?.length ?? 0;\n const { showSelected } = this;\n return (\n <div class=\"multi-select-header\">\n <fieldset>\n <legend aria-label={loc('tecton.element.select.multiHeader.showing')}>\n {loc('tecton.element.select.multiHeader.showing')}\n </legend>\n <div>\n <input\n class=\"sr\"\n type=\"radio\"\n id=\"all\"\n name=\"viewDisplay\"\n value=\"all\"\n checked={!showSelected}\n aria-label={loc('tecton.element.select.multiHeader.allAriaLabel')}\n test-id=\"allOptionsButton\"\n onClick={this.showAllOptions}\n onKeyDown={this.visibilityToggleKeyDown}\n />\n <label htmlFor=\"all\">{loc('tecton.element.select.multiHeader.all')}</label>\n </div>\n\n <div>\n <input\n class=\"sr\"\n type=\"radio\"\n id=\"selected\"\n disabled={selectedOptionsCount === 0}\n name=\"viewDisplay\"\n value=\"selected\"\n aria-label={loc('tecton.element.select.multiHeader.selectedAriaLabel', [\n selectedOptionsCount,\n ])}\n checked={showSelected}\n test-id=\"selectedOptionsButton\"\n onClick={this.showSelectedOptions}\n onKeyDown={this.visibilityToggleKeyDown}\n />\n <label htmlFor=\"selected\">\n {loc('tecton.element.select.multiHeader.selected', [selectedOptionsCount])}\n </label>\n </div>\n </fieldset>\n </div>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["q2BtnCss","Q2BtnStyle0","Q2Btn","this","handleButtonSize","Number","size","handleDeprecationWarning","handleSlotChange","handleIcons","icon","Array","from","hostElement","querySelectorAll","reduce","acc","element","remove","hasIcon","hasLoc","querySelector","hasText","textContent","trim","hasIconLeft","firstElementChild","hasIconRight","lastElementChild","hasIconOnly","iconPosition","renderButton","ariaExpanded","ariaHasPopup","ariaSelected","ariaPressed","description","disabled","type","tabindex","buttonAttributes","loading","badge","label","hideLabel","renderLoadingSpinner","isLoadingSpinnerInline","h","Fragment","ref","el","primaryBtn","loc","class","undefined","hidden","modifiers","onSlotchange","id","render","primaryBtnWrapper","tabIndex","componentWillLoad","handleAriaLabel","handleColor","componentDidLoad","overrideFocus","disable","ev","stopImmediatePropagation","focus","handleClick","delegateFocus","event","isEventFromElement","ariaLabelObserver","sizeObserver","getAriaValueFromProp","ariaLabel","q2LoadingCss","Q2LoadingStyle0","Q2Loading","halfCircleSpinner","localizedLabel","spinner","skeletonLoader","shape","skeletonShape","loader","loaderMap","default","skeleton","modifiersSet","Set","split","countsArray","counts","map","_b","_a","skeletonShapes","call","shapes","spinnerShape","spinnerMap"],"sources":["src/components/q2-btn/q2-btn.scss?tag=q2-btn&encapsulation=shadow","src/components/q2-btn/q2-btn.tsx","src/components/q2-loading/q2-loading.scss?tag=q2-loading&encapsulation=shadow","src/components/q2-loading/q2-loading.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import './q2-btn-mixins';\n\n:host {\n display: inline-block;\n}\n\n:host([hidden]) {\n display: none;\n}\n\n:host([block]) {\n display: block;\n width: 100%;\n}\n\n::slotted(q2-icon) {\n pointer-events: none;\n}\n\n:host {\n --comp-font-weight: 600;\n --comp-border-radius: #{var-list(--tct-btn-border-radius, --app-border-radius-1, 3px)};\n --comp-btn-tween: #{var-list(var-prefixer(btn-tween), --tct-tween-1, --app-tween-1, unquote('0.2s ease'))};\n --comp-btn-fallback-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);\n --comp-background-alternative: #ebf8ff;\n .btn-height-wrapper {\n height: var(--comp-btn-min-height, 44px);\n cursor: pointer;\n &:active {\n box-shadow: none;\n }\n }\n}\n\nbutton {\n margin: var-list(--tct-scale-0, --app-scale-0x, 0);\n padding: var-list(--tct-scale-0, --app-scale-0x, 0);\n display: inline-block;\n width: 100%;\n hyphens: auto;\n border: var(--tct-btn-border);\n border-radius: var(--tct-btn-border-radius);\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n font-weight: 400;\n color: inherit;\n cursor: pointer;\n transition: var(--comp-btn-tween);\n transition-property: background, color, box-shadow, fill, border-color, border-width;\n outline: 0;\n &:disabled {\n opacity: var-list(var-prefixer(btn-disabled-opacity), --tct-disabled-opacity, --app-disabled-opacity, 0.4);\n cursor: not-allowed;\n }\n\n // Sizes\n :host([color]:not([size])) &,\n :host([intent]:not([size])) & {\n padding: var-list(var-prefixer(btn-padding), --tct-scale-2, --app-scale-2x, 10px);\n }\n :host([size='1']) & {\n padding: var-list(--tct-scale-1, --app-scale-1x, 5px);\n }\n :host([size='2']) & {\n padding: var-list(--tct-scale-2, --app-scale-2x, 10px);\n }\n :host([size='3']) & {\n padding: var-list(--tct-scale-3, --app-scale-3x, 15px);\n }\n :host([size='4x']) & {\n padding: var-list(--tct-scale-4x, --app-scale-4x, 20px);\n }\n :host([size='4']) & {\n padding: var-list(--tct-scale-6x, --app-scale-6x, 30px);\n }\n\n // Colors\n :host([color]) &,\n :host([intent]) & {\n font-size: var-list(var-prefixer(btn-font-size), inherit);\n border-radius: var-list(--tct-btn-border-radius, --comp-border-radius);\n text-transform: var-list(--tct-btn-text-transform, --comp-text-transform);\n letter-spacing: var-list(--tct-btn-letter-spacing, --comp-letter-spacing);\n }\n\n :host([size='small']) & {\n padding: var-list(var-prefixer(btn-padding-size-small), '4px 16px');\n font-size: var-list(var-prefixer(btn-font-size-small), 14px);\n }\n :host([size='medium']) & {\n padding: var-list(var-prefixer(btn-padding-size-medium), '12px 24px');\n font-size: var-list(var-prefixer(btn-font-size-medium), 16px);\n }\n :host([size='large']) & {\n padding: var-list(var-prefixer(btn-padding-size-large), '16px 32px');\n font-size: var-list(var-prefixer(btn-font-size-large), 20px);\n }\n\n :host([color='primary']) &,\n :host([intent='workflow-primary']) & {\n --comp-background: #{var-list(\n --tct-btn-primary-background,\n --tct-btn-primary-bg,\n --t-a11y-active-gray-color-AA,\n #404040\n )};\n --comp-hover-background: #{var-list(--tct-btn-primary-hover-background, --tct-btn-primary-hover-bg)};\n --comp-font-color: #{var-list(--tct-btn-primary-font-color, --app-white, #ffffff)};\n --comp-box-shadow: #{var-list(--tct-btn-primary-box-shadow, --comp-btn-fallback-box-shadow)};\n --comp-focus-box-shadow: #{var-list(--tct-btn-primary-focus-box-shadow, --comp-btn-fallback-box-shadow)};\n // different background for active\n --comp-active-background: var(--tct-btn-primary-active-background, #0063a0);\n @include btn-ring(primary, hover, --comp-background, --comp-font-color, null);\n @include btn-ring(primary, active, transparent, transparent, --comp-box-shadow);\n @include btn-ring(primary, disabled, transparent, transparent, --comp-box-shadow);\n @include btn-ring(primary, focus-visible, --const-focus-color, --comp-font-color, null);\n @include btn-intent(primary);\n @include btn-icon-color(primary, --comp-font-color);\n }\n\n :host([color='secondary']) &,\n :host([intent='workflow-secondary']) & {\n --comp-background: #{var-list(\n --tct-btn-secondary-background,\n --tct-btn-secondary-bg,\n --t-button-default-bg,\n #cccccc\n )};\n --comp-hover-background: #{var-list(\n --tct-btn-secondary-hover-background,\n --tct-btn-secondary-hover-bg,\n --t-a11y-active-gray-color-AA,\n #404040\n )};\n --comp-hover-font-color: var(--app-white, #ffffff);\n --comp-box-shadow: #{var-list(--tct-btn-secondary-box-shadow, --comp-btn-fallback-box-shadow)};\n --comp-focus-box-shadow: #{var-list(--tct-btn-secondary-focus-box-shadow, --comp-btn-fallback-box-shadow)};\n @include btn-ring(secondary, hover, --comp-hover-background, --app-white, null);\n @include btn-ring(secondary, active, transparent, transparent, --comp-box-shadow);\n @include btn-ring(secondary, disabled, transparent, transparent, --comp-box-shadow);\n @include btn-ring(secondary, focus-visible, --const-focus-color, --app-white, null);\n @include btn-intent(secondary);\n @include btn-icon-color(secondary, --comp-font-color);\n }\n\n :host([intent='workflow-destroy']) & {\n --comp-background: #{var-list(--tct-btn-destroy-background, --const-stoplight-alert, #d20a0a)};\n --comp-font-color: #{var-list(--tct-btn-destroy-font-color, --app-white)};\n --comp-box-shadow: #{var-list(--tct-btn-destroy-box-shadow, --comp-btn-fallback-box-shadow)};\n --comp-focus-box-shadow: #{var-list(--tct-btn-destroy-focus-box-shadow, --comp-btn-fallback-box-shadow)};\n @include btn-ring(destroy, hover, --comp-background, --comp-font-color, null);\n @include btn-ring(destroy, active, transparent, transparent, --comp-box-shadow);\n @include btn-ring(destroy, disabled, transparent, transparent, --comp-box-shadow);\n @include btn-ring(destroy, focus-visible, --const-focus-color, --comp-font-color, null);\n @include btn-intent(destroy);\n @include btn-icon-color(destroy, --comp-font-color);\n }\n\n :host([intent='workflow-escape']) & {\n --comp-background: #{var-list(--tct-btn-escape-background, --app-white, #ffffff)};\n --comp-font-color: #{var-list(\n --tct-btn-escape-font-color,\n --tct-btn-primary-background,\n --tct-btn-primary-bg,\n --t-a11y-active-gray-color-AA,\n #404040\n )};\n --comp-box-shadow: #{var-list(--tct-btn-escape-box-shadow, --comp-btn-fallback-box-shadow)};\n --comp-hover-box-shadow: #{var-list(--tct-btn-escape-hover-box-shadow, --comp-btn-fallback-box-shadow)};\n --comp-focus-box-shadow: #{var-list(--tct-btn-escape-focus-box-shadow, --comp-btn-fallback-box-shadow)};\n // different background for hover/active/focus\n --comp-hover-background: #{var-list(--tct-btn-escape-hover-background, --comp-background-alternative)};\n --comp-active-background: #{var-list(--tct-btn-escape-active-background, --comp-background-alternative)};\n --comp-focus-background: #{var-list(--tct-btn-escape-focus-background, --comp-background-alternative)};\n @include btn-ring(escape, hover, --comp-font-color, --comp-background, null);\n @include btn-ring(escape, active, transparent, transparent, --comp-box-shadow);\n @include btn-ring(escape, disabled, transparent, transparent, --comp-box-shadow);\n @include btn-ring(escape, focus-visible, --const-focus-color, --comp-background, null);\n @include btn-intent(escape);\n @include btn-icon-color(escape, --comp-font-color);\n }\n\n :host([intent='neutral']) & {\n --comp-background: #{var-list(--tct-btn-neutral-background, --app-white, #ffffff)};\n --comp-font-color: #{var-list(\n --tct-btn-neutral-font-color,\n --tct-btn-primary-background,\n --tct-btn-primary-bg,\n --t-a11y-active-gray-color-AA,\n #404040\n )};\n --comp-box-shadow: #{var-list(--tct-btn-neutral-box-shadow, --comp-btn-fallback-box-shadow)};\n --comp-focus-box-shadow: #{var-list(--tct-btn-neutral-focus-box-shadow, --comp-btn-fallback-box-shadow)};\n // use outline instead border: because on/off border makes the button shaking on hover/focus/active\n --comp-border-width: 1px;\n --comp-border-style: solid;\n --comp-border-color: var(--comp-font-color);\n @include btn-ring(neutral, hover, --comp-font-color, --app-white, null);\n @include btn-ring(neutral, active, transparent, transparent, --comp-box-shadow);\n @include btn-ring(neutral, disabled, transparent, transparent, --comp-box-shadow);\n @include btn-ring(neutral, focus-visible, --const-focus-color, --comp-background, null);\n @include btn-intent(neutral);\n @include btn-icon-color(neutral, --comp-font-color);\n }\n\n :host([intent='neutral-text']) & {\n --comp-background: #{var-list(\n --tct-btn-neutral-text-background,\n --tct-btn-neutral-text-bg,\n --app-white,\n #ffffff\n )};\n --comp-font-color: #{var-list(\n --tct-btn-neutral-text-font-color,\n --tct-btn-primary-background,\n --tct-btn-primary-bg,\n --t-a11y-active-gray-color-AA,\n #404040\n )};\n --comp-box-shadow: var(--tct-btn-neutral-text-box-shadow);\n --comp-hover-text-decoration: underline;\n // different background for focus\n --comp-focus-background: #{var-list(--tct-btn-neutral-text-focus-background, --comp-background-alternative)};\n @include btn-ring(neutral-text, hover, --comp-font-color, --comp-background, null);\n @include btn-ring(neutral-text, active, transparent, transparent, --comp-box-shadow);\n @include btn-ring(neutral-text, disabled, transparent, transparent, --comp-box-shadow);\n @include btn-ring(neutral-text, focus-visible, --const-focus-color, --app-white, null);\n @include btn-intent(neutral-text);\n @include btn-icon-color(neutral-text, --comp-font-color);\n }\n\n // Icons\n :host(:not([size])) &.icon-only {\n width: var-list(var-prefixer(btn-icon-width), 44px);\n height: var-list(var-prefixer(btn-icon-height), 44px);\n border-radius: var-list(var-prefixer(btn-icon-border-radius), --tct-btn-border-radius, 0);\n }\n\n :host(:not([color]):not([intent])),\n &.icon-only {\n &:hover,\n &:focus {\n background: var-list(\n --tct-btn-icon-hover-background,\n var-prefixer(btn-icon-hover-bg),\n var-prefixer(gray-13),\n --tct-gray-l3,\n --app-gray-l3,\n #f2f2f2\n );\n }\n }\n\n :host(:not([intent])[active]) &.icon-only {\n background-color: var-list(\n --tct-btn-icon-active-background,\n var-prefixer(btn-icon-active-bg),\n var-prefixer(gray-14),\n --tct-gray-l3,\n --app-gray-l3,\n #f2f2f2\n );\n }\n\n :host(:not([intent])) &.icon-only:hover *,\n :host(:not([intent])) &.icon-only:focus *,\n :host(:not([intent])[active]) &.icon-only * {\n color: var-list(var-prefixer(btn-icon-hover-color), var-prefixer(link-hover-color), #080808);\n }\n\n // Plain\n :host(:not([intent])) &:not(.icon-only) {\n height: var-list(--tct-btn-height, auto);\n padding-inline: var-list(--tct-btn-padding-inline, 0);\n font-weight: var-list(--tct-btn-font-weight);\n border-radius: var-list(--tct-btn-border-radius, 0);\n\n &:hover,\n &:focus {\n background: var(--tct-btn-hover-background);\n }\n }\n\n // Badges\n :host([badge]) & {\n padding: var-list(var-prefixer(btn-badge-padding), unquote('2px 5px'));\n font-size: var-list(var-prefixer(btn-badge-font-size), var-prefixer(btn-font-size), inherit);\n border-radius: var-list(\n var-prefixer(btn-badge-border-radius),\n --tct-border-radius-1,\n --app-border-radius-1,\n 3px\n );\n background-color: var-list(--tct-btn-badge-background, var-prefixer(btn-badge-bg), transparent);\n color: var-list(var-prefixer(btn-badge-font-color), inherit);\n\n ::slotted(q2-icon) {\n --tct-icon-size: 1em;\n }\n }\n\n :host([badge]:hover) &:enabled {\n background-color: var-list(\n --tct-btn-badge-hover-background,\n var-prefixer(btn-badge-hover-bg),\n var-prefixer(gray-14),\n --tct-gray-l3,\n --app-gray-l3,\n #f2f2f2\n );\n color: var-list(\n var-prefixer(btn-badge-hover-font-color),\n var-prefixer(gray-5),\n --tct-gray-d2,\n --app-gray-d2,\n #404040\n );\n }\n\n :host(.selected[badge]) &,\n :host([active][badge]) & {\n background-color: var-list(\n --tct-btn-badge-active-background,\n var-prefixer(btn-badge-active-bg),\n --comp-btn-primary-background\n );\n color: var-list(var-prefixer(btn-badge-active-font-color), --comp-btn-primary-font-color);\n }\n}\n\ndiv {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var-list(--app-scale-1x, 5px);\n\n :host([loading]) .icon-right & {\n flex-direction: row-reverse;\n }\n}\n\nq2-loading {\n --tct-loading-primary-color: currentcolor;\n --tct-loading-secondary-color: currentcolor;\n --tct-loading-spinner-size: 24px;\n}\n\n:host([loading]) ::slotted(q2-icon) {\n display: none;\n}\n:host([loading]) button {\n pointer-events: none;\n}\n\n:host([block]) button,\n:host([block]) button.icon-only {\n display: block;\n width: 100%;\n}\n","import { Component, State, Prop, h, ComponentInterface, Watch, Listen, Element, Fragment } from '@stencil/core';\nimport {\n getAriaValueFromProp,\n handleAriaLabel,\n handleColor,\n isEventFromElement,\n loc,\n overrideFocus,\n handleDeprecationWarning,\n} from 'src/utils';\n\n@Component({ tag: 'q2-btn', shadow: true, styleUrl: 'q2-btn.scss' })\nexport class Q2Btn implements ComponentInterface {\n @Prop() ariaExpanded: string;\n @Prop() ariaHasPopup: string;\n @Prop() ariaControls: string;\n @Prop() ariaSelected: string;\n @Prop() ariaPressed: string;\n @Prop() description: string;\n @Prop() tabIndex: number;\n\n /**\n * Displays the component in an active state.\n *\n * @info\n * Only intended for use with the `badge` property.\n */\n @Prop({ reflect: true }) active: boolean;\n\n /** Displays the component in a smaller, badge style. */\n @Prop({ reflect: true }) badge: boolean;\n\n /** The component expands to fill the width of its parent element. */\n @Prop({ reflect: true }) block: boolean;\n\n /** Marks the component as disabled and displays a `not-allowed` cursor on hover. */\n @Prop({ reflect: true }) disabled: boolean;\n\n /**\n * Hides the `label`, and assigns its value to the `aria-label` attribute on the `<button>` element.\n */\n @Prop({ reflect: true, mutable: true }) hideLabel: boolean;\n\n /**\n * Indicates the role of the component in the workflow, which will apply appropriate styling to the component.\n */\n @Prop({ reflect: true, mutable: true }) intent:\n | 'workflow-primary'\n | 'workflow-secondary'\n | 'workflow-destroy'\n | 'workflow-escape'\n | 'neutral'\n | 'neutral-text';\n\n /**\n * Defines the text content of the button if it is not provided in the `<slot>` of the element.\n * Also used for the `aria-label` of the `<button>` element when only displaying an icon.\n *\n * @localizable\n */\n @Prop({ reflect: true, mutable: true }) label: string;\n\n /** Displays the button with a loading spinner to indicate something is happening in the background and the user should not click again. */\n @Prop({ reflect: true }) loading: boolean;\n\n /** The default behavior of the button. */\n @Prop({ reflect: true }) type: string = 'button';\n\n /** @deprecated */\n @Prop({ reflect: true }) size: string;\n /** @deprecated */\n @Prop({ reflect: true, mutable: true }) color: string; // deprecated but need it to use utils/handleColor\n /** @deprecated */\n @Prop({ reflect: true }) fab: boolean;\n /** @deprecated */\n @Prop({ reflect: true, mutable: true }) ariaLabel: string;\n\n @State() iconPosition: 'left' | 'right' | 'only';\n\n @Element() hostElement: HTMLElement;\n\n primaryBtn: HTMLButtonElement;\n primaryBtnWrapper: HTMLElement;\n ////////// LIFECYCLE HOOKS ////////\n\n componentWillLoad() {\n this.handleIcons();\n handleAriaLabel(this);\n handleColor(this);\n }\n\n componentDidLoad(): void {\n this.handleButtonSize();\n overrideFocus(this.hostElement);\n }\n\n @Listen('click', { capture: true })\n disable(ev: Event) {\n if (this.disabled) {\n ev.stopImmediatePropagation();\n }\n this.primaryBtn.focus();\n }\n\n @Listen('click', { capture: true })\n handleClick(ev: Event) {\n if (this.loading) {\n ev.stopImmediatePropagation();\n }\n this.primaryBtn.focus();\n }\n\n @Listen('focus')\n delegateFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n this.primaryBtn.focus();\n }\n\n //////// Method //////////\n\n ////////// OBSERVERS //////////\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n @Watch('size')\n sizeObserver() {\n this.handleButtonSize();\n }\n\n handleButtonSize = () => {\n if (Number(this.size) <= 4) {\n handleDeprecationWarning(this, 'size', 'prop');\n }\n };\n\n handleSlotChange = () => {\n this.handleIcons();\n };\n\n handleIcons = () => {\n // Only allow one icon in the button\n const icon = Array.from(this.hostElement.querySelectorAll(':scope > q2-icon')).reduce((acc, element) => {\n if (acc) element.remove();\n else acc = element;\n return acc;\n }, null);\n\n const hasIcon = !!icon;\n const hasLoc = !!this.hostElement.querySelector('q2-loc');\n const hasText = !!this.hostElement.textContent.trim();\n const hasIconLeft = (hasLoc || hasText) && hasIcon && this.hostElement.firstElementChild === icon;\n const hasIconRight = (hasLoc || hasText) && hasIcon && this.hostElement.lastElementChild === icon;\n const hasIconOnly = !hasIconLeft && !hasIconRight && hasIcon;\n\n let iconPosition;\n if (hasIconOnly) iconPosition = 'only';\n else if (hasIconLeft) iconPosition = 'left';\n else if (hasIconRight) iconPosition = 'right';\n this.iconPosition = iconPosition;\n };\n\n renderButton = () => {\n const { ariaExpanded, ariaHasPopup, ariaSelected, ariaPressed, description, disabled, type, tabindex } =\n this.buttonAttributes;\n const { iconPosition, loading, badge, label, hideLabel } = this;\n const renderLoadingSpinner = iconPosition || loading;\n const isLoadingSpinnerInline = !iconPosition || badge;\n return (\n <Fragment>\n <button\n ref={el => (this.primaryBtn = el ?? this.primaryBtn)}\n aria-expanded={ariaExpanded}\n aria-haspopup={ariaHasPopup}\n aria-label={hideLabel && loc(label)}\n aria-selected={ariaSelected}\n aria-pressed={ariaPressed}\n disabled={disabled}\n type={type}\n tabindex={tabindex}\n test-id=\"q2BtnInnerButton\"\n class={iconPosition ? `icon-${iconPosition}` : ''}\n aria-describedby={!!description ? 'hidden-description' : undefined}\n >\n <div>\n {renderLoadingSpinner && (\n <q2-loading\n hidden={!loading}\n modifiers={isLoadingSpinnerInline ? 'inline' : undefined}\n />\n )}\n {!hideLabel && label ? loc(label) : <slot onSlotchange={this.handleSlotChange} />}\n </div>\n </button>\n {!!description && (\n <div\n id=\"hidden-description\"\n aria-hidden=\"true\"\n class=\"sr\"\n >\n {description}\n </div>\n )}\n </Fragment>\n );\n };\n\n render = () => {\n return this.size === 'small' ? (\n // wrap only for small sized\n <div\n class=\"btn-height-wrapper\"\n ref={el => (this.primaryBtnWrapper = el ?? this.primaryBtnWrapper)}\n tabIndex={-1}\n >\n {this.renderButton()}\n </div>\n ) : (\n this.renderButton()\n );\n };\n\n get buttonAttributes() {\n return {\n ariaExpanded: getAriaValueFromProp(this.ariaExpanded, ['true', 'false']),\n ariaHasPopup: getAriaValueFromProp(this.ariaHasPopup, [\n 'true',\n 'false',\n 'menu',\n 'listbox',\n 'tree',\n 'grid',\n 'dialog',\n ]),\n ariaLabel: this.label && this.hideLabel ? loc(this.label) : undefined,\n ariaSelected: getAriaValueFromProp(this.ariaSelected, ['true', 'false']),\n ariaPressed: getAriaValueFromProp(this.ariaPressed, ['true', 'false']),\n description: this.description !== undefined ? this.description : undefined,\n disabled: this.disabled || false,\n type: this.type,\n tabindex: this.tabIndex || undefined,\n };\n }\n}\n","@import '../../styles/host.scss';\n@import '../../styles/utility.scss';\n@import '../../styles/functions';\n\n:host {\n display: block;\n}\n\n:host([inline]),\n:host([modifiers*='inline']) {\n display: inline-block;\n}\n\n:host([hidden]) {\n display: none;\n}\n\n:host(:not([inline]):not([modifiers*='inline'])) {\n font-size: var-list(var-prefixer(loading-spinner-size), --app-scale-12x, 60px);\n}\n\n.q2-loading-animation {\n height: 1em;\n width: 1em;\n}\n\n@import './spinners/half-circle-spinner.scss';\n@import './skeleton/skeleton.scss';\n","import { Component, Prop, h, ComponentInterface, Element, Watch } from '@stencil/core';\nimport { handleAriaLabel, loc } from 'src/utils';\nimport skeletonShapes from './skeleton/shapes';\n\n@Component({ tag: 'q2-loading', shadow: true, styleUrl: 'q2-loading.scss' })\nexport class Q2Loading implements ComponentInterface {\n /**\n * Numeric adjustments are available for specific `type` and `shape` combinations.\n * These may impact the number of items, columns, and/or rows that display.\n *\n * When `shape=\"text\"`, `shape=\"detailed-item\"`, or `shape=\"label-value\"`, the `counts` attribute determines the number of rows to display.\n *\n * When `shape=\"table\"`, the `counts` attribute can be used in two ways:\n *\n * 1. `counts=\"CxR\"` = Provides a skeleton table of `C` columns and `R` rows. The default value is `\"5x5\"\n * 2. `counts=\"N\"` - Provides a skeleton table of `N` columns and 5 rows.\n *\n * When `shape=\"form\"`, the `counts` attribute can be used in two ways:\n *\n * 1. `count=\"CxR\" - Provides a skeleton form of `C` columns and `R` rows of fields. The default value is `\"1x1\"`.\n * 2. `count=\"N\"` - Provides a skeleton form of `N` fields stacked in single columns.\n */\n @Prop({ reflect: true }) counts: string;\n\n /** Styles the component to have a `height` and `width` of `1em`, making it easy to place alongside text. */\n @Prop({ reflect: true }) inline: boolean;\n\n /**\n * The label that is associated with the component. This is not displayed visually but is presented by screen readers.\n * @localizable\n */\n @Prop({ reflect: true, mutable: true }) label: string;\n\n /**\n * Visual adjustments available to specific type and shape combinations, written as a hyphen (`-`) separated string.\n *\n * Supported values depend on the type and shape selected, and are listed in detail in the shape sections above.\n */\n @Prop({ reflect: true }) modifiers: string;\n\n /**\n * The specific visual presentation of a loading element `type`.\n * @snippet\n * // when type=\"spinner\"\n * type ShapeValues = \"half-circle\";\n * // when type=\"skeleton\"\n * type ShapeValues = \"circle | \"rectangle\" | \"text\" | \"table\" | \"field\" | \"form\" | \"detailed-item\" | \"label-value\";\n */\n @Prop({ reflect: true }) shape: string;\n\n /** The type of loading element to display. */\n @Prop({ reflect: true }) type: 'spinner' | 'skeleton';\n\n /** @deprecated */\n @Prop({ reflect: true, mutable: true }) ariaLabel: string;\n\n @Element() hostElement: HTMLElement;\n\n get loader() {\n const loaderMap = {\n default: this.spinner,\n spinner: this.spinner,\n skeleton: this.skeletonLoader,\n };\n\n return loaderMap[this.type] || loaderMap.default;\n }\n\n get modifiersSet(): Set<string> {\n if (this.type !== 'skeleton' || !this.modifiers) {\n return undefined;\n }\n\n return new Set(this.modifiers.split('-'));\n }\n\n get countsArray(): number[] {\n if (this.type !== 'skeleton' || !this.counts) {\n return undefined;\n }\n\n return this.counts.split('x').map(Number);\n }\n\n get skeletonShape() {\n return skeletonShapes[this.shape]?.(this.countsArray, this.modifiersSet) ?? '';\n }\n\n get spinnerShape() {\n const spinnerMap = {\n default: this.halfCircleSpinner,\n 'half-circle': this.halfCircleSpinner,\n };\n\n return spinnerMap[this.type] || spinnerMap.default;\n }\n\n get localizedLabel() {\n return loc(this.label || 'tecton.element.loading.ariaLabel');\n }\n\n componentWillLoad() {\n handleAriaLabel(this);\n }\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n render() {\n return this.loader();\n }\n\n halfCircleSpinner = () => {\n return (\n <div\n class=\"q2-loading-animation half-circle-spinner\"\n aria-label={this.localizedLabel}\n >\n <div class=\"circle circle-1\"></div>\n <div class=\"circle circle-2\"></div>\n </div>\n );\n };\n\n spinner = () => {\n return this.halfCircleSpinner();\n };\n\n skeletonLoader = () => {\n return (\n <div\n class=\"q2-loading-skeleton\"\n aria-label={this.localizedLabel}\n >\n {this.shape === 'custom' ? <slot /> : this.skeletonShape}\n <div class=\"q2-loading-skeleton-shimmer\"></div>\n </div>\n );\n };\n}\n"],"mappings":"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"}