@prosekit/web 0.7.3 → 0.7.4

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 (173) hide show
  1. package/dist/get-default-state-CIEy7xrl.js +2 -1
  2. package/dist/get-default-state-CIEy7xrl.js.map +1 -0
  3. package/dist/get-safe-editor-view-DENm4avv.js +2 -1
  4. package/dist/get-safe-editor-view-DENm4avv.js.map +1 -0
  5. package/dist/{inject-style-D5jj7cme.js → inject-style-BJQNFufI.js} +4 -5
  6. package/dist/inject-style-BJQNFufI.js.map +1 -0
  7. package/dist/prosekit-web-autocomplete.d.ts +2 -1
  8. package/dist/prosekit-web-autocomplete.d.ts.map +1 -0
  9. package/dist/prosekit-web-autocomplete.js +5 -7
  10. package/dist/prosekit-web-autocomplete.js.map +1 -0
  11. package/dist/prosekit-web-block-handle.d.ts +2 -1
  12. package/dist/prosekit-web-block-handle.d.ts.map +1 -0
  13. package/dist/prosekit-web-block-handle.js +9 -13
  14. package/dist/prosekit-web-block-handle.js.map +1 -0
  15. package/dist/prosekit-web-drop-indicator.d.ts +2 -1
  16. package/dist/prosekit-web-drop-indicator.d.ts.map +1 -0
  17. package/dist/prosekit-web-drop-indicator.js +2 -1
  18. package/dist/prosekit-web-drop-indicator.js.map +1 -0
  19. package/dist/prosekit-web-inline-popover.d.ts +2 -1
  20. package/dist/prosekit-web-inline-popover.d.ts.map +1 -0
  21. package/dist/prosekit-web-inline-popover.js +4 -5
  22. package/dist/prosekit-web-inline-popover.js.map +1 -0
  23. package/dist/prosekit-web-popover.d.ts +2 -1
  24. package/dist/prosekit-web-popover.d.ts.map +1 -0
  25. package/dist/prosekit-web-popover.js +2 -1
  26. package/dist/prosekit-web-popover.js.map +1 -0
  27. package/dist/prosekit-web-resizable.d.ts +2 -1
  28. package/dist/prosekit-web-resizable.d.ts.map +1 -0
  29. package/dist/prosekit-web-resizable.js +2 -1
  30. package/dist/prosekit-web-resizable.js.map +1 -0
  31. package/dist/prosekit-web-table-handle.d.ts +2 -1
  32. package/dist/prosekit-web-table-handle.d.ts.map +1 -0
  33. package/dist/prosekit-web-table-handle.js +17 -37
  34. package/dist/prosekit-web-table-handle.js.map +1 -0
  35. package/dist/prosekit-web-tooltip.d.ts +2 -1
  36. package/dist/prosekit-web-tooltip.d.ts.map +1 -0
  37. package/dist/prosekit-web-tooltip.js +2 -1
  38. package/dist/prosekit-web-tooltip.js.map +1 -0
  39. package/dist/prosekit-web.d.ts +1 -1
  40. package/dist/prosekit-web.js +1 -0
  41. package/dist/use-editor-extension-Cc7ZG7uj.js +2 -1
  42. package/dist/use-editor-extension-Cc7ZG7uj.js.map +1 -0
  43. package/dist/use-scrolling-BNfsQs3S.js +2 -1
  44. package/dist/use-scrolling-BNfsQs3S.js.map +1 -0
  45. package/package.json +17 -17
  46. package/src/components/autocomplete/autocomplete-empty/element.gen.ts +18 -0
  47. package/src/components/autocomplete/autocomplete-empty/setup.ts +6 -0
  48. package/src/components/autocomplete/autocomplete-empty/types.ts +16 -0
  49. package/src/components/autocomplete/autocomplete-item/element.gen.ts +18 -0
  50. package/src/components/autocomplete/autocomplete-item/setup.ts +38 -0
  51. package/src/components/autocomplete/autocomplete-item/types.ts +31 -0
  52. package/src/components/autocomplete/autocomplete-list/element.gen.ts +18 -0
  53. package/src/components/autocomplete/autocomplete-list/setup.ts +140 -0
  54. package/src/components/autocomplete/autocomplete-list/types.ts +30 -0
  55. package/src/components/autocomplete/autocomplete-popover/element.gen.ts +18 -0
  56. package/src/components/autocomplete/autocomplete-popover/helpers.spec.ts +21 -0
  57. package/src/components/autocomplete/autocomplete-popover/helpers.ts +7 -0
  58. package/src/components/autocomplete/autocomplete-popover/setup.ts +185 -0
  59. package/src/components/autocomplete/autocomplete-popover/types.ts +103 -0
  60. package/src/components/autocomplete/context.ts +19 -0
  61. package/src/components/autocomplete/index.gen.ts +17 -0
  62. package/src/components/block-handle/block-handle-add/element.gen.ts +18 -0
  63. package/src/components/block-handle/block-handle-add/setup.ts +37 -0
  64. package/src/components/block-handle/block-handle-add/types.ts +26 -0
  65. package/src/components/block-handle/block-handle-draggable/element.gen.ts +18 -0
  66. package/src/components/block-handle/block-handle-draggable/set-drag-preview.ts +88 -0
  67. package/src/components/block-handle/block-handle-draggable/setup.ts +133 -0
  68. package/src/components/block-handle/block-handle-draggable/types.ts +26 -0
  69. package/src/components/block-handle/block-handle-popover/element.gen.ts +18 -0
  70. package/src/components/block-handle/block-handle-popover/pointer-move.ts +243 -0
  71. package/src/components/block-handle/block-handle-popover/setup.ts +88 -0
  72. package/src/components/block-handle/block-handle-popover/types.ts +84 -0
  73. package/src/components/block-handle/context.ts +34 -0
  74. package/src/components/block-handle/index.gen.ts +13 -0
  75. package/src/components/drop-indicator/drop-indicator/element.gen.ts +18 -0
  76. package/src/components/drop-indicator/drop-indicator/setup.ts +87 -0
  77. package/src/components/drop-indicator/drop-indicator/types.ts +34 -0
  78. package/src/components/drop-indicator/index.gen.ts +5 -0
  79. package/src/components/inline-popover/index.gen.ts +5 -0
  80. package/src/components/inline-popover/inline-popover/element.gen.ts +18 -0
  81. package/src/components/inline-popover/inline-popover/setup.ts +97 -0
  82. package/src/components/inline-popover/inline-popover/types.ts +115 -0
  83. package/src/components/inline-popover/inline-popover/virtual-selection-element.ts +75 -0
  84. package/src/components/popover/index.gen.ts +13 -0
  85. package/src/components/popover/popover-content/element.gen.ts +18 -0
  86. package/src/components/popover/popover-content/setup.ts +1 -0
  87. package/src/components/popover/popover-content/types.ts +12 -0
  88. package/src/components/popover/popover-root/element.gen.ts +18 -0
  89. package/src/components/popover/popover-root/setup.ts +1 -0
  90. package/src/components/popover/popover-root/types.ts +12 -0
  91. package/src/components/popover/popover-trigger/element.gen.ts +18 -0
  92. package/src/components/popover/popover-trigger/setup.ts +1 -0
  93. package/src/components/popover/popover-trigger/types.ts +12 -0
  94. package/src/components/resizable/context.ts +45 -0
  95. package/src/components/resizable/index.gen.ts +9 -0
  96. package/src/components/resizable/resizable-handle/calc-resize.spec.ts +280 -0
  97. package/src/components/resizable/resizable-handle/calc-resize.ts +121 -0
  98. package/src/components/resizable/resizable-handle/element.gen.ts +18 -0
  99. package/src/components/resizable/resizable-handle/setup.ts +112 -0
  100. package/src/components/resizable/resizable-handle/types.ts +32 -0
  101. package/src/components/resizable/resizable-root/element.gen.ts +18 -0
  102. package/src/components/resizable/resizable-root/setup.ts +93 -0
  103. package/src/components/resizable/resizable-root/types.ts +28 -0
  104. package/src/components/table-handle/context.ts +49 -0
  105. package/src/components/table-handle/dnd.ts +135 -0
  106. package/src/components/table-handle/hooks/use-drop.ts +94 -0
  107. package/src/components/table-handle/hooks/use-empty-image.ts +30 -0
  108. package/src/components/table-handle/index.gen.ts +37 -0
  109. package/src/components/table-handle/table-handle-column-root/element.gen.ts +18 -0
  110. package/src/components/table-handle/table-handle-column-root/setup.ts +71 -0
  111. package/src/components/table-handle/table-handle-column-root/types.ts +76 -0
  112. package/src/components/table-handle/table-handle-column-trigger/element.gen.ts +18 -0
  113. package/src/components/table-handle/table-handle-column-trigger/setup.ts +75 -0
  114. package/src/components/table-handle/table-handle-column-trigger/types.ts +23 -0
  115. package/src/components/table-handle/table-handle-drag-preview/element.gen.ts +18 -0
  116. package/src/components/table-handle/table-handle-drag-preview/render-preview.ts +80 -0
  117. package/src/components/table-handle/table-handle-drag-preview/setup.ts +67 -0
  118. package/src/components/table-handle/table-handle-drag-preview/types.ts +17 -0
  119. package/src/components/table-handle/table-handle-drag-preview/updater.ts +101 -0
  120. package/src/components/table-handle/table-handle-drop-indicator/calc-drag-over.ts +44 -0
  121. package/src/components/table-handle/table-handle-drop-indicator/element.gen.ts +18 -0
  122. package/src/components/table-handle/table-handle-drop-indicator/setup.ts +56 -0
  123. package/src/components/table-handle/table-handle-drop-indicator/types.ts +18 -0
  124. package/src/components/table-handle/table-handle-drop-indicator/updater.ts +110 -0
  125. package/src/components/table-handle/table-handle-popover-content/element.gen.ts +18 -0
  126. package/src/components/table-handle/table-handle-popover-content/setup.ts +90 -0
  127. package/src/components/table-handle/table-handle-popover-content/types.ts +40 -0
  128. package/src/components/table-handle/table-handle-popover-item/element.gen.ts +18 -0
  129. package/src/components/table-handle/table-handle-popover-item/setup.ts +23 -0
  130. package/src/components/table-handle/table-handle-popover-item/types.ts +24 -0
  131. package/src/components/table-handle/table-handle-root/element.gen.ts +18 -0
  132. package/src/components/table-handle/table-handle-root/setup.ts +93 -0
  133. package/src/components/table-handle/table-handle-root/types.ts +26 -0
  134. package/src/components/table-handle/table-handle-row-root/element.gen.ts +18 -0
  135. package/src/components/table-handle/table-handle-row-root/setup.ts +77 -0
  136. package/src/components/table-handle/table-handle-row-root/types.ts +75 -0
  137. package/src/components/table-handle/table-handle-row-trigger/element.gen.ts +18 -0
  138. package/src/components/table-handle/table-handle-row-trigger/setup.ts +74 -0
  139. package/src/components/table-handle/table-handle-row-trigger/types.ts +26 -0
  140. package/src/components/table-handle/utils.ts +107 -0
  141. package/src/components/tooltip/index.gen.ts +13 -0
  142. package/src/components/tooltip/tooltip-content/element.gen.ts +18 -0
  143. package/src/components/tooltip/tooltip-content/setup.ts +1 -0
  144. package/src/components/tooltip/tooltip-content/types.ts +12 -0
  145. package/src/components/tooltip/tooltip-root/element.gen.ts +18 -0
  146. package/src/components/tooltip/tooltip-root/setup.ts +1 -0
  147. package/src/components/tooltip/tooltip-root/types.ts +12 -0
  148. package/src/components/tooltip/tooltip-trigger/element.gen.ts +18 -0
  149. package/src/components/tooltip/tooltip-trigger/setup.ts +1 -0
  150. package/src/components/tooltip/tooltip-trigger/types.ts +12 -0
  151. package/src/hooks/use-editor-extension.ts +19 -0
  152. package/src/hooks/use-editor-focus-event.ts +23 -0
  153. package/src/hooks/use-editor-typing.ts +36 -0
  154. package/src/hooks/use-editor-update-event.ts +23 -0
  155. package/src/hooks/use-first-rendering.ts +20 -0
  156. package/src/hooks/use-keymap.ts +20 -0
  157. package/src/hooks/use-scrolling.ts +33 -0
  158. package/src/hooks/use-selecting.ts +63 -0
  159. package/src/index.ts +1 -0
  160. package/src/utils/assign-styles.ts +14 -0
  161. package/src/utils/clone-element.ts +110 -0
  162. package/src/utils/css-feature-detection.ts +9 -0
  163. package/src/utils/fade-color.ts +15 -0
  164. package/src/utils/get-box-element.ts +20 -0
  165. package/src/utils/get-client-rect.ts +35 -0
  166. package/src/utils/get-default-state.spec.ts +50 -0
  167. package/src/utils/get-default-state.ts +22 -0
  168. package/src/utils/get-effective-background-color.ts +21 -0
  169. package/src/utils/get-safe-editor-view.ts +10 -0
  170. package/src/utils/inject-style.ts +11 -0
  171. package/src/utils/is-finite-positive-number.ts +3 -0
  172. package/src/utils/max-z-index.ts +3 -0
  173. package/src/utils/throttle.ts +17 -0
