refactor(ui): unify LanguageSelector, ConfirmDialog, and AppSlider across apps

- contacts, zitare: migrate LanguageSelector to shared PillDropdown pattern
- context, times: replace local ConfirmDialog with ConfirmationModal from @manacore/shared-ui
  - delete local ConfirmDialog.svelte in both apps
  - map open→visible, onCancel→onClose, remove destructive prop (default in shared-ui)
- calendar, chat, contacts, presi, todo: switch AppSlider from static MANA_APPS
  to getActiveManaApps() to filter inactive apps consistently

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-31 19:10:55 +02:00
parent 3ea2c03ab2
commit 5e4518b418
16 changed files with 62 additions and 228 deletions

View file

@ -1,10 +1,10 @@
<script lang="ts">
import { AppSlider } from '@manacore/shared-ui';
import type { AppItem } from '@manacore/shared-ui';
import { MANA_APPS, APP_STATUS_LABELS, APP_SLIDER_LABELS } from '@manacore/shared-branding';
import { getActiveManaApps, APP_STATUS_LABELS, APP_SLIDER_LABELS } from '@manacore/shared-branding';
// Convert MANA_APPS to AppItem format (German)
const apps: AppItem[] = MANA_APPS.map((app) => ({
// Convert active apps to AppItem format (German)
const apps: AppItem[] = getActiveManaApps().map((app) => ({
name: app.name,
description: app.description.de,
longDescription: app.longDescription.de,

View file

@ -1,45 +1,19 @@
<script lang="ts">
import { locale } from 'svelte-i18n';
import { PillDropdown } from '@manacore/shared-ui';
import { getLanguageDropdownItems, getCurrentLanguageLabel } from '@manacore/shared-i18n';
import { setLocale, supportedLocales } from '$lib/i18n';
import type { SupportedLocale } from '$lib/i18n';
import { CaretDown } from '@manacore/shared-icons';
const languageLabels: Record<SupportedLocale, string> = {
de: 'Deutsch',
en: 'English',
it: 'Italiano',
fr: 'Français',
es: 'Español',
};
let currentLocale = $derived($locale || 'de');
let isOpen = $state(false);
function handleSelect(lang: SupportedLocale) {
setLocale(lang);
isOpen = false;
function handleLocaleChange(newLocale: string) {
setLocale(newLocale as any);
}
let languageItems = $derived(
getLanguageDropdownItems(supportedLocales, currentLocale, handleLocaleChange)
);
let currentLabel = $derived(getCurrentLanguageLabel(currentLocale));
</script>
<div class="relative">
<button
onclick={() => (isOpen = !isOpen)}
class="flex items-center gap-2 px-3 py-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors"
>
{languageLabels[$locale as SupportedLocale] || 'Language'}
<CaretDown size={16} />
</button>
{#if isOpen}
<div class="absolute right-0 mt-2 w-40 rounded-md border border-border bg-card shadow-lg z-50">
{#each supportedLocales as lang}
<button
onclick={() => handleSelect(lang)}
class="w-full px-4 py-2 text-left text-sm hover:bg-accent transition-colors first:rounded-t-md last:rounded-b-md"
class:bg-accent={$locale === lang}
>
{languageLabels[lang]}
</button>
{/each}
</div>
{/if}
</div>
<PillDropdown items={languageItems} label={currentLabel} direction="down" />