@heartlandone/vega 2.77.0 → 2.77.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/dist/cjs/{app-globals-04e7024b.js → app-globals-1021e33e.js} +6 -6
  2. package/dist/cjs/{aria-attributes-value-mapper-f58c73f8.js → aria-attributes-value-mapper-9a41b9cf.js} +10 -3
  3. package/dist/cjs/{code-block-f1480ec3.js → code-block-f9b86a25.js} +1 -1
  4. package/dist/cjs/{component-value-history-controller-slimmer.abstract-a9264cc8.js → component-value-history-controller-slimmer.abstract-6bcff70b.js} +3 -3
  5. package/dist/cjs/{date-required-rule-912469e0.js → date-required-rule-d3c2d088.js} +1 -1
  6. package/dist/cjs/{design-token-c49717c8.js → design-token-b21879b6.js} +2 -2
  7. package/dist/cjs/{dto-renderer-manager-809c947b.js → dto-renderer-manager-e2823eb8.js} +2 -2
  8. package/dist/cjs/{element-appender-slimmer-38583ca9.js → element-appender-slimmer-40d39bba.js} +178 -19
  9. package/dist/cjs/{form-field-controller-slimmer-102f37c7.js → form-field-controller-slimmer-1b3a1388.js} +1 -1
  10. package/dist/cjs/{image-annotation-action-8d9fa20c.js → image-annotation-action-b83283d4.js} +2 -2
  11. package/dist/cjs/index.cjs.js +12 -12
  12. package/dist/cjs/{inject-keyboard-manager-0f5bd568.js → inject-keyboard-manager-ea5c598e.js} +1 -1
  13. package/dist/cjs/{internal-translation-controller-053eb0f1.js → internal-translation-controller-1f84ab0a.js} +15 -0
  14. package/dist/cjs/{keyboard-manager-055e9f67.js → keyboard-manager-16494c34.js} +1 -1
  15. package/dist/cjs/{keyboard-manager-slimmer-0cc0c1c7.js → keyboard-manager-slimmer-5b8fa209.js} +1 -1
  16. package/dist/cjs/loader.cjs.js +8 -8
  17. package/dist/cjs/{month-view-generator-6a6dd527.js → month-view-generator-1a57578d.js} +1 -1
  18. package/dist/cjs/{public-rules-922849f3.js → public-rules-5bd1624d.js} +7 -7
  19. package/dist/cjs/{range-8aa49b08.js → range-7a038973.js} +1 -1
  20. package/dist/cjs/{responsive-format-facade-acc39a40.js → responsive-format-facade-0b65ce4a.js} +1 -1
  21. package/dist/cjs/{rich-text-editor-required-rule-22225840.js → rich-text-editor-required-rule-d984c0b6.js} +1 -1
  22. package/dist/cjs/{string-format-strategy.abstract-f2575647.js → string-format-strategy.abstract-714bfad2.js} +1 -1
  23. package/dist/cjs/{string-input-formatter-slimmer-0a334fc6.js → string-input-formatter-slimmer-9ef2ec7a.js} +1 -1
  24. package/dist/cjs/{string-mask-strategy-dda58395.js → string-mask-strategy-bd2c18df.js} +2 -2
  25. package/dist/cjs/{style-formatter-028af284.js → style-formatter-7a4e9811.js} +2 -2
  26. package/dist/cjs/{time-required-rule-d6fa7aa8.js → time-required-rule-50784b9f.js} +1 -1
  27. package/dist/cjs/{token-extension-ffcaeae0.js → token-extension-5a1c473e.js} +4 -4
  28. package/dist/cjs/{translation-slimmer-4533bd67.js → translation-slimmer-2c207e34.js} +1 -1
  29. package/dist/cjs/{type-guard-407ba0b8.js → type-guard-cd0376d4.js} +36 -1
  30. package/dist/cjs/{valid-credit-card-number-rule-41a8b51b.js → valid-credit-card-number-rule-3f8dc897.js} +1 -1
  31. package/dist/cjs/vega-accordion.cjs.entry.js +4 -4
  32. package/dist/cjs/vega-app-header-button.cjs.entry.js +24 -6
  33. package/dist/cjs/vega-box.cjs.entry.js +5 -5
  34. package/dist/cjs/vega-button-circle.cjs.entry.js +5 -5
  35. package/dist/cjs/vega-button-link.cjs.entry.js +16 -0
  36. package/dist/cjs/vega-button.cjs.entry.js +3 -3
  37. package/dist/cjs/vega-calendar_4.cjs.entry.js +5 -5
  38. package/dist/cjs/vega-card.cjs.entry.js +4 -4
  39. package/dist/cjs/vega-carousel.cjs.entry.js +3 -3
  40. package/dist/cjs/vega-checkbox_2.cjs.entry.js +2 -2
  41. package/dist/cjs/vega-chip.cjs.entry.js +4 -4
  42. package/dist/cjs/vega-code-block.cjs.entry.js +8 -8
  43. package/dist/cjs/vega-color-picker.cjs.entry.js +2 -2
  44. package/dist/cjs/vega-combo-box.cjs.entry.js +5 -5
  45. package/dist/cjs/vega-date-picker_2.cjs.entry.js +103 -22
  46. package/dist/cjs/vega-dialog_2.cjs.entry.js +4 -4
  47. package/dist/cjs/vega-divider.cjs.entry.js +4 -4
  48. package/dist/cjs/vega-dropdown_5.cjs.entry.js +31 -7
  49. package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
  50. package/dist/cjs/vega-file-uploader.cjs.entry.js +3 -3
  51. package/dist/cjs/vega-flag-icon.cjs.entry.js +4 -4
  52. package/dist/cjs/vega-flex.cjs.entry.js +5 -5
  53. package/dist/cjs/vega-font.cjs.entry.js +4 -4
  54. package/dist/cjs/vega-form.cjs.entry.js +3 -3
  55. package/dist/cjs/vega-grid.cjs.entry.js +4 -4
  56. package/dist/cjs/vega-icon.cjs.entry.js +4 -4
  57. package/dist/cjs/vega-image-uploader.cjs.entry.js +5 -5
  58. package/dist/cjs/vega-input-credit-card.cjs.entry.js +6 -6
  59. package/dist/cjs/vega-input-numeric.cjs.entry.js +5 -5
  60. package/dist/cjs/vega-input-passcode.cjs.entry.js +37 -7
  61. package/dist/cjs/vega-input-phone-number.cjs.entry.js +4 -4
  62. package/dist/cjs/vega-input-range.cjs.entry.js +3 -3
  63. package/dist/cjs/vega-input-select.cjs.entry.js +5 -5
  64. package/dist/cjs/vega-input.cjs.entry.js +220 -125
  65. package/dist/cjs/vega-left-nav_5.cjs.entry.js +6 -7
  66. package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +3 -3
  67. package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +2 -2
  68. package/dist/cjs/vega-pagination.cjs.entry.js +4 -4
  69. package/dist/cjs/vega-popover_2.cjs.entry.js +8 -8
  70. package/dist/cjs/vega-progress-tracker_2.cjs.entry.js +3 -3
  71. package/dist/cjs/vega-radio_2.cjs.entry.js +5 -5
  72. package/dist/cjs/vega-rich-text-content.cjs.entry.js +12 -6
  73. package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +127 -29
  74. package/dist/cjs/vega-selection-chip_2.cjs.entry.js +4 -4
  75. package/dist/cjs/vega-selection-tile_2.cjs.entry.js +2 -2
  76. package/dist/cjs/vega-sidenav_3.cjs.entry.js +3 -3
  77. package/dist/cjs/vega-signature-capture.cjs.entry.js +6 -6
  78. package/dist/cjs/vega-stepper.cjs.entry.js +2 -2
  79. package/dist/cjs/vega-table_11.cjs.entry.js +4 -4
  80. package/dist/cjs/vega-textarea.cjs.entry.js +2 -2
  81. package/dist/cjs/vega-time-picker_2.cjs.entry.js +9 -9
  82. package/dist/cjs/vega-toggle-switch.cjs.entry.js +2 -2
  83. package/dist/cjs/vega-tooltip_2.cjs.entry.js +7 -7
  84. package/dist/cjs/vega.cjs.js +8 -8
  85. package/dist/collection/components/vega-app-header-button/vega-app-header-button.js +44 -2
  86. package/dist/collection/components/vega-button-link/vega-button-link.js +16 -1
  87. package/dist/collection/components/vega-calendar/slimmers/common/renderers/vega-calendar-event-preview-popover-renderer.js +1 -1
  88. package/dist/collection/components/vega-date-picker/slimmers/controllers/vega-date-picker-calendar-open-state-controller.js +64 -0
  89. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/controllers/vega-date-picker-calendar-selection-controller.js +3 -0
  90. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-header-render.js +3 -3
  91. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-renderer.js +19 -1
  92. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-year-month-switcher-renderer.js +3 -2
  93. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-month-item-renderer.js +3 -2
  94. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/vega-date-picker-calendar.css +12 -0
  95. package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-appender-controller.js +25 -0
  96. package/dist/collection/components/vega-input/slimmers/controllers/vega-input-render-mode-controller.js +1 -3
  97. package/dist/collection/components/vega-input/slimmers/renderers/vega-input-input-container-renderer.js +1 -5
  98. package/dist/collection/components/vega-input/slimmers/renderers/vega-input-input-renderer.js +1 -4
  99. package/dist/collection/components/vega-input/slimmers/renderers/vega-input-input-suggestions-renderer.js +5 -2
  100. package/dist/collection/components/vega-input/vega-input.js +24 -1
  101. package/dist/collection/components/vega-input-passcode/slimmers/controllers/vega-input-passcode-keyboard-controller.js +2 -0
  102. package/dist/collection/components/vega-input-passcode/slimmers/renderers/vega-input-passcode-renderer.js +30 -2
  103. package/dist/collection/components/vega-nav/vega-left-nav-link/slimmers/renderers/vega-left-nav-link-renderer.js +2 -3
  104. package/dist/collection/components/vega-popover/vega-popover-content-box/vega-popover-content-box.css +5 -0
  105. package/dist/collection/components/vega-rich-text-editor/dto/renderers/nodes/image-node-renderer.js +7 -1
  106. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/insert-image-controller.js +7 -4
  107. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/tools/image-toolbar-button-slimmer.js +113 -12
  108. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-image-editor/slimmers/renderers/vega-rich-text-image-editor-renderer.js +1 -1
  109. package/dist/collection/components/vega-tooltip/vega-tooltip-content-box/vega-tooltip-content-box.css +5 -0
  110. package/dist/collection/helpers/calendar/test/utils.test.js +54 -1
  111. package/dist/collection/helpers/calendar/utils.js +35 -0
  112. package/dist/collection/helpers/slimmers/element-appender/element-appender-slimmer.js +27 -0
  113. package/dist/collection/helpers/slimmers/element-appender/test/element-appender-slimmer.test.js +50 -0
  114. package/dist/collection/helpers/slimmers/mutation-observer/aria-attributes-value-mapper.js +10 -3
  115. package/dist/collection/helpers/slimmers/mutation-observer/data-tab-index-value-mapper.js +80 -0
  116. package/dist/collection/helpers/slimmers/mutation-observer/test/aria-attributes-value-mapper.test.js +55 -3
  117. package/dist/collection/helpers/slimmers/mutation-observer/test/data-tab-index-value-mapper.test.js +120 -0
  118. package/dist/collection/helpers/slimmers/position-calculation/base-position-calculation-strategy.js +123 -9
  119. package/dist/collection/helpers/slimmers/position-calculation/position-calculation-controller.js +14 -4
  120. package/dist/collection/helpers/slimmers/position-calculation/screen-position-calculation-strategy.js +13 -4
  121. package/dist/collection/helpers/slimmers/position-calculation/test/body-position-calculation-strategy.test.js +7 -6
  122. package/dist/collection/helpers/slimmers/position-calculation/test/screen-position-calculation-strategy.test.js +162 -7
  123. package/dist/collection/helpers/translation/locales/en.js +15 -0
  124. package/dist/collection/helpers/translation/tests/internal-translation-controller.test.js +15 -0
  125. package/dist/collection/helpers/ui/test/element-appender.test.js +7 -5
  126. package/dist/collection/utils/e2e-utils.js +6 -0
  127. package/dist/esm/{app-globals-32055795.js → app-globals-0b3b7111.js} +6 -6
  128. package/dist/esm/{aria-attributes-value-mapper-d4fef46a.js → aria-attributes-value-mapper-2c632641.js} +10 -3
  129. package/dist/esm/{code-block-b6247a45.js → code-block-2408a812.js} +1 -1
  130. package/dist/esm/{component-value-history-controller-slimmer.abstract-2bb8533d.js → component-value-history-controller-slimmer.abstract-ac40820f.js} +3 -3
  131. package/dist/esm/{date-required-rule-e771e7d9.js → date-required-rule-09d5aa16.js} +1 -1
  132. package/dist/esm/{design-token-5bc034e1.js → design-token-7dec1eab.js} +2 -2
  133. package/dist/esm/{dto-renderer-manager-6fd22ab7.js → dto-renderer-manager-d413de1e.js} +2 -2
  134. package/dist/esm/{element-appender-slimmer-9ea377d0.js → element-appender-slimmer-5d573612.js} +178 -19
  135. package/dist/esm/{form-field-controller-slimmer-5817d14d.js → form-field-controller-slimmer-e1a5a884.js} +1 -1
  136. package/dist/esm/{image-annotation-action-6701b4c9.js → image-annotation-action-54936eaa.js} +2 -2
  137. package/dist/esm/index.js +12 -12
  138. package/dist/esm/{inject-keyboard-manager-78730062.js → inject-keyboard-manager-9339bba8.js} +1 -1
  139. package/dist/esm/{internal-translation-controller-911515f9.js → internal-translation-controller-113a6288.js} +15 -0
  140. package/dist/esm/{keyboard-manager-38934f94.js → keyboard-manager-f9bfa678.js} +1 -1
  141. package/dist/esm/{keyboard-manager-slimmer-9984d922.js → keyboard-manager-slimmer-c8898843.js} +1 -1
  142. package/dist/esm/loader.js +8 -8
  143. package/dist/esm/{month-view-generator-eaf9029c.js → month-view-generator-160a9feb.js} +1 -1
  144. package/dist/esm/{public-rules-25cc3a39.js → public-rules-41561e6e.js} +7 -7
  145. package/dist/esm/{range-663f44dc.js → range-a5d78e69.js} +1 -1
  146. package/dist/esm/{responsive-format-facade-aa705823.js → responsive-format-facade-2a36c54a.js} +1 -1
  147. package/dist/esm/{rich-text-editor-required-rule-a238b862.js → rich-text-editor-required-rule-b09039da.js} +1 -1
  148. package/dist/esm/{string-format-strategy.abstract-713fba36.js → string-format-strategy.abstract-944f759b.js} +1 -1
  149. package/dist/esm/{string-input-formatter-slimmer-5b413ff9.js → string-input-formatter-slimmer-2508d88b.js} +1 -1
  150. package/dist/esm/{string-mask-strategy-6beaf664.js → string-mask-strategy-f9e252a2.js} +2 -2
  151. package/dist/esm/{style-formatter-28138f5c.js → style-formatter-6db1e890.js} +2 -2
  152. package/dist/esm/{time-required-rule-e4138a76.js → time-required-rule-c7cfb257.js} +1 -1
  153. package/dist/esm/{token-extension-73e4460a.js → token-extension-25df8dbb.js} +4 -4
  154. package/dist/esm/{translation-slimmer-2394b173.js → translation-slimmer-9f0339aa.js} +1 -1
  155. package/dist/esm/{type-guard-f50e34d6.js → type-guard-af324dcd.js} +36 -2
  156. package/dist/esm/{valid-credit-card-number-rule-22ce81db.js → valid-credit-card-number-rule-099dba7d.js} +1 -1
  157. package/dist/esm/vega-accordion.entry.js +4 -4
  158. package/dist/esm/vega-app-header-button.entry.js +24 -6
  159. package/dist/esm/vega-box.entry.js +5 -5
  160. package/dist/esm/vega-button-circle.entry.js +5 -5
  161. package/dist/esm/vega-button-link.entry.js +16 -0
  162. package/dist/esm/vega-button.entry.js +3 -3
  163. package/dist/esm/vega-calendar_4.entry.js +5 -5
  164. package/dist/esm/vega-card.entry.js +4 -4
  165. package/dist/esm/vega-carousel.entry.js +3 -3
  166. package/dist/esm/vega-checkbox_2.entry.js +2 -2
  167. package/dist/esm/vega-chip.entry.js +4 -4
  168. package/dist/esm/vega-code-block.entry.js +8 -8
  169. package/dist/esm/vega-color-picker.entry.js +2 -2
  170. package/dist/esm/vega-combo-box.entry.js +5 -5
  171. package/dist/esm/vega-date-picker_2.entry.js +104 -23
  172. package/dist/esm/vega-dialog_2.entry.js +4 -4
  173. package/dist/esm/vega-divider.entry.js +4 -4
  174. package/dist/esm/vega-dropdown_5.entry.js +32 -8
  175. package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
  176. package/dist/esm/vega-file-uploader.entry.js +3 -3
  177. package/dist/esm/vega-flag-icon.entry.js +4 -4
  178. package/dist/esm/vega-flex.entry.js +5 -5
  179. package/dist/esm/vega-font.entry.js +4 -4
  180. package/dist/esm/vega-form.entry.js +3 -3
  181. package/dist/esm/vega-grid.entry.js +4 -4
  182. package/dist/esm/vega-icon.entry.js +4 -4
  183. package/dist/esm/vega-image-uploader.entry.js +5 -5
  184. package/dist/esm/vega-input-credit-card.entry.js +6 -6
  185. package/dist/esm/vega-input-numeric.entry.js +5 -5
  186. package/dist/esm/vega-input-passcode.entry.js +37 -7
  187. package/dist/esm/vega-input-phone-number.entry.js +4 -4
  188. package/dist/esm/vega-input-range.entry.js +3 -3
  189. package/dist/esm/vega-input-select.entry.js +5 -5
  190. package/dist/esm/vega-input.entry.js +220 -125
  191. package/dist/esm/vega-left-nav_5.entry.js +6 -7
  192. package/dist/esm/vega-loader-wrapper_2.entry.js +3 -3
  193. package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +2 -2
  194. package/dist/esm/vega-pagination.entry.js +4 -4
  195. package/dist/esm/vega-popover_2.entry.js +8 -8
  196. package/dist/esm/vega-progress-tracker_2.entry.js +3 -3
  197. package/dist/esm/vega-radio_2.entry.js +5 -5
  198. package/dist/esm/vega-rich-text-content.entry.js +12 -6
  199. package/dist/esm/vega-rich-text-editor_4.entry.js +128 -30
  200. package/dist/esm/vega-selection-chip_2.entry.js +4 -4
  201. package/dist/esm/vega-selection-tile_2.entry.js +2 -2
  202. package/dist/esm/vega-sidenav_3.entry.js +3 -3
  203. package/dist/esm/vega-signature-capture.entry.js +6 -6
  204. package/dist/esm/vega-stepper.entry.js +2 -2
  205. package/dist/esm/vega-table_11.entry.js +4 -4
  206. package/dist/esm/vega-textarea.entry.js +2 -2
  207. package/dist/esm/vega-time-picker_2.entry.js +9 -9
  208. package/dist/esm/vega-toggle-switch.entry.js +2 -2
  209. package/dist/esm/vega-tooltip_2.entry.js +7 -7
  210. package/dist/esm/vega.js +8 -8
  211. package/dist/sri/vega-sri-manifest.json +281 -281
  212. package/dist/types/components/vega-app-header-button/types.d.ts +18 -0
  213. package/dist/types/components/vega-app-header-button/vega-app-header-button.d.ts +8 -1
  214. package/dist/types/components/vega-button-link/vega-button-link.d.ts +2 -0
  215. package/dist/types/components/vega-date-picker/slimmers/controllers/vega-date-picker-calendar-open-state-controller.d.ts +21 -0
  216. package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/controllers/vega-date-picker-calendar-selection-controller.d.ts +1 -0
  217. package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-renderer.d.ts +7 -0
  218. package/dist/types/components/vega-dropdown/slimmers/controllers/vega-dropdown-appender-controller.d.ts +11 -0
  219. package/dist/types/components/vega-input/slimmers/controllers/vega-input-render-mode-controller.d.ts +0 -1
  220. package/dist/types/components/vega-input/slimmers/renderers/vega-input-input-renderer.d.ts +0 -1
  221. package/dist/types/components/vega-input/vega-input.d.ts +4 -0
  222. package/dist/types/components/vega-input-passcode/slimmers/renderers/vega-input-passcode-renderer.d.ts +14 -0
  223. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/insert-image-controller.d.ts +7 -1
  224. package/dist/types/components/vega-rich-text-editor/slimmers/renderers/tools/image-toolbar-button-slimmer.d.ts +30 -2
  225. package/dist/types/components.d.ts +11 -1
  226. package/dist/types/helpers/calendar/utils.d.ts +17 -0
  227. package/dist/types/helpers/slimmers/element-appender/element-appender-slimmer.d.ts +12 -0
  228. package/dist/types/helpers/slimmers/mutation-observer/aria-attributes-value-mapper.d.ts +2 -1
  229. package/dist/types/helpers/slimmers/mutation-observer/data-tab-index-value-mapper.d.ts +35 -0
  230. package/dist/types/helpers/slimmers/mutation-observer/test/data-tab-index-value-mapper.test.d.ts +1 -0
  231. package/dist/types/helpers/slimmers/position-calculation/base-position-calculation-strategy.d.ts +60 -3
  232. package/dist/types/helpers/slimmers/position-calculation/screen-position-calculation-strategy.d.ts +3 -2
  233. package/dist/types/helpers/slimmers/position-calculation/test/body-position-calculation-strategy.test.d.ts +1 -1
  234. package/dist/types/helpers/translation/interface.d.ts +15 -0
  235. package/dist/types/types/components.type.d.ts +1 -0
  236. package/dist/types/types/ui.type.d.ts +3 -2
  237. package/dist/types/utils/e2e-utils.d.ts +2 -0
  238. package/dist/vega/index.esm.js +1 -1
  239. package/dist/vega/{p-4bffdb28.js → p-051bbce6.js} +1 -1
  240. package/dist/vega/{p-1a3236e7.entry.js → p-0ac9a732.entry.js} +1 -1
  241. package/dist/vega/{p-9fb877c1.entry.js → p-1033e4c4.entry.js} +1 -1
  242. package/dist/vega/{p-0e679d8c.js → p-10e51081.js} +1 -1
  243. package/dist/vega/p-15335b69.entry.js +1 -0
  244. package/dist/vega/{p-592296d7.entry.js → p-19270396.entry.js} +1 -1
  245. package/dist/vega/{p-2d69632d.js → p-1a9b361b.js} +1 -1
  246. package/dist/vega/p-1ccba615.entry.js +1 -0
  247. package/dist/vega/{p-b54dc37c.entry.js → p-22f3d35c.entry.js} +1 -1
  248. package/dist/vega/{p-010ff53d.entry.js → p-23427f6a.entry.js} +1 -1
  249. package/dist/vega/p-2466316a.js +1 -0
  250. package/dist/vega/{p-b1773281.entry.js → p-27b0af38.entry.js} +1 -1
  251. package/dist/vega/{p-03004a05.entry.js → p-2c2193f2.entry.js} +1 -1
  252. package/dist/vega/{p-22056609.entry.js → p-3237be8b.entry.js} +1 -1
  253. package/dist/vega/{p-bff57aa4.js → p-38e850c3.js} +1 -1
  254. package/dist/vega/{p-ffd48e37.entry.js → p-3b9fc697.entry.js} +1 -1
  255. package/dist/vega/{p-1fa0c7da.entry.js → p-41d14339.entry.js} +1 -1
  256. package/dist/vega/{p-a0b66c25.js → p-4c060ba9.js} +1 -1
  257. package/dist/vega/{p-0d4cb1c7.entry.js → p-4d4bf82a.entry.js} +1 -1
  258. package/dist/vega/{p-415ffa35.js → p-4d7d5583.js} +1 -1
  259. package/dist/vega/{p-2a10e2e5.js → p-4f146dae.js} +1 -1
  260. package/dist/vega/p-5f377954.js +1 -1
  261. package/dist/vega/{p-d78f6ede.js → p-600f7d6c.js} +1 -1
  262. package/dist/vega/{p-4ea30592.js → p-6188e783.js} +1 -1
  263. package/dist/vega/p-638d30a5.entry.js +1 -0
  264. package/dist/vega/{p-100b44c3.entry.js → p-67b0ccdc.entry.js} +1 -1
  265. package/dist/vega/p-68846f0d.js +1 -0
  266. package/dist/vega/{p-c165232c.entry.js → p-70444f6f.entry.js} +1 -1
  267. package/dist/vega/{p-e632475e.js → p-7127f966.js} +1 -1
  268. package/dist/vega/{p-49845a91.js → p-718c74ba.js} +1 -1
  269. package/dist/vega/p-77167587.entry.js +1 -0
  270. package/dist/vega/p-78ecfea0.entry.js +1 -0
  271. package/dist/vega/{p-b201f379.js → p-7cde8489.js} +1 -1
  272. package/dist/vega/p-9466619f.entry.js +1 -0
  273. package/dist/vega/p-9863e7a1.entry.js +1 -0
  274. package/dist/vega/p-999950d1.js +1 -0
  275. package/dist/vega/{p-9339c6c4.js → p-9a3a5b9e.js} +1 -1
  276. package/dist/vega/{p-1a011d47.entry.js → p-9adfcd47.entry.js} +1 -1
  277. package/dist/vega/{p-4aa94940.entry.js → p-9e36f7ff.entry.js} +1 -1
  278. package/dist/vega/{p-168bb296.entry.js → p-9f9d9a53.entry.js} +1 -1
  279. package/dist/vega/{p-cfecc1cb.entry.js → p-9feaac4b.entry.js} +1 -1
  280. package/dist/vega/{p-4742feef.entry.js → p-a0e69236.entry.js} +1 -1
  281. package/dist/vega/{p-95528b47.js → p-a17312a6.js} +1 -1
  282. package/dist/vega/{p-f3e6483c.js → p-a79fdf2f.js} +1 -1
  283. package/dist/vega/{p-c2d2faa0.js → p-a800bf6d.js} +1 -1
  284. package/dist/vega/{p-2b142818.entry.js → p-aaf9b39f.entry.js} +1 -1
  285. package/dist/vega/p-acbb96b3.entry.js +1 -0
  286. package/dist/vega/{p-cccd7648.entry.js → p-af2110fc.entry.js} +1 -1
  287. package/dist/vega/{p-560d2f48.entry.js → p-b35bb4a2.entry.js} +1 -1
  288. package/dist/vega/p-b8c10187.js +1 -0
  289. package/dist/vega/p-bdb5180c.js +1 -0
  290. package/dist/vega/{p-50d074ed.entry.js → p-c086529c.entry.js} +1 -1
  291. package/dist/vega/{p-3c05abd9.entry.js → p-c61bcd92.entry.js} +1 -1
  292. package/dist/vega/{p-5833f33b.entry.js → p-c7a9960f.entry.js} +1 -1
  293. package/dist/vega/{p-81b044b9.js → p-c7b9b7c2.js} +1 -1
  294. package/dist/vega/{p-f2b0b58a.js → p-c857e6e2.js} +1 -1
  295. package/dist/vega/{p-857069a5.entry.js → p-c871619c.entry.js} +1 -1
  296. package/dist/vega/{p-1f3cd061.entry.js → p-cbeb47be.entry.js} +1 -1
  297. package/dist/vega/{p-a786259a.js → p-cf6bfac7.js} +1 -1
  298. package/dist/vega/{p-5485c387.entry.js → p-d0975995.entry.js} +1 -1
  299. package/dist/vega/{p-c292ade4.entry.js → p-d2fc470e.entry.js} +1 -1
  300. package/dist/vega/{p-f428086c.entry.js → p-d70e1b75.entry.js} +1 -1
  301. package/dist/vega/{p-3afc025e.entry.js → p-da0fd3dc.entry.js} +1 -1
  302. package/dist/vega/{p-70df91fb.entry.js → p-da552ddf.entry.js} +1 -1
  303. package/dist/vega/{p-4aa52ed2.entry.js → p-ddce3e0e.entry.js} +1 -1
  304. package/dist/vega/{p-aa1174dc.js → p-dfb12762.js} +1 -1
  305. package/dist/vega/{p-daa60a59.entry.js → p-e0fb1f60.entry.js} +1 -1
  306. package/dist/vega/{p-db5fa164.entry.js → p-e1c017d1.entry.js} +1 -1
  307. package/dist/vega/{p-3ce2b05c.entry.js → p-e4c99b72.entry.js} +1 -1
  308. package/dist/vega/{p-d1cfe972.entry.js → p-e841c1fe.entry.js} +1 -1
  309. package/dist/vega/{p-0572c393.entry.js → p-ea96b0f9.entry.js} +1 -1
  310. package/dist/vega/{p-7425cedc.entry.js → p-eab9d999.entry.js} +1 -1
  311. package/dist/vega/{p-e6cf2ace.entry.js → p-ed9ad4fd.entry.js} +1 -1
  312. package/dist/vega/{p-34bcf4ed.entry.js → p-ef603656.entry.js} +1 -1
  313. package/dist/vega/p-f5fcd13e.entry.js +1 -0
  314. package/dist/vega/{p-6d219c44.entry.js → p-f65cb0b6.entry.js} +1 -1
  315. package/dist/vega/p-faa9a3bd.js +1 -0
  316. package/dist/vega/{p-a8792e3d.js → p-fc049028.js} +1 -1
  317. package/dist/vega/p-ff287001.entry.js +1 -0
  318. package/dist/vega/{p-67745549.entry.js → p-ffb3e479.entry.js} +1 -1
  319. package/dist/vega/p-ffd080db.js +1 -0
  320. package/dist/vega/vega.esm.js +1 -1
  321. package/package.json +1 -1
  322. package/dist/vega/p-43ff48c0.entry.js +0 -1
  323. package/dist/vega/p-464559e3.js +0 -1
  324. package/dist/vega/p-4bee4202.entry.js +0 -1
  325. package/dist/vega/p-5cfce62d.entry.js +0 -1
  326. package/dist/vega/p-60f77f5f.entry.js +0 -1
  327. package/dist/vega/p-641cdb5c.entry.js +0 -1
  328. package/dist/vega/p-6b6f0fb4.js +0 -1
  329. package/dist/vega/p-9441f2ba.entry.js +0 -1
  330. package/dist/vega/p-ac82b9f9.entry.js +0 -1
  331. package/dist/vega/p-b597393b.entry.js +0 -1
  332. package/dist/vega/p-b5f18f4b.entry.js +0 -1
  333. package/dist/vega/p-c3d2f316.js +0 -1
  334. package/dist/vega/p-cc5eaa1b.js +0 -1
  335. package/dist/vega/p-dad3ba5f.js +0 -1
  336. package/dist/vega/p-de64f6e6.js +0 -1
  337. package/dist/vega/p-e7fbef97.js +0 -1
  338. package/dist/vega/p-fc9ac6e9.entry.js +0 -1
