q2-tecton-elements 1.67.2 → 1.68.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 (807) hide show
  1. package/dist/bundle-report.json +22598 -10670
  2. package/dist/cjs/click-elsewhere.q2-option-list.q2-popover.entry.cjs.js.map +1 -1
  3. package/dist/cjs/click-elsewhere_3.cjs.entry.js +46 -32
  4. package/dist/cjs/click-elsewhere_3.cjs.entry.js.map +1 -1
  5. package/dist/cjs/{component-DRAntnCA.js → component-iASoq6gx.js} +9 -3
  6. package/dist/cjs/component-iASoq6gx.js.map +1 -0
  7. package/dist/cjs/{index-YvKoRT-t.js → index-DmGkqdX2.js} +3 -3
  8. package/dist/cjs/index-DmGkqdX2.js.map +1 -0
  9. package/dist/cjs/loader.cjs.js +1 -1
  10. package/dist/cjs/q2-action-group.q2-resize-observer.entry.cjs.js.map +1 -1
  11. package/dist/cjs/q2-action-group_2.cjs.entry.js +2 -2
  12. package/dist/cjs/q2-action-group_2.cjs.entry.js.map +1 -1
  13. package/dist/cjs/q2-action-sheet.cjs.entry.js +109 -4
  14. package/dist/cjs/q2-action-sheet.cjs.entry.js.map +1 -1
  15. package/dist/cjs/q2-action-sheet.entry.cjs.js.map +1 -1
  16. package/dist/cjs/q2-avatar.cjs.entry.js.map +1 -1
  17. package/dist/cjs/q2-avatar.entry.cjs.js.map +1 -1
  18. package/dist/cjs/q2-badge.cjs.entry.js +1 -1
  19. package/dist/cjs/q2-badge.cjs.entry.js.map +1 -1
  20. package/dist/cjs/q2-badge.entry.cjs.js.map +1 -1
  21. package/dist/cjs/q2-btn.q2-loading.entry.cjs.js.map +1 -1
  22. package/dist/cjs/q2-btn_2.cjs.entry.js +1 -1
  23. package/dist/cjs/q2-btn_2.cjs.entry.js.map +1 -1
  24. package/dist/cjs/q2-calendar.cjs.entry.js +6 -3
  25. package/dist/cjs/q2-calendar.cjs.entry.js.map +1 -1
  26. package/dist/cjs/q2-calendar.entry.cjs.js.map +1 -1
  27. package/dist/cjs/q2-card-image.cjs.entry.js +2 -2
  28. package/dist/cjs/q2-card-image.cjs.entry.js.map +1 -1
  29. package/dist/cjs/q2-card-image.entry.cjs.js.map +1 -1
  30. package/dist/cjs/q2-card.cjs.entry.js +1 -1
  31. package/dist/cjs/q2-card.cjs.entry.js.map +1 -1
  32. package/dist/cjs/q2-card.entry.cjs.js.map +1 -1
  33. package/dist/cjs/q2-carousel-pane.cjs.entry.js +3 -3
  34. package/dist/cjs/q2-carousel-pane.cjs.entry.js.map +1 -1
  35. package/dist/cjs/q2-carousel-pane.entry.cjs.js.map +1 -1
  36. package/dist/cjs/q2-carousel.cjs.entry.js +162 -29
  37. package/dist/cjs/q2-carousel.cjs.entry.js.map +1 -1
  38. package/dist/cjs/q2-carousel.entry.cjs.js.map +1 -1
  39. package/dist/cjs/q2-chart-area.cjs.entry.js +1 -1
  40. package/dist/cjs/q2-chart-bar.cjs.entry.js +1 -1
  41. package/dist/cjs/q2-chart-donut.cjs.entry.js +3 -2
  42. package/dist/cjs/q2-chart-donut.cjs.entry.js.map +1 -1
  43. package/dist/cjs/q2-chart-donut.entry.cjs.js.map +1 -1
  44. package/dist/cjs/q2-checkbox-group.cjs.entry.js +2 -2
  45. package/dist/cjs/q2-checkbox-group.cjs.entry.js.map +1 -1
  46. package/dist/cjs/q2-checkbox-group.entry.cjs.js.map +1 -1
  47. package/dist/cjs/q2-checkbox.q2-tag.entry.cjs.js.map +1 -1
  48. package/dist/cjs/q2-checkbox_2.cjs.entry.js +3 -3
  49. package/dist/cjs/q2-checkbox_2.cjs.entry.js.map +1 -1
  50. package/dist/cjs/q2-context.cjs.entry.js +2 -2
  51. package/dist/cjs/q2-context.cjs.entry.js.map +1 -1
  52. package/dist/cjs/q2-context.entry.cjs.js.map +1 -1
  53. package/dist/cjs/q2-currency.cjs.entry.js +2 -3
  54. package/dist/cjs/q2-currency.cjs.entry.js.map +1 -1
  55. package/dist/cjs/q2-currency.entry.cjs.js.map +1 -1
  56. package/dist/cjs/q2-data-table.cjs.entry.js +2 -2
  57. package/dist/cjs/q2-data-table.cjs.entry.js.map +1 -1
  58. package/dist/cjs/q2-data-table.entry.cjs.js.map +1 -1
  59. package/dist/cjs/q2-detail.cjs.entry.js +2 -2
  60. package/dist/cjs/q2-detail.cjs.entry.js.map +1 -1
  61. package/dist/cjs/q2-detail.entry.cjs.js.map +1 -1
  62. package/dist/cjs/q2-dropdown-item.cjs.entry.js +2 -2
  63. package/dist/cjs/q2-dropdown-item.cjs.entry.js.map +1 -1
  64. package/dist/cjs/q2-dropdown-item.entry.cjs.js.map +1 -1
  65. package/dist/cjs/q2-dropdown.cjs.entry.js +3 -5
  66. package/dist/cjs/q2-dropdown.cjs.entry.js.map +1 -1
  67. package/dist/cjs/q2-dropdown.entry.cjs.js.map +1 -1
  68. package/dist/cjs/q2-editable-field.cjs.entry.js +1 -1
  69. package/dist/cjs/q2-editable-field.cjs.entry.js.map +1 -1
  70. package/dist/cjs/q2-editable-field.entry.cjs.js.map +1 -1
  71. package/dist/cjs/q2-example.cjs.entry.js +1 -1
  72. package/dist/cjs/q2-file-picker.cjs.entry.js +1 -1
  73. package/dist/cjs/q2-file-picker.cjs.entry.js.map +1 -1
  74. package/dist/cjs/q2-file-picker.entry.cjs.js.map +1 -1
  75. package/dist/cjs/q2-form.cjs.entry.js +2 -2
  76. package/dist/cjs/q2-form.cjs.entry.js.map +1 -1
  77. package/dist/cjs/q2-form.entry.cjs.js.map +1 -1
  78. package/dist/cjs/q2-formatted-text.cjs.entry.js +1 -1
  79. package/dist/cjs/q2-formatted-text.cjs.entry.js.map +1 -1
  80. package/dist/cjs/q2-formatted-text.entry.cjs.js.map +1 -1
  81. package/dist/cjs/q2-grid-area.cjs.entry.js +1 -1
  82. package/dist/cjs/q2-grid.cjs.entry.js +32 -8
  83. package/dist/cjs/q2-grid.cjs.entry.js.map +1 -1
  84. package/dist/cjs/q2-grid.entry.cjs.js.map +1 -1
  85. package/dist/cjs/q2-icon.cjs.entry.js +1 -1
  86. package/dist/cjs/q2-icon.cjs.entry.js.map +1 -1
  87. package/dist/cjs/q2-icon.entry.cjs.js.map +1 -1
  88. package/dist/cjs/q2-input.cjs.entry.js +8 -5
  89. package/dist/cjs/q2-input.cjs.entry.js.map +1 -1
  90. package/dist/cjs/q2-input.entry.cjs.js.map +1 -1
  91. package/dist/cjs/q2-item.cjs.entry.js +2 -2
  92. package/dist/cjs/q2-item.cjs.entry.js.map +1 -1
  93. package/dist/cjs/q2-item.entry.cjs.js.map +1 -1
  94. package/dist/cjs/q2-legend.cjs.entry.js +2 -3
  95. package/dist/cjs/q2-legend.cjs.entry.js.map +1 -1
  96. package/dist/cjs/q2-legend.entry.cjs.js.map +1 -1
  97. package/dist/cjs/q2-link.q2-list.entry.cjs.js.map +1 -1
  98. package/dist/cjs/q2-link_2.cjs.entry.js +2 -2
  99. package/dist/cjs/q2-link_2.cjs.entry.js.map +1 -1
  100. package/dist/cjs/q2-loc.cjs.entry.js +1 -1
  101. package/dist/cjs/q2-message.cjs.entry.js +3 -3
  102. package/dist/cjs/q2-message.cjs.entry.js.map +1 -1
  103. package/dist/cjs/q2-message.entry.cjs.js.map +1 -1
  104. package/dist/cjs/q2-meter.cjs.entry.js +2 -2
  105. package/dist/cjs/q2-meter.cjs.entry.js.map +1 -1
  106. package/dist/cjs/q2-meter.entry.cjs.js.map +1 -1
  107. package/dist/cjs/q2-modal.cjs.entry.js +3 -3
  108. package/dist/cjs/q2-modal.cjs.entry.js.map +1 -1
  109. package/dist/cjs/q2-modal.entry.cjs.js.map +1 -1
  110. package/dist/cjs/q2-month-picker.cjs.entry.js +1 -1
  111. package/dist/cjs/q2-mutation-observer.cjs.entry.js +1 -1
  112. package/dist/cjs/q2-optgroup.cjs.entry.js +3 -3
  113. package/dist/cjs/q2-optgroup.cjs.entry.js.map +1 -1
  114. package/dist/cjs/q2-optgroup.entry.cjs.js.map +1 -1
  115. package/dist/cjs/q2-option.cjs.entry.js +3 -3
  116. package/dist/cjs/q2-option.cjs.entry.js.map +1 -1
  117. package/dist/cjs/q2-option.entry.cjs.js.map +1 -1
  118. package/dist/cjs/q2-otp.cjs.entry.js +373 -0
  119. package/dist/cjs/q2-otp.cjs.entry.js.map +1 -0
  120. package/dist/cjs/q2-otp.entry.cjs.js.map +1 -0
  121. package/dist/cjs/q2-pagination.cjs.entry.js +4 -4
  122. package/dist/cjs/q2-pagination.cjs.entry.js.map +1 -1
  123. package/dist/cjs/q2-pagination.entry.cjs.js.map +1 -1
  124. package/dist/cjs/q2-pill.cjs.entry.js +24 -15
  125. package/dist/cjs/q2-pill.cjs.entry.js.map +1 -1
  126. package/dist/cjs/q2-pill.entry.cjs.js.map +1 -1
  127. package/dist/cjs/q2-radio-group.cjs.entry.js +1 -1
  128. package/dist/cjs/q2-radio-group.cjs.entry.js.map +1 -1
  129. package/dist/cjs/q2-radio-group.entry.cjs.js.map +1 -1
  130. package/dist/cjs/q2-radio.cjs.entry.js +3 -3
  131. package/dist/cjs/q2-radio.cjs.entry.js.map +1 -1
  132. package/dist/cjs/q2-radio.entry.cjs.js.map +1 -1
  133. package/dist/cjs/q2-relative-time.cjs.entry.js +2 -2
  134. package/dist/cjs/q2-section-container.cjs.entry.js +1 -1
  135. package/dist/cjs/q2-section.cjs.entry.js +3 -3
  136. package/dist/cjs/q2-section.cjs.entry.js.map +1 -1
  137. package/dist/cjs/q2-section.entry.cjs.js.map +1 -1
  138. package/dist/cjs/q2-select.cjs.entry.js +1 -1
  139. package/dist/cjs/q2-select.cjs.entry.js.map +1 -1
  140. package/dist/cjs/q2-select.entry.cjs.js.map +1 -1
  141. package/dist/cjs/q2-stepper-pane.cjs.entry.js +3 -3
  142. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +2 -2
  143. package/dist/cjs/q2-stepper-vertical.cjs.entry.js.map +1 -1
  144. package/dist/cjs/q2-stepper-vertical.entry.cjs.js.map +1 -1
  145. package/dist/cjs/q2-stepper.cjs.entry.js +2 -2
  146. package/dist/cjs/q2-stepper.cjs.entry.js.map +1 -1
  147. package/dist/cjs/q2-stepper.entry.cjs.js.map +1 -1
  148. package/dist/cjs/q2-tab-container.cjs.entry.js +3 -3
  149. package/dist/cjs/q2-tab-container.cjs.entry.js.map +1 -1
  150. package/dist/cjs/q2-tab-container.entry.cjs.js.map +1 -1
  151. package/dist/cjs/q2-tab-pane.cjs.entry.js +2 -2
  152. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  153. package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
  154. package/dist/cjs/q2-textarea.cjs.entry.js.map +1 -1
  155. package/dist/cjs/q2-textarea.entry.cjs.js.map +1 -1
  156. package/dist/cjs/q2-toast.cjs.entry.js +1 -1
  157. package/dist/cjs/q2-toast.cjs.entry.js.map +1 -1
  158. package/dist/cjs/q2-toast.entry.cjs.js.map +1 -1
  159. package/dist/cjs/q2-tooltip.cjs.entry.js +124 -5
  160. package/dist/cjs/q2-tooltip.cjs.entry.js.map +1 -1
  161. package/dist/cjs/q2-tooltip.entry.cjs.js.map +1 -1
  162. package/dist/cjs/{sanitize-html-string-CW6y5624.js → sanitize-html-string-D17Pr7-c.js} +21 -4
  163. package/dist/cjs/{sanitize-html-string-CW6y5624.js.map → sanitize-html-string-D17Pr7-c.js.map} +1 -1
  164. package/dist/cjs/tecton-tab-pane.cjs.entry.js +2 -2
  165. package/dist/collection/collection-manifest.json +1 -0
  166. package/dist/collection/components/click-elsewhere/click-elsewhere.js +2 -0
  167. package/dist/collection/components/click-elsewhere/click-elsewhere.js.map +1 -1
  168. package/dist/collection/components/q2-action-group/q2-action-group.css +14 -0
  169. package/dist/collection/components/q2-action-sheet/q2-action-sheet.css +16 -0
  170. package/dist/collection/components/q2-action-sheet/q2-action-sheet.js +107 -2
  171. package/dist/collection/components/q2-action-sheet/q2-action-sheet.js.map +1 -1
  172. package/dist/collection/components/q2-avatar/q2-avatar.css +24 -0
  173. package/dist/collection/components/q2-avatar/test/q2-avatar-test.vr.js +61 -0
  174. package/dist/collection/components/q2-avatar/test/q2-avatar-test.vr.js.map +1 -0
  175. package/dist/collection/components/q2-badge/q2-badge.css +30 -0
  176. package/dist/collection/components/q2-badge/test/q2-badge-test.vr.js +34 -0
  177. package/dist/collection/components/q2-badge/test/q2-badge-test.vr.js.map +1 -0
  178. package/dist/collection/components/q2-btn/q2-btn.css +279 -0
  179. package/dist/collection/components/q2-btn/test/q2-btn-test.vr.js +80 -0
  180. package/dist/collection/components/q2-btn/test/q2-btn-test.vr.js.map +1 -0
  181. package/dist/collection/components/q2-calendar/q2-calendar.css +36 -0
  182. package/dist/collection/components/q2-calendar/q2-calendar.js +5 -2
  183. package/dist/collection/components/q2-calendar/q2-calendar.js.map +1 -1
  184. package/dist/collection/components/q2-calendar/test/q2-calendar-test.vr.js +170 -0
  185. package/dist/collection/components/q2-calendar/test/q2-calendar-test.vr.js.map +1 -0
  186. package/dist/collection/components/q2-card/q2-card.css +62 -0
  187. package/dist/collection/components/q2-card/test/q2-card-test.vr.js +72 -0
  188. package/dist/collection/components/q2-card/test/q2-card-test.vr.js.map +1 -0
  189. package/dist/collection/components/q2-card-image/q2-card-image.css +74 -13
  190. package/dist/collection/components/q2-card-image/test/q2-card-image-test.vr.js +152 -0
  191. package/dist/collection/components/q2-card-image/test/q2-card-image-test.vr.js.map +1 -0
  192. package/dist/collection/components/q2-carousel/q2-carousel.css +78 -13
  193. package/dist/collection/components/q2-carousel/q2-carousel.js +241 -27
  194. package/dist/collection/components/q2-carousel/q2-carousel.js.map +1 -1
  195. package/dist/collection/components/q2-carousel/test/q2-carousel-test.vr.js +104 -0
  196. package/dist/collection/components/q2-carousel/test/q2-carousel-test.vr.js.map +1 -0
  197. package/dist/collection/components/q2-carousel-pane/q2-carousel-pane.css +26 -1
  198. package/dist/collection/components/q2-chart-area/test/q2-chart-area-test.vr.js +126 -0
  199. package/dist/collection/components/q2-chart-area/test/q2-chart-area-test.vr.js.map +1 -0
  200. package/dist/collection/components/q2-chart-bar/test/q2-chart-bar-test.vr.js +105 -0
  201. package/dist/collection/components/q2-chart-bar/test/q2-chart-bar-test.vr.js.map +1 -0
  202. package/dist/collection/components/q2-chart-donut/q2-chart-donut.css +29 -0
  203. package/dist/collection/components/q2-chart-donut/q2-chart-donut.js +21 -1
  204. package/dist/collection/components/q2-chart-donut/q2-chart-donut.js.map +1 -1
  205. package/dist/collection/components/q2-chart-donut/test/q2-chart-donut-test.vr.js +151 -0
  206. package/dist/collection/components/q2-chart-donut/test/q2-chart-donut-test.vr.js.map +1 -0
  207. package/dist/collection/components/q2-checkbox/q2-checkbox.css +128 -0
  208. package/dist/collection/components/q2-checkbox/test/q2-checkbox-test.vr.js +69 -0
  209. package/dist/collection/components/q2-checkbox/test/q2-checkbox-test.vr.js.map +1 -0
  210. package/dist/collection/components/q2-checkbox-group/q2-checkbox-group.css +21 -0
  211. package/dist/collection/components/q2-checkbox-group/test/q2-checkbox-group-test.vr.js +61 -0
  212. package/dist/collection/components/q2-checkbox-group/test/q2-checkbox-group-test.vr.js.map +1 -0
  213. package/dist/collection/components/q2-context/q2-context.css +16 -0
  214. package/dist/collection/components/q2-context/test/q2-context-test.vr.js +95 -0
  215. package/dist/collection/components/q2-context/test/q2-context-test.vr.js.map +1 -0
  216. package/dist/collection/components/q2-currency/q2-currency.css +31 -0
  217. package/dist/collection/components/q2-currency/q2-currency.js +3 -4
  218. package/dist/collection/components/q2-currency/q2-currency.js.map +1 -1
  219. package/dist/collection/components/q2-currency/test/q2-currency-test.vr.js +79 -0
  220. package/dist/collection/components/q2-currency/test/q2-currency-test.vr.js.map +1 -0
  221. package/dist/collection/components/q2-data-table/q2-data-table.css +51 -0
  222. package/dist/collection/components/q2-data-table/q2-data-table.js +1 -1
  223. package/dist/collection/components/q2-data-table/test/q2-data-table-test.vr.js +79 -0
  224. package/dist/collection/components/q2-data-table/test/q2-data-table-test.vr.js.map +1 -0
  225. package/dist/collection/components/q2-detail/q2-detail.css +42 -0
  226. package/dist/collection/components/q2-detail/q2-detail.js +1 -1
  227. package/dist/collection/components/q2-dropdown/q2-dropdown.css +8 -0
  228. package/dist/collection/components/q2-dropdown/q2-dropdown.js +2 -4
  229. package/dist/collection/components/q2-dropdown/q2-dropdown.js.map +1 -1
  230. package/dist/collection/components/q2-dropdown-item/q2-dropdown-item.css +11 -0
  231. package/dist/collection/components/q2-editable-field/q2-editable-field.css +5 -0
  232. package/dist/collection/components/q2-editable-field/test/q2-editable-field-test.vr.js +89 -0
  233. package/dist/collection/components/q2-editable-field/test/q2-editable-field-test.vr.js.map +1 -0
  234. package/dist/collection/components/q2-example/q2-example.js +1 -1
  235. package/dist/collection/components/q2-file-picker/q2-file-picker.css +64 -0
  236. package/dist/collection/components/q2-file-picker/test/q2-file-picker-test.vr.js +92 -0
  237. package/dist/collection/components/q2-file-picker/test/q2-file-picker-test.vr.js.map +1 -0
  238. package/dist/collection/components/q2-form/q2-form.css +34 -20
  239. package/dist/collection/components/q2-form/q2-form.js +1 -1
  240. package/dist/collection/components/q2-formatted-text/q2-formatted-text.css +14 -0
  241. package/dist/collection/components/q2-formatted-text/q2-formatted-text.js +1 -1
  242. package/dist/collection/components/q2-formatted-text/test/q2-formatted-text-test.vr.js +55 -0
  243. package/dist/collection/components/q2-formatted-text/test/q2-formatted-text-test.vr.js.map +1 -0
  244. package/dist/collection/components/q2-grid/q2-grid.css +13 -0
  245. package/dist/collection/components/q2-grid/q2-grid.js +31 -7
  246. package/dist/collection/components/q2-grid/q2-grid.js.map +1 -1
  247. package/dist/collection/components/q2-icon/assets/standard.symbol.svg +1 -1
  248. package/dist/collection/components/q2-icon/q2-icon.css +15 -0
  249. package/dist/collection/components/q2-icon/test/q2-icon-test.vr.js +55 -0
  250. package/dist/collection/components/q2-icon/test/q2-icon-test.vr.js.map +1 -0
  251. package/dist/collection/components/q2-input/q2-input.css +104 -0
  252. package/dist/collection/components/q2-input/q2-input.js +6 -3
  253. package/dist/collection/components/q2-input/q2-input.js.map +1 -1
  254. package/dist/collection/components/q2-input/test/q2-input-test.vr.js +97 -0
  255. package/dist/collection/components/q2-input/test/q2-input-test.vr.js.map +1 -0
  256. package/dist/collection/components/q2-item/q2-item.css +28 -0
  257. package/dist/collection/components/q2-item/q2-item.js +1 -1
  258. package/dist/collection/components/q2-legend/q2-legend.css +16 -0
  259. package/dist/collection/components/q2-legend/q2-legend.js +21 -3
  260. package/dist/collection/components/q2-legend/q2-legend.js.map +1 -1
  261. package/dist/collection/components/q2-link/q2-link.css +20 -0
  262. package/dist/collection/components/q2-link/test/q2-link-test.vr.js +70 -0
  263. package/dist/collection/components/q2-link/test/q2-link-test.vr.js.map +1 -0
  264. package/dist/collection/components/q2-list/q2-list.css +14 -0
  265. package/dist/collection/components/q2-list/q2-list.js +1 -1
  266. package/dist/collection/components/q2-list/test/q2-list-test.vr.js +58 -0
  267. package/dist/collection/components/q2-list/test/q2-list-test.vr.js.map +1 -0
  268. package/dist/collection/components/q2-loading/q2-loading.css +9 -0
  269. package/dist/collection/components/q2-message/q2-message.css +29 -1
  270. package/dist/collection/components/q2-message/q2-message.js +1 -1
  271. package/dist/collection/components/q2-message/test/q2-message-test.vr.js +57 -0
  272. package/dist/collection/components/q2-message/test/q2-message-test.vr.js.map +1 -0
  273. package/dist/collection/components/q2-meter/q2-meter.css +40 -0
  274. package/dist/collection/components/q2-meter/q2-meter.js +1 -1
  275. package/dist/collection/components/q2-meter/test/q2-meter-test.vr.js +78 -0
  276. package/dist/collection/components/q2-meter/test/q2-meter-test.vr.js.map +1 -0
  277. package/dist/collection/components/q2-modal/q2-modal.css +21 -0
  278. package/dist/collection/components/q2-modal/q2-modal.js +1 -1
  279. package/dist/collection/components/q2-modal/test/q2-modal-test.vr.js +107 -0
  280. package/dist/collection/components/q2-modal/test/q2-modal-test.vr.js.map +1 -0
  281. package/dist/collection/components/q2-mutation-observer/q2-mutation-observer.js +1 -1
  282. package/dist/collection/components/q2-optgroup/q2-optgroup.css +11 -0
  283. package/dist/collection/components/q2-optgroup/q2-optgroup.js +1 -1
  284. package/dist/collection/components/q2-option/q2-option.css +9 -0
  285. package/dist/collection/components/q2-option/q2-option.js +1 -1
  286. package/dist/collection/components/q2-option/q2-option.js.map +1 -1
  287. package/dist/collection/components/q2-option-list/q2-option-list.css +3 -0
  288. package/dist/collection/components/q2-option-list/q2-option-list.js +37 -28
  289. package/dist/collection/components/q2-option-list/q2-option-list.js.map +1 -1
  290. package/dist/collection/components/q2-otp/q2-otp.css +312 -0
  291. package/dist/collection/components/q2-otp/q2-otp.js +873 -0
  292. package/dist/collection/components/q2-otp/q2-otp.js.map +1 -0
  293. package/dist/collection/components/q2-pagination/q2-pagination.css +22 -0
  294. package/dist/collection/components/q2-pagination/q2-pagination.js +3 -3
  295. package/dist/collection/components/q2-pagination/test/q2-pagination-test.vr.js +145 -0
  296. package/dist/collection/components/q2-pagination/test/q2-pagination-test.vr.js.map +1 -0
  297. package/dist/collection/components/q2-pill/q2-pill.css +53 -0
  298. package/dist/collection/components/q2-pill/q2-pill.js +23 -14
  299. package/dist/collection/components/q2-pill/q2-pill.js.map +1 -1
  300. package/dist/collection/components/q2-pill/test/q2-pill-test.vr.js +110 -0
  301. package/dist/collection/components/q2-pill/test/q2-pill-test.vr.js.map +1 -0
  302. package/dist/collection/components/q2-popover/q2-popover.css +20 -0
  303. package/dist/collection/components/q2-popover/q2-popover.js +5 -2
  304. package/dist/collection/components/q2-popover/q2-popover.js.map +1 -1
  305. package/dist/collection/components/q2-radio/q2-radio.css +52 -1
  306. package/dist/collection/components/q2-radio/q2-radio.js +2 -2
  307. package/dist/collection/components/q2-radio/q2-radio.js.map +1 -1
  308. package/dist/collection/components/q2-radio/test/q2-radio-test.vr.js +73 -0
  309. package/dist/collection/components/q2-radio/test/q2-radio-test.vr.js.map +1 -0
  310. package/dist/collection/components/q2-radio-group/q2-radio-group.css +22 -0
  311. package/dist/collection/components/q2-radio-group/test/q2-radio-group-test.vr.js +99 -0
  312. package/dist/collection/components/q2-radio-group/test/q2-radio-group-test.vr.js.map +1 -0
  313. package/dist/collection/components/q2-relative-time/q2-relative-time.js +1 -1
  314. package/dist/collection/components/q2-resize-observer/q2-resize-observer.js +1 -1
  315. package/dist/collection/components/q2-section/q2-section.css +26 -0
  316. package/dist/collection/components/q2-section/q2-section.js +2 -2
  317. package/dist/collection/components/q2-section/test/q2-section-test.vr.js +68 -0
  318. package/dist/collection/components/q2-section/test/q2-section-test.vr.js.map +1 -0
  319. package/dist/collection/components/q2-select/q2-select.css +17 -0
  320. package/dist/collection/components/q2-select/test/q2-select-test.vr.js +107 -0
  321. package/dist/collection/components/q2-select/test/q2-select-test.vr.js.map +1 -0
  322. package/dist/collection/components/q2-stepper/q2-stepper.css +36 -0
  323. package/dist/collection/components/q2-stepper/q2-stepper.js +1 -1
  324. package/dist/collection/components/q2-stepper/test/q2-stepper-test.vr.js +86 -0
  325. package/dist/collection/components/q2-stepper/test/q2-stepper-test.vr.js.map +1 -0
  326. package/dist/collection/components/q2-stepper-pane/q2-stepper-pane.js +1 -1
  327. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.css +31 -0
  328. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.js +1 -1
  329. package/dist/collection/components/q2-stepper-vertical/test/q2-stepper-vertical-test.vr.js +97 -0
  330. package/dist/collection/components/q2-stepper-vertical/test/q2-stepper-vertical-test.vr.js.map +1 -0
  331. package/dist/collection/components/q2-tab-container/q2-tab-container.css +38 -0
  332. package/dist/collection/components/q2-tab-container/q2-tab-container.js +1 -1
  333. package/dist/collection/components/q2-tab-container/test/q2-tab-container-test.vr.js +78 -0
  334. package/dist/collection/components/q2-tab-container/test/q2-tab-container-test.vr.js.map +1 -0
  335. package/dist/collection/components/q2-tab-pane/q2-tab-pane.js +1 -1
  336. package/dist/collection/components/q2-tag/q2-tag.css +30 -1
  337. package/dist/collection/components/q2-tag/q2-tag.js +1 -1
  338. package/dist/collection/components/q2-tag/test/q2-tag-test.vr.js +83 -0
  339. package/dist/collection/components/q2-tag/test/q2-tag-test.vr.js.map +1 -0
  340. package/dist/collection/components/q2-textarea/q2-textarea.css +80 -0
  341. package/dist/collection/components/q2-textarea/test/q2-textarea-test.vr.js +102 -0
  342. package/dist/collection/components/q2-textarea/test/q2-textarea-test.vr.js.map +1 -0
  343. package/dist/collection/components/q2-toast/q2-toast.css +15 -0
  344. package/dist/collection/components/q2-tooltip/q2-tooltip.css +31 -0
  345. package/dist/collection/components/q2-tooltip/q2-tooltip.js +135 -4
  346. package/dist/collection/components/q2-tooltip/q2-tooltip.js.map +1 -1
  347. package/dist/collection/components/q2-tooltip/test/q2-tooltip-test.vr.js +76 -0
  348. package/dist/collection/components/q2-tooltip/test/q2-tooltip-test.vr.js.map +1 -0
  349. package/dist/collection/components/tecton-tab-pane/tecton-tab-pane.js +2 -2
  350. package/dist/collection/utils/component.js +7 -1
  351. package/dist/collection/utils/component.js.map +1 -1
  352. package/dist/collection/utils/index.js +1 -1
  353. package/dist/collection/utils/index.js.map +1 -1
  354. package/dist/collection/utils/sanitize-html-string.js +19 -2
  355. package/dist/collection/utils/sanitize-html-string.js.map +1 -1
  356. package/dist/collection/utils/test/vr-helpers.js +98 -0
  357. package/dist/collection/utils/test/vr-helpers.js.map +1 -0
  358. package/dist/components/click-elsewhere2.js +2 -0
  359. package/dist/components/click-elsewhere2.js.map +1 -1
  360. package/dist/components/component.js +7 -1
  361. package/dist/components/component.js.map +1 -1
  362. package/dist/components/index.js +2 -0
  363. package/dist/components/index.js.map +1 -1
  364. package/dist/components/index2.js +1 -1
  365. package/dist/components/index2.js.map +1 -1
  366. package/dist/components/q2-action-group2.js.map +1 -1
  367. package/dist/components/q2-action-sheet.js +107 -2
  368. package/dist/components/q2-action-sheet.js.map +1 -1
  369. package/dist/components/q2-avatar2.js.map +1 -1
  370. package/dist/components/q2-badge2.js.map +1 -1
  371. package/dist/components/q2-btn2.js.map +1 -1
  372. package/dist/components/q2-calendar.js +5 -2
  373. package/dist/components/q2-calendar.js.map +1 -1
  374. package/dist/components/q2-card-image.js +1 -1
  375. package/dist/components/q2-card-image.js.map +1 -1
  376. package/dist/components/q2-card.js.map +1 -1
  377. package/dist/components/q2-carousel-pane.js +1 -135
  378. package/dist/components/q2-carousel-pane.js.map +1 -1
  379. package/dist/components/q2-carousel-pane2.js +140 -0
  380. package/dist/components/q2-carousel-pane2.js.map +1 -0
  381. package/dist/components/q2-carousel.js +173 -29
  382. package/dist/components/q2-carousel.js.map +1 -1
  383. package/dist/components/q2-chart-donut.js +3 -1
  384. package/dist/components/q2-chart-donut.js.map +1 -1
  385. package/dist/components/q2-checkbox-group.js.map +1 -1
  386. package/dist/components/q2-checkbox2.js.map +1 -1
  387. package/dist/components/q2-context.js +1 -1
  388. package/dist/components/q2-context.js.map +1 -1
  389. package/dist/components/q2-currency.js +3 -4
  390. package/dist/components/q2-currency.js.map +1 -1
  391. package/dist/components/q2-data-table.js +1 -1
  392. package/dist/components/q2-data-table.js.map +1 -1
  393. package/dist/components/q2-detail.js +1 -1
  394. package/dist/components/q2-detail.js.map +1 -1
  395. package/dist/components/q2-dropdown-item2.js.map +1 -1
  396. package/dist/components/q2-dropdown.js +2 -4
  397. package/dist/components/q2-dropdown.js.map +1 -1
  398. package/dist/components/q2-editable-field.js.map +1 -1
  399. package/dist/components/q2-example.js +1 -1
  400. package/dist/components/q2-file-picker.js.map +1 -1
  401. package/dist/components/q2-form.js +2 -2
  402. package/dist/components/q2-form.js.map +1 -1
  403. package/dist/components/q2-formatted-text.js +1 -1
  404. package/dist/components/q2-formatted-text.js.map +1 -1
  405. package/dist/components/q2-grid.js +32 -8
  406. package/dist/components/q2-grid.js.map +1 -1
  407. package/dist/components/q2-icon2.js.map +1 -1
  408. package/dist/components/q2-input2.js +7 -4
  409. package/dist/components/q2-input2.js.map +1 -1
  410. package/dist/components/q2-item2.js +1 -1
  411. package/dist/components/q2-item2.js.map +1 -1
  412. package/dist/components/q2-legend2.js +3 -3
  413. package/dist/components/q2-legend2.js.map +1 -1
  414. package/dist/components/q2-link2.js.map +1 -1
  415. package/dist/components/q2-list2.js +1 -1
  416. package/dist/components/q2-list2.js.map +1 -1
  417. package/dist/components/q2-loading2.js.map +1 -1
  418. package/dist/components/q2-message2.js +2 -2
  419. package/dist/components/q2-message2.js.map +1 -1
  420. package/dist/components/q2-meter.js +1 -1
  421. package/dist/components/q2-meter.js.map +1 -1
  422. package/dist/components/q2-modal.js +1 -1
  423. package/dist/components/q2-modal.js.map +1 -1
  424. package/dist/components/q2-mutation-observer.js +1 -1
  425. package/dist/components/q2-optgroup2.js +1 -1
  426. package/dist/components/q2-optgroup2.js.map +1 -1
  427. package/dist/components/q2-option-list2.js +37 -28
  428. package/dist/components/q2-option-list2.js.map +1 -1
  429. package/dist/components/q2-option2.js +1 -1
  430. package/dist/components/q2-option2.js.map +1 -1
  431. package/dist/components/q2-otp.d.ts +11 -0
  432. package/dist/components/q2-otp.js +439 -0
  433. package/dist/components/q2-otp.js.map +1 -0
  434. package/dist/components/q2-pagination.js +3 -3
  435. package/dist/components/q2-pagination.js.map +1 -1
  436. package/dist/components/q2-pill.js +23 -14
  437. package/dist/components/q2-pill.js.map +1 -1
  438. package/dist/components/q2-popover2.js +5 -2
  439. package/dist/components/q2-popover2.js.map +1 -1
  440. package/dist/components/q2-radio-group.js.map +1 -1
  441. package/dist/components/q2-radio.js +2 -2
  442. package/dist/components/q2-radio.js.map +1 -1
  443. package/dist/components/q2-relative-time.js +1 -1
  444. package/dist/components/q2-resize-observer2.js +1 -1
  445. package/dist/components/q2-section.js +2 -2
  446. package/dist/components/q2-section.js.map +1 -1
  447. package/dist/components/q2-select2.js.map +1 -1
  448. package/dist/components/q2-stepper-pane.js +1 -1
  449. package/dist/components/q2-stepper-vertical.js +1 -1
  450. package/dist/components/q2-stepper-vertical.js.map +1 -1
  451. package/dist/components/q2-stepper.js +1 -1
  452. package/dist/components/q2-stepper.js.map +1 -1
  453. package/dist/components/q2-tab-container.js +1 -1
  454. package/dist/components/q2-tab-container.js.map +1 -1
  455. package/dist/components/q2-tab-pane.js +1 -1
  456. package/dist/components/q2-tag2.js +2 -2
  457. package/dist/components/q2-tag2.js.map +1 -1
  458. package/dist/components/q2-textarea.js.map +1 -1
  459. package/dist/components/q2-toast.js.map +1 -1
  460. package/dist/components/q2-tooltip2.js +124 -5
  461. package/dist/components/q2-tooltip2.js.map +1 -1
  462. package/dist/components/sanitize-html-string.js +19 -2
  463. package/dist/components/sanitize-html-string.js.map +1 -1
  464. package/dist/components/tecton-tab-pane.js +2 -2
  465. package/dist/esm/click-elsewhere.q2-option-list.q2-popover.entry.js.map +1 -1
  466. package/dist/esm/click-elsewhere_3.entry.js +46 -32
  467. package/dist/esm/click-elsewhere_3.entry.js.map +1 -1
  468. package/dist/esm/{component-DVxzK3WH.js → component-DaQM9u3s.js} +9 -3
  469. package/dist/esm/component-DaQM9u3s.js.map +1 -0
  470. package/dist/esm/{index-C4PILj1_.js → index-C5gj0T_3.js} +4 -4
  471. package/dist/esm/index-C5gj0T_3.js.map +1 -0
  472. package/dist/esm/loader.js +1 -1
  473. package/dist/esm/q2-action-group.q2-resize-observer.entry.js.map +1 -1
  474. package/dist/esm/q2-action-group_2.entry.js +2 -2
  475. package/dist/esm/q2-action-group_2.entry.js.map +1 -1
  476. package/dist/esm/q2-action-sheet.entry.js +109 -4
  477. package/dist/esm/q2-action-sheet.entry.js.map +1 -1
  478. package/dist/esm/q2-avatar.entry.js.map +1 -1
  479. package/dist/esm/q2-badge.entry.js +1 -1
  480. package/dist/esm/q2-badge.entry.js.map +1 -1
  481. package/dist/esm/q2-btn.q2-loading.entry.js.map +1 -1
  482. package/dist/esm/q2-btn_2.entry.js +1 -1
  483. package/dist/esm/q2-btn_2.entry.js.map +1 -1
  484. package/dist/esm/q2-calendar.entry.js +6 -3
  485. package/dist/esm/q2-calendar.entry.js.map +1 -1
  486. package/dist/esm/q2-card-image.entry.js +2 -2
  487. package/dist/esm/q2-card-image.entry.js.map +1 -1
  488. package/dist/esm/q2-card.entry.js +1 -1
  489. package/dist/esm/q2-card.entry.js.map +1 -1
  490. package/dist/esm/q2-carousel-pane.entry.js +3 -3
  491. package/dist/esm/q2-carousel-pane.entry.js.map +1 -1
  492. package/dist/esm/q2-carousel.entry.js +162 -29
  493. package/dist/esm/q2-carousel.entry.js.map +1 -1
  494. package/dist/esm/q2-chart-area.entry.js +1 -1
  495. package/dist/esm/q2-chart-bar.entry.js +1 -1
  496. package/dist/esm/q2-chart-donut.entry.js +3 -2
  497. package/dist/esm/q2-chart-donut.entry.js.map +1 -1
  498. package/dist/esm/q2-checkbox-group.entry.js +2 -2
  499. package/dist/esm/q2-checkbox-group.entry.js.map +1 -1
  500. package/dist/esm/q2-checkbox.q2-tag.entry.js.map +1 -1
  501. package/dist/esm/q2-checkbox_2.entry.js +3 -3
  502. package/dist/esm/q2-checkbox_2.entry.js.map +1 -1
  503. package/dist/esm/q2-context.entry.js +2 -2
  504. package/dist/esm/q2-context.entry.js.map +1 -1
  505. package/dist/esm/q2-currency.entry.js +3 -4
  506. package/dist/esm/q2-currency.entry.js.map +1 -1
  507. package/dist/esm/q2-data-table.entry.js +2 -2
  508. package/dist/esm/q2-data-table.entry.js.map +1 -1
  509. package/dist/esm/q2-detail.entry.js +2 -2
  510. package/dist/esm/q2-detail.entry.js.map +1 -1
  511. package/dist/esm/q2-dropdown-item.entry.js +2 -2
  512. package/dist/esm/q2-dropdown-item.entry.js.map +1 -1
  513. package/dist/esm/q2-dropdown.entry.js +3 -5
  514. package/dist/esm/q2-dropdown.entry.js.map +1 -1
  515. package/dist/esm/q2-editable-field.entry.js +1 -1
  516. package/dist/esm/q2-editable-field.entry.js.map +1 -1
  517. package/dist/esm/q2-example.entry.js +1 -1
  518. package/dist/esm/q2-file-picker.entry.js +1 -1
  519. package/dist/esm/q2-file-picker.entry.js.map +1 -1
  520. package/dist/esm/q2-form.entry.js +2 -2
  521. package/dist/esm/q2-form.entry.js.map +1 -1
  522. package/dist/esm/q2-formatted-text.entry.js +1 -1
  523. package/dist/esm/q2-formatted-text.entry.js.map +1 -1
  524. package/dist/esm/q2-grid-area.entry.js +1 -1
  525. package/dist/esm/q2-grid.entry.js +33 -9
  526. package/dist/esm/q2-grid.entry.js.map +1 -1
  527. package/dist/esm/q2-icon.entry.js +1 -1
  528. package/dist/esm/q2-icon.entry.js.map +1 -1
  529. package/dist/esm/q2-input.entry.js +8 -5
  530. package/dist/esm/q2-input.entry.js.map +1 -1
  531. package/dist/esm/q2-item.entry.js +2 -2
  532. package/dist/esm/q2-item.entry.js.map +1 -1
  533. package/dist/esm/q2-legend.entry.js +2 -3
  534. package/dist/esm/q2-legend.entry.js.map +1 -1
  535. package/dist/esm/q2-link.q2-list.entry.js.map +1 -1
  536. package/dist/esm/q2-link_2.entry.js +2 -2
  537. package/dist/esm/q2-link_2.entry.js.map +1 -1
  538. package/dist/esm/q2-loc.entry.js +1 -1
  539. package/dist/esm/q2-message.entry.js +3 -3
  540. package/dist/esm/q2-message.entry.js.map +1 -1
  541. package/dist/esm/q2-meter.entry.js +2 -2
  542. package/dist/esm/q2-meter.entry.js.map +1 -1
  543. package/dist/esm/q2-modal.entry.js +3 -3
  544. package/dist/esm/q2-modal.entry.js.map +1 -1
  545. package/dist/esm/q2-month-picker.entry.js +1 -1
  546. package/dist/esm/q2-mutation-observer.entry.js +1 -1
  547. package/dist/esm/q2-optgroup.entry.js +3 -3
  548. package/dist/esm/q2-optgroup.entry.js.map +1 -1
  549. package/dist/esm/q2-option.entry.js +3 -3
  550. package/dist/esm/q2-option.entry.js.map +1 -1
  551. package/dist/esm/q2-otp.entry.js +371 -0
  552. package/dist/esm/q2-otp.entry.js.map +1 -0
  553. package/dist/esm/q2-pagination.entry.js +4 -4
  554. package/dist/esm/q2-pagination.entry.js.map +1 -1
  555. package/dist/esm/q2-pill.entry.js +24 -15
  556. package/dist/esm/q2-pill.entry.js.map +1 -1
  557. package/dist/esm/q2-radio-group.entry.js +1 -1
  558. package/dist/esm/q2-radio-group.entry.js.map +1 -1
  559. package/dist/esm/q2-radio.entry.js +3 -3
  560. package/dist/esm/q2-radio.entry.js.map +1 -1
  561. package/dist/esm/q2-relative-time.entry.js +2 -2
  562. package/dist/esm/q2-section-container.entry.js +1 -1
  563. package/dist/esm/q2-section.entry.js +3 -3
  564. package/dist/esm/q2-section.entry.js.map +1 -1
  565. package/dist/esm/q2-select.entry.js +1 -1
  566. package/dist/esm/q2-select.entry.js.map +1 -1
  567. package/dist/esm/q2-stepper-pane.entry.js +3 -3
  568. package/dist/esm/q2-stepper-vertical.entry.js +2 -2
  569. package/dist/esm/q2-stepper-vertical.entry.js.map +1 -1
  570. package/dist/esm/q2-stepper.entry.js +2 -2
  571. package/dist/esm/q2-stepper.entry.js.map +1 -1
  572. package/dist/esm/q2-tab-container.entry.js +3 -3
  573. package/dist/esm/q2-tab-container.entry.js.map +1 -1
  574. package/dist/esm/q2-tab-pane.entry.js +2 -2
  575. package/dist/esm/q2-tecton-elements.js +1 -1
  576. package/dist/esm/q2-textarea.entry.js +1 -1
  577. package/dist/esm/q2-textarea.entry.js.map +1 -1
  578. package/dist/esm/q2-toast.entry.js +1 -1
  579. package/dist/esm/q2-toast.entry.js.map +1 -1
  580. package/dist/esm/q2-tooltip.entry.js +124 -5
  581. package/dist/esm/q2-tooltip.entry.js.map +1 -1
  582. package/dist/esm/{sanitize-html-string-B35VmRc9.js → sanitize-html-string-DPHNpMWE.js} +21 -4
  583. package/dist/{q2-tecton-elements/sanitize-html-string-B35VmRc9.js.map → esm/sanitize-html-string-DPHNpMWE.js.map} +1 -1
  584. package/dist/esm/tecton-tab-pane.entry.js +2 -2
  585. package/dist/playwright.config.js +12 -0
  586. package/dist/playwright.config.js.map +1 -0
  587. package/dist/q2-tecton-elements/assets/standard.symbol.svg +1 -1
  588. package/dist/q2-tecton-elements/click-elsewhere.q2-option-list.q2-popover.entry.esm.js.map +1 -1
  589. package/dist/q2-tecton-elements/click-elsewhere_3.entry.js +44 -35
  590. package/dist/q2-tecton-elements/click-elsewhere_3.entry.js.map +1 -1
  591. package/dist/q2-tecton-elements/component-DaQM9u3s.js +46 -0
  592. package/dist/q2-tecton-elements/component-DaQM9u3s.js.map +1 -0
  593. package/dist/q2-tecton-elements/{index-C4PILj1_.js → index-C5gj0T_3.js} +4 -4
  594. package/dist/q2-tecton-elements/index-C5gj0T_3.js.map +1 -0
  595. package/dist/q2-tecton-elements/q2-action-group.q2-resize-observer.entry.esm.js.map +1 -1
  596. package/dist/q2-tecton-elements/q2-action-group_2.entry.js +2 -2
  597. package/dist/q2-tecton-elements/q2-action-group_2.entry.js.map +1 -1
  598. package/dist/q2-tecton-elements/q2-action-sheet.entry.esm.js.map +1 -1
  599. package/dist/q2-tecton-elements/q2-action-sheet.entry.js +166 -70
  600. package/dist/q2-tecton-elements/q2-action-sheet.entry.js.map +1 -1
  601. package/dist/q2-tecton-elements/q2-avatar.entry.esm.js.map +1 -1
  602. package/dist/q2-tecton-elements/q2-avatar.entry.js.map +1 -1
  603. package/dist/q2-tecton-elements/q2-badge.entry.esm.js.map +1 -1
  604. package/dist/q2-tecton-elements/q2-badge.entry.js +1 -1
  605. package/dist/q2-tecton-elements/q2-badge.entry.js.map +1 -1
  606. package/dist/q2-tecton-elements/q2-btn.q2-loading.entry.esm.js.map +1 -1
  607. package/dist/q2-tecton-elements/q2-btn_2.entry.js +1 -1
  608. package/dist/q2-tecton-elements/q2-btn_2.entry.js.map +1 -1
  609. package/dist/q2-tecton-elements/q2-calendar.entry.esm.js.map +1 -1
  610. package/dist/q2-tecton-elements/q2-calendar.entry.js +4 -4
  611. package/dist/q2-tecton-elements/q2-calendar.entry.js.map +1 -1
  612. package/dist/q2-tecton-elements/q2-card-image.entry.esm.js.map +1 -1
  613. package/dist/q2-tecton-elements/q2-card-image.entry.js +2 -2
  614. package/dist/q2-tecton-elements/q2-card-image.entry.js.map +1 -1
  615. package/dist/q2-tecton-elements/q2-card.entry.esm.js.map +1 -1
  616. package/dist/q2-tecton-elements/q2-card.entry.js +1 -1
  617. package/dist/q2-tecton-elements/q2-card.entry.js.map +1 -1
  618. package/dist/q2-tecton-elements/q2-carousel-pane.entry.esm.js.map +1 -1
  619. package/dist/q2-tecton-elements/q2-carousel-pane.entry.js +6 -6
  620. package/dist/q2-tecton-elements/q2-carousel-pane.entry.js.map +1 -1
  621. package/dist/q2-tecton-elements/q2-carousel.entry.esm.js.map +1 -1
  622. package/dist/q2-tecton-elements/q2-carousel.entry.js +402 -271
  623. package/dist/q2-tecton-elements/q2-carousel.entry.js.map +1 -1
  624. package/dist/q2-tecton-elements/q2-chart-area.entry.js +1 -1
  625. package/dist/q2-tecton-elements/q2-chart-bar.entry.js +1 -1
  626. package/dist/q2-tecton-elements/q2-chart-donut.entry.esm.js.map +1 -1
  627. package/dist/q2-tecton-elements/q2-chart-donut.entry.js +18 -16
  628. package/dist/q2-tecton-elements/q2-chart-donut.entry.js.map +1 -1
  629. package/dist/q2-tecton-elements/q2-checkbox-group.entry.esm.js.map +1 -1
  630. package/dist/q2-tecton-elements/q2-checkbox-group.entry.js +2 -2
  631. package/dist/q2-tecton-elements/q2-checkbox-group.entry.js.map +1 -1
  632. package/dist/q2-tecton-elements/q2-checkbox.q2-tag.entry.esm.js.map +1 -1
  633. package/dist/q2-tecton-elements/q2-checkbox_2.entry.js +7 -7
  634. package/dist/q2-tecton-elements/q2-checkbox_2.entry.js.map +1 -1
  635. package/dist/q2-tecton-elements/q2-context.entry.esm.js.map +1 -1
  636. package/dist/q2-tecton-elements/q2-context.entry.js +2 -2
  637. package/dist/q2-tecton-elements/q2-context.entry.js.map +1 -1
  638. package/dist/q2-tecton-elements/q2-currency.entry.esm.js.map +1 -1
  639. package/dist/q2-tecton-elements/q2-currency.entry.js +34 -33
  640. package/dist/q2-tecton-elements/q2-currency.entry.js.map +1 -1
  641. package/dist/q2-tecton-elements/q2-data-table.entry.esm.js.map +1 -1
  642. package/dist/q2-tecton-elements/q2-data-table.entry.js +4 -4
  643. package/dist/q2-tecton-elements/q2-data-table.entry.js.map +1 -1
  644. package/dist/q2-tecton-elements/q2-detail.entry.esm.js.map +1 -1
  645. package/dist/q2-tecton-elements/q2-detail.entry.js +4 -4
  646. package/dist/q2-tecton-elements/q2-detail.entry.js.map +1 -1
  647. package/dist/q2-tecton-elements/q2-dropdown-item.entry.esm.js.map +1 -1
  648. package/dist/q2-tecton-elements/q2-dropdown-item.entry.js +2 -2
  649. package/dist/q2-tecton-elements/q2-dropdown-item.entry.js.map +1 -1
  650. package/dist/q2-tecton-elements/q2-dropdown.entry.esm.js.map +1 -1
  651. package/dist/q2-tecton-elements/q2-dropdown.entry.js +18 -19
  652. package/dist/q2-tecton-elements/q2-dropdown.entry.js.map +1 -1
  653. package/dist/q2-tecton-elements/q2-editable-field.entry.esm.js.map +1 -1
  654. package/dist/q2-tecton-elements/q2-editable-field.entry.js +1 -1
  655. package/dist/q2-tecton-elements/q2-editable-field.entry.js.map +1 -1
  656. package/dist/q2-tecton-elements/q2-example.entry.js +1 -1
  657. package/dist/q2-tecton-elements/q2-file-picker.entry.esm.js.map +1 -1
  658. package/dist/q2-tecton-elements/q2-file-picker.entry.js +1 -1
  659. package/dist/q2-tecton-elements/q2-file-picker.entry.js.map +1 -1
  660. package/dist/q2-tecton-elements/q2-form.entry.esm.js.map +1 -1
  661. package/dist/q2-tecton-elements/q2-form.entry.js +9 -9
  662. package/dist/q2-tecton-elements/q2-form.entry.js.map +1 -1
  663. package/dist/q2-tecton-elements/q2-formatted-text.entry.esm.js.map +1 -1
  664. package/dist/q2-tecton-elements/q2-formatted-text.entry.js +2 -2
  665. package/dist/q2-tecton-elements/q2-formatted-text.entry.js.map +1 -1
  666. package/dist/q2-tecton-elements/q2-grid-area.entry.js +1 -1
  667. package/dist/q2-tecton-elements/q2-grid.entry.esm.js.map +1 -1
  668. package/dist/q2-tecton-elements/q2-grid.entry.js +39 -14
  669. package/dist/q2-tecton-elements/q2-grid.entry.js.map +1 -1
  670. package/dist/q2-tecton-elements/q2-icon.entry.esm.js.map +1 -1
  671. package/dist/q2-tecton-elements/q2-icon.entry.js +52 -52
  672. package/dist/q2-tecton-elements/q2-icon.entry.js.map +1 -1
  673. package/dist/q2-tecton-elements/q2-input.entry.esm.js.map +1 -1
  674. package/dist/q2-tecton-elements/q2-input.entry.js +10 -6
  675. package/dist/q2-tecton-elements/q2-input.entry.js.map +1 -1
  676. package/dist/q2-tecton-elements/q2-item.entry.esm.js.map +1 -1
  677. package/dist/q2-tecton-elements/q2-item.entry.js +14 -14
  678. package/dist/q2-tecton-elements/q2-item.entry.js.map +1 -1
  679. package/dist/q2-tecton-elements/q2-legend.entry.esm.js.map +1 -1
  680. package/dist/q2-tecton-elements/q2-legend.entry.js +4 -5
  681. package/dist/q2-tecton-elements/q2-legend.entry.js.map +1 -1
  682. package/dist/q2-tecton-elements/q2-link.q2-list.entry.esm.js.map +1 -1
  683. package/dist/q2-tecton-elements/q2-link_2.entry.js +7 -7
  684. package/dist/q2-tecton-elements/q2-link_2.entry.js.map +1 -1
  685. package/dist/q2-tecton-elements/q2-loc.entry.js +1 -1
  686. package/dist/q2-tecton-elements/q2-message.entry.esm.js.map +1 -1
  687. package/dist/q2-tecton-elements/q2-message.entry.js +28 -28
  688. package/dist/q2-tecton-elements/q2-message.entry.js.map +1 -1
  689. package/dist/q2-tecton-elements/q2-meter.entry.esm.js.map +1 -1
  690. package/dist/q2-tecton-elements/q2-meter.entry.js +8 -8
  691. package/dist/q2-tecton-elements/q2-meter.entry.js.map +1 -1
  692. package/dist/q2-tecton-elements/q2-modal.entry.esm.js.map +1 -1
  693. package/dist/q2-tecton-elements/q2-modal.entry.js +53 -53
  694. package/dist/q2-tecton-elements/q2-modal.entry.js.map +1 -1
  695. package/dist/q2-tecton-elements/q2-month-picker.entry.js +1 -1
  696. package/dist/q2-tecton-elements/q2-mutation-observer.entry.js +1 -1
  697. package/dist/q2-tecton-elements/q2-optgroup.entry.esm.js.map +1 -1
  698. package/dist/q2-tecton-elements/q2-optgroup.entry.js +6 -6
  699. package/dist/q2-tecton-elements/q2-optgroup.entry.js.map +1 -1
  700. package/dist/q2-tecton-elements/q2-option.entry.esm.js.map +1 -1
  701. package/dist/q2-tecton-elements/q2-option.entry.js +3 -3
  702. package/dist/q2-tecton-elements/q2-option.entry.js.map +1 -1
  703. package/dist/q2-tecton-elements/q2-otp.entry.esm.js.map +1 -0
  704. package/dist/q2-tecton-elements/q2-otp.entry.js +453 -0
  705. package/dist/q2-tecton-elements/q2-otp.entry.js.map +1 -0
  706. package/dist/q2-tecton-elements/q2-pagination.entry.esm.js.map +1 -1
  707. package/dist/q2-tecton-elements/q2-pagination.entry.js +29 -29
  708. package/dist/q2-tecton-elements/q2-pagination.entry.js.map +1 -1
  709. package/dist/q2-tecton-elements/q2-pill.entry.esm.js.map +1 -1
  710. package/dist/q2-tecton-elements/q2-pill.entry.js +43 -28
  711. package/dist/q2-tecton-elements/q2-pill.entry.js.map +1 -1
  712. package/dist/q2-tecton-elements/q2-radio-group.entry.esm.js.map +1 -1
  713. package/dist/q2-tecton-elements/q2-radio-group.entry.js +1 -1
  714. package/dist/q2-tecton-elements/q2-radio-group.entry.js.map +1 -1
  715. package/dist/q2-tecton-elements/q2-radio.entry.esm.js.map +1 -1
  716. package/dist/q2-tecton-elements/q2-radio.entry.js +10 -10
  717. package/dist/q2-tecton-elements/q2-radio.entry.js.map +1 -1
  718. package/dist/q2-tecton-elements/q2-relative-time.entry.js +2 -2
  719. package/dist/q2-tecton-elements/q2-section-container.entry.js +1 -1
  720. package/dist/q2-tecton-elements/q2-section.entry.esm.js.map +1 -1
  721. package/dist/q2-tecton-elements/q2-section.entry.js +21 -21
  722. package/dist/q2-tecton-elements/q2-section.entry.js.map +1 -1
  723. package/dist/q2-tecton-elements/q2-select.entry.esm.js.map +1 -1
  724. package/dist/q2-tecton-elements/q2-select.entry.js +1 -1
  725. package/dist/q2-tecton-elements/q2-select.entry.js.map +1 -1
  726. package/dist/q2-tecton-elements/q2-stepper-pane.entry.js +10 -10
  727. package/dist/q2-tecton-elements/q2-stepper-vertical.entry.esm.js.map +1 -1
  728. package/dist/q2-tecton-elements/q2-stepper-vertical.entry.js +5 -5
  729. package/dist/q2-tecton-elements/q2-stepper-vertical.entry.js.map +1 -1
  730. package/dist/q2-tecton-elements/q2-stepper.entry.esm.js.map +1 -1
  731. package/dist/q2-tecton-elements/q2-stepper.entry.js +33 -33
  732. package/dist/q2-tecton-elements/q2-stepper.entry.js.map +1 -1
  733. package/dist/q2-tecton-elements/q2-tab-container.entry.esm.js.map +1 -1
  734. package/dist/q2-tecton-elements/q2-tab-container.entry.js +14 -14
  735. package/dist/q2-tecton-elements/q2-tab-container.entry.js.map +1 -1
  736. package/dist/q2-tecton-elements/q2-tab-pane.entry.js +6 -6
  737. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  738. package/dist/q2-tecton-elements/q2-textarea.entry.esm.js.map +1 -1
  739. package/dist/q2-tecton-elements/q2-textarea.entry.js +1 -1
  740. package/dist/q2-tecton-elements/q2-textarea.entry.js.map +1 -1
  741. package/dist/q2-tecton-elements/q2-toast.entry.esm.js.map +1 -1
  742. package/dist/q2-tecton-elements/q2-toast.entry.js +1 -1
  743. package/dist/q2-tecton-elements/q2-toast.entry.js.map +1 -1
  744. package/dist/q2-tecton-elements/q2-tooltip.entry.esm.js.map +1 -1
  745. package/dist/q2-tecton-elements/q2-tooltip.entry.js +136 -20
  746. package/dist/q2-tecton-elements/q2-tooltip.entry.js.map +1 -1
  747. package/dist/q2-tecton-elements/{sanitize-html-string-B35VmRc9.js → sanitize-html-string-DPHNpMWE.js} +147 -142
  748. package/dist/{esm/sanitize-html-string-B35VmRc9.js.map → q2-tecton-elements/sanitize-html-string-DPHNpMWE.js.map} +1 -1
  749. package/dist/q2-tecton-elements/tecton-tab-pane.entry.js +6 -6
  750. package/dist/types/builds/q2e/development/tecton/tecton/packages/q2-tecton-elements/.stencil/playwright.config.d.ts +2 -0
  751. package/dist/types/components/q2-action-sheet/q2-action-sheet.d.ts +22 -0
  752. package/dist/types/components/q2-avatar/test/q2-avatar-test.vr.d.ts +1 -0
  753. package/dist/types/components/q2-badge/test/q2-badge-test.vr.d.ts +1 -0
  754. package/dist/types/components/q2-btn/test/q2-btn-test.vr.d.ts +1 -0
  755. package/dist/types/components/q2-calendar/test/q2-calendar-test.vr.d.ts +1 -0
  756. package/dist/types/components/q2-card/test/q2-card-test.vr.d.ts +1 -0
  757. package/dist/types/components/q2-card-image/test/q2-card-image-test.vr.d.ts +1 -0
  758. package/dist/types/components/q2-carousel/q2-carousel.d.ts +29 -0
  759. package/dist/types/components/q2-carousel/test/q2-carousel-test.vr.d.ts +1 -0
  760. package/dist/types/components/q2-chart-area/test/q2-chart-area-test.vr.d.ts +1 -0
  761. package/dist/types/components/q2-chart-bar/test/q2-chart-bar-test.vr.d.ts +1 -0
  762. package/dist/types/components/q2-chart-donut/q2-chart-donut.d.ts +2 -0
  763. package/dist/types/components/q2-chart-donut/test/q2-chart-donut-test.vr.d.ts +1 -0
  764. package/dist/types/components/q2-checkbox/test/q2-checkbox-test.vr.d.ts +1 -0
  765. package/dist/types/components/q2-checkbox-group/test/q2-checkbox-group-test.vr.d.ts +1 -0
  766. package/dist/types/components/q2-context/test/q2-context-test.vr.d.ts +1 -0
  767. package/dist/types/components/q2-currency/test/q2-currency-test.vr.d.ts +1 -0
  768. package/dist/types/components/q2-data-table/test/q2-data-table-test.vr.d.ts +1 -0
  769. package/dist/types/components/q2-editable-field/test/q2-editable-field-test.vr.d.ts +1 -0
  770. package/dist/types/components/q2-file-picker/test/q2-file-picker-test.vr.d.ts +1 -0
  771. package/dist/types/components/q2-formatted-text/test/q2-formatted-text-test.vr.d.ts +1 -0
  772. package/dist/types/components/q2-grid/q2-grid.d.ts +10 -0
  773. package/dist/types/components/q2-icon/test/q2-icon-test.vr.d.ts +1 -0
  774. package/dist/types/components/q2-input/test/q2-input-test.vr.d.ts +1 -0
  775. package/dist/types/components/q2-legend/q2-legend.d.ts +2 -0
  776. package/dist/types/components/q2-link/test/q2-link-test.vr.d.ts +1 -0
  777. package/dist/types/components/q2-list/test/q2-list-test.vr.d.ts +1 -0
  778. package/dist/types/components/q2-message/test/q2-message-test.vr.d.ts +1 -0
  779. package/dist/types/components/q2-meter/test/q2-meter-test.vr.d.ts +1 -0
  780. package/dist/types/components/q2-modal/test/q2-modal-test.vr.d.ts +1 -0
  781. package/dist/types/components/q2-otp/q2-otp.d.ts +159 -0
  782. package/dist/types/components/q2-pagination/test/q2-pagination-test.vr.d.ts +1 -0
  783. package/dist/types/components/q2-pill/q2-pill.d.ts +5 -2
  784. package/dist/types/components/q2-pill/test/q2-pill-test.vr.d.ts +1 -0
  785. package/dist/types/components/q2-radio/q2-radio.d.ts +1 -1
  786. package/dist/types/components/q2-radio/test/q2-radio-test.vr.d.ts +1 -0
  787. package/dist/types/components/q2-radio-group/test/q2-radio-group-test.vr.d.ts +1 -0
  788. package/dist/types/components/q2-section/test/q2-section-test.vr.d.ts +1 -0
  789. package/dist/types/components/q2-select/test/q2-select-test.vr.d.ts +1 -0
  790. package/dist/types/components/q2-stepper/test/q2-stepper-test.vr.d.ts +1 -0
  791. package/dist/types/components/q2-stepper-vertical/test/q2-stepper-vertical-test.vr.d.ts +1 -0
  792. package/dist/types/components/q2-tab-container/test/q2-tab-container-test.vr.d.ts +1 -0
  793. package/dist/types/components/q2-tag/test/q2-tag-test.vr.d.ts +1 -0
  794. package/dist/types/components/q2-textarea/test/q2-textarea-test.vr.d.ts +1 -0
  795. package/dist/types/components/q2-tooltip/q2-tooltip.d.ts +4 -0
  796. package/dist/types/components/q2-tooltip/test/q2-tooltip-test.vr.d.ts +1 -0
  797. package/dist/types/components.d.ts +306 -2
  798. package/dist/types/utils/component.d.ts +1 -1
  799. package/dist/types/utils/test/vr-helpers.d.ts +14 -0
  800. package/package.json +12 -3
  801. package/dist/cjs/component-DRAntnCA.js.map +0 -1
  802. package/dist/cjs/index-YvKoRT-t.js.map +0 -1
  803. package/dist/esm/component-DVxzK3WH.js.map +0 -1
  804. package/dist/esm/index-C4PILj1_.js.map +0 -1
  805. package/dist/q2-tecton-elements/component-DVxzK3WH.js +0 -40
  806. package/dist/q2-tecton-elements/component-DVxzK3WH.js.map +0 -1
  807. package/dist/q2-tecton-elements/index-C4PILj1_.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { r as t, c as o, h as e, F as i, g as a } from "./index-CGkHOjh1.js";
