q2-tecton-elements 1.65.0 → 1.66.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 (680) hide show
  1. package/dist/bundle-report.json +1904 -742
  2. package/dist/cjs/{action-sheet-CiK2Bap_.js → action-sheet-D71RSc-w.js} +5 -2
  3. package/dist/cjs/action-sheet-D71RSc-w.js.map +1 -0
  4. package/dist/cjs/component-DRAntnCA.js +47 -0
  5. package/dist/cjs/component-DRAntnCA.js.map +1 -0
  6. package/dist/cjs/loader.cjs.js +1 -1
  7. package/dist/cjs/q2-action-group.q2-resize-observer.entry.cjs.js.map +1 -1
  8. package/dist/cjs/q2-action-group_2.cjs.entry.js +121 -45
  9. package/dist/cjs/q2-action-group_2.cjs.entry.js.map +1 -1
  10. package/dist/cjs/q2-action-sheet.cjs.entry.js +9 -5
  11. package/dist/cjs/q2-action-sheet.cjs.entry.js.map +1 -1
  12. package/dist/cjs/q2-action-sheet.entry.cjs.js.map +1 -1
  13. package/dist/cjs/q2-avatar.cjs.entry.js +2 -2
  14. package/dist/cjs/q2-avatar.cjs.entry.js.map +1 -1
  15. package/dist/cjs/q2-avatar.entry.cjs.js.map +1 -1
  16. package/dist/cjs/q2-btn.q2-loading.entry.cjs.js.map +1 -1
  17. package/dist/cjs/q2-btn_2.cjs.entry.js +13 -4
  18. package/dist/cjs/q2-btn_2.cjs.entry.js.map +1 -1
  19. package/dist/cjs/q2-calendar.cjs.entry.js +3 -3
  20. package/dist/cjs/q2-calendar.cjs.entry.js.map +1 -1
  21. package/dist/cjs/q2-calendar.entry.cjs.js.map +1 -1
  22. package/dist/cjs/q2-card-image.cjs.entry.js +5 -5
  23. package/dist/cjs/q2-card-image.cjs.entry.js.map +1 -1
  24. package/dist/cjs/q2-card-image.entry.cjs.js.map +1 -1
  25. package/dist/cjs/q2-card.cjs.entry.js +1 -1
  26. package/dist/cjs/q2-card.cjs.entry.js.map +1 -1
  27. package/dist/cjs/q2-card.entry.cjs.js.map +1 -1
  28. package/dist/cjs/q2-carousel-pane.cjs.entry.js +7 -3
  29. package/dist/cjs/q2-carousel-pane.cjs.entry.js.map +1 -1
  30. package/dist/cjs/q2-carousel-pane.entry.cjs.js.map +1 -1
  31. package/dist/cjs/q2-carousel.cjs.entry.js +12 -2
  32. package/dist/cjs/q2-carousel.cjs.entry.js.map +1 -1
  33. package/dist/cjs/q2-carousel.entry.cjs.js.map +1 -1
  34. package/dist/cjs/q2-chart-area.cjs.entry.js +1 -1
  35. package/dist/cjs/q2-chart-bar.cjs.entry.js +1 -1
  36. package/dist/cjs/q2-chart-donut.cjs.entry.js +1 -1
  37. package/dist/cjs/q2-checkbox-group.cjs.entry.js +5 -1
  38. package/dist/cjs/q2-checkbox-group.cjs.entry.js.map +1 -1
  39. package/dist/cjs/q2-checkbox-group.entry.cjs.js.map +1 -1
  40. package/dist/cjs/q2-checkbox.cjs.entry.js +3 -4
  41. package/dist/cjs/q2-checkbox.cjs.entry.js.map +1 -1
  42. package/dist/cjs/q2-checkbox.entry.cjs.js.map +1 -1
  43. package/dist/cjs/q2-context.cjs.entry.js +1 -1
  44. package/dist/cjs/q2-context.cjs.entry.js.map +1 -1
  45. package/dist/cjs/q2-context.entry.cjs.js.map +1 -1
  46. package/dist/cjs/q2-currency.cjs.entry.js +1 -1
  47. package/dist/cjs/q2-data-table.cjs.entry.js +19 -9
  48. package/dist/cjs/q2-data-table.cjs.entry.js.map +1 -1
  49. package/dist/cjs/q2-data-table.entry.cjs.js.map +1 -1
  50. package/dist/cjs/q2-detail.cjs.entry.js +2 -2
  51. package/dist/cjs/q2-detail.cjs.entry.js.map +1 -1
  52. package/dist/cjs/q2-detail.entry.cjs.js.map +1 -1
  53. package/dist/cjs/q2-dropdown-item.cjs.entry.js +3 -1
  54. package/dist/cjs/q2-dropdown-item.cjs.entry.js.map +1 -1
  55. package/dist/cjs/q2-dropdown-item.entry.cjs.js.map +1 -1
  56. package/dist/cjs/q2-dropdown.cjs.entry.js +33 -8
  57. package/dist/cjs/q2-dropdown.cjs.entry.js.map +1 -1
  58. package/dist/cjs/q2-dropdown.entry.cjs.js.map +1 -1
  59. package/dist/cjs/q2-editable-field.cjs.entry.js +1 -1
  60. package/dist/cjs/q2-example.cjs.entry.js +1 -1
  61. package/dist/cjs/q2-file-picker.cjs.entry.js +2 -2
  62. package/dist/cjs/q2-file-picker.cjs.entry.js.map +1 -1
  63. package/dist/cjs/q2-file-picker.entry.cjs.js.map +1 -1
  64. package/dist/cjs/q2-form.cjs.entry.js +1 -1
  65. package/dist/cjs/q2-formatted-text.cjs.entry.js +1 -1
  66. package/dist/cjs/q2-grid-area.cjs.entry.js +9 -1
  67. package/dist/cjs/q2-grid-area.cjs.entry.js.map +1 -1
  68. package/dist/cjs/q2-grid-area.entry.cjs.js.map +1 -1
  69. package/dist/cjs/q2-icon.cjs.entry.js +6 -0
  70. package/dist/cjs/q2-icon.cjs.entry.js.map +1 -1
  71. package/dist/cjs/q2-icon.entry.cjs.js.map +1 -1
  72. package/dist/cjs/q2-input.cjs.entry.js +8 -6
  73. package/dist/cjs/q2-input.cjs.entry.js.map +1 -1
  74. package/dist/cjs/q2-input.entry.cjs.js.map +1 -1
  75. package/dist/cjs/q2-item.cjs.entry.js +17 -17
  76. package/dist/cjs/q2-item.cjs.entry.js.map +1 -1
  77. package/dist/cjs/q2-item.entry.cjs.js.map +1 -1
  78. package/dist/cjs/q2-legend.cjs.entry.js +1 -1
  79. package/dist/cjs/q2-link.q2-list.entry.cjs.js.map +1 -1
  80. package/dist/cjs/q2-link_2.cjs.entry.js +11 -7
  81. package/dist/cjs/q2-link_2.cjs.entry.js.map +1 -1
  82. package/dist/cjs/q2-message.cjs.entry.js +2 -2
  83. package/dist/cjs/q2-message.cjs.entry.js.map +1 -1
  84. package/dist/cjs/q2-message.entry.cjs.js.map +1 -1
  85. package/dist/cjs/q2-meter.cjs.entry.js +1 -1
  86. package/dist/cjs/q2-modal.cjs.entry.js +2 -2
  87. package/dist/cjs/q2-month-picker.cjs.entry.js +2 -2
  88. package/dist/cjs/q2-mutation-observer.cjs.entry.js +1 -1
  89. package/dist/cjs/q2-optgroup.cjs.entry.js +4 -2
  90. package/dist/cjs/q2-optgroup.cjs.entry.js.map +1 -1
  91. package/dist/cjs/q2-optgroup.entry.cjs.js.map +1 -1
  92. package/dist/cjs/q2-option-list.q2-popover.entry.cjs.js.map +1 -1
  93. package/dist/cjs/q2-option-list_2.cjs.entry.js +5 -3
  94. package/dist/cjs/q2-option-list_2.cjs.entry.js.map +1 -1
  95. package/dist/cjs/q2-option.cjs.entry.js +3 -1
  96. package/dist/cjs/q2-option.cjs.entry.js.map +1 -1
  97. package/dist/cjs/q2-option.entry.cjs.js.map +1 -1
  98. package/dist/cjs/q2-pagination.cjs.entry.js +10 -12
  99. package/dist/cjs/q2-pagination.cjs.entry.js.map +1 -1
  100. package/dist/cjs/q2-pagination.entry.cjs.js.map +1 -1
  101. package/dist/cjs/q2-pill.cjs.entry.js +2 -2
  102. package/dist/cjs/q2-radio.cjs.entry.js +2 -2
  103. package/dist/cjs/q2-radio.cjs.entry.js.map +1 -1
  104. package/dist/cjs/q2-radio.entry.cjs.js.map +1 -1
  105. package/dist/cjs/q2-relative-time.cjs.entry.js +1 -1
  106. package/dist/cjs/q2-section-container.cjs.entry.js +2 -0
  107. package/dist/cjs/q2-section-container.cjs.entry.js.map +1 -1
  108. package/dist/cjs/q2-section-container.entry.cjs.js.map +1 -1
  109. package/dist/cjs/q2-section.cjs.entry.js +2 -2
  110. package/dist/cjs/q2-select.cjs.entry.js +7 -3
  111. package/dist/cjs/q2-select.cjs.entry.js.map +1 -1
  112. package/dist/cjs/q2-select.entry.cjs.js.map +1 -1
  113. package/dist/cjs/q2-stepper-pane.cjs.entry.js +3 -1
  114. package/dist/cjs/q2-stepper-pane.cjs.entry.js.map +1 -1
  115. package/dist/cjs/q2-stepper-pane.entry.cjs.js.map +1 -1
  116. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +1 -1
  117. package/dist/cjs/q2-stepper.cjs.entry.js +6 -2
  118. package/dist/cjs/q2-stepper.cjs.entry.js.map +1 -1
  119. package/dist/cjs/q2-stepper.entry.cjs.js.map +1 -1
  120. package/dist/cjs/q2-tab-container.cjs.entry.js +5 -1
  121. package/dist/cjs/q2-tab-container.cjs.entry.js.map +1 -1
  122. package/dist/cjs/q2-tab-container.entry.cjs.js.map +1 -1
  123. package/dist/cjs/q2-tab-pane.cjs.entry.js +8 -1
  124. package/dist/cjs/q2-tab-pane.cjs.entry.js.map +1 -1
  125. package/dist/cjs/q2-tab-pane.entry.cjs.js.map +1 -1
  126. package/dist/cjs/q2-tag.cjs.entry.js +3 -3
  127. package/dist/cjs/q2-tag.cjs.entry.js.map +1 -1
  128. package/dist/cjs/q2-tag.entry.cjs.js.map +1 -1
  129. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  130. package/dist/cjs/q2-textarea.cjs.entry.js +2 -2
  131. package/dist/cjs/q2-textarea.cjs.entry.js.map +1 -1
  132. package/dist/cjs/q2-textarea.entry.cjs.js.map +1 -1
  133. package/dist/cjs/q2-toast.cjs.entry.js +192 -0
  134. package/dist/cjs/q2-toast.cjs.entry.js.map +1 -0
  135. package/dist/cjs/q2-toast.entry.cjs.js.map +1 -0
  136. package/dist/cjs/{sanitize-html-string-DPqrzfM9.js → sanitize-html-string-C2iwHNz5.js} +30 -6
  137. package/dist/cjs/sanitize-html-string-C2iwHNz5.js.map +1 -0
  138. package/dist/cjs/tecton-tab-pane.cjs.entry.js +4 -2
  139. package/dist/cjs/tecton-tab-pane.cjs.entry.js.map +1 -1
  140. package/dist/cjs/tecton-tab-pane.entry.cjs.js.map +1 -1
  141. package/dist/collection/collection-manifest.json +1 -0
  142. package/dist/collection/components/q2-action-group/q2-action-group.css +11 -4
  143. package/dist/collection/components/q2-action-group/q2-action-group.js +121 -45
  144. package/dist/collection/components/q2-action-group/q2-action-group.js.map +1 -1
  145. package/dist/collection/components/q2-action-sheet/q2-action-sheet.css +8 -0
  146. package/dist/collection/components/q2-action-sheet/q2-action-sheet.js +9 -5
  147. package/dist/collection/components/q2-action-sheet/q2-action-sheet.js.map +1 -1
  148. package/dist/collection/components/q2-avatar/q2-avatar.css +3 -0
  149. package/dist/collection/components/q2-avatar/q2-avatar.js +1 -1
  150. package/dist/collection/components/q2-btn/q2-btn.css +9 -1
  151. package/dist/collection/components/q2-btn/q2-btn.js +1 -1
  152. package/dist/collection/components/q2-btn/q2-btn.js.map +1 -1
  153. package/dist/collection/components/q2-calendar/q2-calendar.css +5 -1
  154. package/dist/collection/components/q2-calendar/q2-calendar.js +2 -2
  155. package/dist/collection/components/q2-calendar/q2-calendar.js.map +1 -1
  156. package/dist/collection/components/q2-calendar/q2-month-picker.js +2 -2
  157. package/dist/collection/components/q2-card/q2-card.css +1 -0
  158. package/dist/collection/components/q2-card-image/q2-card-image.js +6 -6
  159. package/dist/collection/components/q2-card-image/q2-card-image.js.map +1 -1
  160. package/dist/collection/components/q2-carousel/q2-carousel.css +1 -1
  161. package/dist/collection/components/q2-carousel/q2-carousel.js +11 -1
  162. package/dist/collection/components/q2-carousel/q2-carousel.js.map +1 -1
  163. package/dist/collection/components/q2-carousel-pane/q2-carousel-pane.css +11 -1
  164. package/dist/collection/components/q2-carousel-pane/q2-carousel-pane.js +6 -2
  165. package/dist/collection/components/q2-carousel-pane/q2-carousel-pane.js.map +1 -1
  166. package/dist/collection/components/q2-chart-area/q2-chart-area.js +1 -1
  167. package/dist/collection/components/q2-chart-bar/q2-chart-bar.js +1 -1
  168. package/dist/collection/components/q2-chart-donut/q2-chart-donut.js +1 -1
  169. package/dist/collection/components/q2-checkbox/q2-checkbox.css +135 -14
  170. package/dist/collection/components/q2-checkbox/q2-checkbox.js +2 -8
  171. package/dist/collection/components/q2-checkbox/q2-checkbox.js.map +1 -1
  172. package/dist/collection/components/q2-checkbox-group/q2-checkbox-group.js +5 -1
  173. package/dist/collection/components/q2-checkbox-group/q2-checkbox-group.js.map +1 -1
  174. package/dist/collection/components/q2-context/q2-context.js +1 -1
  175. package/dist/collection/components/q2-context/q2-context.js.map +1 -1
  176. package/dist/collection/components/q2-currency/q2-currency.js +1 -1
  177. package/dist/collection/components/q2-data-table/q2-data-table.css +3 -0
  178. package/dist/collection/components/q2-data-table/q2-data-table.js +53 -20
  179. package/dist/collection/components/q2-data-table/q2-data-table.js.map +1 -1
  180. package/dist/collection/components/q2-detail/q2-detail.css +6 -0
  181. package/dist/collection/components/q2-detail/q2-detail.js +1 -1
  182. package/dist/collection/components/q2-dropdown/q2-dropdown.css +17 -0
  183. package/dist/collection/components/q2-dropdown/q2-dropdown.js +75 -8
  184. package/dist/collection/components/q2-dropdown/q2-dropdown.js.map +1 -1
  185. package/dist/collection/components/q2-dropdown-item/q2-dropdown-item.css +1 -0
  186. package/dist/collection/components/q2-dropdown-item/q2-dropdown-item.js +2 -0
  187. package/dist/collection/components/q2-dropdown-item/q2-dropdown-item.js.map +1 -1
  188. package/dist/collection/components/q2-editable-field/q2-editable-field.js +1 -1
  189. package/dist/collection/components/q2-example/q2-example.js +1 -1
  190. package/dist/collection/components/q2-file-picker/q2-file-picker.css +4 -1
  191. package/dist/collection/components/q2-file-picker/q2-file-picker.js +4 -4
  192. package/dist/collection/components/q2-file-picker/q2-file-picker.js.map +1 -1
  193. package/dist/collection/components/q2-form/q2-form.js +1 -1
  194. package/dist/collection/components/q2-formatted-text/q2-formatted-text.js +1 -1
  195. package/dist/collection/components/q2-grid/q2-grid.js +30 -30
  196. package/dist/collection/components/q2-grid-area/q2-grid-area.js +51 -43
  197. package/dist/collection/components/q2-grid-area/q2-grid-area.js.map +1 -1
  198. package/dist/collection/components/q2-icon/assets/brand.symbol.svg +1 -1
  199. package/dist/collection/components/q2-icon/assets/browsersos.symbol.svg +1 -1
  200. package/dist/collection/components/q2-icon/assets/cards.symbol.svg +1 -1
  201. package/dist/collection/components/q2-icon/assets/communication.symbol.svg +1 -1
  202. package/dist/collection/components/q2-icon/assets/currencies.symbol.svg +1 -1
  203. package/dist/collection/components/q2-icon/assets/devices.symbol.svg +1 -1
  204. package/dist/collection/components/q2-icon/assets/filetypes.symbol.svg +1 -1
  205. package/dist/collection/components/q2-icon/assets/gestures.symbol.svg +1 -1
  206. package/dist/collection/components/q2-icon/assets/icon-list.json +1 -1
  207. package/dist/collection/components/q2-icon/assets/icon-map.json +1 -1
  208. package/dist/collection/components/q2-icon/assets/legacy.symbol.svg +1 -1
  209. package/dist/collection/components/q2-icon/assets/mobile.symbol.svg +1 -1
  210. package/dist/collection/components/q2-icon/assets/standard.symbol.svg +1 -1
  211. package/dist/collection/components/q2-input/formatting/phone.js +4 -2
  212. package/dist/collection/components/q2-input/formatting/phone.js.map +1 -1
  213. package/dist/collection/components/q2-input/q2-input.css +3 -0
  214. package/dist/collection/components/q2-input/q2-input.js +6 -6
  215. package/dist/collection/components/q2-input/q2-input.js.map +1 -1
  216. package/dist/collection/components/q2-item/q2-item.css +3 -0
  217. package/dist/collection/components/q2-item/q2-item.js +19 -18
  218. package/dist/collection/components/q2-item/q2-item.js.map +1 -1
  219. package/dist/collection/components/q2-legend/q2-legend.js +1 -1
  220. package/dist/collection/components/q2-link/q2-link.css +53 -1
  221. package/dist/collection/components/q2-link/q2-link.js +50 -8
  222. package/dist/collection/components/q2-link/q2-link.js.map +1 -1
  223. package/dist/collection/components/q2-list/q2-list.js +1 -1
  224. package/dist/collection/components/q2-loading/q2-loading.css +1 -1
  225. package/dist/collection/components/q2-loading/q2-loading.js +10 -1
  226. package/dist/collection/components/q2-loading/q2-loading.js.map +1 -1
  227. package/dist/collection/components/q2-message/q2-message.css +1 -0
  228. package/dist/collection/components/q2-message/q2-message.js +1 -1
  229. package/dist/collection/components/q2-meter/q2-meter.js +1 -1
  230. package/dist/collection/components/q2-modal/q2-modal.js +1 -1
  231. package/dist/collection/components/q2-mutation-observer/q2-mutation-observer.js +1 -1
  232. package/dist/collection/components/q2-optgroup/q2-optgroup.css +6 -4
  233. package/dist/collection/components/q2-optgroup/q2-optgroup.js +3 -1
  234. package/dist/collection/components/q2-optgroup/q2-optgroup.js.map +1 -1
  235. package/dist/collection/components/q2-option/q2-option.css +5 -0
  236. package/dist/collection/components/q2-option/q2-option.js +2 -0
  237. package/dist/collection/components/q2-option/q2-option.js.map +1 -1
  238. package/dist/collection/components/q2-option-list/q2-option-list.js +8 -6
  239. package/dist/collection/components/q2-option-list/q2-option-list.js.map +1 -1
  240. package/dist/collection/components/q2-pagination/q2-pagination.css +3 -0
  241. package/dist/collection/components/q2-pagination/q2-pagination.js +20 -17
  242. package/dist/collection/components/q2-pagination/q2-pagination.js.map +1 -1
  243. package/dist/collection/components/q2-pill/q2-pill.js +1 -1
  244. package/dist/collection/components/q2-popover/q2-popover.css +1 -1
  245. package/dist/collection/components/q2-popover/q2-popover.js +1 -1
  246. package/dist/collection/components/q2-radio/q2-radio.css +85 -35
  247. package/dist/collection/components/q2-radio/q2-radio.js +1 -1
  248. package/dist/collection/components/q2-radio/q2-radio.js.map +1 -1
  249. package/dist/collection/components/q2-relative-time/q2-relative-time.js +1 -1
  250. package/dist/collection/components/q2-resize-observer/q2-resize-observer.js +1 -1
  251. package/dist/collection/components/q2-section/q2-section.js +2 -2
  252. package/dist/collection/components/q2-section-container/q2-section-container.js +2 -0
  253. package/dist/collection/components/q2-section-container/q2-section-container.js.map +1 -1
  254. package/dist/collection/components/q2-select/q2-select.js +6 -5
  255. package/dist/collection/components/q2-select/q2-select.js.map +1 -1
  256. package/dist/collection/components/q2-stepper/q2-stepper.css +1 -3
  257. package/dist/collection/components/q2-stepper/q2-stepper.js +6 -2
  258. package/dist/collection/components/q2-stepper/q2-stepper.js.map +1 -1
  259. package/dist/collection/components/q2-stepper-pane/q2-stepper-pane.js +7 -5
  260. package/dist/collection/components/q2-stepper-pane/q2-stepper-pane.js.map +1 -1
  261. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.js +1 -1
  262. package/dist/collection/components/q2-tab-container/q2-tab-container.js +5 -1
  263. package/dist/collection/components/q2-tab-container/q2-tab-container.js.map +1 -1
  264. package/dist/collection/components/q2-tab-pane/q2-tab-pane.js +8 -1
  265. package/dist/collection/components/q2-tab-pane/q2-tab-pane.js.map +1 -1
  266. package/dist/collection/components/q2-tag/q2-tag.css +8 -0
  267. package/dist/collection/components/q2-tag/q2-tag.js +1 -1
  268. package/dist/collection/components/q2-textarea/q2-textarea.css +2 -1
  269. package/dist/collection/components/q2-textarea/q2-textarea.js +1 -1
  270. package/dist/collection/components/q2-toast/q2-toast.css +230 -0
  271. package/dist/collection/components/q2-toast/q2-toast.js +452 -0
  272. package/dist/collection/components/q2-toast/q2-toast.js.map +1 -0
  273. package/dist/collection/components/tecton-tab-pane/tecton-tab-pane.js +4 -2
  274. package/dist/collection/components/tecton-tab-pane/tecton-tab-pane.js.map +1 -1
  275. package/dist/collection/utils/action-sheet.js +3 -0
  276. package/dist/collection/utils/action-sheet.js.map +1 -1
  277. package/dist/collection/utils/component.js +38 -0
  278. package/dist/collection/utils/component.js.map +1 -0
  279. package/dist/collection/utils/helpers.js +6 -1
  280. package/dist/collection/utils/helpers.js.map +1 -1
  281. package/dist/collection/utils/sanitize-html-string.js +6 -0
  282. package/dist/collection/utils/sanitize-html-string.js.map +1 -1
  283. package/dist/components/action-sheet.js +3 -0
  284. package/dist/components/action-sheet.js.map +1 -1
  285. package/dist/components/component.js +42 -0
  286. package/dist/components/component.js.map +1 -0
  287. package/dist/components/index.js +2 -0
  288. package/dist/components/index.js.map +1 -1
  289. package/dist/components/q2-action-group2.js +121 -45
  290. package/dist/components/q2-action-group2.js.map +1 -1
  291. package/dist/components/q2-action-sheet.js +9 -5
  292. package/dist/components/q2-action-sheet.js.map +1 -1
  293. package/dist/components/q2-avatar2.js +2 -2
  294. package/dist/components/q2-avatar2.js.map +1 -1
  295. package/dist/components/q2-btn2.js +2 -2
  296. package/dist/components/q2-btn2.js.map +1 -1
  297. package/dist/components/q2-calendar.js +3 -3
  298. package/dist/components/q2-calendar.js.map +1 -1
  299. package/dist/components/q2-card-image.js +6 -6
  300. package/dist/components/q2-card-image.js.map +1 -1
  301. package/dist/components/q2-card.js +1 -1
  302. package/dist/components/q2-card.js.map +1 -1
  303. package/dist/components/q2-carousel-pane.js +7 -3
  304. package/dist/components/q2-carousel-pane.js.map +1 -1
  305. package/dist/components/q2-carousel.js +12 -2
  306. package/dist/components/q2-carousel.js.map +1 -1
  307. package/dist/components/q2-chart-area.js +1 -1
  308. package/dist/components/q2-chart-bar.js +1 -1
  309. package/dist/components/q2-chart-donut.js +1 -1
  310. package/dist/components/q2-checkbox-group.js +5 -1
  311. package/dist/components/q2-checkbox-group.js.map +1 -1
  312. package/dist/components/q2-checkbox2.js +3 -4
  313. package/dist/components/q2-checkbox2.js.map +1 -1
  314. package/dist/components/q2-context.js +1 -1
  315. package/dist/components/q2-context.js.map +1 -1
  316. package/dist/components/q2-currency.js +1 -1
  317. package/dist/components/q2-data-table.js +20 -9
  318. package/dist/components/q2-data-table.js.map +1 -1
  319. package/dist/components/q2-detail.js +2 -2
  320. package/dist/components/q2-detail.js.map +1 -1
  321. package/dist/components/q2-dropdown-item2.js +3 -1
  322. package/dist/components/q2-dropdown-item2.js.map +1 -1
  323. package/dist/components/q2-dropdown.js +34 -7
  324. package/dist/components/q2-dropdown.js.map +1 -1
  325. package/dist/components/q2-editable-field.js +1 -1
  326. package/dist/components/q2-example.js +1 -1
  327. package/dist/components/q2-file-picker.js +2 -2
  328. package/dist/components/q2-file-picker.js.map +1 -1
  329. package/dist/components/q2-form.js +1 -1
  330. package/dist/components/q2-formatted-text.js +1 -1
  331. package/dist/components/q2-grid-area.js +9 -1
  332. package/dist/components/q2-grid-area.js.map +1 -1
  333. package/dist/components/q2-icon2.js +6 -0
  334. package/dist/components/q2-icon2.js.map +1 -1
  335. package/dist/components/q2-input2.js +8 -6
  336. package/dist/components/q2-input2.js.map +1 -1
  337. package/dist/components/q2-item2.js +17 -17
  338. package/dist/components/q2-item2.js.map +1 -1
  339. package/dist/components/q2-legend2.js +1 -1
  340. package/dist/components/q2-link2.js +12 -6
  341. package/dist/components/q2-link2.js.map +1 -1
  342. package/dist/components/q2-list2.js +1 -1
  343. package/dist/components/q2-loading2.js +11 -2
  344. package/dist/components/q2-loading2.js.map +1 -1
  345. package/dist/components/q2-message2.js +2 -2
  346. package/dist/components/q2-message2.js.map +1 -1
  347. package/dist/components/q2-meter.js +1 -1
  348. package/dist/components/q2-modal.js +1 -1
  349. package/dist/components/q2-month-picker.js +2 -2
  350. package/dist/components/q2-mutation-observer.js +1 -1
  351. package/dist/components/q2-optgroup2.js +4 -2
  352. package/dist/components/q2-optgroup2.js.map +1 -1
  353. package/dist/components/q2-option-list2.js +3 -1
  354. package/dist/components/q2-option-list2.js.map +1 -1
  355. package/dist/components/q2-option2.js +3 -1
  356. package/dist/components/q2-option2.js.map +1 -1
  357. package/dist/components/q2-pagination.js +11 -13
  358. package/dist/components/q2-pagination.js.map +1 -1
  359. package/dist/components/q2-pill.js +1 -1
  360. package/dist/components/q2-popover2.js +2 -2
  361. package/dist/components/q2-popover2.js.map +1 -1
  362. package/dist/components/q2-radio.js +2 -2
  363. package/dist/components/q2-radio.js.map +1 -1
  364. package/dist/components/q2-relative-time.js +1 -1
  365. package/dist/components/q2-resize-observer2.js +1 -1
  366. package/dist/components/q2-section-container.js +2 -0
  367. package/dist/components/q2-section-container.js.map +1 -1
  368. package/dist/components/q2-section.js +2 -2
  369. package/dist/components/q2-select2.js +6 -2
  370. package/dist/components/q2-select2.js.map +1 -1
  371. package/dist/components/q2-stepper-pane.js +3 -1
  372. package/dist/components/q2-stepper-pane.js.map +1 -1
  373. package/dist/components/q2-stepper-vertical.js +1 -1
  374. package/dist/components/q2-stepper.js +7 -3
  375. package/dist/components/q2-stepper.js.map +1 -1
  376. package/dist/components/q2-tab-container.js +5 -1
  377. package/dist/components/q2-tab-container.js.map +1 -1
  378. package/dist/components/q2-tab-pane.js +8 -1
  379. package/dist/components/q2-tab-pane.js.map +1 -1
  380. package/dist/components/q2-tag.js +2 -2
  381. package/dist/components/q2-tag.js.map +1 -1
  382. package/dist/components/q2-textarea.js +2 -2
  383. package/dist/components/q2-textarea.js.map +1 -1
  384. package/dist/components/q2-toast.d.ts +11 -0
  385. package/dist/components/q2-toast.js +233 -0
  386. package/dist/components/q2-toast.js.map +1 -0
  387. package/dist/components/sanitize-html-string.js +28 -5
  388. package/dist/components/sanitize-html-string.js.map +1 -1
  389. package/dist/components/tecton-tab-pane.js +4 -2
  390. package/dist/components/tecton-tab-pane.js.map +1 -1
  391. package/dist/esm/{action-sheet-WwoBwnIp.js → action-sheet-B7adb3xs.js} +5 -2
  392. package/dist/esm/action-sheet-B7adb3xs.js.map +1 -0
  393. package/dist/esm/component-DVxzK3WH.js +42 -0
  394. package/dist/esm/component-DVxzK3WH.js.map +1 -0
  395. package/dist/esm/loader.js +1 -1
  396. package/dist/esm/q2-action-group.q2-resize-observer.entry.js.map +1 -1
  397. package/dist/esm/q2-action-group_2.entry.js +121 -45
  398. package/dist/esm/q2-action-group_2.entry.js.map +1 -1
  399. package/dist/esm/q2-action-sheet.entry.js +9 -5
  400. package/dist/esm/q2-action-sheet.entry.js.map +1 -1
  401. package/dist/esm/q2-avatar.entry.js +2 -2
  402. package/dist/esm/q2-avatar.entry.js.map +1 -1
  403. package/dist/esm/q2-btn.q2-loading.entry.js.map +1 -1
  404. package/dist/esm/q2-btn_2.entry.js +13 -4
  405. package/dist/esm/q2-btn_2.entry.js.map +1 -1
  406. package/dist/esm/q2-calendar.entry.js +3 -3
  407. package/dist/esm/q2-calendar.entry.js.map +1 -1
  408. package/dist/esm/q2-card-image.entry.js +6 -6
  409. package/dist/esm/q2-card-image.entry.js.map +1 -1
  410. package/dist/esm/q2-card.entry.js +1 -1
  411. package/dist/esm/q2-card.entry.js.map +1 -1
  412. package/dist/esm/q2-carousel-pane.entry.js +7 -3
  413. package/dist/esm/q2-carousel-pane.entry.js.map +1 -1
  414. package/dist/esm/q2-carousel.entry.js +12 -2
  415. package/dist/esm/q2-carousel.entry.js.map +1 -1
  416. package/dist/esm/q2-chart-area.entry.js +1 -1
  417. package/dist/esm/q2-chart-bar.entry.js +1 -1
  418. package/dist/esm/q2-chart-donut.entry.js +1 -1
  419. package/dist/esm/q2-checkbox-group.entry.js +5 -1
  420. package/dist/esm/q2-checkbox-group.entry.js.map +1 -1
  421. package/dist/esm/q2-checkbox.entry.js +3 -4
  422. package/dist/esm/q2-checkbox.entry.js.map +1 -1
  423. package/dist/esm/q2-context.entry.js +1 -1
  424. package/dist/esm/q2-context.entry.js.map +1 -1
  425. package/dist/esm/q2-currency.entry.js +1 -1
  426. package/dist/esm/q2-data-table.entry.js +19 -9
  427. package/dist/esm/q2-data-table.entry.js.map +1 -1
  428. package/dist/esm/q2-detail.entry.js +2 -2
  429. package/dist/esm/q2-detail.entry.js.map +1 -1
  430. package/dist/esm/q2-dropdown-item.entry.js +3 -1
  431. package/dist/esm/q2-dropdown-item.entry.js.map +1 -1
  432. package/dist/esm/q2-dropdown.entry.js +33 -8
  433. package/dist/esm/q2-dropdown.entry.js.map +1 -1
  434. package/dist/esm/q2-editable-field.entry.js +1 -1
  435. package/dist/esm/q2-example.entry.js +1 -1
  436. package/dist/esm/q2-file-picker.entry.js +2 -2
  437. package/dist/esm/q2-file-picker.entry.js.map +1 -1
  438. package/dist/esm/q2-form.entry.js +1 -1
  439. package/dist/esm/q2-formatted-text.entry.js +1 -1
  440. package/dist/esm/q2-grid-area.entry.js +10 -2
  441. package/dist/esm/q2-grid-area.entry.js.map +1 -1
  442. package/dist/esm/q2-icon.entry.js +6 -0
  443. package/dist/esm/q2-icon.entry.js.map +1 -1
  444. package/dist/esm/q2-input.entry.js +8 -6
  445. package/dist/esm/q2-input.entry.js.map +1 -1
  446. package/dist/esm/q2-item.entry.js +17 -17
  447. package/dist/esm/q2-item.entry.js.map +1 -1
  448. package/dist/esm/q2-legend.entry.js +1 -1
  449. package/dist/esm/q2-link.q2-list.entry.js.map +1 -1
  450. package/dist/esm/q2-link_2.entry.js +11 -7
  451. package/dist/esm/q2-link_2.entry.js.map +1 -1
  452. package/dist/esm/q2-message.entry.js +2 -2
  453. package/dist/esm/q2-message.entry.js.map +1 -1
  454. package/dist/esm/q2-meter.entry.js +1 -1
  455. package/dist/esm/q2-modal.entry.js +2 -2
  456. package/dist/esm/q2-month-picker.entry.js +2 -2
  457. package/dist/esm/q2-mutation-observer.entry.js +1 -1
  458. package/dist/esm/q2-optgroup.entry.js +4 -2
  459. package/dist/esm/q2-optgroup.entry.js.map +1 -1
  460. package/dist/esm/q2-option-list.q2-popover.entry.js.map +1 -1
  461. package/dist/esm/q2-option-list_2.entry.js +5 -3
  462. package/dist/esm/q2-option-list_2.entry.js.map +1 -1
  463. package/dist/esm/q2-option.entry.js +3 -1
  464. package/dist/esm/q2-option.entry.js.map +1 -1
  465. package/dist/esm/q2-pagination.entry.js +10 -12
  466. package/dist/esm/q2-pagination.entry.js.map +1 -1
  467. package/dist/esm/q2-pill.entry.js +2 -2
  468. package/dist/esm/q2-radio.entry.js +2 -2
  469. package/dist/esm/q2-radio.entry.js.map +1 -1
  470. package/dist/esm/q2-relative-time.entry.js +1 -1
  471. package/dist/esm/q2-section-container.entry.js +2 -0
  472. package/dist/esm/q2-section-container.entry.js.map +1 -1
  473. package/dist/esm/q2-section.entry.js +2 -2
  474. package/dist/esm/q2-select.entry.js +7 -3
  475. package/dist/esm/q2-select.entry.js.map +1 -1
  476. package/dist/esm/q2-stepper-pane.entry.js +3 -1
  477. package/dist/esm/q2-stepper-pane.entry.js.map +1 -1
  478. package/dist/esm/q2-stepper-vertical.entry.js +1 -1
  479. package/dist/esm/q2-stepper.entry.js +7 -3
  480. package/dist/esm/q2-stepper.entry.js.map +1 -1
  481. package/dist/esm/q2-tab-container.entry.js +5 -1
  482. package/dist/esm/q2-tab-container.entry.js.map +1 -1
  483. package/dist/esm/q2-tab-pane.entry.js +9 -2
  484. package/dist/esm/q2-tab-pane.entry.js.map +1 -1
  485. package/dist/esm/q2-tag.entry.js +3 -3
  486. package/dist/esm/q2-tag.entry.js.map +1 -1
  487. package/dist/esm/q2-tecton-elements.js +1 -1
  488. package/dist/esm/q2-textarea.entry.js +2 -2
  489. package/dist/esm/q2-textarea.entry.js.map +1 -1
  490. package/dist/esm/q2-toast.entry.js +190 -0
  491. package/dist/esm/q2-toast.entry.js.map +1 -0
  492. package/dist/esm/{sanitize-html-string-DOVERJq5.js → sanitize-html-string-BPwFpYg-.js} +30 -7
  493. package/dist/esm/sanitize-html-string-BPwFpYg-.js.map +1 -0
  494. package/dist/esm/tecton-tab-pane.entry.js +4 -2
  495. package/dist/esm/tecton-tab-pane.entry.js.map +1 -1
  496. package/dist/jest.e2e-coverage.js +25 -0
  497. package/dist/jest.e2e-coverage.js.map +1 -0
  498. package/dist/q2-tecton-elements/{action-sheet-WwoBwnIp.js → action-sheet-B7adb3xs.js} +19 -14
  499. package/dist/q2-tecton-elements/action-sheet-B7adb3xs.js.map +1 -0
  500. package/dist/q2-tecton-elements/assets/brand.symbol.svg +1 -1
  501. package/dist/q2-tecton-elements/assets/browsersos.symbol.svg +1 -1
  502. package/dist/q2-tecton-elements/assets/cards.symbol.svg +1 -1
  503. package/dist/q2-tecton-elements/assets/communication.symbol.svg +1 -1
  504. package/dist/q2-tecton-elements/assets/currencies.symbol.svg +1 -1
  505. package/dist/q2-tecton-elements/assets/devices.symbol.svg +1 -1
  506. package/dist/q2-tecton-elements/assets/filetypes.symbol.svg +1 -1
  507. package/dist/q2-tecton-elements/assets/gestures.symbol.svg +1 -1
  508. package/dist/q2-tecton-elements/assets/icon-list.json +1 -1
  509. package/dist/q2-tecton-elements/assets/icon-map.json +1 -1
  510. package/dist/q2-tecton-elements/assets/legacy.symbol.svg +1 -1
  511. package/dist/q2-tecton-elements/assets/mobile.symbol.svg +1 -1
  512. package/dist/q2-tecton-elements/assets/standard.symbol.svg +1 -1
  513. package/dist/q2-tecton-elements/component-DVxzK3WH.js +40 -0
  514. package/dist/q2-tecton-elements/component-DVxzK3WH.js.map +1 -0
  515. package/dist/q2-tecton-elements/q2-action-group.q2-resize-observer.entry.esm.js.map +1 -1
  516. package/dist/q2-tecton-elements/q2-action-group_2.entry.js +131 -63
  517. package/dist/q2-tecton-elements/q2-action-group_2.entry.js.map +1 -1
  518. package/dist/q2-tecton-elements/q2-action-sheet.entry.esm.js.map +1 -1
  519. package/dist/q2-tecton-elements/q2-action-sheet.entry.js +79 -75
  520. package/dist/q2-tecton-elements/q2-action-sheet.entry.js.map +1 -1
  521. package/dist/q2-tecton-elements/q2-avatar.entry.esm.js.map +1 -1
  522. package/dist/q2-tecton-elements/q2-avatar.entry.js +7 -7
  523. package/dist/q2-tecton-elements/q2-avatar.entry.js.map +1 -1
  524. package/dist/q2-tecton-elements/q2-btn.q2-loading.entry.esm.js.map +1 -1
  525. package/dist/q2-tecton-elements/q2-btn_2.entry.js +11 -4
  526. package/dist/q2-tecton-elements/q2-btn_2.entry.js.map +1 -1
  527. package/dist/q2-tecton-elements/q2-calendar.entry.esm.js.map +1 -1
  528. package/dist/q2-tecton-elements/q2-calendar.entry.js +4 -3
  529. package/dist/q2-tecton-elements/q2-calendar.entry.js.map +1 -1
  530. package/dist/q2-tecton-elements/q2-card-image.entry.esm.js.map +1 -1
  531. package/dist/q2-tecton-elements/q2-card-image.entry.js +11 -11
  532. package/dist/q2-tecton-elements/q2-card-image.entry.js.map +1 -1
  533. package/dist/q2-tecton-elements/q2-card.entry.esm.js.map +1 -1
  534. package/dist/q2-tecton-elements/q2-card.entry.js +1 -1
  535. package/dist/q2-tecton-elements/q2-card.entry.js.map +1 -1
  536. package/dist/q2-tecton-elements/q2-carousel-pane.entry.esm.js.map +1 -1
  537. package/dist/q2-tecton-elements/q2-carousel-pane.entry.js +25 -20
  538. package/dist/q2-tecton-elements/q2-carousel-pane.entry.js.map +1 -1
  539. package/dist/q2-tecton-elements/q2-carousel.entry.esm.js.map +1 -1
  540. package/dist/q2-tecton-elements/q2-carousel.entry.js +79 -67
  541. package/dist/q2-tecton-elements/q2-carousel.entry.js.map +1 -1
  542. package/dist/q2-tecton-elements/q2-chart-area.entry.js +2 -2
  543. package/dist/q2-tecton-elements/q2-chart-bar.entry.js +2 -2
  544. package/dist/q2-tecton-elements/q2-chart-donut.entry.js +9 -9
  545. package/dist/q2-tecton-elements/q2-checkbox-group.entry.esm.js.map +1 -1
  546. package/dist/q2-tecton-elements/q2-checkbox-group.entry.js +20 -15
  547. package/dist/q2-tecton-elements/q2-checkbox-group.entry.js.map +1 -1
  548. package/dist/q2-tecton-elements/q2-checkbox.entry.esm.js.map +1 -1
  549. package/dist/q2-tecton-elements/q2-checkbox.entry.js +70 -71
  550. package/dist/q2-tecton-elements/q2-checkbox.entry.js.map +1 -1
  551. package/dist/q2-tecton-elements/q2-context.entry.esm.js.map +1 -1
  552. package/dist/q2-tecton-elements/q2-context.entry.js +12 -12
  553. package/dist/q2-tecton-elements/q2-context.entry.js.map +1 -1
  554. package/dist/q2-tecton-elements/q2-currency.entry.js +8 -8
  555. package/dist/q2-tecton-elements/q2-data-table.entry.esm.js.map +1 -1
  556. package/dist/q2-tecton-elements/q2-data-table.entry.js +40 -27
  557. package/dist/q2-tecton-elements/q2-data-table.entry.js.map +1 -1
  558. package/dist/q2-tecton-elements/q2-detail.entry.esm.js.map +1 -1
  559. package/dist/q2-tecton-elements/q2-detail.entry.js +10 -10
  560. package/dist/q2-tecton-elements/q2-detail.entry.js.map +1 -1
  561. package/dist/q2-tecton-elements/q2-dropdown-item.entry.esm.js.map +1 -1
  562. package/dist/q2-tecton-elements/q2-dropdown-item.entry.js +11 -8
  563. package/dist/q2-tecton-elements/q2-dropdown-item.entry.js.map +1 -1
  564. package/dist/q2-tecton-elements/q2-dropdown.entry.esm.js.map +1 -1
  565. package/dist/q2-tecton-elements/q2-dropdown.entry.js +113 -85
  566. package/dist/q2-tecton-elements/q2-dropdown.entry.js.map +1 -1
  567. package/dist/q2-tecton-elements/q2-editable-field.entry.js +1 -1
  568. package/dist/q2-tecton-elements/q2-example.entry.js +1 -1
  569. package/dist/q2-tecton-elements/q2-file-picker.entry.esm.js.map +1 -1
  570. package/dist/q2-tecton-elements/q2-file-picker.entry.js +3 -2
  571. package/dist/q2-tecton-elements/q2-file-picker.entry.js.map +1 -1
  572. package/dist/q2-tecton-elements/q2-form.entry.js +7 -7
  573. package/dist/q2-tecton-elements/q2-formatted-text.entry.js +2 -2
  574. package/dist/q2-tecton-elements/q2-grid-area.entry.esm.js.map +1 -1
  575. package/dist/q2-tecton-elements/q2-grid-area.entry.js +18 -7
  576. package/dist/q2-tecton-elements/q2-grid-area.entry.js.map +1 -1
  577. package/dist/q2-tecton-elements/q2-icon.entry.esm.js.map +1 -1
  578. package/dist/q2-tecton-elements/q2-icon.entry.js +145 -137
  579. package/dist/q2-tecton-elements/q2-icon.entry.js.map +1 -1
  580. package/dist/q2-tecton-elements/q2-input.entry.esm.js.map +1 -1
  581. package/dist/q2-tecton-elements/q2-input.entry.js +14 -8
  582. package/dist/q2-tecton-elements/q2-input.entry.js.map +1 -1
  583. package/dist/q2-tecton-elements/q2-item.entry.esm.js.map +1 -1
  584. package/dist/q2-tecton-elements/q2-item.entry.js +56 -53
  585. package/dist/q2-tecton-elements/q2-item.entry.js.map +1 -1
  586. package/dist/q2-tecton-elements/q2-legend.entry.js +2 -2
  587. package/dist/q2-tecton-elements/q2-link.q2-list.entry.esm.js.map +1 -1
  588. package/dist/q2-tecton-elements/q2-link_2.entry.js +22 -18
  589. package/dist/q2-tecton-elements/q2-link_2.entry.js.map +1 -1
  590. package/dist/q2-tecton-elements/q2-message.entry.esm.js.map +1 -1
  591. package/dist/q2-tecton-elements/q2-message.entry.js +9 -9
  592. package/dist/q2-tecton-elements/q2-message.entry.js.map +1 -1
  593. package/dist/q2-tecton-elements/q2-meter.entry.js +7 -7
  594. package/dist/q2-tecton-elements/q2-modal.entry.js +21 -21
  595. package/dist/q2-tecton-elements/q2-month-picker.entry.js +30 -30
  596. package/dist/q2-tecton-elements/q2-mutation-observer.entry.js +1 -1
  597. package/dist/q2-tecton-elements/q2-optgroup.entry.esm.js.map +1 -1
  598. package/dist/q2-tecton-elements/q2-optgroup.entry.js +15 -12
  599. package/dist/q2-tecton-elements/q2-optgroup.entry.js.map +1 -1
  600. package/dist/q2-tecton-elements/q2-option-list.q2-popover.entry.esm.js.map +1 -1
  601. package/dist/q2-tecton-elements/q2-option-list_2.entry.js +52 -49
  602. package/dist/q2-tecton-elements/q2-option-list_2.entry.js.map +1 -1
  603. package/dist/q2-tecton-elements/q2-option.entry.esm.js.map +1 -1
  604. package/dist/q2-tecton-elements/q2-option.entry.js +15 -12
  605. package/dist/q2-tecton-elements/q2-option.entry.js.map +1 -1
  606. package/dist/q2-tecton-elements/q2-pagination.entry.esm.js.map +1 -1
  607. package/dist/q2-tecton-elements/q2-pagination.entry.js +66 -66
  608. package/dist/q2-tecton-elements/q2-pagination.entry.js.map +1 -1
  609. package/dist/q2-tecton-elements/q2-pill.entry.js +37 -37
  610. package/dist/q2-tecton-elements/q2-radio.entry.esm.js.map +1 -1
  611. package/dist/q2-tecton-elements/q2-radio.entry.js +47 -45
  612. package/dist/q2-tecton-elements/q2-radio.entry.js.map +1 -1
  613. package/dist/q2-tecton-elements/q2-relative-time.entry.js +1 -1
  614. package/dist/q2-tecton-elements/q2-section-container.entry.esm.js.map +1 -1
  615. package/dist/q2-tecton-elements/q2-section-container.entry.js +5 -2
  616. package/dist/q2-tecton-elements/q2-section-container.entry.js.map +1 -1
  617. package/dist/q2-tecton-elements/q2-section.entry.js +11 -11
  618. package/dist/q2-tecton-elements/q2-select.entry.esm.js.map +1 -1
  619. package/dist/q2-tecton-elements/q2-select.entry.js +6 -3
  620. package/dist/q2-tecton-elements/q2-select.entry.js.map +1 -1
  621. package/dist/q2-tecton-elements/q2-stepper-pane.entry.esm.js.map +1 -1
  622. package/dist/q2-tecton-elements/q2-stepper-pane.entry.js +22 -19
  623. package/dist/q2-tecton-elements/q2-stepper-pane.entry.js.map +1 -1
  624. package/dist/q2-tecton-elements/q2-stepper-vertical.entry.js +69 -69
  625. package/dist/q2-tecton-elements/q2-stepper.entry.esm.js.map +1 -1
  626. package/dist/q2-tecton-elements/q2-stepper.entry.js +42 -39
  627. package/dist/q2-tecton-elements/q2-stepper.entry.js.map +1 -1
  628. package/dist/q2-tecton-elements/q2-tab-container.entry.esm.js.map +1 -1
  629. package/dist/q2-tecton-elements/q2-tab-container.entry.js +21 -16
  630. package/dist/q2-tecton-elements/q2-tab-container.entry.js.map +1 -1
  631. package/dist/q2-tecton-elements/q2-tab-pane.entry.esm.js.map +1 -1
  632. package/dist/q2-tecton-elements/q2-tab-pane.entry.js +17 -7
  633. package/dist/q2-tecton-elements/q2-tab-pane.entry.js.map +1 -1
  634. package/dist/q2-tecton-elements/q2-tag.entry.esm.js.map +1 -1
  635. package/dist/q2-tecton-elements/q2-tag.entry.js +65 -65
  636. package/dist/q2-tecton-elements/q2-tag.entry.js.map +1 -1
  637. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  638. package/dist/q2-tecton-elements/q2-textarea.entry.esm.js.map +1 -1
  639. package/dist/q2-tecton-elements/q2-textarea.entry.js +3 -3
  640. package/dist/q2-tecton-elements/q2-textarea.entry.js.map +1 -1
  641. package/dist/q2-tecton-elements/q2-toast.entry.esm.js.map +1 -0
  642. package/dist/q2-tecton-elements/q2-toast.entry.js +222 -0
  643. package/dist/q2-tecton-elements/q2-toast.entry.js.map +1 -0
  644. package/dist/q2-tecton-elements/{sanitize-html-string-DOVERJq5.js → sanitize-html-string-BPwFpYg-.js} +167 -145
  645. package/dist/q2-tecton-elements/sanitize-html-string-BPwFpYg-.js.map +1 -0
  646. package/dist/q2-tecton-elements/tecton-tab-pane.entry.esm.js.map +1 -1
  647. package/dist/q2-tecton-elements/tecton-tab-pane.entry.js +8 -8
  648. package/dist/q2-tecton-elements/tecton-tab-pane.entry.js.map +1 -1
  649. package/dist/scripts/docs-generator/index.js +1 -1
  650. package/dist/scripts/docs-generator/index.js.map +1 -1
  651. package/dist/types/Users/kvanhouten/Documents/Work/tecton/packages/q2-tecton-elements/.stencil/jest.e2e-coverage.d.ts +1 -0
  652. package/dist/types/components/q2-action-group/q2-action-group.d.ts +7 -4
  653. package/dist/types/components/q2-carousel-pane/q2-carousel-pane.d.ts +1 -0
  654. package/dist/types/components/q2-checkbox/q2-checkbox.d.ts +0 -5
  655. package/dist/types/components/q2-data-table/q2-data-table.d.ts +8 -0
  656. package/dist/types/components/q2-dropdown/q2-dropdown.d.ts +22 -3
  657. package/dist/types/components/q2-grid-area/q2-grid-area.d.ts +2 -0
  658. package/dist/types/components/q2-input/q2-input.d.ts +4 -5
  659. package/dist/types/components/q2-item/q2-item.d.ts +5 -4
  660. package/dist/types/components/q2-link/q2-link.d.ts +4 -0
  661. package/dist/types/components/q2-pagination/q2-pagination.d.ts +11 -3
  662. package/dist/types/components/q2-select/q2-select.d.ts +1 -2
  663. package/dist/types/components/q2-tab-pane/q2-tab-pane.d.ts +2 -0
  664. package/dist/types/components/q2-toast/q2-toast.d.ts +67 -0
  665. package/dist/types/components.d.ts +189 -34
  666. package/dist/types/utils/action-sheet.d.ts +2 -1
  667. package/dist/types/utils/component.d.ts +4 -0
  668. package/dist/types/utils/sanitize-html-string.d.ts +1 -0
  669. package/package.json +11 -7
  670. package/dist/cjs/action-sheet-CiK2Bap_.js.map +0 -1
  671. package/dist/cjs/sanitize-html-string-DPqrzfM9.js.map +0 -1
  672. package/dist/esm/action-sheet-WwoBwnIp.js.map +0 -1
  673. package/dist/esm/sanitize-html-string-DOVERJq5.js.map +0 -1
  674. package/dist/q2-tecton-elements/action-sheet-WwoBwnIp.js.map +0 -1
  675. package/dist/q2-tecton-elements/sanitize-html-string-DOVERJq5.js.map +0 -1
  676. /package/dist/types/Users/kvanhouten/Documents/Work/{tecton_extra → tecton}/packages/q2-tecton-elements/.stencil/jest.setup.d.ts +0 -0
  677. /package/dist/types/Users/kvanhouten/Documents/Work/{tecton_extra → tecton}/packages/q2-tecton-elements/.stencil/scripts/docs-generator/index.d.ts +0 -0
  678. /package/dist/types/Users/kvanhouten/Documents/Work/{tecton_extra → tecton}/packages/q2-tecton-elements/.stencil/scripts/docs-generator/markdown-generator.d.ts +0 -0
  679. /package/dist/types/Users/kvanhouten/Documents/Work/{tecton_extra → tecton}/packages/q2-tecton-elements/.stencil/scripts/docs-generator/tag-handlers.d.ts +0 -0
  680. /package/dist/types/Users/kvanhouten/Documents/Work/{tecton_extra → tecton}/packages/q2-tecton-elements/.stencil/scripts/docs-generator/types.d.ts +0 -0
