diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..c53b94a85f7b32e0d11e681ac520f1b02618d2e6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +# indent_size = 4 +end_of_line = crlf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..3409e40978e4903bd71fd80f75dfd3a856ba61c5 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +@tiptap-pro:registry=https://registry.tiptap.dev/ +//registry.tiptap.dev/:_authToken=QH7amVsLHNpIXmKzd+v+g7uqpSiy0stZxw42ZCJD6NW5j6/EKxDWvtgC6pGpqePZ \ No newline at end of file diff --git a/components.d.ts b/components.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..cd6772f9c6dfb0926f1c81c19ded532bf7f47580 --- /dev/null +++ b/components.d.ts @@ -0,0 +1,161 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + ColorPicker: typeof import('./src/components_umo/color-picker.vue')['default'] + Icon: typeof import('./src/components_umo/icon.vue')['default'] + MenusBlock: typeof import('./src/components_umo/menus/block/index.vue')['default'] + MenusBubble: typeof import('./src/components_umo/menus/bubble/index.vue')['default'] + MenusBubbleCodeCopy: typeof import('./src/components_umo/menus/bubble/code/copy.vue')['default'] + MenusBubbleCodeLanguages: typeof import('./src/components_umo/menus/bubble/code/languages.vue')['default'] + MenusBubbleCodeLineNumbers: typeof import('./src/components_umo/menus/bubble/code/line-numbers.vue')['default'] + MenusBubbleCodeThemes: typeof import('./src/components_umo/menus/bubble/code/themes.vue')['default'] + MenusBubbleCodeWordWrap: typeof import('./src/components_umo/menus/bubble/code/word-wrap.vue')['default'] + MenusBubbleFileDownload: typeof import('./src/components_umo/menus/bubble/file/download.vue')['default'] + MenusBubbleImageDownload: typeof import('./src/components_umo/menus/bubble/image/download.vue')['default'] + MenusBubbleImageDraggable: typeof import('./src/components_umo/menus/bubble/image/draggable.vue')['default'] + MenusBubbleImageEdit: typeof import('./src/components_umo/menus/bubble/image/edit.vue')['default'] + MenusBubbleImageFlip: typeof import('./src/components_umo/menus/bubble/image/flip.vue')['default'] + MenusBubbleImagePreview: typeof import('./src/components_umo/menus/bubble/image/preview.vue')['default'] + MenusBubbleImageProportion: typeof import('./src/components_umo/menus/bubble/image/proportion.vue')['default'] + MenusBubbleImageRemoveBackground: typeof import('./src/components_umo/menus/bubble/image/remove-background.vue')['default'] + MenusBubbleImageReset: typeof import('./src/components_umo/menus/bubble/image/reset.vue')['default'] + MenusBubbleImageRotate: typeof import('./src/components_umo/menus/bubble/image/rotate.vue')['default'] + MenusBubbleNodeDelete: typeof import('./src/components_umo/menus/bubble/node-delete.vue')['default'] + MenusButton: typeof import('./src/components_umo/menus/button.vue')['default'] + MenusToolbarBaseAlignCenter: typeof import('./src/components_umo/menus/toolbar/base/align-center.vue')['default'] + MenusToolbarBaseAlignDistributed: typeof import('./src/components_umo/menus/toolbar/base/align-distributed.vue')['default'] + MenusToolbarBaseAlignDropdown: typeof import('./src/components_umo/menus/toolbar/base/align-dropdown.vue')['default'] + MenusToolbarBaseAlignJustify: typeof import('./src/components_umo/menus/toolbar/base/align-justify.vue')['default'] + MenusToolbarBaseAlignLeft: typeof import('./src/components_umo/menus/toolbar/base/align-left.vue')['default'] + MenusToolbarBaseAlignRight: typeof import('./src/components_umo/menus/toolbar/base/align-right.vue')['default'] + MenusToolbarBaseBackgroundColor: typeof import('./src/components_umo/menus/toolbar/base/background-color.vue')['default'] + MenusToolbarBaseBold: typeof import('./src/components_umo/menus/toolbar/base/bold.vue')['default'] + MenusToolbarBaseBulletList: typeof import('./src/components_umo/menus/toolbar/base/bullet-list.vue')['default'] + MenusToolbarBaseClearFormat: typeof import('./src/components_umo/menus/toolbar/base/clear-format.vue')['default'] + MenusToolbarBaseCode: typeof import('./src/components_umo/menus/toolbar/base/code.vue')['default'] + MenusToolbarBaseColor: typeof import('./src/components_umo/menus/toolbar/base/color.vue')['default'] + MenusToolbarBaseFontFamily: typeof import('./src/components_umo/menus/toolbar/base/font-family.vue')['default'] + MenusToolbarBaseFontSize: typeof import('./src/components_umo/menus/toolbar/base/font-size.vue')['default'] + MenusToolbarBaseFormatPaint: typeof import('./src/components_umo/menus/toolbar/base/format-paint.vue')['default'] + MenusToolbarBaseHeading: typeof import('./src/components_umo/menus/toolbar/base/heading.vue')['default'] + MenusToolbarBaseHighlight: typeof import('./src/components_umo/menus/toolbar/base/highlight.vue')['default'] + MenusToolbarBaseIndent: typeof import('./src/components_umo/menus/toolbar/base/indent.vue')['default'] + MenusToolbarBaseItalic: typeof import('./src/components_umo/menus/toolbar/base/italic.vue')['default'] + MenusToolbarBaseLineHeight: typeof import('./src/components_umo/menus/toolbar/base/line-height.vue')['default'] + MenusToolbarBaseMarkdown: typeof import('./src/components_umo/menus/toolbar/base/markdown.vue')['default'] + MenusToolbarBaseOrderedList: typeof import('./src/components_umo/menus/toolbar/base/ordered-list.vue')['default'] + MenusToolbarBaseOutdent: typeof import('./src/components_umo/menus/toolbar/base/outdent.vue')['default'] + MenusToolbarBasePrint: typeof import('./src/components_umo/menus/toolbar/base/print.vue')['default'] + MenusToolbarBaseQuote: typeof import('./src/components_umo/menus/toolbar/base/quote.vue')['default'] + MenusToolbarBaseRedo: typeof import('./src/components_umo/menus/toolbar/base/redo.vue')['default'] + MenusToolbarBaseSearchReplace: typeof import('./src/components_umo/menus/toolbar/base/search-replace.vue')['default'] + MenusToolbarBaseSelectAll: typeof import('./src/components_umo/menus/toolbar/base/select-all.vue')['default'] + MenusToolbarBaseStrike: typeof import('./src/components_umo/menus/toolbar/base/strike.vue')['default'] + MenusToolbarBaseSubscript: typeof import('./src/components_umo/menus/toolbar/base/subscript.vue')['default'] + MenusToolbarBaseSuperscript: typeof import('./src/components_umo/menus/toolbar/base/superscript.vue')['default'] + MenusToolbarBaseTaskList: typeof import('./src/components_umo/menus/toolbar/base/task-list.vue')['default'] + MenusToolbarBaseUnderline: typeof import('./src/components_umo/menus/toolbar/base/underline.vue')['default'] + MenusToolbarBaseUndo: typeof import('./src/components_umo/menus/toolbar/base/undo.vue')['default'] + MenusToolbarExportEmbed: typeof import('./src/components_umo/menus/toolbar/export/embed.vue')['default'] + MenusToolbarExportHtml: typeof import('./src/components_umo/menus/toolbar/export/html.vue')['default'] + MenusToolbarExportImage: typeof import('./src/components_umo/menus/toolbar/export/image.vue')['default'] + MenusToolbarExportPdf: typeof import('./src/components_umo/menus/toolbar/export/pdf.vue')['default'] + MenusToolbarExportShare: typeof import('./src/components_umo/menus/toolbar/export/share.vue')['default'] + MenusToolbarExportText: typeof import('./src/components_umo/menus/toolbar/export/text.vue')['default'] + MenusToolbarInsertAudio: typeof import('./src/components_umo/menus/toolbar/insert/audio.vue')['default'] + MenusToolbarInsertCodeBlock: typeof import('./src/components_umo/menus/toolbar/insert/code-block.vue')['default'] + MenusToolbarInsertDate: typeof import('./src/components_umo/menus/toolbar/insert/date.vue')['default'] + MenusToolbarInsertDetails: typeof import('./src/components_umo/menus/toolbar/insert/details.vue')['default'] + MenusToolbarInsertEmoji: typeof import('./src/components_umo/menus/toolbar/insert/emoji.vue')['default'] + MenusToolbarInsertFile: typeof import('./src/components_umo/menus/toolbar/insert/file.vue')['default'] + MenusToolbarInsertHardBreak: typeof import('./src/components_umo/menus/toolbar/insert/hard-break.vue')['default'] + MenusToolbarInsertHorizontalLine: typeof import('./src/components_umo/menus/toolbar/insert/horizontal-line.vue')['default'] + MenusToolbarInsertImage: typeof import('./src/components_umo/menus/toolbar/insert/image.vue')['default'] + MenusToolbarInsertLink: typeof import('./src/components_umo/menus/toolbar/insert/link.vue')['default'] + MenusToolbarInsertMathematics: typeof import('./src/components_umo/menus/toolbar/insert/mathematics.vue')['default'] + MenusToolbarInsertSpecialCharacters: typeof import('./src/components_umo/menus/toolbar/insert/special-characters.vue')['default'] + MenusToolbarInsertTemplate: typeof import('./src/components_umo/menus/toolbar/insert/template.vue')['default'] + MenusToolbarInsertTextBox: typeof import('./src/components_umo/menus/toolbar/insert/text-box.vue')['default'] + MenusToolbarInsertToc: typeof import('./src/components_umo/menus/toolbar/insert/toc.vue')['default'] + MenusToolbarInsertVideo: typeof import('./src/components_umo/menus/toolbar/insert/video.vue')['default'] + MenusToolbarInsertWebPage: typeof import('./src/components_umo/menus/toolbar/insert/web-page.vue')['default'] + MenusToolbarPageBackground: typeof import('./src/components_umo/menus/toolbar/page/background.vue')['default'] + MenusToolbarPageBreak: typeof import('./src/components_umo/menus/toolbar/page/break.vue')['default'] + MenusToolbarPageBreakMarks: typeof import('./src/components_umo/menus/toolbar/page/break-marks.vue')['default'] + MenusToolbarPageFooter: typeof import('./src/components_umo/menus/toolbar/page/footer.vue')['default'] + MenusToolbarPageHeader: typeof import('./src/components_umo/menus/toolbar/page/header.vue')['default'] + MenusToolbarPageLineNumber: typeof import('./src/components_umo/menus/toolbar/page/line-number.vue')['default'] + MenusToolbarPageMargin: typeof import('./src/components_umo/menus/toolbar/page/margin.vue')['default'] + MenusToolbarPageOrientation: typeof import('./src/components_umo/menus/toolbar/page/orientation.vue')['default'] + MenusToolbarPagePreview: typeof import('./src/components_umo/menus/toolbar/page/preview.vue')['default'] + MenusToolbarPageSize: typeof import('./src/components_umo/menus/toolbar/page/size.vue')['default'] + MenusToolbarPageToggleToc: typeof import('./src/components_umo/menus/toolbar/page/toggle-toc.vue')['default'] + MenusToolbarPageWatermark: typeof import('./src/components_umo/menus/toolbar/page/watermark.vue')['default'] + MenusToolbarTableAddColumnAfter: typeof import('./src/components_umo/menus/toolbar/table/add-column-after.vue')['default'] + MenusToolbarTableAddColumnBefore: typeof import('./src/components_umo/menus/toolbar/table/add-column-before.vue')['default'] + MenusToolbarTableAddRowAfter: typeof import('./src/components_umo/menus/toolbar/table/add-row-after.vue')['default'] + MenusToolbarTableAddRowBefore: typeof import('./src/components_umo/menus/toolbar/table/add-row-before.vue')['default'] + MenusToolbarTableBorderColor: typeof import('./src/components_umo/menus/toolbar/table/border-color.vue')['default'] + MenusToolbarTableCellsAlign: typeof import('./src/components_umo/menus/toolbar/table/cells-align.vue')['default'] + MenusToolbarTableCellsBackground: typeof import('./src/components_umo/menus/toolbar/table/cells-background.vue')['default'] + MenusToolbarTableDelete: typeof import('./src/components_umo/menus/toolbar/table/delete.vue')['default'] + MenusToolbarTableDeleteColumn: typeof import('./src/components_umo/menus/toolbar/table/delete-column.vue')['default'] + MenusToolbarTableDeleteRow: typeof import('./src/components_umo/menus/toolbar/table/delete-row.vue')['default'] + MenusToolbarTableFix: typeof import('./src/components_umo/menus/toolbar/table/fix.vue')['default'] + MenusToolbarTableInsert: typeof import('./src/components_umo/menus/toolbar/table/insert.vue')['default'] + MenusToolbarTableMergeCells: typeof import('./src/components_umo/menus/toolbar/table/merge-cells.vue')['default'] + MenusToolbarTableNextCell: typeof import('./src/components_umo/menus/toolbar/table/next-cell.vue')['default'] + MenusToolbarTablePreviousCell: typeof import('./src/components_umo/menus/toolbar/table/previous-cell.vue')['default'] + MenusToolbarTableSplitCell: typeof import('./src/components_umo/menus/toolbar/table/split-cell.vue')['default'] + MenusToolbarTableToggleHeaderCell: typeof import('./src/components_umo/menus/toolbar/table/toggle-header-cell.vue')['default'] + MenusToolbarTableToggleHeaderColumn: typeof import('./src/components_umo/menus/toolbar/table/toggle-header-column.vue')['default'] + MenusToolbarTableToggleHeaderRow: typeof import('./src/components_umo/menus/toolbar/table/toggle-header-row.vue')['default'] + MenusToolbarToolsBarcode: typeof import('./src/components_umo/menus/toolbar/tools/barcode.vue')['default'] + MenusToolbarToolsChineseCase: typeof import('./src/components_umo/menus/toolbar/tools/chinese-case.vue')['default'] + MenusToolbarToolsDiagrams: typeof import('./src/components_umo/menus/toolbar/tools/diagrams.vue')['default'] + MenusToolbarToolsMermaid: typeof import('./src/components_umo/menus/toolbar/tools/mermaid.vue')['default'] + MenusToolbarToolsMindMap: typeof import('./src/components_umo/menus/toolbar/tools/mind-map.vue')['default'] + MenusToolbarToolsQrcode: typeof import('./src/components_umo/menus/toolbar/tools/qrcode.vue')['default'] + MenusToolbarToolsSeal: typeof import('./src/components_umo/menus/toolbar/tools/seal.vue')['default'] + MenusToolbarToolsSignature: typeof import('./src/components_umo/menus/toolbar/tools/signature.vue')['default'] + Modal: typeof import('./src/components_umo/modal.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + Statusbar: typeof import('./src/components_umo/statusbar/index.vue')['default'] + StatusbarShortcuts: typeof import('./src/components_umo/statusbar/shortcuts.vue')['default'] + TButton: typeof import('tdesign-vue-next/esm')['Button'] + TCheckbox: typeof import('tdesign-vue-next/esm')['Checkbox'] + TColorPickerPanel: typeof import('tdesign-vue-next/esm')['ColorPickerPanel'] + TConfigProvider: typeof import('tdesign-vue-next/esm')['ConfigProvider'] + TDialog: typeof import('tdesign-vue-next/esm')['Dialog'] + TDivider: typeof import('tdesign-vue-next/esm')['Divider'] + TDropdown: typeof import('tdesign-vue-next/esm')['Dropdown'] + TDropdownItem: typeof import('tdesign-vue-next/esm')['DropdownItem'] + TDropdownMenu: typeof import('tdesign-vue-next/esm')['DropdownMenu'] + TForm: typeof import('tdesign-vue-next/esm')['Form'] + TFormItem: typeof import('tdesign-vue-next/esm')['FormItem'] + TImageViewer: typeof import('tdesign-vue-next/esm')['ImageViewer'] + TInput: typeof import('tdesign-vue-next/esm')['Input'] + TInputNumber: typeof import('tdesign-vue-next/esm')['InputNumber'] + TLoading: typeof import('tdesign-vue-next/esm')['Loading'] + Toolbar: typeof import('./src/components_umo/toolbar/index.vue')['default'] + ToolbarClassic: typeof import('./src/components_umo/toolbar/classic.vue')['default'] + ToolbarRibbon: typeof import('./src/components_umo/toolbar/ribbon.vue')['default'] + ToolbarScrollable: typeof import('./src/components_umo/toolbar/scrollable.vue')['default'] + ToolbarSource: typeof import('./src/components_umo/toolbar/source.vue')['default'] + Tooltip: typeof import('./src/components_umo/tooltip.vue')['default'] + TOption: typeof import('tdesign-vue-next/esm')['Option'] + TOptionGroup: typeof import('tdesign-vue-next/esm')['OptionGroup'] + TPopup: typeof import('tdesign-vue-next/esm')['Popup'] + TSelect: typeof import('tdesign-vue-next/esm')['Select'] + TSlider: typeof import('tdesign-vue-next/esm')['Slider'] + TTextarea: typeof import('tdesign-vue-next/esm')['Textarea'] + TTooltip: typeof import('tdesign-vue-next/esm')['Tooltip'] + } +} diff --git a/imports.d.ts b/imports.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6956ae6dbd999814fb26b51cd6b45a7ebf6b542b --- /dev/null +++ b/imports.d.ts @@ -0,0 +1,294 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +export {} +declare global { + const EffectScope: typeof import('vue')['EffectScope'] + const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] + const autoResetRef: typeof import('@vueuse/core')['autoResetRef'] + const computed: typeof import('vue')['computed'] + const computedAsync: typeof import('@vueuse/core')['computedAsync'] + const computedEager: typeof import('@vueuse/core')['computedEager'] + const computedInject: typeof import('@vueuse/core')['computedInject'] + const computedWithControl: typeof import('@vueuse/core')['computedWithControl'] + const controlledComputed: typeof import('@vueuse/core')['controlledComputed'] + const controlledRef: typeof import('@vueuse/core')['controlledRef'] + const createApp: typeof import('vue')['createApp'] + const createEventHook: typeof import('@vueuse/core')['createEventHook'] + const createGlobalState: typeof import('@vueuse/core')['createGlobalState'] + const createInjectionState: typeof import('@vueuse/core')['createInjectionState'] + const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn'] + const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate'] + const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable'] + const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise'] + const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn'] + const customRef: typeof import('vue')['customRef'] + const debouncedRef: typeof import('@vueuse/core')['debouncedRef'] + const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const eagerComputed: typeof import('@vueuse/core')['eagerComputed'] + const effectScope: typeof import('vue')['effectScope'] + const extendRef: typeof import('@vueuse/core')['extendRef'] + const getCurrentInstance: typeof import('vue')['getCurrentInstance'] + const getCurrentScope: typeof import('vue')['getCurrentScope'] + const h: typeof import('vue')['h'] + const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] + const inject: typeof import('vue')['inject'] + const injectLocal: typeof import('@vueuse/core')['injectLocal'] + const isDefined: typeof import('@vueuse/core')['isDefined'] + const isProxy: typeof import('vue')['isProxy'] + const isReactive: typeof import('vue')['isReactive'] + const isReadonly: typeof import('vue')['isReadonly'] + const isRef: typeof import('vue')['isRef'] + const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] + const markRaw: typeof import('vue')['markRaw'] + const nextTick: typeof import('vue')['nextTick'] + const onActivated: typeof import('vue')['onActivated'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] + const onClickOutside: typeof import('@vueuse/core')['onClickOutside'] + const onDeactivated: typeof import('vue')['onDeactivated'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke'] + const onLongPress: typeof import('@vueuse/core')['onLongPress'] + const onMounted: typeof import('vue')['onMounted'] + const onRenderTracked: typeof import('vue')['onRenderTracked'] + const onRenderTriggered: typeof import('vue')['onRenderTriggered'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const onStartTyping: typeof import('@vueuse/core')['onStartTyping'] + const onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] + const provide: typeof import('vue')['provide'] + const provideLocal: typeof import('@vueuse/core')['provideLocal'] + const reactify: typeof import('@vueuse/core')['reactify'] + const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] + const reactive: typeof import('vue')['reactive'] + const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed'] + const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit'] + const reactivePick: typeof import('@vueuse/core')['reactivePick'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const refAutoReset: typeof import('@vueuse/core')['refAutoReset'] + const refDebounced: typeof import('@vueuse/core')['refDebounced'] + const refDefault: typeof import('@vueuse/core')['refDefault'] + const refThrottled: typeof import('@vueuse/core')['refThrottled'] + const refWithControl: typeof import('@vueuse/core')['refWithControl'] + const resolveComponent: typeof import('vue')['resolveComponent'] + const resolveRef: typeof import('@vueuse/core')['resolveRef'] + const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] + const shallowReactive: typeof import('vue')['shallowReactive'] + const shallowReadonly: typeof import('vue')['shallowReadonly'] + const shallowRef: typeof import('vue')['shallowRef'] + const syncRef: typeof import('@vueuse/core')['syncRef'] + const syncRefs: typeof import('@vueuse/core')['syncRefs'] + const templateRef: typeof import('@vueuse/core')['templateRef'] + const throttledRef: typeof import('@vueuse/core')['throttledRef'] + const throttledWatch: typeof import('@vueuse/core')['throttledWatch'] + const toRaw: typeof import('vue')['toRaw'] + const toReactive: typeof import('@vueuse/core')['toReactive'] + const toRef: typeof import('vue')['toRef'] + const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('vue')['toValue'] + const triggerRef: typeof import('vue')['triggerRef'] + const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount'] + const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount'] + const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted'] + const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose'] + const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted'] + const unref: typeof import('vue')['unref'] + const unrefElement: typeof import('@vueuse/core')['unrefElement'] + const until: typeof import('@vueuse/core')['until'] + const useActiveElement: typeof import('@vueuse/core')['useActiveElement'] + const useAlert: typeof import('./src/composables/dialog.js')['useAlert'] + const useAnimate: typeof import('@vueuse/core')['useAnimate'] + const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference'] + const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery'] + const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter'] + const useArrayFind: typeof import('@vueuse/core')['useArrayFind'] + const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex'] + const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast'] + const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes'] + const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin'] + const useArrayMap: typeof import('@vueuse/core')['useArrayMap'] + const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce'] + const useArraySome: typeof import('@vueuse/core')['useArraySome'] + const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique'] + const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue'] + const useAsyncState: typeof import('@vueuse/core')['useAsyncState'] + const useAttrs: typeof import('vue')['useAttrs'] + const useBase64: typeof import('@vueuse/core')['useBase64'] + const useBattery: typeof import('@vueuse/core')['useBattery'] + const useBluetooth: typeof import('@vueuse/core')['useBluetooth'] + const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints'] + const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel'] + const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] + const useCached: typeof import('@vueuse/core')['useCached'] + const useClipboard: typeof import('@vueuse/core')['useClipboard'] + const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems'] + const useCloned: typeof import('@vueuse/core')['useCloned'] + const useColorMode: typeof import('@vueuse/core')['useColorMode'] + const useConfirm: typeof import('./src/composables/dialog.js')['useConfirm'] + const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] + const useCounter: typeof import('@vueuse/core')['useCounter'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVar: typeof import('@vueuse/core')['useCssVar'] + const useCssVars: typeof import('vue')['useCssVars'] + const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement'] + const useCycleList: typeof import('@vueuse/core')['useCycleList'] + const useDark: typeof import('@vueuse/core')['useDark'] + const useDateFormat: typeof import('@vueuse/core')['useDateFormat'] + const useDebounce: typeof import('@vueuse/core')['useDebounce'] + const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn'] + const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory'] + const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion'] + const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation'] + const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio'] + const useDevicesList: typeof import('@vueuse/core')['useDevicesList'] + const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia'] + const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility'] + const useDraggable: typeof import('@vueuse/core')['useDraggable'] + const useDropZone: typeof import('@vueuse/core')['useDropZone'] + const useElementBounding: typeof import('@vueuse/core')['useElementBounding'] + const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint'] + const useElementHover: typeof import('@vueuse/core')['useElementHover'] + const useElementSize: typeof import('@vueuse/core')['useElementSize'] + const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility'] + const useEventBus: typeof import('@vueuse/core')['useEventBus'] + const useEventListener: typeof import('@vueuse/core')['useEventListener'] + const useEventSource: typeof import('@vueuse/core')['useEventSource'] + const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper'] + const useFavicon: typeof import('@vueuse/core')['useFavicon'] + const useFetch: typeof import('@vueuse/core')['useFetch'] + const useFileDialog: typeof import('@vueuse/core')['useFileDialog'] + const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess'] + const useFocus: typeof import('@vueuse/core')['useFocus'] + const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin'] + const useFps: typeof import('@vueuse/core')['useFps'] + const useFullscreen: typeof import('@vueuse/core')['useFullscreen'] + const useGamepad: typeof import('@vueuse/core')['useGamepad'] + const useGeolocation: typeof import('@vueuse/core')['useGeolocation'] + const useHotkeys: typeof import('./src/composables/hotkeys.js')['useHotkeys'] + const useIdle: typeof import('@vueuse/core')['useIdle'] + const useImage: typeof import('@vueuse/core')['useImage'] + const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] + const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver'] + const useInterval: typeof import('@vueuse/core')['useInterval'] + const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] + const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] + const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] + const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] + const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys'] + const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory'] + const useMediaControls: typeof import('@vueuse/core')['useMediaControls'] + const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery'] + const useMemoize: typeof import('@vueuse/core')['useMemoize'] + const useMemory: typeof import('@vueuse/core')['useMemory'] + const useMessage: typeof import('./src/composables/dialog.js')['useMessage'] + const useMounted: typeof import('@vueuse/core')['useMounted'] + const useMouse: typeof import('@vueuse/core')['useMouse'] + const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement'] + const useMousePressed: typeof import('@vueuse/core')['useMousePressed'] + const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver'] + const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage'] + const useNetwork: typeof import('@vueuse/core')['useNetwork'] + const useNow: typeof import('@vueuse/core')['useNow'] + const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl'] + const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination'] + const useOnline: typeof import('@vueuse/core')['useOnline'] + const usePageLeave: typeof import('@vueuse/core')['usePageLeave'] + const useParallax: typeof import('@vueuse/core')['useParallax'] + const useParentElement: typeof import('@vueuse/core')['useParentElement'] + const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver'] + const usePermission: typeof import('@vueuse/core')['usePermission'] + const usePointer: typeof import('@vueuse/core')['usePointer'] + const usePointerLock: typeof import('@vueuse/core')['usePointerLock'] + const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe'] + const usePopup: typeof import('./src/composables/popup.js')['usePopup'] + const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme'] + const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast'] + const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark'] + const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages'] + const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] + const usePrevious: typeof import('@vueuse/core')['usePrevious'] + const useRafFn: typeof import('@vueuse/core')['useRafFn'] + const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] + const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] + const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] + const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea'] + const useScriptTag: typeof import('@vueuse/core')['useScriptTag'] + const useScroll: typeof import('@vueuse/core')['useScroll'] + const useScrollLock: typeof import('@vueuse/core')['useScrollLock'] + const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage'] + const useShare: typeof import('@vueuse/core')['useShare'] + const useSlots: typeof import('vue')['useSlots'] + const useSorted: typeof import('@vueuse/core')['useSorted'] + const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition'] + const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis'] + const useState: typeof import('./src/composables/state.js')['useState'] + const useStepper: typeof import('@vueuse/core')['useStepper'] + const useStorage: typeof import('@vueuse/core')['useStorage'] + const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync'] + const useStore: typeof import('./src/composables/store.js')['useStore'] + const useStyleTag: typeof import('@vueuse/core')['useStyleTag'] + const useSupported: typeof import('@vueuse/core')['useSupported'] + const useSwipe: typeof import('@vueuse/core')['useSwipe'] + const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList'] + const useTextDirection: typeof import('@vueuse/core')['useTextDirection'] + const useTextSelection: typeof import('@vueuse/core')['useTextSelection'] + const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize'] + const useThrottle: typeof import('@vueuse/core')['useThrottle'] + const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn'] + const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory'] + const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo'] + const useTimeout: typeof import('@vueuse/core')['useTimeout'] + const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn'] + const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll'] + const useTimestamp: typeof import('@vueuse/core')['useTimestamp'] + const useTitle: typeof import('@vueuse/core')['useTitle'] + const useToNumber: typeof import('@vueuse/core')['useToNumber'] + const useToString: typeof import('@vueuse/core')['useToString'] + const useToggle: typeof import('@vueuse/core')['useToggle'] + const useTransition: typeof import('@vueuse/core')['useTransition'] + const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams'] + const useUserMedia: typeof import('@vueuse/core')['useUserMedia'] + const useVModel: typeof import('@vueuse/core')['useVModel'] + const useVModels: typeof import('@vueuse/core')['useVModels'] + const useVibrate: typeof import('@vueuse/core')['useVibrate'] + const useVirtualList: typeof import('@vueuse/core')['useVirtualList'] + const useWakeLock: typeof import('@vueuse/core')['useWakeLock'] + const useWebNotification: typeof import('@vueuse/core')['useWebNotification'] + const useWebSocket: typeof import('@vueuse/core')['useWebSocket'] + const useWebWorker: typeof import('@vueuse/core')['useWebWorker'] + const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn'] + const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus'] + const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll'] + const useWindowSize: typeof import('@vueuse/core')['useWindowSize'] + const watch: typeof import('vue')['watch'] + const watchArray: typeof import('@vueuse/core')['watchArray'] + const watchAtMost: typeof import('@vueuse/core')['watchAtMost'] + const watchDebounced: typeof import('@vueuse/core')['watchDebounced'] + const watchDeep: typeof import('@vueuse/core')['watchDeep'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable'] + const watchImmediate: typeof import('@vueuse/core')['watchImmediate'] + const watchOnce: typeof import('@vueuse/core')['watchOnce'] + const watchPausable: typeof import('@vueuse/core')['watchPausable'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] + const watchThrottled: typeof import('@vueuse/core')['watchThrottled'] + const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable'] + const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter'] + const whenever: typeof import('@vueuse/core')['whenever'] +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue' + import('vue') +} diff --git a/package.json b/package.json index cd65ee10ec3d8988c1a8cf93cd14553803111695..38c1517a3c2f52dc4915e383467ce5f09347deae 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,9 @@ }, "dependencies": { "@hocuspocus/provider": "^2.9.0", + "@imgly/background-removal": "^1.4.5", "@manuscripts/prosemirror-recreate-steps": "^0.1.4", - "@tiptap/extension-blockquote": "^2.2.3", + "@tiptap/extension-blockquote": "^2.5.5", "@tiptap/extension-bold": "^2.2.3", "@tiptap/extension-bubble-menu": "^2.2.3", "@tiptap/extension-bullet-list": "^2.2.3", @@ -35,14 +36,14 @@ "@tiptap/extension-collaboration-cursor": "^2.2.3", "@tiptap/extension-color": "^2.2.3", "@tiptap/extension-document": "^2.2.3", - "@tiptap/extension-dropcursor": "^2.2.3", + "@tiptap/extension-dropcursor": "^2.5.5", "@tiptap/extension-floating-menu": "^2.2.3", - "@tiptap/extension-font-family": "^2.2.3", + "@tiptap/extension-font-family": "^2.5.5", "@tiptap/extension-gapcursor": "^2.2.3", "@tiptap/extension-hard-break": "^2.2.3", "@tiptap/extension-heading": "^2.2.3", "@tiptap/extension-highlight": "^2.2.3", - "@tiptap/extension-history": "^2.2.3", + "@tiptap/extension-history": "^2.5.5", "@tiptap/extension-horizontal-rule": "^2.2.3", "@tiptap/extension-image": "^2.2.3", "@tiptap/extension-italic": "^2.2.3", @@ -53,8 +54,8 @@ "@tiptap/extension-paragraph": "^2.2.3", "@tiptap/extension-placeholder": "^2.2.3", "@tiptap/extension-strike": "^2.2.3", - "@tiptap/extension-subscript": "^2.2.3", - "@tiptap/extension-superscript": "^2.2.3", + "@tiptap/extension-subscript": "^2.5.5", + "@tiptap/extension-superscript": "^2.5.5", "@tiptap/extension-table": "^2.2.3", "@tiptap/extension-table-cell": "^2.2.3", "@tiptap/extension-table-header": "^2.2.3", @@ -71,6 +72,7 @@ "@tiptap/starter-kit": "^2.2.3", "@tiptap/suggestion": "^2.2.3", "@tiptap/vue-3": "^2.2.3", + "@vitejs/plugin-vue": "^5.0.5", "buffer-image-size": "^0.6.4", "core-js": "^3.8.3", "daisyui": "^3.2.1", @@ -78,6 +80,7 @@ "diff": "^5.1.0", "docx": "^8.5.0", "file-saver": "^2.0.5", + "jsbarcode": "^3.11.6", "mitt": "^3.0.0", "print-js": "^1.6.0", "prosemirror-virtual-cursor": "^0.3.5", @@ -86,17 +89,20 @@ "register-service-worker": "^1.7.2", "rfc6902": "^5.0.1", "rollup-plugin-copy": "^3.4.0", + "svg64": "^2.0.0", "ts-lint": "^4.5.1", "ts-loader": "^9.4.2", "ts-morph": "^17.0.1", "uuid": "^9.0.0", "v-calendar": "^3.0.0-alpha.8", "v-contextmenu": "^3.0.0", + "vite": "^5.3.4", "vite-plugin-dts": "^1.2.1", "vite-plugin-wasm": "^3.2.2", "vite-svg-loader": "^3.1.2", - "vue": "^3.2.5", + "vue": "^3.4.27", "vue-class-component": "^8.0.0-0", + "vue-esign": "^1.1.4", "vue-file-toolbar-menu": "^2.2.0", "vue-i18n": "^9.9.0", "vue-inline-svg": "^2.1.3", @@ -131,6 +137,7 @@ "babel-jest": "^27.0.6", "clean-webpack-plugin": "^4.0.0", "css-loader": "^6.7.3", + "dom-to-image-more": "^3.3.0", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", @@ -147,6 +154,7 @@ "ts-jest": "^27.0.4", "typescript": "~4.5.5", "vite": "^3.2.5", - "vite-plugin-top-level-await": "^1.3.1" + "vite-plugin-top-level-await": "^1.3.1", + "vue": "^3.4.27" } } diff --git a/src/App.vue b/src/App.vue index 0cc4b092552269ead6724bd5fc147569a0a5edff..82c94acaf4e1c5964385d38bd95db580c30a2229 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@ + + diff --git a/src/components_umo/icon.vue b/src/components_umo/icon.vue new file mode 100644 index 0000000000000000000000000000000000000000..2a6d2963c805ea6ab5cdff0618926883d0f1f5cc --- /dev/null +++ b/src/components_umo/icon.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components_umo/index.js b/src/components_umo/index.js new file mode 100644 index 0000000000000000000000000000000000000000..3f3e2c10e0a1bb6767c66fbca7bd57fcbc6ab1da --- /dev/null +++ b/src/components_umo/index.js @@ -0,0 +1,13 @@ +import "virtual:svg-icons-register"; +import UmoEditor from "./index.vue"; + +const useUmoEditor = { + install: (app, options) => { + const { setOptions } = useStore(); + setOptions(options); + // app.config.warnHandler = () => null + app.component(UmoEditor.name, UmoEditor); + } +}; + +export { UmoEditor as default, useUmoEditor, UmoEditor }; diff --git a/src/components_umo/index.vue b/src/components_umo/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..d28c0a5eb2590dc9266683daeeea7763b4c4a52e --- /dev/null +++ b/src/components_umo/index.vue @@ -0,0 +1,548 @@ + + + + + diff --git a/src/components_umo/menus/block/index.vue b/src/components_umo/menus/block/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..9ffe28c6847958d19e5858520fb8e04db00190a9 --- /dev/null +++ b/src/components_umo/menus/block/index.vue @@ -0,0 +1,390 @@ + + + + + diff --git a/src/components_umo/menus/bubble/code/copy.vue b/src/components_umo/menus/bubble/code/copy.vue new file mode 100644 index 0000000000000000000000000000000000000000..83c05325606ef2f512a7595075140b4ec606ec75 --- /dev/null +++ b/src/components_umo/menus/bubble/code/copy.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components_umo/menus/bubble/code/languages.vue b/src/components_umo/menus/bubble/code/languages.vue new file mode 100644 index 0000000000000000000000000000000000000000..add775b1f3cd01731e745c05efb22bb03f4a3906 --- /dev/null +++ b/src/components_umo/menus/bubble/code/languages.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components_umo/menus/bubble/code/line-numbers.vue b/src/components_umo/menus/bubble/code/line-numbers.vue new file mode 100644 index 0000000000000000000000000000000000000000..066e31c91db714bafac97770bcb3f3c8fd0a2673 --- /dev/null +++ b/src/components_umo/menus/bubble/code/line-numbers.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components_umo/menus/bubble/code/themes.vue b/src/components_umo/menus/bubble/code/themes.vue new file mode 100644 index 0000000000000000000000000000000000000000..1de1b0848f275caa69500320f65f649db7e6e107 --- /dev/null +++ b/src/components_umo/menus/bubble/code/themes.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/components_umo/menus/bubble/code/word-wrap.vue b/src/components_umo/menus/bubble/code/word-wrap.vue new file mode 100644 index 0000000000000000000000000000000000000000..3a242e687346e92f0f86399c2842fa9b149a78e3 --- /dev/null +++ b/src/components_umo/menus/bubble/code/word-wrap.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components_umo/menus/bubble/file/download.vue b/src/components_umo/menus/bubble/file/download.vue new file mode 100644 index 0000000000000000000000000000000000000000..94f7e1a0dfc3999336db1abcbe897abc82b4896e --- /dev/null +++ b/src/components_umo/menus/bubble/file/download.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/bubble/image/download.vue b/src/components_umo/menus/bubble/image/download.vue new file mode 100644 index 0000000000000000000000000000000000000000..2d0c6980d8654b9ccd288a75d0f596537d7b4dfd --- /dev/null +++ b/src/components_umo/menus/bubble/image/download.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components_umo/menus/bubble/image/draggable.vue b/src/components_umo/menus/bubble/image/draggable.vue new file mode 100644 index 0000000000000000000000000000000000000000..cfe1500b0a2d2a7f0284593bbe89beac33e6be1b --- /dev/null +++ b/src/components_umo/menus/bubble/image/draggable.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components_umo/menus/bubble/image/edit.vue b/src/components_umo/menus/bubble/image/edit.vue new file mode 100644 index 0000000000000000000000000000000000000000..46cc72083117bb5fc93f6f2d2a799bdbd9023eeb --- /dev/null +++ b/src/components_umo/menus/bubble/image/edit.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components_umo/menus/bubble/image/flip.vue b/src/components_umo/menus/bubble/image/flip.vue new file mode 100644 index 0000000000000000000000000000000000000000..e2dccfa1a85e21b087623b0bb60ec6638f8f443f --- /dev/null +++ b/src/components_umo/menus/bubble/image/flip.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components_umo/menus/bubble/image/preview.vue b/src/components_umo/menus/bubble/image/preview.vue new file mode 100644 index 0000000000000000000000000000000000000000..fbd2a850ac7310b2ca91c7b00dc5d7d0404306d4 --- /dev/null +++ b/src/components_umo/menus/bubble/image/preview.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components_umo/menus/bubble/image/proportion.vue b/src/components_umo/menus/bubble/image/proportion.vue new file mode 100644 index 0000000000000000000000000000000000000000..d42867211e8bf64959784a2a33edfc7dad534f1f --- /dev/null +++ b/src/components_umo/menus/bubble/image/proportion.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components_umo/menus/bubble/image/remove-background.vue b/src/components_umo/menus/bubble/image/remove-background.vue new file mode 100644 index 0000000000000000000000000000000000000000..090c1b4c5872493d3f3fcba1510b7bac17c6ec56 --- /dev/null +++ b/src/components_umo/menus/bubble/image/remove-background.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components_umo/menus/bubble/image/reset.vue b/src/components_umo/menus/bubble/image/reset.vue new file mode 100644 index 0000000000000000000000000000000000000000..94ff6e491af54e31135ebbf24c0a9f1374967c44 --- /dev/null +++ b/src/components_umo/menus/bubble/image/reset.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components_umo/menus/bubble/image/rotate.vue b/src/components_umo/menus/bubble/image/rotate.vue new file mode 100644 index 0000000000000000000000000000000000000000..9b8f1c90fc0a30b5b3a1edce75ed83945227b225 --- /dev/null +++ b/src/components_umo/menus/bubble/image/rotate.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components_umo/menus/bubble/index.vue b/src/components_umo/menus/bubble/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..53ffe23df09f73c3210c7bca918308c3acc9007a --- /dev/null +++ b/src/components_umo/menus/bubble/index.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/components_umo/menus/bubble/node-delete.vue b/src/components_umo/menus/bubble/node-delete.vue new file mode 100644 index 0000000000000000000000000000000000000000..a5180f56d824c37b3e57cf8751f4db07a014df91 --- /dev/null +++ b/src/components_umo/menus/bubble/node-delete.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/button.vue b/src/components_umo/menus/button.vue new file mode 100644 index 0000000000000000000000000000000000000000..702de00b424680cc471e7bbb9600b2ae23ebb970 --- /dev/null +++ b/src/components_umo/menus/button.vue @@ -0,0 +1,454 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/base/align-center.vue b/src/components_umo/menus/toolbar/base/align-center.vue new file mode 100644 index 0000000000000000000000000000000000000000..c76d36509cf3fdbcf7e5b2ae1b0a995f83ac8dd0 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/align-center.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/align-distributed.vue b/src/components_umo/menus/toolbar/base/align-distributed.vue new file mode 100644 index 0000000000000000000000000000000000000000..78cf7e75a2fadee0f59b32c002a034207b06232d --- /dev/null +++ b/src/components_umo/menus/toolbar/base/align-distributed.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/align-dropdown.vue b/src/components_umo/menus/toolbar/base/align-dropdown.vue new file mode 100644 index 0000000000000000000000000000000000000000..e5384ecef11476cecba4b35b9a3d1e25b1668007 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/align-dropdown.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/base/align-justify.vue b/src/components_umo/menus/toolbar/base/align-justify.vue new file mode 100644 index 0000000000000000000000000000000000000000..c9523338e1bd3ba3c750f441d8530a57576912e9 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/align-justify.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/align-left.vue b/src/components_umo/menus/toolbar/base/align-left.vue new file mode 100644 index 0000000000000000000000000000000000000000..5e4ff3aa36bd6048053f2d1c2ad864aaba655cab --- /dev/null +++ b/src/components_umo/menus/toolbar/base/align-left.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/align-right.vue b/src/components_umo/menus/toolbar/base/align-right.vue new file mode 100644 index 0000000000000000000000000000000000000000..b8607681e8bb7afbc2ca141d178a74889dedb99c --- /dev/null +++ b/src/components_umo/menus/toolbar/base/align-right.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/background-color.vue b/src/components_umo/menus/toolbar/base/background-color.vue new file mode 100644 index 0000000000000000000000000000000000000000..dd124eefab5609bd5c082b8fd448810e06ff2fa3 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/background-color.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/base/bold.vue b/src/components_umo/menus/toolbar/base/bold.vue new file mode 100644 index 0000000000000000000000000000000000000000..215d6b0c4ddf9e96137410697483e6358241fdda --- /dev/null +++ b/src/components_umo/menus/toolbar/base/bold.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/bullet-list.vue b/src/components_umo/menus/toolbar/base/bullet-list.vue new file mode 100644 index 0000000000000000000000000000000000000000..9e3ae137a73eefb62331d0d2bcdedc751af4d5a9 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/bullet-list.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/base/clear-format.vue b/src/components_umo/menus/toolbar/base/clear-format.vue new file mode 100644 index 0000000000000000000000000000000000000000..157f7f473fccaf76f4d33b463999e5d48f9b1da8 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/clear-format.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/code.vue b/src/components_umo/menus/toolbar/base/code.vue new file mode 100644 index 0000000000000000000000000000000000000000..998399ba456fb980b10d4127105edfcc95c9cbd1 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/code.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/color.vue b/src/components_umo/menus/toolbar/base/color.vue new file mode 100644 index 0000000000000000000000000000000000000000..ef516380c90c588e16cdbe3e08a67ca09bd5f295 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/color.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/base/font-family.vue b/src/components_umo/menus/toolbar/base/font-family.vue new file mode 100644 index 0000000000000000000000000000000000000000..1368ece9c038e3df556ba6baa522c8e0c18a929b --- /dev/null +++ b/src/components_umo/menus/toolbar/base/font-family.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/base/font-size.vue b/src/components_umo/menus/toolbar/base/font-size.vue new file mode 100644 index 0000000000000000000000000000000000000000..0a741ac1c91703c910e57c7ea9d82ce16bf859b8 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/font-size.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/format-paint.vue b/src/components_umo/menus/toolbar/base/format-paint.vue new file mode 100644 index 0000000000000000000000000000000000000000..3b7c49b280c439585b3b957441d3c5481c6a02bd --- /dev/null +++ b/src/components_umo/menus/toolbar/base/format-paint.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/heading.vue b/src/components_umo/menus/toolbar/base/heading.vue new file mode 100644 index 0000000000000000000000000000000000000000..2fad859ab5b9d1a629ecc557cd7dc94a298b4d27 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/heading.vue @@ -0,0 +1,285 @@ + + + + + + + diff --git a/src/components_umo/menus/toolbar/base/highlight.vue b/src/components_umo/menus/toolbar/base/highlight.vue new file mode 100644 index 0000000000000000000000000000000000000000..1615901bfb05d76ddc7d61b14eb00d7f2dbaff34 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/highlight.vue @@ -0,0 +1,106 @@ + + + + + + + diff --git a/src/components_umo/menus/toolbar/base/indent.vue b/src/components_umo/menus/toolbar/base/indent.vue new file mode 100644 index 0000000000000000000000000000000000000000..71066dbf483308301afda9c1dd157ba5b5dd3ecf --- /dev/null +++ b/src/components_umo/menus/toolbar/base/indent.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/italic.vue b/src/components_umo/menus/toolbar/base/italic.vue new file mode 100644 index 0000000000000000000000000000000000000000..5fd37911483c11f0cbaa94b51d6a43c183a129d9 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/italic.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/line-height.vue b/src/components_umo/menus/toolbar/base/line-height.vue new file mode 100644 index 0000000000000000000000000000000000000000..ff37ee1b6da8afd26f057819aa05574117845b89 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/line-height.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/markdown.vue b/src/components_umo/menus/toolbar/base/markdown.vue new file mode 100644 index 0000000000000000000000000000000000000000..a4ad9eab5255b24d503e3471de131912e000d01f --- /dev/null +++ b/src/components_umo/menus/toolbar/base/markdown.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/ordered-list.vue b/src/components_umo/menus/toolbar/base/ordered-list.vue new file mode 100644 index 0000000000000000000000000000000000000000..49e017868a409a21ec3e584d0f9761b7a36f15dc --- /dev/null +++ b/src/components_umo/menus/toolbar/base/ordered-list.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/base/outdent.vue b/src/components_umo/menus/toolbar/base/outdent.vue new file mode 100644 index 0000000000000000000000000000000000000000..4acdc1169802395b0f40edc24f0b9f9187e2ad82 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/outdent.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/print.vue b/src/components_umo/menus/toolbar/base/print.vue new file mode 100644 index 0000000000000000000000000000000000000000..f2540664c2888b4322fe4745472ac99c485340d7 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/print.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/base/quote.vue b/src/components_umo/menus/toolbar/base/quote.vue new file mode 100644 index 0000000000000000000000000000000000000000..173aacf1a609f0391a119c8ecd9e0a093bcff9dc --- /dev/null +++ b/src/components_umo/menus/toolbar/base/quote.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/redo.vue b/src/components_umo/menus/toolbar/base/redo.vue new file mode 100644 index 0000000000000000000000000000000000000000..184aac574a93e5e138c62b02778abb86c8f339d2 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/redo.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/search-replace.vue b/src/components_umo/menus/toolbar/base/search-replace.vue new file mode 100644 index 0000000000000000000000000000000000000000..629c4b6dfb1b3df6dcad196b54b4dfb301726eeb --- /dev/null +++ b/src/components_umo/menus/toolbar/base/search-replace.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/select-all.vue b/src/components_umo/menus/toolbar/base/select-all.vue new file mode 100644 index 0000000000000000000000000000000000000000..d0c4686071e5cc64b5a2e1c1f96bad44dc8212c4 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/select-all.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/strike.vue b/src/components_umo/menus/toolbar/base/strike.vue new file mode 100644 index 0000000000000000000000000000000000000000..09c33098e998786b2d9ef095cfd27c25181d03c0 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/strike.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/subscript.vue b/src/components_umo/menus/toolbar/base/subscript.vue new file mode 100644 index 0000000000000000000000000000000000000000..70ffadae186791a7fe188d2561ca5b06ff7dff56 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/subscript.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/superscript.vue b/src/components_umo/menus/toolbar/base/superscript.vue new file mode 100644 index 0000000000000000000000000000000000000000..2e917b937806ab134dee5c0206c65c4b40f08ce9 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/superscript.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/task-list.vue b/src/components_umo/menus/toolbar/base/task-list.vue new file mode 100644 index 0000000000000000000000000000000000000000..c920fef946ddb1b0be20025a91c9eb57acb75b05 --- /dev/null +++ b/src/components_umo/menus/toolbar/base/task-list.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/underline.vue b/src/components_umo/menus/toolbar/base/underline.vue new file mode 100644 index 0000000000000000000000000000000000000000..f1ae6a929c490bc04397daf94b47a92084346adb --- /dev/null +++ b/src/components_umo/menus/toolbar/base/underline.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/base/undo.vue b/src/components_umo/menus/toolbar/base/undo.vue new file mode 100644 index 0000000000000000000000000000000000000000..e4da80cf4ca004a8d3111359f42282aa3ddd0aba --- /dev/null +++ b/src/components_umo/menus/toolbar/base/undo.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/export/embed.vue b/src/components_umo/menus/toolbar/export/embed.vue new file mode 100644 index 0000000000000000000000000000000000000000..997ff65582b9d9550247d99c939220165265784b --- /dev/null +++ b/src/components_umo/menus/toolbar/export/embed.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/export/html.vue b/src/components_umo/menus/toolbar/export/html.vue new file mode 100644 index 0000000000000000000000000000000000000000..d98b8182c19b3bf1c11910f09e2eaeb7069130cc --- /dev/null +++ b/src/components_umo/menus/toolbar/export/html.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components_umo/menus/toolbar/export/image.vue b/src/components_umo/menus/toolbar/export/image.vue new file mode 100644 index 0000000000000000000000000000000000000000..5294bd4c8d922b48706ac7f1f717f670a57be77c --- /dev/null +++ b/src/components_umo/menus/toolbar/export/image.vue @@ -0,0 +1,47 @@ + + + diff --git a/src/components_umo/menus/toolbar/export/pdf.vue b/src/components_umo/menus/toolbar/export/pdf.vue new file mode 100644 index 0000000000000000000000000000000000000000..32440cc27024b4d68d6c0be1fd60905b0f7849d8 --- /dev/null +++ b/src/components_umo/menus/toolbar/export/pdf.vue @@ -0,0 +1,5 @@ + + + diff --git a/src/components_umo/menus/toolbar/export/share.vue b/src/components_umo/menus/toolbar/export/share.vue new file mode 100644 index 0000000000000000000000000000000000000000..10bd955ab0624cc657dca684b7eb39f23abaa6bb --- /dev/null +++ b/src/components_umo/menus/toolbar/export/share.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/export/text.vue b/src/components_umo/menus/toolbar/export/text.vue new file mode 100644 index 0000000000000000000000000000000000000000..ea74a8d7aaeabce90408efc378a20621069dc7f5 --- /dev/null +++ b/src/components_umo/menus/toolbar/export/text.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/audio.vue b/src/components_umo/menus/toolbar/insert/audio.vue new file mode 100644 index 0000000000000000000000000000000000000000..c4b86b14225ad5593538e83647c534a1dc6a4673 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/audio.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/code-block.vue b/src/components_umo/menus/toolbar/insert/code-block.vue new file mode 100644 index 0000000000000000000000000000000000000000..3425643a39e09c9f26e9caf480ec28b395060b5c --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/code-block.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/date.vue b/src/components_umo/menus/toolbar/insert/date.vue new file mode 100644 index 0000000000000000000000000000000000000000..863f7d8b03b6ebd7f061d67956e10e03883e8c42 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/date.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/details.vue b/src/components_umo/menus/toolbar/insert/details.vue new file mode 100644 index 0000000000000000000000000000000000000000..fc95ca27620c2d166fa5bb0d50c9e964f88d0476 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/details.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/emoji.vue b/src/components_umo/menus/toolbar/insert/emoji.vue new file mode 100644 index 0000000000000000000000000000000000000000..fa979b96b3556830ed52410ebb1450d73cbb29bf --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/emoji.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/insert/file.vue b/src/components_umo/menus/toolbar/insert/file.vue new file mode 100644 index 0000000000000000000000000000000000000000..5921a935421b13e3c5dc4983847b6ebd272af5d5 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/file.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/hard-break.vue b/src/components_umo/menus/toolbar/insert/hard-break.vue new file mode 100644 index 0000000000000000000000000000000000000000..aed2cca12898f200827e5da471978eb7b3f2845c --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/hard-break.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/horizontal-line.vue b/src/components_umo/menus/toolbar/insert/horizontal-line.vue new file mode 100644 index 0000000000000000000000000000000000000000..63c0021b2648255bbe76e667ac777d8f91046923 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/horizontal-line.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/insert/image.vue b/src/components_umo/menus/toolbar/insert/image.vue new file mode 100644 index 0000000000000000000000000000000000000000..f9905e1c27cd2b7ed120b66952d756cd75f1a792 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/image.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/link.vue b/src/components_umo/menus/toolbar/insert/link.vue new file mode 100644 index 0000000000000000000000000000000000000000..fb9bfebb87d426bbe2b3706c0cdd9f8ce8b0521f --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/link.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/insert/mathematics.vue b/src/components_umo/menus/toolbar/insert/mathematics.vue new file mode 100644 index 0000000000000000000000000000000000000000..115e9506d5c756a73f7046458f807f8ec07a700a --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/mathematics.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/special-characters.vue b/src/components_umo/menus/toolbar/insert/special-characters.vue new file mode 100644 index 0000000000000000000000000000000000000000..56f50edad41e8cc8224f7aeb06385a9eaf5cc5b5 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/special-characters.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/insert/template.vue b/src/components_umo/menus/toolbar/insert/template.vue new file mode 100644 index 0000000000000000000000000000000000000000..ef88a97782a3d0b5532abda3acb7067f30a8c401 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/template.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/insert/text-box.vue b/src/components_umo/menus/toolbar/insert/text-box.vue new file mode 100644 index 0000000000000000000000000000000000000000..4fe847c574b274a0af83d52300dd250160646004 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/text-box.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/toc.vue b/src/components_umo/menus/toolbar/insert/toc.vue new file mode 100644 index 0000000000000000000000000000000000000000..9340ced523d8063ed9b20715a3c9c324271c0445 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/toc.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/video.vue b/src/components_umo/menus/toolbar/insert/video.vue new file mode 100644 index 0000000000000000000000000000000000000000..fc0265048b1cfacfa29bea874c259a2e86c11723 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/video.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components_umo/menus/toolbar/insert/web-page.vue b/src/components_umo/menus/toolbar/insert/web-page.vue new file mode 100644 index 0000000000000000000000000000000000000000..bb2a23db0555795468444af36269381a6f578649 --- /dev/null +++ b/src/components_umo/menus/toolbar/insert/web-page.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/page/background.vue b/src/components_umo/menus/toolbar/page/background.vue new file mode 100644 index 0000000000000000000000000000000000000000..054126b04edfd831d7956af4cf1d34b2b4597ce6 --- /dev/null +++ b/src/components_umo/menus/toolbar/page/background.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/page/break-marks.vue b/src/components_umo/menus/toolbar/page/break-marks.vue new file mode 100644 index 0000000000000000000000000000000000000000..226fa1047818e88d47b7e77e769e85d0caa01e90 --- /dev/null +++ b/src/components_umo/menus/toolbar/page/break-marks.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components_umo/menus/toolbar/page/break.vue b/src/components_umo/menus/toolbar/page/break.vue new file mode 100644 index 0000000000000000000000000000000000000000..b7729a012806b523e3bb5c677138b0e5880f2a52 --- /dev/null +++ b/src/components_umo/menus/toolbar/page/break.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components_umo/menus/toolbar/page/footer.vue b/src/components_umo/menus/toolbar/page/footer.vue new file mode 100644 index 0000000000000000000000000000000000000000..90a75ac8bfb9c37ff7d779b1396b5acb68f07cec --- /dev/null +++ b/src/components_umo/menus/toolbar/page/footer.vue @@ -0,0 +1,5 @@ + + + diff --git a/src/components_umo/menus/toolbar/page/header.vue b/src/components_umo/menus/toolbar/page/header.vue new file mode 100644 index 0000000000000000000000000000000000000000..0d3d5c89d45243375dda3f5a588c6da1cffaaf0a --- /dev/null +++ b/src/components_umo/menus/toolbar/page/header.vue @@ -0,0 +1,5 @@ + + + diff --git a/src/components_umo/menus/toolbar/page/line-number.vue b/src/components_umo/menus/toolbar/page/line-number.vue new file mode 100644 index 0000000000000000000000000000000000000000..dda0e212a12b41448e2a4c12680e2be0e49423af --- /dev/null +++ b/src/components_umo/menus/toolbar/page/line-number.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components_umo/menus/toolbar/page/margin.vue b/src/components_umo/menus/toolbar/page/margin.vue new file mode 100644 index 0000000000000000000000000000000000000000..8b17bb9954510d2ca51dc32de4a44ce95f582d33 --- /dev/null +++ b/src/components_umo/menus/toolbar/page/margin.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/page/orientation.vue b/src/components_umo/menus/toolbar/page/orientation.vue new file mode 100644 index 0000000000000000000000000000000000000000..f3e5eb8a9294bdd4f465be5df73a84dffc9486fe --- /dev/null +++ b/src/components_umo/menus/toolbar/page/orientation.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/page/preview.vue b/src/components_umo/menus/toolbar/page/preview.vue new file mode 100644 index 0000000000000000000000000000000000000000..3effc8927b9dd5715786994384d3798f41c53ec6 --- /dev/null +++ b/src/components_umo/menus/toolbar/page/preview.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/page/size.vue b/src/components_umo/menus/toolbar/page/size.vue new file mode 100644 index 0000000000000000000000000000000000000000..3d51d64fcabb76b95299eaec60ea66c85802f1e4 --- /dev/null +++ b/src/components_umo/menus/toolbar/page/size.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/page/toggle-toc.vue b/src/components_umo/menus/toolbar/page/toggle-toc.vue new file mode 100644 index 0000000000000000000000000000000000000000..61b9805b38798268e369b4f6d4cf4f47d6072407 --- /dev/null +++ b/src/components_umo/menus/toolbar/page/toggle-toc.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components_umo/menus/toolbar/page/watermark.vue b/src/components_umo/menus/toolbar/page/watermark.vue new file mode 100644 index 0000000000000000000000000000000000000000..1ca5db125673fda80ee0de94963db427f28cad9f --- /dev/null +++ b/src/components_umo/menus/toolbar/page/watermark.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/table/add-column-after.vue b/src/components_umo/menus/toolbar/table/add-column-after.vue new file mode 100644 index 0000000000000000000000000000000000000000..e2513bf62d877856f6e53c69f8f2e1fe85697db5 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/add-column-after.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/add-column-before.vue b/src/components_umo/menus/toolbar/table/add-column-before.vue new file mode 100644 index 0000000000000000000000000000000000000000..a96a47f079a5ab8a4b0ce07d068de81c5780ba0c --- /dev/null +++ b/src/components_umo/menus/toolbar/table/add-column-before.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/add-row-after.vue b/src/components_umo/menus/toolbar/table/add-row-after.vue new file mode 100644 index 0000000000000000000000000000000000000000..9feb41e89efb446d7a1c747b00e45840531d4e20 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/add-row-after.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/add-row-before.vue b/src/components_umo/menus/toolbar/table/add-row-before.vue new file mode 100644 index 0000000000000000000000000000000000000000..e73beb93e979918bf8871cc6f8edacec50fe9205 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/add-row-before.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/border-color.vue b/src/components_umo/menus/toolbar/table/border-color.vue new file mode 100644 index 0000000000000000000000000000000000000000..0be8b037bc96788a64ca9d9f809af92d9ace4351 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/border-color.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/cells-align.vue b/src/components_umo/menus/toolbar/table/cells-align.vue new file mode 100644 index 0000000000000000000000000000000000000000..7c8b580d9318261f0008c4177a4d1619b1bbf5df --- /dev/null +++ b/src/components_umo/menus/toolbar/table/cells-align.vue @@ -0,0 +1,35 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/cells-background.vue b/src/components_umo/menus/toolbar/table/cells-background.vue new file mode 100644 index 0000000000000000000000000000000000000000..7c00d7797ca88cc2d06f5271d3be46a65741bb90 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/cells-background.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/delete-column.vue b/src/components_umo/menus/toolbar/table/delete-column.vue new file mode 100644 index 0000000000000000000000000000000000000000..fd4a2805795262f37b294f8a69c464ac9ab4eb85 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/delete-column.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/delete-row.vue b/src/components_umo/menus/toolbar/table/delete-row.vue new file mode 100644 index 0000000000000000000000000000000000000000..d479c4297efa0abf65c8795b635470199a7624b0 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/delete-row.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/delete.vue b/src/components_umo/menus/toolbar/table/delete.vue new file mode 100644 index 0000000000000000000000000000000000000000..5a17398fc5aefcefcf320be318fdd4b161ce2731 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/delete.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/fix.vue b/src/components_umo/menus/toolbar/table/fix.vue new file mode 100644 index 0000000000000000000000000000000000000000..0c3a330f7e10b51bda3d094dc2ecfa95f432b9f6 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/fix.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/insert.vue b/src/components_umo/menus/toolbar/table/insert.vue new file mode 100644 index 0000000000000000000000000000000000000000..d98d64910aa5a82f1d786134764c61e5c95e824e --- /dev/null +++ b/src/components_umo/menus/toolbar/table/insert.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/table/merge-cells.vue b/src/components_umo/menus/toolbar/table/merge-cells.vue new file mode 100644 index 0000000000000000000000000000000000000000..1c5622148f9d08bffdb708c9f0c52a6883a116a8 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/merge-cells.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/next-cell.vue b/src/components_umo/menus/toolbar/table/next-cell.vue new file mode 100644 index 0000000000000000000000000000000000000000..d00e48990856e90742413208b3fde42ed876eed5 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/next-cell.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/previous-cell.vue b/src/components_umo/menus/toolbar/table/previous-cell.vue new file mode 100644 index 0000000000000000000000000000000000000000..947f6a88ec25c6c095dea5482d6a6f7f6d7aba50 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/previous-cell.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/split-cell.vue b/src/components_umo/menus/toolbar/table/split-cell.vue new file mode 100644 index 0000000000000000000000000000000000000000..26d748c680502c6858f254217c2ad0da79b20e78 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/split-cell.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/toggle-header-cell.vue b/src/components_umo/menus/toolbar/table/toggle-header-cell.vue new file mode 100644 index 0000000000000000000000000000000000000000..be586f0f55727bf659e0c6d1d115f6310fb08f75 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/toggle-header-cell.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/toggle-header-column.vue b/src/components_umo/menus/toolbar/table/toggle-header-column.vue new file mode 100644 index 0000000000000000000000000000000000000000..92ef4b87b668a4d92d5460981f873d9fd4a382a2 --- /dev/null +++ b/src/components_umo/menus/toolbar/table/toggle-header-column.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/table/toggle-header-row.vue b/src/components_umo/menus/toolbar/table/toggle-header-row.vue new file mode 100644 index 0000000000000000000000000000000000000000..554283824d7019cdbbc6f00a42f47e118047be6c --- /dev/null +++ b/src/components_umo/menus/toolbar/table/toggle-header-row.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components_umo/menus/toolbar/tools/barcode.vue b/src/components_umo/menus/toolbar/tools/barcode.vue new file mode 100644 index 0000000000000000000000000000000000000000..cfdd8ec7945508a4c941322127e46baab05a6eea --- /dev/null +++ b/src/components_umo/menus/toolbar/tools/barcode.vue @@ -0,0 +1,406 @@ + + + + + + + diff --git a/src/components_umo/menus/toolbar/tools/chinese-case.vue b/src/components_umo/menus/toolbar/tools/chinese-case.vue new file mode 100644 index 0000000000000000000000000000000000000000..43c04a525c27adfd6b12e5a7f84a889d9645ccc3 --- /dev/null +++ b/src/components_umo/menus/toolbar/tools/chinese-case.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/tools/diagrams.vue b/src/components_umo/menus/toolbar/tools/diagrams.vue new file mode 100644 index 0000000000000000000000000000000000000000..db588ddd3e852ec524c932bd4f79509332a1a4ec --- /dev/null +++ b/src/components_umo/menus/toolbar/tools/diagrams.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/tools/mermaid.vue b/src/components_umo/menus/toolbar/tools/mermaid.vue new file mode 100644 index 0000000000000000000000000000000000000000..ac560c538b32ef0fb1106fbc152b536173566ca6 --- /dev/null +++ b/src/components_umo/menus/toolbar/tools/mermaid.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/tools/mind-map.vue b/src/components_umo/menus/toolbar/tools/mind-map.vue new file mode 100644 index 0000000000000000000000000000000000000000..8a66428033341794227a91feeba95af3dc1d097b --- /dev/null +++ b/src/components_umo/menus/toolbar/tools/mind-map.vue @@ -0,0 +1,5 @@ + + + diff --git a/src/components_umo/menus/toolbar/tools/qrcode.vue b/src/components_umo/menus/toolbar/tools/qrcode.vue new file mode 100644 index 0000000000000000000000000000000000000000..0209f97abb2cc23b5697126856684cf9a98ed52a --- /dev/null +++ b/src/components_umo/menus/toolbar/tools/qrcode.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/tools/seal.vue b/src/components_umo/menus/toolbar/tools/seal.vue new file mode 100644 index 0000000000000000000000000000000000000000..dee40fd52d4592b3a030625c4f6c49f58548e802 --- /dev/null +++ b/src/components_umo/menus/toolbar/tools/seal.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components_umo/menus/toolbar/tools/signature.vue b/src/components_umo/menus/toolbar/tools/signature.vue new file mode 100644 index 0000000000000000000000000000000000000000..75c063f765bc55481f52c1b1fe8cd5269853ce41 --- /dev/null +++ b/src/components_umo/menus/toolbar/tools/signature.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/src/components_umo/modal.vue b/src/components_umo/modal.vue new file mode 100644 index 0000000000000000000000000000000000000000..3d27c7a89886720910aa420ad9067820bc3466fb --- /dev/null +++ b/src/components_umo/modal.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components_umo/options.js b/src/components_umo/options.js new file mode 100644 index 0000000000000000000000000000000000000000..2e3fe2c65980d784ca995cbbdc3430e1a89c1baa --- /dev/null +++ b/src/components_umo/options.js @@ -0,0 +1,530 @@ +import { ObjectSchema } from "@humanwhocodes/object-schema"; + +// 默认配置 +const defaultOptions = { + editorKey: "default", + height: "100%", + dicts: { + fonts: [ + { label: "默认字体", value: null }, + { label: "宋体", value: "SimSun" }, + { label: "黑体", value: "SimHei" }, + { label: "楷体", value: "KaiTi" }, + { label: "楷体_GB2312", value: "KaiTi_GB2312" }, + { label: "仿宋", value: "FangSong" }, + { label: "仿宋_GB2312", value: "FangSong_GB2312" }, + { label: "华文宋体", value: "STSong" }, + { label: "华文仿宋", value: "STFangsong" }, + { label: "方正仿宋简体", value: "FZFangSong-Z02S" }, + { label: "方正小标宋", value: "FZXiaoBiaoSong-B05S" }, + { label: "微软雅黑", value: "Microsoft Yahei" }, + { label: "Arial", value: "Arial" }, + { label: "Times New Roman", value: "Times New Roman" }, + { label: "Verdana", value: "Verdana" }, + { label: "Helvetica", value: "Helvetica" }, + { label: "Calibri", value: "Calibri" }, + { label: "Cambria", value: "Cambria" }, + { label: "Tahoma", value: "Tahoma" }, + { label: "Georgia", value: "Georgia" }, + { label: "Comic Sans MS", value: "Comic Sans MS" }, + { label: "Impact", value: "Impact" } + ], + // prettier-ignore + colors: [ + '#FFF','#000','#4A5366','#3B74EC','#45A2EF','#529867','#CD4A3F','#EA8D40','#EEC543', '#8E45D0','#F2F2F2','#7F7F7F','#F4F5F7','#CBDCFC','#E8F6FE','#EDFAF2','#FCEAE9','#FDF3EC','#FEF9E5','#FAECFE','#EEE','#595959','#C6CAD2','#CEEBFD','#CBDCFC','#CBE9D7','#F7CBC9','#FADDC7','#FDEEB5','#EBCAFC', '#BFBFBF','#3F3F3F','#828B9D','#A0BEFA','#A7DCFC','#A6D5B8','#F2A19C','#F5BC8C','#FBE281','#CB94F9','#A5A5A5','#262626','#363B44','#2452B2','#3473A1','#417A53','#922B22','#AD642A','#9E8329','#57297D','#939393','#0D0D0D','#25272E','#15316A','#1C415A','#284D34','#511712','#573213','#635217','#36194E', + ], + lineHeights: [ + { label: "单倍行距", value: 1 }, + { label: "1.5 倍行距", value: 1.5, default: true }, + { label: "2 倍行距", value: 2 }, + { label: "2.5 倍行距", value: 2.5 }, + { label: "3 倍行距", value: 3 } + ], + specialCharacters: [ + { label: "普通文本", items: "‹›«»‘’“”‚„¡¿‥…‡‰‱‼⁈⁉⁇©®™§¶⁋" }, + { label: "货币符号", items: "$€¥£¢₠₡₢₣₤¤₿₥₦₧₨₩₪₫₭₮₯₰₱₲₳₴₵₶₷₸₹₺₻₼₽" }, + { + label: "数学符号", + items: "<>≤≥–—¯‾°−±÷⁄׃∫∑∞√∼≅≈≠≡∈∉∋∏∧∨¬∩∪∂∀∃∅∇∗∝∠¼½¾" + }, + { label: "箭头", items: "←→↑↓⇐⇒⇑⇓⇠⇢⇡⇣⇤⇥⤒⤓↨" }, + { + label: "拉丁语", + items: "ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ" + } + ], + emojis: [ + { + label: "表情与角色", + items: + "😀 😃 😄 😁 😆 😅 🤣 😂 🙂 🙃 🫠 😉 😊 😇 🥰 😍 🤩 😘 😗 ☺️ 😚 😙 🥲 😋 😛 😜 🤪 😝 🤑 🤗 🤭 🫢 🫣 🤫 🤔 🫡 🤐 🤨 😐 😑 😶 🫥 😶‍🌫️ 😏 😒 🙄 😬 😮‍💨 🤥 😌 😔 😪 🤤 😴 😷 🤒 🤕 🤢 🤮 🤧 🥵 🥶 🥴 😵 😵‍💫 🤯 🤠 🥳 🥸 😎 🤓 🧐 😕 🫤 😟 🙁 ☹️ 😮 😯 😲 😳 🥺 🥹 😦 😧 😨 😰 😥 😢 😭 😱 😖 😣 😞 😓 😩 😫 🥱 😤 😡 😠 🤬 😈 👿 💀 ☠️ 💩 🤡 👹 👺 👻 👽 👾 🤖 👋 🤚 🖐️ ✋ 🖖 🫱 🫲 🫳 🫴 👌 🤌 🤏 ✌️ 🤞 🫰 🤟 🤘 🤙 👈 👉 👆 🖕 👇 ☝️ 🫵 👍 👎 ✊ 👊 🤛 🤜 👏 🙌 🫶 👐 🤲 🤝 🙏 ✍️ 💅 🤳 💪 🦾 🦿 🦵 🦶 👂 🦻" + }, + { + label: "动物与自然", + items: + "🐵 🐒 🦍 🦧 🐶 🐕 🦮 🐕‍🦺 🐩 🐺 🦊 🦝 🐱 🐈 🐈‍⬛ 🦁 🐯 🐅 🐆 🐴 🐎 🦄 🦓 🦌 🦬 🐮 🐂 🐃 🐄 🐷 🐖 🐗 🐽 🐏 🐑 🐐 🐪 🐫 🦙 🦒 🐘 🦣 🦏 🦛 🐭 🐁 🐀 🐹 🐰 🐇 🐿️ 🦫 🦔 🦇 🐻 🐻‍❄️ 🐨 🐼 🦥 🦦 🦨 🦘 🦡 🐾 🦃 🐔 🐓 🐣 🐤 🐥 🐦 🐧 🕊️ 🦅 🦆 🦢 🦉 🦤 🪶 🦩 🦚 🦜 🐸 🐊 🐢 🦎 🐍 🐲 🐉 🦕 🦖 🐳 🐋 🐬 🦭 🐟 🐠 🐡 🦈 🐙 🐚 🪸 🐌 🦋 🐛 🐜 🐝 🪲 🐞 🦗 🪳 🕷️ 🕸️ 🦂 🦟 🪰 🪱 🦠 💐 🌸 💮 🪷 🏵️ 🌹 🥀 🌺 🌻 🌼 🌷 🌱 🪴 🌲 🌳 🌴 🌵 🌾 🌿 ☘️ 🍀 🍁 🍂 🍃 🪹 🪺" + }, + { + label: "食物与食品", + items: + "🥬 🥦 🧄 🧅 🍄 🥜 🫘 🌰 🍞 🥐 🥖 🫓 🥨 🥯 🥞 🧇 🧀 🍖 🍗 🥩 🥓 🍔 🍟 🍕 🌭 🥪 🌮 🌯 🫔 🥙 🧆 🥚 🍳 🥘 🍲 🫕 🥣 🥗 🍿 🧈 🧂 🥫 🍱 🍘 🍙 🍚 🍛 🍜 🍝 🍠 🍢 🍣 🍤 🍥 🥮 🍡 🥟 🥠 🥡 🦀 🦞 🦐 🦑 🦪 🍦 🍧 🍨 🍩 🍪 🎂 🍰 🧁 🥧 🍫 🍬 🍭 🍮 🍯 🍼 🥛 ☕ 🫖 🍵 🍶 🍾 🍷 🍸 🍹 🍺 🍻 🥂 🥃 🫗 🥤 🧋 🧃 🧉 🧊 🥢 🍽️ 🍴 🥄 🔪 🫙 🏺" + }, + { + label: "活动", + items: "🎗️ 🎟️ 🎫 🎖️ 🏆 🏅 🥇 🥈 🥉 ⚽ ⚾ 🥎 🏀 🏐 🏈 🏉 🎾 🥏 🎳 🏏 🏑 🏒 🥍 🏓 🏸 🥊 🥋 🥅 ⛳ ⛸️ 🎣 🤿 🎽 🎿 🛷 🥌 🎯 🪀 🪁 🎱 🔮 🪄 🧿 🪬 🎮 🕹️ 🎰 🎲 🧩 🧸 🪅 🪩 🪆 ♠️ ♥️ ♦️ ♣️ ♟️ 🃏 🀄 🎴 🎭 🖼️ 🎨 🧵 🪡 🧶 🪢" + }, + { + label: "旅行与景点", + items: + "🚈 🚉 🚊 🚝 🚞 🚋 🚌 🚍 🚎 🚐 🚑 🚒 🚓 🚔 🚕 🚖 🚗 🚘 🚙 🛻 🚚 🚛 🚜 🏎️ 🏍️ 🛵 🦽 🦼 🛺 🚲 🛴 🛹 🛼 🚏 🛣️ 🛤️ 🛢️ ⛽ 🛞 🚨 🚥 🚦 🛑 🚧 ⚓ 🛟 ⛵ 🛶 🚤 🛳️ ⛴️ 🛥️ 🚢 ✈️ 🛩️ 🛫 🛬 🪂 💺 🚁 🚟 🚠 🚡 🛰️ 🚀 🛸 🛎️ 🧳 ⌛ ⏳ ⌚ ⏰ ⏱️ ⏲️ 🕰️ 🕛 🕧 🕐 🕜 🕑 🕝 🕒 🕞 🕓 🕟 🕔 🕠 🕕 🕡 🕖 🕢 🕗 🕣 🕘 🕤 🕙 🕥 🕚 🕦 🌑 🌒 🌓 🌔 🌕 🌖 🌗 🌘 🌙 🌚 🌛 🌜 🌡️ ☀️ 🌝 🌞 🪐 ⭐ 🌟 🌠 🌌 ☁️ ⛅ ⛈️ 🌤️ 🌥️ 🌦️ 🌧️ 🌨️ 🌩️ 🌪️ 🌫️ 🌬️ 🌀 🌈 🌂 ☂️ ☔ ⛱️ ⚡ ❄️ ☃️ ⛄ ☄️ 🔥 💧 🌊" + }, + { + label: "物品", + items: + "📃 📜 📄 📰 🗞️ 📑 🔖 🏷️ 💰 🪙 💴 💵 💶 💷 💸 💳 🧾 💹 ✉️ 📧 📨 📩 📤 📥 📦 📫 📪 📬 📭 📮 🗳️ ✏️ ✒️ 🖋️ 🖊️ 🖌️ 🖍️ 📝 💼 📁 📂 🗂️ 📅 📆 🗒️ 🗓️ 📇 📈 📉 📊 📋 📌 📍 📎 🖇️ 📏 📐 ✂️ 🗃️ 🗄️ 🗑️ 🔒 🔓 🔏 🔐 🔑 🗝️ 🔨 🪓 ⛏️ ⚒️ 🛠️ 🗡️ ⚔️ 🔫 🪃 🏹 🛡️ 🪚 🔧 🪛 🔩 ⚙️ 🗜️ ⚖️ 🦯 🔗 ⛓️ 🪝 🧰 🧲 🪜 ⚗️ 🧪 🧫 🧬 🔬 🔭 📡 💉 🩸 💊 🩹 🩼 🩺 🩻 🚪 🛗 🪞 🪟 🛏️ 🛋️ 🪑 🚽 🪠 🚿 🛁 🪤 🪒 🧴 🧷 🧹 🧺 🧻 🪣 🧼 🫧 🪥 🧽 🧯 🛒 🚬 ⚰️ 🪦 ⚱️ 🗿 🪧 🪪" + }, + { + label: "符号", + items: "➰ ➿ 〽️ ✳️ ✴️ ❇️ ©️ ®️ ™️ #️⃣ *️⃣ 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔠 🔡 🔢 🔣 🔤 🅰️ 🆎 🅱️ 🆑 🆒 🆓 ℹ️ 🆔 Ⓜ️ 🆕 🆖 🅾️ 🆗 🅿️ 🆘 🆙 🆚 🈁 🈂️ 🔴 🟠 🟡 🟢 🔵 🟣 🟤 ⚫ ⚪ 🟥 🟧 🟨 🟩 🟦 🟪 🟫 ⬛ ⬜ ◼️ ◻️ ◾ ◽ ▪️ ▫️ 🔶 🔷 🔸 🔹 🔺 🔻 💠 🔘 🔳 🔲" + }, + { + label: "旗帜", + items: + "🏁 🇨🇳 🎌 🇩🇪 🇪🇸 🇦🇨 🇦🇩 🇦🇪 🇦🇫 🇦🇬 🇦🇮 🇦🇱 🇦🇲 🇦🇴 🇦🇶 🇦🇷 🇦🇸 🇦🇹 🇦🇺 🇦🇼 🇦🇽 🇦🇿 🇧🇦 🇧🇧 🇧🇩 🇧🇪 🇧🇫 🇧🇬 🇧🇭 🇧🇮 🇧🇯 🇧🇱 🇧🇲 🇧🇳 🇧🇴 🇧🇶 🇧🇷 🇧🇸 🇧🇹 🇧🇻 🇧🇼 🇧🇾 🇧🇿 🇨🇦 🇨🇨 🇨🇩 🇨🇫 🇨🇬 🇨🇭 🇨🇮 🇨🇰 🇨🇱 🇨🇲 🇨🇴 🇨🇵 🇨🇷 🇨🇺 🇨🇻 🇨🇼 🇨🇽 🇨🇾 🇨🇿 🇩🇬 🇩🇯 🇩🇰 🇩🇲 🇩🇴 🇩🇿 🇪🇦 🇪🇨 🇪🇪 🇪🇬 🇪🇭 🏴󠁧󠁢󠁥󠁮󠁧󠁿 🇪🇷 🇪🇹 🇪🇺 🇫🇮 🇫🇯 🇫🇰 🇫🇲 🇫🇴 🇬🇦 🇬🇩 🇬🇪 🇬🇫 🇬🇬 🇬🇭 🇬🇮 🇬🇱 🇬🇲 🇬🇳 🇬🇵 🇬🇶 🇬🇷 🇬🇸 🇬🇹 🇬🇺 🇬🇼 🇬🇾 🇭🇰 🇭🇲 🇭🇳 🇭🇷 🇭🇹 🇭🇺 🇮🇨 🇮🇩 🇮🇪 🇮🇱 🇮🇲 🇮🇳 🇮🇴 🇮🇶 🇮🇷 🇮🇸 🇯🇪 🇯🇲 🇯🇴 🇰🇪 🇰🇬 🇰🇭 🇰🇮 🇰🇲 🇰🇳 🇰🇵 🇰🇼 🇰🇾 🇰🇿 🇱🇦 🇱🇧 🇱🇨 🇱🇮 🇱🇰 🇱🇷 🇱🇸 🇱🇹 🇱🇺 🇱🇻 🇱🇾 🇲🇦 🇲🇨 🇲🇩 🇲🇪 🇲🇫 🇲🇬 🇲🇭 🇲🇰 🇲🇱 🇲🇲 🇲🇳 🇲🇴 🇲🇵 🇲🇶 🇲🇷 🇲🇸 🇲🇹 🇲🇺 🇲🇻 🇲🇼 🇲🇽 🇲🇾 🇲🇿 🇳🇦 🇳🇨 🇳🇪 🇳🇫 🇳🇬 🇳🇮 🇳🇱 🇳🇴" + } + ], + pageSizes: [ + { label: "A4", width: 21.0, height: 29.4, default: true }, + { label: "A3", width: 29.7, height: 42.0 }, + { label: "A5", width: 14.8, height: 21.0 }, + { label: "B5", width: 17.6, height: 25.0 }, + { label: "5号信封", width: 10.9, height: 12.9 }, + { label: "6号信封", width: 11.9, height: 22.9 }, + { label: "7号信封", width: 16.1, height: 22.8 }, + { label: "9号信封", width: 22.8, height: 32.3 }, + { label: "法律用纸", width: 21.5, height: 33.5 }, + { label: "信纸", width: 21.5, height: 27.9 } + ] + }, + toolbar: { + defaultMode: "ribbon", + enableSourceEditor: false, + // menus: ["base", "insert", "table", "tools", "page", "export"], + menus: ["base", "insert", "table"], + disableMenuItems: [] + }, + page: { + defaultMargin: { + left: 3.18, + right: 3.18, + top: 2.54, + bottom: 2.54 + }, + defaultOrientation: "horizontal", + defaultBackground: "#fff", + showBreakMarks: true, + watermark: { + type: "compact", + alpha: 0.2, + fontColor: "#000", + fontSize: 16, + fontFamily: "SimSun", + fontWeight: "normal", + text: "" + } + }, + document: { + title: "未命名文档", + content: "", + placeholder: "请输入文档内容...", + enableSpellcheck: true, + enableMarkdown: true, + enableBubbleMenu: true, + enableBlockMenu: true, + readOnly: false, + autofocus: true, + characterLimit: 0, + typographyRules: {}, + autoSave: { + enabled: true, + interval: 300000 + } + }, + templates: [], + cdnUrl: "https://unpkg.com/@umoteam/editor-external@latest", + shareUrl: location?.href || "", + diagrams: { + domain: "https://embed.diagrams.net", + // https://www.drawio.com/doc/faq/supported-url-parameters + params: {} + }, + file: { + allowedMimeTypes: [], + maxSize: 1024 * 1024 * 100 // 100M + }, + extensions: [], + async onSave(content, page, document) { + throw new Error('Key "onSave": Please set the save method'); + }, + async onFileUpload(file) { + if (!file) throw new Error("File not found"); + throw new Error('Key "onFileUpload": Please set the upload method'); + }, + onFileDelete(id, src) { + console.error("The file has been deleted. Please configure the onFileDelete to completely delete the file from the server."); + } +}; + +// 组件 props 所需格式 +const propsOptions = Object.keys(defaultOptions); + +const isNumber = (char) => { + if (typeof char === "number") { + return isFinite(char); + } + if (typeof char === "string") { + const parsed = parseFloat(char); + return !isNaN(parsed) && isFinite(parsed) && char === parsed.toString(); + } + return false; +}; + +const ojbectSchema = new ObjectSchema({ + editorKey: { + merge: "replace", + validate: "string!" + }, + height: { + merge: "replace", + validate: "string!" + }, + dicts: { + schema: { + fonts: { + merge: "replace", + validate(value) { + if (value && !Array.isArray(value)) { + throw new Error('Key "dicts": Key "fonts" must be a array.'); + } + value.forEach((item) => { + if (!item.label || (!item.value && item.value !== null)) { + throw new Error('Key "dicts": Key "fonts" must be a array of objects with "label" and "value" properties.'); + } + }); + } + }, + colors: { + merge: "replace", + validate: "array" + }, + lineHeights: { + merge: "replace", + validate(value) { + if (value && !Array.isArray(value)) { + throw new Error('Key "dicts": Key "lineHeights": must be a array.'); + } + if (!value.find((item) => item.default)) { + throw new Error('Key "dicts": Key "lineHeights": please set a default value.'); + } + value.forEach((item) => { + if (!item.label || (!item.value && item.value !== null)) { + throw new Error('Key "dicts": Key "lineHeights": must be a array of objects with "label" and "value" properties.'); + } + }); + } + }, + specialCharacters: { + merge: "replace", + validate: "array" + }, + emojis: { + merge: "replace", + validate: "array" + }, + pageSizes: { + merge: "replace", + validate(value) { + if (value && !Array.isArray(value)) { + throw new Error('Key "dicts": Key "pageSizes": must be a array.'); + } + if (!value.find((item) => item.default)) { + throw new Error('Key "dicts": Key "pageSizes": please set a default value.'); + } + value.forEach((item, index) => { + if (!item.label || item.label === "") { + throw new Error(`Key "dicts": Key "pageSizes[${index}]" Key: "label" cannot be empty.`); + } + if (!isNumber(item.width)) { + throw new Error(`Key "dicts": Key "pageSizes[${index}]" Key: "width" must be a number.`); + } + if (!isNumber(item.height)) { + throw new Error(`Key "dicts": Key "pageSizes[${index}]" Key: "height" must be a number.`); + } + }); + } + } + } + }, + toolbar: { + schema: { + defaultMode: { + merge: "replace", + validate(value) { + if (value && !["classic", "ribbon"].includes(value)) { + throw new Error('Key "toolbar": Key "defaultMode" must be one of "classic" or "ribbon".'); + } + } + }, + enableSourceEditor: { + merge: "replace", + validate: "boolean" + }, + menus: { + merge: "replace", + validate(value) { + const defaultMenus = defaultOptions.toolbar.menus; + if (value && !Array.isArray(value)) { + throw new Error('Key "toolbar": Key "menus" must be a array.'); + } + if (!value.includes("base")) { + throw new Error('Key "toolbar": Key "menus" should at least contain "base".'); + } + if (!value.every((item) => defaultMenus.includes(item))) { + throw new Error(`Key "toolbar": Key "menus" the array items of toolbar.menus must contain only one or multiple of ${JSON.stringify(defaultMenus)}.`); + } + } + }, + disableMenuItems: { + merge: "replace", + validate(value) { + if (value && !Array.isArray(value)) { + throw new Error('Key "toolbar": Key "disableMenuItems" must be a array.'); + } + } + } + } + }, + page: { + schema: { + defaultMargin: { + schema: { + left: { + merge: "replace", + validate: "number" + }, + right: { + merge: "replace", + validate: "number" + }, + top: { + merge: "replace", + validate: "number" + }, + bottom: { + merge: "replace", + validate: "number" + } + } + }, + defaultOrientation: { + merge: "replace", + validate(value) { + if (value && !["horizontal", "vertical"].includes(value)) { + throw new Error('Key "page": Key "defaultOrientation" must be one of "horizontal" or "vertical".'); + } + } + }, + defaultBackground: { + merge: "replace", + validate: "string" + }, + showBreakMarks: { + merge: "replace", + validate: "boolean" + }, + watermark: { + schema: { + type: { + merge: "replace", + validate(value) { + if (value && !["compact", "spacious"].includes(value)) { + throw new Error('Key "watermark": Key "type" must be one of "compact" or "spacious".'); + } + } + }, + alpha: { + merge: "replace", + validate: "number" + }, + fontColor: { + merge: "replace", + validate: "string" + }, + fontFamily: { + merge: "replace", + validate(value) { + if (value !== null && typeof value !== "string") { + throw new Error('Key "watermark": Key "fontFamily" must be a string.'); + } + } + }, + fontSize: { + merge: "replace", + validate: "number" + }, + fontWeight: { + merge: "replace", + validate: "string" + }, + text: { + merge: "replace", + validate: "string" + } + } + } + } + }, + document: { + schema: { + title: { + merge: "replace", + validate: "string" + }, + content: { + merge: "replace", + validate() {} + }, + placeholder: { + merge: "replace", + validate: "string" + }, + enableSpellcheck: { + merge: "replace", + validate: "boolean" + }, + enableMarkdown: { + merge: "replace", + validate: "boolean" + }, + enableBubbleMenu: { + merge: "replace", + validate: "boolean" + }, + enableBlockMenu: { + merge: "replace", + validate: "boolean" + }, + readOnly: { + merge: "replace", + validate: "boolean" + }, + autofocus: { + merge: "replace", + validate: "boolean" + }, + characterLimit: { + merge: "replace", + validate: "number" + }, + typographyRules: { + merge: "replace", + validate: "object" + }, + autoSave: { + schema: { + enabled: { + merge: "replace", + validate: "boolean" + }, + interval: { + merge: "replace", + validate: "number" + } + } + } + } + }, + shareUrl: { merge: "replace", validate: "string" }, + templates: { + merge: "replace", + validate(value) { + if (value && !Array.isArray(value)) { + throw new Error('Key "templates": Key "menus" must be a array.'); + } + value.forEach((item, index) => { + if (!item.title || !item.title === "") { + throw new Error(`Key "templates[${index}]": Key "title" cannot be empty.`); + } + if (!item.content || !item.content === "") { + throw new Error(`Key "templates[${index}]": Key "content" cannot be empty.`); + } + }); + } + }, + cdnUrl: { + merge: "replace", + validate: "string" + }, + diagrams: { + merge: "assign", + validate: "object" + }, + file: { + schema: { + allowedMimeTypes: { + merge: "replace", + validate: "array" + }, + maxSize: { + merge: "replace", + validate: "number" + }, + onUpload: { + merge: "replace", + validate(value) { + if (value.constructor.name !== "AsyncFunction") { + throw new Error('Key "upload": Key "onUpload" must be a async function.'); + } + } + }, + onDelete: { + merge: "replace", + validate(value) { + if (typeof value !== "function" && value.constructor.name !== "AsyncFunction") { + throw new Error('Key "upload": Key "onDelete" must be a function.'); + } + } + } + } + }, + extensions: { + merge: "replace", + validate: "array" + }, + onSave: { + merge: "replace", + validate(value) { + if (value.constructor.name !== "AsyncFunction" && value instanceof Promise) { + throw new Error('Key "document": Key "saveNethod" must be a async function.'); + } + } + }, + onFileUpload: { + merge: "replace", + validate(value) { + if (value.constructor.name !== "AsyncFunction") { + throw new Error('Key "upload": Key "onUpload" must be a async function.'); + } + } + }, + onFileDelete: { + merge: "replace", + validate(value) { + if (typeof value !== "function" && value.constructor.name !== "AsyncFunction") { + throw new Error('Key "upload": Key "onDelete" must be a function.'); + } + } + } +}); + +export { defaultOptions, propsOptions, ojbectSchema }; diff --git a/src/components_umo/statusbar/index.vue b/src/components_umo/statusbar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..4573bb44c5c1939865d5680562ec8ec52270309b --- /dev/null +++ b/src/components_umo/statusbar/index.vue @@ -0,0 +1,473 @@ + + + + + + + diff --git a/src/components_umo/statusbar/shortcuts.vue b/src/components_umo/statusbar/shortcuts.vue new file mode 100644 index 0000000000000000000000000000000000000000..e8b1eb05d88017f833e4d387bb4c7bc6a3388370 --- /dev/null +++ b/src/components_umo/statusbar/shortcuts.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/src/components_umo/toolbar/classic.vue b/src/components_umo/toolbar/classic.vue new file mode 100644 index 0000000000000000000000000000000000000000..841fe97ffde7d9e38b920a269c6192a506dff298 --- /dev/null +++ b/src/components_umo/toolbar/classic.vue @@ -0,0 +1,261 @@ + + + + + diff --git a/src/components_umo/toolbar/index.vue b/src/components_umo/toolbar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2c1ca7324213dae2d0722d6a96411b75bf8ca5cb --- /dev/null +++ b/src/components_umo/toolbar/index.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/src/components_umo/toolbar/ribbon.vue b/src/components_umo/toolbar/ribbon.vue new file mode 100644 index 0000000000000000000000000000000000000000..a1c9429ca738cd0e37ee48c59b29417867651b59 --- /dev/null +++ b/src/components_umo/toolbar/ribbon.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/src/components_umo/toolbar/scrollable.vue b/src/components_umo/toolbar/scrollable.vue new file mode 100644 index 0000000000000000000000000000000000000000..4919e2f5421b91a4fea501ceed667bfdc0168e41 --- /dev/null +++ b/src/components_umo/toolbar/scrollable.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/components_umo/toolbar/source.vue b/src/components_umo/toolbar/source.vue new file mode 100644 index 0000000000000000000000000000000000000000..a0df9dadf0d70a0875e73ebdd4042d90c6e00618 --- /dev/null +++ b/src/components_umo/toolbar/source.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components_umo/tooltip.vue b/src/components_umo/tooltip.vue new file mode 100644 index 0000000000000000000000000000000000000000..64b127972172f3a3d07f93f904d572076da4fe32 --- /dev/null +++ b/src/components_umo/tooltip.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/composables/dialog.js b/src/composables/dialog.js new file mode 100644 index 0000000000000000000000000000000000000000..903c7bc03b158f9cb3b14e0de98433082d85dfb0 --- /dev/null +++ b/src/composables/dialog.js @@ -0,0 +1,25 @@ +import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next' +const { container } = useStore() + +export const useAlert = (parmas) => { + return DialogPlugin.alert({ + attach: container, + placement: 'center', + ...parmas, + }) +} +export const useConfirm = (parmas) => { + return DialogPlugin.confirm({ + attach: container, + placement: 'center', + preventScrollThrough: false, + ...parmas, + }) +} +export const useMessage = (type, parmas) => { + const options = typeof parmas === 'string' ? { content: parmas } : parmas + return MessagePlugin[type]({ + attach: container, + ...options, + }) +} diff --git a/src/composables/hotkeys.js b/src/composables/hotkeys.js new file mode 100644 index 0000000000000000000000000000000000000000..6029a721edced6a0158cd9ff9478c4baf81fe4b0 --- /dev/null +++ b/src/composables/hotkeys.js @@ -0,0 +1,10 @@ +import hotkeys from 'hotkeys-js' + +export const useHotkeys = (keys, callback) => { + hotkeys.filter = () => true + hotkeys(keys, (e) => { + e.preventDefault() + callback() + return false + }) +} diff --git a/src/composables/popup.js b/src/composables/popup.js new file mode 100644 index 0000000000000000000000000000000000000000..9483b52fe60429da4c9af3e74600c56a4f434aec --- /dev/null +++ b/src/composables/popup.js @@ -0,0 +1,9 @@ +export function usePopup() { + const popupVisible = ref(false) + + const togglePopup = (visible) => { + popupVisible.value = visible !== undefined ? visible : !popupVisible.value + } + + return { popupVisible, togglePopup } +} diff --git a/src/composables/state.js b/src/composables/state.js new file mode 100644 index 0000000000000000000000000000000000000000..0809e4c255b12d6fa64a7f07213f50e020a16e74 --- /dev/null +++ b/src/composables/state.js @@ -0,0 +1,41 @@ +export const useState = (key, editorKey) => { + const { options } = useStore() + let data = null + switch (key) { + case 'toolbar': + data = { + mode: options.value.toolbar.defaultMode, + show: true, + } + break + case 'document': + const { id, title, content, enableMarkdown, enableSpellcheck } = + options.value.document + data = { + id, + title, + content, + markdown: enableMarkdown, + spellcheck: enableSpellcheck, + } + break + case 'recent': + data = { + fonts: [], + colors: [], + } + break + case 'print': + data = { + singleColumn: true, + showPageNumber: true, + } + break + default: + console.error('[useStorage]', 'Key is not valid') + } + return useStorage( + `umo-editor:${editorKey || options.value.editorKey}:${key}`, + data, + ) +} diff --git a/src/composables/store.js b/src/composables/store.js new file mode 100644 index 0000000000000000000000000000000000000000..9a69d3325b7ed287eb74753e7b9803d66aa85992 --- /dev/null +++ b/src/composables/store.js @@ -0,0 +1,85 @@ +import { defaultOptions, ojbectSchema } from "@/components_umo/options"; +import generateId from "@/utils/generate-id"; + +export const useStore = createGlobalState(() => { + const toolbarKey = ref(generateId()); + const options = ref(defaultOptions); + const page = ref({}); + const editor = ref(null); + const tableOfContents = ref([]); + const imagePreview = ref(false); + const searchReplace = ref(false); + const savedAt = ref(null); + const printing = ref(false); + const editorDestroyed = ref(false); + + const setOptions = (value) => { + const opts = value?.value || value; + + options.value = ojbectSchema.merge( + options.value, + Object.keys(opts).reduce((acc, key) => { + if (opts[key] !== undefined) acc[key] = opts[key]; + return acc; + }, {}) + ); + return options.value; + }; + + watch( + () => options.value.page, + ({ defaultBackground, defaultMargin, defaultOrientation, watermark, showBreakMarks }) => { + page.value = { + size: options.value.dicts.pageSizes.find((item) => item.default), + margin: defaultMargin, + background: defaultBackground, + orientation: defaultOrientation, + watermark: watermark, + showBreakMarks: showBreakMarks, + showLineNumber: false, + showToc: false, + zoomLevel: 100, + autoWidth: false, + preview: { + enabled: false, + laserPointer: true + } + }; + }, + { immediate: true, once: true } + ); + + const setEditor = (Editor) => (editor.value = Editor); + const resetStore = () => { + editor.value = null; + tableOfContents.value = []; + searchReplace.value = false; + savedAt.value = null; + editorDestroyed.value = true; + }; + + watch( + () => options.value.document.readOnly, + async (val) => { + editor.value.setEditable(!val); + toolbarKey.value = generateId(); + } + ); + + return { + toolbarKey, + container: `#umo-editor-${generateId(4)}`, + options, + page, + editor, + tableOfContents, + imagePreview, + searchReplace, + savedAt, + printing, + editorDestroyed, + setOptions, + setEditor, + resetStore + }; +}); diff --git a/src/extension/CassieKit.ts b/src/extension/CassieKit.ts index 90d7c66a79d8d86908807f4e1548025ad878ba91..7c3614a627d537bebe02ae65742d575ff129f7b1 100644 --- a/src/extension/CassieKit.ts +++ b/src/extension/CassieKit.ts @@ -31,7 +31,7 @@ import { CassieTable } from "@/extension/table/Table"; import { cursorPlugin } from "@/extension/cursor/cursor"; import { TableOptions } from "@tiptap/extension-table"; import { Mention, MentionOptions } from "@/extension/suggestion/mention"; -import TextAlign, { TextAlignOptions } from "@tiptap/extension-text-align"; +// import TextAlign, { TextAlignOptions } from "@tiptap/extension-text-align"; import { PageOptions } from "@/extension/page/types"; import { ParagraphOptions } from "@tiptap/extension-paragraph"; import Underline from "@tiptap/extension-underline"; @@ -46,6 +46,15 @@ import CassieBlock from "@/extension/node/CassieBlock"; import { CassieBlockExt } from "@/extension/node/CassieBlockExt"; import { EmrOrderedList } from "@/extension/bulletlist/orderlist"; import { CassieTableCell } from "@/extension/table/TableCell"; +import Subscript from "@tiptap/extension-subscript"; +import Superscript from "@tiptap/extension-superscript"; +import FontFamily from "@tiptap/extension-font-family"; +import FontSize from "./font-size"; +import LineHeight from "./line-height"; +import TextAlign from "./text-align"; +import NodeAlign from "./node-align"; +import Selection from './selection' +// import InvisibleNode from './invisible-node' export interface CassieKitOptions { blockquote: Partial | false; bold: Partial | false; @@ -72,7 +81,8 @@ export interface CassieKitOptions { paragraph: Partial | false; strike: Partial | false; text: false; - textAlign: Partial | false; + lineHeight: any; + // textAlign: Partial | false; } export const CassieKit = Extension.create({ @@ -133,6 +143,7 @@ export const CassieKit = Extension.create({ } if (this.options.history !== false) { + console.log(History, "History"); extensions.push(History.configure(this.options?.history)); } @@ -166,9 +177,9 @@ export const CassieKit = Extension.create({ extensions.push(CassieText.configure(this.options?.text)); extensions.push(TextStyle); } - if (this.options.textAlign !== false) { - extensions.push(TextAlign.configure(this.options?.textAlign)); - } + // if (this.options.textAlign !== false) { + // extensions.push(TextAlign.configure(this.options?.textAlign)); + // } if (this.options.table !== false) { extensions.push(CassieTable.configure(this.options?.table)); @@ -182,6 +193,9 @@ export const CassieKit = Extension.create({ if (this.options.mention !== false) { extensions.push(Mention.configure(this.options?.mention)); } + if (this.options.lineHeight !== false) { + extensions.push(LineHeight.configure(this.options?.lineHeight)); + } /*自定节点*/ extensions.push(CassieBlock); /*自定义扩展块*/ @@ -191,7 +205,13 @@ export const CassieKit = Extension.create({ extensions.push(Insertion); extensions.push(Deletion); extensions.push(PrintExtension); - + extensions.push(Subscript); + extensions.push(Superscript); + extensions.push(TextAlign); + extensions.push(NodeAlign); + extensions.push(FontFamily); + extensions.push(FontSize); + extensions.push(Selection); extensions.push(Image.configure({ inline: true, allowBase64: true })); return extensions; } diff --git a/src/extension/font-size.ts b/src/extension/font-size.ts new file mode 100644 index 0000000000000000000000000000000000000000..b4f48551823e6763f431d0c9eb140dbff26b6686 --- /dev/null +++ b/src/extension/font-size.ts @@ -0,0 +1,48 @@ +import { Extension } from '@tiptap/core' + +export default Extension.create({ + name: 'fontSize', + addOptions() { + return { + types: ['textStyle'], + defaultFontSize: '14px', + } + }, + addGlobalAttributes() { + return [ + { + types: this.options.types, + attributes: { + fontSize: { + default: this.options.defaultFontSize, + parseHTML: (element) => + element.style.fontSize || this.options.defaultFontSize, + renderHTML: (attributes) => { + if (attributes.fontSize === this.options.defaultFontSize) { + return {} + } + return { style: `font-size: ${attributes.fontSize}` } + }, + }, + }, + }, + ] + }, + addCommands() { + return { + setFontSize: + (fontSize) => + ({ chain }) => { + return chain().setMark('textStyle', { fontSize }).run() + }, + unsetFontSize: + () => + ({ chain }) => { + return chain() + .setMark('textStyle', { fontSize: null }) + .removeEmptyTextStyle() + .run() + }, + } + }, +}) diff --git a/src/extension/invisible-node.ts b/src/extension/invisible-node.ts new file mode 100644 index 0000000000000000000000000000000000000000..f8ab4a7a819e59ff94e73960607a0e912fe4d13c --- /dev/null +++ b/src/extension/invisible-node.ts @@ -0,0 +1,14 @@ +import { InvisibleNode } from "@tiptap-pro/extension-invisible-characters"; + +class Invisible extends InvisibleNode { + constructor() { + super({ + type: "paragraph", + predicate: (node) => { + return ["heading"].includes(node.type.name); + } + }); + } +} + +export default Invisible; diff --git a/src/extension/line-height.ts b/src/extension/line-height.ts new file mode 100644 index 0000000000000000000000000000000000000000..8eb7762e8a5de8d2d033747bae3b388a7d0a5347 --- /dev/null +++ b/src/extension/line-height.ts @@ -0,0 +1,44 @@ +import { Extension } from "@tiptap/core"; + +export default Extension.create({ + name: "lineHeight", + addOptions() { + return { + types: [], + defaultLineHeight: 1.5 + }; + }, + addGlobalAttributes() { + return [ + { + types: this.options.types, + attributes: { + lineHeight: { + default: this.options.defaultLineHeight, + parseHTML: (element) => element.style.lineHeight || this.options.defaultLineHeight, + renderHTML: (attributes) => { + if (attributes.lineHeight === this.options.defaultLineHeight) { + return {}; + } + return { style: `line-height: ${attributes.lineHeight}` }; + } + } + } + } + ]; + }, + addCommands() { + return { + setLineHeight: + (lineHeight) => + ({ commands }) => { + return this.options.types.every((type) => commands.updateAttributes(type, { lineHeight })); + }, + unsetLineHeight: + () => + ({ commands }) => { + return this.options.types.every((type) => commands.resetAttributes(type, "lineHeight")); + } + }; + } +}); diff --git a/src/extension/node-align.ts b/src/extension/node-align.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5d89b7c30e15bfed261d7389309212c41167bd4 --- /dev/null +++ b/src/extension/node-align.ts @@ -0,0 +1,50 @@ +import { Extension } from "@tiptap/core"; + +export default Extension.create({ + name: "nodeAlign", + addOptions() { + return { + defaultAlignment: "center", + alignments: ["flex-start", "center", "flex-end"], + types: ["image", "video", "audio", "iframe", "file"] + }; + }, + addGlobalAttributes() { + return [ + { + types: this.options.types, + attributes: { + nodeAlign: { + default: this.options.defaultAlignment, + parseHTML: (element) => { + return element.style.justifyContent || this.options.defaultAlignment; + }, + renderHTML: (attributes) => { + if (attributes.nodeAlign === this.options.defaultAlignment) { + return {}; + } + return { style: `justify-content: ${attributes.nodeAlign}` }; + } + } + } + } + ]; + }, + addCommands() { + return { + setNodeAlign: + (alignment) => + ({ commands }) => { + if (!this.options.alignments.includes(alignment)) { + return false; + } + return this.options.types.every((type) => commands.updateAttributes(type, { nodeAlign: alignment })); + }, + unsetNodeAlign: + () => + ({ commands }) => { + return this.options.types.every((type) => commands.resetAttributes(type, "nodeAlign")); + } + }; + } +}); diff --git a/src/extension/selection.js b/src/extension/selection.js new file mode 100644 index 0000000000000000000000000000000000000000..6ba56f0478d13288cb5f1620cf664314763b1813 --- /dev/null +++ b/src/extension/selection.js @@ -0,0 +1,41 @@ +import { Extension } from "@tiptap/core"; + +export default Extension.create({ + name: "selection", + addCommands() { + return { + getSelectionText: + () => + ({ editor }) => { + const { from, to, empty } = editor.state.selection; + if (empty) return ""; + return editor.state.doc.textBetween(from, to, ""); + }, + getSelectionNode: + () => + ({ editor }) => { + for (const node of Array.from(editor.vueRenderers)) { + if (node[1].props.selected) return node[1]; + } + }, + deleteSelectionNode: + () => + ({ editor, chain }) => { + if (editor.isActive("image") || editor.isActive("video") || editor.isActive("audio") || editor.isActive("file")) { + const node = editor.commands.getSelectionNode(); + if (!node) return; + const { options } = useStore(); + const { id, src } = node.props.node.attrs; + options.value.onFileDelete(id, src); + } + return chain().deleteSelection().run(); + } + }; + }, + addKeyboardShortcuts() { + return { + Backspace: () => this.editor.commands.deleteSelectionNode(), + Delete: () => this.editor.commands.deleteSelectionNode() + }; + } +}); diff --git a/src/extension/text-align.ts b/src/extension/text-align.ts new file mode 100644 index 0000000000000000000000000000000000000000..a4ad180e0e7f5b0193e77184f6526cdb8d2d4702 --- /dev/null +++ b/src/extension/text-align.ts @@ -0,0 +1,44 @@ +import TextAlign from "@tiptap/extension-text-align"; + +export default TextAlign.extend({ + addOptions() { + return { + ...this.parent?.(), + types: ["heading", "paragraph"], + alignments: ["left", "center", "right", "justify", "distributed"] + }; + }, + addGlobalAttributes() { + return [ + { + types: this.options.types, + attributes: { + textAlign: { + default: this.options.defaultAlignment, + parseHTML: (element) => { + if (element.style.textAlignLast) { + return "distributed"; + } + return element.style.textAlign || this.options.defaultAlignment; + }, + renderHTML: (attributes) => { + if (attributes.textAlign === this.options.defaultAlignment) { + return {}; + } + if (attributes.textAlign === "distributed") { + return { style: `text-align-last: justify` }; + } + return { style: `text-align: ${attributes.textAlign}` }; + } + } + } + } + ]; + }, + addKeyboardShortcuts() { + return { + ...this.parent?.(), + "Mod-Shift-d": () => this.editor.commands.setTextAlign("distributed") + }; + } +}); diff --git a/src/main.ts b/src/main.ts index f70eeb7f69d4d4259b8c6356823c90e963ead179..00c9d99aa1be43f22c01bc860d3bdb2d1225b12e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,7 +3,8 @@ import App from "./App.vue"; import router from "./router"; import store from "./store"; import "./index.css"; - +// 插件本地开发 +import { useUmoEditor, UmoEditor } from "./components_umo"; import CustomHline from "./design/components/custom-hline/index.vue"; import CustomVline from "./design/components/custom-vline/index.vue"; import CustomText from "./design/components/custom-text/index.vue"; @@ -31,4 +32,5 @@ app.component("v-style", { return h("style", {}, this.$slots.default()); } }); +app.component("UmoEditor", UmoEditor); app.use(store).use(router).mount("#app"); diff --git a/src/router/index.ts b/src/router/index.ts index b79eb29d82fdf68fde96f10564a9983ee069c965..6890b30521f746f8d79e8b1b9da971b1b8679ba1 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,79 +1,87 @@ import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router"; -import BaseEditor from "../views/BaseEditor.vue"; +// import BaseEditor from "../views/BaseEditor.vue"; import PageEditor from "../views/PageEditor.vue"; import PageEditorDeflate from "../views/PageEditorDeflate.vue"; -import SignEditor from "../views/SignEditor.vue"; +// import SignEditor from "../views/SignEditor.vue"; import DocxEditor from "../views/DocxEditor.vue"; -import CommentEditor from '../views/CommentEditor.vue'; +// import CommentEditor from '../views/CommentEditor.vue'; import ChangesetEditor from "../views/ChangesetEditor.vue"; -import CollaborativeEditor from "../views/CollaborativeEditor.vue"; +// import CollaborativeEditor from "../views/CollaborativeEditor.vue"; import PrintEditor from "../views/PrintEditor.vue"; import DiffEditor from "../views/DiffEditor.vue"; import PageHeaderAndFooter from "../views/PageHeaderAndFooter.vue"; - +import emrEditor from "../views/emrEditor/index.vue"; +import navbar from "../views/navbar.vue"; const routes: Array = [ { path: "/", - name: "base", - component: BaseEditor - }, - { - path: "/pageheaderandfooter", - name: "pageheaderandfooter", - component: PageHeaderAndFooter - }, - { - path: "/page", - name: "page", - component: PageEditor - }, - { - path: "/page1", - name: "page1", - component: PageEditorDeflate - }, - { - path: "/collaborativeeditor", - name: "collaborativeeditor", - component: CollaborativeEditor - }, - { - path: "/commenteditor", - name: "commenteditor", - component: CommentEditor - }, - { - path: "/changeseteditor", - name: "changeseteditor", - component: ChangesetEditor - }, - { - path: "/print", - name: "print", - component: PrintEditor - }, - { - path: "/diff", - name: "diff", - component: DiffEditor - }, - { - path: "/sign", - name: "sign", - component: SignEditor - }, - { - path: "/docx", - name: "docx", - component: DocxEditor + name: "emrEditor", + component: emrEditor }, { - path: "/about", - name: "about", - // route level code-splitting - // this generates a separate chunk (about.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "about" */ "../views/AboutView.vue") + path: "/navbar", + name: "navbar", + component: navbar, + children: [ + { + path: "/pageheaderandfooter", + name: "pageheaderandfooter", + component: PageHeaderAndFooter + }, + { + path: "/page", + name: "page", + component: PageEditor + }, + { + path: "/page1", + name: "page1", + component: PageEditorDeflate + }, + // { + // path: "/collaborativeeditor", + // name: "collaborativeeditor", + // component: CollaborativeEditor + // }, + // { + // path: "/commenteditor", + // name: "commenteditor", + // component: CommentEditor + // }, + { + path: "/changeseteditor", + name: "changeseteditor", + component: ChangesetEditor + }, + { + path: "/print", + name: "print", + component: PrintEditor + }, + { + path: "/diff", + name: "diff", + component: DiffEditor + }, + // { + // path: "/sign", + // name: "sign", + // component: SignEditor + // }, + { + path: "/docx", + name: "docx", + component: DocxEditor + }, + { + path: "/about", + name: "about", + // route level code-splitting + // this generates a separate chunk (about.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import(/* webpackChunkName: "about" */ "../views/AboutView.vue") + } + ] } ]; diff --git a/src/utils/copyright.js b/src/utils/copyright.js new file mode 100644 index 0000000000000000000000000000000000000000..63c6fb15e90d184bb9481422d4d2a24ca49b2d75 --- /dev/null +++ b/src/utils/copyright.js @@ -0,0 +1,9 @@ +import pkg from '../../package.json' + +export default `/** + * ${pkg.name} ${pkg.version} + * @license ${pkg.license} + * @author ${pkg.author.name} ${pkg.author.url} + * @see ${pkg.homepage} + **/ +` diff --git a/src/utils/diagram-editor.js b/src/utils/diagram-editor.js new file mode 100644 index 0000000000000000000000000000000000000000..4046acbc621858291373683f2bc8ec8a60e1aa0d --- /dev/null +++ b/src/utils/diagram-editor.js @@ -0,0 +1,140 @@ +// https://www.diagrams.com/doc/faq/embed-mode +class DiagramEditor { + constructor({ domain, params, container }) { + this.domain = domain ?? this.domain + this.params = Object.assign(params || {}, this.params) + this.container = container + this.handleuseMessageEvent = (evt) => { + if ( + this.frame !== undefined && + evt.source === this.frame.contentWindow && + evt.data.length > 0 + ) { + try { + const msg = JSON.parse(evt.data) + if (msg) { + this.handleuseMessage(msg) + } + } catch (e) { + console.error(e) + } + } + } + } + + domain = 'https://embed.diagrams.net' + // https://www.drawio.com/doc/faq/supported-url-parameters + params = { + ui: 'atlas', + proto: 'json', + libraries: 1, + configure: 1, + noSaveBtn: 1, + dark: 1, + lang: 'zh', + } + xml = null + format = 'xmlsvg' + + // 编辑元素 + edit(src) { + let fmt = this.format + if (src.substring(0, 15) === 'data:image/png;') { + fmt = 'xmlpng' + } else if (src.substring(0, 19) === 'data:image/svg+xml;') { + fmt = 'xmlsvg' + } + this.startEditing(src, fmt) + return this + } + + // 创建 iframe + createFrame() { + const params = Object.keys(this.params) + .map((key) => key + '=' + this.params[key]) + .join('&') + const frame = document.createElement('iframe') + frame.setAttribute('class', 'diagrams-iframe') + frame.setAttribute('src', `${this.domain}?${params}`) + return frame + } + + // diagrams页面和当前页面通信 + postMessage(msg) { + if (this.frame) { + this.frame.contentWindow.postMessage(JSON.stringify(msg), '*') + } + } + handleuseMessage(msg) { + if (msg.event === 'configure') { + this.configureEditor() + } else if (msg.event === 'init') { + this.initializeEditor() + } else if (msg.event === 'save') { + this.export(msg.data) + this.xml = msg.xml + if (msg.exit) { + msg.event = 'exit' + } else { + this.postMessage({ + action: 'status', + messageKey: 'allChangesSaved', + modified: false, + }) + } + } + if (msg.event === 'exit') { + if (this.format !== 'xml') { + if (this.xml) { + this.postMessage({ + action: 'export', + format: this.format, + xml: this.xml, + spinKey: 'export', + }) + } + } + this.stopEditing(msg) + } + } + + // 开始编辑 + startEditing(data, format) { + if (!this.frame) { + window.addEventListener('message', this.handleuseMessageEvent) + this.format = format ?? this.format + this.data = data + this.frame = this.createFrame() + const container = document.querySelector(this.container) + container.appendChild(this.frame) + } + } + + // 停止编辑 + stopEditing() { + window.removeEventListener('message', this.handleuseMessageEvent) + this.frame = undefined + } + + // 安装编辑器 + initializeEditor() { + this.postMessage({ + action: 'load', + autosave: 0, + saveAndExit: '1', + modified: 'unsavedChanges', + xml: this.data, + }) + } + + // 设置编辑器 + configureEditor() { + this.postMessage({ action: 'configure', config: this.params.configure }) + } + // 导出数据 + export(data) { + return data + } +} + +export default DiagramEditor diff --git a/src/utils/file.js b/src/utils/file.js new file mode 100644 index 0000000000000000000000000000000000000000..5cad2cdeb03c86e920654109a46969d662da07a1 --- /dev/null +++ b/src/utils/file.js @@ -0,0 +1,71 @@ +const fileTypes = { + ai: ['ai', 'eps'], + app: ['app'], + axure: ['rp'], + // prettier-ignore + book: ['mobi', 'oeb', 'lit', 'xeb', 'ebx', 'rb', 'pdb', 'epub', 'azw3', 'hlp', 'chm', 'wdl', 'ceb', 'abm', 'pdg', 'caj'], + css: ['css', 'less', 'sass'], + dmg: ['dmg'], + excel: [ + 'csv', + 'fods', + 'ods', + 'ots', + 'xls', + 'xlsm', + 'xlsx', + 'xlt', + 'xltm', + 'xltx', + 'et', + 'ett', + ], + exe: ['exe'], + html: ['htm', 'html', 'mht'], + // prettier-ignore + img: ['png', 'bmp', 'jpg', 'jpeg', 'gif', 'webp', 'tga', 'exif', 'fpx', 'svg', 'hdri', 'raw', 'ico', 'jfif', 'dib', 'pbm', 'pgm', 'ppm', 'rgb'], + java: ['jar', 'java'], + js: ['js', 'jsx', 'ts', 'tsx'], + json: ['json'], + keynote: ['key'], + md: ['md', 'markdown'], + // prettier-ignore + music: ['au', 'aif', 'aiff', 'aifc', 'rmi', 'mp3', 'mid', 'cda', 'wav', 'wma', 'ra', 'ram', 'snd', 'mida', 'ogg', 'ape', 'flac', 'aac'], + numbers: ['numbers'], + pages: ['pages'], + pdf: ['pdf'], + php: ['php'], + pkg: ['pkg'], + // prettier-ignore + ppt: ['fodp', 'odp', 'otp', 'pot', 'potm', 'potx', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx', 'dps', 'dpt', 'wpp'], + psd: ['psd'], + python: ['python'], + sh: ['sh'], + sketch: ['sketch'], + sql: ['sql'], + text: ['text', 'txt'], + video: ['mp4', 'avi', 'mov', 'rmvb', 'rm', 'flv', 'mpeg', 'wmv', 'mkv'], + vue: ['vue'], + // prettier-ignore + word: ['doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'epub', 'fodt', 'odt', 'ott', 'rtf', 'wps', 'wpt'], + xmind: ['xmind'], + // prettier-ignore + zip: ['zip', 'rar', 'tar', 'gz', 'gzip', 'uue', 'bz2', 'iso', '7z', 'z', 'ace', 'lzh', 'arj', 'cab'], + font: ['eot', 'otf', 'fon', 'font', 'ttf', 'ttc', 'woff', 'woff2'], +} + +export const getFileExtname = (filename) => { + const splitFileName = filename.split('.') + const extname = splitFileName[splitFileName.length - 1] + return extname +} + +export const getFileIcon = (filename) => { + const extname = getFileExtname(filename) + for (const type of Object.keys(fileTypes)) { + if (fileTypes[type].includes(extname)) { + return type + } + } + return 'common' +} diff --git a/src/utils/generate-id.js b/src/utils/generate-id.js new file mode 100644 index 0000000000000000000000000000000000000000..426f48a905f8f8a6ef1dab4ec9a3a4d139b2e3ce --- /dev/null +++ b/src/utils/generate-id.js @@ -0,0 +1,4 @@ +export default (length = 8) => + Math.random() + .toString(36) + .substring(2, length + 2) diff --git a/src/utils/media-player.js b/src/utils/media-player.js new file mode 100644 index 0000000000000000000000000000000000000000..6e4551331c8f747b01a1776a0db8d3fa95276259 --- /dev/null +++ b/src/utils/media-player.js @@ -0,0 +1,51 @@ +import Plyr from 'plyr' +import 'plyr/dist/plyr.css' +import '@/assets/styles/plyr.less' + +const zh_CN = { + restart: '重新播放', + rewind: '倒退 {seektime} 秒', + play: '播放', + pause: '暂停', + fastForward: '快进 {seektime} 秒', + seek: '搜索', + seekLabel: '{currentTime} / {duration}', + played: '已播放', + buffered: '已缓冲', + currentTime: '当前时间', + duration: '持续时间', + volume: '音量', + mute: '静音', + unmute: '取消静音', + enableCaptions: '启用字幕', + disableCaptions: '禁用字幕', + download: '下载', + enterFullscreen: '进入全屏', + exitFullscreen: '退出全屏', + captions: '字幕', + settings: '设置', + pip: '画中画', + menuBack: '返回', + seek: '播放位置', + speed: '速度', + normal: '正常', + quality: '质量', + loop: '循环', + start: '开始', + end: '结束', + all: '全部', + reset: '重置', + disabled: '已禁用', + enabled: '已启用', +} + +export const mediaPlayer = (container) => { + if (!Plyr) return + return new Plyr(container, { + i18n: zh_CN, + settings: [], + tooltips: { controls: true }, + storage: { key: 'umo-editor:player' }, + disableContextMenu: false, + }) +} diff --git a/src/utils/shortcut.js b/src/utils/shortcut.js new file mode 100644 index 0000000000000000000000000000000000000000..82a7a298be938f1ab2ebdd8d640a7beaeb5c758a --- /dev/null +++ b/src/utils/shortcut.js @@ -0,0 +1,15 @@ +export default (shortcut) => { + if (!shortcut) return '' + // 判断是 MAC OS + const isMacOS = /macintosh|mac os x/gi.test(navigator.userAgent) + let keys = shortcut + if (isMacOS) { + keys = keys + .replace(/ctrl/gi, '⌘') + .replace(/shift/gi, '⇧') + .replace(/alt/gi, '⌥') + .replace(/Enter/gi, 'Return') + .replace(/Backspace/gi, 'Delete') + } + return keys +} diff --git a/src/utils/time-ago.js b/src/utils/time-ago.js new file mode 100644 index 0000000000000000000000000000000000000000..ace11eeb774a480ce606285b5496780f99130696 --- /dev/null +++ b/src/utils/time-ago.js @@ -0,0 +1,20 @@ +export default (timestamp) => { + const messages = { + justNow: '刚刚', + past: (n) => (n.match(/\d/) ? `${n}前` : n), + future: (n) => (n.match(/\d/) ? `未来 ${n}` : n), + month: (n, past) => + n === 1 ? (past ? '上个月' : '下个月') : `${n}个月${n > 1 ? '' : ''}`, + year: (n, past) => + n === 1 ? (past ? '去年' : '明年') : `${n}年${n > 1 ? '' : ''}`, + day: (n, past) => + n === 1 ? (past ? '昨天' : '明天') : `${n}天${n > 1 ? '' : ''}`, + week: (n, past) => + n === 1 ? (past ? '上一周' : '下一周') : `${n}周${n > 1 ? '' : ''}`, + hour: (n) => `${n}小时${n > 1 ? '' : ''}`, + minute: (n) => `${n}分钟${n > 1 ? '' : ''}`, + second: (n) => `${n}秒${n > 1 ? '' : ''}`, + } + const time = useTimeAgo(new Date(timestamp), { messages }) + return time.value.replace(/"/gi, '') +} diff --git a/src/views/PageEditorDeflate.vue b/src/views/PageEditorDeflate.vue index 52638ea9021eb5bb384639d78be2d2f08d33203b..13bc8e7be0afd5ec9302688897098313aba80a86 100644 --- a/src/views/PageEditorDeflate.vue +++ b/src/views/PageEditorDeflate.vue @@ -1,112 +1,176 @@ - - + diff --git a/src/views/emrEditor/index.vue b/src/views/emrEditor/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..e8bfe436ccb7363642d7b32da10dea4dcf7880ff --- /dev/null +++ b/src/views/emrEditor/index.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/views/navbar.vue b/src/views/navbar.vue new file mode 100644 index 0000000000000000000000000000000000000000..cc4979d58d56542269b485d6f2c0d0b331267689 --- /dev/null +++ b/src/views/navbar.vue @@ -0,0 +1,116 @@ + + + + diff --git a/vite.config.js b/vite.config.js index 626133dfce9d61dc41ae3ff390f123596b4cd837..5bef34005b4cd9a0b90d4091d5200063c4cc78d4 100644 --- a/vite.config.js +++ b/vite.config.js @@ -3,6 +3,11 @@ import vue from "@vitejs/plugin-vue"; const path = require("path"); import wasm from "vite-plugin-wasm"; import topLevelAwait from "vite-plugin-top-level-await"; +import VueMacros from "unplugin-vue-macros/vite"; +import AutoImport from "unplugin-auto-import/vite"; +import Components from "unplugin-vue-components/vite"; +import { TDesignResolver } from "unplugin-vue-components/resolvers"; +import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; // https://vitejs.dev/config/ export default defineConfig({ resolve: { @@ -13,7 +18,53 @@ export default defineConfig({ } ] }, - plugins: [vue(), wasm(), topLevelAwait()], + plugins: [ + VueMacros({ + plugins: { + vue: vue() + } + }), + wasm(), + topLevelAwait(), + AutoImport({ + dirs: ["./src/composables"], + imports: ["vue", "@vueuse/core"], + resolvers: [ + TDesignResolver({ + library: "vue-next", + esm: true + }) + ], + dts: "./imports.d.ts" + }), + Components({ + directoryAsNamespace: true, + dirs: ["./src/components_umo"], + resolvers: [ + TDesignResolver({ + library: "vue-next", + esm: true + }) + ] + }), + createSvgIconsPlugin({ + iconDirs: [process.cwd() + "/src/assets/icons"] + }) + ], + css: { + preprocessorOptions: { + less: { + modifyVars: { + "@prefix": "umo" + }, + javascriptEnabled: true + } + } + }, + define: { + // enable hydration mismatch details in production build + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: "true" + }, build: { minify: "terser", brotliSize: false,