feat(zitare): add settings store and i18n updates

This commit is contained in:
Till-JS 2026-02-13 23:29:50 +01:00
parent 702a30b699
commit ceebb5dda6
4 changed files with 119 additions and 4 deletions

View file

@ -8,6 +8,7 @@
@source "../../../../packages/shared-theme-ui/src";
@source "../../../../packages/shared-theme-ui/src/components";
@source "../../../../packages/shared-theme-ui/src/pages";
@source "../../../../packages/shared-stores/src";
/* Quote-specific styles */
.quote-text {

View file

@ -5,12 +5,17 @@
},
"nav": {
"home": "Heute",
"today": "Heute",
"categories": "Kategorien",
"favorites": "Favoriten",
"lists": "Listen",
"search": "Suche",
"settings": "Einstellungen",
"feedback": "Feedback"
"feedback": "Feedback",
"menu": "Menü",
"allThemes": "Alle Themes",
"showNav": "Navigation anzeigen",
"hideNav": "Navigation ausblenden"
},
"home": {
"dailyQuote": "Zitat des Tages",
@ -50,7 +55,11 @@
"title": "Suche",
"placeholder": "Zitat oder Autor suchen...",
"noResults": "Keine Ergebnisse",
"results": "{count} Ergebnisse"
"results": "{count} Ergebnisse",
"searching": "Suche...",
"create": "Erstellen",
"createList": "als Liste erstellen",
"createListDescription": "Neue Liste mit diesem Namen erstellen"
},
"auth": {
"login": "Anmelden",

View file

@ -5,12 +5,17 @@
},
"nav": {
"home": "Today",
"today": "Today",
"categories": "Categories",
"favorites": "Favorites",
"lists": "Lists",
"search": "Search",
"settings": "Settings",
"feedback": "Feedback"
"feedback": "Feedback",
"menu": "Menu",
"allThemes": "All Themes",
"showNav": "Show navigation",
"hideNav": "Hide navigation"
},
"home": {
"dailyQuote": "Quote of the Day",
@ -50,7 +55,11 @@
"title": "Search",
"placeholder": "Search quotes or authors...",
"noResults": "No results",
"results": "{count} results"
"results": "{count} results",
"searching": "Searching...",
"create": "Create",
"createList": "create as list",
"createListDescription": "Create a new list with this name"
},
"auth": {
"login": "Sign In",

View file

@ -0,0 +1,96 @@
/**
* Settings Store - Manages user preferences for the Zitare app
* Uses @manacore/shared-stores createAppSettingsStore factory
*/
import { createAppSettingsStore } from '@manacore/shared-stores';
export interface ZitareAppSettings extends Record<string, unknown> {
// View & Display
showQuoteOfTheDay: boolean;
autoRefreshDaily: boolean;
compactMode: boolean;
// Quote Display
showCategory: boolean;
showSource: boolean;
fontSizeMultiplier: number;
// Immersive Mode
immersiveModeEnabled: boolean;
// Navigation UI
pillNavCollapsed: boolean;
}
const DEFAULT_SETTINGS: ZitareAppSettings = {
// View & Display
showQuoteOfTheDay: true,
autoRefreshDaily: true,
compactMode: false,
// Quote Display
showCategory: true,
showSource: true,
fontSizeMultiplier: 1,
// Immersive Mode
immersiveModeEnabled: false,
// Navigation UI
pillNavCollapsed: true,
};
// Create base store using factory
const baseStore = createAppSettingsStore<ZitareAppSettings>('zitare-settings', DEFAULT_SETTINGS);
// Export with convenience getters
export const zitareSettings = {
// Base store methods
get settings() {
return baseStore.settings;
},
initialize: baseStore.initialize,
set: baseStore.set,
update: baseStore.update,
reset: baseStore.reset,
getDefaults: baseStore.getDefaults,
toggleImmersiveMode: baseStore.toggleImmersiveMode,
// Convenience getters
get showQuoteOfTheDay() {
return baseStore.settings.showQuoteOfTheDay;
},
get autoRefreshDaily() {
return baseStore.settings.autoRefreshDaily;
},
get compactMode() {
return baseStore.settings.compactMode;
},
get showCategory() {
return baseStore.settings.showCategory;
},
get showSource() {
return baseStore.settings.showSource;
},
get fontSizeMultiplier() {
return baseStore.settings.fontSizeMultiplier;
},
get immersiveModeEnabled() {
return baseStore.settings.immersiveModeEnabled;
},
get pillNavCollapsed() {
return baseStore.settings.pillNavCollapsed;
},
// Toggle methods
togglePillNav() {
baseStore.update({ pillNavCollapsed: !baseStore.settings.pillNavCollapsed });
},
showPillNav() {
baseStore.update({ pillNavCollapsed: false });
},
hidePillNav() {
baseStore.update({ pillNavCollapsed: true });
},
};