mirror of
https://github.com/blossom-editor/blossom
synced 2024-11-17 14:39:21 +08:00
Compare commits
7 Commits
8d848deeb7
...
0deb31c49d
Author | SHA1 | Date | |
---|---|---|---|
|
0deb31c49d | ||
|
60439c7dbd | ||
|
92ea3f6274 | ||
|
e4043b7f22 | ||
|
ec87470ef2 | ||
|
fee28a5cdd | ||
|
77b78382f3 |
4866
blossom-editor/package-lock.json
generated
4866
blossom-editor/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -29,50 +29,50 @@
|
||||
"build:linux": "npm run build && electron-builder --linux --config"
|
||||
},
|
||||
"dependencies": {
|
||||
"@codemirror/lang-markdown": "^6.2.0",
|
||||
"@codemirror/language-data": "^6.3.1",
|
||||
"@electron-toolkit/preload": "^2.0.0",
|
||||
"@electron-toolkit/utils": "^1.0.2",
|
||||
"@codemirror/lang-markdown": "^6.2.4",
|
||||
"@codemirror/language-data": "^6.4.1",
|
||||
"@electron-toolkit/preload": "^3.0.1",
|
||||
"@electron-toolkit/utils": "^3.0.0",
|
||||
"@types/marked": "^5.0.1",
|
||||
"axios": "^1.4.0",
|
||||
"axios": "^1.6.8",
|
||||
"codemirror": "^6.0.1",
|
||||
"dayjs": "^1.11.10",
|
||||
"echarts": "^5.4.3",
|
||||
"electron-updater": "^5.3.0",
|
||||
"element-plus": "^2.4.4",
|
||||
"echarts": "^5.5.0",
|
||||
"electron-updater": "^6.1.8",
|
||||
"element-plus": "^2.6.3",
|
||||
"highlight.js": "^11.8.0",
|
||||
"hotkeys-js": "^3.12.0",
|
||||
"katex": "^0.16.8",
|
||||
"hotkeys-js": "^3.13.7",
|
||||
"katex": "^0.16.10",
|
||||
"marked": "^7.0.5",
|
||||
"marked-highlight": "^2.0.4",
|
||||
"marked-katex-extension": "^4.0.5",
|
||||
"markmap-lib": "^0.15.4",
|
||||
"markmap-view": "^0.15.4",
|
||||
"mermaid": "^10.4.0",
|
||||
"mermaid": "^10.9.0",
|
||||
"pinia": "^2.1.6",
|
||||
"prettier": "^3.0.2",
|
||||
"sass": "^1.66.1",
|
||||
"vue-router": "^4.2.4"
|
||||
"prettier": "^3.2.5",
|
||||
"sass": "^1.74.1",
|
||||
"vue-router": "^4.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@electron-toolkit/tsconfig": "^1.0.1",
|
||||
"@electron/notarize": "^1.2.4",
|
||||
"@rushstack/eslint-patch": "^1.3.3",
|
||||
"@types/node": "^18.17.8",
|
||||
"@vitejs/plugin-vue": "^4.6.2",
|
||||
"@electron/notarize": "^2.3.0",
|
||||
"@rushstack/eslint-patch": "^1.10.1",
|
||||
"@types/node": "^18.19.29",
|
||||
"@vitejs/plugin-vue": "^5.0.4",
|
||||
"@vue/eslint-config-prettier": "^9.0.0",
|
||||
"@vue/eslint-config-typescript": "^12.0.0",
|
||||
"electron": "^24.8.0",
|
||||
"electron-builder": "^24.6.3",
|
||||
"electron-vite": "^1.0.27",
|
||||
"eslint": "^8.47.0",
|
||||
"eslint-plugin-vue": "^9.17.0",
|
||||
"rollup-plugin-visualizer": "^5.9.2",
|
||||
"typescript": "^5.1.6",
|
||||
"unplugin-auto-import": "^0.16.7",
|
||||
"unplugin-vue-components": "^0.25.1",
|
||||
"vite": "^4.5.1",
|
||||
"@vue/eslint-config-typescript": "^13.0.0",
|
||||
"electron": "^28.2.10",
|
||||
"electron-builder": "^24.13.3",
|
||||
"electron-vite": "^2.1.0",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-plugin-vue": "^9.24.0",
|
||||
"rollup-plugin-visualizer": "^5.12.0",
|
||||
"typescript": "^5.4.4",
|
||||
"unplugin-auto-import": "^0.17.5",
|
||||
"unplugin-vue-components": "^0.26.0",
|
||||
"vite": "^5.2.8",
|
||||
"vue": "^3.4.5",
|
||||
"vue-tsc": "^1.8.27"
|
||||
"vue-tsc": "^2.0.10"
|
||||
}
|
||||
}
|
@ -432,9 +432,9 @@ export const initOnWindow = (window: BrowserWindow) => {
|
||||
/**
|
||||
* 拦截页面链接
|
||||
*/
|
||||
window.webContents.on('will-navigate', (event: Event, url: string) => {
|
||||
interceptorATag(event, url)
|
||||
})
|
||||
// window.webContents.on('will-navigate', (event: Event, url: string) => {
|
||||
// interceptorATag(event, url)
|
||||
// })
|
||||
|
||||
/**
|
||||
* 打开链接, 如果打开链接于服务器域名相同, 则在新窗口中打开
|
||||
@ -451,19 +451,19 @@ export const initOnWindow = (window: BrowserWindow) => {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 拦截 a 标签
|
||||
* @param e
|
||||
* @param url
|
||||
*/
|
||||
const interceptorATag = (e: Event, url: string): boolean => {
|
||||
e.preventDefault()
|
||||
let innerUrl = url
|
||||
if (blossomUserinfo && innerUrl.startsWith(blossomUserinfo.userParams.WEB_ARTICLE_URL)) {
|
||||
let articleId: string = innerUrl.replaceAll(blossomUserinfo.userParams.WEB_ARTICLE_URL, '')
|
||||
createNewWindow('article', articleId, Number(articleId))
|
||||
} else if (!is.dev) {
|
||||
shell.openExternal(url)
|
||||
}
|
||||
return true
|
||||
}
|
||||
// /**
|
||||
// * 拦截 a 标签
|
||||
// * @param e
|
||||
// * @param url
|
||||
// */
|
||||
// const interceptorATag = (e: Event, url: string): boolean => {
|
||||
// e.preventDefault()
|
||||
// let innerUrl = url
|
||||
// if (blossomUserinfo && innerUrl.startsWith(blossomUserinfo.userParams.WEB_ARTICLE_URL)) {
|
||||
// let articleId: string = innerUrl.replaceAll(blossomUserinfo.userParams.WEB_ARTICLE_URL, '')
|
||||
// createNewWindow('article', articleId, Number(articleId))
|
||||
// } else if (!is.dev) {
|
||||
// shell.openExternal(url)
|
||||
// }
|
||||
// return true
|
||||
// }
|
||||
|
@ -15,7 +15,6 @@
|
||||
connect-src *;
|
||||
frame-src *;
|
||||
" />
|
||||
<!-- 加载动画 -->
|
||||
<style>
|
||||
:root {
|
||||
--index-loading-color: #859e6052;
|
||||
@ -336,7 +335,6 @@
|
||||
}
|
||||
|
||||
@keyframes skeleton {
|
||||
/* 骨架屏的动画 */
|
||||
100% {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
@ -346,7 +344,6 @@
|
||||
|
||||
<body>
|
||||
<div id="app">
|
||||
<!-- 首页加载正常运行在这里 -->
|
||||
<div class="html-loading">
|
||||
<div class="header">
|
||||
<div class="logo"></div>
|
||||
|
@ -31,14 +31,14 @@ img {
|
||||
/* 定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸 */
|
||||
::-webkit-scrollbar {
|
||||
/* 滚动条宽度 */
|
||||
width: 7px;
|
||||
width: 5px;
|
||||
/* 滚动条高度 */
|
||||
height: 7px;
|
||||
height: 5px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar:hover {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
}
|
||||
|
||||
/* 定义滑块 内阴影+圆角 */
|
||||
|
BIN
blossom-editor/src/renderer/src/assets/imgs/transparent.png
Normal file
BIN
blossom-editor/src/renderer/src/assets/imgs/transparent.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 131 B |
@ -125,8 +125,7 @@ const copyIcon = (icon: string) => {
|
||||
align-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
background-color: var(--bl-html-color);
|
||||
overflow: scroll;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
|
||||
.icon-item {
|
||||
@include flex(column, space-between, center);
|
||||
|
@ -242,7 +242,7 @@ const showWebCollectCard = (card: boolean) => {
|
||||
|
||||
.web-item-container {
|
||||
@include box(100%, calc(100% - 31px));
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
|
||||
.placeholder {
|
||||
@include font(15px, 300);
|
||||
|
@ -191,7 +191,7 @@ const cancelDownload = async () => {
|
||||
@include flex(column, flex-start, flex-start);
|
||||
align-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
overflow-x: overlay;
|
||||
overflow-x: scroll;
|
||||
padding: 10px;
|
||||
|
||||
.bak-item {
|
||||
|
@ -106,8 +106,8 @@ onMounted(() => {
|
||||
|
||||
.history-list {
|
||||
@include box(100%, calc(100% - 80px - 21px));
|
||||
overflow-y: overlay;
|
||||
padding: 10px 15px 10px 10px;
|
||||
overflow-y: scroll;
|
||||
|
||||
.history-item {
|
||||
@include box(100%, 55px);
|
||||
|
@ -142,8 +142,8 @@
|
||||
<!-- -->
|
||||
<el-form-item label="类型">
|
||||
<el-radio-group v-model="docForm.type" style="width: 106px" :disabled="curDocDialogType == 'upd'">
|
||||
<el-radio-button :label="1">文件夹</el-radio-button>
|
||||
<el-radio-button :label="3">文章</el-radio-button>
|
||||
<el-radio-button :value="1">文件夹</el-radio-button>
|
||||
<el-radio-button :value="3">文章</el-radio-button>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
|
@ -111,7 +111,7 @@ const download = (id: string) => {
|
||||
@include flex(column, flex-start, flex-start);
|
||||
align-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
overflow-x: overlay;
|
||||
overflow-x: scroll;
|
||||
padding: 10px;
|
||||
|
||||
.recycle-item {
|
||||
|
@ -14,9 +14,9 @@
|
||||
<el-tooltip content="文章回收站" effect="light" popper-class="is-small" placement="top" :offset="8" :hide-after="0">
|
||||
<div class="iconbl bl-delete-line" @click="handleShowRecycleDialog"></div>
|
||||
</el-tooltip>
|
||||
<el-tooltip content="文档快速编辑" effect="light" popper-class="is-small" placement="top" :offset="8" :hide-after="0">
|
||||
<!-- <el-tooltip content="文档快速编辑" effect="light" popper-class="is-small" placement="top" :offset="8" :hide-after="0">
|
||||
<div class="iconbl bl-article-line" @click=""></div>
|
||||
</el-tooltip>
|
||||
</el-tooltip> -->
|
||||
</bl-row>
|
||||
</bl-row>
|
||||
</div>
|
||||
|
@ -87,7 +87,7 @@ onMounted(() => {
|
||||
@include box(100%, 100%);
|
||||
font-size: 15px;
|
||||
padding: 30px;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
line-height: 23px;
|
||||
|
||||
|
@ -59,7 +59,7 @@ const openArticleLogWindow = () => {
|
||||
background-color: var(--bl-editor-gutters-bg-color);
|
||||
|
||||
.status-item-container {
|
||||
overflow-x: overlay;
|
||||
overflow-x: hidden;
|
||||
white-space: nowrap;
|
||||
|
||||
& > div {
|
||||
|
@ -400,7 +400,7 @@ const handleShowHotKeyDialog = () => {
|
||||
padding: 0 5px;
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
overflow-x: overlay;
|
||||
overflow: hidden;
|
||||
|
||||
& > div {
|
||||
@include themeColor(#5b5b5b, #909090);
|
||||
|
@ -74,7 +74,7 @@ export const cwTheme: any = {
|
||||
width: '40px'
|
||||
},
|
||||
'.cm-scroller': {
|
||||
overflow: 'overlay',
|
||||
// overflow: 'scroll',
|
||||
outline: 'none'
|
||||
},
|
||||
'.cm-foldGutter': {
|
||||
|
@ -105,7 +105,7 @@
|
||||
@include box(50%, 100%);
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
overflow: overlay;
|
||||
overflow: scroll;
|
||||
z-index: 2;
|
||||
|
||||
/* 定义滑块 内阴影+圆角 */
|
||||
|
@ -9,7 +9,7 @@
|
||||
.content-view {
|
||||
@include box(100%, calc(100% - 25px));
|
||||
@include themeBg(#f9f9f9, #262626);
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
padding: 10px;
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
height 0.2s;
|
||||
|
||||
.toc-content {
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
|
||||
.toc-1,
|
||||
.toc-2,
|
||||
|
@ -146,7 +146,6 @@
|
||||
:deep(.is-current) {
|
||||
& > .el-tree-node__content {
|
||||
border-radius: 5px;
|
||||
// background-color: var(--el-color-primary-light-8);
|
||||
|
||||
&:has(.menu-divider) {
|
||||
background-color: transparent;
|
||||
@ -165,7 +164,6 @@
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
width: 5px;
|
||||
height: 3px;
|
||||
}
|
||||
|
||||
/* 定义滑块 内阴影+圆角 */
|
||||
|
@ -7,7 +7,7 @@
|
||||
color: var(--bl-text-color);
|
||||
font-size: 12px;
|
||||
text-align: right;
|
||||
overflow: overlay;
|
||||
overflow: scroll;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
|
@ -87,7 +87,7 @@ defineExpose({ reload })
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
overflow: hidden;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,7 @@ const toToc = (articleId: number) => {
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
overflow: hidden;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
.placeholder {
|
||||
|
@ -221,7 +221,7 @@ const fold = () => {
|
||||
.chart-container {
|
||||
@include box(100%, calc(100% - 315px));
|
||||
overflow-x: hidden;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -72,8 +72,8 @@
|
||||
</bl-row>
|
||||
<bl-row just="space-between" style="border-top: 1px solid var(--el-border-color)">
|
||||
<el-radio-group v-model="copyType">
|
||||
<el-radio-button label="http">HT</el-radio-button>
|
||||
<el-radio-button label="markdown">MD</el-radio-button>
|
||||
<el-radio-button value="http">HT</el-radio-button>
|
||||
<el-radio-button value="markdown">MD</el-radio-button>
|
||||
</el-radio-group>
|
||||
<div>
|
||||
<el-button type="primary" @click="invokePrintScreen">截图</el-button>
|
||||
|
@ -19,9 +19,9 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="用户权限" prop="type">
|
||||
<el-radio-group v-model="addUserForm.type" size="default">
|
||||
<el-radio-button label="1">管理员</el-radio-button>
|
||||
<el-radio-button label="2">普通用户</el-radio-button>
|
||||
<el-radio-button label="3">只读用户</el-radio-button>
|
||||
<el-radio-button value="1">管理员</el-radio-button>
|
||||
<el-radio-button value="2">普通用户</el-radio-button>
|
||||
<el-radio-button value="3">只读用户</el-radio-button>
|
||||
</el-radio-group>
|
||||
<bl-row class="conf-tip">
|
||||
{{ typeDesc }}
|
||||
|
@ -140,7 +140,7 @@ const notes = ref<any>([])
|
||||
padding-left: 40px;
|
||||
z-index: 3;
|
||||
overflow: auto;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
|
||||
.placeholder {
|
||||
@include font(14px, 300);
|
||||
@ -236,7 +236,7 @@ const notes = ref<any>([])
|
||||
white-space: pre-line;
|
||||
word-wrap: break-word;
|
||||
overflow: auto;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
user-select: text;
|
||||
cursor: cell;
|
||||
}
|
||||
|
@ -27,8 +27,8 @@
|
||||
<div class="btn-wrapper radio">
|
||||
<div>卡片大小</div>
|
||||
<el-radio-group v-model="cardSize">
|
||||
<el-radio-button label="mini">小</el-radio-button>
|
||||
<el-radio-button label="large">大</el-radio-button>
|
||||
<el-radio-button value="mini">小</el-radio-button>
|
||||
<el-radio-button value="large">大</el-radio-button>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
|
||||
|
@ -294,8 +294,8 @@
|
||||
|
||||
.status-item-container {
|
||||
height: 100%;
|
||||
overflow-x: overlay;
|
||||
white-space: nowrap;
|
||||
overflow-x: hidden;
|
||||
|
||||
& > div {
|
||||
height: 100%;
|
||||
|
@ -102,7 +102,7 @@ const delDaily = (id: number) => {
|
||||
.daily-container {
|
||||
@include box(100%, 100%);
|
||||
overflow: scroll;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
|
||||
.title {
|
||||
width: 100%;
|
||||
@ -150,7 +150,7 @@ const delDaily = (id: number) => {
|
||||
white-space: normal;
|
||||
word-wrap: break-word;
|
||||
overflow: scroll;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
.del {
|
||||
|
@ -191,7 +191,7 @@ const emits = defineEmits(['saved'])
|
||||
white-space: normal;
|
||||
word-wrap: break-word;
|
||||
overflow: scroll;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll
|
||||
}
|
||||
|
||||
img {
|
||||
@ -208,7 +208,7 @@ const emits = defineEmits(['saved'])
|
||||
align-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
overflow: scroll;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
|
||||
div {
|
||||
margin: 1px;
|
||||
|
@ -184,7 +184,7 @@ defineExpose({
|
||||
align-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
overflow: scroll;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
padding: 10px;
|
||||
|
||||
.color {
|
||||
|
@ -640,8 +640,9 @@ const CompDragRef = ref()
|
||||
|
||||
let toStage: TaskStatus | ''
|
||||
|
||||
|
||||
const img = new Image()
|
||||
img.src = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' %3E%3Cpath /%3E%3C/svg%3E"
|
||||
img.src = new URL(`../../assets/imgs/transparent.png`, import.meta.url).href
|
||||
|
||||
/**
|
||||
* 开始拖动
|
||||
@ -653,7 +654,10 @@ const dragStart = (doms: any, e: DragEvent) => {
|
||||
e.preventDefault()
|
||||
return
|
||||
}
|
||||
console.log('drag start')
|
||||
|
||||
e.dataTransfer!.setDragImage(img, 0, 0)
|
||||
|
||||
let ele = e!.target as Element
|
||||
let cloneNode = ele.cloneNode(true) as HTMLElement
|
||||
const targetRect = ele.getBoundingClientRect()
|
||||
@ -668,14 +672,16 @@ const dragStart = (doms: any, e: DragEvent) => {
|
||||
document.body.appendChild(cloneNode)
|
||||
|
||||
// 拖拽事件
|
||||
const onDrag = (de: any) => {
|
||||
const onDrag = (e: any) => {
|
||||
console.log('onDrag')
|
||||
if (cloneNode) {
|
||||
cloneNode.style.transform = `translate(${de.clientX - distLeft - targetRect.left}px, ${de.clientY - distTop - targetRect.top}px)`
|
||||
cloneNode.style.transform = `translate(${e.clientX - distLeft - targetRect.left}px, ${e.clientY - distTop - targetRect.top}px)`
|
||||
}
|
||||
}
|
||||
|
||||
// 松开事件
|
||||
const onDragend = () => {
|
||||
console.log('onDragend')
|
||||
ele.removeEventListener('drag', onDrag)
|
||||
ele.removeEventListener('dragend', onDragend)
|
||||
ele.classList.remove('moving')
|
||||
@ -684,6 +690,7 @@ const dragStart = (doms: any, e: DragEvent) => {
|
||||
|
||||
ele.addEventListener('drag', onDrag)
|
||||
ele.addEventListener('dragend', onDragend)
|
||||
|
||||
ele.classList.add('moving') // 原始元素隐藏
|
||||
|
||||
for (let i = 0; i < doms.length; i++) {
|
||||
|
@ -61,6 +61,8 @@
|
||||
}
|
||||
|
||||
.tag-select {
|
||||
width: 150px;
|
||||
|
||||
:deep(.el-tag--small) {
|
||||
@include themeColor(#fff, #000);
|
||||
background-color: var(--el-color-primary-light-3);
|
||||
@ -143,7 +145,7 @@
|
||||
@include box(100%, calc(100% - 60px));
|
||||
@include flex(column, flex-start, center);
|
||||
position: relative;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
padding: 20px 0;
|
||||
|
||||
.drag-container {
|
||||
|
@ -168,7 +168,7 @@ const top = () => {
|
||||
white-space: pre-line;
|
||||
word-wrap: break-word;
|
||||
overflow: auto;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
user-select: text;
|
||||
}
|
||||
.time {
|
||||
|
@ -157,7 +157,7 @@ const emits = defineEmits(['saved'])
|
||||
align-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
overflow: scroll;
|
||||
overflow-y: overlay;
|
||||
overflow-y: scroll;
|
||||
padding: 10px 10px 8px 0;
|
||||
|
||||
.color {
|
||||
|
Loading…
Reference in New Issue
Block a user