Compare commits

..

No commits in common. "8e93889ae41f21c20b33f18c109e1c2603de10f5" and "21d5259f3569f5f85c8a6796ab759eb322094446" have entirely different histories.

10 changed files with 54 additions and 106 deletions

View File

@ -1,10 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { useDisplayStore, useStore } from '@/stores' import { useStore } from '@/stores'
const store = useStore() const store = useStore()
const displayStore = useDisplayStore()
function editTabName() { function editTabName() {
ElMessageBox.prompt(`请输入新的方案名称`, `编辑方案名称`, { ElMessageBox.prompt(`请输入新的方案名称`, `编辑方案名称`, {
@ -68,7 +67,7 @@ function handleTabsEdit(targetName: string, action: string) {
<template> <template>
<transition enter-active-class="bounceInRight"> <transition enter-active-class="bounceInRight">
<el-col v-show="displayStore.isShowCssEditor" :span="8" class="cssEditor-wrapper order-1 h-full flex flex-col border-l-1"> <el-col v-show="store.isShowCssEditor" :span="8" class="cssEditor-wrapper order-1 h-full flex flex-col border-l-1">
<el-tabs <el-tabs
v-model="store.cssContentConfig.active" v-model="store.cssContentConfig.active"
type="border-card" type="border-card"

View File

@ -1,28 +1,25 @@
<script setup lang="ts"> <script setup lang="ts">
import { TableIcon, UploadCloudIcon } from 'lucide-vue-next' import { useStore } from '@/stores'
import {
MenubarContent,
MenubarItem,
MenubarMenu,
MenubarTrigger,
} from '@/components/ui/menubar'
import { useDisplayStore } from '@/stores'
const { toggleShowInsertFormDialog, toggleShowUploadImgDialog } = useDisplayStore() const store = useStore()
const { toggleShowInsertFormDialog, toggleShowUploadImgDialog } = store
</script> </script>
<template> <template>
<MenubarMenu> <MenubarMenu>
<MenubarTrigger> <MenubarTrigger> 编辑 </MenubarTrigger>
编辑
</MenubarTrigger>
<MenubarContent align="start"> <MenubarContent align="start">
<MenubarItem @click="toggleShowUploadImgDialog()"> <MenubarItem @click="toggleShowUploadImgDialog()">
<UploadCloudIcon class="mr-2 h-4 w-4" /> <el-icon class="mr-2 h-4 w-4">
<ElIconUpload />
</el-icon>
上传图片 上传图片
</MenubarItem> </MenubarItem>
<MenubarItem @click="toggleShowInsertFormDialog()"> <MenubarItem @click="toggleShowInsertFormDialog()">
<TableIcon class="mr-2 h-4 w-4" /> <el-icon class="mr-2 h-4 w-4">
<ElIconGrid />
</el-icon>
插入表格 插入表格
</MenubarItem> </MenubarItem>
</MenubarContent> </MenubarContent>

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { nextTick, ref } from 'vue'
import { storeToRefs } from 'pinia' import { storeToRefs } from 'pinia'
import StyleOptionMenu from './StyleOptionMenu.vue' import StyleOptionMenu from './StyleOptionMenu.vue'
@ -16,10 +16,9 @@ import {
legendOptions, legendOptions,
themeOptions, themeOptions,
} from '@/config' } from '@/config'
import { useDisplayStore, useStore } from '@/stores' import { useStore } from '@/stores'
const store = useStore() const store = useStore()
const { toggleShowCssEditor } = useDisplayStore()
const { const {
theme, theme,
@ -41,6 +40,7 @@ const {
codeBlockThemeChanged, codeBlockThemeChanged,
legendChanged, legendChanged,
macCodeBlockChanged, macCodeBlockChanged,
toggleShowCssEditor,
} = store } = store
const colorPicker = ref<HTMLElement & { show: () => void } | null>(null) const colorPicker = ref<HTMLElement & { show: () => void } | null>(null)
@ -52,6 +52,11 @@ function showPicker() {
// CSS // CSS
function customStyle() { function customStyle() {
toggleShowCssEditor() toggleShowCssEditor()
nextTick(() => {
if (!cssEditor.value) {
cssEditor.value!.refresh()
}
})
setTimeout(() => { setTimeout(() => {
cssEditor.value!.refresh() cssEditor.value!.refresh()
}, 50) }, 50)

View File

@ -43,7 +43,7 @@ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover
import { Button } from '@/components/ui/button' import { Button } from '@/components/ui/button'
import { mergeCss, solveWeChatImage } from '@/utils' import { mergeCss, solveWeChatImage } from '@/utils'
import { useDisplayStore, useStore } from '@/stores' import { useStore } from '@/stores'
const emit = defineEmits([`addFormat`, `formatContent`, `startCopy`, `endCopy`]) const emit = defineEmits([`addFormat`, `formatContent`, `startCopy`, `endCopy`])
@ -81,7 +81,6 @@ const formatItems = [
] as const ] as const
const store = useStore() const store = useStore()
const displayStore = useDisplayStore()
const { isDark, isCiteStatus, output, primaryColor } = storeToRefs(store) const { isDark, isCiteStatus, output, primaryColor } = storeToRefs(store)
@ -154,13 +153,6 @@ function copy() {
}) })
}, 350) }, 350)
} }
function customStyle() {
displayStore.toggleShowCssEditor()
setTimeout(() => {
store.cssEditor!.refresh()
}, 50)
}
</script> </script>
<template> <template>
@ -379,31 +371,6 @@ function customStyle() {
</Button> </Button>
</div> </div>
</div> </div>
<div class="space-y-2">
<h2>自定义 CSS 面板</h2>
<div class="grid grid-cols-5 justify-items-center gap-2">
<Button
class="w-full"
variant="outline"
:class="{
'border-black dark:border-white': displayStore.isShowCssEditor,
}"
@click="!displayStore.isShowCssEditor && customStyle()"
>
开启
</Button>
<Button
class="w-full"
variant="outline"
:class="{
'border-black dark:border-white': !displayStore.isShowCssEditor,
}"
@click="displayStore.isShowCssEditor && customStyle()"
>
关闭
</Button>
</div>
</div>
<div class="space-y-2"> <div class="space-y-2">
<h2>编辑区位置</h2> <h2>编辑区位置</h2>
<div class="grid grid-cols-5 justify-items-center gap-2"> <div class="grid grid-cols-5 justify-items-center gap-2">
@ -454,17 +421,6 @@ function customStyle() {
</Button> </Button>
</div> </div>
</div> </div>
<div class="space-y-2">
<h2>样式配置</h2>
<div>
<Button
class="w-full"
@click="store.resetStyleConfirm()"
>
重置
</Button>
</div>
</div>
</div> </div>
</PopoverContent> </PopoverContent>
</Popover> </Popover>

View File

@ -8,13 +8,12 @@ import {
DialogTitle, DialogTitle,
} from '@/components/ui/dialog' } from '@/components/ui/dialog'
import { useDisplayStore, useStore } from '@/stores' import { useStore } from '@/stores'
import { createTable } from '@/utils' import { createTable } from '@/utils'
const store = useStore() const store = useStore()
const displayStore = useDisplayStore()
const { toggleShowInsertFormDialog } = displayStore const { toggleShowInsertFormDialog } = store
const rowNum = ref(3) const rowNum = ref(3)
const colNum = ref(3) const colNum = ref(3)
@ -46,7 +45,7 @@ function onUpdate(val: boolean) {
</script> </script>
<template> <template>
<Dialog :open="displayStore.isShowInsertFormDialog" @update:open="onUpdate"> <Dialog :open="store.isShowInsertFormDialog" @update:open="onUpdate">
<DialogContent> <DialogContent>
<DialogHeader> <DialogHeader>
<DialogTitle>插入表格</DialogTitle> <DialogTitle>插入表格</DialogTitle>

View File

@ -7,11 +7,11 @@ import CodeMirror from 'codemirror'
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'
import { checkImage, removeLeft } from '@/utils' import { checkImage, removeLeft } from '@/utils'
import { useDisplayStore } from '@/stores' import { useStore } from '@/stores'
const emit = defineEmits([`uploadImage`]) const emit = defineEmits([`uploadImage`])
const displayStore = useDisplayStore() const store = useStore()
const formGitHub = ref({ const formGitHub = ref({
repo: ``, repo: ``,
@ -282,7 +282,7 @@ function uploadImage(params: { file: any }) {
</script> </script>
<template> <template>
<Dialog v-model:open="displayStore.isShowUploadImgDialog"> <Dialog v-model:open="store.isShowUploadImgDialog">
<DialogContent class="max-w-max"> <DialogContent class="max-w-max">
<DialogHeader> <DialogHeader>
<DialogTitle>本地上传</DialogTitle> <DialogTitle>本地上传</DialogTitle>

View File

@ -1,5 +1,5 @@
import { createApp } from 'vue' import { createApp } from 'vue'
import { createPinia } from 'pinia' import Store from './stores'
import ElementPlus from './element' import ElementPlus from './element'
import App from './App.vue' import App from './App.vue'
@ -22,7 +22,7 @@ import 'codemirror/addon/hint/css-hint'
const app = createApp(App) const app = createApp(App)
app.use(createPinia()) app.use(Store)
app.use(ElementPlus) app.use(ElementPlus)
app.mount(`#app`) app.mount(`#app`)

View File

@ -1,5 +1,5 @@
import { computed, markRaw, onMounted, ref, toRaw, watch } from 'vue' import { computed, markRaw, onMounted, ref, toRaw, watch } from 'vue'
import { defineStore } from 'pinia' import { createPinia, defineStore } from 'pinia'
import { marked } from 'marked' import { marked } from 'marked'
import CodeMirror from 'codemirror' import CodeMirror from 'codemirror'
import { useDark, useStorage, useToggle } from '@vueuse/core' import { useDark, useStorage, useToggle } from '@vueuse/core'
@ -379,7 +379,23 @@ export const useStore = defineStore(`store`, () => {
}) })
} }
const isShowCssEditor = ref(false)
const toggleShowCssEditor = useToggle(isShowCssEditor)
const isShowInsertFormDialog = ref(false)
const toggleShowInsertFormDialog = useToggle(isShowInsertFormDialog)
const isShowUploadImgDialog = ref(false)
const toggleShowUploadImgDialog = useToggle(isShowUploadImgDialog)
return { return {
isShowCssEditor,
toggleShowCssEditor,
isShowInsertFormDialog,
toggleShowInsertFormDialog,
isShowUploadImgDialog,
toggleShowUploadImgDialog,
isDark, isDark,
toggleDark, toggleDark,
@ -428,25 +444,4 @@ export const useStore = defineStore(`store`, () => {
} }
}) })
export const useDisplayStore = defineStore(`display`, () => { export default createPinia()
// 是否展示 CSS 编辑器
const isShowCssEditor = ref(false)
const toggleShowCssEditor = useToggle(isShowCssEditor)
// 是否展示插入表格对话框
const isShowInsertFormDialog = ref(false)
const toggleShowInsertFormDialog = useToggle(isShowInsertFormDialog)
// 是否展示上传图片对话框
const isShowUploadImgDialog = ref(false)
const toggleShowUploadImgDialog = useToggle(isShowUploadImgDialog)
return {
isShowCssEditor,
toggleShowCssEditor,
isShowInsertFormDialog,
toggleShowInsertFormDialog,
isShowUploadImgDialog,
toggleShowUploadImgDialog,
}
})

