@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
@@ -9,26 +9,26 @@ import { O as Observer } from './observer-3959f9dd.js';
9
9
  import { f as findParent, a as arrayToClassString, m as extractNumberFromString } from './ui-d73f756a.js';
10
10
  import { d as domNodeSubjectFactory, D as DomNodeSubjectObserverFactory } from './dom-node-subject-observer-factory-ddff8662.js';
11
11
  import { r as remoteInvocationRegistry } from './remote-invocation-registry-d69245c2.js';
12
- import { U as VegaInternalTableRowExpand, W as VegaInternalTableRowSelect, X as VegaInternalTableRowSelectAll, Y as VegaInternalVegaTableRenderInputChange, Z as VegaInternalColumnHeadRowRenderInputRIC, _ as VegaInternalColumnHeadCellRenderInputRIC, $ as VegaInternalColumnBodyCellRenderInputRIC, a0 as VegaInternalTableHeadCellSortEvent } from './vega-internal-event-id-22151a4d.js';
13
- import { a as VegaClick, j as VegaChange, Z as VegaPageSizeChange, d as VegaExpand, a1 as VegaSelectChange, a2 as VegaSelectAllChange, a3 as VegaRowClick, a4 as VegaRowExpand, a5 as VegaRowDragDrop, a6 as VegaRowSelect, a7 as VegaRowSelectAll } from './vega-event-id-268f8def.js';
14
- import { R as ResponsiveFormatFacade } from './responsive-format-facade-844c5e09.js';
15
- import { i as isNonNullable, s as isBreakpointsTokenType, ap as isVegaTableColumnGroupingModelType } from './type-guard-a2cbaae9.js';
12
+ import { U as VegaInternalTableRowExpand, W as VegaInternalTableRowSelect, X as VegaInternalTableRowSelectAll, Y as VegaInternalVegaTableRenderInputChange, Z as VegaInternalColumnHeadRowRenderInputRIC, _ as VegaInternalColumnHeadCellRenderInputRIC, $ as VegaInternalColumnBodyCellRenderInputRIC, a0 as VegaInternalTableHeadCellSortEvent } from './vega-internal-event-id-827eb1ce.js';
13
+ import { a as VegaClick, d as VegaChange, _ as VegaPageSizeChange, e as VegaExpand, a2 as VegaSelectChange, a3 as VegaSelectAllChange, a4 as VegaRowClick, a5 as VegaRowExpand, a6 as VegaRowDragDrop, a7 as VegaRowSelect, a8 as VegaRowSelectAll } from './vega-event-id-270fe47e.js';
14
+ import { R as ResponsiveFormatFacade } from './responsive-format-facade-299e6304.js';
15
+ import { i as isNonNullable, s as isBreakpointsTokenType, ap as isVegaTableColumnGroupingModelType } from './type-guard-2bfb2c7b.js';
16
16
  import { s as sanitizeVegaComponent } from './component-7d906393.js';
17
17
  import { g as generateUUID } from './misc-9fdbcfbb.js';
18
18
  import { g as getCurrentBreakpoint } from './breakpoints-332702ed.js';
19
19
  import { M as MutationObserverSlimmer } from './mutation-observer-slimmer-58ebc13c.js';
20
20
  import { T as TagNameMutationFilter } from './mutation-observer-filters-1a054fb0.js';
21
21
  import { P as PageResizeObserverSlimmer } from './page-resize-observer-slimmer-e24d36c5.js';
22
- import { c as createSubStateNotifySlimmer } from './sub-state-notify-slimmer-7ef94141.js';
23
- import { C as ChildNodesEventPreventSlimmer } from './child-nodes-event-prevent-slimmer-50022584.js';
24
- import { c as createEventEmitSlimmer } from './event-emit-slimmer-b94cec83.js';
22
+ import { c as createSubStateNotifySlimmer } from './sub-state-notify-slimmer-0f72ce74.js';
23
+ import { C as ChildNodesEventPreventSlimmer } from './child-nodes-event-prevent-slimmer-96c14f5a.js';
24
+ import { c as createEventEmitSlimmer } from './event-emit-slimmer-db4a82e0.js';
25
25
  import { I as ImmutableMap } from './immutable-map-4fe22b11.js';
26
- import { T as TranslationSlimmer } from './translation-slimmer-4904e7fe.js';
26
+ import { T as TranslationSlimmer } from './translation-slimmer-3ea56354.js';
27
27
  import { S as SynchronizeTaskQueue } from './synchronize-task-queue-ac8acc3b.js';
28
28
  import { c as createDynamicSlimmer } from './dynamic-slimmer-90b8af32.js';
29
29
  import { I as InternalVegaZIndexManager } from './internal-vega-z-index-manager-7d2b54c3.js';
30
- import { S as SubStateObserverSlimmer } from './sub-state-observer-slimmer-d9ad2bdd.js';
31
- import { F as FeatureFlag } from './feature-flag-controller-2a89f20c.js';
30
+ import { S as SubStateObserverSlimmer } from './sub-state-observer-slimmer-64532d94.js';
31
+ import { F as FeatureFlag } from './feature-flag-controller-3fd04ea9.js';
32
32
  import { B as Breakpoints } from './breakpoints-d9faf11c.js';
33
33
  import { c as createEnterKeyHandlerToTriggerClick } from './accessibility-6af5cf2e.js';
34
34
  import { V as VegaInternalIconManager } from './internal-icon-manager-e7c57096.js';
@@ -39,9 +39,9 @@ import './number-4398f2e1.js';
39
39
  import './pixel-f32c07ce.js';
40
40
  import './array-7888f339.js';
41
41
  import './typography-19c3b9be.js';
42
- import './internal-translation-controller-aa09ca87.js';
42
+ import './internal-translation-controller-09b8bd13.js';
43
43
  import './try-get-document-bef0f526.js';
44
- import './internal-vega-event-manager-956cf128.js';
44
+ import './internal-vega-event-manager-48690e5b.js';
45
45
  import './vega-env-manager-8f8dc473.js';
46
46
  import './index-9c9865c0.js';
47
47
  import './icon-manager-4ef3f6dd.js';
@@ -157,7 +157,256 @@ const VegaTableEditableFieldTypes = [
157
157
  'time-picker',
158
158
  ];
159
159
 
