@prosekit/web 0.3.12 → 0.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,440 @@
1
+ import {
2
+ useEditorExtension
3
+ } from "./chunk-MZSYOTZT.js";
4
+ import {
5
+ defineCustomElement
6
+ } from "./chunk-LCDA7GFP.js";
7
+
8
+ // src/components/table-handle/table-handle-column-root/element.gen.ts
9
+ import { ElementBuilder } from "@aria-ui/core";
10
+
11
+ // src/components/table-handle/table-handle-column-root/props.ts
12
+ import {
13
+ defaultOverlayPositionerProps
14
+ } from "@aria-ui/overlay";
15
+ var defaultTableHandleColumnRootProps = Object.freeze({
16
+ ...defaultOverlayPositionerProps,
17
+ editor: null,
18
+ placement: "top"
19
+ });
20
+
21
+ // src/components/table-handle/table-handle-column-root/state.ts
22
+ import {
23
+ createComputed,
24
+ createSignal,
25
+ mapSignals,
26
+ useAttribute,
27
+ useEffect
28
+ } from "@aria-ui/core";
29
+ import { defaultMenuRootProps, useMenuRoot } from "@aria-ui/menu";
30
+ import { useOverlayPositionerState } from "@aria-ui/overlay";
31
+ import { usePresence } from "@aria-ui/presence";
32
+
33
+ // src/components/table-handle/context.ts
34
+ import { createContext } from "@aria-ui/core";
35
+ var tableHandleRootContext = createContext(
36
+ "prosekit-table-handle-root-context",
37
+ null
38
+ );
39
+
40
+ // src/components/table-handle/table-handle-column-root/state.ts
41
+ function useTableHandleColumnRoot(host, state) {
42
+ const { editor, ...overlayState } = state;
43
+ const rootContext = tableHandleRootContext.consume(host);
44
+ const colFirstCellPos = createComputed(() => {
45
+ var _a;
46
+ return (_a = rootContext.get()) == null ? void 0 : _a.colFirstCellPos;
47
+ });
48
+ const referenceCell = createComputed(() => {
49
+ var _a;
50
+ const pos = colFirstCellPos.get();
51
+ const view = (_a = editor.get()) == null ? void 0 : _a.view;
52
+ if (!pos || !view) return null;
53
+ return view.nodeDOM(pos);
54
+ });
55
+ const contentOpen = createSignal(false);
56
+ useEffect(host, () => {
57
+ colFirstCellPos.get();
58
+ contentOpen.set(false);
59
+ });
60
+ useOverlayPositionerState(host, overlayState, {
61
+ reference: referenceCell
62
+ });
63
+ const presence = createComputed(() => !!referenceCell.get());
64
+ useAttribute(host, "data-state", () => presence.get() ? "open" : "closed");
65
+ usePresence(host, presence);
66
+ useMenuRoot(host, {
67
+ ...mapSignals(defaultMenuRootProps),
68
+ open: contentOpen
69
+ });
70
+ }
71
+
72
+ // src/components/table-handle/table-handle-column-root/element.gen.ts
73
+ var TableHandleColumnRootElement = class extends ElementBuilder(useTableHandleColumnRoot, defaultTableHandleColumnRootProps) {
74
+ };
75
+ defineCustomElement("prosekit-table-handle-column-root", TableHandleColumnRootElement);
76
+
77
+ // src/components/table-handle/table-handle-column-trigger/element.gen.ts
78
+ import { ElementBuilder as ElementBuilder2 } from "@aria-ui/core";
79
+
80
+ // src/components/table-handle/table-handle-column-trigger/props.ts
81
+ var defaultTableHandleColumnTriggerProps = Object.freeze({
82
+ editor: null
83
+ });
84
+
85
+ // src/components/table-handle/table-handle-column-trigger/state.ts
86
+ import {
87
+ useEventListener
88
+ } from "@aria-ui/core";
89
+ import { useMenuTrigger } from "@aria-ui/menu";
90
+ import { selectTableColumn } from "@prosekit/extensions/table";
91
+ function useTableHandleColumnTrigger(host, state) {
92
+ useMenuTrigger(host);
93
+ const context = tableHandleRootContext.consume(host);
94
+ useEventListener(host, "pointerdown", () => {
95
+ var _a;
96
+ const editor = state.editor.peek();
97
+ const cellPos = (_a = context.peek()) == null ? void 0 : _a.cellPos;
98
+ if (!editor || !cellPos) return;
99
+ editor.exec(selectTableColumn({ head: cellPos }));
100
+ });
101
+ }
102
+
103
+ // src/components/table-handle/table-handle-column-trigger/element.gen.ts
104
+ var TableHandleColumnTriggerElement = class extends ElementBuilder2(useTableHandleColumnTrigger, defaultTableHandleColumnTriggerProps) {
105
+ };
106
+ defineCustomElement("prosekit-table-handle-column-trigger", TableHandleColumnTriggerElement);
107
+
108
+ // src/components/table-handle/table-handle-popover-content/element.gen.ts
109
+ import { ElementBuilder as ElementBuilder3 } from "@aria-ui/core";
110
+
111
+ // src/components/table-handle/table-handle-popover-content/props.ts
112
+ import { defaultMenuContentProps } from "@aria-ui/menu";
113
+ var defaultTableHandlePopoverContentProps = Object.freeze({
114
+ ...defaultMenuContentProps,
115
+ placement: "right-start",
116
+ offset: { mainAxis: -4, crossAxis: 4 },
117
+ editor: null
118
+ });
119
+
120
+ // src/components/table-handle/table-handle-popover-content/state.ts
121
+ import {
122
+ createComputed as createComputed2,
123
+ createSignal as createSignal2,
124
+ mapSignals as mapSignals2,
125
+ useEffect as useEffect2
126
+ } from "@aria-ui/core";
127
+ import {
128
+ defaultMenuContentProps as defaultMenuContentProps2,
129
+ useMenuContent
130
+ } from "@aria-ui/menu";
131
+ function useTableHandlePopoverContent(host, state) {
132
+ const rootContext = tableHandleRootContext.consume(host);
133
+ const open = createComputed2(() => !!rootContext.get());
134
+ const onKeydownHandlerAdd = useKeyboardHandler(host, open);
135
+ const menuContentProps = {
136
+ ...mapSignals2({
137
+ ...defaultMenuContentProps2,
138
+ onKeydownHandlerAdd
139
+ }),
140
+ placement: state.placement,
141
+ offset: state.offset
142
+ };
143
+ useMenuContent(host, menuContentProps);
144
+ }
145
+ function useKeyboardHandler(element, open) {
146
+ const keydownHandler = createSignal2(
147
+ null
148
+ );
149
+ let disposeKeydownHandler;
150
+ useEffect2(element, () => {
151
+ const keydownHandlerValue = keydownHandler.get();
152
+ if (!keydownHandlerValue) {
153
+ return;
154
+ }
155
+ const handleKeydown = (event) => {
156
+ if (event.isComposing || event.defaultPrevented || !open.get()) {
157
+ return false;
158
+ }
159
+ keydownHandlerValue(event);
160
+ };
161
+ document.addEventListener("keydown", handleKeydown);
162
+ disposeKeydownHandler = () => {
163
+ document.removeEventListener("keydown", handleKeydown);
164
+ };
165
+ });
166
+ return (keydownHandlerValue) => {
167
+ keydownHandler.set(keydownHandlerValue);
168
+ return () => {
169
+ disposeKeydownHandler == null ? void 0 : disposeKeydownHandler();
170
+ disposeKeydownHandler = void 0;
171
+ };
172
+ };
173
+ }
174
+
175
+ // src/components/table-handle/table-handle-popover-content/element.gen.ts
176
+ var TableHandlePopoverContentElement = class extends ElementBuilder3(useTableHandlePopoverContent, defaultTableHandlePopoverContentProps) {
177
+ };
178
+ defineCustomElement("prosekit-table-handle-popover-content", TableHandlePopoverContentElement);
179
+
180
+ // src/components/table-handle/table-handle-popover-item/element.gen.ts
181
+ import { ElementBuilder as ElementBuilder4 } from "@aria-ui/core";
182
+
183
+ // src/components/table-handle/table-handle-popover-item/props.ts
184
+ import { defaultMenuItemProps } from "@aria-ui/menu";
185
+ var defaultTableHandlePopoverItemProps = Object.freeze({
186
+ ...defaultMenuItemProps,
187
+ disabled: false
188
+ });
189
+
190
+ // src/components/table-handle/table-handle-popover-item/state.ts
191
+ import {
192
+ useAttribute as useAttribute2
193
+ } from "@aria-ui/core";
194
+ import { useMenuItem } from "@aria-ui/menu";
195
+ function useTableHandlePopoverItem(element, state) {
196
+ useAttribute2(
197
+ element,
198
+ "data-disabled",
199
+ () => {
200
+ var _a;
201
+ return ((_a = state.disabled) == null ? void 0 : _a.get()) ? "true" : "false";
202
+ }
203
+ );
204
+ useMenuItem(element, state);
205
+ }
206
+
207
+ // src/components/table-handle/table-handle-popover-item/element.gen.ts
208
+ var TableHandlePopoverItemElement = class extends ElementBuilder4(useTableHandlePopoverItem, defaultTableHandlePopoverItemProps) {
209
+ };
210
+ defineCustomElement("prosekit-table-handle-popover-item", TableHandlePopoverItemElement);
211
+
212
+ // src/components/table-handle/table-handle-root/element.gen.ts
213
+ import { ElementBuilder as ElementBuilder5 } from "@aria-ui/core";
214
+
215
+ // src/components/table-handle/table-handle-root/props.ts
216
+ var defaultTableHandleRootProps = Object.freeze({
217
+ editor: null
218
+ });
219
+
220
+ // src/components/table-handle/table-handle-root/state.ts
221
+ import {
222
+ createSignal as createSignal4,
223
+ useEffect as useEffect3
224
+ } from "@aria-ui/core";
225
+ import { defineDOMEventHandler as defineDOMEventHandler2 } from "@prosekit/core";
226
+
227
+ // src/hooks/use-editor-typing.ts
228
+ import {
229
+ createSignal as createSignal3
230
+ } from "@aria-ui/core";
231
+ import { defineDOMEventHandler, union } from "@prosekit/core";
232
+ function useEditorTyping(host, editor) {
233
+ const typing = createSignal3(false);
234
+ const handleKeypress = () => {
235
+ typing.set(true);
236
+ };
237
+ const handlePointerMove = () => {
238
+ typing.set(false);
239
+ };
240
+ const extension = union(
241
+ defineDOMEventHandler("keypress", handleKeypress),
242
+ defineDOMEventHandler("pointermove", handlePointerMove)
243
+ );
244
+ useEditorExtension(host, editor, extension);
245
+ return typing;
246
+ }
247
+
248
+ // src/components/table-handle/utils.ts
249
+ import { cellAround, TableMap } from "prosemirror-tables";
250
+ function isHoveringCellInfoEqual(a, b) {
251
+ if (!a && !b) return true;
252
+ if (!a || !b) return false;
253
+ return a.rowIndex === b.rowIndex && a.colIndex === b.colIndex && a.cellPos === b.cellPos && a.rowFirstCellPos === b.rowFirstCellPos && a.colFirstCellPos === b.colFirstCellPos;
254
+ }
255
+ function domCellAround(target) {
256
+ var _a;
257
+ while (target && target.nodeName != "TD" && target.nodeName != "TH") {
258
+ target = ((_a = target.classList) == null ? void 0 : _a.contains("ProseMirror")) ? null : target.parentNode;
259
+ }
260
+ return target;
261
+ }
262
+ function getHoveringCell(view, event) {
263
+ const domCell = domCellAround(event.target);
264
+ if (!domCell) return;
265
+ const { left, top, width, height } = domCell.getBoundingClientRect();
266
+ const eventPos = view.posAtCoords({
267
+ // Use the center coordinates of the cell to ensure we're within the
268
+ // selected cell. This prevents potential issues when the mouse is on the
269
+ // border of two cells.
270
+ left: left + width / 2,
271
+ top: top + height / 2
272
+ });
273
+ if (!eventPos) return;
274
+ const $cellPos = cellAround(view.state.doc.resolve(eventPos.pos));
275
+ if (!$cellPos) return;
276
+ const map = TableMap.get($cellPos.node(-1));
277
+ const tableStart = $cellPos.start(-1);
278
+ const cellRect = map.findCell($cellPos.pos - tableStart);
279
+ const rowIndex = cellRect.top;
280
+ const colIndex = cellRect.left;
281
+ return {
282
+ rowIndex,
283
+ colIndex,
284
+ cellPos: $cellPos.pos,
285
+ rowFirstCellPos: getCellPos(map, tableStart, rowIndex, 0),
286
+ colFirstCellPos: getCellPos(map, tableStart, 0, colIndex)
287
+ };
288
+ }
289
+ function getCellPos(map, tableStart, rowIndex, colIndex) {
290
+ const cellIndex = getCellIndex(map, rowIndex, colIndex);
291
+ const posInTable = map.map[cellIndex];
292
+ return tableStart + posInTable;
293
+ }
294
+ function getCellIndex(map, rowIndex, colIndex) {
295
+ return map.width * rowIndex + colIndex;
296
+ }
297
+
298
+ // src/components/table-handle/table-handle-root/state.ts
299
+ function useTableHandleRoot(host, state) {
300
+ const { editor } = state;
301
+ const context = createSignal4(null);
302
+ const hoveringCell = useHoveringCell(host, editor);
303
+ const typing = useEditorTyping(host, editor);
304
+ useEffect3(host, () => {
305
+ const typingValue = typing.get();
306
+ const hoveringCellValue = hoveringCell.get();
307
+ context.set(typingValue ? null : hoveringCellValue);
308
+ });
309
+ tableHandleRootContext.provide(host, context);
310
+ }
311
+ function useHoveringCell(host, editor) {
312
+ const hoveringCell = createSignal4(null);
313
+ const extension = defineCellHoverHandler((curr) => {
314
+ const prev = hoveringCell.peek();
315
+ if (!isHoveringCellInfoEqual(prev, curr)) {
316
+ hoveringCell.set(curr);
317
+ }
318
+ });
319
+ useEditorExtension(host, editor, extension);
320
+ return hoveringCell;
321
+ }
322
+ function defineCellHoverHandler(handler) {
323
+ const pointerHandler = (view, event) => {
324
+ const hoveringCell = getHoveringCell(view, event);
325
+ return handler(hoveringCell != null ? hoveringCell : null);
326
+ };
327
+ return defineDOMEventHandler2("pointerover", pointerHandler);
328
+ }
329
+
330
+ // src/components/table-handle/table-handle-root/element.gen.ts
331
+ var TableHandleRootElement = class extends ElementBuilder5(useTableHandleRoot, defaultTableHandleRootProps) {
332
+ };
333
+ defineCustomElement("prosekit-table-handle-root", TableHandleRootElement);
334
+
335
+ // src/components/table-handle/table-handle-row-root/element.gen.ts
336
+ import { ElementBuilder as ElementBuilder6 } from "@aria-ui/core";
337
+
338
+ // src/components/table-handle/table-handle-row-root/props.ts
339
+ import {
340
+ defaultOverlayPositionerProps as defaultOverlayPositionerProps2
341
+ } from "@aria-ui/overlay";
342
+ var defaultTableHandleRowRootProps = Object.freeze({
343
+ ...defaultOverlayPositionerProps2,
344
+ editor: null,
345
+ placement: "left"
346
+ });
347
+
348
+ // src/components/table-handle/table-handle-row-root/state.ts
349
+ import {
350
+ createComputed as createComputed3,
351
+ createSignal as createSignal5,
352
+ mapSignals as mapSignals3,
353
+ useAttribute as useAttribute3,
354
+ useEffect as useEffect4
355
+ } from "@aria-ui/core";
356
+ import { defaultMenuRootProps as defaultMenuRootProps2, useMenuRoot as useMenuRoot2 } from "@aria-ui/menu";
357
+ import { useOverlayPositionerState as useOverlayPositionerState2 } from "@aria-ui/overlay";
358
+ import { usePresence as usePresence2 } from "@aria-ui/presence";
359
+ function useTableHandleRowRoot(host, state) {
360
+ const { editor, ...overlayState } = state;
361
+ const rootContext = tableHandleRootContext.consume(host);
362
+ const rowFirstCellPos = createComputed3(() => {
363
+ var _a;
364
+ return (_a = rootContext.get()) == null ? void 0 : _a.rowFirstCellPos;
365
+ });
366
+ const referenceCell = createComputed3(() => {
367
+ var _a;
368
+ const pos = rowFirstCellPos.get();
369
+ const view = (_a = editor.get()) == null ? void 0 : _a.view;
370
+ if (!pos || !view) return null;
371
+ return view.nodeDOM(pos);
372
+ });
373
+ const contentOpen = createSignal5(false);
374
+ useEffect4(host, () => {
375
+ rowFirstCellPos.get();
376
+ contentOpen.set(false);
377
+ });
378
+ useOverlayPositionerState2(host, overlayState, {
379
+ reference: referenceCell
380
+ });
381
+ const presence = createComputed3(() => !!referenceCell.get());
382
+ useAttribute3(host, "data-state", () => presence.get() ? "open" : "closed");
383
+ usePresence2(host, presence);
384
+ useMenuRoot2(host, {
385
+ ...mapSignals3(defaultMenuRootProps2),
386
+ open: contentOpen
387
+ });
388
+ }
389
+
390
+ // src/components/table-handle/table-handle-row-root/element.gen.ts
391
+ var TableHandleRowRootElement = class extends ElementBuilder6(useTableHandleRowRoot, defaultTableHandleRowRootProps) {
392
+ };
393
+ defineCustomElement("prosekit-table-handle-row-root", TableHandleRowRootElement);
394
+
395
+ // src/components/table-handle/table-handle-row-trigger/element.gen.ts
396
+ import { ElementBuilder as ElementBuilder7 } from "@aria-ui/core";
397
+
398
+ // src/components/table-handle/table-handle-row-trigger/props.ts
399
+ var defaultTableHandleRowTriggerProps = Object.freeze({
400
+ editor: null
401
+ });
402
+
403
+ // src/components/table-handle/table-handle-row-trigger/state.ts
404
+ import {
405
+ useEventListener as useEventListener2
406
+ } from "@aria-ui/core";
407
+ import { useMenuTrigger as useMenuTrigger2 } from "@aria-ui/menu";
408
+ import { selectTableRow } from "@prosekit/extensions/table";
409
+ function useTableHandleRowTrigger(host, state) {
410
+ useMenuTrigger2(host);
411
+ const context = tableHandleRootContext.consume(host);
412
+ useEventListener2(host, "pointerdown", () => {
413
+ var _a;
414
+ const editor = state.editor.peek();
415
+ const cellPos = (_a = context.peek()) == null ? void 0 : _a.cellPos;
416
+ if (!editor || !cellPos) return;
417
+ editor.exec(selectTableRow({ head: cellPos }));
418
+ });
419
+ }
420
+
421
+ // src/components/table-handle/table-handle-row-trigger/element.gen.ts
422
+ var TableHandleRowTriggerElement = class extends ElementBuilder7(useTableHandleRowTrigger, defaultTableHandleRowTriggerProps) {
423
+ };
424
+ defineCustomElement("prosekit-table-handle-row-trigger", TableHandleRowTriggerElement);
425
+ export {
426
+ TableHandleColumnRootElement,
427
+ TableHandleColumnTriggerElement,
428
+ TableHandlePopoverContentElement,
429
+ TableHandlePopoverItemElement,
430
+ TableHandleRootElement,
431
+ TableHandleRowRootElement,
432
+ TableHandleRowTriggerElement,
433
+ defaultTableHandleColumnRootProps,
434
+ defaultTableHandleColumnTriggerProps,
435
+ defaultTableHandlePopoverContentProps,
436
+ defaultTableHandlePopoverItemProps,
437
+ defaultTableHandleRootProps,
438
+ defaultTableHandleRowRootProps,
439
+ defaultTableHandleRowTriggerProps
440
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prosekit/web",
3
3
  "type": "module",
4
- "version": "0.3.12",
4
+ "version": "0.3.14",
5
5
  "private": false,
6
6
  "author": {
7
7
  "name": "ocavue",
@@ -55,6 +55,11 @@
55
55
  "import": "./dist/prosekit-web-resizable.js",
56
56
  "default": "./dist/prosekit-web-resizable.js"
57
57
  },
58
+ "./table-handle": {
59
+ "types": "./dist/prosekit-web-table-handle.d.ts",
60
+ "import": "./dist/prosekit-web-table-handle.js",
61
+ "default": "./dist/prosekit-web-table-handle.js"
62
+ },
58
63
  "./tooltip": {
59
64
  "types": "./dist/prosekit-web-tooltip.d.ts",
60
65
  "import": "./dist/prosekit-web-tooltip.js",
@@ -68,16 +73,18 @@
68
73
  "@aria-ui/collection": "^0.0.3",
69
74
  "@aria-ui/core": "^0.0.18",
70
75
  "@aria-ui/listbox": "^0.0.18",
76
+ "@aria-ui/menu": "^0.0.12",
71
77
  "@aria-ui/overlay": "^0.0.19",
72
78
  "@aria-ui/popover": "^0.0.20",
73
79
  "@aria-ui/presence": "^0.0.14",
74
80
  "@aria-ui/tooltip": "^0.0.22",
75
81
  "@floating-ui/dom": "^1.6.10",
76
- "@zag-js/dom-query": "^0.65.0",
82
+ "@zag-js/dom-query": "^0.65.1",
77
83
  "just-omit": "^2.2.0",
78
- "@prosekit/extensions": "^0.7.12",
84
+ "prosemirror-tables": "^1.5.0",
85
+ "@prosekit/extensions": "^0.7.14",
79
86
  "@prosekit/pm": "^0.1.8",
80
- "@prosekit/core": "^0.7.9"
87
+ "@prosekit/core": "^0.7.10"
81
88
  },
82
89
  "devDependencies": {
83
90
  "tsup": "^8.2.4",
@@ -110,6 +117,9 @@
110
117
  "resizable": [
111
118
  "./dist/prosekit-web-resizable.d.ts"
112
119
  ],
120
+ "table-handle": [
121
+ "./dist/prosekit-web-table-handle.d.ts"
122
+ ],
113
123
  "tooltip": [
114
124
  "./dist/prosekit-web-tooltip.d.ts"
115
125
  ]