♻️ refactor: migrate all web apps to Phosphor icons

Replace lucide-svelte with @manacore/shared-icons across all web apps
for consistent icon usage throughout the monorepo.

Apps migrated:
- calendar (12 files)
- contacts (1 file)
- matrix (16 files)
- nutriphi (7 files)
- presi (6 files)
- questions (9 files)
- skilltree (9 files)
- storage (16 files)
- todo (package.json only)

Key icon mappings:
- Trash2 → Trash
- ChevronLeft/Right/Up/Down → CaretLeft/Right/Up/Down
- Search → MagnifyingGlass
- Settings → Gear
- Loader2 → CircleNotch
- AlertCircle → WarningCircle
- ExternalLink → ArrowSquareOut
- LogOut → SignOut
This commit is contained in:
Till-JS 2026-01-29 13:15:13 +01:00
parent c21f780581
commit b89749deed
86 changed files with 1736 additions and 904 deletions

View file

@ -52,7 +52,6 @@
"@neodrag/svelte": "^2.3.3",
"d3-force": "^3.0.0",
"date-fns": "^4.1.0",
"lucide-svelte": "^0.559.0",
"suncalc": "^1.9.0",
"svelte-dnd-action": "^0.9.68",
"svelte-i18n": "^4.0.1"

View file