160
- var __decorate$U = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
160
+ /**
161
+ * ColumnRenderInputModel
162
+ *
163
+ * Render-time representation of a column or group node used by header/body renderers.
164
+ * Built from a ColumnStructureModel tree, it carries computed layout metadata required
165
+ * for rendering and pinned/sticky calculations (colSpan, rowSpan, pinned boundaries, etc).
166
+ *
167
+ * Instances form a forest (root-level nodes in an array) that mirrors the structure model
168
+ * but contains additional render-specific properties and parent/child links for renderers.
169
+ */
170
+ class ColumnRenderInputModel {
171
+ /**
172
+ * Create a new render input node.
173
+ *
174
+ * @param {string} key - Unique key (matches ColumnStructureModel.key).
175
+ * @param {string} label - Optional display label (from structure model).
176
+ * @param {VegaTablePinnedType} pinned - Pinned type for this node ('left' | 'right' | null).
177
+ * @param {Nullable<number>} colSpan - Number of visual columns spanned by this node's subtree.
178
+ * @param {Nullable<number>} rowSpan - Number of header rows this node should span.
179
+ * @param {boolean} isViewStart - True when this node is the start of a visible view range.
180
+ * @param {boolean} isViewEnd - True when this node is the end of a visible view range.
181
+ * @param {boolean} isLeftEndPinned - True when node is last left-pinned sibling.
182
+ * @param {boolean} isRightStartPinned - True when node is first right-pinned sibling.
183
+ * @param {boolean} isNoPinnedEnd - True when node is last non-pinned sibling.
184
+ * @param {boolean} headHasGroupColumn - Header contains group columns (affects rowSpan).
185
+ * @param {boolean} headHasPinnedColumn - Header contains pinned columns.
186
+ * @param {number} headMaxDepth - Maximum header depth (number of header rows).
187
+ * @param {number} level - Level/index of this node within header rows (0-based).
188
+ * @param {number} columnIndex - Sequential leaf index (used for ordering).
189
+ * @param {Nullable<ColumnRenderInputModel>} parent - Parent render input node (null for root-level).
190
+ * @param {ColumnRenderInputModel[]} children - Child render input nodes.
191
+ */
192
+ constructor(key, label, pinned, colSpan, rowSpan, isViewStart, isViewEnd, isLeftEndPinned, isRightStartPinned, isNoPinnedEnd, headHasGroupColumn, headHasPinnedColumn, headMaxDepth, level, columnIndex, parent, children = []) {
193
+ this.key = key;
194
+ this.label = label;
195
+ this.pinned = pinned;
196
+ this.colSpan = colSpan;
197
+ this.rowSpan = rowSpan;
198
+ this.isViewStart = isViewStart;
199
+ this.isViewEnd = isViewEnd;
200
+ this.isLeftEndPinned = isLeftEndPinned;
201
+ this.isRightStartPinned = isRightStartPinned;
202
+ this.isNoPinnedEnd = isNoPinnedEnd;
203
+ this.headHasGroupColumn = headHasGroupColumn;
204
+ this.headHasPinnedColumn = headHasPinnedColumn;
205
+ this.headMaxDepth = headMaxDepth;
206
+ this.level = level;
207
+ this.columnIndex = columnIndex;
208
+ this.parent = parent;
209
+ this.children = children;
210
+ this.iteratorCacheMap = new Map();
211
+ this.leaves = [];
212
+ }
213
+ /**
214
+ * Build a forest of ColumnRenderInputModel nodes from a ColumnStructureModel root.
215
+ *
216
+ * @param {ColumnStructureModel} rootModel - Root ColumnStructureModel that supplies tree and level data.
217
+ * @returns {ColumnRenderInputModel[]} Array of root-level ColumnRenderInputModel nodes (the render forest).
218
+ */
219
+ static from(rootModel) {
220
+ const renderInputs = [];
221
+ const parentStack = [];
222
+ const maxLevel = rootModel.getMaxDepth();
223
+ const hasGroupColumn = rootModel.hasGroupColumn();
224
+ const hasPinnedColumn = rootModel.hasLeftPinnedColumn() || rootModel.hasRightPinnedColumn();
225
+ let columnIndex = 0;
226
+ // Iterate structure model (DFS by default) and construct render nodes.
227
+ rootModel.iterator().forEach((model) => {
228
+ const parent = model.level > 0 ? parentStack[model.level - 1] : null;
229
+ const isParentStart = hasGroupColumn && this.isParentStart(model);
230
+ const isParentEnd = hasGroupColumn && this.isParentEnd(model);
231
+ 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
232
+ ? parent.isLeftEndPinned && isParentEnd
233
+ : hasPinnedColumn && this.isLeftEndPinned(model), parent
234
+ ? parent.isRightStartPinned && isParentStart
235
+ : hasPinnedColumn && this.isRightStartPinned(model), parent ? parent.isNoPinnedEnd && isParentEnd : hasPinnedColumn && this.isNoPinnedEnd(model), hasGroupColumn, hasPinnedColumn, maxLevel, model.level, columnIndex, parent);
236
+ // Attach to parent if present, otherwise add to root-level array.
237
+ parent ? parent.children.push(renderInput) : renderInputs.push(renderInput);
238
+ // Maintain parent stack keyed by level to allow next nodes to find their parent.
239
+ parentStack[model.level] = renderInput;
240
+ parentStack.length = model.level + 1;
241
+ // Increment leaf index when encountering a leaf structure node.
242
+ if (model.isLeaf())
243
+ columnIndex++;
244
+ });
245
+ return renderInputs;
246
+ }
247
+ /**
248
+ * Create a new render input that merges pinned-boundary flags from a set of spanned leaves.
249
+ *
250
+ * Used when a body cell with `colSpan > 1` consumes neighboring leaves. The spanning cell
251
+ * must inherit boundary indicators (`isLeftEndPinned`, `isRightStartPinned`, `isNoPinnedEnd`)
252
+ * from any consumed leaf that carries them, so the pinned-boundary visual (divider/shadow)
253
+ * remains visible on the spanning cell.
254
+ *
255
+ * @param {ColumnRenderInputModel} base - The render input of the originating (leftmost) leaf.
256
+ * @param {ColumnRenderInputModel[]} spannedLeaves - All leaves consumed by the span (including base).
257
+ * @returns {ColumnRenderInputModel} A new instance with OR-merged boundary flags.
258
+ */
259
+ static withMergedBoundaries(base, spannedLeaves) {
260
+ let isLeftEndPinned = base.isLeftEndPinned;
261
+ let isRightStartPinned = base.isRightStartPinned;
262
+ let isNoPinnedEnd = base.isNoPinnedEnd;
263
+ let isViewEnd = base.isViewEnd;
264
+ for (const leaf of spannedLeaves) {
265
+ isLeftEndPinned = isLeftEndPinned || leaf.isLeftEndPinned;
266
+ isRightStartPinned = isRightStartPinned || leaf.isRightStartPinned;
267
+ isNoPinnedEnd = isNoPinnedEnd || leaf.isNoPinnedEnd;
268
+ isViewEnd = isViewEnd || leaf.isViewEnd;
269
+ }
270
+ // Return the base unchanged when no flags were gained (common fast-path).
271
+ if (isLeftEndPinned === base.isLeftEndPinned &&
272
+ isRightStartPinned === base.isRightStartPinned &&
273
+ isNoPinnedEnd === base.isNoPinnedEnd &&
274
+ isViewEnd === base.isViewEnd) {
275
+ return base;
276
+ }
277
+ 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);
278
+ }
279
+ /**
280
+ * True when the provided structure model is the last left-pinned sibling in its parent's children.
281
+ * Used to mark boundary nodes for left-pinned groups.
282
+ *
283
+ * @param {ColumnStructureModel} model - Structure model to check.
284
+ * @returns {boolean} True when model is the last left-pinned sibling.
285
+ */
286
+ static isLeftEndPinned(model) {
287
+ const siblings = model.parent
288
+ .getOrderedChildren()
289
+ .filter((child) => child.pinned === 'left');
290
+ return siblings[siblings.length - 1] === model;
291
+ }
292
+ /**
293
+ * True when the provided structure model is the first right-pinned sibling in its parent's children.
294
+ * Used to mark boundary nodes for right-pinned groups.
295
+ *
296
+ * @param {ColumnStructureModel} model - Structure model to check.
297
+ * @returns {boolean} True when model is the first right-pinned sibling.
298
+ */
299
+ static isRightStartPinned(model) {
300
+ const siblings = model.parent
301
+ .getOrderedChildren()
302
+ .filter((child) => child.pinned === 'right');
303
+ return siblings[0] === model;
304
+ }
305
+ /**
306
+ * True when the provided structure model is the last non-pinned sibling in its parent's children.
307
+ * Useful to handle the 'no-pinned-end' condition.
308
+ *
309
+ * @param {ColumnStructureModel} model - Structure model to check.
310
+ * @returns {boolean} True when model is the last non-pinned sibling.
311
+ */
312
+ static isNoPinnedEnd(model) {
313
+ const siblings = model.parent
314
+ .getOrderedChildren()
315
+ .filter((child) => !child.pinned);
316
+ return siblings[siblings.length - 1] === model;
317
+ }
318
+ /**
319
+ * True when the provided model is the first child of its parent.
320
+ *
321
+ * @param {ColumnStructureModel} model - Structure model to check.
322
+ * @returns {boolean} True when model is the first child.
323
+ */
324
+ static isParentStart(model) {
325
+ return model.parent.getOrderedChildren()[0] === model;
326
+ }
327
+ /**
328
+ * True when the provided model is the last child of its parent.
329
+ *
330
+ * @param {ColumnStructureModel} model - Structure model to check.
331
+ * @returns {boolean} True when model is the last child.
332
+ */
333
+ static isParentEnd(model) {
334
+ const parentChildren = model.parent.getOrderedChildren();
335
+ return parentChildren[parentChildren.length - 1] === model;
336
+ }
337
+ /**
338
+ * Compute a node's colSpan by iterating its subtree and counting the maximum number
339
+ * of nodes present at any single level (visual column span).
340
+ *
341
+ * @param {ColumnStructureModel} mode - ColumnStructureModel node to examine.
342
+ * @returns {number} Number of visual columns spanned by the node.
343
+ */
344
+ static getColSpan(mode) {
345
+ const children = mode.iterator();
346
+ const rowMap = {};
347
+ children.forEach((node) => {
348
+ rowMap[node.level] = (rowMap[node.level] || 0) + 1;
349
+ });
350
+ return Math.max(...Object.values(rowMap));
351
+ }
352
+ /**
353
+ * Return cached leaf render nodes for this subtree.
354
+ * Caches the result on first call and returns cached array on subsequent calls.
355
+ *
356
+ * @returns {ColumnRenderInputModel[]} Array of leaf render input nodes.
357
+ */
358
+ getLeaves() {
359
+ if (this.leaves.length > 0) {
360
+ return this.leaves;
361
+ }
362
+ const leaves = this.iterator().filter((model) => model.isLeaf());
363
+ this.leaves = leaves;
364
+ return leaves;
365
+ }
366
+ /**
367
+ * Generic iterator that supports traversal modes ('dfs' currently implemented).
368
+ *
369
+ * @param {IteratorMode} [mode='dfs'] - Iterator mode ('dfs' | 'bfs').
370
+ * @returns {ColumnRenderInputModel[]} Traversal-ordered array of nodes.
371
+ */
372
+ iterator(mode = 'dfs') {
373
+ if (mode === 'dfs') {
374
+ return this.dfsIterator();
375
+ }
376
+ // Future: implement BFS mode here.
377
+ return [];
378
+ }
379
+ /**
380
+ * Depth-first pre-order traversal of this node and its descendants.
381
+ * Caches the result for the 'dfs' mode to avoid repeated recursion.
382
+ *
383
+ * @returns {ColumnRenderInputModel[]} Array of nodes in DFS order (includes this node).
384
+ */
385
+ dfsIterator() {
386
+ if (this.iteratorCacheMap.has('dfs')) {
387
+ return this.iteratorCacheMap.get('dfs');
388
+ }
389
+ const localResult = [];
390
+ localResult.push(this);
391
+ if (this.children && this.children.length > 0) {
392
+ this.children.forEach((child) => {
393
+ localResult.push(...child.dfsIterator());
394
+ });
395
+ }
396
+ this.iteratorCacheMap.set('dfs', localResult);
397
+ return localResult;
398
+ }
399
+ /**
400
+ * True when this render node has no children (visual leaf).
401
+ *
402
+ * @returns {boolean} True when node is a leaf.
403
+ */
404
+ isLeaf() {
405
+ return !this.children || this.children.length === 0;
406
+ }
407
+ }
408
+
409
+ var __decorate$V = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
161
410
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
162
411
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
163
412
  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;
