diff options
| author | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-06-25 10:23:39 +0900 |
|---|---|---|
| committer | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-06-25 10:23:39 +0900 |
| commit | 36fde679929ef60cf788d6ab47d72a4f43500b59 (patch) | |
| tree | 64a5a961d49776f587d31ef3b6e1a64dec2a770c /packages/frontend/src | |
| parent | enhance(frontend): 全てのページネーションにおいてコンテキ... (diff) | |
| download | misskey-36fde679929ef60cf788d6ab47d72a4f43500b59.tar.gz misskey-36fde679929ef60cf788d6ab47d72a4f43500b59.tar.bz2 misskey-36fde679929ef60cf788d6ab47d72a4f43500b59.zip | |
enhance(frontend): improve theme settings
Diffstat (limited to 'packages/frontend/src')
| -rw-r--r-- | packages/frontend/src/pages/settings/theme.vue | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/packages/frontend/src/pages/settings/theme.vue b/packages/frontend/src/pages/settings/theme.vue index f3a6458109..accb1ccc55 100644 --- a/packages/frontend/src/pages/settings/theme.vue +++ b/packages/frontend/src/pages/settings/theme.vue @@ -56,7 +56,7 @@ SPDX-License-Identifier: AGPL-3.0-only :class="$style.themeRadio" :value="instanceLightTheme.id" /> - <label :for="`themeRadio_${instanceLightTheme.id}`" :class="$style.themeItemRoot" class="_button"> + <label :for="`themeRadio_${instanceLightTheme.id}`" :class="$style.themeItemRoot" class="_button" @contextmenu.prevent.stop="onThemeContextmenu(instanceLightTheme, $event)"> <MkThemePreview :theme="instanceLightTheme" :class="$style.themeItemPreview"/> <div :class="$style.themeItemCaption">{{ instanceLightTheme.name }}</div> </label> @@ -76,7 +76,7 @@ SPDX-License-Identifier: AGPL-3.0-only :class="$style.themeRadio" :value="theme.id" /> - <label :for="`themeRadio_${theme.id}`" :class="$style.themeItemRoot" class="_button"> + <label :for="`themeRadio_${theme.id}`" :class="$style.themeItemRoot" class="_button" @contextmenu.prevent.stop="onThemeContextmenu(theme, $event)"> <MkThemePreview :theme="theme" :class="$style.themeItemPreview"/> <div :class="$style.themeItemCaption">{{ theme.name }}</div> </label> @@ -96,7 +96,7 @@ SPDX-License-Identifier: AGPL-3.0-only :class="$style.themeRadio" :value="theme.id" /> - <label :for="`themeRadio_${theme.id}`" :class="$style.themeItemRoot" class="_button"> + <label :for="`themeRadio_${theme.id}`" :class="$style.themeItemRoot" class="_button" @contextmenu.prevent.stop="onThemeContextmenu(theme, $event)"> <MkThemePreview :theme="theme" :class="$style.themeItemPreview"/> <div :class="$style.themeItemCaption">{{ theme.name }}</div> </label> @@ -127,7 +127,7 @@ SPDX-License-Identifier: AGPL-3.0-only :class="$style.themeRadio" :value="instanceDarkTheme.id" /> - <label :for="`themeRadio_${instanceDarkTheme.id}`" :class="$style.themeItemRoot" class="_button"> + <label :for="`themeRadio_${instanceDarkTheme.id}`" :class="$style.themeItemRoot" class="_button" @contextmenu.prevent.stop="onThemeContextmenu(instanceDarkTheme, $event)"> <MkThemePreview :theme="instanceDarkTheme" :class="$style.themeItemPreview"/> <div :class="$style.themeItemCaption">{{ instanceDarkTheme.name }}</div> </label> @@ -147,7 +147,7 @@ SPDX-License-Identifier: AGPL-3.0-only :class="$style.themeRadio" :value="theme.id" /> - <label :for="`themeRadio_${theme.id}`" :class="$style.themeItemRoot" class="_button"> + <label :for="`themeRadio_${theme.id}`" :class="$style.themeItemRoot" class="_button" @contextmenu.prevent.stop="onThemeContextmenu(theme, $event)"> <MkThemePreview :theme="theme" :class="$style.themeItemPreview"/> <div :class="$style.themeItemCaption">{{ theme.name }}</div> </label> @@ -167,7 +167,7 @@ SPDX-License-Identifier: AGPL-3.0-only :class="$style.themeRadio" :value="theme.id" /> - <label :for="`themeRadio_${theme.id}`" :class="$style.themeItemRoot" class="_button"> + <label :for="`themeRadio_${theme.id}`" :class="$style.themeItemRoot" class="_button" @contextmenu.prevent.stop="onThemeContextmenu(theme, $event)"> <MkThemePreview :theme="theme" :class="$style.themeItemPreview"/> <div :class="$style.themeItemCaption">{{ theme.name }}</div> </label> @@ -210,7 +210,7 @@ import FormSection from '@/components/form/section.vue'; import FormLink from '@/components/form/link.vue'; import MkFolder from '@/components/MkFolder.vue'; import MkThemePreview from '@/components/MkThemePreview.vue'; -import { getBuiltinThemesRef, getThemesRef } from '@/theme.js'; +import { getBuiltinThemesRef, getThemesRef, removeTheme } from '@/theme.js'; import { isDeviceDarkmode } from '@/utility/is-device-darkmode.js'; import { store } from '@/store.js'; import { i18n } from '@/i18n.js'; @@ -218,6 +218,7 @@ import { instance } from '@/instance.js'; import { uniqueBy } from '@/utility/array.js'; import { definePage } from '@/page.js'; import { prefer } from '@/preferences.js'; +import { copyToClipboard } from '@/utility/copy-to-clipboard.js'; const installedThemes = getThemesRef(); const builtinThemes = getBuiltinThemesRef(); @@ -295,6 +296,26 @@ function changeThemesSyncEnabled(value: boolean) { } } +function onThemeContextmenu(theme: Theme, ev: MouseEvent) { + os.contextMenu([{ + type: 'label', + text: theme.name, + }, { + icon: 'ti ti-clipboard', + text: i18n.ts._theme.copyThemeCode, + action: () => { + copyToClipboard(JSON5.stringify(theme, null, '\t')); + }, + }, { + icon: 'ti ti-trash', + text: i18n.ts.delete, + danger: true, + action: () => { + removeTheme(theme); + }, + }], ev); +} + const headerActions = computed(() => []); const headerTabs = computed(() => []); |