@nasser-sw/fabric 7.0.1-beta28 → 7.0.1-beta29
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/.history/package_20251227152541.json +164 -0
- package/dist/index.js +38 -21
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +38 -21
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +38 -21
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +38 -21
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/shapes/Frame.d.ts +5 -1
- package/dist/src/shapes/Frame.d.ts.map +1 -1
- package/dist/src/shapes/Frame.min.mjs +1 -1
- package/dist/src/shapes/Frame.min.mjs.map +1 -1
- package/dist/src/shapes/Frame.mjs +37 -20
- package/dist/src/shapes/Frame.mjs.map +1 -1
- package/dist-extensions/src/shapes/Frame.d.ts +5 -1
- package/dist-extensions/src/shapes/Frame.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/shapes/Frame.ts +36 -17
- package/badd.png +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nasser-sw/fabric",
|
|
3
|
+
"description": "Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.",
|
|
4
|
+
"homepage": "http://fabricjs.com/",
|
|
5
|
+
"version": "7.0.1-beta29",
|
|
6
|
+
"author": "Juriy Zaytsev <kangax@gmail.com>",
|
|
7
|
+
"contributors": [
|
|
8
|
+
{
|
|
9
|
+
"name": "Andrea Bogazzi",
|
|
10
|
+
"email": "andreabogazzi79@gmail.com",
|
|
11
|
+
"url": "https://github.com/asturur"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"name": "Shachar Nencel",
|
|
15
|
+
"email": "shacharnen@gmail.com",
|
|
16
|
+
"url": "https://github.com/ShaMan123"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "Steve Eberhardt",
|
|
20
|
+
"email": "melchiar2@gmail.com",
|
|
21
|
+
"url": "https://github.com/melchiar"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"keywords": [
|
|
25
|
+
"canvas",
|
|
26
|
+
"graphic",
|
|
27
|
+
"graphics",
|
|
28
|
+
"SVG",
|
|
29
|
+
"node-canvas",
|
|
30
|
+
"parser",
|
|
31
|
+
"HTML5",
|
|
32
|
+
"object model"
|
|
33
|
+
],
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/fabricjs/fabric.js"
|
|
40
|
+
},
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/fabricjs/fabric.js/issues"
|
|
43
|
+
},
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"scripts": {
|
|
46
|
+
"docs": "typedoc",
|
|
47
|
+
"cli": "node ./scripts/index.mjs",
|
|
48
|
+
"sandboxscript": "node ./scripts/sandbox.mjs",
|
|
49
|
+
"build": "npm run cli -- build",
|
|
50
|
+
"build:fast": "npm run build -- -f",
|
|
51
|
+
"dev": "npm run cli -- dev",
|
|
52
|
+
"start": "npm run sandboxscript -- start",
|
|
53
|
+
"export": "npm run cli -- website export",
|
|
54
|
+
"test:vitest": "vitest --run --project unit-node",
|
|
55
|
+
"test:vitest:chromium": "vitest --run --project unit-chromium",
|
|
56
|
+
"test:vitest:firefox": "vitest --run --project unit-firefox",
|
|
57
|
+
"test:vitest:all": "vitest --run",
|
|
58
|
+
"test:vitest:coverage": "vitest --run --coverage --project unit-node",
|
|
59
|
+
"test:vitest:coverage:watch": "npm run test:vitest --coverage=true",
|
|
60
|
+
"coverage:merge": "nyc merge coveragefiles .nyc_output/merged-coverage.json",
|
|
61
|
+
"coverage:report": "nyc report --skip-full=true --reporter=lcov --reporter=text --reporter=text-summary",
|
|
62
|
+
"coverage:report:ci": "nyc report --reporter=text-summary",
|
|
63
|
+
"test:e2e": "npm run playwright:typecheck && playwright test",
|
|
64
|
+
"playwright:typecheck": "tsc -p ./e2e/tsconfig.json --noEmit",
|
|
65
|
+
"sandbox": "npm run sandboxscript -- sandbox",
|
|
66
|
+
"local-server": "serve ./ -l tcp://localhost:8080",
|
|
67
|
+
"lint": "eslint src extensions",
|
|
68
|
+
"prettier:check": "prettier --check .",
|
|
69
|
+
"prettier:write": "prettier --write ."
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@babel/cli": "^7.28.3",
|
|
73
|
+
"@babel/core": "^7.28.3",
|
|
74
|
+
"@babel/preset-env": "^7.28.3",
|
|
75
|
+
"@babel/preset-typescript": "^7.27.1",
|
|
76
|
+
"@eslint/js": "^9.31.0",
|
|
77
|
+
"@playwright/test": "^1.55.0",
|
|
78
|
+
"@rollup/plugin-babel": "^6.0.4",
|
|
79
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
80
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
81
|
+
"@rollup/plugin-typescript": "^12.1.4",
|
|
82
|
+
"@types/fs-extra": "^11.0.4",
|
|
83
|
+
"@types/jsdom": "^21.1.7",
|
|
84
|
+
"@types/micromatch": "^4.0.9",
|
|
85
|
+
"@types/node": "^24.3.0",
|
|
86
|
+
"@vitest/browser": "^3.2.4",
|
|
87
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
88
|
+
"@vitest/ui": "^3.2.4",
|
|
89
|
+
"babel-plugin-transform-imports": "git+https://git@github.com/fabricjs/babel-plugin-transform-imports.git",
|
|
90
|
+
"chalk": "^5.6.0",
|
|
91
|
+
"commander": "^14.0.0",
|
|
92
|
+
"es-toolkit": "1.39.7",
|
|
93
|
+
"eslint-config-prettier": "^10.1.8",
|
|
94
|
+
"fs-extra": "^11.3.1",
|
|
95
|
+
"inquirer": "^12.9.4",
|
|
96
|
+
"micromatch": "^4.0.8",
|
|
97
|
+
"moment": "^2.30.1",
|
|
98
|
+
"nyc": "^17.1.0",
|
|
99
|
+
"prettier": "^3.6.2",
|
|
100
|
+
"ps-list": "^8.1.1",
|
|
101
|
+
"rollup": "^4.48.0",
|
|
102
|
+
"semver": "^7.7.2",
|
|
103
|
+
"serve": "^14.2.4",
|
|
104
|
+
"tslib": "^2.8.1",
|
|
105
|
+
"typescript": "^5.9.2",
|
|
106
|
+
"typescript-eslint": "^8.40.0",
|
|
107
|
+
"v8-to-istanbul": "^9.3.0",
|
|
108
|
+
"vite": "^6.3.5",
|
|
109
|
+
"vitest": "^3.2.4"
|
|
110
|
+
},
|
|
111
|
+
"engines": {
|
|
112
|
+
"node": ">=18.0.0"
|
|
113
|
+
},
|
|
114
|
+
"overrides": {
|
|
115
|
+
"canvas": {
|
|
116
|
+
"canvas": "3.2.0"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"module": "./dist/index.mjs",
|
|
120
|
+
"types": "./dist/index.d.ts",
|
|
121
|
+
"typesVersions": {
|
|
122
|
+
">=4.2": {
|
|
123
|
+
"*": [
|
|
124
|
+
"dist/index.d.ts"
|
|
125
|
+
],
|
|
126
|
+
"node": [
|
|
127
|
+
"dist/index.node.d.ts"
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"sideEffects": false,
|
|
132
|
+
"exports": {
|
|
133
|
+
".": {
|
|
134
|
+
"types": "./dist/index.d.ts",
|
|
135
|
+
"import": "./dist/index.min.mjs",
|
|
136
|
+
"require": "./dist/index.min.js",
|
|
137
|
+
"default": "./dist/index.min.js"
|
|
138
|
+
},
|
|
139
|
+
"./es": {
|
|
140
|
+
"types": "./dist/index.d.ts",
|
|
141
|
+
"import": "./dist/fabric.min.mjs",
|
|
142
|
+
"require": null,
|
|
143
|
+
"default": null
|
|
144
|
+
},
|
|
145
|
+
"./node": {
|
|
146
|
+
"node": "./dist/index.node.cjs",
|
|
147
|
+
"types": "./dist/index.node.d.ts",
|
|
148
|
+
"import": "./dist/index.node.mjs",
|
|
149
|
+
"require": "./dist/index.node.cjs",
|
|
150
|
+
"default": "./dist/index.node.cjs"
|
|
151
|
+
},
|
|
152
|
+
"./extensions": {
|
|
153
|
+
"node": "./dist-extensions/index.mjs",
|
|
154
|
+
"types": "./dist-extensions/extensions/index.d.ts",
|
|
155
|
+
"import": "./dist-extensions/index.mjs",
|
|
156
|
+
"require": null,
|
|
157
|
+
"default": "./dist-extensions/fabric-extensions.min.js"
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
"optionalDependencies": {
|
|
161
|
+
"canvas": "^3.2.0",
|
|
162
|
+
"jsdom": "^26.1.0"
|
|
163
|
+
}
|
|
164
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -360,7 +360,7 @@
|
|
|
360
360
|
}
|
|
361
361
|
const cache = new Cache();
|
|
362
362
|
|
|
363
|
-
var version = "7.0.1-
|
|
363
|
+
var version = "7.0.1-beta28";
|
|
364
364
|
|
|
365
365
|
// use this syntax so babel plugin see this import here
|
|
366
366
|
const VERSION = version;
|
|
@@ -31665,6 +31665,8 @@
|
|
|
31665
31665
|
hasBorders: true,
|
|
31666
31666
|
minScaleLimit: minScale,
|
|
31667
31667
|
lockScalingFlip: true,
|
|
31668
|
+
lockUniScaling: false,
|
|
31669
|
+
// Allow non-uniform stretching
|
|
31668
31670
|
objectCaching: false
|
|
31669
31671
|
});
|
|
31670
31672
|
this._contentImage.dirty = true;
|
|
@@ -31681,11 +31683,15 @@
|
|
|
31681
31683
|
this._setupEditModeConstraints();
|
|
31682
31684
|
this.set('dirty', true);
|
|
31683
31685
|
|
|
31684
|
-
//
|
|
31685
|
-
// because it causes position miscalculation with viewport transforms.
|
|
31686
|
-
// The content image is still interactive via subTargetCheck = true
|
|
31686
|
+
// Select the content image so its controls are active
|
|
31687
31687
|
if (this.canvas) {
|
|
31688
|
-
|
|
31688
|
+
// Use requestAnimationFrame to ensure rendering is complete before selecting
|
|
31689
|
+
requestAnimationFrame(() => {
|
|
31690
|
+
if (this._contentImage && this.canvas) {
|
|
31691
|
+
this.canvas.setActiveObject(this._contentImage);
|
|
31692
|
+
this.canvas.requestRenderAll();
|
|
31693
|
+
}
|
|
31694
|
+
});
|
|
31689
31695
|
}
|
|
31690
31696
|
|
|
31691
31697
|
// Fire custom event
|
|
@@ -31704,13 +31710,14 @@
|
|
|
31704
31710
|
|
|
31705
31711
|
// Constrain movement to prevent gaps
|
|
31706
31712
|
this._boundConstrainMove = e => {
|
|
31707
|
-
var _ref5, _frame$frameMeta$orig, _ref6, _frame$frameMeta$orig2, _img$scaleX2, _img$left2, _img$top2;
|
|
31713
|
+
var _ref5, _frame$frameMeta$orig, _ref6, _frame$frameMeta$orig2, _img$scaleX2, _img$scaleY, _img$left2, _img$top2;
|
|
31708
31714
|
if (e.target !== img || !frame.isEditMode) return;
|
|
31709
31715
|
const originalWidth = (_ref5 = (_frame$frameMeta$orig = frame.frameMeta.originalWidth) !== null && _frame$frameMeta$orig !== void 0 ? _frame$frameMeta$orig : img.width) !== null && _ref5 !== void 0 ? _ref5 : 100;
|
|
31710
31716
|
const originalHeight = (_ref6 = (_frame$frameMeta$orig2 = frame.frameMeta.originalHeight) !== null && _frame$frameMeta$orig2 !== void 0 ? _frame$frameMeta$orig2 : img.height) !== null && _ref6 !== void 0 ? _ref6 : 100;
|
|
31711
|
-
const
|
|
31712
|
-
const
|
|
31713
|
-
const
|
|
31717
|
+
const scaleX = (_img$scaleX2 = img.scaleX) !== null && _img$scaleX2 !== void 0 ? _img$scaleX2 : 1;
|
|
31718
|
+
const scaleY = (_img$scaleY = img.scaleY) !== null && _img$scaleY !== void 0 ? _img$scaleY : 1;
|
|
31719
|
+
const scaledImgHalfW = originalWidth * scaleX / 2;
|
|
31720
|
+
const scaledImgHalfH = originalHeight * scaleY / 2;
|
|
31714
31721
|
const frameHalfW = frame.frameWidth / 2;
|
|
31715
31722
|
const frameHalfH = frame.frameHeight / 2;
|
|
31716
31723
|
const maxOffsetX = Math.max(0, scaledImgHalfW - frameHalfW);
|
|
@@ -31729,19 +31736,23 @@
|
|
|
31729
31736
|
|
|
31730
31737
|
// Constrain scaling to prevent gaps
|
|
31731
31738
|
this._boundConstrainScale = e => {
|
|
31732
|
-
var _ref7, _frame$frameMeta$orig3, _ref8, _frame$frameMeta$orig4, _img$scaleX3, _img$
|
|
31739
|
+
var _ref7, _frame$frameMeta$orig3, _ref8, _frame$frameMeta$orig4, _img$scaleX3, _img$scaleY2, _frame$_boundConstrai;
|
|
31733
31740
|
if (e.target !== img || !frame.isEditMode) return;
|
|
31734
31741
|
const originalWidth = (_ref7 = (_frame$frameMeta$orig3 = frame.frameMeta.originalWidth) !== null && _frame$frameMeta$orig3 !== void 0 ? _frame$frameMeta$orig3 : img.width) !== null && _ref7 !== void 0 ? _ref7 : 100;
|
|
31735
31742
|
const originalHeight = (_ref8 = (_frame$frameMeta$orig4 = frame.frameMeta.originalHeight) !== null && _frame$frameMeta$orig4 !== void 0 ? _frame$frameMeta$orig4 : img.height) !== null && _ref8 !== void 0 ? _ref8 : 100;
|
|
31736
|
-
|
|
31743
|
+
|
|
31744
|
+
// Calculate minimum scale for each axis independently
|
|
31745
|
+
const minScaleX = frame.frameWidth / originalWidth;
|
|
31746
|
+
const minScaleY = frame.frameHeight / originalHeight;
|
|
31737
31747
|
let scaleX = (_img$scaleX3 = img.scaleX) !== null && _img$scaleX3 !== void 0 ? _img$scaleX3 : 1;
|
|
31738
|
-
let scaleY = (_img$
|
|
31748
|
+
let scaleY = (_img$scaleY2 = img.scaleY) !== null && _img$scaleY2 !== void 0 ? _img$scaleY2 : 1;
|
|
31739
31749
|
|
|
31740
|
-
// Ensure
|
|
31741
|
-
|
|
31750
|
+
// Ensure each axis meets minimum scale (allows non-uniform stretching)
|
|
31751
|
+
scaleX = Math.max(minScaleX, scaleX);
|
|
31752
|
+
scaleY = Math.max(minScaleY, scaleY);
|
|
31742
31753
|
img.set({
|
|
31743
|
-
scaleX
|
|
31744
|
-
scaleY
|
|
31754
|
+
scaleX,
|
|
31755
|
+
scaleY
|
|
31745
31756
|
});
|
|
31746
31757
|
|
|
31747
31758
|
// Also constrain position after scale
|
|
@@ -31932,9 +31943,10 @@
|
|
|
31932
31943
|
// Constrain position so image always covers the frame
|
|
31933
31944
|
const originalWidth = (_ref9 = (_this$frameMeta$origi5 = this.frameMeta.originalWidth) !== null && _this$frameMeta$origi5 !== void 0 ? _this$frameMeta$origi5 : this._contentImage.width) !== null && _ref9 !== void 0 ? _ref9 : 100;
|
|
31934
31945
|
const originalHeight = (_ref0 = (_this$frameMeta$origi6 = this.frameMeta.originalHeight) !== null && _this$frameMeta$origi6 !== void 0 ? _this$frameMeta$origi6 : this._contentImage.height) !== null && _ref0 !== void 0 ? _ref0 : 100;
|
|
31935
|
-
|
|
31936
|
-
|
|
31937
|
-
const
|
|
31946
|
+
|
|
31947
|
+
// Use actual scaleX/scaleY for non-uniform scaling support
|
|
31948
|
+
const scaledImgHalfW = originalWidth * contentScaleX / 2;
|
|
31949
|
+
const scaledImgHalfH = originalHeight * contentScaleY / 2;
|
|
31938
31950
|
const frameHalfW = this.frameWidth / 2;
|
|
31939
31951
|
const frameHalfH = this.frameHeight / 2;
|
|
31940
31952
|
|
|
@@ -31950,12 +31962,13 @@
|
|
|
31950
31962
|
top: constrainedTop
|
|
31951
31963
|
});
|
|
31952
31964
|
|
|
31953
|
-
// Update metadata with new offsets and scale
|
|
31965
|
+
// Update metadata with new offsets and scale (store both scaleX and scaleY)
|
|
31954
31966
|
this.frameMeta = {
|
|
31955
31967
|
...this.frameMeta,
|
|
31956
31968
|
contentOffsetX: constrainedLeft,
|
|
31957
31969
|
contentOffsetY: constrainedTop,
|
|
31958
|
-
|
|
31970
|
+
contentScaleX: contentScaleX,
|
|
31971
|
+
contentScaleY: contentScaleY
|
|
31959
31972
|
};
|
|
31960
31973
|
|
|
31961
31974
|
// Make content non-interactive again and restore caching
|
|
@@ -31964,6 +31977,10 @@
|
|
|
31964
31977
|
evented: false,
|
|
31965
31978
|
hasControls: false,
|
|
31966
31979
|
hasBorders: false,
|
|
31980
|
+
lockUniScaling: false,
|
|
31981
|
+
// Reset to default
|
|
31982
|
+
centeredScaling: false,
|
|
31983
|
+
// Reset to default
|
|
31967
31984
|
objectCaching: true
|
|
31968
31985
|
});
|
|
31969
31986
|
|