Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Object): fill-parent layout #7901

Closed
wants to merge 133 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
133 commits
Select commit Hold shift + click to select a range
1a191a7
apply 7744 patch (no binaries)
ShaMan123 Apr 3, 2022
26e8392
apply 7744 patch (binaries)
ShaMan123 Apr 3, 2022
7d793b3
commit #7744 review
ShaMan123 Apr 3, 2022
2708029
patch2
ShaMan123 Apr 4, 2022
02a8ffa
Update spray_brush.class.js
ShaMan123 Apr 4, 2022
0d3690f
enable text editing under group
ShaMan123 Apr 4, 2022
ff0346a
migrate back to isDescendantOf
ShaMan123 Apr 4, 2022
812f02a
render bg
ShaMan123 Apr 4, 2022
053946c
fix(): clear canvas from entire object tree
ShaMan123 Apr 4, 2022
db76c44
fix(): center object in case object is nested
ShaMan123 Apr 4, 2022
04aad5b
Update eraser_brush.mixin.js
ShaMan123 Apr 4, 2022
8c1c535
Update canvas.class.js
ShaMan123 Apr 4, 2022
3fd4af2
Update canvas_events.mixin.js
ShaMan123 Apr 4, 2022
58e9be2
lint
ShaMan123 Apr 4, 2022
c2ef2f5
safeguard from adding group to itself
ShaMan123 Apr 4, 2022
f0145b5
Update object_ancestry.mixin.js
ShaMan123 Apr 4, 2022
cb20b81
patch tests from v6!
ShaMan123 Apr 4, 2022
347f80d
Update canvas_grouping.mixin.js
ShaMan123 Apr 4, 2022
a56d55e
Update canvas.class.js
ShaMan123 Apr 4, 2022
22045b6
create layer
ShaMan123 Apr 4, 2022
724792a
Update layer.class.js
ShaMan123 Apr 4, 2022
7163ad3
warn
ShaMan123 Apr 4, 2022
2a426e7
Update group_layout.js
ShaMan123 Apr 4, 2022
5e3fc1f
Update group_layout.js
ShaMan123 Apr 4, 2022
2b1f680
remove redundant logic
ShaMan123 Apr 4, 2022
1ad5cc8
Update canvas_grouping.mixin.js
ShaMan123 Apr 4, 2022
11c828f
fix(): calling sendPointToPlane
ShaMan123 Apr 4, 2022
b6fa3dc
Update group.class.js
ShaMan123 Apr 4, 2022
e9afc89
refactor `enterGroup`
ShaMan123 Apr 4, 2022
d8f8251
invalidate groups after active selection change
ShaMan123 Apr 4, 2022
c58a274
_shouldSetNestedCoords
ShaMan123 Apr 4, 2022
c0f5571
perf(): refrain from `contains`
ShaMan123 Apr 4, 2022
9a223d0
Update canvas_events.mixin.js
ShaMan123 Apr 4, 2022
2d5cc75
Update canvas.class.js
ShaMan123 Apr 4, 2022
01c4a87
Update canvas.class.js
ShaMan123 Apr 4, 2022
2164161
fix(): export svg backgroundColor
ShaMan123 Apr 4, 2022
a5575bd
Update group.js
ShaMan123 Apr 4, 2022
5c56124
backport collection fix to test
ShaMan123 Apr 4, 2022
5e3aaf5
Update group.class.js
ShaMan123 Apr 4, 2022
d53d6b6
lint
ShaMan123 Apr 4, 2022
9d1179d
Merge branch 'v6-group-patch2' into v6-layer
ShaMan123 Apr 4, 2022
ab776a3
Update group.class.js
ShaMan123 Apr 4, 2022
8e907bb
fix(): target prop on canvas added/removed event
ShaMan123 Apr 5, 2022
f082fc9
fix(): modify handlers strictly on canvas events
ShaMan123 Apr 5, 2022
468a815
Merge branch 'master' into v6-layer
ShaMan123 Apr 5, 2022
c2d93db
Merge branch 'master' into v6-group-patch2
ShaMan123 Apr 5, 2022
bb822ce
Merge branch 'v6-group-patch2' into v6-layer
ShaMan123 Apr 5, 2022
c16bdfb
feat(): initial support for layers under groups
ShaMan123 Apr 5, 2022
f3aa02e
lint
ShaMan123 Apr 5, 2022
c3f69b7
visual test
ShaMan123 Apr 5, 2022
bca1515
Update layer.class.js
ShaMan123 Apr 5, 2022
80b384d
Update layer.class.js
ShaMan123 Apr 5, 2022
548d65c
JSDOC
ShaMan123 Apr 5, 2022
656c36a
Create layer.js
ShaMan123 Apr 5, 2022
70f80af
Update layer.js
ShaMan123 Apr 5, 2022
4641e37
fix(): getObjectsBBox when layer/group are empty
ShaMan123 Apr 5, 2022
5728ba6
Update group.class.js
ShaMan123 Apr 6, 2022
25c8340
Update layer.js
ShaMan123 Apr 6, 2022
3d8b2e3
Update layer.class.js
ShaMan123 Apr 7, 2022
92823b0
perf(): reduce iteration
ShaMan123 Apr 8, 2022
46ef26c
Update layer.class.js
ShaMan123 Apr 9, 2022
e9cbaa0
fix(): apply transformations only on objects
ShaMan123 Apr 9, 2022
590ba58
Update group_layout.js
ShaMan123 Apr 9, 2022
329db01
replace golden
ShaMan123 Apr 9, 2022
ece7698
Create layer.png
ShaMan123 Apr 9, 2022
cdce1d1
fix setting `initialTransform`
ShaMan123 Apr 9, 2022
5a38d5e
fix(): fire `resize`/`window:resize`
ShaMan123 Apr 11, 2022
17d7c6e
extract parent monitor
ShaMan123 Apr 23, 2022
7d7c302
expose `layout` prop on Object
ShaMan123 Apr 23, 2022
db412d3
move
ShaMan123 Apr 23, 2022
9543941
Update build.js
ShaMan123 Apr 23, 2022
922a6ad
Update parent_resize_observer.js
ShaMan123 Apr 23, 2022
901253f
fix
ShaMan123 Apr 23, 2022
a30a451
Update object.class.js
ShaMan123 Apr 23, 2022
0e663ab
fix(): tests
ShaMan123 Apr 23, 2022
679382f
Update object.js
ShaMan123 Apr 23, 2022
dffe340
fix(): safegurad from objects without bbox
ShaMan123 Apr 23, 2022
03202ab
Merge branch 'v6-layer' into fill-parent
ShaMan123 Apr 23, 2022
bb7b708
fire resize on change
ShaMan123 Apr 23, 2022
8610475
add tests
ShaMan123 Apr 23, 2022
a3b5392
lint
ShaMan123 Apr 23, 2022
2e35a8c
fix(): allow changing `fixed` layout imperatively
ShaMan123 Apr 23, 2022
e545ee7
lint
ShaMan123 Apr 23, 2022
cee68bb
Update object.js
ShaMan123 Apr 23, 2022
4bac081
Create out.txt
ShaMan123 Apr 23, 2022
ccade80
fix(Stateful): Object comparison
ShaMan123 Apr 23, 2022
34b45fa
Update stateful.mixin.js
ShaMan123 Apr 23, 2022
3b74aeb
Update stateful.js
ShaMan123 Apr 23, 2022
3d4cad1
support circle
ShaMan123 Apr 23, 2022
c1d0853
support ellipse
ShaMan123 Apr 23, 2022
03edb40
setCoords
ShaMan123 Apr 23, 2022
380d7bb
Update object.js
ShaMan123 Apr 23, 2022
4aa5b8d
support polyline
ShaMan123 Apr 23, 2022
31409a5
refactor `_onParentResize`
ShaMan123 Apr 23, 2022
d126827
Update text.class.js
ShaMan123 Apr 23, 2022
2aa2ec2
Update image.class.js
ShaMan123 Apr 23, 2022
17273a9
Update line.class.js
ShaMan123 Apr 23, 2022
9e9d478
refactor
ShaMan123 Apr 23, 2022
64f2cec
fix(): errors that TS tells you about
ShaMan123 Apr 23, 2022
6193238
Update parent_resize_observer.js
ShaMan123 Apr 23, 2022
62a9d3b
fix(): `removed` - relay on event to get parent
ShaMan123 Apr 26, 2022
aee0fed
fix(): `getObjectsBoundingBox` first measurement
ShaMan123 Apr 26, 2022
dc6d32b
merge conflict?
asturur Apr 30, 2022
6f28f7f
remove whitespace
asturur Apr 30, 2022
53027cb
remove whitespace
asturur Apr 30, 2022
f4c8c5b
Update group.class.js
ShaMan123 May 1, 2022
da115b5
remove dead code
ShaMan123 May 1, 2022
db7c025
Merge branch 'v6-layer-tests' into v6-layer
ShaMan123 May 1, 2022
5489cdc
revert
ShaMan123 May 1, 2022
5ff32e5
Update object_geometry.mixin.js
ShaMan123 May 1, 2022
4c0c142
fix(): pass options to `_getTransformedDimensions`
ShaMan123 May 1, 2022
23416d1
Revert "fix(): pass options to `_getTransformedDimensions`"
ShaMan123 May 1, 2022
2f27480
fix(): getDimensions no `strokeWidth`
ShaMan123 May 1, 2022
2a26286
fix(): `_getTransformedDimensions`
ShaMan123 May 1, 2022
43c6a89
Merge branch 'v6-layer' into fill-parent
ShaMan123 May 1, 2022
b73e78d
Merge branch 'master' into v6-layer
ShaMan123 May 2, 2022
3c88040
Merge branch 'v6-layer' into fill-parent
ShaMan123 May 2, 2022
d7e9592
Update misc.js
ShaMan123 May 2, 2022
4eecd38
Update parent_resize_observer.js
ShaMan123 May 4, 2022
59b579d
fix check
ShaMan123 May 4, 2022
bb78372
fix(): account for stroke
ShaMan123 May 4, 2022
4e2c5da
add test
ShaMan123 May 4, 2022
de1fae2
lint
ShaMan123 May 4, 2022
443bc35
fix polyline/ploygon
ShaMan123 May 4, 2022
bb355d2
Update generic_rendering.js
ShaMan123 May 4, 2022
00e66c9
Update fill-parent.png
ShaMan123 May 4, 2022
c33fe61
Update generic_rendering.js
ShaMan123 May 4, 2022
d63f288
`backgroundColor` -> `fill-parent` object
ShaMan123 May 4, 2022
12311b0
remove bgColor
ShaMan123 May 4, 2022
6e8daca
Merge branch 'master' into fill-parent
ShaMan123 Jun 12, 2022
1a2612e
Merge branch 'master' into v6-layer
ShaMan123 Jun 12, 2022
351967c
Merge branch 'v6-layer' into fill-parent
ShaMan123 Jun 12, 2022
14866dc
fix tests
ShaMan123 Jun 12, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ var filesToInclude = [
'src/util/dom_style.js',
'src/util/dom_misc.js',
'src/util/dom_request.js',
'src/util/parent_resize_observer.js',

'src/log.js',

Expand Down Expand Up @@ -196,6 +197,7 @@ var filesToInclude = [
'src/shapes/polygon.class.js',
'src/shapes/path.class.js',
'src/shapes/group.class.js',
'src/shapes/layer.class.js',
ifSpecifiedInclude('interaction', 'src/shapes/active_selection.class.js'),
'src/shapes/image.class.js',

Expand Down
3 changes: 2 additions & 1 deletion src/mixins/canvas_events.mixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -383,8 +383,9 @@
/**
* @private
*/
_onResize: function () {
_onResize: function (e) {
this.calcOffset();
this.fire('window:resize', { e: e });
},

/**
Expand Down
2 changes: 2 additions & 0 deletions src/mixins/object_geometry.mixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -720,6 +720,8 @@
* @param {Number} [options.scaleY]
* @param {Number} [options.skewX]
* @param {Number} [options.skewY]
* @param {Number} [options.width]
* @param {Number} [options.height]
* @private
* @returns {fabric.Point} dimensions
*/
Expand Down
25 changes: 16 additions & 9 deletions src/mixins/stateful.mixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,23 @@
/*
Depends on `stateProperties`
*/
function saveProps(origin, destination, props) {
var tmpObj = { }, deep = true;
props.forEach(function(prop) {
tmpObj[prop] = origin[prop];
});
function _saveProps(origin, props) {
return props.reduce(function (saved, prop) {
var value = origin[prop];
saved[prop] = value instanceof fabric.Object ?
_saveProps(value, value[originalSet]) :
value && typeof value.toObject === 'function' ?
value.toObject() :
value;
return saved;
}, {});
}

extend(origin[destination], tmpObj, deep);
function saveProps(origin, destination, props) {
extend(origin[destination], _saveProps(origin, props), true);
}

function _isEqual(origValue, currentValue, firstPass) {
function _isEqual(origValue, currentValue, skipShallowTest) {
if (origValue === currentValue) {
// if the objects are identical, return
return true;
Expand All @@ -35,7 +42,7 @@
var keys = Object.keys(origValue), key;
if (!currentValue ||
typeof currentValue !== 'object' ||
(!firstPass && keys.length !== Object.keys(currentValue).length)
(!skipShallowTest && keys.length !== Object.keys(currentValue).length)
) {
return false;
}
Expand All @@ -47,7 +54,7 @@
if (key === 'canvas' || key === 'group') {
continue;
}
if (!_isEqual(origValue[key], currentValue[key])) {
if (!_isEqual(origValue[key], currentValue[key], currentValue[key] instanceof fabric.Object)) {
return false;
}
}
Expand Down
21 changes: 21 additions & 0 deletions src/shapes/circle.class.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,27 @@
return this;
},

/**
* Called once instance is added to a parent and when parent resizes
* @private
* @param {*} context see {@link fabric.ParentResizeObserver}
*/
_onParentResize: function (context) {
if (this.layout === 'fill-parent') {
var data = this._parentMonitor.extractDataFromResizeEvent(context);
var parent = data.parent;
var strokeCorrection = this.stroke ? this.strokeWidth : 0;
var r = Math.min(parent.width, parent.height) / 2 - strokeCorrection;
var resizing = r !== this.radius;
if (resizing || !this.getRelativeCenterPoint().eq(data.center)) {
this.setRadius(r);
this.setPositionByOrigin(data.center, 'center', 'center');
parent.interactive && this.setCoords();
resizing && this.fire('resize', context);
}
}
},

/**
* Returns object representation of an instance
* @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
Expand Down
25 changes: 25 additions & 0 deletions src/shapes/ellipse.class.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,31 @@
return this;
},

/**
* Called once instance is added to a parent and when parent resizes
* @private
* @param {*} context see {@link fabric.ParentResizeObserver}
*/
_onParentResize: function (context) {
if (this.layout === 'fill-parent') {
var data = this._parentMonitor.extractDataFromResizeEvent(context);
var parent = data.parent;
var strokeCorrection = this.stroke ? this.strokeWidth : 0;
var rx = parent.width / 2 - strokeCorrection;
var ry = parent.height / 2 - strokeCorrection;
var resizing = rx !== this.rx || ry !== this.ry;
if (resizing || !this.getRelativeCenterPoint().eq(data.center)) {
this.set({
rx: rx,
ry: ry
});
this.setPositionByOrigin(data.center, 'center', 'center');
parent.interactive && this.setCoords();
resizing && this.fire('resize', context);
}
}
},

/**
* Returns horizontal radius of an object (according to how an object is scaled)
* @return {Number}
Expand Down
148 changes: 107 additions & 41 deletions src/shapes/group.class.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,11 @@
this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(this, true);
this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(this, false);
this._firstLayoutDone = false;
this.callSuper('initialize', options);
// setting angle, skewX, skewY must occur after initial layout
this.callSuper('initialize', Object.assign({}, options, { angle: 0, skewX: 0, skewY: 0 }));
this.forEachObject(function (object) {
this.enterGroup(object, false);
object.fire('added:initialized', { target: this });
}, this);
this._applyLayoutStrategy({
type: 'initialization',
Expand Down Expand Up @@ -224,6 +226,14 @@
object[directive]('deselected', this.__objectSelectionDisposer);
},

/**
* @private
* @override consider using {@link fabric.Layer} for `fill-parent` layout
*/
_onParentResize: function () {
// noop
},

/**
* Checks if object can enter group and logs relevant warnings
* @private
Expand All @@ -244,6 +254,11 @@
/* _DEV_MODE_END_ */
return false;
}
else if (object.group) {
/* _DEV_MODE_START_ */
console.warn('fabric.Group: object is about to enter group and leave another');
/* _DEV_MODE_END_ */
}
return true;
},

Expand Down Expand Up @@ -480,12 +495,22 @@
* @private
* @param {fabric.Object} object
* @param {fabric.Point} diff
* @param {boolean} [setCoords] perf enhancement, instead of iterating over objects again
*/
_adjustObjectPosition: function (object, diff) {
object.set({
left: object.left + diff.x,
top: object.top + diff.y,
});
_adjustObjectPosition: function (object, diff, setCoords) {
// layer doesn't need coords so we don't set them
if (object instanceof fabric.Layer) {
object.forEachObject(function (obj) {
this._adjustObjectPosition(obj, diff, setCoords);
}.bind(this));
}
else {
object.set({
left: object.left + diff.x,
top: object.top + diff.y,
});
setCoords && object.setCoords();
}
},

/**
Expand All @@ -502,27 +527,38 @@
// reject layout requests before initialization layout
return;
}
var options = isFirstLayout && context.options;
var initialTransform = options && {
angle: options.angle || 0,
skewX: options.skewX || 0,
skewY: options.skewY || 0,
};
var center = this.getRelativeCenterPoint();
var result = this.getLayoutStrategyResult(this.layout, this._objects.concat(), context);
if (result) {
// handle positioning
var newCenter = new fabric.Point(result.centerX, result.centerY);
var vector = center.subtract(newCenter).add(new fabric.Point(result.correctionX || 0, result.correctionY || 0));
var diff = transformPoint(vector, invertTransform(this.calcOwnMatrix()), true);
var objectsSetCoords = false;
// set dimensions
this.set({ width: result.width, height: result.height });
if (!newCenter.eq(center) || initialTransform) {
// set position
this.setPositionByOrigin(newCenter, 'center', 'center');
initialTransform && this.set(initialTransform);
// perf: avoid iterating over objects twice by setting coords only on instance
// and delegating the task to `_adjustObjectPosition`
this.callSuper('setCoords');
objectsSetCoords = this.subTargetCheck;
}
// adjust objects to account for new center
!context.objectsRelativeToGroup && this.forEachObject(function (object) {
this._adjustObjectPosition(object, diff);
this._adjustObjectPosition(object, diff, objectsSetCoords);
}, this);
// clip path as well
!isFirstLayout && this.layout !== 'clip-path' && this.clipPath && !this.clipPath.absolutePositioned
&& this._adjustObjectPosition(this.clipPath, diff);
if (!newCenter.eq(center)) {
// set position
this.setPositionByOrigin(newCenter, 'center', 'center');
this.setCoords();
}
&& this._adjustObjectPosition(this.clipPath, diff, objectsSetCoords);
}
else if (isFirstLayout) {
// fill `result` with initial values for the layout hook
Expand All @@ -532,6 +568,7 @@
width: this.width,
height: this.height,
};
initialTransform && this.set(initialTransform);
}
else {
// no `result` so we return
Expand All @@ -546,7 +583,15 @@
result: result,
diff: diff
});
// recursive up
this._bubbleLayout(context);
},


/**
* bubble layout recursive up
* @private
*/
_bubbleLayout: function (context) {
if (this.group && this.group._applyLayoutStrategy) {
// append the path recursion to context
if (!context.path) {
Expand All @@ -558,7 +603,6 @@
}
},


/**
* Override this method to customize layout.
* If you need to run logic once layout completes use `onLayout`
Expand Down Expand Up @@ -716,24 +760,6 @@
}),
rotationCorrection = new fabric.Point(0, 0);

if (this.angle) {
var rad = degreesToRadians(this.angle),
sin = Math.abs(fabric.util.sin(rad)),
cos = Math.abs(fabric.util.cos(rad));
sizeAfter.setXY(
sizeAfter.x * cos + sizeAfter.y * sin,
sizeAfter.x * sin + sizeAfter.y * cos
);
bboxSizeAfter.setXY(
bboxSizeAfter.x * cos + bboxSizeAfter.y * sin,
bboxSizeAfter.x * sin + bboxSizeAfter.y * cos
);
strokeWidthVector = fabric.util.rotateVector(strokeWidthVector, rad);
// correct center after rotating
var strokeCorrection = strokeWidthVector.multiply(origin.scalarAdd(-0.5).scalarDivide(-2));
rotationCorrection = sizeAfter.subtract(size).scalarDivide(2).add(strokeCorrection);
calculatedCenter.addEquals(rotationCorrection);
}
// calculate center and correction
var originT = origin.scalarAdd(0.5);
var originCorrection = sizeAfter.multiply(originT);
Expand Down Expand Up @@ -778,23 +804,40 @@
if (objects.length === 0) {
return null;
}
var objCenter, sizeVector, min, max, a, b;
objects.forEach(function (object, i) {
objCenter = object.getRelativeCenterPoint();
sizeVector = object._getTransformedDimensions().scalarDivideEquals(2);
var objCenter, sizeVector, min = new fabric.Point(0, 0), max = new fabric.Point(0, 0), a, b, first = true;
objects.forEach(function (object) {
if (object instanceof fabric.Layer) {
var bbox = object.getObjectsBoundingBox(object._objects.slice(0));
if (!bbox) {
return;
}
sizeVector = object._getTransformedDimensions({
width: bbox.width,
height: bbox.height
}).scalarDivideEquals(2);
objCenter = new fabric.Point(bbox.centerX, bbox.centerY);
}
else if (object.layout === 'fill-parent') {
return;
}
else {
sizeVector = object._getTransformedDimensions().scalarDivideEquals(2);
objCenter = object.getRelativeCenterPoint();
}
if (object.angle) {
var rad = degreesToRadians(object.angle),
sin = Math.abs(fabric.util.sin(rad)),
cos = Math.abs(fabric.util.cos(rad)),
rx = sizeVector.x * cos + sizeVector.y * sin,
ry = sizeVector.x * sin + sizeVector.y * cos;
sizeVector = new fabric.Point(rx, ry);
sizeVector.setXY(rx, ry);
}
a = objCenter.subtract(sizeVector);
b = objCenter.add(sizeVector);
if (i === 0) {
min = new fabric.Point(Math.min(a.x, b.x), Math.min(a.y, b.y));
max = new fabric.Point(Math.max(a.x, b.x), Math.max(a.y, b.y));
if (first) {
first = false;
min.setXY(Math.min(a.x, b.x), Math.min(a.y, b.y));
max.setXY(Math.max(a.x, b.x), Math.max(a.y, b.y));
}
else {
min.setXY(Math.min(min.x, a.x, b.x), Math.min(min.y, a.y, b.y));
Expand Down Expand Up @@ -830,6 +873,29 @@
// override by subclass
},


/**
* Calculate object dimensions from its properties
* @override disregard `strokeWidth`
* @private
* @returns {fabric.Point} dimensions
*/
_getNonTransformedDimensions: function () {
return new fabric.Point(this.width, this.height);
},

/**
* @private
* @override we want instance to fill parent so we disregard transformations
* @param {Object} [options]
* @param {Number} [options.width]
* @param {Number} [options.height]
* @returns {fabric.Point} dimensions
*/
_getTransformedDimensions: function (options) {
return this.callSuper('_getTransformedDimensions', Object.assign(options || {}, { strokeWidth: 0 }));
},

/**
*
* @private
Expand Down
Loading