@embedpdf/utils 1.3.12 → 1.3.14
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/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +7 -9
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +7 -9
- package/dist/react/index.js.map +1 -1
- package/dist/vue/hooks/index.d.ts +2 -0
- package/dist/vue/hooks/use-double-press-props.d.ts +37 -0
- package/dist/vue/hooks/use-drag-resize.d.ts +18 -4
- package/dist/vue/hooks/use-interaction-handles.d.ts +34 -0
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.ts +1 -0
- package/dist/vue/index.js +275 -30
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/utils/deep-to-raw.d.ts +1 -0
- package/dist/vue/utils/interaction-normalize.d.ts +11 -0
- package/package.json +2 -2
package/dist/vue/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, computed, renderSlot, unref, ref, watch, onUnmounted } from "vue";
|
|
1
|
+
import { defineComponent, computed, renderSlot, toRaw, unref, isRef, ref, markRaw, watch, onUnmounted, isReactive, isProxy } from "vue";
|
|
2
2
|
import { getCounterRotation } from "@embedpdf/utils";
|
|
3
3
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
4
4
|
__name: "counter-rotate-container",
|
|
@@ -8,36 +8,36 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
8
8
|
},
|
|
9
9
|
setup(__props) {
|
|
10
10
|
const props = __props;
|
|
11
|
-
const
|
|
11
|
+
const counterRotation = computed(() => getCounterRotation(props.rect, props.rotation));
|
|
12
12
|
const menuWrapperProps = computed(() => ({
|
|
13
13
|
style: {
|
|
14
14
|
position: "absolute",
|
|
15
15
|
left: `${props.rect.origin.x}px`,
|
|
16
16
|
top: `${props.rect.origin.y}px`,
|
|
17
|
-
transform: matrix,
|
|
17
|
+
transform: counterRotation.value.matrix,
|
|
18
18
|
transformOrigin: "0 0",
|
|
19
|
-
width: `${width}px`,
|
|
20
|
-
height: `${height}px`,
|
|
19
|
+
width: `${counterRotation.value.width}px`,
|
|
20
|
+
height: `${counterRotation.value.height}px`,
|
|
21
21
|
pointerEvents: "none",
|
|
22
22
|
zIndex: 3
|
|
23
23
|
},
|
|
24
|
-
|
|
24
|
+
onPointerdown: (e) => {
|
|
25
25
|
e.stopPropagation();
|
|
26
26
|
e.preventDefault();
|
|
27
27
|
},
|
|
28
|
-
|
|
28
|
+
onTouchstart: (e) => {
|
|
29
29
|
e.stopPropagation();
|
|
30
30
|
e.preventDefault();
|
|
31
31
|
}
|
|
32
32
|
}));
|
|
33
33
|
const adjustedRect = computed(() => ({
|
|
34
34
|
origin: { x: props.rect.origin.x, y: props.rect.origin.y },
|
|
35
|
-
size: { width, height }
|
|
35
|
+
size: { width: counterRotation.value.width, height: counterRotation.value.height }
|
|
36
36
|
}));
|
|
37
37
|
return (_ctx, _cache) => {
|
|
38
38
|
return renderSlot(_ctx.$slots, "default", {
|
|
39
39
|
menuWrapperProps: menuWrapperProps.value,
|
|
40
|
-
matrix:
|
|
40
|
+
matrix: counterRotation.value.matrix,
|
|
41
41
|
rect: adjustedRect.value
|
|
42
42
|
});
|
|
43
43
|
};
|
|
@@ -447,40 +447,168 @@ class DragResizeController {
|
|
|
447
447
|
return { origin: { x, y }, size: { width, height } };
|
|
448
448
|
}
|
|
449
449
|
}
|
|
450
|
+
function diagonalCursor(handle, rot) {
|
|
451
|
+
const diag0 = {
|
|
452
|
+
nw: "nwse-resize",
|
|
453
|
+
ne: "nesw-resize",
|
|
454
|
+
sw: "nesw-resize",
|
|
455
|
+
se: "nwse-resize"
|
|
456
|
+
};
|
|
457
|
+
if (handle === "n" || handle === "s") return "ns-resize";
|
|
458
|
+
if (handle === "e" || handle === "w") return "ew-resize";
|
|
459
|
+
if (rot % 2 === 0) return diag0[handle];
|
|
460
|
+
return { nw: "nesw-resize", ne: "nwse-resize", sw: "nwse-resize", se: "nesw-resize" }[handle];
|
|
461
|
+
}
|
|
462
|
+
function edgeOffset(k, spacing, mode) {
|
|
463
|
+
const base = -k / 2;
|
|
464
|
+
if (mode === "center") return base;
|
|
465
|
+
return mode === "outside" ? base - spacing : base + spacing;
|
|
466
|
+
}
|
|
467
|
+
function describeResizeFromConfig(cfg, ui = {}) {
|
|
468
|
+
const {
|
|
469
|
+
handleSize = 8,
|
|
470
|
+
spacing = 1,
|
|
471
|
+
offsetMode = "outside",
|
|
472
|
+
includeSides = false,
|
|
473
|
+
zIndex = 3,
|
|
474
|
+
rotationAwareCursor = true
|
|
475
|
+
} = ui;
|
|
476
|
+
const rotation = (cfg.pageRotation ?? 0) % 4;
|
|
477
|
+
const off = (edge) => ({
|
|
478
|
+
[edge]: edgeOffset(handleSize, spacing, offsetMode) + "px"
|
|
479
|
+
});
|
|
480
|
+
const corners = [
|
|
481
|
+
["nw", { ...off("top"), ...off("left") }],
|
|
482
|
+
["ne", { ...off("top"), ...off("right") }],
|
|
483
|
+
["sw", { ...off("bottom"), ...off("left") }],
|
|
484
|
+
["se", { ...off("bottom"), ...off("right") }]
|
|
485
|
+
];
|
|
486
|
+
const sides = includeSides ? [
|
|
487
|
+
["n", { ...off("top"), left: `calc(50% - ${handleSize / 2}px)` }],
|
|
488
|
+
["s", { ...off("bottom"), left: `calc(50% - ${handleSize / 2}px)` }],
|
|
489
|
+
["w", { ...off("left"), top: `calc(50% - ${handleSize / 2}px)` }],
|
|
490
|
+
["e", { ...off("right"), top: `calc(50% - ${handleSize / 2}px)` }]
|
|
491
|
+
] : [];
|
|
492
|
+
const all = [...corners, ...sides];
|
|
493
|
+
return all.map(([handle, pos]) => ({
|
|
494
|
+
handle,
|
|
495
|
+
style: {
|
|
496
|
+
position: "absolute",
|
|
497
|
+
width: handleSize + "px",
|
|
498
|
+
height: handleSize + "px",
|
|
499
|
+
borderRadius: "50%",
|
|
500
|
+
zIndex,
|
|
501
|
+
cursor: rotationAwareCursor ? diagonalCursor(handle, rotation) : "default",
|
|
502
|
+
touchAction: "none",
|
|
503
|
+
...pos
|
|
504
|
+
},
|
|
505
|
+
attrs: { "data-epdf-handle": handle }
|
|
506
|
+
}));
|
|
507
|
+
}
|
|
508
|
+
function describeVerticesFromConfig(cfg, ui = {}, liveVertices) {
|
|
509
|
+
const { vertexSize = 12, zIndex = 4 } = ui;
|
|
510
|
+
const rect = cfg.element;
|
|
511
|
+
const scale = cfg.scale ?? 1;
|
|
512
|
+
const verts = liveVertices ?? cfg.vertices ?? [];
|
|
513
|
+
return verts.map((v, i) => {
|
|
514
|
+
const left = (v.x - rect.origin.x) * scale - vertexSize / 2;
|
|
515
|
+
const top = (v.y - rect.origin.y) * scale - vertexSize / 2;
|
|
516
|
+
return {
|
|
517
|
+
handle: "nw",
|
|
518
|
+
// not used; kept for type
|
|
519
|
+
style: {
|
|
520
|
+
position: "absolute",
|
|
521
|
+
left: left + "px",
|
|
522
|
+
top: top + "px",
|
|
523
|
+
width: vertexSize + "px",
|
|
524
|
+
height: vertexSize + "px",
|
|
525
|
+
borderRadius: "50%",
|
|
526
|
+
cursor: "pointer",
|
|
527
|
+
zIndex,
|
|
528
|
+
touchAction: "none"
|
|
529
|
+
},
|
|
530
|
+
attrs: { "data-epdf-vertex": i }
|
|
531
|
+
};
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
const norm = (v) => toRaw(isRef(v) ? unref(v) : v);
|
|
535
|
+
const toNum = (n, fallback = 0) => {
|
|
536
|
+
const v = Number(n);
|
|
537
|
+
return Number.isFinite(v) ? v : fallback;
|
|
538
|
+
};
|
|
539
|
+
const rectDTO = (r) => {
|
|
540
|
+
var _a, _b, _c, _d;
|
|
541
|
+
return {
|
|
542
|
+
origin: { x: toNum((_a = r == null ? void 0 : r.origin) == null ? void 0 : _a.x), y: toNum((_b = r == null ? void 0 : r.origin) == null ? void 0 : _b.y) },
|
|
543
|
+
size: { width: toNum((_c = r == null ? void 0 : r.size) == null ? void 0 : _c.width), height: toNum((_d = r == null ? void 0 : r.size) == null ? void 0 : _d.height) }
|
|
544
|
+
};
|
|
545
|
+
};
|
|
546
|
+
const vertsDTO = (arr = []) => arr.map((p) => ({ x: toNum(p == null ? void 0 : p.x), y: toNum(p == null ? void 0 : p.y) }));
|
|
547
|
+
const boolDTO = (b) => b === void 0 ? void 0 : Boolean(b);
|
|
548
|
+
const numDTO = (n) => n === void 0 ? void 0 : toNum(n);
|
|
549
|
+
const constraintsDTO = (c) => c ? norm(c) : void 0;
|
|
450
550
|
function useDragResize(options) {
|
|
451
551
|
const controller = ref(null);
|
|
452
|
-
const {
|
|
552
|
+
const {
|
|
553
|
+
onUpdate,
|
|
554
|
+
element,
|
|
555
|
+
vertices,
|
|
556
|
+
constraints,
|
|
557
|
+
maintainAspectRatio,
|
|
558
|
+
pageRotation,
|
|
559
|
+
scale,
|
|
560
|
+
enabled
|
|
561
|
+
} = options;
|
|
562
|
+
const initialCfg = {
|
|
563
|
+
element: rectDTO(norm(element)),
|
|
564
|
+
vertices: vertices ? vertsDTO(norm(vertices)) : void 0,
|
|
565
|
+
constraints: constraintsDTO(constraints),
|
|
566
|
+
maintainAspectRatio: boolDTO(enabled === void 0 ? void 0 : norm(maintainAspectRatio)),
|
|
567
|
+
pageRotation: numDTO(pageRotation === void 0 ? void 0 : norm(pageRotation)),
|
|
568
|
+
scale: numDTO(scale === void 0 ? void 0 : norm(scale))
|
|
569
|
+
};
|
|
453
570
|
if (!controller.value) {
|
|
454
|
-
controller.value = new DragResizeController(
|
|
571
|
+
controller.value = markRaw(new DragResizeController(initialCfg, (ev) => onUpdate == null ? void 0 : onUpdate(ev)));
|
|
455
572
|
}
|
|
456
573
|
watch(
|
|
457
574
|
() => ({
|
|
458
|
-
element
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
575
|
+
element,
|
|
576
|
+
vertices,
|
|
577
|
+
constraints,
|
|
578
|
+
maintainAspectRatio,
|
|
579
|
+
pageRotation,
|
|
580
|
+
scale
|
|
463
581
|
}),
|
|
464
|
-
(
|
|
582
|
+
(nc) => {
|
|
465
583
|
var _a;
|
|
466
|
-
(_a = controller.value) == null ? void 0 : _a.updateConfig(
|
|
584
|
+
(_a = controller.value) == null ? void 0 : _a.updateConfig({
|
|
585
|
+
element: rectDTO(norm(nc.element)),
|
|
586
|
+
vertices: nc.vertices ? vertsDTO(norm(nc.vertices)) : void 0,
|
|
587
|
+
constraints: constraintsDTO(nc.constraints),
|
|
588
|
+
maintainAspectRatio: boolDTO(
|
|
589
|
+
nc.maintainAspectRatio === void 0 ? void 0 : norm(nc.maintainAspectRatio)
|
|
590
|
+
),
|
|
591
|
+
pageRotation: numDTO(nc.pageRotation === void 0 ? void 0 : norm(nc.pageRotation)),
|
|
592
|
+
scale: numDTO(nc.scale === void 0 ? void 0 : norm(nc.scale))
|
|
593
|
+
});
|
|
467
594
|
},
|
|
468
595
|
{ deep: true }
|
|
469
596
|
);
|
|
470
597
|
onUnmounted(() => {
|
|
471
598
|
controller.value = null;
|
|
472
599
|
});
|
|
600
|
+
const isEnabled = () => Boolean(enabled === void 0 ? true : norm(enabled));
|
|
473
601
|
const handleDragStart = (e) => {
|
|
474
|
-
var _a;
|
|
475
|
-
if (!
|
|
602
|
+
var _a, _b, _c;
|
|
603
|
+
if (!isEnabled()) return;
|
|
476
604
|
e.preventDefault();
|
|
477
605
|
e.stopPropagation();
|
|
478
606
|
(_a = controller.value) == null ? void 0 : _a.startDrag(e.clientX, e.clientY);
|
|
479
|
-
e.currentTarget.setPointerCapture(e.pointerId);
|
|
607
|
+
(_c = (_b = e.currentTarget).setPointerCapture) == null ? void 0 : _c.call(_b, e.pointerId);
|
|
480
608
|
};
|
|
481
609
|
const handleMove = (e) => {
|
|
482
610
|
var _a;
|
|
483
|
-
(_a = controller.value) == null ? void 0 : _a.move(e.clientX, e.clientY);
|
|
611
|
+
return (_a = controller.value) == null ? void 0 : _a.move(e.clientX, e.clientY);
|
|
484
612
|
};
|
|
485
613
|
const handleEnd = (e) => {
|
|
486
614
|
var _a, _b, _c;
|
|
@@ -494,32 +622,149 @@ function useDragResize(options) {
|
|
|
494
622
|
};
|
|
495
623
|
const createResizeProps = (handle) => ({
|
|
496
624
|
onPointerdown: (e) => {
|
|
497
|
-
var _a;
|
|
498
|
-
if (!
|
|
625
|
+
var _a, _b, _c;
|
|
626
|
+
if (!isEnabled()) return;
|
|
499
627
|
e.preventDefault();
|
|
500
628
|
e.stopPropagation();
|
|
501
629
|
(_a = controller.value) == null ? void 0 : _a.startResize(handle, e.clientX, e.clientY);
|
|
502
|
-
e.currentTarget.setPointerCapture(e.pointerId);
|
|
630
|
+
(_c = (_b = e.currentTarget).setPointerCapture) == null ? void 0 : _c.call(_b, e.pointerId);
|
|
631
|
+
},
|
|
632
|
+
onPointermove: handleMove,
|
|
633
|
+
onPointerup: handleEnd,
|
|
634
|
+
onPointercancel: handleCancel
|
|
635
|
+
});
|
|
636
|
+
const createVertexProps = (vertexIndex) => ({
|
|
637
|
+
onPointerdown: (e) => {
|
|
638
|
+
var _a, _b, _c;
|
|
639
|
+
if (!isEnabled()) return;
|
|
640
|
+
e.preventDefault();
|
|
641
|
+
e.stopPropagation();
|
|
642
|
+
(_a = controller.value) == null ? void 0 : _a.startVertexEdit(vertexIndex, e.clientX, e.clientY);
|
|
643
|
+
(_c = (_b = e.currentTarget).setPointerCapture) == null ? void 0 : _c.call(_b, e.pointerId);
|
|
503
644
|
},
|
|
504
645
|
onPointermove: handleMove,
|
|
505
646
|
onPointerup: handleEnd,
|
|
506
647
|
onPointercancel: handleCancel
|
|
507
648
|
});
|
|
508
649
|
const dragProps = computed(
|
|
509
|
-
() =>
|
|
650
|
+
() => isEnabled() ? {
|
|
510
651
|
onPointerdown: handleDragStart,
|
|
511
652
|
onPointermove: handleMove,
|
|
512
653
|
onPointerup: handleEnd,
|
|
513
654
|
onPointercancel: handleCancel
|
|
514
655
|
} : {}
|
|
515
656
|
);
|
|
516
|
-
return {
|
|
517
|
-
|
|
518
|
-
|
|
657
|
+
return { dragProps, createResizeProps, createVertexProps };
|
|
658
|
+
}
|
|
659
|
+
function useDoublePressProps(onDouble, { delay = 300, tolerancePx = 18 } = {}) {
|
|
660
|
+
const last = ref({ t: 0, x: 0, y: 0 });
|
|
661
|
+
const handlePointerUp = (e) => {
|
|
662
|
+
if (!onDouble) return;
|
|
663
|
+
if (e.pointerType === "mouse" || e.isPrimary === false) return;
|
|
664
|
+
const now = performance.now();
|
|
665
|
+
const x = e.clientX;
|
|
666
|
+
const y = e.clientY;
|
|
667
|
+
const withinTime = now - last.value.t <= delay;
|
|
668
|
+
const dx = x - last.value.x;
|
|
669
|
+
const dy = y - last.value.y;
|
|
670
|
+
const withinDist = dx * dx + dy * dy <= tolerancePx * tolerancePx;
|
|
671
|
+
if (withinTime && withinDist) {
|
|
672
|
+
onDouble == null ? void 0 : onDouble(e);
|
|
673
|
+
}
|
|
674
|
+
last.value = { t: now, x, y };
|
|
675
|
+
};
|
|
676
|
+
const handleDouble = (e) => {
|
|
677
|
+
onDouble == null ? void 0 : onDouble(e);
|
|
678
|
+
};
|
|
679
|
+
return onDouble ? {
|
|
680
|
+
// Vue uses lowercase 'c' in dblclick
|
|
681
|
+
onDblclick: handleDouble,
|
|
682
|
+
onPointerupCapture: handlePointerUp
|
|
683
|
+
} : {};
|
|
684
|
+
}
|
|
685
|
+
function useInteractionHandles(opts) {
|
|
686
|
+
const {
|
|
687
|
+
controller,
|
|
688
|
+
resizeUI,
|
|
689
|
+
vertexUI,
|
|
690
|
+
includeVertices = false,
|
|
691
|
+
handleAttrs,
|
|
692
|
+
vertexAttrs
|
|
693
|
+
} = opts;
|
|
694
|
+
const { dragProps, createResizeProps, createVertexProps } = useDragResize(controller);
|
|
695
|
+
const elementPlain = computed(() => rectDTO(norm(controller.element)));
|
|
696
|
+
const verticesPlain = computed(
|
|
697
|
+
() => controller.vertices ? vertsDTO(norm(controller.vertices)) : void 0
|
|
698
|
+
);
|
|
699
|
+
const scalePlain = computed(() => Number(norm(controller.scale ?? 1)));
|
|
700
|
+
const rotationPlain = computed(() => Number(norm(controller.pageRotation ?? 0)));
|
|
701
|
+
const maintainPlain = computed(
|
|
702
|
+
() => controller.maintainAspectRatio === void 0 ? void 0 : Boolean(norm(controller.maintainAspectRatio))
|
|
703
|
+
);
|
|
704
|
+
const constraintsPlain = computed(() => norm(controller.constraints ?? void 0));
|
|
705
|
+
const resize = computed(() => {
|
|
706
|
+
const desc = describeResizeFromConfig(
|
|
707
|
+
{
|
|
708
|
+
element: elementPlain.value,
|
|
709
|
+
scale: scalePlain.value,
|
|
710
|
+
pageRotation: rotationPlain.value,
|
|
711
|
+
maintainAspectRatio: maintainPlain.value,
|
|
712
|
+
constraints: constraintsPlain.value
|
|
713
|
+
},
|
|
714
|
+
resizeUI
|
|
715
|
+
);
|
|
716
|
+
return desc.map((d) => {
|
|
717
|
+
var _a;
|
|
718
|
+
return {
|
|
719
|
+
key: ((_a = d.attrs) == null ? void 0 : _a["data-epdf-handle"]) ?? d.handle,
|
|
720
|
+
style: d.style,
|
|
721
|
+
...createResizeProps(d.handle),
|
|
722
|
+
...d.attrs ?? {},
|
|
723
|
+
...(handleAttrs == null ? void 0 : handleAttrs(d.handle)) ?? {}
|
|
724
|
+
};
|
|
725
|
+
});
|
|
726
|
+
});
|
|
727
|
+
const vertices = computed(() => {
|
|
728
|
+
if (!includeVertices) return [];
|
|
729
|
+
const verts = verticesPlain.value ?? [];
|
|
730
|
+
const desc = describeVerticesFromConfig(
|
|
731
|
+
{ element: elementPlain.value, scale: scalePlain.value, vertices: verts },
|
|
732
|
+
vertexUI,
|
|
733
|
+
verts
|
|
734
|
+
);
|
|
735
|
+
return desc.map((d, i) => ({
|
|
736
|
+
key: i,
|
|
737
|
+
style: d.style,
|
|
738
|
+
...createVertexProps(i),
|
|
739
|
+
...d.attrs ?? {},
|
|
740
|
+
...(vertexAttrs == null ? void 0 : vertexAttrs(i)) ?? {}
|
|
741
|
+
}));
|
|
742
|
+
});
|
|
743
|
+
return { dragProps, resize, vertices };
|
|
744
|
+
}
|
|
745
|
+
function deepToRaw(sourceObj) {
|
|
746
|
+
const objectIterator = (input) => {
|
|
747
|
+
if (Array.isArray(input)) {
|
|
748
|
+
return input.map((item) => objectIterator(item));
|
|
749
|
+
}
|
|
750
|
+
if (isRef(input) || isReactive(input) || isProxy(input)) {
|
|
751
|
+
return objectIterator(toRaw(input));
|
|
752
|
+
}
|
|
753
|
+
if (input && typeof input === "object") {
|
|
754
|
+
return Object.keys(input).reduce((acc, key) => {
|
|
755
|
+
acc[key] = objectIterator(input[key]);
|
|
756
|
+
return acc;
|
|
757
|
+
}, {});
|
|
758
|
+
}
|
|
759
|
+
return input;
|
|
519
760
|
};
|
|
761
|
+
return objectIterator(sourceObj);
|
|
520
762
|
}
|
|
521
763
|
export {
|
|
522
764
|
_sfc_main as CounterRotate,
|
|
523
|
-
|
|
765
|
+
deepToRaw,
|
|
766
|
+
useDoublePressProps,
|
|
767
|
+
useDragResize,
|
|
768
|
+
useInteractionHandles
|
|
524
769
|
};
|
|
525
770
|
//# sourceMappingURL=index.js.map
|
package/dist/vue/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/vue/components/counter-rotate-container.vue","../../src/shared/plugin-interaction-primitives/drag-resize-controller.ts","../../src/vue/hooks/use-drag-resize.ts"],"sourcesContent":["<template>\n <slot :menu-wrapper-props=\"menuWrapperProps\" :matrix=\"matrix\" :rect=\"adjustedRect\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type CSSProperties } from 'vue';\nimport type { Rect, Rotation } from '@embedpdf/models';\nimport { getCounterRotation } from '@embedpdf/utils';\n\ninterface CounterRotateProps {\n rect: Rect;\n rotation: Rotation;\n}\n\nconst props = defineProps<CounterRotateProps>();\n\nconst { matrix, width, height } = getCounterRotation(props.rect, props.rotation);\n\nconst menuWrapperProps = computed(() => ({\n style: {\n position: 'absolute',\n left: `${props.rect.origin.x}px`,\n top: `${props.rect.origin.y}px`,\n transform: matrix,\n transformOrigin: '0 0',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 3,\n } as CSSProperties,\n onPointerDown: (e: PointerEvent) => {\n e.stopPropagation();\n e.preventDefault();\n },\n onTouchStart: (e: TouchEvent) => {\n e.stopPropagation();\n e.preventDefault();\n },\n}));\n\nconst adjustedRect = computed(() => ({\n origin: { x: props.rect.origin.x, y: props.rect.origin.y },\n size: { width, height },\n}));\n</script>\n","import { Position, Rect } from '@embedpdf/models';\n\nexport interface DragResizeConfig {\n element: Rect;\n vertices?: Position[];\n constraints?: {\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n boundingBox?: { width: number; height: number }; // page bounds\n };\n maintainAspectRatio?: boolean;\n pageRotation?: number;\n scale?: number;\n}\n\nexport type InteractionState = 'idle' | 'dragging' | 'resizing' | 'vertex-editing';\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w';\n\nexport interface TransformData {\n type: 'move' | 'resize' | 'vertex-edit';\n changes: {\n rect?: Rect;\n vertices?: Position[];\n };\n metadata?: {\n handle?: ResizeHandle;\n vertexIndex?: number;\n maintainAspectRatio?: boolean;\n };\n}\n\nexport interface InteractionEvent {\n state: 'start' | 'move' | 'end';\n transformData?: TransformData;\n}\n\n/**\n * Pure geometric controller that manages drag/resize/vertex-edit logic.\n */\nexport class DragResizeController {\n private state: InteractionState = 'idle';\n private startPoint: Position | null = null;\n private startElement: Rect | null = null;\n private activeHandle: ResizeHandle | null = null;\n private currentPosition: Rect | null = null;\n\n // Vertex editing state - pure geometric\n private activeVertexIndex: number | null = null;\n private startVertices: Position[] = [];\n private currentVertices: Position[] = [];\n\n constructor(\n private config: DragResizeConfig,\n private onUpdate: (event: InteractionEvent) => void,\n ) {\n this.currentVertices = config.vertices || [];\n }\n\n updateConfig(config: Partial<DragResizeConfig>) {\n this.config = { ...this.config, ...config };\n this.currentVertices = config.vertices || [];\n }\n\n startDrag(clientX: number, clientY: number) {\n this.state = 'dragging';\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'move',\n changes: {\n rect: this.startElement,\n },\n },\n });\n }\n\n startResize(handle: ResizeHandle, clientX: number, clientY: number) {\n this.state = 'resizing';\n this.activeHandle = handle;\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n startVertexEdit(vertexIndex: number, clientX: number, clientY: number) {\n // Refresh vertices from latest config before validating index\n this.currentVertices = [...(this.config.vertices ?? this.currentVertices)];\n if (vertexIndex < 0 || vertexIndex >= this.currentVertices.length) return;\n\n this.state = 'vertex-editing';\n this.activeVertexIndex = vertexIndex;\n this.startPoint = { x: clientX, y: clientY };\n this.startVertices = [...this.currentVertices];\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex,\n },\n },\n });\n }\n\n move(clientX: number, clientY: number) {\n if (this.state === 'idle' || !this.startPoint) return;\n\n if (this.state === 'dragging' && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateDragPosition(delta);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'move',\n changes: {\n rect: position,\n },\n },\n });\n } else if (this.state === 'resizing' && this.activeHandle && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateResizePosition(delta, this.activeHandle);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'resize',\n changes: {\n rect: position,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n } else if (this.state === 'vertex-editing' && this.activeVertexIndex !== null) {\n const vertices = this.calculateVertexPosition(clientX, clientY);\n this.currentVertices = vertices;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex,\n },\n },\n });\n }\n }\n\n end() {\n if (this.state === 'idle') return;\n\n const wasState = this.state;\n const handle = this.activeHandle;\n const vertexIndex = this.activeVertexIndex;\n\n if (wasState === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.currentVertices,\n },\n metadata: {\n vertexIndex: vertexIndex || undefined,\n },\n },\n });\n } else {\n const finalPosition = this.getCurrentPosition();\n this.onUpdate({\n state: 'end',\n transformData: {\n type: wasState === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: finalPosition,\n },\n metadata:\n wasState === 'dragging'\n ? undefined\n : {\n handle: handle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n cancel() {\n if (this.state === 'idle') return;\n\n if (this.state === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex || undefined,\n },\n },\n });\n } else if (this.startElement) {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: this.state === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata:\n this.state === 'dragging'\n ? undefined\n : {\n handle: this.activeHandle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n private reset() {\n this.state = 'idle';\n this.startPoint = null;\n this.startElement = null;\n this.activeHandle = null;\n this.currentPosition = null;\n this.activeVertexIndex = null;\n this.startVertices = [];\n }\n\n private getCurrentPosition() {\n return this.currentPosition || this.config.element;\n }\n\n private calculateDelta(clientX: number, clientY: number): Position {\n if (!this.startPoint) return { x: 0, y: 0 };\n\n const rawDelta: Position = {\n x: clientX - this.startPoint.x,\n y: clientY - this.startPoint.y,\n };\n\n return this.transformDelta(rawDelta);\n }\n\n private transformDelta(delta: Position): Position {\n const { pageRotation = 0, scale = 1 } = this.config;\n\n const rad = (pageRotation * Math.PI) / 2;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n const scaledX = delta.x / scale;\n const scaledY = delta.y / scale;\n\n return {\n x: cos * scaledX + sin * scaledY,\n y: -sin * scaledX + cos * scaledY,\n };\n }\n\n private clampPoint(p: Position): Position {\n const bbox = this.config.constraints?.boundingBox;\n if (!bbox) return p;\n return {\n x: Math.max(0, Math.min(p.x, bbox.width)),\n y: Math.max(0, Math.min(p.y, bbox.height)),\n };\n }\n\n private calculateVertexPosition(clientX: number, clientY: number): Position[] {\n if (this.activeVertexIndex === null) return this.startVertices;\n\n const delta = this.calculateDelta(clientX, clientY);\n const newVertices = [...this.startVertices];\n const currentVertex = newVertices[this.activeVertexIndex];\n\n const moved = {\n x: currentVertex.x + delta.x,\n y: currentVertex.y + delta.y,\n };\n newVertices[this.activeVertexIndex] = this.clampPoint(moved);\n\n return newVertices;\n }\n\n private calculateDragPosition(delta: Position): Rect {\n if (!this.startElement) return this.config.element;\n\n const position: Rect = {\n origin: {\n x: this.startElement.origin.x + delta.x,\n y: this.startElement.origin.y + delta.y,\n },\n size: {\n width: this.startElement.size.width,\n height: this.startElement.size.height,\n },\n };\n\n return this.applyConstraints(position);\n }\n\n private calculateResizePosition(delta: Position, handle: ResizeHandle): Rect {\n if (!this.startElement) return this.config.element;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = this.startElement;\n\n switch (handle) {\n case 'se':\n width += delta.x;\n height += delta.y;\n break;\n case 'sw':\n x += delta.x;\n width -= delta.x;\n height += delta.y;\n break;\n case 'ne':\n width += delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'nw':\n x += delta.x;\n width -= delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'n':\n y += delta.y;\n height -= delta.y;\n break;\n case 's':\n height += delta.y;\n break;\n case 'e':\n width += delta.x;\n break;\n case 'w':\n x += delta.x;\n width -= delta.x;\n break;\n }\n\n // Maintain aspect ratio if needed\n if (this.config.maintainAspectRatio && this.startElement) {\n const aspectRatio = this.startElement.size.width / this.startElement.size.height;\n\n if (['n', 's', 'e', 'w'].includes(handle)) {\n if (handle === 'n' || handle === 's') {\n const newWidth = height * aspectRatio;\n const widthDiff = newWidth - width;\n width = newWidth;\n x -= widthDiff / 2;\n } else {\n const newHeight = width / aspectRatio;\n const heightDiff = newHeight - height;\n height = newHeight;\n if (handle === 'w') {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n y -= heightDiff / 2;\n }\n } else {\n const widthChange = Math.abs(width - this.startElement.size.width);\n const heightChange = Math.abs(height - this.startElement.size.height);\n if (widthChange > heightChange) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n if (handle.includes('w')) {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n if (handle.includes('n')) {\n y = this.startElement.origin.y + this.startElement.size.height - height;\n }\n }\n }\n\n // Handle-aware bounding box clamping to avoid shifting opposite edge\n const bbox = this.config.constraints?.boundingBox;\n if (bbox) {\n switch (handle) {\n case 'e':\n width = Math.min(width, bbox.width - x);\n break;\n case 's':\n height = Math.min(height, bbox.height - y);\n break;\n case 'se':\n width = Math.min(width, bbox.width - x);\n height = Math.min(height, bbox.height - y);\n break;\n case 'w':\n if (x < 0) {\n width += x;\n x = 0;\n }\n break;\n case 'n':\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'sw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n height = Math.min(height, bbox.height - y);\n break;\n case 'nw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'ne':\n width = Math.min(width, bbox.width - x);\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n }\n }\n\n return this.applyConstraints({ origin: { x, y }, size: { width, height } });\n }\n\n private applyConstraints(position: Rect): Rect {\n const { constraints } = this.config;\n if (!constraints) return position;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = position;\n\n // Apply size constraints\n width = Math.max(constraints.minWidth || 1, width);\n height = Math.max(constraints.minHeight || 1, height);\n\n if (constraints.maxWidth) width = Math.min(constraints.maxWidth, width);\n if (constraints.maxHeight) height = Math.min(constraints.maxHeight, height);\n\n // Apply bounding box constraints\n if (constraints.boundingBox) {\n x = Math.max(0, Math.min(x, constraints.boundingBox.width - width));\n y = Math.max(0, Math.min(y, constraints.boundingBox.height - height));\n }\n\n return { origin: { x, y }, size: { width, height } };\n }\n}\n","import { ref, watch, computed, onUnmounted } from 'vue';\nimport {\n DragResizeController,\n DragResizeConfig,\n InteractionEvent,\n ResizeHandle,\n} from '../../shared/plugin-interaction-primitives';\n\nexport interface UseDragResizeOptions extends DragResizeConfig {\n onUpdate?: (event: InteractionEvent) => void;\n enabled?: boolean;\n}\n\nexport function useDragResize(options: UseDragResizeOptions) {\n const controller = ref<DragResizeController | null>(null);\n\n // Extract reactive options\n const { onUpdate, enabled = true, ...config } = options;\n\n // Initialize controller\n if (!controller.value) {\n controller.value = new DragResizeController(config, (event) => onUpdate?.(event));\n }\n\n // Watch for config changes\n watch(\n () => ({\n element: config.element,\n constraints: config.constraints,\n maintainAspectRatio: config.maintainAspectRatio,\n pageRotation: config.pageRotation,\n scale: config.scale,\n }),\n (newConfig) => {\n controller.value?.updateConfig(newConfig);\n },\n { deep: true },\n );\n\n // Cleanup on unmount\n onUnmounted(() => {\n controller.value = null;\n });\n\n // Drag handlers\n const handleDragStart = (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller.value?.startDrag(e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const handleMove = (e: PointerEvent) => {\n controller.value?.move(e.clientX, e.clientY);\n };\n\n const handleEnd = (e: PointerEvent) => {\n controller.value?.end();\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n const handleCancel = (e: PointerEvent) => {\n controller.value?.cancel();\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n // Create resize handler factory\n const createResizeProps = (handle: ResizeHandle) => ({\n onPointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller.value?.startResize(handle, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onPointermove: handleMove,\n onPointerup: handleEnd,\n onPointercancel: handleCancel,\n });\n\n // Computed drag props\n const dragProps = computed(() =>\n enabled\n ? {\n onPointerdown: handleDragStart,\n onPointermove: handleMove,\n onPointerup: handleEnd,\n onPointercancel: handleCancel,\n }\n : {},\n );\n\n return {\n dragProps,\n createResizeProps,\n };\n}\n"],"names":["_renderSlot","_unref"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/vue/components/counter-rotate-container.vue","../../src/shared/plugin-interaction-primitives/drag-resize-controller.ts","../../src/shared/plugin-interaction-primitives/utils.ts","../../src/vue/utils/interaction-normalize.ts","../../src/vue/hooks/use-drag-resize.ts","../../src/vue/hooks/use-double-press-props.ts","../../src/vue/hooks/use-interaction-handles.ts","../../src/vue/utils/deep-to-raw.ts"],"sourcesContent":["<template>\n <slot\n :menu-wrapper-props=\"menuWrapperProps\"\n :matrix=\"counterRotation.matrix\"\n :rect=\"adjustedRect\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type CSSProperties } from 'vue';\nimport type { Rect, Rotation } from '@embedpdf/models';\nimport { getCounterRotation } from '@embedpdf/utils';\n\ninterface CounterRotateProps {\n rect: Rect;\n rotation: Rotation;\n}\n\nconst props = defineProps<CounterRotateProps>();\n\nconst counterRotation = computed(() => getCounterRotation(props.rect, props.rotation));\n\nconst menuWrapperProps = computed(() => ({\n style: {\n position: 'absolute',\n left: `${props.rect.origin.x}px`,\n top: `${props.rect.origin.y}px`,\n transform: counterRotation.value.matrix,\n transformOrigin: '0 0',\n width: `${counterRotation.value.width}px`,\n height: `${counterRotation.value.height}px`,\n pointerEvents: 'none',\n zIndex: 3,\n } as CSSProperties,\n onPointerdown: (e: PointerEvent) => {\n e.stopPropagation();\n e.preventDefault();\n },\n onTouchstart: (e: TouchEvent) => {\n e.stopPropagation();\n e.preventDefault();\n },\n}));\n\nconst adjustedRect = computed(() => ({\n origin: { x: props.rect.origin.x, y: props.rect.origin.y },\n size: { width: counterRotation.value.width, height: counterRotation.value.height },\n}));\n</script>\n","import { Position, Rect } from '@embedpdf/models';\n\nexport interface DragResizeConfig {\n element: Rect;\n vertices?: Position[];\n constraints?: {\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n boundingBox?: { width: number; height: number }; // page bounds\n };\n maintainAspectRatio?: boolean;\n pageRotation?: number;\n scale?: number;\n}\n\nexport type InteractionState = 'idle' | 'dragging' | 'resizing' | 'vertex-editing';\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w';\n\nexport interface TransformData {\n type: 'move' | 'resize' | 'vertex-edit';\n changes: {\n rect?: Rect;\n vertices?: Position[];\n };\n metadata?: {\n handle?: ResizeHandle;\n vertexIndex?: number;\n maintainAspectRatio?: boolean;\n };\n}\n\nexport interface InteractionEvent {\n state: 'start' | 'move' | 'end';\n transformData?: TransformData;\n}\n\n/**\n * Pure geometric controller that manages drag/resize/vertex-edit logic.\n */\nexport class DragResizeController {\n private state: InteractionState = 'idle';\n private startPoint: Position | null = null;\n private startElement: Rect | null = null;\n private activeHandle: ResizeHandle | null = null;\n private currentPosition: Rect | null = null;\n\n // Vertex editing state - pure geometric\n private activeVertexIndex: number | null = null;\n private startVertices: Position[] = [];\n private currentVertices: Position[] = [];\n\n constructor(\n private config: DragResizeConfig,\n private onUpdate: (event: InteractionEvent) => void,\n ) {\n this.currentVertices = config.vertices || [];\n }\n\n updateConfig(config: Partial<DragResizeConfig>) {\n this.config = { ...this.config, ...config };\n this.currentVertices = config.vertices || [];\n }\n\n startDrag(clientX: number, clientY: number) {\n this.state = 'dragging';\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'move',\n changes: {\n rect: this.startElement,\n },\n },\n });\n }\n\n startResize(handle: ResizeHandle, clientX: number, clientY: number) {\n this.state = 'resizing';\n this.activeHandle = handle;\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n startVertexEdit(vertexIndex: number, clientX: number, clientY: number) {\n // Refresh vertices from latest config before validating index\n this.currentVertices = [...(this.config.vertices ?? this.currentVertices)];\n if (vertexIndex < 0 || vertexIndex >= this.currentVertices.length) return;\n\n this.state = 'vertex-editing';\n this.activeVertexIndex = vertexIndex;\n this.startPoint = { x: clientX, y: clientY };\n this.startVertices = [...this.currentVertices];\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex,\n },\n },\n });\n }\n\n move(clientX: number, clientY: number) {\n if (this.state === 'idle' || !this.startPoint) return;\n\n if (this.state === 'dragging' && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateDragPosition(delta);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'move',\n changes: {\n rect: position,\n },\n },\n });\n } else if (this.state === 'resizing' && this.activeHandle && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateResizePosition(delta, this.activeHandle);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'resize',\n changes: {\n rect: position,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n } else if (this.state === 'vertex-editing' && this.activeVertexIndex !== null) {\n const vertices = this.calculateVertexPosition(clientX, clientY);\n this.currentVertices = vertices;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex,\n },\n },\n });\n }\n }\n\n end() {\n if (this.state === 'idle') return;\n\n const wasState = this.state;\n const handle = this.activeHandle;\n const vertexIndex = this.activeVertexIndex;\n\n if (wasState === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.currentVertices,\n },\n metadata: {\n vertexIndex: vertexIndex || undefined,\n },\n },\n });\n } else {\n const finalPosition = this.getCurrentPosition();\n this.onUpdate({\n state: 'end',\n transformData: {\n type: wasState === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: finalPosition,\n },\n metadata:\n wasState === 'dragging'\n ? undefined\n : {\n handle: handle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n cancel() {\n if (this.state === 'idle') return;\n\n if (this.state === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex || undefined,\n },\n },\n });\n } else if (this.startElement) {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: this.state === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata:\n this.state === 'dragging'\n ? undefined\n : {\n handle: this.activeHandle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n private reset() {\n this.state = 'idle';\n this.startPoint = null;\n this.startElement = null;\n this.activeHandle = null;\n this.currentPosition = null;\n this.activeVertexIndex = null;\n this.startVertices = [];\n }\n\n private getCurrentPosition() {\n return this.currentPosition || this.config.element;\n }\n\n private calculateDelta(clientX: number, clientY: number): Position {\n if (!this.startPoint) return { x: 0, y: 0 };\n\n const rawDelta: Position = {\n x: clientX - this.startPoint.x,\n y: clientY - this.startPoint.y,\n };\n\n return this.transformDelta(rawDelta);\n }\n\n private transformDelta(delta: Position): Position {\n const { pageRotation = 0, scale = 1 } = this.config;\n\n const rad = (pageRotation * Math.PI) / 2;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n const scaledX = delta.x / scale;\n const scaledY = delta.y / scale;\n\n return {\n x: cos * scaledX + sin * scaledY,\n y: -sin * scaledX + cos * scaledY,\n };\n }\n\n private clampPoint(p: Position): Position {\n const bbox = this.config.constraints?.boundingBox;\n if (!bbox) return p;\n return {\n x: Math.max(0, Math.min(p.x, bbox.width)),\n y: Math.max(0, Math.min(p.y, bbox.height)),\n };\n }\n\n private calculateVertexPosition(clientX: number, clientY: number): Position[] {\n if (this.activeVertexIndex === null) return this.startVertices;\n\n const delta = this.calculateDelta(clientX, clientY);\n const newVertices = [...this.startVertices];\n const currentVertex = newVertices[this.activeVertexIndex];\n\n const moved = {\n x: currentVertex.x + delta.x,\n y: currentVertex.y + delta.y,\n };\n newVertices[this.activeVertexIndex] = this.clampPoint(moved);\n\n return newVertices;\n }\n\n private calculateDragPosition(delta: Position): Rect {\n if (!this.startElement) return this.config.element;\n\n const position: Rect = {\n origin: {\n x: this.startElement.origin.x + delta.x,\n y: this.startElement.origin.y + delta.y,\n },\n size: {\n width: this.startElement.size.width,\n height: this.startElement.size.height,\n },\n };\n\n return this.applyConstraints(position);\n }\n\n private calculateResizePosition(delta: Position, handle: ResizeHandle): Rect {\n if (!this.startElement) return this.config.element;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = this.startElement;\n\n switch (handle) {\n case 'se':\n width += delta.x;\n height += delta.y;\n break;\n case 'sw':\n x += delta.x;\n width -= delta.x;\n height += delta.y;\n break;\n case 'ne':\n width += delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'nw':\n x += delta.x;\n width -= delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'n':\n y += delta.y;\n height -= delta.y;\n break;\n case 's':\n height += delta.y;\n break;\n case 'e':\n width += delta.x;\n break;\n case 'w':\n x += delta.x;\n width -= delta.x;\n break;\n }\n\n // Maintain aspect ratio if needed\n if (this.config.maintainAspectRatio && this.startElement) {\n const aspectRatio = this.startElement.size.width / this.startElement.size.height;\n\n if (['n', 's', 'e', 'w'].includes(handle)) {\n if (handle === 'n' || handle === 's') {\n const newWidth = height * aspectRatio;\n const widthDiff = newWidth - width;\n width = newWidth;\n x -= widthDiff / 2;\n } else {\n const newHeight = width / aspectRatio;\n const heightDiff = newHeight - height;\n height = newHeight;\n if (handle === 'w') {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n y -= heightDiff / 2;\n }\n } else {\n const widthChange = Math.abs(width - this.startElement.size.width);\n const heightChange = Math.abs(height - this.startElement.size.height);\n if (widthChange > heightChange) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n if (handle.includes('w')) {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n if (handle.includes('n')) {\n y = this.startElement.origin.y + this.startElement.size.height - height;\n }\n }\n }\n\n // Handle-aware bounding box clamping to avoid shifting opposite edge\n const bbox = this.config.constraints?.boundingBox;\n if (bbox) {\n switch (handle) {\n case 'e':\n width = Math.min(width, bbox.width - x);\n break;\n case 's':\n height = Math.min(height, bbox.height - y);\n break;\n case 'se':\n width = Math.min(width, bbox.width - x);\n height = Math.min(height, bbox.height - y);\n break;\n case 'w':\n if (x < 0) {\n width += x;\n x = 0;\n }\n break;\n case 'n':\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'sw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n height = Math.min(height, bbox.height - y);\n break;\n case 'nw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'ne':\n width = Math.min(width, bbox.width - x);\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n }\n }\n\n return this.applyConstraints({ origin: { x, y }, size: { width, height } });\n }\n\n private applyConstraints(position: Rect): Rect {\n const { constraints } = this.config;\n if (!constraints) return position;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = position;\n\n // Apply size constraints\n width = Math.max(constraints.minWidth || 1, width);\n height = Math.max(constraints.minHeight || 1, height);\n\n if (constraints.maxWidth) width = Math.min(constraints.maxWidth, width);\n if (constraints.maxHeight) height = Math.min(constraints.maxHeight, height);\n\n // Apply bounding box constraints\n if (constraints.boundingBox) {\n x = Math.max(0, Math.min(x, constraints.boundingBox.width - width));\n y = Math.max(0, Math.min(y, constraints.boundingBox.height - height));\n }\n\n return { origin: { x, y }, size: { width, height } };\n }\n}\n","import type { Position, Rect } from '@embedpdf/models';\nimport type { ResizeHandle, DragResizeConfig } from './drag-resize-controller';\n\nexport type QuarterTurns = 0 | 1 | 2 | 3;\n\nexport interface ResizeUI {\n handleSize?: number; // px (default 8)\n spacing?: number; // px distance from the box edge (default 1)\n offsetMode?: 'outside' | 'inside' | 'center'; // default 'outside'\n includeSides?: boolean; // default false\n zIndex?: number; // default 3\n rotationAwareCursor?: boolean; // default true\n}\n\nexport interface VertexUI {\n vertexSize?: number; // px (default 12)\n zIndex?: number; // default 4\n}\n\nexport interface HandleDescriptor {\n handle: ResizeHandle;\n style: Record<string, number | string>;\n attrs?: Record<string, any>;\n}\n\nfunction diagonalCursor(handle: ResizeHandle, rot: QuarterTurns): string {\n // Standard cursors; diagonals flip on odd quarter-turns\n const diag0: Record<'nw' | 'ne' | 'sw' | 'se', string> = {\n nw: 'nwse-resize',\n ne: 'nesw-resize',\n sw: 'nesw-resize',\n se: 'nwse-resize',\n };\n if (handle === 'n' || handle === 's') return 'ns-resize';\n if (handle === 'e' || handle === 'w') return 'ew-resize';\n if (rot % 2 === 0) return diag0[handle as 'nw' | 'ne' | 'sw' | 'se'];\n return { nw: 'nesw-resize', ne: 'nwse-resize', sw: 'nwse-resize', se: 'nesw-resize' }[\n handle as 'nw' | 'ne' | 'sw' | 'se'\n ]!;\n}\n\nfunction edgeOffset(k: number, spacing: number, mode: 'outside' | 'inside' | 'center') {\n // Base puts the handle centered on the edge\n const base = -k / 2;\n if (mode === 'center') return base;\n // outside moves further out (more negative), inside moves in (less negative)\n return mode === 'outside' ? base - spacing : base + spacing;\n}\n\nexport function describeResizeFromConfig(\n cfg: DragResizeConfig,\n ui: ResizeUI = {},\n): HandleDescriptor[] {\n const {\n handleSize = 8,\n spacing = 1,\n offsetMode = 'outside',\n includeSides = false,\n zIndex = 3,\n rotationAwareCursor = true,\n } = ui;\n\n const rotation = ((cfg.pageRotation ?? 0) % 4) as QuarterTurns;\n\n const off = (edge: 'top' | 'right' | 'bottom' | 'left') => ({\n [edge]: edgeOffset(handleSize, spacing, offsetMode) + 'px',\n });\n\n const corners: Array<[ResizeHandle, Record<string, number | string>]> = [\n ['nw', { ...off('top'), ...off('left') }],\n ['ne', { ...off('top'), ...off('right') }],\n ['sw', { ...off('bottom'), ...off('left') }],\n ['se', { ...off('bottom'), ...off('right') }],\n ];\n const sides: Array<[ResizeHandle, Record<string, number | string>]> = includeSides\n ? [\n ['n', { ...off('top'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['s', { ...off('bottom'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['w', { ...off('left'), top: `calc(50% - ${handleSize / 2}px)` }],\n ['e', { ...off('right'), top: `calc(50% - ${handleSize / 2}px)` }],\n ]\n : [];\n\n const all = [...corners, ...sides];\n\n return all.map(([handle, pos]) => ({\n handle,\n style: {\n position: 'absolute',\n width: handleSize + 'px',\n height: handleSize + 'px',\n borderRadius: '50%',\n zIndex,\n cursor: rotationAwareCursor ? diagonalCursor(handle, rotation) : 'default',\n touchAction: 'none',\n ...(pos as any),\n },\n attrs: { 'data-epdf-handle': handle },\n }));\n}\n\nexport function describeVerticesFromConfig(\n cfg: DragResizeConfig,\n ui: VertexUI = {},\n liveVertices?: Position[],\n): HandleDescriptor[] {\n const { vertexSize = 12, zIndex = 4 } = ui;\n const rect: Rect = cfg.element;\n const scale = cfg.scale ?? 1;\n const verts = liveVertices ?? cfg.vertices ?? [];\n\n return verts.map((v, i) => {\n const left = (v.x - rect.origin.x) * scale - vertexSize / 2;\n const top = (v.y - rect.origin.y) * scale - vertexSize / 2;\n return {\n handle: 'nw', // not used; kept for type\n style: {\n position: 'absolute',\n left: left + 'px',\n top: top + 'px',\n width: vertexSize + 'px',\n height: vertexSize + 'px',\n borderRadius: '50%',\n cursor: 'pointer',\n zIndex,\n touchAction: 'none',\n },\n attrs: { 'data-epdf-vertex': i },\n };\n });\n}\n","import { isRef, unref, toRaw, type Ref } from 'vue';\nimport type { Rect, Position } from '@embedpdf/models';\nimport type { DragResizeConfig } from '../../shared/plugin-interaction-primitives';\n\nexport type MaybeRef<T> = T | Ref<T>;\n\nexport const norm = <T>(v: MaybeRef<T>): T => toRaw(isRef(v) ? unref(v) : (v as T));\n\nexport const toNum = (n: unknown, fallback = 0): number => {\n const v = Number(n);\n return Number.isFinite(v) ? v : fallback;\n};\n\nexport const rectDTO = (r: any): Rect => ({\n origin: { x: toNum(r?.origin?.x), y: toNum(r?.origin?.y) },\n size: { width: toNum(r?.size?.width), height: toNum(r?.size?.height) },\n});\n\nexport const vertsDTO = (arr: any[] = []): Position[] =>\n arr.map((p) => ({ x: toNum(p?.x), y: toNum(p?.y) }));\n\nexport const boolDTO = (b: unknown): boolean | undefined =>\n b === undefined ? undefined : Boolean(b);\n\nexport const numDTO = (n: unknown): number | undefined => (n === undefined ? undefined : toNum(n));\n\nexport const constraintsDTO = (\n c: MaybeRef<DragResizeConfig['constraints']> | undefined,\n): DragResizeConfig['constraints'] | undefined => (c ? norm(c) : undefined);\n","import { ref, watch, computed, onUnmounted, markRaw, type Ref } from 'vue';\nimport type { Position, Rect } from '@embedpdf/models';\nimport {\n DragResizeController,\n type DragResizeConfig,\n type InteractionEvent,\n type ResizeHandle,\n} from '../../shared/plugin-interaction-primitives';\nimport {\n norm,\n rectDTO,\n vertsDTO,\n constraintsDTO,\n boolDTO,\n numDTO,\n type MaybeRef,\n} from '../utils/interaction-normalize';\n\nexport interface UseDragResizeOptions {\n element: MaybeRef<Rect>;\n vertices?: MaybeRef<Position[]>;\n constraints?: MaybeRef<DragResizeConfig['constraints']>;\n maintainAspectRatio?: MaybeRef<boolean>;\n pageRotation?: MaybeRef<number>;\n scale?: MaybeRef<number>;\n onUpdate?: (event: InteractionEvent) => void;\n enabled?: MaybeRef<boolean>;\n}\n\nexport function useDragResize(options: UseDragResizeOptions) {\n const controller = ref<DragResizeController | null>(null);\n\n const {\n onUpdate,\n element,\n vertices,\n constraints,\n maintainAspectRatio,\n pageRotation,\n scale,\n enabled,\n } = options;\n\n // Build initial plain config\n const initialCfg: DragResizeConfig = {\n element: rectDTO(norm(element)),\n vertices: vertices ? vertsDTO(norm(vertices)) : undefined,\n constraints: constraintsDTO(constraints),\n maintainAspectRatio: boolDTO(enabled === undefined ? undefined : norm(maintainAspectRatio!)),\n pageRotation: numDTO(pageRotation === undefined ? undefined : norm(pageRotation!)),\n scale: numDTO(scale === undefined ? undefined : norm(scale!)),\n };\n\n if (!controller.value) {\n controller.value = markRaw(new DragResizeController(initialCfg, (ev) => onUpdate?.(ev)));\n }\n\n // Reactive updates → always normalize before passing to controller\n watch(\n () => ({\n element,\n vertices,\n constraints,\n maintainAspectRatio,\n pageRotation,\n scale,\n }),\n (nc) => {\n controller.value?.updateConfig({\n element: rectDTO(norm(nc.element)),\n vertices: nc.vertices ? vertsDTO(norm(nc.vertices)) : undefined,\n constraints: constraintsDTO(nc.constraints),\n maintainAspectRatio: boolDTO(\n nc.maintainAspectRatio === undefined ? undefined : norm(nc.maintainAspectRatio!),\n ),\n pageRotation: numDTO(nc.pageRotation === undefined ? undefined : norm(nc.pageRotation!)),\n scale: numDTO(nc.scale === undefined ? undefined : norm(nc.scale!)),\n });\n },\n { deep: true },\n );\n\n onUnmounted(() => {\n controller.value = null;\n });\n\n const isEnabled = () => Boolean(enabled === undefined ? true : norm(enabled));\n\n // Pointer handlers\n const handleDragStart = (e: PointerEvent) => {\n if (!isEnabled()) return;\n e.preventDefault();\n e.stopPropagation();\n controller.value?.startDrag(e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId);\n };\n const handleMove = (e: PointerEvent) => controller.value?.move(e.clientX, e.clientY);\n const handleEnd = (e: PointerEvent) => {\n controller.value?.end();\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n const handleCancel = (e: PointerEvent) => {\n controller.value?.cancel();\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n const createResizeProps = (handle: ResizeHandle) => ({\n onPointerdown: (e: PointerEvent) => {\n if (!isEnabled()) return;\n e.preventDefault();\n e.stopPropagation();\n controller.value?.startResize(handle, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId);\n },\n onPointermove: handleMove,\n onPointerup: handleEnd,\n onPointercancel: handleCancel,\n });\n\n const createVertexProps = (vertexIndex: number) => ({\n onPointerdown: (e: PointerEvent) => {\n if (!isEnabled()) return;\n e.preventDefault();\n e.stopPropagation();\n controller.value?.startVertexEdit(vertexIndex, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId);\n },\n onPointermove: handleMove,\n onPointerup: handleEnd,\n onPointercancel: handleCancel,\n });\n\n const dragProps = computed(() =>\n isEnabled()\n ? {\n onPointerdown: handleDragStart,\n onPointermove: handleMove,\n onPointerup: handleEnd,\n onPointercancel: handleCancel,\n }\n : {},\n );\n\n return { dragProps, createResizeProps, createVertexProps };\n}\n","import { ref } from 'vue';\n\ntype DoublePressOptions = {\n delay?: number; // ms between taps\n tolerancePx?: number; // spatial tolerance\n};\n\ntype DoubleHandler = ((e: PointerEvent | MouseEvent) => void) | undefined;\n\ntype DoubleProps = {\n onDblclick?: (e: MouseEvent) => void;\n onPointerupCapture?: (e: PointerEvent) => void;\n};\n\n/**\n * Vue composable for handling double-press/double-tap interactions.\n *\n * @param onDouble - Callback to invoke on double press/tap\n * @param options - Configuration for delay and spatial tolerance\n * @returns Event handler props to be spread on an element with v-bind\n *\n * @example\n * ```vue\n * <script setup>\n * import { useDoublePressProps } from '@embedpdf/utils/vue';\n *\n * const handleDoubleClick = (e) => {\n * console.log('Double clicked!');\n * };\n *\n * const doubleProps = useDoublePressProps(handleDoubleClick);\n * </script>\n *\n * <template>\n * <div v-bind=\"doubleProps\">\n * Double click/tap me\n * </div>\n * </template>\n * ```\n */\nexport function useDoublePressProps(\n onDouble?: DoubleHandler,\n { delay = 300, tolerancePx = 18 }: DoublePressOptions = {},\n): DoubleProps {\n const last = ref({ t: 0, x: 0, y: 0 });\n\n const handlePointerUp = (e: PointerEvent) => {\n if (!onDouble) return;\n\n // Ignore mouse (it will use native dblclick),\n // and ignore non-primary pointers (multi-touch, etc.)\n if (e.pointerType === 'mouse' || e.isPrimary === false) return;\n\n const now = performance.now();\n const x = e.clientX;\n const y = e.clientY;\n\n const withinTime = now - last.value.t <= delay;\n const dx = x - last.value.x;\n const dy = y - last.value.y;\n const withinDist = dx * dx + dy * dy <= tolerancePx * tolerancePx;\n\n if (withinTime && withinDist) {\n onDouble?.(e);\n }\n\n last.value = { t: now, x, y };\n };\n\n const handleDouble = (e: MouseEvent) => {\n onDouble?.(e);\n };\n\n return onDouble\n ? {\n // Vue uses lowercase 'c' in dblclick\n onDblclick: handleDouble,\n onPointerupCapture: handlePointerUp,\n }\n : {};\n}\n","import { computed, type CSSProperties } from 'vue';\nimport { useDragResize, type UseDragResizeOptions } from './use-drag-resize';\nimport {\n describeResizeFromConfig,\n describeVerticesFromConfig,\n type ResizeUI,\n type VertexUI,\n} from '../../shared/plugin-interaction-primitives/utils';\nimport type { Position, Rect } from '@embedpdf/models';\nimport { norm, rectDTO, vertsDTO } from '../utils/interaction-normalize';\n\nexport type HandleElementProps = {\n key: string | number;\n style: CSSProperties;\n onPointerdown: (e: PointerEvent) => void;\n onPointermove: (e: PointerEvent) => void;\n onPointerup: (e: PointerEvent) => void;\n onPointercancel: (e: PointerEvent) => void;\n} & Record<string, any>;\n\nexport interface UseInteractionHandlesOptions {\n controller: UseDragResizeOptions; // may contain refs\n resizeUI?: ResizeUI;\n vertexUI?: VertexUI;\n includeVertices?: boolean;\n handleAttrs?: (\n h: 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w',\n ) => Record<string, any> | void;\n vertexAttrs?: (i: number) => Record<string, any> | void;\n}\n\nexport function useInteractionHandles(opts: UseInteractionHandlesOptions) {\n const {\n controller,\n resizeUI,\n vertexUI,\n includeVertices = false,\n handleAttrs,\n vertexAttrs,\n } = opts;\n\n // Owns live interaction handlers\n const { dragProps, createResizeProps, createVertexProps } = useDragResize(controller);\n\n // Plain snapshots for the *descriptor* helpers\n const elementPlain = computed<Rect>(() => rectDTO(norm(controller.element)));\n const verticesPlain = computed<Position[] | undefined>(() =>\n controller.vertices ? vertsDTO(norm(controller.vertices)) : undefined,\n );\n const scalePlain = computed<number>(() => Number(norm(controller.scale ?? 1)));\n const rotationPlain = computed<number>(() => Number(norm(controller.pageRotation ?? 0)));\n const maintainPlain = computed<boolean | undefined>(() =>\n controller.maintainAspectRatio === undefined\n ? undefined\n : Boolean(norm(controller.maintainAspectRatio)),\n );\n const constraintsPlain = computed(() => norm(controller.constraints ?? undefined));\n\n const resize = computed<HandleElementProps[]>(() => {\n const desc = describeResizeFromConfig(\n {\n element: elementPlain.value,\n scale: scalePlain.value,\n pageRotation: rotationPlain.value,\n maintainAspectRatio: maintainPlain.value,\n constraints: constraintsPlain.value,\n },\n resizeUI,\n );\n return desc.map((d) => ({\n key: (d.attrs?.['data-epdf-handle'] as string) ?? d.handle,\n style: d.style as CSSProperties,\n ...createResizeProps(d.handle),\n ...(d.attrs ?? {}),\n ...(handleAttrs?.(d.handle) ?? {}),\n }));\n });\n\n const vertices = computed<HandleElementProps[]>(() => {\n if (!includeVertices) return [];\n const verts = verticesPlain.value ?? [];\n const desc = describeVerticesFromConfig(\n { element: elementPlain.value, scale: scalePlain.value, vertices: verts },\n vertexUI,\n verts,\n );\n return desc.map((d, i) => ({\n key: i,\n style: d.style as CSSProperties,\n ...createVertexProps(i),\n ...(d.attrs ?? {}),\n ...(vertexAttrs?.(i) ?? {}),\n }));\n });\n\n return { dragProps, resize, vertices };\n}\n","import { toRaw, isRef, isReactive, isProxy } from 'vue';\n\nexport function deepToRaw<T extends Record<string, any>>(sourceObj: T): T {\n const objectIterator = (input: any): any => {\n if (Array.isArray(input)) {\n return input.map((item) => objectIterator(item));\n }\n if (isRef(input) || isReactive(input) || isProxy(input)) {\n return objectIterator(toRaw(input));\n }\n if (input && typeof input === 'object') {\n return Object.keys(input).reduce((acc, key) => {\n acc[key as keyof typeof acc] = objectIterator(input[key]);\n return acc;\n }, {} as T);\n }\n return input;\n };\n\n return objectIterator(sourceObj);\n}\n"],"names":["_renderSlot"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function deepToRaw<T extends Record<string, any>>(sourceObj: T): T;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
import { Rect, Position } from '@embedpdf/models';
|
|
3
|
+
import { DragResizeConfig } from '../../shared-vue/plugin-interaction-primitives';
|
|
4
|
+
export type MaybeRef<T> = T | Ref<T>;
|
|
5
|
+
export declare const norm: <T>(v: MaybeRef<T>) => T;
|
|
6
|
+
export declare const toNum: (n: unknown, fallback?: number) => number;
|
|
7
|
+
export declare const rectDTO: (r: any) => Rect;
|
|
8
|
+
export declare const vertsDTO: (arr?: any[]) => Position[];
|
|
9
|
+
export declare const boolDTO: (b: unknown) => boolean | undefined;
|
|
10
|
+
export declare const numDTO: (n: unknown) => number | undefined;
|
|
11
|
+
export declare const constraintsDTO: (c: MaybeRef<DragResizeConfig["constraints"]> | undefined) => DragResizeConfig["constraints"] | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@embedpdf/utils",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.14",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Shared utility helpers (geometry, tasks, logging, PDF primitives) that underpin every package in the EmbedPDF ecosystem.",
|
|
6
6
|
"type": "module",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"typescript": "^5.0.0",
|
|
49
49
|
"@types/react": "^18.2.0",
|
|
50
|
-
"@embedpdf/models": "1.3.
|
|
50
|
+
"@embedpdf/models": "1.3.14",
|
|
51
51
|
"@embedpdf/build": "1.0.1"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|