@@ -1135,6 +1135,18 @@
1135
1135
  place-items: center;
1136
1136
  }
1137
1137
 
1138
+ .calendar .aria-announcement {
1139
+ position: absolute;
1140
+ width: 1px;
1141
+ height: 1px;
1142
+ padding: 0;
1143
+ margin: -1px;
1144
+ overflow: hidden;
1145
+ clip: rect(0, 0, 0, 0);
1146
+ white-space: nowrap;
1147
+ border: 0;
1148
+ }
1149
+
1138
1150
  .calendar .container__days {
1139
1151
  text-align: center;
1140
1152
  place-items: center;
@@ -6,6 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { MapToComponentField, MapToComponentMethod, methodPlaceholder } from 'vega-slimmer/core';
8
8
  import { ElementAppenderSlimmer } from '../../../../helpers/slimmers/element-appender/element-appender-slimmer';
9
+ import { getDeepActiveElementInShadow } from '../../../../utils/ui';
9
10
  /**
10
11
  * The `VegaDropdownAppenderController` class is responsible for managing the visibility and
11
12
  * behavior of a dropdown component.
@@ -17,6 +18,7 @@ export class VegaDropdownAppenderController extends ElementAppenderSlimmer {
17
18
  */
18
19
  constructor() {
19
20
  super(() => this.generateShowConfigFactory(), () => this.trigger);
21
+ this.lastFocusedElement = null;
20
22
  }
21
23
  /**
22
24
  * Component lifecycle - [componentDidLoad]{@link VegaPopover.connectedCallback}
@@ -37,10 +39,12 @@ export class VegaDropdownAppenderController extends ElementAppenderSlimmer {
37
39
  async watchIsDropdownShow() {
38
40
  if (this.isDropdownShow) {
39
41
  this.showEventEmitter.emit();
42
+ this.updateLastFocusedElement();
40
43
  }
41
44
  else {
42
45
  this.searchRenderer.clear();
43
46
  this.hideEventEmitter.emit();
47
+ this.focusTriggerForAria();
44
48
  }
45
49
  }
46
50
  /**
@@ -60,6 +64,27 @@ export class VegaDropdownAppenderController extends ElementAppenderSlimmer {
60
64
  this.hide();
61
65
  }
62
66
  }
67
+ /**
68
+ * Restores focus to the dropdown trigger element.
69
+ * Should be called after programmatic hide actions (item selection, Escape, reset)
70
+ * to maintain proper screen reader context per WAI-ARIA menu button pattern.
71
+ */
72
+ focusTriggerForAria() {
73
+ const activeEl = getDeepActiveElementInShadow();
74
+ if ((activeEl === null || activeEl === void 0 ? void 0 : activeEl.matches) && activeEl.matches(':focus-visible')) {
75
+ const triggerEl = this.lastFocusedElement;
76
+ if (triggerEl && typeof triggerEl.focus === 'function') {
77
+ triggerEl.focus();
78
+ this.lastFocusedElement = null;
79
+ }
80
+ }
81
+ }
82
+ /**
83
+ * Updates the last focused element by getting the currently active element in the shadow DOM.
84
+ */
85
+ updateLastFocusedElement() {
86
+ this.lastFocusedElement = getDeepActiveElementInShadow();
87
+ }
63
88
  /**
64
89
  * Generate the show configuration for the dropdown.
65
90
  *
@@ -10,7 +10,6 @@ export class VegaInputRenderModeController extends VegaSlimmer {
10
10
  constructor() {
11
11
  super(...arguments);
12
12
  this.hasItemsSlot = false;
13
- this.hasDropdownSource = false;
14
13
  }
15
14
  /** Sets the render mode based on the presence of the items slot. */
16
15
  connectedCallback() {
@@ -22,7 +21,7 @@ export class VegaInputRenderModeController extends VegaSlimmer {
22
21
  * @returns {boolean} True if in source render mode, false otherwise.
23
22
  */
24
23
  isSource() {
25
- return this.hasDropdownSource;
24
+ return Array.isArray(this.suggestionsDropdownSource);
26
25
  }
27
26
  /**
28
27
  * Checks if the render mode is template mode.
@@ -37,7 +36,6 @@ export class VegaInputRenderModeController extends VegaSlimmer {
37
36
  */
38
37
  setRenderMode() {
39
38
  this.hasItemsSlot = !!this.host.querySelector('[slot=items]');
40
- this.hasDropdownSource = Array.isArray(this.suggestionsDropdownSource);
41
39
  }
42
40
  }
43
41
  __decorate([
@@ -49,11 +49,7 @@ export class VegaInputInputContainerRenderer extends VegaSlimmer {
49
49
  [`vega-input-size-${this.size}`]: true,
50
50
  'vega-input-disabled': this.disabled,
51
51
  'compact-input-width': this.isCompactInputWidth,
52
- }, onClick: this.onContainerClick, "aria-disabled": `${this.disabled}`,
53
- // tabIndex={-1} allows programmatic focus (e.g. after clearing input) without adding the container to the tab order.
54
- // The linter flags this because it's a non-interactive element, but programmatic focus is intentional here.
55
- /* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex */
56
- tabIndex: !this.disabled ? -1 : null, onKeyDown: createEnterKeyHandlerToTriggerClick() },
52
+ }, onClick: this.onContainerClick, "aria-disabled": `${this.disabled}`, onKeyDown: createEnterKeyHandlerToTriggerClick() },
57
53
  this.prefixSlotRenderer.render(),
58
54
  this.renderPrefixText(),
59
55
  this.inputRenderer.render(),
@@ -72,7 +72,7 @@ export class VegaInputInputRenderer extends VegaSlimmer {
72
72
  }
73
73
  render() {
74
74
  return (h("div", { class: "vega-input-input" },
75
- h("input", Object.assign({ part: "input", name: this.name, type: this.getInputType(), autoComplete: this.autocomplete, inputmode: this.inputmode, value: this.value, ref: this.setInputRef, placeholder: this.placeholder, disabled: this.disabled, "aria-label": this.label || 'No label defined', minLength: this.minLength, maxLength: this.maxLength,
75
+ h("input", Object.assign({ part: "input", name: this.name, type: this.getInputType(), autoComplete: this.autocomplete, inputmode: this.inputmode, value: this.value, ref: this.setInputRef, placeholder: this.placeholder, disabled: this.disabled, minLength: this.minLength, maxLength: this.maxLength,
76
76
  /* eslint-disable-next-line react/jsx-no-bind */
77
77
  onBlur: (e) => this.handleInputBlur(e),
78
78
  /* eslint-disable-next-line react/jsx-no-bind */
@@ -128,9 +128,6 @@ __decorate([
128
128
  __decorate([
129
129
  MapToComponentField()
130
130
  ], VegaInputInputRenderer.prototype, "type", void 0);
131
- __decorate([
132
- MapToComponentField()
133
- ], VegaInputInputRenderer.prototype, "label", void 0);
134
131
  __decorate([
135
132
  MapToComponentField()
136
133
  ], VegaInputInputRenderer.prototype, "name", void 0);
@@ -97,12 +97,15 @@ export class VegaInputInputSuggestionsRenderer extends VegaSlimmer {
97
97
  return null;
98
98
  }
99
99
  async showSuggestions() {
100
- if (this.renderModeController.isSource() || this.renderModeController.isTemplate()) {
100
+ if (this.dropdownRef &&
101
+ (this.renderModeController.isSource() || this.renderModeController.isTemplate())) {
101
102
  await this.dropdownRef.show();
102
103
  }
103
104
  }
104
105
  async searchSuggestions() {
105
- if (this.renderModeController.isSource() && this.suggestionsDropdownSource.length > 0) {
106
+ if (this.dropdownRef &&
107
+ this.renderModeController.isSource() &&
108
+ this.suggestionsDropdownSource.length > 0) {
106
109
  await this.dropdownRef.search(this.value);
107
110
  }
108
111
  }
@@ -32,12 +32,29 @@ import { VegaInputRenderer } from './slimmers/renderers/vega-input-renderer';
32
32
  import { VegaInputValueController } from './slimmers/controllers/vega-input-value-controller';
33
33
  import { VegaInputInputSuggestionsRenderer } from './slimmers/renderers/vega-input-input-suggestions-renderer';
34
34
  import { VegaInputRenderModeController } from './slimmers/controllers/vega-input-render-mode-controller';
35
+ import { AriaAttributesValueMapper } from '../../helpers/slimmers/mutation-observer/aria-attributes-value-mapper';
36
+ import { DataTabIndexValueMapper } from '../../helpers/slimmers/mutation-observer/data-tab-index-value-mapper';
35
37
  /**
36
38
  * @vegaVersion 1.0.5
37
39
  */
38
40
  export class VegaInput {
39
41
  constructor() {
40
42
  this.globalSlimmers = {};
43
+ this.ariaAttributesValueMapper = new AriaAttributesValueMapper(() => {
44
+ return this.host.shadowRoot.querySelector('input');
45
+ }, {
46
+ 'aria-label': {
47
+ dependency: ['data-aria-label', 'label'],
48
+ defaultValue: 'No label defined',
49
+ },
50
+ 'aria-hidden': {
51
+ dependency: ['data-aria-hidden'],
52
+ defaultValue: null,
53
+ },
54
+ });
55
+ this.dataTabIndexValueMapper = new DataTabIndexValueMapper(() => {
56
+ return this.host.shadowRoot.querySelector('input');
57
+ });
41
58
  this.formFieldController = new FormFieldControllerSlimmer({
42
59
  propertyRules: [
43
60
  {
@@ -376,7 +393,7 @@ export class VegaInput {
376
393
  "text": "Specifies the label or title for the input field.\n\nIt provides descriptive text that helps identify the\n purpose or content expected in the input field."
377
394
  },
378
395
  "attribute": "label",
379
- "reflect": false,
396
+ "reflect": true,
380
397
  "defaultValue": "''"
381
398
  },
382
399
  "labelSuffixButtonProps": {
@@ -1375,6 +1392,12 @@ export class VegaInput {
1375
1392
  __decorate([
1376
1393
  InjectVegaGlobalSlimmer()
1377
1394
  ], VegaInput.prototype, "globalSlimmers", void 0);
1395
+ __decorate([
1396
+ InjectVegaSlimmer()
1397
+ ], VegaInput.prototype, "ariaAttributesValueMapper", void 0);
1398
+ __decorate([
1399
+ InjectVegaSlimmer()
1400
+ ], VegaInput.prototype, "dataTabIndexValueMapper", void 0);
1378
1401
  __decorate([
1379
1402
  InjectVegaSlimmer()
1380
1403
  ], VegaInput.prototype, "formFieldController", void 0);
@@ -26,6 +26,7 @@ export class VegaInputPasscodeKeyboardController extends KeyboardManagerSlimmer
26
26
  {
27
27
  keyCode: ['ArrowLeft', 'ArrowRight'],
28
28
  activeElementInScope: [this.inputPasscodeRenderer.getInputPasscodeContainerRef()],
29
+ eventName: 'keydown',
29
30
  callback:
30
31
  /* istanbul ignore next */
31
32
  /* eslint-disable jsdoc/require-jsdoc */
@@ -72,6 +73,7 @@ export class VegaInputPasscodeKeyboardController extends KeyboardManagerSlimmer
72
73
  * @param {KeyboardEvent} event - the keyboard event of ArrowLeft and ArrowRight
73
74
  */
74
75
  controlDirectionByKeyboard(event) {
76
+ event.preventDefault();
75
77
  const currentIndex = this.inputPasscodeRenderer.getCurrentIndex();
76
78
  const vegaInputRefs = this.inputPasscodeRenderer.getVegaInputRefs();
77
79
  if (event.key === 'ArrowLeft' && currentIndex > 0) {
@@ -94,7 +94,7 @@ export class VegaInputPasscodeRenderer extends VegaSlimmer {
94
94
  return this.inputPasscodeContainerRef;
95
95
  }
96
96
  render() {
97
- const vegaInputBoxes = Array.from({ length: this.length }).map((_, index) => (h("vega-input", { class: this.size === 'small' ? 'small' : 'medium', key: index, tabIndex: index !== 0 ? -1 : null, showClearIcon: false, disabled: this.disabled, value: this.vegaInputValues.get(index) || '', autocomplete: index === 0 ? 'one-time-code' : 'off', inputmode: this.inputType === 'text' ? 'text' : 'numeric', ref: (ref) => {
97
+ const vegaInputBoxes = Array.from({ length: this.length }).map((_, index) => (h("vega-input", { class: this.size === 'small' ? 'small' : 'medium', key: index, "data-tabindex": index !== 0 ? -1 : 0, showClearIcon: false, disabled: this.disabled, "data-aria-hidden": String(!this.isInputAccessibleForScreenReader(index)), "data-aria-label": `Passcode input ${index + 1} of ${this.length}`, value: this.vegaInputValues.get(index) || '', autocomplete: index === 0 ? 'one-time-code' : 'off', inputmode: this.inputType === 'text' ? 'text' : 'numeric', ref: (ref) => {
98
98
  this.vegaInputRefs[index] = ref;
99
99
  DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, VegaFocus, this.handleVegaFocus(index));
100
100
  DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, VegaBlur, this.handleVegaBlur(index));
@@ -106,12 +106,40 @@ export class VegaInputPasscodeRenderer extends VegaSlimmer {
106
106
  } })));
107
107
  return (h(Host, null,
108
108
  this.label && this.renderLabel(),
109
- h("vega-flex", { class: "vega-input-passcode-container", direction: "row", gap: "size-8", ref: (dom) => (this.inputPasscodeContainerRef = dom) }, vegaInputBoxes),
109
+ h("vega-flex", { class: "vega-input-passcode-container", direction: "row", gap: "size-8", role: "group", "aria-label": this.label || 'One-time password input', ref: (dom) => (this.inputPasscodeContainerRef = dom) }, vegaInputBoxes),
110
110
  this.hint && h("vega-hint", null, this.hint)));
111
111
  }
112
112
  renderLabel() {
113
113
  return (h("vega-field-label", { onClick: this.focusInputPasscode, isFieldRequired: this.required, disabled: this.disabled, label: this.label }));
114
114
  }
115
+ /**
116
+ * Find the index of the first empty input box for rendering purposes. If all boxes are filled, return -1.
117
+ *
118
+ * @param {number} inputLength - the input length of the passcode, which is also the number of input boxes to render
119
+ * @returns {number} - the index of the first empty input box, or -1 if all boxes are filled
120
+ */
121
+ getFirstEmptyIndexForRender(inputLength) {
122
+ for (let index = 0; index < inputLength; index++) {
123
+ const currentValue = this.vegaInputValues.get(index);
124
+ if (!currentValue) {
125
+ return index;
126
+ }
127
+ }
128
+ return -1;
129
+ }
130
+ /**
131
+ * Determine whether the input box at the given index should be accessible to screen readers. Only the boxes up to and including the first empty box should be accessible, as screen readers will read out all accessible boxes and we don't want them to read out empty boxes that come before filled boxes.
132
+ *
133
+ * @param {number} index - the index of the input box to check
134
+ * @returns {boolean} - true if the input box should be accessible to screen readers, false otherwise
135
+ */
136
+ isInputAccessibleForScreenReader(index) {
137
+ const firstEmptyIndexForRender = this.getFirstEmptyIndexForRender(this.length);
138
+ if (firstEmptyIndexForRender === -1) {
139
+ return true;
140
+ }
141
+ return index <= firstEmptyIndexForRender;
142
+ }
115
143
  /*
116
144
  * The below method is e2e-test covered in
117
145
  * @see{module:vega-input-passcode-on-input-value-input}
@@ -28,7 +28,6 @@ export class VegaLeftNavLinkRenderer extends VegaSlimmer {
28
28
  };
29
29
  }
30
30
  render() {
31
- var _a;
32
31
  const url = this.url || 'javascript:void(0);';
33
32
  const classList = this.selected === true ? 'selected' : '';
34
33
  return (h(Host, { class: classList, "data-key": this.itemKey },
@@ -38,8 +37,8 @@ export class VegaLeftNavLinkRenderer extends VegaSlimmer {
38
37
  h("vega-icon", { icon: this.icon, size: "size-16" })))),
39
38
  h("span", { class: "vega-links-name" },
40
39
  h("slot", null)),
41
- h("div", { class: "vega-counter-badge" },
42
- h("vega-counter-badge", { count: this.deprecatedPropertySlimmer.getValue(), color: (_a = this.counterBadge) === null || _a === void 0 ? void 0 : _a.color })))));
40
+ !!this.deprecatedPropertySlimmer.getValue() && (h("div", { class: "vega-counter-badge" },
41
+ h("vega-counter-badge", { count: this.deprecatedPropertySlimmer.getValue(), color: this.counterBadge.color }))))));
43
42
  }
44
43
  notifyVegaLeftNav() {
45
44
  const vegaLeftNav = findParent(this.host, 'vega-left-nav');
@@ -2559,6 +2559,11 @@
2559
2559
  border-bottom-color: transparent;
2560
2560
  }
2561
2561
 
2562
+ :host(.vega-no-suitable-placement) .vega-arrow,
2563
+ :host(.vega-no-suitable-alignment) .vega-arrow {
2564
+ display: none;
2565
+ }
2566
+
2562
2567
  :host(.vega-placement-left) .vega-arrow {
2563
2568
  transform: rotate(144deg);
2564
2569
  right: -9px;
@@ -57,7 +57,13 @@ class RTEImageNodeRenderer extends RTENodeRenderer {
57
57
  renderImage(imageAnnotation, node, renderContext) {
58
58
  var _a;
59
59
  return (h("img", Object.assign({}, (_a = node.getCustomAttributesAnnotation()) === null || _a === void 0 ? void 0 : _a.render({ filterAttributes: ['width', 'height'] }), { class: this.getClassesForImageNode(node, renderContext.editable), style: renderContext.editable
60
- ? Object.assign(Object.assign({}, node.getStyles()), { width: '100%' }) : Object.assign(Object.assign({}, node.getStyles()), imageAnnotation.renderStyle({ standalone: true })), alt: imageAnnotation.alt, "data-size": imageAnnotation.size, src: node.url, ref: (ref) => super.registerRef(ref, node) })));
60
+ ? Object.assign(Object.assign({}, node.getStyles()), { width: '100%' }) : Object.assign(Object.assign({}, node.getStyles()), imageAnnotation.renderStyle({ standalone: true })), alt: imageAnnotation.alt, "data-size": imageAnnotation.size, src: node.url, ref: (ref) => super.registerRef(ref, node),
61
+ // eslint-disable-next-line react/jsx-no-bind
62
+ onError: (e) => {
63
+ const img = e.target;
64
+ img.style.width = '16px';
65
+ img.style.height = '16px';
66
+ } })));
61
67
  }
62
68
  /**
63
69
  * Get the custom class string of the current RTEImageNode.
@@ -20,10 +20,13 @@ export class InsertImageController extends VegaSlimmer {
20
20
  * Insert a image to current state
21
21
  *
22
22
  * @param {string} imageUrl The image url
23
+ * @param {RTEBlock[]} selectedBlocks The current selected blocks, if not provided, will get from selectionController
24
+ * @param {RTENode[]} selectedNodes The current selected nodes, if not provided, will get from selectionController
25
+ * @param {RTERange} currentRange The current selected range, if not provided, will get from selectionController
23
26
  * @returns {RTEImageNode} RTEImageNode
24
27
  */
25
- insertImageToCaretPosition(imageUrl) {
26
- const selectedBlocks = this.selectionController.getSelectedBlocks();
28
+ insertImageToCaretPosition(imageUrl, selectedBlocks, selectedNodes, currentRange) {
29
+ selectedBlocks || (selectedBlocks = this.selectionController.getSelectedBlocks());
27
30
  const imageBlock = new RTEImageBlock(generateUUID());
28
31
  const newImageNode = new RTEImageNode(generateUUID(), imageUrl, imageBlock);
29
32
  newImageNode.apply(new ImageAnnotationAction('md', ''));
@@ -33,8 +36,8 @@ export class InsertImageController extends VegaSlimmer {
33
36
  void this.valueController.flushChanges(this.value);
34
37
  }
35
38
  else {
36
- const { startOffset } = this.selectionController.getCurrentRange();
37
- const selectedNodes = this.selectionController.getSelectedNodes();
39
+ const { startOffset } = currentRange || this.selectionController.getCurrentRange();
40
+ selectedNodes || (selectedNodes = this.selectionController.getSelectedNodes());
38
41
  selectedBlocks[0].apply(new InsertImageToBlockAction(selectedNodes[0], startOffset, imageBlock));
39
42
  }
40
43
  this.updateCaretPosition(newImageNode);
@@ -6,20 +6,46 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { VegaInternalIconManager } from '../../../../../helpers/icon/internal-icon-manager';
8
8
  import image from '../../../assets/image';
9
- import { h } from '@stencil/core';
9
+ import { Fragment, h } from '@stencil/core';
10
10
  import { MapToComponentField } from 'vega-slimmer/core';
11
11
  import { NodeAnnotationTypeEnum } from '../../../dto/annotations/node-annotation.abstract';
12
12
  import { ImageUpdateUrlAction } from '../../../dto/actions/image-update-url-action';
13
13
  import { VisualModeToolbarButtonSlimmer } from './visual-mode-toolbar-button-slimmer.abstract';
14
14
  import { ModifyContentActionType } from '../../../dto/actions/modify-content-action.abstract';
15
+ import { DomNodeSubjectObserverFactory } from '../../../../../helpers/change-manager/subject/dom-node-subject/dom-node-subject-observer-factory';
16
+ import { VegaClick, VegaDropdownClick } from '../../../../../helpers/event-manager/event-id/vega-event-id';
17
+ import { tryGetDocument } from '../../../../../utils/try-get-document';
15
18
  export class ImageToolbarButtonSlimmer extends VisualModeToolbarButtonSlimmer {
16
19
  constructor() {
17
20
  super({
18
21
  icon: 'image',
19
22
  tooltip: { text: 'Image' },
20
23
  });
21
- this.onClick = () => {
22
- this.inputElementRef.click();
24
+ this.insertURLImage = async () => {
25
+ const url = this.normalizeSafeImageUrl(this.insertURLInputRef.value);
26
+ this.applyImageNode(url, 'url');
27
+ await this.insertURLModalRef.modal('hide');
28
+ };
29
+ this.handleDropdownItemClick = async (payload) => {
30
+ const safeDocument = tryGetDocument();
31
+ switch (payload.detail) {
32
+ case 'upload':
33
+ this.uploadInputRef.click();
34
+ break;
35
+ case 'url':
36
+ this.currentRange = this.selectionController.getCurrentRange();
37
+ this.currentSelectedNodes = this.selectionController.getSelectedNodes();
38
+ this.currentSelectedBlocks = this.selectionController.getSelectedBlocks();
39
+ safeDocument && safeDocument.body.append(this.insertURLModalRef);
40
+ this.insertURLInputRef.value = '';
41
+ await this.insertURLModalRef.modal('show');
42
+ await this.insertURLInputRef.doFocus();
43
+ break;
44
+ /* istanbul ignore next */
45
+ default:
46
+ break;
47
+ }
48
+ await this.dropdownRef.hide();
23
49
  };
24
50
  /**
25
51
  * The below method is e2e-test covered in
@@ -32,13 +58,7 @@ export class ImageToolbarButtonSlimmer extends VisualModeToolbarButtonSlimmer {
32
58
  if (!input.files.length) {
33
59
  return;
34
60
  }
35
- const node = this.insertImageController.insertImageToCaretPosition(URL.createObjectURL(input.files[0]));
36
- if (!this.updateNodeURLMap) {
37
- this.updateNodeURLMap = new Map();
38
- }
39
- this.updateNodeURLMap.set(node, (url) => {
40
- node.apply(new ImageUpdateUrlAction(url));
41
- });
61
+ const node = this.applyImageNode(URL.createObjectURL(input.files[0]), 'upload');
42
62
  const payload = {
43
63
  file: input.files[0],
44
64
  sendBackUploadedURLCallback: this.updateNodeURLMap.get(node),
@@ -49,8 +69,14 @@ export class ImageToolbarButtonSlimmer extends VisualModeToolbarButtonSlimmer {
49
69
  }
50
70
  renderBtnWrapper(renderBtn) {
51
71
  return (h("vega-box", null,
52
- renderBtn({ showArrowIcon: false }),
53
- h("input", { type: "file", style: { display: 'none' }, ref: (node) => (this.inputElementRef = node), accept: "image/*", onChange: this.fileInputChange })));
72
+ h("vega-dropdown", { selectType: "none", trigger: "click", alignment: "center", ref: (ref) => {
73
+ this.dropdownRef = ref;
74
+ this.addDropdownObserver(ref);
75
+ } },
76
+ renderBtn({ showArrowIcon: true }),
77
+ h("div", Object.assign({ slot: "items" }, super.preventLostFocus()), this.renderDropdownContent())),
78
+ this.renderUploadInput(),
79
+ this.renderInsertURLModal()));
54
80
  }
55
81
  isSelected() {
56
82
  return false;
@@ -62,10 +88,85 @@ export class ImageToolbarButtonSlimmer extends VisualModeToolbarButtonSlimmer {
62
88
  selectedNodes.some((node) => node.getAnnotationByType(NodeAnnotationTypeEnum.LINK)) ||
63
89
  this.shouldDisabledToolbar(selectedBlock, ModifyContentActionType.INSERT_IMAGE_TO_BLOCK));
64
90
  }
91
+ renderDropdownContent() {
92
+ return (h(Fragment, null, ImageToolbarButtonSlimmer.items.map((item) => {
93
+ return (h("vega-dropdown-item", { key: item.key, itemKey: item.key }, this.translationSlimmer.t(item.label)));
94
+ })));
95
+ }
96
+ renderUploadInput() {
97
+ return (h("input", { type: "file", style: { display: 'none' }, ref: (node) => (this.uploadInputRef = node), accept: "image/*", onChange: this.fileInputChange }));
98
+ }
99
+ renderInsertURLModal() {
100
+ return (h("vega-modal", { size: 500, backdropColor: "semi", ref: (node) => (this.insertURLModalRef = node) },
101
+ h("div", { slot: "modal-title" }, this.translationSlimmer.t('Image via URL')),
102
+ h("div", { slot: "modal-content" },
103
+ h("vega-input", { placeholder: this.translationSlimmer.t('URL'), ref: (ref) => (this.insertURLInputRef = ref),
104
+ /* istanbul ignore next */
105
+ // eslint-disable-next-line react/jsx-no-bind
106
+ onKeyDown: async (event) => {
107
+ event.key === 'Enter' && (await this.insertURLImage());
108
+ } })),
109
+ h("vega-flex", { slot: "modal-footer", gap: "size-8", alignItems: "center", justifyContent: "end" },
110
+ h("vega-button", { label: this.translationSlimmer.t('Cancel'), variant: "secondary", ref: (ref) => {
111
+ this.addModalCancelObserver(ref);
112
+ } }),
113
+ h("vega-button", { label: this.translationSlimmer.t('Insert'), ref: (ref) => {
114
+ this.addModalInsertObserver(ref);
115
+ } }))));
116
+ }
117
+ addDropdownObserver(dropdownRef) {
118
+ DomNodeSubjectObserverFactory.addUniqueObserverToNode(dropdownRef, VegaDropdownClick, this.handleDropdownItemClick);
119
+ }
120
+ addModalCancelObserver(buttonRef) {
121
+ DomNodeSubjectObserverFactory.addUniqueObserverToNode(buttonRef, VegaClick, async () => {
122
+ await this.insertURLModalRef.modal('hide');
123
+ });
124
+ }
125
+ addModalInsertObserver(buttonRef) {
126
+ DomNodeSubjectObserverFactory.addUniqueObserverToNode(buttonRef, VegaClick, this.insertURLImage);
127
+ }
128
+ /**
129
+ * The below method is e2e-test covered in
130
+ * @see{module:should-update-url-properly-when-upload-images}
131
+ */
132
+ /* istanbul ignore next */
133
+ applyImageNode(url, type) {
134
+ const node = type === 'url'
135
+ ? this.insertImageController.insertImageToCaretPosition(url, this.currentSelectedBlocks, this.currentSelectedNodes, this.currentRange)
136
+ : this.insertImageController.insertImageToCaretPosition(url);
137
+ if (!this.updateNodeURLMap) {
138
+ this.updateNodeURLMap = new Map();
139
+ }
140
+ this.updateNodeURLMap.set(node, (url) => {
141
+ node.apply(new ImageUpdateUrlAction(url));
142
+ });
143
+ return node;
144
+ }
145
+ normalizeSafeImageUrl(url) {
146
+ try {
147
+ const parsedUrl = new URL(url);
148
+ if (parsedUrl.protocol === 'javascript:') {
149
+ return '';
150
+ }
151
+ // eslint-disable-next-line no-empty
152
+ }
153
+ catch (_error) { }
154
+ return url;
155
+ }
65
156
  }
66
157
  (() => {
67
158
  VegaInternalIconManager.register({ image: image });
68
159
  })();
160
+ ImageToolbarButtonSlimmer.items = [
161
+ {
162
+ key: 'upload',
163
+ label: 'Upload from computer',
164
+ },
165
+ {
166
+ key: 'url',
167
+ label: 'Insert via URL',
168
+ },
169
+ ];
69
170
  __decorate([
70
171
  MapToComponentField()
71
172
  ], ImageToolbarButtonSlimmer.prototype, "insertImageController", void 0);
@@ -27,7 +27,7 @@ export class VegaRichTextImageEditorRenderer extends VegaSlimmer {
27
27
  };
28
28
  }
29
29
  render() {
30
- return (h("vega-popover", { style: { width: '100%' }, trigger: "click", alignment: "start", placement: "bottom", showArrow: false, ref: (ref) => {
30
+ return (h("vega-popover", { style: { width: '100%' }, trigger: "click", alignment: "start", placement: "bottom", showArrow: false, isScreenPosition: true, ref: (ref) => {
31
31
  this.popoverRef = ref;
32
32
  DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, VegaPopoverShow, () => {
33
33
  this.selected = true;
@@ -66,6 +66,11 @@
66
66
  }
67
67
  }
68
68
 
69
+ :host(.vega-no-suitable-placement) .vega-tooltip-content::after,
70
+ :host(.vega-no-suitable-alignment) .vega-tooltip-content::after {
71
+ display: none;
72
+ }
73
+
69
74
  .vega-tooltip-content::after {
70
75
  content: "";
71
76
  position: absolute;
@@ -1,4 +1,5 @@
1
- import { getWeekdays } from '../utils';
1
+ import { getWeekdays, buildDatePickerAnnouncement, getSystemTimezone } from '../utils';
2
+ import { CalendarDate } from '../calendar-date';
2
3
  describe('utils', () => {
3
4
  it('should return weekdays as expected by default', () => {
4
5
  expect(getWeekdays()).toEqual([0, 1, 2, 3, 4, 5, 6]);
@@ -6,4 +7,56 @@ describe('utils', () => {
6
7
  it('should return weekdays as expected when change the firstWeekDay', () => {
7
8
  expect(getWeekdays(1)).toEqual([1, 2, 3, 4, 5, 6, 0]);
8
9
  });
10
+ it('should return a non-empty string for getSystemTimezone', () => {
11
+ expect(typeof getSystemTimezone()).toBe('string');
12
+ expect(getSystemTimezone().length).toBeGreaterThan(0);
13
+ });
14
+ describe('buildDatePickerAnnouncement', () => {
15
+ it('should return empty string when both startDate and endDate are null', () => {
16
+ expect(buildDatePickerAnnouncement({ mode: 'single', startDate: null })).toBe('');
17
+ expect(buildDatePickerAnnouncement({ mode: 'range', startDate: null, endDate: null })).toBe('');
18
+ });
19
+ it('should return single mode announcement with startDate', () => {
20
+ const startDate = new CalendarDate(2025, 3, 15);
21
+ const result = buildDatePickerAnnouncement({ mode: 'single', startDate });
22
+ expect(result).toContain('Selected result');
23
+ expect(result).toContain('March');
24
+ expect(result).toContain('15');
25
+ expect(result).toContain('2025');
26
+ });
27
+ it('should return empty string for single mode without startDate', () => {
28
+ expect(buildDatePickerAnnouncement({ mode: 'single', startDate: null })).toBe('');
29
+ });
30
+ it('should return range mode announcement with both startDate and endDate', () => {
31
+ const startDate = new CalendarDate(2025, 3, 10);
32
+ const endDate = new CalendarDate(2025, 3, 20);
33
+ const result = buildDatePickerAnnouncement({ mode: 'range', startDate, endDate });
34
+ expect(result).toContain('Selected result');
35
+ expect(result).toContain('Start Date');
36
+ expect(result).toContain('End Date');
37
+ expect(result).toContain('March');
38
+ expect(result).toContain('10');
39
+ expect(result).toContain('20');
40
+ });
41
+ it('should return range mode announcement with only startDate', () => {
42
+ const startDate = new CalendarDate(2025, 6, 1);
43
+ const result = buildDatePickerAnnouncement({ mode: 'range', startDate, endDate: null });
44
+ expect(result).toContain('Selected result');
45
+ expect(result).toContain('Start Date');
46
+ expect(result).toContain('June');
47
+ expect(result).toContain('1');
48
+ expect(result).not.toContain('End Date');
49
+ });
50
+ it('should return empty string for range mode without any dates', () => {
51
+ expect(buildDatePickerAnnouncement({ mode: 'range', startDate: null, endDate: null })).toBe('');
52
+ });
53
+ it('should return empty string for range mode with only endDate', () => {
54
+ const endDate = new CalendarDate(2025, 3, 20);
55
+ expect(buildDatePickerAnnouncement({ mode: 'range', startDate: null, endDate })).toBe('');
56
+ });
57
+ it('should return empty string for single mode with only endDate', () => {
58
+ const endDate = new CalendarDate(2025, 3, 20);
59
+ expect(buildDatePickerAnnouncement({ mode: 'single', startDate: null, endDate })).toBe('');
60
+ });
61
+ });
9
62
  });
@@ -1,3 +1,4 @@
1
+ import { VegaInternalTranslation } from '../translation/internal-translation-controller';
1
2
  /**
2
3
  * Get a week days array
3
4
  *
@@ -26,3 +27,37 @@ export var WeekdayLongNames;
26
27
  export const getSystemTimezone = () => {
27
28
  return Intl.DateTimeFormat().resolvedOptions().timeZone;
28
29
  };
30
+ /**
31
+ * Build an aria announcement string for date picker selection.
32
+ * TODO: consider to implement i18n for aria announcement .
33
+ *
34
+ * @param {object} options - The options for building the announcement.
35
+ * @param {'single' | 'range'} options.mode - The date picker selection mode.
36
+ * @param {Nullable<CalendarDate>} options.startDate - The start date.
37
+ * @param {Nullable<CalendarDate>} [options.endDate] - The end date (used in range mode).
38
+ * @returns {string} - The aria announcement string.
39
+ */
40
+ export const buildDatePickerAnnouncement = (options) => {
41
+ const mode = options.mode;
42
+ const startDate = options.startDate;
43
+ const endDate = options.endDate;
44
+ if (!startDate && !endDate) {
45
+ return '';
46
+ }
47
+ // eslint-disable-next-line jsdoc/require-jsdoc
48
+ const formatDate = (d) => `${d.getMonthName()} ${d.date} ${d.year}`;
49
+ if (mode === 'single' && startDate) {
50
+ return `${VegaInternalTranslation.t('Selected result')}: ${formatDate(startDate)}`;
51
+ }
52
+ if (mode === 'range') {
53
+ const startDateLabel = VegaInternalTranslation.t('Start Date');
54
+ const endDateLabel = VegaInternalTranslation.t('End Date');
55
+ if (startDate && endDate) {
56
+ return `${VegaInternalTranslation.t('Selected result')} ${startDateLabel}: ${formatDate(startDate)}. ${endDateLabel}: ${formatDate(endDate)}.`;
57
+ }
58
+ if (startDate) {
59
+ return `${VegaInternalTranslation.t('Selected result')} ${startDateLabel}: ${formatDate(startDate)}.`;
60
+ }
61
+ }
62
+ return '';
63
+ };