feat: Phase 3 — Layout unification & theme system
**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 <noreply@anthropic.com>
This commit is contained in:
@@ -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 */
|
||||
/* ========================================================================== */
|
||||
|
||||
Reference in New Issue
Block a user