Files
OTSSignsTheme/custom/otssignange/css/override.css

1515 lines
36 KiB
CSS
Raw Normal View History

2026-02-04 06:23:04 -05:00
/* ============================================================================
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 <html> or <body> 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;
}