@@ -402,7 +402,7 @@ function addEmptyDates(t, e) {
402
402
  })));
403
403
  }
404
404
 
405
- const g = "*{box-sizing:border-box}*:active{outline:none}*:focus-visible{outline:none;box-shadow:var(--const-double-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #0066cc)}:host{box-shadow:none !important}::-moz-focus-inner{border:none}input,textarea,button{font-family:inherit;font-size:inherit;font-stretch:inherit}:host(.sr),:host(.sr) button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.sr,.sr button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none}:host([hidden]){display:none}.invisible{visibility:hidden}:host{--comp-default-calendar-margin:var(--tct-calendar-margin-top, var(--t-calendar-margin-top, var(--app-scale-5x, 25px))) 0 var(--tct-calendar-margin-bottom, var(--t-calendar-margin-bottom, var(--app-scale-5x, 25px)));display:block;margin:var(--tct-calendar-margin, var(--comp-default-calendar-margin))}:host[hidden]{display:none}click-elsewhere{position:relative;display:block}q2-input{margin:0;cursor:pointer;--tct-input-btn-hover-background:var(--tct-calendar-btn-hover-background, var(--app-gray-l3, #f2f2f2));--tct-input-btn-icon-stroke-primary:var(--tct-calendar-btn-icon-stroke-primary, var(--app-gray, #747474));--tct-input-btn-icon-stroke-secondary:var(--tct-calendar-btn-icon-stroke-secondary, var(--app-gray, #747474))}q2-popover{--comp-min-tappable-size:44px;--comp-table-border-spacing:2px;--comp-min-tappable-size-and-spacing:calc(var(--comp-min-tappable-size) + var(--comp-table-border-spacing));--comp-popover-padding:var(--tct-calendar-popover-padding, var(--t-calendar-popover-padding, var(--app-scale-1x, 5px)));--comp-min-table-width:calc(var(--comp-min-tappable-size-and-spacing) * 7);--comp-table-container-border-spacing:calc(var(--comp-table-border-spacing) * 2);--comp-popover-total-padding:calc(var(--comp-popover-padding) * 2);--tct-popover-min-width:calc(\n var(--comp-min-table-width) + var(--comp-table-container-border-spacing) + var(--comp-popover-total-padding)\n )}.calendar-field-popup{padding:var(--comp-popover-padding)}.calendar-label{--comp-label-padding:var(--tct-calendar-label-padding, var(--tct-calendar-label-vertical-padding, var(--t-calendar-label-vertical-padding, var(--tct-scale-2, var(--app-scale-2x, 10px)))) 0);font-size:var(--tct-calendar-label-font-size, var(--t-calendar-label-font-size, 16px));flex:1 1;flex-basis:calc(100% - var(--tct-btn-icon-width, 44px));margin:0;padding:var(--comp-label-padding)}.cal-month-heading{padding:0 0 0.75rem;display:flex;justify-content:center;align-items:center;font-size:var(--tct-calendar-month-font-size, var(--t-calendar-month-font-size, 16px));font-weight:var(--tct-calendar-month-font-weight, var(--t-calendar-month-font-weight, 600));text-align:center}.cal-month-text{min-width:82px;display:inline-block}.cal-year-text{min-width:50px;display:inline-block}table{width:100%;margin-bottom:2px;text-align:center;border-spacing:var(--comp-table-border-spacing)}th{font-size:var(--tct-calendar-day-heading-font-size, var(--t-calendar-day-heading-font-size, inherit));font-weight:var(--tct-calendar-day-heading-font-weight, var(--t-calendar-day-heading-font-weight, 600));width:14.285714%}td{height:var(--comp-min-tappable-size);cursor:pointer;border:var(--tct-calendar-day-border, var(--t-calendar-day-border, 0));border-radius:var(--tct-calendar-day-border-radius, var(--t-calendar-day-border-radius))}td.is-unavailable{border:1px solid var(--tct-input-error-border-color, var(--const-stoplight-alert, #d20a0a))}td.is-valid:hover{border:var(--tct-calendar-day-hover-border, var(--t-calendar-day-hover-border, var(--tct-calendar-day-border, var(--t-calendar-day-border, 0))));border-radius:var(--tct-calendar-day-hover-border-radius, var(--t-calendar-day-hover-border-radius, var(--tct-calendar-day-border-radius, var(--t-calendar-day-border-radius))));background:var(--tct-calendar-day-hover-background, var(--tct-calendar-day-hover-bg, var(--t-calendar-day-hover-bg, var(--tct-gray-14, var(--app-gray14, var(--tct-gray-l4, var(--app-gray-l4, #f2f2f2)))))));color:var(--tct-calendar-day-hover-font-color, var(--t-calendar-day-hover-font-color, inherit))}td[aria-hidden],td[aria-disabled]{pointer-events:none;cursor:not-allowed}td[aria-disabled]{opacity:var(--tct-calendar-day-disabled-opacity, var(--t-calendar-day-disabled-opacity, var(--app-disabled-opacity, 0.4)))}td[aria-selected=true]{border:var(--tct-calendar-day-selected-border, var(--t-calendar-day-selected-border, var(--tct-calendar-day-border, var(--t-calendar-day-border, 0))));border-radius:var(--tct-calendar-day-selected-border-radius, var(--t-calendar-day-selected-border-radius, var(--tct-calendar-day-border-radius, var(--t-calendar-day-border-radius))));background:var(--tct-calendar-day-selected-background, var(--tct-calendar-day-selected-bg, var(--t-calendar-day-selected-bg, var(--tct-calendar-day-hover-background, var(--tct-calendar-day-hover-bg, var(--t-calendar-day-hover-bg, var(--tct-gray-14, var(--t-gray-14, var(--tct-gray-l4, var(--app-gray-l4, #f2f2f2))))))))));color:var(--tct-calendar-day-selected-font-color, var(--t-calendar-day-selected-font-color, var(--tct-calendar-day-hover-font-color, var(--t-calendar-day-hover-font-color, inherit))));box-shadow:0 0 0 2px var(--tct-calendar-day-selected-outline-color, var(--t-calendar-day-selected-outline-color, var(--tct-stoplight-info, var(--const-stoplight-info, #0079c1))))}td[aria-selected=true]:focus{box-shadow:0 0 0 2px var(--tct-calendar-day-selected-outline-color, var(--t-calendar-day-selected-outline-color, var(--tct-stoplight-info, var(--const-stoplight-info, #0079c1)))), 0 0 0 4px var(--const-focus-color, #0066cc)}.today-decorator{text-transform:uppercase;font-weight:700;font-size:10px;height:12px}.calendar-disclaimer{font-size:var(--tct-calendar-disclaimer-font-size, var(--t-calendar-disclaimer-font-size, var(--tct-font-size-small, var(--app-font-size-small, 12px))));border-style:solid;border-width:var(--tct-calendar-disclaimer-border-width, var(--t-calendar-disclaimer-border-width, 1px 0 0 0));border-color:var(--tct-calendar-disclaimer-border-color, var(--t-calendar-disclaimer-border-color, var(--tct-gray-13, var(--t-gray-13, var(--tct-gray-l3, var(--app-gray-l3, #e6e6e6))))));padding:var(--tct-calendar-disclaimer-padding, var(--tct-scale-2, var(--app-scale-2x, 10px)));text-align:left}";
405
+ const g = "*{box-sizing:border-box}*:active{outline:none}*:focus-visible{outline:none;box-shadow:var(--const-double-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #0066cc)}:host{box-shadow:none !important}::-moz-focus-inner{border:none}input,textarea,button{font-family:inherit;font-size:inherit;font-stretch:inherit}:host(.sr),:host(.sr) button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.sr,.sr button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none}:host([hidden]){display:none}.invisible{visibility:hidden}:host{--comp-default-calendar-margin:var(--tct-calendar-margin-top, var(--t-calendar-margin-top, var(--app-scale-5x, 25px))) 0 var(--tct-calendar-margin-bottom, var(--t-calendar-margin-bottom, var(--app-scale-5x, 25px)));display:block;margin:var(--tct-calendar-margin, var(--comp-default-calendar-margin))}:host[hidden]{display:none}click-elsewhere{position:relative;display:block}q2-input{margin:0;cursor:pointer;--tct-input-btn-hover-background:var(--tct-calendar-btn-hover-background, var(--app-gray-l3, #f2f2f2));--tct-input-btn-icon-stroke-primary:var(--tct-calendar-btn-icon-stroke-primary, var(--app-gray, #747474));--tct-input-btn-icon-stroke-secondary:var(--tct-calendar-btn-icon-stroke-secondary, var(--app-gray, #747474))}q2-popover{--comp-min-tappable-size:44px;--comp-table-border-spacing:2px;--comp-min-tappable-size-and-spacing:calc(var(--comp-min-tappable-size) + var(--comp-table-border-spacing));--comp-popover-padding:var(--tct-calendar-popover-padding, var(--t-calendar-popover-padding, var(--app-scale-1x, 5px)));--comp-min-table-width:calc(var(--comp-min-tappable-size-and-spacing) * 7);--comp-table-container-border-spacing:calc(var(--comp-table-border-spacing) * 2);--comp-popover-total-padding:calc(var(--comp-popover-padding) * 2);--tct-popover-min-width:calc(\n var(--comp-min-table-width) + var(--comp-table-container-border-spacing) + var(--comp-popover-total-padding)\n )}.calendar-field-popup{padding:var(--comp-popover-padding)}.calendar-label{--comp-label-padding:var(--tct-calendar-label-padding, var(--tct-calendar-label-vertical-padding, var(--t-calendar-label-vertical-padding, var(--tct-scale-2, var(--app-scale-2x, 10px)))) 0);font-size:var(--tct-calendar-label-font-size, var(--t-calendar-label-font-size, 16px));flex:1 1;flex-basis:calc(100% - var(--tct-btn-icon-width, 44px));margin:0;padding:var(--comp-label-padding)}.cal-month-heading{padding:0 0 0.75rem;display:flex;justify-content:center;align-items:center;font-size:var(--tct-calendar-month-font-size, var(--t-calendar-month-font-size, 16px));font-weight:var(--tct-calendar-month-font-weight, var(--t-calendar-month-font-weight, 600));text-align:center}.cal-month-text{min-width:82px;display:inline-block}.cal-year-text{min-width:50px;display:inline-block}table{width:100%;margin-bottom:2px;text-align:center;border-spacing:var(--comp-table-border-spacing)}th{font-size:var(--tct-calendar-day-heading-font-size, var(--t-calendar-day-heading-font-size, inherit));font-weight:var(--tct-calendar-day-heading-font-weight, var(--t-calendar-day-heading-font-weight, 600));width:14.285714%}td{height:var(--comp-min-tappable-size);cursor:pointer;border:var(--tct-calendar-day-border, var(--t-calendar-day-border, 0));border-radius:var(--tct-calendar-day-border-radius, var(--t-calendar-day-border-radius))}td.is-unavailable{border:1px solid var(--tct-input-error-border-color, var(--const-stoplight-alert, #d20a0a))}td.is-valid:hover{border:var(--tct-calendar-day-hover-border, var(--t-calendar-day-hover-border, var(--tct-calendar-day-border, var(--t-calendar-day-border, 0))));border-radius:var(--tct-calendar-day-hover-border-radius, var(--t-calendar-day-hover-border-radius, var(--tct-calendar-day-border-radius, var(--t-calendar-day-border-radius))));background:var(--tct-calendar-day-hover-background, var(--tct-calendar-day-hover-bg, var(--t-calendar-day-hover-bg, var(--tct-gray-14, var(--app-gray14, var(--tct-gray-l4, var(--app-gray-l4, #f2f2f2)))))));color:var(--tct-calendar-day-hover-font-color, var(--t-calendar-day-hover-font-color, inherit))}td[aria-hidden],td[aria-disabled]{pointer-events:none;cursor:not-allowed}td[aria-disabled]{opacity:var(--tct-calendar-day-disabled-opacity, var(--t-calendar-day-disabled-opacity, var(--app-disabled-opacity, 0.4)))}td[aria-selected=true]{border:var(--tct-calendar-day-selected-border, var(--t-calendar-day-selected-border, var(--tct-calendar-day-border, var(--t-calendar-day-border, 0))));border-radius:var(--tct-calendar-day-selected-border-radius, var(--t-calendar-day-selected-border-radius, var(--tct-calendar-day-border-radius, var(--t-calendar-day-border-radius))));background:var(--tct-calendar-day-selected-background, var(--tct-calendar-day-selected-bg, var(--t-calendar-day-selected-bg, var(--tct-calendar-day-hover-background, var(--tct-calendar-day-hover-bg, var(--t-calendar-day-hover-bg, var(--tct-gray-14, var(--t-gray-14, var(--tct-gray-l4, var(--app-gray-l4, #f2f2f2))))))))));color:var(--tct-calendar-day-selected-font-color, var(--t-calendar-day-selected-font-color, var(--tct-calendar-day-hover-font-color, var(--t-calendar-day-hover-font-color, inherit))));box-shadow:0 0 0 2px var(--tct-calendar-day-selected-outline-color, var(--t-calendar-day-selected-outline-color, var(--tct-stoplight-info, var(--const-stoplight-info, #0079c1))))}td[aria-selected=true]:focus{box-shadow:0 0 0 2px var(--tct-calendar-day-selected-outline-color, var(--t-calendar-day-selected-outline-color, var(--tct-stoplight-info, var(--const-stoplight-info, #0079c1)))), 0 0 0 4px var(--const-focus-color, #0066cc)}.today-decorator{text-transform:uppercase;font-weight:700;font-size:var(--tct-calendar-today-decorator-font-size, 10px);height:12px}.day-integer{font-size:var(--tct-calendar-day-integer-font-size, inherit)}.calendar-disclaimer{font-size:var(--tct-calendar-disclaimer-font-size, var(--t-calendar-disclaimer-font-size, var(--tct-font-size-small, var(--app-font-size-small, 12px))));border-style:solid;border-width:var(--tct-calendar-disclaimer-border-width, var(--t-calendar-disclaimer-border-width, 1px 0 0 0));border-color:var(--tct-calendar-disclaimer-border-color, var(--t-calendar-disclaimer-border-color, var(--tct-gray-13, var(--t-gray-13, var(--tct-gray-l3, var(--app-gray-l3, #e6e6e6))))));padding:var(--tct-calendar-disclaimer-padding, var(--tct-scale-2, var(--app-scale-2x, 10px)));text-align:left}";
406
406
 
