/* ========================================== UNIFIED PAGE LAYOUT SYSTEM Standard layout classes for all pages ========================================== */ /* ========== BASE LAYOUT ========== */ /* App container - contains sidebar and main content */ .app-layout { display: flex; min-height: 100vh; background: var(--color-bg-main); } /* Main content area - adjusts for sidebar */ .main-content { flex: 1; margin-left: var(--sidebar-width); min-height: 100vh; display: flex; flex-direction: column; transition: margin-left 0.3s ease; } /* Adjust main content when sidebar is collapsed */ .sidebar.collapsed~.main-content { margin-left: var(--sidebar-width-collapsed); } /* ========== PAGE STRUCTURE ========== */ /* Page header container - fixed at top */ .page-tabs-container, .admin-tabs-container { display: flex; justify-content: center; padding: 0.75rem; position: fixed; top: 0; left: var(--sidebar-width); right: 0; z-index: 100; } /* Handle collapsed sidebar for fixed header (desktop only) */ @media (min-width: 769px) { [data-sidebar-collapsed='true'] .page-tabs-container, [data-sidebar-collapsed='true'] .admin-tabs-container { left: var(--sidebar-width-collapsed); } } /* Add top padding to content to account for fixed header */ .page-content, .admin-tab-swipe { padding-top: calc(var(--page-padding-y) + 60px); } /* Ensure no extra margin from body */ body { margin: 0; padding: 0; } /* Disable tap highlight on all interactive elements */ button, a, input, select, textarea, label, [role="button"], [tabindex], .sidebar, .sidebar *, .nav-item, .order-card, .toggle-modern, .page-tab-btn, .admin-tabs-slider *, .page-tabs-slider * { -webkit-tap-highlight-color: transparent; } /* Page header slider - rounded pill style (like admin panel) */ .page-tabs-slider, .admin-tabs-slider { display: inline-flex; align-items: center; background: var(--color-bg-elevated); border: 1px solid var(--color-card-outline); border-radius: var(--radius-xl); padding: 4px; gap: 4px; box-shadow: var(--shadow-md); max-width: 100%; overflow-x: auto; overflow-y: hidden; scrollbar-width: none; -ms-overflow-style: none; } .page-tabs-slider::-webkit-scrollbar, .admin-tabs-slider::-webkit-scrollbar { display: none; } .tabs-scroll-shell { position: relative; display: inline-flex; align-items: center; max-width: 100%; min-width: 0; } .tabs-scroll-slider { cursor: grab; overscroll-behavior-x: contain; min-width: 0; } .tabs-scroll-slider--dragging { cursor: grabbing; user-select: none; } .tabs-scroll-arrow { position: absolute; top: 50%; transform: translateY(-50%); width: 34px; height: 34px; border-radius: 999px; border: 1px solid var(--color-border); background: var(--color-bg-elevated); color: var(--color-text-secondary); display: inline-flex; align-items: center; justify-content: center; box-shadow: var(--shadow-md); opacity: 0; pointer-events: none; transition: opacity 0.2s ease, transform 0.2s ease, background 0.2s ease, color 0.2s ease; z-index: 2; } .tabs-scroll-arrow .material-symbols-outlined { font-size: 20px; } .tabs-scroll-arrow.visible { opacity: 1; pointer-events: auto; } .tabs-scroll-arrow:hover { background: var(--color-bg-card); color: var(--color-text-primary); } .tabs-scroll-arrow:active { transform: translateY(-50%) scale(0.96); } .tabs-scroll-arrow.left { left: -12px; } .tabs-scroll-arrow.right { right: -12px; } @media (max-width: 1024px) { .tabs-scroll-slider { touch-action: pan-x; } } @media (max-width: 768px) { .tabs-scroll-arrow { width: 30px; height: 30px; } .tabs-scroll-arrow.left { left: -8px; } .tabs-scroll-arrow.right { right: -8px; } } @media (max-width: 480px) { .tabs-scroll-arrow.left { left: -6px; } .tabs-scroll-arrow.right { right: -6px; } } @supports (color: color-mix(in srgb, black, white)) { .page-tabs-slider, .admin-tabs-slider { background: color-mix(in srgb, var(--color-bg-elevated) 78%, transparent); } } /* Page title section inside slider */ .page-title-section, .admin-title-section { display: flex; align-items: center; gap: 0.5rem; padding: 0.5rem 1.25rem; color: var(--color-text-primary); font-size: 1rem; font-weight: 600; white-space: nowrap; } .page-title-section .material-symbols-outlined, .admin-title-section .material-symbols-outlined { font-size: 1.25rem; color: var(--color-accent); } .page-title-text, .admin-title-text { color: var(--color-text-primary); font-size: 0.8rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; } /* Divider between title and tabs (for pages with tabs) */ .page-tabs-divider, .admin-tabs-divider { width: 1px; height: 32px; background: var(--color-border); margin: 0 0.25rem; } /* Tab buttons (for pages with tabs) */ .page-tab-btn, .admin-tab-btn { display: flex; align-items: center; gap: 0.5rem; padding: var(--tab-padding); background: transparent; border: none; border-radius: var(--radius-lg); color: var(--color-text-secondary); font-size: var(--tab-font-size); font-weight: 500; cursor: pointer; transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); white-space: nowrap; outline: none; -webkit-tap-highlight-color: transparent; } .page-tab-btn:focus, .admin-tab-btn:focus, .page-tab-btn:focus-visible, .admin-tab-btn:focus-visible { outline: none; box-shadow: none; } .page-tab-btn.active:focus, .admin-tab-btn.active:focus, .page-tab-btn.active:focus-visible, .admin-tab-btn.active:focus-visible { box-shadow: 0 2px 8px rgba(var(--color-accent-rgb), 0.3); } .page-tab-btn .material-symbols-outlined, .admin-tab-btn .material-symbols-outlined { font-size: var(--icon-md); transition: inherit; } .page-tab-btn:hover:not(.active), .admin-tab-btn:hover:not(.active) { color: var(--color-text-primary); background: rgba(var(--color-accent-rgb), 0.10); } .page-tab-btn.active, .admin-tab-btn.active { background: var(--color-accent); color: white; box-shadow: 0 4px 12px rgba(var(--color-accent-rgb), 0.25); } .page-subtitle { margin: 0.5rem 0 0; color: var(--color-text-secondary); font-size: 0.95rem; } /* Standard Section Title */ .section-title { margin: 0 0 var(--section-title-gap) 0; font-size: 0.8rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-text-primary); } /* Standard Section Header */ .section-header { margin-bottom: var(--section-title-gap); } .section-header .section-title { margin-bottom: 0; } /* Standard Page Section */ .page-section { margin-bottom: 3rem; } .page-section:last-child { margin-bottom: 0; } /* ========== MOBILE MENU BUTTON ========== */ /* Hidden by default on desktop */ .mobile-menu-btn { display: none; align-items: center; justify-content: center; width: 40px; height: 40px; background: transparent; border: none; border-radius: var(--radius-lg); color: var(--color-text-primary); cursor: pointer; transition: all 0.2s ease; flex-shrink: 0; } .mobile-menu-btn:hover { background-color: rgba(var(--color-accent-rgb), 0.1); color: var(--color-accent); } .mobile-menu-btn .material-symbols-outlined { font-size: var(--icon-lg); } /* ========== ACTION BUTTONS IN SLIDER ========== */ /* Action buttons that appear in the slider (like Add User) */ .page-tabs-slider .btn-primary, .admin-tabs-slider .btn-primary { display: flex; align-items: center; gap: 0.5rem; padding: 0.5rem 1rem; margin-left: auto; font-size: 0.9rem; white-space: nowrap; } .page-tabs-slider .btn-primary .material-symbols-outlined, .admin-tabs-slider .btn-primary .material-symbols-outlined { font-size: 20px; } /* ========== PAGE CONTENT ========== */ /* Main content wrapper - with symmetric padding from sidebar edge to window edge */ .page-content { flex: 1; padding: var(--page-padding-y) var(--page-padding-x); width: 100%; max-width: var(--page-max-width); margin: 0 auto; } /* Content wrapper for centered content with max-width (use inside page-content if needed) */ .content-wrapper { max-width: var(--page-max-width); width: 100%; margin: 0 auto; } /* Admin tab content (for tabbed interfaces) */ .admin-tab-content { padding: var(--page-padding-y) var(--page-padding-x); max-width: var(--page-max-width); margin: 0 auto; width: 100%; } .page-content--narrow, .admin-tab-content--narrow, .content-narrow { max-width: var(--page-max-width-narrow); margin: 0 auto; width: 100%; } /* Remove double padding when theme-tab-content is nested inside admin-tab-content */ .admin-tab-content .theme-tab-content { padding: 0; max-width: none; } .admin-tab-content .content-narrow { max-width: var(--page-max-width-narrow); margin: 0 auto; width: 100%; } /* ========== RESPONSIVE DESIGN ========== */ /* Tablet - reduce padding */ @media (max-width: 1024px) { .page-tabs-container, .admin-tabs-container { padding: var(--page-padding-y-tablet) var(--page-padding-x-tablet); } .page-content, .admin-tab-swipe { padding-top: calc(var(--page-padding-y-tablet) + 60px); } .admin-tab-content { padding: var(--page-padding-y-tablet) var(--page-padding-x-tablet); } } /* Mobile - remove sidebar margin */ @media (max-width: 768px) { .main-content { margin-left: 0; } /* Override collapsed state margin on mobile */ .sidebar.collapsed~.main-content { margin-left: 0; } /* Show mobile menu button with logo */ .mobile-menu-btn { display: flex; position: absolute; left: 16px; top: 50%; transform: translateY(-50%); z-index: 1; background-image: url('/logo_black.svg'); background-size: 28px 28px; background-repeat: no-repeat; background-position: center; } .mobile-menu-btn .material-symbols-outlined { display: none; } [data-theme='dark'] .mobile-menu-btn { background-image: url('/logo_white.svg'); } .mobile-menu-btn:hover { background-color: transparent; } .page-tabs-container, .admin-tabs-container { padding: 0.75rem; left: 0; } .page-content, .admin-tab-swipe { padding-top: calc(var(--page-padding-y-mobile) + 60px); } .page-tabs-slider, .admin-tabs-slider { width: 100%; flex-wrap: nowrap; justify-content: flex-start; gap: 4px; position: relative; min-height: 48px; } .tabs-scroll-shell { width: 100%; } .page-title-section, .admin-title-section { display: flex; flex: 1; justify-content: flex-start; padding: 0.5rem 0.75rem; padding-left: 72px; font-size: 1rem; height: 100%; align-items: center; } .page-title-section .material-symbols-outlined, .admin-title-section .material-symbols-outlined { font-size: 22px; } .page-title-text, .admin-title-text { font-size: 0.95rem; } /* Hide divider on mobile */ .page-tabs-divider, .admin-tabs-divider { display: none; } /* Hide title section when tabs are present on mobile */ .page-tabs-slider[data-has-tabs='true'] .page-title-section, .page-tabs-slider[data-has-tabs='true'] .admin-title-section, .admin-tabs-slider[data-has-tabs='true'] .page-title-section, .admin-tabs-slider[data-has-tabs='true'] .admin-title-section { display: none; } /* Add padding-left when tabs are present to avoid logo overlap */ .page-tabs-slider[data-has-tabs='true'], .admin-tabs-slider[data-has-tabs='true'] { padding-left: 72px; } /* Center title section absolutely when no tabs are present on mobile */ .page-tabs-slider[data-has-tabs='false'], .admin-tabs-slider[data-has-tabs='false'] { justify-content: center; } .page-tabs-slider[data-has-tabs='false'] .page-title-section, .page-tabs-slider[data-has-tabs='false'] .admin-title-section, .admin-tabs-slider[data-has-tabs='false'] .page-title-section, .admin-tabs-slider[data-has-tabs='false'] .admin-title-section { display: flex; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); padding: 0.5rem 0.75rem; flex: none; } /* Lighter icon color in dark theme when only title is shown */ .page-tabs-slider[data-has-tabs='false'] .page-title-section .material-symbols-outlined, .page-tabs-slider[data-has-tabs='false'] .admin-title-section .material-symbols-outlined, .admin-tabs-slider[data-has-tabs='false'] .page-title-section .material-symbols-outlined, .admin-tabs-slider[data-has-tabs='false'] .admin-title-section .material-symbols-outlined { color: var(--color-text-secondary); } /* Tabs - expand to fill, but scrollable when overflow */ .page-tab-btn, .admin-tab-btn { flex: 1 0 auto; justify-content: center; padding: 0.5rem 0.75rem; font-size: 0.9rem; min-width: 44px; } /* Hide text on mobile, show only icons */ .page-tab-btn span:not(.material-symbols-outlined), .admin-tab-btn span:not(.material-symbols-outlined) { display: none; } .page-tab-btn .material-symbols-outlined, .admin-tab-btn .material-symbols-outlined { font-size: 22px; } /* Action buttons in slider - icon only on mobile */ .page-tabs-slider .btn-primary, .admin-tabs-slider .btn-primary { padding: 0.5rem; margin-left: 0; } .page-tabs-slider .btn-primary span:not(.material-symbols-outlined), .admin-tabs-slider .btn-primary span:not(.material-symbols-outlined) { display: none; } .page-content { padding: var(--page-padding-y-mobile) var(--page-padding-x-mobile); } .admin-tab-content { padding: var(--page-padding-y-mobile) var(--page-padding-x-mobile); } } /* Small mobile - further reduce spacing */ @media (max-width: 480px) { .page-tabs-container, .admin-tabs-container { padding: var(--page-padding-y-mobile) var(--page-padding-x-mobile); } .page-content { padding: var(--page-padding-y-mobile) var(--page-padding-x-mobile); } .admin-tab-content { padding: var(--page-padding-y-mobile) var(--page-padding-x-mobile); } } /* ========== TAB CONTENT ANIMATIONS ========== */ /* Prevent layout shift when switching tabs */ .admin-tab-content:not(.swipe-tabs):not(.swipe-panel-content) { display: grid; grid-template-rows: 1fr; transition: grid-template-rows 0.25s ease; } .admin-tab-content:not(.swipe-tabs):not(.swipe-panel-content)>div { opacity: 0; animation: tabFadeIn 0.25s ease forwards; min-height: 0; } .admin-tab-swipe { width: 100%; max-width: none; margin: 0; flex: 1 1 auto; min-height: 0; } /* Swipeable tab panels */ .swipe-tabs { position: relative; background: var(--color-bg-main); touch-action: pan-y; } .swipe-tabs-track { display: flex; width: 100%; will-change: transform; transform: translate3d(0, 0, 0); backface-visibility: hidden; } .swipe-tabs-panel { flex: 0 0 100%; width: 100%; min-height: 1px; background: var(--color-bg-main); backface-visibility: hidden; } .swipe-tabs--static { overflow: hidden; } .swipe-tabs--static .swipe-tabs-panel { overflow: hidden; } .swipe-tabs--snap { overflow: hidden; touch-action: pan-y; overscroll-behavior-x: contain; } .swipe-tabs--snap::-webkit-scrollbar { display: none; } .swipe-tabs--snap .swipe-tabs-panel { overflow: hidden; contain: paint; } .swipe-tabs-panel-inner { width: 100%; } .swipe-tabs--dragging .swipe-tabs-panel-inner { user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; } .admin-tab-content.swipe-tabs { display: block; } .admin-tab-content.swipe-tabs>div { opacity: 1; animation: none; } .swipe-panel-content { display: block; } .swipe-panel-content>div { opacity: 1; animation: none; } @keyframes tabFadeIn { 0% { opacity: 0; transform: scale(0.98); } 100% { opacity: 1; transform: none; } } /* ========== UTILITY COMPONENTS ========== */ /* Tab Content Placeholder (for "coming soon" pages) */ .tab-content-placeholder { text-align: center; padding: 4rem 2rem; color: var(--color-text-secondary); } .tab-content-placeholder .placeholder-icon { margin-bottom: 1.5rem; } .tab-content-placeholder .placeholder-icon .material-symbols-outlined { font-size: 80px; color: var(--color-accent); opacity: 0.5; } .tab-content-placeholder h3 { margin: 0 0 0.5rem 0; color: var(--color-text-primary); font-size: 1.5rem; } .tab-content-placeholder p { margin: 0; font-size: 1rem; } /* ========== DARK THEME OVERRIDES ========== */ /* Top bar in dark mode: match sidebar style exactly */ [data-theme='dark'] .page-tabs-slider, [data-theme='dark'] .admin-tabs-slider { background: var(--color-bg-sidebar); border: 1px solid var(--color-sidebar-border); border-radius: var(--radius-lg); box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.1); } @supports (color: color-mix(in srgb, black, white)) { [data-theme='dark'] .page-tabs-slider, [data-theme='dark'] .admin-tabs-slider { background: color-mix(in srgb, var(--color-bg-sidebar) 95%, transparent); } } /* Text colors in dark top bar */ [data-theme='dark'] .page-title-section, [data-theme='dark'] .admin-title-section { color: #f1f5f9; } [data-theme='dark'] .page-title-text, [data-theme='dark'] .admin-title-text { color: #f1f5f9; } [data-theme='dark'] .page-tab-btn, [data-theme='dark'] .admin-tab-btn { color: rgba(241, 245, 249, 0.7); } [data-theme='dark'] .page-tab-btn:hover:not(.active), [data-theme='dark'] .admin-tab-btn:hover:not(.active) { color: #f1f5f9; background: rgba(255, 255, 255, 0.08); } [data-theme='dark'] .page-tabs-divider, [data-theme='dark'] .admin-tabs-divider { background: rgba(255, 255, 255, 0.12); } /* ========== DARK THEME + AUTO ACCENT OVERRIDES ========== */ /* Tab buttons with auto accent in dark mode: use off-white background with dark text */ [data-theme='dark'][data-accent='auto'] .page-tab-btn.active, [data-theme='dark'][data-accent='auto'] .admin-tab-btn.active { background: #e5e7eb; color: #111827; box-shadow: 0 0 20px 2px rgba(229, 231, 235, 0.4); } [data-theme='dark'][data-accent='auto'] .page-tab-btn.active:focus, [data-theme='dark'][data-accent='auto'] .admin-tab-btn.active:focus, [data-theme='dark'][data-accent='auto'] .page-tab-btn.active:focus-visible, [data-theme='dark'][data-accent='auto'] .admin-tab-btn.active:focus-visible { box-shadow: 0 0 25px 4px rgba(229, 231, 235, 0.5); } /* ========== TAB BAR POSITION ========== */ /* * Tab bar positioning system: * - 'top': default, no changes needed * - 'bottom': fixed at bottom on all screens (only when tabs are present) * - 'responsive': top on desktop (>768px), bottom on mobile (<=768px) * * Uses data-has-tabs set by TabsScroller to avoid :has() support issues. */ /* Bottom position - fixed at bottom (global setting for all pages) */ /* Note: Primary positioning is handled by TabsScroller component with inline styles. These CSS rules serve as fallback/additional styling. */ [data-tab-position='bottom'] .page-tabs-container, [data-tab-position='bottom'] .admin-tabs-container { position: fixed; top: auto; bottom: 0; left: var(--sidebar-width); right: 0; z-index: 100; padding: 0.5rem; padding-bottom: calc(0.5rem + env(safe-area-inset-bottom, 0px)); } /* Handle collapsed sidebar */ [data-tab-position='bottom'][data-sidebar-collapsed='true'] .page-tabs-container, [data-tab-position='bottom'][data-sidebar-collapsed='true'] .admin-tabs-container { left: var(--sidebar-width-collapsed); } /* Adjust slider styling for bottom position */ [data-tab-position='bottom'] .page-tabs-slider, [data-tab-position='bottom'] .admin-tabs-slider { width: 100%; justify-content: flex-start; } /* Hide title section when bar is at bottom (only on pages with tabs) */ [data-tab-position='bottom'] .page-tabs-slider[data-has-tabs='true'] .page-title-section, [data-tab-position='bottom'] .page-tabs-slider[data-has-tabs='true'] .admin-title-section, [data-tab-position='bottom'] .admin-tabs-slider[data-has-tabs='true'] .page-title-section, [data-tab-position='bottom'] .admin-tabs-slider[data-has-tabs='true'] .admin-title-section { display: none; } /* Hide divider when bar is at bottom */ [data-tab-position='bottom'] .page-tabs-slider .page-tabs-divider, [data-tab-position='bottom'] .page-tabs-slider .admin-tabs-divider, [data-tab-position='bottom'] .admin-tabs-slider .page-tabs-divider, [data-tab-position='bottom'] .admin-tabs-slider .admin-tabs-divider { display: none; } /* Add bottom padding to main content when bar is at bottom */ [data-tab-position='bottom'] .main-content { padding-bottom: calc(72px + env(safe-area-inset-bottom, 0px)); } /* Mobile: full width at bottom */ @media (max-width: 768px) { [data-tab-position='bottom'] .page-tabs-container, [data-tab-position='bottom'] .admin-tabs-container { left: 0; } /* Override collapsed state on mobile */ [data-tab-position='bottom'][data-sidebar-collapsed='true'] .page-tabs-container, [data-tab-position='bottom'][data-sidebar-collapsed='true'] .admin-tabs-container { left: 0; } /* Keep proper spacing for mobile menu button - inherits padding-left: 72px from mobile rules */ } /* Responsive position - top on desktop, bottom on mobile */ @media (max-width: 768px) { [data-tab-position='responsive'] .page-tabs-container, [data-tab-position='responsive'] .admin-tabs-container { position: fixed; top: auto; bottom: 0; left: 0; right: 0; z-index: 100; padding: 0.5rem; padding-bottom: calc(0.5rem + env(safe-area-inset-bottom, 0px)); } [data-tab-position='responsive'] .page-tabs-slider, [data-tab-position='responsive'] .admin-tabs-slider { width: 100%; justify-content: flex-start; /* padding-left: 72px inherited from mobile rules for menu button spacing */ } /* Hide title section when bar is at bottom (only on pages with tabs) */ [data-tab-position='responsive'] .page-tabs-slider[data-has-tabs='true'] .page-title-section, [data-tab-position='responsive'] .page-tabs-slider[data-has-tabs='true'] .admin-title-section, [data-tab-position='responsive'] .admin-tabs-slider[data-has-tabs='true'] .page-title-section, [data-tab-position='responsive'] .admin-tabs-slider[data-has-tabs='true'] .admin-title-section { display: none; } /* Hide divider when bar is at bottom */ [data-tab-position='responsive'] .page-tabs-slider .page-tabs-divider, [data-tab-position='responsive'] .page-tabs-slider .admin-tabs-divider, [data-tab-position='responsive'] .admin-tabs-slider .page-tabs-divider, [data-tab-position='responsive'] .admin-tabs-slider .admin-tabs-divider { display: none; } /* Add bottom padding to main content */ [data-tab-position='responsive'] .main-content { padding-bottom: calc(72px + env(safe-area-inset-bottom, 0px)); } }