@globalpayments/vega 2.91.0 → 2.93.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 (637) hide show
  1. package/dist/cjs/{app-globals-7bb10088.js → app-globals-f7ad9275.js} +17 -10
  2. package/dist/cjs/{child-nodes-event-prevent-slimmer-76d19d56.js → child-nodes-event-prevent-slimmer-e67ee84c.js} +2 -2
  3. package/dist/cjs/{code-block-c1039791.js → code-block-2f3d0f38.js} +64 -11
  4. package/dist/cjs/{component-value-history-controller-slimmer.abstract-1d36641d.js → component-value-history-controller-slimmer.abstract-31d2c7aa.js} +72 -39
  5. package/dist/cjs/{content-state-a6105949.js → content-state-13daf87a.js} +91 -8
  6. package/dist/cjs/copy-d021c780.js +7 -0
  7. package/dist/cjs/{date-required-rule-c4997459.js → date-required-rule-e65ddd7d.js} +1 -1
  8. package/dist/cjs/{design-token-f65eab4a.js → design-token-47393cbb.js} +3 -3
  9. package/dist/cjs/{element-appender-slimmer-316668d0.js → element-appender-slimmer-29c4ac60.js} +18 -9
  10. package/dist/cjs/{event-emit-slimmer-5bab10c2.js → event-emit-slimmer-d234a619.js} +1 -1
  11. package/dist/cjs/{file-uploader-required-rule-cc51d4ab.js → file-uploader-required-rule-5520bbec.js} +1 -1
  12. package/dist/cjs/{form-field-controller-slimmer-b0c35330.js → form-field-controller-slimmer-3bfcf88c.js} +1 -1
  13. package/dist/cjs/{image-annotation-action-e4596726.js → image-annotation-action-c2b163bb.js} +3 -3
  14. package/dist/cjs/image-extension-4e99b620.js +39 -0
  15. package/dist/cjs/index-58ea899e.js +4 -0
  16. package/dist/cjs/index.cjs.js +30 -22
  17. package/dist/cjs/{inject-keyboard-manager-1f5bbb19.js → inject-keyboard-manager-4b2ebbe4.js} +1 -1
  18. package/dist/cjs/{internal-calendar-period-factory-9c66cf36.js → internal-calendar-period-factory-7a0ecdb1.js} +1 -1
  19. package/dist/cjs/{internal-translation-controller-5905469e.js → internal-translation-controller-31f2b057.js} +18 -0
  20. package/dist/cjs/{internal-vega-event-manager-7196a847.js → internal-vega-event-manager-13c4012b.js} +2 -1
  21. package/dist/cjs/{keyboard-manager-61e8ce38.js → keyboard-manager-c78b46bd.js} +1 -1
  22. package/dist/cjs/{keyboard-manager-slimmer-079a7e87.js → keyboard-manager-slimmer-d350c931.js} +1 -1
  23. package/dist/cjs/{link-extension-a7ac28f3.js → link-extension-455c02b3.js} +3 -3
  24. package/dist/cjs/loader.cjs.js +17 -15
  25. package/dist/cjs/{month-view-generator-48215a05.js → month-view-generator-006562dc.js} +1 -1
  26. package/dist/cjs/{public-rules-66540638.js → public-rules-c59eba88.js} +10 -10
  27. package/dist/cjs/{range-dea19a90.js → range-bf80fa40.js} +25 -3
  28. package/dist/cjs/{replace-selected-text-action-6d1ebbf9.js → replace-selected-text-action-a80f5a6a.js} +1 -1
  29. package/dist/cjs/{required-field-rule-b12a29e1.js → required-field-rule-400690c3.js} +1 -1
  30. package/dist/cjs/{responsive-format-facade-10ff730e.js → responsive-format-facade-1af54330.js} +2 -2
  31. package/dist/cjs/{rich-text-editor-required-rule-63492ca3.js → rich-text-editor-required-rule-1085c71a.js} +1 -1
  32. package/dist/cjs/{split-cell-operation-30e5dd4a.js → split-cell-operation-2fa5c9e4.js} +3 -3
  33. package/dist/cjs/{state-border-formatter-e7779964.js → state-border-formatter-501f6645.js} +1 -1
  34. package/dist/cjs/{string-format-strategy.abstract-a22f0cb1.js → string-format-strategy.abstract-a02bf002.js} +1 -1
  35. package/dist/cjs/{string-input-formatter-slimmer-8179eb40.js → string-input-formatter-slimmer-9cca6151.js} +1 -1
  36. package/dist/cjs/{string-mask-strategy-8b9bb0c1.js → string-mask-strategy-4c174ebf.js} +2 -2
  37. package/dist/cjs/{style-formatter-380b9a86.js → style-formatter-2c749500.js} +2 -2
  38. package/dist/cjs/{time-required-rule-080d975b.js → time-required-rule-04994a5e.js} +1 -1
  39. package/dist/cjs/{token-extension-619379a3.js → token-extension-d217914d.js} +3622 -742
  40. package/dist/cjs/{translation-slimmer-2af6f141.js → translation-slimmer-7fb6e94c.js} +1 -1
  41. package/dist/cjs/{type-guard-0171e779.js → type-guard-1c3770d4.js} +1 -1
  42. package/dist/cjs/{valid-credit-card-number-rule-fdfca83e.js → valid-credit-card-number-rule-f719a8c6.js} +1 -1
  43. package/dist/cjs/vega-accordion.cjs.entry.js +21 -13
  44. package/dist/cjs/vega-app-footer.cjs.entry.js +3 -3
  45. package/dist/cjs/vega-app-header-button.cjs.entry.js +10 -10
  46. package/dist/cjs/vega-banner.cjs.entry.js +6 -9
  47. package/dist/cjs/vega-box.cjs.entry.js +7 -7
  48. package/dist/cjs/vega-breadcrumb.cjs.entry.js +5 -5
  49. package/dist/cjs/vega-button-circle.cjs.entry.js +10 -10
  50. package/dist/cjs/vega-button-group_2.cjs.entry.js +5 -5
  51. package/dist/cjs/vega-button-link.cjs.entry.js +5 -5
  52. package/dist/cjs/vega-button.cjs.entry.js +8 -8
  53. package/dist/cjs/vega-calendar_5.cjs.entry.js +12 -12
  54. package/dist/cjs/vega-card.cjs.entry.js +6 -6
  55. package/dist/cjs/vega-carousel.cjs.entry.js +7 -7
  56. package/dist/cjs/vega-checkbox_2.cjs.entry.js +8 -8
  57. package/dist/cjs/vega-chip.cjs.entry.js +10 -10
  58. package/dist/cjs/vega-code-block.cjs.entry.js +15 -18
  59. package/dist/cjs/vega-color-picker.cjs.entry.js +7 -7
  60. package/dist/cjs/vega-color-swatch-picker.cjs.entry.js +9 -9
  61. package/dist/cjs/vega-color-swatch.cjs.entry.js +5 -5
  62. package/dist/cjs/vega-combo-box.cjs.entry.js +21 -15
  63. package/dist/cjs/vega-date-picker_2.cjs.entry.js +18 -18
  64. package/dist/cjs/vega-dialog_2.cjs.entry.js +21 -10
  65. package/dist/cjs/vega-divider.cjs.entry.js +6 -6
  66. package/dist/cjs/vega-dropdown_5.cjs.entry.js +694 -196
  67. package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
  68. package/dist/cjs/{vega-event-id-df22d80e.js → vega-event-id-58afed7a.js} +2 -0
  69. package/dist/cjs/vega-field-label.cjs.entry.js +16 -12
  70. package/dist/cjs/vega-file-uploader.cjs.entry.js +9 -9
  71. package/dist/cjs/vega-flag-icon.cjs.entry.js +6 -6
  72. package/dist/cjs/vega-flex.cjs.entry.js +7 -7
  73. package/dist/cjs/vega-font.cjs.entry.js +6 -6
  74. package/dist/cjs/vega-form.cjs.entry.js +8 -8
  75. package/dist/cjs/vega-grid.cjs.entry.js +6 -6
  76. package/dist/cjs/vega-icon.cjs.entry.js +6 -6
  77. package/dist/cjs/vega-image-uploader.cjs.entry.js +11 -11
  78. package/dist/cjs/vega-input-credit-card.cjs.entry.js +12 -12
  79. package/dist/cjs/vega-input-numeric.cjs.entry.js +11 -11
  80. package/dist/cjs/vega-input-passcode.cjs.entry.js +11 -11
  81. package/dist/cjs/vega-input-phone-number.cjs.entry.js +9 -9
  82. package/dist/cjs/vega-input-range.cjs.entry.js +8 -8
  83. package/dist/cjs/vega-input-select.cjs.entry.js +11 -11
  84. package/dist/cjs/vega-input.cjs.entry.js +12 -12
  85. package/dist/cjs/vega-item-toggle.cjs.entry.js +3 -3
  86. package/dist/cjs/vega-left-nav_5.cjs.entry.js +11 -11
  87. package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +4 -4
  88. package/dist/cjs/vega-page-notification_2.cjs.entry.js +1 -1
  89. package/dist/cjs/vega-pagination-page-selector-mobile.cjs.entry.js +4 -4
  90. package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +3 -3
  91. package/dist/cjs/vega-pagination.cjs.entry.js +9 -9
  92. package/dist/cjs/vega-popover_2.cjs.entry.js +12 -12
  93. package/dist/cjs/vega-progress-tracker_2.cjs.entry.js +7 -7
  94. package/dist/cjs/vega-radio_2.cjs.entry.js +11 -11
  95. package/dist/cjs/vega-rich-text-content.cjs.entry.js +7 -7
  96. package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +677 -95
  97. package/dist/cjs/vega-rich-text-find-replace-panel.cjs.entry.js +233 -0
  98. package/dist/cjs/vega-rich-text-special-characters-panel.cjs.entry.js +8 -8
  99. package/dist/cjs/vega-rich-text-table-properties_3.cjs.entry.js +13 -13
  100. package/dist/cjs/vega-segment-control.cjs.entry.js +3 -3
  101. package/dist/cjs/vega-selection-chip_2.cjs.entry.js +10 -10
  102. package/dist/cjs/vega-selection-tile_2.cjs.entry.js +8 -8
  103. package/dist/cjs/vega-sidenav_3.cjs.entry.js +7 -7
  104. package/dist/cjs/vega-signature-capture.cjs.entry.js +12 -12
  105. package/dist/cjs/vega-stepper.cjs.entry.js +7 -7
  106. package/dist/cjs/vega-tab-group_2.cjs.entry.js +5 -5
  107. package/dist/cjs/vega-table_11.cjs.entry.js +912 -429
  108. package/dist/cjs/vega-textarea.cjs.entry.js +9 -11
  109. package/dist/cjs/vega-time-picker_2.cjs.entry.js +35 -15
  110. package/dist/cjs/vega-toggle-switch.cjs.entry.js +5 -5
  111. package/dist/cjs/vega-tooltip_2.cjs.entry.js +7 -7
  112. package/dist/cjs/vega.cjs.js +17 -15
  113. package/dist/cjs/xmark-large-faae5a80.js +7 -0
  114. package/dist/collection/collection-manifest.json +6 -0
  115. package/dist/collection/components/vega-accordion/slimmers/vega-accordion-renderer.js +11 -3
  116. package/dist/collection/components/vega-box/vega-box.js +3 -3
  117. package/dist/collection/components/vega-code-block/slimmers/renderers/vega-code-block-copy-button-renderer.js +1 -1
  118. package/dist/collection/components/vega-combo-box/slimmers/renderers/vega-combo-box-dropdown-renderer.js +4 -1
  119. package/dist/collection/components/vega-combo-box/vega-combo-box.js +7 -1
  120. package/dist/collection/components/vega-dialog/vega-dialog.js +1 -1
  121. package/dist/collection/components/vega-dropdown/constants.js +1 -0
  122. package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-appender-controller.js +9 -0
  123. package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-children-controller.js +97 -4
  124. package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-select-all-controller.js +219 -0
  125. package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-selected-controller.js +78 -13
  126. package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-source-controller.js +13 -1
  127. package/dist/collection/components/vega-dropdown/slimmers/renderers/vega-dropdown-list-renderer.js +7 -0
  128. package/dist/collection/components/vega-dropdown/vega-dropdown-item/slimmers/controllers/vega-dropdown-item-state-controller.js +52 -1
  129. package/dist/collection/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.js +4 -1
  130. package/dist/collection/components/vega-dropdown/vega-dropdown-item/vega-dropdown-item.js +5 -0
  131. package/dist/collection/components/vega-dropdown/vega-dropdown.js +126 -1
  132. package/dist/collection/components/vega-field-label/slimmers/renderers/vega-field-label-suffix-element-renderer.js +5 -4
  133. package/dist/collection/components/vega-field-label/vega-field-label.css +20 -0
  134. package/dist/collection/components/vega-field-label/vega-field-label.js +7 -4
  135. package/dist/collection/components/vega-hint/vega-hint.js +1 -1
  136. package/dist/collection/components/vega-input/vega-input.css +1 -0
  137. package/dist/collection/components/vega-input/vega-input.js +1 -1
  138. package/dist/collection/components/vega-input-select/vega-input-select.js +1 -1
  139. package/dist/collection/components/vega-modal/slimmers/renderers/vega-modal-renderer.js +4 -1
  140. package/dist/collection/components/vega-modal/vega-modal.css +0 -1
  141. package/dist/collection/components/vega-modal/vega-modal.js +38 -0
  142. package/dist/collection/components/vega-rich-text-editor/assets/cut.js +3 -0
  143. package/dist/collection/components/vega-rich-text-editor/assets/redo.js +1 -1
  144. package/dist/collection/components/vega-rich-text-editor/assets/undo.js +1 -1
  145. package/dist/collection/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/block-delete-text-or-decorator-node-strategy.js +16 -1
  146. package/dist/collection/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/block-insert-line-break-strategy.js +11 -5
  147. package/dist/collection/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/block-merge-nodes-strategy.js +25 -0
  148. package/dist/collection/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/block-split-with-text-node-strategy.js +9 -4
  149. package/dist/collection/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/delete-selected-content-strategy.js +16 -0
  150. package/dist/collection/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/paste-content-strategy.js +61 -5
  151. package/dist/collection/components/vega-rich-text-editor/dto/actions/delete-selected-content-action.js +17 -0
  152. package/dist/collection/components/vega-rich-text-editor/dto/actions/modify-content-action.abstract.js +1 -0
  153. package/dist/collection/components/vega-rich-text-editor/dto/actions/paste-content-action.js +1 -0
  154. package/dist/collection/components/vega-rich-text-editor/dto/content-state.js +2 -0
  155. package/dist/collection/components/vega-rich-text-editor/dto/nodes/text-node.js +6 -1
  156. package/dist/collection/components/vega-rich-text-editor/dto/range.js +24 -2
  157. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/action-handler-interceptors/blockquote-exit-on-enter-interceptor.js +61 -0
  158. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/action-handler-strategies/block-transform-to-blockquote-strategy.js +40 -0
  159. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/action-handler-strategies/remove-blockquote-strategy.js +20 -0
  160. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/actions/remove-blockquote-action.js +17 -0
  161. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/actions/transform-to-blockquote-action.js +19 -0
  162. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/assets/quote-left.js +4 -0
  163. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/blockquote-extension.js +47 -0
  164. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/dto/blockquote-annotation.js +76 -0
  165. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/dto/rte-blockquote-block.js +70 -0
  166. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/element-to-dto-strategies/blockquote-to-blockquote-block-strategy.js +53 -0
  167. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/filter-styles-strategies/blockquote-block/blockquote-filter-styles-strategy.js +41 -0
  168. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/renderers/blockquote-block-renderer.js +21 -0
  169. package/dist/collection/components/vega-rich-text-editor/extensions/blockquote/renderers/blockquote-toolbar-button-renderer.js +260 -0
  170. package/dist/collection/components/vega-rich-text-editor/extensions/copy/action-handler-strategies/copy-selected-content-strategy.js +226 -0
  171. package/dist/collection/components/vega-rich-text-editor/extensions/copy/actions/copy-selected-content-action.js +21 -0
  172. package/dist/collection/components/vega-rich-text-editor/extensions/copy/copy-extension.js +20 -0
  173. package/dist/collection/components/vega-rich-text-editor/extensions/copy/copy-toolbar-button-renderer.js +58 -0
  174. package/dist/collection/components/vega-rich-text-editor/extensions/cut/cut-extension.js +15 -0
  175. package/dist/collection/components/vega-rich-text-editor/extensions/cut/cut-toolbar-button-renderer.js +44 -0
  176. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/assets/find-and-replace.js +3 -0
  177. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/find-replace-extension.js +18 -0
  178. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/find-controller.js +105 -0
  179. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/find-replace-controller.abstract.js +68 -0
  180. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/block-search-strategy.abstract.js +8 -0
  181. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/code-block-search-strategy.js +19 -0
  182. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/container-block-search-strategy.js +23 -0
  183. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/list-item-block-search-strategy.js +30 -0
  184. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/text-block-search-strategy.js +20 -0
  185. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/find-replace-highlight-manager.js +266 -0
  186. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/find-replace-state.js +346 -0
  187. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/replace-controller.js +113 -0
  188. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/slimmer/renderers/find-replace-toolbar-button-renderer.js +194 -0
  189. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/vega-rich-text-find-replace-panel/slimmers/renderers/find-replace-panel-renderer.js +153 -0
  190. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/vega-rich-text-find-replace-panel/vega-rich-text-find-replace-panel.css +50 -0
  191. package/dist/collection/components/vega-rich-text-editor/extensions/find-replace/vega-rich-text-find-replace-panel/vega-rich-text-find-replace-panel.js +156 -0
  192. package/dist/collection/components/vega-rich-text-editor/extensions/functions/function-extension.js +2 -1
  193. package/dist/collection/components/vega-rich-text-editor/extensions/horizontal-line/horizontal-line-extension.js +2 -1
  194. package/dist/collection/components/vega-rich-text-editor/extensions/image/image-extension.js +34 -0
  195. package/dist/collection/components/vega-rich-text-editor/extensions/image/type.js +1 -0
  196. package/dist/collection/components/vega-rich-text-editor/extensions/languages/language-extension.js +2 -1
  197. package/dist/collection/components/vega-rich-text-editor/extensions/line-height/line-height-extension.js +2 -1
  198. package/dist/collection/components/vega-rich-text-editor/extensions/paste/assets/paste.js +3 -0
  199. package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-chooser-ui.js +144 -0
  200. package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-constants.js +6 -0
  201. package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-extension.js +442 -0
  202. package/dist/collection/components/vega-rich-text-editor/extensions/special-characters/special-characters-extension.js +2 -1
  203. package/dist/collection/components/vega-rich-text-editor/extensions/table/renderers/table-renderer.js +1 -1
  204. package/dist/collection/components/vega-rich-text-editor/extensions/table/table-extension.js +6 -4
  205. package/dist/collection/components/vega-rich-text-editor/extensions/table/vega-rich-text-table-selection-widget/slimmers/controllers/selection-widget-keyboard-controller.js +1 -1
  206. package/dist/collection/components/vega-rich-text-editor/extensions/tokens/token-extension.js +2 -1
  207. package/dist/collection/components/vega-rich-text-editor/helpers/utils.js +14 -0
  208. package/dist/collection/components/vega-rich-text-editor/public-api.js +7 -0
  209. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/abstract-delete-content-handler.js +133 -0
  210. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/backward-delete-content-handler.js +35 -0
  211. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/base-handler.js +1 -1
  212. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/forward-delete-content-handler.js +93 -0
  213. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/insert-line-break-handler.js +1 -1
  214. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/insert-paste-handler.js +385 -25
  215. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/selection-controller.js +69 -36
  216. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/user-input-controller.js +9 -3
  217. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/tools/image-toolbar-button-slimmer.js +59 -14
  218. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-editor-toolbar-button/slimmers/renderers/vega-rich-text-editor-toolbar-button-renderer.js +6 -1
  219. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-editor-toolbar-button/vega-rich-text-editor-toolbar-button.js +28 -1
  220. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-editor.js +1 -1
  221. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-image-editor/vega-rich-text-image-editor.js +1 -1
  222. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-link-editor/vega-rich-text-link-editor.js +1 -1
  223. package/dist/collection/components/vega-table/slimmers/controllers/dto/column-render-input-model.js +32 -0
  224. package/dist/collection/components/vega-table/slimmers/controllers/vega-table-body-col-span-controller.js +77 -0
  225. package/dist/collection/components/vega-table/slimmers/renderers/vega-table-body-col-span-resolver.js +121 -0
  226. package/dist/collection/components/vega-table/slimmers/renderers/vega-table-cell-renderer.js +39 -14
  227. package/dist/collection/components/vega-table/slimmers/renderers/vega-table-pinned-renderer.js +207 -7
  228. package/dist/collection/components/vega-table/slimmers/renderers/vega-table-row-renderer.js +16 -3
  229. package/dist/collection/components/vega-table/vega-table-cell/vega-table-cell.js +24 -4
  230. package/dist/collection/components/vega-table/vega-table-expand-row/slimmers/controllers/vega-table-expand-row-col-span-controller.js +11 -2
  231. package/dist/collection/components/vega-table/vega-table-foot-cell/slimmers/renderers/vega-table-foot-cell-renderer.js +5 -1
  232. package/dist/collection/components/vega-table/vega-table-foot-cell/vega-table-foot-cell.js +22 -1
  233. package/dist/collection/components/vega-table/vega-table.css +5 -0
  234. package/dist/collection/components/vega-table/vega-table.js +5 -0
  235. package/dist/collection/components/vega-text/vega-text.js +1 -1
  236. package/dist/collection/components/vega-textarea/vega-textarea.js +2 -4
  237. package/dist/collection/components/vega-time-picker/slimmers/controllers/vega-time-picker-range-dropdown-controller.js +4 -0
  238. package/dist/collection/components/vega-time-picker/slimmers/controllers/vega-time-picker-single-dropdown-controller.js +4 -0
  239. package/dist/collection/components/vega-time-picker/vega-time-picker.js +39 -0
  240. package/dist/collection/constants/ui.js +1 -0
  241. package/dist/collection/global/scripts/before-vega-load.js +12 -0
  242. package/dist/collection/helpers/event-manager/event-id/component-event-id-map.js +2 -1
  243. package/dist/collection/helpers/event-manager/event-id/vega-event-id.js +1 -0
  244. package/dist/collection/helpers/slimmers/element-appender/element-appender-slimmer.js +11 -4
  245. package/dist/collection/helpers/translation/locales/en.js +18 -0
  246. package/dist/collection/helpers/ui/element-appender.js +5 -2
  247. package/dist/esm/{app-globals-6041f52f.js → app-globals-9950d055.js} +17 -10
  248. package/dist/esm/{aria-dialog-focusable-trap-slimmer-1332c071.js → aria-dialog-focusable-trap-slimmer-9eae86c6.js} +1 -1
  249. package/dist/esm/{child-nodes-event-prevent-slimmer-50022584.js → child-nodes-event-prevent-slimmer-96c14f5a.js} +2 -2
  250. package/dist/esm/{code-block-37294847.js → code-block-ae2337c2.js} +65 -13
  251. package/dist/esm/{component-value-history-controller-slimmer.abstract-45ccddc9.js → component-value-history-controller-slimmer.abstract-b1ee1b8e.js} +73 -40
  252. package/dist/esm/{content-state-67950b80.js → content-state-c3b85ae6.js} +92 -9
  253. package/dist/esm/copy-54e45e2d.js +5 -0
  254. package/dist/esm/{date-required-rule-958cf380.js → date-required-rule-e06115f8.js} +1 -1
  255. package/dist/esm/{design-token-e7e78f18.js → design-token-4e682056.js} +3 -3
  256. package/dist/esm/{element-appender-slimmer-ebda526d.js → element-appender-slimmer-a4485ef6.js} +19 -10
  257. package/dist/esm/{event-emit-slimmer-b94cec83.js → event-emit-slimmer-db4a82e0.js} +1 -1
  258. package/dist/esm/{file-uploader-required-rule-82188a61.js → file-uploader-required-rule-96952e1a.js} +1 -1
  259. package/dist/esm/{form-field-controller-slimmer-0a2ba886.js → form-field-controller-slimmer-a1c7b28c.js} +3 -3
  260. package/dist/esm/{image-annotation-action-7f7a5678.js → image-annotation-action-4c77d314.js} +3 -3
  261. package/dist/esm/image-extension-7108c27d.js +37 -0
  262. package/dist/esm/index-090d31ca.js +4 -0
  263. package/dist/esm/index.js +24 -23
  264. package/dist/esm/{inject-keyboard-manager-2b19c121.js → inject-keyboard-manager-e8ddb78d.js} +1 -1
  265. package/dist/esm/{internal-calendar-period-factory-fff8aaee.js → internal-calendar-period-factory-6f19d767.js} +1 -1
  266. package/dist/esm/{internal-translation-controller-aa09ca87.js → internal-translation-controller-09b8bd13.js} +18 -0
  267. package/dist/esm/{internal-vega-event-manager-956cf128.js → internal-vega-event-manager-48690e5b.js} +2 -1
  268. package/dist/esm/{keyboard-manager-3e5b157f.js → keyboard-manager-ec18721b.js} +1 -1
  269. package/dist/esm/{keyboard-manager-slimmer-ba5cc767.js → keyboard-manager-slimmer-531ddb0e.js} +1 -1
  270. package/dist/esm/{link-extension-afb404fb.js → link-extension-74eaa826.js} +3 -3
  271. package/dist/esm/loader.js +18 -16
  272. package/dist/esm/{month-view-generator-7a0c869c.js → month-view-generator-afd78ff8.js} +1 -1
  273. package/dist/esm/{public-rules-f64b0b78.js → public-rules-5fce32a5.js} +11 -11
  274. package/dist/esm/{range-4d09a305.js → range-8f877dbf.js} +25 -3
  275. package/dist/esm/{replace-selected-text-action-12bc8b82.js → replace-selected-text-action-c9278a0f.js} +1 -1
  276. package/dist/esm/{required-field-rule-a4634842.js → required-field-rule-897fe8d1.js} +1 -1
  277. package/dist/esm/{responsive-format-facade-844c5e09.js → responsive-format-facade-299e6304.js} +2 -2
  278. package/dist/esm/{rich-text-editor-required-rule-d62d418e.js → rich-text-editor-required-rule-3047bab0.js} +1 -1
  279. package/dist/esm/{split-cell-operation-c515669e.js → split-cell-operation-98d58410.js} +3 -3
  280. package/dist/esm/{state-border-formatter-f53847a5.js → state-border-formatter-da52b626.js} +1 -1
  281. package/dist/esm/{string-format-strategy.abstract-a0327405.js → string-format-strategy.abstract-a45b5ff7.js} +1 -1
  282. package/dist/esm/{string-input-formatter-slimmer-12de4a25.js → string-input-formatter-slimmer-4a032fed.js} +3 -3
  283. package/dist/esm/{string-mask-strategy-3bb03155.js → string-mask-strategy-37e53e48.js} +2 -2
  284. package/dist/esm/{style-formatter-df7bf8ec.js → style-formatter-3d5ddfb1.js} +2 -2
  285. package/dist/esm/{sub-state-notify-slimmer-7ef94141.js → sub-state-notify-slimmer-0f72ce74.js} +1 -1
  286. package/dist/esm/{sub-state-observer-slimmer-d9ad2bdd.js → sub-state-observer-slimmer-64532d94.js} +1 -1
  287. package/dist/esm/{time-required-rule-db0dee53.js → time-required-rule-355b73d2.js} +1 -1
  288. package/dist/esm/{token-extension-8ff92d14.js → token-extension-ecfafe94.js} +3618 -745
  289. package/dist/esm/{translation-slimmer-4904e7fe.js → translation-slimmer-3ea56354.js} +1 -1
  290. package/dist/esm/{type-guard-a2cbaae9.js → type-guard-2bfb2c7b.js} +1 -1
  291. package/dist/esm/{valid-credit-card-number-rule-a3f9858d.js → valid-credit-card-number-rule-52c6b029.js} +1 -1
  292. package/dist/esm/vega-accordion.entry.js +21 -13
  293. package/dist/esm/vega-app-footer.entry.js +3 -3
  294. package/dist/esm/vega-app-header-button.entry.js +10 -10
  295. package/dist/esm/vega-banner.entry.js +5 -8
  296. package/dist/esm/vega-box.entry.js +7 -7
  297. package/dist/esm/vega-breadcrumb.entry.js +5 -5
  298. package/dist/esm/vega-button-circle.entry.js +11 -11
  299. package/dist/esm/vega-button-group_2.entry.js +8 -8
  300. package/dist/esm/vega-button-link.entry.js +5 -5
  301. package/dist/esm/vega-button.entry.js +9 -9
  302. package/dist/esm/vega-calendar_5.entry.js +15 -15
  303. package/dist/esm/vega-card.entry.js +6 -6
  304. package/dist/esm/vega-carousel.entry.js +7 -7
  305. package/dist/esm/vega-checkbox_2.entry.js +10 -10
  306. package/dist/esm/vega-chip.entry.js +10 -10
  307. package/dist/esm/vega-code-block.entry.js +15 -18
  308. package/dist/esm/vega-color-picker.entry.js +9 -9
  309. package/dist/esm/vega-color-swatch-picker.entry.js +11 -11
  310. package/dist/esm/vega-color-swatch.entry.js +5 -5
  311. package/dist/esm/vega-combo-box.entry.js +23 -17
  312. package/dist/esm/vega-date-picker_2.entry.js +22 -22
  313. package/dist/esm/vega-dialog_2.entry.js +23 -12
  314. package/dist/esm/vega-divider.entry.js +6 -6
  315. package/dist/esm/vega-dropdown_5.entry.js +700 -202
  316. package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
  317. package/dist/esm/{vega-event-id-268f8def.js → vega-event-id-270fe47e.js} +2 -1
  318. package/dist/esm/vega-field-label.entry.js +16 -12
  319. package/dist/esm/vega-file-uploader.entry.js +11 -11
  320. package/dist/esm/vega-flag-icon.entry.js +6 -6
  321. package/dist/esm/vega-flex.entry.js +7 -7
  322. package/dist/esm/vega-font.entry.js +6 -6
  323. package/dist/esm/vega-form.entry.js +11 -11
  324. package/dist/esm/vega-grid.entry.js +6 -6
  325. package/dist/esm/vega-icon.entry.js +6 -6
  326. package/dist/esm/vega-image-uploader.entry.js +13 -13
  327. package/dist/esm/vega-input-credit-card.entry.js +14 -14
  328. package/dist/esm/vega-input-numeric.entry.js +14 -14
  329. package/dist/esm/vega-input-passcode.entry.js +13 -13
  330. package/dist/esm/vega-input-phone-number.entry.js +11 -11
  331. package/dist/esm/vega-input-range.entry.js +10 -10
  332. package/dist/esm/vega-input-select.entry.js +13 -13
  333. package/dist/esm/vega-input.entry.js +15 -15
  334. package/dist/esm/{vega-internal-event-id-22151a4d.js → vega-internal-event-id-827eb1ce.js} +1 -1
  335. package/dist/esm/vega-item-toggle.entry.js +3 -3
  336. package/dist/esm/vega-left-nav_5.entry.js +14 -14
  337. package/dist/esm/vega-loader-wrapper_2.entry.js +4 -4
  338. package/dist/esm/vega-page-notification_2.entry.js +1 -1
  339. package/dist/esm/vega-pagination-page-selector-mobile.entry.js +5 -5
  340. package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +4 -4
  341. package/dist/esm/vega-pagination.entry.js +10 -10
  342. package/dist/esm/vega-popover_2.entry.js +14 -14
  343. package/dist/esm/vega-progress-tracker_2.entry.js +10 -10
  344. package/dist/esm/vega-radio_2.entry.js +13 -13
  345. package/dist/esm/vega-rich-text-content.entry.js +10 -10
  346. package/dist/esm/vega-rich-text-editor_4.entry.js +681 -99
  347. package/dist/esm/vega-rich-text-find-replace-panel.entry.js +229 -0
  348. package/dist/esm/vega-rich-text-special-characters-panel.entry.js +8 -8
  349. package/dist/esm/vega-rich-text-table-properties_3.entry.js +14 -14
  350. package/dist/esm/vega-segment-control.entry.js +3 -3
  351. package/dist/esm/vega-selection-chip_2.entry.js +13 -13
  352. package/dist/esm/vega-selection-tile_2.entry.js +11 -11
  353. package/dist/esm/vega-sidenav_3.entry.js +10 -10
  354. package/dist/esm/vega-signature-capture.entry.js +14 -14
  355. package/dist/esm/vega-stepper.entry.js +9 -9
  356. package/dist/esm/vega-tab-group_2.entry.js +5 -5
  357. package/dist/esm/vega-table_11.entry.js +915 -432
  358. package/dist/esm/vega-textarea.entry.js +11 -13
  359. package/dist/esm/vega-time-picker_2.entry.js +37 -17
  360. package/dist/esm/vega-toggle-switch.entry.js +7 -7
  361. package/dist/esm/vega-tooltip_2.entry.js +8 -8
  362. package/dist/esm/vega.js +18 -16
  363. package/dist/esm/{wait-for-component-did-render-0488922a.js → wait-for-component-did-render-0c237cb8.js} +1 -1
  364. package/dist/esm/xmark-large-c5ae7944.js +5 -0
  365. package/dist/sri/vega-sri-manifest.json +392 -376
  366. package/dist/types/components/vega-accordion/slimmers/vega-accordion-renderer.d.ts +2 -0
  367. package/dist/types/components/vega-combo-box/types.d.ts +6 -1
  368. package/dist/types/components/vega-combo-box/vega-combo-box.d.ts +1 -0
  369. package/dist/types/components/vega-dropdown/constants.d.ts +1 -0
  370. package/dist/types/components/vega-dropdown/slimmers/controllers/vega-dropdown-appender-controller.d.ts +2 -0
  371. package/dist/types/components/vega-dropdown/slimmers/controllers/vega-dropdown-children-controller.d.ts +36 -0
  372. package/dist/types/components/vega-dropdown/slimmers/controllers/vega-dropdown-select-all-controller.d.ts +107 -0
  373. package/dist/types/components/vega-dropdown/slimmers/controllers/vega-dropdown-selected-controller.d.ts +17 -0
  374. package/dist/types/components/vega-dropdown/slimmers/controllers/vega-dropdown-source-controller.d.ts +5 -0
  375. package/dist/types/components/vega-dropdown/slimmers/renderers/vega-dropdown-list-renderer.d.ts +2 -0
  376. package/dist/types/components/vega-dropdown/types.d.ts +8 -0
  377. package/dist/types/components/vega-dropdown/vega-dropdown-item/slimmers/controllers/vega-dropdown-item-state-controller.d.ts +25 -0
  378. package/dist/types/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.d.ts +1 -0
  379. package/dist/types/components/vega-dropdown/vega-dropdown-item/vega-dropdown-item.d.ts +4 -0
  380. package/dist/types/components/vega-dropdown/vega-dropdown.d.ts +48 -0
  381. package/dist/types/components/vega-field-label/slimmers/renderers/vega-field-label-suffix-element-renderer.d.ts +1 -0
  382. package/dist/types/components/vega-field-label/types.d.ts +12 -0
  383. package/dist/types/components/vega-modal/slimmers/renderers/vega-modal-renderer.d.ts +2 -1
  384. package/dist/types/components/vega-modal/vega-modal.d.ts +9 -1
  385. package/dist/types/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/block-merge-nodes-strategy.d.ts +9 -0
  386. package/dist/types/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/delete-selected-content-strategy.d.ts +13 -0
  387. package/dist/types/components/vega-rich-text-editor/dto/action-handle-strategies/modify-content-strategies/paste-content-strategy.d.ts +14 -4
  388. package/dist/types/components/vega-rich-text-editor/dto/actions/delete-selected-content-action.d.ts +12 -0
  389. package/dist/types/components/vega-rich-text-editor/dto/actions/modify-content-action.abstract.d.ts +2 -1
  390. package/dist/types/components/vega-rich-text-editor/dto/actions/paste-content-action.d.ts +7 -0
  391. package/dist/types/components/vega-rich-text-editor/dto/range.d.ts +16 -0
  392. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/action-handler-interceptors/blockquote-exit-on-enter-interceptor.d.ts +34 -0
  393. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/action-handler-strategies/block-transform-to-blockquote-strategy.d.ts +13 -0
  394. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/action-handler-strategies/remove-blockquote-strategy.d.ts +13 -0
  395. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/actions/remove-blockquote-action.d.ts +14 -0
  396. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/actions/transform-to-blockquote-action.d.ts +18 -0
  397. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/assets/quote-left.d.ts +3 -0
  398. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/blockquote-extension.d.ts +9 -0
  399. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/dto/blockquote-annotation.d.ts +48 -0
  400. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/dto/rte-blockquote-block.d.ts +56 -0
  401. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/element-to-dto-strategies/blockquote-to-blockquote-block-strategy.d.ts +35 -0
  402. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/filter-styles-strategies/blockquote-block/blockquote-filter-styles-strategy.d.ts +31 -0
  403. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/renderers/blockquote-block-renderer.d.ts +18 -0
  404. package/dist/types/components/vega-rich-text-editor/extensions/blockquote/renderers/blockquote-toolbar-button-renderer.d.ts +113 -0
  405. package/dist/types/components/vega-rich-text-editor/extensions/copy/action-handler-strategies/copy-selected-content-strategy.d.ts +79 -0
  406. package/dist/types/components/vega-rich-text-editor/extensions/copy/actions/copy-selected-content-action.d.ts +18 -0
  407. package/dist/types/components/vega-rich-text-editor/extensions/copy/copy-extension.d.ts +10 -0
  408. package/dist/types/components/vega-rich-text-editor/extensions/copy/copy-toolbar-button-renderer.d.ts +36 -0
  409. package/dist/types/components/vega-rich-text-editor/extensions/cut/cut-extension.d.ts +11 -0
  410. package/dist/types/components/vega-rich-text-editor/extensions/cut/cut-toolbar-button-renderer.d.ts +24 -0
  411. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/assets/find-and-replace.d.ts +3 -0
  412. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/find-replace-extension.d.ts +15 -0
  413. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/find-controller.d.ts +65 -0
  414. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/find-replace-controller.abstract.d.ts +65 -0
  415. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/block-search-strategy.abstract.d.ts +29 -0
  416. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/code-block-search-strategy.d.ts +17 -0
  417. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/container-block-search-strategy.d.ts +21 -0
  418. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/list-item-block-search-strategy.d.ts +21 -0
  419. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/block-search-strategies/text-block-search-strategy.d.ts +18 -0
  420. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/find-replace-highlight-manager.d.ts +88 -0
  421. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/helper/find-replace-state.d.ts +200 -0
  422. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/controllers/replace-controller.d.ts +73 -0
  423. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/slimmer/renderers/find-replace-toolbar-button-renderer.d.ts +64 -0
  424. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/vega-rich-text-find-replace-panel/slimmers/renderers/find-replace-panel-renderer.d.ts +28 -0
  425. package/dist/types/components/vega-rich-text-editor/extensions/find-replace/vega-rich-text-find-replace-panel/vega-rich-text-find-replace-panel.d.ts +56 -0
  426. package/dist/types/components/vega-rich-text-editor/extensions/functions/function-extension.d.ts +1 -0
  427. package/dist/types/components/vega-rich-text-editor/extensions/horizontal-line/horizontal-line-extension.d.ts +1 -0
  428. package/dist/types/components/vega-rich-text-editor/extensions/image/image-extension.d.ts +27 -0
  429. package/dist/types/components/vega-rich-text-editor/extensions/image/type.d.ts +13 -0
  430. package/dist/types/components/vega-rich-text-editor/extensions/languages/language-extension.d.ts +1 -0
  431. package/dist/types/components/vega-rich-text-editor/extensions/line-height/line-height-extension.d.ts +1 -0
  432. package/dist/types/components/vega-rich-text-editor/extensions/paste/assets/paste.d.ts +3 -0
  433. package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-chooser-ui.d.ts +58 -0
  434. package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-constants.d.ts +6 -0
  435. package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-extension.d.ts +150 -0
  436. package/dist/types/components/vega-rich-text-editor/extensions/special-characters/special-characters-extension.d.ts +1 -0
  437. package/dist/types/components/vega-rich-text-editor/extensions/table/table-extension.d.ts +1 -0
  438. package/dist/types/components/vega-rich-text-editor/extensions/tokens/token-extension.d.ts +1 -0
  439. package/dist/types/components/vega-rich-text-editor/helpers/utils.d.ts +7 -0
  440. package/dist/types/components/vega-rich-text-editor/public-api.d.ts +7 -0
  441. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/abstract-delete-content-handler.d.ts +60 -0
  442. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/backward-delete-content-handler.d.ts +8 -0
  443. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/forward-delete-content-handler.d.ts +8 -0
  444. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/insert-paste-handler.d.ts +114 -3
  445. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/selection-controller.d.ts +22 -13
  446. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/user-input-controller.d.ts +2 -1
  447. package/dist/types/components/vega-rich-text-editor/slimmers/renderers/tools/image-toolbar-button-slimmer.d.ts +10 -2
  448. package/dist/types/components/vega-rich-text-editor/vega-rich-text-editor-toolbar-button/slimmers/renderers/vega-rich-text-editor-toolbar-button-renderer.d.ts +1 -0
  449. package/dist/types/components/vega-rich-text-editor/vega-rich-text-editor-toolbar-button/vega-rich-text-editor-toolbar-button.d.ts +6 -0
  450. package/dist/types/components/vega-rich-text-editor/vega-rich-text-editor.d.ts +4 -4
  451. package/dist/types/components/vega-rich-text-editor/vega-rich-text-image-editor/vega-rich-text-image-editor.d.ts +1 -1
  452. package/dist/types/components/vega-rich-text-editor/vega-rich-text-link-editor/vega-rich-text-link-editor.d.ts +1 -1
  453. package/dist/types/components/vega-table/interface.d.ts +18 -0
  454. package/dist/types/components/vega-table/slimmers/controllers/dto/column-render-input-model.d.ts +13 -0
  455. package/dist/types/components/vega-table/slimmers/controllers/vega-table-body-col-span-controller.d.ts +43 -0
  456. package/dist/types/components/vega-table/slimmers/renderers/vega-table-body-col-span-resolver.d.ts +38 -0
  457. package/dist/types/components/vega-table/slimmers/renderers/vega-table-cell-renderer.d.ts +11 -2
  458. package/dist/types/components/vega-table/slimmers/renderers/vega-table-pinned-renderer.d.ts +4 -0
  459. package/dist/types/components/vega-table/slimmers/renderers/vega-table-row-renderer.d.ts +1 -0
  460. package/dist/types/components/vega-table/vega-table-cell/slimmers/controllers/vega-table-row-state-subscriber.d.ts +1 -1
  461. package/dist/types/components/vega-table/vega-table-cell/vega-table-cell.d.ts +9 -0
  462. package/dist/types/components/vega-table/vega-table-foot-cell/slimmers/renderers/vega-table-foot-cell-renderer.d.ts +1 -0
  463. package/dist/types/components/vega-table/vega-table-foot-cell/vega-table-foot-cell.d.ts +9 -0
  464. package/dist/types/components/vega-table/vega-table.d.ts +2 -0
  465. package/dist/types/components/vega-time-picker/slimmers/controllers/vega-time-picker-range-dropdown-controller.d.ts +1 -0
  466. package/dist/types/components/vega-time-picker/slimmers/controllers/vega-time-picker-single-dropdown-controller.d.ts +1 -0
  467. package/dist/types/components/vega-time-picker/types.d.ts +7 -0
  468. package/dist/types/components/vega-time-picker/vega-time-picker.d.ts +11 -1
  469. package/dist/types/components.d.ts +114 -3
  470. package/dist/types/constants/ui.d.ts +1 -1
  471. package/dist/types/global/icons/copy.d.ts +3 -0
  472. package/dist/types/helpers/event-manager/event-id/vega-event-id.d.ts +1 -0
  473. package/dist/types/helpers/translation/interface.d.ts +20 -1
  474. package/dist/types/helpers/ui/element-appender.d.ts +4 -1
  475. package/dist/types/types/components.type.d.ts +5 -1
  476. package/dist/types/types/ui.type.d.ts +1 -1
  477. package/dist/vega/index.esm.js +1 -1
  478. package/dist/vega/{p-94845302.entry.js → p-05f937c5.entry.js} +1 -1
  479. package/dist/vega/p-07562b9c.js +1 -0
  480. package/dist/vega/p-09d50f59.entry.js +1 -0
  481. package/dist/vega/{p-cc8bf6e7.entry.js → p-0cb78838.entry.js} +1 -1
  482. package/dist/vega/p-0e607b44.js +1 -0
  483. package/dist/vega/{p-1acd5f04.entry.js → p-0f1d6ceb.entry.js} +1 -1
  484. package/dist/vega/{p-ef44d516.js → p-140616fe.js} +1 -1
  485. package/dist/vega/{p-e75e75c9.entry.js → p-1818f399.entry.js} +1 -1
  486. package/dist/vega/{p-4037126d.js → p-18a5e8bc.js} +1 -1
  487. package/dist/vega/{p-2b22091e.js → p-19c42e30.js} +1 -1
  488. package/dist/vega/{p-c87c7ef4.js → p-1efab41b.js} +1 -1
  489. package/dist/vega/{p-cd2a1ffb.js → p-21e21f51.js} +1 -1
  490. package/dist/vega/{p-4644ccf9.entry.js → p-26c7fe8b.entry.js} +1 -1
  491. package/dist/vega/p-282b37cb.js +1 -0
  492. package/dist/vega/p-29e3eb12.js +1 -0
  493. package/dist/vega/{p-6ecb3c7d.entry.js → p-2dc5edd0.entry.js} +1 -1
  494. package/dist/vega/{p-014e2cf9.js → p-2de61f1b.js} +1 -1
  495. package/dist/vega/{p-b77e85e0.entry.js → p-2de88b4a.entry.js} +1 -1
  496. package/dist/vega/{p-12b5c5e3.entry.js → p-2fcc604c.entry.js} +1 -1
  497. package/dist/vega/{p-73b9868f.js → p-32a67ba1.js} +1 -1
  498. package/dist/vega/p-392e049c.entry.js +1 -0
  499. package/dist/vega/{p-70352240.entry.js → p-3932f964.entry.js} +1 -1
  500. package/dist/vega/{p-5ffc7cb8.js → p-3a68b729.js} +1 -1
  501. package/dist/vega/{p-9e327397.entry.js → p-3c9da3cd.entry.js} +1 -1
  502. package/dist/vega/{p-4cef4812.js → p-3f183b52.js} +1 -1
  503. package/dist/vega/{p-216ef41e.entry.js → p-3f7b10b9.entry.js} +1 -1
  504. package/dist/vega/{p-64b5fe2a.entry.js → p-422d88ae.entry.js} +1 -1
  505. package/dist/vega/p-4256252c.js +3 -0
  506. package/dist/vega/{p-329c808e.entry.js → p-44439ecc.entry.js} +1 -1
  507. package/dist/vega/p-45e8424a.entry.js +1 -0
  508. package/dist/vega/p-4c49b2e3.js +1 -0
  509. package/dist/vega/{p-a14d8767.js → p-4d9562bc.js} +1 -1
  510. package/dist/vega/p-4e1aa86f.js +1 -0
  511. package/dist/vega/p-4ef5c4a7.entry.js +1 -0
  512. package/dist/vega/{p-7f086e54.entry.js → p-4f327808.entry.js} +1 -1
  513. package/dist/vega/{p-8019c156.js → p-5139e516.js} +1 -1
  514. package/dist/vega/{p-5bed3fd2.entry.js → p-56c4e349.entry.js} +1 -1
  515. package/dist/vega/{p-fea33425.js → p-5dbfffcd.js} +1 -1
  516. package/dist/vega/p-5f377954.js +1 -1
  517. package/dist/vega/p-615a2b8c.entry.js +1 -0
  518. package/dist/vega/{p-aaa6e976.entry.js → p-63101cb4.entry.js} +1 -1
  519. package/dist/vega/{p-a4826f3f.entry.js → p-653a6dd8.entry.js} +1 -1
  520. package/dist/vega/{p-044496e0.entry.js → p-66b7d1c7.entry.js} +1 -1
  521. package/dist/vega/{p-42a1d300.entry.js → p-6712a9c7.entry.js} +1 -1
  522. package/dist/vega/p-698fbd73.js +1 -0
  523. package/dist/vega/p-6ad7144a.entry.js +1 -0
  524. package/dist/vega/{p-6e7c1b19.entry.js → p-6b1893f6.entry.js} +1 -1
  525. package/dist/vega/{p-cec8ffdc.js → p-6d40635e.js} +1 -1
  526. package/dist/vega/{p-81591449.entry.js → p-73fd18d9.entry.js} +1 -1
  527. package/dist/vega/p-751a5cd6.entry.js +1 -0
  528. package/dist/vega/{p-42f3c0b1.entry.js → p-7b93a756.entry.js} +1 -1
  529. package/dist/vega/p-7c8e579e.entry.js +1 -0
  530. package/dist/vega/{p-0707aa21.js → p-7d54e9c1.js} +1 -1
  531. package/dist/vega/p-832d1a72.entry.js +1 -0
  532. package/dist/vega/p-846b1ab9.entry.js +1 -0
  533. package/dist/vega/p-88863658.js +1 -0
  534. package/dist/vega/p-88a6c89a.js +1 -0
  535. package/dist/vega/p-890a5254.js +1 -0
  536. package/dist/vega/{p-14bfc113.js → p-8bc15ed0.js} +1 -1
  537. package/dist/vega/{p-50d7a1c4.entry.js → p-8c1a5fa4.entry.js} +1 -1
  538. package/dist/vega/p-8d27b9cc.js +1 -0
  539. package/dist/vega/{p-3863187f.entry.js → p-944b43ce.entry.js} +1 -1
  540. package/dist/vega/{p-aea912ac.js → p-95d6c85f.js} +1 -1
  541. package/dist/vega/{p-da067259.entry.js → p-99b699be.entry.js} +1 -1
  542. package/dist/vega/{p-d00b3910.js → p-9a01be93.js} +1 -1
  543. package/dist/vega/p-9a472a04.entry.js +1 -0
  544. package/dist/vega/{p-e9a82603.entry.js → p-9cafbc26.entry.js} +1 -1
  545. package/dist/vega/{p-cd21adb8.js → p-a2bd621e.js} +1 -1
  546. package/dist/vega/{p-5a4e598f.js → p-a359e53c.js} +1 -1
  547. package/dist/vega/p-a9a87b9a.js +1 -0
  548. package/dist/vega/p-acbba6da.entry.js +1 -0
  549. package/dist/vega/{p-c75872a4.entry.js → p-ad35dea4.entry.js} +1 -1
  550. package/dist/vega/{p-8bc23bcf.entry.js → p-af98539f.entry.js} +1 -1
  551. package/dist/vega/{p-141f74ff.js → p-afb96938.js} +1 -1
  552. package/dist/vega/{p-6820b488.entry.js → p-b042e3b4.entry.js} +1 -1
  553. package/dist/vega/{p-822f70b0.js → p-b1ff70bf.js} +1 -1
  554. package/dist/vega/{p-c65a5778.entry.js → p-b39d4a88.entry.js} +1 -1
  555. package/dist/vega/{p-5df53125.entry.js → p-b5bee669.entry.js} +1 -1
  556. package/dist/vega/p-b5f308ee.entry.js +1 -0
  557. package/dist/vega/p-b6225d01.js +1 -0
  558. package/dist/vega/{p-8982796b.entry.js → p-bbabb1c8.entry.js} +1 -1
  559. package/dist/vega/p-bbf1f988.entry.js +1 -0
  560. package/dist/vega/{p-5fcb825c.entry.js → p-c2d28797.entry.js} +1 -1
  561. package/dist/vega/{p-42ed76ee.entry.js → p-c3c0e415.entry.js} +1 -1
  562. package/dist/vega/{p-5e282e41.js → p-c553d37e.js} +1 -1
  563. package/dist/vega/{p-2f48162f.entry.js → p-c5ecbc53.entry.js} +1 -1
  564. package/dist/vega/p-c9c6daa6.entry.js +1 -0
  565. package/dist/vega/p-cb81fc2a.entry.js +1 -0
  566. package/dist/vega/p-ccb9bf86.js +1 -0
  567. package/dist/vega/{p-49b4ab2b.js → p-ccf7518b.js} +1 -1
  568. package/dist/vega/{p-da2b1fd0.entry.js → p-cf8d5b3f.entry.js} +1 -1
  569. package/dist/vega/{p-bb0040d4.entry.js → p-d3a36d19.entry.js} +1 -1
  570. package/dist/vega/{p-ce27c273.entry.js → p-d44943e2.entry.js} +1 -1
  571. package/dist/vega/{p-ae728041.entry.js → p-d4bb6f93.entry.js} +1 -1
  572. package/dist/vega/p-d62b85ff.entry.js +1 -0
  573. package/dist/vega/p-d7f32ccf.entry.js +1 -0
  574. package/dist/vega/{p-d0060bdb.js → p-dca3278f.js} +1 -1
  575. package/dist/vega/{p-15da9d58.entry.js → p-ddd28a8e.entry.js} +1 -1
  576. package/dist/vega/p-ddf03de1.entry.js +1 -0
  577. package/dist/vega/{p-21775cc7.js → p-e0ecafca.js} +1 -1
  578. package/dist/vega/p-e33e1e90.js +1 -0
  579. package/dist/vega/{p-316a1e5c.entry.js → p-e410c4ad.entry.js} +1 -1
  580. package/dist/vega/p-e4309574.js +1 -0
  581. package/dist/vega/p-e5187a86.entry.js +1 -0
  582. package/dist/vega/{p-335e3237.entry.js → p-e86c6802.entry.js} +1 -1
  583. package/dist/vega/{p-4979fd7d.js → p-ef605271.js} +1 -1
  584. package/dist/vega/{p-0e03daa6.js → p-f0d4c78c.js} +1 -1
  585. package/dist/vega/p-f2f22b5d.entry.js +1 -0
  586. package/dist/vega/{p-58a00869.entry.js → p-f8a29127.entry.js} +1 -1
  587. package/dist/vega/{p-a04b95aa.entry.js → p-fbd3be00.entry.js} +1 -1
  588. package/dist/vega/p-fd70418f.js +1 -0
  589. package/dist/vega/{p-9756c6b9.entry.js → p-fda6e2cc.entry.js} +1 -1
  590. package/dist/vega/p-ff8dd200.js +1 -0
  591. package/dist/vega/{p-522dd15f.entry.js → p-ffdacaf9.entry.js} +1 -1
  592. package/dist/vega/vega.esm.js +1 -1
  593. package/package.json +2 -16
  594. package/readme.md +0 -5
  595. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/delete-content-handler.js +0 -92
  596. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/delete-content-handler.d.ts +0 -26
  597. package/dist/vega/p-0605c656.entry.js +0 -1
  598. package/dist/vega/p-144d4b30.js +0 -1
  599. package/dist/vega/p-2944c76e.entry.js +0 -1
  600. package/dist/vega/p-3372f34a.entry.js +0 -1
  601. package/dist/vega/p-3cf298a4.entry.js +0 -1
  602. package/dist/vega/p-3fe43f7a.entry.js +0 -1
  603. package/dist/vega/p-507612f6.entry.js +0 -1
  604. package/dist/vega/p-53ed3b1f.js +0 -1
  605. package/dist/vega/p-57f7c257.js +0 -1
  606. package/dist/vega/p-5e1cd1cc.js +0 -1
  607. package/dist/vega/p-5e1ec2b8.entry.js +0 -1
  608. package/dist/vega/p-61d42e9b.entry.js +0 -1
  609. package/dist/vega/p-63ae5ada.entry.js +0 -1
  610. package/dist/vega/p-66905cbf.js +0 -1
  611. package/dist/vega/p-689070f9.entry.js +0 -1
  612. package/dist/vega/p-74fa0f5b.entry.js +0 -1
  613. package/dist/vega/p-7bb39b97.js +0 -1
  614. package/dist/vega/p-7f139b74.js +0 -1
  615. package/dist/vega/p-85d78ac1.js +0 -1
  616. package/dist/vega/p-92a144bc.js +0 -1
  617. package/dist/vega/p-9f608b97.js +0 -1
  618. package/dist/vega/p-aca134a3.entry.js +0 -1
  619. package/dist/vega/p-b2f89dbd.js +0 -1
  620. package/dist/vega/p-b2f9698a.entry.js +0 -1
  621. package/dist/vega/p-b504a8b4.entry.js +0 -1
  622. package/dist/vega/p-b7b0930a.entry.js +0 -1
  623. package/dist/vega/p-bd94b904.entry.js +0 -1
  624. package/dist/vega/p-c0c2a917.js +0 -3
  625. package/dist/vega/p-c40555c4.entry.js +0 -1
  626. package/dist/vega/p-cb4033ef.js +0 -1
  627. package/dist/vega/p-d14ddf80.js +0 -1
  628. package/dist/vega/p-dc78e8d6.js +0 -1
  629. package/dist/vega/p-ddc2d219.js +0 -1
  630. package/dist/vega/p-f362c07b.entry.js +0 -1
  631. package/dist/vega/p-fb1ef3e6.entry.js +0 -1
  632. package/dist/vega/p-fc103347.entry.js +0 -1
  633. /package/dist/cjs/{feature-flag-controller-438a1510.js → feature-flag-controller-c19d0b58.js} +0 -0
  634. /package/dist/collection/{components/vega-code-block/assets → global/icons}/copy.js +0 -0
  635. /package/dist/esm/{feature-flag-controller-2a89f20c.js → feature-flag-controller-3fd04ea9.js} +0 -0
  636. /package/dist/types/components/{vega-code-block/assets/copy.d.ts → vega-rich-text-editor/assets/cut.d.ts} +0 -0
  637. /package/dist/vega/{p-bc73ce30.js → p-87a4d75f.js} +0 -0