407
407
  const y = class {
408
408
  constructor(a) {
@@ -1169,6 +1169,7 @@ const y = class {
1169
1169
  class: "today-decorator",
1170
1170
  "aria-hidden": "true"
1171
1171
  }, r("tecton.element.calendar.today")), a("div", {
1172
+ class: "day-integer",
1172
1173
  "aria-label": i,
1173
1174
  role: "text"
1174
1175
  }, (e = t === null || t === void 0 ? void 0 : t.integer) !== null && e !== void 0 ? e : ""));
@@ -1290,11 +1291,11 @@ const y = class {
1290
1291
  }
1291
1292
  render() {
1292
1293
  return a("click-elsewhere", {
1293
- key: "f94d9582bdea930e11b717f3494f259d8a59238d",
1294
+ key: "89d561d7501545e5763d1e2168f2480aac2984fe",
1294
1295
  class: this.open ? "dropdown-open" : undefined,
1295
1296
  onChange: this.onClickElsewhere
1296
1297
  }, this.renderInputField(), a("q2-popover", {
1297
- key: "1da3bdf3af49704b69e18a8d1eb76c897b5faf1f",
1298
+ key: "8bbc07991c30edf876dcd14b752e81074c5d2bde",
1298
1299
  ref: t => this.popoverElement = t,
1299
1300
  id: "calendar-popover",
1300
1301
  controlElement: this.innerInputContainer,
@@ -1 +1 @@
1
- {"version":3,"names":["formatDateISO","value","date","Date","isValidDate","formatISO","representation","memoizedFormatDateShort","formatDateShort","isoDate","toISOString","Intl","DateTimeFormat","month","day","year","timeZone","resolvedOptions","format","memoizedFormatDateLong","formatDateLong","memoizedFormatDateFull","formatDateFull","weekday","convertMomentFormat","stringFormat","replace","stringToDate","isString","undefined","result","dateParts","split","map","part","padStart","isIsoString","length","isCompleteDate","isPartialDate","isStandardSlashDate","includes","unshift","pop","UTC","parseInt","now","yearNumber","monthNumber","dayNumber","getFullYear","removeTimezoneOffset","timeZoneOffset","getTimezoneOffset","setMinutes","Math","abs","stringArrayToDate","dateArray","Array","isArray","setupMonthYear","monthIndex","getMonth","selectedYear","validateInput","input","validDays","validDates","invalidDates","startDate","endDate","formatString","assume","isValid","isAvailable","messageType","message","loc","inputDate","buildInputDate","getDate","calendarPosition","monthName","getMonths","getDay","isoString","isNotValidDate","isInvalidDate","isBeforeStartDate","isAfterEndDate","isInvalid","Number","twoDigitDay","fourDigitYear","assumeYear","monthDay","mm","dd","nowLocal","assumedYear","slice","toString","handleMissingZeros","match","sp","reorderDateString","firstDayOfWeekInMonth","getDays","getDaysOfWeek","generateDatesFromMonthYear","daysInMonth","getDaysInMonth","keys","reduce","acc","stepIndex","push","getValidDaysOfWeek","checksum","sunValid","monValid","tuesValid","wedsValid","thursValid","friValid","satValid","ret","validateAgainstChecksum","validDaysOfWeek","newDate","validateAgainstBlacklist","validateAgainstWhitelist","some","validDate","isSameDay","buildDates","selectedMonthYear","currentSelection","dateValidators","typedValue","validationFns","baseValidation","bind","generateDateList","isIncompleteDate","datesInMonth","dayInMonth","dateIndex","fn","dayState","getDayState","classList","generateClassesForCalDay","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","Q2Calendar","constructor","hostRef","this","dayAbbrStrings","dayStrings","defaultFormatString","formatModifier","guid","createGuid","internalError","monthStrings","scheduledAfterRender","hintMessage","defaultHintMessage","hintMessageType","keyboardSelection","popoverMinHeight","popoverMode","closeCalendar","open","focusInput","goToMonthYear","dateList","buildDateList","checkActiveCellForBlankness","onClickElsewhere","event","target","localName","stopPropagation","onDateKeydown","currentDay","dataset","generateDateFromDay","key","preventDefault","activateDay","addDays","shiftKey","find","selectDate","onDateSelection","dateCell","closest","clickedDate","onHeaderControlKeydown","hasSelectedCell","_a","calendarBody","querySelector","onInputBlur","isTypeable","daysOfWeekChecksum","setHints","setCompleteInput","valueOnBlur","mirrorEmit","onInputClick","disabled","toggleCalendar","onInputFocus","controlElement","tmpTypedValue","onInputInput","detail","onInputKeydown","dateValue","openCalendar","typeable","onInputKeyup","yyyy","validateDate","onPopupKeyup","onRefocus","btnPrevMonth","dispatchEvent","FocusEvent","readonly","invalid","connectedCallback","componentWillLoad","popDirectionHandler","handleAriaLabel","componentDidLoad","overrideFocus","hostElement","setCustomLabel","componentDidRender","setTimeout","forEach","defaultChangeHandler","onchange","handleClear","defaultErrorHandler","onerror","delegateFocus","isEventFromElement","shadowRoot","focus","popoverStateHandler","defaultSuccessHandler","onsuccess","closePopover","_togglePopover","openPopover","setValue","waitForNextPaint","tableCell","calendarTable","click","typeValue","formattedDate","innerInputField","InputEvent","KeyboardEvent","ariaLabelObserver","cutoffTimeObserver","daysOfWeekChecksumObserver","endDateObserver","invalidDatesObserver","handleRenamedProp","startDateObserver","typeableChanged","valueObserver","validDatesObserver","newValue","isMoment","toDate","shortFormattedValue","canClear","clearable","computedPlaceholder","disabledMsg","buttonLabel","placeholder","currentWeeks","weeks","accum","item","index","chunkIndex","floor","ct","cutoffTime","isMomentString","test","errorList","errors","list","filter","error","concat","formattedValue","displayFormat","hintList","hints","hint","innerInputContainer","_b","inputId","selectedDate","selectedCell","toggleElement","btnCalendarToggle","focusDay","monthYear","activeElement","tagName","hasAttribute","calendarCells","querySelectorAll","indexOfCell","indexOf","dayToFocus","cell","customLabel","appendChild","cloneNode","removeChild","hintMessageElement","present","errorCode","isSelectedMonthAndYear","calculationDateList","dateValueDayOfMonth","_c","isDateValueInvalid","console","warn","renderCalendarDays","h","role","ref","scope","onClick","onKeyDown","elm","week","ariaLabel","class","tabindex","renderCalendarPopover","onKeyUp","calendarLabel","label","onTctClick","type","btnNextMonth","btnPrevYear","btnNextYear","id","disclaimer","onFocus","renderHintField","el","renderInputField","hideLabel","optional","onChange","e","stopImmediatePropagation","onTctChange","onInput","onTctInput","onBlur","_role","_preventEntry","slot","render","popoverElement","direction","popoverDirection","minHeight","align","popoverAlignment","mode","block"],"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 = false;\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 } else {\n isValid = true;\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 --comp-default-calendar-margin: #{var-list(var-prefixer(calendar-margin-top), --app-scale-5x, 25px) 0\n var-list(var-prefixer(calendar-margin-bottom), --app-scale-5x, 25px)};\n display: block;\n margin: var-list(--tct-calendar-margin, --comp-default-calendar-margin);\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 --tct-input-btn-hover-background: #{var-list(--tct-calendar-btn-hover-background, --app-gray-l3, #f2f2f2)};\n --tct-input-btn-icon-stroke-primary: #{var-list(--tct-calendar-btn-icon-stroke-primary, --app-gray, #747474)};\n --tct-input-btn-icon-stroke-secondary: #{var-list(--tct-calendar-btn-icon-stroke-secondary, --app-gray, #747474)};\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='true'] {\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 &[aria-selected='true']:focus {\n box-shadow:\n 0 0 0 2px\n var-list(\n var-prefixer(calendar-day-selected-outline-color),\n --tct-stoplight-info,\n --const-stoplight-info,\n #0079c1\n ),\n 0 0 0 4px var(--const-focus-color, #0066cc);\n }\n}\n\n.today-decorator {\n text-transform: uppercase;\n font-weight: 700;\n font-size: 10px;\n height: 12px;\n}\n\n.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 createGuid,\n} from '../../utils';\nimport { IEventDetail } from '../q2-input/q2-input-types';\nimport { Q2InputCustomEvent } from 'src/components';\nimport mirrorEmit from '@/utils/mirror-emit';\n\n/**\n * @name Calendar\n * @category Forms\n * @summary Use for selecting a date from a calendar popover.\n */\n@Component({ tag: 'q2-calendar', shadow: true, styleUrl: 'q2-calendar.scss' })\nexport class Q2Calendar implements ComponentInterface {\n // #region Own Properties\n\n btnCalendarToggle: HTMLQ2BtnElement;\n btnNextMonth: HTMLQ2BtnElement;\n btnNextYear: HTMLQ2BtnElement;\n btnPrevMonth: HTMLQ2BtnElement;\n btnPrevYear: HTMLQ2BtnElement;\n calendarBody: HTMLDivElement;\n calendarTable: HTMLTableElement;\n controlElement: HTMLQ2InputElement;\n dayAbbrStrings = getDays();\n dayStrings = getDaysOfWeek();\n defaultFormatString = 'mm/dd/yyyy';\n formatModifier: string = 'M/D/YYYY'; // To allow missing leading zero, 4/3/2021 => converts into 04/03/2021\n guid = createGuid();\n hintMessageElement: HTMLQ2MessageElement;\n internalError: string = '';\n monthStrings = getMonths();\n popoverElement?: HTMLQ2PopoverElement;\n scheduledAfterRender: (() => void)[] = [];\n selectedMonthYear: ISelectedMonthYear;\n valueOnBlur: string | { toDate(): Date };\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n dateList: CalendarDay[];\n\n @State()\n hintMessage: string = this.defaultHintMessage;\n\n @State()\n hintMessageType: 'info' | 'error' = 'info';\n\n @State()\n keyboardSelection: boolean = false;\n\n @State()\n typedValue: string = '';\n\n // #endregion\n // #region Public Property API\n\n /** @deprecated */\n @Prop({ reflect: true, mutable: true })\n ariaLabel: string;\n\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 })\n assume: 'current' | 'future' | 'past' = 'current';\n\n /** @deprecated */\n @Prop({ reflect: true })\n buttonLabel: string;\n\n /** A label shown at the top of the popover date picker. */\n @Prop({ reflect: true })\n calendarLabel: string;\n\n /** Display a button in the input field allowing the user to clear their selection. */\n @Prop({ reflect: true })\n 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 })\n 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 })\n daysOfWeekChecksum: number;\n\n /** Disable the input field. */\n @Prop({ reflect: true })\n disabled: boolean;\n\n /**\n * Text that displays as the placeholder when the field is marked `disabled`.\n * @localizable\n */\n @Prop({ reflect: true })\n disabledMsg: string;\n\n /** Text that appears at the bottom of the popover date picker. */\n @Prop({ reflect: true })\n 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 })\n 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 })\n 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 })\n errors: string[];\n\n /** Hide the input field's ` <label> ` element from view. */\n @Prop({ reflect: true, mutable: true })\n 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 })\n hints: string[];\n\n /** Show error styles when the calendar is in an errant state. */\n @Prop({ reflect: true, mutable: true })\n 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()\n invalidDates: string[];\n\n /** The visible label for the `q2-calendar` input field. */\n @Prop({ reflect: true, mutable: true })\n label: string;\n\n /** @deprecated */\n @Prop()\n onsuccess: (e: CustomEvent) => void;\n\n /**\n * Determine whether the popover is open or closed.\n *\n * @readonly\n */\n @Prop({ reflect: true, mutable: true })\n open: boolean;\n\n /** Appends \"(optional)\" to the label and sets `aria-required=\"false\"`. */\n @Prop({ reflect: true })\n 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 })\n placeholder: string;\n\n /** @deprecated */\n @Prop({ reflect: true })\n popDirection: 'up' | 'down';\n\n /** Aligns the popover date picker to the left or right side of the input field. */\n @Prop()\n 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 })\n popoverDirection: 'up' | 'down';\n\n /** @deprecated */\n @Prop()\n popoverMinHeight: number = 355;\n\n /**\n * Determines the display mode of the popover.\n *\n * Providing a value of `legacy` instructs the popover to use absolute positioning instead of fixed positioning.\n *\n * @info\n * This is a temporary solution to work around styling issues related to using fixed positioning for the popover\n * when nested inside of elements with transform properties. This will be removed once the popover API is available\n * for use.\n */\n @Prop({ mutable: true })\n popoverMode: 'legacy' = null;\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 })\n 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 })\n startDate: string;\n\n /** The user can type in the field. Only available in desktop browsers. */\n @Prop({ reflect: true })\n 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()\n 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 })\n value: string | { toDate(): Date };\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when a date is selected or typed in the input field.\n * @legacyEvent\n * @deprecated Use 'tctChange' instead\n */\n @Event()\n 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 * @deprecated Use 'tctError' instead\n */\n @Event()\n error: EventEmitter<{ errors: { message: string; errorCode: string }[] }>;\n\n /**\n * Emitted when a valid date is entered or selected.\n * @deprecated Use 'tctSuccess' instead\n */\n @Event()\n success: EventEmitter<{\n // ISO formatted date\n value: string;\n }>;\n\n /**\n * Emitted when a date is selected or typed in the input field.\n * @legacyEvent\n */\n @Event()\n tctChange: 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()\n tctError: EventEmitter<{ errors: { message: string; errorCode: string }[] }>;\n\n /**\n * Emitted when a valid date is entered or selected.\n */\n @Event()\n tctSuccess: EventEmitter<{\n // ISO formatted date\n value: string;\n }>;\n\n // #endregion\n // #region Component Lifecycle Events\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 componentDidLoad(): void {\n overrideFocus(this.hostElement);\n this.setCustomLabel();\n }\n\n componentDidRender() {\n setTimeout(() => {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n }, 25);\n }\n\n // #endregion\n // #region Listeners\n\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('clear')\n handleClear() {\n mirrorEmit(this, ['change', 'tctChange'], { value: null });\n this.value = null;\n this.typedValue = '';\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('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('popoverStateChanged')\n popoverStateHandler({ detail: { open } }: CustomEvent<{ open: boolean }>) {\n if (this.open !== open) this.open = open;\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 // #endregion\n // #region Public Methods API\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 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 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 // #endregion\n // #region Watchers\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n @Watch('cutoffTime')\n cutoffTimeObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('daysOfWeekChecksum')\n daysOfWeekChecksumObserver() {\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('invalidDates')\n invalidDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('popDirection')\n popDirectionHandler() {\n handleRenamedProp(this, 'popDirection', 'popoverDirection');\n }\n\n @Watch('startDate')\n startDateObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('typeable')\n typeableChanged() {\n this.valueObserver(this.value);\n }\n\n @Watch('validDates')\n validDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\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.selectedMonthYear = setupMonthYear(newDate);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n if (this.controlElement) {\n this.controlElement.value = shortFormattedValue;\n } else {\n this.scheduledAfterRender.push(() => {\n if (this.controlElement) this.controlElement.value = shortFormattedValue;\n });\n }\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 // #endregion\n // #region Local Methods\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 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 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 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 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 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 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 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 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 get innerInputContainer(): HTMLElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-container');\n }\n\n get innerInputField(): HTMLInputElement | HTMLButtonElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-field');\n }\n\n get inputId() {\n return `calendar-guid-${this.guid}`;\n }\n\n get isTypeable(): boolean {\n return this.typeable;\n }\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 _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 activateDay(date: Date) {\n this.goToMonthYear(date.getMonth(), date.getFullYear());\n this.scheduledAfterRender.push(() => this.focusDay(date));\n }\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 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 closeCalendar = () => {\n if (!this.open) return;\n this.open = false;\n this.focusInput();\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 focusInput() {\n this.controlElement?.focus();\n }\n\n generateDateFromDay(day: number) {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n return new Date(selectedYear, monthIndex, day);\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 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 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.closeCalendar();\n this.focusInput();\n break;\n }\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 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 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 mirrorEmit(this, ['change', 'tctChange'], { value: null });\n this.typedValue = typedValue;\n }\n };\n\n onInputClick = () => {\n if (this.disabled) return;\n this.toggleCalendar();\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 onInputInput = ({ detail: { value } }: Q2InputCustomEvent<IEventDetail> & InputEvent) => {\n this.typedValue = value;\n };\n\n onInputKeydown = (event: KeyboardEvent) => {\n const { dateValue } = this;\n\n if (!this.disabled) {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n break;\n\n case 'Enter':\n case ' ':\n if (this.typeable) break;\n event.preventDefault();\n if (this.open) {\n this.closeCalendar();\n } else {\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n }\n break;\n }\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 mirrorEmit(this, ['change', 'tctChange'], { 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 onPopupKeyup = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.key === 'Esc') {\n this.onInputBlur();\n this.closeCalendar();\n }\n };\n\n onRefocus = () => {\n this.btnPrevMonth?.dispatchEvent(new FocusEvent('focus'));\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 selectDate = (newDate: Date) => {\n const { isValid } = this.dateList.find(({ date }) => isSameDay(date, newDate));\n if (!isValid) return;\n mirrorEmit(this, ['change', 'tctChange'], { value: formatDateISO(newDate) });\n this.typedValue = formatDateShort(newDate);\n this.invalid = false;\n mirrorEmit(this, ['success', 'tctSuccess'], { value: formatDateISO(newDate) });\n };\n\n setCompleteInput(inputDate: Date) {\n const formattedDate = formatDateShort(inputDate);\n mirrorEmit(this, ['change', 'tctChange'], { 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 setCustomLabel() {\n const customLabel = this.hostElement.querySelector('[slot=\"label\"]');\n if (customLabel) {\n this.controlElement?.appendChild(customLabel.cloneNode(true));\n this.hostElement.removeChild(customLabel);\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 mirrorEmit(this, ['error', 'tctError'], {\n errors: [\n {\n message,\n errorCode: 'generalInvalid',\n },\n ],\n });\n }\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 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 mirrorEmit(this, ['error', 'tctError'], {\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 mirrorEmit(this, ['success', 'tctSuccess'], { value: formatDateISO(dateValue) });\n }\n }\n } catch (error) {\n console.warn('Invalid moment value ', this.dateValue);\n }\n }\n\n // #endregion\n // #region Render Methods\n\n renderCalendarDays() {\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}`}\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\n aria-label={ariaLabel}\n role=\"text\"\n >\n {day?.integer ?? ''}\n </div>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n renderCalendarPopover() {\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 onTctClick={() => 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 onTctClick={() => 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 onTctClick={() => 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 onTctClick={() => 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.renderCalendarDays()}\n {this.disclaimer && <div class=\"calendar-disclaimer\">{loc(this.disclaimer)}</div>}\n <div\n tabindex=\"0\"\n class=\"sr refocus-popup\"\n onFocus={this.onRefocus}\n />\n </div>\n );\n }\n\n renderHintField() {\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 renderInputField() {\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 aria-expanded={`${!!this.open}`}\n aria-controls=\"calendar-popover\"\n hints={this.hintList}\n errors={this.errorList}\n onClick={isTypeable ? undefined : this.onInputClick}\n onChange={e => e.stopImmediatePropagation()}\n onTctChange={e => e.stopImmediatePropagation()}\n onInput={e => e.stopImmediatePropagation()}\n onTctInput={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 type=\"date\"\n hide-messages={!isTypeable}\n test-id=\"inputAndCalendarToggle\"\n _role=\"combobox\"\n _preventEntry={!isTypeable}\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 render() {\n return (\n <click-elsewhere\n class={this.open ? 'dropdown-open' : undefined}\n onChange={this.onClickElsewhere}\n >\n {this.renderInputField()}\n <q2-popover\n ref={el => (this.popoverElement = el)}\n id=\"calendar-popover\"\n controlElement={this.innerInputContainer}\n open={this.open}\n direction={this.popoverDirection}\n minHeight={this.popoverMinHeight}\n align={this.popoverAlignment}\n mode={this.popoverMode || undefined}\n block\n >\n {this.renderHintField()}\n {this.renderCalendarPopover()}\n </q2-popover>\n </click-elsewhere>\n );\n }\n\n // #endregion\n}\n"],"mappings":"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","ignoreList":[]}
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","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","Q2Calendar","constructor","hostRef","this","dayAbbrStrings","dayStrings","defaultFormatString","formatModifier","guid","createGuid","internalError","monthStrings","scheduledAfterRender","hintMessage","defaultHintMessage","hintMessageType","keyboardSelection","popoverMinHeight","popoverMode","closeCalendar","open","focusInput","goToMonthYear","dateList","buildDateList","checkActiveCellForBlankness","onClickElsewhere","event","target","localName","stopPropagation","onDateKeydown","currentDay","dataset","generateDateFromDay","key","preventDefault","activateDay","addDays","shiftKey","find","selectDate","onDateSelection","dateCell","closest","clickedDate","onHeaderControlKeydown","hasSelectedCell","_a","calendarBody","querySelector","onInputBlur","isTypeable","daysOfWeekChecksum","setHints","setCompleteInput","valueOnBlur","mirrorEmit","onInputClick","disabled","toggleCalendar","onInputFocus","controlElement","tmpTypedValue","onInputInput","detail","onInputKeydown","dateValue","openCalendar","typeable","onInputKeyup","yyyy","validateDate","onPopupKeyup","onRefocus","btnPrevMonth","dispatchEvent","FocusEvent","readonly","invalid","connectedCallback","componentWillLoad","popDirectionHandler","handleAriaLabel","componentDidLoad","overrideFocus","hostElement","setCustomLabel","componentDidRender","setTimeout","forEach","defaultChangeHandler","onchange","handleClear","defaultErrorHandler","onerror","delegateFocus","isEventFromElement","shadowRoot","focus","popoverStateHandler","defaultSuccessHandler","onsuccess","closePopover","_togglePopover","openPopover","setValue","waitForNextPaint","tableCell","calendarTable","click","typeValue","formattedDate","innerInputField","InputEvent","KeyboardEvent","ariaLabelObserver","cutoffTimeObserver","daysOfWeekChecksumObserver","endDateObserver","invalidDatesObserver","handleRenamedProp","startDateObserver","typeableChanged","valueObserver","validDatesObserver","newValue","isMoment","toDate","shortFormattedValue","canClear","clearable","computedPlaceholder","disabledMsg","buttonLabel","placeholder","currentWeeks","weeks","accum","item","index","chunkIndex","floor","ct","cutoffTime","isMomentString","test","errorList","errors","list","filter","error","concat","formattedValue","displayFormat","hintList","hints","hint","innerInputContainer","_b","inputId","selectedDate","selectedCell","toggleElement","btnCalendarToggle","focusDay","monthYear","activeElement","tagName","hasAttribute","calendarCells","querySelectorAll","indexOfCell","indexOf","dayToFocus","cell","customLabel","appendChild","cloneNode","removeChild","hintMessageElement","present","errorCode","isSelectedMonthAndYear","calculationDateList","dateValueDayOfMonth","_c","isDateValueInvalid","console","warn","renderCalendarDays","h","role","ref","scope","onClick","onKeyDown","elm","week","ariaLabel","class","tabindex","renderCalendarPopover","onKeyUp","calendarLabel","label","onTctClick","type","btnNextMonth","btnPrevYear","btnNextYear","id","disclaimer","onFocus","renderHintField","el","renderInputField","hideLabel","optional","onChange","e","stopImmediatePropagation","onTctChange","onInput","onTctInput","onBlur","_role","_preventEntry","slot","render","popoverElement","direction","popoverDirection","minHeight","align","popoverAlignment","mode","block"],"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 = false;\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 } else {\n isValid = true;\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 --comp-default-calendar-margin: #{var-list(var-prefixer(calendar-margin-top), --app-scale-5x, 25px) 0\n var-list(var-prefixer(calendar-margin-bottom), --app-scale-5x, 25px)};\n display: block;\n margin: var-list(--tct-calendar-margin, --comp-default-calendar-margin);\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 --tct-input-btn-hover-background: #{var-list(--tct-calendar-btn-hover-background, --app-gray-l3, #f2f2f2)};\n --tct-input-btn-icon-stroke-primary: #{var-list(--tct-calendar-btn-icon-stroke-primary, --app-gray, #747474)};\n --tct-input-btn-icon-stroke-secondary: #{var-list(--tct-calendar-btn-icon-stroke-secondary, --app-gray, #747474)};\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='true'] {\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 &[aria-selected='true']:focus {\n box-shadow:\n 0 0 0 2px\n var-list(\n var-prefixer(calendar-day-selected-outline-color),\n --tct-stoplight-info,\n --const-stoplight-info,\n #0079c1\n ),\n 0 0 0 4px var(--const-focus-color, #0066cc);\n }\n}\n\n.today-decorator {\n text-transform: uppercase;\n font-weight: 700;\n font-size: var(--tct-calendar-today-decorator-font-size, 10px);\n height: 12px;\n}\n\n.day-integer {\n font-size: var(--tct-calendar-day-integer-font-size, inherit);\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 createGuid,\n} from '../../utils';\nimport { IEventDetail } from '../q2-input/q2-input-types';\nimport { Q2InputCustomEvent } from 'src/components';\nimport mirrorEmit from '@/utils/mirror-emit';\n\n/**\n * @name Calendar\n * @category Forms\n * @summary Use for selecting a date from a calendar popover.\n */\n@Component({ tag: 'q2-calendar', shadow: true, styleUrl: 'q2-calendar.scss' })\nexport class Q2Calendar implements ComponentInterface {\n // #region Own Properties\n\n btnCalendarToggle: HTMLQ2BtnElement;\n btnNextMonth: HTMLQ2BtnElement;\n btnNextYear: HTMLQ2BtnElement;\n btnPrevMonth: HTMLQ2BtnElement;\n btnPrevYear: HTMLQ2BtnElement;\n calendarBody: HTMLDivElement;\n calendarTable: HTMLTableElement;\n controlElement: HTMLQ2InputElement;\n dayAbbrStrings = getDays();\n dayStrings = getDaysOfWeek();\n defaultFormatString = 'mm/dd/yyyy';\n formatModifier: string = 'M/D/YYYY'; // To allow missing leading zero, 4/3/2021 => converts into 04/03/2021\n guid = createGuid();\n hintMessageElement: HTMLQ2MessageElement;\n internalError: string = '';\n monthStrings = getMonths();\n popoverElement?: HTMLQ2PopoverElement;\n scheduledAfterRender: (() => void)[] = [];\n selectedMonthYear: ISelectedMonthYear;\n valueOnBlur: string | { toDate(): Date };\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n dateList: CalendarDay[];\n\n @State()\n hintMessage: string = this.defaultHintMessage;\n\n @State()\n hintMessageType: 'info' | 'error' = 'info';\n\n @State()\n keyboardSelection: boolean = false;\n\n @State()\n typedValue: string = '';\n\n // #endregion\n // #region Public Property API\n\n /** @deprecated */\n @Prop({ reflect: true, mutable: true })\n ariaLabel: string;\n\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 })\n assume: 'current' | 'future' | 'past' = 'current';\n\n /** @deprecated */\n @Prop({ reflect: true })\n buttonLabel: string;\n\n /** A label shown at the top of the popover date picker. */\n @Prop({ reflect: true })\n calendarLabel: string;\n\n /** Display a button in the input field allowing the user to clear their selection. */\n @Prop({ reflect: true })\n 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 })\n 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 })\n daysOfWeekChecksum: number;\n\n /** Disable the input field. */\n @Prop({ reflect: true })\n disabled: boolean;\n\n /**\n * Text that displays as the placeholder when the field is marked `disabled`.\n * @localizable\n */\n @Prop({ reflect: true })\n disabledMsg: string;\n\n /** Text that appears at the bottom of the popover date picker. */\n @Prop({ reflect: true })\n 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 })\n 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 })\n 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 })\n errors: string[];\n\n /** Hide the input field's ` <label> ` element from view. */\n @Prop({ reflect: true, mutable: true })\n 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 })\n hints: string[];\n\n /** Show error styles when the calendar is in an errant state. */\n @Prop({ reflect: true, mutable: true })\n 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()\n invalidDates: string[];\n\n /** The visible label for the `q2-calendar` input field. */\n @Prop({ reflect: true, mutable: true })\n label: string;\n\n /** @deprecated */\n @Prop()\n onsuccess: (e: CustomEvent) => void;\n\n /**\n * Determine whether the popover is open or closed.\n *\n * @readonly\n */\n @Prop({ reflect: true, mutable: true })\n open: boolean;\n\n /** Appends \"(optional)\" to the label and sets `aria-required=\"false\"`. */\n @Prop({ reflect: true })\n 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 })\n placeholder: string;\n\n /** @deprecated */\n @Prop({ reflect: true })\n popDirection: 'up' | 'down';\n\n /** Aligns the popover date picker to the left or right side of the input field. */\n @Prop()\n 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 })\n popoverDirection: 'up' | 'down';\n\n /** @deprecated */\n @Prop()\n popoverMinHeight: number = 355;\n\n /**\n * Determines the display mode of the popover.\n *\n * Providing a value of `legacy` instructs the popover to use absolute positioning instead of fixed positioning.\n *\n * @info\n * This is a temporary solution to work around styling issues related to using fixed positioning for the popover\n * when nested inside of elements with transform properties. This will be removed once the popover API is available\n * for use.\n */\n @Prop({ mutable: true })\n popoverMode: 'legacy' = null;\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 })\n 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 })\n startDate: string;\n\n /** The user can type in the field. Only available in desktop browsers. */\n @Prop({ reflect: true })\n 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()\n 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 })\n value: string | { toDate(): Date };\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when a date is selected or typed in the input field.\n * @legacyEvent\n * @deprecated Use 'tctChange' instead\n */\n @Event()\n 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 * @deprecated Use 'tctError' instead\n */\n @Event()\n error: EventEmitter<{ errors: { message: string; errorCode: string }[] }>;\n\n /**\n * Emitted when a valid date is entered or selected.\n * @deprecated Use 'tctSuccess' instead\n */\n @Event()\n success: EventEmitter<{\n // ISO formatted date\n value: string;\n }>;\n\n /**\n * Emitted when a date is selected or typed in the input field.\n * @legacyEvent\n */\n @Event()\n tctChange: 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()\n tctError: EventEmitter<{ errors: { message: string; errorCode: string }[] }>;\n\n /**\n * Emitted when a valid date is entered or selected.\n */\n @Event()\n tctSuccess: EventEmitter<{\n // ISO formatted date\n value: string;\n }>;\n\n // #endregion\n // #region Component Lifecycle Events\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 componentDidLoad(): void {\n overrideFocus(this.hostElement);\n this.setCustomLabel();\n }\n\n componentDidRender() {\n setTimeout(() => {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n }, 25);\n }\n\n // #endregion\n // #region Listeners\n\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('clear')\n handleClear() {\n mirrorEmit(this, ['change', 'tctChange'], { value: null });\n this.value = null;\n this.typedValue = '';\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('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('popoverStateChanged')\n popoverStateHandler({ detail: { open } }: CustomEvent<{ open: boolean }>) {\n if (this.open !== open) this.open = open;\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 // #endregion\n // #region Public Methods API\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 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 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 // #endregion\n // #region Watchers\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n @Watch('cutoffTime')\n cutoffTimeObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('daysOfWeekChecksum')\n daysOfWeekChecksumObserver() {\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('invalidDates')\n invalidDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('popDirection')\n popDirectionHandler() {\n handleRenamedProp(this, 'popDirection', 'popoverDirection');\n }\n\n @Watch('startDate')\n startDateObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('typeable')\n typeableChanged() {\n this.valueObserver(this.value);\n }\n\n @Watch('validDates')\n validDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\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.selectedMonthYear = setupMonthYear(newDate);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n if (this.controlElement) {\n this.controlElement.value = shortFormattedValue;\n } else {\n this.scheduledAfterRender.push(() => {\n if (this.controlElement) this.controlElement.value = shortFormattedValue;\n });\n }\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 // #endregion\n // #region Local Methods\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 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 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 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 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 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 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 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 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 get innerInputContainer(): HTMLElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-container');\n }\n\n get innerInputField(): HTMLInputElement | HTMLButtonElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-field');\n }\n\n get inputId() {\n return `calendar-guid-${this.guid}`;\n }\n\n get isTypeable(): boolean {\n return this.typeable;\n }\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 _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 activateDay(date: Date) {\n this.goToMonthYear(date.getMonth(), date.getFullYear());\n this.scheduledAfterRender.push(() => this.focusDay(date));\n }\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 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 closeCalendar = () => {\n if (!this.open) return;\n this.open = false;\n this.focusInput();\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 focusInput() {\n this.controlElement?.focus();\n }\n\n generateDateFromDay(day: number) {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n return new Date(selectedYear, monthIndex, day);\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 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 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.closeCalendar();\n this.focusInput();\n break;\n }\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 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 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 mirrorEmit(this, ['change', 'tctChange'], { value: null });\n this.typedValue = typedValue;\n }\n };\n\n onInputClick = () => {\n if (this.disabled) return;\n this.toggleCalendar();\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 onInputInput = ({ detail: { value } }: Q2InputCustomEvent<IEventDetail> & InputEvent) => {\n this.typedValue = value;\n };\n\n onInputKeydown = (event: KeyboardEvent) => {\n const { dateValue } = this;\n\n if (!this.disabled) {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n break;\n\n case 'Enter':\n case ' ':\n if (this.typeable) break;\n event.preventDefault();\n if (this.open) {\n this.closeCalendar();\n } else {\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n }\n break;\n }\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 mirrorEmit(this, ['change', 'tctChange'], { 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 onPopupKeyup = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.key === 'Esc') {\n this.onInputBlur();\n this.closeCalendar();\n }\n };\n\n onRefocus = () => {\n this.btnPrevMonth?.dispatchEvent(new FocusEvent('focus'));\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 selectDate = (newDate: Date) => {\n const { isValid } = this.dateList.find(({ date }) => isSameDay(date, newDate));\n if (!isValid) return;\n mirrorEmit(this, ['change', 'tctChange'], { value: formatDateISO(newDate) });\n this.typedValue = formatDateShort(newDate);\n this.invalid = false;\n mirrorEmit(this, ['success', 'tctSuccess'], { value: formatDateISO(newDate) });\n };\n\n setCompleteInput(inputDate: Date) {\n const formattedDate = formatDateShort(inputDate);\n mirrorEmit(this, ['change', 'tctChange'], { 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 setCustomLabel() {\n const customLabel = this.hostElement.querySelector('[slot=\"label\"]');\n if (customLabel) {\n this.controlElement?.appendChild(customLabel.cloneNode(true));\n this.hostElement.removeChild(customLabel);\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 mirrorEmit(this, ['error', 'tctError'], {\n errors: [\n {\n message,\n errorCode: 'generalInvalid',\n },\n ],\n });\n }\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 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 mirrorEmit(this, ['error', 'tctError'], {\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 mirrorEmit(this, ['success', 'tctSuccess'], { value: formatDateISO(dateValue) });\n }\n }\n } catch (error) {\n console.warn('Invalid moment value ', this.dateValue);\n }\n }\n\n // #endregion\n // #region Render Methods\n\n renderCalendarDays() {\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}`}\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\n class=\"day-integer\"\n aria-label={ariaLabel}\n role=\"text\"\n >\n {day?.integer ?? ''}\n </div>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n renderCalendarPopover() {\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 onTctClick={() => 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 onTctClick={() => 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 onTctClick={() => 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 onTctClick={() => 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.renderCalendarDays()}\n {this.disclaimer && <div class=\"calendar-disclaimer\">{loc(this.disclaimer)}</div>}\n <div\n tabindex=\"0\"\n class=\"sr refocus-popup\"\n onFocus={this.onRefocus}\n />\n </div>\n );\n }\n\n renderHintField() {\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 renderInputField() {\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 aria-expanded={`${!!this.open}`}\n aria-controls=\"calendar-popover\"\n hints={this.hintList}\n errors={this.errorList}\n onClick={isTypeable ? undefined : this.onInputClick}\n onChange={e => e.stopImmediatePropagation()}\n onTctChange={e => e.stopImmediatePropagation()}\n onInput={e => e.stopImmediatePropagation()}\n onTctInput={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 type=\"date\"\n hide-messages={!isTypeable}\n test-id=\"inputAndCalendarToggle\"\n _role=\"combobox\"\n _preventEntry={!isTypeable}\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 render() {\n return (\n <click-elsewhere\n class={this.open ? 'dropdown-open' : undefined}\n onChange={this.onClickElsewhere}\n >\n {this.renderInputField()}\n <q2-popover\n ref={el => (this.popoverElement = el)}\n id=\"calendar-popover\"\n controlElement={this.innerInputContainer}\n open={this.open}\n direction={this.popoverDirection}\n minHeight={this.popoverMinHeight}\n align={this.popoverAlignment}\n mode={this.popoverMode || undefined}\n block\n >\n {this.renderHintField()}\n {this.renderCalendarPopover()}\n </q2-popover>\n </click-elsewhere>\n );\n }\n\n // #endregion\n}\n"],"mappings":"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","ignoreList":[]}