@svgedit/svgcanvas 7.2.0 → 7.2.2
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/CHANGES.md +8 -0
- package/core/coords.js +3 -3
- package/core/elem-get-set.js +80 -90
- package/core/event.js +5 -5
- package/core/math.js +90 -52
- package/core/path-actions.js +2 -2
- package/core/path.js +2 -2
- package/core/recalculate.js +8 -9
- package/core/select.js +3 -3
- package/core/selected-elem.js +6 -5
- package/core/selection.js +3 -2
- package/core/svg-exec.js +29 -39
- package/core/undo.js +5 -5
- package/core/utilities.js +449 -354
- package/dist/svgcanvas.js +4924 -6331
- package/dist/svgcanvas.js.map +1 -1
- package/package.json +1 -1
- package/publish.md +6 -0
- package/rollup.config.mjs +3 -2
package/core/recalculate.js
CHANGED
|
@@ -11,7 +11,7 @@ import { BatchCommand, ChangeElementCommand } from './history.js'
|
|
|
11
11
|
import { remapElement } from './coords.js'
|
|
12
12
|
import {
|
|
13
13
|
isIdentity, matrixMultiply, transformPoint, transformListToTransform,
|
|
14
|
-
hasMatrixTransform
|
|
14
|
+
hasMatrixTransform, getTransformList
|
|
15
15
|
} from './math.js'
|
|
16
16
|
import {
|
|
17
17
|
mergeDeep
|
|
@@ -55,7 +55,7 @@ export const init = (canvas) => {
|
|
|
55
55
|
*/
|
|
56
56
|
export const updateClipPath = (attr, tx, ty) => {
|
|
57
57
|
const path = getRefElem(attr).firstChild
|
|
58
|
-
const cpXform = path
|
|
58
|
+
const cpXform = getTransformList(path)
|
|
59
59
|
const newxlate = svgCanvas.getSvgRoot().createSVGTransform()
|
|
60
60
|
newxlate.setTranslate(tx, ty)
|
|
61
61
|
|
|
@@ -75,7 +75,7 @@ export const recalculateDimensions = (selected) => {
|
|
|
75
75
|
if (!selected) return null
|
|
76
76
|
const svgroot = svgCanvas.getSvgRoot()
|
|
77
77
|
const dataStorage = svgCanvas.getDataStorage()
|
|
78
|
-
const tlist = selected
|
|
78
|
+
const tlist = getTransformList(selected)
|
|
79
79
|
// remove any unnecessary transforms
|
|
80
80
|
if (tlist?.numberOfItems > 0) {
|
|
81
81
|
let k = tlist.numberOfItems
|
|
@@ -113,7 +113,6 @@ export const recalculateDimensions = (selected) => {
|
|
|
113
113
|
selected.setAttribute('transform', '')
|
|
114
114
|
// However, this still next line currently doesn't work at all in Chrome
|
|
115
115
|
selected.removeAttribute('transform')
|
|
116
|
-
// selected.transform.baseVal.clear(); // Didn't help for Chrome bug
|
|
117
116
|
return null
|
|
118
117
|
}
|
|
119
118
|
|
|
@@ -296,7 +295,7 @@ export const recalculateDimensions = (selected) => {
|
|
|
296
295
|
tx = 0
|
|
297
296
|
ty = 0
|
|
298
297
|
if (child.nodeType === 1) {
|
|
299
|
-
const childTlist = child
|
|
298
|
+
const childTlist = getTransformList(child)
|
|
300
299
|
|
|
301
300
|
// some children might not have a transform (<metadata>, <defs>, etc)
|
|
302
301
|
if (!childTlist) { continue }
|
|
@@ -413,7 +412,7 @@ export const recalculateDimensions = (selected) => {
|
|
|
413
412
|
oldStartTransform = svgCanvas.getStartTransform()
|
|
414
413
|
svgCanvas.setStartTransform(child.getAttribute('transform'))
|
|
415
414
|
|
|
416
|
-
const childTlist = child
|
|
415
|
+
const childTlist = getTransformList(child)
|
|
417
416
|
// some children might not have a transform (<metadata>, <defs>, etc)
|
|
418
417
|
if (childTlist) {
|
|
419
418
|
const newxlate = svgroot.createSVGTransform()
|
|
@@ -460,7 +459,7 @@ export const recalculateDimensions = (selected) => {
|
|
|
460
459
|
if (child.nodeType === 1) {
|
|
461
460
|
oldStartTransform = svgCanvas.getStartTransform()
|
|
462
461
|
svgCanvas.setStartTransform(child.getAttribute('transform'))
|
|
463
|
-
const childTlist = child
|
|
462
|
+
const childTlist = getTransformList(child)
|
|
464
463
|
|
|
465
464
|
if (!childTlist) { continue }
|
|
466
465
|
|
|
@@ -544,7 +543,7 @@ export const recalculateDimensions = (selected) => {
|
|
|
544
543
|
if (child.nodeType === 1) {
|
|
545
544
|
oldStartTransform = svgCanvas.getStartTransform()
|
|
546
545
|
svgCanvas.setStartTransform(child.getAttribute('transform'))
|
|
547
|
-
const childTlist = child
|
|
546
|
+
const childTlist = getTransformList(child)
|
|
548
547
|
const newxlate = svgroot.createSVGTransform()
|
|
549
548
|
newxlate.setTranslate(tx, ty)
|
|
550
549
|
if (childTlist.numberOfItems) {
|
|
@@ -629,7 +628,7 @@ export const recalculateDimensions = (selected) => {
|
|
|
629
628
|
if (attrVal === 'userSpaceOnUse') {
|
|
630
629
|
// Update the userSpaceOnUse element
|
|
631
630
|
m = transformListToTransform(tlist).matrix
|
|
632
|
-
const gtlist = paint
|
|
631
|
+
const gtlist = getTransformList(paint)
|
|
633
632
|
const gmatrix = transformListToTransform(gtlist).matrix
|
|
634
633
|
m = matrixMultiply(m, gmatrix)
|
|
635
634
|
const mStr = 'matrix(' + [m.a, m.b, m.c, m.d, m.e, m.f].join(',') + ')'
|
package/core/select.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import { isWebkit } from '../common/browser.js'
|
|
10
10
|
import { getRotationAngle, getBBox, getStrokedBBox } from './utilities.js'
|
|
11
|
-
import { transformListToTransform, transformBox, transformPoint, matrixMultiply } from './math.js'
|
|
11
|
+
import { transformListToTransform, transformBox, transformPoint, matrixMultiply, getTransformList } from './math.js'
|
|
12
12
|
import { NS } from './namespaces'
|
|
13
13
|
|
|
14
14
|
let svgCanvas
|
|
@@ -130,14 +130,14 @@ export class Selector {
|
|
|
130
130
|
while (currentElt.parentNode) {
|
|
131
131
|
if (currentElt.parentNode && currentElt.parentNode.tagName === 'g' && currentElt.parentNode.transform) {
|
|
132
132
|
if (currentElt.parentNode.transform.baseVal.numberOfItems) {
|
|
133
|
-
parentTransformationMatrix = matrixMultiply(transformListToTransform(selected.parentNode
|
|
133
|
+
parentTransformationMatrix = matrixMultiply(transformListToTransform(getTransformList(selected.parentNode)).matrix, parentTransformationMatrix)
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
currentElt = currentElt.parentNode
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
// loop and transform our bounding box until we reach our first rotation
|
|
140
|
-
const tlist = selected
|
|
140
|
+
const tlist = getTransformList(selected)
|
|
141
141
|
|
|
142
142
|
// combines the parent transformation with that of the selected element if necessary
|
|
143
143
|
const m = parentTransformationMatrix ? matrixMultiply(parentTransformationMatrix, transformListToTransform(tlist).matrix) : transformListToTransform(tlist).matrix
|
package/core/selected-elem.js
CHANGED
|
@@ -26,7 +26,8 @@ import {
|
|
|
26
26
|
import {
|
|
27
27
|
transformPoint,
|
|
28
28
|
matrixMultiply,
|
|
29
|
-
transformListToTransform
|
|
29
|
+
transformListToTransform,
|
|
30
|
+
getTransformList
|
|
30
31
|
} from './math.js'
|
|
31
32
|
import { recalculateDimensions } from './recalculate.js'
|
|
32
33
|
import { isGecko } from '../common/browser.js'
|
|
@@ -207,7 +208,7 @@ const moveSelectedElements = (dx, dy, undoable = true) => {
|
|
|
207
208
|
selectedElements.forEach((selected, i) => {
|
|
208
209
|
if (selected) {
|
|
209
210
|
const xform = svgCanvas.getSvgRoot().createSVGTransform()
|
|
210
|
-
const tlist = selected
|
|
211
|
+
const tlist = getTransformList(selected)
|
|
211
212
|
|
|
212
213
|
// dx and dy could be arrays
|
|
213
214
|
if (Array.isArray(dx)) {
|
|
@@ -724,7 +725,7 @@ const pushGroupProperty = (g, undoable) => {
|
|
|
724
725
|
const len = children.length
|
|
725
726
|
const xform = g.getAttribute('transform')
|
|
726
727
|
|
|
727
|
-
const glist = g
|
|
728
|
+
const glist = getTransformList(g)
|
|
728
729
|
const m = transformListToTransform(glist).matrix
|
|
729
730
|
|
|
730
731
|
const batchCmd = new BatchCommand('Push group properties')
|
|
@@ -810,7 +811,7 @@ const pushGroupProperty = (g, undoable) => {
|
|
|
810
811
|
}
|
|
811
812
|
}
|
|
812
813
|
|
|
813
|
-
let chtlist = elem
|
|
814
|
+
let chtlist = getTransformList(elem)
|
|
814
815
|
|
|
815
816
|
// Don't process gradient transforms
|
|
816
817
|
if (elem.tagName.includes('Gradient')) {
|
|
@@ -963,7 +964,7 @@ const convertToGroup = elem => {
|
|
|
963
964
|
}
|
|
964
965
|
dataStorage.remove(elem, 'gsvg')
|
|
965
966
|
|
|
966
|
-
const tlist = elem
|
|
967
|
+
const tlist = getTransformList(elem)
|
|
967
968
|
const xform = svgCanvas.getSvgRoot().createSVGTransform()
|
|
968
969
|
xform.setTranslate(pt.x, pt.y)
|
|
969
970
|
tlist.appendItem(xform)
|
package/core/selection.js
CHANGED
|
@@ -13,7 +13,8 @@ import {
|
|
|
13
13
|
import {
|
|
14
14
|
transformPoint,
|
|
15
15
|
transformListToTransform,
|
|
16
|
-
rectsIntersect
|
|
16
|
+
rectsIntersect,
|
|
17
|
+
getTransformList
|
|
17
18
|
} from './math.js'
|
|
18
19
|
import * as hstry from './history.js'
|
|
19
20
|
import { getClosest } from '../common/util.js'
|
|
@@ -392,7 +393,7 @@ const setRotationAngle = (val, preventUndo) => {
|
|
|
392
393
|
const bbox = getBBox(elem)
|
|
393
394
|
const cx = bbox.x + bbox.width / 2
|
|
394
395
|
const cy = bbox.y + bbox.height / 2
|
|
395
|
-
const tlist = elem
|
|
396
|
+
const tlist = getTransformList(elem)
|
|
396
397
|
|
|
397
398
|
// only remove the real rotational transform if present (i.e. at index=0)
|
|
398
399
|
if (tlist.numberOfItems > 0) {
|
package/core/svg-exec.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* @copyright 2011 Jeff Schiller
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { jsPDF as JsPDF } from 'jspdf
|
|
9
|
-
import 'svg2pdf.js
|
|
8
|
+
import { jsPDF as JsPDF } from 'jspdf'
|
|
9
|
+
import 'svg2pdf.js'
|
|
10
10
|
import html2canvas from 'html2canvas'
|
|
11
11
|
import * as hstry from './history.js'
|
|
12
12
|
import {
|
|
@@ -23,7 +23,11 @@ import {
|
|
|
23
23
|
getBBox as utilsGetBBox,
|
|
24
24
|
hashCode
|
|
25
25
|
} from './utilities.js'
|
|
26
|
-
import {
|
|
26
|
+
import {
|
|
27
|
+
transformPoint,
|
|
28
|
+
transformListToTransform,
|
|
29
|
+
getTransformList
|
|
30
|
+
} from './math.js'
|
|
27
31
|
import { convertUnit, shortFloat, convertToNum } from './units.js'
|
|
28
32
|
import { isGecko, isChrome, isWebkit } from '../common/browser.js'
|
|
29
33
|
import * as pathModule from './path.js'
|
|
@@ -90,7 +94,7 @@ const svgCanvasToString = () => {
|
|
|
90
94
|
|
|
91
95
|
// Unwrap gsvg if it has no special attributes (only id and style)
|
|
92
96
|
const gsvgElems = svgCanvas.getSvgContent().querySelectorAll('g[data-gsvg]')
|
|
93
|
-
Array.prototype.forEach.call(gsvgElems,
|
|
97
|
+
Array.prototype.forEach.call(gsvgElems, element => {
|
|
94
98
|
const attrs = element.attributes
|
|
95
99
|
let len = attrs.length
|
|
96
100
|
for (let i = 0; i < len; i++) {
|
|
@@ -109,7 +113,7 @@ const svgCanvasToString = () => {
|
|
|
109
113
|
|
|
110
114
|
// Rewrap gsvg
|
|
111
115
|
if (nakedSvgs.length) {
|
|
112
|
-
Array.prototype.forEach.call(nakedSvgs,
|
|
116
|
+
Array.prototype.forEach.call(nakedSvgs, el => {
|
|
113
117
|
svgCanvas.groupSvgElem(el)
|
|
114
118
|
})
|
|
115
119
|
}
|
|
@@ -162,26 +166,14 @@ const svgToString = (elem, indent) => {
|
|
|
162
166
|
// }
|
|
163
167
|
if (curConfig.dynamicOutput) {
|
|
164
168
|
vb = elem.getAttribute('viewBox')
|
|
165
|
-
out.push(
|
|
166
|
-
' viewBox="' +
|
|
167
|
-
vb +
|
|
168
|
-
'" xmlns="' +
|
|
169
|
-
NS.SVG +
|
|
170
|
-
'"'
|
|
171
|
-
)
|
|
169
|
+
out.push(' viewBox="' + vb + '" xmlns="' + NS.SVG + '"')
|
|
172
170
|
} else {
|
|
173
171
|
if (unit !== 'px') {
|
|
174
172
|
res.w = convertUnit(res.w, unit) + unit
|
|
175
173
|
res.h = convertUnit(res.h, unit) + unit
|
|
176
174
|
}
|
|
177
175
|
out.push(
|
|
178
|
-
' width="' +
|
|
179
|
-
res.w +
|
|
180
|
-
'" height="' +
|
|
181
|
-
res.h +
|
|
182
|
-
'" xmlns="' +
|
|
183
|
-
NS.SVG +
|
|
184
|
-
'"'
|
|
176
|
+
' width="' + res.w + '" height="' + res.h + '" xmlns="' + NS.SVG + '"'
|
|
185
177
|
)
|
|
186
178
|
}
|
|
187
179
|
|
|
@@ -191,7 +183,7 @@ const svgToString = (elem, indent) => {
|
|
|
191
183
|
const csElements = elem.querySelectorAll('*')
|
|
192
184
|
const cElements = Array.prototype.slice.call(csElements)
|
|
193
185
|
cElements.push(elem)
|
|
194
|
-
Array.prototype.forEach.call(cElements,
|
|
186
|
+
Array.prototype.forEach.call(cElements, el => {
|
|
195
187
|
// const el = this;
|
|
196
188
|
// for some elements have no attribute
|
|
197
189
|
const uri = el.namespaceURI
|
|
@@ -441,7 +433,7 @@ const setSvgString = (xmlString, preventUndo) => {
|
|
|
441
433
|
|
|
442
434
|
// change image href vals if possible
|
|
443
435
|
const elements = content.querySelectorAll('image')
|
|
444
|
-
Array.prototype.forEach.call(elements,
|
|
436
|
+
Array.prototype.forEach.call(elements, image => {
|
|
445
437
|
preventClickDefault(image)
|
|
446
438
|
const val = svgCanvas.getHref(image)
|
|
447
439
|
if (val) {
|
|
@@ -487,7 +479,7 @@ const setSvgString = (xmlString, preventUndo) => {
|
|
|
487
479
|
|
|
488
480
|
// Wrap child SVGs in group elements
|
|
489
481
|
const svgElements = content.querySelectorAll('svg')
|
|
490
|
-
Array.prototype.forEach.call(svgElements,
|
|
482
|
+
Array.prototype.forEach.call(svgElements, element => {
|
|
491
483
|
// Skip if it's in a <defs>
|
|
492
484
|
if (getClosest(element.parentNode, 'defs')) {
|
|
493
485
|
return
|
|
@@ -511,7 +503,7 @@ const setSvgString = (xmlString, preventUndo) => {
|
|
|
511
503
|
const findElems = content.querySelectorAll(
|
|
512
504
|
'linearGradient, radialGradient, pattern'
|
|
513
505
|
)
|
|
514
|
-
Array.prototype.forEach.call(findElems,
|
|
506
|
+
Array.prototype.forEach.call(findElems, ele => {
|
|
515
507
|
svgDefs.appendChild(ele)
|
|
516
508
|
})
|
|
517
509
|
}
|
|
@@ -538,7 +530,7 @@ const setSvgString = (xmlString, preventUndo) => {
|
|
|
538
530
|
attrs.height = vb[3]
|
|
539
531
|
// handle content that doesn't have a viewBox
|
|
540
532
|
} else {
|
|
541
|
-
;['width', 'height'].forEach(
|
|
533
|
+
;['width', 'height'].forEach(dim => {
|
|
542
534
|
// Set to 100 if not given
|
|
543
535
|
const val = content.getAttribute(dim) || '100%'
|
|
544
536
|
if (String(val).substr(-1) === '%') {
|
|
@@ -555,9 +547,9 @@ const setSvgString = (xmlString, preventUndo) => {
|
|
|
555
547
|
|
|
556
548
|
// Give ID for any visible layer children missing one
|
|
557
549
|
const chiElems = content.children
|
|
558
|
-
Array.prototype.forEach.call(chiElems,
|
|
550
|
+
Array.prototype.forEach.call(chiElems, chiElem => {
|
|
559
551
|
const visElems = chiElem.querySelectorAll(svgCanvas.getVisElems())
|
|
560
|
-
Array.prototype.forEach.call(visElems,
|
|
552
|
+
Array.prototype.forEach.call(visElems, elem => {
|
|
561
553
|
if (!elem.id) {
|
|
562
554
|
elem.id = svgCanvas.getNextId()
|
|
563
555
|
}
|
|
@@ -696,7 +688,7 @@ const importSvgString = (xmlString, preserveDimension) => {
|
|
|
696
688
|
const elements = svg.querySelectorAll(
|
|
697
689
|
'linearGradient, radialGradient, pattern'
|
|
698
690
|
)
|
|
699
|
-
Array.prototype.forEach.call(elements,
|
|
691
|
+
Array.prototype.forEach.call(elements, el => {
|
|
700
692
|
defs.appendChild(el)
|
|
701
693
|
})
|
|
702
694
|
}
|
|
@@ -766,7 +758,7 @@ const importSvgString = (xmlString, preserveDimension) => {
|
|
|
766
758
|
* @param {string} src - The path/URL of the image
|
|
767
759
|
* @returns {Promise<string|false>} Resolves to a Data URL (string|false)
|
|
768
760
|
*/
|
|
769
|
-
const embedImage =
|
|
761
|
+
const embedImage = src => {
|
|
770
762
|
// Todo: Remove this Promise in favor of making an async/await `Image.load` utility
|
|
771
763
|
return new Promise((resolve, reject) => {
|
|
772
764
|
// load in the image and once it's loaded, get the dimensions
|
|
@@ -904,7 +896,7 @@ const rasterExport = async (imgType, quality, WindowName, opts = {}) => {
|
|
|
904
896
|
WindowName
|
|
905
897
|
}
|
|
906
898
|
if (!opts.avoidEvent) {
|
|
907
|
-
svgCanvas.call('
|
|
899
|
+
svgCanvas.call('exported', obj)
|
|
908
900
|
}
|
|
909
901
|
resolve(obj)
|
|
910
902
|
}
|
|
@@ -1011,7 +1003,7 @@ const exportPDF = async (
|
|
|
1011
1003
|
* @param {Element} g - The parent element of the tree to give unique IDs
|
|
1012
1004
|
* @returns {void}
|
|
1013
1005
|
*/
|
|
1014
|
-
const uniquifyElemsMethod =
|
|
1006
|
+
const uniquifyElemsMethod = g => {
|
|
1015
1007
|
const ids = {}
|
|
1016
1008
|
// TODO: Handle markers and connectors. These are not yet re-identified properly
|
|
1017
1009
|
// as their referring elements do not get remapped.
|
|
@@ -1031,7 +1023,7 @@ const uniquifyElemsMethod = (g) => {
|
|
|
1031
1023
|
'use'
|
|
1032
1024
|
]
|
|
1033
1025
|
|
|
1034
|
-
walkTree(g,
|
|
1026
|
+
walkTree(g, n => {
|
|
1035
1027
|
// if it's an element node
|
|
1036
1028
|
if (n.nodeType === 1) {
|
|
1037
1029
|
// and the element has an ID
|
|
@@ -1046,7 +1038,7 @@ const uniquifyElemsMethod = (g) => {
|
|
|
1046
1038
|
|
|
1047
1039
|
// now search for all attributes on this element that might refer
|
|
1048
1040
|
// to other elements
|
|
1049
|
-
svgCanvas.getrefAttrs().forEach(
|
|
1041
|
+
svgCanvas.getrefAttrs().forEach(attr => {
|
|
1050
1042
|
const attrnode = n.getAttributeNode(attr)
|
|
1051
1043
|
if (attrnode) {
|
|
1052
1044
|
// the incoming file has been sanitized, so we should be able to safely just strip off the leading #
|
|
@@ -1115,7 +1107,7 @@ const uniquifyElemsMethod = (g) => {
|
|
|
1115
1107
|
* @param {Element} parent
|
|
1116
1108
|
* @returns {void}
|
|
1117
1109
|
*/
|
|
1118
|
-
const setUseDataMethod =
|
|
1110
|
+
const setUseDataMethod = parent => {
|
|
1119
1111
|
let elems = parent
|
|
1120
1112
|
|
|
1121
1113
|
if (parent.tagName !== 'use') {
|
|
@@ -1210,17 +1202,15 @@ const removeUnusedDefElemsMethod = () => {
|
|
|
1210
1202
|
* @param {Element} elem
|
|
1211
1203
|
* @returns {void}
|
|
1212
1204
|
*/
|
|
1213
|
-
const convertGradientsMethod =
|
|
1205
|
+
const convertGradientsMethod = elem => {
|
|
1214
1206
|
let elems = elem.querySelectorAll('linearGradient, radialGradient')
|
|
1215
1207
|
if (!elems.length && isWebkit()) {
|
|
1216
1208
|
// Bug in webkit prevents regular *Gradient selector search
|
|
1217
|
-
elems = Array.prototype.filter.call(elem.querySelectorAll('*'),
|
|
1218
|
-
curThis
|
|
1219
|
-
) => {
|
|
1209
|
+
elems = Array.prototype.filter.call(elem.querySelectorAll('*'), curThis => {
|
|
1220
1210
|
return curThis.tagName.includes('Gradient')
|
|
1221
1211
|
})
|
|
1222
1212
|
}
|
|
1223
|
-
Array.prototype.forEach.call(elems,
|
|
1213
|
+
Array.prototype.forEach.call(elems, grad => {
|
|
1224
1214
|
if (grad.getAttribute('gradientUnits') === 'userSpaceOnUse') {
|
|
1225
1215
|
const svgContent = svgCanvas.getSvgContent()
|
|
1226
1216
|
// TODO: Support more than one element with this ref by duplicating parent grad
|
|
@@ -1269,7 +1259,7 @@ const convertGradientsMethod = (elem) => {
|
|
|
1269
1259
|
}
|
|
1270
1260
|
|
|
1271
1261
|
// If has transform, convert
|
|
1272
|
-
const tlist = grad
|
|
1262
|
+
const tlist = getTransformList(grad)
|
|
1273
1263
|
if (tlist?.numberOfItems > 0) {
|
|
1274
1264
|
const m = transformListToTransform(tlist).matrix
|
|
1275
1265
|
const pt1 = transformPoint(gCoords.x1, gCoords.y1, m)
|
package/core/undo.js
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
isGecko
|
|
14
14
|
} from '../common/browser.js'
|
|
15
15
|
import {
|
|
16
|
-
transformPoint, transformListToTransform
|
|
16
|
+
transformPoint, transformListToTransform, getTransformList
|
|
17
17
|
} from './math.js'
|
|
18
18
|
|
|
19
19
|
const {
|
|
@@ -167,8 +167,8 @@ export const changeSelectedAttributeNoUndoMethod = (attr, newValue, elems) => {
|
|
|
167
167
|
// Set x,y vals on elements that don't have them
|
|
168
168
|
if ((attr === 'x' || attr === 'y') && noXYElems.includes(elem.tagName)) {
|
|
169
169
|
const bbox = getStrokedBBoxDefaultVisible([elem])
|
|
170
|
-
const diffX = attr === 'x' ? newValue - bbox.x : 0
|
|
171
|
-
const diffY = attr === 'y' ? newValue - bbox.y : 0
|
|
170
|
+
const diffX = attr === 'x' ? parseFloat(newValue) - bbox.x : 0
|
|
171
|
+
const diffY = attr === 'y' ? parseFloat(newValue) - bbox.y : 0
|
|
172
172
|
svgCanvas.moveSelectedElements(diffX * zoom, diffY * zoom, true)
|
|
173
173
|
continue
|
|
174
174
|
}
|
|
@@ -189,7 +189,7 @@ export const changeSelectedAttributeNoUndoMethod = (attr, newValue, elems) => {
|
|
|
189
189
|
} else if (attr === '#href') {
|
|
190
190
|
setHref(elem, newValue)
|
|
191
191
|
} else if (newValue) {
|
|
192
|
-
elem.setAttribute(attr, newValue)
|
|
192
|
+
elem.setAttribute(attr, isNaN(parseFloat(newValue)) ? newValue : parseFloat(newValue))
|
|
193
193
|
} else if (typeof newValue === 'number') {
|
|
194
194
|
elem.setAttribute(attr, newValue)
|
|
195
195
|
} else {
|
|
@@ -228,7 +228,7 @@ export const changeSelectedAttributeNoUndoMethod = (attr, newValue, elems) => {
|
|
|
228
228
|
// we need to update the rotational transform attribute
|
|
229
229
|
const angle = getRotationAngle(elem)
|
|
230
230
|
if (angle !== 0 && attr !== 'transform') {
|
|
231
|
-
const tlist = elem
|
|
231
|
+
const tlist = getTransformList(elem)
|
|
232
232
|
let n = tlist.numberOfItems
|
|
233
233
|
while (n--) {
|
|
234
234
|
const xform = tlist.getItem(n)
|