@@ -14,9 +14,9 @@ const ui = require('./ui-c91c37a7.js');
14
14
  const domNodeSubjectObserverFactory = require('./dom-node-subject-observer-factory-c82df135.js');
15
15
  const remoteInvocationRegistry = require('./remote-invocation-registry-fc22fdd0.js');
16
16
  const vegaInternalEventId = require('./vega-internal-event-id-ecc5b87a.js');
17
- const vegaEventId = require('./vega-event-id-df22d80e.js');
18
- const responsiveFormatFacade = require('./responsive-format-facade-10ff730e.js');
19
- const typeGuard = require('./type-guard-0171e779.js');
17
+ const vegaEventId = require('./vega-event-id-58afed7a.js');
18
+ const responsiveFormatFacade = require('./responsive-format-facade-1af54330.js');
19
+ const typeGuard = require('./type-guard-1c3770d4.js');
20
20
  const component = require('./component-1e352960.js');
21
21
  const misc = require('./misc-3d30df91.js');
22
22
  const breakpoints = require('./breakpoints-1cc2c4c6.js');
@@ -24,15 +24,15 @@ const mutationObserverSlimmer = require('./mutation-observer-slimmer-749d5020.js
24
24
  const mutationObserverFilters = require('./mutation-observer-filters-38cebc6d.js');
25
25
  const pageResizeObserverSlimmer = require('./page-resize-observer-slimmer-273d62ef.js');
26
26
  const subStateNotifySlimmer = require('./sub-state-notify-slimmer-18891389.js');
27
- const childNodesEventPreventSlimmer = require('./child-nodes-event-prevent-slimmer-76d19d56.js');
28
- const eventEmitSlimmer = require('./event-emit-slimmer-5bab10c2.js');
27
+ const childNodesEventPreventSlimmer = require('./child-nodes-event-prevent-slimmer-e67ee84c.js');
28
+ const eventEmitSlimmer = require('./event-emit-slimmer-d234a619.js');
29
29
  const immutableMap = require('./immutable-map-d711339d.js');
30
- const translationSlimmer = require('./translation-slimmer-2af6f141.js');
30
+ const translationSlimmer = require('./translation-slimmer-7fb6e94c.js');
31
31
  const synchronizeTaskQueue = require('./synchronize-task-queue-1ee80e94.js');
32
32
  const dynamicSlimmer = require('./dynamic-slimmer-f31fdfd7.js');
33
33
  const internalVegaZIndexManager = require('./internal-vega-z-index-manager-f03ddb37.js');
34
34
  const subStateObserverSlimmer = require('./sub-state-observer-slimmer-eee2f0ae.js');
35
- const featureFlagController = require('./feature-flag-controller-438a1510.js');
35
+ const featureFlagController = require('./feature-flag-controller-c19d0b58.js');
36
36
  const breakpoints$1 = require('./breakpoints-ebde4837.js');
37
37
  const accessibility = require('./accessibility-88f8af84.js');
38
38
  const internalIconManager = require('./internal-icon-manager-40bcac72.js');
@@ -43,9 +43,9 @@ require('./number-4816603d.js');
43
43
  require('./pixel-98f2a10c.js');
44
44
  require('./array-249289f2.js');
45
45
  require('./typography-3ea4fe41.js');
46
- require('./internal-translation-controller-5905469e.js');
46
+ require('./internal-translation-controller-31f2b057.js');
47
47
  require('./try-get-document-c0ebd39a.js');
48
- require('./internal-vega-event-manager-7196a847.js');
48
+ require('./internal-vega-event-manager-13c4012b.js');
49
49
  require('./vega-env-manager-23b8b23c.js');
50
50
  require('./index-3ca118c4.js');
51
51
  require('./icon-manager-be358b32.js');
@@ -161,7 +161,256 @@ const VegaTableEditableFieldTypes = [
161
161
  'time-picker',
162
162
  ];
163
163
 
164
- var __decorate$U = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
164
+ /**
165
+ * ColumnRenderInputModel
166
+ *
167
+ * Render-time representation of a column or group node used by header/body renderers.
168
+ * Built from a ColumnStructureModel tree, it carries computed layout metadata required
169
+ * for rendering and pinned/sticky calculations (colSpan, rowSpan, pinned boundaries, etc).
170
+ *
171
+ * Instances form a forest (root-level nodes in an array) that mirrors the structure model
172
+ * but contains additional render-specific properties and parent/child links for renderers.
173
+ */
174
+ class ColumnRenderInputModel {
175
+ /**
176
+ * Create a new render input node.
177
+ *
178
+ * @param {string} key - Unique key (matches ColumnStructureModel.key).
179
+ * @param {string} label - Optional display label (from structure model).
180
+ * @param {VegaTablePinnedType} pinned - Pinned type for this node ('left' | 'right' | null).
181
+ * @param {Nullable<number>} colSpan - Number of visual columns spanned by this node's subtree.
182
+ * @param {Nullable<number>} rowSpan - Number of header rows this node should span.
183
+ * @param {boolean} isViewStart - True when this node is the start of a visible view range.
184
+ * @param {boolean} isViewEnd - True when this node is the end of a visible view range.
185
+ * @param {boolean} isLeftEndPinned - True when node is last left-pinned sibling.
186
+ * @param {boolean} isRightStartPinned - True when node is first right-pinned sibling.
187
+ * @param {boolean} isNoPinnedEnd - True when node is last non-pinned sibling.
188
+ * @param {boolean} headHasGroupColumn - Header contains group columns (affects rowSpan).
189
+ * @param {boolean} headHasPinnedColumn - Header contains pinned columns.
190
+ * @param {number} headMaxDepth - Maximum header depth (number of header rows).
191
+ * @param {number} level - Level/index of this node within header rows (0-based).
192
+ * @param {number} columnIndex - Sequential leaf index (used for ordering).
193
+ * @param {Nullable<ColumnRenderInputModel>} parent - Parent render input node (null for root-level).
194
+ * @param {ColumnRenderInputModel[]} children - Child render input nodes.
195
+ */
196
+ constructor(key, label, pinned, colSpan, rowSpan, isViewStart, isViewEnd, isLeftEndPinned, isRightStartPinned, isNoPinnedEnd, headHasGroupColumn, headHasPinnedColumn, headMaxDepth, level, columnIndex, parent, children = []) {
197
+ this.key = key;
198
+ this.label = label;
199
+ this.pinned = pinned;
200
+ this.colSpan = colSpan;
201
+ this.rowSpan = rowSpan;
202
+ this.isViewStart = isViewStart;
203
+ this.isViewEnd = isViewEnd;
204
+ this.isLeftEndPinned = isLeftEndPinned;
205
+ this.isRightStartPinned = isRightStartPinned;
206
+ this.isNoPinnedEnd = isNoPinnedEnd;
207
+ this.headHasGroupColumn = headHasGroupColumn;
208
+ this.headHasPinnedColumn = headHasPinnedColumn;
209
+ this.headMaxDepth = headMaxDepth;
210
+ this.level = level;
211
+ this.columnIndex = columnIndex;
212
+ this.parent = parent;
213
+ this.children = children;
214
+ this.iteratorCacheMap = new Map();
215
+ this.leaves = [];
216
+ }
217
+ /**
218
+ * Build a forest of ColumnRenderInputModel nodes from a ColumnStructureModel root.
219
+ *
220
+ * @param {ColumnStructureModel} rootModel - Root ColumnStructureModel that supplies tree and level data.
221
+ * @returns {ColumnRenderInputModel[]} Array of root-level ColumnRenderInputModel nodes (the render forest).
222
+ */
223
+ static from(rootModel) {
224
+ const renderInputs = [];
225
+ const parentStack = [];
226
+ const maxLevel = rootModel.getMaxDepth();
227
+ const hasGroupColumn = rootModel.hasGroupColumn();
228
+ const hasPinnedColumn = rootModel.hasLeftPinnedColumn() || rootModel.hasRightPinnedColumn();
229
+ let columnIndex = 0;
230
+ // Iterate structure model (DFS by default) and construct render nodes.
231
+ rootModel.iterator().forEach((model) => {
232
+ const parent = model.level > 0 ? parentStack[model.level - 1] : null;
233
+ const isParentStart = hasGroupColumn && this.isParentStart(model);
234
+ const isParentEnd = hasGroupColumn && this.isParentEnd(model);
235
+ const renderInput = new ColumnRenderInputModel(model.key, model.label, parent ? parent.pinned : model.pinned, hasGroupColumn ? this.getColSpan(model) : null, hasGroupColumn ? (model.isLeaf() ? maxLevel - model.level : 1) : null, parent ? parent.isViewStart && isParentStart : isParentStart, parent ? parent.isViewEnd && isParentEnd : isParentEnd, parent
236
+ ? parent.isLeftEndPinned && isParentEnd
237
+ : hasPinnedColumn && this.isLeftEndPinned(model), parent
238
+ ? parent.isRightStartPinned && isParentStart
239
+ : hasPinnedColumn && this.isRightStartPinned(model), parent ? parent.isNoPinnedEnd && isParentEnd : hasPinnedColumn && this.isNoPinnedEnd(model), hasGroupColumn, hasPinnedColumn, maxLevel, model.level, columnIndex, parent);
240
+ // Attach to parent if present, otherwise add to root-level array.
241
+ parent ? parent.children.push(renderInput) : renderInputs.push(renderInput);
242
+ // Maintain parent stack keyed by level to allow next nodes to find their parent.
243
+ parentStack[model.level] = renderInput;
244
+ parentStack.length = model.level + 1;
245
+ // Increment leaf index when encountering a leaf structure node.
246
+ if (model.isLeaf())
247
+ columnIndex++;
248
+ });
249
+ return renderInputs;
250
+ }
251
+ /**
252
+ * Create a new render input that merges pinned-boundary flags from a set of spanned leaves.
253
+ *
254
+ * Used when a body cell with `colSpan > 1` consumes neighboring leaves. The spanning cell
255
+ * must inherit boundary indicators (`isLeftEndPinned`, `isRightStartPinned`, `isNoPinnedEnd`)
256
+ * from any consumed leaf that carries them, so the pinned-boundary visual (divider/shadow)
257
+ * remains visible on the spanning cell.
258
+ *
259
+ * @param {ColumnRenderInputModel} base - The render input of the originating (leftmost) leaf.
260
+ * @param {ColumnRenderInputModel[]} spannedLeaves - All leaves consumed by the span (including base).
261
+ * @returns {ColumnRenderInputModel} A new instance with OR-merged boundary flags.
262
+ */
263
+ static withMergedBoundaries(base, spannedLeaves) {
264
+ let isLeftEndPinned = base.isLeftEndPinned;
265
+ let isRightStartPinned = base.isRightStartPinned;
266
+ let isNoPinnedEnd = base.isNoPinnedEnd;
267
+ let isViewEnd = base.isViewEnd;
268
+ for (const leaf of spannedLeaves) {
269
+ isLeftEndPinned = isLeftEndPinned || leaf.isLeftEndPinned;
270
+ isRightStartPinned = isRightStartPinned || leaf.isRightStartPinned;
271
+ isNoPinnedEnd = isNoPinnedEnd || leaf.isNoPinnedEnd;
272
+ isViewEnd = isViewEnd || leaf.isViewEnd;
273
+ }
274
+ // Return the base unchanged when no flags were gained (common fast-path).
275
+ if (isLeftEndPinned === base.isLeftEndPinned &&
276
+ isRightStartPinned === base.isRightStartPinned &&
277
+ isNoPinnedEnd === base.isNoPinnedEnd &&
278
+ isViewEnd === base.isViewEnd) {
279
+ return base;
280
+ }
281
+ return new ColumnRenderInputModel(base.key, base.label, base.pinned, base.colSpan, base.rowSpan, base.isViewStart, isViewEnd, isLeftEndPinned, isRightStartPinned, isNoPinnedEnd, base.headHasGroupColumn, base.headHasPinnedColumn, base.headMaxDepth, base.level, base.columnIndex, base.parent, base.children);
282
+ }
283
+ /**
284
+ * True when the provided structure model is the last left-pinned sibling in its parent's children.
285
+ * Used to mark boundary nodes for left-pinned groups.
286
+ *
287
+ * @param {ColumnStructureModel} model - Structure model to check.
288
+ * @returns {boolean} True when model is the last left-pinned sibling.
289
+ */
290
+ static isLeftEndPinned(model) {
291
+ const siblings = model.parent
292
+ .getOrderedChildren()
293
+ .filter((child) => child.pinned === 'left');
294
+ return siblings[siblings.length - 1] === model;
295
+ }
296
+ /**
297
+ * True when the provided structure model is the first right-pinned sibling in its parent's children.
298
+ * Used to mark boundary nodes for right-pinned groups.
299
+ *
300
+ * @param {ColumnStructureModel} model - Structure model to check.
301
+ * @returns {boolean} True when model is the first right-pinned sibling.
302
+ */
303
+ static isRightStartPinned(model) {
304
+ const siblings = model.parent
305
+ .getOrderedChildren()
306
+ .filter((child) => child.pinned === 'right');
307
+ return siblings[0] === model;
308
+ }
309
+ /**
310
+ * True when the provided structure model is the last non-pinned sibling in its parent's children.
311
+ * Useful to handle the 'no-pinned-end' condition.
312
+ *
313
+ * @param {ColumnStructureModel} model - Structure model to check.
314
+ * @returns {boolean} True when model is the last non-pinned sibling.
315
+ */
316
+ static isNoPinnedEnd(model) {
317
+ const siblings = model.parent
318
+ .getOrderedChildren()
319
+ .filter((child) => !child.pinned);
320
+ return siblings[siblings.length - 1] === model;
321
+ }
322
+ /**
323
+ * True when the provided model is the first child of its parent.
324
+ *
325
+ * @param {ColumnStructureModel} model - Structure model to check.
326
+ * @returns {boolean} True when model is the first child.
327
+ */
328
+ static isParentStart(model) {
329
+ return model.parent.getOrderedChildren()[0] === model;
330
+ }
331
+ /**
332
+ * True when the provided model is the last child of its parent.
333
+ *
334
+ * @param {ColumnStructureModel} model - Structure model to check.
335
+ * @returns {boolean} True when model is the last child.
336
+ */
337
+ static isParentEnd(model) {
338
+ const parentChildren = model.parent.getOrderedChildren();
339
+ return parentChildren[parentChildren.length - 1] === model;
340
+ }
341
+ /**
342
+ * Compute a node's colSpan by iterating its subtree and counting the maximum number
343
+ * of nodes present at any single level (visual column span).
344
+ *
345
+ * @param {ColumnStructureModel} mode - ColumnStructureModel node to examine.
346
+ * @returns {number} Number of visual columns spanned by the node.
347
+ */
348
+ static getColSpan(mode) {
349
+ const children = mode.iterator();
350
+ const rowMap = {};
351
+ children.forEach((node) => {
352
+ rowMap[node.level] = (rowMap[node.level] || 0) + 1;
353
+ });
354
+ return Math.max(...Object.values(rowMap));
355
+ }
356
+ /**
357
+ * Return cached leaf render nodes for this subtree.
358
+ * Caches the result on first call and returns cached array on subsequent calls.
359
+ *
360
+ * @returns {ColumnRenderInputModel[]} Array of leaf render input nodes.
361
+ */
362
+ getLeaves() {
363
+ if (this.leaves.length > 0) {
364
+ return this.leaves;
365
+ }
366
+ const leaves = this.iterator().filter((model) => model.isLeaf());
367
+ this.leaves = leaves;
368
+ return leaves;
369
+ }
370
+ /**
371
+ * Generic iterator that supports traversal modes ('dfs' currently implemented).
372
+ *
373
+ * @param {IteratorMode} [mode='dfs'] - Iterator mode ('dfs' | 'bfs').
374
+ * @returns {ColumnRenderInputModel[]} Traversal-ordered array of nodes.
375
+ */
376
+ iterator(mode = 'dfs') {
377
+ if (mode === 'dfs') {
378
+ return this.dfsIterator();
379
+ }
380
+ // Future: implement BFS mode here.
381
+ return [];
382
+ }
383
+ /**
384
+ * Depth-first pre-order traversal of this node and its descendants.
385
+ * Caches the result for the 'dfs' mode to avoid repeated recursion.
386
+ *
387
+ * @returns {ColumnRenderInputModel[]} Array of nodes in DFS order (includes this node).
388
+ */
389
+ dfsIterator() {
390
+ if (this.iteratorCacheMap.has('dfs')) {
391
+ return this.iteratorCacheMap.get('dfs');
392
+ }
393
+ const localResult = [];
394
+ localResult.push(this);
395
+ if (this.children && this.children.length > 0) {
396
+ this.children.forEach((child) => {
397
+ localResult.push(...child.dfsIterator());
398
+ });
399
+ }
400
+ this.iteratorCacheMap.set('dfs', localResult);
401
+ return localResult;
402
+ }
403
+ /**
404
+ * True when this render node has no children (visual leaf).
405
+ *
406
+ * @returns {boolean} True when node is a leaf.
407
+ */
408
+ isLeaf() {
409
+ return !this.children || this.children.length === 0;
410
+ }
411
+ }
412
+
413
+ var __decorate$V = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
165
414
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
166
415
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
167
416
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
@@ -181,7 +430,7 @@ var __rest$1 = (undefined && undefined.__rest) || function (s, e) {
181
430
  class VegaTableCellRenderer extends globalSlimmerRegistry.VegaSlimmer {
182
431
  constructor() {
183
432
  super(...arguments);
184
- this.renderTableCellContent = (column, record, index$1) => {
433
+ this.renderTableCellContent = (column, record, index$1, isSpanning) => {
185
434
  var _a, _b;
186
435
  const value = object.getValueByPath(record, column.prop);
187
436
  const rowKey = this.vegaTableDataSourceController.getRecordKey(record);
@@ -190,13 +439,14 @@ class VegaTableCellRenderer extends globalSlimmerRegistry.VegaSlimmer {
190
439
  .find((item) => this.vegaTableDataSourceController.getRecordKey(item) === rowKey);
191
440
  const editing = this.vegaTableEditableController.isEditing(rowKey);
192
441
  const rowForm = this.vegaTableEditableController.getRowFormRefMap().get(rowKey);
193
- if (editing && rowForm && column.renderFormItem) {
442
+ // REQ-007: spanning cells are forced read-only — never render editable form items.
443
+ if (!isSpanning && editing && rowForm && column.renderFormItem) {
194
444
  return column.renderFormItem(index.h, column.prop ? value : rowKey, record, index$1, {
195
445
  rowForm,
196
446
  isNewRow,
197
447
  });
198
448
  }
199
- if (editing && rowForm && column.editable) {
449
+ if (!isSpanning && editing && rowForm && column.editable) {
200
450
  const formItemProps = (_a = column.formItemProps) === null || _a === void 0 ? void 0 : _a.call(column, rowForm, {
201
451
  record,
202
452
  index: index$1,
@@ -244,58 +494,277 @@ class VegaTableCellRenderer extends globalSlimmerRegistry.VegaSlimmer {
244
494
  new RegExp(VegaTableEditableFieldTypes.join('|'), 'i').test(tagName));
245
495
  };
246
496
  }
247
- render(renderInput, record, index$1) {
248
- const column = this.columns.find((column) => column.key === renderInput.key ||
249
- column.prop === renderInput.key ||
250
- column.label === renderInput.key);
497
+ render(renderInput, record, index$1, colSpanResult) {
498
+ var _a;
499
+ const column = this.vegaTableBodyColSpanController.findColumn(renderInput);
500
+ /* istanbul ignore next -- defensive: colSpanResult is always provided by the caller */
501
+ const htmlColspan = (_a = colSpanResult === null || colSpanResult === void 0 ? void 0 : colSpanResult.htmlColspan) !== null && _a !== void 0 ? _a : 1;
502
+ const isSpanning = htmlColspan > 1;
503
+ // When a cell spans, merge pinned-boundary flags from all consumed leaves so the spanning
504
+ // cell inherits boundary indicators (e.g. right-divider for pinned-end).
505
+ const effectiveRenderInput = isSpanning && colSpanResult
506
+ ? this.getMergedRenderInputForSpan(renderInput, colSpanResult)
507
+ : renderInput;
251
508
  if (column) {
252
509
  const rowKey = this.vegaTableDataSourceController.getRecordKey(record);
253
510
  const columnKey = `${rowKey}_${column.key || column.prop}`;
254
- return (index.h("vega-table-cell", { key: columnKey, textAlign: column.align, breakpoint: column.breakpoint, overflow: column.overflow, ref: (ref) => {
255
- this.vegaTableRenderInputController.addCellRenderInputMap(ref, renderInput);
256
- } }, this.renderTableCellContent(column, record, index$1)));
511
+ return (index.h("vega-table-cell", { key: columnKey, textAlign: column.align, breakpoint: column.breakpoint, overflow: column.overflow, colSpan: isSpanning ? htmlColspan : undefined, ref: (ref) => {
512
+ this.vegaTableRenderInputController.addCellRenderInputMap(ref, effectiveRenderInput);
513
+ } }, this.renderTableCellContent(column, record, index$1, isSpanning)));
257
514
  }
258
515
  else {
259
516
  return (index.h("vega-table-cell", { key: renderInput.key, ref: (ref) => {
260
- this.vegaTableRenderInputController.addCellRenderInputMap(ref, renderInput);
517
+ this.vegaTableRenderInputController.addCellRenderInputMap(ref, effectiveRenderInput);
261
518
  } }));
262
519
  }
263
520
  }
521
+ /**
522
+ * Build a render input with merged boundary flags from all leaves consumed by a body colSpan.
523
+ *
524
+ * @param {ColumnRenderInputModel} baseInput - The starting leaf's render input.
525
+ * @param {BodyColSpanResult} colSpanResult - The resolved span result (provides skipCount).
526
+ * @returns {ColumnRenderInputModel} A render input with OR-merged boundary flags.
527
+ */
528
+ getMergedRenderInputForSpan(baseInput, colSpanResult) {
529
+ const allLeaves = this.vegaTableRenderInputController.getLeafRenderInputs();
530
+ const startIndex = allLeaves.indexOf(baseInput);
531
+ /* istanbul ignore next -- defensive: baseInput should always be in the leaves array */
532
+ if (startIndex < 0)
533
+ return baseInput;
534
+ const spannedLeaves = allLeaves.slice(startIndex + 1, startIndex + 1 + colSpanResult.skipCount);
535
+ return ColumnRenderInputModel.withMergedBoundaries(baseInput, spannedLeaves);
536
+ }
264
537
  }
265
- __decorate$U([
538
+ __decorate$V([
266
539
  globalSlimmerRegistry.MapToComponentField()
267
540
  ], VegaTableCellRenderer.prototype, "rowKey", void 0);
268
- __decorate$U([
269
- globalSlimmerRegistry.MapToComponentField()
270
- ], VegaTableCellRenderer.prototype, "columns", void 0);
271
- __decorate$U([
541
+ __decorate$V([
272
542
  globalSlimmerRegistry.MapToComponentField()
273
543
  ], VegaTableCellRenderer.prototype, "vegaTableDataSourceController", void 0);
274
- __decorate$U([
544
+ __decorate$V([
275
545
  globalSlimmerRegistry.MapToComponentField()
276
546
  ], VegaTableCellRenderer.prototype, "vegaTableEditableController", void 0);
277
- __decorate$U([
547
+ __decorate$V([
278
548
  globalSlimmerRegistry.MapToComponentField()
279
549
  ], VegaTableCellRenderer.prototype, "vegaTableRenderInputController", void 0);
550
+ __decorate$V([
551
+ globalSlimmerRegistry.MapToComponentField()
552
+ ], VegaTableCellRenderer.prototype, "vegaTableBodyColSpanController", void 0);
280
553
 
281
- var __decorate$T = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
282
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
283
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
284
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
285
- return c > 3 && r && Object.defineProperty(target, key, r), r;
286
- };
554
+ const NO_SPAN = { htmlColspan: 1, skipCount: 0 };
287
555
  /**
288
- * The expand row controller of VegaTable
556
+ * Read the declared span for a column, resolving the function form against the row value.
557
+ * Returns 1 when the column declares no span (REQ-008: span < 2 means no spanning).
558
+ *
559
+ * @param {VegaTableColumnConfig} column - The column configuration to read the span from.
560
+ * @param {VegaTableDataSourceItem} record - The row data record (passed to the function form).
561
+ * @param {number} rowIndex - Zero-based index of the row in the current data set.
562
+ * @returns {number} The declared span (>= 1).
289
563
  */
290
- class VegaTableExpandRowController extends globalSlimmerRegistry.VegaSlimmer {
291
- constructor() {
292
- super(...arguments);
293
- /**
294
- * Toggle expandable row by rowKey
295
- *
296
- * @param {string} rowKey - The row key of the row
297
- */
298
- this.toggleExpandRow = (rowKey) => {
564
+ function getDeclaredSpan(column, record, rowIndex) {
565
+ const rawSpan = column === null || column === void 0 ? void 0 : column.colSpan;
566
+ if (rawSpan == null)
567
+ return 1;
568
+ if (typeof rawSpan !== 'function')
569
+ return normalizeSpan(rawSpan);
570
+ const value = column.prop ? object.getValueByPath(record, column.prop) : undefined;
571
+ return normalizeSpan(rawSpan(value, record, rowIndex));
572
+ }
573
+ /**
574
+ * Normalize a raw span value to a positive integer. Non-finite values (NaN/Infinity) and values
575
+ * below 1 collapse to 1 (no spanning); fractional values are floored so the resulting `colspan`
576
+ * attribute is always a valid integer string.
577
+ *
578
+ * @param {number} rawSpan - The raw span value declared by the column (numeric or function result).
579
+ * @returns {number} A positive integer span (>= 1).
580
+ */
581
+ function normalizeSpan(rawSpan) {
582
+ if (!Number.isFinite(rawSpan))
583
+ return 1;
584
+ const floored = Math.floor(rawSpan);
585
+ return floored >= 1 ? floored : 1;
586
+ }
587
+ /**
588
+ * Walk rightward from the starting leaf to find the widest legal span.
589
+ *
590
+ * Stops (and returns a clamp reason) when the span would either run past the end of the
591
+ * row or cross a pinned ↔ unpinned column boundary (which would break sticky positioning).
592
+ * Breakpoint-hidden columns are intentionally **not** a stop condition — the span mirrors
593
+ * across them (matching header group colSpan).
594
+ *
595
+ * @param {number} declared - The declared span requested by the column.
596
+ * @param {number} leafIndex - Index of the starting leaf in the flattened render-input array.
597
+ * @param {ColumnRenderInputModel[]} allLeaves - All leaf render inputs for the table (ordered).
598
+ * @returns {MaxSpan} The widest legal span plus the clamp reason (null when unconstrained).
599
+ */
600
+ function computeMaxSpan(declared, leafIndex, allLeaves) {
601
+ var _a, _b;
602
+ const startPinned = (_a = allLeaves[leafIndex]) === null || _a === void 0 ? void 0 : _a.pinned;
603
+ let span = 1;
604
+ for (let offset = 1; offset < declared; offset++) {
605
+ const nextLeaf = allLeaves[leafIndex + offset];
606
+ if (!nextLeaf) {
607
+ return {
608
+ span,
609
+ clampReason: `extends past the end of the row (${allLeaves.length} columns total)`,
610
+ };
611
+ }
612
+ // Reject if the next column is in a different pinned group.
613
+ if (nextLeaf.pinned !== startPinned) {
614
+ return {
615
+ span,
616
+ clampReason: `crosses a pinned-column boundary (pinned="${startPinned !== null && startPinned !== void 0 ? startPinned : 'none'}" → pinned="${(_b = nextLeaf.pinned) !== null && _b !== void 0 ? _b : 'none'}")`,
617
+ };
618
+ }
619
+ span++;
620
+ }
621
+ return { span, clampReason: null };
622
+ }
623
+ /**
624
+ * Emit a clamp warning at most once per column key (per-instance, tracked via {@link warnedKeys}).
625
+ *
626
+ * @param {string} colKey - The column key used to dedupe warnings.
627
+ * @param {number} declared - The originally declared span.
628
+ * @param {number} effective - The clamped (effective) span actually applied.
629
+ * @param {string} reason - Human-readable reason the span was clamped.
630
+ * @param {Set<string>} warnedKeys - Per-instance set tracking already-warned column keys.
631
+ */
632
+ function warnClampOnce(colKey, declared, effective, reason, warnedKeys) {
633
+ if (warnedKeys.has(colKey))
634
+ return;
635
+ warnedKeys.add(colKey);
636
+ globalSlimmerRegistry.LogUtility.warn(`[vega-table] colSpan for column "${colKey}" was clamped from ${declared} to ${effective} because it ${reason}.`);
637
+ }
638
+ /**
639
+ * Resolve the effective body-cell colspan for a single source-data row cell.
640
+ *
641
+ * Clamps the declared span so it never runs past the end of the row nor crosses a
642
+ * pinned ↔ unpinned column boundary. Structural clamps (end-of-row / pinned boundary) emit a
643
+ * warning once per column key (tracked via the caller-supplied {@link warnedKeys} set).
644
+ * Breakpoint-hidden columns are **not** clamped — the span mirrors across a `display: none`
645
+ * column (matching header group colSpan) so the body grid stays column-aligned with the header.
646
+ *
647
+ * @param {VegaTableColumnConfig} column - The column configuration for the spanning cell.
648
+ * @param {VegaTableDataSourceItem} record - The row data record.
649
+ * @param {number} rowIndex - Zero-based index of the row in the current data set.
650
+ * @param {number} leafIndex - Index of this column in the flattened leaf render-input array.
651
+ * @param {ColumnRenderInputModel[]} allLeaves - All leaf render inputs for the table (ordered).
652
+ * @param {Set<string>} warnedKeys - Per-instance set tracking column keys that have already received a clamping warning.
653
+ * @returns {BodyColSpanResult} Resolved spanning metadata for the cell.
654
+ */
655
+ function resolveBodyColSpan(column, record, rowIndex, leafIndex, allLeaves, warnedKeys) {
656
+ var _a, _b, _c;
657
+ const declared = getDeclaredSpan(column, record, rowIndex);
658
+ if (!declared || declared <= 1)
659
+ return NO_SPAN;
660
+ const { span, clampReason } = computeMaxSpan(declared, leafIndex, allLeaves);
661
+ const effectiveSpan = Math.min(declared, span);
662
+ if (clampReason && effectiveSpan < declared) {
663
+ const colKey = (_c = (_b = (_a = column.key) !== null && _a !== void 0 ? _a : column.prop) !== null && _b !== void 0 ? _b : column.label) !== null && _c !== void 0 ? _c : '';
664
+ warnClampOnce(colKey, declared, effectiveSpan, clampReason, warnedKeys);
665
+ }
666
+ if (effectiveSpan <= 1)
667
+ return NO_SPAN;
668
+ return {
669
+ htmlColspan: effectiveSpan,
670
+ skipCount: effectiveSpan - 1,
671
+ };
672
+ }
673
+
674
+ var __decorate$U = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
675
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
676
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
677
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
678
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
679
+ };
680
+ /**
681
+ * Per-row body colspan controller.
682
+ *
683
+ * Centralizes the source-data body colSpan computation that was previously scattered across the
684
+ * cell renderer (cache + per-cell resolve) and the row renderer (imperative `skipCount`). It owns
685
+ * the once-per-key warning cache and exposes {@link resolveRow}, which computes the colspan result
686
+ * for every leaf in a row in a single pass so renderers can consume the result declaratively.
687
+ *
688
+ * The structural shape (a {@link VegaSlimmer} controller reading component fields) mirrors the
689
+ * main-branch `VegaTableExpandRowController` paradigm.
690
+ */
691
+ class VegaTableBodyColSpanController extends globalSlimmerRegistry.VegaSlimmer {
692
+ constructor() {
693
+ super(...arguments);
694
+ this.warnedColSpanKeys = new Set();
695
+ this.lastWarnedColumnsRef = null;
696
+ }
697
+ /**
698
+ * Resolve the effective colspan for every leaf cell in a single source-data row.
699
+ *
700
+ * Walks the row left-to-right, resolving each non-consumed leaf's span and marking the leaves
701
+ * consumed by a span as `null` so the caller can skip them declaratively (no mutable
702
+ * `skipCount` orchestration). The returned array is index-aligned with `leaves`.
703
+ *
704
+ * @param {VegaTableDataSourceItem} record - The row data record.
705
+ * @param {number} rowIndex - Zero-based index of the row in the current data set.
706
+ * @param {ColumnRenderInputModel[]} leaves - All leaf render inputs for the table (ordered).
707
+ * @returns {Array<Nullable<BodyColSpanResult>>} One entry per leaf: a {@link BodyColSpanResult}
708
+ * for a cell to render, or `null` for a leaf consumed by a preceding spanning cell.
709
+ */
710
+ resolveRow(record, rowIndex, leaves) {
711
+ // Reset the once-per-key warning cache whenever the column configuration changes,
712
+ // so clamping conditions introduced by a new `columns` value can warn again.
713
+ if (this.columns !== this.lastWarnedColumnsRef) {
714
+ this.warnedColSpanKeys.clear();
715
+ this.lastWarnedColumnsRef = this.columns;
716
+ }
717
+ const results = new Array(leaves.length).fill(null);
718
+ let skipCount = 0;
719
+ leaves.forEach((leaf, leafIndex) => {
720
+ if (skipCount > 0) {
721
+ // This leaf is consumed by a preceding spanning cell — leave it null (skipped).
722
+ skipCount--;
723
+ return;
724
+ }
725
+ const column = this.findColumn(leaf);
726
+ const result = column
727
+ ? resolveBodyColSpan(column, record, rowIndex, leafIndex, leaves, this.warnedColSpanKeys)
728
+ : { htmlColspan: 1, skipCount: 0 };
729
+ results[leafIndex] = result;
730
+ skipCount = result.skipCount;
731
+ });
732
+ return results;
733
+ }
734
+ /**
735
+ * Find the column config that backs a leaf render input.
736
+ *
737
+ * @param {ColumnRenderInputModel} renderInput - The leaf render input.
738
+ * @returns {Nullable<VegaTableColumnConfig>} The matching column config, or `undefined`.
739
+ */
740
+ findColumn(renderInput) {
741
+ return this.columns.find((column) => column.key === renderInput.key ||
742
+ column.prop === renderInput.key ||
743
+ column.label === renderInput.key);
744
+ }
745
+ }
746
+ __decorate$U([
747
+ globalSlimmerRegistry.MapToComponentField()
748
+ ], VegaTableBodyColSpanController.prototype, "columns", void 0);
749
+
750
+ var __decorate$T = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
751
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
752
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
753
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
754
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
755
+ };
756
+ /**
757
+ * The expand row controller of VegaTable
758
+ */
759
+ class VegaTableExpandRowController extends globalSlimmerRegistry.VegaSlimmer {
760
+ constructor() {
761
+ super(...arguments);
762
+ /**
763
+ * Toggle expandable row by rowKey
764
+ *
765
+ * @param {string} rowKey - The row key of the row
766
+ */
767
+ this.toggleExpandRow = (rowKey) => {
299
768
  this.isRowExpandable(rowKey) && this.handleToggleExpandRow(rowKey, !this.isExpanded(rowKey));
300
769
  };
301
770
  /**
@@ -2412,6 +2881,18 @@ class VegaTableRowRenderer$1 extends globalSlimmerRegistry.VegaSlimmer {
2412
2881
  this.renderTableRowComponent = (rowProps) => {
2413
2882
  const { rowKey, index: index$1, record, isVisibleInCurrentPage } = rowProps;
2414
2883
  const renderInputs = this.vegaTableRenderInputController.getLeafRenderInputs();
2884
+ // Resolve every leaf's colspan in one pass. Entries are index-aligned with renderInputs;
2885
+ // a `null` entry marks a leaf consumed by a preceding spanning cell (skip it).
2886
+ const colSpanResults = this.vegaTableBodyColSpanController.resolveRow(record, index$1, renderInputs);
2887
+ const cells = [];
2888
+ renderInputs.forEach((renderInput, leafIndex) => {
2889
+ const colSpanResult = colSpanResults[leafIndex];
2890
+ if (!colSpanResult) {
2891
+ // Consumed by a preceding spanning cell — nothing to render for this leaf.
2892
+ return;
2893
+ }
2894
+ cells.push(this.vegaTableCellRenderer.render(renderInput, record, index$1, colSpanResult));
2895
+ });
2415
2896
  return (index.h("vega-table-row", { class: {
2416
2897
  'v-hidden': !isVisibleInCurrentPage,
2417
2898
  }, key: `vega-table-row-${rowKey}`, rowKey: rowKey,
@@ -2420,9 +2901,7 @@ class VegaTableRowRenderer$1 extends globalSlimmerRegistry.VegaSlimmer {
2420
2901
  domNodeSubjectObserverFactory.DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, vegaEventId.VegaClick, () => {
2421
2902
  this.rowClickEventEmitter.emit({ record: record, index: index$1 });
2422
2903
  });
2423
- }, striped: this.striped && index$1 % 2 === 1, rowDivider: this.rowDivider && !rowProps.isLastRow }, renderInputs.map((renderInput) => {
2424
- return this.vegaTableCellRenderer.render(renderInput, record, index$1);
2425
- })));
2904
+ }, striped: this.striped && index$1 % 2 === 1, rowDivider: this.rowDivider && !rowProps.isLastRow }, cells));
2426
2905
  };
2427
2906
  }
2428
2907
  render(rowProps, editable) {
@@ -2439,6 +2918,9 @@ __decorate$G([
2439
2918
  __decorate$G([
2440
2919
  globalSlimmerRegistry.MapToComponentField()
2441
2920
  ], VegaTableRowRenderer$1.prototype, "vegaTableCellRenderer", void 0);
2921
+ __decorate$G([
2922
+ globalSlimmerRegistry.MapToComponentField()
2923
+ ], VegaTableRowRenderer$1.prototype, "vegaTableBodyColSpanController", void 0);
2442
2924
  __decorate$G([
2443
2925
  globalSlimmerRegistry.MapToComponentField()
2444
2926
  ], VegaTableRowRenderer$1.prototype, "striped", void 0);
@@ -2656,423 +3138,206 @@ class ColumnStructureModel {
2656
3138
  *
2657
3139
  * @returns {boolean} True if any descendant is a group column.
2658
3140
  */
2659
- hasGroupColumn() {
2660
- return !!this.children.find((model) => !model.isLeaf());
2661
- }
2662
- /**
2663
- * Checks if this subtree contains any left pinned children.
2664
- *
2665
- * @returns {boolean} True if any immediate child has a pinned value.
2666
- */
2667
- hasLeftPinnedColumn() {
2668
- return !!this.children.find((model) => model.pinned === 'left');
2669
- }
2670
- /**
2671
- * Checks if this subtree contains any right pinned children.
2672
- *
2673
- * @returns {boolean} True if any immediate child has a pinned value.
2674
- */
2675
- hasRightPinnedColumn() {
2676
- return !!this.children.find((model) => model.pinned === 'right');
2677
- }
2678
- /**
2679
- * Checks if this node is a leaf (no children).
2680
- *
2681
- * @returns {boolean} True when this node has no children.
2682
- */
2683
- isLeaf() {
2684
- return !this.children || this.children.length === 0;
2685
- }
2686
- /**
2687
- * Return an array of nodes for this subtree using the specified traversal mode.
2688
- *
2689
- * Currently only depth-first search ('dfs') is supported. The returned array is
2690
- * cached per-mode to avoid repeated traversal costs.
2691
- *
2692
- * @param {IteratorMode} mode - Traversal mode to use. Defaults to 'dfs'.
2693
- * @returns {ColumnStructureModel[]} Array of ColumnStructureModel nodes in traversal order.
2694
- */
2695
- iterator(mode = 'dfs') {
2696
- if (mode === 'dfs') {
2697
- return this.dfsIterator();
2698
- }
2699
- return [];
2700
- }
2701
- /**
2702
- * Gets all leaf nodes in the subtree, with caching.
2703
- *
2704
- * Subsequent calls return the cached array until the underlying model is rebuilt.
2705
- *
2706
- * @returns {ColumnStructureModel[]} Array of leaf column models.
2707
- */
2708
- getLeaves() {
2709
- if (this.leaves.length > 0) {
2710
- return this.leaves;
2711
- }
2712
- const leaves = this.dfsIterator().filter((model) => model.isLeaf());
2713
- this.leaves = leaves;
2714
- return leaves;
2715
- }
2716
- /**
2717
- * For root nodes, returns children ordered by pinned type (left, none, right).
2718
- * For non-root nodes, returns children in their natural order.
2719
- *
2720
- * @returns {ColumnStructureModel[]} Array of child column models.
2721
- */
2722
- getOrderedChildren() {
2723
- if (!this.isRoot())
2724
- return this.children;
2725
- return this.orderedChildren;
2726
- }
2727
- /**
2728
- * Orders root children by pinned type (left, none, right) and caches the result.
2729
- *
2730
- * For non-root nodes this method returns children in their natural order.
2731
- *
2732
- * @returns {ColumnStructureModel[]} Array of ordered child column models.
2733
- */
2734
- orderChildrenByPinned() {
2735
- if (!this.isRoot())
2736
- return this.children;
2737
- if (this.orderedChildren.length > 0) {
2738
- return this.orderedChildren;
2739
- }
2740
- const leftPinned = [];
2741
- const noPinned = [];
2742
- const rightPinned = [];
2743
- this.children.forEach((child) => {
2744
- if (child.pinned === 'left') {
2745
- leftPinned.push(child);
2746
- }
2747
- else if (child.pinned === 'right') {
2748
- rightPinned.push(child);
2749
- }
2750
- else {
2751
- noPinned.push(child);
2752
- }
2753
- });
2754
- const children = [...leftPinned, ...noPinned, ...rightPinned];
2755
- this.orderedChildren = children;
2756
- return children;
2757
- }
2758
- /**
2759
- * Checks if this node is the root node.
2760
- *
2761
- * @returns {boolean} True if root node, false otherwise.
2762
- */
2763
- isRoot() {
2764
- return this.level === ColumnStructureModel.ROOT_LEVEL;
2765
- }
2766
- /**
2767
- * Performs a depth-first traversal of the column structure.
2768
- *
2769
- * The traversal respects root-child pinned ordering (left/no/right) for the root node.
2770
- * Results are cached per-node to avoid repeated recursion costs.
2771
- *
2772
- * @returns {ColumnStructureModel[]} Array of all nodes in DFS order.
2773
- */
2774
- dfsIterator() {
2775
- if (this.iteratorCacheMap.has('dfs')) {
2776
- return this.iteratorCacheMap.get('dfs');
2777
- }
2778
- const localResult = [];
2779
- const children = this.orderChildrenByPinned();
2780
- if (!this.isRoot()) {
2781
- localResult.push(this);
2782
- }
2783
- if (children && children.length > 0) {
2784
- children.forEach((child) => {
2785
- localResult.push(...child.dfsIterator());
2786
- });
2787
- }
2788
- this.iteratorCacheMap.set('dfs', localResult);
2789
- return localResult;
2790
- }
2791
- }
2792
- ColumnStructureModel.ROOT_LEVEL = -1;
2793
- ColumnStructureModel.ROOT_KEY = '#root-model#';
2794
-
2795
- var __decorate$E = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
2796
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2797
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2798
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2799
- return c > 3 && r && Object.defineProperty(target, key, r), r;
2800
- };
2801
- /**
2802
- * Controller responsible for building and keeping the ColumnStructureModel in sync
2803
- * with the component's `columns` and `groupColumns` properties.
2804
- *
2805
- * This slimmer maps relevant component fields and lifecycle/watch hooks to
2806
- * automatically rebuild the column structure when inputs change.
2807
- */
2808
- class VegaTableColumnStructureModelController extends globalSlimmerRegistry.VegaSlimmer {
2809
- /**
2810
- * Component lifecycle hook mapped to the host's componentWillLoad.
2811
- * Initializes the ColumnStructureModel prior to initial render.
2812
- */
2813
- componentWillLoad() {
2814
- this.setColumnStructureModel();
2815
- }
2816
- /**
2817
- * Watch handler mapped to the host's watchColumns.
2818
- * Rebuilds the ColumnStructureModel when `columns` changes.
2819
- */
2820
- watchColumns() {
2821
- this.setColumnStructureModel();
2822
- }
2823
- /**
2824
- * Watch handler mapped to the host's watchGroupColumns.
2825
- * Rebuilds the ColumnStructureModel when `groupColumns` changes.
2826
- */
2827
- watchGroupColumns() {
2828
- this.setColumnStructureModel();
2829
- }
2830
- /**
2831
- * Build and assign the ColumnStructureModel from current `columns` and `groupColumns`.
2832
- * Uses `ColumnStructureModel.from` which returns a root model representing the column tree.
2833
- */
2834
- setColumnStructureModel() {
2835
- this.columnStructureModel = ColumnStructureModel.from(this.columns, this.groupColumns);
2836
- }
2837
- }
2838
- __decorate$E([
2839
- globalSlimmerRegistry.MapToComponentField()
2840
- ], VegaTableColumnStructureModelController.prototype, "host", void 0);
2841
- __decorate$E([
2842
- globalSlimmerRegistry.MapToComponentField()
2843
- ], VegaTableColumnStructureModelController.prototype, "columns", void 0);
2844
- __decorate$E([
2845
- globalSlimmerRegistry.MapToComponentField()
2846
- ], VegaTableColumnStructureModelController.prototype, "groupColumns", void 0);
2847
- __decorate$E([
2848
- globalSlimmerRegistry.MapToComponentField({ writable: true })
2849
- ], VegaTableColumnStructureModelController.prototype, "columnStructureModel", void 0);
2850
- __decorate$E([
2851
- globalSlimmerRegistry.MapToComponentMethod('componentWillLoad')
2852
- ], VegaTableColumnStructureModelController.prototype, "componentWillLoad", null);
2853
- __decorate$E([
2854
- globalSlimmerRegistry.MapToComponentMethod('watchColumns')
2855
- ], VegaTableColumnStructureModelController.prototype, "watchColumns", null);
2856
- __decorate$E([
2857
- globalSlimmerRegistry.MapToComponentMethod('watchGroupColumns')
2858
- ], VegaTableColumnStructureModelController.prototype, "watchGroupColumns", null);
2859
-
2860
- /**
2861
- * ColumnRenderInputModel
2862
- *
2863
- * Render-time representation of a column or group node used by header/body renderers.
2864
- * Built from a ColumnStructureModel tree, it carries computed layout metadata required
2865
- * for rendering and pinned/sticky calculations (colSpan, rowSpan, pinned boundaries, etc).
2866
- *
2867
- * Instances form a forest (root-level nodes in an array) that mirrors the structure model
2868
- * but contains additional render-specific properties and parent/child links for renderers.
2869
- */
2870
- class ColumnRenderInputModel {
2871
- /**
2872
- * Create a new render input node.
2873
- *
2874
- * @param {string} key - Unique key (matches ColumnStructureModel.key).
2875
- * @param {string} label - Optional display label (from structure model).
2876
- * @param {VegaTablePinnedType} pinned - Pinned type for this node ('left' | 'right' | null).
2877
- * @param {Nullable<number>} colSpan - Number of visual columns spanned by this node's subtree.
2878
- * @param {Nullable<number>} rowSpan - Number of header rows this node should span.
2879
- * @param {boolean} isViewStart - True when this node is the start of a visible view range.
2880
- * @param {boolean} isViewEnd - True when this node is the end of a visible view range.
2881
- * @param {boolean} isLeftEndPinned - True when node is last left-pinned sibling.
2882
- * @param {boolean} isRightStartPinned - True when node is first right-pinned sibling.
2883
- * @param {boolean} isNoPinnedEnd - True when node is last non-pinned sibling.
2884
- * @param {boolean} headHasGroupColumn - Header contains group columns (affects rowSpan).
2885
- * @param {boolean} headHasPinnedColumn - Header contains pinned columns.
2886
- * @param {number} headMaxDepth - Maximum header depth (number of header rows).
2887
- * @param {number} level - Level/index of this node within header rows (0-based).
2888
- * @param {number} columnIndex - Sequential leaf index (used for ordering).
2889
- * @param {Nullable<ColumnRenderInputModel>} parent - Parent render input node (null for root-level).
2890
- * @param {ColumnRenderInputModel[]} children - Child render input nodes.
2891
- */
2892
- constructor(key, label, pinned, colSpan, rowSpan, isViewStart, isViewEnd, isLeftEndPinned, isRightStartPinned, isNoPinnedEnd, headHasGroupColumn, headHasPinnedColumn, headMaxDepth, level, columnIndex, parent, children = []) {
2893
- this.key = key;
2894
- this.label = label;
2895
- this.pinned = pinned;
2896
- this.colSpan = colSpan;
2897
- this.rowSpan = rowSpan;
2898
- this.isViewStart = isViewStart;
2899
- this.isViewEnd = isViewEnd;
2900
- this.isLeftEndPinned = isLeftEndPinned;
2901
- this.isRightStartPinned = isRightStartPinned;
2902
- this.isNoPinnedEnd = isNoPinnedEnd;
2903
- this.headHasGroupColumn = headHasGroupColumn;
2904
- this.headHasPinnedColumn = headHasPinnedColumn;
2905
- this.headMaxDepth = headMaxDepth;
2906
- this.level = level;
2907
- this.columnIndex = columnIndex;
2908
- this.parent = parent;
2909
- this.children = children;
2910
- this.iteratorCacheMap = new Map();
2911
- this.leaves = [];
2912
- }
2913
- /**
2914
- * Build a forest of ColumnRenderInputModel nodes from a ColumnStructureModel root.
2915
- *
2916
- * @param {ColumnStructureModel} rootModel - Root ColumnStructureModel that supplies tree and level data.
2917
- * @returns {ColumnRenderInputModel[]} Array of root-level ColumnRenderInputModel nodes (the render forest).
2918
- */
2919
- static from(rootModel) {
2920
- const renderInputs = [];
2921
- const parentStack = [];
2922
- const maxLevel = rootModel.getMaxDepth();
2923
- const hasGroupColumn = rootModel.hasGroupColumn();
2924
- const hasPinnedColumn = rootModel.hasLeftPinnedColumn() || rootModel.hasRightPinnedColumn();
2925
- let columnIndex = 0;
2926
- // Iterate structure model (DFS by default) and construct render nodes.
2927
- rootModel.iterator().forEach((model) => {
2928
- const parent = model.level > 0 ? parentStack[model.level - 1] : null;
2929
- const isParentStart = hasGroupColumn && this.isParentStart(model);
2930
- const isParentEnd = hasGroupColumn && this.isParentEnd(model);
2931
- const renderInput = new ColumnRenderInputModel(model.key, model.label, parent ? parent.pinned : model.pinned, hasGroupColumn ? this.getColSpan(model) : null, hasGroupColumn ? (model.isLeaf() ? maxLevel - model.level : 1) : null, parent ? parent.isViewStart && isParentStart : isParentStart, parent ? parent.isViewEnd && isParentEnd : isParentEnd, parent
2932
- ? parent.isLeftEndPinned && isParentEnd
2933
- : hasPinnedColumn && this.isLeftEndPinned(model), parent
2934
- ? parent.isRightStartPinned && isParentStart
2935
- : hasPinnedColumn && this.isRightStartPinned(model), parent ? parent.isNoPinnedEnd && isParentEnd : hasPinnedColumn && this.isNoPinnedEnd(model), hasGroupColumn, hasPinnedColumn, maxLevel, model.level, columnIndex, parent);
2936
- // Attach to parent if present, otherwise add to root-level array.
2937
- parent ? parent.children.push(renderInput) : renderInputs.push(renderInput);
2938
- // Maintain parent stack keyed by level to allow next nodes to find their parent.
2939
- parentStack[model.level] = renderInput;
2940
- parentStack.length = model.level + 1;
2941
- // Increment leaf index when encountering a leaf structure node.
2942
- if (model.isLeaf())
2943
- columnIndex++;
2944
- });
2945
- return renderInputs;
2946
- }
2947
- /**
2948
- * True when the provided structure model is the last left-pinned sibling in its parent's children.
2949
- * Used to mark boundary nodes for left-pinned groups.
2950
- *
2951
- * @param {ColumnStructureModel} model - Structure model to check.
2952
- * @returns {boolean} True when model is the last left-pinned sibling.
2953
- */
2954
- static isLeftEndPinned(model) {
2955
- const siblings = model.parent
2956
- .getOrderedChildren()
2957
- .filter((child) => child.pinned === 'left');
2958
- return siblings[siblings.length - 1] === model;
2959
- }
2960
- /**
2961
- * True when the provided structure model is the first right-pinned sibling in its parent's children.
2962
- * Used to mark boundary nodes for right-pinned groups.
2963
- *
2964
- * @param {ColumnStructureModel} model - Structure model to check.
2965
- * @returns {boolean} True when model is the first right-pinned sibling.
2966
- */
2967
- static isRightStartPinned(model) {
2968
- const siblings = model.parent
2969
- .getOrderedChildren()
2970
- .filter((child) => child.pinned === 'right');
2971
- return siblings[0] === model;
3141
+ hasGroupColumn() {
3142
+ return !!this.children.find((model) => !model.isLeaf());
2972
3143
  }
2973
3144
  /**
2974
- * True when the provided structure model is the last non-pinned sibling in its parent's children.
2975
- * Useful to handle the 'no-pinned-end' condition.
3145
+ * Checks if this subtree contains any left pinned children.
2976
3146
  *
2977
- * @param {ColumnStructureModel} model - Structure model to check.
2978
- * @returns {boolean} True when model is the last non-pinned sibling.
3147
+ * @returns {boolean} True if any immediate child has a pinned value.
2979
3148
  */
2980
- static isNoPinnedEnd(model) {
2981
- const siblings = model.parent
2982
- .getOrderedChildren()
2983
- .filter((child) => !child.pinned);
2984
- return siblings[siblings.length - 1] === model;
3149
+ hasLeftPinnedColumn() {
3150
+ return !!this.children.find((model) => model.pinned === 'left');
2985
3151
  }
2986
3152
  /**
2987
- * True when the provided model is the first child of its parent.
3153
+ * Checks if this subtree contains any right pinned children.
2988
3154
  *
2989
- * @param {ColumnStructureModel} model - Structure model to check.
2990
- * @returns {boolean} True when model is the first child.
3155
+ * @returns {boolean} True if any immediate child has a pinned value.
2991
3156
  */
2992
- static isParentStart(model) {
2993
- return model.parent.getOrderedChildren()[0] === model;
3157
+ hasRightPinnedColumn() {
3158
+ return !!this.children.find((model) => model.pinned === 'right');
2994
3159
  }
2995
3160
  /**
2996
- * True when the provided model is the last child of its parent.
3161
+ * Checks if this node is a leaf (no children).
2997
3162
  *
2998
- * @param {ColumnStructureModel} model - Structure model to check.
2999
- * @returns {boolean} True when model is the last child.
3163
+ * @returns {boolean} True when this node has no children.
3000
3164
  */
3001
- static isParentEnd(model) {
3002
- const parentChildren = model.parent.getOrderedChildren();
3003
- return parentChildren[parentChildren.length - 1] === model;
3165
+ isLeaf() {
3166
+ return !this.children || this.children.length === 0;
3004
3167
  }
3005
3168
  /**
3006
- * Compute a node's colSpan by iterating its subtree and counting the maximum number
3007
- * of nodes present at any single level (visual column span).
3169
+ * Return an array of nodes for this subtree using the specified traversal mode.
3008
3170
  *
3009
- * @param {ColumnStructureModel} mode - ColumnStructureModel node to examine.
3010
- * @returns {number} Number of visual columns spanned by the node.
3171
+ * Currently only depth-first search ('dfs') is supported. The returned array is
3172
+ * cached per-mode to avoid repeated traversal costs.
3173
+ *
3174
+ * @param {IteratorMode} mode - Traversal mode to use. Defaults to 'dfs'.
3175
+ * @returns {ColumnStructureModel[]} Array of ColumnStructureModel nodes in traversal order.
3011
3176
  */
3012
- static getColSpan(mode) {
3013
- const children = mode.iterator();
3014
- const rowMap = {};
3015
- children.forEach((node) => {
3016
- rowMap[node.level] = (rowMap[node.level] || 0) + 1;
3017
- });
3018
- return Math.max(...Object.values(rowMap));
3177
+ iterator(mode = 'dfs') {
3178
+ if (mode === 'dfs') {
3179
+ return this.dfsIterator();
3180
+ }
3181
+ return [];
3019
3182
  }
3020
3183
  /**
3021
- * Return cached leaf render nodes for this subtree.
3022
- * Caches the result on first call and returns cached array on subsequent calls.
3184
+ * Gets all leaf nodes in the subtree, with caching.
3023
3185
  *
3024
- * @returns {ColumnRenderInputModel[]} Array of leaf render input nodes.
3186
+ * Subsequent calls return the cached array until the underlying model is rebuilt.
3187
+ *
3188
+ * @returns {ColumnStructureModel[]} Array of leaf column models.
3025
3189
  */
3026
3190
  getLeaves() {
3027
3191
  if (this.leaves.length > 0) {
3028
3192
  return this.leaves;
3029
3193
  }
3030
- const leaves = this.iterator().filter((model) => model.isLeaf());
3194
+ const leaves = this.dfsIterator().filter((model) => model.isLeaf());
3031
3195
  this.leaves = leaves;
3032
3196
  return leaves;
3033
3197
  }
3034
3198
  /**
3035
- * Generic iterator that supports traversal modes ('dfs' currently implemented).
3199
+ * For root nodes, returns children ordered by pinned type (left, none, right).
3200
+ * For non-root nodes, returns children in their natural order.
3036
3201
  *
3037
- * @param {IteratorMode} [mode='dfs'] - Iterator mode ('dfs' | 'bfs').
3038
- * @returns {ColumnRenderInputModel[]} Traversal-ordered array of nodes.
3202
+ * @returns {ColumnStructureModel[]} Array of child column models.
3039
3203
  */
3040
- iterator(mode = 'dfs') {
3041
- if (mode === 'dfs') {
3042
- return this.dfsIterator();
3204
+ getOrderedChildren() {
3205
+ if (!this.isRoot())
3206
+ return this.children;
3207
+ return this.orderedChildren;
3208
+ }
3209
+ /**
3210
+ * Orders root children by pinned type (left, none, right) and caches the result.
3211
+ *
3212
+ * For non-root nodes this method returns children in their natural order.
3213
+ *
3214
+ * @returns {ColumnStructureModel[]} Array of ordered child column models.
3215
+ */
3216
+ orderChildrenByPinned() {
3217
+ if (!this.isRoot())
3218
+ return this.children;
3219
+ if (this.orderedChildren.length > 0) {
3220
+ return this.orderedChildren;
3043
3221
  }
3044
- // Future: implement BFS mode here.
3045
- return [];
3222
+ const leftPinned = [];
3223
+ const noPinned = [];
3224
+ const rightPinned = [];
3225
+ this.children.forEach((child) => {
3226
+ if (child.pinned === 'left') {
3227
+ leftPinned.push(child);
3228
+ }
3229
+ else if (child.pinned === 'right') {
3230
+ rightPinned.push(child);
3231
+ }
3232
+ else {
3233
+ noPinned.push(child);
3234
+ }
3235
+ });
3236
+ const children = [...leftPinned, ...noPinned, ...rightPinned];
3237
+ this.orderedChildren = children;
3238
+ return children;
3046
3239
  }
3047
3240
  /**
3048
- * Depth-first pre-order traversal of this node and its descendants.
3049
- * Caches the result for the 'dfs' mode to avoid repeated recursion.
3241
+ * Checks if this node is the root node.
3050
3242
  *
3051
- * @returns {ColumnRenderInputModel[]} Array of nodes in DFS order (includes this node).
3243
+ * @returns {boolean} True if root node, false otherwise.
3244
+ */
3245
+ isRoot() {
3246
+ return this.level === ColumnStructureModel.ROOT_LEVEL;
3247
+ }
3248
+ /**
3249
+ * Performs a depth-first traversal of the column structure.
3250
+ *
3251
+ * The traversal respects root-child pinned ordering (left/no/right) for the root node.
3252
+ * Results are cached per-node to avoid repeated recursion costs.
3253
+ *
3254
+ * @returns {ColumnStructureModel[]} Array of all nodes in DFS order.
3052
3255
  */
3053
3256
  dfsIterator() {
3054
3257
  if (this.iteratorCacheMap.has('dfs')) {
3055
3258
  return this.iteratorCacheMap.get('dfs');
3056
3259
  }
3057
3260
  const localResult = [];
3058
- localResult.push(this);
3059
- if (this.children && this.children.length > 0) {
3060
- this.children.forEach((child) => {
3261
+ const children = this.orderChildrenByPinned();
3262
+ if (!this.isRoot()) {
3263
+ localResult.push(this);
3264
+ }
3265
+ if (children && children.length > 0) {
3266
+ children.forEach((child) => {
3061
3267
  localResult.push(...child.dfsIterator());
3062
3268
  });
3063
3269
  }
3064
3270
  this.iteratorCacheMap.set('dfs', localResult);
3065
3271
  return localResult;
3066
3272
  }
3273
+ }
3274
+ ColumnStructureModel.ROOT_LEVEL = -1;
3275
+ ColumnStructureModel.ROOT_KEY = '#root-model#';
3276
+
3277
+ var __decorate$E = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
3278
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3279
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
3280
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3281
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
3282
+ };
3283
+ /**
3284
+ * Controller responsible for building and keeping the ColumnStructureModel in sync
3285
+ * with the component's `columns` and `groupColumns` properties.
3286
+ *
3287
+ * This slimmer maps relevant component fields and lifecycle/watch hooks to
3288
+ * automatically rebuild the column structure when inputs change.
3289
+ */
3290
+ class VegaTableColumnStructureModelController extends globalSlimmerRegistry.VegaSlimmer {
3067
3291
  /**
3068
- * True when this render node has no children (visual leaf).
3069
- *
3070
- * @returns {boolean} True when node is a leaf.
3292
+ * Component lifecycle hook mapped to the host's componentWillLoad.
3293
+ * Initializes the ColumnStructureModel prior to initial render.
3071
3294
  */
3072
- isLeaf() {
3073
- return !this.children || this.children.length === 0;
3295
+ componentWillLoad() {
3296
+ this.setColumnStructureModel();
3297
+ }
3298
+ /**
3299
+ * Watch handler mapped to the host's watchColumns.
3300
+ * Rebuilds the ColumnStructureModel when `columns` changes.
3301
+ */
3302
+ watchColumns() {
3303
+ this.setColumnStructureModel();
3304
+ }
3305
+ /**
3306
+ * Watch handler mapped to the host's watchGroupColumns.
3307
+ * Rebuilds the ColumnStructureModel when `groupColumns` changes.
3308
+ */
3309
+ watchGroupColumns() {
3310
+ this.setColumnStructureModel();
3311
+ }
3312
+ /**
3313
+ * Build and assign the ColumnStructureModel from current `columns` and `groupColumns`.
3314
+ * Uses `ColumnStructureModel.from` which returns a root model representing the column tree.
3315
+ */
3316
+ setColumnStructureModel() {
3317
+ this.columnStructureModel = ColumnStructureModel.from(this.columns, this.groupColumns);
3074
3318
  }
3075
3319
  }
3320
+ __decorate$E([
3321
+ globalSlimmerRegistry.MapToComponentField()
3322
+ ], VegaTableColumnStructureModelController.prototype, "host", void 0);
3323
+ __decorate$E([
3324
+ globalSlimmerRegistry.MapToComponentField()
3325
+ ], VegaTableColumnStructureModelController.prototype, "columns", void 0);
3326
+ __decorate$E([
3327
+ globalSlimmerRegistry.MapToComponentField()
3328
+ ], VegaTableColumnStructureModelController.prototype, "groupColumns", void 0);
3329
+ __decorate$E([
3330
+ globalSlimmerRegistry.MapToComponentField({ writable: true })
3331
+ ], VegaTableColumnStructureModelController.prototype, "columnStructureModel", void 0);
3332
+ __decorate$E([
3333
+ globalSlimmerRegistry.MapToComponentMethod('componentWillLoad')
3334
+ ], VegaTableColumnStructureModelController.prototype, "componentWillLoad", null);
3335
+ __decorate$E([
3336
+ globalSlimmerRegistry.MapToComponentMethod('watchColumns')
3337
+ ], VegaTableColumnStructureModelController.prototype, "watchColumns", null);
3338
+ __decorate$E([
3339
+ globalSlimmerRegistry.MapToComponentMethod('watchGroupColumns')
3340
+ ], VegaTableColumnStructureModelController.prototype, "watchGroupColumns", null);
3076
3341
 
3077
3342
  var __decorate$D = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
3078
3343
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -3287,6 +3552,12 @@ class VegaTablePinnedRenderer extends globalSlimmerRegistry.VegaSlimmer {
3287
3552
  },
3288
3553
  });
3289
3554
  this.previouslyStyledCells = new Set();
3555
+ // Each set tracks cells where exactly one dynamic class was added — cleared per class so
3556
+ // that static classes from render() on the same cell are never inadvertently stripped
3557
+ // (e.g. a cell that is both isRightStartPinned and the last-visible body cell).
3558
+ this.dynamicRightDividerCells = new Set();
3559
+ this.dynamicLeftDividerCells = new Set();
3560
+ this.dynamicHideRightBorderCells = new Set();
3290
3561
  this.clearPinnedPositionsTaskQueue = new synchronizeTaskQueue.SynchronizeTaskQueue(1);
3291
3562
  }
3292
3563
  componentDidLoad() {
@@ -3294,7 +3565,17 @@ class VegaTablePinnedRenderer extends globalSlimmerRegistry.VegaSlimmer {
3294
3565
  async componentDidRender() {
3295
3566
  await this.clearPinnedPositionsTaskQueue.runTask();
3296
3567
  this.updateTableRowPinnedPosition();
3297
- this.updateTableCellPinnedPosition();
3568
+ const unreadyCells = this.updateTableCellPinnedPosition();
3569
+ if (unreadyCells.length > 0) {
3570
+ // In dev builds, Stencil's HMR flag forces loadModule() to always use a
3571
+ // dynamic import(), so a brand-new cell's first render is deferred. We wait
3572
+ // for each unready cell via componentOnReady() — which resolves exactly when
3573
+ // the cell's shadow <td> is first rendered — then apply sticky positioning.
3574
+ // In production (hotModuleReplacement=false) loadModule() is synchronous, so
3575
+ // cells are always ready by componentDidRender and this branch is never reached.
3576
+ await Promise.all(unreadyCells.map((cell) => cell.componentOnReady()));
3577
+ this.updateTableCellPinnedPosition();
3578
+ }
3298
3579
  }
3299
3580
  watchColumnStructureModel() {
3300
3581
  void this.clearPinnedPositionsTaskQueue.enqueue({
@@ -3306,24 +3587,165 @@ class VegaTablePinnedRenderer extends globalSlimmerRegistry.VegaSlimmer {
3306
3587
  updateTableCellPinnedPosition() {
3307
3588
  if (!this.columnStructureModel.hasLeftPinnedColumn() &&
3308
3589
  !this.columnStructureModel.hasRightPinnedColumn())
3309
- return;
3590
+ return [];
3591
+ // Clear stale dynamic boundary classes before re-evaluating breakpoint visibility.
3592
+ // This ensures the classes are removed when the viewport grows back (e.g. column B
3593
+ // becomes visible again) and not only when the column structure changes.
3594
+ // Each set only removes the single class it tracks, preserving any other static
3595
+ // border classes that render() placed on the same cell (VD-9565).
3596
+ this.dynamicRightDividerCells.forEach((cell) => cell.classList.remove('right-divider'));
3597
+ this.dynamicRightDividerCells.clear();
3598
+ this.dynamicLeftDividerCells.forEach((cell) => cell.classList.remove('left-divider'));
3599
+ this.dynamicLeftDividerCells.clear();
3600
+ this.dynamicHideRightBorderCells.forEach((cell) => cell.classList.remove('hide-right-border'));
3601
+ this.dynamicHideRightBorderCells.clear();
3310
3602
  // if not have head row, it means no pinned, so no need to update
3311
3603
  const row = this.host.shadowRoot.querySelector('vega-table-head-row');
3312
3604
  // to avoid window resize before table rendered.
3313
3605
  // @see{module:resize-pinned-position-by-edit-row}
3314
3606
  /* istanbul ignore next */
3315
3607
  if (!row)
3316
- return;
3608
+ return [];
3317
3609
  const headCellRenderInputMap = this.vegaTableRenderInputController.getHeadCellRenderInputMap();
3318
3610
  const pinnedColumnBodyCellRenderInputMap = this.vegaTableRenderInputController.getPinnedColumnBodyCellRenderInputMap();
3319
3611
  const [prevShadowThWidth, nextShadowThWidth] = this.getRowShadowThWidths();
3320
3612
  const leafWidths = this.getLeafWidths();
3613
+ // Track the last visible left-pinned head cell and first visible right-pinned head cell
3614
+ // to dynamically apply boundary classes when breakpoint-hidden columns shift the boundary.
3615
+ let lastVisibleLeftPinnedHeadCell = null;
3616
+ let firstVisibleRightPinnedHeadCell = null;
3617
+ let lastVisibleRightPinnedHeadCell = null;
3321
3618
  headCellRenderInputMap.forEach((renderInput, headCell) => {
3619
+ var _a;
3620
+ /* istanbul ignore next -- defensive null-guard: jsdom always provides shadowRoot */
3621
+ const shadowCell = (_a = headCell.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('th, td');
3622
+ const isVisible = shadowCell ? shadowCell.getBoundingClientRect().width > 0 : false;
3322
3623
  this.updateCellPinnedPosition(renderInput, headCell, prevShadowThWidth, leafWidths, nextShadowThWidth);
3624
+ if (isVisible && renderInput.pinned === 'left') {
3625
+ lastVisibleLeftPinnedHeadCell = shadowCell;
3626
+ }
3627
+ if (isVisible && renderInput.pinned === 'right' && !firstVisibleRightPinnedHeadCell) {
3628
+ firstVisibleRightPinnedHeadCell = shadowCell;
3629
+ }
3630
+ if (isVisible && renderInput.pinned === 'right') {
3631
+ lastVisibleRightPinnedHeadCell = shadowCell;
3632
+ }
3323
3633
  });
3324
- pinnedColumnBodyCellRenderInputMap.forEach((renderInput, headCell) => {
3325
- this.updateCellPinnedPosition(renderInput, headCell, prevShadowThWidth, leafWidths, nextShadowThWidth);
3634
+ // Remove stale entries (disconnected cells) left over from prior renders (e.g. after drag reorder).
3635
+ pinnedColumnBodyCellRenderInputMap.forEach((_, bodyCell) => {
3636
+ /* istanbul ignore next -- defensive cleanup for disconnected cells; jsdom always keeps cells connected */
3637
+ if (!(bodyCell === null || bodyCell === void 0 ? void 0 : bodyCell.isConnected)) {
3638
+ pinnedColumnBodyCellRenderInputMap.delete(bodyCell);
3639
+ }
3640
+ });
3641
+ // Track last visible left-pinned body cells per row for boundary class propagation.
3642
+ const lastVisibleLeftPinnedBodyCells = new Map();
3643
+ const firstVisibleRightPinnedBodyCells = new Map();
3644
+ const lastVisibleRightPinnedBodyCells = new Map();
3645
+ // Collect body cells whose shadow DOM is not yet ready (newly created cells).
3646
+ const unreadyCells = [];
3647
+ pinnedColumnBodyCellRenderInputMap.forEach((renderInput, bodyCell) => {
3648
+ var _a;
3649
+ /* istanbul ignore next -- defensive null-guard: jsdom always provides shadowRoot */
3650
+ const shadowCell = (_a = bodyCell.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('th, td');
3651
+ const isVisible = shadowCell ? shadowCell.getBoundingClientRect().width > 0 : false;
3652
+ // Shadow DOM not ready yet — cell was just created (e.g. colspan collapsed after drag).
3653
+ if (['left', 'right'].includes(renderInput.pinned) && !shadowCell) {
3654
+ unreadyCells.push(bodyCell);
3655
+ return;
3656
+ }
3657
+ this.updateCellPinnedPosition(renderInput, bodyCell, prevShadowThWidth, leafWidths, nextShadowThWidth);
3658
+ if (isVisible && renderInput.pinned === 'left') {
3659
+ // Use the parent row as the grouping key for per-row tracking
3660
+ const parentRow = bodyCell.closest('vega-table-row');
3661
+ if (parentRow) {
3662
+ lastVisibleLeftPinnedBodyCells.set(parentRow, shadowCell);
3663
+ }
3664
+ }
3665
+ if (isVisible && renderInput.pinned === 'right') {
3666
+ const parentRow = bodyCell.closest('vega-table-row');
3667
+ if (parentRow && !firstVisibleRightPinnedBodyCells.has(parentRow)) {
3668
+ firstVisibleRightPinnedBodyCells.set(parentRow, shadowCell);
3669
+ }
3670
+ if (parentRow) {
3671
+ lastVisibleRightPinnedBodyCells.set(parentRow, shadowCell);
3672
+ }
3673
+ }
3326
3674
  });
3675
+ // Apply boundary divider to the last visible left-pinned cell when the static
3676
+ // isLeftEndPinned column is hidden by breakpoint.
3677
+ if (lastVisibleLeftPinnedHeadCell &&
3678
+ !lastVisibleLeftPinnedHeadCell.classList.contains('right-divider')) {
3679
+ // Check if the static boundary column is hidden — if leafWidths shows 0 for the
3680
+ // isLeftEndPinned column, the boundary has shifted.
3681
+ const leafRenderInputs = this.vegaTableRenderInputController.getLeafRenderInputs();
3682
+ const staticBoundaryLeaf = leafRenderInputs.find((leaf) => leaf.isLeftEndPinned);
3683
+ if (staticBoundaryLeaf && leafWidths[staticBoundaryLeaf.columnIndex] === 0) {
3684
+ lastVisibleLeftPinnedHeadCell.classList.add('right-divider');
3685
+ this.dynamicRightDividerCells.add(lastVisibleLeftPinnedHeadCell);
3686
+ lastVisibleLeftPinnedBodyCells.forEach((cell) => {
3687
+ // Only track cells that don't already hold `right-divider` from their
3688
+ // static render (effectiveRenderInput.isLeftEndPinned). If we add a
3689
+ // statically-classed cell here, the per-class clear on the next resize
3690
+ // would erroneously remove the static class (VD-9540).
3691
+ if (!cell.classList.contains('right-divider')) {
3692
+ cell.classList.add('right-divider');
3693
+ this.dynamicRightDividerCells.add(cell);
3694
+ }
3695
+ });
3696
+ }
3697
+ }
3698
+ if (firstVisibleRightPinnedHeadCell &&
3699
+ !firstVisibleRightPinnedHeadCell.classList.contains('left-divider')) {
3700
+ const leafRenderInputs = this.vegaTableRenderInputController.getLeafRenderInputs();
3701
+ const staticBoundaryLeaf = leafRenderInputs.find((leaf) => leaf.isRightStartPinned);
3702
+ if (staticBoundaryLeaf && leafWidths[staticBoundaryLeaf.columnIndex] === 0) {
3703
+ firstVisibleRightPinnedHeadCell.classList.add('left-divider');
3704
+ this.dynamicLeftDividerCells.add(firstVisibleRightPinnedHeadCell);
3705
+ firstVisibleRightPinnedBodyCells.forEach((cell) => {
3706
+ // Only track cells that don't already hold `left-divider` from their
3707
+ // static render (effectiveRenderInput.isRightStartPinned). If we add a
3708
+ // statically-classed cell here, the per-class clear on the next resize
3709
+ // would erroneously remove the static class (VD-9540).
3710
+ if (!cell.classList.contains('left-divider')) {
3711
+ cell.classList.add('left-divider');
3712
+ this.dynamicLeftDividerCells.add(cell);
3713
+ }
3714
+ });
3715
+ }
3716
+ }
3717
+ // Apply hide-right-border to the last visible right-pinned cell when the structural
3718
+ // right-most column is hidden by breakpoint. Without this, the new right-most visible
3719
+ // pinned column keeps a right border while the head cell suppresses it (head cells use
3720
+ // isViewEnd), leaving an extra vertical border at the table's right edge (VD-9565).
3721
+ if (lastVisibleRightPinnedHeadCell &&
3722
+ !lastVisibleRightPinnedHeadCell.classList.contains('hide-right-border')) {
3723
+ const leafRenderInputs = this.vegaTableRenderInputController.getLeafRenderInputs();
3724
+ // The structural right-most column is the last right-pinned leaf. Leaf render
3725
+ // inputs do not carry `isViewEnd` (unlike head render inputs), so identify the
3726
+ // boundary via `pinned` order instead.
3727
+ const rightPinnedLeaves = leafRenderInputs.filter((leaf) => leaf.pinned === 'right');
3728
+ const structuralEndLeaf = rightPinnedLeaves[rightPinnedLeaves.length - 1];
3729
+ if (structuralEndLeaf && leafWidths[structuralEndLeaf.columnIndex] === 0) {
3730
+ lastVisibleRightPinnedHeadCell.classList.add('hide-right-border');
3731
+ this.dynamicHideRightBorderCells.add(lastVisibleRightPinnedHeadCell);
3732
+ lastVisibleRightPinnedBodyCells.forEach((cell) => {
3733
+ // Only track cells that don't already hold `hide-right-border` from their
3734
+ // static render (isViewEnd/isNoPinnedEnd). Adding a statically-classed cell
3735
+ // here would let the per-class clear erroneously strip the static class on
3736
+ // the next resize (mirrors the VD-9540 divider guard).
3737
+ if (!cell.classList.contains('hide-right-border')) {
3738
+ cell.classList.add('hide-right-border');
3739
+ this.dynamicHideRightBorderCells.add(cell);
3740
+ }
3741
+ });
3742
+ }
3743
+ }
3744
+ // Sync colspan on pinned body cells that span breakpoint-hidden columns.
3745
+ // Chrome does not honour visibility:collapse / display:none on <col> for table layout,
3746
+ // so we directly adjust the shadow <td> colspan attribute to exclude hidden columns (VD-9540).
3747
+ this.syncColspanForHiddenColumns(leafWidths, pinnedColumnBodyCellRenderInputMap);
3748
+ return unreadyCells;
3327
3749
  }
3328
3750
  getRowShadowThWidths() {
3329
3751
  const row = this.host.shadowRoot.querySelector('vega-table-head-row');
@@ -3360,6 +3782,33 @@ class VegaTablePinnedRenderer extends globalSlimmerRegistry.VegaSlimmer {
3360
3782
  }
3361
3783
  });
3362
3784
  }
3785
+ syncColspanForHiddenColumns(leafWidths, pinnedColumnBodyCellRenderInputMap) {
3786
+ // NOTE: renderInput.colSpan is null for flat (non-group) tables — it only holds a value for
3787
+ // group-column subtree spans. We read the original colspan from the component prop (bodyCell.colSpan)
3788
+ // which is always the rendered value, unaffected by our shadow-DOM attribute writes.
3789
+ //
3790
+ // Skip when ALL leaf widths are 0 — that means the table is running in jsdom / an off-screen
3791
+ // context where getBoundingClientRect() always returns 0. Adjusting in that state would
3792
+ // incorrectly reduce every colspan to 1 (no visible columns = Math.max(1,0)=1).
3793
+ if (leafWidths.every((w) => w === 0))
3794
+ return;
3795
+ pinnedColumnBodyCellRenderInputMap.forEach((renderInput, bodyCell) => {
3796
+ var _a;
3797
+ const originalColspan = bodyCell.colSpan || 1;
3798
+ if (originalColspan <= 1)
3799
+ return;
3800
+ /* istanbul ignore next -- defensive null-guard: jsdom always provides shadowRoot */
3801
+ const shadowTd = (_a = bodyCell.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('td');
3802
+ /* istanbul ignore next -- shadowTd is always present in jsdom */
3803
+ if (!shadowTd)
3804
+ return;
3805
+ // Count how many columns in the span are visible (width > 0) — hidden breakpoint
3806
+ // columns have leafWidth === 0 because their <th> has display:none.
3807
+ const spanned = leafWidths.slice(renderInput.columnIndex, renderInput.columnIndex + originalColspan);
3808
+ const effectiveColspan = Math.max(1, spanned.filter((w) => w > 0).length);
3809
+ shadowTd.setAttribute('colspan', String(effectiveColspan));
3810
+ });
3811
+ }
3363
3812
  updateCellPinnedPosition(renderInput, headCell, prevShadowThWidth, leafWidths, nextShadowThWidth) {
3364
3813
  if (['left', 'right'].includes(renderInput.pinned)) {
3365
3814
  const shadowCell = headCell.shadowRoot.querySelector('th, td');
@@ -3371,10 +3820,17 @@ class VegaTablePinnedRenderer extends globalSlimmerRegistry.VegaSlimmer {
3371
3820
  this.updatePinnedPosition(shadowCell, 'left', position);
3372
3821
  }
3373
3822
  if (renderInput.pinned === 'right') {
3374
- const colSpan = typeGuard.isNonNullable(renderInput.colSpan) ? renderInput.colSpan : 1;
3823
+ // renderInput.colSpan is null for flat (non-group) tables it only carries a value
3824
+ // for group-column subtree spans (multi-level headers). For body cells with an HTML
3825
+ // colspan (e.g. colSpan:2 spanning the last two right-pinned columns), we read the
3826
+ // actual span from the host component prop so the right-edge offset is calculated
3827
+ // over the full spanned width rather than just one column (VD-9565).
3828
+ const colSpan = typeGuard.isNonNullable(renderInput.colSpan)
3829
+ ? renderInput.colSpan
3830
+ : headCell.colSpan || 1;
3375
3831
  const position = nextShadowThWidth +
3376
3832
  leafWidths
3377
- .slice(renderInput.columnIndex + (colSpan - 1) + 1)
3833
+ .slice(renderInput.columnIndex + colSpan)
3378
3834
  .reduce((count, colWidth) => count + colWidth, 0);
3379
3835
  this.updatePinnedPosition(shadowCell, 'right', position);
3380
3836
  }
@@ -3429,6 +3885,15 @@ class VegaTablePinnedRenderer extends globalSlimmerRegistry.VegaSlimmer {
3429
3885
  cell.style.width = '';
3430
3886
  }
3431
3887
  });
3888
+ // Remove boundary classes only from cells where they were dynamically added
3889
+ // (breakpoint-shifted boundaries). Static boundary classes from renderInput are
3890
+ // re-applied by the cell's own render cycle.
3891
+ this.dynamicRightDividerCells.forEach((cell) => cell.classList.remove('right-divider'));
3892
+ this.dynamicRightDividerCells.clear();
3893
+ this.dynamicLeftDividerCells.forEach((cell) => cell.classList.remove('left-divider'));
3894
+ this.dynamicLeftDividerCells.clear();
3895
+ this.dynamicHideRightBorderCells.forEach((cell) => cell.classList.remove('hide-right-border'));
3896
+ this.dynamicHideRightBorderCells.clear();
3432
3897
  this.previouslyStyledCells.clear();
3433
3898
  }
3434
3899
  updatePinnedPosition(cell, type, position) {
@@ -4099,7 +4564,7 @@ __decorate$A([
4099
4564
  globalSlimmerRegistry.MapToComponentMethod('watchRowDraggable')
4100
4565
  ], VegaTableRowDraggableController.prototype, "watchRowDraggable", null);
4101
4566
 
4102
- const vegaTableCss = ":host{display:block}table{width:100%;border-spacing:0}.vega-table-empty-description{text-align:center;padding:24px;font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px;color:rgba(var(--v-text-secondary, 107, 116, 125, 1))}@media screen and (min-width: 768px) and (max-width: 1023px){.vega-table-empty-description{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}@media screen and (min-width: 1024px) and (max-width: 1439px){.vega-table-empty-description{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}@media screen and (min-width: 1440px) and (max-width: 9999px){.vega-table-empty-description{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}table.v-table-fixed{table-layout:fixed}.vega-table-scrollable-container{overflow:auto}.vega-table-scrollable-container vega-table-head{transition-property:box-shadow;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.vega-table-scrollable-container.scrolled vega-table-head.fixed-header,.vega-table-scrollable-container.scrolled ::slotted(vega-table-head.fixed-header){box-shadow:0px 4px 0px rgba(0, 0, 0, 0.1);}.vega-table-scrollable-container.scrolled vega-table-foot.fixed-footer::after,.vega-table-scrollable-container.scrolled ::slotted(vega-table-foot.fixed-footer)::after{content:\"\";position:absolute;top:0;left:0;width:100%;height:1px;background-color:rgba(var(--v-bg-divider, 171, 198, 216, 1))}vega-form{display:contents}table:not(.show-edit-error) *::part(field-error-message){display:none !important}.vega-table-pagination-container{margin-top:24px}.vega-table-pagination-container.bottom-center{display:flex;justify-content:center}.vega-table-pagination-container.bottom-right{display:flex;justify-content:flex-end}.vega-table-pagination-container.bottom-left{display:flex;justify-content:flex-start}col.v-hidden{display:none}@media (min-width: 320px){col.S\\:v-table-column{display:table-column}}@media (min-width: 768px){col.M\\:v-table-column{display:table-column}}@media (min-width: 1024px){col.L\\:v-table-column{display:table-column}}@media (min-width: 1440px){col.XL\\:v-table-column{display:table-column}}:host(.is-group-table) .vega-table-scrollable-container{border-color:rgba(var(--v-border-color-divider, 171, 198, 216, 1));border-width:1px;border-style:solid}:host(.is-group-table.density-relaxed) .vega-table-scrollable-container{border-radius:12px}:host(.is-group-table.density-default) .vega-table-scrollable-container{border-radius:12px}:host(.is-group-table.density-compact) .vega-table-scrollable-container{border-radius:4px}:host(.is-pinned-table) table{min-width:max-content}.draggable-col{min-width:16px;width:16px}";
4567
+ const vegaTableCss = ":host{display:block}table{width:100%;border-spacing:0}.vega-table-empty-description{text-align:center;padding:24px;font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px;color:rgba(var(--v-text-secondary, 107, 116, 125, 1))}@media screen and (min-width: 768px) and (max-width: 1023px){.vega-table-empty-description{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}@media screen and (min-width: 1024px) and (max-width: 1439px){.vega-table-empty-description{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}@media screen and (min-width: 1440px) and (max-width: 9999px){.vega-table-empty-description{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}table.v-table-fixed{table-layout:fixed}.vega-table-scrollable-container{overflow:auto}.vega-table-scrollable-container vega-table-head{transition-property:box-shadow;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.vega-table-scrollable-container.scrolled vega-table-head.fixed-header,.vega-table-scrollable-container.scrolled ::slotted(vega-table-head.fixed-header){box-shadow:0px 4px 0px rgba(0, 0, 0, 0.1);}.vega-table-scrollable-container.scrolled vega-table-foot.fixed-footer::after,.vega-table-scrollable-container.scrolled ::slotted(vega-table-foot.fixed-footer)::after{content:\"\";position:absolute;top:0;left:0;width:100%;height:1px;background-color:rgba(var(--v-bg-divider, 171, 198, 216, 1))}vega-form{display:contents}table:not(.show-edit-error) *::part(field-error-message){display:none !important}.vega-table-pagination-container{margin-top:24px}.vega-table-pagination-container.bottom-center{display:flex;justify-content:center}.vega-table-pagination-container.bottom-right{display:flex;justify-content:flex-end}.vega-table-pagination-container.bottom-left{display:flex;justify-content:flex-start}col.v-hidden{display:none;visibility:collapse}@media (min-width: 320px){col.S\\:v-table-column{display:table-column;visibility:visible}}@media (min-width: 768px){col.M\\:v-table-column{display:table-column;visibility:visible}}@media (min-width: 1024px){col.L\\:v-table-column{display:table-column;visibility:visible}}@media (min-width: 1440px){col.XL\\:v-table-column{display:table-column;visibility:visible}}:host(.is-group-table) .vega-table-scrollable-container{border-color:rgba(var(--v-border-color-divider, 171, 198, 216, 1));border-width:1px;border-style:solid}:host(.is-group-table.density-relaxed) .vega-table-scrollable-container{border-radius:12px}:host(.is-group-table.density-default) .vega-table-scrollable-container{border-radius:12px}:host(.is-group-table.density-compact) .vega-table-scrollable-container{border-radius:4px}:host(.is-pinned-table) table{min-width:max-content}.draggable-col{min-width:16px;width:16px}";
4103
4568
 
4104
4569
  var __decorate$z = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
4105
4570
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -4141,6 +4606,7 @@ const VegaTable = class {
4141
4606
  this.vegaTableBodyRenderer = new VegaTableBodyRenderer();
4142
4607
  this.vegaTableRowRenderer = new VegaTableRowRenderer$1();
4143
4608
  this.vegaTableCellRenderer = new VegaTableCellRenderer();
4609
+ this.vegaTableBodyColSpanController = new VegaTableBodyColSpanController();
4144
4610
  this.vegaTablePaginationRenderer = new VegaTablePaginationRenderer();
4145
4611
  this.vegaTableScrollContainerRenderer = new VegaTableScrollContainerRenderer();
4146
4612
  this.vegaTableRowSelectionController = new VegaTableRowSelectionController$1();
@@ -4637,6 +5103,9 @@ __decorate$z([
4637
5103
  __decorate$z([
4638
5104
  globalSlimmerRegistry.InjectVegaSlimmer()
4639
5105
  ], VegaTable.prototype, "vegaTableCellRenderer", void 0);
5106
+ __decorate$z([
5107
+ globalSlimmerRegistry.InjectVegaSlimmer()
5108
+ ], VegaTable.prototype, "vegaTableBodyColSpanController", void 0);
4640
5109
  __decorate$z([
4641
5110
  globalSlimmerRegistry.InjectVegaSlimmer()
4642
5111
  ], VegaTable.prototype, "vegaTablePaginationRenderer", void 0);
@@ -5043,7 +5512,7 @@ const VegaTableCell = class {
5043
5512
  };
5044
5513
  }
5045
5514
  render() {
5046
- var _a, _b, _c;
5515
+ var _a, _b, _c, _d, _e, _f;
5047
5516
  const responsiveClass = generateResponsiveClass(this.breakpoint, 'v-table-cell');
5048
5517
  const columnAlignClass = generateTextAlignClass(this.textAlign);
5049
5518
  const overflowClass = this.getCellOverflowClass();
@@ -5057,7 +5526,7 @@ const VegaTableCell = class {
5057
5526
  if ((_b = this.renderInput) === null || _b === void 0 ? void 0 : _b.isLeftEndPinned) {
5058
5527
  columnClasses.push('right-divider');
5059
5528
  }
5060
- if ((_c = this.renderInput) === null || _c === void 0 ? void 0 : _c.isNoPinnedEnd) {
5529
+ if (((_c = this.renderInput) === null || _c === void 0 ? void 0 : _c.isNoPinnedEnd) || ((_d = this.renderInput) === null || _d === void 0 ? void 0 : _d.isViewEnd)) {
5061
5530
  columnClasses.push('hide-right-border');
5062
5531
  }
5063
5532
  return component.sanitizeVegaComponent(index.h(index.Host, { class: ui.arrayToClassString([
@@ -5068,7 +5537,7 @@ const VegaTableCell = class {
5068
5537
  this.checked && 'checked',
5069
5538
  this.striped && 'striped',
5070
5539
  this.expanded && 'expanded',
5071
- ]) }, index.h("td", { class: ui.arrayToClassString(columnClasses), part: "cell",
5540
+ ]), "aria-colspan": ((_e = this.colSpan) !== null && _e !== void 0 ? _e : 0) > 1 ? String(this.colSpan) : null }, index.h("td", { class: ui.arrayToClassString(columnClasses), part: "cell", colSpan: ((_f = this.colSpan) !== null && _f !== void 0 ? _f : 0) > 1 ? this.colSpan : null,
5072
5541
  /* eslint-disable-next-line react/jsx-no-bind */
5073
5542
  onMouseEnter: this.onMouseEnter.bind(this),
5074
5543
  /* eslint-disable-next-line react/jsx-no-bind */
@@ -5379,13 +5848,22 @@ class VegaTableExpandRowColSpanController extends globalSlimmerRegistry.VegaSlim
5379
5848
  const cells = isTemplateRenderMode
5380
5849
  ? table.querySelectorAll('vega-table-row:nth-of-type(1) vega-table-cell')
5381
5850
  : table.shadowRoot.querySelectorAll('vega-table-row:nth-of-type(1) vega-table-cell');
5382
- return Array.from(cells).filter((cell) => {
5851
+ return Array.from(cells)
5852
+ .filter((cell) => {
5383
5853
  if (!cell.breakpoint)
5384
5854
  return true;
5385
5855
  if (currentBreakpoint === 'default')
5386
5856
  return false;
5387
5857
  return breakpoints$1.Breakpoints[currentBreakpoint] >= breakpoints$1.Breakpoints[cell.breakpoint];
5388
- }).length;
5858
+ })
5859
+ .reduce((total, cell) => {
5860
+ var _a;
5861
+ // A cell with `colSpan >= 2` is a single element that occupies multiple physical
5862
+ // columns, so add its span rather than 1. This keeps the expand-row colspan aligned
5863
+ // with the full table width when body cells merge columns.
5864
+ const span = (_a = cell.colSpan) !== null && _a !== void 0 ? _a : 1;
5865
+ return total + (span > 1 ? span : 1);
5866
+ }, 0);
5389
5867
  }
5390
5868
  }
5391
5869
  __decorate$p([
@@ -5659,11 +6137,12 @@ var __decorate$k = (undefined && undefined.__decorate) || function (decorators,
5659
6137
  };
5660
6138
  class VegaTableFootCellRenderer extends globalSlimmerRegistry.VegaSlimmer {
5661
6139
  render() {
6140
+ var _a;
5662
6141
  return (index.h("td", { class: {
5663
6142
  'vega-table-cell': true,
5664
6143
  'break-word': !featureFlagController.FeatureFlag.isEnabled('VEGA_TABLE.ENABLE_NEW_CELL_BREAK_WORDS_STYLE'),
5665
6144
  [generateResponsiveClass(this.breakpoint, 'v-table-cell')]: true,
5666
- } },
6145
+ }, colSpan: ((_a = this.colSpan) !== null && _a !== void 0 ? _a : 0) > 1 ? this.colSpan : null },
5667
6146
  index.h("div", { class: ui.arrayToClassString(['vega-table-column', this.textAlign]) },
5668
6147
  index.h("span", { class: "vega-table-column-label" },
5669
6148
  index.h("slot", null)))));
@@ -5678,6 +6157,9 @@ __decorate$k([
5678
6157
  __decorate$k([
5679
6158
  globalSlimmerRegistry.MapToComponentField()
5680
6159
  ], VegaTableFootCellRenderer.prototype, "textAlign", void 0);
6160
+ __decorate$k([
6161
+ globalSlimmerRegistry.MapToComponentField()
6162
+ ], VegaTableFootCellRenderer.prototype, "colSpan", void 0);
5681
6163
 
5682
6164
  const vegaTableFootCellCss = ":host .vega-table-cell.v-hidden{display:none}@media (min-width: 320px){:host .vega-table-cell.S\\:v-table-cell{display:table-cell}}@media (min-width: 768px){:host .vega-table-cell.M\\:v-table-cell{display:table-cell}}@media (min-width: 1024px){:host .vega-table-cell.L\\:v-table-cell{display:table-cell}}@media (min-width: 1440px){:host .vega-table-cell.XL\\:v-table-cell{display:table-cell}}:host{display:contents}td{background-color:rgba(var(--v-bg-table-header, 240, 243, 247, 1));color:rgba(var(--v-text-primary, 32, 54, 69, 1));text-align:left;vertical-align:middle;padding:12px;font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px;overflow-wrap:break-word}@media screen and (min-width: 768px) and (max-width: 1023px){td{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}@media screen and (min-width: 1024px) and (max-width: 1439px){td{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}@media screen and (min-width: 1440px) and (max-width: 9999px){td{font-family:\"Inter\", sans-serif;font-size:14px;font-weight:700;line-height:18px}}td.break-word{word-break:break-word}.vega-table-column{display:flex;align-items:center}.vega-table-column.center{justify-content:center;text-align:center}.vega-table-column.right{justify-content:flex-end;text-align:right}.vega-table-column.left{justify-content:flex-start;text-align:left}.vega-table-column .vega-table-column-label{min-width:0px}:host(.density-default) .vega-table-cell{padding:12px}:host(.density-compact) .vega-table-cell{padding:4px}:host(.density-relaxed) .vega-table-cell{padding:16px}:host(.column-divider) .vega-table-cell{border-color:rgba(var(--v-border-color-divider, 171, 198, 216, 1));border-right-width:1px;border-right-style:solid}";
5683
6165
 
@@ -5702,10 +6184,11 @@ const VegaTableFootCell = class {
5702
6184
  this.currentBreakpoint = breakpoints.getCurrentBreakpoint();
5703
6185
  }
5704
6186
  render() {
6187
+ var _a;
5705
6188
  return component.sanitizeVegaComponent(index.h(index.Host, { class: {
5706
6189
  [`density-${responsiveFormatFacade.ResponsiveFormatFacade.formatCustom(this.density)}`]: true,
5707
6190
  'column-divider': this.columnDivider,
5708
- }, style: { width: this.width } }, this.vegaTableFootCellRenderer.render()), this.host);
6191
+ }, style: { width: this.width }, "aria-colspan": ((_a = this.colSpan) !== null && _a !== void 0 ? _a : 0) > 1 ? String(this.colSpan) : null }, this.vegaTableFootCellRenderer.render()), this.host);
5709
6192
  }
5710
6193
  get host() { return index.getElement(this); }
5711
6194
  };