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 | |
| 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')
| -rw-r--r-- | packages/frontend/src/components/MkCode.core.vue | 56 | ||||
| -rw-r--r-- | packages/frontend/src/components/MkCode.vue | 8 | ||||
| -rw-r--r-- | packages/frontend/src/components/MkCodeEditor.vue | 5 | ||||
| -rw-r--r-- | packages/frontend/src/components/MkCodeInline.vue | 3 | ||||
| -rw-r--r-- | packages/frontend/src/components/MkSelect.vue | 7 |
5 files changed, 65 insertions, 14 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> diff --git a/packages/frontend/src/components/MkCode.vue b/packages/frontend/src/components/MkCode.vue index 251e6ade00..6c14738937 100644 --- a/packages/frontend/src/components/MkCode.vue +++ b/packages/frontend/src/components/MkCode.vue @@ -53,7 +53,6 @@ function copy() { } .codeBlockCopyButton { - color: #D4D4D4; position: absolute; top: 8px; right: 8px; @@ -67,8 +66,7 @@ function copy() { .codeBlockFallbackRoot { display: block; overflow-wrap: anywhere; - color: #D4D4D4; - background: #1E1E1E; + background: var(--bg); padding: 1em; margin: .5em 0; overflow: auto; @@ -93,8 +91,8 @@ function copy() { border-radius: 8px; padding: 24px; margin-top: 4px; - color: #D4D4D4; - background: #1E1E1E; + color: var(--fg); + background: var(--bg); } .codePlaceholderContainer { diff --git a/packages/frontend/src/components/MkCodeEditor.vue b/packages/frontend/src/components/MkCodeEditor.vue index c8c3deb610..3cf8234e72 100644 --- a/packages/frontend/src/components/MkCodeEditor.vue +++ b/packages/frontend/src/components/MkCodeEditor.vue @@ -196,10 +196,11 @@ watch(v, newValue => { resize: none; text-align: left; color: transparent; - caret-color: rgb(225, 228, 232); + caret-color: var(--fg); background-color: transparent; border: 0; border-radius: 6px; + box-sizing: border-box; outline: 0; min-width: calc(100% - 24px); height: 100%; @@ -210,6 +211,6 @@ watch(v, newValue => { } .textarea::selection { - color: #fff; + color: var(--bg); } </style> diff --git a/packages/frontend/src/components/MkCodeInline.vue b/packages/frontend/src/components/MkCodeInline.vue index 5340c1fd5f..6a9d97ab5a 100644 --- a/packages/frontend/src/components/MkCodeInline.vue +++ b/packages/frontend/src/components/MkCodeInline.vue @@ -18,8 +18,7 @@ const props = defineProps<{ display: inline-block; font-family: Consolas, Monaco, Andale Mono, Ubuntu Mono, monospace; overflow-wrap: anywhere; - color: #D4D4D4; - background: #1E1E1E; + background: var(--bg); padding: .1em; border-radius: .3em; } diff --git a/packages/frontend/src/components/MkSelect.vue b/packages/frontend/src/components/MkSelect.vue index 8dd2b9129d..3e8ff99387 100644 --- a/packages/frontend/src/components/MkSelect.vue +++ b/packages/frontend/src/components/MkSelect.vue @@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only </div> <div :class="$style.caption"><slot name="caption"></slot></div> - <MkButton v-if="manualSave && changed" primary @click="updated"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> + <MkButton v-if="manualSave && changed" primary :class="$style.save" @click="updated"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> </div> </template> @@ -138,6 +138,7 @@ function show() { active: computed(() => v.value === option.props?.value), action: () => { v.value = option.props?.value; + changed.value = true; emit('changeByUser', v.value); }, }); @@ -288,6 +289,10 @@ function show() { padding-left: 6px; } +.save { + margin: 8px 0 0 0; +} + .chevron { transition: transform 0.1s ease-out; } |