1
+ import { r as t, c as i, h as o, F as e, g as a } from "./index-CGkHOjh1.js";
2
2
 
3
- import { l as r, w as s } from "./index-C4PILj1_.js";
3
+ import { l as s, w as r } from "./index-C5gj0T_3.js";
4
4
 
5
- import { s as n, a as c } from "./sanitize-html-string-B35VmRc9.js";
5
+ import { s as n, a as c } from "./sanitize-html-string-DPHNpMWE.js";
6
6
 
7
7
  import { m as d } from "./mirror-emit-DUjY_ucm.js";
8
8
 
@@ -11,9 +11,9 @@ const l = '*{box-sizing:border-box}*:active{outline:none}*:focus-visible{outline
11
11
  const h = class {
12
12
  constructor(a) {
13
13
  t(this, a);
14
- this.close = o(this, "close", 7);
15
- this.ready = o(this, "ready", 3);
16
- this.tctClose = o(this, "tctClose", 7);
14
+ this.close = i(this, "close", 7);
15
+ this.ready = i(this, "ready", 3);
16
+ this.tctClose = i(this, "tctClose", 7);
17
17
  this.initialSelectedOptions = [];
18
18
  this.maxHeight = .75;
19
19
  this.minHeight = .2;
@@ -25,42 +25,133 @@ const h = class {
25
25
  // #region State Properties
26
26
  this.isScrollable = false;
27
27
  this.renderStatus = "is-closing";
28
+ /**
29
+ * Focuses the last visible (non-hidden, non-disabled) option in the option list.
30
+ * Uses the async getOptions() method, but is invoked after preventDefault() has
31
+ * already been called synchronously by the caller.
32
+ */ this.focusLastVisibleOption = async () => {
33
+ if (!this.optionListElement) return;
34
+ const t = await this.optionListElement.getOptions();
35
+ const i = t.slice().reverse().find((t => !t.hidden && !t.disabled));
36
+ if (i) {
37
+ i.focus();
38
+ }
39
+ };
28
40
  this.generateOptgroup = t => {
29
- const o = document.createElement("q2-optgroup");
30
- if (t.label) o.setAttribute("label", t.label);
31
- if (t.disabled) o.setAttribute("disabled", "");
32
- if (!!t.options.length) t.options.forEach((t => o.appendChild(this.generateOption(t))));
33
- return o;
41
+ const i = document.createElement("q2-optgroup");
42
+ if (t.label) i.setAttribute("label", t.label);
43
+ if (t.disabled) i.setAttribute("disabled", "");
44
+ if (!!t.options.length) t.options.forEach((t => i.appendChild(this.generateOption(t))));
45
+ return i;
34
46
  };
35
47
  this.generateOption = t => {
36
- const o = document.createElement("q2-option");
37
- const {innerHTML: e, ...i} = t;
38
- if (e) o.innerHTML = n(e);
39
- Object.entries(i).forEach((([t, e]) => {
40
- if (e === undefined) return;
41
- if (typeof e === "boolean") {
42
- if (e) o.setAttribute(t, "");
48
+ const i = document.createElement("q2-option");
49
+ const {innerHTML: o, ...e} = t;
50
+ if (o) i.innerHTML = n(o);
51
+ Object.entries(e).forEach((([t, o]) => {
52
+ if (o === undefined) return;
53
+ if (typeof o === "boolean") {
54
+ if (o) i.setAttribute(t, "");
43
55
  } else {
44
- o.setAttribute(t, e);
56
+ i.setAttribute(t, o);
45
57
  }
46
58
  }));
47
- return o;
59
+ return i;
60
+ };
61
+ /**
62
+ * Handles keyboard navigation within the action sheet dialog.
63
+ * Manages Tab navigation between options and action buttons (close/done).
64
+ * Allows Tab to exit to browser chrome when reaching boundaries.
65
+ *
66
+ * NOTE: This handler is intentionally synchronous. `event.preventDefault()`
67
+ * must be called before the browser processes the Tab key (i.e., during the
68
+ * synchronous portion of the keydown event). Introducing an `await` here
69
+ * allows the browser to shift focus before preventDefault runs, which causes
70
+ * Tab from the close button to escape the dialog instead of cycling back to
71
+ * the options.
72
+ * @param event - The keyboard event.
73
+ */ this.handleDialogKeydown = t => {
74
+ const {data: i} = this;
75
+ // Only activate for list appearance with an option list
76
+ if (!i || i.appearance !== "list" || !this.optionListElement) return;
77
+ const {key: o, shiftKey: e} = t;
78
+ if (o !== "Tab") return;
79
+ const a = this.hostElement.shadowRoot.activeElement;
80
+ const s = this.closeButtonElement;
81
+ const r = this.doneButtonElement;
82
+ const n = a === s;
83
+ const c = a === r;
84
+ // q2-option lives in light DOM, so document.activeElement is the option element itself when focused.
85
+ // Avoid `await optionListElement.getOptions()` here — that defers the handler past
86
+ // the browser's default Tab handling, making preventDefault() ineffective.
87
+ const d = document.activeElement;
88
+ const l = !!d && (d.tagName === "Q2-OPTION" || d.tagName === "Q2-DROPDOWN-ITEM") && this.hostElement.contains(d);
89
+ if (e) {
90
+ // Shift+Tab: if on close button
91
+ if (n) {
92
+ // With a done button (multi-select): allow default to exit to browser.
93
+ // Browser Shift+Tab from the URL bar lands on the done button (last
94
+ // tabbable in DOM order), which redirects to the last option via
95
+ // focusLastVisibleOption — so choices remain reachable.
96
+ if (r) {
97
+ // Let it bubble - exits to browser chrome
98
+ return;
99
+ }
100
+ // Without a done button (single-select): redirect to the last visible
101
+ // option. Otherwise focus would exit to the URL bar and the next
102
+ // Shift+Tab back into the page would land on the close button (the
103
+ // only tabbable in the modal), trapping the user in URL ↔ close
104
+ // with no path back to choices.
105
+ t.preventDefault();
106
+ this.focusLastVisibleOption();
107
+ }
108
+ // Shift+Tab: if on done button, focus last option
109
+ else if (c) {
110
+ t.preventDefault();
111
+ this.focusLastVisibleOption();
112
+ }
113
+ // Shift+Tab: if on any option, go to close button
114
+ else if (l && s) {
115
+ t.preventDefault();
116
+ s.focus();
117
+ }
118
+ } else {
119
+ // Forward Tab: if on close button, skip to first/selected option
120
+ if (n) {
121
+ t.preventDefault();
122
+ this.optionListElement.focus();
123
+ }
124
+ // Forward Tab: if on done button, allow default to exit to browser
125
+ else if (c) {
126
+ // Let it bubble - exits to browser chrome
127
+ return;
128
+ }
129
+ // Forward Tab: if on any option
130
+ else if (l) {
131
+ if (r) {
132
+ // With done button: go to done button
133
+ t.preventDefault();
134
+ r.focus();
135
+ }
136
+ // else: No done button - allow default Tab behavior to exit to browser
137
+ }
138
+ }
48
139
  };
49
140
  this.onCancel = t => {
50
- var o, e;
141
+ var i, o;
51
142
  t.preventDefault();
52
- const {initialSelectedOptions: i} = this;
143
+ const {initialSelectedOptions: e} = this;
53
144
  this.hide({
54
- value: (e = (o = i === null || i === void 0 ? void 0 : i[0]) === null || o === void 0 ? void 0 : o.value) !== null && e !== void 0 ? e : "",
55
- values: i,
145
+ value: (o = (i = e === null || e === void 0 ? void 0 : e[0]) === null || i === void 0 ? void 0 : i.value) !== null && o !== void 0 ? o : "",
146
+ values: e,
56
147
  type: "cancel"
57
148
  });
58
149
  };
59
150
  this.onClick = t => {
60
- const o = t.target;
61
- if (!(o instanceof HTMLElement)) return;
62
- const e = !!o.closest(".interior, q2-action-sheet");
63
- if (e) return;
151
+ const i = t.target;
152
+ if (!(i instanceof HTMLElement)) return;
153
+ const o = !!i.closest(".interior, q2-action-sheet");
154
+ if (o) return;
64
155
  this.onCancel(t);
65
156
  };
66
157
  this.onListChange = t => {
@@ -83,42 +174,46 @@ const h = class {
83
174
  // #endregion
84
175
  // #region Render Methods
85
176
  this.renderList = ({data: t}) => {
86
- const {listProps: o, slotsHtml: a = []} = t;
87
- return e(i, null, a.filter((t => t.slot === "top")).map((t => e("div", {
177
+ const {listProps: i, slotsHtml: a = []} = t;
178
+ return o(e, null, a.filter((t => t.slot === "top")).map((t => o("div", {
88
179
  innerHTML: c(t.html)
89
- }))), e("div", {
180
+ }))), o("div", {
90
181
  class: "content",
91
182
  ref: t => this.contentElement = t
92
- }, e("q2-option-list", {
183
+ }, o("q2-option-list", {
93
184
  ref: t => this.optionListElement = t,
94
- multiple: o.multiple,
95
- noSelect: o.noSelect,
185
+ multiple: i.multiple,
186
+ noSelect: i.noSelect,
96
187
  onChange: this.onListChange,
97
188
  onPopoverState: this.onListPopoverStateChange,
98
- selectedOptions: o.selectedOptions
99
- }, e("slot", null))), e("footer", null, o.multiple && e("q2-btn", {
189
+ selectedOptions: i.selectedOptions
190
+ }, o("slot", null))), o("footer", null, i.multiple && o("q2-btn", {
191
+ ref: t => this.doneButtonElement = t,
100
192
  "test-id": "btnDone",
101
193
  intent: "workflow-primary",
102
194
  onClick: this.onListDone
103
- }, r("tecton.element.actionSheet.done"))), a.filter((t => t.slot === "bottom")).map((t => e("div", {
195
+ }, s("tecton.element.actionSheet.done"))), a.filter((t => t.slot === "bottom")).map((t => o("div", {
104
196
  innerHTML: c(t.html)
105
197
  }))));
106
198
  };
107
- this.renderMessage = ({data: t}) => e("q2-message", {
199
+ this.renderMessage = ({data: t}) => o("q2-message", {
108
200
  type: t.type
109
- }, t.title && e("h2", null, t.title), t.description && e("p", null, t.description));
110
- this.renderSlot = () => e("div", {
201
+ }, t.title && o("h2", null, t.title), t.description && o("p", null, t.description));
202
+ this.renderSlot = () => o("div", {
111
203
  class: "content",
112
204
  ref: t => this.contentElement = t
113
- }, e("slot", null));
205
+ }, o("slot", null));
114
206
  }
115
207
  // #endregion
116
208
  // #region Component Lifecycle Events
117
209
  disconnectedCallback() {
118
210
  this.dialogElement.removeEventListener("cancel", this.onCancel);
211
+ this.dialogElement.removeEventListener("keydown", this.handleDialogKeydown, true);
119
212
  }
120
213
  componentDidLoad() {
121
214
  this.dialogElement.addEventListener("cancel", this.onCancel);
215
+ // Use capture phase to intercept Tab before option-list handles it
216
+ this.dialogElement.addEventListener("keydown", this.handleDialogKeydown, true);
122
217
  this.ready.emit();
123
218
  }
124
219
  // #endregion
@@ -147,7 +242,7 @@ const h = class {
147
242
  }
148
243
  async show() {
149
244
  this.showPreHook();
150
- await s();
245
+ await r();
151
246
  this.updateDialogMinMaxHeight();
152
247
  this.storeInitialValues();
153
248
  if (this.dialogElement.open) return;
@@ -167,9 +262,9 @@ const h = class {
167
262
  const {data: t} = this;
168
263
  if (!t) return;
169
264
  if (t.appearance === "list") {
170
- const {event: o} = t;
171
- if (o instanceof KeyboardEvent) {
172
- this.optionListElement.handleExternalKeydown(o);
265
+ const {event: i} = t;
266
+ if (i instanceof KeyboardEvent) {
267
+ this.optionListElement.handleExternalKeydown(i);
173
268
  } else {
174
269
  this.optionListElement.focus();
175
270
  }
@@ -206,52 +301,53 @@ const h = class {
206
301
  }
207
302
  render() {
208
303
  var t;
209
- const {data: o} = this;
210
- const i = (o === null || o === void 0 ? void 0 : o.title) || this.title || !this.hideClose;
304
+ const {data: i} = this;
305
+ const e = (i === null || i === void 0 ? void 0 : i.title) || this.title || !this.hideClose;
211
306
  const a = this.renderStatus || "";
212
- let r = null;
213
- switch (o === null || o === void 0 ? void 0 : o.appearance) {
307
+ let s = null;
308
+ switch (i === null || i === void 0 ? void 0 : i.appearance) {
214
309
  case "message":
215
- r = this.renderMessage;
310
+ s = this.renderMessage;
216
311
  break;
217
312
 
218
313
  case "list":
219
- r = this.renderList;
314
+ s = this.renderList;
220
315
  break;
221
316
 
222
317
  default:
223
- r = this.renderSlot;
318
+ s = this.renderSlot;
224
319
  break;
225
320
  }
226
- const s = (o === null || o === void 0 ? void 0 : o.appearance) || "slot";
227
- const n = `interior is-${s}`;
228
- return e("dialog", {
229
- key: "7ef6d64d3f29d01edcc5ba09c6917e08eb27ed0d",
321
+ const r = (i === null || i === void 0 ? void 0 : i.appearance) || "slot";
322
+ const n = `interior is-${r}`;
323
+ return o("dialog", {
324
+ key: "4a0e3a165326ab9e724600d7e030fa39095dcda0",
230
325
  ref: t => this.dialogElement = t,
231
326
  class: a,
232
327
  onClick: this.onClick
233
- }, e("div", {
234
- key: "a7da46ce286106d4a14edd50a2ed926b0adb7c84",
328
+ }, o("div", {
329
+ key: "9848ffb2d692a788ad1cf1d606f3cfd8638501ae",
235
330
  class: n
236
- }, i && e("header", {
237
- key: "8de945c05de298bf044cb01b872e2f0db17d9910"
238
- }, e("div", {
239
- key: "b4ec8e173b7109456d927e3f3ceeb8e6e936243d",
331
+ }, e && o("header", {
332
+ key: "2a573e272202699a8bf225ae74263aea107f4e5d"
333
+ }, o("div", {
334
+ key: "6ea6f8b415ecba0414d337efc1ce4cfdb0ec0cc9",
240
335
  class: "title"
241
- }, (o === null || o === void 0 ? void 0 : o.title) || this.title), !this.hideClose && e("q2-btn", {
242
- key: "ccb610c96edec66abf9f5b353c973e8af9702472",
336
+ }, (i === null || i === void 0 ? void 0 : i.title) || this.title), !this.hideClose && o("q2-btn", {
337
+ key: "8f5efe5b235afadcaba63cd9ab0906c01cbb07a0",
338
+ ref: t => this.closeButtonElement = t,
243
339
  class: "btn-close",
244
340
  "test-id": "btnClose",
245
341
  onClick: this.onCancel,
246
342
  label: "tecton.element.actionSheet.close",
247
343
  "hide-label": true
248
- }, e("q2-icon", {
249
- key: "1989ba1b179b5053719a78a1d4b9359734f23f36",
344
+ }, o("q2-icon", {
345
+ key: "af64434f4d0ec15d183a91501e48cc550fc2532e",
250
346
  type: "close"
251
- }))), ((t = this.data) === null || t === void 0 ? void 0 : t.description) && e("p", {
252
- key: "13fc69d21bf48b27f22555630a25c7019ede5a2e"
253
- }, o.description), r && e(r, {
254
- key: "ec78bb8ee37838b38c32405c4292b6836e5deb5f",
347
+ }))), ((t = this.data) === null || t === void 0 ? void 0 : t.description) && o("p", {
348
+ key: "a2044acff20cfc72cbde4d0899d34e51ac390984"
349
+ }, i.description), s && o(s, {
350
+ key: "558338b884c43bc014cc577581646fe830b7bc77",
255
351
  data: this.data
256
352
  })));
257
353
  }
@@ -1 +1 @@
1
- {"version":3,"names":["q2ActionSheetCss","Q2ActionSheet","constructor","hostRef","this","initialSelectedOptions","maxHeight","minHeight","selectedOptions","values","value","isScrollable","renderStatus","generateOptgroup","option","optgroupElement","document","createElement","label","setAttribute","disabled","options","length","forEach","opt","appendChild","generateOption","optionElement","innerHTML","attributes","sanitizeHTMLString","Object","entries","key","undefined","onCancel","event","preventDefault","hide","_b","_a","type","onClick","eventTarget","target","HTMLElement","isInContent","closest","onListChange","detail","onListDone","onListPopoverStateChange","open","action","renderList","data","listProps","slotsHtml","h","Fragment","filter","entry","slot","map","sanitizeActionSheetSlotHtml","html","class","ref","el","contentElement","optionListElement","multiple","noSelect","onChange","onPopoverState","intent","loc","renderMessage","title","description","renderSlot","disconnectedCallback","dialogElement","removeEventListener","componentDidLoad","addEventListener","ready","emit","mirrorEmit","close","hidePostHook","once","show","showPreHook","waitForNextPaint","updateDialogMinMaxHeight","storeInitialValues","showModal","focusContent","appearance","KeyboardEvent","handleExternalKeydown","focus","hostElement","windowHeight","window","innerHeight","style","setProperty","Math","floor","render","showHeader","hideClose","RenderContent","interiorClasses"],"sources":["src/components/q2-action-sheet/q2-action-sheet.scss?tag=q2-action-sheet&encapsulation=shadow","src/components/q2-action-sheet/q2-action-sheet.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n@keyframes showBackdrop {\n from {\n opacity: 0;\n }\n}\n\n@keyframes hideBackdrop {\n to {\n opacity: 0;\n }\n}\n\n// CSS variables don't inherit into the ::backdrop pseudo-element\n$animation-tween: #{var-list(--tct-action-sheet-tween, --app-tween-2, unquote('0.4s ease'))};\n\ndialog {\n --comp-border-radius-default: var(--app-scale-3x, 15px) var(--app-scale-3x, 15px) 0 0;\n --comp-border-radius: #{var-list(--tct-action-sheet-border-radius, --comp-border-radius-default)};\n --comp-desktop-border-radius: #{var-list(--tct-action-sheet-border-radius, --app-scale-3x, 15px)};\n --comp-close-button-size: #{var-list(--tct-action-sheet-close-button-size, --t-a11y-min-size, 44px)};\n --comp-header-height: #{var-list(--tct-action-sheet-header-height, --t-a11y-min-size, 44px)};\n --comp-dialog-background: #{var-list(--tct-action-sheet-background, --t-base, #ffffff)};\n --comp-dialog-color: #{var-list(--tct-action-sheet-color, --t-text, #4d4d4d)};\n --comp-dialog-padding: #{var-list(--tct-action-sheet-padding, --app-scale-3x, 15px)};\n --comp-content-gradient-height: #{var-list(--tct-action-sheet-content-gradient-height, --app-scale-2x, 10px)};\n --comp-dialog-gap: #{var-list(--tct-action-sheet-gap, --app-scale-2x, 10px)};\n --comp-dialog-max-width: #{var-list(--tct-action-sheet-max-width, 400px)};\n --comp-dialog-max-height: #{var-list(--tct-action-sheet-max-height, --comp-action-sheet-computed-max-height, 75vh)};\n --comp-dialog-min-height: #{var-list(--tct-action-sheet-min-height, --comp-action-sheet-computed-min-height, 20vh)};\n --comp-dialog-box-shadow: #{var-list(\n --tct-action-sheet-box-shadow,\n --app-shadow-2,\n unquote(\"0px 0px 2px rgba(0, 0, 0, 0.12), 0px 4px 8px rgba(0, 0, 0, 0.14)\")\n )};\n\n position: fixed;\n top: 100%;\n bottom: unset;\n color: var(--comp-dialog-color);\n background: var(--comp-dialog-background);\n transition: transform $animation-tween, opacity $animation-tween;\n width: 100%;\n max-width: var(--comp-dialog-max-width);\n border: 0;\n border-radius: var(--comp-border-radius);\n box-shadow: var(--comp-dialog-box-shadow);\n padding: 0;\n height: auto;\n overflow: hidden;\n min-height: var(--comp-dialog-min-height);\n max-height: var(--comp-dialog-max-height);\n\n &::backdrop {\n opacity: 0;\n background: var-list(--tct-action-sheet-backdrop-background, --t-top-a2, rgba(13, 13, 13, 0.6));\n }\n\n &[open] {\n &.is-opening,\n &.is-open {\n transform: translateY(-100%);\n\n @media screen and (min-width: 1200px) {\n opacity: 1;\n transform: translateY(0);\n }\n\n &::backdrop {\n opacity: 1;\n animation: showBackdrop $animation-tween;\n }\n }\n\n &.is-closing {\n transform: translateY(10%);\n\n &::backdrop {\n animation: hideBackdrop $animation-tween;\n }\n }\n }\n\n @media screen and (min-width: 1200px) {\n border-radius: var(--comp-desktop-border-radius);\n top: 0px;\n bottom: 0px;\n height: fit-content;\n transform: translateY(10%);\n opacity: 0;\n }\n}\n\n.content {\n overflow-y: auto;\n @include tiny-scrollbar();\n}\n\n.interior {\n display: grid;\n grid-template-rows: 44px 1fr auto;\n gap: var(--comp-dialog-gap);\n max-height: calc(var(--comp-dialog-max-height) - var(--comp-dialog-padding));\n padding: var(--comp-dialog-padding);\n\n // Scroll overlays\n &.is-list {\n header,\n footer {\n position: relative;\n\n &:before {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n height: var(--comp-content-gradient-height);\n width: 100%;\n z-index: 1;\n }\n }\n }\n\n [slot=\"popover-top\"] {\n padding: var-list(--tct-dropdown-popover-top-slot-padding, 0);\n border-bottom: var-list(--tct-dropdown-slot-border-top);\n }\n\n [slot=\"popover-bottom\"] {\n padding: var-list(--tct-dropdown-popover-bottom-slot-padding, 0);\n border-top: var-list(--tct-dropdown-slot-border-bottom);\n }\n}\n\nheader {\n display: grid;\n grid-template-columns: var(--comp-close-button-size) 1fr var(--comp-close-button-size);\n grid-template-areas: '. title close';\n gap: var(--comp-dialog-gap);\n\n .title {\n grid-area: title;\n text-align: center;\n line-height: var(--comp-header-height);\n }\n\n .btn-close {\n grid-area: close;\n width: var(--comp-close-button-size);\n height: var(--comp-close-button-size);\n }\n}\n\nfooter {\n display: flex;\n justify-content: end;\n}\n","import {\n Component,\n ComponentInterface,\n Prop,\n Method,\n h,\n State,\n Event,\n EventEmitter,\n Element,\n Fragment,\n} from '@stencil/core';\nimport { Q2OptionListCustomEvent } from 'src/components';\nimport { loc, waitForNextPaint } from 'src/utils';\nimport sanitizeHTMLString, { sanitizeActionSheetSlotHtml } from 'src/utils/sanitize-html-string';\nimport type {\n ActionSheetListCloseData,\n ActionSheetData,\n ActionSheetListData,\n ActionSheetMessageData,\n ActionSheetSelectedOption,\n ActionSheetListOption,\n ActionSheetListOptgroup,\n} from 'q2-tecton-common/lib/types/action-sheet';\nimport mirrorEmit from '@/utils/mirror-emit';\n\n/**\n * @name Action Sheet\n * @category Display\n * @summary Use for presenting a modal sheet.\n */\n@Component({ tag: 'q2-action-sheet', shadow: true, styleUrl: 'q2-action-sheet.scss' })\nexport class Q2ActionSheet implements ComponentInterface {\n // #region Own Properties\n\n contentElement: HTMLDivElement;\n dialogElement: HTMLDialogElement;\n initialSelectedOptions: ActionSheetSelectedOption[] = [];\n maxHeight: number = 0.75;\n minHeight: number = 0.2;\n optionListElement: HTMLQ2OptionListElement;\n selectedOptions: { values: ActionSheetSelectedOption[]; value: string } = { values: [], value: '' };\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 isScrollable: boolean = false;\n\n @State()\n renderStatus: 'is-open' | 'is-closing' | 'is-opening' = 'is-closing';\n\n // #endregion\n // #region Public Property API\n\n @Prop({ mutable: true })\n data: ActionSheetData;\n\n @Prop()\n hideClose: boolean;\n\n @Prop()\n title: string;\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when the action sheet is closed.\n * @deprecated Use 'tctClose' instead\n */\n @Event()\n close: EventEmitter<ActionSheetListCloseData>;\n\n /**\n * Emitted when the component has finished rendering.\n * @private\n */\n @Event({ bubbles: false })\n ready: EventEmitter;\n\n /**\n * Emitted when the action sheet is closed.\n */\n @Event()\n tctClose: EventEmitter<ActionSheetListCloseData>;\n\n // #endregion\n // #region Component Lifecycle Events\n\n disconnectedCallback() {\n this.dialogElement.removeEventListener('cancel', this.onCancel);\n }\n\n componentDidLoad() {\n this.dialogElement.addEventListener('cancel', this.onCancel);\n this.ready.emit();\n }\n\n // #endregion\n // #region Public Methods API\n\n @Method()\n async hide(data: ActionSheetListCloseData = { value: '', values: [], type: 'confirm' }) {\n mirrorEmit(this, ['close', 'tctClose'], data);\n this.renderStatus = 'is-closing';\n this.dialogElement.addEventListener(\n 'transitionend',\n () => {\n if (this.renderStatus !== 'is-closing') return;\n this.dialogElement.close();\n this.renderStatus = null;\n this.data = undefined;\n this.initialSelectedOptions = [];\n this.selectedOptions = { values: [], value: '' };\n this.hidePostHook();\n },\n { once: true }\n );\n }\n\n @Method()\n async show() {\n this.showPreHook();\n await waitForNextPaint();\n this.updateDialogMinMaxHeight();\n this.storeInitialValues();\n\n if (this.dialogElement.open) return;\n\n this.dialogElement.showModal();\n this.renderStatus = 'is-opening';\n this.dialogElement.addEventListener(\n 'transitionend',\n () => {\n if (this.renderStatus !== 'is-opening') return;\n this.renderStatus = 'is-open';\n this.focusContent();\n },\n { once: true }\n );\n }\n\n // #endregion\n // #region Local Methods\n\n focusContent() {\n const { data } = this;\n if (!data) return;\n if (data.appearance === 'list') {\n const { event } = data;\n if (event instanceof KeyboardEvent) {\n this.optionListElement.handleExternalKeydown(event);\n } else {\n this.optionListElement.focus();\n }\n }\n }\n\n generateOptgroup = (option: ActionSheetListOptgroup) => {\n const optgroupElement = document.createElement('q2-optgroup');\n if (option.label) optgroupElement.setAttribute('label', option.label);\n if (option.disabled) optgroupElement.setAttribute('disabled', '');\n if (!!option.options.length)\n option.options.forEach(opt => optgroupElement.appendChild(this.generateOption(opt)));\n return optgroupElement;\n };\n\n generateOption = (option: ActionSheetListOption) => {\n const optionElement = document.createElement('q2-option');\n const { innerHTML, ...attributes } = option;\n if (innerHTML) optionElement.innerHTML = sanitizeHTMLString(innerHTML);\n Object.entries(attributes).forEach(([key, value]) => {\n if (value === undefined) return;\n if (typeof value === 'boolean') {\n if (value) optionElement.setAttribute(key, '');\n } else {\n optionElement.setAttribute(key, value);\n }\n });\n return optionElement;\n };\n\n hidePostHook() {\n const { data } = this;\n if (!data) return;\n if (data.appearance === 'list') {\n this.hostElement.innerHTML = null;\n }\n }\n\n onCancel = (event: Event) => {\n event.preventDefault();\n const { initialSelectedOptions } = this;\n this.hide({\n value: initialSelectedOptions?.[0]?.value ?? '',\n values: initialSelectedOptions,\n type: 'cancel',\n });\n };\n\n onClick = (event: MouseEvent) => {\n const eventTarget = event.target as HTMLElement;\n if (!(eventTarget instanceof HTMLElement)) return;\n\n const isInContent = !!eventTarget.closest('.interior, q2-action-sheet');\n if (isInContent) return;\n this.onCancel(event);\n };\n\n onListChange = (event: Q2OptionListCustomEvent<{ value: string; values: ActionSheetSelectedOption[] }>) => {\n this.selectedOptions = event.detail;\n };\n\n onListDone = () => {\n this.hide({\n ...this.selectedOptions,\n type: 'confirm',\n });\n };\n\n onListPopoverStateChange = (\n event: Q2OptionListCustomEvent<{ open: boolean; action: 'close' | 'select' | 'open' }>\n ) => {\n if (event.detail.open) return;\n\n if (event.detail.action === 'close') {\n this.onCancel(event);\n } else {\n this.onListDone();\n }\n };\n\n showPreHook() {\n const { data } = this;\n if (!data) return;\n if (data.appearance === 'list') {\n this.hostElement.innerHTML = null;\n data.options.forEach(option => {\n this.hostElement.appendChild(\n 'options' in option ? this.generateOptgroup(option) : this.generateOption(option)\n );\n });\n }\n }\n\n storeInitialValues() {\n const { data } = this;\n if (!data) return;\n if (data.appearance === 'list') {\n this.initialSelectedOptions = data.listProps.selectedOptions;\n }\n }\n\n updateDialogMinMaxHeight() {\n const windowHeight = window.innerHeight;\n this.dialogElement.style.setProperty(\n '--comp-action-sheet-computed-min-height',\n `${Math.floor(windowHeight * this.minHeight)}px`\n );\n this.dialogElement.style.setProperty(\n '--comp-action-sheet-computed-max-height',\n `${Math.floor(windowHeight * this.maxHeight)}px`\n );\n }\n\n // #endregion\n // #region Render Methods\n\n renderList = ({ data }: { data: ActionSheetListData }) => {\n const { listProps, slotsHtml = [] } = data;\n return (\n <Fragment>\n {slotsHtml\n .filter(entry => entry.slot === 'top')\n .map(entry => (\n <div innerHTML={sanitizeActionSheetSlotHtml(entry.html)}></div>\n ))}\n <div\n class=\"content\"\n ref={el => (this.contentElement = el)}\n >\n <q2-option-list\n ref={el => (this.optionListElement = el)}\n multiple={listProps.multiple}\n noSelect={listProps.noSelect}\n onChange={this.onListChange}\n onPopoverState={this.onListPopoverStateChange}\n selectedOptions={listProps.selectedOptions}\n >\n <slot />\n </q2-option-list>\n </div>\n <footer>\n {listProps.multiple && (\n <q2-btn\n test-id=\"btnDone\"\n intent=\"workflow-primary\"\n onClick={this.onListDone}\n >\n {loc('tecton.element.actionSheet.done')}\n </q2-btn>\n )}\n </footer>\n {slotsHtml\n .filter(entry => entry.slot === 'bottom')\n .map(entry => (\n <div innerHTML={sanitizeActionSheetSlotHtml(entry.html)}></div>\n ))}\n </Fragment>\n );\n };\n\n renderMessage = ({ data }: { data: ActionSheetMessageData }) => {\n return (\n <q2-message type={data.type}>\n {data.title && <h2>{data.title}</h2>}\n {data.description && <p>{data.description}</p>}\n </q2-message>\n );\n };\n\n renderSlot = () => {\n return (\n <div\n class=\"content\"\n ref={el => (this.contentElement = el)}\n >\n <slot />\n </div>\n );\n };\n\n render() {\n const { data } = this;\n const showHeader = data?.title || this.title || !this.hideClose;\n const renderStatus = this.renderStatus || '';\n\n let RenderContent = null;\n switch (data?.appearance) {\n case 'message':\n RenderContent = this.renderMessage;\n break;\n\n case 'list':\n RenderContent = this.renderList;\n break;\n\n default:\n RenderContent = this.renderSlot;\n break;\n }\n const appearance = data?.appearance || 'slot';\n const interiorClasses = `interior is-${appearance}`;\n return (\n <dialog\n ref={el => (this.dialogElement = el)}\n class={renderStatus}\n onClick={this.onClick}\n >\n <div class={interiorClasses}>\n {showHeader && (\n <header>\n <div class=\"title\">{data?.title || this.title}</div>\n {!this.hideClose && (\n <q2-btn\n class=\"btn-close\"\n test-id=\"btnClose\"\n onClick={this.onCancel}\n label=\"tecton.element.actionSheet.close\"\n hide-label\n >\n <q2-icon type=\"close\" />\n </q2-btn>\n )}\n </header>\n )}\n {this.data?.description && <p>{data.description}</p>}\n {RenderContent && <RenderContent data={this.data} />}\n </div>\n </dialog>\n );\n }\n\n // #endregion\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["q2ActionSheetCss","Q2ActionSheet","constructor","hostRef","this","initialSelectedOptions","maxHeight","minHeight","selectedOptions","values","value","isScrollable","renderStatus","focusLastVisibleOption","async","optionListElement","allOptions","getOptions","lastVisibleOption","slice","reverse","find","opt","hidden","disabled","focus","generateOptgroup","option","optgroupElement","document","createElement","label","setAttribute","options","length","forEach","appendChild","generateOption","optionElement","innerHTML","attributes","sanitizeHTMLString","Object","entries","key","undefined","handleDialogKeydown","event","data","appearance","shiftKey","shadowActiveElement","hostElement","shadowRoot","activeElement","closeButton","closeButtonElement","doneButton","doneButtonElement","isInCloseButton","isInDoneButton","isOnOption","tagName","contains","preventDefault","onCancel","hide","_b","_a","type","onClick","eventTarget","target","HTMLElement","isInContent","closest","onListChange","detail","onListDone","onListPopoverStateChange","open","action","renderList","listProps","slotsHtml","h","Fragment","filter","entry","slot","map","sanitizeActionSheetSlotHtml","html","class","ref","el","contentElement","multiple","noSelect","onChange","onPopoverState","intent","loc","renderMessage","title","description","renderSlot","disconnectedCallback","dialogElement","removeEventListener","componentDidLoad","addEventListener","ready","emit","mirrorEmit","close","hidePostHook","once","show","showPreHook","waitForNextPaint","updateDialogMinMaxHeight","storeInitialValues","showModal","focusContent","KeyboardEvent","handleExternalKeydown","windowHeight","window","innerHeight","style","setProperty","Math","floor","render","showHeader","hideClose","RenderContent","interiorClasses"],"sources":["src/components/q2-action-sheet/q2-action-sheet.scss?tag=q2-action-sheet&encapsulation=shadow","src/components/q2-action-sheet/q2-action-sheet.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import './variables';\n\n@keyframes showBackdrop {\n from {\n opacity: 0;\n }\n}\n\n@keyframes hideBackdrop {\n to {\n opacity: 0;\n }\n}\n\n// CSS variables don't inherit into the ::backdrop pseudo-element\n$animation-tween: #{var-list(--tct-action-sheet-tween, --app-tween-2, unquote('0.4s ease'))};\n\ndialog {\n --comp-border-radius-default: var(--app-scale-3x, 15px) var(--app-scale-3x, 15px) 0 0;\n --comp-border-radius: #{var-list(--tct-action-sheet-border-radius, --comp-border-radius-default)};\n --comp-desktop-border-radius: #{var-list(--tct-action-sheet-border-radius, --app-scale-3x, 15px)};\n --comp-close-button-size: #{var-list(--tct-action-sheet-close-button-size, --t-a11y-min-size, 44px)};\n --comp-header-height: #{var-list(--tct-action-sheet-header-height, --t-a11y-min-size, 44px)};\n --comp-dialog-background: #{var-list(--tct-action-sheet-background, --t-base, #ffffff)};\n --comp-dialog-color: #{var-list(--tct-action-sheet-color, --t-text, #4d4d4d)};\n --comp-dialog-padding: #{var-list(--tct-action-sheet-padding, --app-scale-3x, 15px)};\n --comp-content-gradient-height: #{var-list(--tct-action-sheet-content-gradient-height, --app-scale-2x, 10px)};\n --comp-dialog-gap: #{var-list(--tct-action-sheet-gap, --app-scale-2x, 10px)};\n --comp-dialog-max-width: #{var-list(--tct-action-sheet-max-width, 400px)};\n --comp-dialog-max-height: #{var-list(--tct-action-sheet-max-height, --comp-action-sheet-computed-max-height, 75vh)};\n --comp-dialog-min-height: #{var-list(--tct-action-sheet-min-height, --comp-action-sheet-computed-min-height, 20vh)};\n --comp-dialog-box-shadow: #{var-list(\n --tct-action-sheet-box-shadow,\n --app-shadow-2,\n unquote(\"0px 0px 2px rgba(0, 0, 0, 0.12), 0px 4px 8px rgba(0, 0, 0, 0.14)\")\n )};\n\n position: fixed;\n top: 100%;\n bottom: unset;\n color: var(--comp-dialog-color);\n background: var(--comp-dialog-background);\n transition: transform $animation-tween, opacity $animation-tween;\n width: 100%;\n max-width: var(--comp-dialog-max-width);\n border: 0;\n border-radius: var(--comp-border-radius);\n box-shadow: var(--comp-dialog-box-shadow);\n padding: 0;\n height: auto;\n overflow: hidden;\n min-height: var(--comp-dialog-min-height);\n max-height: var(--comp-dialog-max-height);\n\n &::backdrop {\n opacity: 0;\n background: var-list(--tct-action-sheet-backdrop-background, --t-top-a2, rgba(13, 13, 13, 0.6));\n }\n\n &[open] {\n &.is-opening,\n &.is-open {\n transform: translateY(-100%);\n\n @media screen and (min-width: 1200px) {\n opacity: 1;\n transform: translateY(0);\n }\n\n &::backdrop {\n opacity: 1;\n animation: showBackdrop $animation-tween;\n }\n }\n\n &.is-closing {\n transform: translateY(10%);\n\n &::backdrop {\n animation: hideBackdrop $animation-tween;\n }\n }\n }\n\n @media screen and (min-width: 1200px) {\n border-radius: var(--comp-desktop-border-radius);\n top: 0px;\n bottom: 0px;\n height: fit-content;\n transform: translateY(10%);\n opacity: 0;\n }\n}\n\n.content {\n overflow-y: auto;\n @include tiny-scrollbar();\n}\n\n.interior {\n display: grid;\n grid-template-rows: 44px 1fr auto;\n gap: var(--comp-dialog-gap);\n max-height: calc(var(--comp-dialog-max-height) - var(--comp-dialog-padding));\n padding: var(--comp-dialog-padding);\n\n // Scroll overlays\n &.is-list {\n header,\n footer {\n position: relative;\n\n &:before {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n height: var(--comp-content-gradient-height);\n width: 100%;\n z-index: 1;\n }\n }\n }\n\n [slot=\"popover-top\"] {\n padding: var-list(--tct-dropdown-popover-top-slot-padding, 0);\n border-bottom: var-list(--tct-dropdown-slot-border-top);\n }\n\n [slot=\"popover-bottom\"] {\n padding: var-list(--tct-dropdown-popover-bottom-slot-padding, 0);\n border-top: var-list(--tct-dropdown-slot-border-bottom);\n }\n}\n\nheader {\n display: grid;\n grid-template-columns: var(--comp-close-button-size) 1fr var(--comp-close-button-size);\n grid-template-areas: '. title close';\n gap: var(--comp-dialog-gap);\n\n .title {\n grid-area: title;\n text-align: center;\n line-height: var(--comp-header-height);\n }\n\n .btn-close {\n grid-area: close;\n width: var(--comp-close-button-size);\n height: var(--comp-close-button-size);\n }\n}\n\nfooter {\n display: flex;\n justify-content: end;\n}\n","import {\n Component,\n ComponentInterface,\n Prop,\n Method,\n h,\n State,\n Event,\n EventEmitter,\n Element,\n Fragment,\n} from '@stencil/core';\nimport { Q2OptionListCustomEvent } from 'src/components';\nimport { loc, waitForNextPaint } from 'src/utils';\nimport sanitizeHTMLString, { sanitizeActionSheetSlotHtml } from 'src/utils/sanitize-html-string';\nimport type {\n ActionSheetListCloseData,\n ActionSheetData,\n ActionSheetListData,\n ActionSheetMessageData,\n ActionSheetSelectedOption,\n ActionSheetListOption,\n ActionSheetListOptgroup,\n} from 'q2-tecton-common/lib/types/action-sheet';\nimport mirrorEmit from '@/utils/mirror-emit';\n\n/**\n * @name Action Sheet\n * @category Display\n * @summary Use for presenting a modal sheet.\n */\n@Component({ tag: 'q2-action-sheet', shadow: true, styleUrl: 'q2-action-sheet.scss' })\nexport class Q2ActionSheet implements ComponentInterface {\n // #region Own Properties\n\n closeButtonElement: HTMLQ2BtnElement;\n contentElement: HTMLDivElement;\n dialogElement: HTMLDialogElement;\n doneButtonElement: HTMLQ2BtnElement;\n initialSelectedOptions: ActionSheetSelectedOption[] = [];\n maxHeight: number = 0.75;\n minHeight: number = 0.2;\n optionListElement: HTMLQ2OptionListElement;\n selectedOptions: { values: ActionSheetSelectedOption[]; value: string } = { values: [], value: '' };\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 isScrollable: boolean = false;\n\n @State()\n renderStatus: 'is-open' | 'is-closing' | 'is-opening' = 'is-closing';\n\n // #endregion\n // #region Public Property API\n\n @Prop({ mutable: true })\n data: ActionSheetData;\n\n @Prop()\n hideClose: boolean;\n\n @Prop()\n title: string;\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when the action sheet is closed.\n * @deprecated Use 'tctClose' instead\n */\n @Event()\n close: EventEmitter<ActionSheetListCloseData>;\n\n /**\n * Emitted when the component has finished rendering.\n * @private\n */\n @Event({ bubbles: false })\n ready: EventEmitter;\n\n /**\n * Emitted when the action sheet is closed.\n */\n @Event()\n tctClose: EventEmitter<ActionSheetListCloseData>;\n\n // #endregion\n // #region Component Lifecycle Events\n\n disconnectedCallback() {\n this.dialogElement.removeEventListener('cancel', this.onCancel);\n this.dialogElement.removeEventListener('keydown', this.handleDialogKeydown, true);\n }\n\n componentDidLoad() {\n this.dialogElement.addEventListener('cancel', this.onCancel);\n // Use capture phase to intercept Tab before option-list handles it\n this.dialogElement.addEventListener('keydown', this.handleDialogKeydown, true);\n this.ready.emit();\n }\n\n // #endregion\n // #region Public Methods API\n\n @Method()\n async hide(data: ActionSheetListCloseData = { value: '', values: [], type: 'confirm' }) {\n mirrorEmit(this, ['close', 'tctClose'], data);\n this.renderStatus = 'is-closing';\n this.dialogElement.addEventListener(\n 'transitionend',\n () => {\n if (this.renderStatus !== 'is-closing') return;\n this.dialogElement.close();\n this.renderStatus = null;\n this.data = undefined;\n this.initialSelectedOptions = [];\n this.selectedOptions = { values: [], value: '' };\n this.hidePostHook();\n },\n { once: true }\n );\n }\n\n @Method()\n async show() {\n this.showPreHook();\n await waitForNextPaint();\n this.updateDialogMinMaxHeight();\n this.storeInitialValues();\n\n if (this.dialogElement.open) return;\n\n this.dialogElement.showModal();\n this.renderStatus = 'is-opening';\n this.dialogElement.addEventListener(\n 'transitionend',\n () => {\n if (this.renderStatus !== 'is-opening') return;\n this.renderStatus = 'is-open';\n this.focusContent();\n },\n { once: true }\n );\n }\n\n // #endregion\n // #region Local Methods\n\n focusContent() {\n const { data } = this;\n if (!data) return;\n if (data.appearance === 'list') {\n const { event } = data;\n if (event instanceof KeyboardEvent) {\n this.optionListElement.handleExternalKeydown(event);\n } else {\n this.optionListElement.focus();\n }\n }\n }\n\n /**\n * Focuses the last visible (non-hidden, non-disabled) option in the option list.\n * Uses the async getOptions() method, but is invoked after preventDefault() has\n * already been called synchronously by the caller.\n */\n focusLastVisibleOption = async () => {\n if (!this.optionListElement) return;\n const allOptions = await this.optionListElement.getOptions();\n const lastVisibleOption = allOptions\n .slice()\n .reverse()\n .find(opt => !opt.hidden && !opt.disabled);\n if (lastVisibleOption) {\n lastVisibleOption.focus();\n }\n };\n\n generateOptgroup = (option: ActionSheetListOptgroup) => {\n const optgroupElement = document.createElement('q2-optgroup');\n if (option.label) optgroupElement.setAttribute('label', option.label);\n if (option.disabled) optgroupElement.setAttribute('disabled', '');\n if (!!option.options.length)\n option.options.forEach(opt => optgroupElement.appendChild(this.generateOption(opt)));\n return optgroupElement;\n };\n\n generateOption = (option: ActionSheetListOption) => {\n const optionElement = document.createElement('q2-option');\n const { innerHTML, ...attributes } = option;\n if (innerHTML) optionElement.innerHTML = sanitizeHTMLString(innerHTML);\n Object.entries(attributes).forEach(([key, value]) => {\n if (value === undefined) return;\n if (typeof value === 'boolean') {\n if (value) optionElement.setAttribute(key, '');\n } else {\n optionElement.setAttribute(key, value);\n }\n });\n return optionElement;\n };\n\n /**\n * Handles keyboard navigation within the action sheet dialog.\n * Manages Tab navigation between options and action buttons (close/done).\n * Allows Tab to exit to browser chrome when reaching boundaries.\n *\n * NOTE: This handler is intentionally synchronous. `event.preventDefault()`\n * must be called before the browser processes the Tab key (i.e., during the\n * synchronous portion of the keydown event). Introducing an `await` here\n * allows the browser to shift focus before preventDefault runs, which causes\n * Tab from the close button to escape the dialog instead of cycling back to\n * the options.\n * @param event - The keyboard event.\n */\n handleDialogKeydown = (event: KeyboardEvent) => {\n const { data } = this;\n // Only activate for list appearance with an option list\n if (!data || data.appearance !== 'list' || !this.optionListElement) return;\n\n const { key, shiftKey } = event;\n if (key !== 'Tab') return;\n\n const shadowActiveElement = this.hostElement.shadowRoot.activeElement;\n const closeButton = this.closeButtonElement;\n const doneButton = this.doneButtonElement;\n\n const isInCloseButton = shadowActiveElement === closeButton;\n const isInDoneButton = shadowActiveElement === doneButton;\n\n // q2-option lives in light DOM, so document.activeElement is the option element itself when focused.\n // Avoid `await optionListElement.getOptions()` here — that defers the handler past\n // the browser's default Tab handling, making preventDefault() ineffective.\n const activeElement = document.activeElement;\n const isOnOption =\n !!activeElement &&\n (activeElement.tagName === 'Q2-OPTION' || activeElement.tagName === 'Q2-DROPDOWN-ITEM') &&\n this.hostElement.contains(activeElement);\n\n if (shiftKey) {\n // Shift+Tab: if on close button\n if (isInCloseButton) {\n // With a done button (multi-select): allow default to exit to browser.\n // Browser Shift+Tab from the URL bar lands on the done button (last\n // tabbable in DOM order), which redirects to the last option via\n // focusLastVisibleOption — so choices remain reachable.\n if (doneButton) {\n // Let it bubble - exits to browser chrome\n return;\n }\n // Without a done button (single-select): redirect to the last visible\n // option. Otherwise focus would exit to the URL bar and the next\n // Shift+Tab back into the page would land on the close button (the\n // only tabbable in the modal), trapping the user in URL ↔ close\n // with no path back to choices.\n event.preventDefault();\n this.focusLastVisibleOption();\n }\n // Shift+Tab: if on done button, focus last option\n else if (isInDoneButton) {\n event.preventDefault();\n this.focusLastVisibleOption();\n }\n // Shift+Tab: if on any option, go to close button\n else if (isOnOption && closeButton) {\n event.preventDefault();\n closeButton.focus();\n }\n } else {\n // Forward Tab: if on close button, skip to first/selected option\n if (isInCloseButton) {\n event.preventDefault();\n this.optionListElement.focus();\n }\n // Forward Tab: if on done button, allow default to exit to browser\n else if (isInDoneButton) {\n // Let it bubble - exits to browser chrome\n return;\n }\n // Forward Tab: if on any option\n else if (isOnOption) {\n if (doneButton) {\n // With done button: go to done button\n event.preventDefault();\n doneButton.focus();\n }\n // else: No done button - allow default Tab behavior to exit to browser\n }\n }\n };\n\n hidePostHook() {\n const { data } = this;\n if (!data) return;\n if (data.appearance === 'list') {\n this.hostElement.innerHTML = null;\n }\n }\n\n onCancel = (event: Event) => {\n event.preventDefault();\n const { initialSelectedOptions } = this;\n this.hide({\n value: initialSelectedOptions?.[0]?.value ?? '',\n values: initialSelectedOptions,\n type: 'cancel',\n });\n };\n\n onClick = (event: MouseEvent) => {\n const eventTarget = event.target as HTMLElement;\n if (!(eventTarget instanceof HTMLElement)) return;\n\n const isInContent = !!eventTarget.closest('.interior, q2-action-sheet');\n if (isInContent) return;\n this.onCancel(event);\n };\n\n onListChange = (event: Q2OptionListCustomEvent<{ value: string; values: ActionSheetSelectedOption[] }>) => {\n this.selectedOptions = event.detail;\n };\n\n onListDone = () => {\n this.hide({\n ...this.selectedOptions,\n type: 'confirm',\n });\n };\n\n onListPopoverStateChange = (\n event: Q2OptionListCustomEvent<{ open: boolean; action: 'close' | 'select' | 'open' }>\n ) => {\n if (event.detail.open) return;\n\n if (event.detail.action === 'close') {\n this.onCancel(event);\n } else {\n this.onListDone();\n }\n };\n\n showPreHook() {\n const { data } = this;\n if (!data) return;\n if (data.appearance === 'list') {\n this.hostElement.innerHTML = null;\n data.options.forEach(option => {\n this.hostElement.appendChild(\n 'options' in option ? this.generateOptgroup(option) : this.generateOption(option)\n );\n });\n }\n }\n\n storeInitialValues() {\n const { data } = this;\n if (!data) return;\n if (data.appearance === 'list') {\n this.initialSelectedOptions = data.listProps.selectedOptions;\n }\n }\n\n updateDialogMinMaxHeight() {\n const windowHeight = window.innerHeight;\n this.dialogElement.style.setProperty(\n '--comp-action-sheet-computed-min-height',\n `${Math.floor(windowHeight * this.minHeight)}px`\n );\n this.dialogElement.style.setProperty(\n '--comp-action-sheet-computed-max-height',\n `${Math.floor(windowHeight * this.maxHeight)}px`\n );\n }\n\n // #endregion\n // #region Render Methods\n\n renderList = ({ data }: { data: ActionSheetListData }) => {\n const { listProps, slotsHtml = [] } = data;\n return (\n <Fragment>\n {slotsHtml\n .filter(entry => entry.slot === 'top')\n .map(entry => (\n <div innerHTML={sanitizeActionSheetSlotHtml(entry.html)}></div>\n ))}\n <div\n class=\"content\"\n ref={el => (this.contentElement = el)}\n >\n <q2-option-list\n ref={el => (this.optionListElement = el)}\n multiple={listProps.multiple}\n noSelect={listProps.noSelect}\n onChange={this.onListChange}\n onPopoverState={this.onListPopoverStateChange}\n selectedOptions={listProps.selectedOptions}\n >\n <slot />\n </q2-option-list>\n </div>\n <footer>\n {listProps.multiple && (\n <q2-btn\n ref={el => (this.doneButtonElement = el)}\n test-id=\"btnDone\"\n intent=\"workflow-primary\"\n onClick={this.onListDone}\n >\n {loc('tecton.element.actionSheet.done')}\n </q2-btn>\n )}\n </footer>\n {slotsHtml\n .filter(entry => entry.slot === 'bottom')\n .map(entry => (\n <div innerHTML={sanitizeActionSheetSlotHtml(entry.html)}></div>\n ))}\n </Fragment>\n );\n };\n\n renderMessage = ({ data }: { data: ActionSheetMessageData }) => {\n return (\n <q2-message type={data.type}>\n {data.title && <h2>{data.title}</h2>}\n {data.description && <p>{data.description}</p>}\n </q2-message>\n );\n };\n\n renderSlot = () => {\n return (\n <div\n class=\"content\"\n ref={el => (this.contentElement = el)}\n >\n <slot />\n </div>\n );\n };\n\n render() {\n const { data } = this;\n const showHeader = data?.title || this.title || !this.hideClose;\n const renderStatus = this.renderStatus || '';\n\n let RenderContent = null;\n switch (data?.appearance) {\n case 'message':\n RenderContent = this.renderMessage;\n break;\n\n case 'list':\n RenderContent = this.renderList;\n break;\n\n default:\n RenderContent = this.renderSlot;\n break;\n }\n const appearance = data?.appearance || 'slot';\n const interiorClasses = `interior is-${appearance}`;\n return (\n <dialog\n ref={el => (this.dialogElement = el)}\n class={renderStatus}\n onClick={this.onClick}\n >\n <div class={interiorClasses}>\n {showHeader && (\n <header>\n <div class=\"title\">{data?.title || this.title}</div>\n {!this.hideClose && (\n <q2-btn\n ref={el => (this.closeButtonElement = el)}\n class=\"btn-close\"\n test-id=\"btnClose\"\n onClick={this.onCancel}\n label=\"tecton.element.actionSheet.close\"\n hide-label\n >\n <q2-icon type=\"close\" />\n </q2-btn>\n )}\n </header>\n )}\n {this.data?.description && <p>{data.description}</p>}\n {RenderContent && <RenderContent data={this.data} />}\n </div>\n </dialog>\n );\n }\n\n // #endregion\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"q2-avatar.entry.esm.js","sources":["src/components/q2-avatar/q2-avatar.scss?tag=q2-avatar&encapsulation=shadow","src/components/q2-avatar/q2-avatar.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n.avatar-wrapper {\n position: relative;\n border: 1px solid transparent;\n padding: 1px;\n border-radius: 100%;\n\n .hover-ring {\n display: flex;\n }\n &:hover {\n border-color: var-list(\n --tct-avatar-background,\n --tct-avatar-bg,\n --t-gray-8,\n #9e9e9e\n );\n }\n\n .decorator {\n height: var(--app-scale-3x, 15px);\n width: var(--app-scale-3x, 15px);\n background-color: var-list(--tct-avatar-decorator-background-color, --t-base, #ffffff);\n border-radius: 100%;\n box-shadow: var-list(\n --app-shadow-1,\n #{unquote('0px 0px 2px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.14)')}\n );\n position: absolute;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n ::slotted(q2-icon) {\n color: var-list(--tct-avatar-decorator-color, #000000);\n }\n }\n\n &.size-small {\n height: var(--tct-avatar-small-size, 24px);\n width: var(--tct-avatar-small-size, 24px);\n .decorator {\n height: var(--app-scale-2x, 10px);\n width: var(--app-scale-2x, 10px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: var(--tct-avatar-decorator-small-icon-size, 8px);\n width: var(--tct-avatar-decorator-small-icon-size, 8px);\n aspect-ratio: 1/1;\n }\n }\n }\n &.size-medium {\n height: var-list(--tct-avatar-size, --tct-avatar-height, 44px);\n width: var-list(--tct-avatar-size, --tct-avatar-width, 44px);\n .decorator {\n height: var(--app-scale-3x, 15px);\n width: var(--app-scale-3x, 15px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: var(--app-scale-2x, 10px);\n width: var(--app-scale-2x, 10px);\n aspect-ratio: 1/1;\n }\n }\n }\n &.size-large {\n height: var(--tct-avatar-large-size, 64px);\n width: var(--tct-avatar-large-size, 64px);\n .decorator {\n height: var(--app-scale-4x, 20px);\n width: var(--app-scale-4x, 20px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: 14px;\n width: 14px;\n aspect-ratio: 1/1;\n }\n }\n }\n}\n\n.avatar-img,\n.avatar-img-default {\n display: var(--tct-avatar-display, block);\n object-fit: cover;\n border-radius: var-list(--tct-avatar-img-border-radius, --tct-avatar-img-br, --tct-avatar-border-radius, 50%);\n border: var(--tct-avatar-border, none);\n height: 100%;\n width: 100%;\n}\n\n.avatar-img-default {\n background: var-list(--tct-avatar-background, --tct-avatar-bg, #9e9e9e);\n}\n\n.avatar-initials {\n display: var(--tct-avatar-display, block);\n backdrop-filter: var(--tct-avatar-backdrop-filter);\n background: var-list(--tct-avatar-background, --tct-avatar-bg, --t-gray-8, #9e9e9e);\n border-radius: var(--tct-avatar-br, 50%);\n border: var(--tct-avatar-border, none);\n height: 100%;\n width: 100%;\n}\n\ntext {\n fill: var-list(--tct-avatar-text-color, --tct-avatar-color, #ffffff);\n font-weight: var(--tct-avatar-font-weight, 200);\n font-size: var(--tct-avatar-font-size, 40px);\n}\n\n.fallback {\n height: 100%;\n width: 100%;\n border-radius: var-list(\n --tct-avatar-img-border-radius,\n --tct-avatar-img-br,\n 50%\n );\n border: var(--tct-avatar-border, none);\n background: var-list(\n --tct-avatar-background,\n --tct-avatar-bg,\n --t-gray-8,\n #9e9e9e\n );\n display: flex;\n align-items: center;\n justify-content: center;\n\n q2-icon {\n --tct-icon-size: #{var-list(--tct-avatar-icon-size, 65%)};\n --tct-icon-stroke-primary: #{var-list(\n --tct-avatar-icon-stroke-primary,\n currentcolor\n )};\n --tct-icon-stroke-secondary: #{var-list(\n --tct-avatar-icon-stroke-secondary,\n currentcolor\n )};\n --tct-icon-fill: #{var-list(--tct-avatar-icon-fill)};\n color: var-list(--tct-avatar-icon-color, --tct-avatar-color, --t-base, #ffffff);\n width: var-list(--tct-avatar-icon-size, --tct-icon-size);\n height: var-list(--tct-avatar-icon-size, --tct-icon-size);\n }\n}\n","import { Component, ComponentInterface, Prop, Element, h, State, Watch } from '@stencil/core';\n\n/**\n * @name Avatar\n * @category Display\n * @summary Use for displaying photos, initials, or icons for people, businesses, or accounts.\n *\n * @slot decorator - An optional affordance indicator to display in the top-right corner\n */\n@Component({ tag: 'q2-avatar', shadow: true, styleUrl: 'q2-avatar.scss' })\nexport class Q2Avatar implements ComponentInterface {\n // #region Own Properties\n\n private decoratorObserver: MutationObserver;\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n el: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n badSrc: boolean = false;\n\n @State()\n hasDecorator: boolean = false;\n\n @State()\n isLoaded: boolean = false;\n\n // #endregion\n // #region Public Property API\n\n /** A [q2-icon](https://tecton.q2developer.com/design-system/q2-icon/) to display as the fallback. */\n @Prop()\n icon: string = 'person';\n\n /** A set of up to four initials to display as capitalized text. Takes priority over `name`. */\n @Prop({ reflect: true })\n initials: string;\n\n /**\n * The name associated with the avatar.\n * The initials of the first and last words provided will display as capital letters.\n *\n * @info\n * We recommend always providing a name when you want the avatar to be presented to screen readers.\n */\n @Prop({ reflect: true })\n name: string;\n\n /** Determines how large to make the avatar */\n @Prop({ reflect: true })\n size: 'small' | 'medium' | 'large' = 'medium';\n\n /** Displays the image provided by the user. */\n @Prop({ reflect: true })\n src: string;\n\n // #endregion\n // #region Component Lifecycle Events\n\n disconnectedCallback() {\n if (this.decoratorObserver) {\n this.decoratorObserver.disconnect();\n }\n }\n\n componentWillLoad() {\n this.checkDecorator();\n }\n\n componentDidLoad() {\n this.setupDecoratorObserver();\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('src')\n srcDidUpdate() {\n this.badSrc = false;\n }\n\n // #endregion\n // #region Local Methods\n\n get computedInitials() {\n const { initials, name } = this;\n if (!initials && !name) return;\n\n let result = '';\n if (initials) {\n result = initials.substr(0, 4);\n } else if (name) {\n const parts = name.split(' ');\n const firstCharacter = parts[0][0];\n const lastCharacter = parts.length > 1 ? parts[parts.length - 1][0] : undefined;\n result += firstCharacter;\n if (lastCharacter) result += lastCharacter;\n }\n\n result = result?.toUpperCase();\n\n return result;\n }\n\n checkDecorator() {\n const decoratorElements = Array.from(this.el.children).filter(\n child => child.getAttribute('slot') === 'decorator'\n );\n this.hasDecorator = decoratorElements.length > 0;\n }\n\n onError = () => {\n this.badSrc = true;\n };\n\n onLoad = () => {\n this.isLoaded = true;\n };\n\n private setupDecoratorObserver() {\n // Set up MutationObserver to watch for changes to the host element's children\n this.decoratorObserver = new MutationObserver(() => {\n this.checkDecorator();\n });\n\n // Observe changes to the host element's children (light DOM)\n this.decoratorObserver.observe(this.el, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['slot'],\n });\n }\n\n // #endregion\n // #region Render Methods\n\n render() {\n const { computedInitials } = this;\n const showImg = this.src && !this.badSrc;\n const isLoaded = this.isLoaded;\n const showInitials = (this.name || this.initials) && (!this.src || this.badSrc);\n const showFallback = !this.name && !this.initials && (!this.src || this.badSrc);\n\n return (\n <div class={`avatar-wrapper size-${this.size}`}>\n {this.hasDecorator && (\n <div class=\"decorator\">\n <slot name=\"decorator\" />\n </div>\n )}\n\n {showImg && (\n <img\n class={`${isLoaded ? 'avatar-img' : 'avatar-img-default'}`}\n test-id=\"userImage\"\n src={this.src}\n onError={this.onError}\n onLoad={this.onLoad}\n alt={this.name || ''}\n />\n )}\n {showInitials && (\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid meet\"\n test-id=\"userInitials\"\n class={`avatar-initials initials-size-${computedInitials.length}`}\n aria-label={this.name}\n aria-hidden={!this.name && 'true'}\n >\n <text\n x=\"50\"\n y=\"50\"\n dominant-baseline=\"central\"\n text-anchor=\"middle\"\n aria-hidden=\"true\"\n >\n {computedInitials}\n </text>\n </svg>\n )}\n {showFallback && (\n <div\n test-id=\"fallbackIcon\"\n class=\"fallback\"\n >\n <q2-icon type={this.icon}></q2-icon>\n </div>\n )}\n </div>\n );\n }\n\n // #endregion\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"q2-avatar.entry.esm.js","sources":["src/components/q2-avatar/q2-avatar.scss?tag=q2-avatar&encapsulation=shadow","src/components/q2-avatar/q2-avatar.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import './variables';\n\n.avatar-wrapper {\n position: relative;\n border: 1px solid transparent;\n padding: 1px;\n border-radius: 100%;\n\n .hover-ring {\n display: flex;\n }\n &:hover {\n border-color: var-list(\n --tct-avatar-background,\n --tct-avatar-bg,\n --t-gray-8,\n #9e9e9e\n );\n }\n\n .decorator {\n height: var(--app-scale-3x, 15px);\n width: var(--app-scale-3x, 15px);\n background-color: var-list(--tct-avatar-decorator-background-color, --t-base, #ffffff);\n border-radius: 100%;\n box-shadow: var-list(\n --app-shadow-1,\n #{unquote('0px 0px 2px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.14)')}\n );\n position: absolute;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n ::slotted(q2-icon) {\n color: var-list(--tct-avatar-decorator-color, #000000);\n }\n }\n\n &.size-small {\n height: var(--tct-avatar-small-size, 24px);\n width: var(--tct-avatar-small-size, 24px);\n .decorator {\n height: var(--app-scale-2x, 10px);\n width: var(--app-scale-2x, 10px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: var(--tct-avatar-decorator-small-icon-size, 8px);\n width: var(--tct-avatar-decorator-small-icon-size, 8px);\n aspect-ratio: 1/1;\n }\n }\n }\n &.size-medium {\n height: var-list(--tct-avatar-size, --tct-avatar-height, 44px);\n width: var-list(--tct-avatar-size, --tct-avatar-width, 44px);\n .decorator {\n height: var(--app-scale-3x, 15px);\n width: var(--app-scale-3x, 15px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: var(--app-scale-2x, 10px);\n width: var(--app-scale-2x, 10px);\n aspect-ratio: 1/1;\n }\n }\n }\n &.size-large {\n height: var(--tct-avatar-large-size, 64px);\n width: var(--tct-avatar-large-size, 64px);\n .decorator {\n height: var(--app-scale-4x, 20px);\n width: var(--app-scale-4x, 20px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: 14px;\n width: 14px;\n aspect-ratio: 1/1;\n }\n }\n }\n}\n\n.avatar-img,\n.avatar-img-default {\n display: var(--tct-avatar-display, block);\n object-fit: cover;\n border-radius: var-list(--tct-avatar-img-border-radius, --tct-avatar-img-br, --tct-avatar-border-radius, 50%);\n border: var(--tct-avatar-border, none);\n height: 100%;\n width: 100%;\n}\n\n.avatar-img-default {\n background: var-list(--tct-avatar-background, --tct-avatar-bg, #9e9e9e);\n}\n\n.avatar-initials {\n display: var(--tct-avatar-display, block);\n backdrop-filter: var(--tct-avatar-backdrop-filter);\n background: var-list(--tct-avatar-background, --tct-avatar-bg, --t-gray-8, #9e9e9e);\n border-radius: var(--tct-avatar-br, 50%);\n border: var(--tct-avatar-border, none);\n height: 100%;\n width: 100%;\n}\n\ntext {\n fill: var-list(--tct-avatar-text-color, --tct-avatar-color, #ffffff);\n font-weight: var(--tct-avatar-font-weight, 200);\n font-size: var(--tct-avatar-font-size, 40px);\n}\n\n.fallback {\n height: 100%;\n width: 100%;\n border-radius: var-list(\n --tct-avatar-img-border-radius,\n --tct-avatar-img-br,\n 50%\n );\n border: var(--tct-avatar-border, none);\n background: var-list(\n --tct-avatar-background,\n --tct-avatar-bg,\n --t-gray-8,\n #9e9e9e\n );\n display: flex;\n align-items: center;\n justify-content: center;\n\n q2-icon {\n --tct-icon-size: #{var-list(--tct-avatar-icon-size, 65%)};\n --tct-icon-stroke-primary: #{var-list(\n --tct-avatar-icon-stroke-primary,\n currentcolor\n )};\n --tct-icon-stroke-secondary: #{var-list(\n --tct-avatar-icon-stroke-secondary,\n currentcolor\n )};\n --tct-icon-fill: #{var-list(--tct-avatar-icon-fill)};\n color: var-list(--tct-avatar-icon-color, --tct-avatar-color, --t-base, #ffffff);\n width: var-list(--tct-avatar-icon-size, --tct-icon-size);\n height: var-list(--tct-avatar-icon-size, --tct-icon-size);\n }\n}\n","import { Component, ComponentInterface, Prop, Element, h, State, Watch } from '@stencil/core';\n\n/**\n * @name Avatar\n * @category Display\n * @summary Use for displaying photos, initials, or icons for people, businesses, or accounts.\n *\n * @slot decorator - An optional affordance indicator to display in the top-right corner\n */\n@Component({ tag: 'q2-avatar', shadow: true, styleUrl: 'q2-avatar.scss' })\nexport class Q2Avatar implements ComponentInterface {\n // #region Own Properties\n\n private decoratorObserver: MutationObserver;\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n el: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n badSrc: boolean = false;\n\n @State()\n hasDecorator: boolean = false;\n\n @State()\n isLoaded: boolean = false;\n\n // #endregion\n // #region Public Property API\n\n /** A [q2-icon](https://tecton.q2developer.com/design-system/q2-icon/) to display as the fallback. */\n @Prop()\n icon: string = 'person';\n\n /** A set of up to four initials to display as capitalized text. Takes priority over `name`. */\n @Prop({ reflect: true })\n initials: string;\n\n /**\n * The name associated with the avatar.\n * The initials of the first and last words provided will display as capital letters.\n *\n * @info\n * We recommend always providing a name when you want the avatar to be presented to screen readers.\n */\n @Prop({ reflect: true })\n name: string;\n\n /** Determines how large to make the avatar */\n @Prop({ reflect: true })\n size: 'small' | 'medium' | 'large' = 'medium';\n\n /** Displays the image provided by the user. */\n @Prop({ reflect: true })\n src: string;\n\n // #endregion\n // #region Component Lifecycle Events\n\n disconnectedCallback() {\n if (this.decoratorObserver) {\n this.decoratorObserver.disconnect();\n }\n }\n\n componentWillLoad() {\n this.checkDecorator();\n }\n\n componentDidLoad() {\n this.setupDecoratorObserver();\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('src')\n srcDidUpdate() {\n this.badSrc = false;\n }\n\n // #endregion\n // #region Local Methods\n\n get computedInitials() {\n const { initials, name } = this;\n if (!initials && !name) return;\n\n let result = '';\n if (initials) {\n result = initials.substr(0, 4);\n } else if (name) {\n const parts = name.split(' ');\n const firstCharacter = parts[0][0];\n const lastCharacter = parts.length > 1 ? parts[parts.length - 1][0] : undefined;\n result += firstCharacter;\n if (lastCharacter) result += lastCharacter;\n }\n\n result = result?.toUpperCase();\n\n return result;\n }\n\n checkDecorator() {\n const decoratorElements = Array.from(this.el.children).filter(\n child => child.getAttribute('slot') === 'decorator'\n );\n this.hasDecorator = decoratorElements.length > 0;\n }\n\n onError = () => {\n this.badSrc = true;\n };\n\n onLoad = () => {\n this.isLoaded = true;\n };\n\n private setupDecoratorObserver() {\n // Set up MutationObserver to watch for changes to the host element's children\n this.decoratorObserver = new MutationObserver(() => {\n this.checkDecorator();\n });\n\n // Observe changes to the host element's children (light DOM)\n this.decoratorObserver.observe(this.el, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['slot'],\n });\n }\n\n // #endregion\n // #region Render Methods\n\n render() {\n const { computedInitials } = this;\n const showImg = this.src && !this.badSrc;\n const isLoaded = this.isLoaded;\n const showInitials = (this.name || this.initials) && (!this.src || this.badSrc);\n const showFallback = !this.name && !this.initials && (!this.src || this.badSrc);\n\n return (\n <div class={`avatar-wrapper size-${this.size}`}>\n {this.hasDecorator && (\n <div class=\"decorator\">\n <slot name=\"decorator\" />\n </div>\n )}\n\n {showImg && (\n <img\n class={`${isLoaded ? 'avatar-img' : 'avatar-img-default'}`}\n test-id=\"userImage\"\n src={this.src}\n onError={this.onError}\n onLoad={this.onLoad}\n alt={this.name || ''}\n />\n )}\n {showInitials && (\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid meet\"\n test-id=\"userInitials\"\n class={`avatar-initials initials-size-${computedInitials.length}`}\n aria-label={this.name}\n aria-hidden={!this.name && 'true'}\n >\n <text\n x=\"50\"\n y=\"50\"\n dominant-baseline=\"central\"\n text-anchor=\"middle\"\n aria-hidden=\"true\"\n >\n {computedInitials}\n </text>\n </svg>\n )}\n {showFallback && (\n <div\n test-id=\"fallbackIcon\"\n class=\"fallback\"\n >\n <q2-icon type={this.icon}></q2-icon>\n </div>\n )}\n </div>\n );\n }\n\n // #endregion\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["q2AvatarCss","Q2Avatar","constructor","hostRef","this","badSrc","hasDecorator","isLoaded","icon","size","onError","onLoad","disconnectedCallback","decoratorObserver","disconnect","componentWillLoad","checkDecorator","componentDidLoad","setupDecoratorObserver","srcDidUpdate","computedInitials","initials","name","result","substr","parts","split","firstCharacter","lastCharacter","length","undefined","toUpperCase","decoratorElements","Array","from","el","children","filter","child","getAttribute","MutationObserver","observe","childList","subtree","attributes","attributeFilter","render","showImg","src","showInitials","showFallback","h","key","class","alt","viewBox","preserveAspectRatio","x","y","type"],"sources":["src/components/q2-avatar/q2-avatar.scss?tag=q2-avatar&encapsulation=shadow","src/components/q2-avatar/q2-avatar.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n.avatar-wrapper {\n position: relative;\n border: 1px solid transparent;\n padding: 1px;\n border-radius: 100%;\n\n .hover-ring {\n display: flex;\n }\n &:hover {\n border-color: var-list(\n --tct-avatar-background,\n --tct-avatar-bg,\n --t-gray-8,\n #9e9e9e\n );\n }\n\n .decorator {\n height: var(--app-scale-3x, 15px);\n width: var(--app-scale-3x, 15px);\n background-color: var-list(--tct-avatar-decorator-background-color, --t-base, #ffffff);\n border-radius: 100%;\n box-shadow: var-list(\n --app-shadow-1,\n #{unquote('0px 0px 2px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.14)')}\n );\n position: absolute;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n ::slotted(q2-icon) {\n color: var-list(--tct-avatar-decorator-color, #000000);\n }\n }\n\n &.size-small {\n height: var(--tct-avatar-small-size, 24px);\n width: var(--tct-avatar-small-size, 24px);\n .decorator {\n height: var(--app-scale-2x, 10px);\n width: var(--app-scale-2x, 10px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: var(--tct-avatar-decorator-small-icon-size, 8px);\n width: var(--tct-avatar-decorator-small-icon-size, 8px);\n aspect-ratio: 1/1;\n }\n }\n }\n &.size-medium {\n height: var-list(--tct-avatar-size, --tct-avatar-height, 44px);\n width: var-list(--tct-avatar-size, --tct-avatar-width, 44px);\n .decorator {\n height: var(--app-scale-3x, 15px);\n width: var(--app-scale-3x, 15px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: var(--app-scale-2x, 10px);\n width: var(--app-scale-2x, 10px);\n aspect-ratio: 1/1;\n }\n }\n }\n &.size-large {\n height: var(--tct-avatar-large-size, 64px);\n width: var(--tct-avatar-large-size, 64px);\n .decorator {\n height: var(--app-scale-4x, 20px);\n width: var(--app-scale-4x, 20px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: 14px;\n width: 14px;\n aspect-ratio: 1/1;\n }\n }\n }\n}\n\n.avatar-img,\n.avatar-img-default {\n display: var(--tct-avatar-display, block);\n object-fit: cover;\n border-radius: var-list(--tct-avatar-img-border-radius, --tct-avatar-img-br, --tct-avatar-border-radius, 50%);\n border: var(--tct-avatar-border, none);\n height: 100%;\n width: 100%;\n}\n\n.avatar-img-default {\n background: var-list(--tct-avatar-background, --tct-avatar-bg, #9e9e9e);\n}\n\n.avatar-initials {\n display: var(--tct-avatar-display, block);\n backdrop-filter: var(--tct-avatar-backdrop-filter);\n background: var-list(--tct-avatar-background, --tct-avatar-bg, --t-gray-8, #9e9e9e);\n border-radius: var(--tct-avatar-br, 50%);\n border: var(--tct-avatar-border, none);\n height: 100%;\n width: 100%;\n}\n\ntext {\n fill: var-list(--tct-avatar-text-color, --tct-avatar-color, #ffffff);\n font-weight: var(--tct-avatar-font-weight, 200);\n font-size: var(--tct-avatar-font-size, 40px);\n}\n\n.fallback {\n height: 100%;\n width: 100%;\n border-radius: var-list(\n --tct-avatar-img-border-radius,\n --tct-avatar-img-br,\n 50%\n );\n border: var(--tct-avatar-border, none);\n background: var-list(\n --tct-avatar-background,\n --tct-avatar-bg,\n --t-gray-8,\n #9e9e9e\n );\n display: flex;\n align-items: center;\n justify-content: center;\n\n q2-icon {\n --tct-icon-size: #{var-list(--tct-avatar-icon-size, 65%)};\n --tct-icon-stroke-primary: #{var-list(\n --tct-avatar-icon-stroke-primary,\n currentcolor\n )};\n --tct-icon-stroke-secondary: #{var-list(\n --tct-avatar-icon-stroke-secondary,\n currentcolor\n )};\n --tct-icon-fill: #{var-list(--tct-avatar-icon-fill)};\n color: var-list(--tct-avatar-icon-color, --tct-avatar-color, --t-base, #ffffff);\n width: var-list(--tct-avatar-icon-size, --tct-icon-size);\n height: var-list(--tct-avatar-icon-size, --tct-icon-size);\n }\n}\n","import { Component, ComponentInterface, Prop, Element, h, State, Watch } from '@stencil/core';\n\n/**\n * @name Avatar\n * @category Display\n * @summary Use for displaying photos, initials, or icons for people, businesses, or accounts.\n *\n * @slot decorator - An optional affordance indicator to display in the top-right corner\n */\n@Component({ tag: 'q2-avatar', shadow: true, styleUrl: 'q2-avatar.scss' })\nexport class Q2Avatar implements ComponentInterface {\n // #region Own Properties\n\n private decoratorObserver: MutationObserver;\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n el: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n badSrc: boolean = false;\n\n @State()\n hasDecorator: boolean = false;\n\n @State()\n isLoaded: boolean = false;\n\n // #endregion\n // #region Public Property API\n\n /** A [q2-icon](https://tecton.q2developer.com/design-system/q2-icon/) to display as the fallback. */\n @Prop()\n icon: string = 'person';\n\n /** A set of up to four initials to display as capitalized text. Takes priority over `name`. */\n @Prop({ reflect: true })\n initials: string;\n\n /**\n * The name associated with the avatar.\n * The initials of the first and last words provided will display as capital letters.\n *\n * @info\n * We recommend always providing a name when you want the avatar to be presented to screen readers.\n */\n @Prop({ reflect: true })\n name: string;\n\n /** Determines how large to make the avatar */\n @Prop({ reflect: true })\n size: 'small' | 'medium' | 'large' = 'medium';\n\n /** Displays the image provided by the user. */\n @Prop({ reflect: true })\n src: string;\n\n // #endregion\n // #region Component Lifecycle Events\n\n disconnectedCallback() {\n if (this.decoratorObserver) {\n this.decoratorObserver.disconnect();\n }\n }\n\n componentWillLoad() {\n this.checkDecorator();\n }\n\n componentDidLoad() {\n this.setupDecoratorObserver();\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('src')\n srcDidUpdate() {\n this.badSrc = false;\n }\n\n // #endregion\n // #region Local Methods\n\n get computedInitials() {\n const { initials, name } = this;\n if (!initials && !name) return;\n\n let result = '';\n if (initials) {\n result = initials.substr(0, 4);\n } else if (name) {\n const parts = name.split(' ');\n const firstCharacter = parts[0][0];\n const lastCharacter = parts.length > 1 ? parts[parts.length - 1][0] : undefined;\n result += firstCharacter;\n if (lastCharacter) result += lastCharacter;\n }\n\n result = result?.toUpperCase();\n\n return result;\n }\n\n checkDecorator() {\n const decoratorElements = Array.from(this.el.children).filter(\n child => child.getAttribute('slot') === 'decorator'\n );\n this.hasDecorator = decoratorElements.length > 0;\n }\n\n onError = () => {\n this.badSrc = true;\n };\n\n onLoad = () => {\n this.isLoaded = true;\n };\n\n private setupDecoratorObserver() {\n // Set up MutationObserver to watch for changes to the host element's children\n this.decoratorObserver = new MutationObserver(() => {\n this.checkDecorator();\n });\n\n // Observe changes to the host element's children (light DOM)\n this.decoratorObserver.observe(this.el, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['slot'],\n });\n }\n\n // #endregion\n // #region Render Methods\n\n render() {\n const { computedInitials } = this;\n const showImg = this.src && !this.badSrc;\n const isLoaded = this.isLoaded;\n const showInitials = (this.name || this.initials) && (!this.src || this.badSrc);\n const showFallback = !this.name && !this.initials && (!this.src || this.badSrc);\n\n return (\n <div class={`avatar-wrapper size-${this.size}`}>\n {this.hasDecorator && (\n <div class=\"decorator\">\n <slot name=\"decorator\" />\n </div>\n )}\n\n {showImg && (\n <img\n class={`${isLoaded ? 'avatar-img' : 'avatar-img-default'}`}\n test-id=\"userImage\"\n src={this.src}\n onError={this.onError}\n onLoad={this.onLoad}\n alt={this.name || ''}\n />\n )}\n {showInitials && (\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid meet\"\n test-id=\"userInitials\"\n class={`avatar-initials initials-size-${computedInitials.length}`}\n aria-label={this.name}\n aria-hidden={!this.name && 'true'}\n >\n <text\n x=\"50\"\n y=\"50\"\n dominant-baseline=\"central\"\n text-anchor=\"middle\"\n aria-hidden=\"true\"\n >\n {computedInitials}\n </text>\n </svg>\n )}\n {showFallback && (\n <div\n test-id=\"fallbackIcon\"\n class=\"fallback\"\n >\n <q2-icon type={this.icon}></q2-icon>\n </div>\n )}\n </div>\n );\n }\n\n // #endregion\n}\n"],"mappings":";;AAAA,MAAMA,IAAc;;MCUPC,IAAQ;EADrB,WAAAC,CAAAC;;;;QAgBIC,KAAMC,SAAY;IAGlBD,KAAYE,eAAY;IAGxBF,KAAQG,WAAY;;;6GAOpBH,KAAII,OAAW;uDAkBfJ,KAAIK,OAAiC;IA6DrCL,KAAOM,UAAG;MACNN,KAAKC,SAAS;AAAI;IAGtBD,KAAMO,SAAG;MACLP,KAAKG,WAAW;AAAI;AA+E3B;;;EAxIG,oBAAAK;IACI,IAAIR,KAAKS,mBAAmB;MACxBT,KAAKS,kBAAkBC;;;EAI/B,iBAAAC;IACIX,KAAKY;;EAGT,gBAAAC;IACIb,KAAKc;;;;EAOT,YAAAC;IACIf,KAAKC,SAAS;;;;EAMlB,oBAAIe;IACA,OAAMC,UAAEA,GAAQC,MAAEA,KAASlB;IAC3B,KAAKiB,MAAaC,GAAM;IAExB,IAAIC,IAAS;IACb,IAAIF,GAAU;MACVE,IAASF,EAASG,OAAO,GAAG;WACzB,IAAIF,GAAM;MACb,MAAMG,IAAQH,EAAKI,MAAM;MACzB,MAAMC,IAAiBF,EAAM,GAAG;MAChC,MAAMG,IAAgBH,EAAMI,SAAS,IAAIJ,EAAMA,EAAMI,SAAS,GAAG,KAAKC;MACtEP,KAAUI;MACV,IAAIC,GAAeL,KAAUK;;IAGjCL,IAASA,MAAA,QAAAA,WAAM,aAANA,EAAQQ;IAEjB,OAAOR;;EAGX,cAAAP;IACI,MAAMgB,IAAoBC,MAAMC,KAAK9B,KAAK+B,GAAGC,UAAUC,QACnDC,KAASA,EAAMC,aAAa,YAAY;IAE5CnC,KAAKE,eAAe0B,EAAkBH,SAAS;;EAW3C,sBAAAX;;IAEJd,KAAKS,oBAAoB,IAAI2B,kBAAiB;MAC1CpC,KAAKY;AAAgB;;QAIzBZ,KAAKS,kBAAkB4B,QAAQrC,KAAK+B,IAAI;MACpCO,WAAW;MACXC,SAAS;MACTC,YAAY;MACZC,iBAAiB,EAAC;;;;;EAO1B,MAAAC;IACI,OAAM1B,kBAAEA,KAAqBhB;IAC7B,MAAM2C,IAAU3C,KAAK4C,QAAQ5C,KAAKC;IAClC,MAAME,IAAWH,KAAKG;IACtB,MAAM0C,KAAgB7C,KAAKkB,QAAQlB,KAAKiB,eAAejB,KAAK4C,OAAO5C,KAAKC;IACxE,MAAM6C,KAAgB9C,KAAKkB,SAASlB,KAAKiB,cAAcjB,KAAK4C,OAAO5C,KAAKC;IAExE,OACI8C,EAAA;MAAAC,KAAA;MAAKC,OAAO,uBAAuBjD,KAAKK;OACnCL,KAAKE,gBACF6C,EAAK;MAAAC,KAAA;MAAAC,OAAM;OACPF,EAAA;MAAAC,KAAA;MAAM9B,MAAK;SAIlByB,KACGI,EACI;MAAAC,KAAA;MAAAC,OAAO,GAAG9C,IAAW,eAAe;MAAsB,WAClD;MACRyC,KAAK5C,KAAK4C;MACVtC,SAASN,KAAKM;MACdC,QAAQP,KAAKO;MACb2C,KAAKlD,KAAKkB,QAAQ;QAGzB2B,KACGE,EACI;MAAAC,KAAA;MAAAG,SAAQ;MACRC,qBAAoB;MACZ;MACRH,OAAO,iCAAiCjC,EAAiBS;MAAQ,cACrDzB,KAAKkB;MAAI,gBACPlB,KAAKkB,QAAQ;OAE3B6B,EAAA;MAAAC,KAAA;MACIK,GAAE;MACFC,GAAE;MAAI,qBACY;MAAS,eACf;MACA;OAEXtC,KAIZ8B,KACGC,EAAA;MAAAC,KAAA;MAAA,WACY;MACRC,OAAM;OAENF,EAAS;MAAAC,KAAA;MAAAO,MAAMvD,KAAKI","ignoreList":[]}
1
+ {"version":3,"names":["q2AvatarCss","Q2Avatar","constructor","hostRef","this","badSrc","hasDecorator","isLoaded","icon","size","onError","onLoad","disconnectedCallback","decoratorObserver","disconnect","componentWillLoad","checkDecorator","componentDidLoad","setupDecoratorObserver","srcDidUpdate","computedInitials","initials","name","result","substr","parts","split","firstCharacter","lastCharacter","length","undefined","toUpperCase","decoratorElements","Array","from","el","children","filter","child","getAttribute","MutationObserver","observe","childList","subtree","attributes","attributeFilter","render","showImg","src","showInitials","showFallback","h","key","class","alt","viewBox","preserveAspectRatio","x","y","type"],"sources":["src/components/q2-avatar/q2-avatar.scss?tag=q2-avatar&encapsulation=shadow","src/components/q2-avatar/q2-avatar.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n@import './variables';\n\n.avatar-wrapper {\n position: relative;\n border: 1px solid transparent;\n padding: 1px;\n border-radius: 100%;\n\n .hover-ring {\n display: flex;\n }\n &:hover {\n border-color: var-list(\n --tct-avatar-background,\n --tct-avatar-bg,\n --t-gray-8,\n #9e9e9e\n );\n }\n\n .decorator {\n height: var(--app-scale-3x, 15px);\n width: var(--app-scale-3x, 15px);\n background-color: var-list(--tct-avatar-decorator-background-color, --t-base, #ffffff);\n border-radius: 100%;\n box-shadow: var-list(\n --app-shadow-1,\n #{unquote('0px 0px 2px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.14)')}\n );\n position: absolute;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n ::slotted(q2-icon) {\n color: var-list(--tct-avatar-decorator-color, #000000);\n }\n }\n\n &.size-small {\n height: var(--tct-avatar-small-size, 24px);\n width: var(--tct-avatar-small-size, 24px);\n .decorator {\n height: var(--app-scale-2x, 10px);\n width: var(--app-scale-2x, 10px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: var(--tct-avatar-decorator-small-icon-size, 8px);\n width: var(--tct-avatar-decorator-small-icon-size, 8px);\n aspect-ratio: 1/1;\n }\n }\n }\n &.size-medium {\n height: var-list(--tct-avatar-size, --tct-avatar-height, 44px);\n width: var-list(--tct-avatar-size, --tct-avatar-width, 44px);\n .decorator {\n height: var(--app-scale-3x, 15px);\n width: var(--app-scale-3x, 15px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: var(--app-scale-2x, 10px);\n width: var(--app-scale-2x, 10px);\n aspect-ratio: 1/1;\n }\n }\n }\n &.size-large {\n height: var(--tct-avatar-large-size, 64px);\n width: var(--tct-avatar-large-size, 64px);\n .decorator {\n height: var(--app-scale-4x, 20px);\n width: var(--app-scale-4x, 20px);\n aspect-ratio: 1/1;\n ::slotted(q2-icon) {\n height: 14px;\n width: 14px;\n aspect-ratio: 1/1;\n }\n }\n }\n}\n\n.avatar-img,\n.avatar-img-default {\n display: var(--tct-avatar-display, block);\n object-fit: cover;\n border-radius: var-list(--tct-avatar-img-border-radius, --tct-avatar-img-br, --tct-avatar-border-radius, 50%);\n border: var(--tct-avatar-border, none);\n height: 100%;\n width: 100%;\n}\n\n.avatar-img-default {\n background: var-list(--tct-avatar-background, --tct-avatar-bg, #9e9e9e);\n}\n\n.avatar-initials {\n display: var(--tct-avatar-display, block);\n backdrop-filter: var(--tct-avatar-backdrop-filter);\n background: var-list(--tct-avatar-background, --tct-avatar-bg, --t-gray-8, #9e9e9e);\n border-radius: var(--tct-avatar-br, 50%);\n border: var(--tct-avatar-border, none);\n height: 100%;\n width: 100%;\n}\n\ntext {\n fill: var-list(--tct-avatar-text-color, --tct-avatar-color, #ffffff);\n font-weight: var(--tct-avatar-font-weight, 200);\n font-size: var(--tct-avatar-font-size, 40px);\n}\n\n.fallback {\n height: 100%;\n width: 100%;\n border-radius: var-list(\n --tct-avatar-img-border-radius,\n --tct-avatar-img-br,\n 50%\n );\n border: var(--tct-avatar-border, none);\n background: var-list(\n --tct-avatar-background,\n --tct-avatar-bg,\n --t-gray-8,\n #9e9e9e\n );\n display: flex;\n align-items: center;\n justify-content: center;\n\n q2-icon {\n --tct-icon-size: #{var-list(--tct-avatar-icon-size, 65%)};\n --tct-icon-stroke-primary: #{var-list(\n --tct-avatar-icon-stroke-primary,\n currentcolor\n )};\n --tct-icon-stroke-secondary: #{var-list(\n --tct-avatar-icon-stroke-secondary,\n currentcolor\n )};\n --tct-icon-fill: #{var-list(--tct-avatar-icon-fill)};\n color: var-list(--tct-avatar-icon-color, --tct-avatar-color, --t-base, #ffffff);\n width: var-list(--tct-avatar-icon-size, --tct-icon-size);\n height: var-list(--tct-avatar-icon-size, --tct-icon-size);\n }\n}\n","import { Component, ComponentInterface, Prop, Element, h, State, Watch } from '@stencil/core';\n\n/**\n * @name Avatar\n * @category Display\n * @summary Use for displaying photos, initials, or icons for people, businesses, or accounts.\n *\n * @slot decorator - An optional affordance indicator to display in the top-right corner\n */\n@Component({ tag: 'q2-avatar', shadow: true, styleUrl: 'q2-avatar.scss' })\nexport class Q2Avatar implements ComponentInterface {\n // #region Own Properties\n\n private decoratorObserver: MutationObserver;\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n el: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n badSrc: boolean = false;\n\n @State()\n hasDecorator: boolean = false;\n\n @State()\n isLoaded: boolean = false;\n\n // #endregion\n // #region Public Property API\n\n /** A [q2-icon](https://tecton.q2developer.com/design-system/q2-icon/) to display as the fallback. */\n @Prop()\n icon: string = 'person';\n\n /** A set of up to four initials to display as capitalized text. Takes priority over `name`. */\n @Prop({ reflect: true })\n initials: string;\n\n /**\n * The name associated with the avatar.\n * The initials of the first and last words provided will display as capital letters.\n *\n * @info\n * We recommend always providing a name when you want the avatar to be presented to screen readers.\n */\n @Prop({ reflect: true })\n name: string;\n\n /** Determines how large to make the avatar */\n @Prop({ reflect: true })\n size: 'small' | 'medium' | 'large' = 'medium';\n\n /** Displays the image provided by the user. */\n @Prop({ reflect: true })\n src: string;\n\n // #endregion\n // #region Component Lifecycle Events\n\n disconnectedCallback() {\n if (this.decoratorObserver) {\n this.decoratorObserver.disconnect();\n }\n }\n\n componentWillLoad() {\n this.checkDecorator();\n }\n\n componentDidLoad() {\n this.setupDecoratorObserver();\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('src')\n srcDidUpdate() {\n this.badSrc = false;\n }\n\n // #endregion\n // #region Local Methods\n\n get computedInitials() {\n const { initials, name } = this;\n if (!initials && !name) return;\n\n let result = '';\n if (initials) {\n result = initials.substr(0, 4);\n } else if (name) {\n const parts = name.split(' ');\n const firstCharacter = parts[0][0];\n const lastCharacter = parts.length > 1 ? parts[parts.length - 1][0] : undefined;\n result += firstCharacter;\n if (lastCharacter) result += lastCharacter;\n }\n\n result = result?.toUpperCase();\n\n return result;\n }\n\n checkDecorator() {\n const decoratorElements = Array.from(this.el.children).filter(\n child => child.getAttribute('slot') === 'decorator'\n );\n this.hasDecorator = decoratorElements.length > 0;\n }\n\n onError = () => {\n this.badSrc = true;\n };\n\n onLoad = () => {\n this.isLoaded = true;\n };\n\n private setupDecoratorObserver() {\n // Set up MutationObserver to watch for changes to the host element's children\n this.decoratorObserver = new MutationObserver(() => {\n this.checkDecorator();\n });\n\n // Observe changes to the host element's children (light DOM)\n this.decoratorObserver.observe(this.el, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['slot'],\n });\n }\n\n // #endregion\n // #region Render Methods\n\n render() {\n const { computedInitials } = this;\n const showImg = this.src && !this.badSrc;\n const isLoaded = this.isLoaded;\n const showInitials = (this.name || this.initials) && (!this.src || this.badSrc);\n const showFallback = !this.name && !this.initials && (!this.src || this.badSrc);\n\n return (\n <div class={`avatar-wrapper size-${this.size}`}>\n {this.hasDecorator && (\n <div class=\"decorator\">\n <slot name=\"decorator\" />\n </div>\n )}\n\n {showImg && (\n <img\n class={`${isLoaded ? 'avatar-img' : 'avatar-img-default'}`}\n test-id=\"userImage\"\n src={this.src}\n onError={this.onError}\n onLoad={this.onLoad}\n alt={this.name || ''}\n />\n )}\n {showInitials && (\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid meet\"\n test-id=\"userInitials\"\n class={`avatar-initials initials-size-${computedInitials.length}`}\n aria-label={this.name}\n aria-hidden={!this.name && 'true'}\n >\n <text\n x=\"50\"\n y=\"50\"\n dominant-baseline=\"central\"\n text-anchor=\"middle\"\n aria-hidden=\"true\"\n >\n {computedInitials}\n </text>\n </svg>\n )}\n {showFallback && (\n <div\n test-id=\"fallbackIcon\"\n class=\"fallback\"\n >\n <q2-icon type={this.icon}></q2-icon>\n </div>\n )}\n </div>\n );\n }\n\n // #endregion\n}\n"],"mappings":";;AAAA,MAAMA,IAAc;;MCUPC,IAAQ;EADrB,WAAAC,CAAAC;;;;QAgBIC,KAAMC,SAAY;IAGlBD,KAAYE,eAAY;IAGxBF,KAAQG,WAAY;;;6GAOpBH,KAAII,OAAW;uDAkBfJ,KAAIK,OAAiC;IA6DrCL,KAAOM,UAAG;MACNN,KAAKC,SAAS;AAAI;IAGtBD,KAAMO,SAAG;MACLP,KAAKG,WAAW;AAAI;AA+E3B;;;EAxIG,oBAAAK;IACI,IAAIR,KAAKS,mBAAmB;MACxBT,KAAKS,kBAAkBC;;;EAI/B,iBAAAC;IACIX,KAAKY;;EAGT,gBAAAC;IACIb,KAAKc;;;;EAOT,YAAAC;IACIf,KAAKC,SAAS;;;;EAMlB,oBAAIe;IACA,OAAMC,UAAEA,GAAQC,MAAEA,KAASlB;IAC3B,KAAKiB,MAAaC,GAAM;IAExB,IAAIC,IAAS;IACb,IAAIF,GAAU;MACVE,IAASF,EAASG,OAAO,GAAG;WACzB,IAAIF,GAAM;MACb,MAAMG,IAAQH,EAAKI,MAAM;MACzB,MAAMC,IAAiBF,EAAM,GAAG;MAChC,MAAMG,IAAgBH,EAAMI,SAAS,IAAIJ,EAAMA,EAAMI,SAAS,GAAG,KAAKC;MACtEP,KAAUI;MACV,IAAIC,GAAeL,KAAUK;;IAGjCL,IAASA,MAAA,QAAAA,WAAM,aAANA,EAAQQ;IAEjB,OAAOR;;EAGX,cAAAP;IACI,MAAMgB,IAAoBC,MAAMC,KAAK9B,KAAK+B,GAAGC,UAAUC,QACnDC,KAASA,EAAMC,aAAa,YAAY;IAE5CnC,KAAKE,eAAe0B,EAAkBH,SAAS;;EAW3C,sBAAAX;;IAEJd,KAAKS,oBAAoB,IAAI2B,kBAAiB;MAC1CpC,KAAKY;AAAgB;;QAIzBZ,KAAKS,kBAAkB4B,QAAQrC,KAAK+B,IAAI;MACpCO,WAAW;MACXC,SAAS;MACTC,YAAY;MACZC,iBAAiB,EAAC;;;;;EAO1B,MAAAC;IACI,OAAM1B,kBAAEA,KAAqBhB;IAC7B,MAAM2C,IAAU3C,KAAK4C,QAAQ5C,KAAKC;IAClC,MAAME,IAAWH,KAAKG;IACtB,MAAM0C,KAAgB7C,KAAKkB,QAAQlB,KAAKiB,eAAejB,KAAK4C,OAAO5C,KAAKC;IACxE,MAAM6C,KAAgB9C,KAAKkB,SAASlB,KAAKiB,cAAcjB,KAAK4C,OAAO5C,KAAKC;IAExE,OACI8C,EAAA;MAAAC,KAAA;MAAKC,OAAO,uBAAuBjD,KAAKK;OACnCL,KAAKE,gBACF6C,EAAK;MAAAC,KAAA;MAAAC,OAAM;OACPF,EAAA;MAAAC,KAAA;MAAM9B,MAAK;SAIlByB,KACGI,EACI;MAAAC,KAAA;MAAAC,OAAO,GAAG9C,IAAW,eAAe;MAAsB,WAClD;MACRyC,KAAK5C,KAAK4C;MACVtC,SAASN,KAAKM;MACdC,QAAQP,KAAKO;MACb2C,KAAKlD,KAAKkB,QAAQ;QAGzB2B,KACGE,EACI;MAAAC,KAAA;MAAAG,SAAQ;MACRC,qBAAoB;MACZ;MACRH,OAAO,iCAAiCjC,EAAiBS;MAAQ,cACrDzB,KAAKkB;MAAI,gBACPlB,KAAKkB,QAAQ;OAE3B6B,EAAA;MAAAC,KAAA;MACIK,GAAE;MACFC,GAAE;MAAI,qBACY;MAAS,eACf;MACA;OAEXtC,KAIZ8B,KACGC,EAAA;MAAAC,KAAA;MAAA,WACY;MACRC,OAAM;OAENF,EAAS;MAAAC,KAAA;MAAAO,MAAMvD,KAAKI","ignoreList":[]}