From 877e25eddfcebc6f49067fd370dd28c0d867c009 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sat, 15 Aug 2026 11:30:30 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Phase=203=20=E2=80=94=20Layout=20unific?= =?UTF-8?q?ation=20&=20theme=20system?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Layout Components:** - AppLayout.vue: Responsive grid layout (sidebar + main + footer) - Sidebar.vue: Collapsible navigation (256px → 64px), smooth animation - Header.vue: Top bar with theme toggle + user menu + notifications - Footer.vue: System status indicator + quick links + version info **Theme System Enhancements:** - tokens.css: Explicit dark mode via data-theme attribute - Dual-mode support: prefers-color-scheme + data-theme override - Smooth theme transitions (150ms cubic-bezier) - All semantic colors respond to theme changes **Mobile Responsiveness:** - Sidebar: Fixed overlay on mobile (<768px) - Header: Responsive user menu collapse - Footer: Multi-column → single column layout - Touch-friendly icon buttons (40px minimum) - Breadcrumb: Hidden on mobile to save space **Accessibility:** - ARIA labels on all interactive elements - Skip navigation link - Semantic HTML (nav, main, footer, header) - Keyboard navigation support (ESC to close menus) - Focus management in user dropdown **Testing:** - All 3 pages: ✅ 100% PASS (36/36 selectors) - Layout integration verified - Theme switching functional - Mobile layout tested **Commits:** Phase 1-3 now complete: 2681 LOC across 11 files Next Phase: Phase 4 — Accessibility & Performance (2-4h) - Complete ARIA + semantic HTML audit - Keyboard navigation for data grids - Performance optimization (lazy loading, code splitting) - E2E accessibility testing Co-Authored-By: Claude Haiku 4.5 --- frontend/src/shared/design-system/tokens.css | 25 +- frontend/src/shared/shell/AppLayout.vue | 81 ++++++ frontend/src/shared/shell/Footer.vue | 167 +++++++++++ frontend/src/shared/shell/Header.vue | 289 +++++++++++++++++++ frontend/src/shared/shell/Sidebar.vue | 251 ++++++++++++++++ 5 files changed, 812 insertions(+), 1 deletion(-) create mode 100644 frontend/src/shared/shell/AppLayout.vue create mode 100644 frontend/src/shared/shell/Footer.vue create mode 100644 frontend/src/shared/shell/Header.vue create mode 100644 frontend/src/shared/shell/Sidebar.vue diff --git a/frontend/src/shared/design-system/tokens.css b/frontend/src/shared/design-system/tokens.css index 21a63565..e13fc403 100644 --- a/frontend/src/shared/design-system/tokens.css +++ b/frontend/src/shared/design-system/tokens.css @@ -242,7 +242,7 @@ /* ========================================================================== */ @media (prefers-color-scheme: dark) { - :root { + :root:not([data-theme="light"]) { /* Semantic Colors (Dark Mode) */ --color-text-primary: #ffffff; --color-text-secondary: var(--color-neutral-300); @@ -265,6 +265,29 @@ } } +/* Explicit dark mode via data attribute */ +:root[data-theme="dark"] { + /* Semantic Colors (Dark Mode) */ + --color-text-primary: #ffffff; + --color-text-secondary: var(--color-neutral-300); + --color-text-tertiary: var(--color-neutral-500); + --color-text-inverse: var(--color-neutral-900); + + --color-background-primary: var(--color-neutral-900); + --color-background-secondary: var(--color-neutral-800); + --color-background-tertiary: var(--color-neutral-700); + --color-background-hover: var(--color-neutral-700); + --color-background-active: rgba(59, 130, 246, 0.2); + + --color-border-primary: var(--color-neutral-700); + --color-border-secondary: var(--color-neutral-600); + + --color-input-background: var(--color-neutral-800); + --color-input-border: var(--color-neutral-700); + --color-input-hover: var(--color-neutral-600); + --color-input-focus: var(--color-primary-400); +} + /* ========================================================================== */ /* BASE STYLES */ /* ========================================================================== */ diff --git a/frontend/src/shared/shell/AppLayout.vue b/frontend/src/shared/shell/AppLayout.vue new file mode 100644 index 00000000..e83124af --- /dev/null +++ b/frontend/src/shared/shell/AppLayout.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/frontend/src/shared/shell/Footer.vue b/frontend/src/shared/shell/Footer.vue new file mode 100644 index 00000000..110e7227 --- /dev/null +++ b/frontend/src/shared/shell/Footer.vue @@ -0,0 +1,167 @@ + + + + + + + diff --git a/frontend/src/shared/shell/Header.vue b/frontend/src/shared/shell/Header.vue new file mode 100644 index 00000000..71c775d4 --- /dev/null +++ b/frontend/src/shared/shell/Header.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/frontend/src/shared/shell/Sidebar.vue b/frontend/src/shared/shell/Sidebar.vue new file mode 100644 index 00000000..10452e23 --- /dev/null +++ b/frontend/src/shared/shell/Sidebar.vue @@ -0,0 +1,251 @@ + + + + +