Show the theme selector as icons instead of text
The toolbar's theme-cycling button ("Theme: Auto") and the Settings
panel's Auto/Hell/Dunkel segmented control now use icons -- a sun, a
moon, and a half-filled circle for "follows system" -- drawn in this
project's existing hand-drawn SVG icon set (ToolbarIcon.vue) rather than
a new icon system or emoji. Tooltips/aria-labels keep the full text for
accessibility; the toolbar button's click-to-cycle behavior is
unchanged.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -8,7 +8,7 @@ import CustomFunctionsModal from './CustomFunctionsModal.vue';
|
|||||||
import NamedRangesModal from './NamedRangesModal.vue';
|
import NamedRangesModal from './NamedRangesModal.vue';
|
||||||
import MacrosModal from './MacrosModal.vue';
|
import MacrosModal from './MacrosModal.vue';
|
||||||
import TheLogo from './TheLogo.vue';
|
import TheLogo from './TheLogo.vue';
|
||||||
import ToolbarIcon from './ToolbarIcon.vue';
|
import ToolbarIcon, { type ToolbarIconName } from './ToolbarIcon.vue';
|
||||||
import { WICOM, WICOM_SOCIAL } from '../config/brand';
|
import { WICOM, WICOM_SOCIAL } from '../config/brand';
|
||||||
import {
|
import {
|
||||||
exportJson,
|
exportJson,
|
||||||
@@ -42,6 +42,9 @@ const addr = `${WICOM.address.street}, ${WICOM.address.city}, ${WICOM.address.co
|
|||||||
const themeLabel = computed(
|
const themeLabel = computed(
|
||||||
() => ({ system: 'Auto', light: 'Hell', dark: 'Dunkel' })[themeMode.value],
|
() => ({ system: 'Auto', light: 'Hell', dark: 'Dunkel' })[themeMode.value],
|
||||||
);
|
);
|
||||||
|
const themeIcon = computed(
|
||||||
|
() => ({ system: 'auto', light: 'sun', dark: 'moon' })[themeMode.value] as ToolbarIconName,
|
||||||
|
);
|
||||||
|
|
||||||
// ---- insert objects ------------------------------------------------
|
// ---- insert objects ------------------------------------------------
|
||||||
function insertTable() {
|
function insertTable() {
|
||||||
@@ -299,7 +302,14 @@ function onReset() {
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button class="btn" @click="cycleTheme">Theme: {{ themeLabel }}</button>
|
<button
|
||||||
|
class="ibtn"
|
||||||
|
:title="`Theme: ${themeLabel} (klicken zum Wechseln)`"
|
||||||
|
:aria-label="`Theme: ${themeLabel}`"
|
||||||
|
@click="cycleTheme"
|
||||||
|
>
|
||||||
|
<ToolbarIcon :name="themeIcon" />
|
||||||
|
</button>
|
||||||
<button class="btn" @click="onReset">Zurücksetzen</button>
|
<button class="btn" @click="onReset">Zurücksetzen</button>
|
||||||
|
|
||||||
<input ref="fileInput" type="file" accept=".json,.csv,.xlsx" hidden @change="onFileChosen" />
|
<input ref="fileInput" type="file" accept=".json,.csv,.xlsx" hidden @change="onFileChosen" />
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { useTheme } from '../composables/useTheme';
|
|||||||
import { NUMBER_LOCALES, NUM_FORMATS } from '../store/format';
|
import { NUMBER_LOCALES, NUM_FORMATS } from '../store/format';
|
||||||
import type { CellFormat, HAlign } from '../store/types';
|
import type { CellFormat, HAlign } from '../store/types';
|
||||||
import { DEFAULT_GRID_SIZE, MIN_GRID_SIZE, MAX_GRID_SIZE } from '../store/types';
|
import { DEFAULT_GRID_SIZE, MIN_GRID_SIZE, MAX_GRID_SIZE } from '../store/types';
|
||||||
|
import ToolbarIcon from './ToolbarIcon.vue';
|
||||||
|
|
||||||
const store = useDocument();
|
const store = useDocument();
|
||||||
const { mode: themeMode } = useTheme();
|
const { mode: themeMode } = useTheme();
|
||||||
@@ -512,9 +513,30 @@ function resetDoc() {
|
|||||||
<label class="f">
|
<label class="f">
|
||||||
<span>Erscheinungsbild</span>
|
<span>Erscheinungsbild</span>
|
||||||
<div class="seg">
|
<div class="seg">
|
||||||
<button :class="{ on: themeMode === 'system' }" @click="themeMode = 'system'">Auto</button>
|
<button
|
||||||
<button :class="{ on: themeMode === 'light' }" @click="themeMode = 'light'">Hell</button>
|
:class="{ on: themeMode === 'system' }"
|
||||||
<button :class="{ on: themeMode === 'dark' }" @click="themeMode = 'dark'">Dunkel</button>
|
title="Auto (folgt dem System)"
|
||||||
|
aria-label="Auto (folgt dem System)"
|
||||||
|
@click="themeMode = 'system'"
|
||||||
|
>
|
||||||
|
<ToolbarIcon name="auto" />
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
:class="{ on: themeMode === 'light' }"
|
||||||
|
title="Hell"
|
||||||
|
aria-label="Hell"
|
||||||
|
@click="themeMode = 'light'"
|
||||||
|
>
|
||||||
|
<ToolbarIcon name="sun" />
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
:class="{ on: themeMode === 'dark' }"
|
||||||
|
title="Dunkel"
|
||||||
|
aria-label="Dunkel"
|
||||||
|
@click="themeMode = 'dark'"
|
||||||
|
>
|
||||||
|
<ToolbarIcon name="moon" />
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
<label class="f">
|
<label class="f">
|
||||||
|
|||||||
@@ -15,7 +15,10 @@ export type ToolbarIconName =
|
|||||||
| 'text'
|
| 'text'
|
||||||
| 'tag'
|
| 'tag'
|
||||||
| 'button'
|
| 'button'
|
||||||
| 'macro';
|
| 'macro'
|
||||||
|
| 'sun'
|
||||||
|
| 'moon'
|
||||||
|
| 'auto';
|
||||||
|
|
||||||
defineProps<{ name: ToolbarIconName }>();
|
defineProps<{ name: ToolbarIconName }>();
|
||||||
</script>
|
</script>
|
||||||
@@ -87,6 +90,27 @@ defineProps<{ name: ToolbarIconName }>();
|
|||||||
<template v-else-if="name === 'macro'">
|
<template v-else-if="name === 'macro'">
|
||||||
<polygon points="6,4 20,12 6,20" fill="currentColor" stroke="none" />
|
<polygon points="6,4 20,12 6,20" fill="currentColor" stroke="none" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template v-else-if="name === 'sun'">
|
||||||
|
<circle cx="12" cy="12" r="4.5" />
|
||||||
|
<line x1="12" y1="2.5" x2="12" y2="5" />
|
||||||
|
<line x1="12" y1="19" x2="12" y2="21.5" />
|
||||||
|
<line x1="2.5" y1="12" x2="5" y2="12" />
|
||||||
|
<line x1="19" y1="12" x2="21.5" y2="12" />
|
||||||
|
<line x1="4.9" y1="4.9" x2="6.7" y2="6.7" />
|
||||||
|
<line x1="17.3" y1="17.3" x2="19.1" y2="19.1" />
|
||||||
|
<line x1="4.9" y1="19.1" x2="6.7" y2="17.3" />
|
||||||
|
<line x1="17.3" y1="6.7" x2="19.1" y2="4.9" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template v-else-if="name === 'moon'">
|
||||||
|
<path d="M20 14.5A8.5 8.5 0 1 1 9.5 4 6.6 6.6 0 0 0 20 14.5Z" fill="currentColor" stroke="none" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template v-else-if="name === 'auto'">
|
||||||
|
<circle cx="12" cy="12" r="8.5" />
|
||||||
|
<path d="M12 3.5 A8.5 8.5 0 0 1 12 20.5 Z" fill="currentColor" stroke="none" />
|
||||||
|
</template>
|
||||||
</svg>
|
</svg>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user