diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2024-02-06 15:03:07 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-06 15:03:07 +0900 |
| commit | 16eccad49271b81282cdbd482d29e7a8bb048f4c (patch) | |
| tree | 96f0b6f94f106de95ff8cb9af29b39b53fdeaece /packages/frontend/src/components/MkCode.core.vue | |
| parent | 2024.2.0-beta.10 (diff) | |
| download | sharkey-16eccad49271b81282cdbd482d29e7a8bb048f4c.tar.gz sharkey-16eccad49271b81282cdbd482d29e7a8bb048f4c.tar.bz2 sharkey-16eccad49271b81282cdbd482d29e7a8bb048f4c.zip | |
enhance(frontend): シンタックスハイライトにテーマを適用できるように (#13175)
* enhance(frontend): シンタックスハイライトにテーマを適用できるように
* Update Changelog
* こっちも
* テーマの値がディープマージされるように
* 常にテーマ設定に準じるように
* テーマ更新時に新しいshikiテーマを読み込むように
Diffstat (limited to 'packages/frontend/src/components/MkCode.core.vue')
| -rw-r--r-- | packages/frontend/src/components/MkCode.core.vue | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/packages/frontend/src/components/MkCode.core.vue b/packages/frontend/src/components/MkCode.core.vue index c655ff416e..68c50c4c69 100644 --- a/packages/frontend/src/components/MkCode.core.vue +++ b/packages/frontend/src/components/MkCode.core.vue @@ -5,14 +5,15 @@ SPDX-License-Identifier: AGPL-3.0-only <!-- eslint-disable vue/no-v-html --> <template> -<div :class="[$style.codeBlockRoot, { [$style.codeEditor]: codeEditor }]" v-html="html"></div> +<div :class="[$style.codeBlockRoot, { [$style.codeEditor]: codeEditor }, (darkMode ? $style.dark : $style.light)]" v-html="html"></div> </template> <script lang="ts" setup> import { ref, computed, watch } from 'vue'; import { bundledLanguagesInfo } from 'shiki'; import type { BuiltinLanguage } from 'shiki'; -import { getHighlighter } from '@/scripts/code-highlighter.js'; +import { getHighlighter, getTheme } from '@/scripts/code-highlighter.js'; +import { defaultStore } from '@/store.js'; const props = defineProps<{ code: string; @@ -21,11 +22,23 @@ const props = defineProps<{ }>(); const highlighter = await getHighlighter(); - +const darkMode = defaultStore.reactiveState.darkMode; const codeLang = ref<BuiltinLanguage | 'aiscript'>('js'); + +const [lightThemeName, darkThemeName] = await Promise.all([ + getTheme('light', true), + getTheme('dark', true), +]); + const html = computed(() => highlighter.codeToHtml(props.code, { lang: codeLang.value, - theme: 'dark-plus', + themes: { + fallback: 'dark-plus', + light: lightThemeName, + dark: darkThemeName, + }, + defaultColor: false, + cssVariablePrefix: '--shiki-', })); async function fetchLanguage(to: string): Promise<void> { @@ -64,6 +77,15 @@ watch(() => props.lang, (to) => { margin: .5em 0; overflow: auto; border-radius: 8px; + border: 1px solid var(--divider); + + color: var(--shiki-fallback); + background-color: var(--shiki-fallback-bg); + + & span { + color: var(--shiki-fallback); + background-color: var(--shiki-fallback-bg); + } & pre, & code { @@ -71,6 +93,26 @@ watch(() => props.lang, (to) => { } } +.light.codeBlockRoot :global(.shiki) { + color: var(--shiki-light); + background-color: var(--shiki-light-bg); + + & span { + color: var(--shiki-light); + background-color: var(--shiki-light-bg); + } +} + +.dark.codeBlockRoot :global(.shiki) { + color: var(--shiki-dark); + background-color: var(--shiki-dark-bg); + + & span { + color: var(--shiki-dark); + background-color: var(--shiki-dark-bg); + } +} + .codeBlockRoot.codeEditor { min-width: 100%; height: 100%; @@ -79,6 +121,7 @@ watch(() => props.lang, (to) => { padding: 12px; margin: 0; border-radius: 6px; + border: none; min-height: 130px; pointer-events: none; min-width: calc(100% - 24px); @@ -90,6 +133,11 @@ watch(() => props.lang, (to) => { text-rendering: inherit; text-transform: inherit; white-space: pre; + + & span { + display: inline-block; + min-height: 1em; + } } } </style> |