@heartlandone/vega 2.82.0 → 2.83.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 (119) hide show
  1. package/dist/cjs/{app-globals-3350d580.js → app-globals-40b1b1b2.js} +1 -1
  2. package/dist/cjs/{dto-renderer-manager-ae5fcbba.js → dto-renderer-manager-7eb5c5ce.js} +42 -2
  3. package/dist/cjs/{element-appender-slimmer-dedd3a34.js → element-appender-slimmer-52c2b455.js} +84 -8
  4. package/dist/cjs/index.cjs.js +2 -2
  5. package/dist/cjs/loader.cjs.js +4 -4
  6. package/dist/cjs/{token-extension-9b213b6b.js → token-extension-361273fb.js} +77 -20
  7. package/dist/cjs/vega-banner.cjs.entry.js +13 -2
  8. package/dist/cjs/vega-checkbox_2.cjs.entry.js +37 -4
  9. package/dist/cjs/vega-date-picker_2.cjs.entry.js +1 -1
  10. package/dist/cjs/vega-dialog_2.cjs.entry.js +27 -5
  11. package/dist/cjs/vega-dropdown_5.cjs.entry.js +1 -1
  12. package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
  13. package/dist/cjs/vega-pagination-page-selector-mobile.cjs.entry.js +1 -1
  14. package/dist/cjs/vega-pagination.cjs.entry.js +1 -1
  15. package/dist/cjs/vega-popover_2.cjs.entry.js +1 -1
  16. package/dist/cjs/vega-progress-tracker_2.cjs.entry.js +8 -9
  17. package/dist/cjs/vega-rich-text-content.cjs.entry.js +1 -1
  18. package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +54 -9
  19. package/dist/cjs/vega-text.cjs.entry.js +10 -0
  20. package/dist/cjs/vega-time-picker_2.cjs.entry.js +1 -1
  21. package/dist/cjs/vega-tooltip_2.cjs.entry.js +1 -1
  22. package/dist/cjs/vega.cjs.js +4 -4
  23. package/dist/collection/components/vega-banner/slimmers/renderers/vega-banner-renderer.js +11 -2
  24. package/dist/collection/components/vega-banner/vega-banner.js +3 -1
  25. package/dist/collection/components/vega-checkbox/vega-checkbox.css +19 -14
  26. package/dist/collection/components/vega-checkbox/vega-checkbox.js +57 -3
  27. package/dist/collection/components/vega-modal/slimmers/controllers/vega-modal-backdrop-controller.js +9 -3
  28. package/dist/collection/components/vega-modal/slimmers/controllers/vega-nested-modal-controller.js +17 -2
  29. package/dist/collection/components/vega-pagination/internal/vega-pagination-go-to.js +1 -1
  30. package/dist/collection/components/vega-pagination/vega-pagination-page-selector-mobile/slimmers/renderers/page-selector-mobile-renderer.js +1 -1
  31. package/dist/collection/components/vega-progress-tracker/vega-progress-tracker.js +12 -10
  32. package/dist/collection/components/vega-rich-text-editor/extensions/extension.abstract.js +28 -3
  33. package/dist/collection/components/vega-rich-text-editor/extensions/languages/language-extension.js +24 -6
  34. package/dist/collection/components/vega-rich-text-editor/extensions/languages/language-toolbar-button-renderer.js +23 -8
  35. package/dist/collection/components/vega-rich-text-editor/extensions/table/table-extension.js +2 -2
  36. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/extension-controller.js +18 -1
  37. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/toolbar-renderer.js +1 -1
  38. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/tools/image-toolbar-button-slimmer.js +5 -3
  39. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/tools/text-styles-toolbar-button-slimmer.js +8 -3
  40. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-editor.js +47 -0
  41. package/dist/collection/components/vega-text/slimmers/renderers/vega-text-tooltip-renderer.js +10 -0
  42. package/dist/collection/helpers/rte-manager/dto-renderer-manager.js +42 -2
  43. package/dist/collection/helpers/slimmers/element-appender/body-positioned-wrapper/third-party-dialog-wrapper.js +73 -0
  44. package/dist/collection/helpers/slimmers/element-appender/element-appender-container-controller.js +6 -0
  45. package/dist/esm/{app-globals-0b7e8b50.js → app-globals-f67d0eaf.js} +1 -1
  46. package/dist/esm/{dto-renderer-manager-12bc9121.js → dto-renderer-manager-abc7eb5f.js} +42 -2
  47. package/dist/esm/{element-appender-slimmer-5aca1bca.js → element-appender-slimmer-29c94a18.js} +84 -8
  48. package/dist/esm/index.js +2 -2
  49. package/dist/esm/loader.js +4 -4
  50. package/dist/esm/{token-extension-9d717a35.js → token-extension-0710dbc5.js} +77 -20
  51. package/dist/esm/vega-banner.entry.js +13 -2
  52. package/dist/esm/vega-checkbox_2.entry.js +37 -4
  53. package/dist/esm/vega-date-picker_2.entry.js +1 -1
  54. package/dist/esm/vega-dialog_2.entry.js +27 -5
  55. package/dist/esm/vega-dropdown_5.entry.js +1 -1
  56. package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
  57. package/dist/esm/vega-pagination-page-selector-mobile.entry.js +1 -1
  58. package/dist/esm/vega-pagination.entry.js +1 -1
  59. package/dist/esm/vega-popover_2.entry.js +1 -1
  60. package/dist/esm/vega-progress-tracker_2.entry.js +8 -9
  61. package/dist/esm/vega-rich-text-content.entry.js +1 -1
  62. package/dist/esm/vega-rich-text-editor_4.entry.js +54 -9
  63. package/dist/esm/vega-text.entry.js +10 -0
  64. package/dist/esm/vega-time-picker_2.entry.js +1 -1
  65. package/dist/esm/vega-tooltip_2.entry.js +1 -1
  66. package/dist/esm/vega.js +4 -4
  67. package/dist/sri/vega-sri-manifest.json +70 -70
  68. package/dist/types/components/vega-banner/slimmers/renderers/vega-banner-renderer.d.ts +6 -0
  69. package/dist/types/components/vega-banner/vega-banner.d.ts +2 -0
  70. package/dist/types/components/vega-checkbox/vega-checkbox.d.ts +22 -1
  71. package/dist/types/components/vega-modal/slimmers/controllers/vega-modal-backdrop-controller.d.ts +1 -0
  72. package/dist/types/components/vega-modal/slimmers/controllers/vega-nested-modal-controller.d.ts +3 -2
  73. package/dist/types/components/vega-progress-tracker/vega-progress-tracker.d.ts +8 -9
  74. package/dist/types/components/vega-rich-text-editor/extensions/extension.abstract.d.ts +20 -2
  75. package/dist/types/components/vega-rich-text-editor/extensions/languages/language-extension.d.ts +13 -2
  76. package/dist/types/components/vega-rich-text-editor/extensions/languages/language-toolbar-button-renderer.d.ts +15 -4
  77. package/dist/types/components/vega-rich-text-editor/extensions/table/table-extension.d.ts +1 -1
  78. package/dist/types/components/vega-rich-text-editor/interface.d.ts +4 -0
  79. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/extension-controller.d.ts +7 -0
  80. package/dist/types/components/vega-rich-text-editor/slimmers/renderers/tools/image-toolbar-button-slimmer.d.ts +1 -0
  81. package/dist/types/components/vega-rich-text-editor/slimmers/renderers/tools/text-styles-toolbar-button-slimmer.d.ts +4 -3
  82. package/dist/types/components/vega-rich-text-editor/vega-rich-text-editor.d.ts +14 -1
  83. package/dist/types/components/vega-text/slimmers/renderers/vega-text-tooltip-renderer.d.ts +1 -0
  84. package/dist/types/components.d.ts +29 -5
  85. package/dist/types/helpers/rte-manager/dto-renderer-manager.d.ts +26 -1
  86. package/dist/types/helpers/slimmers/element-appender/body-positioned-wrapper/third-party-dialog-wrapper.d.ts +45 -0
  87. package/dist/types/helpers/slimmers/element-appender/element-appender-container-controller.d.ts +2 -0
  88. package/dist/types/types/components.type.d.ts +1 -0
  89. package/dist/vega/index.esm.js +1 -1
  90. package/dist/vega/p-0bcb2945.entry.js +1 -0
  91. package/dist/vega/{p-a30ae8a1.js → p-0bf8743f.js} +1 -1
  92. package/dist/vega/p-142f371b.entry.js +1 -0
  93. package/dist/vega/p-158c6a9f.entry.js +1 -0
  94. package/dist/vega/p-1b48e8a5.entry.js +1 -0
  95. package/dist/vega/p-380abceb.entry.js +1 -0
  96. package/dist/vega/{p-3505f7cc.entry.js → p-54ba35e3.entry.js} +1 -1
  97. package/dist/vega/p-5be546c5.js +1 -0
  98. package/dist/vega/p-5f377954.js +1 -1
  99. package/dist/vega/{p-246eb001.entry.js → p-608f234f.entry.js} +1 -1
  100. package/dist/vega/p-81a11dc6.entry.js +1 -0
  101. package/dist/vega/{p-23c840dc.entry.js → p-8559e36f.entry.js} +1 -1
  102. package/dist/vega/p-90cb665e.entry.js +1 -0
  103. package/dist/vega/{p-88b6184c.entry.js → p-a4738b70.entry.js} +1 -1
  104. package/dist/vega/p-b6c3ce6d.js +1 -0
  105. package/dist/vega/p-b9728ca8.js +1 -0
  106. package/dist/vega/{p-7faaa5e1.entry.js → p-cc00135a.entry.js} +1 -1
  107. package/dist/vega/{p-97f36f4e.entry.js → p-e00fb667.entry.js} +1 -1
  108. package/dist/vega/vega.esm.js +1 -1
  109. package/package.json +1 -1
  110. package/dist/vega/p-1dd6ba67.js +0 -1
  111. package/dist/vega/p-1efb47fe.entry.js +0 -1
  112. package/dist/vega/p-4f938ee4.entry.js +0 -1
  113. package/dist/vega/p-6d95390b.entry.js +0 -1
  114. package/dist/vega/p-a5bd3ecd.entry.js +0 -1
  115. package/dist/vega/p-c366e7f7.entry.js +0 -1
  116. package/dist/vega/p-d872beb1.entry.js +0 -1
  117. package/dist/vega/p-d9d5c693.entry.js +0 -1
  118. package/dist/vega/p-dd6211cd.js +0 -1
  119. package/dist/vega/p-fcabf0dc.js +0 -1
