@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.
Files changed (64) hide show
  1. package/.history/package_20251226051014.json +164 -0
  2. package/dist/fabric.d.ts +2 -0
  3. package/dist/fabric.d.ts.map +1 -1
  4. package/dist/fabric.min.mjs +1 -1
  5. package/dist/fabric.mjs +2 -0
  6. package/dist/fabric.mjs.map +1 -1
  7. package/dist/index.js +1742 -368
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.min.js +1 -1
  10. package/dist/index.min.js.map +1 -1
  11. package/dist/index.min.mjs +1 -1
  12. package/dist/index.min.mjs.map +1 -1
  13. package/dist/index.mjs +1741 -369
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/index.node.cjs +1742 -368
  16. package/dist/index.node.cjs.map +1 -1
  17. package/dist/index.node.mjs +1741 -369
  18. package/dist/index.node.mjs.map +1 -1
  19. package/dist/package.json.min.mjs +1 -1
  20. package/dist/package.json.mjs +1 -1
  21. package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.d.ts +31 -0
  22. package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.d.ts.map +1 -0
  23. package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.min.mjs +2 -0
  24. package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.min.mjs.map +1 -0
  25. package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.mjs +81 -0
  26. package/dist/src/LayoutManager/LayoutStrategies/FrameLayout.mjs.map +1 -0
  27. package/dist/src/LayoutManager/index.d.ts +1 -0
  28. package/dist/src/LayoutManager/index.d.ts.map +1 -1
  29. package/dist/src/controls/commonControls.d.ts.map +1 -1
  30. package/dist/src/controls/commonControls.mjs +25 -6
  31. package/dist/src/controls/commonControls.mjs.map +1 -1
  32. package/dist/src/controls/controlRendering.d.ts +20 -0
  33. package/dist/src/controls/controlRendering.d.ts.map +1 -1
  34. package/dist/src/controls/controlRendering.mjs +63 -1
  35. package/dist/src/controls/controlRendering.mjs.map +1 -1
  36. package/dist/src/shapes/Frame.d.ts +298 -0
  37. package/dist/src/shapes/Frame.d.ts.map +1 -0
  38. package/dist/src/shapes/Frame.min.mjs +2 -0
  39. package/dist/src/shapes/Frame.min.mjs.map +1 -0
  40. package/dist/src/shapes/Frame.mjs +1236 -0
  41. package/dist/src/shapes/Frame.mjs.map +1 -0
  42. package/dist/src/shapes/Object/defaultValues.d.ts.map +1 -1
  43. package/dist/src/shapes/Object/defaultValues.mjs +8 -7
  44. package/dist/src/shapes/Object/defaultValues.mjs.map +1 -1
  45. package/dist-extensions/fabric.d.ts +2 -0
  46. package/dist-extensions/fabric.d.ts.map +1 -1
  47. package/dist-extensions/src/LayoutManager/LayoutStrategies/FrameLayout.d.ts +31 -0
  48. package/dist-extensions/src/LayoutManager/LayoutStrategies/FrameLayout.d.ts.map +1 -0
  49. package/dist-extensions/src/LayoutManager/index.d.ts +1 -0
  50. package/dist-extensions/src/LayoutManager/index.d.ts.map +1 -1
  51. package/dist-extensions/src/controls/commonControls.d.ts.map +1 -1
  52. package/dist-extensions/src/controls/controlRendering.d.ts +20 -0
  53. package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -1
  54. package/dist-extensions/src/shapes/Frame.d.ts +298 -0
  55. package/dist-extensions/src/shapes/Frame.d.ts.map +1 -0
  56. package/dist-extensions/src/shapes/Object/defaultValues.d.ts.map +1 -1
  57. package/fabric.ts +8 -0
  58. package/package.json +1 -1
  59. package/src/LayoutManager/LayoutStrategies/FrameLayout.ts +80 -0
  60. package/src/LayoutManager/index.ts +1 -0
  61. package/src/controls/commonControls.ts +22 -0
  62. package/src/controls/controlRendering.ts +83 -0
  63. package/src/shapes/Frame.ts +1361 -0
  64. package/src/shapes/Object/defaultValues.ts +8 -7
@@ -1,2 +1,2 @@
1
- var a="7.0.1-beta16";export{a as version};
1
+ var a="7.0.1-beta17";export{a as version};
2
2
  //# sourceMappingURL=package.json.min.mjs.map
@@ -1,4 +1,4 @@
1
- var version = "7.0.1-beta16";
1
+ var version = "7.0.1-beta17";
2
2
 
3
3
  export { version };
4
4
  //# sourceMappingURL=package.json.mjs.map
@@ -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;AAWpC,eAAO,MAAM,2BAA2B;;;;;;;;;;CAsEtC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;CAe/B,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;CAQxC,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":"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"}
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;AAEzC,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"}
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
- export { renderCircleControl, renderSquareControl };
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":"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"}
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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"}