@@ -0,0 +1,34 @@
1
+ import {
2
+ createContext,
3
+ type Context,
4
+ } from '@aria-ui/core'
5
+ import type { ProseMirrorNode } from '@prosekit/pm/model'
6
+
7
+ /**
8
+ * @internal
9
+ */
10
+ export interface HoverState {
11
+ node: ProseMirrorNode
12
+ pos: number
13
+ }
14
+
15
+ /**
16
+ * @internal
17
+ */
18
+ export type BlockPopoverContext = HoverState | null
19
+
20
+ /**
21
+ * @internal
22
+ */
23
+ export const blockPopoverContext: Context<BlockPopoverContext> = createContext(
24
+ 'prosekit-block-popover-context',
25
+ null,
26
+ )
27
+
28
+ /**
29
+ * @internal
30
+ */
31
+ export const draggingContext: Context<boolean> = createContext(
32
+ 'prosekit-block-handle-dragging-context',
33
+ false,
34
+ )
@@ -0,0 +1,13 @@
1
+ // This file is generated by packages/dev/src/gen-components.ts
2
+
3
+ export { BlockHandleAddElement } from './block-handle-add/element.gen'
4
+ export { blockHandleAddEvents, blockHandleAddProps, type BlockHandleAddEvents, type BlockHandleAddProps } from './block-handle-add/types'
5
+ export { useBlockHandleAdd } from './block-handle-add/setup'
6
+
7
+ export { BlockHandleDraggableElement } from './block-handle-draggable/element.gen'
8
+ export { blockHandleDraggableEvents, blockHandleDraggableProps, type BlockHandleDraggableEvents, type BlockHandleDraggableProps } from './block-handle-draggable/types'
9
+ export { useBlockHandleDraggable } from './block-handle-draggable/setup'
10
+
11
+ export { BlockHandlePopoverElement } from './block-handle-popover/element.gen'
12
+ export { blockHandlePopoverEvents, blockHandlePopoverProps, type BlockHandlePopoverEvents, type BlockHandlePopoverProps } from './block-handle-popover/types'
13
+ export { useBlockHandlePopover } from './block-handle-popover/setup'
@@ -0,0 +1,18 @@
1
+ import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
2
+
3
+ import { useDropIndicator } from "./setup"
4
+ import { dropIndicatorEvents, dropIndicatorProps, type DropIndicatorEvents, type DropIndicatorProps } from "./types"
5
+
6
+ const DropIndicatorElementBase: BaseElementConstructor<DropIndicatorProps> = defineCustomElement<
7
+ DropIndicatorProps,
8
+ DropIndicatorEvents
9
+ >({
10
+ props: dropIndicatorProps,
11
+ events: dropIndicatorEvents,
12
+ setup: useDropIndicator,
13
+ })
14
+ class DropIndicatorElement extends DropIndicatorElementBase {}
15
+
16
+ registerCustomElement('prosekit-drop-indicator', DropIndicatorElement)
17
+
18
+ export { DropIndicatorElement }
@@ -0,0 +1,87 @@
1
+ import {
2
+ createComputed,
3
+ createSignal,
4
+ useEffect,
5
+ type ConnectableElement,
6
+ type SetupOptions,
7
+ } from '@aria-ui/core'
8
+ import { usePresence } from '@aria-ui/presence'
9
+ import {
10
+ defineDropIndicator,
11
+ type ShowHandlerOptions,
12
+ } from '@prosekit/extensions/drop-indicator'
13
+
14
+ import { useEditorExtension } from '../../../hooks/use-editor-extension'
15
+ import { useScrolling } from '../../../hooks/use-scrolling'
16
+ import { assignStyles } from '../../../utils/assign-styles'
17
+
18
+ import type {
19
+ DropIndicatorEvents,
20
+ DropIndicatorProps,
21
+ } from './types'
22
+
23
+ /**
24
+ * @internal
25
+ */
26
+ export function useDropIndicator(
27
+ host: ConnectableElement,
28
+ { state }: SetupOptions<DropIndicatorProps, DropIndicatorEvents>,
29
+ ): void {
30
+ type DropIndicatorContext = ShowHandlerOptions | null
31
+ const context = createSignal<DropIndicatorContext>(null)
32
+
33
+ const extension = defineDropIndicator({
34
+ onShow: (options) => context.set(options),
35
+ onHide: () => context.set(null),
36
+ })
37
+
38
+ useEditorExtension(host, state.editor, extension)
39
+
40
+ const line = createComputed(() => context.get()?.line)
41
+ const scrolling = useScrolling(host)
42
+ const presence = createComputed(() => {
43
+ return !!context.get() && !scrolling.get()
44
+ })
45
+ usePresence(host, presence)
46
+
47
+ useEffect(
48
+ host,
49
+ () => {
50
+ const lineValue = line.get()
51
+ const lineWidth = state.width.get()
52
+
53
+ if (!lineValue) return
54
+
55
+ const { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } } = lineValue
56
+ const horizontal = y1 === y2
57
+
58
+ let width: number
59
+ let height: number
60
+ let top: number = y1
61
+ let left: number = x1
62
+
63
+ if (horizontal) {
64
+ width = x2 - x1
65
+ height = lineWidth
66
+ top -= lineWidth / 2
67
+ } else {
68
+ width = lineWidth
69
+ height = y2 - y1
70
+ left -= lineWidth / 2
71
+ }
72
+
73
+ top = Math.round(top)
74
+ left = Math.round(left)
75
+
76
+ assignStyles(host, {
77
+ position: 'fixed',
78
+ pointerEvents: 'none',
79
+ width: `${width}px`,
80
+ height: `${height}px`,
81
+ transform: `translate(${left}px, ${top}px)`,
82
+ left: '0px',
83
+ top: '0px',
84
+ })
85
+ },
86
+ )
87
+ }
@@ -0,0 +1,34 @@
1
+ import type {
2
+ EventDeclarations,
3
+ PropDeclarations,
4
+ } from '@aria-ui/core'
5
+ import type { Editor } from '@prosekit/core'
6
+
7
+ export interface DropIndicatorProps {
8
+ /**
9
+ * The ProseKit editor instance.
10
+ *
11
+ * @default null
12
+ * @hidden
13
+ */
14
+ editor: Editor | null
15
+
16
+ /**
17
+ * The line width in pixels.
18
+ *
19
+ * @default 2
20
+ */
21
+ width: number
22
+ }
23
+
24
+ /** @internal */
25
+ export const dropIndicatorProps: PropDeclarations<DropIndicatorProps> = Object.freeze({
26
+ editor: { default: null },
27
+ width: { default: 2 },
28
+ })
29
+
30
+ export interface DropIndicatorEvents {
31
+ }
32
+
33
+ /** @internal */
34
+ export const dropIndicatorEvents: EventDeclarations<DropIndicatorEvents> = {}
@@ -0,0 +1,5 @@
1
+ // This file is generated by packages/dev/src/gen-components.ts
2
+
3
+ export { DropIndicatorElement } from './drop-indicator/element.gen'
4
+ export { dropIndicatorEvents, dropIndicatorProps, type DropIndicatorEvents, type DropIndicatorProps } from './drop-indicator/types'
5
+ export { useDropIndicator } from './drop-indicator/setup'
@@ -0,0 +1,5 @@
1
+ // This file is generated by packages/dev/src/gen-components.ts
2
+
3
+ export { InlinePopoverElement } from './inline-popover/element.gen'
4
+ export { inlinePopoverEvents, inlinePopoverProps, type InlinePopoverEvents, type InlinePopoverProps } from './inline-popover/types'
5
+ export { useInlinePopover } from './inline-popover/setup'
@@ -0,0 +1,18 @@
1
+ import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
2
+
3
+ import { useInlinePopover } from "./setup"
4
+ import { inlinePopoverEvents, inlinePopoverProps, type InlinePopoverEvents, type InlinePopoverProps } from "./types"
5
+
6
+ const InlinePopoverElementBase: BaseElementConstructor<InlinePopoverProps> = defineCustomElement<
7
+ InlinePopoverProps,
8
+ InlinePopoverEvents
9
+ >({
10
+ props: inlinePopoverProps,
11
+ events: inlinePopoverEvents,
12
+ setup: useInlinePopover,
13
+ })
14
+ class InlinePopoverElement extends InlinePopoverElementBase {}
15
+
16
+ registerCustomElement('prosekit-inline-popover', InlinePopoverElement)
17
+
18
+ export { InlinePopoverElement }
@@ -0,0 +1,97 @@
1
+ import {
2
+ createComputed,
3
+ createSignal,
4
+ useAttribute,
5
+ useEffect,
6
+ type ConnectableElement,
7
+ type ReadonlySignal,
8
+ type SetupOptions,
9
+ } from '@aria-ui/core'
10
+ import { useOverlayPositionerState } from '@aria-ui/overlay/elements'
11
+ import { usePresence } from '@aria-ui/presence'
12
+ import type { ReferenceElement } from '@floating-ui/dom'
13
+ import type { Editor } from '@prosekit/core'
14
+
15
+ import { useEditorFocusChangeEvent } from '../../../hooks/use-editor-focus-event'
16
+ import { useEditorUpdateEvent } from '../../../hooks/use-editor-update-event'
17
+ import { useKeymap } from '../../../hooks/use-keymap'
18
+
19
+ import type {
20
+ InlinePopoverEvents,
21
+ InlinePopoverProps,
22
+ } from './types'
23
+ import { getVirtualSelectionElement } from './virtual-selection-element'
24
+
25
+ /**
26
+ * @internal
27
+ */
28
+ export function useInlinePopover(
29
+ host: ConnectableElement,
30
+ { state, emit }: SetupOptions<InlinePopoverProps, InlinePopoverEvents>,
31
+ ): void {
32
+ const { editor, defaultOpen, open, ...overlayState } = state
33
+
34
+ const reference = useInlinePopoverReference(host, editor)
35
+ const hasReference = createComputed(() => !!reference.get())
36
+
37
+ useEffect(host, () => {
38
+ const hasReferenceValue = hasReference.get()
39
+ const defaultOpenValue = defaultOpen.peek()
40
+ const openValue = open.peek()
41
+
42
+ if (defaultOpenValue || openValue) {
43
+ emit('openChange', hasReferenceValue)
44
+ }
45
+ })
46
+
47
+ useEffect(host, () => {
48
+ const hasReferenceValue = hasReference.get()
49
+ const defaultOpenValue = defaultOpen.peek()
50
+
51
+ if (hasReferenceValue && defaultOpenValue) {
52
+ open.set(true)
53
+ } else if (!hasReferenceValue) {
54
+ open.set(false)
55
+ }
56
+ })
57
+
58
+ useKeymap(host, editor, {
59
+ Escape: () => {
60
+ if (!state.dismissOnEscape.peek() || !open.peek()) {
61
+ return false
62
+ }
63
+ open.set(false)
64
+ emit('openChange', false)
65
+ return true
66
+ },
67
+ })
68
+
69
+ useOverlayPositionerState(host, overlayState, { reference })
70
+
71
+ useAttribute(host, 'data-state', () => (open.get() ? 'open' : 'closed'))
72
+ usePresence(host, open)
73
+ }
74
+
75
+ function useInlinePopoverReference(
76
+ host: ConnectableElement,
77
+ editor: ReadonlySignal<Editor | null>,
78
+ ) {
79
+ const reference = createSignal<ReferenceElement | null>(null)
80
+ let editorFocused = false
81
+
82
+ useEditorFocusChangeEvent(host, editor, (focus) => {
83
+ editorFocused = focus
84
+ })
85
+
86
+ useEditorUpdateEvent(host, editor, (view) => {
87
+ const isPopoverFocused = !editorFocused && host.contains(host.ownerDocument.activeElement)
88
+
89
+ if (isPopoverFocused) {
90
+ return
91
+ }
92
+
93
+ reference.set(getVirtualSelectionElement(view) || null)
94
+ })
95
+
96
+ return reference
97
+ }
@@ -0,0 +1,115 @@
1
+ import type {
2
+ EventDeclarations,
3
+ PropDeclarations,
4
+ } from '@aria-ui/core'
5
+ import {
6
+ overlayPositionerEvents,
7
+ overlayPositionerProps,
8
+ type OverlayPositionerEvents,
9
+ type OverlayPositionerProps,
10
+ } from '@aria-ui/overlay'
11
+ import type { Editor } from '@prosekit/core'
12
+
13
+ export interface InlinePopoverProps extends
14
+ Omit<
15
+ OverlayPositionerProps,
16
+ 'placement' | 'offset' | 'hide' | 'overlap' | 'inline' | 'overflowPadding'
17
+ >
18
+ {
19
+ /**
20
+ * The ProseKit editor instance.
21
+ *
22
+ * @default null
23
+ * @hidden
24
+ */
25
+ editor: Editor | null
26
+
27
+ /**
28
+ * Whether the popover is open by default when some inline content is
29
+ * selected.
30
+ *
31
+ * When `defaultOpen` is true, the popover will open or close based on the
32
+ * inline selection. When `defaultOpen` is false, the popover will never be
33
+ * opened unless the `open` prop is true.
34
+ *
35
+ * @default true
36
+ */
37
+ defaultOpen: boolean
38
+
39
+ /**
40
+ * Whether the popover is open.
41
+ *
42
+ * Notice that the popover will be always hidden if the inline selection is
43
+ * empty.
44
+ *
45
+ * @default false
46
+ */
47
+ open: boolean
48
+
49
+ /**
50
+ * Whether the inline popover should be dismissed when the editor receives an
51
+ * Escape key press.
52
+ *
53
+ * @default true
54
+ */
55
+ dismissOnEscape: boolean
56
+
57
+ /**
58
+ * @default "top"
59
+ */
60
+ placement: OverlayPositionerProps['placement']
61
+
62
+ /**
63
+ * @default 12
64
+ */
65
+ offset: OverlayPositionerProps['offset']
66
+
67
+ /**
68
+ * @default true
69
+ */
70
+ hide: OverlayPositionerProps['hide']
71
+
72
+ /**
73
+ * @default true
74
+ */
75
+ overlap: OverlayPositionerProps['overlap']
76
+
77
+ /**
78
+ * @default true
79
+ */
80
+ inline: OverlayPositionerProps['inline']
81
+
82
+ /**
83
+ * @default 8
84
+ */
85
+ overflowPadding: OverlayPositionerProps['overflowPadding']
86
+ }
87
+
88
+ /** @internal */
89
+ export const inlinePopoverProps: PropDeclarations<InlinePopoverProps> = Object.freeze({
90
+ ...overlayPositionerProps,
91
+ editor: { default: null },
92
+ defaultOpen: { default: true },
93
+ open: { default: false },
94
+ dismissOnEscape: { default: true },
95
+
96
+ placement: { default: 'top' },
97
+ offset: { default: 12 },
98
+ hide: { default: true },
99
+ overlap: { default: true },
100
+ inline: { default: true },
101
+ overflowPadding: { default: 8 },
102
+ })
103
+
104
+ export interface InlinePopoverEvents extends OverlayPositionerEvents {
105
+ /**
106
+ * Fired when the open state changes.
107
+ */
108
+ openChange: CustomEvent<boolean>
109
+ }
110
+
111
+ /** @internal */
112
+ export const inlinePopoverEvents: EventDeclarations<InlinePopoverEvents> = {
113
+ ...overlayPositionerEvents,
114
+ openChange: {},
115
+ }
@@ -0,0 +1,75 @@
1
+ import type { ReferenceElement } from '@floating-ui/dom'
2
+ import {
3
+ containsInlineNode,
4
+ isInCodeBlock,
5
+ isTextSelection,
6
+ } from '@prosekit/core'
7
+ import type { EditorView } from '@prosekit/pm/view'
8
+
9
+ export function getVirtualSelectionElement(
10
+ view: EditorView,
11
+ ): ReferenceElement | undefined {
12
+ if (typeof window === 'undefined' || view.isDestroyed) {
13
+ return
14
+ }
15
+
16
+ const selection = view.state.selection
17
+
18
+ if (
19
+ !selection.empty
20
+ && !isInCodeBlock(selection)
21
+ && isTextSelection(selection)
22
+ && containsInlineNode(view.state.doc, selection.from, selection.to)
23
+ ) {
24
+ return getDomDecoration(view) || getInlineDecoration(view)
25
+ }
26
+ }
27
+
28
+ function getDomDecoration(view: EditorView): ReferenceElement | undefined {
29
+ const range = getDomRange(view)
30
+ if (range) {
31
+ // To get it work properly in Safari, we cannot return the range directly.
32
+ // We have to return a contextElement.
33
+ return {
34
+ contextElement: view.dom,
35
+ getBoundingClientRect: () => range.getBoundingClientRect(),
36
+ getClientRects: () => range.getClientRects(),
37
+ }
38
+ }
39
+ }
40
+
41
+ function getDomRange(view: EditorView): Range | undefined {
42
+ const win = view.dom.ownerDocument.defaultView
43
+ const selection = win?.getSelection()
44
+ if (!selection || selection.isCollapsed) {
45
+ return
46
+ }
47
+
48
+ const range = typeof selection.rangeCount === 'number'
49
+ && selection.rangeCount > 0
50
+ && selection.getRangeAt(0)
51
+
52
+ if (!range) {
53
+ return
54
+ }
55
+
56
+ return range
57
+ }
58
+
59
+ function getInlineDecoration(view: EditorView): ReferenceElement | undefined {
60
+ const match = view.dom.querySelectorAll('.prosekit-virtual-selection')
61
+
62
+ if (match.length === 0) {
63
+ return
64
+ }
65
+ if (match.length === 1) {
66
+ return match[0]
67
+ }
68
+
69
+ const items = Array.from(match)
70
+ return {
71
+ contextElement: items[0],
72
+ getBoundingClientRect: () => items[0].getBoundingClientRect(),
73
+ getClientRects: () => items.map((item) => item.getBoundingClientRect()),
74
+ }
75
+ }
@@ -0,0 +1,13 @@
1
+ // This file is generated by packages/dev/src/gen-components.ts
2
+
3
+ export { PopoverContentElement } from './popover-content/element.gen'
4
+ export { popoverContentEvents, popoverContentProps, type PopoverContentEvents, type PopoverContentProps } from './popover-content/types'
5
+ export { usePopoverContent } from './popover-content/setup'
6
+
7
+ export { PopoverRootElement } from './popover-root/element.gen'
8
+ export { popoverRootEvents, popoverRootProps, type PopoverRootEvents, type PopoverRootProps } from './popover-root/types'
9
+ export { usePopoverRoot } from './popover-root/setup'
10
+
11
+ export { PopoverTriggerElement } from './popover-trigger/element.gen'
12
+ export { popoverTriggerEvents, popoverTriggerProps, type PopoverTriggerEvents, type PopoverTriggerProps } from './popover-trigger/types'
13
+ export { usePopoverTrigger } from './popover-trigger/setup'
@@ -0,0 +1,18 @@
1
+ import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
2
+
3
+ import { usePopoverContent } from "./setup"
4
+ import { popoverContentEvents, popoverContentProps, type PopoverContentEvents, type PopoverContentProps } from "./types"
5
+
6
+ const PopoverContentElementBase: BaseElementConstructor<PopoverContentProps> = defineCustomElement<
7
+ PopoverContentProps,
8
+ PopoverContentEvents
9
+ >({
10
+ props: popoverContentProps,
11
+ events: popoverContentEvents,
12
+ setup: usePopoverContent,
13
+ })
14
+ class PopoverContentElement extends PopoverContentElementBase {}
15
+
16
+ registerCustomElement('prosekit-popover-content', PopoverContentElement)
17
+
18
+ export { PopoverContentElement }
@@ -0,0 +1 @@
1
+ export { usePopoverContent } from '@aria-ui/popover/elements'
@@ -0,0 +1,12 @@
1
+ import type {
2
+ PopoverContentEvents as Events,
3
+ PopoverContentProps as Props,
4
+ } from '@aria-ui/popover/elements'
5
+
6
+ export {
7
+ popoverContentEvents,
8
+ popoverContentProps,
9
+ } from '@aria-ui/popover/elements'
10
+
11
+ export interface PopoverContentProps extends Props {}
12
+ export interface PopoverContentEvents extends Events {}
@@ -0,0 +1,18 @@
1
+ import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
2
+
3
+ import { usePopoverRoot } from "./setup"
4
+ import { popoverRootEvents, popoverRootProps, type PopoverRootEvents, type PopoverRootProps } from "./types"
5
+
6
+ const PopoverRootElementBase: BaseElementConstructor<PopoverRootProps> = defineCustomElement<
7
+ PopoverRootProps,
8
+ PopoverRootEvents
9
+ >({
10
+ props: popoverRootProps,
11
+ events: popoverRootEvents,
12
+ setup: usePopoverRoot,
13
+ })
14
+ class PopoverRootElement extends PopoverRootElementBase {}
15
+
16
+ registerCustomElement('prosekit-popover-root', PopoverRootElement)
17
+
18
+ export { PopoverRootElement }
@@ -0,0 +1 @@
1
+ export { usePopoverRoot } from '@aria-ui/popover/elements'
@@ -0,0 +1,12 @@
1
+ import type {
2
+ PopoverRootEvents as Events,
3
+ PopoverRootProps as Props,
4
+ } from '@aria-ui/popover/elements'
5
+
6
+ export {
7
+ popoverRootEvents,
8
+ popoverRootProps,
9
+ } from '@aria-ui/popover/elements'
10
+
11
+ export interface PopoverRootProps extends Props {}
12
+ export interface PopoverRootEvents extends Events {}
@@ -0,0 +1,18 @@
1
+ import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
2
+
3
+ import { usePopoverTrigger } from "./setup"
4
+ import { popoverTriggerEvents, popoverTriggerProps, type PopoverTriggerEvents, type PopoverTriggerProps } from "./types"
5
+
6
+ const PopoverTriggerElementBase: BaseElementConstructor<PopoverTriggerProps> = defineCustomElement<
7
+ PopoverTriggerProps,
8
+ PopoverTriggerEvents
9
+ >({
10
+ props: popoverTriggerProps,
11
+ events: popoverTriggerEvents,
12
+ setup: usePopoverTrigger,
13
+ })
14
+ class PopoverTriggerElement extends PopoverTriggerElementBase {}
15
+
16
+ registerCustomElement('prosekit-popover-trigger', PopoverTriggerElement)
17
+
18
+ export { PopoverTriggerElement }
@@ -0,0 +1 @@
1
+ export { usePopoverTrigger } from '@aria-ui/popover/elements'
@@ -0,0 +1,12 @@
1
+ import type {
2
+ PopoverTriggerEvents as Events,
3
+ PopoverTriggerProps as Props,
4
+ } from '@aria-ui/popover/elements'
5
+
6
+ export {
7
+ popoverTriggerEvents,
8
+ popoverTriggerProps,
9
+ } from '@aria-ui/popover/elements'
10
+
11
+ export interface PopoverTriggerProps extends Props {}
12
+ export interface PopoverTriggerEvents extends Events {}
@@ -0,0 +1,45 @@
1
+ import {
2
+ createContext,
3
+ type Context,
4
+ } from '@aria-ui/core'
5
+
6
+ /**
7
+ * @internal
8
+ */
9
+ export const onResizeContext: Context<OnResize> = createContext(
10
+ 'prosekit/resizable/onResize',
11
+ null,
12
+ )
13
+
14
+ /**
15
+ * @internal
16
+ */
17
+ export const onResizeStartContext: Context<OnResizeStart> = createContext(
18
+ 'prosekit/resizable/onResizeStart',
19
+ null,
20
+ )
21
+
22
+ /**
23
+ * @internal
24
+ */
25
+ export const onResizeEndContext: Context<OnResizeEnd> = createContext(
26
+ 'prosekit/resizable/onResizeEnd',
27
+ null,
28
+ )
29
+
30
+ /**
31
+ * @internal
32
+ */
33
+ export type OnResize = ((width: number, height: number) => void) | null
34
+
35
+ /**
36
+ * @internal
37
+ */
38
+ export type OnResizeStart =
39
+ | (() => readonly [width: number, height: number, aspectRatio: number])
40
+ | null
41
+
42
+ /**
43
+ * @internal
44
+ */
45
+ export type OnResizeEnd = (() => void) | null