View File

@ -111,6 +111,8 @@ export function css2json(css: string): Partial<Record<Block | Inline, Properties
css = css.slice(rbracket + 1).trim() css = css.slice(rbracket + 1).trim()
} }
console.log(`json`, json)
return json return json
} }
@ -219,7 +221,7 @@ export function exportHTML() {
return ( return (
element.tagName === `SPAN` element.tagName === `SPAN`
&& (isCode(element.parentElement) && (isCode(element.parentElement)
|| isCode((element.parentElement!).parentElement)) || isCode((element.parentElement!).parentElement))
) )
} }
} }

View File

@ -6,7 +6,7 @@ import { ElCol, ElMessage } from 'element-plus'
import CodeMirror from 'codemirror' import CodeMirror from 'codemirror'
import fileApi from '@/utils/file' import fileApi from '@/utils/file'
import { useDisplayStore, useStore } from '@/stores' import { useStore } from '@/stores'
import EditorHeader from '@/components/CodemirrorEditor/EditorHeader/index.vue' import EditorHeader from '@/components/CodemirrorEditor/EditorHeader/index.vue'
import InsertFormDialog from '@/components/CodemirrorEditor/InsertFormDialog.vue' import InsertFormDialog from '@/components/CodemirrorEditor/InsertFormDialog.vue'
@ -32,9 +32,7 @@ import {
} from '@/utils' } from '@/utils'
const store = useStore() const store = useStore()
const displayStore = useDisplayStore() const { isDark, output, editor, editorContent, isShowCssEditor } = storeToRefs(store)
const { isDark, output, editor, editorContent } = storeToRefs(store)
const { isShowCssEditor } = storeToRefs(displayStore)
const { const {
editorRefresh, editorRefresh,
@ -43,12 +41,9 @@ const {
formatContent, formatContent,
importMarkdownContent, importMarkdownContent,
resetStyleConfirm, resetStyleConfirm,
} = store
const {
toggleShowInsertFormDialog, toggleShowInsertFormDialog,
toggleShowUploadImgDialog, toggleShowUploadImgDialog,
} = displayStore } = store
const isImgLoading = ref(false) const isImgLoading = ref(false)
const timeout = ref<NodeJS.Timeout>() const timeout = ref<NodeJS.Timeout>()