@prosekit/web 0.3.11 → 0.3.13

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.
@@ -7,14 +7,18 @@ import { defaultPopoverRootProps } from '@aria-ui/popover';
7
7
  import { defaultPopoverTriggerProps } from '@aria-ui/popover';
8
8
  import { defaultTooltipRootProps } from '@aria-ui/tooltip';
9
9
  import { defaultTooltipTriggerProps } from '@aria-ui/tooltip';
10
+ import type { defineTableCommands } from '@prosekit/extensions/table';
10
11
  import { Editor } from '@prosekit/core';
11
12
  import type { EditorView } from '@prosekit/pm/view';
12
13
  import type { EmptyObject } from '@aria-ui/core';
13
14
  import { Extension } from '@prosekit/core';
14
15
  import { ExtensionTyping } from '@prosekit/core';
15
16
  import { FocusChangeHandler } from '@prosekit/core';
17
+ import { ItemFilter } from '@aria-ui/collection';
16
18
  import { Keymap } from '@prosekit/core';
17
19
  import { ListboxProps } from '@aria-ui/listbox';
20
+ import { MenuContentProps } from '@aria-ui/menu';
21
+ import { MenuItemProps } from '@aria-ui/menu';
18
22
  import { Options } from 'tsup';
19
23
  import { OverlayPositionerProps } from '@aria-ui/overlay';
20
24
  import type { Placement } from '@floating-ui/dom';