@@ -12,10 +12,15 @@ export class VegaTextTooltipRenderer extends PageResizeObserverSlimmer {
12
12
  /**
13
13
  * The below method is e2e-test covered in
14
14
  * @see{module:vega-text-with-long-text-change-screen-size}
15
+ * @see{module:vega-text-restore-on-enlarge-screen-size}
15
16
  */
16
17
  constructor() {
17
18
  /* eslint-disable jsdoc/require-jsdoc*/
18
19
  super({
20
+ // Observe both the host (catches show/hide e.g. in vega-tab-group-panel, VD-8769)
21
+ // and document.body (catches viewport resize after truncation collapses host width).
22
+ // eslint-disable-next-line no-restricted-globals
23
+ target: /* istanbul ignore next */ () => [this.host, document.body],
19
24
  callback: /* istanbul ignore next */ () => {
20
25
  if (this.overflow === 'ellipsis') {
21
26
  if (this.tooltipRef) {
@@ -33,6 +38,11 @@ export class VegaTextTooltipRenderer extends PageResizeObserverSlimmer {
33
38
  */
34
39
  /* istanbul ignore next */
35
40
  this.handleTooltip = async () => {
41
+ // Skip when host has no layout (e.g. hidden inside an inactive vega-tab-group-panel);
42
+ // the observer will re-fire once the host becomes visible.
43
+ if (this.host.clientWidth === 0) {
44
+ return;
45
+ }
36
46
  if (isTextWrapped(this.host)) {
37
47
  const tooltip = this.createTooltip();
38
48
  void tooltip.componentOnReady().then(() => {
@@ -7,6 +7,14 @@ class RTEDTORendererManager {
7
7
  this.RTE_DTO_RENDERER_MAP = new Map();
8
8
  // Register RTE Toolbar Button Renderers, mapping type strings to their respective renderer instances.
9
9
  this.RTE_TOOLBAR_BUTTON_RENDERER_MAP = new Map();
10
+ /**
11
+ * Per-host toolbar button renderer map.
12
+ * Stores a host-specific renderer map so that extensions that register during
13
+ * {@link VegaRTEExtension#prepareBeforeLoad} can provide isolated renderer instances
14
+ * for each {@link HTMLVegaRichTextEditorElement}. At render time this map is checked
15
+ * first; the global singleton map is used as a fallback.
16
+ */
17
+ this.hostToolbarButtonRendererMap = new WeakMap();
10
18
  }
11
19
  /**
12
20
  * Registers a new RTE DTO renderer.
@@ -32,6 +40,24 @@ class RTEDTORendererManager {
32
40
  registerRTEToolbarButtonRenderer(type, RTEToolbarButtonRenderer) {
33
41
  this.RTE_TOOLBAR_BUTTON_RENDERER_MAP.set(type, RTEToolbarButtonRenderer);
34
42
  }
43
+ /**
44
+ * Registers a host-specific toolbar button renderer.
45
+ * The per-host renderer takes precedence over the global singleton when the host
46
+ * element is passed to {@link getRTEToolbarButtonRenderer}.
47
+ *
48
+ * @typedef HTMLVegaRichTextEditorElement - The rich text editor host element type.
49
+ * @param {HTMLVegaRichTextEditorElement} host - The rich text editor host element.
50
+ * @param {string} type - The type identifier for the toolbar button renderer.
51
+ * @param {VegaRTEToolbarButtonRenderer} renderer - The renderer instance to register for this host.
52
+ */
53
+ registerRTEToolbarButtonRendererForHost(host, type, renderer) {
54
+ let hostMap = this.hostToolbarButtonRendererMap.get(host);
55
+ if (!hostMap) {
56
+ hostMap = new Map();
57
+ this.hostToolbarButtonRendererMap.set(host, hostMap);
58
+ }
59
+ hostMap.set(type, renderer);
60
+ }
35
61
  /**
36
62
  * Retrieves the RTE renderer for a given type.
37
63
  *
@@ -43,12 +69,26 @@ class RTEDTORendererManager {
43
69
  }
44
70
  /**
45
71
  * Retrieves the RTE Toolbar Button Renderer for a given type.
72
+ * When a host element is provided the per-host map registered via
73
+ * {@link registerRTEToolbarButtonRendererForHost} is checked first; the global
74
+ * singleton map is used as a fallback so that extensions that do not override
75
+ * {@link VegaRTEExtension#prepareBeforeLoad} continue to work unchanged.
46
76
  *
77
+ * @typedef HTMLVegaRichTextEditorElement - The rich text editor host element type.
47
78
  * @param {string} type - The type identifier for the RTE Toolbar Button Renderer.
79
+ * @param {HTMLVegaRichTextEditorElement} [host] - Optional host element for per-host lookup.
48
80
  * @returns {Nullable<VegaRTEToolbarButtonRenderer>} - The renderer instance for the RTE Toolbar Button, or null if not found.
49
81
  */
50
- getRTEToolbarButtonRenderer(type) {
51
- return this.RTE_TOOLBAR_BUTTON_RENDERER_MAP.get(type);
82
+ getRTEToolbarButtonRenderer(type, host) {
83
+ var _a, _b;
84
+ if (host) {
85
+ const hostRenderer = (_a = this.hostToolbarButtonRendererMap
86
+ .get(host)) === null || _a === void 0 ? void 0 : _a.get(type);
87
+ if (hostRenderer) {
88
+ return hostRenderer;
89
+ }
90
+ }
91
+ return (_b = this.RTE_TOOLBAR_BUTTON_RENDERER_MAP.get(type)) !== null && _b !== void 0 ? _b : null;
52
92
  }
53
93
  }
54
94
  export default new RTEDTORendererManager();
@@ -0,0 +1,73 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { MapToComponentField as MapToSlimmerField } from 'vega-slimmer/core';
8
+ import { findParent } from '../../../../utils/ui';
9
+ import { BodyPositionedWrapper } from './body-positioned-wrapper.abstract';
10
+ /**
11
+ * Appends the popover content box inside the nearest third-party dialog/modal (e.g. Bootstrap,
12
+ * MUI) so that their focus trap does not block focus on vega-popover content.
13
+ *
14
+ * Detection strategy:
15
+ * 1. Walk up from the target to find `dialog` or `[aria-modal="true"]`.
16
+ * 2. Skip Vega-owned elements (tag starts with `VEGA-`).
17
+ * 3. Locate the focus-trap root via `closest('[tabindex="-1"]')`.
18
+ */
19
+ export class ThirdPartyDialogWrapper extends BodyPositionedWrapper {
20
+ /**
21
+ * Returns true when the target lives inside a third-party dialog.
22
+ *
23
+ * NOTE: Does NOT call super.canRetrieve() — must activate even when isScreenPosition=true
24
+ * (e.g. image editor popover) so the content box stays inside the focus-trap root.
25
+ *
26
+ * @returns {boolean} Whether the target is inside a third-party dialog.
27
+ */
28
+ canRetrieve() {
29
+ this.focusTrapRoot = this.findFocusTrapRoot(this.showConfig.target);
30
+ return !!this.focusTrapRoot;
31
+ }
32
+ /**
33
+ * Appends the popover content box inside the focus-trap root.
34
+ *
35
+ * @returns {HTMLElement} The focus-trap root element.
36
+ */
37
+ retrieve() {
38
+ const root = this.focusTrapRoot;
39
+ this.focusTrapRoot = null;
40
+ if (this.showConfig.appendableElement.parentElement !== root) {
41
+ root.append(this.showConfig.appendableElement);
42
+ }
43
+ return root;
44
+ }
45
+ /**
46
+ * Finds the focus-trap root of the nearest third-party dialog ancestor.
47
+ * Returns null if not inside a third-party dialog or if the dialog is Vega-owned.
48
+ *
49
+ * @param {Nullable<HTMLElement>} el - The element to start searching from.
50
+ * @returns {Nullable<HTMLElement>} The focus-trap root, or null.
51
+ */
52
+ findFocusTrapRoot(el) {
53
+ var _a;
54
+ const dialog = findParent(el, 'dialog, [aria-modal="true"]');
55
+ if (!dialog || this.isVegaOwned(dialog))
56
+ return null;
57
+ // closest() also matches the element itself — needed when [aria-modal] and [tabindex="-1"]
58
+ // are on the same node (e.g. Bootstrap 5 outer .modal div).
59
+ return (_a = dialog.closest('[tabindex="-1"]')) !== null && _a !== void 0 ? _a : dialog;
60
+ }
61
+ /**
62
+ * Returns true when the element is a Vega custom element (tag starts with `VEGA-`).
63
+ *
64
+ * @param {HTMLElement} el - The element to check.
65
+ * @returns {boolean} True if the element is Vega-owned.
66
+ */
67
+ isVegaOwned(el) {
68
+ return el.tagName.startsWith('VEGA-');
69
+ }
70
+ }
71
+ __decorate([
72
+ MapToSlimmerField()
73
+ ], ThirdPartyDialogWrapper.prototype, "showConfig", void 0);
@@ -9,6 +9,7 @@ import { DefaultWrapper } from './body-positioned-wrapper/default-wrapper';
9
9
  import { PositionRelativeToWrapper } from './body-positioned-wrapper/position-relative-to-wrapper';
10
10
  import { VegaModalWrapper } from './body-positioned-wrapper/vega-modal-wrapper';
11
11
  import { VegaPopoverWrapper } from './body-positioned-wrapper/vega-popover-wrapper';
12
+ import { ThirdPartyDialogWrapper } from './body-positioned-wrapper/third-party-dialog-wrapper';
12
13
  /**
13
14
  * This class is responsible for setting the container element for appending an element based on certain conditions.
14
15
  *
@@ -21,6 +22,7 @@ export class ElementAppenderContainerController extends VegaSlimmer {
21
22
  this.positionRelativeToWrapper = new PositionRelativeToWrapper();
22
23
  this.vegaPopoverWrapper = new VegaPopoverWrapper();
23
24
  this.vegaModalWrapper = new VegaModalWrapper();
25
+ this.thirdPartyDialogWrapper = new ThirdPartyDialogWrapper();
24
26
  this.defaultWrapper = new DefaultWrapper();
25
27
  }
26
28
  /**
@@ -43,6 +45,7 @@ export class ElementAppenderContainerController extends VegaSlimmer {
43
45
  this.positionRelativeToWrapper,
44
46
  this.vegaPopoverWrapper,
45
47
  this.vegaModalWrapper,
48
+ this.thirdPartyDialogWrapper,
46
49
  this.defaultWrapper,
47
50
  ];
48
51
  }
@@ -62,6 +65,9 @@ __decorate([
62
65
  __decorate([
63
66
  InjectVegaSlimmer()
64
67
  ], ElementAppenderContainerController.prototype, "vegaModalWrapper", void 0);
68
+ __decorate([
69
+ InjectVegaSlimmer()
70
+ ], ElementAppenderContainerController.prototype, "thirdPartyDialogWrapper", void 0);
65
71
  __decorate([
66
72
  InjectVegaSlimmer()
67
73
  ], ElementAppenderContainerController.prototype, "defaultWrapper", void 0);
@@ -1,5 +1,5 @@
1
1
  import { F as FeatureFlag } from './feature-flag-controller-30f7b625.js';
2
- import { V as VegaLoader, a as VegaNotify, b as VegaEventManager, c as VegaZIndexManager, w as waitForVega, d as VegaSkeletonLoader, e as VegaTranslation, f as VegaRTETokenExtension, g as VegaRTELanguageExtension, h as VegaRTEFunctionExtension, i as VegaRTETableExtension } from './token-extension-9d717a35.js';
2
+ import { V as VegaLoader, a as VegaNotify, b as VegaEventManager, c as VegaZIndexManager, w as waitForVega, d as VegaSkeletonLoader, e as VegaTranslation, f as VegaRTETokenExtension, g as VegaRTELanguageExtension, h as VegaRTEFunctionExtension, i as VegaRTETableExtension } from './token-extension-0710dbc5.js';
3
3
  import { V as VegaThemeManager } from './split-cell-operation-5587f594.js';
4
4
  import { M as MapToComponentMethod, V as VegaSlimmer, s as setVegaLogLevel, G as GlobalSlimmersRegistry } from './global-slimmer-registry-17c4efd4.js';
5
5
  import { V as VegaDialog } from './vega-dialog-controller-bbb2fc52.js';
@@ -7,6 +7,14 @@ class RTEDTORendererManager {
7
7
  this.RTE_DTO_RENDERER_MAP = new Map();
8
8
  // Register RTE Toolbar Button Renderers, mapping type strings to their respective renderer instances.
9
9
  this.RTE_TOOLBAR_BUTTON_RENDERER_MAP = new Map();
10
+ /**
11
+ * Per-host toolbar button renderer map.
12
+ * Stores a host-specific renderer map so that extensions that register during
13
+ * {@link VegaRTEExtension#prepareBeforeLoad} can provide isolated renderer instances
14
+ * for each {@link HTMLVegaRichTextEditorElement}. At render time this map is checked
15
+ * first; the global singleton map is used as a fallback.
16
+ */
17
+ this.hostToolbarButtonRendererMap = new WeakMap();
10
18
  }
11
19
  /**
12
20
  * Registers a new RTE DTO renderer.
@@ -32,6 +40,24 @@ class RTEDTORendererManager {
32
40
  registerRTEToolbarButtonRenderer(type, RTEToolbarButtonRenderer) {
33
41
  this.RTE_TOOLBAR_BUTTON_RENDERER_MAP.set(type, RTEToolbarButtonRenderer);
34
42
  }
43
+ /**
44
+ * Registers a host-specific toolbar button renderer.
45
+ * The per-host renderer takes precedence over the global singleton when the host
46
+ * element is passed to {@link getRTEToolbarButtonRenderer}.
47
+ *
48
+ * @typedef HTMLVegaRichTextEditorElement - The rich text editor host element type.
49
+ * @param {HTMLVegaRichTextEditorElement} host - The rich text editor host element.
50
+ * @param {string} type - The type identifier for the toolbar button renderer.
51
+ * @param {VegaRTEToolbarButtonRenderer} renderer - The renderer instance to register for this host.
52
+ */
53
+ registerRTEToolbarButtonRendererForHost(host, type, renderer) {
54
+ let hostMap = this.hostToolbarButtonRendererMap.get(host);
55
+ if (!hostMap) {
56
+ hostMap = new Map();
57
+ this.hostToolbarButtonRendererMap.set(host, hostMap);
58
+ }
59
+ hostMap.set(type, renderer);
60
+ }
35
61
  /**
36
62
  * Retrieves the RTE renderer for a given type.
37
63
  *
@@ -43,12 +69,26 @@ class RTEDTORendererManager {
43
69
  }
44
70
  /**
45
71
  * Retrieves the RTE Toolbar Button Renderer for a given type.
72
+ * When a host element is provided the per-host map registered via
73
+ * {@link registerRTEToolbarButtonRendererForHost} is checked first; the global
74
+ * singleton map is used as a fallback so that extensions that do not override
75
+ * {@link VegaRTEExtension#prepareBeforeLoad} continue to work unchanged.
46
76
  *
77
+ * @typedef HTMLVegaRichTextEditorElement - The rich text editor host element type.
47
78
  * @param {string} type - The type identifier for the RTE Toolbar Button Renderer.
79
+ * @param {HTMLVegaRichTextEditorElement} [host] - Optional host element for per-host lookup.
48
80
  * @returns {Nullable<VegaRTEToolbarButtonRenderer>} - The renderer instance for the RTE Toolbar Button, or null if not found.
49
81
  */
50
- getRTEToolbarButtonRenderer(type) {
51
- return this.RTE_TOOLBAR_BUTTON_RENDERER_MAP.get(type);
82
+ getRTEToolbarButtonRenderer(type, host) {
83
+ var _a, _b;
84
+ if (host) {
85
+ const hostRenderer = (_a = this.hostToolbarButtonRendererMap
86
+ .get(host)) === null || _a === void 0 ? void 0 : _a.get(type);
87
+ if (hostRenderer) {
88
+ return hostRenderer;
89
+ }
90
+ }
91
+ return (_b = this.RTE_TOOLBAR_BUTTON_RENDERER_MAP.get(type)) !== null && _b !== void 0 ? _b : null;
52
92
  }
53
93
  }
54
94
  const RTEDTORendererManager$1 = new RTEDTORendererManager();
@@ -14,7 +14,7 @@ import { O as Observer } from './observer-3959f9dd.js';
14
14
  import { d as domNodeSubjectFactory, D as DomNodeSubjectObserverFactory } from './dom-node-subject-observer-factory-aca0116e.js';
15
15
  import { B as VegaInternalNestEAHierarchyTreeChange } from './vega-internal-event-id-194bac82.js';
16
16
 
17
- var __decorate$a = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
17
+ var __decorate$b = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
18
18
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
19
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
20
20
  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;
@@ -46,7 +46,7 @@ class DefaultWrapper {
46
46
  return container;
47
47
  }
48
48
  }
49
- __decorate$a([
49
+ __decorate$b([
50
50
  MapToComponentField()
51
51
  ], DefaultWrapper.prototype, "showConfig", void 0);
52
52
 
@@ -64,7 +64,7 @@ class BodyPositionedWrapper {
64
64
  }
65
65
  }
66
66
 
67
- var __decorate$9 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
67
+ var __decorate$a = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
68
68
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
69
69
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
70
70
  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;
@@ -101,11 +101,11 @@ class PositionRelativeToWrapper extends BodyPositionedWrapper {
101
101
  return container;
102
102
  }
103
103
  }
104
- __decorate$9([
104
+ __decorate$a([
105
105
  MapToComponentField()
106
106
  ], PositionRelativeToWrapper.prototype, "showConfig", void 0);
107
107
 
108
- var __decorate$8 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
108
+ var __decorate$9 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
109
109
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
110
110
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
111
111
  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;
@@ -164,11 +164,11 @@ class VegaModalWrapper extends BodyPositionedWrapper {
164
164
  return modalContentScrollable ? modalContentScrollable : modalDialog;
165
165
  }
166
166
  }
167
- __decorate$8([
167
+ __decorate$9([
168
168
  MapToComponentField({ writable: true })
169
169
  ], VegaModalWrapper.prototype, "showConfig", void 0);
170
170
 
171
- var __decorate$7 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
171
+ var __decorate$8 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
172
172
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
173
173
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
174
174
  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;
@@ -199,10 +199,81 @@ class VegaPopoverWrapper extends BodyPositionedWrapper {
199
199
  return container;
200
200
  }
201
201
  }
202
- __decorate$7([
202
+ __decorate$8([
203
203
  MapToComponentField()
204
204
  ], VegaPopoverWrapper.prototype, "showConfig", void 0);
205
205
 
206
+ var __decorate$7 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
207
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
208
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
209
+ 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;
210
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
211
+ };
212
+ /**
213
+ * Appends the popover content box inside the nearest third-party dialog/modal (e.g. Bootstrap,
214
+ * MUI) so that their focus trap does not block focus on vega-popover content.
215
+ *
216
+ * Detection strategy:
217
+ * 1. Walk up from the target to find `dialog` or `[aria-modal="true"]`.
218
+ * 2. Skip Vega-owned elements (tag starts with `VEGA-`).
219
+ * 3. Locate the focus-trap root via `closest('[tabindex="-1"]')`.
220
+ */
221
+ class ThirdPartyDialogWrapper extends BodyPositionedWrapper {
222
+ /**
223
+ * Returns true when the target lives inside a third-party dialog.
224
+ *
225
+ * NOTE: Does NOT call super.canRetrieve() — must activate even when isScreenPosition=true
226
+ * (e.g. image editor popover) so the content box stays inside the focus-trap root.
227
+ *
228
+ * @returns {boolean} Whether the target is inside a third-party dialog.
229
+ */
230
+ canRetrieve() {
231
+ this.focusTrapRoot = this.findFocusTrapRoot(this.showConfig.target);
232
+ return !!this.focusTrapRoot;
233
+ }
234
+ /**
235
+ * Appends the popover content box inside the focus-trap root.
236
+ *
237
+ * @returns {HTMLElement} The focus-trap root element.
238
+ */
239
+ retrieve() {
240
+ const root = this.focusTrapRoot;
241
+ this.focusTrapRoot = null;
242
+ if (this.showConfig.appendableElement.parentElement !== root) {
243
+ root.append(this.showConfig.appendableElement);
244
+ }
245
+ return root;
246
+ }
247
+ /**
248
+ * Finds the focus-trap root of the nearest third-party dialog ancestor.
249
+ * Returns null if not inside a third-party dialog or if the dialog is Vega-owned.
250
+ *
251
+ * @param {Nullable<HTMLElement>} el - The element to start searching from.
252
+ * @returns {Nullable<HTMLElement>} The focus-trap root, or null.
253
+ */
254
+ findFocusTrapRoot(el) {
255
+ var _a;
256
+ const dialog = findParent(el, 'dialog, [aria-modal="true"]');
257
+ if (!dialog || this.isVegaOwned(dialog))
258
+ return null;
259
+ // closest() also matches the element itself — needed when [aria-modal] and [tabindex="-1"]
260
+ // are on the same node (e.g. Bootstrap 5 outer .modal div).
261
+ return (_a = dialog.closest('[tabindex="-1"]')) !== null && _a !== void 0 ? _a : dialog;
262
+ }
263
+ /**
264
+ * Returns true when the element is a Vega custom element (tag starts with `VEGA-`).
265
+ *
266
+ * @param {HTMLElement} el - The element to check.
267
+ * @returns {boolean} True if the element is Vega-owned.
268
+ */
269
+ isVegaOwned(el) {
270
+ return el.tagName.startsWith('VEGA-');
271
+ }
272
+ }
273
+ __decorate$7([
274
+ MapToComponentField()
275
+ ], ThirdPartyDialogWrapper.prototype, "showConfig", void 0);
276
+
206
277
  var __decorate$6 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
207
278
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
208
279
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -221,6 +292,7 @@ class ElementAppenderContainerController extends VegaSlimmer {
221
292
  this.positionRelativeToWrapper = new PositionRelativeToWrapper();
222
293
  this.vegaPopoverWrapper = new VegaPopoverWrapper();
223
294
  this.vegaModalWrapper = new VegaModalWrapper();
295
+ this.thirdPartyDialogWrapper = new ThirdPartyDialogWrapper();
224
296
  this.defaultWrapper = new DefaultWrapper();
225
297
  }
226
298
  /**
@@ -243,6 +315,7 @@ class ElementAppenderContainerController extends VegaSlimmer {
243
315
  this.positionRelativeToWrapper,
244
316
  this.vegaPopoverWrapper,
245
317
  this.vegaModalWrapper,
318
+ this.thirdPartyDialogWrapper,
246
319
  this.defaultWrapper,
247
320
  ];
248
321
  }
@@ -262,6 +335,9 @@ __decorate$6([
262
335
  __decorate$6([
263
336
  InjectVegaSlimmer()
264
337
  ], ElementAppenderContainerController.prototype, "vegaModalWrapper", void 0);
338
+ __decorate$6([
339
+ InjectVegaSlimmer()
340
+ ], ElementAppenderContainerController.prototype, "thirdPartyDialogWrapper", void 0);
265
341
  __decorate$6([
266
342
  InjectVegaSlimmer()
267
343
  ], ElementAppenderContainerController.prototype, "defaultWrapper", void 0);
package/dist/esm/index.js CHANGED
@@ -8,7 +8,7 @@ export { I as Icons, g as getIconFromToken } from './icons-8627925e.js';
8
8
  export { b as Typography, a as TypographyKeys, T as TypographyUrls } from './typography-396de03f.js';
9
9
  export { d as BoxDisplay, e as BreakpointKeys, C as CssStates, F as FlexDirections } from './ui-93922c59.js';
10
10
  export { F as FrameworkEnum, v as VegaEnvManager } from './vega-env-manager-8f8dc473.js';
11
- export { A as ActionHandlerInterceptor, I as InsertNodeToNearestRootAction, o as RTELanguageToolbarButtonRenderer, m as RTETokenNode, n as RTETokenNodeRenderer, R as RTETokenToolbarButtonRenderer, b as VegaEventManager, V as VegaLoader, a as VegaNotify, j as VegaRTEExtension, k as VegaRTEExtensionRenderer, h as VegaRTEFunctionExtension, g as VegaRTELanguageExtension, i as VegaRTETableExtension, f as VegaRTETokenExtension, l as VegaRTEToolbarButtonRenderer, d as VegaSkeletonLoader, e as VegaTranslation, c as VegaZIndexManager, w as waitForVega } from './token-extension-9d717a35.js';
11
+ export { A as ActionHandlerInterceptor, I as InsertNodeToNearestRootAction, o as RTELanguageToolbarButtonRenderer, m as RTETokenNode, n as RTETokenNodeRenderer, R as RTETokenToolbarButtonRenderer, b as VegaEventManager, V as VegaLoader, a as VegaNotify, j as VegaRTEExtension, k as VegaRTEExtensionRenderer, h as VegaRTEFunctionExtension, g as VegaRTELanguageExtension, i as VegaRTETableExtension, f as VegaRTETokenExtension, l as VegaRTEToolbarButtonRenderer, d as VegaSkeletonLoader, e as VegaTranslation, c as VegaZIndexManager, w as waitForVega } from './token-extension-0710dbc5.js';
12
12
  export { F as FeatureFlag } from './feature-flag-controller-30f7b625.js';
13
13
  export { V as VegaThemeManager } from './split-cell-operation-5587f594.js';
14
14
  export { V as VegaDialog } from './vega-dialog-controller-bbb2fc52.js';
@@ -39,7 +39,7 @@ import './internal-vega-z-index-manager-7d2b54c3.js';
39
39
  import './number-4398f2e1.js';
40
40
  import './page-resize-observer-slimmer-e24d36c5.js';
41
41
  import './try-get-document-bef0f526.js';
42
- import './dto-renderer-manager-12bc9121.js';
42
+ import './dto-renderer-manager-abc7eb5f.js';
43
43
  import './base-renderer-101f6d04.js';
44
44
  import './internal-icon-manager-bd80b3bb.js';
45
45
  import './dom-node-subject-observer-factory-aca0116e.js';