/* ============================================================================ XIBO CMS MODERN THEME - OTS Signance Design Token System & Component Overrides ============================================================================ */ /* --------------------------------------------------------------------------- DESIGN TOKENS - Color Palette, Typography & Spacing --------------------------------------------------------------------------- These CSS variables define the modern design system. Update here to theme entire CMS. Supports light and dark mode via data-theme attr. --------------------------------------------------------------------------- */ :root { /* Color Tokens */ --color-primary: #2563eb; --color-primary-dark: #1d4ed8; --color-primary-light: #3b82f6; --color-primary-lighter: #dbeafe; --color-secondary: #7c3aed; --color-success: #10b981; --color-warning: #f59e0b; --color-danger: #ef4444; --color-info: #0ea5e9; /* Neutral Palette (Gray) */ --color-gray-50: #f9fafb; --color-gray-100: #f3f4f6; --color-gray-200: #e5e7eb; --color-gray-300: #d1d5db; --color-gray-400: #9ca3af; --color-gray-500: #6b7280; --color-gray-600: #4b5563; --color-gray-700: #374151; --color-gray-800: #1f2937; --color-gray-900: #111827; /* Semantic Colors */ --color-background: #ffffff; --color-surface: #f9fafb; --color-surface-elevated: #ffffff; --color-border: #e5e7eb; --color-border-light: #f3f4f6; --color-text-primary: #1f2937; --color-text-secondary: #6b7280; --color-text-tertiary: #9ca3af; --color-text-inverse: #ffffff; /* Component Colors */ --color-link: var(--color-primary); --color-link-hover: var(--color-primary-dark); --color-link-visited: #7c3aed; /* Typography */ --font-family-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --font-family-mono: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Menlo, Courier, monospace; --font-size-xs: 0.75rem; /* 12px */ --font-size-sm: 0.875rem; /* 14px */ --font-size-base: 1rem; /* 16px */ --font-size-lg: 1.125rem; /* 18px */ --font-size-xl: 1.25rem; /* 20px */ --font-size-2xl: 1.5rem; /* 24px */ --font-size-3xl: 1.875rem; /* 30px */ --font-size-4xl: 2.25rem; /* 36px */ --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --line-height-tight: 1.25; --line-height-snug: 1.375; --line-height-normal: 1.5; --line-height-relaxed: 1.625; --line-height-loose: 2; /* Spacing (8px base unit) */ --space-0: 0; --space-1: 0.25rem; /* 4px */ --space-2: 0.5rem; /* 8px */ --space-3: 0.75rem; /* 12px */ --space-4: 1rem; /* 16px */ --space-5: 1.25rem; /* 20px */ --space-6: 1.5rem; /* 24px */ --space-7: 1.75rem; /* 28px */ --space-8: 2rem; /* 32px */ --space-10: 2.5rem; /* 40px */ --space-12: 3rem; /* 48px */ --space-16: 4rem; /* 64px */ --space-20: 5rem; /* 80px */ /* Border Radius */ --radius-none: 0; --radius-sm: 0.25rem; --radius-base: 0.375rem; --radius-md: 0.5rem; --radius-lg: 0.75rem; --radius-xl: 1rem; --radius-2xl: 1.5rem; --radius-full: 9999px; /* Shadows (elevation system) */ --shadow-none: none; --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); --shadow-base: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-md: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); --shadow-xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25); /* Transitions */ --transition-fast: 150ms ease-in-out; --transition-base: 200ms ease-in-out; --transition-slow: 300ms ease-in-out; /* Breakpoints (mobile-first) */ --breakpoint-sm: 640px; --breakpoint-md: 768px; --breakpoint-lg: 1024px; --breakpoint-xl: 1280px; --breakpoint-2xl: 1536px; } /* Dark mode overrides (opt-in) Add data-theme="dark" to or to enable */ :root { color-scheme: light; } :root[data-theme="dark"], body[data-theme="dark"] { --color-background: #0f172a; --color-surface: #1e293b; --color-surface-elevated: #334155; --color-border: #475569; --color-border-light: #1e293b; --color-text-primary: #f1f5f9; --color-text-secondary: #cbd5e1; --color-text-tertiary: #94a3b8; --color-text-inverse: #0f172a; color-scheme: dark; } /* --------------------------------------------------------------------------- GLOBAL STYLES --------------------------------------------------------------------------- */ html { font-size: 16px; } body { background-color: var(--color-background); color: var(--color-text-primary); font-family: var(--font-family-base); font-size: var(--font-size-base); line-height: var(--line-height-normal); transition: background-color var(--transition-base), color var(--transition-base); } /* --------------------------------------------------------------------------- TYPOGRAPHY --------------------------------------------------------------------------- */ h1, h2, h3, h4, h5, h6 { color: var(--color-text-primary); font-weight: var(--font-weight-semibold); line-height: var(--line-height-tight); margin-top: var(--space-6); margin-bottom: var(--space-4); } h1 { font-size: var(--font-size-4xl); } h2 { font-size: var(--font-size-3xl); } h3 { font-size: var(--font-size-2xl); } h4 { font-size: var(--font-size-xl); } h5 { font-size: var(--font-size-lg); } h6 { font-size: var(--font-size-base); text-transform: uppercase; letter-spacing: 0.05em; } p { margin-bottom: var(--space-4); line-height: var(--line-height-relaxed); } small { font-size: var(--font-size-sm); } /* --------------------------------------------------------------------------- LINKS & INTERACTIVE ELEMENTS --------------------------------------------------------------------------- */ a { color: var(--color-link); text-decoration: none; transition: color var(--transition-fast); outline: none; } a:hover { color: var(--color-link-hover); text-decoration: underline; } a:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; border-radius: var(--radius-sm); } /* --------------------------------------------------------------------------- HEADER / NAVIGATION BAR --------------------------------------------------------------------------- */ .row.header { background-color: var(--color-surface-elevated); border-bottom: 1px solid var(--color-border); box-shadow: var(--shadow-xs); padding: var(--space-4); margin-bottom: var(--space-6); } .navbar-default { background-color: var(--color-surface-elevated); border-bottom: 1px solid var(--color-border); border-radius: 0; box-shadow: none; margin-bottom: 0; } .navbar-default .navbar-brand { color: var(--color-primary); font-weight: var(--font-weight-bold); font-size: var(--font-size-lg); padding: var(--space-2) var(--space-4); } .navbar-default .navbar-nav > li > a { color: var(--color-text-primary); font-weight: var(--font-weight-normal); padding: var(--space-3) var(--space-4); transition: color var(--transition-fast), background-color var(--transition-fast); } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus, .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus, .navbar-default .navbar-nav > .show > a, .navbar-default .navbar-nav > .show > a:hover, .navbar-default .navbar-nav > .show > a:focus { background-color: var(--color-primary-lighter); color: var(--color-primary-dark); } /* --------------------------------------------------------------------------- SIDEBAR NAVIGATION --------------------------------------------------------------------------- */ #sidebar-wrapper { background-color: var(--color-surface); border-right: 1px solid var(--color-border); } ul.sidebar .sidebar-main a, .sidebar-footer { background-color: var(--color-primary); color: var(--color-text-inverse); padding: var(--space-4); } ul.sidebar .sidebar-main a:hover { background-color: var(--color-primary-dark); } ul.sidebar .sidebar-title a { color: var(--color-primary); font-weight: var(--font-weight-semibold); font-size: var(--font-size-sm); text-transform: uppercase; letter-spacing: 0.05em; padding: var(--space-3) var(--space-4); } ul.sidebar .sidebar-list a { color: var(--color-text-primary); padding: var(--space-3) var(--space-4); padding-left: var(--space-6); transition: background-color var(--transition-fast), color var(--transition-fast); border-left: 3px solid transparent; } ul.sidebar .sidebar-list a:hover, ul.sidebar .sidebar-list a:focus, #page-wrapper:not(.active) ul.sidebar .sidebar-title.separator { background-color: var(--color-primary-lighter); color: var(--color-primary); border-left-color: var(--color-primary); } ul.sidebar .sidebar-list a.active { background-color: var(--color-primary-lighter); color: var(--color-primary); border-left-color: var(--color-primary); font-weight: var(--font-weight-semibold); } /* Mobile: hamburger toggle for sidebar */ @media (max-width: 768px) { #sidebar-wrapper { position: absolute; top: 0; left: -100%; width: 100%; max-width: 250px; height: 100vh; transition: left var(--transition-base); z-index: 999; } #sidebar-wrapper.active { left: 0; } #page-wrapper { margin-left: 0; } } /* --------------------------------------------------------------------------- WELL & CONTAINER COMPONENTS --------------------------------------------------------------------------- */ .well { background-color: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-6); margin-bottom: var(--space-6); box-shadow: var(--shadow-xs); } .well.well-sm { padding: var(--space-4); } .well.well-lg { padding: var(--space-8); } /* --------------------------------------------------------------------------- WIDGET CARD STYLING --------------------------------------------------------------------------- */ .widget { background-color: var(--color-surface-elevated); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); overflow: hidden; transition: box-shadow var(--transition-base), transform var(--transition-base); } .widget:hover { box-shadow: var(--shadow-base); transform: translateY(-1px); } .widget .widget-title { background-color: var(--color-primary-lighter); color: var(--color-primary); font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); padding: var(--space-4) var(--space-6); margin: 0; border-bottom: 1px solid var(--color-border); display: flex; justify-content: space-between; align-items: center; } .widget-body { padding: var(--space-6); } .widget-footer { background-color: var(--color-surface); border-top: 1px solid var(--color-border); padding: var(--space-4) var(--space-6); } /* Dashboard grid responsiveness */ .dashboard-widget-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--space-6); margin-bottom: var(--space-8); } @media (max-width: 768px) { .dashboard-widget-container { grid-template-columns: 1fr; gap: var(--space-4); } } /* --------------------------------------------------------------------------- BUTTONS & FORM CONTROLS --------------------------------------------------------------------------- */ button, .btn { font-family: var(--font-family-base); font-size: var(--font-size-base); font-weight: var(--font-weight-medium); padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); border: 1px solid transparent; cursor: pointer; transition: all var(--transition-fast); text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); } .btn:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; } .btn-primary { background-color: var(--color-primary); color: var(--color-text-inverse); border-color: var(--color-primary); } .btn-primary:hover { background-color: var(--color-primary-dark); border-color: var(--color-primary-dark); } .btn-secondary { background-color: var(--color-gray-200); color: var(--color-text-primary); border-color: var(--color-gray-300); } .btn-secondary:hover { background-color: var(--color-gray-300); border-color: var(--color-gray-400); } .btn-success { background-color: var(--color-success); color: var(--color-text-inverse); } .btn-success:hover { background-color: #059669; } .btn-danger { background-color: var(--color-danger); color: var(--color-text-inverse); } .btn-danger:hover { background-color: #dc2626; } /* --------------------------------------------------------------------------- FORM ELEMENTS --------------------------------------------------------------------------- */ input[type="text"], input[type="email"], input[type="password"], input[type="search"], input[type="url"], input[type="number"], input[type="date"], input[type="time"], textarea, select { background-color: var(--color-background); border: 1px solid var(--color-border); border-radius: var(--radius-md); color: var(--color-text-primary); font-family: var(--font-family-base); font-size: var(--font-size-base); padding: var(--space-3) var(--space-4); transition: border-color var(--transition-fast), box-shadow var(--transition-fast); } input[type="text"]:focus, input[type="email"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="url"]:focus, input[type="number"]:focus, input[type="date"]:focus, input[type="time"]:focus, textarea:focus, select:focus { outline: none; border-color: var(--color-primary); box-shadow: 0 0 0 3px var(--color-primary-lighter); } /* --------------------------------------------------------------------------- ALERTS & MESSAGES --------------------------------------------------------------------------- */ .alert { border-radius: var(--radius-md); padding: var(--space-4) var(--space-6); margin-bottom: var(--space-6); border-left: 4px solid; } .alert-success { background-color: #d1fae5; border-color: var(--color-success); color: #047857; } .alert-danger { background-color: #fee2e2; border-color: var(--color-danger); color: #991b1b; } .alert-warning { background-color: #fef3c7; border-color: var(--color-warning); color: #92400e; } .alert-info { background-color: #cffafe; border-color: var(--color-info); color: #0c4a6e; } /* --------------------------------------------------------------------------- TABLES --------------------------------------------------------------------------- */ table { width: 100%; border-collapse: collapse; margin-bottom: var(--space-6); } thead { background-color: var(--color-surface); border-bottom: 2px solid var(--color-border); } th { color: var(--color-text-primary); font-weight: var(--font-weight-semibold); padding: var(--space-4); text-align: left; } td { border-bottom: 1px solid var(--color-border); padding: var(--space-4); } tbody tr:hover { background-color: var(--color-surface); } /* --------------------------------------------------------------------------- RESPONSIVE GRID & LAYOUT --------------------------------------------------------------------------- Note: Do not override Bootstrap grid classes (row/col/container) here. These overrides can shift button placement and layout flow in Xibo. Use component-specific wrappers instead. --------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------- UTILITIES --------------------------------------------------------------------------- */ .text-muted { color: var(--color-text-secondary); } .text-danger { color: var(--color-danger); } .text-success { color: var(--color-success); } .text-warning { color: var(--color-warning); } .text-info { color: var(--color-info); } .bg-light { background-color: var(--color-surface); } .bg-white { background-color: var(--color-background); } .border { border: 1px solid var(--color-border); } .rounded { border-radius: var(--radius-md); } .shadow { box-shadow: var(--shadow-base); } /* --------------------------------------------------------------------------- DASHBOARD VIEW (custom override) --------------------------------------------------------------------------- */ .dashboard-modern { --dashboard-bg: #0b1224; --dashboard-surface: #0f172a; --dashboard-surface-2: #111b32; --dashboard-border: rgba(148, 163, 184, 0.18); --dashboard-text: #e2e8f0; --dashboard-text-muted: #94a3b8; --dashboard-accent: #22c55e; display: flex; flex-direction: column; gap: var(--space-6); background: radial-gradient(1200px 600px at 0% 0%, #0f1a3a 0%, #0b1224 45%, #0a1020 100%); color: var(--dashboard-text); border-radius: var(--radius-lg); padding: var(--space-6); } .dashboard-hero { background-color: transparent; border: none; border-radius: 0; padding: 0; display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); box-shadow: none; } .dashboard-hero__title h1 { margin: 0; color: var(--dashboard-text); font-size: var(--font-size-3xl); } .dashboard-hero__title p { margin: var(--space-2) 0 0 0; color: var(--dashboard-text-muted); } .dashboard-hero__actions { display: flex; gap: var(--space-3); flex-wrap: wrap; } .dashboard-hero__actions .btn-icon { width: 40px; height: 40px; border-radius: var(--radius-md); background-color: #ffffff; color: #0f172a; font-size: 1.25rem; line-height: 1; border: 1px solid rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-xs); } .dashboard-hero__actions .btn-icon:hover { transform: translateY(-1px); box-shadow: var(--shadow-sm); } @media (max-width: 768px) { .dashboard-hero { flex-direction: column; align-items: flex-start; } } /* Dashboard widget cards */ .dashboard-modern .widget, .dashboard-modern .well, .dashboard-modern .panel { background-color: var(--dashboard-surface); border: 1px solid var(--dashboard-border); box-shadow: none; color: var(--dashboard-text); } .dashboard-modern .widget .widget-title, .dashboard-modern .panel-heading, .dashboard-modern .well h1, .dashboard-modern .well h2, .dashboard-modern .well h3 { background-color: transparent; color: var(--dashboard-text); border-bottom: 1px solid var(--dashboard-border); } .dashboard-modern .widget-body, .dashboard-modern .panel-body { background-color: transparent; color: var(--dashboard-text); } .dashboard-modern .text-muted, .dashboard-modern .muted, .dashboard-modern .help-block { color: var(--dashboard-text-muted); } .dashboard-modern table, .dashboard-modern thead, .dashboard-modern tbody, .dashboard-modern th, .dashboard-modern td { color: var(--dashboard-text); border-color: var(--dashboard-border); } .dashboard-modern a { color: #60a5fa; } .dashboard-modern a:hover { color: #93c5fd; } .dashboard-modern .btn-primary { background-color: #0ea5e9; border-color: #0ea5e9; color: #0b1224; } .dashboard-modern .btn-secondary { background-color: transparent; border-color: var(--dashboard-border); color: var(--dashboard-text); } /* Spacing utilities */ .m-0 { margin: 0; } .mt-4 { margin-top: var(--space-4); } .mb-4 { margin-bottom: var(--space-4); } .mt-6 { margin-top: var(--space-6); } .mb-6 { margin-bottom: var(--space-6); } .p-4 { padding: var(--space-4); } .p-6 { padding: var(--space-6); } .px-4 { padding-left: var(--space-4); padding-right: var(--space-4); } .py-4 { padding-top: var(--space-4); padding-bottom: var(--space-4); } .gap-4 { gap: var(--space-4); } .gap-6 { gap: var(--space-6); } /* --------------------------------------------------------------------------- GLOBAL LAYOUT & SHELL --------------------------------------------------------------------------- */ #page-wrapper { background-color: var(--color-background); min-height: 100vh; } .page-title, .page-title h1, .page-title h2 { color: var(--color-text-primary); font-weight: var(--font-weight-semibold); } .breadcrumb { background: transparent; margin-bottom: var(--space-4); padding: 0; } .breadcrumb > li + li:before { color: var(--color-text-tertiary); } /* --------------------------------------------------------------------------- TOP NAVIGATION --------------------------------------------------------------------------- */ .navbar-default { background-color: var(--color-surface-elevated); border-bottom: 1px solid var(--color-border); } .navbar-default .navbar-brand { display: flex; align-items: center; gap: var(--space-2); } .navbar-default .navbar-nav > li > a { color: var(--color-text-primary); font-weight: var(--font-weight-medium); } .navbar-default .navbar-nav > li > a .badge, .navbar-default .navbar-nav > li > a .label { margin-left: var(--space-2); } .navbar-default .dropdown-menu { border: 1px solid var(--color-border); box-shadow: var(--shadow-sm); border-radius: var(--radius-md); padding: var(--space-2); } .navbar-default .dropdown-menu > li > a { padding: var(--space-2) var(--space-4); border-radius: var(--radius-sm); } .navbar-default .dropdown-menu > li > a:hover { background-color: var(--color-primary-lighter); color: var(--color-primary-dark); } /* --------------------------------------------------------------------------- SIDEBAR NAVIGATION (enhanced) --------------------------------------------------------------------------- */ ul.sidebar .sidebar-title.separator { padding: var(--space-2) var(--space-4); color: var(--color-text-tertiary); text-transform: uppercase; letter-spacing: 0.08em; font-size: var(--font-size-xs); } ul.sidebar .sidebar-list a .icon { margin-right: var(--space-2); } /* --------------------------------------------------------------------------- CARDS & PANELS --------------------------------------------------------------------------- */ .card, .panel, .panel-default { background-color: var(--color-surface-elevated); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-xs); overflow: hidden; } .card-header, .panel-heading { background-color: var(--color-surface); border-bottom: 1px solid var(--color-border); padding: var(--space-4) var(--space-6); font-weight: var(--font-weight-semibold); } .card-body, .panel-body { padding: var(--space-6); } .card-footer, .panel-footer { background-color: var(--color-surface); border-top: 1px solid var(--color-border); padding: var(--space-4) var(--space-6); } /* --------------------------------------------------------------------------- BUTTONS (sizes & variants) --------------------------------------------------------------------------- */ .btn-sm { padding: var(--space-2) var(--space-3); font-size: var(--font-size-sm); border-radius: var(--radius-sm); } .btn-lg { padding: var(--space-4) var(--space-6); font-size: var(--font-size-lg); border-radius: var(--radius-lg); } .btn-outline { background-color: transparent; border-color: var(--color-border); color: var(--color-text-primary); } .btn-outline:hover { background-color: var(--color-primary-lighter); color: var(--color-primary-dark); border-color: var(--color-primary-light); } /* --------------------------------------------------------------------------- FORMS & INPUTS (Bootstrap compatible) --------------------------------------------------------------------------- */ .form-control { background-color: var(--color-background); border: 1px solid var(--color-border); border-radius: var(--radius-md); box-shadow: none; transition: border-color var(--transition-fast), box-shadow var(--transition-fast); } .form-control:focus { border-color: var(--color-primary); box-shadow: 0 0 0 3px var(--color-primary-lighter); } .input-group-addon, .input-group-text { background-color: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); } .control-label, label { color: var(--color-text-secondary); font-weight: var(--font-weight-medium); } /* --------------------------------------------------------------------------- TABLES & DATA GRIDS --------------------------------------------------------------------------- */ .table, table.table { background-color: var(--color-surface-elevated); border: 1px solid var(--color-border); border-radius: var(--radius-lg); overflow: hidden; } .table > thead > tr > th, table.table > thead > tr > th { background-color: var(--color-surface); color: var(--color-text-primary); font-weight: var(--font-weight-semibold); border-bottom: 1px solid var(--color-border); padding: var(--space-4); } .table > tbody > tr > td, table.table > tbody > tr > td { padding: var(--space-4); border-bottom: 1px solid var(--color-border); } .table-striped > tbody > tr:nth-of-type(odd) { background-color: var(--color-surface); } .table-hover > tbody > tr:hover { background-color: var(--color-primary-lighter); } .dataTables_wrapper .dataTables_filter input, .dataTables_wrapper .dataTables_length select { border-radius: var(--radius-md); border: 1px solid var(--color-border); padding: var(--space-2) var(--space-3); } /* --------------------------------------------------------------------------- TABS & NAV PILLS --------------------------------------------------------------------------- */ .nav-tabs { border-bottom: 1px solid var(--color-border); } .nav-tabs > li > a { border: 1px solid transparent; border-radius: var(--radius-md) var(--radius-md) 0 0; color: var(--color-text-secondary); padding: var(--space-3) var(--space-4); } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { background-color: var(--color-surface-elevated); border-color: var(--color-border); color: var(--color-text-primary); } .nav-pills > li > a { border-radius: var(--radius-full); padding: var(--space-2) var(--space-4); } /* --------------------------------------------------------------------------- BADGES & LABELS --------------------------------------------------------------------------- */ .badge, .label { border-radius: var(--radius-full); padding: 0.2em 0.6em; font-weight: var(--font-weight-semibold); } .label-success, .badge-success { background-color: var(--color-success); } .label-danger, .badge-danger { background-color: var(--color-danger); } .label-warning, .badge-warning { background-color: var(--color-warning); } .label-info, .badge-info { background-color: var(--color-info); } /* --------------------------------------------------------------------------- MODALS --------------------------------------------------------------------------- */ .modal-content { border-radius: var(--radius-lg); border: 1px solid var(--color-border); box-shadow: var(--shadow-lg); } .modal-header { background-color: var(--color-surface); border-bottom: 1px solid var(--color-border); padding: var(--space-4) var(--space-6); } .modal-title { font-weight: var(--font-weight-semibold); } .modal-body { padding: var(--space-6); } .modal-footer { background-color: var(--color-surface); border-top: 1px solid var(--color-border); padding: var(--space-4) var(--space-6); } /* --------------------------------------------------------------------------- PAGINATION --------------------------------------------------------------------------- */ .pagination > li > a, .pagination > li > span { border: 1px solid var(--color-border); color: var(--color-text-primary); border-radius: var(--radius-md); margin: 0 var(--space-1); } .pagination > .active > a, .pagination > .active > span { background-color: var(--color-primary); border-color: var(--color-primary); color: var(--color-text-inverse); } /* --------------------------------------------------------------------------- TWO-COLUMN LAYOUT (Displays, Media Library) --------------------------------------------------------------------------- */ .ots-theme.two-column-layout { display: flex; gap: var(--space-4); padding: var(--space-6); min-height: calc(100vh - var(--topbar-height, 60px) - var(--space-6) * 2); } .ots-theme .left-panel { flex: 0 0 260px; background-color: var(--color-surface); border-radius: var(--radius-lg); border: 1px solid var(--color-border); padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-4); } .ots-theme .left-panel .panel-header { display: flex; justify-content: space-between; align-items: center; gap: var(--space-2); } .ots-theme .left-panel h3 { margin: 0; font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); text-transform: uppercase; color: var(--color-text-secondary); letter-spacing: 0.05em; } .ots-theme .folder-tree { display: flex; flex-direction: column; gap: var(--space-1); } .ots-theme .folder-item { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3); border-radius: var(--radius-md); cursor: pointer; user-select: none; transition: background-color 150ms ease; font-size: var(--font-size-sm); } .ots-theme .folder-item:hover { background-color: var(--color-border-light); } .ots-theme .folder-item.active { background-color: var(--color-primary-lighter); color: var(--color-primary); font-weight: var(--font-weight-semibold); } .ots-theme .folder-icon { display: inline-block; font-size: 1.2em; flex: 0 0 auto; } .ots-theme .folder-name { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ots-theme .content-panel { flex: 1; display: flex; flex-direction: column; gap: var(--space-6); } .ots-theme .page-header { padding-bottom: var(--space-4); border-bottom: 1px solid var(--color-border); } .ots-theme .page-header h1 { margin: 0 0 var(--space-1) 0; font-size: var(--font-size-3xl); font-weight: var(--font-weight-bold); } .ots-theme .page-header .text-muted { margin: 0; color: var(--color-text-secondary); } .ots-theme .content-toolbar { display: flex; justify-content: space-between; align-items: center; gap: var(--space-4); flex-wrap: wrap; } .ots-theme .search-field { flex: 1; min-width: 200px; max-width: 400px; } .ots-theme .toolbar-actions { display: flex; gap: var(--space-3); align-items: center; } .ots-theme .stat-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--space-4); } .ots-theme .stat-box { background-color: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-4); text-align: center; } .ots-theme .stat-label { display: block; font-size: var(--font-size-sm); color: var(--color-text-secondary); margin-bottom: var(--space-1); text-transform: uppercase; letter-spacing: 0.05em; } .ots-theme .stat-value { display: block; font-size: var(--font-size-2xl); font-weight: var(--font-weight-bold); color: var(--color-text-primary); } .ots-theme .stat-value.text-success { color: var(--color-success); } .ots-theme .stat-value.text-danger { color: var(--color-danger); } /* Table wrapper for sticky header */ .ots-theme .table-wrapper { background-color: var(--color-surface); border-radius: var(--radius-lg); border: 1px solid var(--color-border); overflow-x: auto; } .ots-theme .table-wrapper .table { margin-bottom: 0; } .ots-theme .table-wrapper th { position: sticky; top: 0; background-color: var(--color-surface-elevated); font-weight: var(--font-weight-semibold); z-index: 10; } /* Media Grid */ .ots-theme .media-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: var(--space-6); padding: var(--space-6); background-color: var(--color-surface); border-radius: var(--radius-lg); border: 1px solid var(--color-border); min-height: 300px; } .ots-theme .media-item { background-color: var(--color-background); border-radius: var(--radius-lg); border: 1px solid var(--color-border); overflow: hidden; transition: all 200ms ease; cursor: pointer; } .ots-theme .media-item:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); } .ots-theme .media-item-thumbnail { width: 100%; aspect-ratio: 4 / 3; background-color: var(--color-surface); display: flex; align-items: center; justify-content: center; font-size: 2em; border-bottom: 1px solid var(--color-border); } .ots-theme .media-item-info { padding: var(--space-3); } .ots-theme .media-item-name { font-weight: var(--font-weight-semibold); font-size: var(--font-size-sm); margin: 0 0 var(--space-1) 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .ots-theme .media-item-size { font-size: var(--font-size-xs); color: var(--color-text-secondary); margin: 0; } .ots-theme .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--space-12); text-align: center; } .ots-theme .empty-icon { font-size: 3em; margin-bottom: var(--space-4); } .ots-theme .empty-state h3 { margin: 0 0 var(--space-2) 0; font-size: var(--font-size-xl); color: var(--color-text-primary); } .ots-theme .empty-state p { margin: 0 0 var(--space-6) 0; color: var(--color-text-secondary); max-width: 300px; } /* --------------------------------------------------------------------------- RESPONSIVE ADJUSTMENTS --------------------------------------------------------------------------- */ @media (max-width: 1024px) { .ots-theme.two-column-layout { flex-direction: column; } .ots-theme .left-panel { flex: 1; } .ots-theme.two-column-layout .left-panel { max-width: 100%; } } @media (max-width: 768px) { .ots-theme.two-column-layout { padding: var(--space-4); gap: var(--space-3); } .ots-theme .content-toolbar { flex-direction: column; align-items: stretch; } .ots-theme .search-field { max-width: 100%; } .ots-theme .toolbar-actions { flex-direction: column; } .ots-theme .toolbar-actions .btn { width: 100%; } .ots-theme .media-grid { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: var(--space-4); padding: var(--space-4); } .ots-theme .page-header h1 { font-size: var(--font-size-2xl); } } /* --------------------------------------------------------------------------- DARK MODE OVERRIDES FOR COMPONENTS --------------------------------------------------------------------------- */ [data-theme="dark"] .ots-theme .left-panel { background-color: var(--color-surface); border-color: var(--color-border); } [data-theme="dark"] .ots-theme .folder-item:hover { background-color: var(--color-gray-700); } [data-theme="dark"] .ots-theme .stat-box, [data-theme="dark"] .ots-theme .table-wrapper, [data-theme="dark"] .ots-theme .media-grid { background-color: var(--color-surface); border-color: var(--color-border); } [data-theme="dark"] .ots-theme .media-item { background-color: var(--color-gray-800); border-color: var(--color-border); } [data-theme="dark"] .ots-theme .media-item:hover { background-color: var(--color-gray-750); } [data-theme="dark"] .ots-theme .table-wrapper th { background-color: var(--color-gray-800); } /* --------------------------------------------------------------------------- UTILITY CLASSES --------------------------------------------------------------------------- */ .ots-theme .btn-icon-sm { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border: none; background-color: transparent; border-radius: var(--radius-md); cursor: pointer; transition: background-color 150ms ease; font-size: 1em; } .ots-theme .btn-icon-sm:hover { background-color: var(--color-border-light); } .ots-theme .text-muted { color: var(--color-text-secondary) !important; } .ots-theme .text-success { color: var(--color-success) !important; } .ots-theme .text-danger { color: var(--color-danger) !important; } .ots-theme .text-warning { color: var(--color-warning) !important; } .ots-theme .text-info { color: var(--color-info) !important; }