@prosekit/web 0.8.0-beta.0 → 0.8.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/dist/prosekit-web-autocomplete.d.ts +112 -90
  2. package/dist/prosekit-web-autocomplete.d.ts.map +1 -1
  3. package/dist/prosekit-web-autocomplete.js +292 -217
  4. package/dist/prosekit-web-autocomplete.js.map +1 -1
  5. package/dist/prosekit-web-block-handle.d.ts +95 -62
  6. package/dist/prosekit-web-block-handle.d.ts.map +1 -1
  7. package/dist/prosekit-web-block-handle.js +219 -114
  8. package/dist/prosekit-web-block-handle.js.map +1 -1
  9. package/dist/prosekit-web-drop-indicator.d.ts +13 -15
  10. package/dist/prosekit-web-drop-indicator.d.ts.map +1 -1
  11. package/dist/prosekit-web-drop-indicator.js +34 -30
  12. package/dist/prosekit-web-drop-indicator.js.map +1 -1
  13. package/dist/prosekit-web-inline-popover.d.ts +88 -54
  14. package/dist/prosekit-web-inline-popover.d.ts.map +1 -1
  15. package/dist/prosekit-web-inline-popover.js +129 -79
  16. package/dist/prosekit-web-inline-popover.js.map +1 -1
  17. package/dist/prosekit-web-menu.d.ts +13 -0
  18. package/dist/prosekit-web-menu.d.ts.map +1 -0
  19. package/dist/prosekit-web-menu.js +53 -0
  20. package/dist/prosekit-web-menu.js.map +1 -0
  21. package/dist/prosekit-web-popover.d.ts +7 -26
  22. package/dist/prosekit-web-popover.d.ts.map +1 -1
  23. package/dist/prosekit-web-popover.js +31 -29
  24. package/dist/prosekit-web-popover.js.map +1 -1
  25. package/dist/prosekit-web-resizable.d.ts +92 -51
  26. package/dist/prosekit-web-resizable.d.ts.map +1 -1
  27. package/dist/prosekit-web-resizable.js +139 -131
  28. package/dist/prosekit-web-resizable.js.map +1 -1
  29. package/dist/prosekit-web-table-handle.d.ts +166 -199
  30. package/dist/prosekit-web-table-handle.d.ts.map +1 -1
  31. package/dist/prosekit-web-table-handle.js +495 -496
  32. package/dist/prosekit-web-table-handle.js.map +1 -1
  33. package/dist/prosekit-web-tooltip.d.ts +7 -26
  34. package/dist/prosekit-web-tooltip.d.ts.map +1 -1
  35. package/dist/prosekit-web-tooltip.js +31 -29
  36. package/dist/prosekit-web-tooltip.js.map +1 -1
  37. package/dist/use-editor-extension.js +2 -2
  38. package/dist/use-editor-extension.js.map +1 -1
  39. package/dist/use-scrolling.js +17 -8
  40. package/dist/use-scrolling.js.map +1 -1
  41. package/package.json +28 -23
  42. package/src/components/autocomplete/autocomplete-empty.ts +45 -0
  43. package/src/components/autocomplete/autocomplete-item.ts +65 -0
  44. package/src/components/autocomplete/autocomplete-popup.ts +95 -0
  45. package/src/components/autocomplete/autocomplete-positioner.ts +98 -0
  46. package/src/components/autocomplete/autocomplete-root.ts +280 -0
  47. package/src/components/autocomplete/context.ts +16 -14
  48. package/src/components/autocomplete/index.ts +65 -0
  49. package/src/components/block-handle/block-handle-add.ts +71 -0
  50. package/src/components/block-handle/block-handle-draggable.ts +158 -0
  51. package/src/components/block-handle/block-handle-popup.ts +43 -0
  52. package/src/components/block-handle/block-handle-positioner.ts +89 -0
  53. package/src/components/block-handle/block-handle-root.ts +116 -0
  54. package/src/components/block-handle/context.ts +9 -18
  55. package/src/components/block-handle/hover-state.ts +16 -0
  56. package/src/components/block-handle/index.ts +59 -0
  57. package/src/components/block-handle/{block-handle-popover/pointer-move.ts → pointer-move.ts} +8 -7
  58. package/src/components/block-handle/{block-handle-draggable/set-drag-preview.ts → set-drag-preview.ts} +4 -4
  59. package/src/components/block-handle/use-hover-extension.ts +65 -0
  60. package/src/components/drop-indicator/drop-indicator.ts +128 -0
  61. package/src/components/drop-indicator/index.ts +18 -0
  62. package/src/components/inline-popover/index.ts +41 -0
  63. package/src/components/inline-popover/inline-popover-popup.ts +52 -0
  64. package/src/components/inline-popover/inline-popover-positioner.ts +98 -0
  65. package/src/components/inline-popover/inline-popover-root.ts +122 -0
  66. package/src/components/inline-popover/store.ts +6 -0
  67. package/src/components/menu/index.ts +92 -0
  68. package/src/components/popover/index.ts +53 -0
  69. package/src/components/resizable/{resizable-handle/calc-resize.ts → calc-resize.ts} +1 -1
  70. package/src/components/resizable/context.ts +3 -6
  71. package/src/components/resizable/index.ts +32 -0
  72. package/src/components/resizable/resizable-handle.ts +134 -0
  73. package/src/components/resizable/resizable-root.ts +184 -0
  74. package/src/components/table-handle/dnd.ts +16 -27
  75. package/src/components/table-handle/index.ts +125 -0
  76. package/src/components/table-handle/{table-handle-drag-preview/render-preview.ts → render-preview.ts} +5 -5
  77. package/src/components/table-handle/shared.ts +61 -0
  78. package/src/components/table-handle/store.ts +117 -0
  79. package/src/components/table-handle/table-handle-column-menu-root.ts +51 -0
  80. package/src/components/table-handle/table-handle-column-menu-trigger.ts +107 -0
  81. package/src/components/table-handle/table-handle-column-popup.ts +44 -0
  82. package/src/components/table-handle/table-handle-column-positioner.ts +67 -0
  83. package/src/components/table-handle/table-handle-drag-preview.ts +169 -0
  84. package/src/components/table-handle/table-handle-drop-indicator.ts +166 -0
  85. package/src/components/table-handle/table-handle-root.ts +103 -0
  86. package/src/components/table-handle/table-handle-row-menu-root.ts +51 -0
  87. package/src/components/table-handle/table-handle-row-menu-trigger.ts +107 -0
  88. package/src/components/table-handle/table-handle-row-popup.ts +42 -0
  89. package/src/components/table-handle/table-handle-row-positioner.ts +67 -0
  90. package/src/components/table-handle/use-drop.ts +74 -0
  91. package/src/components/table-handle/{hooks/use-empty-image.ts → use-empty-image.ts} +2 -3
  92. package/src/components/table-handle/utils.ts +0 -11
  93. package/src/components/tooltip/index.ts +52 -0
  94. package/src/hooks/use-editor-extension.ts +4 -4
  95. package/src/hooks/use-editor-focus-event.ts +4 -4
  96. package/src/hooks/use-editor-typing.ts +12 -16
  97. package/src/hooks/use-editor-update-event.ts +4 -4
  98. package/src/hooks/use-keymap.ts +4 -4
  99. package/src/hooks/use-scrolling.ts +11 -10
  100. package/src/hooks/use-selecting.ts +8 -15
  101. package/src/utils/event.ts +28 -0
  102. package/src/utils/lazy-signal.spec.ts +68 -0
  103. package/src/utils/lazy-signal.ts +17 -0
  104. package/src/utils/prefers-reduced-motion.ts +6 -0
  105. package/src/utils/prevent-default.ts +3 -0
  106. package/src/utils/use-html-element-at.ts +17 -0
  107. package/src/utils/use-no-focus.ts +7 -0
  108. package/dist/get-default-state.js +0 -11
  109. package/dist/get-default-state.js.map +0 -1
  110. package/src/components/autocomplete/autocomplete-empty/element.gen.ts +0 -18
  111. package/src/components/autocomplete/autocomplete-empty/setup.ts +0 -6
  112. package/src/components/autocomplete/autocomplete-empty/types.ts +0 -13
  113. package/src/components/autocomplete/autocomplete-item/element.gen.ts +0 -18
  114. package/src/components/autocomplete/autocomplete-item/setup.ts +0 -30
  115. package/src/components/autocomplete/autocomplete-item/types.ts +0 -25
  116. package/src/components/autocomplete/autocomplete-list/element.gen.ts +0 -18
  117. package/src/components/autocomplete/autocomplete-list/setup.ts +0 -125
  118. package/src/components/autocomplete/autocomplete-list/types.ts +0 -22
  119. package/src/components/autocomplete/autocomplete-popover/element.gen.ts +0 -18
  120. package/src/components/autocomplete/autocomplete-popover/setup.ts +0 -169
  121. package/src/components/autocomplete/autocomplete-popover/types.ts +0 -100
  122. package/src/components/autocomplete/index.gen.ts +0 -17
  123. package/src/components/block-handle/block-handle-add/element.gen.ts +0 -18
  124. package/src/components/block-handle/block-handle-add/setup.ts +0 -33
  125. package/src/components/block-handle/block-handle-add/types.ts +0 -23
  126. package/src/components/block-handle/block-handle-draggable/element.gen.ts +0 -18
  127. package/src/components/block-handle/block-handle-draggable/setup.ts +0 -113
  128. package/src/components/block-handle/block-handle-draggable/types.ts +0 -23
  129. package/src/components/block-handle/block-handle-popover/element.gen.ts +0 -18
  130. package/src/components/block-handle/block-handle-popover/setup.ts +0 -68
  131. package/src/components/block-handle/block-handle-popover/types.ts +0 -81
  132. package/src/components/block-handle/index.gen.ts +0 -13
  133. package/src/components/drop-indicator/drop-indicator/element.gen.ts +0 -18
  134. package/src/components/drop-indicator/drop-indicator/setup.ts +0 -75
  135. package/src/components/drop-indicator/drop-indicator/types.ts +0 -31
  136. package/src/components/drop-indicator/index.gen.ts +0 -5
  137. package/src/components/inline-popover/index.gen.ts +0 -5
  138. package/src/components/inline-popover/inline-popover/element.gen.ts +0 -18
  139. package/src/components/inline-popover/inline-popover/setup.ts +0 -111
  140. package/src/components/inline-popover/inline-popover/types.ts +0 -112
  141. package/src/components/popover/index.gen.ts +0 -13
  142. package/src/components/popover/popover-content/element.gen.ts +0 -18
  143. package/src/components/popover/popover-content/setup.ts +0 -1
  144. package/src/components/popover/popover-content/types.ts +0 -6
  145. package/src/components/popover/popover-root/element.gen.ts +0 -18
  146. package/src/components/popover/popover-root/setup.ts +0 -1
  147. package/src/components/popover/popover-root/types.ts +0 -6
  148. package/src/components/popover/popover-trigger/element.gen.ts +0 -18
  149. package/src/components/popover/popover-trigger/setup.ts +0 -1
  150. package/src/components/popover/popover-trigger/types.ts +0 -6
  151. package/src/components/resizable/index.gen.ts +0 -9
  152. package/src/components/resizable/resizable-handle/element.gen.ts +0 -18
  153. package/src/components/resizable/resizable-handle/setup.ts +0 -106
  154. package/src/components/resizable/resizable-handle/types.ts +0 -29
  155. package/src/components/resizable/resizable-root/element.gen.ts +0 -18
  156. package/src/components/resizable/resizable-root/setup.ts +0 -84
  157. package/src/components/resizable/resizable-root/types.ts +0 -59
  158. package/src/components/table-handle/context.ts +0 -43
  159. package/src/components/table-handle/hooks/use-drop.ts +0 -85
  160. package/src/components/table-handle/index.gen.ts +0 -37
  161. package/src/components/table-handle/table-handle-column-root/element.gen.ts +0 -18
  162. package/src/components/table-handle/table-handle-column-root/setup.ts +0 -60
  163. package/src/components/table-handle/table-handle-column-root/types.ts +0 -73
  164. package/src/components/table-handle/table-handle-column-trigger/element.gen.ts +0 -18
  165. package/src/components/table-handle/table-handle-column-trigger/setup.ts +0 -64
  166. package/src/components/table-handle/table-handle-column-trigger/types.ts +0 -20
  167. package/src/components/table-handle/table-handle-drag-preview/element.gen.ts +0 -18
  168. package/src/components/table-handle/table-handle-drag-preview/setup.ts +0 -57
  169. package/src/components/table-handle/table-handle-drag-preview/types.ts +0 -14
  170. package/src/components/table-handle/table-handle-drag-preview/updater.ts +0 -90
  171. package/src/components/table-handle/table-handle-drop-indicator/element.gen.ts +0 -18
  172. package/src/components/table-handle/table-handle-drop-indicator/setup.ts +0 -52
  173. package/src/components/table-handle/table-handle-drop-indicator/types.ts +0 -15
  174. package/src/components/table-handle/table-handle-drop-indicator/updater.ts +0 -96
  175. package/src/components/table-handle/table-handle-popover-content/element.gen.ts +0 -18
  176. package/src/components/table-handle/table-handle-popover-content/setup.ts +0 -83
  177. package/src/components/table-handle/table-handle-popover-content/types.ts +0 -32
  178. package/src/components/table-handle/table-handle-popover-item/element.gen.ts +0 -18
  179. package/src/components/table-handle/table-handle-popover-item/setup.ts +0 -17
  180. package/src/components/table-handle/table-handle-popover-item/types.ts +0 -16
  181. package/src/components/table-handle/table-handle-root/element.gen.ts +0 -18
  182. package/src/components/table-handle/table-handle-root/setup.ts +0 -86
  183. package/src/components/table-handle/table-handle-root/types.ts +0 -23
  184. package/src/components/table-handle/table-handle-row-root/element.gen.ts +0 -18
  185. package/src/components/table-handle/table-handle-row-root/setup.ts +0 -70
  186. package/src/components/table-handle/table-handle-row-root/types.ts +0 -68
  187. package/src/components/table-handle/table-handle-row-trigger/element.gen.ts +0 -18
  188. package/src/components/table-handle/table-handle-row-trigger/setup.ts +0 -63
  189. package/src/components/table-handle/table-handle-row-trigger/types.ts +0 -23
  190. package/src/components/tooltip/index.gen.ts +0 -13
  191. package/src/components/tooltip/tooltip-content/element.gen.ts +0 -18
  192. package/src/components/tooltip/tooltip-content/setup.ts +0 -1
  193. package/src/components/tooltip/tooltip-content/types.ts +0 -6
  194. package/src/components/tooltip/tooltip-root/element.gen.ts +0 -18
  195. package/src/components/tooltip/tooltip-root/setup.ts +0 -1
  196. package/src/components/tooltip/tooltip-root/types.ts +0 -6
  197. package/src/components/tooltip/tooltip-trigger/element.gen.ts +0 -18
  198. package/src/components/tooltip/tooltip-trigger/setup.ts +0 -1
  199. package/src/components/tooltip/tooltip-trigger/types.ts +0 -6
  200. package/src/hooks/use-first-rendering.ts +0 -15
  201. package/src/utils/get-default-state.spec.ts +0 -42
  202. package/src/utils/get-default-state.ts +0 -18
  203. /package/src/components/autocomplete/{autocomplete-popover/helpers.spec.ts → helpers.spec.ts} +0 -0
  204. /package/src/components/autocomplete/{autocomplete-popover/helpers.ts → helpers.ts} +0 -0
  205. /package/src/components/inline-popover/{inline-popover/virtual-selection-element.ts → virtual-selection-element.ts} +0 -0
  206. /package/src/components/resizable/{resizable-handle/calc-resize.spec.ts → calc-resize.spec.ts} +0 -0
  207. /package/src/components/table-handle/{table-handle-drop-indicator/calc-drag-over.ts → calc-drag-over.ts} +0 -0
