feat: complete UI redesign with dark mode, sidebar navigation, and modern design system

Implemented comprehensive UI overhaul with three-layer architecture:

Layer 1 - Theme System:
- CSS variables for light/dark themes (theme.css)
- Theme composable with light/dark/auto mode (useTheme.ts)
- Sidebar state management composable (useSidebar.ts)
- Refactored main.css to use CSS variables throughout

Layer 2 - Core Components:
- AppSidebar with collapsible navigation (desktop) and overlay (mobile)
- CollapsibleSection reusable component for expandable cards
- Restructured App.vue with new sidebar layout
- Integrated Lucide icons library (lucide-vue-next)

Layer 3 - Views & Components:
- Updated all 14 views with CSS variables and responsive design
- Replaced inline SVG with Lucide icon components
- Added collapsible sections to Dashboard, Admin pages, UserProfile
- Updated 3 shared components (BookingForm, SpaceCalendar, AttachmentsList)

Features:
- Dark/light/auto theme with persistent preference
- Collapsible sidebar (icons-only on desktop, overlay on mobile)
- Consistent color palette using CSS variables
- Full responsive design across all pages
- Modern minimalist aesthetic with Indigo accent color

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-02-11 21:27:05 +00:00
parent 9c2846cf00
commit 0bf3e6a7e2
28 changed files with 1960 additions and 1641 deletions

View File

@@ -437,7 +437,7 @@ onMounted(() => {
display: block;
margin-bottom: 6px;
font-weight: 500;
color: #374151;
color: var(--color-text-primary);
font-size: 14px;
}
@@ -445,7 +445,7 @@ onMounted(() => {
display: block;
margin-bottom: 4px;
font-weight: 400;
color: #6b7280;
color: var(--color-text-secondary);
font-size: 12px;
}
@@ -464,26 +464,28 @@ onMounted(() => {
.form-textarea {
width: 100%;
padding: 8px 12px;
border: 1px solid #d1d5db;
border-radius: 4px;
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
font-size: 14px;
font-family: inherit;
transition: border-color 0.2s;
transition: border-color var(--transition-fast);
background: var(--color-surface);
color: var(--color-text-primary);
}
.form-input:focus,
.form-textarea:focus {
outline: none;
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
border-color: var(--color-accent);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 15%, transparent);
}
.form-input-error {
border-color: #ef4444;
border-color: var(--color-danger);
}
.form-input:disabled {
background-color: #f3f4f6;
background-color: var(--color-bg-tertiary);
cursor: not-allowed;
}
@@ -494,24 +496,24 @@ onMounted(() => {
.form-error {
display: block;
margin-top: 4px;
color: #ef4444;
color: var(--color-danger);
font-size: 13px;
}
.api-error {
padding: 12px;
background: #fee2e2;
color: #991b1b;
border-radius: 4px;
background: color-mix(in srgb, var(--color-danger) 10%, transparent);
color: var(--color-danger);
border-radius: var(--radius-sm);
margin-bottom: 16px;
font-size: 14px;
}
.success-message {
padding: 12px;
background: #d1fae5;
color: #065f46;
border-radius: 4px;
background: color-mix(in srgb, var(--color-success) 10%, transparent);
color: var(--color-success);
border-radius: var(--radius-sm);
margin-bottom: 16px;
font-size: 14px;
}
@@ -525,11 +527,11 @@ onMounted(() => {
.btn {
padding: 10px 20px;
border: none;
border-radius: 4px;
border-radius: var(--radius-sm);
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
transition: all var(--transition-fast);
}
.btn:disabled {
@@ -538,33 +540,34 @@ onMounted(() => {
}
.btn-primary {
background: #3b82f6;
background: var(--color-accent);
color: white;
}
.btn-primary:hover:not(:disabled) {
background: #2563eb;
background: var(--color-accent-hover);
}
.btn-secondary {
background: #6b7280;
background: var(--color-text-secondary);
color: white;
}
.btn-secondary:hover:not(:disabled) {
background: #4b5563;
background: var(--color-text-primary);
}
.warning-banner {
background: #fff3cd;
border: 1px solid #ffc107;
border-radius: 4px;
background: color-mix(in srgb, var(--color-warning) 15%, transparent);
border: 1px solid var(--color-warning);
border-radius: var(--radius-sm);
padding: 12px;
margin-bottom: 16px;
display: flex;
gap: 12px;
align-items: flex-start;
font-size: 14px;
color: var(--color-text-primary);
}
.warning-icon {