@@ -177,7 +426,7 @@ var __rest$1 = (undefined && undefined.__rest) || function (s, e) {
177
426
  class VegaTableCellRenderer extends VegaSlimmer {
178
427
  constructor() {
179
428
  super(...arguments);
180
- this.renderTableCellContent = (column, record, index) => {
429
+ this.renderTableCellContent = (column, record, index, isSpanning) => {
181
430
  var _a, _b;
182
431
  const value = getValueByPath(record, column.prop);
183
432
  const rowKey = this.vegaTableDataSourceController.getRecordKey(record);
@@ -186,13 +435,14 @@ class VegaTableCellRenderer extends VegaSlimmer {
186
435
  .find((item) => this.vegaTableDataSourceController.getRecordKey(item) === rowKey);
187
436
  const editing = this.vegaTableEditableController.isEditing(rowKey);
188
437
  const rowForm = this.vegaTableEditableController.getRowFormRefMap().get(rowKey);
189
- if (editing && rowForm && column.renderFormItem) {
438
+ // REQ-007: spanning cells are forced read-only — never render editable form items.
439
+ if (!isSpanning && editing && rowForm && column.renderFormItem) {
190
440
  return column.renderFormItem(h, column.prop ? value : rowKey, record, index, {
191
441
  rowForm,
192
442
  isNewRow,
193
443
  });
194
444
  }
195
- if (editing && rowForm && column.editable) {
445
+ if (!isSpanning && editing && rowForm && column.editable) {
196
446
  const formItemProps = (_a = column.formItemProps) === null || _a === void 0 ? void 0 : _a.call(column, rowForm, {
197
447
  record,
198
448
  index,
@@ -240,58 +490,277 @@ class VegaTableCellRenderer extends VegaSlimmer {
240
490
  new RegExp(VegaTableEditableFieldTypes.join('|'), 'i').test(tagName));
241
491
  };
242
492
  }
243
- render(renderInput, record, index) {
244
- const column = this.columns.find((column) => column.key === renderInput.key ||
245
- column.prop === renderInput.key ||
246
- column.label === renderInput.key);
493
+ render(renderInput, record, index, colSpanResult) {
494
+ var _a;
495
+ const column = this.vegaTableBodyColSpanController.findColumn(renderInput);
496
+ /* istanbul ignore next -- defensive: colSpanResult is always provided by the caller */
497
+ const htmlColspan = (_a = colSpanResult === null || colSpanResult === void 0 ? void 0 : colSpanResult.htmlColspan) !== null && _a !== void 0 ? _a : 1;
498
+ const isSpanning = htmlColspan > 1;
499
+ // When a cell spans, merge pinned-boundary flags from all consumed leaves so the spanning
500
+ // cell inherits boundary indicators (e.g. right-divider for pinned-end).
501
+ const effectiveRenderInput = isSpanning && colSpanResult
502
+ ? this.getMergedRenderInputForSpan(renderInput, colSpanResult)
503
+ : renderInput;
247
504
  if (column) {
248
505
  const rowKey = this.vegaTableDataSourceController.getRecordKey(record);
249
506
  const columnKey = `${rowKey}_${column.key || column.prop}`;
250
- return (h("vega-table-cell", { key: columnKey, textAlign: column.align, breakpoint: column.breakpoint, overflow: column.overflow, ref: (ref) => {
251
- this.vegaTableRenderInputController.addCellRenderInputMap(ref, renderInput);
252
- } }, this.renderTableCellContent(column, record, index)));
507
+ return (h("vega-table-cell", { key: columnKey, textAlign: column.align, breakpoint: column.breakpoint, overflow: column.overflow, colSpan: isSpanning ? htmlColspan : undefined, ref: (ref) => {
508
+ this.vegaTableRenderInputController.addCellRenderInputMap(ref, effectiveRenderInput);
509
+ } }, this.renderTableCellContent(column, record, index, isSpanning)));
253
510
  }
254
511
  else {
255
512
  return (h("vega-table-cell", { key: renderInput.key, ref: (ref) => {
256
- this.vegaTableRenderInputController.addCellRenderInputMap(ref, renderInput);
513
+ this.vegaTableRenderInputController.addCellRenderInputMap(ref, effectiveRenderInput);
257
514
  } }));
258
515
  }
259
516
  }
517
+ /**
518
+ * Build a render input with merged boundary flags from all leaves consumed by a body colSpan.
519
+ *
520
+ * @param {ColumnRenderInputModel} baseInput - The starting leaf's render input.
521
+ * @param {BodyColSpanResult} colSpanResult - The resolved span result (provides skipCount).
522
+ * @returns {ColumnRenderInputModel} A render input with OR-merged boundary flags.
523
+ */
524
+ getMergedRenderInputForSpan(baseInput, colSpanResult) {
525
+ const allLeaves = this.vegaTableRenderInputController.getLeafRenderInputs();
526
+ const startIndex = allLeaves.indexOf(baseInput);
527
+ /* istanbul ignore next -- defensive: baseInput should always be in the leaves array */
528
+ if (startIndex < 0)
529
+ return baseInput;
530
+ const spannedLeaves = allLeaves.slice(startIndex + 1, startIndex + 1 + colSpanResult.skipCount);
531
+ return ColumnRenderInputModel.withMergedBoundaries(baseInput, spannedLeaves);
532
+ }
260
533
  }
261
- __decorate$U([
534
+ __decorate$V([
262
535
  MapToComponentField()
263
536
  ], VegaTableCellRenderer.prototype, "rowKey", void 0);
264
- __decorate$U([
265
- MapToComponentField()
266
- ], VegaTableCellRenderer.prototype, "columns", void 0);
267
- __decorate$U([
537
+ __decorate$V([
268
538
  MapToComponentField()
269
539
  ], VegaTableCellRenderer.prototype, "vegaTableDataSourceController", void 0);
270
- __decorate$U([
540
+ __decorate$V([
271
541
  MapToComponentField()
272
542
  ], VegaTableCellRenderer.prototype, "vegaTableEditableController", void 0);
273
- __decorate$U([
543
+ __decorate$V([
274
544
  MapToComponentField()
275
545
  ], VegaTableCellRenderer.prototype, "vegaTableRenderInputController", void 0);
546
+ __decorate$V([
547
+ MapToComponentField()
548
+ ], VegaTableCellRenderer.prototype, "vegaTableBodyColSpanController", void 0);
276
549
 
277
- var __decorate$T = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
278
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
279
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
280
- 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;
281
- return c > 3 && r && Object.defineProperty(target, key, r), r;
282
- };
550
+ const NO_SPAN = { htmlColspan: 1, skipCount: 0 };
283
551
  /**
284
- * The expand row controller of VegaTable
552
+ * Read the declared span for a column, resolving the function form against the row value.
553
+ * Returns 1 when the column declares no span (REQ-008: span < 2 means no spanning).
554
+ *
555
+ * @param {VegaTableColumnConfig} column - The column configuration to read the span from.
556
+ * @param {VegaTableDataSourceItem} record - The row data record (passed to the function form).
557
+ * @param {number} rowIndex - Zero-based index of the row in the current data set.
558
+ * @returns {number} The declared span (>= 1).
285
559
  */
286
- class VegaTableExpandRowController extends VegaSlimmer {
287
- constructor() {
288
- super(...arguments);
289
- /**
290
- * Toggle expandable row by rowKey
291
- *
292
- * @param {string} rowKey - The row key of the row
293
- */
294
- this.toggleExpandRow = (rowKey) => {
560
+ function getDeclaredSpan(column, record, rowIndex) {
561
+ const rawSpan = column === null || column === void 0 ? void 0 : column.colSpan;
562
+ if (rawSpan == null)
563
+ return 1;
564
+ if (typeof rawSpan !== 'function')
565
+ return normalizeSpan(rawSpan);
566
+ const value = column.prop ? getValueByPath(record, column.prop) : undefined;
567
+ return normalizeSpan(rawSpan(value, record, rowIndex));
568
+ }
569
+ /**
570
+ * Normalize a raw span value to a positive integer. Non-finite values (NaN/Infinity) and values
571
+ * below 1 collapse to 1 (no spanning); fractional values are floored so the resulting `colspan`
572
+ * attribute is always a valid integer string.
573
+ *
574
+ * @param {number} rawSpan - The raw span value declared by the column (numeric or function result).
575
+ * @returns {number} A positive integer span (>= 1).
576
+ */
577
+ function normalizeSpan(rawSpan) {
578
+ if (!Number.isFinite(rawSpan))
579
+ return 1;
580
+ const floored = Math.floor(rawSpan);
581
+ return floored >= 1 ? floored : 1;
582
+ }
583
+ /**
584
+ * Walk rightward from the starting leaf to find the widest legal span.
585
+ *
586
+ * Stops (and returns a clamp reason) when the span would either run past the end of the
587
+ * row or cross a pinned ↔ unpinned column boundary (which would break sticky positioning).
588
+ * Breakpoint-hidden columns are intentionally **not** a stop condition — the span mirrors
589
+ * across them (matching header group colSpan).
590
+ *
591
+ * @param {number} declared - The declared span requested by the column.
592
+ * @param {number} leafIndex - Index of the starting leaf in the flattened render-input array.
593
+ * @param {ColumnRenderInputModel[]} allLeaves - All leaf render inputs for the table (ordered).
594
+ * @returns {MaxSpan} The widest legal span plus the clamp reason (null when unconstrained).
595
+ */
596
+ function computeMaxSpan(declared, leafIndex, allLeaves) {
597
+ var _a, _b;
598
+ const startPinned = (_a = allLeaves[leafIndex]) === null || _a === void 0 ? void 0 : _a.pinned;
599
+ let span = 1;
600
+ for (let offset = 1; offset < declared; offset++) {
601
+ const nextLeaf = allLeaves[leafIndex + offset];
602
+ if (!nextLeaf) {
603
+ return {
604
+ span,
605
+ clampReason: `extends past the end of the row (${allLeaves.length} columns total)`,
606
+ };
607
+ }
608
+ // Reject if the next column is in a different pinned group.
609
+ if (nextLeaf.pinned !== startPinned) {
610
+ return {
611
+ span,
612
+ clampReason: `crosses a pinned-column boundary (pinned="${startPinned !== null && startPinned !== void 0 ? startPinned : 'none'}" → pinned="${(_b = nextLeaf.pinned) !== null && _b !== void 0 ? _b : 'none'}")`,
613
+ };
614
+ }
615
+ span++;
616
+ }
617
+ return { span, clampReason: null };
618
+ }
619
+ /**
620
+ * Emit a clamp warning at most once per column key (per-instance, tracked via {@link warnedKeys}).
621
+ *
622
+ * @param {string} colKey - The column key used to dedupe warnings.
623
+ * @param {number} declared - The originally declared span.
624
+ * @param {number} effective - The clamped (effective) span actually applied.
625
+ * @param {string} reason - Human-readable reason the span was clamped.
626
+ * @param {Set<string>} warnedKeys - Per-instance set tracking already-warned column keys.
627
+ */
628
+ function warnClampOnce(colKey, declared, effective, reason, warnedKeys) {
629
+ if (warnedKeys.has(colKey))
630
+ return;
631
+ warnedKeys.add(colKey);
632
+ LogUtility.warn(`[vega-table] colSpan for column "${colKey}" was clamped from ${declared} to ${effective} because it ${reason}.`);
633
+ }
634
+ /**
635
+ * Resolve the effective body-cell colspan for a single source-data row cell.
636
+ *
637
+ * Clamps the declared span so it never runs past the end of the row nor crosses a
638
+ * pinned ↔ unpinned column boundary. Structural clamps (end-of-row / pinned boundary) emit a
639
+ * warning once per column key (tracked via the caller-supplied {@link warnedKeys} set).
640
+ * Breakpoint-hidden columns are **not** clamped — the span mirrors across a `display: none`
641
+ * column (matching header group colSpan) so the body grid stays column-aligned with the header.
642
+ *
643
+ * @param {VegaTableColumnConfig} column - The column configuration for the spanning cell.
644
+ * @param {VegaTableDataSourceItem} record - The row data record.
645
+ * @param {number} rowIndex - Zero-based index of the row in the current data set.
646
+ * @param {number} leafIndex - Index of this column in the flattened leaf render-input array.
647
+ * @param {ColumnRenderInputModel[]} allLeaves - All leaf render inputs for the table (ordered).
648
+ * @param {Set<string>} warnedKeys - Per-instance set tracking column keys that have already received a clamping warning.
649
+ * @returns {BodyColSpanResult} Resolved spanning metadata for the cell.
650
+ */
651
+ function resolveBodyColSpan(column, record, rowIndex, leafIndex, allLeaves, warnedKeys) {
652
+ var _a, _b, _c;
653
+ const declared = getDeclaredSpan(column, record, rowIndex);
654
+ if (!declared || declared <= 1)
655
+ return NO_SPAN;
656
+ const { span, clampReason } = computeMaxSpan(declared, leafIndex, allLeaves);
657
+ const effectiveSpan = Math.min(declared, span);
658
+ if (clampReason && effectiveSpan < declared) {
659
+ 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 : '';
660
+ warnClampOnce(colKey, declared, effectiveSpan, clampReason, warnedKeys);
661
+ }
662
+ if (effectiveSpan <= 1)
663
+ return NO_SPAN;
664
+ return {
665
+ htmlColspan: effectiveSpan,
666
+ skipCount: effectiveSpan - 1,
667
+ };
668
+ }
669
+
670
+ var __decorate$U = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
671
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
672
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
673
+ 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;
674
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
675
+ };
676
+ /**
677
+ * Per-row body colspan controller.
678
+ *
679
+ * Centralizes the source-data body colSpan computation that was previously scattered across the
680
+ * cell renderer (cache + per-cell resolve) and the row renderer (imperative `skipCount`). It owns
681
+ * the once-per-key warning cache and exposes {@link resolveRow}, which computes the colspan result
682
+ * for every leaf in a row in a single pass so renderers can consume the result declaratively.
683
+ *
684
+ * The structural shape (a {@link VegaSlimmer} controller reading component fields) mirrors the
685
+ * main-branch `VegaTableExpandRowController` paradigm.
686
+ */
687
+ class VegaTableBodyColSpanController extends VegaSlimmer {
688
+ constructor() {
689
+ super(...arguments);
690
+ this.warnedColSpanKeys = new Set();
691
+ this.lastWarnedColumnsRef = null;
692
+ }
693
+ /**
694
+ * Resolve the effective colspan for every leaf cell in a single source-data row.
695
+ *
696
+ * Walks the row left-to-right, resolving each non-consumed leaf's span and marking the leaves
697
+ * consumed by a span as `null` so the caller can skip them declaratively (no mutable
698
+ * `skipCount` orchestration). The returned array is index-aligned with `leaves`.
699
+ *
700
+ * @param {VegaTableDataSourceItem} record - The row data record.
701
+ * @param {number} rowIndex - Zero-based index of the row in the current data set.
702
+ * @param {ColumnRenderInputModel[]} leaves - All leaf render inputs for the table (ordered).
703
+ * @returns {Array<Nullable<BodyColSpanResult>>} One entry per leaf: a {@link BodyColSpanResult}
704
+ * for a cell to render, or `null` for a leaf consumed by a preceding spanning cell.
705
+ */
706
+ resolveRow(record, rowIndex, leaves) {
707
+ // Reset the once-per-key warning cache whenever the column configuration changes,
708
+ // so clamping conditions introduced by a new `columns` value can warn again.
709
+ if (this.columns !== this.lastWarnedColumnsRef) {
710
+ this.warnedColSpanKeys.clear();
711
+ this.lastWarnedColumnsRef = this.columns;
712
+ }
713
+ const results = new Array(leaves.length).fill(null);
714
+ let skipCount = 0;
715
+ leaves.forEach((leaf, leafIndex) => {
716
+ if (skipCount > 0) {
717
+ // This leaf is consumed by a preceding spanning cell — leave it null (skipped).
718
+ skipCount--;
719
+ return;
720
+ }
721
+ const column = this.findColumn(leaf);
722
+ const result = column
723
+ ? resolveBodyColSpan(column, record, rowIndex, leafIndex, leaves, this.warnedColSpanKeys)
724
+ : { htmlColspan: 1, skipCount: 0 };
725
+ results[leafIndex] = result;
726
+ skipCount = result.skipCount;
727
+ });
728
+ return results;
729
+ }
730
+ /**
731
+ * Find the column config that backs a leaf render input.
732
+ *
733
+ * @param {ColumnRenderInputModel} renderInput - The leaf render input.
734
+ * @returns {Nullable<VegaTableColumnConfig>} The matching column config, or `undefined`.
735
+ */
736
+ findColumn(renderInput) {
737
+ return this.columns.find((column) => column.key === renderInput.key ||
738
+ column.prop === renderInput.key ||
739
+ column.label === renderInput.key);
740
+ }
741
+ }
742
+ __decorate$U([
743
+ MapToComponentField()
744
+ ], VegaTableBodyColSpanController.prototype, "columns", void 0);
745
+
746
+ var __decorate$T = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
747
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
748
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
749
+ 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;
750
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
751
+ };
752
+ /**
753
+ * The expand row controller of VegaTable
754
+ */
755
+ class VegaTableExpandRowController extends VegaSlimmer {
756
+ constructor() {
757
+ super(...arguments);
758
+ /**
759
+ * Toggle expandable row by rowKey
760
+ *
761
+ * @param {string} rowKey - The row key of the row
762
+ */
763
+ this.toggleExpandRow = (rowKey) => {
295
764
  this.isRowExpandable(rowKey) && this.handleToggleExpandRow(rowKey, !this.isExpanded(rowKey));
296
765
  };
297
766
  /**
@@ -2408,6 +2877,18 @@ class VegaTableRowRenderer$1 extends VegaSlimmer {
2408
2877
  this.renderTableRowComponent = (rowProps) => {
2409
2878
  const { rowKey, index, record, isVisibleInCurrentPage } = rowProps;
2410
2879
  const renderInputs = this.vegaTableRenderInputController.getLeafRenderInputs();
2880
+ // Resolve every leaf's colspan in one pass. Entries are index-aligned with renderInputs;
2881
+ // a `null` entry marks a leaf consumed by a preceding spanning cell (skip it).
2882
+ const colSpanResults = this.vegaTableBodyColSpanController.resolveRow(record, index, renderInputs);
2883
+ const cells = [];
2884
+ renderInputs.forEach((renderInput, leafIndex) => {
2885
+ const colSpanResult = colSpanResults[leafIndex];
2886
+ if (!colSpanResult) {
2887
+ // Consumed by a preceding spanning cell — nothing to render for this leaf.
2888
+ return;
2889
+ }
2890
+ cells.push(this.vegaTableCellRenderer.render(renderInput, record, index, colSpanResult));
2891
+ });
2411
2892
  return (h("vega-table-row", { class: {
2412
2893
  'v-hidden': !isVisibleInCurrentPage,
2413
2894
  }, key: `vega-table-row-${rowKey}`, rowKey: rowKey,
@@ -2416,9 +2897,7 @@ class VegaTableRowRenderer$1 extends VegaSlimmer {
2416
2897
  DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, VegaClick, () => {
2417
2898
  this.rowClickEventEmitter.emit({ record: record, index: index });
2418
2899
  });
2419
- }, striped: this.striped && index % 2 === 1, rowDivider: this.rowDivider && !rowProps.isLastRow }, renderInputs.map((renderInput) => {
2420
- return this.vegaTableCellRenderer.render(renderInput, record, index);
2421
- })));
2900
+ }, striped: this.striped && index % 2 === 1, rowDivider: this.rowDivider && !rowProps.isLastRow }, cells));
2422
2901
  };
2423
2902
  }
2424
2903
  render(rowProps, editable) {
@@ -2435,6 +2914,9 @@ __decorate$G([
2435
2914
  __decorate$G([
2436
2915
  MapToComponentField()
2437
2916
  ], VegaTableRowRenderer$1.prototype, "vegaTableCellRenderer", void 0);
2917
+ __decorate$G([
2918
+ MapToComponentField()
2919
+ ], VegaTableRowRenderer$1.prototype, "vegaTableBodyColSpanController", void 0);
2438
2920
  __decorate$G([
2439
2921
  MapToComponentField()
2440
2922
  ], VegaTableRowRenderer$1.prototype, "striped", void 0);
@@ -2652,423 +3134,206 @@ class ColumnStructureModel {
2652
3134
  *
2653
3135
  * @returns {boolean} True if any descendant is a group column.
2654
3136
  */
2655
- hasGroupColumn() {
2656
- return !!this.children.find((model) => !model.isLeaf());
2657
- }
2658
- /**
2659
- * Checks if this subtree contains any left pinned children.
2660
- *
2661
- * @returns {boolean} True if any immediate child has a pinned value.
2662
- */
2663
- hasLeftPinnedColumn() {
2664
- return !!this.children.find((model) => model.pinned === 'left');
2665
- }
2666
- /**
2667
- * Checks if this subtree contains any right pinned children.
2668
- *
2669
- * @returns {boolean} True if any immediate child has a pinned value.
2670
- */
2671
- hasRightPinnedColumn() {
2672
- return !!this.children.find((model) => model.pinned === 'right');
2673
- }
2674
- /**
2675
- * Checks if this node is a leaf (no children).
2676
- *
2677
- * @returns {boolean} True when this node has no children.
2678
- */
2679
- isLeaf() {
2680
- return !this.children || this.children.length === 0;
2681
- }
2682
- /**
2683
- * Return an array of nodes for this subtree using the specified traversal mode.
2684
- *
2685
- * Currently only depth-first search ('dfs') is supported. The returned array is
2686
- * cached per-mode to avoid repeated traversal costs.
2687
- *
2688
- * @param {IteratorMode} mode - Traversal mode to use. Defaults to 'dfs'.
2689
- * @returns {ColumnStructureModel[]} Array of ColumnStructureModel nodes in traversal order.
2690
- */
2691
- iterator(mode = 'dfs') {
2692
- if (mode === 'dfs') {
2693
- return this.dfsIterator();
2694
- }
2695
- return [];
2696
- }
2697
- /**
2698
- * Gets all leaf nodes in the subtree, with caching.
2699
- *
2700
- * Subsequent calls return the cached array until the underlying model is rebuilt.
2701
- *
2702
- * @returns {ColumnStructureModel[]} Array of leaf column models.
2703
- */
2704
- getLeaves() {
2705
- if (this.leaves.length > 0) {
2706
- return this.leaves;
2707
- }
2708
- const leaves = this.dfsIterator().filter((model) => model.isLeaf());
2709
- this.leaves = leaves;
2710
- return leaves;
2711
- }
2712
- /**
2713
- * For root nodes, returns children ordered by pinned type (left, none, right).
2714
- * For non-root nodes, returns children in their natural order.
2715
- *
2716
- * @returns {ColumnStructureModel[]} Array of child column models.
2717
- */
2718
- getOrderedChildren() {
2719
- if (!this.isRoot())
2720
- return this.children;
2721
- return this.orderedChildren;
2722
- }
2723
- /**
2724
- * Orders root children by pinned type (left, none, right) and caches the result.
2725
- *
2726
- * For non-root nodes this method returns children in their natural order.
2727
- *
2728
- * @returns {ColumnStructureModel[]} Array of ordered child column models.
2729
- */
2730
- orderChildrenByPinned() {
2731
- if (!this.isRoot())
2732
- return this.children;
2733
- if (this.orderedChildren.length > 0) {
2734
- return this.orderedChildren;
2735
- }
2736
- const leftPinned = [];
2737
- const noPinned = [];
2738
- const rightPinned = [];
2739
- this.children.forEach((child) => {
2740
- if (child.pinned === 'left') {
2741
- leftPinned.push(child);
2742
- }
2743
- else if (child.pinned === 'right') {
2744
- rightPinned.push(child);
2745
- }
2746
- else {
2747
- noPinned.push(child);
2748
- }
2749
- });
2750
- const children = [...leftPinned, ...noPinned, ...rightPinned];
2751
- this.orderedChildren = children;
2752
- return children;
2753
- }
2754
- /**
2755
- * Checks if this node is the root node.
2756
- *
2757
- * @returns {boolean} True if root node, false otherwise.
2758
- */
2759
- isRoot() {
2760
- return this.level === ColumnStructureModel.ROOT_LEVEL;
2761
- }
2762
- /**
2763
- * Performs a depth-first traversal of the column structure.
2764
- *
2765
- * The traversal respects root-child pinned ordering (left/no/right) for the root node.
2766
- * Results are cached per-node to avoid repeated recursion costs.
2767
- *
2768
- * @returns {ColumnStructureModel[]} Array of all nodes in DFS order.
2769
- */
2770
- dfsIterator() {
2771
- if (this.iteratorCacheMap.has('dfs')) {
2772
- return this.iteratorCacheMap.get('dfs');
2773
- }
2774
- const localResult = [];
2775
- const children = this.orderChildrenByPinned();
2776
- if (!this.isRoot()) {
2777
- localResult.push(this);
2778
- }
2779
- if (children && children.length > 0) {
2780
- children.forEach((child) => {
2781
- localResult.push(...child.dfsIterator());
2782
- });
2783
- }
2784
- this.iteratorCacheMap.set('dfs', localResult);
2785
- return localResult;
2786
- }
2787
- }
2788
- ColumnStructureModel.ROOT_LEVEL = -1;
2789
- ColumnStructureModel.ROOT_KEY = '#root-model#';
2790
-
2791
- var __decorate$E = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
2792
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2793
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2794
- 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;
2795
- return c > 3 && r && Object.defineProperty(target, key, r), r;
2796
- };
2797
- /**
2798
- * Controller responsible for building and keeping the ColumnStructureModel in sync
2799
- * with the component's `columns` and `groupColumns` properties.
2800
- *
2801
- * This slimmer maps relevant component fields and lifecycle/watch hooks to
2802
- * automatically rebuild the column structure when inputs change.
2803
- */
2804
- class VegaTableColumnStructureModelController extends VegaSlimmer {
2805
- /**
2806
- * Component lifecycle hook mapped to the host's componentWillLoad.
2807
- * Initializes the ColumnStructureModel prior to initial render.
2808
- */
2809
- componentWillLoad() {
2810
- this.setColumnStructureModel();
2811
- }
2812
- /**
2813
- * Watch handler mapped to the host's watchColumns.
2814
- * Rebuilds the ColumnStructureModel when `columns` changes.
2815
- */
2816
- watchColumns() {
2817
- this.setColumnStructureModel();
2818
- }
2819
- /**
2820
- * Watch handler mapped to the host's watchGroupColumns.
2821
- * Rebuilds the ColumnStructureModel when `groupColumns` changes.
2822
- */
2823
- watchGroupColumns() {
2824
- this.setColumnStructureModel();
2825
- }
2826
- /**
2827
- * Build and assign the ColumnStructureModel from current `columns` and `groupColumns`.
2828
- * Uses `ColumnStructureModel.from` which returns a root model representing the column tree.
2829
- */
2830
- setColumnStructureModel() {
2831
- this.columnStructureModel = ColumnStructureModel.from(this.columns, this.groupColumns);
2832
- }
2833
- }
2834
- __decorate$E([
2835
- MapToComponentField()
2836
- ], VegaTableColumnStructureModelController.prototype, "host", void 0);
2837
- __decorate$E([
2838
- MapToComponentField()
2839
- ], VegaTableColumnStructureModelController.prototype, "columns", void 0);
2840
- __decorate$E([
2841
- MapToComponentField()
2842
- ], VegaTableColumnStructureModelController.prototype, "groupColumns", void 0);
2843
- __decorate$E([
2844
- MapToComponentField({ writable: true })
2845
- ], VegaTableColumnStructureModelController.prototype, "columnStructureModel", void 0);
2846
- __decorate$E([
2847
- MapToComponentMethod('componentWillLoad')
2848
- ], VegaTableColumnStructureModelController.prototype, "componentWillLoad", null);
2849
- __decorate$E([
2850
- MapToComponentMethod('watchColumns')
2851
- ], VegaTableColumnStructureModelController.prototype, "watchColumns", null);
2852
- __decorate$E([
2853
- MapToComponentMethod('watchGroupColumns')
2854
- ], VegaTableColumnStructureModelController.prototype, "watchGroupColumns", null);
2855
-
2856
- /**
2857
- * ColumnRenderInputModel
2858
- *
2859
- * Render-time representation of a column or group node used by header/body renderers.
2860
- * Built from a ColumnStructureModel tree, it carries computed layout metadata required
2861
- * for rendering and pinned/sticky calculations (colSpan, rowSpan, pinned boundaries, etc).
2862
- *
2863
- * Instances form a forest (root-level nodes in an array) that mirrors the structure model
2864
- * but contains additional render-specific properties and parent/child links for renderers.
2865
- */
2866
- class ColumnRenderInputModel {
2867
- /**
2868
- * Create a new render input node.
2869
- *
2870
- * @param {string} key - Unique key (matches ColumnStructureModel.key).
2871
- * @param {string} label - Optional display label (from structure model).
2872
- * @param {VegaTablePinnedType} pinned - Pinned type for this node ('left' | 'right' | null).
2873
- * @param {Nullable<number>} colSpan - Number of visual columns spanned by this node's subtree.
2874
- * @param {Nullable<number>} rowSpan - Number of header rows this node should span.
2875
- * @param {boolean} isViewStart - True when this node is the start of a visible view range.
2876
- * @param {boolean} isViewEnd - True when this node is the end of a visible view range.
2877
- * @param {boolean} isLeftEndPinned - True when node is last left-pinned sibling.
2878
- * @param {boolean} isRightStartPinned - True when node is first right-pinned sibling.
2879
- * @param {boolean} isNoPinnedEnd - True when node is last non-pinned sibling.
2880
- * @param {boolean} headHasGroupColumn - Header contains group columns (affects rowSpan).
2881
- * @param {boolean} headHasPinnedColumn - Header contains pinned columns.
2882
- * @param {number} headMaxDepth - Maximum header depth (number of header rows).
2883
- * @param {number} level - Level/index of this node within header rows (0-based).
2884
- * @param {number} columnIndex - Sequential leaf index (used for ordering).
2885
- * @param {Nullable<ColumnRenderInputModel>} parent - Parent render input node (null for root-level).
2886
- * @param {ColumnRenderInputModel[]} children - Child render input nodes.
2887
- */
2888
- constructor(key, label, pinned, colSpan, rowSpan, isViewStart, isViewEnd, isLeftEndPinned, isRightStartPinned, isNoPinnedEnd, headHasGroupColumn, headHasPinnedColumn, headMaxDepth, level, columnIndex, parent, children = []) {
2889
- this.key = key;
2890
- this.label = label;
2891
- this.pinned = pinned;
2892
- this.colSpan = colSpan;
2893
- this.rowSpan = rowSpan;
2894
- this.isViewStart = isViewStart;
2895
- this.isViewEnd = isViewEnd;
2896
- this.isLeftEndPinned = isLeftEndPinned;
2897
- this.isRightStartPinned = isRightStartPinned;
2898
- this.isNoPinnedEnd = isNoPinnedEnd;
2899
- this.headHasGroupColumn = headHasGroupColumn;
2900
- this.headHasPinnedColumn = headHasPinnedColumn;
2901
- this.headMaxDepth = headMaxDepth;
2902
- this.level = level;
2903
- this.columnIndex = columnIndex;
2904
- this.parent = parent;
2905
- this.children = children;
2906
- this.iteratorCacheMap = new Map();
2907
- this.leaves = [];
2908
- }
2909
- /**
2910
- * Build a forest of ColumnRenderInputModel nodes from a ColumnStructureModel root.
2911
- *
2912
- * @param {ColumnStructureModel} rootModel - Root ColumnStructureModel that supplies tree and level data.
2913
- * @returns {ColumnRenderInputModel[]} Array of root-level ColumnRenderInputModel nodes (the render forest).
2914
- */
2915
- static from(rootModel) {
2916
- const renderInputs = [];
2917
- const parentStack = [];
2918
- const maxLevel = rootModel.getMaxDepth();
2919
- const hasGroupColumn = rootModel.hasGroupColumn();
2920
- const hasPinnedColumn = rootModel.hasLeftPinnedColumn() || rootModel.hasRightPinnedColumn();
2921
- let columnIndex = 0;
2922
- // Iterate structure model (DFS by default) and construct render nodes.
2923
- rootModel.iterator().forEach((model) => {
2924
- const parent = model.level > 0 ? parentStack[model.level - 1] : null;
2925
- const isParentStart = hasGroupColumn && this.isParentStart(model);
2926
- const isParentEnd = hasGroupColumn && this.isParentEnd(model);
2927
- 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
2928
- ? parent.isLeftEndPinned && isParentEnd
2929
- : hasPinnedColumn && this.isLeftEndPinned(model), parent
2930
- ? parent.isRightStartPinned && isParentStart
2931
- : hasPinnedColumn && this.isRightStartPinned(model), parent ? parent.isNoPinnedEnd && isParentEnd : hasPinnedColumn && this.isNoPinnedEnd(model), hasGroupColumn, hasPinnedColumn, maxLevel, model.level, columnIndex, parent);
2932
- // Attach to parent if present, otherwise add to root-level array.
2933
- parent ? parent.children.push(renderInput) : renderInputs.push(renderInput);
2934
- // Maintain parent stack keyed by level to allow next nodes to find their parent.
2935
- parentStack[model.level] = renderInput;
2936
- parentStack.length = model.level + 1;
2937
- // Increment leaf index when encountering a leaf structure node.
2938
- if (model.isLeaf())
2939
- columnIndex++;
2940
- });
2941
- return renderInputs;
2942
- }
2943
- /**
2944
- * True when the provided structure model is the last left-pinned sibling in its parent's children.
2945
- * Used to mark boundary nodes for left-pinned groups.
2946
- *
2947
- * @param {ColumnStructureModel} model - Structure model to check.
2948
- * @returns {boolean} True when model is the last left-pinned sibling.
2949
- */
2950
- static isLeftEndPinned(model) {
2951
- const siblings = model.parent
2952
- .getOrderedChildren()
2953
- .filter((child) => child.pinned === 'left');
2954
- return siblings[siblings.length - 1] === model;
2955
- }
2956
- /**
2957
- * True when the provided structure model is the first right-pinned sibling in its parent's children.
2958
- * Used to mark boundary nodes for right-pinned groups.
2959
- *
2960
- * @param {ColumnStructureModel} model - Structure model to check.
2961
- * @returns {boolean} True when model is the first right-pinned sibling.
2962
- */
2963
- static isRightStartPinned(model) {
2964
- const siblings = model.parent
2965
- .getOrderedChildren()
2966
- .filter((child) => child.pinned === 'right');
2967
- return siblings[0] === model;
3137
+ hasGroupColumn() {
3138
+ return !!this.children.find((model) => !model.isLeaf());
2968
3139
  }
2969
3140
  /**
2970
- * True when the provided structure model is the last non-pinned sibling in its parent's children.
2971
- * Useful to handle the 'no-pinned-end' condition.
3141
+ * Checks if this subtree contains any left pinned children.
2972
3142
  *
2973
- * @param {ColumnStructureModel} model - Structure model to check.
2974
- * @returns {boolean} True when model is the last non-pinned sibling.
3143
+ * @returns {boolean} True if any immediate child has a pinned value.
2975
3144
  */
2976
- static isNoPinnedEnd(model) {
2977
- const siblings = model.parent
2978
- .getOrderedChildren()
2979
- .filter((child) => !child.pinned);
2980
- return siblings[siblings.length - 1] === model;
3145
+ hasLeftPinnedColumn() {
3146
+ return !!this.children.find((model) => model.pinned === 'left');
2981
3147
  }
2982
3148
  /**
2983
- * True when the provided model is the first child of its parent.
3149
+ * Checks if this subtree contains any right pinned children.
2984
3150
  *
2985
- * @param {ColumnStructureModel} model - Structure model to check.
2986
- * @returns {boolean} True when model is the first child.
3151
+ * @returns {boolean} True if any immediate child has a pinned value.
2987
3152
  */
2988
- static isParentStart(model) {
2989
- return model.parent.getOrderedChildren()[0] === model;
3153
+ hasRightPinnedColumn() {
3154
+ return !!this.children.find((model) => model.pinned === 'right');
2990
3155
  }
2991
3156
  /**
2992
- * True when the provided model is the last child of its parent.
3157
+ * Checks if this node is a leaf (no children).
2993
3158
  *
2994
- * @param {ColumnStructureModel} model - Structure model to check.
2995
- * @returns {boolean} True when model is the last child.
3159
+ * @returns {boolean} True when this node has no children.
2996
3160
  */
2997
- static isParentEnd(model) {
2998
- const parentChildren = model.parent.getOrderedChildren();
2999
- return parentChildren[parentChildren.length - 1] === model;
3161
+ isLeaf() {
3162
+ return !this.children || this.children.length === 0;
3000
3163
  }
3001
3164
  /**
3002
- * Compute a node's colSpan by iterating its subtree and counting the maximum number
3003
- * of nodes present at any single level (visual column span).
3165
+ * Return an array of nodes for this subtree using the specified traversal mode.
3004
3166
  *
3005
- * @param {ColumnStructureModel} mode - ColumnStructureModel node to examine.
3006
- * @returns {number} Number of visual columns spanned by the node.
3167
+ * Currently only depth-first search ('dfs') is supported. The returned array is
3168
+ * cached per-mode to avoid repeated traversal costs.
3169
+ *
3170
+ * @param {IteratorMode} mode - Traversal mode to use. Defaults to 'dfs'.
3171
+ * @returns {ColumnStructureModel[]} Array of ColumnStructureModel nodes in traversal order.
3007
3172
  */
3008
- static getColSpan(mode) {
3009
- const children = mode.iterator();
3010
- const rowMap = {};
3011
- children.forEach((node) => {
3012
- rowMap[node.level] = (rowMap[node.level] || 0) + 1;
3013
- });
3014
- return Math.max(...Object.values(rowMap));
3173
+ iterator(mode = 'dfs') {
3174
+ if (mode === 'dfs') {
3175
+ return this.dfsIterator();
3176
+ }
3177
+ return [];
3015
3178
  }
3016
3179
  /**
3017
- * Return cached leaf render nodes for this subtree.
3018
- * Caches the result on first call and returns cached array on subsequent calls.
3180
+ * Gets all leaf nodes in the subtree, with caching.
3019
3181
  *
3020
- * @returns {ColumnRenderInputModel[]} Array of leaf render input nodes.
3182
+ * Subsequent calls return the cached array until the underlying model is rebuilt.
3183
+ *
3184
+ * @returns {ColumnStructureModel[]} Array of leaf column models.
3021
3185
  */
3022
3186
  getLeaves() {
3023
3187
  if (this.leaves.length > 0) {
3024
3188
  return this.leaves;
3025
3189
  }
3026
- const leaves = this.iterator().filter((model) => model.isLeaf());
3190
+ const leaves = this.dfsIterator().filter((model) => model.isLeaf());
3027
3191
  this.leaves = leaves;
3028
3192
  return leaves;
3029
3193
  }
3030
3194
  /**
3031
- * Generic iterator that supports traversal modes ('dfs' currently implemented).
3195
+ * For root nodes, returns children ordered by pinned type (left, none, right).
3196
+ * For non-root nodes, returns children in their natural order.
3032
3197
  *
3033
- * @param {IteratorMode} [mode='dfs'] - Iterator mode ('dfs' | 'bfs').
3034
- * @returns {ColumnRenderInputModel[]} Traversal-ordered array of nodes.
3198
+ * @returns {ColumnStructureModel[]} Array of child column models.
3035
3199
  */
3036
- iterator(mode = 'dfs') {
3037
- if (mode === 'dfs') {
3038
- return this.dfsIterator();
3200
+ getOrderedChildren() {
3201
+ if (!this.isRoot())
3202
+ return this.children;
3203
+ return this.orderedChildren;
3204
+ }
3205
+ /**
3206
+ * Orders root children by pinned type (left, none, right) and caches the result.
3207
+ *
3208
+ * For non-root nodes this method returns children in their natural order.
3209
+ *
3210
+ * @returns {ColumnStructureModel[]} Array of ordered child column models.
3211
+ */
3212
+ orderChildrenByPinned() {
3213
+ if (!this.isRoot())
3214
+ return this.children;
3215
+ if (this.orderedChildren.length > 0) {
3216
+ return this.orderedChildren;
3039
3217
  }
3040
- // Future: implement BFS mode here.
3041
- return [];
3218
+ const leftPinned = [];
3219
+ const noPinned = [];
3220
+ const rightPinned = [];
3221
+ this.children.forEach((child) => {
3222
+ if (child.pinned === 'left') {
3223
+ leftPinned.push(child);
3224
+ }
3225
+ else if (child.pinned === 'right') {
3226
+ rightPinned.push(child);
3227
+ }
3228
+ else {
3229
+ noPinned.push(child);
3230
+ }
3231
+ });
3232
+ const children = [...leftPinned, ...noPinned, ...rightPinned];
3233
+ this.orderedChildren = children;
3234
+ return children;
3042
3235
  }
3043
3236
  /**
3044
- * Depth-first pre-order traversal of this node and its descendants.
3045
- * Caches the result for the 'dfs' mode to avoid repeated recursion.
3237
+ * Checks if this node is the root node.
3046
3238
  *
3047
- * @returns {ColumnRenderInputModel[]} Array of nodes in DFS order (includes this node).
3239
+ * @returns {boolean} True if root node, false otherwise.
3240
+ */
3241
+ isRoot() {
3242
+ return this.level === ColumnStructureModel.ROOT_LEVEL;
3243
+ }
3244
+ /**
3245
+ * Performs a depth-first traversal of the column structure.
3246
+ *
3247
+ * The traversal respects root-child pinned ordering (left/no/right) for the root node.
3248
+ * Results are cached per-node to avoid repeated recursion costs.
3249
+ *
3250
+ * @returns {ColumnStructureModel[]} Array of all nodes in DFS order.
3048
3251
  */
3049
3252
  dfsIterator() {
3050
3253
  if (this.iteratorCacheMap.has('dfs')) {
3051
3254
  return this.iteratorCacheMap.get('dfs');
3052
3255
  }
3053
3256
  const localResult = [];
3054
- localResult.push(this);
3055
- if (this.children && this.children.length > 0) {
3056
- this.children.forEach((child) => {
3257
+ const children = this.orderChildrenByPinned();
3258
+ if (!this.isRoot()) {
3259
+ localResult.push(this);
3260
+ }
3261
+ if (children && children.length > 0) {
3262
+ children.forEach((child) => {
3057
3263
  localResult.push(...child.dfsIterator());
3058
3264
  });
3059
3265
  }
3060
3266
  this.iteratorCacheMap.set('dfs', localResult);
3061
3267
  return localResult;
3062
3268
  }
3269
+ }
3270
+ ColumnStructureModel.ROOT_LEVEL = -1;
3271
+ ColumnStructureModel.ROOT_KEY = '#root-model#';
3272
+
3273
+ var __decorate$E = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
3274
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3275
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
3276
+ 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;
3277
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
3278
+ };
3279
+ /**
3280
+ * Controller responsible for building and keeping the ColumnStructureModel in sync
3281
+ * with the component's `columns` and `groupColumns` properties.
3282
+ *
3283
+ * This slimmer maps relevant component fields and lifecycle/watch hooks to
3284
+ * automatically rebuild the column structure when inputs change.
3285
+ */
3286
+ class VegaTableColumnStructureModelController extends VegaSlimmer {
3063
3287
  /**
3064
- * True when this render node has no children (visual leaf).
3065
- *
3066
- * @returns {boolean} True when node is a leaf.
3288
+ * Component lifecycle hook mapped to the host's componentWillLoad.
3289
+ * Initializes the ColumnStructureModel prior to initial render.
3067
3290
  */
3068
- isLeaf() {
3069
- return !this.children || this.children.length === 0;
3291
+ componentWillLoad() {
3292
+ this.setColumnStructureModel();
3293
+ }
3294
+ /**
3295
+ * Watch handler mapped to the host's watchColumns.
3296
+ * Rebuilds the ColumnStructureModel when `columns` changes.
3297
+ */
3298
+ watchColumns() {
3299
+ this.setColumnStructureModel();
3300
+ }
3301
+ /**
3302
+ * Watch handler mapped to the host's watchGroupColumns.
3303
+ * Rebuilds the ColumnStructureModel when `groupColumns` changes.
3304
+ */
3305
+ watchGroupColumns() {
3306
+ this.setColumnStructureModel();
3307
+ }
3308
+ /**
3309
+ * Build and assign the ColumnStructureModel from current `columns` and `groupColumns`.
3310
+ * Uses `ColumnStructureModel.from` which returns a root model representing the column tree.
3311
+ */
3312
+ setColumnStructureModel() {
3313
+ this.columnStructureModel = ColumnStructureModel.from(this.columns, this.groupColumns);
3070
3314
  }
3071
3315
  }
3316
+ __decorate$E([
3317
+ MapToComponentField()
3318
+ ], VegaTableColumnStructureModelController.prototype, "host", void 0);
3319
+ __decorate$E([
3320
+ MapToComponentField()
3321
+ ], VegaTableColumnStructureModelController.prototype, "columns", void 0);
3322
+ __decorate$E([
3323
+ MapToComponentField()
3324
+ ], VegaTableColumnStructureModelController.prototype, "groupColumns", void 0);
3325
+ __decorate$E([
3326
+ MapToComponentField({ writable: true })
3327
+ ], VegaTableColumnStructureModelController.prototype, "columnStructureModel", void 0);
3328
+ __decorate$E([
3329
+ MapToComponentMethod('componentWillLoad')
3330
+ ], VegaTableColumnStructureModelController.prototype, "componentWillLoad", null);
3331
+ __decorate$E([
3332
+ MapToComponentMethod('watchColumns')
3333
+ ], VegaTableColumnStructureModelController.prototype, "watchColumns", null);
3334
+ __decorate$E([
3335
+ MapToComponentMethod('watchGroupColumns')
3336
+ ], VegaTableColumnStructureModelController.prototype, "watchGroupColumns", null);
3072
3337
 
3073
3338
  var __decorate$D = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
3074
3339
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -3283,6 +3548,12 @@ class VegaTablePinnedRenderer extends VegaSlimmer {
3283
3548
  },
3284
3549
  });
3285
3550
  this.previouslyStyledCells = new Set();
3551
+ // Each set tracks cells where exactly one dynamic class was added — cleared per class so
3552
+ // that static classes from render() on the same cell are never inadvertently stripped
3553
+ // (e.g. a cell that is both isRightStartPinned and the last-visible body cell).
3554
+ this.dynamicRightDividerCells = new Set();
3555
+ this.dynamicLeftDividerCells = new Set();
3556
+ this.dynamicHideRightBorderCells = new Set();
3286
3557
  this.clearPinnedPositionsTaskQueue = new SynchronizeTaskQueue(1);
3287
3558
  }
3288
3559
  componentDidLoad() {
@@ -3290,7 +3561,17 @@ class VegaTablePinnedRenderer extends VegaSlimmer {
3290
3561
  async componentDidRender() {
3291
3562
  await this.clearPinnedPositionsTaskQueue.runTask();
3292
3563
  this.updateTableRowPinnedPosition();
3293
- this.updateTableCellPinnedPosition();
3564
+ const unreadyCells = this.updateTableCellPinnedPosition();
3565
+ if (unreadyCells.length > 0) {
3566
+ // In dev builds, Stencil's HMR flag forces loadModule() to always use a
3567
+ // dynamic import(), so a brand-new cell's first render is deferred. We wait
3568
+ // for each unready cell via componentOnReady() — which resolves exactly when
3569
+ // the cell's shadow <td> is first rendered — then apply sticky positioning.
3570
+ // In production (hotModuleReplacement=false) loadModule() is synchronous, so
3571
+ // cells are always ready by componentDidRender and this branch is never reached.
3572
+ await Promise.all(unreadyCells.map((cell) => cell.componentOnReady()));
3573
+ this.updateTableCellPinnedPosition();
3574
+ }
3294
3575
  }
3295
3576
  watchColumnStructureModel() {
3296
3577
  void this.clearPinnedPositionsTaskQueue.enqueue({
@@ -3302,24 +3583,165 @@ class VegaTablePinnedRenderer extends VegaSlimmer {
3302
3583
  updateTableCellPinnedPosition() {
3303
3584
  if (!this.columnStructureModel.hasLeftPinnedColumn() &&
3304
3585
  !this.columnStructureModel.hasRightPinnedColumn())
3305
- return;
3586
+ return [];
3587
+ // Clear stale dynamic boundary classes before re-evaluating breakpoint visibility.
3588
+ // This ensures the classes are removed when the viewport grows back (e.g. column B
3589
+ // becomes visible again) and not only when the column structure changes.
3590
+ // Each set only removes the single class it tracks, preserving any other static
3591
+ // border classes that render() placed on the same cell (VD-9565).
3592
+ this.dynamicRightDividerCells.forEach((cell) => cell.classList.remove('right-divider'));
3593
+ this.dynamicRightDividerCells.clear();
3594
+ this.dynamicLeftDividerCells.forEach((cell) => cell.classList.remove('left-divider'));
3595
+ this.dynamicLeftDividerCells.clear();
3596
+ this.dynamicHideRightBorderCells.forEach((cell) => cell.classList.remove('hide-right-border'));
3597
+ this.dynamicHideRightBorderCells.clear();
3306
3598
  // if not have head row, it means no pinned, so no need to update
3307
3599
  const row = this.host.shadowRoot.querySelector('vega-table-head-row');
3308
3600
  // to avoid window resize before table rendered.
3309
3601
  // @see{module:resize-pinned-position-by-edit-row}
3310
3602
  /* istanbul ignore next */
3311
3603
  if (!row)
3312
- return;
3604
+ return [];
3313
3605
  const headCellRenderInputMap = this.vegaTableRenderInputController.getHeadCellRenderInputMap();
3314
3606
  const pinnedColumnBodyCellRenderInputMap = this.vegaTableRenderInputController.getPinnedColumnBodyCellRenderInputMap();
3315
3607
  const [prevShadowThWidth, nextShadowThWidth] = this.getRowShadowThWidths();
3316
3608
  const leafWidths = this.getLeafWidths();
3609
+ // Track the last visible left-pinned head cell and first visible right-pinned head cell
3610
+ // to dynamically apply boundary classes when breakpoint-hidden columns shift the boundary.
3611
+ let lastVisibleLeftPinnedHeadCell = null;
3612
+ let firstVisibleRightPinnedHeadCell = null;
3613
+ let lastVisibleRightPinnedHeadCell = null;
3317
3614
  headCellRenderInputMap.forEach((renderInput, headCell) => {
3615
+ var _a;
3616
+ /* istanbul ignore next -- defensive null-guard: jsdom always provides shadowRoot */
3617
+ const shadowCell = (_a = headCell.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('th, td');
3618
+ const isVisible = shadowCell ? shadowCell.getBoundingClientRect().width > 0 : false;
3318
3619
  this.updateCellPinnedPosition(renderInput, headCell, prevShadowThWidth, leafWidths, nextShadowThWidth);
3620
+ if (isVisible && renderInput.pinned === 'left') {
3621
+ lastVisibleLeftPinnedHeadCell = shadowCell;
3622
+ }
3623
+ if (isVisible && renderInput.pinned === 'right' && !firstVisibleRightPinnedHeadCell) {
3624
+ firstVisibleRightPinnedHeadCell = shadowCell;
3625
+ }
3626
+ if (isVisible && renderInput.pinned === 'right') {
3627
+ lastVisibleRightPinnedHeadCell = shadowCell;
3628
+ }
3319
3629
  });
3320
- pinnedColumnBodyCellRenderInputMap.forEach((renderInput, headCell) => {
3321
- this.updateCellPinnedPosition(renderInput, headCell, prevShadowThWidth, leafWidths, nextShadowThWidth);
3630
+ // Remove stale entries (disconnected cells) left over from prior renders (e.g. after drag reorder).
3631
+ pinnedColumnBodyCellRenderInputMap.forEach((_, bodyCell) => {
3632
+ /* istanbul ignore next -- defensive cleanup for disconnected cells; jsdom always keeps cells connected */
3633
+ if (!(bodyCell === null || bodyCell === void 0 ? void 0 : bodyCell.isConnected)) {
3634
+ pinnedColumnBodyCellRenderInputMap.delete(bodyCell);
3635
+ }
3636
+ });
3637
+ // Track last visible left-pinned body cells per row for boundary class propagation.
3638
+ const lastVisibleLeftPinnedBodyCells = new Map();
3639
+ const firstVisibleRightPinnedBodyCells = new Map();
3640
+ const lastVisibleRightPinnedBodyCells = new Map();
3641
+ // Collect body cells whose shadow DOM is not yet ready (newly created cells).
3642
+ const unreadyCells = [];
3643
+ pinnedColumnBodyCellRenderInputMap.forEach((renderInput, bodyCell) => {
3644
+ var _a;
3645
+ /* istanbul ignore next -- defensive null-guard: jsdom always provides shadowRoot */
3646
+ const shadowCell = (_a = bodyCell.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('th, td');
3647
+ const isVisible = shadowCell ? shadowCell.getBoundingClientRect().width > 0 : false;
3648
+ // Shadow DOM not ready yet — cell was just created (e.g. colspan collapsed after drag).
3649
+ if (['left', 'right'].includes(renderInput.pinned) && !shadowCell) {
3650
+ unreadyCells.push(bodyCell);
3651
+ return;
3652
+ }
3653
+ this.updateCellPinnedPosition(renderInput, bodyCell, prevShadowThWidth, leafWidths, nextShadowThWidth);
3654
+ if (isVisible && renderInput.pinned === 'left') {
3655
+ // Use the parent row as the grouping key for per-row tracking
3656
+ const parentRow = bodyCell.closest('vega-table-row');
3657
+ if (parentRow) {
3658
+ lastVisibleLeftPinnedBodyCells.set(parentRow, shadowCell);
3659
+ }
3660
+ }
3661
+ if (isVisible && renderInput.pinned === 'right') {
3662
+ const parentRow = bodyCell.closest('vega-table-row');
3663
+ if (parentRow && !firstVisibleRightPinnedBodyCells.has(parentRow)) {
3664
+ firstVisibleRightPinnedBodyCells.set(parentRow, shadowCell);
3665
+ }
3666
+ if (parentRow) {
3667
+ lastVisibleRightPinnedBodyCells.set(parentRow, shadowCell);
3668
+ }
3669
+ }
3322
3670
  });
3671
+ // Apply boundary divider to the last visible left-pinned cell when the static
3672
+ // isLeftEndPinned column is hidden by breakpoint.
3673
+ if (lastVisibleLeftPinnedHeadCell &&
3674
+ !lastVisibleLeftPinnedHeadCell.classList.contains('right-divider')) {
3675
+ // Check if the static boundary column is hidden — if leafWidths shows 0 for the
3676
+ // isLeftEndPinned column, the boundary has shifted.
3677
+ const leafRenderInputs = this.vegaTableRenderInputController.getLeafRenderInputs();
3678
+ const staticBoundaryLeaf = leafRenderInputs.find((leaf) => leaf.isLeftEndPinned);
3679
+ if (staticBoundaryLeaf && leafWidths[staticBoundaryLeaf.columnIndex] === 0) {
3680
+ lastVisibleLeftPinnedHeadCell.classList.add('right-divider');
3681
+ this.dynamicRightDividerCells.add(lastVisibleLeftPinnedHeadCell);
3682
+ lastVisibleLeftPinnedBodyCells.forEach((cell) => {
3683
+ // Only track cells that don't already hold `right-divider` from their
3684
+ // static render (effectiveRenderInput.isLeftEndPinned). If we add a
3685
+ // statically-classed cell here, the per-class clear on the next resize
3686
+ // would erroneously remove the static class (VD-9540).
3687
+ if (!cell.classList.contains('right-divider')) {
3688
+ cell.classList.add('right-divider');
3689
+ this.dynamicRightDividerCells.add(cell);
3690
+ }
3691
+ });
3692
+ }
3693
+ }
3694
+ if (firstVisibleRightPinnedHeadCell &&
3695
+ !firstVisibleRightPinnedHeadCell.classList.contains('left-divider')) {
3696
+ const leafRenderInputs = this.vegaTableRenderInputController.getLeafRenderInputs();
3697
+ const staticBoundaryLeaf = leafRenderInputs.find((leaf) => leaf.isRightStartPinned);
3698
+ if (staticBoundaryLeaf && leafWidths[staticBoundaryLeaf.columnIndex] === 0) {
3699
+ firstVisibleRightPinnedHeadCell.classList.add('left-divider');
3700
+ this.dynamicLeftDividerCells.add(firstVisibleRightPinnedHeadCell);
3701
+ firstVisibleRightPinnedBodyCells.forEach((cell) => {
3702
+ // Only track cells that don't already hold `left-divider` from their
3703
+ // static render (effectiveRenderInput.isRightStartPinned). If we add a
3704
+ // statically-classed cell here, the per-class clear on the next resize
3705
+ // would erroneously remove the static class (VD-9540).
3706
+ if (!cell.classList.contains('left-divider')) {
3707
+ cell.classList.add('left-divider');
3708
+ this.dynamicLeftDividerCells.add(cell);
3709
+ }
3710
+ });
3711
+ }
3712
+ }
3713
+ // Apply hide-right-border to the last visible right-pinned cell when the structural
3714
+ // right-most column is hidden by breakpoint. Without this, the new right-most visible
3715
+ // pinned column keeps a right border while the head cell suppresses it (head cells use
3716
+ // isViewEnd), leaving an extra vertical border at the table's right edge (VD-9565).
3717
+ if (lastVisibleRightPinnedHeadCell &&
3718
+ !lastVisibleRightPinnedHeadCell.classList.contains('hide-right-border')) {
3719
+ const leafRenderInputs = this.vegaTableRenderInputController.getLeafRenderInputs();
3720
+ // The structural right-most column is the last right-pinned leaf. Leaf render
3721
+ // inputs do not carry `isViewEnd` (unlike head render inputs), so identify the
3722
+ // boundary via `pinned` order instead.
3723
+ const rightPinnedLeaves = leafRenderInputs.filter((leaf) => leaf.pinned === 'right');
3724
+ const structuralEndLeaf = rightPinnedLeaves[rightPinnedLeaves.length - 1];
3725
+ if (structuralEndLeaf && leafWidths[structuralEndLeaf.columnIndex] === 0) {
3726
+ lastVisibleRightPinnedHeadCell.classList.add('hide-right-border');
3727
+ this.dynamicHideRightBorderCells.add(lastVisibleRightPinnedHeadCell);
3728
+ lastVisibleRightPinnedBodyCells.forEach((cell) => {
3729
+ // Only track cells that don't already hold `hide-right-border` from their
3730
+ // static render (isViewEnd/isNoPinnedEnd). Adding a statically-classed cell
3731
+ // here would let the per-class clear erroneously strip the static class on
3732
+ // the next resize (mirrors the VD-9540 divider guard).
3733
+ if (!cell.classList.contains('hide-right-border')) {
3734
+ cell.classList.add('hide-right-border');
3735
+ this.dynamicHideRightBorderCells.add(cell);
3736
+ }
3737
+ });
3738
+ }
3739
+ }
3740
+ // Sync colspan on pinned body cells that span breakpoint-hidden columns.
3741
+ // Chrome does not honour visibility:collapse / display:none on <col> for table layout,
3742
+ // so we directly adjust the shadow <td> colspan attribute to exclude hidden columns (VD-9540).
3743
+ this.syncColspanForHiddenColumns(leafWidths, pinnedColumnBodyCellRenderInputMap);
3744
+ return unreadyCells;
3323
3745
  }
3324
3746
  getRowShadowThWidths() {
3325
3747
  const row = this.host.shadowRoot.querySelector('vega-table-head-row');
@@ -3356,6 +3778,33 @@ class VegaTablePinnedRenderer extends VegaSlimmer {
3356
3778
  }
3357
3779
  });
3358
3780
  }
3781
+ syncColspanForHiddenColumns(leafWidths, pinnedColumnBodyCellRenderInputMap) {
3782
+ // NOTE: renderInput.colSpan is null for flat (non-group) tables — it only holds a value for
3783
+ // group-column subtree spans. We read the original colspan from the component prop (bodyCell.colSpan)
3784
+ // which is always the rendered value, unaffected by our shadow-DOM attribute writes.
3785
+ //
3786
+ // Skip when ALL leaf widths are 0 — that means the table is running in jsdom / an off-screen
3787
+ // context where getBoundingClientRect() always returns 0. Adjusting in that state would
3788
+ // incorrectly reduce every colspan to 1 (no visible columns = Math.max(1,0)=1).
3789
+ if (leafWidths.every((w) => w === 0))
3790
+ return;
3791
+ pinnedColumnBodyCellRenderInputMap.forEach((renderInput, bodyCell) => {
3792
+ var _a;
3793
+ const originalColspan = bodyCell.colSpan || 1;
3794
+ if (originalColspan <= 1)
3795
+ return;
3796
+ /* istanbul ignore next -- defensive null-guard: jsdom always provides shadowRoot */
3797
+ const shadowTd = (_a = bodyCell.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('td');
3798
+ /* istanbul ignore next -- shadowTd is always present in jsdom */
3799
+ if (!shadowTd)
3800
+ return;
3801
+ // Count how many columns in the span are visible (width > 0) — hidden breakpoint
3802
+ // columns have leafWidth === 0 because their <th> has display:none.
3803
+ const spanned = leafWidths.slice(renderInput.columnIndex, renderInput.columnIndex + originalColspan);
3804
+ const effectiveColspan = Math.max(1, spanned.filter((w) => w > 0).length);
3805
+ shadowTd.setAttribute('colspan', String(effectiveColspan));
3806
+ });
3807
+ }
3359
3808
  updateCellPinnedPosition(renderInput, headCell, prevShadowThWidth, leafWidths, nextShadowThWidth) {
3360
3809
  if (['left', 'right'].includes(renderInput.pinned)) {
3361
3810
  const shadowCell = headCell.shadowRoot.querySelector('th, td');
@@ -3367,10 +3816,17 @@ class VegaTablePinnedRenderer extends VegaSlimmer {
3367
3816
  this.updatePinnedPosition(shadowCell, 'left', position);
3368
3817
  }
3369
3818
  if (renderInput.pinned === 'right') {
3370
- const colSpan = isNonNullable(renderInput.colSpan) ? renderInput.colSpan : 1;
3819
+ // renderInput.colSpan is null for flat (non-group) tables it only carries a value
3820
+ // for group-column subtree spans (multi-level headers). For body cells with an HTML
3821
+ // colspan (e.g. colSpan:2 spanning the last two right-pinned columns), we read the
3822
+ // actual span from the host component prop so the right-edge offset is calculated
3823
+ // over the full spanned width rather than just one column (VD-9565).
3824
+ const colSpan = isNonNullable(renderInput.colSpan)
3825
+ ? renderInput.colSpan
3826
+ : headCell.colSpan || 1;
3371
3827
  const position = nextShadowThWidth +
3372
3828
  leafWidths
3373
- .slice(renderInput.columnIndex + (colSpan - 1) + 1)
3829
+ .slice(renderInput.columnIndex + colSpan)
3374
3830
  .reduce((count, colWidth) => count + colWidth, 0);
3375
3831
  this.updatePinnedPosition(shadowCell, 'right', position);
3376
3832
  }
@@ -3425,6 +3881,15 @@ class VegaTablePinnedRenderer extends VegaSlimmer {
3425
3881
  cell.style.width = '';
3426
3882
  }
3427
3883
  });
3884
+ // Remove boundary classes only from cells where they were dynamically added
3885
+ // (breakpoint-shifted boundaries). Static boundary classes from renderInput are
3886
+ // re-applied by the cell's own render cycle.
3887
+ this.dynamicRightDividerCells.forEach((cell) => cell.classList.remove('right-divider'));
3888
+ this.dynamicRightDividerCells.clear();
3889
+ this.dynamicLeftDividerCells.forEach((cell) => cell.classList.remove('left-divider'));
3890
+ this.dynamicLeftDividerCells.clear();
3891
+ this.dynamicHideRightBorderCells.forEach((cell) => cell.classList.remove('hide-right-border'));
3892
+ this.dynamicHideRightBorderCells.clear();
3428
3893
  this.previouslyStyledCells.clear();
3429
3894
  }
3430
3895
  updatePinnedPosition(cell, type, position) {
@@ -4095,7 +4560,7 @@ __decorate$A([
4095
4560
  MapToComponentMethod('watchRowDraggable')
4096
4561
  ], VegaTableRowDraggableController.prototype, "watchRowDraggable", null);
4097
4562
 
4098
- 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}";
4563
+ 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}";
4099
4564
 
4100
4565
  var __decorate$z = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
4101
4566
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -4137,6 +4602,7 @@ const VegaTable = class {
4137
4602
  this.vegaTableBodyRenderer = new VegaTableBodyRenderer();
4138
4603
  this.vegaTableRowRenderer = new VegaTableRowRenderer$1();
4139
4604
  this.vegaTableCellRenderer = new VegaTableCellRenderer();
4605
+ this.vegaTableBodyColSpanController = new VegaTableBodyColSpanController();
4140
4606
  this.vegaTablePaginationRenderer = new VegaTablePaginationRenderer();
4141
4607
  this.vegaTableScrollContainerRenderer = new VegaTableScrollContainerRenderer();
4142
4608
  this.vegaTableRowSelectionController = new VegaTableRowSelectionController$1();
@@ -4633,6 +5099,9 @@ __decorate$z([
4633
5099
  __decorate$z([
4634
5100
  InjectVegaSlimmer()
4635
5101
  ], VegaTable.prototype, "vegaTableCellRenderer", void 0);
5102
+ __decorate$z([
5103
+ InjectVegaSlimmer()
5104
+ ], VegaTable.prototype, "vegaTableBodyColSpanController", void 0);
4636
5105
  __decorate$z([
4637
5106
  InjectVegaSlimmer()
4638
5107
  ], VegaTable.prototype, "vegaTablePaginationRenderer", void 0);
@@ -5039,7 +5508,7 @@ const VegaTableCell = class {
5039
5508
  };
5040
5509
  }
5041
5510
  render() {
5042
- var _a, _b, _c;
5511
+ var _a, _b, _c, _d, _e, _f;
5043
5512
  const responsiveClass = generateResponsiveClass(this.breakpoint, 'v-table-cell');
5044
5513
  const columnAlignClass = generateTextAlignClass(this.textAlign);
5045
5514
  const overflowClass = this.getCellOverflowClass();
@@ -5053,7 +5522,7 @@ const VegaTableCell = class {
5053
5522
  if ((_b = this.renderInput) === null || _b === void 0 ? void 0 : _b.isLeftEndPinned) {
5054
5523
  columnClasses.push('right-divider');
5055
5524
  }
5056
- if ((_c = this.renderInput) === null || _c === void 0 ? void 0 : _c.isNoPinnedEnd) {
5525
+ if (((_c = this.renderInput) === null || _c === void 0 ? void 0 : _c.isNoPinnedEnd) || ((_d = this.renderInput) === null || _d === void 0 ? void 0 : _d.isViewEnd)) {
5057
5526
  columnClasses.push('hide-right-border');
5058
5527
  }
5059
5528
  return sanitizeVegaComponent(h(Host, { class: arrayToClassString([
@@ -5064,7 +5533,7 @@ const VegaTableCell = class {
5064
5533
  this.checked && 'checked',
5065
5534
  this.striped && 'striped',
5066
5535
  this.expanded && 'expanded',
5067
- ]) }, h("td", { class: arrayToClassString(columnClasses), part: "cell",
5536
+ ]), "aria-colspan": ((_e = this.colSpan) !== null && _e !== void 0 ? _e : 0) > 1 ? String(this.colSpan) : null }, h("td", { class: arrayToClassString(columnClasses), part: "cell", colSpan: ((_f = this.colSpan) !== null && _f !== void 0 ? _f : 0) > 1 ? this.colSpan : null,
5068
5537
  /* eslint-disable-next-line react/jsx-no-bind */
5069
5538
  onMouseEnter: this.onMouseEnter.bind(this),
5070
5539
  /* eslint-disable-next-line react/jsx-no-bind */
@@ -5375,13 +5844,22 @@ class VegaTableExpandRowColSpanController extends VegaSlimmer {
5375
5844
  const cells = isTemplateRenderMode
5376
5845
  ? table.querySelectorAll('vega-table-row:nth-of-type(1) vega-table-cell')
5377
5846
  : table.shadowRoot.querySelectorAll('vega-table-row:nth-of-type(1) vega-table-cell');
5378
- return Array.from(cells).filter((cell) => {
5847
+ return Array.from(cells)
5848
+ .filter((cell) => {
5379
5849
  if (!cell.breakpoint)
5380
5850
  return true;
5381
5851
  if (currentBreakpoint === 'default')
5382
5852
  return false;
5383
5853
  return Breakpoints[currentBreakpoint] >= Breakpoints[cell.breakpoint];
5384
- }).length;
5854
+ })
5855
+ .reduce((total, cell) => {
5856
+ var _a;
5857
+ // A cell with `colSpan >= 2` is a single element that occupies multiple physical
5858
+ // columns, so add its span rather than 1. This keeps the expand-row colspan aligned
5859
+ // with the full table width when body cells merge columns.
5860
+ const span = (_a = cell.colSpan) !== null && _a !== void 0 ? _a : 1;
5861
+ return total + (span > 1 ? span : 1);
5862
+ }, 0);
5385
5863
  }
5386
5864
  }
5387
5865
  __decorate$p([
@@ -5655,11 +6133,12 @@ var __decorate$k = (undefined && undefined.__decorate) || function (decorators,
5655
6133
  };
5656
6134
  class VegaTableFootCellRenderer extends VegaSlimmer {
5657
6135
  render() {
6136
+ var _a;
5658
6137
  return (h("td", { class: {
5659
6138
  'vega-table-cell': true,
5660
6139
  'break-word': !FeatureFlag.isEnabled('VEGA_TABLE.ENABLE_NEW_CELL_BREAK_WORDS_STYLE'),
5661
6140
  [generateResponsiveClass(this.breakpoint, 'v-table-cell')]: true,
5662
- } },
6141
+ }, colSpan: ((_a = this.colSpan) !== null && _a !== void 0 ? _a : 0) > 1 ? this.colSpan : null },
5663
6142
  h("div", { class: arrayToClassString(['vega-table-column', this.textAlign]) },
5664
6143
  h("span", { class: "vega-table-column-label" },
5665
6144
  h("slot", null)))));
@@ -5674,6 +6153,9 @@ __decorate$k([
5674
6153
  __decorate$k([
5675
6154
  MapToComponentField()
5676
6155
  ], VegaTableFootCellRenderer.prototype, "textAlign", void 0);
6156
+ __decorate$k([
6157
+ MapToComponentField()
6158
+ ], VegaTableFootCellRenderer.prototype, "colSpan", void 0);
5677
6159
 
5678
6160
  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}";
5679
6161
 
@@ -5698,10 +6180,11 @@ const VegaTableFootCell = class {
5698
6180
  this.currentBreakpoint = getCurrentBreakpoint();
5699
6181
  }
5700
6182
  render() {
6183
+ var _a;
5701
6184
  return sanitizeVegaComponent(h(Host, { class: {
5702
6185
  [`density-${ResponsiveFormatFacade.formatCustom(this.density)}`]: true,
5703
6186
  'column-divider': this.columnDivider,
5704
- }, style: { width: this.width } }, this.vegaTableFootCellRenderer.render()), this.host);
6187
+ }, 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);
5705
6188
  }
5706
6189
  get host() { return getElement(this); }
5707
6190
  };