@@ -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
+ }
@@ -0,0 +1,184 @@
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 { useAttribute } from '@aria-ui/utils'
4
+
5
+ import { isFinitePositiveNumber } from '../../utils/is-finite-positive-number.ts'
6
+
7
+ import {
8
+ onResizeContext,
9
+ onResizeEndContext,
10
+ onResizeStartContext,
11
+ type OnResize,
12
+ type OnResizeEnd,
13
+ type OnResizeStart,
14
+ } from './context.ts'
15
+
16
+ /**
17
+ * @public
18
+ */
19
+ export interface ResizableRootProps {
20
+ /**
21
+ * The width of the resizable element.
22
+ *
23
+ * @default null
24
+ */
25
+ width: number | null
26
+
27
+ /**
28
+ * The height of the resizable element.
29
+ *
30
+ * @default null
31
+ */
32
+ height: number | null
33
+
34
+ /**
35
+ * The aspect ratio of the resizable element.
36
+ *
37
+ * @default null
38
+ */
39
+ aspectRatio: number | null
40
+ }
41
+
42
+ /**
43
+ * @internal
44
+ */
45
+ export const ResizableRootPropsDeclaration: PropsDeclaration<ResizableRootProps> = defineProps<ResizableRootProps>({
46
+ width: { default: null, attribute: 'data-width', type: 'json' },
47
+ height: { default: null, attribute: 'data-height', type: 'json' },
48
+ aspectRatio: { default: null, attribute: 'data-aspect-ratio', type: 'json' },
49
+ })
50
+
51
+ /**
52
+ * @public
53
+ */
54
+ export interface ResizableRootEvents {
55
+ /**
56
+ * Emitted when a resize operation starts.
57
+ */
58
+ resizeStart: ResizeStartEvent
59
+
60
+ /**
61
+ * Emitted when a resize operation ends.
62
+ */
63
+ resizeEnd: ResizeEndEvent
64
+ }
65
+
66
+ /**
67
+ * @public
68
+ */
69
+ export class ResizeStartEvent extends Event {
70
+ readonly detail: {
71
+ readonly width: number
72
+ readonly height: number
73
+ }
74
+ constructor(width: number, height: number) {
75
+ super('resizeStart')
76
+ this.detail = { width, height }
77
+ }
78
+ }
79
+
80
+ /**
81
+ * @public
82
+ */
83
+ export class ResizeEndEvent extends Event {
84
+ readonly detail: {
85
+ readonly width: number
86
+ readonly height: number
87
+ }
88
+ constructor(width: number, height: number) {
89
+ super('resizeEnd')
90
+ this.detail = { width, height }
91
+ }
92
+ }
93
+
94
+ /**
95
+ * @internal
96
+ */
97
+ export function setupResizableRoot(
98
+ host: HostElement,
99
+ props: State<ResizableRootProps>,
100
+ ): void {
101
+ const resizing = createSignal(false)
102
+
103
+ const onResizeStart: OnResizeStart = () => {
104
+ const { width, height } = host.getBoundingClientRect()
105
+
106
+ let aspectRatio: number = props.aspectRatio.get() ?? width / height
107
+
108
+ if (!isFinitePositiveNumber(aspectRatio)) {
109
+ aspectRatio = 0
110
+ }
111
+
112
+ resizing.set(true)
113
+ host.dispatchEvent(new ResizeStartEvent(width, height))
114
+ return [width, height, aspectRatio]
115
+ }
116
+
117
+ const onResize: OnResize = (width, height) => {
118
+ props.width.set(width)
119
+ props.height.set(height)
120
+ }
121
+
122
+ const onResizeEnd: OnResizeEnd = () => {
123
+ const { width, height } = host.getBoundingClientRect()
124
+ resizing.set(false)
125
+ host.dispatchEvent(new ResizeEndEvent(width, height))
126
+ }
127
+
128
+ onResizeStartContext.provide(host, onResizeStart)
129
+ onResizeContext.provide(host, onResize)
130
+ onResizeEndContext.provide(host, onResizeEnd)
131
+
132
+ useEffect(host, () => {
133
+ updateResizableRootStyles(
134
+ host,
135
+ Math.max(props.width.get() || 0, 1),
136
+ Math.max(props.height.get() || 0, 1),
137
+ props.aspectRatio.get(),
138
+ )
139
+ })
140
+
141
+ useAttribute(host, 'data-resizing', () => (resizing.get() ? '' : undefined))
142
+ }
143
+
144
+ function updateResizableRootStyles(
145
+ host: HostElement,
146
+ width: number,
147
+ height: number,
148
+ aspectRatio: number | null,
149
+ ) {
150
+ host.style.width = isFinitePositiveNumber(width) ? `${width}px` : ''
151
+
152
+ host.style.height = isFinitePositiveNumber(height) ? `${height}px` : ''
153
+
154
+ if (isFinitePositiveNumber(aspectRatio)) {
155
+ host.style.aspectRatio = `${aspectRatio}`
156
+
157
+ if (width && width > 0 && aspectRatio >= 1) {
158
+ host.style.height = 'auto'
159
+ } else if (height && height > 0 && aspectRatio <= 1) {
160
+ host.style.width = 'min-content'
161
+ }
162
+ }
163
+ }
164
+
165
+ const ResizableRootElementBase: HostElementConstructor<ResizableRootProps> = defineCustomElement(
166
+ setupResizableRoot,
167
+ ResizableRootPropsDeclaration,
168
+ )
169
+
170
+ /**
171
+ * @public
172
+ */
173
+ export class ResizableRootElement extends ResizableRootElementBase {}
174
+
175
+ let isResizableRootRegistered = false
176
+
177
+ /**
178
+ * @internal
179
+ */
180
+ export function registerResizableRootElement(): void {
181
+ if (isResizableRootRegistered) return
182
+ isResizableRootRegistered = true
183
+ registerCustomElement('prosekit-resizable-root', ResizableRootElement)
184
+ }
@@ -1,4 +1,4 @@
1
- import { createComputed, useEffect, type ConnectableElement, type ReadonlySignal } from '@aria-ui/core'
1
+ import { useEffect, type HostElement } from '@aria-ui/core'
2
2
  import { computePosition, offset } from '@floating-ui/dom'
