@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.
@@ -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-beta27";
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
- // Just render - don't call setActiveObject() on the content image
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
- this.canvas.renderAll();
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 currentScale = (_img$scaleX2 = img.scaleX) !== null && _img$scaleX2 !== void 0 ? _img$scaleX2 : 1;
31712
- const scaledImgHalfW = originalWidth * currentScale / 2;
31713
- const scaledImgHalfH = originalHeight * currentScale / 2;
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$scaleY, _frame$_boundConstrai;
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
- const minScale = frame._calculateCoverScale(originalWidth, originalHeight);
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$scaleY = img.scaleY) !== null && _img$scaleY !== void 0 ? _img$scaleY : 1;
31748
+ let scaleY = (_img$scaleY2 = img.scaleY) !== null && _img$scaleY2 !== void 0 ? _img$scaleY2 : 1;
31739
31749
 
31740
- // Ensure uniform scaling and minimum scale
31741
- const scale = Math.max(minScale, Math.max(scaleX, scaleY));
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: scale,
31744
- scaleY: scale
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
- const currentScale = Math.max(contentScaleX, contentScaleY);
31936
- const scaledImgHalfW = originalWidth * currentScale / 2;
31937
- const scaledImgHalfH = originalHeight * currentScale / 2;
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
- contentScale: currentScale
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