feat: add CanvasPathEditor and editable path functionality

- Implemented CanvasPathEditor component for editing paths on the canvas.
- Created editablePath module to handle path data manipulation and conversion to SVG.
- Introduced pathPen module for managing path drawing with a pen tool, including anchor management and path data generation.
- Added tests for editablePath and pathPen functionalities to ensure correctness of path editing and drawing behavior.
This commit is contained in:
2026-07-17 11:28:29 +08:00
parent fe4b08f548
commit d424b56076
30 changed files with 3791 additions and 44 deletions
+77
View File
@@ -4,7 +4,24 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
overrides:
leafer-x-path-editor>@leafer-in/state: 2.2.2
patchedDependencies:
leafer-x-path-editor@1.1.3:
hash: ypuxjyaot5mkx7bppr2oqh3qu4
path: patches/leafer-x-path-editor@1.1.3.patch
dependencies:
'@leafer-in/editor':
specifier: 2.2.2
version: 2.2.2(@leafer-in/interface@2.2.2)(@leafer-in/resize@2.2.2)(@leafer-ui/core@2.2.2)(@leafer-ui/draw@2.2.2)(@leafer-ui/interface@2.2.2)
'@leafer-ui/core':
specifier: 2.2.2
version: 2.2.2
'@leafer-ui/interface':
specifier: 2.2.2
version: 2.2.2
'@node-projects/acad-ts':
specifier: 2.3.0
version: 2.3.0
@@ -32,6 +49,9 @@ dependencies:
leafer-ui:
specifier: 2.2.2
version: 2.2.2
leafer-x-path-editor:
specifier: ^1.1.3
version: 1.1.3(patch_hash=ypuxjyaot5mkx7bppr2oqh3qu4)(@leafer-in/editor@2.2.2)(@leafer-in/interface@2.2.2)(@leafer-ui/core@2.2.2)(@leafer-ui/interface@2.2.2)
lucide-react:
specifier: ^1.23.0
version: 1.23.0(react@19.2.7)
@@ -356,6 +376,22 @@ packages:
dev: false
optional: true
/@leafer-in/editor@2.2.2(@leafer-in/interface@2.2.2)(@leafer-in/resize@2.2.2)(@leafer-ui/core@2.2.2)(@leafer-ui/draw@2.2.2)(@leafer-ui/interface@2.2.2):
resolution: {integrity: sha512-HSYZ/WUr3c4XvUySJtSKBlwoZCBrqFtTb9i9dguZuhknKE54KXEkx1mizTjLyN0NN67PHPhpIxh+3U4G9o8ZmA==}
peerDependencies:
'@leafer-in/interface': ^2.2.2
'@leafer-in/resize': ^2.2.2
'@leafer-ui/core': ^2.2.2
'@leafer-ui/draw': ^2.2.2
'@leafer-ui/interface': ^2.2.2
dependencies:
'@leafer-in/interface': 2.2.2(@leafer-ui/interface@2.2.2)(@leafer/interface@2.2.2)
'@leafer-in/resize': 2.2.2(@leafer-in/interface@2.2.2)(@leafer-ui/draw@2.2.2)(@leafer-ui/interface@2.2.2)
'@leafer-ui/core': 2.2.2
'@leafer-ui/draw': 2.2.2
'@leafer-ui/interface': 2.2.2
dev: false
/@leafer-in/interface@2.2.2(@leafer-ui/interface@2.2.2)(@leafer/interface@2.2.2):
resolution: {integrity: sha512-7fN7hEd2d+0glIH12ijjPx+XSqn+Q9RwoCkUpATNynfimv4u7ezWoJQFa76Aj0uusWW3ghpzW5vbO07IR2tJmA==}
peerDependencies:
@@ -366,6 +402,30 @@ packages:
'@leafer/interface': 2.2.2
dev: false
/@leafer-in/resize@2.2.2(@leafer-in/interface@2.2.2)(@leafer-ui/draw@2.2.2)(@leafer-ui/interface@2.2.2):
resolution: {integrity: sha512-h1u3TIgODBb+RAXwvhBcTqW3Yprbb6sJm7sCDtvXCewxcGSJ2jz6Gb9TaZ4SY1Nj/6aRKK+9Eplw5AWWeTwCNQ==}
peerDependencies:
'@leafer-in/interface': ^2.2.2
'@leafer-ui/draw': ^2.2.2
'@leafer-ui/interface': ^2.2.2
dependencies:
'@leafer-in/interface': 2.2.2(@leafer-ui/interface@2.2.2)(@leafer/interface@2.2.2)
'@leafer-ui/draw': 2.2.2
'@leafer-ui/interface': 2.2.2
dev: false
/@leafer-in/state@2.2.2(@leafer-in/interface@2.2.2)(@leafer-ui/core@2.2.2)(@leafer-ui/interface@2.2.2):
resolution: {integrity: sha512-s8VjDuTdYA5yUVLfY207RZ1x9879e0ogk8YZOFVKMf5hT5MNDcOqdbrhs82uVo7v4MpetyAR6VyJOMcdvjmEmw==}
peerDependencies:
'@leafer-in/interface': ^2.2.2
'@leafer-ui/core': ^2.2.2
'@leafer-ui/interface': ^2.2.2
dependencies:
'@leafer-in/interface': 2.2.2(@leafer-ui/interface@2.2.2)(@leafer/interface@2.2.2)
'@leafer-ui/core': 2.2.2
'@leafer-ui/interface': 2.2.2
dev: false
/@leafer-ui/app@2.2.2:
resolution: {integrity: sha512-mN0ItJqbtJPwWiqo7rvl8GpVGMNUd8/VgZ0MUZxad8kxkKkjnnCoawczj+URF61ebDgO2U6OUSnhi4bPSmh5QQ==}
dependencies:
@@ -1732,6 +1792,23 @@ packages:
'@leafer/partner': 2.2.2
dev: false
/leafer-x-path-editor@1.1.3(patch_hash=ypuxjyaot5mkx7bppr2oqh3qu4)(@leafer-in/editor@2.2.2)(@leafer-in/interface@2.2.2)(@leafer-ui/core@2.2.2)(@leafer-ui/interface@2.2.2):
resolution: {integrity: sha512-blqVMWuatQjEO+FAsUNCXX+k1ynV4dFX4M0iwzVPQpUQICgMs/j5xj9FLokyPat6eCJ41wtl9RJkID5F3NMiUw==}
engines: {node: '>= 18'}
peerDependencies:
'@leafer-in/editor': 1.1.0
'@leafer-ui/core': 1.1.0
'@leafer-ui/interface': 1.1.0
dependencies:
'@leafer-in/editor': 2.2.2(@leafer-in/interface@2.2.2)(@leafer-in/resize@2.2.2)(@leafer-ui/core@2.2.2)(@leafer-ui/draw@2.2.2)(@leafer-ui/interface@2.2.2)
'@leafer-in/state': 2.2.2(@leafer-in/interface@2.2.2)(@leafer-ui/core@2.2.2)(@leafer-ui/interface@2.2.2)
'@leafer-ui/core': 2.2.2
'@leafer-ui/interface': 2.2.2
transitivePeerDependencies:
- '@leafer-in/interface'
dev: false
patched: true
/lightningcss-android-arm64@1.32.0:
resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
engines: {node: '>= 12.0.0'}