@visactor/vtable-plugins 1.26.1-alpha.0 → 1.26.1

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.
@@ -1,12 +1,4 @@
1
- export const MENU_CONTAINER_CLASS = "vtable-context-menu-container";
2
-
3
- export const MENU_ITEM_CLASS = "vtable-context-menu-item";
4
-
5
- export const MENU_ITEM_DISABLED_CLASS = "vtable-context-menu-item-disabled";
6
-
7
- export const MENU_ITEM_SEPARATOR_CLASS = "vtable-context-menu-item-separator";
8
-
9
- export const MENU_ITEM_SUBMENU_CLASS = "vtable-context-menu-item-submenu";
1
+ import { isArray } from "@visactor/vutils";
10
2
 
11
3
  export const MENU_STYLES = {
12
4
  menuContainer: {
@@ -15,7 +7,7 @@ export const MENU_STYLES = {
15
7
  boxShadow: "0 2px 10px rgba(0, 0, 0, 0.2)",
16
8
  borderRadius: "4px",
17
9
  padding: "5px 0",
18
- zIndex: 1e3,
10
+ zIndex: "1000",
19
11
  minWidth: "180px",
20
12
  maxHeight: "300px",
21
13
  overflowY: "auto",
@@ -34,7 +26,7 @@ export const MENU_STYLES = {
34
26
  backgroundColor: "#f5f5f5"
35
27
  },
36
28
  menuItemDisabled: {
37
- opacity: .5,
29
+ opacity: "0.5",
38
30
  cursor: "not-allowed"
39
31
  },
40
32
  menuItemSeparator: {
@@ -51,7 +43,7 @@ export const MENU_STYLES = {
51
43
  justifyContent: "center"
52
44
  },
53
45
  menuItemText: {
54
- flex: 1
46
+ flex: "1"
55
47
  },
56
48
  menuItemShortcut: {
57
49
  marginLeft: "20px",
@@ -71,7 +63,7 @@ export const MENU_STYLES = {
71
63
  boxShadow: "0 2px 10px rgba(0, 0, 0, 0.2)",
72
64
  borderRadius: "4px",
73
65
  padding: "5px 0",
74
- zIndex: 1001,
66
+ zIndex: "1001",
75
67
  minWidth: "180px",
76
68
  fontSize: "12px"
77
69
  },
@@ -106,6 +98,59 @@ export const MENU_STYLES = {
106
98
  }
107
99
  };
108
100
 
101
+ export const MENU_CLASSES = {
102
+ menuContainer: "vtable-context-menu-container",
103
+ submenuContainer: "vtable-context-submenu-container",
104
+ menuItem: "vtable-context-menu-item",
105
+ menuItemSeparator: "vtable-context-menu-item-separator",
106
+ menuItemSubmenu: "vtable-context-menu-item-submenu",
107
+ menuItemDisabled: "vtable-context-menu-item-disabled"
108
+ };
109
+
110
+ const DANGEROUS_SVG_ELEMENTS = new Set([ "script", "iframe", "object", "embed", "form", "input", "textarea", "select", "button" ]), DANGEROUS_ATTR_PREFIXES = [ "on" ], DANGEROUS_URL_ATTRS = new Set([ "href", "xlink:href" ]);
111
+
112
+ export function sanitizeSvg(svgString) {
113
+ const doc = (new DOMParser).parseFromString(svgString, "image/svg+xml");
114
+ if (doc.querySelector("parsererror")) return "";
115
+ const svg = doc.documentElement;
116
+ if ("svg" !== svg.tagName.toLowerCase()) return "";
117
+ sanitizeNode(svg);
118
+ return (new XMLSerializer).serializeToString(svg);
119
+ }
120
+
121
+ function sanitizeNode(node) {
122
+ const children = Array.from(node.children);
123
+ for (const child of children) DANGEROUS_SVG_ELEMENTS.has(child.tagName.toLowerCase()) ? node.removeChild(child) : sanitizeNode(child);
124
+ const attrs = Array.from(node.attributes);
125
+ for (const attr of attrs) {
126
+ const name = attr.name.toLowerCase();
127
+ if (DANGEROUS_ATTR_PREFIXES.some((prefix => name.startsWith(prefix)))) node.removeAttribute(attr.name); else if (DANGEROUS_URL_ATTRS.has(name)) {
128
+ const value = attr.value.trim().toLowerCase();
129
+ (value.startsWith("javascript:") || value.startsWith("data:")) && node.removeAttribute(attr.name);
130
+ }
131
+ }
132
+ }
133
+
134
+ export function mergeStyles(styles) {
135
+ if (!styles) return Object.assign({}, MENU_STYLES);
136
+ const result = {};
137
+ for (const _key in MENU_STYLES) {
138
+ const key = _key;
139
+ styles[key] ? result[key] = Object.assign(Object.assign({}, MENU_STYLES[key]), styles[key]) : result[key] = Object.assign({}, MENU_STYLES[key]);
140
+ }
141
+ return result;
142
+ }
143
+
144
+ export function mergeClasses(classes) {
145
+ if (!classes) return Object.assign({}, MENU_CLASSES);
146
+ const result = {};
147
+ for (const _key in MENU_CLASSES) {
148
+ const key = _key;
149
+ classes[key] ? result[key] = `${MENU_CLASSES[key]} ${normalizeClassName(classes[key]).join(" ")}` : result[key] = MENU_CLASSES[key];
150
+ }
151
+ return result;
152
+ }
153
+
109
154
  export function createElement(tag, className, styles) {
110
155
  const element = document.createElement(tag);
111
156
  return className && (element.className = className), styles && applyStyles(element, styles),
@@ -113,13 +158,28 @@ export function createElement(tag, className, styles) {
113
158
  }
114
159
 
115
160
  export function applyStyles(element, styles) {
116
- Object.entries(styles).forEach((([key, value]) => {
117
- element.style[key] = value;
118
- }));
161
+ for (const key in styles) {
162
+ const value = styles[key];
163
+ void 0 !== value && (element.style[key] = value);
164
+ }
119
165
  }
120
166
 
121
- export function createIcon(iconName) {
122
- const iconElement = createElement("span");
167
+ export function createIcon(icon, menuItem, iconStyles = MENU_STYLES.menuItemIcon) {
168
+ if ("function" == typeof icon) {
169
+ const element = icon(menuItem);
170
+ return applyStyles(element, iconStyles), element;
171
+ }
172
+ if ("object" == typeof icon && "svg" in icon) {
173
+ const svgConfig = icon, iconElement = createElement("span"), safeSvg = sanitizeSvg(svgConfig.svg);
174
+ if (safeSvg) {
175
+ iconElement.innerHTML = safeSvg;
176
+ const svgEl = iconElement.querySelector("svg");
177
+ svgEl && (void 0 !== svgConfig.width && svgEl.setAttribute("width", String(svgConfig.width)),
178
+ void 0 !== svgConfig.height && svgEl.setAttribute("height", String(svgConfig.height)));
179
+ }
180
+ return applyStyles(iconElement, iconStyles), iconElement;
181
+ }
182
+ const iconName = icon, iconElement = createElement("span");
123
183
  switch (iconName) {
124
184
  case "copy":
125
185
  iconElement.innerHTML = "📋";
@@ -176,22 +236,34 @@ export function createIcon(iconName) {
176
236
  default:
177
237
  iconElement.innerHTML = "•";
178
238
  }
179
- return applyStyles(iconElement, MENU_STYLES.menuItemIcon), iconElement;
239
+ return applyStyles(iconElement, iconStyles), iconElement;
180
240
  }
181
241
 
182
- export function createNumberInputItem(label, defaultValue = 1, iconName, callback) {
242
+ export function createNumberInputItem(label, defaultValue = 1, icon, callback, styles = MENU_STYLES) {
183
243
  const container = createElement("div");
184
- if (applyStyles(container, MENU_STYLES.inputContainer), iconName) {
185
- const icon = createIcon(iconName);
186
- container.appendChild(icon);
244
+ if (applyStyles(container, styles.inputContainer), icon) {
245
+ const iconEl = createIcon(icon, void 0, styles.menuItemIcon);
246
+ container.appendChild(iconEl);
187
247
  }
188
248
  const labelElement = createElement("label");
189
- labelElement.textContent = label, applyStyles(labelElement, MENU_STYLES.inputLabel),
249
+ labelElement.textContent = label, applyStyles(labelElement, styles.inputLabel),
190
250
  container.appendChild(labelElement);
191
251
  const input = createElement("input");
192
- input.type = "number", input.min = "1", input.value = defaultValue.toString(), applyStyles(input, MENU_STYLES.inputField),
252
+ input.type = "number", input.min = "1", input.value = defaultValue.toString(), applyStyles(input, styles.inputField),
193
253
  container.appendChild(input);
194
254
  const wrapper = createElement("div");
195
255
  return wrapper.appendChild(container), wrapper;
196
256
  }
257
+
258
+ export function normalizeItemClassNameConfig(classNames) {
259
+ const normalized = {};
260
+ return classNames && Object.keys(classNames).forEach((item => {
261
+ const className = classNames[item];
262
+ className && (normalized[item] = normalizeClassName(className));
263
+ })), normalized;
264
+ }
265
+
266
+ export function normalizeClassName(className) {
267
+ return className ? isArray(className) ? className : className.split(" ").filter(Boolean) : [];
268
+ }
197
269
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contextmenu/styles.ts"],"names":[],"mappings":"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","file":"styles.js","sourcesContent":["/**\n * 右键菜单的样式定义\n */\n\nexport const MENU_CONTAINER_CLASS = 'vtable-context-menu-container';\nexport const MENU_ITEM_CLASS = 'vtable-context-menu-item';\nexport const MENU_ITEM_DISABLED_CLASS = 'vtable-context-menu-item-disabled';\nexport const MENU_ITEM_SEPARATOR_CLASS = 'vtable-context-menu-item-separator';\nexport const MENU_ITEM_SUBMENU_CLASS = 'vtable-context-menu-item-submenu';\n\nexport const MENU_STYLES = {\n menuContainer: {\n position: 'absolute',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: 1000,\n minWidth: '180px',\n maxHeight: '300px', // 设置最大高度\n overflowY: 'auto', // 添加垂直滚动\n fontSize: '12px'\n },\n menuItem: {\n padding: '6px 20px',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n },\n menuItemHover: {\n backgroundColor: '#f5f5f5'\n },\n menuItemDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed'\n },\n menuItemSeparator: {\n height: '1px',\n backgroundColor: '#e0e0e0',\n margin: '5px 0'\n },\n menuItemIcon: {\n marginRight: '8px',\n width: '16px',\n height: '16px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n menuItemText: {\n flex: 1\n },\n menuItemShortcut: {\n marginLeft: '20px',\n color: '#999',\n fontSize: '11px'\n },\n submenuArrow: {\n marginLeft: '5px',\n fontSize: '12px',\n color: '#666'\n },\n submenuContainer: {\n position: 'absolute',\n left: '100%',\n top: '0',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: 1001,\n minWidth: '180px',\n fontSize: '12px'\n },\n inputContainer: {\n padding: '8px 12px',\n display: 'flex',\n alignItems: 'center'\n },\n inputLabel: {\n marginRight: '8px',\n whiteSpace: 'nowrap'\n },\n inputField: {\n width: '60px',\n padding: '4px',\n border: '1px solid #ddd',\n borderRadius: '3px'\n },\n buttonContainer: {\n display: 'flex',\n justifyContent: 'flex-end',\n padding: '5px 12px'\n },\n button: {\n padding: '4px 8px',\n backgroundColor: '#1890ff',\n color: 'white',\n border: 'none',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '12px'\n }\n};\n\n/**\n * 创建DOM元素\n */\nexport function createElement(tag: string, className?: string, styles?: Record<string, any>): HTMLElement {\n const element = document.createElement(tag);\n if (className) {\n element.className = className;\n }\n if (styles) {\n applyStyles(element, styles);\n }\n return element;\n}\n\n/**\n * 应用样式到元素\n */\nexport function applyStyles(element: HTMLElement, styles: Record<string, any>): void {\n Object.entries(styles).forEach(([key, value]) => {\n (element.style as any)[key] = value;\n });\n}\n\n/**\n * 创建图标元素\n */\nexport function createIcon(iconName: string): HTMLElement {\n const iconElement = createElement('span');\n\n // 根据图标名称设置不同的内容\n switch (iconName) {\n case 'copy':\n iconElement.innerHTML = '📋';\n break;\n case 'paste':\n iconElement.innerHTML = '📌';\n break;\n case 'cut':\n iconElement.innerHTML = '✂️';\n break;\n case 'delete':\n iconElement.innerHTML = '🗑️';\n break;\n case 'insert':\n iconElement.innerHTML = '➕';\n break;\n case 'sort':\n iconElement.innerHTML = '🔃';\n break;\n // case 'merge':\n // iconElement.innerHTML = ;\n // break;\n // case 'unmerge':\n // iconElement.innerHTML = ;\n // break;\n case 'protect':\n iconElement.innerHTML = '🔒';\n break;\n case 'hide':\n iconElement.innerHTML = '👁️';\n break;\n case 'freeze':\n iconElement.innerHTML = '❄️';\n break;\n case 'up-arrow':\n iconElement.innerHTML = '🔼';\n break;\n case 'down-arrow':\n iconElement.innerHTML = '🔽';\n break;\n case 'left-arrow':\n iconElement.innerHTML = '◀️';\n break;\n case 'right-arrow':\n iconElement.innerHTML = '▶️';\n break;\n default:\n iconElement.innerHTML = '•';\n }\n\n applyStyles(iconElement, MENU_STYLES.menuItemIcon);\n return iconElement;\n}\n\n/**\n * 创建带有数字输入框的菜单项\n */\nexport function createNumberInputItem(\n label: string,\n defaultValue: number = 1,\n iconName: string,\n callback: (value: number) => void\n): HTMLElement {\n // 创建容器\n const container = createElement('div');\n applyStyles(container, MENU_STYLES.inputContainer);\n\n // 创建左侧图标容器\n\n // 添加图标\n if (iconName) {\n const icon = createIcon(iconName);\n container.appendChild(icon);\n }\n // 创建标签\n const labelElement = createElement('label');\n labelElement.textContent = label;\n applyStyles(labelElement, MENU_STYLES.inputLabel);\n container.appendChild(labelElement);\n\n // 创建输入框\n const input = createElement('input') as HTMLInputElement;\n input.type = 'number';\n input.min = '1';\n input.value = defaultValue.toString();\n applyStyles(input, MENU_STYLES.inputField);\n container.appendChild(input);\n // 创建包装容器\n const wrapper = createElement('div');\n wrapper.appendChild(container);\n\n return wrapper;\n}\n"]}
1
+ {"version":3,"sources":["../src/contextmenu/styles.ts"],"names":[],"mappings":"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","file":"styles.js","sourcesContent":["import { isArray } from '@visactor/vutils';\n/**\n * 右键菜单的样式定义\n */\n\nimport type { ClassName, MenuItem, MenuItemClassConfig, MenuItemIcon, SvgIconConfig } from './types';\n\nexport type MenuStyleDef = { [K in keyof CSSStyleDeclaration]?: CSSStyleDeclaration[K] };\nexport type MenuStyles = typeof MENU_STYLES;\nexport type MenuClasses = typeof MENU_CLASSES;\nexport type MenuAttributions = {\n style?: { [K in keyof MenuStyles]?: Partial<MenuStyles[K]> };\n class?: { [K in keyof MenuClasses]?: Partial<MenuClasses[K]> };\n};\n\nexport const MENU_STYLES = {\n menuContainer: {\n position: 'absolute',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: '1000',\n minWidth: '180px',\n maxHeight: '300px', // 设置最大高度\n overflowY: 'auto', // 添加垂直滚动\n fontSize: '12px'\n } as MenuStyleDef,\n menuItem: {\n padding: '6px 20px',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n } as MenuStyleDef,\n menuItemHover: {\n backgroundColor: '#f5f5f5'\n } as MenuStyleDef,\n menuItemDisabled: {\n opacity: '0.5',\n cursor: 'not-allowed'\n } as MenuStyleDef,\n menuItemSeparator: {\n height: '1px',\n backgroundColor: '#e0e0e0',\n margin: '5px 0'\n } as MenuStyleDef,\n menuItemIcon: {\n marginRight: '8px',\n width: '16px',\n height: '16px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center'\n } as MenuStyleDef,\n menuItemText: {\n flex: '1'\n } as MenuStyleDef,\n menuItemShortcut: {\n marginLeft: '20px',\n color: '#999',\n fontSize: '11px'\n } as MenuStyleDef,\n submenuArrow: {\n marginLeft: '5px',\n fontSize: '12px',\n color: '#666'\n } as MenuStyleDef,\n submenuContainer: {\n position: 'absolute',\n left: '100%',\n top: '0',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: '1001',\n minWidth: '180px',\n fontSize: '12px'\n } as MenuStyleDef,\n inputContainer: {\n padding: '8px 12px',\n display: 'flex',\n alignItems: 'center'\n } as MenuStyleDef,\n inputLabel: {\n marginRight: '8px',\n whiteSpace: 'nowrap'\n } as MenuStyleDef,\n inputField: {\n width: '60px',\n padding: '4px',\n border: '1px solid #ddd',\n borderRadius: '3px'\n } as MenuStyleDef,\n buttonContainer: {\n display: 'flex',\n justifyContent: 'flex-end',\n padding: '5px 12px'\n } as MenuStyleDef,\n button: {\n padding: '4px 8px',\n backgroundColor: '#1890ff',\n color: 'white',\n border: 'none',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '12px'\n } as MenuStyleDef\n};\n\nexport const MENU_CLASSES = {\n menuContainer: 'vtable-context-menu-container' as ClassName,\n submenuContainer: 'vtable-context-submenu-container' as ClassName,\n menuItem: 'vtable-context-menu-item' as ClassName,\n menuItemSeparator: 'vtable-context-menu-item-separator' as ClassName,\n menuItemSubmenu: 'vtable-context-menu-item-submenu' as ClassName,\n menuItemDisabled: 'vtable-context-menu-item-disabled' as ClassName\n};\n\n/**\n * 移除用户传入的 SVG 中可能的危险元素和属性\n */\nconst DANGEROUS_SVG_ELEMENTS = new Set([\n 'script',\n 'iframe',\n 'object',\n 'embed',\n 'form',\n 'input',\n 'textarea',\n 'select',\n 'button'\n]);\nconst DANGEROUS_ATTR_PREFIXES = ['on'];\nconst DANGEROUS_URL_ATTRS = new Set(['href', 'xlink:href']);\n\nexport function sanitizeSvg(svgString: string): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgString, 'image/svg+xml');\n const errorNode = doc.querySelector('parsererror');\n if (errorNode) {\n return '';\n }\n const svg = doc.documentElement;\n if (svg.tagName.toLowerCase() !== 'svg') {\n return '';\n }\n sanitizeNode(svg);\n const serializer = new XMLSerializer();\n return serializer.serializeToString(svg);\n}\n\nfunction sanitizeNode(node: Element): void {\n const children = Array.from(node.children);\n for (const child of children) {\n if (DANGEROUS_SVG_ELEMENTS.has(child.tagName.toLowerCase())) {\n node.removeChild(child);\n } else {\n sanitizeNode(child);\n }\n }\n\n const attrs = Array.from(node.attributes);\n for (const attr of attrs) {\n const name = attr.name.toLowerCase();\n if (DANGEROUS_ATTR_PREFIXES.some(prefix => name.startsWith(prefix))) {\n node.removeAttribute(attr.name);\n continue;\n }\n if (DANGEROUS_URL_ATTRS.has(name)) {\n const value = attr.value.trim().toLowerCase();\n if (value.startsWith('javascript:') || value.startsWith('data:')) {\n node.removeAttribute(attr.name);\n }\n }\n }\n}\n\n/**\n * 合并用户自定义样式与默认样式\n */\nexport function mergeStyles(styles?: Partial<MenuStyles>): MenuStyles {\n if (!styles) {\n return { ...MENU_STYLES };\n }\n const result: any = {};\n for (const _key in MENU_STYLES) {\n const key = _key as keyof MenuStyles;\n if (styles[key]) {\n result[key] = { ...MENU_STYLES[key], ...styles[key] };\n } else {\n result[key] = { ...MENU_STYLES[key] };\n }\n }\n return result as MenuStyles;\n}\n\n/**\n * 合并用户自定义类名与默认类名\n */\nexport function mergeClasses(classes?: Partial<MenuClasses>): MenuClasses {\n if (!classes) {\n return { ...MENU_CLASSES };\n }\n const result: any = {};\n for (const _key in MENU_CLASSES) {\n const key = _key as keyof MenuClasses;\n if (classes[key]) {\n result[key] = `${MENU_CLASSES[key]} ${normalizeClassName(classes[key]).join(' ')}`;\n } else {\n result[key] = MENU_CLASSES[key];\n }\n }\n return result as MenuClasses;\n}\n\n/**\n * 创建DOM元素\n */\nexport function createElement(tag: string, className?: string, styles?: Record<string, any>): HTMLElement {\n const element = document.createElement(tag);\n if (className) {\n element.className = className;\n }\n if (styles) {\n applyStyles(element, styles);\n }\n return element;\n}\n\n/**\n * 应用样式到元素\n */\nexport function applyStyles(\n element: HTMLElement,\n styles: { [K in keyof CSSStyleDeclaration]?: CSSStyleDeclaration[K] }\n): void {\n for (const key in styles) {\n const value = styles[key];\n if (value !== undefined) {\n element.style[key] = value;\n }\n }\n}\n\n/**\n * 创建图标元素\n */\nexport function createIcon(\n icon: MenuItemIcon,\n menuItem?: MenuItem,\n iconStyles: MenuStyleDef = MENU_STYLES.menuItemIcon\n): HTMLElement {\n // 自定义渲染\n if (typeof icon === 'function') {\n const element = icon(menuItem!);\n applyStyles(element, iconStyles);\n return element;\n }\n\n // SVG 配置\n if (typeof icon === 'object' && 'svg' in icon) {\n const svgConfig = icon as SvgIconConfig;\n const iconElement = createElement('span');\n const safeSvg = sanitizeSvg(svgConfig.svg);\n if (safeSvg) {\n iconElement.innerHTML = safeSvg;\n const svgEl = iconElement.querySelector('svg');\n if (svgEl) {\n if (svgConfig.width !== undefined) {\n svgEl.setAttribute('width', String(svgConfig.width));\n }\n if (svgConfig.height !== undefined) {\n svgEl.setAttribute('height', String(svgConfig.height));\n }\n }\n }\n applyStyles(iconElement, iconStyles);\n return iconElement;\n }\n\n const iconName = icon as string;\n const iconElement = createElement('span');\n\n switch (iconName) {\n case 'copy':\n iconElement.innerHTML = '📋';\n break;\n case 'paste':\n iconElement.innerHTML = '📌';\n break;\n case 'cut':\n iconElement.innerHTML = '✂️';\n break;\n case 'delete':\n iconElement.innerHTML = '🗑️';\n break;\n case 'insert':\n iconElement.innerHTML = '➕';\n break;\n case 'sort':\n iconElement.innerHTML = '🔃';\n break;\n // case 'merge':\n // iconElement.innerHTML = ;\n // break;\n // case 'unmerge':\n // iconElement.innerHTML = ;\n // break;\n case 'protect':\n iconElement.innerHTML = '🔒';\n break;\n case 'hide':\n iconElement.innerHTML = '👁️';\n break;\n case 'freeze':\n iconElement.innerHTML = '❄️';\n break;\n case 'up-arrow':\n iconElement.innerHTML = '🔼';\n break;\n case 'down-arrow':\n iconElement.innerHTML = '🔽';\n break;\n case 'left-arrow':\n iconElement.innerHTML = '◀️';\n break;\n case 'right-arrow':\n iconElement.innerHTML = '▶️';\n break;\n default:\n iconElement.innerHTML = '•';\n }\n\n applyStyles(iconElement, iconStyles);\n return iconElement;\n}\n\n/**\n * 创建带有数字输入框的菜单项\n */\nexport function createNumberInputItem(\n label: string,\n defaultValue: number = 1,\n icon: MenuItemIcon | undefined,\n callback: (value: number) => void,\n styles: MenuStyles = MENU_STYLES\n): HTMLElement {\n // 创建容器\n const container = createElement('div');\n applyStyles(container, styles.inputContainer);\n\n // 创建左侧图标容器\n\n // 添加图标\n if (icon) {\n const iconEl = createIcon(icon, undefined, styles.menuItemIcon);\n container.appendChild(iconEl);\n }\n // 创建标签\n const labelElement = createElement('label');\n labelElement.textContent = label;\n applyStyles(labelElement, styles.inputLabel);\n container.appendChild(labelElement);\n\n // 创建输入框\n const input = createElement('input') as HTMLInputElement;\n input.type = 'number';\n input.min = '1';\n input.value = defaultValue.toString();\n applyStyles(input, styles.inputField);\n container.appendChild(input);\n // 创建包装容器\n const wrapper = createElement('div');\n wrapper.appendChild(container);\n\n return wrapper;\n}\n\n/**\n * 格式化用户传入的类名配置\n */\nexport function normalizeItemClassNameConfig(classNames?: MenuItemClassConfig) {\n const normalized: MenuItemClassConfig = {};\n if (classNames) {\n Object.keys(classNames).forEach(item => {\n const className = classNames[item as keyof MenuItemClassConfig];\n if (className) {\n normalized[item as keyof MenuItemClassConfig] = normalizeClassName(className);\n }\n });\n }\n return normalized;\n}\n\n/**\n * 格式化类名,将类名统一转为数组\n */\nexport function normalizeClassName(className: ClassName): string[] {\n if (!className) {\n return [];\n }\n return isArray(className) ? className : className.split(' ').filter(Boolean);\n}\n"]}
@@ -26,12 +26,33 @@ export declare enum MenuKey {
26
26
  HIDE_COLUMN = "hide_column",
27
27
  SORT = "sort"
28
28
  }
29
+ export interface SvgIconConfig {
30
+ svg: string;
31
+ width?: number;
32
+ height?: number;
33
+ }
34
+ export type ClassName = string | string[];
35
+ export interface MenuItemClassConfig {
36
+ item?: ClassName;
37
+ itemDisabled?: ClassName;
38
+ leftContainer?: ClassName;
39
+ icon?: ClassName;
40
+ text?: ClassName;
41
+ input?: ClassName;
42
+ rightContainer?: ClassName;
43
+ arrow?: ClassName;
44
+ shortcut?: ClassName;
45
+ }
46
+ export type IconRenderFunction = (menuItem: MenuItem) => HTMLElement;
47
+ export type MenuItemIcon = string | SvgIconConfig | IconRenderFunction;
29
48
  export interface MenuItem {
30
49
  text: string;
31
50
  menuKey: MenuKey | string;
32
51
  disabled?: boolean;
33
52
  shortcut?: string;
34
53
  iconName?: string;
54
+ customIcon?: MenuItemIcon;
55
+ customClassName?: MenuItemClassConfig;
35
56
  iconPlaceholder?: boolean;
36
57
  inputDefaultValue?: number;
37
58
  children?: (MenuItem | string)[];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contextmenu/types.ts"],"names":[],"mappings":"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","file":"types.js","sourcesContent":["export interface MenuClickEventArgs {\n menuKey: MenuKey;\n menuText: string;\n rowIndex?: number;\n colIndex?: number;\n cellValue?: any;\n inputValue?: number | string;\n}\n\n/**menuKey的枚举类型 */\nexport enum MenuKey {\n /** 空白无意义的key,用于占位 */\n EMPTY = '',\n COPY = 'copy',\n CUT = 'cut',\n PASTE = 'paste',\n INSERT_COLUMN_LEFT = 'insert_column_left',\n INSERT_COLUMN_RIGHT = 'insert_column_right',\n INSERT_ROW_ABOVE = 'insert_row_above',\n INSERT_ROW_BELOW = 'insert_row_below',\n DELETE_ROW = 'delete_row',\n DELETE_COLUMN = 'delete_column',\n FREEZE_TO_THIS_ROW = 'freeze_to_this_row',\n FREEZE_TO_THIS_COLUMN = 'freeze_to_this_column',\n FREEZE_TO_THIS_ROW_AND_COLUMN = 'freeze_to_this_row_and_column',\n UNFREEZE = 'unfreeze',\n MERGE_CELLS = 'merge_cells',\n UNMERGE_CELLS = 'unmerge_cells',\n HIDE_COLUMN = 'hide_column',\n SORT = 'sort'\n}\n\nexport interface MenuItem {\n text: string;\n menuKey: MenuKey | string;\n disabled?: boolean;\n shortcut?: string;\n iconName?: string;\n iconPlaceholder?: boolean; //如果没有iconName时 是否显示占位图标位置 让他与其他有图标的item对齐\n inputDefaultValue?: number;\n children?: (MenuItem | string)[];\n}\n\nexport type MenuItemOrSeparator = MenuItem | string;\n\nconst DEFAULT_MENU_ITEMS = {\n [MenuKey.COPY]: { text: '复制', menuKey: MenuKey.COPY, iconName: 'copy', shortcut: 'Ctrl+C' },\n [MenuKey.CUT]: { text: '剪切', menuKey: MenuKey.CUT, iconName: 'cut', shortcut: 'Ctrl+X' },\n [MenuKey.PASTE]: { text: '粘贴', menuKey: MenuKey.PASTE, iconName: 'paste', shortcut: 'Ctrl+V' },\n [MenuKey.INSERT_COLUMN_LEFT]: {\n text: '向左插入列数:',\n menuKey: MenuKey.INSERT_COLUMN_LEFT,\n iconName: 'left-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_COLUMN_RIGHT]: {\n text: '向右插入列数:',\n menuKey: MenuKey.INSERT_COLUMN_RIGHT,\n iconName: 'right-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_ROW_ABOVE]: {\n text: '向上插入行数:',\n menuKey: MenuKey.INSERT_ROW_ABOVE,\n iconName: 'up-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_ROW_BELOW]: {\n text: '向下插入行数:',\n menuKey: MenuKey.INSERT_ROW_BELOW,\n iconName: 'down-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.DELETE_ROW]: { text: '删除行', menuKey: MenuKey.DELETE_ROW },\n [MenuKey.DELETE_COLUMN]: { text: '删除列', menuKey: MenuKey.DELETE_COLUMN },\n [MenuKey.FREEZE_TO_THIS_ROW]: { text: '冻结到本行', menuKey: MenuKey.FREEZE_TO_THIS_ROW },\n [MenuKey.FREEZE_TO_THIS_COLUMN]: { text: '冻结到本列', menuKey: MenuKey.FREEZE_TO_THIS_COLUMN },\n [MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN]: { text: '冻结到本行本列', menuKey: MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN },\n [MenuKey.UNFREEZE]: { text: '取消冻结', menuKey: MenuKey.UNFREEZE },\n [MenuKey.MERGE_CELLS]: { text: '合并单元格', menuKey: MenuKey.MERGE_CELLS },\n [MenuKey.UNMERGE_CELLS]: { text: '取消合并单元格', menuKey: MenuKey.UNMERGE_CELLS },\n [MenuKey.HIDE_COLUMN]: { text: '隐藏列', menuKey: MenuKey.HIDE_COLUMN },\n [MenuKey.SORT]: { text: '排序', menuKey: MenuKey.SORT }\n};\n\nexport const DEFAULT_BODY_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n {\n text: '插入',\n menuKey: MenuKey.EMPTY,\n iconName: 'insert',\n children: [\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_ABOVE],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_BELOW],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT]\n ]\n },\n {\n text: '删除',\n menuKey: MenuKey.EMPTY,\n iconName: 'delete',\n children: [DEFAULT_MENU_ITEMS[MenuKey.DELETE_ROW], DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]]\n },\n {\n text: '冻结',\n menuKey: MenuKey.EMPTY,\n iconName: 'freeze',\n children: [\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_ROW],\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_COLUMN],\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN],\n DEFAULT_MENU_ITEMS[MenuKey.UNFREEZE]\n ]\n },\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.MERGE_CELLS], //鼠标右键所在单元格如果未被合并,则显示合并单元格\n DEFAULT_MENU_ITEMS[MenuKey.UNMERGE_CELLS] //鼠标右键所在单元格如果被合并了,则显示取消合并单元格\n // { text: '设置保护范围', menuKey: 'set_protection', iconName: 'protect' }\n];\nexport const DEFAULT_HEADER_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]\n];\nexport const DEFAULT_COLUMN_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]\n];\n\nexport const DEFAULT_ROW_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_ABOVE],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_BELOW],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_ROW]\n];\n\nexport const DEFAULT_CORNER_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE]\n];\n"]}
1
+ {"version":3,"sources":["../src/contextmenu/types.ts"],"names":[],"mappings":"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","file":"types.js","sourcesContent":["export interface MenuClickEventArgs {\n menuKey: MenuKey;\n menuText: string;\n rowIndex?: number;\n colIndex?: number;\n cellValue?: any;\n inputValue?: number | string;\n}\n\n/**menuKey的枚举类型 */\nexport enum MenuKey {\n /** 空白无意义的key,用于占位 */\n EMPTY = '',\n COPY = 'copy',\n CUT = 'cut',\n PASTE = 'paste',\n INSERT_COLUMN_LEFT = 'insert_column_left',\n INSERT_COLUMN_RIGHT = 'insert_column_right',\n INSERT_ROW_ABOVE = 'insert_row_above',\n INSERT_ROW_BELOW = 'insert_row_below',\n DELETE_ROW = 'delete_row',\n DELETE_COLUMN = 'delete_column',\n FREEZE_TO_THIS_ROW = 'freeze_to_this_row',\n FREEZE_TO_THIS_COLUMN = 'freeze_to_this_column',\n FREEZE_TO_THIS_ROW_AND_COLUMN = 'freeze_to_this_row_and_column',\n UNFREEZE = 'unfreeze',\n MERGE_CELLS = 'merge_cells',\n UNMERGE_CELLS = 'unmerge_cells',\n HIDE_COLUMN = 'hide_column',\n SORT = 'sort'\n}\n\n/** SVG 图标配置 */\nexport interface SvgIconConfig {\n svg: string;\n width?: number;\n height?: number;\n}\n\nexport type ClassName = string | string[];\n\nexport interface MenuItemClassConfig {\n item?: ClassName;\n itemDisabled?: ClassName;\n leftContainer?: ClassName;\n icon?: ClassName;\n text?: ClassName;\n input?: ClassName;\n rightContainer?: ClassName;\n arrow?: ClassName;\n shortcut?: ClassName;\n}\n\n/** 自定义图标渲染函数,接收菜单项信息返回一个 HTMLElement */\nexport type IconRenderFunction = (menuItem: MenuItem) => HTMLElement;\n\n/** 菜单项图标:支持内置名称字符串 / SVG 配置 / 渲染函数 */\nexport type MenuItemIcon = string | SvgIconConfig | IconRenderFunction;\n\nexport interface MenuItem {\n text: string;\n menuKey: MenuKey | string;\n disabled?: boolean;\n shortcut?: string;\n iconName?: string;\n /** 图标:内置名称字符串 / SVG 配置 / 自定义渲染函数 */\n customIcon?: MenuItemIcon;\n customClassName?: MenuItemClassConfig;\n iconPlaceholder?: boolean; //如果没有iconName时 是否显示占位图标位置 让他与其他有图标的item对齐\n inputDefaultValue?: number;\n children?: (MenuItem | string)[];\n}\n\nexport type MenuItemOrSeparator = MenuItem | string;\n\nconst DEFAULT_MENU_ITEMS = {\n [MenuKey.COPY]: { text: '复制', menuKey: MenuKey.COPY, iconName: 'copy', shortcut: 'Ctrl+C' },\n [MenuKey.CUT]: { text: '剪切', menuKey: MenuKey.CUT, iconName: 'cut', shortcut: 'Ctrl+X' },\n [MenuKey.PASTE]: { text: '粘贴', menuKey: MenuKey.PASTE, iconName: 'paste', shortcut: 'Ctrl+V' },\n [MenuKey.INSERT_COLUMN_LEFT]: {\n text: '向左插入列数:',\n menuKey: MenuKey.INSERT_COLUMN_LEFT,\n iconName: 'left-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_COLUMN_RIGHT]: {\n text: '向右插入列数:',\n menuKey: MenuKey.INSERT_COLUMN_RIGHT,\n iconName: 'right-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_ROW_ABOVE]: {\n text: '向上插入行数:',\n menuKey: MenuKey.INSERT_ROW_ABOVE,\n iconName: 'up-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_ROW_BELOW]: {\n text: '向下插入行数:',\n menuKey: MenuKey.INSERT_ROW_BELOW,\n iconName: 'down-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.DELETE_ROW]: { text: '删除行', menuKey: MenuKey.DELETE_ROW },\n [MenuKey.DELETE_COLUMN]: { text: '删除列', menuKey: MenuKey.DELETE_COLUMN },\n [MenuKey.FREEZE_TO_THIS_ROW]: { text: '冻结到本行', menuKey: MenuKey.FREEZE_TO_THIS_ROW },\n [MenuKey.FREEZE_TO_THIS_COLUMN]: { text: '冻结到本列', menuKey: MenuKey.FREEZE_TO_THIS_COLUMN },\n [MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN]: { text: '冻结到本行本列', menuKey: MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN },\n [MenuKey.UNFREEZE]: { text: '取消冻结', menuKey: MenuKey.UNFREEZE },\n [MenuKey.MERGE_CELLS]: { text: '合并单元格', menuKey: MenuKey.MERGE_CELLS },\n [MenuKey.UNMERGE_CELLS]: { text: '取消合并单元格', menuKey: MenuKey.UNMERGE_CELLS },\n [MenuKey.HIDE_COLUMN]: { text: '隐藏列', menuKey: MenuKey.HIDE_COLUMN },\n [MenuKey.SORT]: { text: '排序', menuKey: MenuKey.SORT }\n};\n\nexport const DEFAULT_BODY_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n {\n text: '插入',\n menuKey: MenuKey.EMPTY,\n iconName: 'insert',\n children: [\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_ABOVE],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_BELOW],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT]\n ]\n },\n {\n text: '删除',\n menuKey: MenuKey.EMPTY,\n iconName: 'delete',\n children: [DEFAULT_MENU_ITEMS[MenuKey.DELETE_ROW], DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]]\n },\n {\n text: '冻结',\n menuKey: MenuKey.EMPTY,\n iconName: 'freeze',\n children: [\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_ROW],\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_COLUMN],\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN],\n DEFAULT_MENU_ITEMS[MenuKey.UNFREEZE]\n ]\n },\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.MERGE_CELLS], //鼠标右键所在单元格如果未被合并,则显示合并单元格\n DEFAULT_MENU_ITEMS[MenuKey.UNMERGE_CELLS] //鼠标右键所在单元格如果被合并了,则显示取消合并单元格\n // { text: '设置保护范围', menuKey: 'set_protection', iconName: 'protect' }\n];\nexport const DEFAULT_HEADER_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]\n];\nexport const DEFAULT_COLUMN_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]\n];\n\nexport const DEFAULT_ROW_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_ABOVE],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_BELOW],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_ROW]\n];\n\nexport const DEFAULT_CORNER_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE]\n];\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vtable-plugins",
3
- "version": "1.26.1-alpha.0",
3
+ "version": "1.26.1",
4
4
  "description": "The search util of VTable",
5
5
  "author": {
6
6
  "name": "VisActor",
@@ -43,8 +43,8 @@
43
43
  "@types/file-saver": "2.0.7"
44
44
  },
45
45
  "peerDependencies": {
46
- "@visactor/vtable": "1.26.1-alpha.0",
47
- "@visactor/vtable-gantt": "1.26.1-alpha.0"
46
+ "@visactor/vtable": "1.26.1",
47
+ "@visactor/vtable-gantt": "1.26.1"
48
48
  },
49
49
  "peerDependenciesMeta": {
50
50
  "@visactor/vtable-gantt": {
@@ -54,9 +54,6 @@
54
54
  "devDependencies": {
55
55
  "cross-env": "^7.0.3",
56
56
  "increase-memory-limit": "^1.0.7",
57
- "@visactor/vtable": "1.26.1-alpha.0",
58
- "@visactor/vtable-editors": "1.26.1-alpha.0",
59
- "@visactor/vtable-gantt": "1.26.1-alpha.0",
60
57
  "@visactor/vchart": "2.0.13-alpha.10",
61
58
  "@rushstack/eslint-patch": "~1.1.4",
62
59
  "react": "18.2.0",
@@ -99,9 +96,12 @@
99
96
  "@types/react-is": "^17.0.3",
100
97
  "rollup-plugin-node-resolve": "5.2.0",
101
98
  "@types/lodash": "4.14.182",
102
- "@internal/bundler": "0.0.1",
99
+ "@visactor/vtable-gantt": "1.26.1",
103
100
  "@internal/eslint-config": "0.0.1",
104
- "@internal/ts-config": "0.0.1"
101
+ "@internal/ts-config": "0.0.1",
102
+ "@internal/bundler": "0.0.1",
103
+ "@visactor/vtable": "1.26.1",
104
+ "@visactor/vtable-editors": "1.26.1"
105
105
  },
106
106
  "scripts": {
107
107
  "demo": "vite ./demo",