@dou-ui/editor 0.0.0-stage → 0.1.0-alpha.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 (324) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/dist/catalog.js +18 -0
  4. package/dist/catalog.js.map +1 -0
  5. package/dist/code/code-editor-block.js +6 -0
  6. package/dist/code/code-editor-block.js.map +1 -0
  7. package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js +116 -0
  8. package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  9. package/dist/code/index.js +69 -0
  10. package/dist/code/index.js.map +1 -0
  11. package/dist/code/languages.js +51 -0
  12. package/dist/code/languages.js.map +1 -0
  13. package/dist/code/view.js +255 -0
  14. package/dist/code/view.js.map +1 -0
  15. package/dist/collaboration/binding.js +381 -0
  16. package/dist/collaboration/binding.js.map +1 -0
  17. package/dist/collaboration/cursors.js +150 -0
  18. package/dist/collaboration/cursors.js.map +1 -0
  19. package/dist/collaboration/index.js +108 -0
  20. package/dist/collaboration/index.js.map +1 -0
  21. package/dist/collaboration/order.js +88 -0
  22. package/dist/collaboration/order.js.map +1 -0
  23. package/dist/collaboration/table.js +234 -0
  24. package/dist/collaboration/table.js.map +1 -0
  25. package/dist/collaboration/text.js +91 -0
  26. package/dist/collaboration/text.js.map +1 -0
  27. package/dist/components/block-handle.js +6 -0
  28. package/dist/components/block-handle.js.map +1 -0
  29. package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js +474 -0
  30. package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js.map +1 -0
  31. package/dist/components/bubble-toolbar.js +6 -0
  32. package/dist/components/bubble-toolbar.js.map +1 -0
  33. package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js +381 -0
  34. package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  35. package/dist/components/comment-button.js +6 -0
  36. package/dist/components/comment-button.js.map +1 -0
  37. package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js +83 -0
  38. package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js.map +1 -0
  39. package/dist/components/comment-card.js +6 -0
  40. package/dist/components/comment-card.js.map +1 -0
  41. package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js +104 -0
  42. package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js.map +1 -0
  43. package/dist/components/menu-escape.js +25 -0
  44. package/dist/components/menu-escape.js.map +1 -0
  45. package/dist/components/search-bar.js +6 -0
  46. package/dist/components/search-bar.js.map +1 -0
  47. package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js +192 -0
  48. package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  49. package/dist/components/slash-menu.js +6 -0
  50. package/dist/components/slash-menu.js.map +1 -0
  51. package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js +164 -0
  52. package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/core/align.js +94 -0
  54. package/dist/core/align.js.map +1 -0
  55. package/dist/core/block-selection.js +155 -0
  56. package/dist/core/block-selection.js.map +1 -0
  57. package/dist/core/blocks.js +132 -0
  58. package/dist/core/blocks.js.map +1 -0
  59. package/dist/core/changes.js +85 -0
  60. package/dist/core/changes.js.map +1 -0
  61. package/dist/core/colors.js +16 -0
  62. package/dist/core/colors.js.map +1 -0
  63. package/dist/core/commands.js +379 -0
  64. package/dist/core/commands.js.map +1 -0
  65. package/dist/core/comments.js +186 -0
  66. package/dist/core/comments.js.map +1 -0
  67. package/dist/core/compare.js +106 -0
  68. package/dist/core/compare.js.map +1 -0
  69. package/dist/core/convert.js +28 -0
  70. package/dist/core/convert.js.map +1 -0
  71. package/dist/core/diff.js +141 -0
  72. package/dist/core/diff.js.map +1 -0
  73. package/dist/core/editor.js +138 -0
  74. package/dist/core/editor.js.map +1 -0
  75. package/dist/core/extension.js +99 -0
  76. package/dist/core/extension.js.map +1 -0
  77. package/dist/core/file-drop.js +56 -0
  78. package/dist/core/file-drop.js.map +1 -0
  79. package/dist/core/highlight.js +120 -0
  80. package/dist/core/highlight.js.map +1 -0
  81. package/dist/core/input-rules.js +61 -0
  82. package/dist/core/input-rules.js.map +1 -0
  83. package/dist/core/keymap.js +38 -0
  84. package/dist/core/keymap.js.map +1 -0
  85. package/dist/core/model.js +196 -0
  86. package/dist/core/model.js.map +1 -0
  87. package/dist/core/output.js +263 -0
  88. package/dist/core/output.js.map +1 -0
  89. package/dist/core/plugins.js +102 -0
  90. package/dist/core/plugins.js.map +1 -0
  91. package/dist/core/prepare.js +102 -0
  92. package/dist/core/prepare.js.map +1 -0
  93. package/dist/core/schema.js +158 -0
  94. package/dist/core/schema.js.map +1 -0
  95. package/dist/core/search.js +197 -0
  96. package/dist/core/search.js.map +1 -0
  97. package/dist/core/selection.js +16 -0
  98. package/dist/core/selection.js.map +1 -0
  99. package/dist/core/slash.js +83 -0
  100. package/dist/core/slash.js.map +1 -0
  101. package/dist/core/transaction.js +311 -0
  102. package/dist/core/transaction.js.map +1 -0
  103. package/dist/define-block.js +177 -0
  104. package/dist/define-block.js.map +1 -0
  105. package/dist/document.js +157 -0
  106. package/dist/document.js.map +1 -0
  107. package/dist/dom.js +48 -0
  108. package/dist/dom.js.map +1 -0
  109. package/dist/editor.js +33 -0
  110. package/dist/editor.js.map +1 -0
  111. package/dist/editor.vue_vue_type_script_setup_true_lang.js +564 -0
  112. package/dist/editor.vue_vue_type_script_setup_true_lang.js.map +1 -0
  113. package/dist/editor2.js +6 -0
  114. package/dist/editor2.js.map +1 -0
  115. package/dist/extensions/align/align-menu.js +6 -0
  116. package/dist/extensions/align/align-menu.js.map +1 -0
  117. package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js +82 -0
  118. package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  119. package/dist/extensions/align/align-sub.js +6 -0
  120. package/dist/extensions/align/align-sub.js.map +1 -0
  121. package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js +57 -0
  122. package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js.map +1 -0
  123. package/dist/extensions/align/commands.js +40 -0
  124. package/dist/extensions/align/commands.js.map +1 -0
  125. package/dist/extensions/align/index.js +27 -0
  126. package/dist/extensions/align/index.js.map +1 -0
  127. package/dist/extensions/attachment/attachment-block.js +6 -0
  128. package/dist/extensions/attachment/attachment-block.js.map +1 -0
  129. package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js +119 -0
  130. package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  131. package/dist/extensions/attachment/files.js +66 -0
  132. package/dist/extensions/attachment/files.js.map +1 -0
  133. package/dist/extensions/attachment/index.js +132 -0
  134. package/dist/extensions/attachment/index.js.map +1 -0
  135. package/dist/extensions/blocks.js +170 -0
  136. package/dist/extensions/blocks.js.map +1 -0
  137. package/dist/extensions/callout/callout-block.js +6 -0
  138. package/dist/extensions/callout/callout-block.js.map +1 -0
  139. package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js +71 -0
  140. package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  141. package/dist/extensions/callout/html.js +61 -0
  142. package/dist/extensions/callout/html.js.map +1 -0
  143. package/dist/extensions/callout/index.js +52 -0
  144. package/dist/extensions/callout/index.js.map +1 -0
  145. package/dist/extensions/callout/tones.js +12 -0
  146. package/dist/extensions/callout/tones.js.map +1 -0
  147. package/dist/extensions/code-block/code-block-view.js +6 -0
  148. package/dist/extensions/code-block/code-block-view.js.map +1 -0
  149. package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js +87 -0
  150. package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js.map +1 -0
  151. package/dist/extensions/code-block/index.js +98 -0
  152. package/dist/extensions/code-block/index.js.map +1 -0
  153. package/dist/extensions/code-block/languages.js +116 -0
  154. package/dist/extensions/code-block/languages.js.map +1 -0
  155. package/dist/extensions/colors/color-menu.js +6 -0
  156. package/dist/extensions/colors/color-menu.js.map +1 -0
  157. package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js +113 -0
  158. package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  159. package/dist/extensions/colors/index.js +49 -0
  160. package/dist/extensions/colors/index.js.map +1 -0
  161. package/dist/extensions/colors/palette.js +26 -0
  162. package/dist/extensions/colors/palette.js.map +1 -0
  163. package/dist/extensions/editor-kit.js +35 -0
  164. package/dist/extensions/editor-kit.js.map +1 -0
  165. package/dist/extensions/embed/embed-block.js +6 -0
  166. package/dist/extensions/embed/embed-block.js.map +1 -0
  167. package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js +210 -0
  168. package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  169. package/dist/extensions/embed/index.js +118 -0
  170. package/dist/extensions/embed/index.js.map +1 -0
  171. package/dist/extensions/embed/targets.js +79 -0
  172. package/dist/extensions/embed/targets.js.map +1 -0
  173. package/dist/extensions/formatting.js +153 -0
  174. package/dist/extensions/formatting.js.map +1 -0
  175. package/dist/extensions/image/image-block.js +6 -0
  176. package/dist/extensions/image/image-block.js.map +1 -0
  177. package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js +206 -0
  178. package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  179. package/dist/extensions/image/index.js +125 -0
  180. package/dist/extensions/image/index.js.map +1 -0
  181. package/dist/extensions/image/uploads.js +96 -0
  182. package/dist/extensions/image/uploads.js.map +1 -0
  183. package/dist/extensions/list-html.js +58 -0
  184. package/dist/extensions/list-html.js.map +1 -0
  185. package/dist/extensions/lists.js +182 -0
  186. package/dist/extensions/lists.js.map +1 -0
  187. package/dist/extensions/mention/index.js +56 -0
  188. package/dist/extensions/mention/index.js.map +1 -0
  189. package/dist/extensions/mention/mention-menu.js +6 -0
  190. package/dist/extensions/mention/mention-menu.js.map +1 -0
  191. package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js +132 -0
  192. package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  193. package/dist/extensions/mention/state.js +113 -0
  194. package/dist/extensions/mention/state.js.map +1 -0
  195. package/dist/extensions/table/commands.js +356 -0
  196. package/dist/extensions/table/commands.js.map +1 -0
  197. package/dist/extensions/table/html.js +134 -0
  198. package/dist/extensions/table/html.js.map +1 -0
  199. package/dist/extensions/table/index.js +56 -0
  200. package/dist/extensions/table/index.js.map +1 -0
  201. package/dist/extensions/table/plugin.js +81 -0
  202. package/dist/extensions/table/plugin.js.map +1 -0
  203. package/dist/extensions/table/schema.js +258 -0
  204. package/dist/extensions/table/schema.js.map +1 -0
  205. package/dist/extensions/table/table-controls.js +6 -0
  206. package/dist/extensions/table/table-controls.js.map +1 -0
  207. package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js +698 -0
  208. package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js.map +1 -0
  209. package/dist/extensions/table/view.js +19 -0
  210. package/dist/extensions/table/view.js.map +1 -0
  211. package/dist/extensions/toggle/index.js +87 -0
  212. package/dist/extensions/toggle/index.js.map +1 -0
  213. package/dist/extensions/toggle/state.js +120 -0
  214. package/dist/extensions/toggle/state.js.map +1 -0
  215. package/dist/extensions/toggle/toggle-block.js +6 -0
  216. package/dist/extensions/toggle/toggle-block.js.map +1 -0
  217. package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js +42 -0
  218. package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  219. package/dist/index.js +49 -0
  220. package/dist/index.js.map +1 -0
  221. package/dist/locale.js +522 -0
  222. package/dist/locale.js.map +1 -0
  223. package/dist/markdown/index.js +24 -0
  224. package/dist/markdown/index.js.map +1 -0
  225. package/dist/style.css +1 -0
  226. package/dist/style.d.ts +1 -0
  227. package/dist/style.js +8 -0
  228. package/dist/types/catalog.d.ts +8 -0
  229. package/dist/types/code/code-editor-block.vue.d.ts +17 -0
  230. package/dist/types/code/index.d.ts +18 -0
  231. package/dist/types/code/languages.d.ts +7 -0
  232. package/dist/types/code/types.d.ts +37 -0
  233. package/dist/types/code/view.d.ts +12 -0
  234. package/dist/types/collaboration/binding.d.ts +32 -0
  235. package/dist/types/collaboration/cursors.d.ts +26 -0
  236. package/dist/types/collaboration/index.d.ts +47 -0
  237. package/dist/types/collaboration/order.d.ts +20 -0
  238. package/dist/types/collaboration/table.d.ts +25 -0
  239. package/dist/types/collaboration/text.d.ts +9 -0
  240. package/dist/types/components/block-handle.vue.d.ts +3 -0
  241. package/dist/types/components/bubble-toolbar.vue.d.ts +7 -0
  242. package/dist/types/components/comment-button.vue.d.ts +3 -0
  243. package/dist/types/components/comment-card.vue.d.ts +3 -0
  244. package/dist/types/components/menu-escape.d.ts +7 -0
  245. package/dist/types/components/search-bar.vue.d.ts +22 -0
  246. package/dist/types/components/slash-menu.vue.d.ts +11 -0
  247. package/dist/types/core/align.d.ts +16 -0
  248. package/dist/types/core/block-selection.d.ts +22 -0
  249. package/dist/types/core/blocks.d.ts +52 -0
  250. package/dist/types/core/changes.d.ts +14 -0
  251. package/dist/types/core/colors.d.ts +4 -0
  252. package/dist/types/core/commands.d.ts +61 -0
  253. package/dist/types/core/comments.d.ts +44 -0
  254. package/dist/types/core/compare.d.ts +10 -0
  255. package/dist/types/core/convert.d.ts +12 -0
  256. package/dist/types/core/diff.d.ts +49 -0
  257. package/dist/types/core/editor.d.ts +64 -0
  258. package/dist/types/core/extension.d.ts +167 -0
  259. package/dist/types/core/file-drop.d.ts +19 -0
  260. package/dist/types/core/highlight.d.ts +32 -0
  261. package/dist/types/core/input-rules.d.ts +21 -0
  262. package/dist/types/core/keymap.d.ts +8 -0
  263. package/dist/types/core/model.d.ts +158 -0
  264. package/dist/types/core/output.d.ts +64 -0
  265. package/dist/types/core/plugins.d.ts +24 -0
  266. package/dist/types/core/prepare.d.ts +23 -0
  267. package/dist/types/core/schema.d.ts +38 -0
  268. package/dist/types/core/search.d.ts +83 -0
  269. package/dist/types/core/selection.d.ts +8 -0
  270. package/dist/types/core/slash.d.ts +21 -0
  271. package/dist/types/core/transaction.d.ts +97 -0
  272. package/dist/types/define-block.d.ts +66 -0
  273. package/dist/types/document.d.ts +46 -0
  274. package/dist/types/dom.d.ts +17 -0
  275. package/dist/types/editor.d.ts +252 -0
  276. package/dist/types/editor.vue.d.ts +210 -0
  277. package/dist/types/extensions/align/align-menu.vue.d.ts +3 -0
  278. package/dist/types/extensions/align/align-sub.vue.d.ts +7 -0
  279. package/dist/types/extensions/align/commands.d.ts +13 -0
  280. package/dist/types/extensions/align/index.d.ts +7 -0
  281. package/dist/types/extensions/attachment/attachment-block.vue.d.ts +17 -0
  282. package/dist/types/extensions/attachment/files.d.ts +6 -0
  283. package/dist/types/extensions/attachment/index.d.ts +20 -0
  284. package/dist/types/extensions/blocks.d.ts +8 -0
  285. package/dist/types/extensions/callout/callout-block.vue.d.ts +14 -0
  286. package/dist/types/extensions/callout/html.d.ts +4 -0
  287. package/dist/types/extensions/callout/index.d.ts +3 -0
  288. package/dist/types/extensions/callout/tones.d.ts +8 -0
  289. package/dist/types/extensions/code-block/code-block-view.vue.d.ts +16 -0
  290. package/dist/types/extensions/code-block/index.d.ts +19 -0
  291. package/dist/types/extensions/code-block/languages.d.ts +9 -0
  292. package/dist/types/extensions/colors/color-menu.vue.d.ts +3 -0
  293. package/dist/types/extensions/colors/index.d.ts +7 -0
  294. package/dist/types/extensions/colors/palette.d.ts +7 -0
  295. package/dist/types/extensions/editor-kit.d.ts +37 -0
  296. package/dist/types/extensions/embed/embed-block.vue.d.ts +16 -0
  297. package/dist/types/extensions/embed/index.d.ts +18 -0
  298. package/dist/types/extensions/embed/targets.d.ts +32 -0
  299. package/dist/types/extensions/formatting.d.ts +8 -0
  300. package/dist/types/extensions/image/image-block.vue.d.ts +16 -0
  301. package/dist/types/extensions/image/index.d.ts +16 -0
  302. package/dist/types/extensions/image/uploads.d.ts +35 -0
  303. package/dist/types/extensions/list-html.d.ts +11 -0
  304. package/dist/types/extensions/lists.d.ts +6 -0
  305. package/dist/types/extensions/mention/index.d.ts +11 -0
  306. package/dist/types/extensions/mention/mention-menu.vue.d.ts +7 -0
  307. package/dist/types/extensions/mention/state.d.ts +28 -0
  308. package/dist/types/extensions/table/commands.d.ts +69 -0
  309. package/dist/types/extensions/table/html.d.ts +4 -0
  310. package/dist/types/extensions/table/index.d.ts +8 -0
  311. package/dist/types/extensions/table/plugin.d.ts +4 -0
  312. package/dist/types/extensions/table/schema.d.ts +23 -0
  313. package/dist/types/extensions/table/table-controls.vue.d.ts +3 -0
  314. package/dist/types/extensions/table/view.d.ts +13 -0
  315. package/dist/types/extensions/toggle/index.d.ts +7 -0
  316. package/dist/types/extensions/toggle/state.d.ts +17 -0
  317. package/dist/types/extensions/toggle/toggle-block.vue.d.ts +14 -0
  318. package/dist/types/index.d.ts +266 -0
  319. package/dist/types/locale.d.ts +195 -0
  320. package/dist/types/markdown/index.d.ts +14 -0
  321. package/dist/types/use-comments.d.ts +17 -0
  322. package/dist/use-comments.js +141 -0
  323. package/dist/use-comments.js.map +1 -0
  324. package/package.json +98 -4
