@hyperframes/studio 0.8.95 → 0.8.96
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/dist/assets/{hyperframes-player-DJJKab4_.js → hyperframes-player-ClfxdXeC.js} +1 -1
- package/dist/assets/{index-C1dXTZvs.js → index-BNQLP5_v.js} +1 -1
- package/dist/assets/{index-Cc4by8r7.js → index-CSHEHeOo.js} +155 -155
- package/dist/assets/{index-DE1dn3QB.js → index-D8ztHPd3.js} +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.html +1 -1
- package/dist/index.js +55 -30
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
- package/src/components/editor/DomEditCropHandles.test.tsx +63 -0
- package/src/components/editor/DomEditCropHandles.tsx +7 -10
- package/src/components/editor/DomEditSelectionChrome.tsx +3 -3
- package/src/components/editor/domEditOverlayGestures.ts +16 -0
- package/src/components/editor/groupDragMove.ts +13 -6
- package/src/components/editor/manualOffsetDrag.test.ts +56 -0
- package/src/components/editor/manualOffsetDrag.ts +16 -9
- package/src/components/editor/shiftDragAxisLock.test.tsx +358 -0
- package/src/components/editor/snapEngine.ts +3 -2
- package/src/components/editor/useDomEditOverlayGestures.ts +24 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as P}from"./index-
|
|
1
|
+
import{g as P}from"./index-CSHEHeOo.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var g=e[o+x]-t,_=r.some(function(h){if(h.interval===g)return h.count+=1});_||r.push({interval:g,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
|
package/dist/index.d.ts
CHANGED
|
@@ -3238,6 +3238,7 @@ declare function resolveSnapAdjustment(input: {
|
|
|
3238
3238
|
disabled: boolean;
|
|
3239
3239
|
/** Set when the gesture has not travelled far enough for snapping yet. */
|
|
3240
3240
|
disabledForTravel?: boolean;
|
|
3241
|
+
lockedAxis?: "x" | "y";
|
|
3241
3242
|
}): SnapResult;
|
|
3242
3243
|
/**
|
|
3243
3244
|
* Full-length guide line spanning the composition: a vertical line (axis "x")
|
package/dist/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
|
6
6
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
7
7
|
<title>HyperFrames Studio</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CSHEHeOo.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-Dx79V1Se.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
package/dist/index.js
CHANGED
|
@@ -30751,6 +30751,10 @@ var logSelect = makeStudioDebugLogger("select");
|
|
|
30751
30751
|
|
|
30752
30752
|
// src/components/editor/domEditOverlayGestures.ts
|
|
30753
30753
|
var BLOCKED_MOVE_THRESHOLD_PX = 4;
|
|
30754
|
+
function lockDragToDominantAxis(dx, dy, shiftKey) {
|
|
30755
|
+
if (!shiftKey) return { dx, dy };
|
|
30756
|
+
return Math.abs(dx) >= Math.abs(dy) ? { dx, dy: 0, lockedAxis: "y" } : { dx: 0, dy, lockedAxis: "x" };
|
|
30757
|
+
}
|
|
30754
30758
|
var ROTATION_COMMIT_EPSILON_DEGREES = 0.05;
|
|
30755
30759
|
var ROTATION_SNAP_DEGREES = 15;
|
|
30756
30760
|
var ROTATED_SNAP_BYPASS_DEGREES = 0.5;
|
|
@@ -32432,6 +32436,7 @@ function applyManualOffsetNudgeCommit(member, delta) {
|
|
|
32432
32436
|
}
|
|
32433
32437
|
function restoreManualOffsetDragMember(member) {
|
|
32434
32438
|
restoreStudioPathOffset(member.element, member.initialPathOffset);
|
|
32439
|
+
getOffsetDragGsap(member.element)?.set(member.element, { ...member.baseGsap });
|
|
32435
32440
|
endStudioManualEditGesture(member.element, member.gestureToken);
|
|
32436
32441
|
}
|
|
32437
32442
|
function restoreManualOffsetDragMembers(members) {
|
|
@@ -32440,6 +32445,15 @@ function restoreManualOffsetDragMembers(members) {
|
|
|
32440
32445
|
resumeGsapTimelines(member.element);
|
|
32441
32446
|
}
|
|
32442
32447
|
}
|
|
32448
|
+
function settleDraftTranslate(element, gsapOwnsPosition) {
|
|
32449
|
+
if (element.style.getPropertyValue("translate") === "none") {
|
|
32450
|
+
element.style.removeProperty("translate");
|
|
32451
|
+
}
|
|
32452
|
+
if (!gsapOwnsPosition) return;
|
|
32453
|
+
const view = element.ownerDocument.defaultView;
|
|
32454
|
+
const underneath = view?.getComputedStyle(element).getPropertyValue("translate");
|
|
32455
|
+
if (underneath && underneath !== "none") element.style.setProperty("translate", "none");
|
|
32456
|
+
}
|
|
32443
32457
|
function endManualOffsetDragMembers(members) {
|
|
32444
32458
|
for (const member of members) {
|
|
32445
32459
|
endStudioManualEditGesture(member.element, member.gestureToken);
|
|
@@ -32447,12 +32461,9 @@ function endManualOffsetDragMembers(members) {
|
|
|
32447
32461
|
member.element.removeAttribute("data-hf-drag-initial-offset-y");
|
|
32448
32462
|
member.element.removeAttribute("data-hf-drag-gsap-base-x");
|
|
32449
32463
|
member.element.removeAttribute("data-hf-drag-gsap-base-y");
|
|
32450
|
-
|
|
32451
|
-
|
|
32452
|
-
|
|
32453
|
-
if (getOffsetDragGsap(member.element)) {
|
|
32454
|
-
clearStudioPathOffset(member.element);
|
|
32455
|
-
}
|
|
32464
|
+
const gsapOwnsPosition = Boolean(getOffsetDragGsap(member.element));
|
|
32465
|
+
if (gsapOwnsPosition) clearStudioPathOffset(member.element);
|
|
32466
|
+
settleDraftTranslate(member.element, gsapOwnsPosition);
|
|
32456
32467
|
resumeGsapTimelines(member.element);
|
|
32457
32468
|
}
|
|
32458
32469
|
}
|
|
@@ -32798,8 +32809,8 @@ function resolveSnapAdjustment(input) {
|
|
|
32798
32809
|
input.gridEdges?.y,
|
|
32799
32810
|
input.threshold
|
|
32800
32811
|
);
|
|
32801
|
-
const bestX = pickBest(xCandidates);
|
|
32802
|
-
const bestY = pickBest(yCandidates);
|
|
32812
|
+
const bestX = input.lockedAxis === "x" ? null : pickBest(xCandidates);
|
|
32813
|
+
const bestY = input.lockedAxis === "y" ? null : pickBest(yCandidates);
|
|
32803
32814
|
const adjustedDx = input.proposedDx + (bestX?.adjustment ?? 0);
|
|
32804
32815
|
const adjustedDy = input.proposedDy + (bestY?.adjustment ?? 0);
|
|
32805
32816
|
const adjustedRect = {
|
|
@@ -33315,7 +33326,8 @@ function createGroupDragMover(opts, setDraftGroupOverlayItems) {
|
|
|
33315
33326
|
targets: allTargets,
|
|
33316
33327
|
gridEdges: sc.gridEdges ?? void 0,
|
|
33317
33328
|
threshold: SNAP_THRESHOLD_PX,
|
|
33318
|
-
disabled: e.altKey
|
|
33329
|
+
disabled: e.altKey,
|
|
33330
|
+
lockedAxis: proposed.lockedAxis
|
|
33319
33331
|
});
|
|
33320
33332
|
const movingRect = {
|
|
33321
33333
|
...groupBounds,
|
|
@@ -33335,10 +33347,11 @@ function createGroupDragMover(opts, setDraftGroupOverlayItems) {
|
|
|
33335
33347
|
lastGesture = groupG;
|
|
33336
33348
|
lastGroupPositions = {};
|
|
33337
33349
|
}
|
|
33338
|
-
const { dx, dy } = snapGroupDelta(
|
|
33339
|
-
|
|
33340
|
-
|
|
33341
|
-
|
|
33350
|
+
const { dx, dy } = snapGroupDelta(
|
|
33351
|
+
groupG,
|
|
33352
|
+
e,
|
|
33353
|
+
lockDragToDominantAxis(e.clientX - groupG.startX, e.clientY - groupG.startY, e.shiftKey)
|
|
33354
|
+
);
|
|
33342
33355
|
groupG.lastSnappedDx = dx;
|
|
33343
33356
|
groupG.lastSnappedDy = dy;
|
|
33344
33357
|
setDraftGroupOverlayItems(
|
|
@@ -33439,6 +33452,9 @@ function createDomEditSaveQueue(options = {}) {
|
|
|
33439
33452
|
}
|
|
33440
33453
|
|
|
33441
33454
|
// src/components/editor/useDomEditOverlayGestures.ts
|
|
33455
|
+
function isTap(g, e) {
|
|
33456
|
+
return !g.travelled && Math.hypot(e.clientX - g.startX, e.clientY - g.startY) < BLOCKED_MOVE_THRESHOLD_PX;
|
|
33457
|
+
}
|
|
33442
33458
|
function logGestureCommitFailure(message, error) {
|
|
33443
33459
|
if (error instanceof DomEditSaveQueueOpenError) return;
|
|
33444
33460
|
console.error(message, error);
|
|
@@ -33496,10 +33512,12 @@ function createDomEditOverlayGestureHandlers(opts) {
|
|
|
33496
33512
|
return;
|
|
33497
33513
|
}
|
|
33498
33514
|
if (groupG) {
|
|
33515
|
+
if (!isTap(groupG, e)) groupG.travelled = true;
|
|
33499
33516
|
moveGroupDrag(groupG, e);
|
|
33500
33517
|
return;
|
|
33501
33518
|
}
|
|
33502
33519
|
if (!g || !sel) return;
|
|
33520
|
+
if (!isTap(g, e)) g.travelled = true;
|
|
33503
33521
|
let dx = e.clientX - g.startX;
|
|
33504
33522
|
let dy = e.clientY - g.startY;
|
|
33505
33523
|
if (g.kind === "rotate") {
|
|
@@ -33519,6 +33537,9 @@ function createDomEditOverlayGestureHandlers(opts) {
|
|
|
33519
33537
|
return;
|
|
33520
33538
|
}
|
|
33521
33539
|
if (g.kind === "drag") {
|
|
33540
|
+
const lock = lockDragToDominantAxis(dx, dy, e.shiftKey);
|
|
33541
|
+
dx = lock.dx;
|
|
33542
|
+
dy = lock.dy;
|
|
33522
33543
|
const sc = g.snapContext;
|
|
33523
33544
|
const dragRotated = Math.abs(g.actualRotation) >= ROTATED_SNAP_BYPASS_DEGREES;
|
|
33524
33545
|
if (!dragRotated && sc?.snapEnabled && sc.targets.length > 0) {
|
|
@@ -33544,7 +33565,8 @@ function createDomEditOverlayGestureHandlers(opts) {
|
|
|
33544
33565
|
targets: allTargets,
|
|
33545
33566
|
gridEdges: sc.gridEdges ?? void 0,
|
|
33546
33567
|
threshold: SNAP_THRESHOLD_PX,
|
|
33547
|
-
disabled: e.altKey
|
|
33568
|
+
disabled: e.altKey,
|
|
33569
|
+
lockedAxis: lock.lockedAxis
|
|
33548
33570
|
});
|
|
33549
33571
|
dx = snap.dx;
|
|
33550
33572
|
dy = snap.dy;
|
|
@@ -33626,8 +33648,14 @@ function createDomEditOverlayGestureHandlers(opts) {
|
|
|
33626
33648
|
const rawDx = e.clientX - groupG.startX;
|
|
33627
33649
|
const rawDy = e.clientY - groupG.startY;
|
|
33628
33650
|
opts.suppressNextBoxClickRef.current = true;
|
|
33629
|
-
if (
|
|
33651
|
+
if (isTap(groupG, e)) {
|
|
33630
33652
|
restoreGroupPathOffsets(groupG);
|
|
33653
|
+
if (e.shiftKey) {
|
|
33654
|
+
opts.onCanvasMouseDown(e, {
|
|
33655
|
+
preferClipAncestor: false,
|
|
33656
|
+
hoverSelection: opts.hoverSelectionRef.current
|
|
33657
|
+
});
|
|
33658
|
+
}
|
|
33631
33659
|
return;
|
|
33632
33660
|
}
|
|
33633
33661
|
const dx = groupG.lastSnappedDx ?? rawDx;
|
|
@@ -33673,10 +33701,8 @@ function createDomEditOverlayGestureHandlers(opts) {
|
|
|
33673
33701
|
opts.gestureRef.current = null;
|
|
33674
33702
|
opts.rafPausedRef.current = false;
|
|
33675
33703
|
const movedDistance = Math.hypot(e.clientX - g.startX, e.clientY - g.startY);
|
|
33676
|
-
if (g.kind === "drag" &&
|
|
33677
|
-
|
|
33678
|
-
endStudioManualEditGesture(sel.element, g.manualEditDragToken);
|
|
33679
|
-
resumeGsapTimelines(sel.element);
|
|
33704
|
+
if (g.kind === "drag" && isTap(g, e)) {
|
|
33705
|
+
if (g.pathOffsetMember) restoreManualOffsetDragMembers([g.pathOffsetMember]);
|
|
33680
33706
|
if (box) {
|
|
33681
33707
|
box.style.left = `${g.originLeft}px`;
|
|
33682
33708
|
box.style.top = `${g.originTop}px`;
|
|
@@ -33802,9 +33828,7 @@ function createDomEditOverlayGestureHandlers(opts) {
|
|
|
33802
33828
|
const g = opts.gestureRef.current;
|
|
33803
33829
|
const sel = g?.selection ?? selectionRef.current;
|
|
33804
33830
|
if (g?.mode === "path-offset" && sel) {
|
|
33805
|
-
|
|
33806
|
-
endStudioManualEditGesture(sel.element, g.manualEditDragToken);
|
|
33807
|
-
resumeGsapTimelines(sel.element);
|
|
33831
|
+
if (g.pathOffsetMember) restoreManualOffsetDragMembers([g.pathOffsetMember]);
|
|
33808
33832
|
restoreGestureOverlayRect(g);
|
|
33809
33833
|
}
|
|
33810
33834
|
if (g?.mode === "box-size" && sel) {
|
|
@@ -34216,7 +34240,7 @@ function DomEditCropHandles({
|
|
|
34216
34240
|
startX: event.clientX,
|
|
34217
34241
|
startY: event.clientY,
|
|
34218
34242
|
startInsets: state.insets,
|
|
34219
|
-
|
|
34243
|
+
insets: state.insets,
|
|
34220
34244
|
angleDeg: frame.angleDeg,
|
|
34221
34245
|
scaleX: frame.scaleX,
|
|
34222
34246
|
scaleY: frame.scaleY
|
|
@@ -34241,7 +34265,7 @@ function DomEditCropHandles({
|
|
|
34241
34265
|
scaleY: gesture.scaleY
|
|
34242
34266
|
};
|
|
34243
34267
|
const nextInsets = gesture.edge === "move" ? resolveCropInsetFromMoveDrag(drag) : resolveCropInsetFromEdgeDrag({ ...drag, edge: gesture.edge, width, height });
|
|
34244
|
-
gesture.
|
|
34268
|
+
gesture.insets = nextInsets;
|
|
34245
34269
|
setState((prev) => ({ ...prev, insets: nextInsets }));
|
|
34246
34270
|
};
|
|
34247
34271
|
const endCropGesture = (event) => {
|
|
@@ -34256,13 +34280,14 @@ function DomEditCropHandles({
|
|
|
34256
34280
|
const finishCropGesture = (event) => {
|
|
34257
34281
|
const gesture = endCropGesture(event);
|
|
34258
34282
|
if (!gesture) return;
|
|
34259
|
-
if (!gesture.didMove) return;
|
|
34260
34283
|
const el = selection.element;
|
|
34261
34284
|
const reLift = () => {
|
|
34262
34285
|
if (liftedRef.current) el.style.setProperty("clip-path", "none");
|
|
34263
34286
|
};
|
|
34264
|
-
const
|
|
34265
|
-
const
|
|
34287
|
+
const { insets } = gesture;
|
|
34288
|
+
const committedValue = buildInsetClipPathSides(insets, state.radius);
|
|
34289
|
+
if (committedValue === buildInsetClipPathSides(gesture.startInsets, state.radius)) return;
|
|
34290
|
+
const cropped = insets.top > 0 || insets.right > 0 || insets.bottom > 0 || insets.left > 0;
|
|
34266
34291
|
const commit = onStyleCommit?.("clip-path", committedValue);
|
|
34267
34292
|
reLift();
|
|
34268
34293
|
void Promise.resolve(commit).then(() => {
|
|
@@ -34493,7 +34518,7 @@ function DomEditGroupChrome({
|
|
|
34493
34518
|
cursor: !allowBodyDrag ? void 0 : canManipulate && groupCanMove ? "move" : "default"
|
|
34494
34519
|
},
|
|
34495
34520
|
onPointerDown: (e) => {
|
|
34496
|
-
if (!canManipulate || e.shiftKey
|
|
34521
|
+
if (!canManipulate || !allowBodyDrag || e.shiftKey && !groupCanMove) return;
|
|
34497
34522
|
gestures.startGroupDrag(e);
|
|
34498
34523
|
},
|
|
34499
34524
|
onMouseDown: onBoxMouseDown,
|
|
@@ -34563,12 +34588,12 @@ function DomEditSelectionChrome({
|
|
|
34563
34588
|
e.stopPropagation();
|
|
34564
34589
|
return;
|
|
34565
34590
|
}
|
|
34566
|
-
if (!allowBodyDrag || !canManipulate
|
|
34591
|
+
if (!allowBodyDrag || !canManipulate) return;
|
|
34567
34592
|
if (selection.capabilities.canApplyManualOffset) {
|
|
34568
34593
|
gestures.startGesture("drag", e);
|
|
34569
34594
|
return;
|
|
34570
34595
|
}
|
|
34571
|
-
gestures.startBlockedMove(e, selection);
|
|
34596
|
+
if (!e.shiftKey) gestures.startBlockedMove(e, selection);
|
|
34572
34597
|
},
|
|
34573
34598
|
onMouseDown: onBoxMouseDown,
|
|
34574
34599
|
onClick: onBoxClick,
|