@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.
@@ -1 +1 @@
1
- import{g as P}from"./index-Cc4by8r7.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};
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-Cc4by8r7.js"></script>
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
- if (member.element.style.getPropertyValue("translate") === "none") {
32451
- member.element.style.removeProperty("translate");
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(groupG, e, {
33339
- dx: e.clientX - groupG.startX,
33340
- dy: e.clientY - groupG.startY
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 (Math.hypot(rawDx, rawDy) < BLOCKED_MOVE_THRESHOLD_PX) {
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" && movedDistance < BLOCKED_MOVE_THRESHOLD_PX) {
33677
- restoreStudioPathOffset(sel.element, g.initialPathOffset);
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
- restoreStudioPathOffset(sel.element, g.initialPathOffset);
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
- didMove: false,
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.didMove = true;
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 committedValue = buildInsetClipPathSides(state.insets, state.radius);
34265
- const cropped = state.insets.top > 0 || state.insets.right > 0 || state.insets.bottom > 0 || state.insets.left > 0;
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 || !allowBodyDrag) return;
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 || e.shiftKey) return;
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,