@prosekit/web 0.7.13 → 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 +30 -25
  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
@@ -0,0 +1,98 @@
1
+ import {
2
+ defineCustomElement,
3
+ defineProps,
4
+ registerCustomElement,
5
+ type HostElement,
6
+ type HostElementConstructor,
7
+ type PropsDeclaration,
8
+ type State,
9
+ } from '@aria-ui/core'
10
+ import { OverlayPositionerPropsDeclaration, setupOverlayPositioner, type OverlayPositionerProps } from '@aria-ui/elements/overlay'
11
+
12
+ import { InlinePopoverStoreContext } from './store.ts'
13
+
14
+ /**
15
+ * @public
16
+ */
17
+ export interface InlinePopoverPositionerProps extends OverlayPositionerProps {
18
+ /**
19
+ * The initial placement of the floating element
20
+ *
21
+ * @default "top"
22
+ */
23
+ placement: OverlayPositionerProps['placement']
24
+
25
+ /**
26
+ * The distance between the reference and floating element.
27
+ *
28
+ * @default 12
29
+ */
30
+ offset: OverlayPositionerProps['offset']
31
+
32
+ /**
33
+ * Whether to hide the floating element when the reference element or the
34
+ * floating element is fully clipped.
35
+ *
36
+ * @default true
37
+ */
38
+ hide: OverlayPositionerProps['hide']
39
+
40
+ /**
41
+ * Whether the floating element can overlap the reference element to keep it
42
+ * in view.
43
+ *
44
+ * @default true
45
+ */
46
+ overlap: OverlayPositionerProps['overlap']
47
+
48
+ /**
49
+ * Whether to improve positioning for inline reference elements that span over
50
+ * multiple lines.
51
+ *
52
+ * @default true
53
+ */
54
+ inline: OverlayPositionerProps['inline']
55
+
56
+ /**
57
+ * Describes the virtual padding around the boundary to check for overflow.
58
+ *
59
+ * @default 8
60
+ */
61
+ overflowPadding: OverlayPositionerProps['overflowPadding']
62
+ }
63
+
64
+ /** @internal */
65
+ export const InlinePopoverPositionerPropsDeclaration: PropsDeclaration<InlinePopoverPositionerProps> = /* @__PURE__ */ defineProps<
66
+ InlinePopoverPositionerProps
67
+ >({
68
+ ...OverlayPositionerPropsDeclaration,
69
+ placement: { default: 'top', attribute: 'placement', type: 'string' },
70
+ offset: { default: 12, attribute: false, type: 'json' },
71
+ hide: { default: true, attribute: 'hide', type: 'boolean' },
72
+ overlap: { default: true, attribute: 'overlap', type: 'boolean' },
73
+ inline: { default: true, attribute: 'inline', type: 'boolean' },
74
+ overflowPadding: { default: 8, attribute: 'overflow-padding', type: 'number' },
75
+ })
76
+
77
+ /** @internal */
78
+ export function setupInlinePopoverPositioner(
79
+ host: HostElement,
80
+ props: State<InlinePopoverPositionerProps>,
81
+ ): void {
82
+ setupOverlayPositioner(host, props, InlinePopoverStoreContext.consume(host))
83
+ }
84
+
85
+ const InlinePopoverPositionerElementBase: HostElementConstructor<InlinePopoverPositionerProps> = defineCustomElement(
86
+ setupInlinePopoverPositioner,
87
+ InlinePopoverPositionerPropsDeclaration,
88
+ )
89
+
90
+ /**
91
+ * @public
92
+ */
93
+ export class InlinePopoverPositionerElement extends InlinePopoverPositionerElementBase {}
94
+
95
+ /** @internal */
96
+ export function registerInlinePopoverPositionerElement(): void {
97
+ registerCustomElement('prosekit-inline-popover-positioner', InlinePopoverPositionerElement)
98
+ }
@@ -0,0 +1,122 @@
1
+ import {
2
+ defineCustomElement,
3
+ defineProps,
4
+ registerCustomElement,
5
+ type HostElement,
6
+ type HostElementConstructor,
7
+ type PropsDeclaration,
8
+ type State,
9
+ } from '@aria-ui/core'
10
+ import type { OpenChangeEvent } from '@aria-ui/elements/overlay'
11
+ import { OverlayRootPropsDeclaration, useOverlayStore, type OverlayRootProps } from '@aria-ui/elements/overlay'
12
+ import type { Editor } from '@prosekit/core'
13
+ import type { Selection } from '@prosekit/pm/state'
14
+
15
+ import { useEditorFocusChangeEvent } from '../../hooks/use-editor-focus-event.ts'
16
+ import { useEditorUpdateEvent } from '../../hooks/use-editor-update-event.ts'
17
+ import { useKeymap } from '../../hooks/use-keymap.ts'
18
+
19
+ import { InlinePopoverStoreContext } from './store.ts'
20
+ import { getVirtualSelectionElement } from './virtual-selection-element.ts'
21
+
22
+ /**
23
+ * @public
24
+ */
25
+ export interface InlinePopoverRootProps extends OverlayRootProps {
26
+ /**
27
+ * The ProseKit editor instance.
28
+ *
29
+ * @default null
30
+ * @hidden
31
+ */
32
+ editor: Editor | null
33
+
34
+ /**
35
+ * Whether the popover is open by default when some inline content is
36
+ * selected.
37
+ *
38
+ * @default true
39
+ */
40
+ defaultOpen: boolean
41
+
42
+ /**
43
+ * Whether the inline popover should be dismissed when the editor receives an
44
+ * Escape key press.
45
+ *
46
+ * @default true
47
+ */
48
+ dismissOnEscape: boolean
49
+ }
50
+
51
+ /** @internal */
52
+ export const InlinePopoverRootPropsDeclaration: PropsDeclaration<InlinePopoverRootProps> = /* @__PURE__ */ defineProps<
53
+ InlinePopoverRootProps
54
+ >({
55
+ ...OverlayRootPropsDeclaration,
56
+ editor: { default: null, attribute: false, type: 'json' },
57
+ defaultOpen: { default: true, attribute: 'default-open', type: 'boolean' },
58
+ dismissOnEscape: { default: true, attribute: 'dismiss-on-escape', type: 'boolean' },
59
+ })
60
+
61
+ /**
62
+ * @public
63
+ */
64
+ export interface InlinePopoverRootEvents {
65
+ openChange: OpenChangeEvent
66
+ }
67
+
68
+ /** @internal */
69
+ export function setupInlinePopoverRoot(
70
+ host: HostElement,
71
+ props: State<InlinePopoverRootProps>,
72
+ ): void {
73
+ const store = useOverlayStore(host, props)
74
+ InlinePopoverStoreContext.provide(host, store)
75
+
76
+ let editorFocused = false
77
+ useEditorFocusChangeEvent(host, props.editor.get, (focus) => {
78
+ editorFocused = focus
79
+ })
80
+
81
+ let prevSelection: Selection | undefined
82
+ useEditorUpdateEvent(host, props.editor.get, (view) => {
83
+ const isPopoverFocused = !editorFocused && host.contains(host.ownerDocument.activeElement)
84
+ if (isPopoverFocused) return
85
+
86
+ const { selection } = view.state
87
+ if (prevSelection?.eq(selection)) return
88
+ prevSelection = selection
89
+
90
+ const reference = getVirtualSelectionElement(view)
91
+ store.setAnchorElement(reference)
92
+
93
+ if (reference && props.defaultOpen.get()) {
94
+ store.requestOpenChange(true)
95
+ } else if (!reference) {
96
+ store.requestOpenChange(false)
97
+ }
98
+ })
99
+
100
+ useKeymap(host, props.editor.get, {
101
+ Escape: () => {
102
+ if (!props.dismissOnEscape.get() || !store.getIsOpen()) return false
103
+ store.requestOpenChange(false)
104
+ return true
105
+ },
106
+ })
107
+ }
108
+
109
+ const InlinePopoverRootElementBase: HostElementConstructor<InlinePopoverRootProps> = defineCustomElement(
110
+ setupInlinePopoverRoot,
111
+ InlinePopoverRootPropsDeclaration,
112
+ )
113
+
114
+ /**
115
+ * @public
116
+ */
117
+ export class InlinePopoverRootElement extends InlinePopoverRootElementBase {}
118
+
119
+ /** @internal */
120
+ export function registerInlinePopoverRootElement(): void {
121
+ registerCustomElement('prosekit-inline-popover-root', InlinePopoverRootElement)
122
+ }
@@ -0,0 +1,6 @@
1
+ import { createContext, type Context } from '@aria-ui/core'
2
+ import type { OverlayStore } from '@aria-ui/elements/overlay'
3
+
4
+ export const InlinePopoverStoreContext: Context<OverlayStore> = createContext<OverlayStore>(
5
+ 'prosekit-inline-popover-store',
6
+ )
@@ -0,0 +1,92 @@
1
+ /**
2
+
3
+ @module
4
+
5
+ ## Anatomy
6
+
7
+ ```html
8
+ <prosekit-menu-root>
9
+ <prosekit-menu-trigger>...</prosekit-menu-trigger>
10
+ <prosekit-menu-positioner>
11
+ <prosekit-menu-popup>
12
+ <prosekit-menu-item>...</prosekit-menu-item>
13
+ <prosekit-menu-submenu-root>
14
+ <prosekit-menu-submenu-trigger>...</prosekit-menu-submenu-trigger>
15
+ <prosekit-menu-positioner>
16
+ <prosekit-menu-popup>
17
+ <prosekit-menu-item>...</prosekit-menu-item>
18
+ </prosekit-menu-popup>
19
+ </prosekit-menu-positioner>
20
+ </prosekit-menu-submenu-root>
21
+ </prosekit-menu-popup>
22
+ </prosekit-menu-positioner>
23
+ </prosekit-menu-root>
24
+ ```
25
+ */
26
+
27
+ import { registerCustomElement } from '@aria-ui/core'
28
+ import {
29
+ MenuItemElement,
30
+ MenuPopupElement,
31
+ MenuPositionerElement,
32
+ MenuRootElement,
33
+ MenuSubmenuRootElement,
34
+ MenuSubmenuTriggerElement,
35
+ MenuTriggerElement,
36
+ } from '@aria-ui/elements/menu'
37
+
38
+ export {
39
+ MenuItemElement,
40
+ MenuItemPropsDeclaration,
41
+ MenuPopupElement,
42
+ MenuPopupPropsDeclaration,
43
+ MenuPositionerElement,
44
+ MenuPositionerPropsDeclaration,
45
+ MenuRootElement,
46
+ MenuRootPropsDeclaration,
47
+ MenuSubmenuRootElement,
48
+ MenuSubmenuRootPropsDeclaration,
49
+ MenuSubmenuTriggerElement,
50
+ MenuSubmenuTriggerPropsDeclaration,
51
+ MenuTriggerElement,
52
+ MenuTriggerPropsDeclaration,
53
+ OpenChangeEvent,
54
+ SelectEvent,
55
+ setupMenuItem,
56
+ setupMenuPopup,
57
+ setupMenuPositioner,
58
+ setupMenuRoot,
59
+ setupMenuSubmenuRoot,
60
+ setupMenuSubmenuTrigger,
61
+ setupMenuTrigger,
62
+ type MenuItemEvents,
63
+ type MenuItemProps,
64
+ type MenuPopupProps,
65
+ type MenuPositionerProps,
66
+ type MenuRootEvents,
67
+ type MenuRootProps,
68
+ type MenuTriggerEvents,
69
+ type MenuTriggerProps,
70
+ } from '@aria-ui/elements/menu'
71
+
72
+ export function registerMenuRootElement(): void {
73
+ registerCustomElement('prosekit-menu-root', MenuRootElement)
74
+ }
75
+ export function registerMenuTriggerElement(): void {
76
+ registerCustomElement('prosekit-menu-trigger', MenuTriggerElement)
77
+ }
78
+ export function registerMenuPositionerElement(): void {
79
+ registerCustomElement('prosekit-menu-positioner', MenuPositionerElement)
80
+ }
81
+ export function registerMenuPopupElement(): void {
82
+ registerCustomElement('prosekit-menu-popup', MenuPopupElement)
83
+ }
84
+ export function registerMenuItemElement(): void {
85
+ registerCustomElement('prosekit-menu-item', MenuItemElement)
86
+ }
87
+ export function registerMenuSubmenuRootElement(): void {
88
+ registerCustomElement('prosekit-menu-submenu-root', MenuSubmenuRootElement)
89
+ }
90
+ export function registerMenuSubmenuTriggerElement(): void {
91
+ registerCustomElement('prosekit-menu-submenu-trigger', MenuSubmenuTriggerElement)
92
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+
3
+ @module
4
+
5
+ ## Anatomy
6
+
7
+ ```html
8
+ <prosekit-popover-root>
9
+ <prosekit-popover-trigger>...</prosekit-popover-trigger>
10
+ <prosekit-popover-positioner>
11
+ <prosekit-popover-popup>...</prosekit-popover-popup>
12
+ </prosekit-popover-positioner>
13
+ </prosekit-popover-root>
14
+ ```
15
+ */
16
+
17
+ import { registerCustomElement } from '@aria-ui/core'
18
+ import { PopoverPopupElement, PopoverPositionerElement, PopoverRootElement, PopoverTriggerElement } from '@aria-ui/elements/popover'
19
+
20
+ export {
21
+ OpenChangeEvent,
22
+ PopoverPopupElement,
23
+ PopoverPopupPropsDeclaration,
24
+ PopoverPositionerElement,
25
+ PopoverPositionerPropsDeclaration,
26
+ PopoverRootElement,
27
+ PopoverRootPropsDeclaration,
28
+ PopoverTriggerElement,
29
+ PopoverTriggerPropsDeclaration,
30
+ setupPopoverPopup,
31
+ setupPopoverPositioner,
32
+ setupPopoverRoot,
33
+ setupPopoverTrigger,
34
+ type PopoverPopupProps,
35
+ type PopoverPositionerProps,
36
+ type PopoverRootEvents,
37
+ type PopoverRootProps,
38
+ type PopoverTriggerEvents,
39
+ type PopoverTriggerProps,
40
+ } from '@aria-ui/elements/popover'
41
+
42
+ export function registerPopoverRootElement(): void {
43
+ registerCustomElement('prosekit-popover-root', PopoverRootElement)
44
+ }
45
+ export function registerPopoverTriggerElement(): void {
46
+ registerCustomElement('prosekit-popover-trigger', PopoverTriggerElement)
47
+ }
48
+ export function registerPopoverPopupElement(): void {
49
+ registerCustomElement('prosekit-popover-popup', PopoverPopupElement)
50
+ }
51
+ export function registerPopoverPositionerElement(): void {
52
+ registerCustomElement('prosekit-popover-positioner', PopoverPositionerElement)
53
+ }
@@ -1,4 +1,4 @@
1
- import { isFinitePositiveNumber } from '../../../utils/is-finite-positive-number.ts'
1
+ import { isFinitePositiveNumber } from '../../utils/is-finite-positive-number.ts'
2
2
 
3
3
  export function calcResize(
4
4
  position:
@@ -3,25 +3,22 @@ import { createContext, type Context } from '@aria-ui/core'
3
3
  /**
4
4
  * @internal
5
5
  */
6
- export const onResizeContext: Context<OnResize> = createContext(
6
+ export const onResizeContext: Context<OnResize> = createContext<OnResize>(
7
7
  'prosekit/resizable/onResize',
8
- null,
9
8
  )
10
9
 
11
10
  /**
12
11
  * @internal
13
12
  */
14
- export const onResizeStartContext: Context<OnResizeStart> = createContext(
13
+ export const onResizeStartContext: Context<OnResizeStart> = createContext<OnResizeStart>(
15
14
  'prosekit/resizable/onResizeStart',
16
- null,
17
15
  )
18
16
 
19
17
  /**
20
18
  * @internal
21
19
  */
22
- export const onResizeEndContext: Context<OnResizeEnd> = createContext(
20
+ export const onResizeEndContext: Context<OnResizeEnd> = createContext<OnResizeEnd>(
23
21
  'prosekit/resizable/onResizeEnd',
24
- null,
25
22
  )
26
23
 
27
24
  /**
@@ -0,0 +1,32 @@
1
+ /**
2
+
3
+ @module
4
+
5
+ ## Anatomy
6
+
7
+ ```html
8
+ <prosekit-resizable-root>
9
+ <img src="..." />
10
+ <prosekit-resizable-handle>...</prosekit-resizable-handle>
11
+ </prosekit-resizable-root>
12
+ ```
13
+ */
14
+
15
+ export {
16
+ registerResizableRootElement,
17
+ ResizableRootElement,
18
+ ResizableRootPropsDeclaration,
19
+ ResizeEndEvent,
20
+ ResizeStartEvent,
21
+ setupResizableRoot,
22
+ type ResizableRootEvents,
23
+ type ResizableRootProps,
24
+ } from './resizable-root.ts'
25
+
26
+ export {
27
+ registerResizableHandleElement,
28
+ ResizableHandleElement,
29
+ ResizableHandlePropsDeclaration,
30
+ setupResizableHandle,
31
+ type ResizableHandleProps,
32
+ } from './resizable-handle.ts'
@@ -0,0 +1,134 @@
1
+ import type { HostElement, HostElementConstructor, PropsDeclaration } from '@aria-ui/core'
2
+ import { createSignal, defineCustomElement, defineProps, registerCustomElement, useEffect, type State } from '@aria-ui/core'
3
+ import { getWindow } from '@ocavue/utils'
4
+
5
+ import { calcResize } from './calc-resize.ts'
6
+ import { onResizeContext, onResizeEndContext, onResizeStartContext } from './context.ts'
7
+
8
+ /**
9
+ * @public
10
+ */
11
+ export interface ResizableHandleProps {
12
+ /**
13
+ * The position of the handle.
14
+ *
15
+ * @default "bottom-right"
16
+ */
17
+ position:
18
+ | 'top'
19
+ | 'right'
20
+ | 'bottom'
21
+ | 'left'
22
+ | 'top-left'
23
+ | 'top-right'
24
+ | 'bottom-left'
25
+ | 'bottom-right'
26
+ }
27
+
28
+ /**
29
+ * @internal
30
+ */
31
+ export const ResizableHandlePropsDeclaration: PropsDeclaration<ResizableHandleProps> = defineProps<ResizableHandleProps>({
32
+ position: { default: 'bottom-right', attribute: 'position', type: 'string' },
33
+ })
34
+
35
+ /**
36
+ * @internal
37
+ */
38
+ export function setupResizableHandle(
39
+ host: HostElement,
40
+ props: State<ResizableHandleProps>,
41
+ ): void {
42
+ const getOnResize = onResizeContext.consume(host)
43
+ const getOnResizeStart = onResizeStartContext.consume(host)
44
+ const getOnResizeEnd = onResizeEndContext.consume(host)
45
+
46
+ let startX = 0
47
+ let startY = 0
48
+ let width = 0
49
+ let height = 0
50
+ let aspectRatio = 1
51
+
52
+ const pointerPressing = createSignal(false)
53
+
54
+ const handlePointerDown = (event: PointerEvent) => {
55
+ event.preventDefault()
56
+ pointerPressing.set(true)
57
+
58
+ startX = event.x
59
+ startY = event.y
60
+
61
+ const size = getOnResizeStart()?.()
62
+ if (size) {
63
+ ;[width, height, aspectRatio] = size
64
+ }
65
+ }
66
+
67
+ const handlePointerMove = (event: PointerEvent) => {
68
+ event.preventDefault()
69
+
70
+ const dx = event.x - startX
71
+ const dy = event.y - startY
72
+
73
+ const [w, h] = calcResize(
74
+ props.position.get(),
75
+ width,
76
+ height,
77
+ dx,
78
+ dy,
79
+ aspectRatio,
80
+ )
81
+
82
+ getOnResize()?.(w, h)
83
+ }
84
+
85
+ const handlePointerUp = (event: PointerEvent) => {
86
+ event.preventDefault()
87
+ pointerPressing.set(false)
88
+
89
+ getOnResizeEnd()?.()
90
+ }
91
+
92
+ useEffect(host, () => {
93
+ host.addEventListener('pointerdown', handlePointerDown)
94
+ return () => {
95
+ host.removeEventListener('pointerdown', handlePointerDown)
96
+ }
97
+ })
98
+
99
+ useEffect(host, () => {
100
+ if (!pointerPressing.get()) {
101
+ return
102
+ }
103
+
104
+ const win = getWindow(host)
105
+
106
+ win.addEventListener('pointermove', handlePointerMove)
107
+ win.addEventListener('pointerup', handlePointerUp)
108
+ return () => {
109
+ win.removeEventListener('pointermove', handlePointerMove)
110
+ win.removeEventListener('pointerup', handlePointerUp)
111
+ }
112
+ })
113
+ }
114
+
115
+ const ResizableHandleElementBase: HostElementConstructor<ResizableHandleProps> = defineCustomElement(
116
+ setupResizableHandle,
117
+ ResizableHandlePropsDeclaration,
118
+ )
119
+
120
+ /**
121
+ * @public
122
+ */
123
+ export class ResizableHandleElement extends ResizableHandleElementBase {}
124
+
125
+ let isResizableHandleRegistered = false
126
+
127
+ /**
128
+ * @internal
129
+ */
130
+ export function registerResizableHandleElement(): void {
131
+ if (isResizableHandleRegistered) return
132
+ isResizableHandleRegistered = true
133
+ registerCustomElement('prosekit-resizable-handle', ResizableHandleElement)
134
+ }