@antv/infographic 0.2.17 → 0.2.19

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 (97) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/infographic.min.js +110 -110
  4. package/dist/infographic.min.js.map +1 -1
  5. package/esm/constants/service.d.ts +1 -1
  6. package/esm/constants/service.js +1 -1
  7. package/esm/designs/structures/chart-line.js +5 -3
  8. package/esm/editor/interactions/dblclick-edit-text.js +3 -3
  9. package/esm/editor/managers/interaction.js +6 -4
  10. package/esm/editor/plugins/components/button.d.ts +2 -1
  11. package/esm/editor/plugins/components/button.js +4 -4
  12. package/esm/editor/plugins/components/color-picker.d.ts +1 -0
  13. package/esm/editor/plugins/components/color-picker.js +3 -3
  14. package/esm/editor/plugins/components/popover.d.ts +3 -1
  15. package/esm/editor/plugins/components/popover.js +29 -9
  16. package/esm/editor/plugins/edit-bar/edit-bar.d.ts +3 -1
  17. package/esm/editor/plugins/edit-bar/edit-bar.js +17 -7
  18. package/esm/editor/plugins/edit-bar/edit-items/align-elements.js +6 -4
  19. package/esm/editor/plugins/edit-bar/edit-items/font-align.js +8 -5
  20. package/esm/editor/plugins/edit-bar/edit-items/font-color.js +7 -4
  21. package/esm/editor/plugins/edit-bar/edit-items/font-family.js +11 -9
  22. package/esm/editor/plugins/edit-bar/edit-items/font-size.js +8 -5
  23. package/esm/editor/plugins/edit-bar/edit-items/icon-color.js +7 -4
  24. package/esm/editor/plugins/edit-bar/edit-items/types.d.ts +5 -1
  25. package/esm/editor/plugins/reset-viewbox.d.ts +4 -1
  26. package/esm/editor/plugins/reset-viewbox.js +12 -6
  27. package/esm/editor/utils/index.d.ts +1 -0
  28. package/esm/editor/utils/index.js +1 -0
  29. package/esm/editor/utils/root.d.ts +3 -0
  30. package/esm/editor/utils/root.js +18 -0
  31. package/esm/exporter/svg.js +192 -52
  32. package/esm/resource/loaders/search.js +0 -3
  33. package/esm/templates/utils.js +11 -6
  34. package/esm/utils/padding.js +1 -1
  35. package/esm/utils/style.d.ts +3 -1
  36. package/esm/utils/style.js +27 -4
  37. package/esm/version.d.ts +1 -1
  38. package/esm/version.js +1 -1
  39. package/lib/constants/service.d.ts +1 -1
  40. package/lib/constants/service.js +1 -1
  41. package/lib/designs/structures/chart-line.js +5 -3
  42. package/lib/editor/interactions/dblclick-edit-text.js +3 -3
  43. package/lib/editor/managers/interaction.js +7 -5
  44. package/lib/editor/plugins/components/button.d.ts +2 -1
  45. package/lib/editor/plugins/components/button.js +4 -4
  46. package/lib/editor/plugins/components/color-picker.d.ts +1 -0
  47. package/lib/editor/plugins/components/color-picker.js +3 -3
  48. package/lib/editor/plugins/components/popover.d.ts +3 -1
  49. package/lib/editor/plugins/components/popover.js +32 -12
  50. package/lib/editor/plugins/edit-bar/edit-bar.d.ts +3 -1
  51. package/lib/editor/plugins/edit-bar/edit-bar.js +17 -7
  52. package/lib/editor/plugins/edit-bar/edit-items/align-elements.js +6 -4
  53. package/lib/editor/plugins/edit-bar/edit-items/font-align.js +8 -5
  54. package/lib/editor/plugins/edit-bar/edit-items/font-color.js +7 -4
  55. package/lib/editor/plugins/edit-bar/edit-items/font-family.js +11 -9
  56. package/lib/editor/plugins/edit-bar/edit-items/font-size.js +8 -5
  57. package/lib/editor/plugins/edit-bar/edit-items/icon-color.js +7 -4
  58. package/lib/editor/plugins/edit-bar/edit-items/types.d.ts +5 -1
  59. package/lib/editor/plugins/reset-viewbox.d.ts +4 -1
  60. package/lib/editor/plugins/reset-viewbox.js +12 -6
  61. package/lib/editor/utils/index.d.ts +1 -0
  62. package/lib/editor/utils/index.js +1 -0
  63. package/lib/editor/utils/root.d.ts +3 -0
  64. package/lib/editor/utils/root.js +22 -0
  65. package/lib/exporter/svg.js +192 -52
  66. package/lib/resource/loaders/search.js +0 -3
  67. package/lib/templates/utils.js +11 -6
  68. package/lib/utils/padding.js +1 -1
  69. package/lib/utils/style.d.ts +3 -1
  70. package/lib/utils/style.js +27 -4
  71. package/lib/version.d.ts +1 -1
  72. package/lib/version.js +1 -1
  73. package/package.json +1 -1
  74. package/src/constants/service.ts +1 -1
  75. package/src/designs/structures/chart-line.tsx +5 -3
  76. package/src/editor/interactions/dblclick-edit-text.ts +3 -2
  77. package/src/editor/managers/interaction.ts +9 -7
  78. package/src/editor/plugins/components/button.ts +5 -2
  79. package/src/editor/plugins/components/color-picker.ts +4 -2
  80. package/src/editor/plugins/components/popover.ts +31 -12
  81. package/src/editor/plugins/edit-bar/edit-bar.ts +26 -11
  82. package/src/editor/plugins/edit-bar/edit-items/align-elements.ts +7 -2
  83. package/src/editor/plugins/edit-bar/edit-items/font-align.ts +8 -3
  84. package/src/editor/plugins/edit-bar/edit-items/font-color.ts +7 -2
  85. package/src/editor/plugins/edit-bar/edit-items/font-family.ts +11 -7
  86. package/src/editor/plugins/edit-bar/edit-items/font-size.ts +8 -3
  87. package/src/editor/plugins/edit-bar/edit-items/icon-color.ts +7 -2
  88. package/src/editor/plugins/edit-bar/edit-items/types.ts +6 -1
  89. package/src/editor/plugins/reset-viewbox.ts +17 -8
  90. package/src/editor/utils/index.ts +1 -0
  91. package/src/editor/utils/root.ts +26 -0
  92. package/src/exporter/svg.ts +267 -62
  93. package/src/resource/loaders/search.ts +0 -3
  94. package/src/templates/utils.ts +30 -6
  95. package/src/utils/padding.ts +1 -1
  96. package/src/utils/style.ts +31 -4
  97. package/src/version.ts +1 -1
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IconButton = void 0;
4
4
  const utils_1 = require("../../../utils");
