@nasser-sw/fabric 7.0.1-beta17 → 7.0.1-beta18
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_20251226051014.json +164 -0
- package/dist/fabric.d.ts +2 -0
- package/dist/fabric.d.ts.map +1 -1
- package/dist/fabric.min.mjs +1 -1
- package/dist/fabric.mjs +2 -0
- package/dist/fabric.mjs.map +1 -1
- package/dist/index.js +1742 -368
- 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 +1741 -369
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +1742 -368
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +1741 -369
- 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/LayoutManager/LayoutStrategies/FrameLayout.d.ts +31 -0
- package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.d.ts.map +1 -0
- package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.min.mjs +2 -0
- package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.min.mjs.map +1 -0
- package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.mjs +81 -0
- package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.mjs.map +1 -0
- package/dist/src/LayoutManager/index.d.ts +1 -0
- package/dist/src/LayoutManager/index.d.ts.map +1 -1
- package/dist/src/controls/commonControls.d.ts.map +1 -1
- package/dist/src/controls/commonControls.mjs +25 -6
- package/dist/src/controls/commonControls.mjs.map +1 -1
- package/dist/src/controls/controlRendering.d.ts +20 -0
- package/dist/src/controls/controlRendering.d.ts.map +1 -1
- package/dist/src/controls/controlRendering.mjs +63 -1
- package/dist/src/controls/controlRendering.mjs.map +1 -1
- package/dist/src/shapes/Frame.d.ts +298 -0
- package/dist/src/shapes/Frame.d.ts.map +1 -0
- package/dist/src/shapes/Frame.min.mjs +2 -0
- package/dist/src/shapes/Frame.min.mjs.map +1 -0
- package/dist/src/shapes/Frame.mjs +1236 -0
- package/dist/src/shapes/Frame.mjs.map +1 -0
- package/dist/src/shapes/Object/defaultValues.d.ts.map +1 -1
- package/dist/src/shapes/Object/defaultValues.mjs +8 -7
- package/dist/src/shapes/Object/defaultValues.mjs.map +1 -1
- package/dist-extensions/fabric.d.ts +2 -0
- package/dist-extensions/fabric.d.ts.map +1 -1
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FrameLayout.d.ts +31 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FrameLayout.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/index.d.ts +1 -0
- package/dist-extensions/src/LayoutManager/index.d.ts.map +1 -1
- package/dist-extensions/src/controls/commonControls.d.ts.map +1 -1
- package/dist-extensions/src/controls/controlRendering.d.ts +20 -0
- package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Frame.d.ts +298 -0
- package/dist-extensions/src/shapes/Frame.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/defaultValues.d.ts.map +1 -1
- package/fabric.ts +8 -0
- package/package.json +1 -1
- package/src/LayoutManager/LayoutStrategies/FrameLayout.ts +80 -0
- package/src/LayoutManager/index.ts +1 -0
- package/src/controls/commonControls.ts +22 -0
- package/src/controls/controlRendering.ts +83 -0
- package/src/shapes/Frame.ts +1361 -0
- package/src/shapes/Object/defaultValues.ts +8 -7
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var a="7.0.1-
|
|
1
|
+
var a="7.0.1-beta17";export{a as version};
|
|
2
2
|
//# sourceMappingURL=package.json.min.mjs.map
|
package/dist/package.json.mjs
CHANGED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Point } from '../../Point';
|
|
2
|
+
import type { FabricObject } from '../../shapes/Object/FabricObject';
|
|
3
|
+
import { LayoutStrategy } from './LayoutStrategy';
|
|
4
|
+
import type { LayoutStrategyResult, StrictLayoutContext } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* FrameLayout is a layout strategy that maintains fixed dimensions
|
|
7
|
+
* regardless of the content inside the group.
|
|
8
|
+
*
|
|
9
|
+
* This is essential for Frame objects where:
|
|
10
|
+
* - The frame size should never change when images are added/removed
|
|
11
|
+
* - Content is clipped to the frame boundaries
|
|
12
|
+
* - The frame acts as a container with fixed dimensions
|
|
13
|
+
*/
|
|
14
|
+
export declare class FrameLayout extends LayoutStrategy {
|
|
15
|
+
static readonly type = "frame-layout";
|
|
16
|
+
/**
|
|
17
|
+
* Override to prevent layout recalculation on content changes.
|
|
18
|
+
* Only perform layout during initialization or imperative calls.
|
|
19
|
+
*/
|
|
20
|
+
shouldPerformLayout({ type }: StrictLayoutContext): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Calculate the bounding box for frame objects.
|
|
23
|
+
* Returns the fixed frame dimensions instead of calculating from contents.
|
|
24
|
+
*/
|
|
25
|
+
calcBoundingBox(objects: FabricObject[], context: StrictLayoutContext): LayoutStrategyResult | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Override to always return fixed frame dimensions during initialization.
|
|
28
|
+
*/
|
|
29
|
+
getInitialSize(context: StrictLayoutContext, result: Pick<LayoutStrategyResult, 'center' | 'size'>): Point;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=FrameLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrameLayout.d.ts","sourceRoot":"","sources":["../../../../src/LayoutManager/LayoutStrategies/FrameLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG1E;;;;;;;;GAQG;AACH,qBAAa,WAAY,SAAQ,cAAc;IAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,kBAAkB;IAEtC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,IAAI,EAAE,EAAE,mBAAmB,GAAG,OAAO;IAM3D;;;OAGG;IACH,eAAe,CACb,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,mBAAmB,GAC3B,oBAAoB,GAAG,SAAS;IA6BnC;;OAEG;IACH,cAAc,CACZ,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACpD,KAAK;CAMT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defineProperty as e}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{Point as t}from"../../Point.min.mjs";import{classRegistry as r}from"../../ClassRegistry.min.mjs";import{LayoutStrategy as i}from"./LayoutStrategy.min.mjs";import{LAYOUT_TYPE_INITIALIZATION as n}from"../constants.min.mjs";class o extends i{shouldPerformLayout(e){let{type:t}=e;return t===n}calcBoundingBox(e,r){var i,o,l,m;const{type:a,target:s}=r,u=null!==(i=null!==(o=s.frameWidth)&&void 0!==o?o:s.width)&&void 0!==i?i:200,d=null!==(l=null!==(m=s.frameHeight)&&void 0!==m?m:s.height)&&void 0!==l?l:200,f=new t(u,d);if(a===n){return{center:new t(0,0),size:f,relativeCorrection:new t(0,0)}}return{center:s.getRelativeCenterPoint(),size:f}}getInitialSize(e,r){var i,n,o,l;const{target:m}=e,a=null!==(i=null!==(n=m.frameWidth)&&void 0!==n?n:m.width)&&void 0!==i?i:200,s=null!==(o=null!==(l=m.frameHeight)&&void 0!==l?l:m.height)&&void 0!==o?o:200;return new t(a,s)}}e(o,"type","frame-layout"),r.setClass(o);export{o as FrameLayout};
|
|
2
|
+
//# sourceMappingURL=FrameLayout.min.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrameLayout.min.mjs","sources":["../../../../src/LayoutManager/LayoutStrategies/FrameLayout.ts"],"sourcesContent":["import { Point } from '../../Point';\r\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\r\nimport { classRegistry } from '../../ClassRegistry';\r\nimport { LayoutStrategy } from './LayoutStrategy';\r\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\r\nimport { LAYOUT_TYPE_INITIALIZATION } from '../constants';\r\n\r\n/**\r\n * FrameLayout is a layout strategy that maintains fixed dimensions\r\n * regardless of the content inside the group.\r\n *\r\n * This is essential for Frame objects where:\r\n * - The frame size should never change when images are added/removed\r\n * - Content is clipped to the frame boundaries\r\n * - The frame acts as a container with fixed dimensions\r\n */\r\nexport class FrameLayout extends LayoutStrategy {\r\n static readonly type = 'frame-layout';\r\n\r\n /**\r\n * Override to prevent layout recalculation on content changes.\r\n * Only perform layout during initialization or imperative calls.\r\n */\r\n shouldPerformLayout({ type }: StrictLayoutContext): boolean {\r\n // Only perform layout during initialization\r\n // After that, the frame maintains its fixed size\r\n return type === LAYOUT_TYPE_INITIALIZATION;\r\n }\r\n\r\n /**\r\n * Calculate the bounding box for frame objects.\r\n * Returns the fixed frame dimensions instead of calculating from contents.\r\n */\r\n calcBoundingBox(\r\n objects: FabricObject[],\r\n context: StrictLayoutContext\r\n ): LayoutStrategyResult | undefined {\r\n const { type, target } = context;\r\n\r\n // Get fixed dimensions from frame properties\r\n const frameWidth = (target as any).frameWidth ?? target.width ?? 200;\r\n const frameHeight = (target as any).frameHeight ?? target.height ?? 200;\r\n\r\n const size = new Point(frameWidth, frameHeight);\r\n\r\n if (type === LAYOUT_TYPE_INITIALIZATION) {\r\n // During initialization, use the frame's position or calculate center\r\n const center = new Point(0, 0);\r\n\r\n return {\r\n center,\r\n size,\r\n relativeCorrection: new Point(0, 0),\r\n };\r\n }\r\n\r\n // For any other layout triggers, return the fixed size\r\n // This shouldn't normally be called due to shouldPerformLayout override\r\n const center = target.getRelativeCenterPoint();\r\n return {\r\n center,\r\n size,\r\n };\r\n }\r\n\r\n /**\r\n * Override to always return fixed frame dimensions during initialization.\r\n */\r\n getInitialSize(\r\n context: StrictLayoutContext,\r\n result: Pick<LayoutStrategyResult, 'center' | 'size'>\r\n ): Point {\r\n const { target } = context;\r\n const frameWidth = (target as any).frameWidth ?? target.width ?? 200;\r\n const frameHeight = (target as any).frameHeight ?? target.height ?? 200;\r\n return new Point(frameWidth, frameHeight);\r\n }\r\n}\r\n\r\nclassRegistry.setClass(FrameLayout);\r\n"],"names":["FrameLayout","LayoutStrategy","shouldPerformLayout","_ref","type","LAYOUT_TYPE_INITIALIZATION","calcBoundingBox","objects","context","_ref2","_frameWidth","_ref3","_frameHeight","target","frameWidth","width","frameHeight","height","size","Point","center","relativeCorrection","getRelativeCenterPoint","getInitialSize","result","_ref4","_frameWidth2","_ref5","_frameHeight2","_defineProperty","classRegistry","setClass"],"mappings":"yTAgBO,MAAMA,UAAoBC,EAO/BC,mBAAAA,CAAmBC,GAAyC,IAAxCC,KAAEA,GAA2BD,EAG/C,OAAOC,IAASC,CAClB,CAMAC,eAAAA,CACEC,EACAC,GACkC,IAAAC,EAAAC,EAAAC,EAAAC,EAClC,MAAMR,KAAEA,EAAIS,OAAEA,GAAWL,EAGnBM,UAAUL,EAA6B,QAA7BC,EAAIG,EAAeC,sBAAUJ,EAAAA,EAAIG,EAAOE,aAAK,IAAAN,EAAAA,EAAI,IAC3DO,UAAWL,EAA8B,QAA9BC,EAAIC,EAAeG,uBAAWJ,EAAAA,EAAIC,EAAOI,cAAM,IAAAN,EAAAA,EAAI,IAE9DO,EAAO,IAAIC,EAAML,EAAYE,GAEnC,GAAIZ,IAASC,EAA4B,CAIvC,MAAO,CACLe,OAHa,IAAID,EAAM,EAAG,GAI1BD,OACAG,mBAAoB,IAAIF,EAAM,EAAG,GAErC,CAKA,MAAO,CACLC,OAFaP,EAAOS,yBAGpBJ,OAEJ,CAKAK,cAAAA,CACEf,EACAgB,GACO,IAAAC,EAAAC,EAAAC,EAAAC,EACP,MAAMf,OAAEA,GAAWL,EACbM,UAAUW,EAA6B,QAA7BC,EAAIb,EAAeC,sBAAUY,EAAAA,EAAIb,EAAOE,aAAK,IAAAU,EAAAA,EAAI,IAC3DT,UAAWW,EAA8B,QAA9BC,EAAIf,EAAeG,uBAAWY,EAAAA,EAAIf,EAAOI,cAAM,IAAAU,EAAAA,EAAI,IACpE,OAAO,IAAIR,EAAML,EAAYE,EAC/B,EACDa,EA7DY7B,EAAW,OACC,gBA8DzB8B,EAAcC,SAAS/B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { defineProperty as _defineProperty } from '../../../_virtual/_rollupPluginBabelHelpers.mjs';
|
|
2
|
+
import { Point } from '../../Point.mjs';
|
|
3
|
+
import { classRegistry } from '../../ClassRegistry.mjs';
|
|
4
|
+
import { LayoutStrategy } from './LayoutStrategy.mjs';
|
|
5
|
+
import { LAYOUT_TYPE_INITIALIZATION } from '../constants.mjs';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* FrameLayout is a layout strategy that maintains fixed dimensions
|
|
9
|
+
* regardless of the content inside the group.
|
|
10
|
+
*
|
|
11
|
+
* This is essential for Frame objects where:
|
|
12
|
+
* - The frame size should never change when images are added/removed
|
|
13
|
+
* - Content is clipped to the frame boundaries
|
|
14
|
+
* - The frame acts as a container with fixed dimensions
|
|
15
|
+
*/
|
|
16
|
+
class FrameLayout extends LayoutStrategy {
|
|
17
|
+
/**
|
|
18
|
+
* Override to prevent layout recalculation on content changes.
|
|
19
|
+
* Only perform layout during initialization or imperative calls.
|
|
20
|
+
*/
|
|
21
|
+
shouldPerformLayout(_ref) {
|
|
22
|
+
let {
|
|
23
|
+
type
|
|
24
|
+
} = _ref;
|
|
25
|
+
// Only perform layout during initialization
|
|
26
|
+
// After that, the frame maintains its fixed size
|
|
27
|
+
return type === LAYOUT_TYPE_INITIALIZATION;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Calculate the bounding box for frame objects.
|
|
32
|
+
* Returns the fixed frame dimensions instead of calculating from contents.
|
|
33
|
+
*/
|
|
34
|
+
calcBoundingBox(objects, context) {
|
|
35
|
+
var _ref2, _frameWidth, _ref3, _frameHeight;
|
|
36
|
+
const {
|
|
37
|
+
type,
|
|
38
|
+
target
|
|
39
|
+
} = context;
|
|
40
|
+
|
|
41
|
+
// Get fixed dimensions from frame properties
|
|
42
|
+
const frameWidth = (_ref2 = (_frameWidth = target.frameWidth) !== null && _frameWidth !== void 0 ? _frameWidth : target.width) !== null && _ref2 !== void 0 ? _ref2 : 200;
|
|
43
|
+
const frameHeight = (_ref3 = (_frameHeight = target.frameHeight) !== null && _frameHeight !== void 0 ? _frameHeight : target.height) !== null && _ref3 !== void 0 ? _ref3 : 200;
|
|
44
|
+
const size = new Point(frameWidth, frameHeight);
|
|
45
|
+
if (type === LAYOUT_TYPE_INITIALIZATION) {
|
|
46
|
+
// During initialization, use the frame's position or calculate center
|
|
47
|
+
const center = new Point(0, 0);
|
|
48
|
+
return {
|
|
49
|
+
center,
|
|
50
|
+
size,
|
|
51
|
+
relativeCorrection: new Point(0, 0)
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// For any other layout triggers, return the fixed size
|
|
56
|
+
// This shouldn't normally be called due to shouldPerformLayout override
|
|
57
|
+
const center = target.getRelativeCenterPoint();
|
|
58
|
+
return {
|
|
59
|
+
center,
|
|
60
|
+
size
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Override to always return fixed frame dimensions during initialization.
|
|
66
|
+
*/
|
|
67
|
+
getInitialSize(context, result) {
|
|
68
|
+
var _ref4, _frameWidth2, _ref5, _frameHeight2;
|
|
69
|
+
const {
|
|
70
|
+
target
|
|
71
|
+
} = context;
|
|
72
|
+
const frameWidth = (_ref4 = (_frameWidth2 = target.frameWidth) !== null && _frameWidth2 !== void 0 ? _frameWidth2 : target.width) !== null && _ref4 !== void 0 ? _ref4 : 200;
|
|
73
|
+
const frameHeight = (_ref5 = (_frameHeight2 = target.frameHeight) !== null && _frameHeight2 !== void 0 ? _frameHeight2 : target.height) !== null && _ref5 !== void 0 ? _ref5 : 200;
|
|
74
|
+
return new Point(frameWidth, frameHeight);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
_defineProperty(FrameLayout, "type", 'frame-layout');
|
|
78
|
+
classRegistry.setClass(FrameLayout);
|
|
79
|
+
|
|
80
|
+
export { FrameLayout };
|
|
81
|
+
//# sourceMappingURL=FrameLayout.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrameLayout.mjs","sources":["../../../../src/LayoutManager/LayoutStrategies/FrameLayout.ts"],"sourcesContent":["import { Point } from '../../Point';\r\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\r\nimport { classRegistry } from '../../ClassRegistry';\r\nimport { LayoutStrategy } from './LayoutStrategy';\r\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\r\nimport { LAYOUT_TYPE_INITIALIZATION } from '../constants';\r\n\r\n/**\r\n * FrameLayout is a layout strategy that maintains fixed dimensions\r\n * regardless of the content inside the group.\r\n *\r\n * This is essential for Frame objects where:\r\n * - The frame size should never change when images are added/removed\r\n * - Content is clipped to the frame boundaries\r\n * - The frame acts as a container with fixed dimensions\r\n */\r\nexport class FrameLayout extends LayoutStrategy {\r\n static readonly type = 'frame-layout';\r\n\r\n /**\r\n * Override to prevent layout recalculation on content changes.\r\n * Only perform layout during initialization or imperative calls.\r\n */\r\n shouldPerformLayout({ type }: StrictLayoutContext): boolean {\r\n // Only perform layout during initialization\r\n // After that, the frame maintains its fixed size\r\n return type === LAYOUT_TYPE_INITIALIZATION;\r\n }\r\n\r\n /**\r\n * Calculate the bounding box for frame objects.\r\n * Returns the fixed frame dimensions instead of calculating from contents.\r\n */\r\n calcBoundingBox(\r\n objects: FabricObject[],\r\n context: StrictLayoutContext\r\n ): LayoutStrategyResult | undefined {\r\n const { type, target } = context;\r\n\r\n // Get fixed dimensions from frame properties\r\n const frameWidth = (target as any).frameWidth ?? target.width ?? 200;\r\n const frameHeight = (target as any).frameHeight ?? target.height ?? 200;\r\n\r\n const size = new Point(frameWidth, frameHeight);\r\n\r\n if (type === LAYOUT_TYPE_INITIALIZATION) {\r\n // During initialization, use the frame's position or calculate center\r\n const center = new Point(0, 0);\r\n\r\n return {\r\n center,\r\n size,\r\n relativeCorrection: new Point(0, 0),\r\n };\r\n }\r\n\r\n // For any other layout triggers, return the fixed size\r\n // This shouldn't normally be called due to shouldPerformLayout override\r\n const center = target.getRelativeCenterPoint();\r\n return {\r\n center,\r\n size,\r\n };\r\n }\r\n\r\n /**\r\n * Override to always return fixed frame dimensions during initialization.\r\n */\r\n getInitialSize(\r\n context: StrictLayoutContext,\r\n result: Pick<LayoutStrategyResult, 'center' | 'size'>\r\n ): Point {\r\n const { target } = context;\r\n const frameWidth = (target as any).frameWidth ?? target.width ?? 200;\r\n const frameHeight = (target as any).frameHeight ?? target.height ?? 200;\r\n return new Point(frameWidth, frameHeight);\r\n }\r\n}\r\n\r\nclassRegistry.setClass(FrameLayout);\r\n"],"names":["FrameLayout","LayoutStrategy","shouldPerformLayout","_ref","type","LAYOUT_TYPE_INITIALIZATION","calcBoundingBox","objects","context","_ref2","_frameWidth","_ref3","_frameHeight","target","frameWidth","width","frameHeight","height","size","Point","center","relativeCorrection","getRelativeCenterPoint","getInitialSize","result","_ref4","_frameWidth2","_ref5","_frameHeight2","_defineProperty","classRegistry","setClass"],"mappings":";;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,WAAW,SAASC,cAAc,CAAC;AAG9C;AACF;AACA;AACA;EACEC,mBAAmBA,CAAAC,IAAA,EAAyC;IAAA,IAAxC;AAAEC,MAAAA;AAA0B,KAAC,GAAAD,IAAA;AAC/C;AACA;IACA,OAAOC,IAAI,KAAKC,0BAA0B;AAC5C,EAAA;;AAEA;AACF;AACA;AACA;AACEC,EAAAA,eAAeA,CACbC,OAAuB,EACvBC,OAA4B,EACM;AAAA,IAAA,IAAAC,KAAA,EAAAC,WAAA,EAAAC,KAAA,EAAAC,YAAA;IAClC,MAAM;MAAER,IAAI;AAAES,MAAAA;AAAO,KAAC,GAAGL,OAAO;;AAEhC;IACA,MAAMM,UAAU,IAAAL,KAAA,GAAA,CAAAC,WAAA,GAAIG,MAAM,CAASC,UAAU,MAAA,IAAA,IAAAJ,WAAA,cAAAA,WAAA,GAAIG,MAAM,CAACE,KAAK,cAAAN,KAAA,KAAA,MAAA,GAAAA,KAAA,GAAI,GAAG;IACpE,MAAMO,WAAW,IAAAL,KAAA,GAAA,CAAAC,YAAA,GAAIC,MAAM,CAASG,WAAW,MAAA,IAAA,IAAAJ,YAAA,cAAAA,YAAA,GAAIC,MAAM,CAACI,MAAM,cAAAN,KAAA,KAAA,MAAA,GAAAA,KAAA,GAAI,GAAG;IAEvE,MAAMO,IAAI,GAAG,IAAIC,KAAK,CAACL,UAAU,EAAEE,WAAW,CAAC;IAE/C,IAAIZ,IAAI,KAAKC,0BAA0B,EAAE;AACvC;MACA,MAAMe,MAAM,GAAG,IAAID,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;MAE9B,OAAO;QACLC,MAAM;QACNF,IAAI;AACJG,QAAAA,kBAAkB,EAAE,IAAIF,KAAK,CAAC,CAAC,EAAE,CAAC;OACnC;AACH,IAAA;;AAEA;AACA;AACA,IAAA,MAAMC,MAAM,GAAGP,MAAM,CAACS,sBAAsB,EAAE;IAC9C,OAAO;MACLF,MAAM;AACNF,MAAAA;KACD;AACH,EAAA;;AAEA;AACF;AACA;AACEK,EAAAA,cAAcA,CACZf,OAA4B,EAC5BgB,MAAqD,EAC9C;AAAA,IAAA,IAAAC,KAAA,EAAAC,YAAA,EAAAC,KAAA,EAAAC,aAAA;IACP,MAAM;AAAEf,MAAAA;AAAO,KAAC,GAAGL,OAAO;IAC1B,MAAMM,UAAU,IAAAW,KAAA,GAAA,CAAAC,YAAA,GAAIb,MAAM,CAASC,UAAU,MAAA,IAAA,IAAAY,YAAA,cAAAA,YAAA,GAAIb,MAAM,CAACE,KAAK,cAAAU,KAAA,KAAA,MAAA,GAAAA,KAAA,GAAI,GAAG;IACpE,MAAMT,WAAW,IAAAW,KAAA,GAAA,CAAAC,aAAA,GAAIf,MAAM,CAASG,WAAW,MAAA,IAAA,IAAAY,aAAA,cAAAA,aAAA,GAAIf,MAAM,CAACI,MAAM,cAAAU,KAAA,KAAA,MAAA,GAAAA,KAAA,GAAI,GAAG;AACvE,IAAA,OAAO,IAAIR,KAAK,CAACL,UAAU,EAAEE,WAAW,CAAC;AAC3C,EAAA;AACF;AAACa,eAAA,CA7DY7B,WAAW,EAAA,MAAA,EACC,cAAc,CAAA;AA8DvC8B,aAAa,CAACC,QAAQ,CAAC/B,WAAW,CAAC;;;;"}
|
|
@@ -2,6 +2,7 @@ export * from './LayoutManager';
|
|
|
2
2
|
export * from './LayoutStrategies/ClipPathLayout';
|
|
3
3
|
export * from './LayoutStrategies/FitContentLayout';
|
|
4
4
|
export * from './LayoutStrategies/FixedLayout';
|
|
5
|
+
export * from './LayoutStrategies/FrameLayout';
|
|
5
6
|
export * from './LayoutStrategies/LayoutStrategy';
|
|
6
7
|
export type * from './types';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/LayoutManager/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,mBAAmB,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/LayoutManager/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,mBAAmB,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commonControls.d.ts","sourceRoot":"","sources":["../../../src/controls/commonControls.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"commonControls.d.ts","sourceRoot":"","sources":["../../../src/controls/commonControls.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,2BAA2B;;;;;;;;;;CAkFtC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;CAqB/B,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;CAQxC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ROTATE, RESIZING } from '../constants.mjs';
|
|
2
2
|
import { changeWidth } from './changeWidth.mjs';
|
|
3
3
|
import { Control } from './Control.mjs';
|
|
4
|
+
import { renderVerticalPillControl, renderHorizontalPillControl } from './controlRendering.mjs';
|
|
4
5
|
import { rotationStyleHandler, rotationWithSnapping } from './rotate.mjs';
|
|
5
6
|
import { scalingEqually, scaleCursorStyleHandler } from './scale.mjs';
|
|
6
7
|
import { scaleOrSkewActionName, scalingYOrSkewingX, scaleSkewCursorStyleHandler, scalingXOrSkewingY } from './scaleSkew.mjs';
|
|
@@ -12,28 +13,40 @@ const createObjectDefaultControls = () => ({
|
|
|
12
13
|
y: 0,
|
|
13
14
|
cursorStyleHandler: scaleSkewCursorStyleHandler,
|
|
14
15
|
actionHandler: scalingXOrSkewingY,
|
|
15
|
-
getActionName: scaleOrSkewActionName
|
|
16
|
+
getActionName: scaleOrSkewActionName,
|
|
17
|
+
render: renderHorizontalPillControl,
|
|
18
|
+
sizeX: 6,
|
|
19
|
+
sizeY: 20
|
|
16
20
|
}),
|
|
17
21
|
mr: new Control({
|
|
18
22
|
x: 0.5,
|
|
19
23
|
y: 0,
|
|
20
24
|
cursorStyleHandler: scaleSkewCursorStyleHandler,
|
|
21
25
|
actionHandler: scalingXOrSkewingY,
|
|
22
|
-
getActionName: scaleOrSkewActionName
|
|
26
|
+
getActionName: scaleOrSkewActionName,
|
|
27
|
+
render: renderHorizontalPillControl,
|
|
28
|
+
sizeX: 6,
|
|
29
|
+
sizeY: 20
|
|
23
30
|
}),
|
|
24
31
|
mb: new Control({
|
|
25
32
|
x: 0,
|
|
26
33
|
y: 0.5,
|
|
27
34
|
cursorStyleHandler: scaleSkewCursorStyleHandler,
|
|
28
35
|
actionHandler: scalingYOrSkewingX,
|
|
29
|
-
getActionName: scaleOrSkewActionName
|
|
36
|
+
getActionName: scaleOrSkewActionName,
|
|
37
|
+
render: renderVerticalPillControl,
|
|
38
|
+
sizeX: 20,
|
|
39
|
+
sizeY: 6
|
|
30
40
|
}),
|
|
31
41
|
mt: new Control({
|
|
32
42
|
x: 0,
|
|
33
43
|
y: -0.5,
|
|
34
44
|
cursorStyleHandler: scaleSkewCursorStyleHandler,
|
|
35
45
|
actionHandler: scalingYOrSkewingX,
|
|
36
|
-
getActionName: scaleOrSkewActionName
|
|
46
|
+
getActionName: scaleOrSkewActionName,
|
|
47
|
+
render: renderVerticalPillControl,
|
|
48
|
+
sizeX: 20,
|
|
49
|
+
sizeY: 6
|
|
37
50
|
}),
|
|
38
51
|
tl: new Control({
|
|
39
52
|
x: -0.5,
|
|
@@ -75,14 +88,20 @@ const createResizeControls = () => ({
|
|
|
75
88
|
y: 0,
|
|
76
89
|
actionHandler: changeWidth,
|
|
77
90
|
cursorStyleHandler: scaleSkewCursorStyleHandler,
|
|
78
|
-
actionName: RESIZING
|
|
91
|
+
actionName: RESIZING,
|
|
92
|
+
render: renderHorizontalPillControl,
|
|
93
|
+
sizeX: 6,
|
|
94
|
+
sizeY: 20
|
|
79
95
|
}),
|
|
80
96
|
ml: new Control({
|
|
81
97
|
x: -0.5,
|
|
82
98
|
y: 0,
|
|
83
99
|
actionHandler: changeWidth,
|
|
84
100
|
cursorStyleHandler: scaleSkewCursorStyleHandler,
|
|
85
|
-
actionName: RESIZING
|
|
101
|
+
actionName: RESIZING,
|
|
102
|
+
render: renderHorizontalPillControl,
|
|
103
|
+
sizeX: 6,
|
|
104
|
+
sizeY: 20
|
|
86
105
|
})
|
|
87
106
|
});
|
|
88
107
|
const createTextboxDefaultControls = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commonControls.mjs","sources":["../../../src/controls/commonControls.ts"],"sourcesContent":["import { RESIZING, ROTATE } from '../constants';\r\nimport { changeWidth } from './changeWidth';\r\nimport { changeHeight } from './changeHeight';\r\nimport { Control } from './Control';\r\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\r\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\r\nimport {\r\n scaleOrSkewActionName,\r\n scaleSkewCursorStyleHandler,\r\n scalingXOrSkewingY,\r\n scalingYOrSkewingX,\r\n} from './scaleSkew';\r\n\r\n// use this function if you want to generate new controls for every instance\r\nexport const createObjectDefaultControls = () => ({\r\n ml: new Control({\r\n x: -0.5,\r\n y: 0,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionHandler: scalingXOrSkewingY,\r\n getActionName: scaleOrSkewActionName,\r\n }),\r\n\r\n mr: new Control({\r\n x: 0.5,\r\n y: 0,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionHandler: scalingXOrSkewingY,\r\n getActionName: scaleOrSkewActionName,\r\n }),\r\n\r\n mb: new Control({\r\n x: 0,\r\n y: 0.5,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionHandler: scalingYOrSkewingX,\r\n getActionName: scaleOrSkewActionName,\r\n }),\r\n\r\n mt: new Control({\r\n x: 0,\r\n y: -0.5,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionHandler: scalingYOrSkewingX,\r\n getActionName: scaleOrSkewActionName,\r\n }),\r\n\r\n tl: new Control({\r\n x: -0.5,\r\n y: -0.5,\r\n cursorStyleHandler: scaleCursorStyleHandler,\r\n actionHandler: scalingEqually,\r\n }),\r\n\r\n tr: new Control({\r\n x: 0.5,\r\n y: -0.5,\r\n cursorStyleHandler: scaleCursorStyleHandler,\r\n actionHandler: scalingEqually,\r\n }),\r\n\r\n bl: new Control({\r\n x: -0.5,\r\n y: 0.5,\r\n cursorStyleHandler: scaleCursorStyleHandler,\r\n actionHandler: scalingEqually,\r\n }),\r\n\r\n br: new Control({\r\n x: 0.5,\r\n y: 0.5,\r\n cursorStyleHandler: scaleCursorStyleHandler,\r\n actionHandler: scalingEqually,\r\n }),\r\n\r\n mtr: new Control({\r\n x: 0,\r\n y: -0.5,\r\n actionHandler: rotationWithSnapping,\r\n cursorStyleHandler: rotationStyleHandler,\r\n offsetY: -40,\r\n withConnection: true,\r\n actionName: ROTATE,\r\n }),\r\n});\r\n\r\nexport const createResizeControls = () => ({\r\n mr: new Control({\r\n x: 0.5,\r\n y: 0,\r\n actionHandler: changeWidth,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionName: RESIZING,\r\n }),\r\n ml: new Control({\r\n x: -0.5,\r\n y: 0,\r\n actionHandler: changeWidth,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionName: RESIZING,\r\n }),\r\n});\r\n\r\nexport const createTextboxDefaultControls = () => {\r\n const { mt, mb, ...controls } = {\r\n ...createObjectDefaultControls(),\r\n ...createResizeControls(),\r\n };\r\n // Exclude mt and mb controls - textbox height is auto-calculated based on content\r\n // Only width can be manually adjusted, height adjusts automatically for text wrapping\r\n return controls;\r\n};\r\n"],"names":["createObjectDefaultControls","ml","Control","x","y","cursorStyleHandler","scaleSkewCursorStyleHandler","actionHandler","scalingXOrSkewingY","getActionName","scaleOrSkewActionName","mr","mb","scalingYOrSkewingX","mt","tl","scaleCursorStyleHandler","scalingEqually","tr","bl","br","mtr","rotationWithSnapping","rotationStyleHandler","offsetY","withConnection","actionName","ROTATE","createResizeControls","changeWidth","RESIZING","createTextboxDefaultControls","controls"],"mappings":"
|
|
1
|
+
{"version":3,"file":"commonControls.mjs","sources":["../../../src/controls/commonControls.ts"],"sourcesContent":["import { RESIZING, ROTATE } from '../constants';\r\nimport { changeWidth } from './changeWidth';\r\nimport { changeHeight } from './changeHeight';\r\nimport { Control } from './Control';\r\nimport {\r\n renderHorizontalPillControl,\r\n renderVerticalPillControl,\r\n} from './controlRendering';\r\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\r\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\r\nimport {\r\n scaleOrSkewActionName,\r\n scaleSkewCursorStyleHandler,\r\n scalingXOrSkewingY,\r\n scalingYOrSkewingX,\r\n} from './scaleSkew';\r\n\r\n// use this function if you want to generate new controls for every instance\r\nexport const createObjectDefaultControls = () => ({\r\n ml: new Control({\r\n x: -0.5,\r\n y: 0,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionHandler: scalingXOrSkewingY,\r\n getActionName: scaleOrSkewActionName,\r\n render: renderHorizontalPillControl,\r\n sizeX: 6,\r\n sizeY: 20,\r\n }),\r\n\r\n mr: new Control({\r\n x: 0.5,\r\n y: 0,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionHandler: scalingXOrSkewingY,\r\n getActionName: scaleOrSkewActionName,\r\n render: renderHorizontalPillControl,\r\n sizeX: 6,\r\n sizeY: 20,\r\n }),\r\n\r\n mb: new Control({\r\n x: 0,\r\n y: 0.5,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionHandler: scalingYOrSkewingX,\r\n getActionName: scaleOrSkewActionName,\r\n render: renderVerticalPillControl,\r\n sizeX: 20,\r\n sizeY: 6,\r\n }),\r\n\r\n mt: new Control({\r\n x: 0,\r\n y: -0.5,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionHandler: scalingYOrSkewingX,\r\n getActionName: scaleOrSkewActionName,\r\n render: renderVerticalPillControl,\r\n sizeX: 20,\r\n sizeY: 6,\r\n }),\r\n\r\n tl: new Control({\r\n x: -0.5,\r\n y: -0.5,\r\n cursorStyleHandler: scaleCursorStyleHandler,\r\n actionHandler: scalingEqually,\r\n }),\r\n\r\n tr: new Control({\r\n x: 0.5,\r\n y: -0.5,\r\n cursorStyleHandler: scaleCursorStyleHandler,\r\n actionHandler: scalingEqually,\r\n }),\r\n\r\n bl: new Control({\r\n x: -0.5,\r\n y: 0.5,\r\n cursorStyleHandler: scaleCursorStyleHandler,\r\n actionHandler: scalingEqually,\r\n }),\r\n\r\n br: new Control({\r\n x: 0.5,\r\n y: 0.5,\r\n cursorStyleHandler: scaleCursorStyleHandler,\r\n actionHandler: scalingEqually,\r\n }),\r\n\r\n mtr: new Control({\r\n x: 0,\r\n y: -0.5,\r\n actionHandler: rotationWithSnapping,\r\n cursorStyleHandler: rotationStyleHandler,\r\n offsetY: -40,\r\n withConnection: true,\r\n actionName: ROTATE,\r\n }),\r\n});\r\n\r\nexport const createResizeControls = () => ({\r\n mr: new Control({\r\n x: 0.5,\r\n y: 0,\r\n actionHandler: changeWidth,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionName: RESIZING,\r\n render: renderHorizontalPillControl,\r\n sizeX: 6,\r\n sizeY: 20,\r\n }),\r\n ml: new Control({\r\n x: -0.5,\r\n y: 0,\r\n actionHandler: changeWidth,\r\n cursorStyleHandler: scaleSkewCursorStyleHandler,\r\n actionName: RESIZING,\r\n render: renderHorizontalPillControl,\r\n sizeX: 6,\r\n sizeY: 20,\r\n }),\r\n});\r\n\r\nexport const createTextboxDefaultControls = () => {\r\n const { mt, mb, ...controls } = {\r\n ...createObjectDefaultControls(),\r\n ...createResizeControls(),\r\n };\r\n // Exclude mt and mb controls - textbox height is auto-calculated based on content\r\n // Only width can be manually adjusted, height adjusts automatically for text wrapping\r\n return controls;\r\n};\r\n"],"names":["createObjectDefaultControls","ml","Control","x","y","cursorStyleHandler","scaleSkewCursorStyleHandler","actionHandler","scalingXOrSkewingY","getActionName","scaleOrSkewActionName","render","renderHorizontalPillControl","sizeX","sizeY","mr","mb","scalingYOrSkewingX","renderVerticalPillControl","mt","tl","scaleCursorStyleHandler","scalingEqually","tr","bl","br","mtr","rotationWithSnapping","rotationStyleHandler","offsetY","withConnection","actionName","ROTATE","createResizeControls","changeWidth","RESIZING","createTextboxDefaultControls","controls"],"mappings":"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"}
|
|
@@ -26,4 +26,24 @@ export declare function renderCircleControl(this: Control, ctx: CanvasRenderingC
|
|
|
26
26
|
* @param {FabricObject} fabricObject the fabric object for which we are rendering controls
|
|
27
27
|
*/
|
|
28
28
|
export declare function renderSquareControl(this: Control, ctx: CanvasRenderingContext2D, left: number, top: number, styleOverride: ControlRenderingStyleOverride, fabricObject: InteractiveFabricObject): void;
|
|
29
|
+
/**
|
|
30
|
+
* Render a horizontal pill control (for left/right side handles).
|
|
31
|
+
* Modern Canva-style appearance.
|
|
32
|
+
* @param {CanvasRenderingContext2D} ctx context to render on
|
|
33
|
+
* @param {Number} left x coordinate where the control center should be
|
|
34
|
+
* @param {Number} top y coordinate where the control center should be
|
|
35
|
+
* @param {Object} styleOverride override for FabricObject controls style
|
|
36
|
+
* @param {FabricObject} fabricObject the fabric object for which we are rendering controls
|
|
37
|
+
*/
|
|
38
|
+
export declare function renderHorizontalPillControl(this: Control, ctx: CanvasRenderingContext2D, left: number, top: number, styleOverride: ControlRenderingStyleOverride, fabricObject: InteractiveFabricObject): void;
|
|
39
|
+
/**
|
|
40
|
+
* Render a vertical pill control (for top/bottom side handles).
|
|
41
|
+
* Modern Canva-style appearance.
|
|
42
|
+
* @param {CanvasRenderingContext2D} ctx context to render on
|
|
43
|
+
* @param {Number} left x coordinate where the control center should be
|
|
44
|
+
* @param {Number} top y coordinate where the control center should be
|
|
45
|
+
* @param {Object} styleOverride override for FabricObject controls style
|
|
46
|
+
* @param {FabricObject} fabricObject the fabric object for which we are rendering controls
|
|
47
|
+
*/
|
|
48
|
+
export declare function renderVerticalPillControl(this: Control, ctx: CanvasRenderingContext2D, left: number, top: number, styleOverride: ControlRenderingStyleOverride, fabricObject: InteractiveFabricObject): void;
|
|
29
49
|
//# sourceMappingURL=controlRendering.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controlRendering.d.ts","sourceRoot":"","sources":["../../../src/controls/controlRendering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAElF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"controlRendering.d.ts","sourceRoot":"","sources":["../../../src/controls/controlRendering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAElF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,MAAM,6BAA6B,GAAG,OAAO,CACjD,IAAI,CACF,uBAAuB,EACrB,aAAa,GACb,YAAY,GACZ,aAAa,GACb,mBAAmB,GACnB,iBAAiB,GACjB,oBAAoB,CACvB,CACF,CAAC;AAEF,MAAM,MAAM,eAAe,CACzB,CAAC,SAAS,uBAAuB,GAAG,uBAAuB,IACzD,CACF,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,6BAA6B,EAC5C,YAAY,EAAE,CAAC,KACZ,IAAI,CAAC;AAEV;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,6BAA6B,EAC5C,YAAY,EAAE,uBAAuB,QAwCtC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,6BAA6B,EAC5C,YAAY,EAAE,uBAAuB,QAgCtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,6BAA6B,EAC5C,YAAY,EAAE,uBAAuB,QAqBtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,6BAA6B,EAC5C,YAAY,EAAE,uBAAuB,QAqBtC"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { STROKE, FILL, twoMathPi } from '../constants.mjs';
|
|
2
2
|
import { degreesToRadians } from '../util/misc/radiansDegreesConversion.mjs';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Pill dimensions for side controls (Canva-style)
|
|
6
|
+
*/
|
|
7
|
+
const PILL_WIDTH = 6;
|
|
8
|
+
const PILL_HEIGHT = 20;
|
|
9
|
+
const PILL_RADIUS = 3;
|
|
4
10
|
/**
|
|
5
11
|
* Render a round control, as per fabric features.
|
|
6
12
|
* This function is written to respect object properties like transparentCorners, cornerSize
|
|
@@ -83,5 +89,61 @@ function renderSquareControl(ctx, left, top, styleOverride, fabricObject) {
|
|
|
83
89
|
ctx.restore();
|
|
84
90
|
}
|
|
85
91
|
|
|
86
|
-
|
|
92
|
+
/**
|
|
93
|
+
* Render a horizontal pill control (for left/right side handles).
|
|
94
|
+
* Modern Canva-style appearance.
|
|
95
|
+
* @param {CanvasRenderingContext2D} ctx context to render on
|
|
96
|
+
* @param {Number} left x coordinate where the control center should be
|
|
97
|
+
* @param {Number} top y coordinate where the control center should be
|
|
98
|
+
* @param {Object} styleOverride override for FabricObject controls style
|
|
99
|
+
* @param {FabricObject} fabricObject the fabric object for which we are rendering controls
|
|
100
|
+
*/
|
|
101
|
+
function renderHorizontalPillControl(ctx, left, top, styleOverride, fabricObject) {
|
|
102
|
+
styleOverride = styleOverride || {};
|
|
103
|
+
const width = PILL_WIDTH;
|
|
104
|
+
const height = PILL_HEIGHT;
|
|
105
|
+
const radius = PILL_RADIUS;
|
|
106
|
+
ctx.save();
|
|
107
|
+
ctx.translate(left, top);
|
|
108
|
+
const angle = fabricObject.getTotalAngle();
|
|
109
|
+
ctx.rotate(degreesToRadians(angle));
|
|
110
|
+
ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '#ffffff';
|
|
111
|
+
ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '#0d99ff';
|
|
112
|
+
ctx.lineWidth = 1.5;
|
|
113
|
+
ctx.beginPath();
|
|
114
|
+
ctx.roundRect(-width / 2, -height / 2, width, height, radius);
|
|
115
|
+
ctx.fill();
|
|
116
|
+
ctx.stroke();
|
|
117
|
+
ctx.restore();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Render a vertical pill control (for top/bottom side handles).
|
|
122
|
+
* Modern Canva-style appearance.
|
|
123
|
+
* @param {CanvasRenderingContext2D} ctx context to render on
|
|
124
|
+
* @param {Number} left x coordinate where the control center should be
|
|
125
|
+
* @param {Number} top y coordinate where the control center should be
|
|
126
|
+
* @param {Object} styleOverride override for FabricObject controls style
|
|
127
|
+
* @param {FabricObject} fabricObject the fabric object for which we are rendering controls
|
|
128
|
+
*/
|
|
129
|
+
function renderVerticalPillControl(ctx, left, top, styleOverride, fabricObject) {
|
|
130
|
+
styleOverride = styleOverride || {};
|
|
131
|
+
const width = PILL_HEIGHT; // Swapped for vertical
|
|
132
|
+
const height = PILL_WIDTH;
|
|
133
|
+
const radius = PILL_RADIUS;
|
|
134
|
+
ctx.save();
|
|
135
|
+
ctx.translate(left, top);
|
|
136
|
+
const angle = fabricObject.getTotalAngle();
|
|
137
|
+
ctx.rotate(degreesToRadians(angle));
|
|
138
|
+
ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '#ffffff';
|
|
139
|
+
ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '#0d99ff';
|
|
140
|
+
ctx.lineWidth = 1.5;
|
|
141
|
+
ctx.beginPath();
|
|
142
|
+
ctx.roundRect(-width / 2, -height / 2, width, height, radius);
|
|
143
|
+
ctx.fill();
|
|
144
|
+
ctx.stroke();
|
|
145
|
+
ctx.restore();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export { renderCircleControl, renderHorizontalPillControl, renderSquareControl, renderVerticalPillControl };
|
|
87
149
|
//# sourceMappingURL=controlRendering.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controlRendering.mjs","sources":["../../../src/controls/controlRendering.ts"],"sourcesContent":["import { FILL, STROKE, twoMathPi } from '../constants';\r\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\r\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\r\nimport type { Control } from './Control';\r\n\r\nexport type ControlRenderingStyleOverride = Partial<\r\n Pick<\r\n InteractiveFabricObject,\r\n | 'cornerStyle'\r\n | 'cornerSize'\r\n | 'cornerColor'\r\n | 'cornerStrokeColor'\r\n | 'cornerDashArray'\r\n | 'transparentCorners'\r\n >\r\n>;\r\n\r\nexport type ControlRenderer<\r\n O extends InteractiveFabricObject = InteractiveFabricObject,\r\n> = (\r\n ctx: CanvasRenderingContext2D,\r\n left: number,\r\n top: number,\r\n styleOverride: ControlRenderingStyleOverride,\r\n fabricObject: O,\r\n) => void;\r\n\r\n/**\r\n * Render a round control, as per fabric features.\r\n * This function is written to respect object properties like transparentCorners, cornerSize\r\n * cornerColor, cornerStrokeColor\r\n * plus the addition of offsetY and offsetX.\r\n * @param {CanvasRenderingContext2D} ctx context to render on\r\n * @param {Number} left x coordinate where the control center should be\r\n * @param {Number} top y coordinate where the control center should be\r\n * @param {Object} styleOverride override for FabricObject controls style\r\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\r\n */\r\nexport function renderCircleControl(\r\n this: Control,\r\n ctx: CanvasRenderingContext2D,\r\n left: number,\r\n top: number,\r\n styleOverride: ControlRenderingStyleOverride,\r\n fabricObject: InteractiveFabricObject,\r\n) {\r\n styleOverride = styleOverride || {};\r\n const xSize =\r\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\r\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\r\n transparentCorners =\r\n typeof styleOverride.transparentCorners !== 'undefined'\r\n ? styleOverride.transparentCorners\r\n : fabricObject.transparentCorners,\r\n methodName = transparentCorners ? STROKE : FILL,\r\n stroke =\r\n !transparentCorners &&\r\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\r\n let myLeft = left,\r\n myTop = top,\r\n size;\r\n ctx.save();\r\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\r\n ctx.strokeStyle =\r\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\r\n // TODO: use proper ellipse code.\r\n if (xSize > ySize) {\r\n size = xSize;\r\n ctx.scale(1.0, ySize / xSize);\r\n myTop = (top * xSize) / ySize;\r\n } else if (ySize > xSize) {\r\n size = ySize;\r\n ctx.scale(xSize / ySize, 1.0);\r\n myLeft = (left * ySize) / xSize;\r\n } else {\r\n size = xSize;\r\n }\r\n ctx.beginPath();\r\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\r\n ctx[methodName]();\r\n if (stroke) {\r\n ctx.stroke();\r\n }\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * Render a square control, as per fabric features.\r\n * This function is written to respect object properties like transparentCorners, cornerSize\r\n * cornerColor, cornerStrokeColor\r\n * plus the addition of offsetY and offsetX.\r\n * @param {CanvasRenderingContext2D} ctx context to render on\r\n * @param {Number} left x coordinate where the control center should be\r\n * @param {Number} top y coordinate where the control center should be\r\n * @param {Object} styleOverride override for FabricObject controls style\r\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\r\n */\r\nexport function renderSquareControl(\r\n this: Control,\r\n ctx: CanvasRenderingContext2D,\r\n left: number,\r\n top: number,\r\n styleOverride: ControlRenderingStyleOverride,\r\n fabricObject: InteractiveFabricObject,\r\n) {\r\n styleOverride = styleOverride || {};\r\n const xSize =\r\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\r\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\r\n transparentCorners =\r\n typeof styleOverride.transparentCorners !== 'undefined'\r\n ? styleOverride.transparentCorners\r\n : fabricObject.transparentCorners,\r\n methodName = transparentCorners ? STROKE : FILL,\r\n stroke =\r\n !transparentCorners &&\r\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\r\n xSizeBy2 = xSize / 2,\r\n ySizeBy2 = ySize / 2;\r\n ctx.save();\r\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\r\n ctx.strokeStyle =\r\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\r\n ctx.translate(left, top);\r\n // angle is relative to canvas plane\r\n const angle = fabricObject.getTotalAngle();\r\n ctx.rotate(degreesToRadians(angle));\r\n // this does not work, and fixed with ( && ) does not make sense.\r\n // to have real transparent corners we need the controls on upperCanvas\r\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\r\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\r\n if (stroke) {\r\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\r\n }\r\n ctx.restore();\r\n}\r\n"],"names":["renderCircleControl","ctx","left","top","styleOverride","fabricObject","xSize","sizeX","cornerSize","ySize","sizeY","transparentCorners","methodName","STROKE","FILL","stroke","cornerStrokeColor","myLeft","myTop","size","save","fillStyle","cornerColor","strokeStyle","scale","beginPath","arc","twoMathPi","restore","renderSquareControl","xSizeBy2","ySizeBy2","translate","angle","getTotalAngle","rotate","degreesToRadians","strokeRect"],"mappings":";;;AA2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,mBAAmBA,CAEjCC,GAA6B,EAC7BC,IAAY,EACZC,GAAW,EACXC,aAA4C,EAC5CC,YAAqC,EACrC;AACAD,EAAAA,aAAa,GAAGA,aAAa,IAAI,EAAE;AACnC,EAAA,MAAME,KAAK,GACP,IAAI,CAACC,KAAK,IAAIH,aAAa,CAACI,UAAU,IAAIH,YAAY,CAACG,UAAU;IACnEC,KAAK,GAAG,IAAI,CAACC,KAAK,IAAIN,aAAa,CAACI,UAAU,IAAIH,YAAY,CAACG,UAAU;AACzEG,IAAAA,kBAAkB,GAChB,OAAOP,aAAa,CAACO,kBAAkB,KAAK,WAAW,GACnDP,aAAa,CAACO,kBAAkB,GAChCN,YAAY,CAACM,kBAAkB;AACrCC,IAAAA,UAAU,GAAGD,kBAAkB,GAAGE,MAAM,GAAGC,IAAI;IAC/CC,MAAM,GACJ,CAACJ,kBAAkB,KAClBP,aAAa,CAACY,iBAAiB,IAAIX,YAAY,CAACW,iBAAiB,CAAC;EACvE,IAAIC,MAAM,GAAGf,IAAI;AACfgB,IAAAA,KAAK,GAAGf,GAAG;IACXgB,IAAI;EACNlB,GAAG,CAACmB,IAAI,EAAE;EACVnB,GAAG,CAACoB,SAAS,GAAGjB,aAAa,CAACkB,WAAW,IAAIjB,YAAY,CAACiB,WAAW,IAAI,EAAE;EAC3ErB,GAAG,CAACsB,WAAW,GACbnB,aAAa,CAACY,iBAAiB,IAAIX,YAAY,CAACW,iBAAiB,IAAI,EAAE;AACzE;EACA,IAAIV,KAAK,GAAGG,KAAK,EAAE;AACjBU,IAAAA,IAAI,GAAGb,KAAK;IACZL,GAAG,CAACuB,KAAK,CAAC,GAAG,EAAEf,KAAK,GAAGH,KAAK,CAAC;AAC7BY,IAAAA,KAAK,GAAIf,GAAG,GAAGG,KAAK,GAAIG,KAAK;AAC/B,EAAA,CAAC,MAAM,IAAIA,KAAK,GAAGH,KAAK,EAAE;AACxBa,IAAAA,IAAI,GAAGV,KAAK;IACZR,GAAG,CAACuB,KAAK,CAAClB,KAAK,GAAGG,KAAK,EAAE,GAAG,CAAC;AAC7BQ,IAAAA,MAAM,GAAIf,IAAI,GAAGO,KAAK,GAAIH,KAAK;AACjC,EAAA,CAAC,MAAM;AACLa,IAAAA,IAAI,GAAGb,KAAK;AACd,EAAA;EACAL,GAAG,CAACwB,SAAS,EAAE;AACfxB,EAAAA,GAAG,CAACyB,GAAG,CAACT,MAAM,EAAEC,KAAK,EAAEC,IAAI,GAAG,CAAC,EAAE,CAAC,EAAEQ,SAAS,EAAE,KAAK,CAAC;AACrD1B,EAAAA,GAAG,CAACW,UAAU,CAAC,EAAE;AACjB,EAAA,IAAIG,MAAM,EAAE;IACVd,GAAG,CAACc,MAAM,EAAE;AACd,EAAA;EACAd,GAAG,CAAC2B,OAAO,EAAE;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,mBAAmBA,CAEjC5B,GAA6B,EAC7BC,IAAY,EACZC,GAAW,EACXC,aAA4C,EAC5CC,YAAqC,EACrC;AACAD,EAAAA,aAAa,GAAGA,aAAa,IAAI,EAAE;AACnC,EAAA,MAAME,KAAK,GACP,IAAI,CAACC,KAAK,IAAIH,aAAa,CAACI,UAAU,IAAIH,YAAY,CAACG,UAAU;IACnEC,KAAK,GAAG,IAAI,CAACC,KAAK,IAAIN,aAAa,CAACI,UAAU,IAAIH,YAAY,CAACG,UAAU;AACzEG,IAAAA,kBAAkB,GAChB,OAAOP,aAAa,CAACO,kBAAkB,KAAK,WAAW,GACnDP,aAAa,CAACO,kBAAkB,GAChCN,YAAY,CAACM,kBAAkB;AACrCC,IAAAA,UAAU,GAAGD,kBAAkB,GAAGE,MAAM,GAAGC,IAAI;IAC/CC,MAAM,GACJ,CAACJ,kBAAkB,KAClBP,aAAa,CAACY,iBAAiB,IAAIX,YAAY,CAACW,iBAAiB,CAAC;IACrEc,QAAQ,GAAGxB,KAAK,GAAG,CAAC;IACpByB,QAAQ,GAAGtB,KAAK,GAAG,CAAC;EACtBR,GAAG,CAACmB,IAAI,EAAE;EACVnB,GAAG,CAACoB,SAAS,GAAGjB,aAAa,CAACkB,WAAW,IAAIjB,YAAY,CAACiB,WAAW,IAAI,EAAE;EAC3ErB,GAAG,CAACsB,WAAW,GACbnB,aAAa,CAACY,iBAAiB,IAAIX,YAAY,CAACW,iBAAiB,IAAI,EAAE;AACzEf,EAAAA,GAAG,CAAC+B,SAAS,CAAC9B,IAAI,EAAEC,GAAG,CAAC;AACxB;AACA,EAAA,MAAM8B,KAAK,GAAG5B,YAAY,CAAC6B,aAAa,EAAE;AAC1CjC,EAAAA,GAAG,CAACkC,MAAM,CAACC,gBAAgB,CAACH,KAAK,CAAC,CAAC;AACnC;AACA;AACA;AACAhC,EAAAA,GAAG,CAAC,CAAA,EAAGW,UAAU,CAAA,IAAA,CAAM,CAAC,CAAC,CAACkB,QAAQ,EAAE,CAACC,QAAQ,EAAEzB,KAAK,EAAEG,KAAK,CAAC;AAC5D,EAAA,IAAIM,MAAM,EAAE;AACVd,IAAAA,GAAG,CAACoC,UAAU,CAAC,CAACP,QAAQ,EAAE,CAACC,QAAQ,EAAEzB,KAAK,EAAEG,KAAK,CAAC;AACpD,EAAA;EACAR,GAAG,CAAC2B,OAAO,EAAE;AACf;;;;"}
|
|
1
|
+
{"version":3,"file":"controlRendering.mjs","sources":["../../../src/controls/controlRendering.ts"],"sourcesContent":["import { FILL, STROKE, twoMathPi } from '../constants';\r\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\r\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\r\nimport type { Control } from './Control';\r\n\r\n/**\r\n * Pill dimensions for side controls (Canva-style)\r\n */\r\nconst PILL_WIDTH = 6;\r\nconst PILL_HEIGHT = 20;\r\nconst PILL_RADIUS = 3;\r\n\r\nexport type ControlRenderingStyleOverride = Partial<\r\n Pick<\r\n InteractiveFabricObject,\r\n | 'cornerStyle'\r\n | 'cornerSize'\r\n | 'cornerColor'\r\n | 'cornerStrokeColor'\r\n | 'cornerDashArray'\r\n | 'transparentCorners'\r\n >\r\n>;\r\n\r\nexport type ControlRenderer<\r\n O extends InteractiveFabricObject = InteractiveFabricObject,\r\n> = (\r\n ctx: CanvasRenderingContext2D,\r\n left: number,\r\n top: number,\r\n styleOverride: ControlRenderingStyleOverride,\r\n fabricObject: O,\r\n) => void;\r\n\r\n/**\r\n * Render a round control, as per fabric features.\r\n * This function is written to respect object properties like transparentCorners, cornerSize\r\n * cornerColor, cornerStrokeColor\r\n * plus the addition of offsetY and offsetX.\r\n * @param {CanvasRenderingContext2D} ctx context to render on\r\n * @param {Number} left x coordinate where the control center should be\r\n * @param {Number} top y coordinate where the control center should be\r\n * @param {Object} styleOverride override for FabricObject controls style\r\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\r\n */\r\nexport function renderCircleControl(\r\n this: Control,\r\n ctx: CanvasRenderingContext2D,\r\n left: number,\r\n top: number,\r\n styleOverride: ControlRenderingStyleOverride,\r\n fabricObject: InteractiveFabricObject,\r\n) {\r\n styleOverride = styleOverride || {};\r\n const xSize =\r\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\r\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\r\n transparentCorners =\r\n typeof styleOverride.transparentCorners !== 'undefined'\r\n ? styleOverride.transparentCorners\r\n : fabricObject.transparentCorners,\r\n methodName = transparentCorners ? STROKE : FILL,\r\n stroke =\r\n !transparentCorners &&\r\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\r\n let myLeft = left,\r\n myTop = top,\r\n size;\r\n ctx.save();\r\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\r\n ctx.strokeStyle =\r\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\r\n // TODO: use proper ellipse code.\r\n if (xSize > ySize) {\r\n size = xSize;\r\n ctx.scale(1.0, ySize / xSize);\r\n myTop = (top * xSize) / ySize;\r\n } else if (ySize > xSize) {\r\n size = ySize;\r\n ctx.scale(xSize / ySize, 1.0);\r\n myLeft = (left * ySize) / xSize;\r\n } else {\r\n size = xSize;\r\n }\r\n ctx.beginPath();\r\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\r\n ctx[methodName]();\r\n if (stroke) {\r\n ctx.stroke();\r\n }\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * Render a square control, as per fabric features.\r\n * This function is written to respect object properties like transparentCorners, cornerSize\r\n * cornerColor, cornerStrokeColor\r\n * plus the addition of offsetY and offsetX.\r\n * @param {CanvasRenderingContext2D} ctx context to render on\r\n * @param {Number} left x coordinate where the control center should be\r\n * @param {Number} top y coordinate where the control center should be\r\n * @param {Object} styleOverride override for FabricObject controls style\r\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\r\n */\r\nexport function renderSquareControl(\r\n this: Control,\r\n ctx: CanvasRenderingContext2D,\r\n left: number,\r\n top: number,\r\n styleOverride: ControlRenderingStyleOverride,\r\n fabricObject: InteractiveFabricObject,\r\n) {\r\n styleOverride = styleOverride || {};\r\n const xSize =\r\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\r\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\r\n transparentCorners =\r\n typeof styleOverride.transparentCorners !== 'undefined'\r\n ? styleOverride.transparentCorners\r\n : fabricObject.transparentCorners,\r\n methodName = transparentCorners ? STROKE : FILL,\r\n stroke =\r\n !transparentCorners &&\r\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\r\n xSizeBy2 = xSize / 2,\r\n ySizeBy2 = ySize / 2;\r\n ctx.save();\r\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\r\n ctx.strokeStyle =\r\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\r\n ctx.translate(left, top);\r\n // angle is relative to canvas plane\r\n const angle = fabricObject.getTotalAngle();\r\n ctx.rotate(degreesToRadians(angle));\r\n // this does not work, and fixed with ( && ) does not make sense.\r\n // to have real transparent corners we need the controls on upperCanvas\r\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\r\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\r\n if (stroke) {\r\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\r\n }\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * Render a horizontal pill control (for left/right side handles).\r\n * Modern Canva-style appearance.\r\n * @param {CanvasRenderingContext2D} ctx context to render on\r\n * @param {Number} left x coordinate where the control center should be\r\n * @param {Number} top y coordinate where the control center should be\r\n * @param {Object} styleOverride override for FabricObject controls style\r\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\r\n */\r\nexport function renderHorizontalPillControl(\r\n this: Control,\r\n ctx: CanvasRenderingContext2D,\r\n left: number,\r\n top: number,\r\n styleOverride: ControlRenderingStyleOverride,\r\n fabricObject: InteractiveFabricObject,\r\n) {\r\n styleOverride = styleOverride || {};\r\n const width = PILL_WIDTH;\r\n const height = PILL_HEIGHT;\r\n const radius = PILL_RADIUS;\r\n\r\n ctx.save();\r\n ctx.translate(left, top);\r\n const angle = fabricObject.getTotalAngle();\r\n ctx.rotate(degreesToRadians(angle));\r\n\r\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '#ffffff';\r\n ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '#0d99ff';\r\n ctx.lineWidth = 1.5;\r\n\r\n ctx.beginPath();\r\n ctx.roundRect(-width / 2, -height / 2, width, height, radius);\r\n ctx.fill();\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * Render a vertical pill control (for top/bottom side handles).\r\n * Modern Canva-style appearance.\r\n * @param {CanvasRenderingContext2D} ctx context to render on\r\n * @param {Number} left x coordinate where the control center should be\r\n * @param {Number} top y coordinate where the control center should be\r\n * @param {Object} styleOverride override for FabricObject controls style\r\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\r\n */\r\nexport function renderVerticalPillControl(\r\n this: Control,\r\n ctx: CanvasRenderingContext2D,\r\n left: number,\r\n top: number,\r\n styleOverride: ControlRenderingStyleOverride,\r\n fabricObject: InteractiveFabricObject,\r\n) {\r\n styleOverride = styleOverride || {};\r\n const width = PILL_HEIGHT; // Swapped for vertical\r\n const height = PILL_WIDTH;\r\n const radius = PILL_RADIUS;\r\n\r\n ctx.save();\r\n ctx.translate(left, top);\r\n const angle = fabricObject.getTotalAngle();\r\n ctx.rotate(degreesToRadians(angle));\r\n\r\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '#ffffff';\r\n ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '#0d99ff';\r\n ctx.lineWidth = 1.5;\r\n\r\n ctx.beginPath();\r\n ctx.roundRect(-width / 2, -height / 2, width, height, radius);\r\n ctx.fill();\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n"],"names":["PILL_WIDTH","PILL_HEIGHT","PILL_RADIUS","renderCircleControl","ctx","left","top","styleOverride","fabricObject","xSize","sizeX","cornerSize","ySize","sizeY","transparentCorners","methodName","STROKE","FILL","stroke","cornerStrokeColor","myLeft","myTop","size","save","fillStyle","cornerColor","strokeStyle","scale","beginPath","arc","twoMathPi","restore","renderSquareControl","xSizeBy2","ySizeBy2","translate","angle","getTotalAngle","rotate","degreesToRadians","strokeRect","renderHorizontalPillControl","width","height","radius","lineWidth","roundRect","fill","renderVerticalPillControl"],"mappings":"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"}
|