3
3
  import { isHTMLElement } from '@ocavue/utils'
4
4
  import type { Editor } from '@prosekit/core'
@@ -7,10 +7,10 @@ import type { EditorView } from '@prosekit/pm/view'
7
7
  import { assignStyles } from '../../utils/assign-styles.ts'
8
8
  import { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'
9
9
 
10
- import { tableHandleDndContext, tableHandleRootContext } from './context.ts'
10
+ import { tableHandleStoreContext } from './store.ts'
11
11
 
12
12
  export type OnInitParams = {
13
- host: ConnectableElement
13
+ host: HostElement
14
14
  direction: 'row' | 'col'
15
15
  dragging: boolean
16
16
  draggingIndex: number
@@ -19,41 +19,30 @@ export type OnInitParams = {
19
19
  }
20
20
 
21
21
  export function useInitDndPosition(
22
- host: ConnectableElement,
23
- editor: ReadonlySignal<Editor | null>,
22
+ host: HostElement,
23
+ getEditor: () => Editor | null,
24
24
  onInit: (params: OnInitParams) => void,
25
25
  ): void {
26
- const dndContext = tableHandleDndContext.consume(host)
27
- const rootContext = tableHandleRootContext.consume(host)
28
-
29
- const draggingSignal = createComputed(() => {
30
- const context = dndContext.get()
31
- return context.dragging
32
- })
33
-
34
- const directionSignal = createComputed(() => {
35
- const context = dndContext.get()
36
- return context.direction
37
- })
38
-
39
- const draggingIndexSignal = createComputed(() => {
40
- const context = dndContext.get()
41
- return context.draggingIndex
42
- })
26
+ const getStore = tableHandleStoreContext.consume(host)
43
27
 
44
28
  useEffect(host, () => {
45
- const view = getSafeEditorView(editor.get())
29
+ const view = getSafeEditorView(getEditor())
46
30
  if (!view) return
47
31
 
48
- const dragging = draggingSignal.get()
49
- const direction = directionSignal.get()
32
+ const store = getStore()
33
+ if (!store) return
34
+
35
+ const dndStore = store.dndStore
36
+
37
+ const dragging = dndStore.dragging.get()
38
+ const direction = dndStore.direction.get()
50
39
 
51
40
  host.dataset.direction = direction
52
41
  host.dataset.dragging = dragging.toString()
53
42
 
54
- const draggingIndex = draggingIndexSignal.get()
43
+ const draggingIndex = dndStore.draggingIndex.get()
55
44
 
56
- const relatedDOMs = getDndRelatedDOMs(view, rootContext.peek()?.cellPos, draggingIndex, direction)
45
+ const relatedDOMs = getDndRelatedDOMs(view, store.getReferenceCell()?.cellPos, draggingIndex, direction)
57
46
  if (!relatedDOMs) return
58
47
  const { table, cell } = relatedDOMs
59
48
 
@@ -0,0 +1,125 @@
1
+ /**
2
+
3
+ @module
4
+
5
+ ## Anatomy
6
+
7
+ ```html
8
+ <prosekit-table-handle-root>
9
+ <prosekit-table-handle-drag-preview></prosekit-table-handle-drag-preview>
10
+ <prosekit-table-handle-drop-indicator></prosekit-table-handle-drop-indicator>
11
+ <prosekit-table-handle-column-positioner>
12
+ <prosekit-table-handle-column-popup>
13
+ <prosekit-table-handle-column-menu-root>
14
+ <prosekit-table-handle-column-menu-trigger>...</prosekit-table-handle-column-menu-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-table-handle-column-menu-root>
21
+ </prosekit-table-handle-column-popup>
22
+ </prosekit-table-handle-column-positioner>
23
+ <prosekit-table-handle-row-positioner>
24
+ <prosekit-table-handle-row-popup>
25
+ <prosekit-table-handle-row-menu-root>
26
+ <prosekit-table-handle-row-menu-trigger>...</prosekit-table-handle-row-menu-trigger>
27
+ <prosekit-menu-positioner>
28
+ <prosekit-menu-popup>
29
+ <prosekit-menu-item>...</prosekit-menu-item>
30
+ </prosekit-menu-popup>
31
+ </prosekit-menu-positioner>
32
+ </prosekit-table-handle-row-menu-root>
33
+ </prosekit-table-handle-row-popup>
34
+ </prosekit-table-handle-row-positioner>
35
+ </prosekit-table-handle-root>
36
+ ```
37
+ */
38
+
39
+ export {
40
+ registerTableHandleColumnPopupElement,
41
+ setupTableHandleColumnPopup,
42
+ TableHandleColumnPopupElement,
43
+ TableHandleColumnPopupPropsDeclaration,
44
+ type TableHandleColumnPopupProps,
45
+ } from './table-handle-column-popup.ts'
46
+
47
+ export {
48
+ registerTableHandleColumnPositionerElement,
49
+ setupTableHandleColumnPositioner,
50
+ TableHandleColumnPositionerElement,
51
+ TableHandleColumnPositionerPropsDeclaration,
52
+ type TableHandleColumnPositionerProps,
53
+ } from './table-handle-column-positioner.ts'
54
+
55
+ export {
56
+ registerTableHandleColumnMenuRootElement,
57
+ setupTableHandleColumnMenuRoot,
58
+ TableHandleColumnMenuRootElement,
59
+ TableHandleColumnMenuRootPropsDeclaration,
60
+ type TableHandleColumnMenuRootProps,
61
+ } from './table-handle-column-menu-root.ts'
62
+
63
+ export {
64
+ registerTableHandleColumnMenuTriggerElement,
65
+ setupTableHandleColumnMenuTrigger,
66
+ TableHandleColumnMenuTriggerElement,
67
+ TableHandleColumnMenuTriggerPropsDeclaration,
68
+ type TableHandleColumnMenuTriggerProps,
69
+ } from './table-handle-column-menu-trigger.ts'
70
+
71
+ export {
72
+ registerTableHandleDragPreviewElement,
73
+ setupTableHandleDragPreview,
74
+ TableHandleDragPreviewElement,
75
+ TableHandleDragPreviewPropsDeclaration,
76
+ type TableHandleDragPreviewProps,
77
+ } from './table-handle-drag-preview.ts'
78
+
79
+ export {
80
+ registerTableHandleDropIndicatorElement,
81
+ setupTableHandleDropIndicator,
82
+ TableHandleDropIndicatorElement,
83
+ TableHandleDropIndicatorPropsDeclaration,
84
+ type TableHandleDropIndicatorProps,
85
+ } from './table-handle-drop-indicator.ts'
86
+
87
+ export {
88
+ registerTableHandleRootElement,
89
+ setupTableHandleRoot,
90
+ TableHandleRootElement,
91
+ TableHandleRootPropsDeclaration,
92
+ type TableHandleRootProps,
93
+ } from './table-handle-root.ts'
94
+
95
+ export {
96
+ registerTableHandleRowPopupElement,
97
+ setupTableHandleRowPopup,
98
+ TableHandleRowPopupElement,
99
+ TableHandleRowPopupPropsDeclaration,
100
+ type TableHandleRowPopupProps,
101
+ } from './table-handle-row-popup.ts'
102
+
103
+ export {
104
+ registerTableHandleRowPositionerElement,
105
+ setupTableHandleRowPositioner,
106
+ TableHandleRowPositionerElement,
107
+ TableHandleRowPositionerPropsDeclaration,
108
+ type TableHandleRowPositionerProps,
109
+ } from './table-handle-row-positioner.ts'
110
+
111
+ export {
112
+ registerTableHandleRowMenuRootElement,
113
+ setupTableHandleRowMenuRoot,
114
+ TableHandleRowMenuRootElement,
115
+ TableHandleRowMenuRootPropsDeclaration,
116
+ type TableHandleRowMenuRootProps,
117
+ } from './table-handle-row-menu-root.ts'
118
+
119
+ export {
120
+ registerTableHandleRowMenuTriggerElement,
121
+ setupTableHandleRowMenuTrigger,
122
+ TableHandleRowMenuTriggerElement,
123
+ TableHandleRowMenuTriggerPropsDeclaration,
124
+ type TableHandleRowMenuTriggerProps,
125
+ } from './table-handle-row-menu-trigger.ts'
@@ -1,8 +1,8 @@
1
- import { assignStyles } from '../../../utils/assign-styles.ts'
2
- import { cloneElement, deepCloneElement } from '../../../utils/clone-element.ts'
3
- import { fadeColor } from '../../../utils/fade-color.ts'
4
- import { getEffectiveBackgroundColor } from '../../../utils/get-effective-background-color.ts'
5
- import { injectStyle } from '../../../utils/inject-style.ts'
1
+ import { assignStyles } from '../../utils/assign-styles.ts'
2
+ import { cloneElement, deepCloneElement } from '../../utils/clone-element.ts'
3
+ import { fadeColor } from '../../utils/fade-color.ts'
4
+ import { getEffectiveBackgroundColor } from '../../utils/get-effective-background-color.ts'
5
+ import { injectStyle } from '../../utils/inject-style.ts'
6
6
 
7
7
  export function clearPreviewDOM(previewRoot: HTMLElement): void {
8
8
  while (previewRoot.firstChild) {