@@ -0,0 +1,698 @@
1
+ import { createId } from "../../core/model.js";
2
+ import { useEditor } from "../../editor.js";
3
+ import { useMenuEscape } from "../../components/menu-escape.js";
4
+ import { fitColumns } from "./schema.js";
5
+ import { alignColumns, band, boundaries, clearCells, deleteColumns, deleteRows, inMergedCell, insertColumn, insertRow, mergeCells, moveLines, moveLinesTo, selectLines, splitMergedCell, tableAt, toggleHeader } from "./commands.js";
6
+ import { DouDropdown, DouDropdownItem, DouDropdownSub } from "dou-ui";
7
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, renderList, resolveDynamicComponent, shallowRef, toDisplayString, unref, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
8
+ import { TextSelection } from "prosemirror-state";
9
+ import { ArrowDownFromLineIcon, ArrowDownIcon, ArrowLeftIcon, ArrowLeftToLineIcon, ArrowRightIcon, ArrowRightToLineIcon, ArrowUpIcon, ArrowUpToLineIcon, CheckIcon, EraserIcon, GripHorizontalIcon, GripVerticalIcon, LayoutColumnsIcon, LayoutRowsIcon, MergeIcon, PlusIcon, SplitIcon, TextAlignCenterIcon, TextAlignLeftIcon, TextAlignRightIcon, TrashIcon } from "@dou-ui/icons";
10
+ import { CellSelection, TableMap, addColumn, addRow } from "prosemirror-tables";
11
+ // src/extensions/table/table-controls.vue?vue&type=script&setup=true&lang.ts
12
+ var _hoisted_1 = ["aria-label", "title"];
13
+ var _hoisted_2 = ["aria-label", "title"];
14
+ var _hoisted_3 = ["aria-label", "title"];
15
+ var _hoisted_4 = ["aria-label", "title"];
16
+ var _hoisted_5 = ["disabled"];
17
+ var _hoisted_6 = ["aria-label", "title"];
18
+ var table_controls_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
19
+ __name: "table-controls",
20
+ setup(__props) {
21
+ const { view, state, root, messages } = useEditor();
22
+ /** The table and the cell the controls are about: the hovered one, or the selection's. */
23
+ const hovered = shallowRef(null);
24
+ const columnMenu = shallowRef(false);
25
+ const rowMenu = shallowRef(false);
26
+ const menuOpen = computed(() => columnMenu.value || rowMenu.value);
27
+ useMenuEscape(menuOpen, () => {
28
+ columnMenu.value = false;
29
+ rowMenu.value = false;
30
+ });
31
+ const barShown = computed(() => !!layout.value?.bar && !menuOpen.value && !dragging.value);
32
+ const handlesHidden = computed(() => barShown.value && hasCellSelection.value);
33
+ function targetOf(cell) {
34
+ const current = view.value;
35
+ if (!current || !current.dom.contains(cell)) return null;
36
+ const $pos = current.state.doc.resolve(current.posAtDOM(cell, 0));
37
+ const found = tableAt($pos);
38
+ if (!found) return null;
39
+ for (let depth = $pos.depth; depth > 0; depth--) {
40
+ const role = $pos.node(depth).type.spec.tableRole;
41
+ if (role === "cell" || role === "header_cell") {
42
+ const cellPos = $pos.before(depth) - found.pos - 1;
43
+ return {
44
+ pos: found.pos,
45
+ rect: found.map.findCell(cellPos)
46
+ };
47
+ }
48
+ }
49
+ return null;
50
+ }
51
+ /** The selection's cell when the pointer is elsewhere. */
52
+ const selected = computed(() => {
53
+ const current = state.value;
54
+ if (!current) return null;
55
+ const selection = current.selection;
56
+ const $cell = selection instanceof CellSelection ? selection.$headCell : null;
57
+ const found = tableAt(selection.$head);
58
+ if (!found) return null;
59
+ const start = found.pos + 1;
60
+ if ($cell) return {
61
+ pos: found.pos,
62
+ rect: found.map.findCell($cell.pos - start)
63
+ };
64
+ for (let depth = selection.$head.depth; depth > 0; depth--) {
65
+ const role = selection.$head.node(depth).type.spec.tableRole;
66
+ if (role === "cell" || role === "header_cell") return {
67
+ pos: found.pos,
68
+ rect: found.map.findCell(selection.$head.before(depth) - start)
69
+ };
70
+ }
71
+ return null;
72
+ });
73
+ const target = computed(() => hovered.value ?? selected.value);
74
+ const layout = shallowRef(null);
75
+ function cellElement(tablePos, row, col) {
76
+ const current = view.value;
77
+ const table = current?.state.doc.nodeAt(tablePos);
78
+ if (!current || !table) return null;
79
+ const map = TableMap.get(table);
80
+ if (row >= map.height || col >= map.width) return null;
81
+ const pos = tablePos + 1 + map.map[row * map.width + col];
82
+ return current.nodeDOM(pos);
83
+ }
84
+ function measure() {
85
+ const current = view.value;
86
+ const host = root.value;
87
+ const at = target.value;
88
+ if (!current || !host || !at) return layout.value = null;
89
+ const tableNode = current.state.doc.nodeAt(at.pos);
90
+ const frameElement = current.nodeDOM(at.pos);
91
+ const tableElement = frameElement?.querySelector("table");
92
+ if (!tableNode || !frameElement || !tableElement) return layout.value = null;
93
+ const box = host.getBoundingClientRect();
94
+ const tableBox = tableElement.getBoundingClientRect();
95
+ const frameBox = frameElement.getBoundingClientRect();
96
+ const first = cellElement(at.pos, at.rect.top, at.rect.left)?.getBoundingClientRect();
97
+ if (!first) return layout.value = null;
98
+ let bar = null;
99
+ const boxes = barCells(current).map((pos) => current.nodeDOM(pos).getBoundingClientRect());
100
+ if (boxes.length) {
101
+ const left = Math.max(Math.min(...boxes.map((item) => item.left)), frameBox.left);
102
+ const right = Math.min(Math.max(...boxes.map((item) => item.right)), frameBox.right);
103
+ const below = !(current.state.selection instanceof CellSelection);
104
+ bar = {
105
+ top: below ? Math.max(...boxes.map((item) => item.bottom)) - box.top : Math.min(...boxes.map((item) => item.top)) - box.top,
106
+ left: (left + right) / 2 - box.left,
107
+ below
108
+ };
109
+ }
110
+ layout.value = {
111
+ table: {
112
+ top: tableBox.top - box.top,
113
+ left: tableBox.left - box.left,
114
+ width: tableBox.width,
115
+ height: tableBox.height
116
+ },
117
+ frame: {
118
+ left: frameBox.left - box.left,
119
+ right: frameBox.right - box.left
120
+ },
121
+ column: {
122
+ left: first.left - box.left,
123
+ width: first.width
124
+ },
125
+ row: {
126
+ top: first.top - box.top,
127
+ height: first.height
128
+ },
129
+ bar
130
+ };
131
+ }
132
+ /** The cells the toolbar is about: a cell selection's corners, or the merged cell with the cursor. */
133
+ function barCells(current) {
134
+ const selection = current.state.selection;
135
+ if (selection instanceof CellSelection) return selection.$anchorCell.pos === selection.$headCell.pos ? [] : [selection.$anchorCell.pos, selection.$headCell.pos];
136
+ if (!inMergedCell(current.state)) return [];
137
+ const $head = selection.$head;
138
+ for (let depth = $head.depth; depth > 0; depth--) {
139
+ const role = $head.node(depth).type.spec.tableRole;
140
+ if (role === "cell" || role === "header_cell") return [$head.before(depth)];
141
+ }
142
+ return [];
143
+ }
144
+ let frame = 0;
145
+ let lastTarget = null;
146
+ function schedule() {
147
+ if (frame) return;
148
+ frame = requestAnimationFrame(() => {
149
+ frame = 0;
150
+ if (!menuOpen.value && !dragging.value) {
151
+ const element = lastTarget instanceof Element ? lastTarget : null;
152
+ const cell = element?.closest(".dou-editor-table td, .dou-editor-table th");
153
+ const inControls = element?.closest(".dou-editor-table-controls");
154
+ if (cell) hovered.value = targetOf(cell);
155
+ else if (!inControls) hovered.value = null;
156
+ }
157
+ measure();
158
+ });
159
+ }
160
+ function track(event) {
161
+ if (event.pointerType === "touch") return;
162
+ lastTarget = event.target;
163
+ schedule();
164
+ }
165
+ function leave() {
166
+ if (menuOpen.value || dragging.value) return;
167
+ lastTarget = null;
168
+ hovered.value = null;
169
+ schedule();
170
+ }
171
+ const onScroll = () => schedule();
172
+ onMounted(() => {
173
+ root.value?.addEventListener("pointermove", track);
174
+ root.value?.addEventListener("pointerleave", leave);
175
+ window.addEventListener("scroll", onScroll, true);
176
+ window.addEventListener("resize", onScroll);
177
+ });
178
+ onBeforeUnmount(() => {
179
+ root.value?.removeEventListener("pointermove", track);
180
+ root.value?.removeEventListener("pointerleave", leave);
181
+ window.removeEventListener("scroll", onScroll, true);
182
+ window.removeEventListener("resize", onScroll);
183
+ if (frame) cancelAnimationFrame(frame);
184
+ endDrag(false);
185
+ });
186
+ watch([state, target], () => schedule());
187
+ function run(command) {
188
+ const current = view.value;
189
+ if (!current) return;
190
+ command(current.state, current.dispatch);
191
+ current.focus();
192
+ }
193
+ function openMenu(axis, pressed) {
194
+ const current = view.value;
195
+ if (!current) return;
196
+ current.dispatch(selectLines(current.state.tr, pressed.tablePos, axis, pressed.start, pressed.end));
197
+ rowMenu.value = axis === "row";
198
+ columnMenu.value = axis === "column";
199
+ }
200
+ /**
201
+ * Whole lines are selected to show what a menu or a drag is about; after
202
+ * it, the cursor goes into their first cell so the handles come back.
203
+ */
204
+ function collapseLines() {
205
+ const current = view.value;
206
+ const selection = current?.state.selection;
207
+ if (!current || !(selection instanceof CellSelection)) return;
208
+ if (!selection.isRowSelection() && !selection.isColSelection()) return;
209
+ const $cell = current.state.doc.resolve(selection.$anchorCell.pos + 1);
210
+ current.dispatch(current.state.tr.setSelection(TextSelection.near($cell)));
211
+ }
212
+ watch(menuOpen, (open) => {
213
+ if (open) return;
214
+ collapseLines();
215
+ schedule();
216
+ });
217
+ const can = (command) => {
218
+ const current = state.value;
219
+ return !!current && command(current);
220
+ };
221
+ const tableNode = computed(() => {
222
+ const at = target.value;
223
+ return at ? state.value?.doc.nodeAt(at.pos) ?? null : null;
224
+ });
225
+ const columnAlign = computed(() => {
226
+ const node = tableNode.value;
227
+ const at = target.value;
228
+ if (!node || !at) return "left";
229
+ return fitColumns(node.attrs.columns, TableMap.get(node).width)[at.rect.left]?.align ?? "left";
230
+ });
231
+ const aligns = [
232
+ {
233
+ value: "left",
234
+ icon: TextAlignLeftIcon,
235
+ label: () => messages.value.table.alignLeft
236
+ },
237
+ {
238
+ value: "center",
239
+ icon: TextAlignCenterIcon,
240
+ label: () => messages.value.table.alignCenter
241
+ },
242
+ {
243
+ value: "right",
244
+ icon: TextAlignRightIcon,
245
+ label: () => messages.value.table.alignRight
246
+ }
247
+ ];
248
+ /** The + bars: a column at the right end, a row at the bottom. */
249
+ function addAtEnd(axis) {
250
+ const current = view.value;
251
+ const at = target.value;
252
+ if (!current || !at) return;
253
+ const table = current.state.doc.nodeAt(at.pos);
254
+ const map = TableMap.get(table);
255
+ const rect = {
256
+ left: 0,
257
+ top: 0,
258
+ right: map.width,
259
+ bottom: map.height,
260
+ map,
261
+ table,
262
+ tableStart: at.pos + 1
263
+ };
264
+ let tr = current.state.tr;
265
+ if (axis === "row") tr = addRow(tr, rect, map.height);
266
+ else {
267
+ const columns = fitColumns(table.attrs.columns, map.width);
268
+ columns.push({ id: createId() });
269
+ tr = addColumn(tr, rect, map.width).setNodeAttribute(at.pos, "columns", columns);
270
+ }
271
+ current.dispatch(tr);
272
+ }
273
+ let drag = null;
274
+ const dragging = shallowRef(false);
275
+ const drop = shallowRef(null);
276
+ /** A copy of the dragged lines that follows the pointer. */
277
+ let ghost = null;
278
+ function onHandleDown(axis, event) {
279
+ const current = view.value;
280
+ const at = target.value;
281
+ if (event.button !== 0 || !current || !at || !current.editable) return;
282
+ const map = TableMap.get(current.state.doc.nodeAt(at.pos));
283
+ const [from, to] = axis === "row" ? [at.rect.top, at.rect.bottom] : [at.rect.left, at.rect.right];
284
+ const lines = band(map, axis, from, to);
285
+ drag = {
286
+ axis,
287
+ tablePos: at.pos,
288
+ ...lines,
289
+ x: event.clientX,
290
+ y: event.clientY,
291
+ to: null
292
+ };
293
+ window.addEventListener("pointermove", onDragMove);
294
+ window.addEventListener("pointerup", onDragUp);
295
+ window.addEventListener("pointercancel", onDragCancel);
296
+ }
297
+ /** Each boundary a run can go to, and where it is (relative to the editor). */
298
+ function cutPlaces(moving) {
299
+ const current = view.value;
300
+ const host = root.value;
301
+ const table = current?.state.doc.nodeAt(moving.tablePos);
302
+ const element = (current?.nodeDOM(moving.tablePos))?.querySelector("table");
303
+ if (!current || !host || !table || !element) return [];
304
+ const box = host.getBoundingClientRect();
305
+ const tableBox = element.getBoundingClientRect();
306
+ const map = TableMap.get(table);
307
+ const places = [];
308
+ if (moving.axis === "row") {
309
+ const tops = [];
310
+ table.forEach((_row, offset) => {
311
+ const row = current.nodeDOM(moving.tablePos + 1 + offset);
312
+ tops.push((row?.getBoundingClientRect().top ?? tableBox.top) - box.top);
313
+ });
314
+ for (const cut of boundaries(map, "row")) places.push({
315
+ cut,
316
+ at: cut < map.height ? tops[cut] : tableBox.bottom - box.top
317
+ });
318
+ return places;
319
+ }
320
+ for (const cut of boundaries(map, "column")) {
321
+ if (cut === map.width) {
322
+ places.push({
323
+ cut,
324
+ at: tableBox.right - box.left
325
+ });
326
+ continue;
327
+ }
328
+ let row = 0;
329
+ while (row < map.height && map.findCell(map.map[row * map.width + cut]).left !== cut) row++;
330
+ const cell = cellElement(moving.tablePos, row, cut);
331
+ if (cell) places.push({
332
+ cut,
333
+ at: cell.getBoundingClientRect().left - box.left
334
+ });
335
+ }
336
+ return places;
337
+ }
338
+ function showGhost(moving) {
339
+ const current = view.value;
340
+ const host = root.value;
341
+ const table = current?.state.doc.nodeAt(moving.tablePos);
342
+ const element = (current?.nodeDOM(moving.tablePos))?.querySelector("table");
343
+ if (!current || !host || !table || !element) return;
344
+ const map = TableMap.get(table);
345
+ const copy = document.createElement("table");
346
+ copy.className = "dou-editor-table";
347
+ const body = document.createElement("tbody");
348
+ copy.append(body);
349
+ let width = 0;
350
+ const [rows, cols] = moving.axis === "row" ? [[moving.start, moving.end], [0, map.width]] : [[0, map.height], [moving.start, moving.end]];
351
+ for (let row = rows[0]; row < rows[1]; row++) {
352
+ const line = document.createElement("tr");
353
+ let lineWidth = 0;
354
+ for (let col = cols[0]; col < cols[1]; col++) {
355
+ const rect = map.findCell(map.map[row * map.width + col]);
356
+ if (rect.top !== row || rect.left !== col) continue;
357
+ const cell = cellElement(moving.tablePos, row, col);
358
+ if (!cell) continue;
359
+ const clone = cell.cloneNode(true);
360
+ clone.classList.remove("selectedCell");
361
+ clone.style.width = `${cell.getBoundingClientRect().width}px`;
362
+ lineWidth += cell.getBoundingClientRect().width;
363
+ line.append(clone);
364
+ }
365
+ width = Math.max(width, lineWidth);
366
+ body.append(line);
367
+ }
368
+ ghost = document.createElement("div");
369
+ ghost.className = "dou-editor__surface dou-editor__ghost dou-editor-table__ghost";
370
+ ghost.setAttribute("aria-hidden", "true");
371
+ ghost.style.width = `${Math.min(width, 360) + 2}px`;
372
+ ghost.append(copy);
373
+ host.append(ghost);
374
+ }
375
+ function onDragMove(event) {
376
+ const moving = drag;
377
+ if (!moving) return;
378
+ if (!dragging.value) {
379
+ if (Math.hypot(event.clientX - moving.x, event.clientY - moving.y) < 4) return;
380
+ dragging.value = true;
381
+ columnMenu.value = false;
382
+ rowMenu.value = false;
383
+ const current = view.value;
384
+ if (current) current.dispatch(selectLines(current.state.tr, moving.tablePos, moving.axis, moving.start, moving.end));
385
+ showGhost(moving);
386
+ }
387
+ if (ghost) ghost.style.transform = `translate(${event.clientX + 12}px, ${event.clientY + 12}px)`;
388
+ const host = root.value;
389
+ if (!host) return;
390
+ const box = host.getBoundingClientRect();
391
+ const pointer = moving.axis === "row" ? event.clientY - box.top : event.clientX - box.left;
392
+ let best = null;
393
+ for (const place of cutPlaces(moving)) if (!best || Math.abs(place.at - pointer) < Math.abs(best.at - pointer)) best = place;
394
+ if (!best || best.cut >= moving.start && best.cut <= moving.end) {
395
+ moving.to = null;
396
+ drop.value = null;
397
+ return;
398
+ }
399
+ moving.to = best.cut;
400
+ drop.value = {
401
+ axis: moving.axis,
402
+ at: best.at
403
+ };
404
+ }
405
+ function onDragUp() {
406
+ endDrag(true);
407
+ }
408
+ function onDragCancel() {
409
+ endDrag(false);
410
+ }
411
+ function endDrag(apply) {
412
+ window.removeEventListener("pointermove", onDragMove);
413
+ window.removeEventListener("pointerup", onDragUp);
414
+ window.removeEventListener("pointercancel", onDragCancel);
415
+ const moving = drag;
416
+ drag = null;
417
+ ghost?.remove();
418
+ ghost = null;
419
+ drop.value = null;
420
+ if (!dragging.value) {
421
+ if (apply && moving) openMenu(moving.axis, moving);
422
+ return;
423
+ }
424
+ dragging.value = false;
425
+ if (apply && moving?.to !== null && moving) run(moveLinesTo(moving.tablePos, moving.axis, moving.start, moving.end, moving.to));
426
+ collapseLines();
427
+ schedule();
428
+ }
429
+ const hasCellSelection = computed(() => {
430
+ const selection = state.value?.selection;
431
+ return selection instanceof CellSelection && selection.$anchorCell.pos !== selection.$headCell.pos;
432
+ });
433
+ const visible = computed(() => !!layout.value && !!target.value);
434
+ return (_ctx, _cache) => {
435
+ return visible.value && layout.value ? (openBlock(), createElementBlock("div", {
436
+ key: 0,
437
+ class: "dou-editor-table-controls",
438
+ onMousedown: _cache[23] || (_cache[23] = withModifiers(() => {}, ["prevent"]))
439
+ }, [
440
+ createVNode(unref(DouDropdown), {
441
+ open: columnMenu.value,
442
+ "onUpdate:open": _cache[8] || (_cache[8] = ($event) => columnMenu.value = $event),
443
+ trigger: "manual",
444
+ placement: "bottom-start",
445
+ class: "dou-editor-menu"
446
+ }, {
447
+ menu: withCtx(() => [
448
+ createVNode(unref(DouDropdownItem), { onClick: _cache[1] || (_cache[1] = ($event) => run(unref(insertColumn)("before"))) }, {
449
+ prefix: withCtx(() => [createVNode(unref(ArrowLeftToLineIcon))]),
450
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.insertLeft), 1)]),
451
+ _: 1
452
+ }),
453
+ createVNode(unref(DouDropdownItem), { onClick: _cache[2] || (_cache[2] = ($event) => run(unref(insertColumn)("after"))) }, {
454
+ prefix: withCtx(() => [createVNode(unref(ArrowRightToLineIcon))]),
455
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.insertRight), 1)]),
456
+ _: 1
457
+ }),
458
+ createVNode(unref(DouDropdownItem), {
459
+ divided: "",
460
+ disabled: !can(unref(moveLines)("column", -1)),
461
+ onClick: _cache[3] || (_cache[3] = ($event) => run(unref(moveLines)("column", -1)))
462
+ }, {
463
+ prefix: withCtx(() => [createVNode(unref(ArrowLeftIcon))]),
464
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.moveLeft), 1)]),
465
+ _: 1
466
+ }, 8, ["disabled"]),
467
+ createVNode(unref(DouDropdownItem), {
468
+ disabled: !can(unref(moveLines)("column", 1)),
469
+ onClick: _cache[4] || (_cache[4] = ($event) => run(unref(moveLines)("column", 1)))
470
+ }, {
471
+ prefix: withCtx(() => [createVNode(unref(ArrowRightIcon))]),
472
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.moveRight), 1)]),
473
+ _: 1
474
+ }, 8, ["disabled"]),
475
+ createVNode(unref(DouDropdownSub), {
476
+ divided: "",
477
+ title: aligns.find((item) => item.value === columnAlign.value).label()
478
+ }, {
479
+ prefix: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(aligns.find((item) => item.value === columnAlign.value).icon)))]),
480
+ default: withCtx(() => [(openBlock(), createElementBlock(Fragment, null, renderList(aligns, (item) => {
481
+ return createVNode(unref(DouDropdownItem), {
482
+ key: item.value,
483
+ onClick: ($event) => run(unref(alignColumns)(item.value))
484
+ }, createSlots({
485
+ prefix: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(item.icon)))]),
486
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(item.label()) + " ", 1)]),
487
+ _: 2
488
+ }, [item.value === columnAlign.value ? {
489
+ name: "suffix",
490
+ fn: withCtx(() => [createVNode(unref(CheckIcon))]),
491
+ key: "0"
492
+ } : void 0]), 1032, ["onClick"]);
493
+ }), 64))]),
494
+ _: 1
495
+ }, 8, ["title"]),
496
+ target.value?.rect.left === 0 ? (openBlock(), createBlock(unref(DouDropdownItem), {
497
+ key: 0,
498
+ onClick: _cache[5] || (_cache[5] = ($event) => run(unref(toggleHeader)("headerColumn")))
499
+ }, createSlots({
500
+ prefix: withCtx(() => [createVNode(unref(LayoutColumnsIcon))]),
501
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.headerColumn) + " ", 1)]),
502
+ _: 2
503
+ }, [tableNode.value?.attrs.headerColumn ? {
504
+ name: "suffix",
505
+ fn: withCtx(() => [createVNode(unref(CheckIcon))]),
506
+ key: "0"
507
+ } : void 0]), 1024)) : createCommentVNode("", true),
508
+ createVNode(unref(DouDropdownItem), {
509
+ divided: "",
510
+ onClick: _cache[6] || (_cache[6] = ($event) => run(unref(clearCells)))
511
+ }, {
512
+ prefix: withCtx(() => [createVNode(unref(EraserIcon))]),
513
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.clear), 1)]),
514
+ _: 1
515
+ }),
516
+ createVNode(unref(DouDropdownItem), {
517
+ tone: "danger",
518
+ disabled: !can(unref(deleteColumns)),
519
+ onClick: _cache[7] || (_cache[7] = ($event) => run(unref(deleteColumns)))
520
+ }, {
521
+ prefix: withCtx(() => [createVNode(unref(TrashIcon))]),
522
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.deleteColumn), 1)]),
523
+ _: 1
524
+ }, 8, ["disabled"])
525
+ ]),
526
+ default: withCtx(() => [withDirectives(createElementVNode("button", {
527
+ type: "button",
528
+ tabindex: "-1",
529
+ class: normalizeClass(["dou-editor-table__handle is-column", { "is-active": columnMenu.value }]),
530
+ style: normalizeStyle({
531
+ top: `${layout.value.table.top}px`,
532
+ left: `${Math.min(Math.max(layout.value.column.left + layout.value.column.width / 2, layout.value.frame.left + 12), layout.value.frame.right - 12)}px`
533
+ }),
534
+ "aria-label": unref(messages).table.column,
535
+ title: unref(messages).table.column,
536
+ onPointerdown: _cache[0] || (_cache[0] = ($event) => onHandleDown("column", $event))
537
+ }, [createVNode(unref(GripHorizontalIcon))], 46, _hoisted_1), [[vShow, !handlesHidden.value]])]),
538
+ _: 1
539
+ }, 8, ["open"]),
540
+ createVNode(unref(DouDropdown), {
541
+ open: rowMenu.value,
542
+ "onUpdate:open": _cache[17] || (_cache[17] = ($event) => rowMenu.value = $event),
543
+ trigger: "manual",
544
+ placement: "right-start",
545
+ class: "dou-editor-menu"
546
+ }, {
547
+ menu: withCtx(() => [
548
+ createVNode(unref(DouDropdownItem), { onClick: _cache[10] || (_cache[10] = ($event) => run(unref(insertRow)("before"))) }, {
549
+ prefix: withCtx(() => [createVNode(unref(ArrowUpToLineIcon))]),
550
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.insertAbove), 1)]),
551
+ _: 1
552
+ }),
553
+ createVNode(unref(DouDropdownItem), { onClick: _cache[11] || (_cache[11] = ($event) => run(unref(insertRow)("after"))) }, {
554
+ prefix: withCtx(() => [createVNode(unref(ArrowDownFromLineIcon))]),
555
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.insertBelow), 1)]),
556
+ _: 1
557
+ }),
558
+ createVNode(unref(DouDropdownItem), {
559
+ divided: "",
560
+ disabled: !can(unref(moveLines)("row", -1)),
561
+ onClick: _cache[12] || (_cache[12] = ($event) => run(unref(moveLines)("row", -1)))
562
+ }, {
563
+ prefix: withCtx(() => [createVNode(unref(ArrowUpIcon))]),
564
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.moveUp), 1)]),
565
+ _: 1
566
+ }, 8, ["disabled"]),
567
+ createVNode(unref(DouDropdownItem), {
568
+ disabled: !can(unref(moveLines)("row", 1)),
569
+ onClick: _cache[13] || (_cache[13] = ($event) => run(unref(moveLines)("row", 1)))
570
+ }, {
571
+ prefix: withCtx(() => [createVNode(unref(ArrowDownIcon))]),
572
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.moveDown), 1)]),
573
+ _: 1
574
+ }, 8, ["disabled"]),
575
+ target.value?.rect.top === 0 ? (openBlock(), createBlock(unref(DouDropdownItem), {
576
+ key: 0,
577
+ divided: "",
578
+ onClick: _cache[14] || (_cache[14] = ($event) => run(unref(toggleHeader)("headerRow")))
579
+ }, createSlots({
580
+ prefix: withCtx(() => [createVNode(unref(LayoutRowsIcon))]),
581
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.headerRow) + " ", 1)]),
582
+ _: 2
583
+ }, [tableNode.value?.attrs.headerRow ? {
584
+ name: "suffix",
585
+ fn: withCtx(() => [createVNode(unref(CheckIcon))]),
586
+ key: "0"
587
+ } : void 0]), 1024)) : createCommentVNode("", true),
588
+ createVNode(unref(DouDropdownItem), {
589
+ divided: "",
590
+ onClick: _cache[15] || (_cache[15] = ($event) => run(unref(clearCells)))
591
+ }, {
592
+ prefix: withCtx(() => [createVNode(unref(EraserIcon))]),
593
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.clear), 1)]),
594
+ _: 1
595
+ }),
596
+ createVNode(unref(DouDropdownItem), {
597
+ tone: "danger",
598
+ disabled: !can(unref(deleteRows)),
599
+ onClick: _cache[16] || (_cache[16] = ($event) => run(unref(deleteRows)))
600
+ }, {
601
+ prefix: withCtx(() => [createVNode(unref(TrashIcon))]),
602
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(messages).table.deleteRow), 1)]),
603
+ _: 1
604
+ }, 8, ["disabled"])
605
+ ]),
606
+ default: withCtx(() => [withDirectives(createElementVNode("button", {
607
+ type: "button",
608
+ tabindex: "-1",
609
+ class: normalizeClass(["dou-editor-table__handle is-row", { "is-active": rowMenu.value }]),
610
+ style: normalizeStyle({
611
+ top: `${layout.value.row.top + layout.value.row.height / 2}px`,
612
+ left: `${layout.value.frame.left}px`
613
+ }),
614
+ "aria-label": unref(messages).table.row,
615
+ title: unref(messages).table.row,
616
+ onPointerdown: _cache[9] || (_cache[9] = ($event) => onHandleDown("row", $event))
617
+ }, [createVNode(unref(GripVerticalIcon))], 46, _hoisted_2), [[vShow, !handlesHidden.value]])]),
618
+ _: 1
619
+ }, 8, ["open"]),
620
+ createElementVNode("button", {
621
+ type: "button",
622
+ tabindex: "-1",
623
+ class: "dou-editor-table__add is-column",
624
+ style: normalizeStyle({
625
+ top: `${layout.value.table.top}px`,
626
+ left: `${Math.min(layout.value.table.left + layout.value.table.width, layout.value.frame.right)}px`,
627
+ height: `${layout.value.table.height}px`
628
+ }),
629
+ "aria-label": unref(messages).table.addColumn,
630
+ title: unref(messages).table.addColumn,
631
+ onClick: _cache[18] || (_cache[18] = ($event) => addAtEnd("column"))
632
+ }, [createVNode(unref(PlusIcon))], 12, _hoisted_3),
633
+ createElementVNode("button", {
634
+ type: "button",
635
+ tabindex: "-1",
636
+ class: "dou-editor-table__add is-row",
637
+ style: normalizeStyle({
638
+ top: `${layout.value.table.top + layout.value.table.height}px`,
639
+ left: `${layout.value.frame.left}px`,
640
+ width: `${Math.min(layout.value.table.left + layout.value.table.width, layout.value.frame.right) - layout.value.frame.left}px`
641
+ }),
642
+ "aria-label": unref(messages).table.addRow,
643
+ title: unref(messages).table.addRow,
644
+ onClick: _cache[19] || (_cache[19] = ($event) => addAtEnd("row"))
645
+ }, [createVNode(unref(PlusIcon))], 12, _hoisted_4),
646
+ drop.value ? (openBlock(), createElementBlock("div", {
647
+ key: 0,
648
+ class: normalizeClass(["dou-editor__drop", { "is-vertical": drop.value.axis === "column" }]),
649
+ style: normalizeStyle(drop.value.axis === "row" ? {
650
+ top: `${drop.value.at}px`,
651
+ left: `${layout.value.frame.left}px`,
652
+ width: `${Math.min(layout.value.table.left + layout.value.table.width, layout.value.frame.right) - layout.value.frame.left}px`
653
+ } : {
654
+ top: `${layout.value.table.top}px`,
655
+ left: `${drop.value.at}px`,
656
+ height: `${layout.value.table.height}px`
657
+ })
658
+ }, null, 6)) : createCommentVNode("", true),
659
+ barShown.value && layout.value.bar && !dragging.value ? (openBlock(), createElementBlock("div", {
660
+ key: 1,
661
+ class: normalizeClass(["dou-editor-table__cells", { "is-below": layout.value.bar.below }]),
662
+ style: normalizeStyle({
663
+ top: `${layout.value.bar.top}px`,
664
+ left: `${layout.value.bar.left}px`
665
+ })
666
+ }, [
667
+ hasCellSelection.value ? (openBlock(), createElementBlock("button", {
668
+ key: 0,
669
+ type: "button",
670
+ tabindex: "-1",
671
+ class: "dou-editor-table__cells-button",
672
+ disabled: !can(unref(mergeCells)),
673
+ onClick: _cache[20] || (_cache[20] = ($event) => run(unref(mergeCells)))
674
+ }, [createVNode(unref(MergeIcon)), createTextVNode(toDisplayString(unref(messages).table.merge), 1)], 8, _hoisted_5)) : createCommentVNode("", true),
675
+ can(unref(splitMergedCell)) ? (openBlock(), createElementBlock("button", {
676
+ key: 1,
677
+ type: "button",
678
+ tabindex: "-1",
679
+ class: "dou-editor-table__cells-button",
680
+ onClick: _cache[21] || (_cache[21] = ($event) => run(unref(splitMergedCell)))
681
+ }, [createVNode(unref(SplitIcon)), createTextVNode(toDisplayString(unref(messages).table.split), 1)])) : createCommentVNode("", true),
682
+ hasCellSelection.value ? (openBlock(), createElementBlock("button", {
683
+ key: 2,
684
+ type: "button",
685
+ tabindex: "-1",
686
+ class: "dou-editor-table__cells-button",
687
+ "aria-label": unref(messages).table.clear,
688
+ title: unref(messages).table.clear,
689
+ onClick: _cache[22] || (_cache[22] = ($event) => run(unref(clearCells)))
690
+ }, [createVNode(unref(EraserIcon))], 8, _hoisted_6)) : createCommentVNode("", true)
691
+ ], 6)) : createCommentVNode("", true)
692
+ ], 32)) : createCommentVNode("", true);
693
+ };
694
+ }
695
+ });
696
+ export { table_controls_vue_vue_type_script_setup_true_lang_default as default };
697
+
698
+ //# sourceMappingURL=table-controls.vue_vue_type_script_setup_true_lang.js.map