@@ -376,6 +380,117 @@ declare const defaultResizableRootProps: {
376
380
  export { defaultResizableRootProps }
377
381
  export { defaultResizableRootProps as defaultResizableRootProps_alias_1 }
378
382
 
383
+ declare const defaultTableHandleColumnRootProps: Readonly<{
384
+ editor: null;
385
+ placement: "top";
386
+ strategy: "absolute";
387
+ autoUpdate: true;
388
+ hoist: false;
389
+ transform: false;
390
+ offset: null;
391
+ flip: false;
392
+ shift: false;
393
+ overlap: false;
394
+ fitViewport: false;
395
+ sameWidth: false;
396
+ sameHeight: false;
397
+ inline: false;
398
+ hide: false;
399
+ boundary: "clippingAncestors";
400
+ rootBoundary: "viewport";
401
+ overflowPadding: 0;
402
+ elementContext: "floating";
403
+ altBoundary: true;
404
+ }>;
405
+ export { defaultTableHandleColumnRootProps }
406
+ export { defaultTableHandleColumnRootProps as defaultTableHandleColumnRootProps_alias_1 }
407
+
408
+ declare const defaultTableHandleColumnTriggerProps: Readonly<{
409
+ editor: null;
410
+ }>;
411
+ export { defaultTableHandleColumnTriggerProps }
412
+ export { defaultTableHandleColumnTriggerProps as defaultTableHandleColumnTriggerProps_alias_1 }
413
+
414
+ declare const defaultTableHandlePopoverContentProps: Readonly<{
415
+ placement: "right-start";
416
+ offset: {
417
+ mainAxis: number;
418
+ crossAxis: number;
419
+ };
420
+ editor: null;
421
+ onKeydownHandlerAdd: null;
422
+ hoist: true;
423
+ flip: true;
424
+ shift: true;
425
+ overflowPadding: 4;
426
+ onEscapeKeyDown: null;
427
+ onPointerDownOutside: null;
428
+ onFocusOutside: null;
429
+ onInteractOutside: null;
430
+ strategy: "absolute";
431
+ autoUpdate: true;
432
+ transform: false;
433
+ overlap: false;
434
+ fitViewport: false;
435
+ sameWidth: false;
436
+ sameHeight: false;
437
+ inline: false;
438
+ hide: false;
439
+ boundary: "clippingAncestors";
440
+ rootBoundary: "viewport";
441
+ elementContext: "floating";
442
+ altBoundary: true;
443
+ }>;
444
+ export { defaultTableHandlePopoverContentProps }
445
+ export { defaultTableHandlePopoverContentProps as defaultTableHandlePopoverContentProps_alias_1 }
446
+
447
+ declare const defaultTableHandlePopoverItemProps: Readonly<{
448
+ disabled: false;
449
+ value: "";
450
+ query: "";
451
+ filter: ItemFilter;
452
+ onSelect: null;
453
+ }>;
454
+ export { defaultTableHandlePopoverItemProps }
455
+ export { defaultTableHandlePopoverItemProps as defaultTableHandlePopoverItemProps_alias_1 }
456
+
457
+ declare const defaultTableHandleRootProps: Readonly<{
458
+ editor: null;
459
+ }>;
460
+ export { defaultTableHandleRootProps }
461
+ export { defaultTableHandleRootProps as defaultTableHandleRootProps_alias_1 }
462
+
463
+ declare const defaultTableHandleRowRootProps: Readonly<{
464
+ editor: null;
465
+ placement: "left";
466
+ strategy: "absolute";
467
+ autoUpdate: true;
468
+ hoist: false;
469
+ transform: false;
470
+ offset: null;
471
+ flip: false;
472
+ shift: false;
473
+ overlap: false;
474
+ fitViewport: false;
475
+ sameWidth: false;
476
+ sameHeight: false;
477
+ inline: false;
478
+ hide: false;
479
+ boundary: "clippingAncestors";
480
+ rootBoundary: "viewport";
481
+ overflowPadding: 0;
482
+ elementContext: "floating";
483
+ altBoundary: true;
484
+ }>;
485
+ export { defaultTableHandleRowRootProps }
486
+ export { defaultTableHandleRowRootProps as defaultTableHandleRowRootProps_alias_1 }
487
+
488
+ declare const defaultTableHandleRowTriggerProps: Readonly<{
489
+ editor: null;
490
+ }>;
491
+ export { defaultTableHandleRowTriggerProps }
492
+ export { defaultTableHandleRowTriggerProps as defaultTableHandleRowTriggerProps_alias_1 }
493
+
379
494
  declare const defaultTooltipContentProps: {
380
495
  shift: true;
381
496
  flip: true;
@@ -406,14 +521,26 @@ export { defaultTooltipRootProps as defaultTooltipRootProps_alias_1 }
406
521
  export { defaultTooltipTriggerProps }
407
522
  export { defaultTooltipTriggerProps as defaultTooltipTriggerProps_alias_1 }
408
523
 
524
+ export declare function defineCellHoverHandler(handler: (hoveringCell: HoveringCellInfo | null) => void): Extension<ExtensionTyping<any, any, any>>;
525
+
409
526
  export declare function defineCustomElement(name: string, constructor: CustomElementConstructor, options?: ElementDefinitionOptions): void;
410
527
 
411
528
  export declare function defineElementHoverHandler(handler: ElementHoverHandler): Union<readonly [Extension<ExtensionTyping<any, any, any>>, Extension<ExtensionTyping<any, any, any>>, Extension<ExtensionTyping<any, any, any>>]>;
412
529
 
413
530
  export declare type ElementHoverHandler = (reference: VirtualElement | null, element: HTMLElement | null, node: ProseMirrorNode | null, pos: number | null) => void;
414
531
 
532
+ export declare function getHoveringCell(view: EditorView, event: MouseEvent): HoveringCellInfo | undefined;
533
+
415
534
  export declare function getVirtualSelectionElement(view: EditorView): ReferenceElement | undefined;
416
535
 
536
+ export declare interface HoveringCellInfo {
537
+ rowIndex: number;
538
+ colIndex: number;
539
+ cellPos: number;
540
+ rowFirstCellPos: number;
541
+ colFirstCellPos: number;
542
+ }
543
+
417
544
  declare class InlinePopoverElement extends InlinePopoverElement_base {
418
545
  }
419
546
  export { InlinePopoverElement }
@@ -501,6 +628,8 @@ export { InlinePopoverProps as InlinePopoverProps_alias_1 }
501
628
 
502
629
  export declare function isFinitePositiveNumber(value: unknown): value is number;
503
630
 
631
+ export declare function isHoveringCellInfoEqual(a?: HoveringCellInfo | null, b?: HoveringCellInfo | null): boolean;
632
+
504
633
  /**
505
634
  * @internal
506
635
  */
@@ -627,6 +756,167 @@ declare interface ResizableRootProps {
627
756
  export { ResizableRootProps }
628
757
  export { ResizableRootProps as ResizableRootProps_alias_1 }
629
758
 
759
+ declare type TableCommandsExtension = ReturnType<typeof defineTableCommands>;
760
+
761
+ declare type TableCommandsExtension_2 = ReturnType<typeof defineTableCommands>;
762
+
763
+ declare class TableHandleColumnRootElement extends TableHandleColumnRootElement_base {
764
+ }
765
+ export { TableHandleColumnRootElement }
766
+ export { TableHandleColumnRootElement as TableHandleColumnRootElement_alias_1 }
767
+
768
+ declare const TableHandleColumnRootElement_base: {
769
+ new (): BaseElement & TableHandleColumnRootProps;
770
+ prototype: HTMLElement;
771
+ };
772
+
773
+ declare interface TableHandleColumnRootProps extends Omit<OverlayPositionerProps, 'placement'> {
774
+ /**
775
+ * The ProseKit editor instance.
776
+ *
777
+ * @default null
778
+ */
779
+ editor: Editor | null;
780
+ /**
781
+ * The placement of the popover, relative to the hovered table cell.
782
+ *
783
+ * @default "top"
784
+ */
785
+ placement: Placement;
786
+ }
787
+ export { TableHandleColumnRootProps }
788
+ export { TableHandleColumnRootProps as TableHandleColumnRootProps_alias_1 }
789
+
790
+ declare class TableHandleColumnTriggerElement extends TableHandleColumnTriggerElement_base {
791
+ }
792
+ export { TableHandleColumnTriggerElement }
793
+ export { TableHandleColumnTriggerElement as TableHandleColumnTriggerElement_alias_1 }
794
+
795
+ declare const TableHandleColumnTriggerElement_base: {
796
+ new (): BaseElement & TableHandleColumnTriggerProps;
797
+ prototype: HTMLElement;
798
+ };
799
+
800
+ declare interface TableHandleColumnTriggerProps {
801
+ editor: Editor<TableCommandsExtension> | null;
802
+ }
803
+ export { TableHandleColumnTriggerProps }
804
+ export { TableHandleColumnTriggerProps as TableHandleColumnTriggerProps_alias_1 }
805
+
806
+ declare class TableHandlePopoverContentElement extends TableHandlePopoverContentElement_base {
807
+ }
808
+ export { TableHandlePopoverContentElement }
809
+ export { TableHandlePopoverContentElement as TableHandlePopoverContentElement_alias_1 }
810
+
811
+ declare const TableHandlePopoverContentElement_base: {
812
+ new (): BaseElement & TableHandlePopoverContentProps;
813
+ prototype: HTMLElement;
814
+ };
815
+
816
+ declare interface TableHandlePopoverContentProps extends Omit<MenuContentProps, 'placement' | 'offset'> {
817
+ /**
818
+ * @default 'bottom-start'
819
+ */
820
+ placement: MenuContentProps['placement'];
821
+ /**
822
+ * @default {mainAxis: -4, crossAxis: 4}
823
+ */
824
+ offset: MenuContentProps['offset'];
825
+ editor: Editor | null;
826
+ }
827
+ export { TableHandlePopoverContentProps }
828
+ export { TableHandlePopoverContentProps as TableHandlePopoverContentProps_alias_1 }
829
+
830
+ declare class TableHandlePopoverItemElement extends TableHandlePopoverItemElement_base {
831
+ }
832
+ export { TableHandlePopoverItemElement }
833
+ export { TableHandlePopoverItemElement as TableHandlePopoverItemElement_alias_1 }
834
+
835
+ declare const TableHandlePopoverItemElement_base: {
836
+ new (): BaseElement & TableHandlePopoverItemProps;
837
+ prototype: HTMLElement;
838
+ };
839
+
840
+ declare interface TableHandlePopoverItemProps extends MenuItemProps {
841
+ disabled?: boolean;
842
+ }
843
+ export { TableHandlePopoverItemProps }
844
+ export { TableHandlePopoverItemProps as TableHandlePopoverItemProps_alias_1 }
845
+
846
+ /**
847
+ * @internal
848
+ */
849
+ export declare type TableHandleRootContext = HoveringCellInfo | null;
850
+
851
+ /**
852
+ * @internal
853
+ */
854
+ export declare const tableHandleRootContext: Context<TableHandleRootContext>;
855
+
856
+ declare class TableHandleRootElement extends TableHandleRootElement_base {
857
+ }
858
+ export { TableHandleRootElement }
859
+ export { TableHandleRootElement as TableHandleRootElement_alias_1 }
860
+
861
+ declare const TableHandleRootElement_base: {
862
+ new (): BaseElement & TableHandleRootProps;
863
+ prototype: HTMLElement;
864
+ };
865
+
866
+ declare interface TableHandleRootProps {
867
+ /**
868
+ * The ProseKit editor instance.
869
+ *
870
+ * @default null
871
+ */
872
+ editor: Editor | null;
873
+ }
874
+ export { TableHandleRootProps }
875
+ export { TableHandleRootProps as TableHandleRootProps_alias_1 }
876
+
877
+ declare class TableHandleRowRootElement extends TableHandleRowRootElement_base {
878
+ }
879
+ export { TableHandleRowRootElement }
880
+ export { TableHandleRowRootElement as TableHandleRowRootElement_alias_1 }
881
+
882
+ declare const TableHandleRowRootElement_base: {
883
+ new (): BaseElement & TableHandleRowRootProps;
884
+ prototype: HTMLElement;
885
+ };
886
+
887
+ declare interface TableHandleRowRootProps extends Omit<OverlayPositionerProps, 'placement'> {
888
+ /**
889
+ * The ProseKit editor instance.
890
+ *
891
+ * @default null
892
+ */
893
+ editor: Editor | null;
894
+ /**
895
+ * The placement of the popover, relative to the hovered table cell.
896
+ *
897
+ * @default "left"
898
+ */
899
+ placement: Placement;
900
+ }
901
+ export { TableHandleRowRootProps }
902
+ export { TableHandleRowRootProps as TableHandleRowRootProps_alias_1 }
903
+
904
+ declare class TableHandleRowTriggerElement extends TableHandleRowTriggerElement_base {
905
+ }
906
+ export { TableHandleRowTriggerElement }
907
+ export { TableHandleRowTriggerElement as TableHandleRowTriggerElement_alias_1 }
908
+
909
+ declare const TableHandleRowTriggerElement_base: {
910
+ new (): BaseElement & TableHandleRowTriggerProps;
911
+ prototype: HTMLElement;
912
+ };
913
+
914
+ declare interface TableHandleRowTriggerProps {
915
+ editor: Editor<TableCommandsExtension_2> | null;
916
+ }
917
+ export { TableHandleRowTriggerProps }
918
+ export { TableHandleRowTriggerProps as TableHandleRowTriggerProps_alias_1 }
919
+
630
920
  /**
631
921
  * @internal
632
922
  */
@@ -690,6 +980,8 @@ export declare function useEditorExtension(host: ConnectableElement, editor: Rea
690
980
  */
691
981
  export declare function useEditorFocusChangeEvent(host: ConnectableElement, editor: ReadonlySignal<Editor | null>, handler: FocusChangeHandler): void;
692
982
 
983
+ export declare function useEditorTyping(host: ConnectableElement, editor: ReadonlySignal<Editor | null>): ReadonlySignal<boolean>;
984
+
693
985
  /**
694
986
  * @internal
695
987
  */
@@ -711,6 +1003,20 @@ export declare function useResizableHandle(host: ConnectableElement, state: Sign
711
1003
 
712
1004
  export declare function useResizableRoot(host: ConnectableElement, state: SignalState<ResizableRootProps>): void;
713
1005
 
1006
+ export declare function useTableHandleColumnRoot(host: ConnectableElement, state: SignalState<TableHandleColumnRootProps>): void;
1007
+
1008
+ export declare function useTableHandleColumnTrigger(host: ConnectableElement, state: SignalState<TableHandleColumnTriggerProps>): void;
1009
+
1010
+ export declare function useTableHandlePopoverContent(host: ConnectableElement, state: SignalState<TableHandlePopoverContentProps>): void;
1011
+
1012
+ export declare function useTableHandlePopoverItem(element: ConnectableElement, state: SignalState<TableHandlePopoverItemProps>): void;
1013
+
1014
+ export declare function useTableHandleRoot(host: ConnectableElement, state: SignalState<TableHandleRootProps>): void;
1015
+
1016
+ export declare function useTableHandleRowRoot(host: ConnectableElement, state: SignalState<TableHandleRowRootProps>): void;
1017
+
1018
+ export declare function useTableHandleRowTrigger(host: ConnectableElement, state: SignalState<TableHandleRowTriggerProps>): void;
1019
+
714
1020
  export { useTooltipContent }
715
1021
 
716
1022
  export { useTooltipRoot }
@@ -0,0 +1,21 @@
1
+ export { TableHandleColumnRootElement } from './_tsup-dts-rollup';
2
+ export { defaultTableHandleColumnRootProps } from './_tsup-dts-rollup';
3
+ export { TableHandleColumnRootProps } from './_tsup-dts-rollup';
4
+ export { TableHandleColumnTriggerElement } from './_tsup-dts-rollup';
5
+ export { defaultTableHandleColumnTriggerProps } from './_tsup-dts-rollup';
6
+ export { TableHandleColumnTriggerProps } from './_tsup-dts-rollup';
7
+ export { TableHandlePopoverContentElement } from './_tsup-dts-rollup';
8
+ export { defaultTableHandlePopoverContentProps } from './_tsup-dts-rollup';
9
+ export { TableHandlePopoverContentProps } from './_tsup-dts-rollup';
10
+ export { TableHandlePopoverItemElement } from './_tsup-dts-rollup';
11
+ export { defaultTableHandlePopoverItemProps } from './_tsup-dts-rollup';
12
+ export { TableHandlePopoverItemProps } from './_tsup-dts-rollup';
13
+ export { TableHandleRootElement } from './_tsup-dts-rollup';
14
+ export { defaultTableHandleRootProps } from './_tsup-dts-rollup';
15
+ export { TableHandleRootProps } from './_tsup-dts-rollup';
16
+ export { TableHandleRowRootElement } from './_tsup-dts-rollup';
17
+ export { defaultTableHandleRowRootProps } from './_tsup-dts-rollup';
18
+ export { TableHandleRowRootProps } from './_tsup-dts-rollup';
19
+ export { TableHandleRowTriggerElement } from './_tsup-dts-rollup';
20
+ export { defaultTableHandleRowTriggerProps } from './_tsup-dts-rollup';
21
+ export { TableHandleRowTriggerProps } from './_tsup-dts-rollup';
@@ -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.11",
4
+ "version": "0.3.13",
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,15 +73,17 @@
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",
84
+ "prosemirror-tables": "^1.5.0",
78
85
  "@prosekit/core": "^0.7.9",
79
- "@prosekit/extensions": "^0.7.11",
86
+ "@prosekit/extensions": "^0.7.13",
80
87
  "@prosekit/pm": "^0.1.8"
81
88
  },
82
89
  "devDependencies": {
@@ -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
  ]