@ -1,5 +1,5 @@
<script lang="ts">
import { Calendar, CheckSquare, Filter } from 'lucide-svelte';
import { Calendar, CheckSquare, Funnel } from '@manacore/shared-icons';
import { FilterDropdown, type FilterDropdownOption } from '@manacore/shared-ui';
interface Props {
@ -53,7 +53,7 @@
<div class="filter-group">
<div class="range-selector">
<Filter size={14} />
<Funnel size={14} />
<FilterDropdown
options={rangeOptions}
value={timeRange}

View file

@ -6,7 +6,7 @@
import { todosStore } from '$lib/stores/todos.svelte';
import TodoCheckbox from '$lib/components/todo/TodoCheckbox.svelte';
import PriorityBadge from '$lib/components/todo/PriorityBadge.svelte';
import { Calendar, MapPin, Clock } from 'lucide-svelte';
import { Calendar, MapPin, Clock } from '@manacore/shared-icons';
import { format } from 'date-fns';
import { de } from 'date-fns/locale';
import { toDate } from '$lib/utils/eventDateHelpers';

View file

@ -2,7 +2,7 @@
import { env } from '$env/dynamic/public';
import type { BirthdayEvent } from '$lib/api/birthdays';
import { settingsStore } from '$lib/stores/settings.svelte';
import { X, User, ExternalLink, Cake } from 'lucide-svelte';
import { X, User, ArrowSquareOut, Cake } from '@manacore/shared-icons';
import { format, parseISO } from 'date-fns';
import { de } from 'date-fns/locale';
@ -124,7 +124,7 @@
<a href={contactUrl} target="_blank" rel="noopener noreferrer" class="action-btn primary">
<User size={16} />
<span>Kontakt öffnen</span>
<ExternalLink size={14} class="external-icon" />
<ArrowSquareOut size={14} class="external-icon" />
</a>
</div>
</div>

View file

@ -2,7 +2,7 @@
import type { Task } from '$lib/api/todos';
import { todosStore } from '$lib/stores/todos.svelte';
import { _ } from 'svelte-i18n';
import { CheckSquare, Square } from 'lucide-svelte';
import { CheckSquare, Square } from '@manacore/shared-icons';
interface Props {
task: Task;

View file

@ -4,7 +4,7 @@
import { PRIORITY_COLORS } from '$lib/api/todos';
import TodoCheckbox from '$lib/components/todo/TodoCheckbox.svelte';
import TodoDetailModal from '$lib/components/todo/TodoDetailModal.svelte';
import { Check } from 'lucide-svelte';
import { Check } from '@manacore/shared-icons';
interface Props {
date: Date;

View file

@ -4,7 +4,7 @@
import TodoItem from '$lib/components/todo/TodoItem.svelte';
import TodoDetailModal from '$lib/components/todo/TodoDetailModal.svelte';
import QuickAddTodo from '$lib/components/todo/QuickAddTodo.svelte';
import { ChevronDown, ChevronRight, Plus, CheckSquare, AlertTriangle } from 'lucide-svelte';
import { CaretDown, CaretRight, Plus, CheckSquare, Warning } from '@manacore/shared-icons';
import { goto } from '$app/navigation';
import { onMount } from 'svelte';
@ -67,9 +67,9 @@
<button type="button" class="header-toggle" onclick={toggleExpanded}>
<div class="header-left">
{#if isExpanded}
<ChevronDown size={16} />
<CaretDown size={16} />
{:else}
<ChevronRight size={16} />
<CaretRight size={16} />
{/if}
<CheckSquare size={16} class="section-icon" />
<span class="section-title">Aufgaben</span>
@ -78,7 +78,7 @@
{/if}
{#if overdueCount > 0}
<span class="overdue-badge" title="{overdueCount} überfällig">
<AlertTriangle size={12} />
<Warning size={12} />
</span>
{/if}
</div>
@ -98,7 +98,7 @@
<div class="section-content">
{#if !todosStore.serviceAvailable}
<div class="service-unavailable">
<AlertTriangle size={16} />
<Warning size={16} />
<span>Todo-Service nicht erreichbar</span>
</div>
{:else if todosStore.loading}

View file

@ -2,7 +2,7 @@
import type { EventAttendee, AttendeeStatus } from '@calendar/shared';
import type { ContactSummary, ContactOrManual, ManualContactEntry } from '@manacore/shared-types';
import { ContactSelector, ContactAvatar } from '@manacore/shared-ui';
import { Check, X, HelpCircle, Clock, ChevronDown } from 'lucide-svelte';
import { Check, X, Question, Clock, CaretDown } from '@manacore/shared-icons';
import { contactsStore } from '$lib/stores/contacts.svelte';
interface Props {
@ -178,12 +178,12 @@
{:else if attendee.status === 'declined'}
<X size={12} />
{:else if attendee.status === 'tentative'}
<HelpCircle size={12} />
<Question size={12} />
{:else}
<Clock size={12} />
{/if}
<span class="hidden sm:inline">{getStatusLabel(attendee.status)}</span>
<ChevronDown size={12} />
<CaretDown size={12} />
</button>
{#if showStatusDropdown === attendee.email}
@ -213,7 +213,7 @@
{:else if option.value === 'declined'}
<X size={12} />
{:else if option.value === 'tentative'}
<HelpCircle size={12} />
<Question size={12} />
{:else}
<Clock size={12} />
{/if}

View file

@ -18,7 +18,7 @@
FilterDropdown,
type FilterDropdownOption,
} from '@manacore/shared-ui';
import { Users } from 'lucide-svelte';
import { Users } from '@manacore/shared-icons';
import { format, addMinutes } from 'date-fns';
import { de } from 'date-fns/locale';
import { toDate } from '$lib/utils/eventDateHelpers';

View file

@ -2,7 +2,7 @@
import type { ResponsiblePerson } from '@calendar/shared';
import type { ContactSummary, ContactOrManual, ManualContactEntry } from '@manacore/shared-types';
import { ContactSelector, ContactAvatar } from '@manacore/shared-ui';
import { X, ExternalLink } from 'lucide-svelte';
import { X, ArrowSquareOut } from '@manacore/shared-icons';
import { contactsStore } from '$lib/stores/contacts.svelte';
interface Props {
@ -139,7 +139,7 @@
"
title="Kontakt öffnen"
>
<ExternalLink size={16} />
<ArrowSquareOut size={16} />
</button>
{/if}

View file

@ -1,6 +1,6 @@
<script lang="ts">
import { todosStore } from '$lib/stores/todos.svelte';
import { Plus, X } from 'lucide-svelte';
import { Plus, X } from '@manacore/shared-icons';
interface Props {
placeholder?: string;

View file

@ -1,5 +1,5 @@
<script lang="ts">
import { Check } from 'lucide-svelte';
import { Check } from '@manacore/shared-icons';
interface Props {
checked: boolean;

View file

@ -11,12 +11,12 @@
Clock,
Folder,
Tag,
Trash2,
Trash,
CheckSquare,
AlertCircle,
CalendarClock,
WarningCircle,
CalendarCheck,
Timer,
} from 'lucide-svelte';
} from '@manacore/shared-icons';
import { format, parseISO } from 'date-fns';
import { de } from 'date-fns/locale';
@ -239,7 +239,7 @@
<!-- Time-Blocking Section -->
<div class="form-section">
<span class="section-label">
<CalendarClock size={16} />
<CalendarCheck size={16} />
Zeitplanung (Time-Blocking)
</span>
<div class="form-row">
@ -313,7 +313,7 @@
<!-- Time-Blocking Display -->
{#if task.scheduledDate}
<div class="detail-item scheduled">
<CalendarClock size={16} />
<CalendarCheck size={16} />
<span>
Geplant: {formatDisplayDate(task.scheduledDate)}
{#if task.scheduledStartTime}
@ -334,7 +334,7 @@
{/if}
<div class="detail-item">
<AlertCircle size={16} />
<WarningCircle size={16} />
<PriorityBadge {priority} variant="pill" showLabel />
</div>
@ -397,7 +397,7 @@
</button>
{:else}
<button type="button" class="btn btn-danger" onclick={handleDelete} disabled={isDeleting}>
<Trash2 size={16} />
<Trash size={16} />
{#if isDeleting}
Löschen...
{:else}