@dou-ui/editor 0.0.0-stage → 0.1.0-alpha.0
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.
- package/LICENSE +21 -0
- package/README.md +10 -2
- package/dist/catalog.js +18 -0
- package/dist/catalog.js.map +1 -0
- package/dist/code/code-editor-block.js +6 -0
- package/dist/code/code-editor-block.js.map +1 -0
- package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js +116 -0
- package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/code/index.js +69 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code/languages.js +51 -0
- package/dist/code/languages.js.map +1 -0
- package/dist/code/view.js +255 -0
- package/dist/code/view.js.map +1 -0
- package/dist/collaboration/binding.js +381 -0
- package/dist/collaboration/binding.js.map +1 -0
- package/dist/collaboration/cursors.js +150 -0
- package/dist/collaboration/cursors.js.map +1 -0
- package/dist/collaboration/index.js +108 -0
- package/dist/collaboration/index.js.map +1 -0
- package/dist/collaboration/order.js +88 -0
- package/dist/collaboration/order.js.map +1 -0
- package/dist/collaboration/table.js +234 -0
- package/dist/collaboration/table.js.map +1 -0
- package/dist/collaboration/text.js +91 -0
- package/dist/collaboration/text.js.map +1 -0
- package/dist/components/block-handle.js +6 -0
- package/dist/components/block-handle.js.map +1 -0
- package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js +474 -0
- package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/bubble-toolbar.js +6 -0
- package/dist/components/bubble-toolbar.js.map +1 -0
- package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js +381 -0
- package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/comment-button.js +6 -0
- package/dist/components/comment-button.js.map +1 -0
- package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js +83 -0
- package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/comment-card.js +6 -0
- package/dist/components/comment-card.js.map +1 -0
- package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js +104 -0
- package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/menu-escape.js +25 -0
- package/dist/components/menu-escape.js.map +1 -0
- package/dist/components/search-bar.js +6 -0
- package/dist/components/search-bar.js.map +1 -0
- package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js +192 -0
- package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/slash-menu.js +6 -0
- package/dist/components/slash-menu.js.map +1 -0
- package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js +164 -0
- package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/core/align.js +94 -0
- package/dist/core/align.js.map +1 -0
- package/dist/core/block-selection.js +155 -0
- package/dist/core/block-selection.js.map +1 -0
- package/dist/core/blocks.js +132 -0
- package/dist/core/blocks.js.map +1 -0
- package/dist/core/changes.js +85 -0
- package/dist/core/changes.js.map +1 -0
- package/dist/core/colors.js +16 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/commands.js +379 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/comments.js +186 -0
- package/dist/core/comments.js.map +1 -0
- package/dist/core/compare.js +106 -0
- package/dist/core/compare.js.map +1 -0
- package/dist/core/convert.js +28 -0
- package/dist/core/convert.js.map +1 -0
- package/dist/core/diff.js +141 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/editor.js +138 -0
- package/dist/core/editor.js.map +1 -0
- package/dist/core/extension.js +99 -0
- package/dist/core/extension.js.map +1 -0
- package/dist/core/file-drop.js +56 -0
- package/dist/core/file-drop.js.map +1 -0
- package/dist/core/highlight.js +120 -0
- package/dist/core/highlight.js.map +1 -0
- package/dist/core/input-rules.js +61 -0
- package/dist/core/input-rules.js.map +1 -0
- package/dist/core/keymap.js +38 -0
- package/dist/core/keymap.js.map +1 -0
- package/dist/core/model.js +196 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/output.js +263 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/plugins.js +102 -0
- package/dist/core/plugins.js.map +1 -0
- package/dist/core/prepare.js +102 -0
- package/dist/core/prepare.js.map +1 -0
- package/dist/core/schema.js +158 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/search.js +197 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/selection.js +16 -0
- package/dist/core/selection.js.map +1 -0
- package/dist/core/slash.js +83 -0
- package/dist/core/slash.js.map +1 -0
- package/dist/core/transaction.js +311 -0
- package/dist/core/transaction.js.map +1 -0
- package/dist/define-block.js +177 -0
- package/dist/define-block.js.map +1 -0
- package/dist/document.js +157 -0
- package/dist/document.js.map +1 -0
- package/dist/dom.js +48 -0
- package/dist/dom.js.map +1 -0
- package/dist/editor.js +33 -0
- package/dist/editor.js.map +1 -0
- package/dist/editor.vue_vue_type_script_setup_true_lang.js +564 -0
- package/dist/editor.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/editor2.js +6 -0
- package/dist/editor2.js.map +1 -0
- package/dist/extensions/align/align-menu.js +6 -0
- package/dist/extensions/align/align-menu.js.map +1 -0
- package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js +82 -0
- package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/align/align-sub.js +6 -0
- package/dist/extensions/align/align-sub.js.map +1 -0
- package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js +57 -0
- package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/align/commands.js +40 -0
- package/dist/extensions/align/commands.js.map +1 -0
- package/dist/extensions/align/index.js +27 -0
- package/dist/extensions/align/index.js.map +1 -0
- package/dist/extensions/attachment/attachment-block.js +6 -0
- package/dist/extensions/attachment/attachment-block.js.map +1 -0
- package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js +119 -0
- package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/attachment/files.js +66 -0
- package/dist/extensions/attachment/files.js.map +1 -0
- package/dist/extensions/attachment/index.js +132 -0
- package/dist/extensions/attachment/index.js.map +1 -0
- package/dist/extensions/blocks.js +170 -0
- package/dist/extensions/blocks.js.map +1 -0
- package/dist/extensions/callout/callout-block.js +6 -0
- package/dist/extensions/callout/callout-block.js.map +1 -0
- package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js +71 -0
- package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/callout/html.js +61 -0
- package/dist/extensions/callout/html.js.map +1 -0
- package/dist/extensions/callout/index.js +52 -0
- package/dist/extensions/callout/index.js.map +1 -0
- package/dist/extensions/callout/tones.js +12 -0
- package/dist/extensions/callout/tones.js.map +1 -0
- package/dist/extensions/code-block/code-block-view.js +6 -0
- package/dist/extensions/code-block/code-block-view.js.map +1 -0
- package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js +87 -0
- package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/code-block/index.js +98 -0
- package/dist/extensions/code-block/index.js.map +1 -0
- package/dist/extensions/code-block/languages.js +116 -0
- package/dist/extensions/code-block/languages.js.map +1 -0
- package/dist/extensions/colors/color-menu.js +6 -0
- package/dist/extensions/colors/color-menu.js.map +1 -0
- package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js +113 -0
- package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/colors/index.js +49 -0
- package/dist/extensions/colors/index.js.map +1 -0
- package/dist/extensions/colors/palette.js +26 -0
- package/dist/extensions/colors/palette.js.map +1 -0
- package/dist/extensions/editor-kit.js +35 -0
- package/dist/extensions/editor-kit.js.map +1 -0
- package/dist/extensions/embed/embed-block.js +6 -0
- package/dist/extensions/embed/embed-block.js.map +1 -0
- package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js +210 -0
- package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/embed/index.js +118 -0
- package/dist/extensions/embed/index.js.map +1 -0
- package/dist/extensions/embed/targets.js +79 -0
- package/dist/extensions/embed/targets.js.map +1 -0
- package/dist/extensions/formatting.js +153 -0
- package/dist/extensions/formatting.js.map +1 -0
- package/dist/extensions/image/image-block.js +6 -0
- package/dist/extensions/image/image-block.js.map +1 -0
- package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js +206 -0
- package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/image/index.js +125 -0
- package/dist/extensions/image/index.js.map +1 -0
- package/dist/extensions/image/uploads.js +96 -0
- package/dist/extensions/image/uploads.js.map +1 -0
- package/dist/extensions/list-html.js +58 -0
- package/dist/extensions/list-html.js.map +1 -0
- package/dist/extensions/lists.js +182 -0
- package/dist/extensions/lists.js.map +1 -0
- package/dist/extensions/mention/index.js +56 -0
- package/dist/extensions/mention/index.js.map +1 -0
- package/dist/extensions/mention/mention-menu.js +6 -0
- package/dist/extensions/mention/mention-menu.js.map +1 -0
- package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js +132 -0
- package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/mention/state.js +113 -0
- package/dist/extensions/mention/state.js.map +1 -0
- package/dist/extensions/table/commands.js +356 -0
- package/dist/extensions/table/commands.js.map +1 -0
- package/dist/extensions/table/html.js +134 -0
- package/dist/extensions/table/html.js.map +1 -0
- package/dist/extensions/table/index.js +56 -0
- package/dist/extensions/table/index.js.map +1 -0
- package/dist/extensions/table/plugin.js +81 -0
- package/dist/extensions/table/plugin.js.map +1 -0
- package/dist/extensions/table/schema.js +258 -0
- package/dist/extensions/table/schema.js.map +1 -0
- package/dist/extensions/table/table-controls.js +6 -0
- package/dist/extensions/table/table-controls.js.map +1 -0
- package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js +698 -0
- package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/table/view.js +19 -0
- package/dist/extensions/table/view.js.map +1 -0
- package/dist/extensions/toggle/index.js +87 -0
- package/dist/extensions/toggle/index.js.map +1 -0
- package/dist/extensions/toggle/state.js +120 -0
- package/dist/extensions/toggle/state.js.map +1 -0
- package/dist/extensions/toggle/toggle-block.js +6 -0
- package/dist/extensions/toggle/toggle-block.js.map +1 -0
- package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/locale.js +522 -0
- package/dist/locale.js.map +1 -0
- package/dist/markdown/index.js +24 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/style.d.ts +1 -0
- package/dist/style.js +8 -0
- package/dist/types/catalog.d.ts +8 -0
- package/dist/types/code/code-editor-block.vue.d.ts +17 -0
- package/dist/types/code/index.d.ts +18 -0
- package/dist/types/code/languages.d.ts +7 -0
- package/dist/types/code/types.d.ts +37 -0
- package/dist/types/code/view.d.ts +12 -0
- package/dist/types/collaboration/binding.d.ts +32 -0
- package/dist/types/collaboration/cursors.d.ts +26 -0
- package/dist/types/collaboration/index.d.ts +47 -0
- package/dist/types/collaboration/order.d.ts +20 -0
- package/dist/types/collaboration/table.d.ts +25 -0
- package/dist/types/collaboration/text.d.ts +9 -0
- package/dist/types/components/block-handle.vue.d.ts +3 -0
- package/dist/types/components/bubble-toolbar.vue.d.ts +7 -0
- package/dist/types/components/comment-button.vue.d.ts +3 -0
- package/dist/types/components/comment-card.vue.d.ts +3 -0
- package/dist/types/components/menu-escape.d.ts +7 -0
- package/dist/types/components/search-bar.vue.d.ts +22 -0
- package/dist/types/components/slash-menu.vue.d.ts +11 -0
- package/dist/types/core/align.d.ts +16 -0
- package/dist/types/core/block-selection.d.ts +22 -0
- package/dist/types/core/blocks.d.ts +52 -0
- package/dist/types/core/changes.d.ts +14 -0
- package/dist/types/core/colors.d.ts +4 -0
- package/dist/types/core/commands.d.ts +61 -0
- package/dist/types/core/comments.d.ts +44 -0
- package/dist/types/core/compare.d.ts +10 -0
- package/dist/types/core/convert.d.ts +12 -0
- package/dist/types/core/diff.d.ts +49 -0
- package/dist/types/core/editor.d.ts +64 -0
- package/dist/types/core/extension.d.ts +167 -0
- package/dist/types/core/file-drop.d.ts +19 -0
- package/dist/types/core/highlight.d.ts +32 -0
- package/dist/types/core/input-rules.d.ts +21 -0
- package/dist/types/core/keymap.d.ts +8 -0
- package/dist/types/core/model.d.ts +158 -0
- package/dist/types/core/output.d.ts +64 -0
- package/dist/types/core/plugins.d.ts +24 -0
- package/dist/types/core/prepare.d.ts +23 -0
- package/dist/types/core/schema.d.ts +38 -0
- package/dist/types/core/search.d.ts +83 -0
- package/dist/types/core/selection.d.ts +8 -0
- package/dist/types/core/slash.d.ts +21 -0
- package/dist/types/core/transaction.d.ts +97 -0
- package/dist/types/define-block.d.ts +66 -0
- package/dist/types/document.d.ts +46 -0
- package/dist/types/dom.d.ts +17 -0
- package/dist/types/editor.d.ts +252 -0
- package/dist/types/editor.vue.d.ts +210 -0
- package/dist/types/extensions/align/align-menu.vue.d.ts +3 -0
- package/dist/types/extensions/align/align-sub.vue.d.ts +7 -0
- package/dist/types/extensions/align/commands.d.ts +13 -0
- package/dist/types/extensions/align/index.d.ts +7 -0
- package/dist/types/extensions/attachment/attachment-block.vue.d.ts +17 -0
- package/dist/types/extensions/attachment/files.d.ts +6 -0
- package/dist/types/extensions/attachment/index.d.ts +20 -0
- package/dist/types/extensions/blocks.d.ts +8 -0
- package/dist/types/extensions/callout/callout-block.vue.d.ts +14 -0
- package/dist/types/extensions/callout/html.d.ts +4 -0
- package/dist/types/extensions/callout/index.d.ts +3 -0
- package/dist/types/extensions/callout/tones.d.ts +8 -0
- package/dist/types/extensions/code-block/code-block-view.vue.d.ts +16 -0
- package/dist/types/extensions/code-block/index.d.ts +19 -0
- package/dist/types/extensions/code-block/languages.d.ts +9 -0
- package/dist/types/extensions/colors/color-menu.vue.d.ts +3 -0
- package/dist/types/extensions/colors/index.d.ts +7 -0
- package/dist/types/extensions/colors/palette.d.ts +7 -0
- package/dist/types/extensions/editor-kit.d.ts +37 -0
- package/dist/types/extensions/embed/embed-block.vue.d.ts +16 -0
- package/dist/types/extensions/embed/index.d.ts +18 -0
- package/dist/types/extensions/embed/targets.d.ts +32 -0
- package/dist/types/extensions/formatting.d.ts +8 -0
- package/dist/types/extensions/image/image-block.vue.d.ts +16 -0
- package/dist/types/extensions/image/index.d.ts +16 -0
- package/dist/types/extensions/image/uploads.d.ts +35 -0
- package/dist/types/extensions/list-html.d.ts +11 -0
- package/dist/types/extensions/lists.d.ts +6 -0
- package/dist/types/extensions/mention/index.d.ts +11 -0
- package/dist/types/extensions/mention/mention-menu.vue.d.ts +7 -0
- package/dist/types/extensions/mention/state.d.ts +28 -0
- package/dist/types/extensions/table/commands.d.ts +69 -0
- package/dist/types/extensions/table/html.d.ts +4 -0
- package/dist/types/extensions/table/index.d.ts +8 -0
- package/dist/types/extensions/table/plugin.d.ts +4 -0
- package/dist/types/extensions/table/schema.d.ts +23 -0
- package/dist/types/extensions/table/table-controls.vue.d.ts +3 -0
- package/dist/types/extensions/table/view.d.ts +13 -0
- package/dist/types/extensions/toggle/index.d.ts +7 -0
- package/dist/types/extensions/toggle/state.d.ts +17 -0
- package/dist/types/extensions/toggle/toggle-block.vue.d.ts +14 -0
- package/dist/types/index.d.ts +266 -0
- package/dist/types/locale.d.ts +195 -0
- package/dist/types/markdown/index.d.ts +14 -0
- package/dist/types/use-comments.d.ts +17 -0
- package/dist/use-comments.js +141 -0
- package/dist/use-comments.js.map +1 -0
- package/package.json +98 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-controls.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_withModifiers","_createVNode","_unref","_withCtx","_createTextVNode","_toDisplayString","_createBlock","_resolveDynamicComponent","_Fragment","_renderList","_createSlots","_createCommentVNode","_withDirectives","_createElementVNode","_normalizeClass","_normalizeStyle","_vShow"],"sources":["../../../src/extensions/table/table-controls.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ArrowDownFromLineIcon,\n ArrowDownIcon,\n ArrowLeftIcon,\n ArrowLeftToLineIcon,\n ArrowRightIcon,\n ArrowRightToLineIcon,\n ArrowUpIcon,\n ArrowUpToLineIcon,\n CheckIcon,\n EraserIcon,\n GripHorizontalIcon,\n GripVerticalIcon,\n LayoutColumnsIcon,\n LayoutRowsIcon,\n MergeIcon,\n PlusIcon,\n SplitIcon,\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TrashIcon,\n} from '@dou-ui/icons'\nimport { DouDropdown, DouDropdownItem, DouDropdownSub } from 'dou-ui'\nimport { TextSelection, type Command } from 'prosemirror-state'\nimport { CellSelection, TableMap, addColumn, addRow, type Rect } from 'prosemirror-tables'\nimport { computed, onBeforeUnmount, onMounted, shallowRef, watch } from 'vue'\nimport { createId } from '../../core/model'\nimport { useMenuEscape } from '../../components/menu-escape'\nimport { useEditor } from '../../editor'\nimport {\n alignColumns,\n band,\n boundaries,\n clearCells,\n deleteColumns,\n deleteRows,\n inMergedCell,\n insertColumn,\n insertRow,\n mergeCells,\n moveLines,\n moveLinesTo,\n selectLines,\n splitMergedCell,\n tableAt,\n toggleHeader,\n} from './commands'\nimport { fitColumns, type TableAlign } from './schema'\n\nconst { view, state, root, messages } = useEditor()\n\n/** The table and the cell the controls are about: the hovered one, or the selection's. */\ninterface Target {\n /** Position right before the table node. */\n pos: number\n /** The cell's place in the grid. */\n rect: Rect\n}\n\nconst hovered = shallowRef<Target | null>(null)\nconst columnMenu = shallowRef(false)\nconst rowMenu = shallowRef(false)\nconst menuOpen = computed(() => columnMenu.value || rowMenu.value)\nuseMenuEscape(menuOpen, () => {\n columnMenu.value = false\n rowMenu.value = false\n})\nconst barShown = computed(() => !!layout.value?.bar && !menuOpen.value && !dragging.value)\n// the toolbar over selected cells stands in for the handles; a merged cell's goes below it\nconst handlesHidden = computed(() => barShown.value && hasCellSelection.value)\n\nfunction targetOf(cell: HTMLElement): Target | null {\n const current = view.value\n if (!current || !current.dom.contains(cell)) return null\n const $pos = current.state.doc.resolve(current.posAtDOM(cell, 0))\n const found = tableAt($pos)\n if (!found) return null\n // the cell node starts right before its content\n for (let depth = $pos.depth; depth > 0; depth--) {\n const role = $pos.node(depth).type.spec.tableRole\n if (role === 'cell' || role === 'header_cell') {\n const cellPos = $pos.before(depth) - found.pos - 1\n return { pos: found.pos, rect: found.map.findCell(cellPos) }\n }\n }\n return null\n}\n\n/** The selection's cell when the pointer is elsewhere. */\nconst selected = computed<Target | null>(() => {\n const current = state.value\n if (!current) return null\n const selection = current.selection\n const $cell = selection instanceof CellSelection ? selection.$headCell : null\n const found = tableAt(selection.$head)\n if (!found) return null\n const start = found.pos + 1\n if ($cell) return { pos: found.pos, rect: found.map.findCell($cell.pos - start) }\n for (let depth = selection.$head.depth; depth > 0; depth--) {\n const role = selection.$head.node(depth).type.spec.tableRole\n if (role === 'cell' || role === 'header_cell')\n return { pos: found.pos, rect: found.map.findCell(selection.$head.before(depth) - start) }\n }\n return null\n})\n\nconst target = computed(() => hovered.value ?? selected.value)\n\n/* where things go */\n\ninterface Layout {\n /** The table, relative to the editor. */\n table: { top: number; left: number; width: number; height: number }\n /** The visible part of the table, when it scrolls sideways. */\n frame: { left: number; right: number }\n column: { left: number; width: number }\n row: { top: number; height: number }\n /**\n * Where the cell toolbar goes (its centre): above selected cells, or below\n * the merged cell with the cursor.\n */\n bar: { top: number; left: number; below: boolean } | null\n}\n\nconst layout = shallowRef<Layout | null>(null)\n\nfunction cellElement(tablePos: number, row: number, col: number): HTMLElement | null {\n const current = view.value\n const table = current?.state.doc.nodeAt(tablePos)\n if (!current || !table) return null\n const map = TableMap.get(table)\n if (row >= map.height || col >= map.width) return null\n const pos = tablePos + 1 + map.map[row * map.width + col]!\n return current.nodeDOM(pos) as HTMLElement | null\n}\n\nfunction measure() {\n const current = view.value\n const host = root.value\n const at = target.value\n if (!current || !host || !at) return (layout.value = null)\n const tableNode = current.state.doc.nodeAt(at.pos)\n const frameElement = current.nodeDOM(at.pos) as HTMLElement | null\n const tableElement = frameElement?.querySelector('table')\n if (!tableNode || !frameElement || !tableElement) return (layout.value = null)\n const box = host.getBoundingClientRect()\n const tableBox = tableElement.getBoundingClientRect()\n const frameBox = frameElement.getBoundingClientRect()\n const first = cellElement(at.pos, at.rect.top, at.rect.left)?.getBoundingClientRect()\n if (!first) return (layout.value = null)\n let bar: Layout['bar'] = null\n const boxes = barCells(current).map((pos) =>\n (current.nodeDOM(pos) as HTMLElement).getBoundingClientRect(),\n )\n if (boxes.length) {\n const left = Math.max(Math.min(...boxes.map((item) => item.left)), frameBox.left)\n const right = Math.min(Math.max(...boxes.map((item) => item.right)), frameBox.right)\n const below = !(current.state.selection instanceof CellSelection)\n bar = {\n top: below\n ? Math.max(...boxes.map((item) => item.bottom)) - box.top\n : Math.min(...boxes.map((item) => item.top)) - box.top,\n left: (left + right) / 2 - box.left,\n below,\n }\n }\n layout.value = {\n table: {\n top: tableBox.top - box.top,\n left: tableBox.left - box.left,\n width: tableBox.width,\n height: tableBox.height,\n },\n frame: { left: frameBox.left - box.left, right: frameBox.right - box.left },\n column: { left: first.left - box.left, width: first.width },\n row: { top: first.top - box.top, height: first.height },\n bar,\n }\n}\n\n/** The cells the toolbar is about: a cell selection's corners, or the merged cell with the cursor. */\nfunction barCells(current: NonNullable<typeof view.value>): number[] {\n const selection = current.state.selection\n if (selection instanceof CellSelection)\n return selection.$anchorCell.pos === selection.$headCell.pos\n ? []\n : [selection.$anchorCell.pos, selection.$headCell.pos]\n if (!inMergedCell(current.state)) return []\n const $head = selection.$head\n for (let depth = $head.depth; depth > 0; depth--) {\n const role = $head.node(depth).type.spec.tableRole\n if (role === 'cell' || role === 'header_cell') return [$head.before(depth)]\n }\n return []\n}\n\nlet frame = 0\nlet lastTarget: EventTarget | null = null\n\nfunction schedule() {\n if (frame) return\n frame = requestAnimationFrame(() => {\n frame = 0\n if (!menuOpen.value && !dragging.value) {\n const element = lastTarget instanceof Element ? lastTarget : null\n const cell = element?.closest<HTMLElement>('.dou-editor-table td, .dou-editor-table th')\n const inControls = element?.closest('.dou-editor-table-controls')\n if (cell) hovered.value = targetOf(cell)\n else if (!inControls) hovered.value = null\n }\n measure()\n })\n}\n\nfunction track(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n lastTarget = event.target\n schedule()\n}\n\nfunction leave() {\n if (menuOpen.value || dragging.value) return\n lastTarget = null\n hovered.value = null\n schedule()\n}\n\nconst onScroll = () => schedule()\n\nonMounted(() => {\n root.value?.addEventListener('pointermove', track)\n root.value?.addEventListener('pointerleave', leave)\n // the table frame scrolls sideways; the page scrolls too\n window.addEventListener('scroll', onScroll, true)\n window.addEventListener('resize', onScroll)\n})\nonBeforeUnmount(() => {\n root.value?.removeEventListener('pointermove', track)\n root.value?.removeEventListener('pointerleave', leave)\n window.removeEventListener('scroll', onScroll, true)\n window.removeEventListener('resize', onScroll)\n if (frame) cancelAnimationFrame(frame)\n endDrag(false)\n})\n\nwatch([state, target], () => schedule())\n\n/* actions */\n\nfunction run(command: Command) {\n const current = view.value\n if (!current) return\n command(current.state, current.dispatch)\n current.focus()\n}\n\nfunction openMenu(axis: 'row' | 'column', pressed: Drag) {\n // the lines pressed on, even if the handles moved since\n const current = view.value\n if (!current) return\n current.dispatch(\n selectLines(current.state.tr, pressed.tablePos, axis, pressed.start, pressed.end),\n )\n // one menu at a time\n rowMenu.value = axis === 'row'\n columnMenu.value = axis === 'column'\n}\n\n/**\n * Whole lines are selected to show what a menu or a drag is about; after\n * it, the cursor goes into their first cell so the handles come back.\n */\nfunction collapseLines() {\n const current = view.value\n const selection = current?.state.selection\n if (!current || !(selection instanceof CellSelection)) return\n if (!selection.isRowSelection() && !selection.isColSelection()) return\n const $cell = current.state.doc.resolve(selection.$anchorCell.pos + 1)\n current.dispatch(current.state.tr.setSelection(TextSelection.near($cell)))\n}\n\nwatch(menuOpen, (open) => {\n if (open) return\n collapseLines()\n schedule()\n})\n\nconst can = (command: Command) => {\n const current = state.value\n return !!current && command(current)\n}\n\nconst tableNode = computed(() => {\n const at = target.value\n return at ? (state.value?.doc.nodeAt(at.pos) ?? null) : null\n})\n\nconst columnAlign = computed<TableAlign>(() => {\n const node = tableNode.value\n const at = target.value\n if (!node || !at) return 'left'\n return (fitColumns(node.attrs.columns, TableMap.get(node).width)[at.rect.left]?.align ??\n 'left') as TableAlign\n})\n\nconst aligns: { value: TableAlign; icon: unknown; label: () => string }[] = [\n { value: 'left', icon: TextAlignLeftIcon, label: () => messages.value.table.alignLeft },\n { value: 'center', icon: TextAlignCenterIcon, label: () => messages.value.table.alignCenter },\n { value: 'right', icon: TextAlignRightIcon, label: () => messages.value.table.alignRight },\n]\n\n/** The + bars: a column at the right end, a row at the bottom. */\nfunction addAtEnd(axis: 'row' | 'column') {\n const current = view.value\n const at = target.value\n if (!current || !at) return\n const table = current.state.doc.nodeAt(at.pos)!\n const map = TableMap.get(table)\n const rect = {\n left: 0,\n top: 0,\n right: map.width,\n bottom: map.height,\n map,\n table,\n tableStart: at.pos + 1,\n }\n let tr = current.state.tr\n if (axis === 'row') tr = addRow(tr, rect, map.height)\n else {\n const columns = fitColumns(table.attrs.columns, map.width)\n columns.push({ id: createId() })\n tr = addColumn(tr, rect, map.width).setNodeAttribute(at.pos, 'columns', columns)\n }\n current.dispatch(tr)\n}\n\n/* dragging rows and columns by their handle */\n\ninterface Drag {\n axis: 'row' | 'column'\n tablePos: number\n /** The lines that move: the target's, with any merged cells they belong to. */\n start: number\n end: number\n x: number\n y: number\n /** Where they go: the line they go before, or `null` for where they are. */\n to: number | null\n}\n\nlet drag: Drag | null = null\nconst dragging = shallowRef(false)\nconst drop = shallowRef<{ axis: 'row' | 'column'; at: number } | null>(null)\n/** A copy of the dragged lines that follows the pointer. */\nlet ghost: HTMLElement | null = null\n\nfunction onHandleDown(axis: 'row' | 'column', event: PointerEvent) {\n const current = view.value\n const at = target.value\n if (event.button !== 0 || !current || !at || !current.editable) return\n const map = TableMap.get(current.state.doc.nodeAt(at.pos)!)\n const [from, to] = axis === 'row' ? [at.rect.top, at.rect.bottom] : [at.rect.left, at.rect.right]\n const lines = band(map, axis, from, to)\n drag = { axis, tablePos: at.pos, ...lines, x: event.clientX, y: event.clientY, to: null }\n window.addEventListener('pointermove', onDragMove)\n window.addEventListener('pointerup', onDragUp)\n window.addEventListener('pointercancel', onDragCancel)\n}\n\n/** Each boundary a run can go to, and where it is (relative to the editor). */\nfunction cutPlaces(moving: Drag): { cut: number; at: number }[] {\n const current = view.value\n const host = root.value\n const table = current?.state.doc.nodeAt(moving.tablePos)\n const element = (current?.nodeDOM(moving.tablePos) as HTMLElement | null)?.querySelector('table')\n if (!current || !host || !table || !element) return []\n const box = host.getBoundingClientRect()\n const tableBox = element.getBoundingClientRect()\n const map = TableMap.get(table)\n const places: { cut: number; at: number }[] = []\n if (moving.axis === 'row') {\n const tops: number[] = []\n table.forEach((_row, offset) => {\n const row = current.nodeDOM(moving.tablePos + 1 + offset) as HTMLElement | null\n tops.push((row?.getBoundingClientRect().top ?? tableBox.top) - box.top)\n })\n for (const cut of boundaries(map, 'row'))\n places.push({ cut, at: cut < map.height ? tops[cut]! : tableBox.bottom - box.top })\n return places\n }\n for (const cut of boundaries(map, 'column')) {\n if (cut === map.width) {\n places.push({ cut, at: tableBox.right - box.left })\n continue\n }\n // no merged cell crosses a boundary, so the first row has a cell starting there\n let row = 0\n while (row < map.height && map.findCell(map.map[row * map.width + cut]!).left !== cut) row++\n const cell = cellElement(moving.tablePos, row, cut)\n if (cell) places.push({ cut, at: cell.getBoundingClientRect().left - box.left })\n }\n return places\n}\n\nfunction showGhost(moving: Drag) {\n const current = view.value\n const host = root.value\n const table = current?.state.doc.nodeAt(moving.tablePos)\n const element = (current?.nodeDOM(moving.tablePos) as HTMLElement | null)?.querySelector('table')\n if (!current || !host || !table || !element) return\n const map = TableMap.get(table)\n const copy = document.createElement('table')\n copy.className = 'dou-editor-table'\n const body = document.createElement('tbody')\n copy.append(body)\n let width = 0\n const [rows, cols] =\n moving.axis === 'row'\n ? [\n [moving.start, moving.end],\n [0, map.width],\n ]\n : [\n [0, map.height],\n [moving.start, moving.end],\n ]\n for (let row = rows[0]!; row < rows[1]!; row++) {\n const line = document.createElement('tr')\n let lineWidth = 0\n for (let col = cols[0]!; col < cols[1]!; col++) {\n const rect = map.findCell(map.map[row * map.width + col]!)\n if (rect.top !== row || rect.left !== col) continue\n const cell = cellElement(moving.tablePos, row, col)\n if (!cell) continue\n const clone = cell.cloneNode(true) as HTMLElement\n clone.classList.remove('selectedCell')\n clone.style.width = `${cell.getBoundingClientRect().width}px`\n lineWidth += cell.getBoundingClientRect().width\n line.append(clone)\n }\n width = Math.max(width, lineWidth)\n body.append(line)\n }\n ghost = document.createElement('div')\n ghost.className = 'dou-editor__surface dou-editor__ghost dou-editor-table__ghost'\n ghost.setAttribute('aria-hidden', 'true')\n ghost.style.width = `${Math.min(width, 360) + 2}px`\n ghost.append(copy)\n host.append(ghost)\n}\n\nfunction onDragMove(event: PointerEvent) {\n const moving = drag\n if (!moving) return\n if (!dragging.value) {\n if (Math.hypot(event.clientX - moving.x, event.clientY - moving.y) < 4) return\n dragging.value = true\n columnMenu.value = false\n rowMenu.value = false\n const current = view.value\n if (current)\n current.dispatch(\n selectLines(current.state.tr, moving.tablePos, moving.axis, moving.start, moving.end),\n )\n showGhost(moving)\n }\n if (ghost) ghost.style.transform = `translate(${event.clientX + 12}px, ${event.clientY + 12}px)`\n const host = root.value\n if (!host) return\n const box = host.getBoundingClientRect()\n const pointer = moving.axis === 'row' ? event.clientY - box.top : event.clientX - box.left\n let best: { cut: number; at: number } | null = null\n for (const place of cutPlaces(moving))\n if (!best || Math.abs(place.at - pointer) < Math.abs(best.at - pointer)) best = place\n // a boundary of the run itself leaves it where it is\n if (!best || (best.cut >= moving.start && best.cut <= moving.end)) {\n moving.to = null\n drop.value = null\n return\n }\n moving.to = best.cut\n drop.value = { axis: moving.axis, at: best.at }\n}\n\nfunction onDragUp() {\n endDrag(true)\n}\n\nfunction onDragCancel() {\n endDrag(false)\n}\n\nfunction endDrag(apply: boolean) {\n window.removeEventListener('pointermove', onDragMove)\n window.removeEventListener('pointerup', onDragUp)\n window.removeEventListener('pointercancel', onDragCancel)\n const moving = drag\n drag = null\n ghost?.remove()\n ghost = null\n drop.value = null\n if (!dragging.value) {\n // a press without a drag opens the menu; on release rather than on\n // click, as the press may close another menu and move the handles\n if (apply && moving) openMenu(moving.axis, moving)\n return\n }\n dragging.value = false\n if (apply && moving?.to !== null && moving)\n run(moveLinesTo(moving.tablePos, moving.axis, moving.start, moving.end, moving.to))\n collapseLines()\n schedule()\n}\n\nconst hasCellSelection = computed(() => {\n const selection = state.value?.selection\n return selection instanceof CellSelection && selection.$anchorCell.pos !== selection.$headCell.pos\n})\n\nconst visible = computed(() => !!layout.value && !!target.value)\n</script>\n\n<template>\n <div v-if=\"visible && layout\" class=\"dou-editor-table-controls\" @mousedown.prevent>\n <!-- column handle, above the column -->\n <DouDropdown\n v-model:open=\"columnMenu\"\n trigger=\"manual\"\n placement=\"bottom-start\"\n class=\"dou-editor-menu\"\n >\n <button\n type=\"button\"\n tabindex=\"-1\"\n v-show=\"!handlesHidden\"\n class=\"dou-editor-table__handle is-column\"\n :class=\"{ 'is-active': columnMenu }\"\n :style=\"{\n top: `${layout.table.top}px`,\n left: `${Math.min(Math.max(layout.column.left + layout.column.width / 2, layout.frame.left + 12), layout.frame.right - 12)}px`,\n }\"\n :aria-label=\"messages.table.column\"\n :title=\"messages.table.column\"\n @pointerdown=\"onHandleDown('column', $event)\"\n >\n <GripHorizontalIcon />\n </button>\n <template #menu>\n <DouDropdownItem @click=\"run(insertColumn('before'))\">\n <template #prefix><ArrowLeftToLineIcon /></template>\n {{ messages.table.insertLeft }}\n </DouDropdownItem>\n <DouDropdownItem @click=\"run(insertColumn('after'))\">\n <template #prefix><ArrowRightToLineIcon /></template>\n {{ messages.table.insertRight }}\n </DouDropdownItem>\n <DouDropdownItem\n divided\n :disabled=\"!can(moveLines('column', -1))\"\n @click=\"run(moveLines('column', -1))\"\n >\n <template #prefix><ArrowLeftIcon /></template>\n {{ messages.table.moveLeft }}\n </DouDropdownItem>\n <DouDropdownItem\n :disabled=\"!can(moveLines('column', 1))\"\n @click=\"run(moveLines('column', 1))\"\n >\n <template #prefix><ArrowRightIcon /></template>\n {{ messages.table.moveRight }}\n </DouDropdownItem>\n <DouDropdownSub divided :title=\"aligns.find((item) => item.value === columnAlign)!.label()\">\n <template #prefix>\n <component :is=\"aligns.find((item) => item.value === columnAlign)!.icon\" />\n </template>\n <DouDropdownItem\n v-for=\"item in aligns\"\n :key=\"item.value\"\n @click=\"run(alignColumns(item.value))\"\n >\n <template #prefix><component :is=\"item.icon\" /></template>\n {{ item.label() }}\n <template v-if=\"item.value === columnAlign\" #suffix><CheckIcon /></template>\n </DouDropdownItem>\n </DouDropdownSub>\n <DouDropdownItem v-if=\"target?.rect.left === 0\" @click=\"run(toggleHeader('headerColumn'))\">\n <template #prefix><LayoutColumnsIcon /></template>\n {{ messages.table.headerColumn }}\n <template v-if=\"tableNode?.attrs.headerColumn\" #suffix><CheckIcon /></template>\n </DouDropdownItem>\n <DouDropdownItem divided @click=\"run(clearCells)\">\n <template #prefix><EraserIcon /></template>\n {{ messages.table.clear }}\n </DouDropdownItem>\n <DouDropdownItem tone=\"danger\" :disabled=\"!can(deleteColumns)\" @click=\"run(deleteColumns)\">\n <template #prefix><TrashIcon /></template>\n {{ messages.table.deleteColumn }}\n </DouDropdownItem>\n </template>\n </DouDropdown>\n\n <!-- row handle, left of the row -->\n <DouDropdown\n v-model:open=\"rowMenu\"\n trigger=\"manual\"\n placement=\"right-start\"\n class=\"dou-editor-menu\"\n >\n <button\n type=\"button\"\n tabindex=\"-1\"\n v-show=\"!handlesHidden\"\n class=\"dou-editor-table__handle is-row\"\n :class=\"{ 'is-active': rowMenu }\"\n :style=\"{\n top: `${layout.row.top + layout.row.height / 2}px`,\n left: `${layout.frame.left}px`,\n }\"\n :aria-label=\"messages.table.row\"\n :title=\"messages.table.row\"\n @pointerdown=\"onHandleDown('row', $event)\"\n >\n <GripVerticalIcon />\n </button>\n <template #menu>\n <DouDropdownItem @click=\"run(insertRow('before'))\">\n <template #prefix><ArrowUpToLineIcon /></template>\n {{ messages.table.insertAbove }}\n </DouDropdownItem>\n <DouDropdownItem @click=\"run(insertRow('after'))\">\n <template #prefix><ArrowDownFromLineIcon /></template>\n {{ messages.table.insertBelow }}\n </DouDropdownItem>\n <DouDropdownItem\n divided\n :disabled=\"!can(moveLines('row', -1))\"\n @click=\"run(moveLines('row', -1))\"\n >\n <template #prefix><ArrowUpIcon /></template>\n {{ messages.table.moveUp }}\n </DouDropdownItem>\n <DouDropdownItem :disabled=\"!can(moveLines('row', 1))\" @click=\"run(moveLines('row', 1))\">\n <template #prefix><ArrowDownIcon /></template>\n {{ messages.table.moveDown }}\n </DouDropdownItem>\n <DouDropdownItem\n v-if=\"target?.rect.top === 0\"\n divided\n @click=\"run(toggleHeader('headerRow'))\"\n >\n <template #prefix><LayoutRowsIcon /></template>\n {{ messages.table.headerRow }}\n <template v-if=\"tableNode?.attrs.headerRow\" #suffix><CheckIcon /></template>\n </DouDropdownItem>\n <DouDropdownItem divided @click=\"run(clearCells)\">\n <template #prefix><EraserIcon /></template>\n {{ messages.table.clear }}\n </DouDropdownItem>\n <DouDropdownItem tone=\"danger\" :disabled=\"!can(deleteRows)\" @click=\"run(deleteRows)\">\n <template #prefix><TrashIcon /></template>\n {{ messages.table.deleteRow }}\n </DouDropdownItem>\n </template>\n </DouDropdown>\n\n <!-- + bars -->\n <button\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-editor-table__add is-column\"\n :style=\"{\n top: `${layout.table.top}px`,\n left: `${Math.min(layout.table.left + layout.table.width, layout.frame.right)}px`,\n height: `${layout.table.height}px`,\n }\"\n :aria-label=\"messages.table.addColumn\"\n :title=\"messages.table.addColumn\"\n @click=\"addAtEnd('column')\"\n >\n <PlusIcon />\n </button>\n <button\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-editor-table__add is-row\"\n :style=\"{\n top: `${layout.table.top + layout.table.height}px`,\n left: `${layout.frame.left}px`,\n width: `${Math.min(layout.table.left + layout.table.width, layout.frame.right) - layout.frame.left}px`,\n }\"\n :aria-label=\"messages.table.addRow\"\n :title=\"messages.table.addRow\"\n @click=\"addAtEnd('row')\"\n >\n <PlusIcon />\n </button>\n\n <!-- where dragged lines go -->\n <div\n v-if=\"drop\"\n class=\"dou-editor__drop\"\n :class=\"{ 'is-vertical': drop.axis === 'column' }\"\n :style=\"\n drop.axis === 'row'\n ? {\n top: `${drop.at}px`,\n left: `${layout.frame.left}px`,\n width: `${Math.min(layout.table.left + layout.table.width, layout.frame.right) - layout.frame.left}px`,\n }\n : {\n top: `${layout.table.top}px`,\n left: `${drop.at}px`,\n height: `${layout.table.height}px`,\n }\n \"\n />\n\n <!-- cells: merge, unmerge, clear -->\n <div\n v-if=\"barShown && layout.bar && !dragging\"\n class=\"dou-editor-table__cells\"\n :class=\"{ 'is-below': layout.bar.below }\"\n :style=\"{ top: `${layout.bar.top}px`, left: `${layout.bar.left}px` }\"\n >\n <button\n v-if=\"hasCellSelection\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-editor-table__cells-button\"\n :disabled=\"!can(mergeCells)\"\n @click=\"run(mergeCells)\"\n >\n <MergeIcon />{{ messages.table.merge }}\n </button>\n <button\n v-if=\"can(splitMergedCell)\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-editor-table__cells-button\"\n @click=\"run(splitMergedCell)\"\n >\n <SplitIcon />{{ messages.table.split }}\n </button>\n <button\n v-if=\"hasCellSelection\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-editor-table__cells-button\"\n :aria-label=\"messages.table.clear\"\n :title=\"messages.table.clear\"\n @click=\"run(clearCells)\"\n >\n <EraserIcon />\n </button>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TableView } from "prosemirror-tables";
|
|
2
|
+
/**
|
|
3
|
+
* A table in the editor: a scrolling frame (the block's content element)
|
|
4
|
+
* around the table, with a `<colgroup>` that holds the column widths.
|
|
5
|
+
*/
|
|
6
|
+
var TableBlockView = class extends TableView {
|
|
7
|
+
constructor(node) {
|
|
8
|
+
super(node, 96);
|
|
9
|
+
this.dom.className = "dou-editor__content dou-editor__content--table";
|
|
10
|
+
this.dom.dataset.contentType = "table";
|
|
11
|
+
this.table.className = "dou-editor-table";
|
|
12
|
+
}
|
|
13
|
+
ignoreMutation(record) {
|
|
14
|
+
return record.type === "attributes" && record.target === this.dom ? true : super.ignoreMutation(record);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
export { TableBlockView };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","names":[],"sources":["../../../src/extensions/table/view.ts"],"sourcesContent":["import type { Node as PMNode } from 'prosemirror-model'\nimport { TableView } from 'prosemirror-tables'\nimport type { NodeView, ViewMutationRecord } from 'prosemirror-view'\n\n/** The narrowest a column gets, without a width of its own and when resized. */\nexport const CELL_MIN_WIDTH = 96\n\n/**\n * A table in the editor: a scrolling frame (the block's content element)\n * around the table, with a `<colgroup>` that holds the column widths.\n */\nexport class TableBlockView extends TableView implements NodeView {\n constructor(node: PMNode) {\n super(node, CELL_MIN_WIDTH)\n this.dom.className = 'dou-editor__content dou-editor__content--table'\n this.dom.dataset.contentType = 'table'\n this.table.className = 'dou-editor-table'\n }\n\n override ignoreMutation(record: ViewMutationRecord) {\n // the frame's scroll position and classes are ours\n return record.type === 'attributes' && record.target === this.dom\n ? true\n : super.ignoreMutation(record)\n }\n}\n"],"mappings":";;;;;AAWA,IAAa,iBAAb,cAAoC,UAA8B;CAChE,YAAY,MAAc;EACxB,MAAM,MAAA,EAAoB;EAC1B,KAAK,IAAI,YAAY;EACrB,KAAK,IAAI,QAAQ,cAAc;EAC/B,KAAK,MAAM,YAAY;CACzB;CAEA,eAAwB,QAA4B;EAElD,OAAO,OAAO,SAAS,gBAAgB,OAAO,WAAW,KAAK,MAC1D,OACA,MAAM,eAAe,MAAM;CACjC;AACF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { defineEditorExtension } from "../../core/extension.js";
|
|
2
|
+
import { blockAround } from "../../core/blocks.js";
|
|
3
|
+
import { blockElement } from "../../core/prepare.js";
|
|
4
|
+
import { flipToggle, isToggleOpen, togglePlugin } from "./state.js";
|
|
5
|
+
import toggle_block_default from "./toggle-block.js";
|
|
6
|
+
import { TextSelection } from "prosemirror-state";
|
|
7
|
+
import { ChevronRightSquareIcon } from "@dou-ui/icons";
|
|
8
|
+
// src/extensions/toggle/index.ts
|
|
9
|
+
/**
|
|
10
|
+
* `Enter` at the end of a toggle's title: an open toggle (or one without
|
|
11
|
+
* children) gets a first child, a closed one a new toggle below it.
|
|
12
|
+
*/
|
|
13
|
+
var enter = (state, dispatch, view) => {
|
|
14
|
+
const { $from, empty } = state.selection;
|
|
15
|
+
const info = blockAround($from);
|
|
16
|
+
if (!empty || !info || info.content !== $from.parent || info.content.type.name !== "toggle") return false;
|
|
17
|
+
if ($from.parentOffset !== $from.parent.content.size || $from.parent.content.size === 0) return false;
|
|
18
|
+
const { schema } = state;
|
|
19
|
+
const id = info.node.attrs.id;
|
|
20
|
+
const open = isToggleOpen(state, id);
|
|
21
|
+
if (!dispatch) return true;
|
|
22
|
+
if (!open && info.group) {
|
|
23
|
+
const at = info.pos + info.node.nodeSize;
|
|
24
|
+
const tr = state.tr.insert(at, schema.nodes.block.create(null, schema.nodes.toggle.create()));
|
|
25
|
+
dispatch(tr.setSelection(TextSelection.create(tr.doc, at + 2)).scrollIntoView());
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
if (!open && view) flipToggle(view, id);
|
|
29
|
+
const child = schema.nodes.block.create(null, schema.nodes.paragraph.create());
|
|
30
|
+
const end = info.contentPos + info.content.nodeSize;
|
|
31
|
+
const tr = info.group ? state.tr.insert(end + 1, child) : state.tr.insert(end, schema.nodes.blockGroup.create(null, child));
|
|
32
|
+
dispatch(tr.setSelection(TextSelection.create(tr.doc, end + 3)).scrollIntoView());
|
|
33
|
+
return true;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A toggle: a title with a button that shows or hides the blocks nested
|
|
37
|
+
* under it. Whether it is open belongs to the reader, not the document.
|
|
38
|
+
*/
|
|
39
|
+
var toggle = defineEditorExtension({
|
|
40
|
+
name: "toggle",
|
|
41
|
+
blocks: { toggle: {
|
|
42
|
+
content: "inline*",
|
|
43
|
+
defining: true,
|
|
44
|
+
component: toggle_block_default,
|
|
45
|
+
parseDOM: [{ tag: "div[data-content-type=\"toggle\"]" }, { tag: "details > summary" }],
|
|
46
|
+
toDOM: () => [
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
class: "dou-editor__content dou-editor__content--toggle",
|
|
50
|
+
"data-content-type": "toggle"
|
|
51
|
+
},
|
|
52
|
+
0
|
|
53
|
+
]
|
|
54
|
+
} },
|
|
55
|
+
output: { blocks: { toggle: {
|
|
56
|
+
html: (_block, { content, children }) => `<details><summary>${content}</summary>${children}</details>`,
|
|
57
|
+
markdown: (_block, { html, children }) => `<details>\n<summary>${html}</summary>\n\n${children ? `${children}\n\n` : ""}</details>`
|
|
58
|
+
} } },
|
|
59
|
+
prepareHTML: (root) => {
|
|
60
|
+
for (const details of Array.from(root.querySelectorAll("details"))) {
|
|
61
|
+
const summary = details.querySelector(":scope > summary");
|
|
62
|
+
const content = summary ? Array.from(summary.childNodes) : [];
|
|
63
|
+
summary?.remove();
|
|
64
|
+
const children = Array.from(details.childNodes);
|
|
65
|
+
details.replaceWith(blockElement(details.ownerDocument, "toggle", content, children));
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
keymap: () => ({ enter }),
|
|
69
|
+
plugins: () => [togglePlugin()],
|
|
70
|
+
blockOptions: [{
|
|
71
|
+
key: "toggle",
|
|
72
|
+
type: "toggle",
|
|
73
|
+
label: (m) => m.types.toggle,
|
|
74
|
+
hint: (m) => m.hints.toggle,
|
|
75
|
+
icon: ChevronRightSquareIcon,
|
|
76
|
+
keywords: [
|
|
77
|
+
"toggle",
|
|
78
|
+
"collapse",
|
|
79
|
+
"details",
|
|
80
|
+
"zd",
|
|
81
|
+
"zhedie"
|
|
82
|
+
]
|
|
83
|
+
}]
|
|
84
|
+
});
|
|
85
|
+
export { isToggleOpen, toggle };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["ToggleBlock"],"sources":["../../../src/extensions/toggle/index.ts"],"sourcesContent":["import { ChevronRightSquareIcon } from '@dou-ui/icons'\nimport { TextSelection, type Command } from 'prosemirror-state'\nimport { blockAround } from '../../core/blocks'\nimport { defineEditorExtension } from '../../core/extension'\nimport { blockElement } from '../../core/prepare'\nimport { flipToggle, isToggleOpen, togglePlugin } from './state'\nimport ToggleBlock from './toggle-block.vue'\n\n/**\n * `Enter` at the end of a toggle's title: an open toggle (or one without\n * children) gets a first child, a closed one a new toggle below it.\n */\nconst enter: Command = (state, dispatch, view) => {\n const { $from, empty } = state.selection\n const info = blockAround($from)\n if (!empty || !info || info.content !== $from.parent || info.content.type.name !== 'toggle')\n return false\n if ($from.parentOffset !== $from.parent.content.size || $from.parent.content.size === 0)\n return false\n const { schema } = state\n const id = info.node.attrs.id as string\n const open = isToggleOpen(state, id)\n if (!dispatch) return true\n if (!open && info.group) {\n const at = info.pos + info.node.nodeSize\n const tr = state.tr.insert(at, schema.nodes.block!.create(null, schema.nodes.toggle!.create()))\n dispatch(tr.setSelection(TextSelection.create(tr.doc, at + 2)).scrollIntoView())\n return true\n }\n if (!open && view) flipToggle(view, id)\n const child = schema.nodes.block!.create(null, schema.nodes.paragraph!.create())\n const end = info.contentPos + info.content.nodeSize\n const tr = info.group\n ? state.tr.insert(end + 1, child)\n : state.tr.insert(end, schema.nodes.blockGroup!.create(null, child))\n dispatch(tr.setSelection(TextSelection.create(tr.doc, end + 3)).scrollIntoView())\n return true\n}\n\n/**\n * A toggle: a title with a button that shows or hides the blocks nested\n * under it. Whether it is open belongs to the reader, not the document.\n */\nexport const toggle = defineEditorExtension({\n name: 'toggle',\n blocks: {\n toggle: {\n content: 'inline*',\n defining: true,\n component: ToggleBlock,\n parseDOM: [{ tag: 'div[data-content-type=\"toggle\"]' }, { tag: 'details > summary' }],\n toDOM: () => [\n 'div',\n { class: 'dou-editor__content dou-editor__content--toggle', 'data-content-type': 'toggle' },\n 0,\n ],\n },\n },\n output: {\n blocks: {\n toggle: {\n html: (_block, { content, children }) =>\n `<details><summary>${content}</summary>${children}</details>`,\n // Markdown has no toggle; GitHub and most renderers show `<details>`\n markdown: (_block, { html, children }) =>\n `<details>\\n<summary>${html}</summary>\\n\\n${children ? `${children}\\n\\n` : ''}</details>`,\n },\n },\n },\n prepareHTML: (root) => {\n for (const details of Array.from(root.querySelectorAll('details'))) {\n const summary = details.querySelector(':scope > summary')\n const content = summary ? Array.from(summary.childNodes) : []\n summary?.remove()\n const children = Array.from(details.childNodes)\n details.replaceWith(blockElement(details.ownerDocument, 'toggle', content, children))\n }\n },\n keymap: () => ({ enter }),\n plugins: () => [togglePlugin()],\n blockOptions: [\n {\n key: 'toggle',\n type: 'toggle',\n label: (m) => m.types.toggle,\n hint: (m) => m.hints.toggle,\n icon: ChevronRightSquareIcon,\n keywords: ['toggle', 'collapse', 'details', 'zd', 'zhedie'],\n },\n ],\n})\n\nexport { isToggleOpen }\n"],"mappings":";;;;;;;;;;;;AAYA,IAAM,SAAkB,OAAO,UAAU,SAAS;CAChD,MAAM,EAAE,OAAO,UAAU,MAAM;CAC/B,MAAM,OAAO,YAAY,KAAK;CAC9B,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,YAAY,MAAM,UAAU,KAAK,QAAQ,KAAK,SAAS,UACjF,OAAO;CACT,IAAI,MAAM,iBAAiB,MAAM,OAAO,QAAQ,QAAQ,MAAM,OAAO,QAAQ,SAAS,GACpF,OAAO;CACT,MAAM,EAAE,WAAW;CACnB,MAAM,KAAK,KAAK,KAAK,MAAM;CAC3B,MAAM,OAAO,aAAa,OAAO,EAAE;CACnC,IAAI,CAAC,UAAU,OAAO;CACtB,IAAI,CAAC,QAAQ,KAAK,OAAO;EACvB,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK;EAChC,MAAM,KAAK,MAAM,GAAG,OAAO,IAAI,OAAO,MAAM,MAAO,OAAO,MAAM,OAAO,MAAM,OAAQ,OAAO,CAAC,CAAC;EAC9F,SAAS,GAAG,aAAa,cAAc,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;EAC/E,OAAO;CACT;CACA,IAAI,CAAC,QAAQ,MAAM,WAAW,MAAM,EAAE;CACtC,MAAM,QAAQ,OAAO,MAAM,MAAO,OAAO,MAAM,OAAO,MAAM,UAAW,OAAO,CAAC;CAC/E,MAAM,MAAM,KAAK,aAAa,KAAK,QAAQ;CAC3C,MAAM,KAAK,KAAK,QACZ,MAAM,GAAG,OAAO,MAAM,GAAG,KAAK,IAC9B,MAAM,GAAG,OAAO,KAAK,OAAO,MAAM,WAAY,OAAO,MAAM,KAAK,CAAC;CACrE,SAAS,GAAG,aAAa,cAAc,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;CAChF,OAAO;AACT;;;;;AAMA,IAAa,SAAS,sBAAsB;CAC1C,MAAM;CACN,QAAQ,EACN,QAAQ;EACN,SAAS;EACT,UAAU;EACV,WAAWA;EACX,UAAU,CAAC,EAAE,KAAK,oCAAkC,GAAG,EAAE,KAAK,oBAAoB,CAAC;EACnF,aAAa;GACX;GACA;IAAE,OAAO;IAAmD,qBAAqB;GAAS;GAC1F;EACF;CACF,EACF;CACA,QAAQ,EACN,QAAQ,EACN,QAAQ;EACN,OAAO,QAAQ,EAAE,SAAS,eACxB,qBAAqB,QAAQ,YAAY,SAAS;EAEpD,WAAW,QAAQ,EAAE,MAAM,eACzB,uBAAuB,KAAK,gBAAgB,WAAW,GAAG,SAAS,QAAQ,GAAG;CAClF,EACF,EACF;CACA,cAAc,SAAS;EACrB,KAAK,MAAM,WAAW,MAAM,KAAK,KAAK,iBAAiB,SAAS,CAAC,GAAG;GAClE,MAAM,UAAU,QAAQ,cAAc,kBAAkB;GACxD,MAAM,UAAU,UAAU,MAAM,KAAK,QAAQ,UAAU,IAAI,CAAC;GAC5D,SAAS,OAAO;GAChB,MAAM,WAAW,MAAM,KAAK,QAAQ,UAAU;GAC9C,QAAQ,YAAY,aAAa,QAAQ,eAAe,UAAU,SAAS,QAAQ,CAAC;EACtF;CACF;CACA,eAAe,EAAE,MAAM;CACvB,eAAe,CAAC,aAAa,CAAC;CAC9B,cAAc,CACZ;EACE,KAAK;EACL,MAAM;EACN,QAAQ,MAAM,EAAE,MAAM;EACtB,OAAO,MAAM,EAAE,MAAM;EACrB,MAAM;EACN,UAAU;GAAC;GAAU;GAAY;GAAW;GAAM;EAAQ;CAC5D,CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { allBlocks, findBlockById } from "../../core/blocks.js";
|
|
2
|
+
import { Plugin, PluginKey, TextSelection } from "prosemirror-state";
|
|
3
|
+
import { Decoration, DecorationSet } from "prosemirror-view";
|
|
4
|
+
// src/extensions/toggle/state.ts
|
|
5
|
+
var toggleKey = new PluginKey("dou-editor-toggle");
|
|
6
|
+
var isToggle = (node) => node.firstChild?.type.name === "toggle";
|
|
7
|
+
/**
|
|
8
|
+
* The decorations for the closed toggles. A closed toggle turned into
|
|
9
|
+
* another type is no longer closed: turned back, it starts open like any
|
|
10
|
+
* toggle added later. Removed toggles stay closed, for when they come back.
|
|
11
|
+
*/
|
|
12
|
+
function rebuild(doc, closed) {
|
|
13
|
+
if (!closed.size) return {
|
|
14
|
+
closed,
|
|
15
|
+
decorations: DecorationSet.empty
|
|
16
|
+
};
|
|
17
|
+
const decorations = [];
|
|
18
|
+
let kept = closed;
|
|
19
|
+
for (const info of allBlocks(doc)) {
|
|
20
|
+
const id = info.node.attrs.id;
|
|
21
|
+
if (!closed.has(id)) continue;
|
|
22
|
+
if (isToggle(info.node)) decorations.push(Decoration.node(info.pos, info.pos + info.node.nodeSize, { class: "is-collapsed" }));
|
|
23
|
+
else {
|
|
24
|
+
if (kept === closed) kept = new Set(closed);
|
|
25
|
+
kept.delete(id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
closed: kept,
|
|
30
|
+
decorations: DecorationSet.create(doc, decorations)
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Whether a transaction inserts a toggle that is closed. */
|
|
34
|
+
function insertsClosed(tr, closed) {
|
|
35
|
+
if (!closed.size) return false;
|
|
36
|
+
return tr.steps.some((step) => {
|
|
37
|
+
const slice = step.slice;
|
|
38
|
+
let found = false;
|
|
39
|
+
slice?.content.descendants((node) => {
|
|
40
|
+
if (found) return false;
|
|
41
|
+
if (isToggle(node) && closed.has(node.attrs.id)) found = true;
|
|
42
|
+
return !found && (node.type.name === "block" || node.type.name === "blockGroup");
|
|
43
|
+
});
|
|
44
|
+
return found;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Toggles around the cursor open, so the cursor never sits in hidden text. */
|
|
48
|
+
function revealSelection(state, closed) {
|
|
49
|
+
const { $head } = state.selection;
|
|
50
|
+
let changed = false;
|
|
51
|
+
for (let depth = $head.depth - 1; depth > 0; depth--) {
|
|
52
|
+
if ($head.node(depth).type.name !== "blockGroup") continue;
|
|
53
|
+
const block = $head.node(depth - 1);
|
|
54
|
+
if (isToggle(block) && closed.delete(block.attrs.id)) changed = true;
|
|
55
|
+
}
|
|
56
|
+
return changed;
|
|
57
|
+
}
|
|
58
|
+
function togglePlugin() {
|
|
59
|
+
return new Plugin({
|
|
60
|
+
key: toggleKey,
|
|
61
|
+
state: {
|
|
62
|
+
init(_config, state) {
|
|
63
|
+
const closed = new Set(allBlocks(state.doc).filter((info) => isToggle(info.node)).map((info) => info.node.attrs.id));
|
|
64
|
+
return rebuild(state.doc, closed);
|
|
65
|
+
},
|
|
66
|
+
apply(tr, value, _old, state) {
|
|
67
|
+
const flip = tr.getMeta(toggleKey);
|
|
68
|
+
let closed = value.closed;
|
|
69
|
+
let changed = false;
|
|
70
|
+
const edit = () => {
|
|
71
|
+
if (closed === value.closed) closed = new Set(closed);
|
|
72
|
+
changed = true;
|
|
73
|
+
};
|
|
74
|
+
if (flip) {
|
|
75
|
+
edit();
|
|
76
|
+
if (!closed.delete(flip)) closed.add(flip);
|
|
77
|
+
}
|
|
78
|
+
if (tr.selectionSet || tr.docChanged) {
|
|
79
|
+
const copy = closed === value.closed ? new Set(closed) : closed;
|
|
80
|
+
if (revealSelection(state, copy)) {
|
|
81
|
+
closed = copy;
|
|
82
|
+
changed = true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (!changed && !tr.docChanged) return value;
|
|
86
|
+
if (!changed && !insertsClosed(tr, closed)) {
|
|
87
|
+
const decorations = value.decorations.map(tr.mapping, tr.doc);
|
|
88
|
+
if (!decorations.find().some((decoration) => {
|
|
89
|
+
const node = tr.doc.nodeAt(decoration.from);
|
|
90
|
+
return !node || !isToggle(node);
|
|
91
|
+
})) return {
|
|
92
|
+
closed,
|
|
93
|
+
decorations
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return rebuild(state.doc, closed);
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
props: { decorations: (state) => toggleKey.getState(state)?.decorations }
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function isToggleOpen(state, id) {
|
|
103
|
+
if (!state) return true;
|
|
104
|
+
return !toggleKey.getState(state)?.closed.has(id);
|
|
105
|
+
}
|
|
106
|
+
/** Open or close the toggle with this block id. */
|
|
107
|
+
function flipToggle(view, id) {
|
|
108
|
+
const { state } = view;
|
|
109
|
+
const tr = state.tr.setMeta(toggleKey, id).setMeta("addToHistory", false);
|
|
110
|
+
const info = findBlockById(state.doc, id);
|
|
111
|
+
if (info && isToggleOpen(state, id) && info.group) {
|
|
112
|
+
const start = info.contentPos + info.content.nodeSize;
|
|
113
|
+
const { from } = state.selection;
|
|
114
|
+
if (from > start && from < info.pos + info.node.nodeSize) tr.setSelection(TextSelection.create(tr.doc, start - 1));
|
|
115
|
+
}
|
|
116
|
+
view.dispatch(tr);
|
|
117
|
+
}
|
|
118
|
+
export { flipToggle, isToggleOpen, toggleKey, togglePlugin };
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","names":[],"sources":["../../../src/extensions/toggle/state.ts"],"sourcesContent":["import type { Node as PMNode, Slice } from 'prosemirror-model'\nimport {\n Plugin,\n PluginKey,\n TextSelection,\n type EditorState,\n type Transaction,\n} from 'prosemirror-state'\nimport { Decoration, DecorationSet, type EditorView } from 'prosemirror-view'\nimport { allBlocks, findBlockById } from '../../core/blocks'\n\n/**\n * Which toggles are closed, by block id. This is how one reader sees the\n * document, not part of it: opening a toggle does not change the document,\n * works while read-only, and is not shared with collaborators.\n */\ninterface ToggleState {\n closed: ReadonlySet<string>\n decorations: DecorationSet\n}\n\nexport const toggleKey = new PluginKey<ToggleState>('dou-editor-toggle')\n\nconst isToggle = (node: PMNode) => node.firstChild?.type.name === 'toggle'\n\n/**\n * The decorations for the closed toggles. A closed toggle turned into\n * another type is no longer closed: turned back, it starts open like any\n * toggle added later. Removed toggles stay closed, for when they come back.\n */\nfunction rebuild(doc: PMNode, closed: Set<string>): ToggleState {\n if (!closed.size) return { closed, decorations: DecorationSet.empty }\n const decorations: Decoration[] = []\n let kept = closed\n for (const info of allBlocks(doc)) {\n const id = info.node.attrs.id as string\n if (!closed.has(id)) continue\n if (isToggle(info.node))\n decorations.push(\n Decoration.node(info.pos, info.pos + info.node.nodeSize, { class: 'is-collapsed' }),\n )\n else {\n if (kept === closed) kept = new Set(closed)\n kept.delete(id)\n }\n }\n return { closed: kept, decorations: DecorationSet.create(doc, decorations) }\n}\n\n/** Whether a transaction inserts a toggle that is closed. */\nfunction insertsClosed(tr: Transaction, closed: ReadonlySet<string>): boolean {\n if (!closed.size) return false\n return tr.steps.some((step) => {\n const slice = (step as { slice?: Slice }).slice\n let found = false\n slice?.content.descendants((node) => {\n if (found) return false\n if (isToggle(node) && closed.has(node.attrs.id as string)) found = true\n return !found && (node.type.name === 'block' || node.type.name === 'blockGroup')\n })\n return found\n })\n}\n\n/** Toggles around the cursor open, so the cursor never sits in hidden text. */\nfunction revealSelection(state: EditorState, closed: Set<string>) {\n const { $head } = state.selection\n let changed = false\n // the cursor in a toggle's own title leaves it closed; only its children are hidden\n for (let depth = $head.depth - 1; depth > 0; depth--) {\n const node = $head.node(depth)\n if (node.type.name !== 'blockGroup') continue\n const block = $head.node(depth - 1)\n if (isToggle(block) && closed.delete(block.attrs.id)) changed = true\n }\n return changed\n}\n\nexport function togglePlugin(): Plugin<ToggleState> {\n return new Plugin<ToggleState>({\n key: toggleKey,\n state: {\n // a document opens with its toggles closed; ones added later start open\n init(_config, state) {\n const closed = new Set(\n allBlocks(state.doc)\n .filter((info) => isToggle(info.node))\n .map((info) => info.node.attrs.id as string),\n )\n return rebuild(state.doc, closed)\n },\n apply(tr: Transaction, value, _old, state) {\n const flip = tr.getMeta(toggleKey) as string | undefined\n let closed = value.closed as Set<string>\n let changed = false\n const edit = () => {\n if (closed === value.closed) closed = new Set(closed)\n changed = true\n }\n if (flip) {\n edit()\n if (!closed.delete(flip)) closed.add(flip)\n }\n if (tr.selectionSet || tr.docChanged) {\n const copy = closed === value.closed ? new Set(closed) : closed\n if (revealSelection(state, copy)) {\n closed = copy\n changed = true\n }\n }\n if (!changed && !tr.docChanged) return value\n // typing moves the closed toggles' decorations along; no need to look for them again,\n // unless a closed toggle came back (moved, pasted, or its removal undone)\n if (!changed && !insertsClosed(tr, closed)) {\n const decorations = value.decorations.map(tr.mapping, tr.doc)\n // a closed toggle turned into another type keeps its block: look again\n const stale = decorations.find().some((decoration) => {\n const node = tr.doc.nodeAt(decoration.from)\n return !node || !isToggle(node)\n })\n if (!stale) return { closed, decorations }\n }\n return rebuild(state.doc, closed)\n },\n },\n props: {\n decorations: (state) => toggleKey.getState(state)?.decorations,\n },\n })\n}\n\nexport function isToggleOpen(state: EditorState | null, id: string): boolean {\n if (!state) return true\n return !toggleKey.getState(state)?.closed.has(id)\n}\n\n/** Open or close the toggle with this block id. */\nexport function flipToggle(view: EditorView, id: string) {\n const { state } = view\n const tr = state.tr.setMeta(toggleKey, id).setMeta('addToHistory', false)\n const info = findBlockById(state.doc, id)\n // closing around the cursor: take it to the end of the title\n if (info && isToggleOpen(state, id) && info.group) {\n const start = info.contentPos + info.content.nodeSize\n const { from } = state.selection\n if (from > start && from < info.pos + info.node.nodeSize)\n tr.setSelection(TextSelection.create(tr.doc, start - 1))\n }\n view.dispatch(tr)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import toggle_block_vue_vue_type_script_setup_true_lang_default from "./toggle-block.vue_vue_type_script_setup_true_lang.js";
|
|
2
|
+
// src/extensions/toggle/toggle-block.vue
|
|
3
|
+
var toggle_block_default = toggle_block_vue_vue_type_script_setup_true_lang_default;
|
|
4
|
+
export { toggle_block_default as default };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=toggle-block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle-block.js","names":["_sfc_main"],"sources":["../../../src/extensions/toggle/toggle-block.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronRightIcon } from '@dou-ui/icons'\nimport { computed } from 'vue'\nimport type { BlockProps } from '../../core/model'\nimport { EditorContent } from '../../define-block'\nimport { useEditor } from '../../editor'\nimport { flipToggle, isToggleOpen } from './state'\n\nconst props = defineProps<{\n block: { id: string; type: string; props: BlockProps }\n updateProps: (props: BlockProps) => void\n selected: boolean\n editable: boolean\n}>()\n\nconst { messages, state, view } = useEditor()\nconst open = computed(() => isToggleOpen(state.value, props.block.id))\n\nfunction flip() {\n if (view.value) flipToggle(view.value, props.block.id)\n}\n</script>\n\n<template>\n <div class=\"dou-editor-toggle\">\n <span class=\"dou-editor-toggle__control\" contenteditable=\"false\">\n <button\n type=\"button\"\n class=\"dou-editor-toggle__button\"\n :class=\"{ 'is-open': open }\"\n :aria-expanded=\"open\"\n :aria-label=\"open ? messages.toggle.collapse : messages.toggle.expand\"\n @mousedown.prevent\n @click=\"flip\"\n >\n <ChevronRightIcon />\n </button>\n </span>\n <EditorContent />\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { useEditor } from "../../editor.js";
|
|
2
|
+
import { EditorContent } from "../../define-block.js";
|
|
3
|
+
import { flipToggle, isToggleOpen } from "./state.js";
|
|
4
|
+
import { computed, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, unref, withModifiers } from "vue";
|
|
5
|
+
import { ChevronRightIcon } from "@dou-ui/icons";
|
|
6
|
+
// src/extensions/toggle/toggle-block.vue?vue&type=script&setup=true&lang.ts
|
|
7
|
+
var _hoisted_1 = { class: "dou-editor-toggle" };
|
|
8
|
+
var _hoisted_2 = {
|
|
9
|
+
class: "dou-editor-toggle__control",
|
|
10
|
+
contenteditable: "false"
|
|
11
|
+
};
|
|
12
|
+
var _hoisted_3 = ["aria-expanded", "aria-label"];
|
|
13
|
+
var toggle_block_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
14
|
+
__name: "toggle-block",
|
|
15
|
+
props: {
|
|
16
|
+
block: {},
|
|
17
|
+
updateProps: { type: Function },
|
|
18
|
+
selected: { type: Boolean },
|
|
19
|
+
editable: { type: Boolean }
|
|
20
|
+
},
|
|
21
|
+
setup(__props) {
|
|
22
|
+
const props = __props;
|
|
23
|
+
const { messages, state, view } = useEditor();
|
|
24
|
+
const open = computed(() => isToggleOpen(state.value, props.block.id));
|
|
25
|
+
function flip() {
|
|
26
|
+
if (view.value) flipToggle(view.value, props.block.id);
|
|
27
|
+
}
|
|
28
|
+
return (_ctx, _cache) => {
|
|
29
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("span", _hoisted_2, [createElementVNode("button", {
|
|
30
|
+
type: "button",
|
|
31
|
+
class: normalizeClass(["dou-editor-toggle__button", { "is-open": open.value }]),
|
|
32
|
+
"aria-expanded": open.value,
|
|
33
|
+
"aria-label": open.value ? unref(messages).toggle.collapse : unref(messages).toggle.expand,
|
|
34
|
+
onMousedown: _cache[0] || (_cache[0] = withModifiers(() => {}, ["prevent"])),
|
|
35
|
+
onClick: flip
|
|
36
|
+
}, [createVNode(unref(ChevronRightIcon))], 42, _hoisted_3)]), createVNode(unref(EditorContent))]);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
export { toggle_block_vue_vue_type_script_setup_true_lang_default as default };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=toggle-block.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle-block.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_normalizeClass","_unref","_withModifiers","_createVNode"],"sources":["../../../src/extensions/toggle/toggle-block.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronRightIcon } from '@dou-ui/icons'\nimport { computed } from 'vue'\nimport type { BlockProps } from '../../core/model'\nimport { EditorContent } from '../../define-block'\nimport { useEditor } from '../../editor'\nimport { flipToggle, isToggleOpen } from './state'\n\nconst props = defineProps<{\n block: { id: string; type: string; props: BlockProps }\n updateProps: (props: BlockProps) => void\n selected: boolean\n editable: boolean\n}>()\n\nconst { messages, state, view } = useEditor()\nconst open = computed(() => isToggleOpen(state.value, props.block.id))\n\nfunction flip() {\n if (view.value) flipToggle(view.value, props.block.id)\n}\n</script>\n\n<template>\n <div class=\"dou-editor-toggle\">\n <span class=\"dou-editor-toggle__control\" contenteditable=\"false\">\n <button\n type=\"button\"\n class=\"dou-editor-toggle__button\"\n :class=\"{ 'is-open': open }\"\n :aria-expanded=\"open\"\n :aria-label=\"open ? messages.toggle.collapse : messages.toggle.expand\"\n @mousedown.prevent\n @click=\"flip\"\n >\n <ChevronRightIcon />\n </button>\n </span>\n <EditorContent />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAQA,MAAM,QAAQ;EAOd,MAAM,EAAE,UAAU,OAAO,SAAS,UAAU;EAC5C,MAAM,OAAO,eAAe,aAAa,MAAM,OAAO,MAAM,MAAM,EAAE,CAAC;EAErE,SAAS,OAAO;GACd,IAAI,KAAK,OAAO,WAAW,KAAK,OAAO,MAAM,MAAM,EAAE;EACvD;;GAIE,OAAAA,UAAA,GAAAC,mBAeM,OAfN,YAeM,CAdJC,mBAYO,QAZP,YAYO,CAXLA,mBAUS,UAAA;IATP,MAAK;IACL,OAAKC,eAAA,CAAC,6BAA2B,EAAA,WACZ,KAAA,MAAI,CAAA,CAAA;IACxB,iBAAe,KAAA;IACf,cAAY,KAAA,QAAOC,MAAA,QAAA,CAAQ,CAAC,OAAO,WAAWA,MAAA,QAAA,CAAQ,CAAC,OAAO;IAC9D,aAAS,OAAA,OAAA,OAAA,KAAAC,oBAAV,CAAA,GAAkB,CAAA,SAAA,CAAA;IACjB,SAAO;G,IAERC,YAAoBF,MAAA,gBAAA,CAAA,C,sBAGxBE,YAAiBF,MAAA,aAAA,CAAA,C"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { textColors } from "./core/colors.js";
|
|
2
|
+
import { blocksToDoc, createId, docToBlocks } from "./core/model.js";
|
|
3
|
+
import { alignable } from "./core/align.js";
|
|
4
|
+
import { contentDOM, createSchema, isSafeHref, textBlock } from "./core/schema.js";
|
|
5
|
+
import { defineEditorExtension, labelOf } from "./core/extension.js";
|
|
6
|
+
import { filterOptions } from "./catalog.js";
|
|
7
|
+
import { duplicateBlocks, insertBlockAfter, liftBlocks, moveRangeTo, setBlockType, sinkBlocks, swapBlocks } from "./core/commands.js";
|
|
8
|
+
import { clearBlockSelection, getBlockSelection, selectBlocks } from "./core/block-selection.js";
|
|
9
|
+
import { useEditor, useToolbarMenu } from "./editor.js";
|
|
10
|
+
import { atomInputRule, blockInputRule, markInputRule } from "./core/input-rules.js";
|
|
11
|
+
import { isRemote } from "./core/plugins.js";
|
|
12
|
+
import { blockElement, splitContainer } from "./core/prepare.js";
|
|
13
|
+
import { historyCommands } from "./core/editor.js";
|
|
14
|
+
import { searchDoc } from "./core/search.js";
|
|
15
|
+
import { diffBlocks, diffText, inlineText } from "./core/diff.js";
|
|
16
|
+
import { EditorTransaction } from "./core/transaction.js";
|
|
17
|
+
import { escapeHTML, escapeMarkdown, indentLines } from "./core/output.js";
|
|
18
|
+
import { EditorContent, componentMounter, defineBlock, vueNodeView } from "./define-block.js";
|
|
19
|
+
import { divider, heading, paragraph, quote } from "./extensions/blocks.js";
|
|
20
|
+
import { currentAlign, setAlign } from "./extensions/align/commands.js";
|
|
21
|
+
import { align } from "./extensions/align/index.js";
|
|
22
|
+
import { callout } from "./extensions/callout/index.js";
|
|
23
|
+
import { setHighlight, setTextColor } from "./extensions/colors/palette.js";
|
|
24
|
+
import { colors } from "./extensions/colors/index.js";
|
|
25
|
+
import { defaultLanguages } from "./extensions/code-block/languages.js";
|
|
26
|
+
import { codeBlock } from "./extensions/code-block/index.js";
|
|
27
|
+
import { formatting, link } from "./extensions/formatting.js";
|
|
28
|
+
import { lists } from "./extensions/lists.js";
|
|
29
|
+
import { alignColumns, clearCells, deleteColumns, deleteRows, insertColumn, insertRow, mergeCells, moveLines, moveLinesTo, splitMergedCell, toggleHeader } from "./extensions/table/commands.js";
|
|
30
|
+
import { table } from "./extensions/table/index.js";
|
|
31
|
+
import { toggle } from "./extensions/toggle/index.js";
|
|
32
|
+
import { editorKit } from "./extensions/editor-kit.js";
|
|
33
|
+
import { blocksToHTML, htmlToBlocks } from "./core/convert.js";
|
|
34
|
+
import { checkDocument, emptyDocument, migrateDocument } from "./document.js";
|
|
35
|
+
import { editorLocales, useEditorMessages } from "./locale.js";
|
|
36
|
+
import editor_default from "./editor2.js";
|
|
37
|
+
import { isSafeImageSrc, readAsDataUrl } from "./extensions/image/uploads.js";
|
|
38
|
+
import { formatFileSize, isSafeFileSrc } from "./extensions/attachment/files.js";
|
|
39
|
+
import { attachment } from "./extensions/attachment/index.js";
|
|
40
|
+
import { resolveEmbed } from "./extensions/embed/targets.js";
|
|
41
|
+
import { embed } from "./extensions/embed/index.js";
|
|
42
|
+
import { image } from "./extensions/image/index.js";
|
|
43
|
+
import { mention } from "./extensions/mention/index.js";
|
|
44
|
+
import { withInstall } from "dou-ui";
|
|
45
|
+
// src/index.ts
|
|
46
|
+
var DouEditor = withInstall(editor_default);
|
|
47
|
+
export { DouEditor, DouEditor as default, EditorContent, EditorTransaction, align, alignColumns, alignable, atomInputRule, attachment, blockElement, blockInputRule, blocksToDoc, blocksToHTML, callout, checkDocument, clearBlockSelection, clearCells, codeBlock, colors, componentMounter, contentDOM, createId, createSchema, currentAlign, defaultLanguages, defineBlock, defineEditorExtension, deleteColumns, deleteRows, diffBlocks, diffText, divider, docToBlocks, duplicateBlocks, editorKit, editorLocales, embed, emptyDocument, escapeHTML, escapeMarkdown, filterOptions, formatFileSize, formatting, getBlockSelection, heading, historyCommands, htmlToBlocks, image, indentLines, inlineText, insertBlockAfter, insertColumn, insertRow, isRemote, isSafeFileSrc, isSafeHref, isSafeImageSrc, labelOf, liftBlocks, link, lists, markInputRule, mention, mergeCells, migrateDocument, moveLines, moveLinesTo, moveRangeTo, paragraph, quote, readAsDataUrl, resolveEmbed, searchDoc, selectBlocks, setAlign, setBlockType, setHighlight, setTextColor, sinkBlocks, splitContainer, splitMergedCell, swapBlocks, table, textBlock, textColors, toggle, toggleHeader, useEditor, useEditorMessages, useToolbarMenu, vueNodeView };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["Editor"],"sources":["../src/index.ts"],"sourcesContent":["import { withInstall } from 'dou-ui'\nimport Editor from './editor.vue'\nimport type { EditorContent } from './define-block'\n\nexport const DouEditor = withInstall(Editor)\nexport default DouEditor\n\nexport { useEditor, useToolbarMenu } from './editor'\nexport type {\n EditorComments,\n EditorContext,\n EditorEmits,\n EditorExpose,\n EditorLinkOpenEvent,\n EditorProps,\n EditorOrigin,\n EditorSelection,\n EditorTransactionResult,\n} from './editor'\nexport { EditorTransaction } from './core/transaction'\nexport type {\n BlockEdge,\n BlockPatch,\n BlockPlacement,\n EditorTransactionMeta,\n} from './core/transaction'\nexport type { BlockChanges } from './core/changes'\nexport type { CommentAnchor, CommentRange } from './core/comments'\nexport { editorLocales, useEditorMessages } from './locale'\nexport type { EditorMessages, EditorMessagesOverride } from './locale'\nexport { filterOptions } from './catalog'\nexport { defineEditorExtension, labelOf } from './core/extension'\nexport type {\n BlockOption,\n CommentsProvider,\n EditorExtension,\n EditorExtensionContext,\n FormatOption,\n HistoryProvider,\n Label,\n MountComponent,\n ResolvedEditorExtensions,\n} from './core/extension'\nexport {\n align,\n callout,\n codeBlock,\n colors,\n divider,\n formatting,\n heading,\n link,\n lists,\n paragraph,\n quote,\n editorKit,\n table,\n toggle,\n} from './extensions/editor-kit'\nexport type { CalloutTone } from './extensions/callout'\nexport { setHighlight, setTextColor, textColors } from './extensions/colors'\nexport type { TextColor } from './extensions/colors'\nexport { currentAlign, setAlign } from './extensions/align'\nexport { alignable } from './core/align'\nexport type { BlockAlign } from './core/align'\nexport { attachment, formatFileSize, isSafeFileSrc } from './extensions/attachment'\nexport type { AttachmentOptions } from './extensions/attachment'\nexport { embed, resolveEmbed } from './extensions/embed'\nexport type { EmbedOptions, EmbedResolver, EmbedTarget } from './extensions/embed'\nexport {\n alignColumns,\n clearCells,\n deleteColumns,\n deleteRows,\n insertColumn,\n insertRow,\n mergeCells,\n moveLines,\n moveLinesTo,\n splitMergedCell,\n toggleHeader,\n} from './extensions/table'\nexport type { TableAlign, TableColumn } from './extensions/table'\nexport type { EditorKitOptions } from './extensions/editor-kit'\nexport { componentMounter, defineBlock, EditorContent, vueNodeView } from './define-block'\nexport { historyCommands } from './core/editor'\nexport { defaultLanguages } from './extensions/code-block'\nexport type { CodeBlockOptions, CodeHighlighter, CodeLanguage } from './extensions/code-block'\nexport { image, isSafeImageSrc, readAsDataUrl } from './extensions/image'\nexport { mention } from './extensions/mention'\nexport type { MentionItem, MentionOptions } from './extensions/mention'\nexport type { FileUploader, ImageOptions } from './extensions/image'\nexport type { BlockViewProps, DefineBlockOptions } from './define-block'\nexport { atomInputRule, blockInputRule, markInputRule } from './core/input-rules'\nexport type {\n Block,\n BlockProps,\n BreakContent,\n EditorDocument,\n InlineContent,\n InlineNodeContent,\n PartialBlock,\n PartialTableCell,\n PartialTableRow,\n RowsSpec,\n TableCell,\n TableRow,\n TextContent,\n} from './core/model'\nexport { blocksToDoc, createId, docToBlocks } from './core/model'\nexport { diffBlocks, diffText, inlineText } from './core/diff'\nexport type { BlockVersionChange, BlocksDiff, TextPart } from './core/diff'\nexport { searchDoc } from './core/search'\nexport type { EditorMatch, EditorSearchQuery } from './core/search'\nexport { checkDocument, emptyDocument, migrateDocument } from './document'\nexport type { CheckDocumentOptions, DocumentProblem } from './document'\nexport type { BuiltinContentType, ContentType, MarkType } from './core/schema'\nexport { contentDOM, createSchema, isSafeHref, textBlock } from './core/schema'\nexport {\n duplicateBlocks,\n insertBlockAfter,\n liftBlocks,\n swapBlocks,\n moveRangeTo,\n setBlockType,\n sinkBlocks,\n} from './core/commands'\nexport { clearBlockSelection, getBlockSelection, selectBlocks } from './core/block-selection'\nexport { isRemote } from './core/plugins'\nexport { blocksToHTML, htmlToBlocks } from './core/convert'\nexport type { EditorExtensionList } from './core/convert'\nexport { escapeHTML, escapeMarkdown, indentLines } from './core/output'\nexport type {\n BlockOutput,\n BlockOutputContext,\n EditorExtensionOutput,\n InlineOutput,\n MarkdownBlockContext,\n MarkOutput,\n} from './core/output'\nexport { blockElement, splitContainer } from './core/prepare'\n\ndeclare module 'vue' {\n export interface GlobalComponents {\n DouEditor: typeof DouEditor\n DouEditorContent: typeof EditorContent\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,YAAY,YAAYA,cAAM"}
|