@plait/core 0.11.0 → 0.12.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.
- package/esm2020/utils/index.mjs +2 -1
- package/esm2020/utils/to-image.mjs +106 -0
- package/fesm2015/plait-core.mjs +108 -1
- package/fesm2015/plait-core.mjs.map +1 -1
- package/fesm2020/plait-core.mjs +105 -1
- package/fesm2020/plait-core.mjs.map +1 -1
- package/package.json +1 -1
- package/utils/index.d.ts +1 -0
- package/utils/to-image.d.ts +10 -0
package/fesm2020/plait-core.mjs
CHANGED
|
@@ -1323,6 +1323,110 @@ const cacheMovingElements = (board, elements) => {
|
|
|
1323
1323
|
BOARD_TO_MOVING_ELEMENT.set(board, elements);
|
|
1324
1324
|
};
|
|
1325
1325
|
|
|
1326
|
+
function cloneCSSStyle(nativeNode, clonedNode) {
|
|
1327
|
+
const targetStyle = clonedNode.style;
|
|
1328
|
+
if (!targetStyle) {
|
|
1329
|
+
return;
|
|
1330
|
+
}
|
|
1331
|
+
const sourceStyle = window.getComputedStyle(nativeNode);
|
|
1332
|
+
if (sourceStyle.cssText) {
|
|
1333
|
+
targetStyle.cssText = sourceStyle.cssText;
|
|
1334
|
+
targetStyle.transformOrigin = sourceStyle.transformOrigin;
|
|
1335
|
+
}
|
|
1336
|
+
else {
|
|
1337
|
+
Array.from(sourceStyle).forEach(name => {
|
|
1338
|
+
let value = sourceStyle.getPropertyValue(name);
|
|
1339
|
+
targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));
|
|
1340
|
+
});
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
function createCanvas(width, height, fillStyle) {
|
|
1344
|
+
const canvas = document.createElement('canvas');
|
|
1345
|
+
const ctx = canvas.getContext('2d');
|
|
1346
|
+
canvas.width = width;
|
|
1347
|
+
canvas.height = height;
|
|
1348
|
+
canvas.style.width = `${width}px`;
|
|
1349
|
+
canvas.style.height = `${height}px`;
|
|
1350
|
+
ctx.strokeStyle = '#ffffff';
|
|
1351
|
+
ctx.fillStyle = fillStyle;
|
|
1352
|
+
ctx.fillRect(0, 0, width, height);
|
|
1353
|
+
return {
|
|
1354
|
+
canvas,
|
|
1355
|
+
ctx
|
|
1356
|
+
};
|
|
1357
|
+
}
|
|
1358
|
+
function isElementNode(node) {
|
|
1359
|
+
return node.nodeType === Node.ELEMENT_NODE;
|
|
1360
|
+
}
|
|
1361
|
+
function cloneSvg(board, options) {
|
|
1362
|
+
const elementHostBox = getRectangleByElements(board, board.children, true);
|
|
1363
|
+
const { width, height, x, y } = elementHostBox;
|
|
1364
|
+
const { padding = 4, inlineStyleClassNames } = options;
|
|
1365
|
+
const sourceSvg = PlaitBoard.getHost(board);
|
|
1366
|
+
const cloneSvgElement = sourceSvg.cloneNode(true);
|
|
1367
|
+
cloneSvgElement.style.width = `${width}px`;
|
|
1368
|
+
cloneSvgElement.style.height = `${height}px`;
|
|
1369
|
+
cloneSvgElement.style.backgroundColor = '';
|
|
1370
|
+
cloneSvgElement.setAttribute('width', `${width}`);
|
|
1371
|
+
cloneSvgElement.setAttribute('height', `${height}`);
|
|
1372
|
+
cloneSvgElement.setAttribute('viewBox', [x - padding, y - padding, width + 2 * padding, height + 2 * padding].join(','));
|
|
1373
|
+
if (inlineStyleClassNames) {
|
|
1374
|
+
const sourceNodes = Array.from(sourceSvg.querySelectorAll(inlineStyleClassNames));
|
|
1375
|
+
const cloneNodes = Array.from(cloneSvgElement.querySelectorAll(inlineStyleClassNames));
|
|
1376
|
+
sourceNodes.forEach((node, index) => {
|
|
1377
|
+
const cloneNode = cloneNodes[index];
|
|
1378
|
+
const childElements = Array.from(node.querySelectorAll('*')).filter(isElementNode);
|
|
1379
|
+
const cloneChildElements = Array.from(cloneNode.querySelectorAll('*')).filter(isElementNode);
|
|
1380
|
+
sourceNodes.push(...childElements);
|
|
1381
|
+
cloneNodes.push(...cloneChildElements);
|
|
1382
|
+
});
|
|
1383
|
+
sourceNodes.forEach((node, index) => {
|
|
1384
|
+
const cloneNode = cloneNodes[index];
|
|
1385
|
+
cloneCSSStyle(node, cloneNode);
|
|
1386
|
+
});
|
|
1387
|
+
}
|
|
1388
|
+
return cloneSvgElement;
|
|
1389
|
+
}
|
|
1390
|
+
function loadImage(src) {
|
|
1391
|
+
return new Promise((resolve, reject) => {
|
|
1392
|
+
const img = new Image();
|
|
1393
|
+
img.onload = () => resolve(img);
|
|
1394
|
+
img.onerror = () => reject(new Error('Failed to load image'));
|
|
1395
|
+
img.src = src;
|
|
1396
|
+
});
|
|
1397
|
+
}
|
|
1398
|
+
async function toImage(board, options) {
|
|
1399
|
+
if (!board) {
|
|
1400
|
+
return undefined;
|
|
1401
|
+
}
|
|
1402
|
+
const elementHostBox = getRectangleByElements(board, board.children, true);
|
|
1403
|
+
const { ratio = 2, fillStyle = 'transparent' } = options;
|
|
1404
|
+
const { width, height } = elementHostBox;
|
|
1405
|
+
const ratioWidth = width * ratio;
|
|
1406
|
+
const ratioHeight = height * ratio;
|
|
1407
|
+
const cloneSvgElement = cloneSvg(board, options);
|
|
1408
|
+
const { canvas, ctx } = createCanvas(ratioWidth, ratioHeight, fillStyle);
|
|
1409
|
+
const svgStr = new XMLSerializer().serializeToString(cloneSvgElement);
|
|
1410
|
+
const imgSrc = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgStr)}`;
|
|
1411
|
+
try {
|
|
1412
|
+
const img = await loadImage(imgSrc);
|
|
1413
|
+
ctx.drawImage(img, 0, 0, ratioWidth, ratioHeight);
|
|
1414
|
+
const url = canvas.toDataURL('image/png');
|
|
1415
|
+
return url;
|
|
1416
|
+
}
|
|
1417
|
+
catch (error) {
|
|
1418
|
+
console.error('Error converting SVG to image:', error);
|
|
1419
|
+
return undefined;
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
function downloadImage(url, name) {
|
|
1423
|
+
const a = document.createElement('a');
|
|
1424
|
+
a.href = url;
|
|
1425
|
+
a.download = name;
|
|
1426
|
+
a.click();
|
|
1427
|
+
a.remove();
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1326
1430
|
const PlaitElement = {
|
|
1327
1431
|
isRootElement(value) {
|
|
1328
1432
|
const parent = NODE_TO_PARENT.get(value);
|
|
@@ -2848,5 +2952,5 @@ const clearNodeWeakMap = (object) => {
|
|
|
2848
2952
|
* Generated bundle index. Do not edit.
|
|
2849
2953
|
*/
|
|
2850
2954
|
|
|
2851
|
-
export { BOARD_TO_COMPONENT, BOARD_TO_ELEMENT_HOST, BOARD_TO_HOST, BOARD_TO_IS_SELECTION_MOVING, BOARD_TO_MOVING_ELEMENT, BOARD_TO_MOVING_POINT, BOARD_TO_ON_CHANGE, BOARD_TO_ROUGH_SVG, BOARD_TO_SELECTED_ELEMENT, BOARD_TO_TEMPORARY_ELEMENTS, BOARD_TO_VIEWPORT_ORIGINATION, BoardTransforms, CLIP_BOARD_FORMAT_KEY, ColorfulThemeColor, DarkThemeColor, DefaultThemeColor, ELEMENT_TO_COMPONENT, FLUSHING, IS_APPLE, IS_BOARD_CACHE, IS_CHROME, IS_CHROME_LEGACY, IS_EDGE_LEGACY, IS_FIREFOX, IS_IOS, IS_SAFARI, IS_TEXT_EDITABLE, MAX_RADIUS, MERGING, NODE_TO_INDEX, NODE_TO_PARENT, NS, PATH_REFS, POINTER_BUTTON, Path, PlaitBoard, PlaitBoardComponent, PlaitChildrenElement, PlaitElement, PlaitElementComponent, PlaitHistoryBoard, PlaitIslandBaseComponent, PlaitModule, PlaitNode, PlaitOperation, PlaitPluginElementComponent, PlaitPluginKey, PlaitPointerType, Point, RectangleClient, RetroThemeColor, SAVING, SCROLL_BAR_WIDTH, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, Selection, SoftThemeColor, StarryThemeColor, ThemeColorMode, ThemeColors, Transforms, Viewport, addMovingElements, addSelectedElement, arrowPoints, cacheMovingElements, cacheSelectedElements, clampZoomLevel, clearNodeWeakMap, clearSelectedElement, clearSelectionMoving, clearViewportOrigination, createForeignObject, createG, createPath, createSVG, createSelectionOuterG, createTestingBoard, createText, debounce, deleteTemporaryElements, depthFirstRecursion, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, distanceBetweenPointAndSegment, drawAbstractRoundRectangle, drawArrow, drawCircle, drawLine, drawLinearPath, drawRoundRectangle, fakeNodeWeakMap, getBoardRectangle, getElementHostBBox, getHitElementOfRoot, getHitElements, getMovingElements, getRealScrollBarWidth, getRectangleByElements, getSelectedElements, getTemporaryElements, getViewBox, getViewBoxCenterPoint, getViewportContainerRect, getViewportOrigination, hasBeforeContextChange, hasInputOrTextareaTarget, hasOnBoardChange, hasOnContextChanged, hotkeys, idCreator, initializeViewBox, initializeViewportContainer, initializeViewportOffset, inverse, isDOMElement, isDOMNode, isFromScrolling, isFromViewportChange, isHitElements, isInPlaitBoard, isMainPointer, isNullOrUndefined, isSecondaryPointer, isSelectedElement, isSelectionMoving, isSetViewportOperation, normalizePoint, removeMovingElements, removeSelectedElement, rotate, scrollToRectangle, setIsFromScrolling, setIsFromViewportChange, setSVGViewBox, setSelectionMoving, shouldClear, shouldMerge, shouldSave, throttleRAF, toPoint, transformPoint, transformPoints, updateForeignObject, updateViewportContainerScroll, updateViewportOffset, updateViewportOrigination, withMoving, withOptions, withSelection };
|
|
2955
|
+
export { BOARD_TO_COMPONENT, BOARD_TO_ELEMENT_HOST, BOARD_TO_HOST, BOARD_TO_IS_SELECTION_MOVING, BOARD_TO_MOVING_ELEMENT, BOARD_TO_MOVING_POINT, BOARD_TO_ON_CHANGE, BOARD_TO_ROUGH_SVG, BOARD_TO_SELECTED_ELEMENT, BOARD_TO_TEMPORARY_ELEMENTS, BOARD_TO_VIEWPORT_ORIGINATION, BoardTransforms, CLIP_BOARD_FORMAT_KEY, ColorfulThemeColor, DarkThemeColor, DefaultThemeColor, ELEMENT_TO_COMPONENT, FLUSHING, IS_APPLE, IS_BOARD_CACHE, IS_CHROME, IS_CHROME_LEGACY, IS_EDGE_LEGACY, IS_FIREFOX, IS_IOS, IS_SAFARI, IS_TEXT_EDITABLE, MAX_RADIUS, MERGING, NODE_TO_INDEX, NODE_TO_PARENT, NS, PATH_REFS, POINTER_BUTTON, Path, PlaitBoard, PlaitBoardComponent, PlaitChildrenElement, PlaitElement, PlaitElementComponent, PlaitHistoryBoard, PlaitIslandBaseComponent, PlaitModule, PlaitNode, PlaitOperation, PlaitPluginElementComponent, PlaitPluginKey, PlaitPointerType, Point, RectangleClient, RetroThemeColor, SAVING, SCROLL_BAR_WIDTH, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, Selection, SoftThemeColor, StarryThemeColor, ThemeColorMode, ThemeColors, Transforms, Viewport, addMovingElements, addSelectedElement, arrowPoints, cacheMovingElements, cacheSelectedElements, clampZoomLevel, clearNodeWeakMap, clearSelectedElement, clearSelectionMoving, clearViewportOrigination, createForeignObject, createG, createPath, createSVG, createSelectionOuterG, createTestingBoard, createText, debounce, deleteTemporaryElements, depthFirstRecursion, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, distanceBetweenPointAndSegment, downloadImage, drawAbstractRoundRectangle, drawArrow, drawCircle, drawLine, drawLinearPath, drawRoundRectangle, fakeNodeWeakMap, getBoardRectangle, getElementHostBBox, getHitElementOfRoot, getHitElements, getMovingElements, getRealScrollBarWidth, getRectangleByElements, getSelectedElements, getTemporaryElements, getViewBox, getViewBoxCenterPoint, getViewportContainerRect, getViewportOrigination, hasBeforeContextChange, hasInputOrTextareaTarget, hasOnBoardChange, hasOnContextChanged, hotkeys, idCreator, initializeViewBox, initializeViewportContainer, initializeViewportOffset, inverse, isDOMElement, isDOMNode, isFromScrolling, isFromViewportChange, isHitElements, isInPlaitBoard, isMainPointer, isNullOrUndefined, isSecondaryPointer, isSelectedElement, isSelectionMoving, isSetViewportOperation, normalizePoint, removeMovingElements, removeSelectedElement, rotate, scrollToRectangle, setIsFromScrolling, setIsFromViewportChange, setSVGViewBox, setSelectionMoving, shouldClear, shouldMerge, shouldSave, throttleRAF, toImage, toPoint, transformPoint, transformPoints, updateForeignObject, updateViewportContainerScroll, updateViewportOffset, updateViewportOrigination, withMoving, withOptions, withSelection };
|
|
2852
2956
|
//# sourceMappingURL=plait-core.mjs.map
|