feat: UI overhaul - component library + route layouts with instant headers

- Created 11 reusable UI components: PageHeader, SectionCard, StatCard, StatusBadge, TabBar, MemberList, ActivityFeed, EventCard, ContentSkeleton, QuickLinkGrid, ModuleCard
- Created route-specific +layout.svelte for documents, calendar, kanban, events, settings, account
- Each layout renders PageHeader instantly from parent data, shows ContentSkeleton during navigation
- Removed full-page PageSkeleton from parent layout
- Refactored all pages to use new components instead of inline markup
- Overview page: uses StatCard, SectionCard, EventCard, ActivityFeed, MemberList, QuickLinkGrid
- Events list: uses EventCard, Button components
- Event detail: uses ModuleCard, SectionCard
- Settings/Account/Calendar/Kanban: headers in layouts, toolbars in pages
- Added i18n keys for overview page (EN + ET)
- 0 errors, 112 tests pass
This commit is contained in:
AlacrisDevs
2026-02-07 10:44:53 +02:00
parent fe6ec6e0af
commit 2913912cb8
30 changed files with 1240 additions and 604 deletions

View File

@@ -456,13 +456,11 @@
<title>Calendar - {data.org.name} | Root</title>
</svelte:head>
<div class="flex flex-col h-full p-4 lg:p-5 gap-4">
<!-- Header -->
<header class="flex items-center gap-2 p-1">
<h1 class="flex-1 font-heading text-h1 text-white">
{m.calendar_title()}
</h1>
<Button size="md" onclick={() => handleDateClick(new Date())}
<div class="flex flex-col h-full">
<!-- Toolbar -->
<div class="flex items-center gap-2 px-6 py-3 border-b border-light/5 shrink-0">
<div class="flex-1"></div>
<Button size="sm" onclick={() => handleDateClick(new Date())}
>{m.btn_new()}</Button
>
<ContextMenu
@@ -502,10 +500,10 @@
: []),
]}
/>
</header>
</div>
<!-- Calendar Grid -->
<div class="flex-1 overflow-auto">
<div class="flex-1 overflow-auto p-4">
<Calendar
events={allEvents}
onDateClick={handleDateClick}