@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.
Files changed (207) hide show
  1. package/dist/prosekit-web-autocomplete.d.ts +112 -90
  2. package/dist/prosekit-web-autocomplete.d.ts.map +1 -1
  3. package/dist/prosekit-web-autocomplete.js +292 -217
  4. package/dist/prosekit-web-autocomplete.js.map +1 -1
  5. package/dist/prosekit-web-block-handle.d.ts +95 -62
  6. package/dist/prosekit-web-block-handle.d.ts.map +1 -1
  7. package/dist/prosekit-web-block-handle.js +219 -114
  8. package/dist/prosekit-web-block-handle.js.map +1 -1
  9. package/dist/prosekit-web-drop-indicator.d.ts +13 -15
  10. package/dist/prosekit-web-drop-indicator.d.ts.map +1 -1
  11. package/dist/prosekit-web-drop-indicator.js +34 -30
  12. package/dist/prosekit-web-drop-indicator.js.map +1 -1
  13. package/dist/prosekit-web-inline-popover.d.ts +88 -54
  14. package/dist/prosekit-web-inline-popover.d.ts.map +1 -1
  15. package/dist/prosekit-web-inline-popover.js +129 -79
  16. package/dist/prosekit-web-inline-popover.js.map +1 -1
  17. package/dist/prosekit-web-menu.d.ts +13 -0
  18. package/dist/prosekit-web-menu.d.ts.map +1 -0
  19. package/dist/prosekit-web-menu.js +53 -0
  20. package/dist/prosekit-web-menu.js.map +1 -0
  21. package/dist/prosekit-web-popover.d.ts +7 -26
  22. package/dist/prosekit-web-popover.d.ts.map +1 -1
  23. package/dist/prosekit-web-popover.js +31 -29
  24. package/dist/prosekit-web-popover.js.map +1 -1
  25. package/dist/prosekit-web-resizable.d.ts +92 -51
  26. package/dist/prosekit-web-resizable.d.ts.map +1 -1
  27. package/dist/prosekit-web-resizable.js +139 -131
  28. package/dist/prosekit-web-resizable.js.map +1 -1
  29. package/dist/prosekit-web-table-handle.d.ts +166 -199
  30. package/dist/prosekit-web-table-handle.d.ts.map +1 -1
  31. package/dist/prosekit-web-table-handle.js +495 -496
  32. package/dist/prosekit-web-table-handle.js.map +1 -1
  33. package/dist/prosekit-web-tooltip.d.ts +7 -26
  34. package/dist/prosekit-web-tooltip.d.ts.map +1 -1
  35. package/dist/prosekit-web-tooltip.js +31 -29
  36. package/dist/prosekit-web-tooltip.js.map +1 -1
  37. package/dist/use-editor-extension.js +2 -2
  38. package/dist/use-editor-extension.js.map +1 -1
  39. package/dist/use-scrolling.js +17 -8
  40. package/dist/use-scrolling.js.map +1 -1
  41. package/package.json +28 -23
  42. package/src/components/autocomplete/autocomplete-empty.ts +45 -0
  43. package/src/components/autocomplete/autocomplete-item.ts +65 -0
  44. package/src/components/autocomplete/autocomplete-popup.ts +95 -0
  45. package/src/components/autocomplete/autocomplete-positioner.ts +98 -0
  46. package/src/components/autocomplete/autocomplete-root.ts +280 -0
  47. package/src/components/autocomplete/context.ts +16 -14
  48. package/src/components/autocomplete/index.ts +65 -0
  49. package/src/components/block-handle/block-handle-add.ts +71 -0
  50. package/src/components/block-handle/block-handle-draggable.ts +158 -0
  51. package/src/components/block-handle/block-handle-popup.ts +43 -0
  52. package/src/components/block-handle/block-handle-positioner.ts +89 -0
  53. package/src/components/block-handle/block-handle-root.ts +116 -0
  54. package/src/components/block-handle/context.ts +9 -18
  55. package/src/components/block-handle/hover-state.ts +16 -0
  56. package/src/components/block-handle/index.ts +59 -0
  57. package/src/components/block-handle/{block-handle-popover/pointer-move.ts → pointer-move.ts} +8 -7
  58. package/src/components/block-handle/{block-handle-draggable/set-drag-preview.ts → set-drag-preview.ts} +4 -4
  59. package/src/components/block-handle/use-hover-extension.ts +65 -0
  60. package/src/components/drop-indicator/drop-indicator.ts +128 -0
  61. package/src/components/drop-indicator/index.ts +18 -0
  62. package/src/components/inline-popover/index.ts +41 -0
  63. package/src/components/inline-popover/inline-popover-popup.ts +52 -0
  64. package/src/components/inline-popover/inline-popover-positioner.ts +98 -0
  65. package/src/components/inline-popover/inline-popover-root.ts +122 -0
  66. package/src/components/inline-popover/store.ts +6 -0
  67. package/src/components/menu/index.ts +92 -0
  68. package/src/components/popover/index.ts +53 -0
  69. package/src/components/resizable/{resizable-handle/calc-resize.ts → calc-resize.ts} +1 -1
  70. package/src/components/resizable/context.ts +3 -6
  71. package/src/components/resizable/index.ts +32 -0
  72. package/src/components/resizable/resizable-handle.ts +134 -0
  73. package/src/components/resizable/resizable-root.ts +184 -0
  74. package/src/components/table-handle/dnd.ts +16 -27
  75. package/src/components/table-handle/index.ts +125 -0
  76. package/src/components/table-handle/{table-handle-drag-preview/render-preview.ts → render-preview.ts} +5 -5
  77. package/src/components/table-handle/shared.ts +61 -0
  78. package/src/components/table-handle/store.ts +117 -0
  79. package/src/components/table-handle/table-handle-column-menu-root.ts +51 -0
  80. package/src/components/table-handle/table-handle-column-menu-trigger.ts +107 -0
  81. package/src/components/table-handle/table-handle-column-popup.ts +44 -0
  82. package/src/components/table-handle/table-handle-column-positioner.ts +67 -0
  83. package/src/components/table-handle/table-handle-drag-preview.ts +169 -0
  84. package/src/components/table-handle/table-handle-drop-indicator.ts +166 -0
  85. package/src/components/table-handle/table-handle-root.ts +103 -0
  86. package/src/components/table-handle/table-handle-row-menu-root.ts +51 -0
  87. package/src/components/table-handle/table-handle-row-menu-trigger.ts +107 -0
  88. package/src/components/table-handle/table-handle-row-popup.ts +42 -0
  89. package/src/components/table-handle/table-handle-row-positioner.ts +67 -0
  90. package/src/components/table-handle/use-drop.ts +74 -0
  91. package/src/components/table-handle/{hooks/use-empty-image.ts → use-empty-image.ts} +2 -3
  92. package/src/components/table-handle/utils.ts +0 -11
  93. package/src/components/tooltip/index.ts +52 -0
  94. package/src/hooks/use-editor-extension.ts +4 -4
  95. package/src/hooks/use-editor-focus-event.ts +4 -4
  96. package/src/hooks/use-editor-typing.ts +12 -16
  97. package/src/hooks/use-editor-update-event.ts +4 -4
  98. package/src/hooks/use-keymap.ts +4 -4
  99. package/src/hooks/use-scrolling.ts +11 -10
  100. package/src/hooks/use-selecting.ts +8 -15
  101. package/src/utils/event.ts +28 -0
  102. package/src/utils/lazy-signal.spec.ts +68 -0
  103. package/src/utils/lazy-signal.ts +17 -0
  104. package/src/utils/prefers-reduced-motion.ts +6 -0
  105. package/src/utils/prevent-default.ts +3 -0
  106. package/src/utils/use-html-element-at.ts +17 -0
  107. package/src/utils/use-no-focus.ts +7 -0
  108. package/dist/get-default-state.js +0 -11
  109. package/dist/get-default-state.js.map +0 -1
  110. package/src/components/autocomplete/autocomplete-empty/element.gen.ts +0 -18
  111. package/src/components/autocomplete/autocomplete-empty/setup.ts +0 -6
  112. package/src/components/autocomplete/autocomplete-empty/types.ts +0 -13
  113. package/src/components/autocomplete/autocomplete-item/element.gen.ts +0 -18
  114. package/src/components/autocomplete/autocomplete-item/setup.ts +0 -30
  115. package/src/components/autocomplete/autocomplete-item/types.ts +0 -25
  116. package/src/components/autocomplete/autocomplete-list/element.gen.ts +0 -18
  117. package/src/components/autocomplete/autocomplete-list/setup.ts +0 -125
  118. package/src/components/autocomplete/autocomplete-list/types.ts +0 -22
  119. package/src/components/autocomplete/autocomplete-popover/element.gen.ts +0 -18
  120. package/src/components/autocomplete/autocomplete-popover/setup.ts +0 -169
  121. package/src/components/autocomplete/autocomplete-popover/types.ts +0 -100
  122. package/src/components/autocomplete/index.gen.ts +0 -17
  123. package/src/components/block-handle/block-handle-add/element.gen.ts +0 -18
  124. package/src/components/block-handle/block-handle-add/setup.ts +0 -33
  125. package/src/components/block-handle/block-handle-add/types.ts +0 -23
  126. package/src/components/block-handle/block-handle-draggable/element.gen.ts +0 -18
  127. package/src/components/block-handle/block-handle-draggable/setup.ts +0 -113
  128. package/src/components/block-handle/block-handle-draggable/types.ts +0 -23
  129. package/src/components/block-handle/block-handle-popover/element.gen.ts +0 -18
  130. package/src/components/block-handle/block-handle-popover/setup.ts +0 -68
  131. package/src/components/block-handle/block-handle-popover/types.ts +0 -81
  132. package/src/components/block-handle/index.gen.ts +0 -13
  133. package/src/components/drop-indicator/drop-indicator/element.gen.ts +0 -18
  134. package/src/components/drop-indicator/drop-indicator/setup.ts +0 -75
  135. package/src/components/drop-indicator/drop-indicator/types.ts +0 -31
  136. package/src/components/drop-indicator/index.gen.ts +0 -5
  137. package/src/components/inline-popover/index.gen.ts +0 -5
  138. package/src/components/inline-popover/inline-popover/element.gen.ts +0 -18
  139. package/src/components/inline-popover/inline-popover/setup.ts +0 -111
  140. package/src/components/inline-popover/inline-popover/types.ts +0 -112
  141. package/src/components/popover/index.gen.ts +0 -13
  142. package/src/components/popover/popover-content/element.gen.ts +0 -18
  143. package/src/components/popover/popover-content/setup.ts +0 -1
  144. package/src/components/popover/popover-content/types.ts +0 -6
  145. package/src/components/popover/popover-root/element.gen.ts +0 -18
  146. package/src/components/popover/popover-root/setup.ts +0 -1
  147. package/src/components/popover/popover-root/types.ts +0 -6
  148. package/src/components/popover/popover-trigger/element.gen.ts +0 -18
  149. package/src/components/popover/popover-trigger/setup.ts +0 -1
  150. package/src/components/popover/popover-trigger/types.ts +0 -6
  151. package/src/components/resizable/index.gen.ts +0 -9
  152. package/src/components/resizable/resizable-handle/element.gen.ts +0 -18
  153. package/src/components/resizable/resizable-handle/setup.ts +0 -106
  154. package/src/components/resizable/resizable-handle/types.ts +0 -29
  155. package/src/components/resizable/resizable-root/element.gen.ts +0 -18
  156. package/src/components/resizable/resizable-root/setup.ts +0 -84
  157. package/src/components/resizable/resizable-root/types.ts +0 -59
  158. package/src/components/table-handle/context.ts +0 -43
  159. package/src/components/table-handle/hooks/use-drop.ts +0 -85
  160. package/src/components/table-handle/index.gen.ts +0 -37
  161. package/src/components/table-handle/table-handle-column-root/element.gen.ts +0 -18
  162. package/src/components/table-handle/table-handle-column-root/setup.ts +0 -60
  163. package/src/components/table-handle/table-handle-column-root/types.ts +0 -73
  164. package/src/components/table-handle/table-handle-column-trigger/element.gen.ts +0 -18
  165. package/src/components/table-handle/table-handle-column-trigger/setup.ts +0 -64
  166. package/src/components/table-handle/table-handle-column-trigger/types.ts +0 -20
  167. package/src/components/table-handle/table-handle-drag-preview/element.gen.ts +0 -18
  168. package/src/components/table-handle/table-handle-drag-preview/setup.ts +0 -57
  169. package/src/components/table-handle/table-handle-drag-preview/types.ts +0 -14
  170. package/src/components/table-handle/table-handle-drag-preview/updater.ts +0 -90
  171. package/src/components/table-handle/table-handle-drop-indicator/element.gen.ts +0 -18
  172. package/src/components/table-handle/table-handle-drop-indicator/setup.ts +0 -52
  173. package/src/components/table-handle/table-handle-drop-indicator/types.ts +0 -15
  174. package/src/components/table-handle/table-handle-drop-indicator/updater.ts +0 -96
  175. package/src/components/table-handle/table-handle-popover-content/element.gen.ts +0 -18
  176. package/src/components/table-handle/table-handle-popover-content/setup.ts +0 -83
  177. package/src/components/table-handle/table-handle-popover-content/types.ts +0 -32
  178. package/src/components/table-handle/table-handle-popover-item/element.gen.ts +0 -18
  179. package/src/components/table-handle/table-handle-popover-item/setup.ts +0 -17
  180. package/src/components/table-handle/table-handle-popover-item/types.ts +0 -16
  181. package/src/components/table-handle/table-handle-root/element.gen.ts +0 -18
  182. package/src/components/table-handle/table-handle-root/setup.ts +0 -86
  183. package/src/components/table-handle/table-handle-root/types.ts +0 -23
  184. package/src/components/table-handle/table-handle-row-root/element.gen.ts +0 -18
  185. package/src/components/table-handle/table-handle-row-root/setup.ts +0 -70
  186. package/src/components/table-handle/table-handle-row-root/types.ts +0 -68
  187. package/src/components/table-handle/table-handle-row-trigger/element.gen.ts +0 -18
  188. package/src/components/table-handle/table-handle-row-trigger/setup.ts +0 -63
  189. package/src/components/table-handle/table-handle-row-trigger/types.ts +0 -23
  190. package/src/components/tooltip/index.gen.ts +0 -13
  191. package/src/components/tooltip/tooltip-content/element.gen.ts +0 -18
  192. package/src/components/tooltip/tooltip-content/setup.ts +0 -1
  193. package/src/components/tooltip/tooltip-content/types.ts +0 -6
  194. package/src/components/tooltip/tooltip-root/element.gen.ts +0 -18
  195. package/src/components/tooltip/tooltip-root/setup.ts +0 -1
  196. package/src/components/tooltip/tooltip-root/types.ts +0 -6
  197. package/src/components/tooltip/tooltip-trigger/element.gen.ts +0 -18
  198. package/src/components/tooltip/tooltip-trigger/setup.ts +0 -1
  199. package/src/components/tooltip/tooltip-trigger/types.ts +0 -6
  200. package/src/hooks/use-first-rendering.ts +0 -15
  201. package/src/utils/get-default-state.spec.ts +0 -42
  202. package/src/utils/get-default-state.ts +0 -18
  203. /package/src/components/autocomplete/{autocomplete-popover/helpers.spec.ts → helpers.spec.ts} +0 -0
  204. /package/src/components/autocomplete/{autocomplete-popover/helpers.ts → helpers.ts} +0 -0
  205. /package/src/components/inline-popover/{inline-popover/virtual-selection-element.ts → virtual-selection-element.ts} +0 -0
  206. /package/src/components/resizable/{resizable-handle/calc-resize.spec.ts → calc-resize.spec.ts} +0 -0
  207. /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, registerCustomElement, useAttribute, useEffect } from "@aria-ui/core";
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", null);
13
+ const onResizeContext = createContext("prosekit/resizable/onResize");
8
14
  /**
9
15
  * @internal
10
16
  */
