@prosekit/web 0.8.0-beta.0 → 0.8.0-beta.1
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/prosekit-web-autocomplete.d.ts +112 -90
- package/dist/prosekit-web-autocomplete.d.ts.map +1 -1
- package/dist/prosekit-web-autocomplete.js +292 -217
- package/dist/prosekit-web-autocomplete.js.map +1 -1
- package/dist/prosekit-web-block-handle.d.ts +95 -62
- package/dist/prosekit-web-block-handle.d.ts.map +1 -1
- package/dist/prosekit-web-block-handle.js +219 -114
- package/dist/prosekit-web-block-handle.js.map +1 -1
- package/dist/prosekit-web-drop-indicator.d.ts +13 -15
- package/dist/prosekit-web-drop-indicator.d.ts.map +1 -1
- package/dist/prosekit-web-drop-indicator.js +34 -30
- package/dist/prosekit-web-drop-indicator.js.map +1 -1
- package/dist/prosekit-web-inline-popover.d.ts +88 -54
- package/dist/prosekit-web-inline-popover.d.ts.map +1 -1
- package/dist/prosekit-web-inline-popover.js +129 -79
- package/dist/prosekit-web-inline-popover.js.map +1 -1
- package/dist/prosekit-web-menu.d.ts +13 -0
- package/dist/prosekit-web-menu.d.ts.map +1 -0
- package/dist/prosekit-web-menu.js +53 -0
- package/dist/prosekit-web-menu.js.map +1 -0
- package/dist/prosekit-web-popover.d.ts +7 -26
- package/dist/prosekit-web-popover.d.ts.map +1 -1
- package/dist/prosekit-web-popover.js +31 -29
- package/dist/prosekit-web-popover.js.map +1 -1
- package/dist/prosekit-web-resizable.d.ts +92 -51
- package/dist/prosekit-web-resizable.d.ts.map +1 -1
- package/dist/prosekit-web-resizable.js +139 -131
- package/dist/prosekit-web-resizable.js.map +1 -1
- package/dist/prosekit-web-table-handle.d.ts +166 -199
- package/dist/prosekit-web-table-handle.d.ts.map +1 -1
- package/dist/prosekit-web-table-handle.js +495 -496
- package/dist/prosekit-web-table-handle.js.map +1 -1
- package/dist/prosekit-web-tooltip.d.ts +7 -26
- package/dist/prosekit-web-tooltip.d.ts.map +1 -1
- package/dist/prosekit-web-tooltip.js +31 -29
- package/dist/prosekit-web-tooltip.js.map +1 -1
- package/dist/use-editor-extension.js +2 -2
- package/dist/use-editor-extension.js.map +1 -1
- package/dist/use-scrolling.js +17 -8
- package/dist/use-scrolling.js.map +1 -1
- package/package.json +28 -23
- package/src/components/autocomplete/autocomplete-empty.ts +45 -0
- package/src/components/autocomplete/autocomplete-item.ts +65 -0
- package/src/components/autocomplete/autocomplete-popup.ts +95 -0
- package/src/components/autocomplete/autocomplete-positioner.ts +98 -0
- package/src/components/autocomplete/autocomplete-root.ts +280 -0
- package/src/components/autocomplete/context.ts +16 -14
- package/src/components/autocomplete/index.ts +65 -0
- package/src/components/block-handle/block-handle-add.ts +71 -0
- package/src/components/block-handle/block-handle-draggable.ts +158 -0
- package/src/components/block-handle/block-handle-popup.ts +43 -0
- package/src/components/block-handle/block-handle-positioner.ts +89 -0
- package/src/components/block-handle/block-handle-root.ts +116 -0
- package/src/components/block-handle/context.ts +9 -18
- package/src/components/block-handle/hover-state.ts +16 -0
- package/src/components/block-handle/index.ts +59 -0
- package/src/components/block-handle/{block-handle-popover/pointer-move.ts → pointer-move.ts} +8 -7
- package/src/components/block-handle/{block-handle-draggable/set-drag-preview.ts → set-drag-preview.ts} +4 -4
- package/src/components/block-handle/use-hover-extension.ts +65 -0
- package/src/components/drop-indicator/drop-indicator.ts +128 -0
- package/src/components/drop-indicator/index.ts +18 -0
- package/src/components/inline-popover/index.ts +41 -0
- package/src/components/inline-popover/inline-popover-popup.ts +52 -0
- package/src/components/inline-popover/inline-popover-positioner.ts +98 -0
- package/src/components/inline-popover/inline-popover-root.ts +122 -0
- package/src/components/inline-popover/store.ts +6 -0
- package/src/components/menu/index.ts +92 -0
- package/src/components/popover/index.ts +53 -0
- package/src/components/resizable/{resizable-handle/calc-resize.ts → calc-resize.ts} +1 -1
- package/src/components/resizable/context.ts +3 -6
- package/src/components/resizable/index.ts +32 -0
- package/src/components/resizable/resizable-handle.ts +134 -0
- package/src/components/resizable/resizable-root.ts +184 -0
- package/src/components/table-handle/dnd.ts +16 -27
- package/src/components/table-handle/index.ts +125 -0
- package/src/components/table-handle/{table-handle-drag-preview/render-preview.ts → render-preview.ts} +5 -5
- package/src/components/table-handle/shared.ts +61 -0
- package/src/components/table-handle/store.ts +117 -0
- package/src/components/table-handle/table-handle-column-menu-root.ts +51 -0
- package/src/components/table-handle/table-handle-column-menu-trigger.ts +107 -0
- package/src/components/table-handle/table-handle-column-popup.ts +44 -0
- package/src/components/table-handle/table-handle-column-positioner.ts +67 -0
- package/src/components/table-handle/table-handle-drag-preview.ts +169 -0
- package/src/components/table-handle/table-handle-drop-indicator.ts +166 -0
- package/src/components/table-handle/table-handle-root.ts +103 -0
- package/src/components/table-handle/table-handle-row-menu-root.ts +51 -0
- package/src/components/table-handle/table-handle-row-menu-trigger.ts +107 -0
- package/src/components/table-handle/table-handle-row-popup.ts +42 -0
- package/src/components/table-handle/table-handle-row-positioner.ts +67 -0
- package/src/components/table-handle/use-drop.ts +74 -0
- package/src/components/table-handle/{hooks/use-empty-image.ts → use-empty-image.ts} +2 -3
- package/src/components/table-handle/utils.ts +0 -11
- package/src/components/tooltip/index.ts +52 -0
- package/src/hooks/use-editor-extension.ts +4 -4
- package/src/hooks/use-editor-focus-event.ts +4 -4
- package/src/hooks/use-editor-typing.ts +12 -16
- package/src/hooks/use-editor-update-event.ts +4 -4
- package/src/hooks/use-keymap.ts +4 -4
- package/src/hooks/use-scrolling.ts +11 -10
- package/src/hooks/use-selecting.ts +8 -15
- package/src/utils/event.ts +28 -0
- package/src/utils/lazy-signal.spec.ts +68 -0
- package/src/utils/lazy-signal.ts +17 -0
- package/src/utils/prefers-reduced-motion.ts +6 -0
- package/src/utils/prevent-default.ts +3 -0
- package/src/utils/use-html-element-at.ts +17 -0
- package/src/utils/use-no-focus.ts +7 -0
- package/dist/get-default-state.js +0 -11
- package/dist/get-default-state.js.map +0 -1
- package/src/components/autocomplete/autocomplete-empty/element.gen.ts +0 -18
- package/src/components/autocomplete/autocomplete-empty/setup.ts +0 -6
- package/src/components/autocomplete/autocomplete-empty/types.ts +0 -13
- package/src/components/autocomplete/autocomplete-item/element.gen.ts +0 -18
- package/src/components/autocomplete/autocomplete-item/setup.ts +0 -30
- package/src/components/autocomplete/autocomplete-item/types.ts +0 -25
- package/src/components/autocomplete/autocomplete-list/element.gen.ts +0 -18
- package/src/components/autocomplete/autocomplete-list/setup.ts +0 -125
- package/src/components/autocomplete/autocomplete-list/types.ts +0 -22
- package/src/components/autocomplete/autocomplete-popover/element.gen.ts +0 -18
- package/src/components/autocomplete/autocomplete-popover/setup.ts +0 -169
- package/src/components/autocomplete/autocomplete-popover/types.ts +0 -100
- package/src/components/autocomplete/index.gen.ts +0 -17
- package/src/components/block-handle/block-handle-add/element.gen.ts +0 -18
- package/src/components/block-handle/block-handle-add/setup.ts +0 -33
- package/src/components/block-handle/block-handle-add/types.ts +0 -23
- package/src/components/block-handle/block-handle-draggable/element.gen.ts +0 -18
- package/src/components/block-handle/block-handle-draggable/setup.ts +0 -113
- package/src/components/block-handle/block-handle-draggable/types.ts +0 -23
- package/src/components/block-handle/block-handle-popover/element.gen.ts +0 -18
- package/src/components/block-handle/block-handle-popover/setup.ts +0 -68
- package/src/components/block-handle/block-handle-popover/types.ts +0 -81
- package/src/components/block-handle/index.gen.ts +0 -13
- package/src/components/drop-indicator/drop-indicator/element.gen.ts +0 -18
- package/src/components/drop-indicator/drop-indicator/setup.ts +0 -75
- package/src/components/drop-indicator/drop-indicator/types.ts +0 -31
- package/src/components/drop-indicator/index.gen.ts +0 -5
- package/src/components/inline-popover/index.gen.ts +0 -5
- package/src/components/inline-popover/inline-popover/element.gen.ts +0 -18
- package/src/components/inline-popover/inline-popover/setup.ts +0 -111
- package/src/components/inline-popover/inline-popover/types.ts +0 -112
- package/src/components/popover/index.gen.ts +0 -13
- package/src/components/popover/popover-content/element.gen.ts +0 -18
- package/src/components/popover/popover-content/setup.ts +0 -1
- package/src/components/popover/popover-content/types.ts +0 -6
- package/src/components/popover/popover-root/element.gen.ts +0 -18
- package/src/components/popover/popover-root/setup.ts +0 -1
- package/src/components/popover/popover-root/types.ts +0 -6
- package/src/components/popover/popover-trigger/element.gen.ts +0 -18
- package/src/components/popover/popover-trigger/setup.ts +0 -1
- package/src/components/popover/popover-trigger/types.ts +0 -6
- package/src/components/resizable/index.gen.ts +0 -9
- package/src/components/resizable/resizable-handle/element.gen.ts +0 -18
- package/src/components/resizable/resizable-handle/setup.ts +0 -106
- package/src/components/resizable/resizable-handle/types.ts +0 -29
- package/src/components/resizable/resizable-root/element.gen.ts +0 -18
- package/src/components/resizable/resizable-root/setup.ts +0 -84
- package/src/components/resizable/resizable-root/types.ts +0 -59
- package/src/components/table-handle/context.ts +0 -43
- package/src/components/table-handle/hooks/use-drop.ts +0 -85
- package/src/components/table-handle/index.gen.ts +0 -37
- package/src/components/table-handle/table-handle-column-root/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-column-root/setup.ts +0 -60
- package/src/components/table-handle/table-handle-column-root/types.ts +0 -73
- package/src/components/table-handle/table-handle-column-trigger/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-column-trigger/setup.ts +0 -64
- package/src/components/table-handle/table-handle-column-trigger/types.ts +0 -20
- package/src/components/table-handle/table-handle-drag-preview/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-drag-preview/setup.ts +0 -57
- package/src/components/table-handle/table-handle-drag-preview/types.ts +0 -14
- package/src/components/table-handle/table-handle-drag-preview/updater.ts +0 -90
- package/src/components/table-handle/table-handle-drop-indicator/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-drop-indicator/setup.ts +0 -52
- package/src/components/table-handle/table-handle-drop-indicator/types.ts +0 -15
- package/src/components/table-handle/table-handle-drop-indicator/updater.ts +0 -96
- package/src/components/table-handle/table-handle-popover-content/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-popover-content/setup.ts +0 -83
- package/src/components/table-handle/table-handle-popover-content/types.ts +0 -32
- package/src/components/table-handle/table-handle-popover-item/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-popover-item/setup.ts +0 -17
- package/src/components/table-handle/table-handle-popover-item/types.ts +0 -16
- package/src/components/table-handle/table-handle-root/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-root/setup.ts +0 -86
- package/src/components/table-handle/table-handle-root/types.ts +0 -23
- package/src/components/table-handle/table-handle-row-root/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-row-root/setup.ts +0 -70
- package/src/components/table-handle/table-handle-row-root/types.ts +0 -68
- package/src/components/table-handle/table-handle-row-trigger/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-row-trigger/setup.ts +0 -63
- package/src/components/table-handle/table-handle-row-trigger/types.ts +0 -23
- package/src/components/tooltip/index.gen.ts +0 -13
- package/src/components/tooltip/tooltip-content/element.gen.ts +0 -18
- package/src/components/tooltip/tooltip-content/setup.ts +0 -1
- package/src/components/tooltip/tooltip-content/types.ts +0 -6
- package/src/components/tooltip/tooltip-root/element.gen.ts +0 -18
- package/src/components/tooltip/tooltip-root/setup.ts +0 -1
- package/src/components/tooltip/tooltip-root/types.ts +0 -6
- package/src/components/tooltip/tooltip-trigger/element.gen.ts +0 -18
- package/src/components/tooltip/tooltip-trigger/setup.ts +0 -1
- package/src/components/tooltip/tooltip-trigger/types.ts +0 -6
- package/src/hooks/use-first-rendering.ts +0 -15
- package/src/utils/get-default-state.spec.ts +0 -42
- package/src/utils/get-default-state.ts +0 -18
- /package/src/components/autocomplete/{autocomplete-popover/helpers.spec.ts → helpers.spec.ts} +0 -0
- /package/src/components/autocomplete/{autocomplete-popover/helpers.ts → helpers.ts} +0 -0
- /package/src/components/inline-popover/{inline-popover/virtual-selection-element.ts → virtual-selection-element.ts} +0 -0
- /package/src/components/resizable/{resizable-handle/calc-resize.spec.ts → calc-resize.spec.ts} +0 -0
- /package/src/components/table-handle/{table-handle-drop-indicator/calc-drag-over.ts → calc-drag-over.ts} +0 -0
|
@@ -1,25 +1,129 @@
|
|
|
1
|
-
import { createContext, createSignal, defineCustomElement,
|
|
1
|
+
import { createContext, createSignal, defineCustomElement, defineProps, registerCustomElement, useEffect } from "@aria-ui/core";
|
|
2
|
+
import { useAttribute } from "@aria-ui/utils";
|
|
2
3
|
import { getWindow } from "@ocavue/utils";
|
|
4
|
+
//#region src/utils/is-finite-positive-number.ts
|
|
5
|
+
function isFinitePositiveNumber(value) {
|
|
6
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
3
9
|
//#region src/components/resizable/context.ts
|
|
4
10
|
/**
|
|
5
11
|
* @internal
|
|
6
12
|
*/
|
|
7
|
-
const onResizeContext = createContext("prosekit/resizable/onResize"
|
|
13
|
+
const onResizeContext = createContext("prosekit/resizable/onResize");
|
|
8
14
|
/**
|
|
9
15
|
* @internal
|
|
10
16
|
*/
|
|
11
|
-
const onResizeStartContext = createContext("prosekit/resizable/onResizeStart"
|
|
17
|
+
const onResizeStartContext = createContext("prosekit/resizable/onResizeStart");
|
|
12
18
|
/**
|
|
13
19
|
* @internal
|
|
14
20
|
*/
|
|
15
|
-
const onResizeEndContext = createContext("prosekit/resizable/onResizeEnd"
|
|
21
|
+
const onResizeEndContext = createContext("prosekit/resizable/onResizeEnd");
|
|
16
22
|
//#endregion
|
|
17
|
-
//#region src/
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
//#region src/components/resizable/resizable-root.ts
|
|
24
|
+
/**
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
const ResizableRootPropsDeclaration = defineProps({
|
|
28
|
+
width: {
|
|
29
|
+
default: null,
|
|
30
|
+
attribute: "data-width",
|
|
31
|
+
type: "json"
|
|
32
|
+
},
|
|
33
|
+
height: {
|
|
34
|
+
default: null,
|
|
35
|
+
attribute: "data-height",
|
|
36
|
+
type: "json"
|
|
37
|
+
},
|
|
38
|
+
aspectRatio: {
|
|
39
|
+
default: null,
|
|
40
|
+
attribute: "data-aspect-ratio",
|
|
41
|
+
type: "json"
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
/**
|
|
45
|
+
* @public
|
|
46
|
+
*/
|
|
47
|
+
var ResizeStartEvent = class extends Event {
|
|
48
|
+
constructor(width, height) {
|
|
49
|
+
super("resizeStart");
|
|
50
|
+
this.detail = {
|
|
51
|
+
width,
|
|
52
|
+
height
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* @public
|
|
58
|
+
*/
|
|
59
|
+
var ResizeEndEvent = class extends Event {
|
|
60
|
+
constructor(width, height) {
|
|
61
|
+
super("resizeEnd");
|
|
62
|
+
this.detail = {
|
|
63
|
+
width,
|
|
64
|
+
height
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
function setupResizableRoot(host, props) {
|
|
72
|
+
const resizing = createSignal(false);
|
|
73
|
+
const onResizeStart = () => {
|
|
74
|
+
const { width, height } = host.getBoundingClientRect();
|
|
75
|
+
let aspectRatio = props.aspectRatio.get() ?? width / height;
|
|
76
|
+
if (!isFinitePositiveNumber(aspectRatio)) aspectRatio = 0;
|
|
77
|
+
resizing.set(true);
|
|
78
|
+
host.dispatchEvent(new ResizeStartEvent(width, height));
|
|
79
|
+
return [
|
|
80
|
+
width,
|
|
81
|
+
height,
|
|
82
|
+
aspectRatio
|
|
83
|
+
];
|
|
84
|
+
};
|
|
85
|
+
const onResize = (width, height) => {
|
|
86
|
+
props.width.set(width);
|
|
87
|
+
props.height.set(height);
|
|
88
|
+
};
|
|
89
|
+
const onResizeEnd = () => {
|
|
90
|
+
const { width, height } = host.getBoundingClientRect();
|
|
91
|
+
resizing.set(false);
|
|
92
|
+
host.dispatchEvent(new ResizeEndEvent(width, height));
|
|
93
|
+
};
|
|
94
|
+
onResizeStartContext.provide(host, onResizeStart);
|
|
95
|
+
onResizeContext.provide(host, onResize);
|
|
96
|
+
onResizeEndContext.provide(host, onResizeEnd);
|
|
97
|
+
useEffect(host, () => {
|
|
98
|
+
updateResizableRootStyles(host, Math.max(props.width.get() || 0, 1), Math.max(props.height.get() || 0, 1), props.aspectRatio.get());
|
|
99
|
+
});
|
|
100
|
+
useAttribute(host, "data-resizing", () => resizing.get() ? "" : void 0);
|
|
101
|
+
}
|
|
102
|
+
function updateResizableRootStyles(host, width, height, aspectRatio) {
|
|
103
|
+
host.style.width = isFinitePositiveNumber(width) ? `${width}px` : "";
|
|
104
|
+
host.style.height = isFinitePositiveNumber(height) ? `${height}px` : "";
|
|
105
|
+
if (isFinitePositiveNumber(aspectRatio)) {
|
|
106
|
+
host.style.aspectRatio = `${aspectRatio}`;
|
|
107
|
+
if (width && width > 0 && aspectRatio >= 1) host.style.height = "auto";
|
|
108
|
+
else if (height && height > 0 && aspectRatio <= 1) host.style.width = "min-content";
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const ResizableRootElementBase = defineCustomElement(setupResizableRoot, ResizableRootPropsDeclaration);
|
|
112
|
+
/**
|
|
113
|
+
* @public
|
|
114
|
+
*/
|
|
115
|
+
var ResizableRootElement = class extends ResizableRootElementBase {};
|
|
116
|
+
let isResizableRootRegistered = false;
|
|
117
|
+
/**
|
|
118
|
+
* @internal
|
|
119
|
+
*/
|
|
120
|
+
function registerResizableRootElement() {
|
|
121
|
+
if (isResizableRootRegistered) return;
|
|
122
|
+
isResizableRootRegistered = true;
|
|
123
|
+
registerCustomElement("prosekit-resizable-root", ResizableRootElement);
|
|
20
124
|
}
|
|
21
125
|
//#endregion
|
|
22
|
-
//#region src/components/resizable/
|
|
126
|
+
//#region src/components/resizable/calc-resize.ts
|
|
23
127
|
function calcResize(position, w, h, dx, dy, aspectRatio) {
|
|
24
128
|
aspectRatio = aspectRatio ? aspectRatio : w / h;
|
|
25
129
|
aspectRatio = isFinitePositiveNumber(aspectRatio) ? aspectRatio : 1;
|
|
@@ -91,18 +195,22 @@ function clamp([w, h]) {
|
|
|
91
195
|
return [Math.max(w, 1), Math.max(h, 1)];
|
|
92
196
|
}
|
|
93
197
|
//#endregion
|
|
94
|
-
//#region src/components/resizable/resizable-handle
|
|
198
|
+
//#region src/components/resizable/resizable-handle.ts
|
|
95
199
|
/**
|
|
96
200
|
* @internal
|
|
97
201
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
202
|
+
const ResizableHandlePropsDeclaration = defineProps({ position: {
|
|
203
|
+
default: "bottom-right",
|
|
204
|
+
attribute: "position",
|
|
205
|
+
type: "string"
|
|
206
|
+
} });
|
|
207
|
+
/**
|
|
208
|
+
* @internal
|
|
209
|
+
*/
|
|
210
|
+
function setupResizableHandle(host, props) {
|
|
211
|
+
const getOnResize = onResizeContext.consume(host);
|
|
212
|
+
const getOnResizeStart = onResizeStartContext.consume(host);
|
|
213
|
+
const getOnResizeEnd = onResizeEndContext.consume(host);
|
|
106
214
|
let startX = 0;
|
|
107
215
|
let startY = 0;
|
|
108
216
|
let width = 0;
|
|
@@ -114,20 +222,20 @@ function useResizableHandleState(host, state, context) {
|
|
|
114
222
|
pointerPressing.set(true);
|
|
115
223
|
startX = event.x;
|
|
116
224
|
startY = event.y;
|
|
117
|
-
const size =
|
|
225
|
+
const size = getOnResizeStart()?.();
|
|
118
226
|
if (size) [width, height, aspectRatio] = size;
|
|
119
227
|
};
|
|
120
228
|
const handlePointerMove = (event) => {
|
|
121
229
|
event.preventDefault();
|
|
122
230
|
const dx = event.x - startX;
|
|
123
231
|
const dy = event.y - startY;
|
|
124
|
-
const [w, h] = calcResize(
|
|
125
|
-
|
|
232
|
+
const [w, h] = calcResize(props.position.get(), width, height, dx, dy, aspectRatio);
|
|
233
|
+
getOnResize()?.(w, h);
|
|
126
234
|
};
|
|
127
235
|
const handlePointerUp = (event) => {
|
|
128
236
|
event.preventDefault();
|
|
129
237
|
pointerPressing.set(false);
|
|
130
|
-
|
|
238
|
+
getOnResizeEnd()?.();
|
|
131
239
|
};
|
|
132
240
|
useEffect(host, () => {
|
|
133
241
|
host.addEventListener("pointerdown", handlePointerDown);
|
|
@@ -146,121 +254,21 @@ function useResizableHandleState(host, state, context) {
|
|
|
146
254
|
};
|
|
147
255
|
});
|
|
148
256
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
/** @internal */
|
|
154
|
-
const resizableHandleEvents = {};
|
|
155
|
-
//#endregion
|
|
156
|
-
//#region src/components/resizable/resizable-handle/element.gen.ts
|
|
157
|
-
const ResizableHandleElementBase = defineCustomElement({
|
|
158
|
-
props: resizableHandleProps,
|
|
159
|
-
events: resizableHandleEvents,
|
|
160
|
-
setup: useResizableHandle
|
|
161
|
-
});
|
|
257
|
+
const ResizableHandleElementBase = defineCustomElement(setupResizableHandle, ResizableHandlePropsDeclaration);
|
|
258
|
+
/**
|
|
259
|
+
* @public
|
|
260
|
+
*/
|
|
162
261
|
var ResizableHandleElement = class extends ResizableHandleElementBase {};
|
|
163
|
-
|
|
164
|
-
//#endregion
|
|
165
|
-
//#region src/components/resizable/resizable-root/setup.ts
|
|
262
|
+
let isResizableHandleRegistered = false;
|
|
166
263
|
/**
|
|
167
264
|
* @internal
|
|
168
265
|
*/
|
|
169
|
-
function
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
let aspectRatio = state.aspectRatio.peek() ?? width / height;
|
|
174
|
-
if (!isFinitePositiveNumber(aspectRatio)) aspectRatio = 0;
|
|
175
|
-
emit("resizeStart", {
|
|
176
|
-
width,
|
|
177
|
-
height
|
|
178
|
-
});
|
|
179
|
-
resizing.set(true);
|
|
180
|
-
return [
|
|
181
|
-
width,
|
|
182
|
-
height,
|
|
183
|
-
aspectRatio
|
|
184
|
-
];
|
|
185
|
-
};
|
|
186
|
-
const onResize = (width, height) => {
|
|
187
|
-
state.width.set(width);
|
|
188
|
-
state.height.set(height);
|
|
189
|
-
};
|
|
190
|
-
const onResizeEnd = () => {
|
|
191
|
-
const { width, height } = host.getBoundingClientRect();
|
|
192
|
-
emit("resizeEnd", {
|
|
193
|
-
width,
|
|
194
|
-
height
|
|
195
|
-
});
|
|
196
|
-
resizing.set(false);
|
|
197
|
-
};
|
|
198
|
-
onResizeStartContext.provide(host, createSignal(onResizeStart));
|
|
199
|
-
onResizeContext.provide(host, createSignal(onResize));
|
|
200
|
-
onResizeEndContext.provide(host, createSignal(onResizeEnd));
|
|
201
|
-
useEffect(host, () => {
|
|
202
|
-
updateResizableRootStyles(host, Math.max(state.width.get() || 0, 1), Math.max(state.height.get() || 0, 1), state.aspectRatio.get());
|
|
203
|
-
});
|
|
204
|
-
useAttribute(host, "data-resizing", () => resizing.get() ? "" : void 0);
|
|
205
|
-
}
|
|
206
|
-
function updateResizableRootStyles(host, width, height, aspectRatio) {
|
|
207
|
-
host.style.width = isFinitePositiveNumber(width) ? `${width}px` : "";
|
|
208
|
-
host.style.height = isFinitePositiveNumber(height) ? `${height}px` : "";
|
|
209
|
-
if (isFinitePositiveNumber(aspectRatio)) {
|
|
210
|
-
host.style.aspectRatio = `${aspectRatio}`;
|
|
211
|
-
if (width && width > 0 && aspectRatio >= 1) host.style.height = "auto";
|
|
212
|
-
else if (height && height > 0 && aspectRatio <= 1) host.style.width = "min-content";
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
//#endregion
|
|
216
|
-
//#region src/components/resizable/resizable-root/types.ts
|
|
217
|
-
function fromNumberAttribute(value) {
|
|
218
|
-
if (typeof value === "string") {
|
|
219
|
-
const number = Number.parseFloat(value);
|
|
220
|
-
if (isFinitePositiveNumber(number)) return number;
|
|
221
|
-
}
|
|
222
|
-
return null;
|
|
223
|
-
}
|
|
224
|
-
function toNumberAttribute(value) {
|
|
225
|
-
if (typeof value === "number") return `${value}`;
|
|
226
|
-
return null;
|
|
266
|
+
function registerResizableHandleElement() {
|
|
267
|
+
if (isResizableHandleRegistered) return;
|
|
268
|
+
isResizableHandleRegistered = true;
|
|
269
|
+
registerCustomElement("prosekit-resizable-handle", ResizableHandleElement);
|
|
227
270
|
}
|
|
228
|
-
/** @internal */
|
|
229
|
-
const resizableRootProps = {
|
|
230
|
-
width: {
|
|
231
|
-
default: null,
|
|
232
|
-
attribute: "data-width",
|
|
233
|
-
fromAttribute: fromNumberAttribute,
|
|
234
|
-
toAttribute: toNumberAttribute
|
|
235
|
-
},
|
|
236
|
-
height: {
|
|
237
|
-
default: null,
|
|
238
|
-
attribute: "data-height",
|
|
239
|
-
fromAttribute: fromNumberAttribute,
|
|
240
|
-
toAttribute: toNumberAttribute
|
|
241
|
-
},
|
|
242
|
-
aspectRatio: {
|
|
243
|
-
default: null,
|
|
244
|
-
attribute: "data-aspect-ratio",
|
|
245
|
-
fromAttribute: fromNumberAttribute,
|
|
246
|
-
toAttribute: toNumberAttribute
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
/** @internal */
|
|
250
|
-
const resizableRootEvents = {
|
|
251
|
-
resizeStart: {},
|
|
252
|
-
resizeEnd: {}
|
|
253
|
-
};
|
|
254
|
-
//#endregion
|
|
255
|
-
//#region src/components/resizable/resizable-root/element.gen.ts
|
|
256
|
-
const ResizableRootElementBase = defineCustomElement({
|
|
257
|
-
props: resizableRootProps,
|
|
258
|
-
events: resizableRootEvents,
|
|
259
|
-
setup: useResizableRoot
|
|
260
|
-
});
|
|
261
|
-
var ResizableRootElement = class extends ResizableRootElementBase {};
|
|
262
|
-
registerCustomElement("prosekit-resizable-root", ResizableRootElement);
|
|
263
271
|
//#endregion
|
|
264
|
-
export { ResizableHandleElement, ResizableRootElement,
|
|
272
|
+
export { ResizableHandleElement, ResizableHandlePropsDeclaration, ResizableRootElement, ResizableRootPropsDeclaration, ResizeEndEvent, ResizeStartEvent, registerResizableHandleElement, registerResizableRootElement, setupResizableHandle, setupResizableRoot };
|
|
265
273
|
|
|
266
274
|
//# sourceMappingURL=prosekit-web-resizable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-web-resizable.js","names":[],"sources":["../src/components/resizable/context.ts","../src/utils/is-finite-positive-number.ts","../src/components/resizable/resizable-handle/calc-resize.ts","../src/components/resizable/resizable-handle/setup.ts","../src/components/resizable/resizable-handle/types.ts","../src/components/resizable/resizable-handle/element.gen.ts","../src/components/resizable/resizable-root/setup.ts","../src/components/resizable/resizable-root/types.ts","../src/components/resizable/resizable-root/element.gen.ts"],"sourcesContent":["import { createContext, type Context } from '@aria-ui/core'\n\n/**\n * @internal\n */\nexport const onResizeContext: Context<OnResize> = createContext(\n 'prosekit/resizable/onResize',\n null,\n)\n\n/**\n * @internal\n */\nexport const onResizeStartContext: Context<OnResizeStart> = createContext(\n 'prosekit/resizable/onResizeStart',\n null,\n)\n\n/**\n * @internal\n */\nexport const onResizeEndContext: Context<OnResizeEnd> = createContext(\n 'prosekit/resizable/onResizeEnd',\n null,\n)\n\n/**\n * @internal\n */\nexport type OnResize = ((width: number, height: number) => void) | null\n\n/**\n * @internal\n */\nexport type OnResizeStart =\n | (() => readonly [width: number, height: number, aspectRatio: number])\n | null\n\n/**\n * @internal\n */\nexport type OnResizeEnd = (() => void) | null\n","export function isFinitePositiveNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0\n}\n","import { isFinitePositiveNumber } from '../../../utils/is-finite-positive-number.ts'\n\nexport function calcResize(\n position:\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right',\n w: number,\n h: number,\n dx: number,\n dy: number,\n aspectRatio: number | null | undefined,\n): [w: number, h: number] {\n aspectRatio = aspectRatio ? aspectRatio : w / h\n aspectRatio = isFinitePositiveNumber(aspectRatio) ? aspectRatio : 1\n\n switch (position) {\n case 'bottom-right':\n return clamp(calcBottomRightResize(w, h, dx, dy, aspectRatio))\n case 'bottom-left':\n return clamp(calcBottomLeftResize(w, h, dx, dy, aspectRatio))\n case 'top-right':\n return clamp(calcTopRightResize(w, h, dx, dy, aspectRatio))\n case 'top-left':\n return clamp(calcTopLeftResize(w, h, dx, dy, aspectRatio))\n case 'top':\n return clamp(calcTopResize(w, h, dx, dy, aspectRatio))\n case 'right':\n return clamp(calcRightResize(w, h, dx, dy, aspectRatio))\n case 'bottom':\n return clamp(calcBottomResize(w, h, dx, dy, aspectRatio))\n case 'left':\n return clamp(calcLeftResize(w, h, dx, dy, aspectRatio))\n default:\n throw new RangeError(`Invalid position: ${position}`)\n }\n}\n\ntype CalcResize = (\n w: number,\n h: number,\n dx: number,\n dy: number,\n aspectRatio: number,\n) => [w: number, h: number]\n\nconst calcBottomRightResize: CalcResize = (w, h, dx, dy, r) => {\n w += dx\n h += dy\n\n const sum = w + h\n h = sum / (r + 1)\n w = sum - h\n return [w, h]\n}\n\nconst calcBottomLeftResize: CalcResize = (w, h, dx, dy, r) => {\n w -= dx\n h += dy\n\n const sum = w + h\n h = sum / (r + 1)\n w = sum - h\n return [w, h]\n}\n\nconst calcTopRightResize: CalcResize = (w, h, dx, dy, r) => {\n w += dx\n h -= dy\n\n const sum = w + h\n h = sum / (r + 1)\n w = sum - h\n return [w, h]\n}\n\nconst calcTopLeftResize: CalcResize = (w, h, dx, dy, r) => {\n w -= dx\n h -= dy\n\n const sum = w + h\n h = sum / (r + 1)\n w = sum - h\n return [w, h]\n}\n\nconst calcTopResize: CalcResize = (w, h, dx, dy, r) => {\n h -= dy\n w = h * r\n return [w, h]\n}\n\nconst calcRightResize: CalcResize = (w, h, dx, dy, r) => {\n w += dx\n h = w / r\n return [w, h]\n}\n\nconst calcBottomResize: CalcResize = (w, h, dx, dy, r) => {\n h += dy\n w = h * r\n return [w, h]\n}\n\nconst calcLeftResize: CalcResize = (w, h, dx, dy, r) => {\n w -= dx\n h = w / r\n return [w, h]\n}\n\nfunction clamp([w, h]: [number, number]): [number, number] {\n return [\n Math.max(w, 1),\n Math.max(h, 1),\n ]\n}\n","import { createSignal, useEffect, type ConnectableElement, type ReadonlySignal, type SignalState } from '@aria-ui/core'\nimport { getWindow } from '@ocavue/utils'\n\nimport {\n onResizeContext,\n onResizeEndContext,\n onResizeStartContext,\n type OnResize,\n type OnResizeEnd,\n type OnResizeStart,\n} from '../context.ts'\n\nimport { calcResize } from './calc-resize.ts'\nimport type { ResizableHandleProps } from './types.ts'\n\n/**\n * @internal\n */\nexport function useResizableHandle(\n host: ConnectableElement,\n { state }: { state: SignalState<ResizableHandleProps> },\n): void {\n const onResize = onResizeContext.consume(host)\n const onResizeStart = onResizeStartContext.consume(host)\n const onResizeEnd = onResizeEndContext.consume(host)\n\n useResizableHandleState(host, state, { onResize, onResizeStart, onResizeEnd })\n}\n\nfunction useResizableHandleState(\n host: ConnectableElement,\n state: SignalState<ResizableHandleProps>,\n context: {\n onResizeStart: ReadonlySignal<OnResizeStart>\n onResize: ReadonlySignal<OnResize>\n onResizeEnd: ReadonlySignal<OnResizeEnd>\n },\n) {\n let startX = 0\n let startY = 0\n let width = 0\n let height = 0\n let aspectRatio = 1\n\n const pointerPressing = createSignal(false)\n\n const handlePointerDown = (event: PointerEvent) => {\n event.preventDefault()\n pointerPressing.set(true)\n\n startX = event.x\n startY = event.y\n\n const size = context.onResizeStart.get()?.()\n if (size) {\n ;[width, height, aspectRatio] = size\n }\n }\n\n const handlePointerMove = (event: PointerEvent) => {\n event.preventDefault()\n\n const dx = event.x - startX\n const dy = event.y - startY\n\n const [w, h] = calcResize(\n state.position.peek(),\n width,\n height,\n dx,\n dy,\n aspectRatio,\n )\n\n context.onResize.get()?.(w, h)\n }\n\n const handlePointerUp = (event: PointerEvent) => {\n event.preventDefault()\n pointerPressing.set(false)\n\n context.onResizeEnd.get()?.()\n }\n\n useEffect(host, () => {\n host.addEventListener('pointerdown', handlePointerDown)\n return () => {\n host.removeEventListener('pointerdown', handlePointerDown)\n }\n })\n\n useEffect(host, () => {\n if (!pointerPressing.get()) {\n return\n }\n\n const win = getWindow(host)\n\n win.addEventListener('pointermove', handlePointerMove)\n win.addEventListener('pointerup', handlePointerUp)\n return () => {\n win.removeEventListener('pointermove', handlePointerMove)\n win.removeEventListener('pointerup', handlePointerUp)\n }\n })\n}\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\n\nexport interface ResizableHandleProps {\n /**\n * The position of the handle.\n *\n * @default \"bottom-right\"\n */\n position:\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n}\n\n/** @internal */\nexport const resizableHandleProps: PropDeclarations<ResizableHandleProps> = {\n position: { default: 'bottom-right' },\n}\n\n/** @internal */\nexport interface ResizableHandleEvents {}\n\n/** @internal */\nexport const resizableHandleEvents: EventDeclarations<ResizableHandleEvents> = {}\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useResizableHandle } from \"./setup.ts\"\nimport { resizableHandleEvents, resizableHandleProps, type ResizableHandleEvents, type ResizableHandleProps } from \"./types.ts\"\n\nconst ResizableHandleElementBase: BaseElementConstructor<ResizableHandleProps> = defineCustomElement<\n ResizableHandleProps,\n ResizableHandleEvents\n>({\n props: resizableHandleProps,\n events: resizableHandleEvents,\n setup: useResizableHandle,\n})\nclass ResizableHandleElement extends ResizableHandleElementBase {}\n\nregisterCustomElement('prosekit-resizable-handle', ResizableHandleElement)\n \nexport { ResizableHandleElement }\n","import { createSignal, useAttribute, useEffect, type ConnectableElement, type SetupOptions } from '@aria-ui/core'\n\nimport { isFinitePositiveNumber } from '../../../utils/is-finite-positive-number.ts'\nimport {\n onResizeContext,\n onResizeEndContext,\n onResizeStartContext,\n type OnResize,\n type OnResizeEnd,\n type OnResizeStart,\n} from '../context.ts'\n\nimport type { ResizableRootEvents, ResizableRootProps } from './types.ts'\n\n/**\n * @internal\n */\nexport function useResizableRoot(\n host: ConnectableElement,\n { state, emit }: SetupOptions<ResizableRootProps, ResizableRootEvents>,\n): void {\n const resizing = createSignal(false)\n\n const onResizeStart: OnResizeStart = () => {\n const { width, height } = host.getBoundingClientRect()\n\n let aspectRatio: number = state.aspectRatio.peek() ?? width / height\n\n if (!isFinitePositiveNumber(aspectRatio)) {\n aspectRatio = 0\n }\n\n emit('resizeStart', { width, height })\n resizing.set(true)\n return [width, height, aspectRatio]\n }\n\n const onResize: OnResize = (width, height) => {\n state.width.set(width)\n state.height.set(height)\n }\n\n const onResizeEnd: OnResizeEnd = () => {\n const { width, height } = host.getBoundingClientRect()\n emit('resizeEnd', { width, height })\n resizing.set(false)\n }\n\n onResizeStartContext.provide(host, createSignal(onResizeStart))\n onResizeContext.provide(host, createSignal(onResize))\n onResizeEndContext.provide(host, createSignal(onResizeEnd))\n\n useEffect(host, () => {\n updateResizableRootStyles(\n host,\n Math.max(state.width.get() || 0, 1),\n Math.max(state.height.get() || 0, 1),\n state.aspectRatio.get(),\n )\n })\n\n useAttribute(host, 'data-resizing', () => (resizing.get() ? '' : undefined))\n}\n\nfunction updateResizableRootStyles(\n host: ConnectableElement,\n width: number,\n height: number,\n aspectRatio: number | null,\n) {\n host.style.width = isFinitePositiveNumber(width) ? `${width}px` : ''\n\n host.style.height = isFinitePositiveNumber(height) ? `${height}px` : ''\n\n if (isFinitePositiveNumber(aspectRatio)) {\n host.style.aspectRatio = `${aspectRatio}`\n\n if (width && width > 0 && aspectRatio >= 1) {\n host.style.height = 'auto'\n } else if (height && height > 0 && aspectRatio <= 1) {\n host.style.width = 'min-content'\n }\n }\n}\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\n\nimport { isFinitePositiveNumber } from '../../../utils/is-finite-positive-number.ts'\n\nexport interface ResizableRootProps {\n width: number | null\n height: number | null\n aspectRatio: number | null\n}\n\nfunction fromNumberAttribute(value: string | null): number | null {\n if (typeof value === 'string') {\n const number = Number.parseFloat(value)\n if (isFinitePositiveNumber(number)) {\n return number\n }\n }\n return null\n}\n\nfunction toNumberAttribute(value: number | null): string | null {\n if (typeof value === 'number') {\n return `${value}`\n }\n return null\n}\n\n/** @internal */\nexport const resizableRootProps: PropDeclarations<ResizableRootProps> = {\n width: {\n default: null,\n attribute: 'data-width',\n fromAttribute: fromNumberAttribute,\n toAttribute: toNumberAttribute,\n },\n height: {\n default: null,\n attribute: 'data-height',\n fromAttribute: fromNumberAttribute,\n toAttribute: toNumberAttribute,\n },\n aspectRatio: {\n default: null,\n attribute: 'data-aspect-ratio',\n fromAttribute: fromNumberAttribute,\n toAttribute: toNumberAttribute,\n },\n}\n\nexport interface ResizableRootEvents {\n resizeStart: CustomEvent<{ width: number; height: number }>\n resizeEnd: CustomEvent<{ width: number; height: number }>\n}\n\n/** @internal */\nexport const resizableRootEvents: EventDeclarations<ResizableRootEvents> = {\n resizeStart: {},\n resizeEnd: {},\n}\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useResizableRoot } from \"./setup.ts\"\nimport { resizableRootEvents, resizableRootProps, type ResizableRootEvents, type ResizableRootProps } from \"./types.ts\"\n\nconst ResizableRootElementBase: BaseElementConstructor<ResizableRootProps> = defineCustomElement<\n ResizableRootProps,\n ResizableRootEvents\n>({\n props: resizableRootProps,\n events: resizableRootEvents,\n setup: useResizableRoot,\n})\nclass ResizableRootElement extends ResizableRootElementBase {}\n\nregisterCustomElement('prosekit-resizable-root', ResizableRootElement)\n \nexport { ResizableRootElement }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prosekit-web-resizable.js","names":[],"sources":["../src/utils/is-finite-positive-number.ts","../src/components/resizable/context.ts","../src/components/resizable/resizable-root.ts","../src/components/resizable/calc-resize.ts","../src/components/resizable/resizable-handle.ts"],"sourcesContent":["export function isFinitePositiveNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0\n}\n","import { createContext, type Context } from '@aria-ui/core'\n\n/**\n * @internal\n */\nexport const onResizeContext: Context<OnResize> = createContext<OnResize>(\n 'prosekit/resizable/onResize',\n)\n\n/**\n * @internal\n */\nexport const onResizeStartContext: Context<OnResizeStart> = createContext<OnResizeStart>(\n 'prosekit/resizable/onResizeStart',\n)\n\n/**\n * @internal\n */\nexport const onResizeEndContext: Context<OnResizeEnd> = createContext<OnResizeEnd>(\n 'prosekit/resizable/onResizeEnd',\n)\n\n/**\n * @internal\n */\nexport type OnResize = ((width: number, height: number) => void) | null\n\n/**\n * @internal\n */\nexport type OnResizeStart =\n | (() => readonly [width: number, height: number, aspectRatio: number])\n | null\n\n/**\n * @internal\n */\nexport type OnResizeEnd = (() => void) | null\n","import type { HostElement, HostElementConstructor, PropsDeclaration } from '@aria-ui/core'\nimport { createSignal, defineCustomElement, defineProps, registerCustomElement, useEffect, type State } from '@aria-ui/core'\nimport { useAttribute } from '@aria-ui/utils'\n\nimport { isFinitePositiveNumber } from '../../utils/is-finite-positive-number.ts'\n\nimport {\n onResizeContext,\n onResizeEndContext,\n onResizeStartContext,\n type OnResize,\n type OnResizeEnd,\n type OnResizeStart,\n} from './context.ts'\n\n/**\n * @public\n */\nexport interface ResizableRootProps {\n /**\n * The width of the resizable element.\n *\n * @default null\n */\n width: number | null\n\n /**\n * The height of the resizable element.\n *\n * @default null\n */\n height: number | null\n\n /**\n * The aspect ratio of the resizable element.\n *\n * @default null\n */\n aspectRatio: number | null\n}\n\n/**\n * @internal\n */\nexport const ResizableRootPropsDeclaration: PropsDeclaration<ResizableRootProps> = defineProps<ResizableRootProps>({\n width: { default: null, attribute: 'data-width', type: 'json' },\n height: { default: null, attribute: 'data-height', type: 'json' },\n aspectRatio: { default: null, attribute: 'data-aspect-ratio', type: 'json' },\n})\n\n/**\n * @public\n */\nexport interface ResizableRootEvents {\n /**\n * Emitted when a resize operation starts.\n */\n resizeStart: ResizeStartEvent\n\n /**\n * Emitted when a resize operation ends.\n */\n resizeEnd: ResizeEndEvent\n}\n\n/**\n * @public\n */\nexport class ResizeStartEvent extends Event {\n readonly detail: {\n readonly width: number\n readonly height: number\n }\n constructor(width: number, height: number) {\n super('resizeStart')\n this.detail = { width, height }\n }\n}\n\n/**\n * @public\n */\nexport class ResizeEndEvent extends Event {\n readonly detail: {\n readonly width: number\n readonly height: number\n }\n constructor(width: number, height: number) {\n super('resizeEnd')\n this.detail = { width, height }\n }\n}\n\n/**\n * @internal\n */\nexport function setupResizableRoot(\n host: HostElement,\n props: State<ResizableRootProps>,\n): void {\n const resizing = createSignal(false)\n\n const onResizeStart: OnResizeStart = () => {\n const { width, height } = host.getBoundingClientRect()\n\n let aspectRatio: number = props.aspectRatio.get() ?? width / height\n\n if (!isFinitePositiveNumber(aspectRatio)) {\n aspectRatio = 0\n }\n\n resizing.set(true)\n host.dispatchEvent(new ResizeStartEvent(width, height))\n return [width, height, aspectRatio]\n }\n\n const onResize: OnResize = (width, height) => {\n props.width.set(width)\n props.height.set(height)\n }\n\n const onResizeEnd: OnResizeEnd = () => {\n const { width, height } = host.getBoundingClientRect()\n resizing.set(false)\n host.dispatchEvent(new ResizeEndEvent(width, height))\n }\n\n onResizeStartContext.provide(host, onResizeStart)\n onResizeContext.provide(host, onResize)\n onResizeEndContext.provide(host, onResizeEnd)\n\n useEffect(host, () => {\n updateResizableRootStyles(\n host,\n Math.max(props.width.get() || 0, 1),\n Math.max(props.height.get() || 0, 1),\n props.aspectRatio.get(),\n )\n })\n\n useAttribute(host, 'data-resizing', () => (resizing.get() ? '' : undefined))\n}\n\nfunction updateResizableRootStyles(\n host: HostElement,\n width: number,\n height: number,\n aspectRatio: number | null,\n) {\n host.style.width = isFinitePositiveNumber(width) ? `${width}px` : ''\n\n host.style.height = isFinitePositiveNumber(height) ? `${height}px` : ''\n\n if (isFinitePositiveNumber(aspectRatio)) {\n host.style.aspectRatio = `${aspectRatio}`\n\n if (width && width > 0 && aspectRatio >= 1) {\n host.style.height = 'auto'\n } else if (height && height > 0 && aspectRatio <= 1) {\n host.style.width = 'min-content'\n }\n }\n}\n\nconst ResizableRootElementBase: HostElementConstructor<ResizableRootProps> = defineCustomElement(\n setupResizableRoot,\n ResizableRootPropsDeclaration,\n)\n\n/**\n * @public\n */\nexport class ResizableRootElement extends ResizableRootElementBase {}\n\nlet isResizableRootRegistered = false\n\n/**\n * @internal\n */\nexport function registerResizableRootElement(): void {\n if (isResizableRootRegistered) return\n isResizableRootRegistered = true\n registerCustomElement('prosekit-resizable-root', ResizableRootElement)\n}\n","import { isFinitePositiveNumber } from '../../utils/is-finite-positive-number.ts'\n\nexport function calcResize(\n position:\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right',\n w: number,\n h: number,\n dx: number,\n dy: number,\n aspectRatio: number | null | undefined,\n): [w: number, h: number] {\n aspectRatio = aspectRatio ? aspectRatio : w / h\n aspectRatio = isFinitePositiveNumber(aspectRatio) ? aspectRatio : 1\n\n switch (position) {\n case 'bottom-right':\n return clamp(calcBottomRightResize(w, h, dx, dy, aspectRatio))\n case 'bottom-left':\n return clamp(calcBottomLeftResize(w, h, dx, dy, aspectRatio))\n case 'top-right':\n return clamp(calcTopRightResize(w, h, dx, dy, aspectRatio))\n case 'top-left':\n return clamp(calcTopLeftResize(w, h, dx, dy, aspectRatio))\n case 'top':\n return clamp(calcTopResize(w, h, dx, dy, aspectRatio))\n case 'right':\n return clamp(calcRightResize(w, h, dx, dy, aspectRatio))\n case 'bottom':\n return clamp(calcBottomResize(w, h, dx, dy, aspectRatio))\n case 'left':\n return clamp(calcLeftResize(w, h, dx, dy, aspectRatio))\n default:\n throw new RangeError(`Invalid position: ${position}`)\n }\n}\n\ntype CalcResize = (\n w: number,\n h: number,\n dx: number,\n dy: number,\n aspectRatio: number,\n) => [w: number, h: number]\n\nconst calcBottomRightResize: CalcResize = (w, h, dx, dy, r) => {\n w += dx\n h += dy\n\n const sum = w + h\n h = sum / (r + 1)\n w = sum - h\n return [w, h]\n}\n\nconst calcBottomLeftResize: CalcResize = (w, h, dx, dy, r) => {\n w -= dx\n h += dy\n\n const sum = w + h\n h = sum / (r + 1)\n w = sum - h\n return [w, h]\n}\n\nconst calcTopRightResize: CalcResize = (w, h, dx, dy, r) => {\n w += dx\n h -= dy\n\n const sum = w + h\n h = sum / (r + 1)\n w = sum - h\n return [w, h]\n}\n\nconst calcTopLeftResize: CalcResize = (w, h, dx, dy, r) => {\n w -= dx\n h -= dy\n\n const sum = w + h\n h = sum / (r + 1)\n w = sum - h\n return [w, h]\n}\n\nconst calcTopResize: CalcResize = (w, h, dx, dy, r) => {\n h -= dy\n w = h * r\n return [w, h]\n}\n\nconst calcRightResize: CalcResize = (w, h, dx, dy, r) => {\n w += dx\n h = w / r\n return [w, h]\n}\n\nconst calcBottomResize: CalcResize = (w, h, dx, dy, r) => {\n h += dy\n w = h * r\n return [w, h]\n}\n\nconst calcLeftResize: CalcResize = (w, h, dx, dy, r) => {\n w -= dx\n h = w / r\n return [w, h]\n}\n\nfunction clamp([w, h]: [number, number]): [number, number] {\n return [\n Math.max(w, 1),\n Math.max(h, 1),\n ]\n}\n","import type { HostElement, HostElementConstructor, PropsDeclaration } from '@aria-ui/core'\nimport { createSignal, defineCustomElement, defineProps, registerCustomElement, useEffect, type State } from '@aria-ui/core'\nimport { getWindow } from '@ocavue/utils'\n\nimport { calcResize } from './calc-resize.ts'\nimport { onResizeContext, onResizeEndContext, onResizeStartContext } from './context.ts'\n\n/**\n * @public\n */\nexport interface ResizableHandleProps {\n /**\n * The position of the handle.\n *\n * @default \"bottom-right\"\n */\n position:\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n}\n\n/**\n * @internal\n */\nexport const ResizableHandlePropsDeclaration: PropsDeclaration<ResizableHandleProps> = defineProps<ResizableHandleProps>({\n position: { default: 'bottom-right', attribute: 'position', type: 'string' },\n})\n\n/**\n * @internal\n */\nexport function setupResizableHandle(\n host: HostElement,\n props: State<ResizableHandleProps>,\n): void {\n const getOnResize = onResizeContext.consume(host)\n const getOnResizeStart = onResizeStartContext.consume(host)\n const getOnResizeEnd = onResizeEndContext.consume(host)\n\n let startX = 0\n let startY = 0\n let width = 0\n let height = 0\n let aspectRatio = 1\n\n const pointerPressing = createSignal(false)\n\n const handlePointerDown = (event: PointerEvent) => {\n event.preventDefault()\n pointerPressing.set(true)\n\n startX = event.x\n startY = event.y\n\n const size = getOnResizeStart()?.()\n if (size) {\n ;[width, height, aspectRatio] = size\n }\n }\n\n const handlePointerMove = (event: PointerEvent) => {\n event.preventDefault()\n\n const dx = event.x - startX\n const dy = event.y - startY\n\n const [w, h] = calcResize(\n props.position.get(),\n width,\n height,\n dx,\n dy,\n aspectRatio,\n )\n\n getOnResize()?.(w, h)\n }\n\n const handlePointerUp = (event: PointerEvent) => {\n event.preventDefault()\n pointerPressing.set(false)\n\n getOnResizeEnd()?.()\n }\n\n useEffect(host, () => {\n host.addEventListener('pointerdown', handlePointerDown)\n return () => {\n host.removeEventListener('pointerdown', handlePointerDown)\n }\n })\n\n useEffect(host, () => {\n if (!pointerPressing.get()) {\n return\n }\n\n const win = getWindow(host)\n\n win.addEventListener('pointermove', handlePointerMove)\n win.addEventListener('pointerup', handlePointerUp)\n return () => {\n win.removeEventListener('pointermove', handlePointerMove)\n win.removeEventListener('pointerup', handlePointerUp)\n }\n })\n}\n\nconst ResizableHandleElementBase: HostElementConstructor<ResizableHandleProps> = defineCustomElement(\n setupResizableHandle,\n ResizableHandlePropsDeclaration,\n)\n\n/**\n * @public\n */\nexport class ResizableHandleElement extends ResizableHandleElementBase {}\n\nlet isResizableHandleRegistered = false\n\n/**\n * @internal\n */\nexport function registerResizableHandleElement(): void {\n if (isResizableHandleRegistered) return\n isResizableHandleRegistered = true\n registerCustomElement('prosekit-resizable-handle', ResizableHandleElement)\n}\n"],"mappings":"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"}
|