@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
@@ -87,6 +87,21 @@ export class VegaCheckbox {
87
87
  * @vegaVersion 1.0.7
88
88
  */
89
89
  this.checked = false;
90
+ /**
91
+ * Specifies whether the checkbox is in an indeterminate state.
92
+ *
93
+ * The indeterminate state is a visual-only state typically used to represent
94
+ * a checkbox whose value is neither fully checked nor fully unchecked,
95
+ * such as a "select all" control where only some children are selected.
96
+ *
97
+ * Setting this property does not affect the `checked` or `value` properties.
98
+ * User interaction (clicking) will clear the indeterminate state and
99
+ * toggle `checked` as usual.
100
+ *
101
+ * @vegaVersion 2.83.0
102
+ */
103
+ /* eslint-disable-next-line @stencil/strict-mutable */
104
+ this.indeterminate = false;
90
105
  /**
91
106
  * Specifies whether the checkbox element is disabled.
92
107
  *
@@ -114,11 +129,14 @@ export class VegaCheckbox {
114
129
  /* eslint-disable-next-line @stencil/strict-mutable */
115
130
  this.isValid = null;
116
131
  /**
117
- * The below method is e2e-test covered in
132
+ * Indeterminate-clearing behavior is unit-tested.
133
+ * The checked-state side of this method is e2e-test covered in
118
134
  * @see{module:vega-checkbox-change}
119
135
  */
120
- /* istanbul ignore next */
121
136
  this.onCheckBoxChange = (e) => {
137
+ if (this.indeterminate) {
138
+ this.indeterminate = false;
139
+ }
122
140
  this.checked = e.currentTarget.checked;
123
141
  };
124
142
  this.onSelectedIconClick = (e) => {
@@ -145,6 +163,7 @@ export class VegaCheckbox {
145
163
  if (this.host.innerHTML.trim() === '') {
146
164
  this.labelElement.classList.add('vega-hidden');
147
165
  }
166
+ this.syncNativeIndeterminate();
148
167
  }
149
168
  /**
150
169
  * Invoke this method to set the value of the checkbox.
@@ -163,6 +182,7 @@ export class VegaCheckbox {
163
182
  return sanitizeVegaComponent(h(Host, { class: {
164
183
  'vega-flex-shrink-0 v-min-w-min': isInsideCheckboxGroup,
165
184
  'checked': this.checked,
185
+ 'indeterminate': this.indeterminate,
166
186
  'disabled': this.isDisabled(),
167
187
  } },
168
188
  h("label", { class: arrayToClassString([
@@ -170,13 +190,16 @@ export class VegaCheckbox {
170
190
  this.showError && 'error',
171
191
  this.size && `size-${this.size}`,
172
192
  ]), ref: (e) => (this.inputContainerRef = e) },
173
- h("input", { ref: (e) => (this.inputRef = e), type: "checkbox", checked: this.checked, value: this.identifier, onChange: this.onCheckBoxChange, "aria-label": this.identifier || 'No label defined', disabled: this.isDisabled(), role: 'button', tabIndex: 0, onKeyDown: createEnterKeyHandlerToTriggerClick() }),
193
+ h("input", { ref: (e) => (this.inputRef = e), type: "checkbox", checked: this.checked, value: this.identifier, onChange: this.onCheckBoxChange, "aria-label": this.identifier || 'No label defined', "aria-checked": this.indeterminate ? 'mixed' : undefined, disabled: this.isDisabled(), tabIndex: 0, onKeyDown: createEnterKeyHandlerToTriggerClick() }),
174
194
  h("span", { class: "vega-checkbox-icon", onClick: this.onSelectedIconClick, tabIndex: -1 }, this.renderIconDom()),
175
195
  h("div", { class: "vega-checkbox-label-container", ref: (el) => (this.labelElement = el) },
176
196
  this.renderLabelDom(),
177
197
  this.renderRequireDom()))), this.host);
178
198
  }
179
199
  renderIconDom() {
200
+ if (this.indeterminate) {
201
+ return h("vega-icon", { icon: "minus-sign", size: this.size === 'small' ? 'size-12' : 'size-16' });
202
+ }
180
203
  return this.checked ? (h("vega-icon", { icon: "checkmark", size: this.size === 'small' ? 'size-12' : 'size-16' })) : null;
181
204
  }
182
205
  renderLabelDom() {
@@ -191,6 +214,16 @@ export class VegaCheckbox {
191
214
  initValue() {
192
215
  this.value = this.identifier !== '' ? (this.checked ? this.identifier : '') : this.checked;
193
216
  }
217
+ /**
218
+ * Syncs the indeterminate property to the native input element.
219
+ * The HTML `indeterminate` attribute can only be set via JavaScript,
220
+ * so it must be applied imperatively after each render.
221
+ */
222
+ syncNativeIndeterminate() {
223
+ if (this.inputRef) {
224
+ this.inputRef.indeterminate = this.indeterminate;
225
+ }
226
+ }
194
227
  /**
195
228
  * indicating whether the component is disabled or not, single checkbox will take the self disabled value and the checkbox in group will take the self disabled and group disabled value
196
229
  *
@@ -305,6 +338,27 @@ export class VegaCheckbox {
305
338
  "reflect": false,
306
339
  "defaultValue": "false"
307
340
  },
341
+ "indeterminate": {
342
+ "type": "boolean",
343
+ "mutable": true,
344
+ "complexType": {
345
+ "original": "boolean",
346
+ "resolved": "boolean",
347
+ "references": {}
348
+ },
349
+ "required": false,
350
+ "optional": false,
351
+ "docs": {
352
+ "tags": [{
353
+ "name": "vegaVersion",
354
+ "text": "2.83.0"
355
+ }],
356
+ "text": "Specifies whether the checkbox is in an indeterminate state.\n\nThe indeterminate state is a visual-only state typically used to represent\n a checkbox whose value is neither fully checked nor fully unchecked,\n such as a \"select all\" control where only some children are selected.\n\nSetting this property does not affect the `checked` or `value` properties.\n User interaction (clicking) will clear the indeterminate state and\n toggle `checked` as usual."
357
+ },
358
+ "attribute": "indeterminate",
359
+ "reflect": true,
360
+ "defaultValue": "false"
361
+ },
308
362
  "disabled": {
309
363
  "type": "boolean",
310
364
  "mutable": false,
@@ -29,18 +29,23 @@ export class VegaModalBackdropController extends VegaSlimmer {
29
29
  * Set backdrop of modal.
30
30
  */
31
31
  setBackdrop() {
32
+ var _a;
32
33
  if (this.backdrop === 'none')
33
34
  return;
34
35
  // eslint-disable-next-line no-restricted-globals
35
- let backdrop = document.querySelector('vega-backdrop.modal-backdrop');
36
+ let backdrop = document.querySelector(`vega-backdrop.${VegaModalBackdropController.modalBackdropClass}`);
36
37
  if (!backdrop) {
37
38
  // eslint-disable-next-line no-restricted-globals
38
39
  backdrop = document.createElement('vega-backdrop');
39
- backdrop.classList.add('modal-backdrop');
40
+ backdrop.classList.add(VegaModalBackdropController.modalBackdropClass);
40
41
  backdrop.color = VegaModalBackdropController.backdropColorMap[this.backdropColor];
41
42
  backdrop.visible = true;
43
+ // Append backdrop as a sibling of the modal host so it shares the same stacking context.
44
+ // - When vega-modal is in document.body (normal case), parentElement is document.body.
45
+ // - When vega-modal is inside a third-party dialog (e.g. Bootstrap modal), parentElement is the dialog container — keeping the backdrop inside the focus-trap root.
46
+ // - Falls back to document.body when parentElement is null (e.g. VegaDialog creates the vega-modal element before appending it to the DOM).
42
47
  // eslint-disable-next-line no-restricted-globals
43
- document.querySelector('body').append(backdrop);
48
+ ((_a = this.host.parentElement) !== null && _a !== void 0 ? _a : document.body).append(backdrop);
44
49
  }
45
50
  this.backdropRef = backdrop;
46
51
  }
@@ -51,6 +56,7 @@ export class VegaModalBackdropController extends VegaSlimmer {
51
56
  this.backdropRef && this.backdropRef.remove();
52
57
  }
53
58
  }
59
+ VegaModalBackdropController.modalBackdropClass = 'vega-modal-backdrop';
54
60
  VegaModalBackdropController.backdropColorMap = {
55
61
  default: 'bg-backdrop-modal',
56
62
  semi: 'bg-backdrop-popover',
@@ -4,11 +4,26 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
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
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { MapToComponentField, MapToComponentMethod, VegaSlimmer } from 'vega-slimmer/core';
7
+ import { MapToComponentField, MapToComponentMethod } from 'vega-slimmer/core';
8
+ import { MutationObserverSlimmer } from '../../../../helpers/slimmers/mutation-observer/mutation-observer-slimmer';
9
+ import { TagNameMutationFilter } from '../../../../helpers/slimmers/mutation-observer/mutation-observer-filters';
8
10
  /**
9
11
  * Nested modal controller
10
12
  */
11
- export class VegaNestedModalController extends VegaSlimmer {
13
+ export class VegaNestedModalController extends MutationObserverSlimmer {
14
+ constructor() {
15
+ super({
16
+ mutationFilter: TagNameMutationFilter('VEGA-MODAL'),
17
+ options: {
18
+ childList: true,
19
+ subtree: true,
20
+ },
21
+ // eslint-disable-next-line jsdoc/require-jsdoc
22
+ callback: () => {
23
+ this.appendNestedModalToBody();
24
+ },
25
+ });
26
+ }
12
27
  /**
13
28
  * Component lifecycle - [connectedCallback]
14
29
  */
@@ -21,7 +21,7 @@ export const VegaPaginationGoTo = ({ onChange, pageCount, translationSlimmer, })
21
21
  ref: (ref) => {
22
22
  DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, VegaFormSubmit, handleChange);
23
23
  } },
24
- h("vega-input", { "data-vega-form": "paginationGoTo", type: "number", size: "small", showClearIcon: false, style: { width: '60px' }, maskConfig: {
24
+ h("vega-input", { "data-vega-form": "paginationGoTo", type: "number", size: "small", autocomplete: "on", showClearIcon: false, style: { width: '60px' }, maskConfig: {
25
25
  type: 'number',
26
26
  options: {
27
27
  allowNegative: false,
@@ -42,7 +42,7 @@ export class PageSelectorMobileRenderer extends VegaSlimmer {
42
42
  h("vega-form", { ref: (ref) => {
43
43
  DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, VegaFormSubmit, this.handleChange);
44
44
  } },
45
- h("vega-input", { "data-vega-form": "pageSelectorMobile_goTo", size: "small", showClearIcon: false, style: { width: '54px' }, maskConfig: {
45
+ h("vega-input", { "data-vega-form": "pageSelectorMobile_goTo", size: "small", autocomplete: "on", showClearIcon: false, style: { width: '54px' }, maskConfig: {
46
46
  type: 'number',
47
47
  options: {
48
48
  allowNegative: false,
@@ -92,17 +92,16 @@ export class VegaProgressTracker {
92
92
  */
93
93
  this.canClickStep = true;
94
94
  /**
95
- * When enabled, allows `current` to be set to `-1` to indicate
96
- * no highlighted/current step (e.g. all steps are pending or
97
- * the workflow has not started).
95
+ * When enabled, `current = -1` becomes a valid state that indicates
96
+ * no highlighted/current step (e.g. all steps are pending or the
97
+ * workflow has not started).
98
98
  *
99
- * Defaults to `false` to preserve backward-compatible behavior:
100
- * `current` is clamped to `[0, steps.length - 1]`.
99
+ * Two ways to enter this state:
100
+ * - Set the `current` prop to `-1`.
101
+ * - Call the `setCurrent(-1)` method.
101
102
  *
102
- * When enabled, `current = -1` is a valid state. The `prevStep()`
103
- * method still clamps at `0` — reaching `-1` is only possible
104
- * by explicitly setting `current = -1` via the prop or
105
- * `setCurrent(-1)`.
103
+ * @VegaHint `prevStep()` still clamps at `0` and will not take `current`
104
+ * into `-1`.
106
105
  *
107
106
  * @vegaVersion 2.82.0
108
107
  */
@@ -330,10 +329,13 @@ export class VegaProgressTracker {
330
329
  "optional": false,
331
330
  "docs": {
332
331
  "tags": [{
332
+ "name": "VegaHint",
333
+ "text": "`prevStep()` still clamps at `0` and will not take `current`\ninto `-1`."
334
+ }, {
333
335
  "name": "vegaVersion",
334
336
  "text": "2.82.0"
335
337
  }],
336
- "text": "When enabled, allows `current` to be set to `-1` to indicate\n no highlighted/current step (e.g. all steps are pending or\n the workflow has not started).\n\nDefaults to `false` to preserve backward-compatible behavior:\n `current` is clamped to `[0, steps.length - 1]`.\n\nWhen enabled, `current = -1` is a valid state. The `prevStep()`\n method still clamps at `0` \u2014 reaching `-1` is only possible\n by explicitly setting `current = -1` via the prop or\n `setCurrent(-1)`."
338
+ "text": "When enabled, `current = -1` becomes a valid state that indicates\n no highlighted/current step (e.g. all steps are pending or the\n workflow has not started).\n\nTwo ways to enter this state:\n- Set the `current` prop to `-1`.\n- Call the `setCurrent(-1)` method."
337
339
  },
338
340
  "attribute": "allow-no-current-step",
339
341
  "reflect": false,
@@ -49,12 +49,27 @@ export class VegaRTEExtension {
49
49
  static registerFilterStylesStrategy(blockOrNodeClassName, strategy) {
50
50
  RTEFilterStylesStrategyRegistry.register(blockOrNodeClassName, strategy);
51
51
  }
52
+ /**
53
+ * Lifecycle hook called by the rich text editor before the first render
54
+ * (during `componentWillLoad`). Override this method to perform per-host
55
+ * pre-render setup — for example, registering a host-specific toolbar button
56
+ * renderer via {@link registerToolbarButtonRenderer} so that each editor on
57
+ * the page gets its own isolated renderer instance.
58
+ *
59
+ * The default implementation is a no-op; subclasses may override selectively.
60
+ *
61
+ * @typedef HTMLVegaRichTextEditorElement - The type of the host rich text editor element.
62
+ * @param {HTMLVegaRichTextEditorElement} host - The host rich text editor element that is about to load.
63
+ */
64
+ prepareBeforeLoad(host) {
65
+ methodPlaceholder(host);
66
+ }
52
67
  /**
53
68
  * Initializes the RTE extension with the provided context.
54
69
  *
55
70
  * @param {RTEExtensionContext} context - The context of the RTE extension.
56
71
  */
57
- initialExtension(context) {
72
+ initialExtensionAfterLoad(context) {
58
73
  this.extensionContext = context;
59
74
  rteExtensionContextManager.setExtensionContext(context);
60
75
  }
@@ -103,12 +118,22 @@ export class VegaRTEExtension {
103
118
  }
104
119
  /**
105
120
  * Register a toolbar button renderer for the extension.
121
+ * When a `host` element is provided the renderer is registered in the per-host map
122
+ * (via {@link RTEDTORendererManager#registerRTEToolbarButtonRendererForHost}), giving
123
+ * that host an isolated renderer instance that takes precedence over the global singleton.
124
+ * Omit `host` to fall back to the global registration (backwards-compatible default).
106
125
  *
107
126
  * @param {string} type - The type of the toolbar button.
108
127
  * @param {VegaRTEToolbarButtonRenderer} renderer - The renderer to register.
128
+ * @param {HTMLVegaRichTextEditorElement} [host] - Optional host element for per-host isolation.
109
129
  */
110
- registerToolbarButtonRenderer(type, renderer) {
111
- RTEDTORendererManager.registerRTEToolbarButtonRenderer(type, renderer);
130
+ registerToolbarButtonRenderer(type, renderer, host) {
131
+ if (host) {
132
+ RTEDTORendererManager.registerRTEToolbarButtonRendererForHost(host, type, renderer);
133
+ }
134
+ else {
135
+ RTEDTORendererManager.registerRTEToolbarButtonRenderer(type, renderer);
136
+ }
112
137
  }
113
138
  /**
114
139
  * This is a helper method that utilizes RTEUtils to register common strategies.
@@ -8,6 +8,7 @@ import { RTELanguageToolbarButtonRenderer } from './language-toolbar-button-rend
8
8
  export class VegaRTELanguageExtension extends VegaRTEExtension {
9
9
  constructor(languageList, languagesState) {
10
10
  super();
11
+ this.languageToolbarButtonRenderer = null;
11
12
  this.languageState = {
12
13
  selectedLanguage: '',
13
14
  contentMap: {},
@@ -25,24 +26,39 @@ export class VegaRTELanguageExtension extends VegaRTEExtension {
25
26
  this.languageState.selectedLanguage = selectedLanguage;
26
27
  this.applyLanguageContent(selectedLanguage, this.languageState.contentMap);
27
28
  };
29
+ this.languageList = languageList;
28
30
  if (languagesState) {
29
31
  this.languageState = Object.assign(Object.assign({}, this.languageState), languagesState);
30
32
  }
31
33
  if (!this.languageState.selectedLanguage && languageList.length > 0) {
32
34
  this.languageState.selectedLanguage = languageList[0].key;
33
35
  }
34
- this.languageToolbarButtonRenderer = new RTELanguageToolbarButtonRenderer(languageList, this.languageChangeCallBack, this.languageState.selectedLanguage);
35
- this.registerToolbarButtonRenderer('languages', this.languageToolbarButtonRenderer);
36
+ }
37
+ /**
38
+ * Called by the rich text editor during `componentWillLoad` (before the first render).
39
+ * Creates a fresh {@link RTELanguageToolbarButtonRenderer} instance dedicated to this
40
+ * host element and registers it in the per-host map inside {@link RTEDTORendererManager}.
41
+ * This ensures that each editor on the page has its own isolated renderer — no shared
42
+ * singleton state, no WeakMap indirection.
43
+ *
44
+ * @typedef HTMLVegaRichTextEditorElement - The type of the host rich text editor element.
45
+ * @param {HTMLVegaRichTextEditorElement} host - The host rich text editor element.
46
+ */
47
+ prepareBeforeLoad(host) {
48
+ this.languageToolbarButtonRenderer = new RTELanguageToolbarButtonRenderer(this.languageList, this.languageChangeCallBack, this.languageState.selectedLanguage);
49
+ this.registerToolbarButtonRenderer('languages', this.languageToolbarButtonRenderer, host);
36
50
  }
37
51
  /**
38
52
  * Initializes the language extension.
39
- * Applies the content for the selected language upon initialization.
40
53
  *
41
54
  * @param {RTEExtensionContext} context The extension context.
42
55
  */
43
- initialExtension(context) {
44
- super.initialExtension(context);
56
+ initialExtensionAfterLoad(context) {
57
+ super.initialExtensionAfterLoad(context);
45
58
  const { selectedLanguage, contentMap } = this.languageState;
59
+ if (this.languageToolbarButtonRenderer) {
60
+ this.languageToolbarButtonRenderer.setSelectedLanguage(selectedLanguage);
61
+ }
46
62
  if (contentMap && contentMap[selectedLanguage]) {
47
63
  this.applyLanguageContent(this.languageState.selectedLanguage, this.languageState.contentMap);
48
64
  }
@@ -54,7 +70,9 @@ export class VegaRTELanguageExtension extends VegaRTEExtension {
54
70
  */
55
71
  setState(state) {
56
72
  const { selectedLanguage, contentMap } = state;
57
- this.languageToolbarButtonRenderer.setSelectedLanguage(selectedLanguage);
73
+ if (this.languageToolbarButtonRenderer) {
74
+ this.languageToolbarButtonRenderer.setSelectedLanguage(selectedLanguage);
75
+ }
58
76
  this.languageState.selectedLanguage = selectedLanguage;
59
77
  this.languageState.contentMap = Object.assign({}, contentMap);
60
78
  this.applyLanguageContent(selectedLanguage, contentMap);
@@ -2,30 +2,41 @@ import { methodPlaceholder } from 'vega-slimmer/core';
2
2
  import { VegaRTEToolbarButtonRenderer } from '../base-toolbar-button-renderer';
3
3
  /**
4
4
  * Toolbar button renderer for language selection in Vega Rich Text Editor.
5
+ *
6
+ * Each {@link HTMLVegaRichTextEditorElement} that uses a language extension receives its
7
+ * **own** instance of this renderer, registered in the per-host map inside
8
+ * {@link RTEDTORendererManager} via {@link VegaRTEExtension#prepareBeforeLoad}. Because
9
+ * every editor has a dedicated renderer, all state (label DOM ref, selected language, and
10
+ * the language-change callback) is held in plain instance fields — no WeakMaps or shared
11
+ * singletons are required.
5
12
  */
6
13
  export class RTELanguageToolbarButtonRenderer extends VegaRTEToolbarButtonRenderer {
7
- constructor(languageList, languageChangeCallback, selectedLanguage) {
14
+ constructor(languageList, languageChangeCallback, selectedLanguage = '') {
8
15
  super();
9
16
  this.languageList = [];
10
- this.selectedLanguage = 'Select Language';
17
+ this.languageChangeCallback = null;
18
+ this.selectedLanguage = '';
11
19
  this.labelRef = null;
12
20
  /**
13
21
  * Handles the language selection event.
22
+ * Because each editor has its own renderer instance, the language-change callback
23
+ * is stored directly on this instance — no indirect context lookup is needed.
14
24
  *
15
25
  * @param {string} itemKey - The key of the selected language item.
16
26
  */
17
27
  this.handleDropdownClick = (itemKey) => {
18
28
  this.setSelectedLanguage(itemKey);
19
29
  if (typeof this.languageChangeCallback === 'function') {
20
- this.languageChangeCallback(this.selectedLanguage);
30
+ this.languageChangeCallback(itemKey);
21
31
  }
22
32
  };
23
33
  this.languageList = languageList;
24
- this.selectedLanguage = selectedLanguage;
25
34
  this.languageChangeCallback = languageChangeCallback;
35
+ this.selectedLanguage = selectedLanguage;
26
36
  }
27
37
  /**
28
- * Public method to set the selected language.
38
+ * Updates the selected language and refreshes the button label text in-place,
39
+ * without requiring a full re-render of the toolbar.
29
40
  *
30
41
  * @param {string} language The language key to set as selected.
31
42
  */
@@ -55,7 +66,8 @@ export class RTELanguageToolbarButtonRenderer extends VegaRTEToolbarButtonRender
55
66
  ]);
56
67
  }
57
68
  /**
58
- * Override to render the button label with custom behavior.
69
+ * Override to capture the rendered label element ref so that
70
+ * {@link setSelectedLanguage} can update the button text without a full re-render.
59
71
  *
60
72
  * @inheritDoc
61
73
  */
@@ -65,7 +77,9 @@ export class RTELanguageToolbarButtonRenderer extends VegaRTEToolbarButtonRender
65
77
  variant: 'font-field-label-sm',
66
78
  color: isDisabled ? 'text-disabled' : 'text-primary',
67
79
  // eslint-disable-next-line jsdoc/require-jsdoc
68
- ref: (el) => (this.labelRef = el),
80
+ ref: (el) => {
81
+ this.labelRef = el;
82
+ },
69
83
  }, label);
70
84
  }
71
85
  /* istanbul ignore next */
@@ -84,7 +98,8 @@ export class RTELanguageToolbarButtonRenderer extends VegaRTEToolbarButtonRender
84
98
  * @returns {string} The label of the language, or the key if not found.
85
99
  */
86
100
  getLanguageLabelByKey(key) {
101
+ var _a;
87
102
  const language = this.getListItemByKey(this.languageList, key);
88
- return language.label;
103
+ return (_a = language === null || language === void 0 ? void 0 : language.label) !== null && _a !== void 0 ? _a : 'Select Language';
89
104
  }
90
105
  }
@@ -129,10 +129,10 @@ export class VegaRTETableExtension extends VegaRTEExtension {
129
129
  *
130
130
  * @param {RTEExtensionContext} context - extension context
131
131
  */
132
- initialExtension(context) {
132
+ initialExtensionAfterLoad(context) {
133
133
  this.tableSelection.init(context);
134
134
  const tableExtensionContext = Object.assign(Object.assign({}, context), { tableSelection: this.tableSelection });
135
- super.initialExtension(tableExtensionContext);
135
+ super.initialExtensionAfterLoad(tableExtensionContext);
136
136
  }
137
137
  /**
138
138
  * @inheritDoc
@@ -46,6 +46,19 @@ export class RTEExtensionController extends VegaSlimmer {
46
46
  return this.selectionController.getSelectedNodes();
47
47
  };
48
48
  }
49
+ /**
50
+ * Prepares all registered extensions before the first render.
51
+ * This method is called during `componentWillLoad` so that extensions can perform
52
+ * host-specific setup (e.g. registering per-host toolbar button renderers) before
53
+ * Stencil renders the component for the first time.
54
+ */
55
+ prepareExtensionsBeforeLoad() {
56
+ if (this.extensions && this.host) {
57
+ for (const extension of this.extensions) {
58
+ extension.prepareBeforeLoad(this.host);
59
+ }
60
+ }
61
+ }
49
62
  /**
50
63
  * Initializes the extension context for all registered extensions.
51
64
  * This method is called when the component is connected and whenever the extensions property changes.
@@ -54,7 +67,7 @@ export class RTEExtensionController extends VegaSlimmer {
54
67
  if (this.extensions && this.host) {
55
68
  const extensionContext = this.generateExtensionContext();
56
69
  for (const extension of this.extensions) {
57
- extension.initialExtension(extensionContext);
70
+ extension.initialExtensionAfterLoad(extensionContext);
58
71
  }
59
72
  }
60
73
  }
@@ -81,6 +94,7 @@ export class RTEExtensionController extends VegaSlimmer {
81
94
  }
82
95
  }
83
96
  if (!isArrayEqual(newValue, oldValue, false, (a, b) => a === b ? 0 : 1)) {
97
+ this.prepareExtensionsBeforeLoad();
84
98
  this.initialExtensionContext();
85
99
  }
86
100
  }
@@ -115,6 +129,9 @@ __decorate([
115
129
  __decorate([
116
130
  MapToComponentField()
117
131
  ], RTEExtensionController.prototype, "selectionController", void 0);
132
+ __decorate([
133
+ MapToComponentMethod('componentWillLoad')
134
+ ], RTEExtensionController.prototype, "prepareExtensionsBeforeLoad", null);
118
135
  __decorate([
119
136
  MapToComponentMethod('componentDidLoad')
120
137
  ], RTEExtensionController.prototype, "initialExtensionContext", null);
@@ -70,7 +70,7 @@ export class ToolbarRenderer extends VegaSlimmer {
70
70
  const groupElement = group
71
71
  .map((item) => {
72
72
  const presetRenderer = this.getToolbarBtnRenderer(item);
73
- const customRenderer = RTEDTORendererManager.getRTEToolbarButtonRenderer(item);
73
+ const customRenderer = RTEDTORendererManager.getRTEToolbarButtonRenderer(item, this.host);
74
74
  if (presetRenderer) {
75
75
  if (!presetRenderer.isHidden()) {
76
76
  totalVisibleCount++;
@@ -14,7 +14,6 @@ import { VisualModeToolbarButtonSlimmer } from './visual-mode-toolbar-button-sli
14
14
  import { ModifyContentActionType } from '../../../dto/actions/modify-content-action.abstract';
15
15
  import { DomNodeSubjectObserverFactory } from '../../../../../helpers/change-manager/subject/dom-node-subject/dom-node-subject-observer-factory';
16
16
  import { VegaClick, VegaDropdownClick } from '../../../../../helpers/event-manager/event-id/vega-event-id';
17
- import { tryGetDocument } from '../../../../../utils/try-get-document';
18
17
  export class ImageToolbarButtonSlimmer extends VisualModeToolbarButtonSlimmer {
19
18
  constructor() {
20
19
  super({
@@ -27,7 +26,6 @@ export class ImageToolbarButtonSlimmer extends VisualModeToolbarButtonSlimmer {
27
26
  await this.insertURLModalRef.modal('hide');
28
27
  };
29
28
  this.handleDropdownItemClick = async (payload) => {
30
- const safeDocument = tryGetDocument();
31
29
  switch (payload.detail) {
32
30
  case 'upload':
33
31
  this.uploadInputRef.click();
@@ -36,7 +34,8 @@ export class ImageToolbarButtonSlimmer extends VisualModeToolbarButtonSlimmer {
36
34
  this.currentRange = this.selectionController.getCurrentRange();
37
35
  this.currentSelectedNodes = this.selectionController.getSelectedNodes();
38
36
  this.currentSelectedBlocks = this.selectionController.getSelectedBlocks();
39
- safeDocument && safeDocument.body.append(this.insertURLModalRef);
37
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
38
+ this.host.parentElement.append(this.insertURLModalRef);
40
39
  this.insertURLInputRef.value = '';
41
40
  await this.insertURLModalRef.modal('show');
42
41
  await this.insertURLInputRef.doFocus();
@@ -167,6 +166,9 @@ ImageToolbarButtonSlimmer.items = [
167
166
  label: 'Insert via URL',
168
167
  },
169
168
  ];
169
+ __decorate([
170
+ MapToComponentField()
171
+ ], ImageToolbarButtonSlimmer.prototype, "host", void 0);
170
172
  __decorate([
171
173
  MapToComponentField()
172
174
  ], ImageToolbarButtonSlimmer.prototype, "insertImageController", void 0);
@@ -23,8 +23,9 @@ export class TextStylesToolbarButtonSlimmer extends VisualModeToolbarButtonSlimm
23
23
  tooltip: { text: 'Text Styles' },
24
24
  });
25
25
  this.handleDropdownItemClick = (payload) => {
26
+ var _a, _b;
26
27
  const selectedType = payload.detail;
27
- const boldByDefault = TextStylesToolbarButtonSlimmer.items.find((item) => item.key === selectedType).bold;
28
+ const boldByDefault = (_b = (_a = TextStylesToolbarButtonSlimmer.allItems.find((item) => item.key === selectedType)) === null || _a === void 0 ? void 0 : _a.bold) !== null && _b !== void 0 ? _b : false;
28
29
  const selectedTextBlocks = this.selectionController
29
30
  .getSelectedBlocks()
30
31
  .filter((block) => block instanceof RTETextBlock);
@@ -53,7 +54,8 @@ export class TextStylesToolbarButtonSlimmer extends VisualModeToolbarButtonSlimm
53
54
  h("div", Object.assign({ slot: "items" }, super.preventLostFocus()), this.renderDropdownContent())));
54
55
  }
55
56
  renderDropdownContent() {
56
- return (h(Fragment, null, TextStylesToolbarButtonSlimmer.items.map((item) => {
57
+ const visibleItems = TextStylesToolbarButtonSlimmer.allItems.filter((item) => this.textStyleItems.some((config) => config.key === item.key));
58
+ return (h(Fragment, null, visibleItems.map((item) => {
57
59
  const textStyleAnnotation = new TextStyleAnnotation(item.key);
58
60
  const boldAnnotation = new BoldAnnotation(item.bold);
59
61
  return (h("vega-dropdown-item", { key: item.key, itemKey: item.key },
@@ -91,7 +93,7 @@ export class TextStylesToolbarButtonSlimmer extends VisualModeToolbarButtonSlimm
91
93
  'text-size': textSize,
92
94
  });
93
95
  })();
94
- TextStylesToolbarButtonSlimmer.items = [
96
+ TextStylesToolbarButtonSlimmer.allItems = [
95
97
  {
96
98
  key: 'title',
97
99
  label: 'Title',
@@ -127,3 +129,6 @@ __decorate([
127
129
  __decorate([
128
130
  MapToComponentField()
129
131
  ], TextStylesToolbarButtonSlimmer.prototype, "focusController", void 0);
132
+ __decorate([
133
+ MapToComponentField()
134
+ ], TextStylesToolbarButtonSlimmer.prototype, "textStyleItems", void 0);
@@ -204,6 +204,26 @@ export class VegaRichTextEditor {
204
204
  * @vegaVersion 2.34.0
205
205
  */
206
206
  this.validationRules = [];
207
+ /**
208
+ * Specifies which text style items appear in the Text Styles toolbar dropdown.
209
+ *
210
+ * Use this to control which heading levels and text styles are available to users.
211
+ * For example, omit `{ key: 'heading-1' }` to prevent users from applying H1
212
+ * (which is typically reserved for the page title).
213
+ *
214
+ * Items are displayed in a fixed internal order regardless of the order in this array.
215
+ *
216
+ * @vegaVersion 2.83.0
217
+ * @defaultValue [{ key: 'title' }, { key: 'subtitle' }, { key: 'heading-1' }, { key: 'heading-2' }, { key: 'heading-3' }, { key: 'paragraph' }]
218
+ */
219
+ this.textStyleItems = [
220
+ { key: 'title' },
221
+ { key: 'subtitle' },
222
+ { key: 'heading-1' },
223
+ { key: 'heading-2' },
224
+ { key: 'heading-3' },
225
+ { key: 'paragraph' },
226
+ ];
207
227
  /**
208
228
  * Specifies the configuration for the rich text editor extensions.
209
229
  *
@@ -532,6 +552,33 @@ export class VegaRichTextEditor {
532
552
  },
533
553
  "defaultValue": "[]"
534
554
  },
555
+ "textStyleItems": {
556
+ "type": "unknown",
557
+ "mutable": false,
558
+ "complexType": {
559
+ "original": "VegaRTETextStyleItem[]",
560
+ "resolved": "VegaRTETextStyleItem[]",
561
+ "references": {
562
+ "VegaRTETextStyleItem": {
563
+ "location": "import",
564
+ "path": "./interface"
565
+ }
566
+ }
567
+ },
568
+ "required": false,
569
+ "optional": false,
570
+ "docs": {
571
+ "tags": [{
572
+ "name": "vegaVersion",
573
+ "text": "2.83.0"
574
+ }, {
575
+ "name": "defaultValue",
576
+ "text": "[{ key: 'title' }, { key: 'subtitle' }, { key: 'heading-1' }, { key: 'heading-2' }, { key: 'heading-3' }, { key: 'paragraph' }]"
577
+ }],
578
+ "text": "Specifies which text style items appear in the Text Styles toolbar dropdown.\n\nUse this to control which heading levels and text styles are available to users.\nFor example, omit `{ key: 'heading-1' }` to prevent users from applying H1\n(which is typically reserved for the page title).\n\nItems are displayed in a fixed internal order regardless of the order in this array."
579
+ },
580
+ "defaultValue": "[\n\t\t{ key: 'title' },\n\t\t{ key: 'subtitle' },\n\t\t{ key: 'heading-1' },\n\t\t{ key: 'heading-2' },\n\t\t{ key: 'heading-3' },\n\t\t{ key: 'paragraph' },\n\t]"
581
+ },
535
582
  "extensions": {
536
583
  "type": "unknown",
537
584
  "mutable": false,