11
- const onResizeStartContext = createContext("prosekit/resizable/onResizeStart", null);
17
+ const onResizeStartContext = createContext("prosekit/resizable/onResizeStart");
12
18
  /**
13
19
  * @internal
14
20
  */
15
- const onResizeEndContext = createContext("prosekit/resizable/onResizeEnd", null);
21
+ const onResizeEndContext = createContext("prosekit/resizable/onResizeEnd");
16
22
  //#endregion
17
- //#region src/utils/is-finite-positive-number.ts
18
- function isFinitePositiveNumber(value) {
19
- return typeof value === "number" && Number.isFinite(value) && value > 0;
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/resizable-handle/calc-resize.ts
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/setup.ts
198
+ //#region src/components/resizable/resizable-handle.ts
95
199
  /**
96
200
  * @internal
97
201
  */
98
- function useResizableHandle(host, { state }) {
99
- useResizableHandleState(host, state, {
100
- onResize: onResizeContext.consume(host),
101
- onResizeStart: onResizeStartContext.consume(host),
102
- onResizeEnd: onResizeEndContext.consume(host)
103
- });
104
- }
105
- function useResizableHandleState(host, state, context) {
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 = context.onResizeStart.get()?.();
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(state.position.peek(), width, height, dx, dy, aspectRatio);
125
- context.onResize.get()?.(w, h);
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
- context.onResizeEnd.get()?.();
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
- //#endregion
150
- //#region src/components/resizable/resizable-handle/types.ts
151
- /** @internal */
152
- const resizableHandleProps = { position: { default: "bottom-right" } };
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
- registerCustomElement("prosekit-resizable-handle", ResizableHandleElement);
164
- //#endregion
165
- //#region src/components/resizable/resizable-root/setup.ts
262
+ let isResizableHandleRegistered = false;
166
263
  /**
167
264
  * @internal
168
265
  */
169
- function useResizableRoot(host, { state, emit }) {
170
- const resizing = createSignal(false);
171
- const onResizeStart = () => {
172
- const { width, height } = host.getBoundingClientRect();
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, resizableHandleEvents, resizableHandleProps, resizableRootEvents, resizableRootProps, useResizableHandle, useResizableRoot };
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":";;;;AAAA,SAAgB,uBAAuB,OAAiC;AACtE,QAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,IAAI,QAAQ;;;;;;;ACIxE,MAAa,kBAAqC,cAChD,8BACD;;;;AAKD,MAAa,uBAA+C,cAC1D,mCACD;;;;AAKD,MAAa,qBAA2C,cACtD,iCACD;;;;;;ACuBD,MAAa,gCAAsE,YAAgC;CACjH,OAAO;EAAE,SAAS;EAAM,WAAW;EAAc,MAAM;EAAQ;CAC/D,QAAQ;EAAE,SAAS;EAAM,WAAW;EAAe,MAAM;EAAQ;CACjE,aAAa;EAAE,SAAS;EAAM,WAAW;EAAqB,MAAM;EAAQ;CAC7E,CAAC;;;;AAoBF,IAAa,mBAAb,cAAsC,MAAM;CAK1C,YAAY,OAAe,QAAgB;AACzC,QAAM,cAAc;AACpB,OAAK,SAAS;GAAE;GAAO;GAAQ;;;;;;AAOnC,IAAa,iBAAb,cAAoC,MAAM;CAKxC,YAAY,OAAe,QAAgB;AACzC,QAAM,YAAY;AAClB,OAAK,SAAS;GAAE;GAAO;GAAQ;;;;;;AAOnC,SAAgB,mBACd,MACA,OACM;CACN,MAAM,WAAW,aAAa,MAAM;CAEpC,MAAM,sBAAqC;EACzC,MAAM,EAAE,OAAO,WAAW,KAAK,uBAAuB;EAEtD,IAAI,cAAsB,MAAM,YAAY,KAAK,IAAI,QAAQ;AAE7D,MAAI,CAAC,uBAAuB,YAAY,CACtC,eAAc;AAGhB,WAAS,IAAI,KAAK;AAClB,OAAK,cAAc,IAAI,iBAAiB,OAAO,OAAO,CAAC;AACvD,SAAO;GAAC;GAAO;GAAQ;GAAY;;CAGrC,MAAM,YAAsB,OAAO,WAAW;AAC5C,QAAM,MAAM,IAAI,MAAM;AACtB,QAAM,OAAO,IAAI,OAAO;;CAG1B,MAAM,oBAAiC;EACrC,MAAM,EAAE,OAAO,WAAW,KAAK,uBAAuB;AACtD,WAAS,IAAI,MAAM;AACnB,OAAK,cAAc,IAAI,eAAe,OAAO,OAAO,CAAC;;AAGvD,sBAAqB,QAAQ,MAAM,cAAc;AACjD,iBAAgB,QAAQ,MAAM,SAAS;AACvC,oBAAmB,QAAQ,MAAM,YAAY;AAE7C,WAAU,YAAY;AACpB,4BACE,MACA,KAAK,IAAI,MAAM,MAAM,KAAK,IAAI,GAAG,EAAE,EACnC,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,GAAG,EAAE,EACpC,MAAM,YAAY,KAAK,CACxB;GACD;AAEF,cAAa,MAAM,uBAAwB,SAAS,KAAK,GAAG,KAAK,KAAA,EAAW;;AAG9E,SAAS,0BACP,MACA,OACA,QACA,aACA;AACA,MAAK,MAAM,QAAQ,uBAAuB,MAAM,GAAG,GAAG,MAAM,MAAM;AAElE,MAAK,MAAM,SAAS,uBAAuB,OAAO,GAAG,GAAG,OAAO,MAAM;AAErE,KAAI,uBAAuB,YAAY,EAAE;AACvC,OAAK,MAAM,cAAc,GAAG;AAE5B,MAAI,SAAS,QAAQ,KAAK,eAAe,EACvC,MAAK,MAAM,SAAS;WACX,UAAU,SAAS,KAAK,eAAe,EAChD,MAAK,MAAM,QAAQ;;;AAKzB,MAAM,2BAAuE,oBAC3E,oBACA,8BACD;;;;AAKD,IAAa,uBAAb,cAA0C,yBAAyB;AAEnE,IAAI,4BAA4B;;;;AAKhC,SAAgB,+BAAqC;AACnD,KAAI,0BAA2B;AAC/B,6BAA4B;AAC5B,uBAAsB,2BAA2B,qBAAqB;;;;ACpLxE,SAAgB,WACd,UASA,GACA,GACA,IACA,IACA,aACwB;AACxB,eAAc,cAAc,cAAc,IAAI;AAC9C,eAAc,uBAAuB,YAAY,GAAG,cAAc;AAElE,SAAQ,UAAR;EACE,KAAK,eACH,QAAO,MAAM,sBAAsB,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC;EAChE,KAAK,cACH,QAAO,MAAM,qBAAqB,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC;EAC/D,KAAK,YACH,QAAO,MAAM,mBAAmB,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC;EAC7D,KAAK,WACH,QAAO,MAAM,kBAAkB,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC;EAC5D,KAAK,MACH,QAAO,MAAM,cAAc,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC;EACxD,KAAK,QACH,QAAO,MAAM,gBAAgB,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC;EAC1D,KAAK,SACH,QAAO,MAAM,iBAAiB,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC;EAC3D,KAAK,OACH,QAAO,MAAM,eAAe,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC;EACzD,QACE,OAAM,IAAI,WAAW,qBAAqB,WAAW;;;AAY3D,MAAM,yBAAqC,GAAG,GAAG,IAAI,IAAI,MAAM;AAC7D,MAAK;AACL,MAAK;CAEL,MAAM,MAAM,IAAI;AAChB,KAAI,OAAO,IAAI;AACf,KAAI,MAAM;AACV,QAAO,CAAC,GAAG,EAAE;;AAGf,MAAM,wBAAoC,GAAG,GAAG,IAAI,IAAI,MAAM;AAC5D,MAAK;AACL,MAAK;CAEL,MAAM,MAAM,IAAI;AAChB,KAAI,OAAO,IAAI;AACf,KAAI,MAAM;AACV,QAAO,CAAC,GAAG,EAAE;;AAGf,MAAM,sBAAkC,GAAG,GAAG,IAAI,IAAI,MAAM;AAC1D,MAAK;AACL,MAAK;CAEL,MAAM,MAAM,IAAI;AAChB,KAAI,OAAO,IAAI;AACf,KAAI,MAAM;AACV,QAAO,CAAC,GAAG,EAAE;;AAGf,MAAM,qBAAiC,GAAG,GAAG,IAAI,IAAI,MAAM;AACzD,MAAK;AACL,MAAK;CAEL,MAAM,MAAM,IAAI;AAChB,KAAI,OAAO,IAAI;AACf,KAAI,MAAM;AACV,QAAO,CAAC,GAAG,EAAE;;AAGf,MAAM,iBAA6B,GAAG,GAAG,IAAI,IAAI,MAAM;AACrD,MAAK;AACL,KAAI,IAAI;AACR,QAAO,CAAC,GAAG,EAAE;;AAGf,MAAM,mBAA+B,GAAG,GAAG,IAAI,IAAI,MAAM;AACvD,MAAK;AACL,KAAI,IAAI;AACR,QAAO,CAAC,GAAG,EAAE;;AAGf,MAAM,oBAAgC,GAAG,GAAG,IAAI,IAAI,MAAM;AACxD,MAAK;AACL,KAAI,IAAI;AACR,QAAO,CAAC,GAAG,EAAE;;AAGf,MAAM,kBAA8B,GAAG,GAAG,IAAI,IAAI,MAAM;AACtD,MAAK;AACL,KAAI,IAAI;AACR,QAAO,CAAC,GAAG,EAAE;;AAGf,SAAS,MAAM,CAAC,GAAG,IAAwC;AACzD,QAAO,CACL,KAAK,IAAI,GAAG,EAAE,EACd,KAAK,IAAI,GAAG,EAAE,CACf;;;;;;;ACzFH,MAAa,kCAA0E,YAAkC,EACvH,UAAU;CAAE,SAAS;CAAgB,WAAW;CAAY,MAAM;CAAU,EAC7E,CAAC;;;;AAKF,SAAgB,qBACd,MACA,OACM;CACN,MAAM,cAAc,gBAAgB,QAAQ,KAAK;CACjD,MAAM,mBAAmB,qBAAqB,QAAQ,KAAK;CAC3D,MAAM,iBAAiB,mBAAmB,QAAQ,KAAK;CAEvD,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,QAAQ;CACZ,IAAI,SAAS;CACb,IAAI,cAAc;CAElB,MAAM,kBAAkB,aAAa,MAAM;CAE3C,MAAM,qBAAqB,UAAwB;AACjD,QAAM,gBAAgB;AACtB,kBAAgB,IAAI,KAAK;AAEzB,WAAS,MAAM;AACf,WAAS,MAAM;EAEf,MAAM,OAAO,kBAAkB,IAAI;AACnC,MAAI,KACD,EAAC,OAAO,QAAQ,eAAe;;CAIpC,MAAM,qBAAqB,UAAwB;AACjD,QAAM,gBAAgB;EAEtB,MAAM,KAAK,MAAM,IAAI;EACrB,MAAM,KAAK,MAAM,IAAI;EAErB,MAAM,CAAC,GAAG,KAAK,WACb,MAAM,SAAS,KAAK,EACpB,OACA,QACA,IACA,IACA,YACD;AAED,eAAa,GAAG,GAAG,EAAE;;CAGvB,MAAM,mBAAmB,UAAwB;AAC/C,QAAM,gBAAgB;AACtB,kBAAgB,IAAI,MAAM;AAE1B,kBAAgB,IAAI;;AAGtB,WAAU,YAAY;AACpB,OAAK,iBAAiB,eAAe,kBAAkB;AACvD,eAAa;AACX,QAAK,oBAAoB,eAAe,kBAAkB;;GAE5D;AAEF,WAAU,YAAY;AACpB,MAAI,CAAC,gBAAgB,KAAK,CACxB;EAGF,MAAM,MAAM,UAAU,KAAK;AAE3B,MAAI,iBAAiB,eAAe,kBAAkB;AACtD,MAAI,iBAAiB,aAAa,gBAAgB;AAClD,eAAa;AACX,OAAI,oBAAoB,eAAe,kBAAkB;AACzD,OAAI,oBAAoB,aAAa,gBAAgB;;GAEvD;;AAGJ,MAAM,6BAA2E,oBAC/E,sBACA,gCACD;;;;AAKD,IAAa,yBAAb,cAA4C,2BAA2B;AAEvE,IAAI,8BAA8B;;;;AAKlC,SAAgB,iCAAuC;AACrD,KAAI,4BAA6B;AACjC,+BAA8B;AAC9B,uBAAsB,6BAA6B,uBAAuB"}