diff --git a/src/renderer/components/Outline.vue b/src/renderer/components/Outline.vue index 69e89861..2365ef2f 100644 --- a/src/renderer/components/Outline.vue +++ b/src/renderer/components/Outline.vue @@ -5,10 +5,11 @@ v-for="(head, index) in heads" :key="index" :class="head.class" - :style="{paddingLeft: `${head.level + 1}em`}" - :data-activated="head.activated" + :style="{paddingLeft: `${head.level}em`}" + :data-activated="activatedLine > -1 ? head.sourceLine === activatedLine : head.activated" + :title="head.text" @click="handleClickItem(head)"> - {{ head.text }} + {{ head.text }} {{head.tag}} @@ -30,8 +31,20 @@ export default defineComponent({ const container = ref() const heads = ref([]) const store = useStore() + const activatedLine = ref(-1) + let disableRefresh: any = null function handleClickItem (heading: Heading) { + activatedLine.value = heading.sourceLine + + if (disableRefresh) { + clearTimeout(disableRefresh) + } + + disableRefresh = setTimeout(() => { + disableRefresh = null + }, 1000) + const line = heading.sourceLine if (store.state.showEditor && !store.state.presentation) { revealLineInCenter(line) @@ -43,7 +56,12 @@ export default defineComponent({ } function refresh () { + if (disableRefresh) { + return + } + heads.value = getHeadings(true) + activatedLine.value = -1 if (!container.value || container.value.clientWidth < 50) { return @@ -74,7 +92,7 @@ export default defineComponent({ removeHook('VIEW_SCROLL', throttleRefresh) }) - return { container, heads, handleClickItem } + return { container, heads, activatedLine, handleClickItem } }, }) @@ -99,22 +117,30 @@ export default defineComponent({ & > .heading { font-size: 14px; line-height: 18px; - padding: 7px .5em; + padding: 5px .5em; display: flex; border-radius: var(--g-border-radius); cursor: pointer; overflow-wrap: break-word; + color: var(--g-color-10); - &[data-activated="true"] { - background: rgba(0, 0, 0, 0.05); - } - + &[data-activated="true"], &:hover { - background: rgba(0, 0, 0, 0.1); + background: rgba(0, 0, 0, 0.05); + color: var(--g-color-0); } &.tag-h1 { font-weight: bold; + padding-left: 1em !important; + } + + .heading-title { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + text-overflow: ellipsis; } .tag-name { @@ -127,12 +153,9 @@ export default defineComponent({ @include dark-theme { .outline-toc > .heading { - &[data-activated="true"] { - background: rgba(255, 255, 255, 0.07); - } - + &[data-activated="true"], &:hover { - background: rgba(255, 255, 255, 0.14); + background: rgba(255, 255, 255, 0.07); } } } diff --git a/src/renderer/startup.ts b/src/renderer/startup.ts index 92cd3d71..6c565146 100644 --- a/src/renderer/startup.ts +++ b/src/renderer/startup.ts @@ -11,6 +11,7 @@ import { getLanguage, setLanguage } from '@fe/services/i18n' import { fetchSettings } from '@fe/services/setting' import { getPurchased } from '@fe/others/premium' import { setTheme } from '@fe/services/theme' +import { toggleOutline } from '@fe/services/layout' import * as view from '@fe/services/view' import plugins from '@fe/plugins' import ctx from '@fe/context' @@ -108,6 +109,7 @@ whenEditorReady().then(({ editor }) => { }) store.watch(() => store.state.currentRepo, (val) => { + toggleOutline(false) document.documentElement.setAttribute('repo-name', val?.name || '') }, { immediate: true })