5
- const IconButton = ({ icon, onClick, activate = false, }) => {
6
- ensureIconButtonStyle();
5
+ const IconButton = ({ icon, onClick, activate = false, root, }) => {
6
+ ensureIconButtonStyle(root);
7
7
  const button = document.createElement('button');
8
8
  button.type = 'button';
9
9
  button.classList.add(ICON_BUTTON_CLASS);
@@ -27,7 +27,7 @@ const IconButton = ({ icon, onClick, activate = false, }) => {
27
27
  exports.IconButton = IconButton;
28
28
  const ICON_BUTTON_CLASS = 'infographic-edit-bar-icon-btn';
29
29
  const ICON_BUTTON_STYLE_ID = 'infographic-edit-bar-icon-btn-style';
30
- function ensureIconButtonStyle() {
30
+ function ensureIconButtonStyle(target) {
31
31
  (0, utils_1.injectStyleOnce)(ICON_BUTTON_STYLE_ID, `
32
32
  .${ICON_BUTTON_CLASS} {
33
33
  padding: 0;
@@ -53,5 +53,5 @@ function ensureIconButtonStyle() {
53
53
  .${ICON_BUTTON_CLASS}[data-activate="true"] {
54
54
  background-color: #d9d9d9;
55
55
  }
56
- `);
56
+ `, target);
57
57
  }
@@ -2,6 +2,7 @@ export type ColorPickerProps = {
2
2
  value?: string;
3
3
  swatches?: string[];
4
4
  onChange?: (value: string) => void;
5
+ root?: Node;
5
6
  };
6
7
  export type ColorPickerHandle = {
7
8
  setValue: (value?: string) => void;
@@ -49,7 +49,7 @@ function ColorPicker(props) {
49
49
  if (typeof document === 'undefined') {
50
50
  throw new Error('ColorPicker can only be used in the browser.');
51
51
  }
52
- ensureColorPickerStyles();
52
+ ensureColorPickerStyles(props.root);
53
53
  const container = document.createElement('div');
54
54
  container.classList.add(COLOR_PICKER_CLASS);
55
55
  const swatchContainer = document.createElement('div');
@@ -242,7 +242,7 @@ function createSwitchLabel(text) {
242
242
  span.classList.add(COLOR_PICKER_SWITCH_LABEL_CLASS);
243
243
  return span;
244
244
  }
245
- function ensureColorPickerStyles() {
245
+ function ensureColorPickerStyles(target) {
246
246
  (0, utils_1.injectStyleOnce)(COLOR_PICKER_STYLE_ID, `
247
247
  .${COLOR_PICKER_CLASS} {
248
248
  width: 240px;
@@ -353,5 +353,5 @@ function ensureColorPickerStyles() {
353
353
  .${COLOR_PICKER_SWITCH_CLASS}[data-format="rgba"] .${COLOR_PICKER_SWITCH_LABEL_CLASS}:last-child {
354
354
  color: #ffffff;
355
355
  }
356
- `);
356
+ `, target);
357
357
  }
@@ -3,7 +3,7 @@ export type PopoverPlacementPreference = PopoverPlacement | PopoverPlacement[];
3
3
  export interface PopoverProps {
4
4
  content: HTMLElement | string | (() => HTMLElement | string);
5
5
  target?: HTMLElement;
6
- getContainer?: HTMLElement | (() => HTMLElement);
6
+ getContainer?: OverlayRoot | (() => OverlayRoot);
7
7
  placement?: PopoverPlacementPreference;
8
8
  padding?: number | string;
9
9
  open?: boolean;
@@ -13,6 +13,7 @@ export interface PopoverProps {
13
13
  mouseLeaveDelay?: number;
14
14
  offset?: number;
15
15
  }
16
+ type OverlayRoot = HTMLElement | ShadowRoot;
16
17
  export interface PopoverHandle {
17
18
  setOpen: (open: boolean) => void;
18
19
  toggle: () => void;
@@ -21,3 +22,4 @@ export interface PopoverHandle {
21
22
  destroy: () => void;
22
23
  }
23
24
  export declare function Popover(props: PopoverProps): HTMLDivElement & PopoverHandle;
25
+ export {};
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Popover = Popover;
4
+ const utils_1 = require("../../utils");
4
5
  const constants_1 = require("../../../constants");
5
- const utils_1 = require("../../../utils");
6
+ const utils_2 = require("../../../utils");
6
7
  const POPOVER_CLASS = 'infographic-edit-popover';
7
8
  const POPOVER_CONTENT_CLASS = `${POPOVER_CLASS}__content`;
8
9
  const POPOVER_ARROW_CLASS = `${POPOVER_CLASS}__arrow`;
9
10
  const POPOVER_STYLE_ID = 'infographic-edit-popover-style';
10
11
  function Popover(props) {
11
12
  var _a, _b, _c, _d, _e, _f, _g, _h;
12
- ensurePopoverStyle();
13
13
  const placement = (_a = props.placement) !== null && _a !== void 0 ? _a : 'top';
14
14
  const closeOnOutsideClick = (_b = props.closeOnOutsideClick) !== null && _b !== void 0 ? _b : true;
15
15
  const triggerActions = Array.isArray(props.trigger)
@@ -31,11 +31,11 @@ function Popover(props) {
31
31
  const next = typeof props.getContainer === 'function'
32
32
  ? props.getContainer()
33
33
  : props.getContainer;
34
- return next !== null && next !== void 0 ? next : document.body;
34
+ return next !== null && next !== void 0 ? next : (0, utils_1.getOverlayContainer)(trigger);
35
35
  };
36
36
  const content = document.createElement('div');
37
37
  content.classList.add(POPOVER_CONTENT_CLASS);
38
- (0, utils_1.setElementRole)(content, constants_1.COMPONENT_ROLE);
38
+ (0, utils_2.setElementRole)(content, constants_1.COMPONENT_ROLE);
39
39
  content.dataset.placement = Array.isArray(placement)
40
40
  ? placement[0]
41
41
  : placement;
@@ -44,7 +44,18 @@ function Popover(props) {
44
44
  content.style.setProperty('--popover-arrow-size', `${arrowSize}px`);
45
45
  content.style.setProperty('--popover-arrow-inner-size', `${arrowInnerSize}px`);
46
46
  const contentContainer = getContentContainer();
47
+ ensurePopoverStyle(contentContainer);
47
48
  const isPortal = contentContainer !== container;
49
+ const getPortalOffsetParent = () => {
50
+ const offsetParent = content.offsetParent;
51
+ if (offsetParent)
52
+ return offsetParent;
53
+ if (contentContainer instanceof ShadowRoot)
54
+ return contentContainer.host;
55
+ if (contentContainer instanceof HTMLElement)
56
+ return contentContainer;
57
+ return document.documentElement;
58
+ };
48
59
  const arrow = document.createElement('div');
49
60
  arrow.classList.add(POPOVER_ARROW_CLASS);
50
61
  content.appendChild(arrow);
@@ -122,8 +133,17 @@ function Popover(props) {
122
133
  if (!isPortal)
123
134
  return;
124
135
  ({ left, top } = position);
125
- content.style.left = `${left}px`;
126
- content.style.top = `${top}px`;
136
+ const offsetParent = getPortalOffsetParent();
137
+ if (offsetParent === document.body ||
138
+ offsetParent === document.documentElement) {
139
+ content.style.left = `${left}px`;
140
+ content.style.top = `${top}px`;
141
+ }
142
+ else {
143
+ const parentRect = offsetParent.getBoundingClientRect();
144
+ content.style.left = `${left - parentRect.left + offsetParent.scrollLeft}px`;
145
+ content.style.top = `${top - parentRect.top + offsetParent.scrollTop}px`;
146
+ }
127
147
  content.style.right = 'auto';
128
148
  content.style.bottom = 'auto';
129
149
  content.style.transform = 'translate(0, 0)';
@@ -167,9 +187,9 @@ function Popover(props) {
167
187
  };
168
188
  const toggle = () => setOpen(!open);
169
189
  const handleOutsideClick = (event) => {
170
- const targetNode = event.target;
171
- if (!container.contains(targetNode) &&
172
- (isPortal ? !content.contains(targetNode) : true)) {
190
+ const insideTrigger = (0, utils_1.eventPathContains)(event, container);
191
+ const insideContent = (0, utils_1.eventPathContains)(event, content);
192
+ if (!insideTrigger && !insideContent) {
173
193
  setOpen(false);
174
194
  }
175
195
  };
@@ -237,8 +257,8 @@ function Popover(props) {
237
257
  };
238
258
  return Object.assign(container, api);
239
259
  }
240
- function ensurePopoverStyle() {
241
- (0, utils_1.injectStyleOnce)(POPOVER_STYLE_ID, `
260
+ function ensurePopoverStyle(target) {
261
+ (0, utils_2.injectStyleOnce)(POPOVER_STYLE_ID, `
242
262
  .${POPOVER_CLASS} {
243
263
  position: relative;
244
264
  display: inline-flex;
@@ -380,5 +400,5 @@ function ensurePopoverStyle() {
380
400
  .${POPOVER_CONTENT_CLASS}[data-placement="right"][data-open="true"] {
381
401
  transform: translate(0, -50%);
382
402
  }
383
- `);
403
+ `, target);
384
404
  }
@@ -4,8 +4,9 @@ import { Plugin } from '../base';
4
4
  export interface EditBarOptions {
5
5
  style?: Partial<CSSStyleDeclaration>;
6
6
  className?: string;
7
- getContainer?: HTMLElement | (() => HTMLElement);
7
+ getContainer?: OverlayRoot | (() => OverlayRoot);
8
8
  }
9
+ type OverlayRoot = HTMLElement | ShadowRoot;
9
10
  type EditItem = HTMLElement;
10
11
  export declare class EditBar extends Plugin implements IPlugin {
11
12
  private options?;
@@ -27,6 +28,7 @@ export declare class EditBar extends Plugin implements IPlugin {
27
28
  protected getGeometryEditItems(_selection: Selection): EditItem[];
28
29
  protected getGeometryCollectionEditItems(selection: Selection): EditItem[];
29
30
  protected getElementCollectionEditItems(selection: Selection): EditItem[];
31
+ private resolveOverlayRoot;
30
32
  private placeEditBar;
31
33
  }
32
34
  export {};
@@ -4,6 +4,7 @@ exports.EditBar = void 0;
4
4
  const constants_1 = require("../../../constants");
5
5
  const jsx_1 = require("../../../jsx");
6
6
  const utils_1 = require("../../../utils");
7
+ const utils_2 = require("../../utils");
7
8
  const base_1 = require("../base");
8
9
  const edit_items_1 = require("./edit-items");
9
10
  class EditBar extends base_1.Plugin {
@@ -112,29 +113,31 @@ class EditBar extends base_1.Plugin {
112
113
  }
113
114
  (0, utils_1.setElementRole)(container, constants_1.COMPONENT_ROLE);
114
115
  this.container = container;
115
- const { getContainer } = this.options || {};
116
- const resolvedContainer = typeof getContainer === 'function' ? getContainer() : getContainer;
117
- const containerParent = resolvedContainer !== null && resolvedContainer !== void 0 ? resolvedContainer : document.body;
116
+ const containerParent = this.resolveOverlayRoot();
118
117
  containerParent === null || containerParent === void 0 ? void 0 : containerParent.appendChild(container);
119
118
  return container;
120
119
  }
121
120
  getTextEditItems(text) {
122
121
  const { attributes = {} } = (0, utils_1.getTextElementProps)(text);
123
- return [edit_items_1.FontColor, edit_items_1.FontSize, edit_items_1.FontAlign, edit_items_1.FontFamily].map((item) => item([text], attributes, this.commander));
122
+ const root = this.resolveOverlayRoot();
123
+ return [edit_items_1.FontColor, edit_items_1.FontSize, edit_items_1.FontAlign, edit_items_1.FontFamily].map((item) => item([text], attributes, this.commander, { root }));
124
124
  }
125
125
  getTextCollectionEditItems(selection) {
126
126
  const attrs = (0, utils_1.getCommonAttrs)(selection.map((text) => (0, utils_1.getTextElementProps)(text).attributes || {}));
127
- const items = [edit_items_1.FontColor, edit_items_1.FontSize, edit_items_1.FontAlign, edit_items_1.FontFamily].map((item) => item(selection, attrs, this.commander));
127
+ const root = this.resolveOverlayRoot();
128
+ const items = [edit_items_1.FontColor, edit_items_1.FontSize, edit_items_1.FontAlign, edit_items_1.FontFamily].map((item) => item(selection, attrs, this.commander, { root }));
128
129
  const commonItems = this.getElementCollectionEditItems(selection);
129
130
  return [...items, ...commonItems];
130
131
  }
131
132
  getIconEditItems(selection) {
132
133
  const attrs = (0, utils_1.getIconAttrs)(selection[0]);
133
- return [edit_items_1.IconColor].map((item) => item(selection, attrs, this.commander));
134
+ const root = this.resolveOverlayRoot();
135
+ return [edit_items_1.IconColor].map((item) => item(selection, attrs, this.commander, { root }));
134
136
  }
135
137
  getIconCollectionEditItems(selection) {
136
138
  const attrs = (0, utils_1.getCommonAttrs)(selection.map((icon) => (0, utils_1.getIconAttrs)(icon)));
137
- return [edit_items_1.IconColor].map((item) => item(selection, attrs, this.commander));
139
+ const root = this.resolveOverlayRoot();
140
+ return [edit_items_1.IconColor].map((item) => item(selection, attrs, this.commander, { root }));
138
141
  }
139
142
  getGeometryEditItems(_selection) {
140
143
  return [];
@@ -146,12 +149,19 @@ class EditBar extends base_1.Plugin {
146
149
  getElementCollectionEditItems(selection) {
147
150
  if (selection.length <= 1)
148
151
  return [];
152
+ const root = this.resolveOverlayRoot();
149
153
  return [
150
154
  (0, edit_items_1.ElementAlign)(selection, {}, this.commander, {
151
155
  enableDistribution: selection.length > 2,
156
+ root,
152
157
  }),
153
158
  ];
154
159
  }
160
+ resolveOverlayRoot() {
161
+ const { getContainer } = this.options || {};
162
+ const resolvedContainer = typeof getContainer === 'function' ? getContainer() : getContainer;
163
+ return resolvedContainer !== null && resolvedContainer !== void 0 ? resolvedContainer : (0, utils_2.getOverlayContainer)(this.editor.getDocument());
164
+ }
155
165
  placeEditBar(container, selection) {
156
166
  var _a;
157
167
  if (selection.length === 0)
@@ -32,18 +32,19 @@ const ALIGN_OPTIONS = [
32
32
  ];
33
33
  const ElementAlign = (selection, _attrs, commander, options) => {
34
34
  var _a;
35
- (0, utils_1.injectStyleOnce)(GRID_STYLE_ID, GRID_STYLES);
35
+ (0, utils_1.injectStyleOnce)(GRID_STYLE_ID, GRID_STYLES, options === null || options === void 0 ? void 0 : options.root);
36
36
  const enableDistribution = (_a = options === null || options === void 0 ? void 0 : options.enableDistribution) !== null && _a !== void 0 ? _a : true;
37
- const content = createAlignContent((action) => alignSelection(selection, action, commander), enableDistribution);
37
+ const content = createAlignContent((action) => alignSelection(selection, action, commander), enableDistribution, options === null || options === void 0 ? void 0 : options.root);
38
38
  return (0, components_1.Popover)({
39
- target: (0, components_1.IconButton)({ icon: components_1.ELEMENT_ICONS.align }),
39
+ target: (0, components_1.IconButton)({ icon: components_1.ELEMENT_ICONS.align, root: options === null || options === void 0 ? void 0 : options.root }),
40
40
  content,
41
+ getContainer: options === null || options === void 0 ? void 0 : options.root,
41
42
  placement: 'top',
42
43
  offset: 12,
43
44
  });
44
45
  };
45
46
  exports.ElementAlign = ElementAlign;
46
- function createAlignContent(onSelect, enableDistribution) {
47
+ function createAlignContent(onSelect, enableDistribution, root) {
47
48
  const content = document.createElement('div');
48
49
  content.classList.add(GRID_CLASS);
49
50
  if (!enableDistribution)
@@ -53,6 +54,7 @@ function createAlignContent(onSelect, enableDistribution) {
53
54
  : ALIGN_OPTIONS.filter(({ action }) => action !== 'H_DISTRIBUTE' && action !== 'V_DISTRIBUTE');
54
55
  visibleOptions.forEach(({ icon, action }) => {
55
56
  const button = (0, components_1.IconButton)({
57
+ root,
56
58
  icon,
57
59
  onClick: () => onSelect(action),
58
60
  });
@@ -25,13 +25,14 @@ const GRID_STYLES = `
25
25
  gap: 2px;
26
26
  }
27
27
  `;
28
- const FontAlign = (selection, attrs, commander) => {
29
- (0, utils_1.injectStyleOnce)(GRID_STYLE_ID, GRID_STYLES);
28
+ const FontAlign = (selection, attrs, commander, options) => {
29
+ const root = options === null || options === void 0 ? void 0 : options.root;
30
+ (0, utils_1.injectStyleOnce)(GRID_STYLE_ID, GRID_STYLES, root);
30
31
  const state = {
31
32
  horizontal: attrs['data-horizontal-align'],
32
33
  vertical: attrs['data-vertical-align'],
33
34
  };
34
- const button = (0, components_1.IconButton)({ icon: components_1.TEXT_ICONS.align });
35
+ const button = (0, components_1.IconButton)({ icon: components_1.TEXT_ICONS.align, root });
35
36
  const content = createAlignContent(state, (align) => {
36
37
  const attributes = {};
37
38
  if (align.horizontal)
@@ -43,16 +44,17 @@ const FontAlign = (selection, attrs, commander) => {
43
44
  commander.executeBatch(selection.map((text) => new commands_1.UpdateElementCommand(text, {
44
45
  attributes,
45
46
  })));
46
- });
47
+ }, root);
47
48
  return (0, components_1.Popover)({
48
49
  target: button,
49
50
  content,
51
+ getContainer: root,
50
52
  placement: 'top',
51
53
  offset: 12,
52
54
  });
53
55
  };
54
56
  exports.FontAlign = FontAlign;
55
- function createAlignContent(state, onAlignChange) {
57
+ function createAlignContent(state, onAlignChange, root) {
56
58
  const content = document.createElement('div');
57
59
  content.classList.add(GRID_CLASS);
58
60
  const buttons = {};
@@ -65,6 +67,7 @@ function createAlignContent(state, onAlignChange) {
65
67
  const createButtons = (options, stateKey) => {
66
68
  options.forEach(({ icon, align }) => {
67
69
  const button = (0, components_1.IconButton)({
70
+ root,
68
71
  icon,
69
72
  onClick: () => {
70
73
  if (state[stateKey] === align)
@@ -7,8 +7,9 @@ const components_1 = require("../../components");
7
7
  const FONT_COLOR_BUTTON_CLASS = 'infographic-font-color-btn';
8
8
  const FONT_COLOR_STYLE_ID = 'infographic-font-color-style';
9
9
  const DEFAULT_COLOR = '#1f1f1f';
10
- const FontColor = (selection, attrs, commander) => {
11
- ensureFontColorStyles();
10
+ const FontColor = (selection, attrs, commander, options) => {
11
+ const root = options === null || options === void 0 ? void 0 : options.root;
12
+ ensureFontColorStyles(root);
12
13
  const color = normalizeColor(attrs.fill);
13
14
  const isMixed = attrs.fill === undefined && selection.length > 1;
14
15
  const button = document.createElement('button');
@@ -16,6 +17,7 @@ const FontColor = (selection, attrs, commander) => {
16
17
  button.classList.add(FONT_COLOR_BUTTON_CLASS);
17
18
  setButtonColor(button, color !== null && color !== void 0 ? color : DEFAULT_COLOR, isMixed);
18
19
  const picker = (0, components_1.ColorPicker)({
20
+ root,
19
21
  value: color !== null && color !== void 0 ? color : DEFAULT_COLOR,
20
22
  onChange: (nextColor) => {
21
23
  setButtonColor(button, nextColor, false);
@@ -27,6 +29,7 @@ const FontColor = (selection, attrs, commander) => {
27
29
  return (0, components_1.Popover)({
28
30
  target: button,
29
31
  content: picker,
32
+ getContainer: root,
30
33
  placement: ['top', 'bottom'],
31
34
  offset: 12,
32
35
  trigger: 'hover',
@@ -48,7 +51,7 @@ function setButtonColor(button, color, mixed) {
48
51
  else
49
52
  button.removeAttribute('data-mixed');
50
53
  }
51
- function ensureFontColorStyles() {
54
+ function ensureFontColorStyles(target) {
52
55
  (0, utils_1.injectStyleOnce)(FONT_COLOR_STYLE_ID, `
53
56
  .${FONT_COLOR_BUTTON_CLASS} {
54
57
  position: relative;
@@ -77,5 +80,5 @@ function ensureFontColorStyles() {
77
80
  #f5f5f5 12px
78
81
  );
79
82
  }
80
- `);
83
+ `, target);
81
84
  }
@@ -9,22 +9,23 @@ const FONT_LIST_CLASS = 'infographic-font-family-list';
9
9
  const FONT_OPTION_CLASS = `${FONT_LIST_CLASS}__option`;
10
10
  const FONT_LIST_STYLE_ID = 'infographic-font-family-list-style';
11
11
  const DEFAULT_FONT_LABEL = '默认';
12
- const FontFamily = (selection, attrs, commander) => {
13
- ensureFontFamilyListStyle();
12
+ const FontFamily = (selection, attrs, commander, editItemOptions) => {
13
+ const root = editItemOptions === null || editItemOptions === void 0 ? void 0 : editItemOptions.root;
14
+ ensureFontFamilyListStyle(root);
14
15
  const fonts = (0, renderer_1.getFonts)();
15
16
  const current = normalizeFontFamily(attrs['font-family']);
16
- const options = fonts.map((font) => ({
17
+ const fontOptions = fonts.map((font) => ({
17
18
  label: font.name || font.fontFamily,
18
19
  value: font.fontFamily,
19
20
  }));
20
- if (!options.some((option) => normalizeFontFamily(option.value) === current)) {
21
- options.unshift({
21
+ if (!fontOptions.some((option) => normalizeFontFamily(option.value) === current)) {
22
+ fontOptions.unshift({
22
23
  label: DEFAULT_FONT_LABEL,
23
24
  value: current,
24
25
  });
25
26
  }
26
27
  let selected = current;
27
- const content = createFontList(options, selected, (value) => {
28
+ const content = createFontList(fontOptions, selected, (value) => {
28
29
  if (selected === value)
29
30
  return;
30
31
  selected = value;
@@ -32,10 +33,11 @@ const FontFamily = (selection, attrs, commander) => {
32
33
  attributes: { 'font-family': (0, utils_1.decodeFontFamily)(value) },
33
34
  })));
34
35
  });
35
- const button = (0, components_1.IconButton)({ icon: components_1.TEXT_ICONS.fontFamily });
36
+ const button = (0, components_1.IconButton)({ icon: components_1.TEXT_ICONS.fontFamily, root });
36
37
  const popover = (0, components_1.Popover)({
37
38
  target: button,
38
39
  content,
40
+ getContainer: root,
39
41
  placement: ['top', 'bottom'],
40
42
  offset: 12,
41
43
  trigger: 'hover',
@@ -85,7 +87,7 @@ function normalizeFontFamily(font) {
85
87
  return (0, utils_1.encodeFontFamily)(font.join(', '));
86
88
  return (0, utils_1.encodeFontFamily)(String(font));
87
89
  }
88
- function ensureFontFamilyListStyle() {
90
+ function ensureFontFamilyListStyle(target) {
89
91
  (0, utils_1.injectStyleOnce)(FONT_LIST_STYLE_ID, `
90
92
  .${FONT_LIST_CLASS} {
91
93
  display: flex;
@@ -115,5 +117,5 @@ function ensureFontFamilyListStyle() {
115
117
  background: #e6f4ff;
116
118
  color: #0958d9;
117
119
  }
118
- `);
120
+ `, target);
119
121
  }
@@ -21,24 +21,26 @@ const FONT_SIZE_STYLES = `
21
21
  gap: 2px;
22
22
  }
23
23
  `;
24
- const FontSize = (selection, attrs, commander) => {
25
- (0, utils_1.injectStyleOnce)(FONT_SIZE_STYLE_ID, FONT_SIZE_STYLES);
26
- const button = (0, components_1.IconButton)({ icon: components_1.TEXT_ICONS.fontSize });
24
+ const FontSize = (selection, attrs, commander, options) => {
25
+ const root = options === null || options === void 0 ? void 0 : options.root;
26
+ (0, utils_1.injectStyleOnce)(FONT_SIZE_STYLE_ID, FONT_SIZE_STYLES, root);
27
+ const button = (0, components_1.IconButton)({ icon: components_1.TEXT_ICONS.fontSize, root });
27
28
  const currentSize = normalizeFontSize(attrs['font-size']);
28
29
  const content = createFontSizeContent(currentSize, (size) => {
29
30
  commander.executeBatch(selection.map((text) => new commands_1.UpdateElementCommand(text, {
30
31
  attributes: { 'font-size': size },
31
32
  })));
32
- });
33
+ }, root);
33
34
  return (0, components_1.Popover)({
34
35
  target: button,
35
36
  content,
37
+ getContainer: root,
36
38
  placement: 'top',
37
39
  offset: 12,
38
40
  });
39
41
  };
40
42
  exports.FontSize = FontSize;
41
- function createFontSizeContent(defaultSize, onSizeChange) {
43
+ function createFontSizeContent(defaultSize, onSizeChange, root) {
42
44
  const content = document.createElement('div');
43
45
  content.classList.add(FONT_SIZE_CLASS);
44
46
  let selected = defaultSize;
@@ -51,6 +53,7 @@ function createFontSizeContent(defaultSize, onSizeChange) {
51
53
  };
52
54
  FONT_SIZE_OPTIONS.forEach(({ label, value }) => {
53
55
  const button = (0, components_1.IconButton)({
56
+ root,
54
57
  icon: createLabelIcon(label),
55
58
  onClick: () => {
56
59
  if (selected === value)
@@ -7,8 +7,9 @@ const components_1 = require("../../components");
7
7
  const ICON_COLOR_BUTTON_CLASS = 'infographic-icon-color-btn';
8
8
  const ICON_COLOR_STYLE_ID = 'infographic-icon-color-style';
9
9
  const DEFAULT_COLOR = '#1f1f1f';
10
- const IconColor = (selection, attrs, commander) => {
11
- ensureIconColorStyles();
10
+ const IconColor = (selection, attrs, commander, options) => {
11
+ const root = options === null || options === void 0 ? void 0 : options.root;
12
+ ensureIconColorStyles(root);
12
13
  const color = normalizeColor(attrs.fill);
13
14
  const isMixed = attrs.fill === undefined && selection.length > 1;
14
15
  const button = document.createElement('button');
@@ -16,6 +17,7 @@ const IconColor = (selection, attrs, commander) => {
16
17
  button.classList.add(ICON_COLOR_BUTTON_CLASS);
17
18
  setButtonColor(button, color !== null && color !== void 0 ? color : DEFAULT_COLOR, isMixed);
18
19
  const picker = (0, components_1.ColorPicker)({
20
+ root,
19
21
  value: color !== null && color !== void 0 ? color : DEFAULT_COLOR,
20
22
  onChange: (nextColor) => {
21
23
  setButtonColor(button, nextColor, false);
@@ -27,6 +29,7 @@ const IconColor = (selection, attrs, commander) => {
27
29
  return (0, components_1.Popover)({
28
30
  target: button,
29
31
  content: picker,
32
+ getContainer: root,
30
33
  placement: ['top', 'bottom'],
31
34
  offset: 12,
32
35
  trigger: 'hover',
@@ -48,7 +51,7 @@ function setButtonColor(button, color, mixed) {
48
51
  else
49
52
  button.removeAttribute('data-mixed');
50
53
  }
51
- function ensureIconColorStyles() {
54
+ function ensureIconColorStyles(target) {
52
55
  (0, utils_1.injectStyleOnce)(ICON_COLOR_STYLE_ID, `
53
56
  .${ICON_COLOR_BUTTON_CLASS} {
54
57
  position: relative;
@@ -77,5 +80,5 @@ function ensureIconColorStyles() {
77
80
  #f5f5f5 12px
78
81
  );
79
82
  }
80
- `);
83
+ `, target);
81
84
  }
@@ -1,3 +1,7 @@
1
1
  import type { BaseAttributes } from '../../../../types';
2
2
  import type { ICommandManager, Selection } from '../../../types';
3
- export type EditItem<T extends BaseAttributes = BaseAttributes> = (selection: Selection, attrs: T, commander: ICommandManager, options?: Record<string, any>) => HTMLElement;
3
+ export type EditItemOptions = {
4
+ root?: HTMLElement | ShadowRoot;
5
+ [key: string]: any;
6
+ };
7
+ export type EditItem<T extends BaseAttributes = BaseAttributes> = (selection: Selection, attrs: T, commander: ICommandManager, options?: EditItemOptions) => HTMLElement;
@@ -3,8 +3,9 @@ import { Plugin } from './base';
3
3
  export interface ResetViewBoxOptions {
4
4
  style?: Partial<CSSStyleDeclaration>;
5
5
  className?: string;
6
- getContainer?: HTMLElement | (() => HTMLElement);
6
+ getContainer?: OverlayRoot | (() => OverlayRoot);
7
7
  }
8
+ type OverlayRoot = HTMLElement | ShadowRoot;
8
9
  export declare class ResetViewBox extends Plugin implements IPlugin {
9
10
  private options?;
10
11
  name: string;
@@ -29,5 +30,7 @@ export declare class ResetViewBox extends Plugin implements IPlugin {
29
30
  private showButton;
30
31
  private hideButton;
31
32
  private removeButton;
33
+ private resolveOverlayRoot;
32
34
  private ensureButtonStyle;
33
35
  }
36
+ export {};
@@ -4,6 +4,7 @@ exports.ResetViewBox = void 0;
4
4
  const constants_1 = require("../../constants");
5
5
  const utils_1 = require("../../utils");
6
6
  const commands_1 = require("../commands");
7
+ const utils_2 = require("../utils");
7
8
  const base_1 = require("./base");
8
9
  const components_1 = require("./components");
9
10
  const icons_1 = require("./components/icons");
@@ -36,9 +37,12 @@ class ResetViewBox extends base_1.Plugin {
36
37
  if (this.resetButton)
37
38
  return this.resetButton;
38
39
  const { style, className } = this.options || {};
40
+ const containerParent = this.resolveOverlayRoot();
41
+ this.ensureButtonStyle(containerParent);
39
42
  const button = (0, components_1.IconButton)({
40
43
  icon: icons_1.RESET_ICON,
41
44
  onClick: this.resetViewBox,
45
+ root: containerParent,
42
46
  });
43
47
  button.classList.add(RESET_BUTTON_CLASS);
44
48
  if (className) {
@@ -49,9 +53,6 @@ class ResetViewBox extends base_1.Plugin {
49
53
  }
50
54
  (0, utils_1.setElementRole)(button, constants_1.COMPONENT_ROLE);
51
55
  this.resetButton = button;
52
- const { getContainer } = this.options || {};
53
- const resolvedContainer = typeof getContainer === 'function' ? getContainer() : getContainer;
54
- const containerParent = resolvedContainer !== null && resolvedContainer !== void 0 ? resolvedContainer : document.body;
55
56
  containerParent === null || containerParent === void 0 ? void 0 : containerParent.appendChild(button);
56
57
  return button;
57
58
  };
@@ -142,7 +143,7 @@ class ResetViewBox extends base_1.Plugin {
142
143
  init(options) {
143
144
  super.init(options);
144
145
  // Initialize originViewBox
145
- this.ensureButtonStyle();
146
+ this.ensureButtonStyle(this.resolveOverlayRoot());
146
147
  this.updateOriginViewBox();
147
148
  this.unregisterSync = this.editor.registerSync('viewBox', this.handleViewBoxChange);
148
149
  window.addEventListener('resize', this.handleResize);
@@ -164,7 +165,12 @@ class ResetViewBox extends base_1.Plugin {
164
165
  const { padding } = this.state.getOptions();
165
166
  this.originViewBox = (0, utils_1.getBoundViewBox)(svg, (0, utils_1.parsePadding)(padding));
166
167
  }
167
- ensureButtonStyle() {
168
+ resolveOverlayRoot() {
169
+ const { getContainer } = this.options || {};
170
+ const resolvedContainer = typeof getContainer === 'function' ? getContainer() : getContainer;
171
+ return resolvedContainer !== null && resolvedContainer !== void 0 ? resolvedContainer : (0, utils_2.getOverlayContainer)(this.editor.getDocument());
172
+ }
173
+ ensureButtonStyle(target) {
168
174
  (0, utils_1.injectStyleOnce)(RESET_BUTTON_STYLE_ID, `
169
175
  button.${RESET_BUTTON_CLASS} {
170
176
  visibility: hidden;
@@ -182,7 +188,7 @@ class ResetViewBox extends base_1.Plugin {
182
188
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
183
189
  cursor: pointer;
184
190
  }
185
- `);
191
+ `, target);
186
192
  }
187
193
  }
188
194
  exports.ResetViewBox = ResetViewBox;
@@ -6,3 +6,4 @@ export * from './event';
6
6
  export * from './extension';
7
7
  export * from './hotkey';
8
8
  export * from './object';
9
+ export * from './root';
@@ -22,3 +22,4 @@ __exportStar(require("./event"), exports);
22
22
  __exportStar(require("./extension"), exports);
23
23
  __exportStar(require("./hotkey"), exports);
24
24
  __exportStar(require("./object"), exports);
25
+ __exportStar(require("./root"), exports);
@@ -0,0 +1,3 @@
1
+ export type OverlayContainer = HTMLElement | ShadowRoot;
2
+ export declare function getOverlayContainer(node?: Node | null): OverlayContainer;
3
+ export declare function eventPathContains(event: Event, node: Node): boolean;