| | |
| | :root { |
| | |
| | --bg-primary: #0d1117; |
| | --bg-secondary: #161b22; |
| | --bg-tertiary: #21262d; |
| | --bg-overlay: rgba(13, 17, 23, 0.8); |
| | |
| | --border-primary: #30363d; |
| | --border-secondary: #21262d; |
| | |
| | --text-primary: #e6edf3; |
| | --text-secondary: #7d8590; |
| | --text-tertiary: #656d76; |
| | |
| | --accent-blue: #58a6ff; |
| | --accent-green: #3fb950; |
| | --accent-red: #f85149; |
| | --accent-yellow: #d29922; |
| | --accent-purple: #a5a4ff; |
| | |
| | |
| | --gradient-primary: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 50%, var(--bg-tertiary) 100%); |
| | --gradient-accent: linear-gradient(135deg, var(--accent-blue), #79c0ff); |
| | |
| | |
| | --spacing-xs: 0.25rem; |
| | --spacing-sm: 0.5rem; |
| | --spacing-md: 1rem; |
| | --spacing-lg: 1.5rem; |
| | --spacing-xl: 2rem; |
| | --spacing-2xl: 3rem; |
| | |
| | |
| | --radius-sm: 4px; |
| | --radius-md: 8px; |
| | --radius-lg: 12px; |
| | --radius-xl: 16px; |
| | |
| | |
| | --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3); |
| | --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.3); |
| | --shadow-lg: 0 8px 12px rgba(0, 0, 0, 0.4); |
| | --shadow-xl: 0 12px 20px rgba(0, 0, 0, 0.5); |
| | |
| | |
| | --sidebar-width: 280px; |
| | --sidebar-collapsed: 80px; |
| | --header-height: 70px; |
| | |
| | |
| | --transition-fast: 0.15s ease; |
| | --transition-normal: 0.3s ease; |
| | --transition-slow: 0.5s ease; |
| | } |
| |
|
| | |
| | * { |
| | margin: 0; |
| | padding: 0; |
| | box-sizing: border-box; |
| | } |
| |
|
| | html { |
| | font-size: 16px; |
| | scroll-behavior: smooth; |
| | } |
| |
|
| | body { |
| | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif; |
| | background: var(--gradient-primary); |
| | color: var(--text-primary); |
| | line-height: 1.6; |
| | overflow-x: hidden; |
| | min-height: 100vh; |
| | } |
| |
|
| | |
| | ::-webkit-scrollbar { |
| | width: 8px; |
| | height: 8px; |
| | } |
| |
|
| | ::-webkit-scrollbar-track { |
| | background: var(--bg-secondary); |
| | } |
| |
|
| | ::-webkit-scrollbar-thumb { |
| | background: var(--border-primary); |
| | border-radius: var(--radius-sm); |
| | } |
| |
|
| | ::-webkit-scrollbar-thumb:hover { |
| | background: var(--text-tertiary); |
| | } |
| |
|
| | |
| | .loading-overlay { |
| | position: fixed; |
| | top: 0; |
| | left: 0; |
| | width: 100%; |
| | height: 100%; |
| | background: var(--bg-overlay); |
| | display: flex; |
| | flex-direction: column; |
| | align-items: center; |
| | justify-content: center; |
| | z-index: 9999; |
| | backdrop-filter: blur(10px); |
| | transition: opacity var(--transition-normal); |
| | } |
| |
|
| | .loading-overlay.hidden { |
| | opacity: 0; |
| | pointer-events: none; |
| | } |
| |
|
| | .spinner { |
| | width: 40px; |
| | height: 40px; |
| | border: 3px solid var(--border-primary); |
| | border-top: 3px solid var(--accent-blue); |
| | border-radius: 50%; |
| | animation: spin 1s linear infinite; |
| | margin-bottom: var(--spacing-md); |
| | } |
| |
|
| | @keyframes spin { |
| | 0% { transform: rotate(0deg); } |
| | 100% { transform: rotate(360deg); } |
| | } |
| |
|
| | |
| | .app-container { |
| | display: flex; |
| | min-height: 100vh; |
| | } |
| |
|
| | |
| | .sidebar { |
| | width: var(--sidebar-width); |
| | background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%); |
| | border-right: 1px solid var(--border-primary); |
| | display: flex; |
| | flex-direction: column; |
| | position: fixed; |
| | top: 0; |
| | left: 0; |
| | height: 100vh; |
| | z-index: 1000; |
| | transition: transform var(--transition-normal); |
| | } |
| |
|
| | .sidebar.collapsed { |
| | width: var(--sidebar-collapsed); |
| | } |
| |
|
| | .sidebar-header { |
| | padding: var(--spacing-xl) var(--spacing-lg); |
| | border-bottom: 1px solid var(--border-primary); |
| | display: flex; |
| | align-items: center; |
| | justify-content: space-between; |
| | min-height: var(--header-height); |
| | } |
| |
|
| | .logo { |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-md); |
| | } |
| |
|
| | .logo i { |
| | font-size: 1.5rem; |
| | color: var(--accent-blue); |
| | } |
| |
|
| | .logo h3 { |
| | font-size: 1.1rem; |
| | font-weight: 700; |
| | line-height: 1.2; |
| | background: var(--gradient-accent); |
| | background-clip: text; |
| | -webkit-background-clip: text; |
| | -webkit-text-fill-color: transparent; |
| | } |
| |
|
| | .logo span { |
| | font-size: 0.85rem; |
| | font-weight: 400; |
| | } |
| |
|
| | .sidebar-toggle { |
| | background: none; |
| | border: none; |
| | color: var(--text-secondary); |
| | cursor: pointer; |
| | padding: var(--spacing-sm); |
| | border-radius: var(--radius-sm); |
| | transition: var(--transition-fast); |
| | display: none; |
| | } |
| |
|
| | .sidebar-toggle:hover { |
| | background: var(--bg-primary); |
| | color: var(--text-primary); |
| | } |
| |
|
| | |
| | .nav-menu { |
| | list-style: none; |
| | padding: var(--spacing-lg) 0; |
| | flex: 1; |
| | } |
| |
|
| | .nav-item { |
| | margin: var(--spacing-xs) var(--spacing-md); |
| | } |
| |
|
| | .nav-link { |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-md); |
| | padding: var(--spacing-md) var(--spacing-lg); |
| | color: var(--text-secondary); |
| | text-decoration: none; |
| | border-radius: var(--radius-md); |
| | transition: var(--transition-fast); |
| | font-weight: 500; |
| | } |
| |
|
| | .nav-link:hover { |
| | background: var(--bg-primary); |
| | color: var(--text-primary); |
| | transform: translateX(2px); |
| | } |
| |
|
| | .nav-item.active .nav-link { |
| | background: linear-gradient(135deg, var(--accent-blue), #4493f8); |
| | color: white; |
| | box-shadow: var(--shadow-md); |
| | } |
| |
|
| | .nav-link i { |
| | font-size: 1.1rem; |
| | width: 20px; |
| | text-align: center; |
| | } |
| |
|
| | |
| | .sidebar-footer { |
| | padding: var(--spacing-lg); |
| | border-top: 1px solid var(--border-primary); |
| | } |
| |
|
| | .system-status { |
| | margin-bottom: var(--spacing-lg); |
| | } |
| |
|
| | .status-item { |
| | display: flex; |
| | justify-content: space-between; |
| | align-items: center; |
| | padding: var(--spacing-sm) 0; |
| | } |
| |
|
| | .status-label { |
| | font-size: 0.85rem; |
| | color: var(--text-secondary); |
| | font-weight: 500; |
| | } |
| |
|
| | .status-indicator { |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-sm); |
| | font-size: 0.8rem; |
| | } |
| |
|
| | .status-indicator.online i { |
| | color: var(--accent-green); |
| | } |
| |
|
| | .status-indicator.offline i { |
| | color: var(--accent-red); |
| | } |
| |
|
| | .status-indicator.checking i { |
| | color: var(--accent-yellow); |
| | animation: pulse 1.5s ease-in-out infinite; |
| | } |
| |
|
| | @keyframes pulse { |
| | 0%, 100% { opacity: 1; } |
| | 50% { opacity: 0.5; } |
| | } |
| |
|
| | .sidebar-actions { |
| | margin-bottom: var(--spacing-lg); |
| | } |
| |
|
| | .version-info { |
| | text-align: center; |
| | color: var(--text-tertiary); |
| | font-size: 0.75rem; |
| | line-height: 1.4; |
| | } |
| |
|
| | |
| | .main-content { |
| | flex: 1; |
| | margin-left: var(--sidebar-width); |
| | display: flex; |
| | flex-direction: column; |
| | min-height: 100vh; |
| | transition: margin-left var(--transition-normal); |
| | } |
| |
|
| | .sidebar.collapsed ~ .main-content { |
| | margin-left: var(--sidebar-collapsed); |
| | } |
| |
|
| | |
| | .main-header { |
| | background: var(--bg-secondary); |
| | border-bottom: 1px solid var(--border-primary); |
| | padding: 0 var(--spacing-xl); |
| | height: var(--header-height); |
| | display: flex; |
| | align-items: center; |
| | justify-content: space-between; |
| | position: sticky; |
| | top: 0; |
| | z-index: 100; |
| | backdrop-filter: blur(10px); |
| | } |
| |
|
| | .header-left { |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-lg); |
| | } |
| |
|
| | .mobile-menu-btn { |
| | background: none; |
| | border: none; |
| | color: var(--text-secondary); |
| | cursor: pointer; |
| | padding: var(--spacing-sm); |
| | border-radius: var(--radius-sm); |
| | transition: var(--transition-fast); |
| | display: none; |
| | position: relative; |
| | z-index: 1001; |
| | |
| | pointer-events: auto; |
| | |
| | -webkit-tap-highlight-color: transparent; |
| | touch-action: manipulation; |
| | } |
| |
|
| | .mobile-menu-btn:hover { |
| | background: var(--bg-tertiary); |
| | color: var(--text-primary); |
| | } |
| |
|
| | #pageTitle { |
| | font-size: 1.5rem; |
| | font-weight: 600; |
| | background: var(--gradient-accent); |
| | background-clip: text; |
| | -webkit-background-clip: text; |
| | -webkit-text-fill-color: transparent; |
| | } |
| |
|
| | .header-actions { |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-md); |
| | } |
| |
|
| | |
| | .content-container { |
| | flex: 1; |
| | padding: var(--spacing-xl); |
| | position: relative; |
| | } |
| |
|
| | .page-content { |
| | display: none; |
| | animation: fadeIn var(--transition-normal); |
| | } |
| |
|
| | .page-content.active { |
| | display: block; |
| | } |
| |
|
| | @keyframes fadeIn { |
| | from { opacity: 0; transform: translateY(20px); } |
| | to { opacity: 1; transform: translateY(0); } |
| | } |
| |
|
| | |
| | .btn { |
| | display: inline-flex; |
| | align-items: center; |
| | gap: var(--spacing-sm); |
| | padding: var(--spacing-sm) var(--spacing-md); |
| | border: none; |
| | border-radius: var(--radius-md); |
| | font-weight: 600; |
| | font-size: 0.9rem; |
| | text-decoration: none; |
| | cursor: pointer; |
| | transition: var(--transition-fast); |
| | background: none; |
| | color: var(--text-primary); |
| | } |
| |
|
| | .btn:disabled { |
| | opacity: 0.5; |
| | cursor: not-allowed; |
| | } |
| |
|
| | .btn-primary { |
| | background: linear-gradient(135deg, var(--accent-blue), #4493f8); |
| | color: white; |
| | box-shadow: var(--shadow-sm); |
| | } |
| |
|
| | .btn-primary:hover:not(:disabled) { |
| | background: linear-gradient(135deg, #4493f8, #357abd); |
| | box-shadow: var(--shadow-md); |
| | transform: translateY(-1px); |
| | } |
| |
|
| | .btn-secondary { |
| | background: var(--bg-tertiary); |
| | border: 1px solid var(--border-primary); |
| | } |
| |
|
| | .btn-secondary:hover:not(:disabled) { |
| | background: var(--border-primary); |
| | transform: translateY(-1px); |
| | } |
| |
|
| | .btn-success { |
| | background: linear-gradient(135deg, var(--accent-green), #46954a); |
| | color: white; |
| | } |
| |
|
| | .btn-success:hover:not(:disabled) { |
| | background: linear-gradient(135deg, #46954a, #2f7d32); |
| | transform: translateY(-1px); |
| | } |
| |
|
| | .btn-danger { |
| | background: linear-gradient(135deg, var(--accent-red), #ff6b6b); |
| | color: white; |
| | } |
| |
|
| | .btn-danger:hover:not(:disabled) { |
| | background: linear-gradient(135deg, #ff6b6b, #e53e3e); |
| | transform: translateY(-1px); |
| | } |
| |
|
| | .btn-refresh { |
| | background: var(--bg-tertiary); |
| | border: 1px solid var(--border-primary); |
| | width: 100%; |
| | justify-content: center; |
| | padding: var(--spacing-md); |
| | } |
| |
|
| | .btn-refresh:hover { |
| | background: var(--bg-primary); |
| | } |
| |
|
| | .btn-sm { |
| | padding: var(--spacing-xs) var(--spacing-sm); |
| | font-size: 0.8rem; |
| | } |
| |
|
| | .btn-lg { |
| | padding: var(--spacing-md) var(--spacing-xl); |
| | font-size: 1rem; |
| | } |
| |
|
| | |
| | .card { |
| | background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%); |
| | border: 1px solid var(--border-primary); |
| | border-radius: var(--radius-lg); |
| | padding: var(--spacing-xl); |
| | box-shadow: var(--shadow-md); |
| | transition: var(--transition-normal); |
| | position: relative; |
| | overflow: hidden; |
| | } |
| |
|
| | .card::before { |
| | content: ''; |
| | position: absolute; |
| | top: 0; |
| | left: 0; |
| | right: 0; |
| | height: 3px; |
| | background: var(--gradient-accent); |
| | } |
| |
|
| | .card:hover { |
| | transform: translateY(-2px); |
| | box-shadow: var(--shadow-lg); |
| | } |
| |
|
| | .card-header { |
| | display: flex; |
| | align-items: center; |
| | justify-content: space-between; |
| | margin-bottom: var(--spacing-lg); |
| | } |
| |
|
| | .card-title { |
| | font-size: 1.25rem; |
| | font-weight: 600; |
| | color: var(--text-primary); |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-sm); |
| | } |
| |
|
| | .card-title i { |
| | color: var(--accent-blue); |
| | } |
| |
|
| | .card-body { |
| | color: var(--text-secondary); |
| | line-height: 1.6; |
| | } |
| |
|
| | |
| | .metric-card { |
| | text-align: center; |
| | padding: var(--spacing-lg); |
| | background: var(--bg-tertiary); |
| | border-radius: var(--radius-lg); |
| | border: 1px solid var(--border-primary); |
| | transition: var(--transition-normal); |
| | position: relative; |
| | overflow: hidden; |
| | } |
| |
|
| | .metric-card::before { |
| | content: ''; |
| | position: absolute; |
| | top: 0; |
| | left: 0; |
| | right: 0; |
| | height: 3px; |
| | background: linear-gradient(90deg, var(--accent-blue), #79c0ff, #a5f3fc); |
| | } |
| |
|
| | .metric-card:hover { |
| | transform: translateY(-2px); |
| | box-shadow: var(--shadow-md); |
| | } |
| |
|
| | .metric-title { |
| | font-size: 0.85rem; |
| | font-weight: 600; |
| | color: var(--text-secondary); |
| | text-transform: uppercase; |
| | letter-spacing: 0.5px; |
| | margin-bottom: var(--spacing-sm); |
| | } |
| |
|
| | .metric-value { |
| | font-size: 2rem; |
| | font-weight: 800; |
| | background: var(--gradient-accent); |
| | background-clip: text; |
| | -webkit-background-clip: text; |
| | -webkit-text-fill-color: transparent; |
| | margin-bottom: var(--spacing-xs); |
| | } |
| |
|
| | .metric-change { |
| | font-size: 0.8rem; |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | gap: var(--spacing-xs); |
| | } |
| |
|
| | .metric-change.positive { |
| | color: var(--accent-green); |
| | } |
| |
|
| | .metric-change.negative { |
| | color: var(--accent-red); |
| | } |
| |
|
| | |
| | .grid { |
| | display: grid; |
| | gap: var(--spacing-lg); |
| | } |
| |
|
| | .grid-2 { grid-template-columns: repeat(2, 1fr); } |
| | .grid-3 { grid-template-columns: repeat(3, 1fr); } |
| | .grid-4 { grid-template-columns: repeat(4, 1fr); } |
| |
|
| | |
| | .form-group { |
| | margin-bottom: var(--spacing-lg); |
| | } |
| |
|
| | .form-label { |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | font-weight: 600; |
| | color: var(--text-primary); |
| | margin-bottom: var(--spacing-sm); |
| | font-size: 0.9rem; |
| | } |
| |
|
| | .form-input, |
| | .form-select, |
| | .form-textarea { |
| | width: 100%; |
| | padding: var(--spacing-md); |
| | background: var(--bg-tertiary); |
| | border: 1px solid var(--border-primary); |
| | border-radius: var(--radius-md); |
| | color: var(--text-primary); |
| | font-size: 0.9rem; |
| | transition: var(--transition-fast); |
| | } |
| |
|
| | .form-select { |
| | -webkit-appearance: none; |
| | -moz-appearance: none; |
| | appearance: none; |
| | padding-right: 3rem; |
| | background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23c9d1d9' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 6l3 3 3-3'/%3E%3C/svg%3E"); |
| | background-repeat: no-repeat; |
| | background-position: right 0.75rem center; |
| | background-size: 16px; |
| | } |
| |
|
| | .form-input:focus, |
| | .form-select:focus, |
| | .form-textarea:focus { |
| | outline: none; |
| | border-color: var(--accent-blue); |
| | box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.3); |
| | } |
| |
|
| | .form-input::placeholder { |
| | color: var(--text-tertiary); |
| | } |
| |
|
| | .form-textarea { |
| | min-height: 100px; |
| | resize: vertical; |
| | } |
| |
|
| | .form-help { |
| | font-size: 0.8rem; |
| | color: var(--text-tertiary); |
| | margin-top: var(--spacing-xs); |
| | } |
| |
|
| | |
| | .table-container { |
| | background: var(--bg-secondary); |
| | border-radius: var(--radius-lg); |
| | border: 1px solid var(--border-primary); |
| | overflow: hidden; |
| | box-shadow: var(--shadow-md); |
| | } |
| |
|
| | .table { |
| | width: 100%; |
| | border-collapse: collapse; |
| | } |
| |
|
| | .table th, |
| | .table td { |
| | padding: var(--spacing-md) var(--spacing-lg); |
| | text-align: left; |
| | border-bottom: 1px solid var(--border-primary); |
| | } |
| |
|
| | .table th { |
| | background: var(--bg-tertiary); |
| | font-weight: 600; |
| | color: var(--text-primary); |
| | font-size: 0.9rem; |
| | text-transform: uppercase; |
| | letter-spacing: 0.5px; |
| | } |
| |
|
| | .table td { |
| | color: var(--text-secondary); |
| | } |
| |
|
| | .table tbody tr:hover { |
| | background: rgba(88, 166, 255, 0.1); |
| | } |
| |
|
| | |
| | .badge { |
| | display: inline-flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | padding: var(--spacing-xs) var(--spacing-sm); |
| | border-radius: var(--radius-lg); |
| | font-size: 0.75rem; |
| | font-weight: 600; |
| | text-transform: uppercase; |
| | letter-spacing: 0.5px; |
| | } |
| |
|
| | .badge-success { |
| | background: rgba(63, 185, 80, 0.2); |
| | color: var(--accent-green); |
| | border: 1px solid rgba(63, 185, 80, 0.3); |
| | } |
| |
|
| | .badge-warning { |
| | background: rgba(210, 153, 34, 0.2); |
| | color: var(--accent-yellow); |
| | border: 1px solid rgba(210, 153, 34, 0.3); |
| | } |
| |
|
| | .badge-error { |
| | background: rgba(248, 81, 73, 0.2); |
| | color: var(--accent-red); |
| | border: 1px solid rgba(248, 81, 73, 0.3); |
| | } |
| |
|
| | .badge-info { |
| | background: rgba(88, 166, 255, 0.2); |
| | color: var(--accent-blue); |
| | border: 1px solid rgba(88, 166, 255, 0.3); |
| | } |
| |
|
| | |
| | .toast-container { |
| | position: fixed; |
| | top: var(--spacing-xl); |
| | right: var(--spacing-xl); |
| | z-index: 9999; |
| | display: flex; |
| | flex-direction: column; |
| | gap: var(--spacing-md); |
| | } |
| |
|
| | .toast { |
| | background: var(--bg-secondary); |
| | border: 1px solid var(--border-primary); |
| | border-radius: var(--radius-md); |
| | padding: var(--spacing-md); |
| | box-shadow: var(--shadow-lg); |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-md); |
| | max-width: 400px; |
| | animation: slideIn var(--transition-normal); |
| | position: relative; |
| | overflow: hidden; |
| | } |
| |
|
| | .toast::before { |
| | content: ''; |
| | position: absolute; |
| | left: 0; |
| | top: 0; |
| | bottom: 0; |
| | width: 4px; |
| | } |
| |
|
| | .toast.success::before { background: var(--accent-green); } |
| | .toast.error::before { background: var(--accent-red); } |
| | .toast.warning::before { background: var(--accent-yellow); } |
| | .toast.info::before { background: var(--accent-blue); } |
| |
|
| | .toast-icon { |
| | font-size: 1.2rem; |
| | } |
| |
|
| | .toast.success .toast-icon { color: var(--accent-green); } |
| | .toast.error .toast-icon { color: var(--accent-red); } |
| | .toast.warning .toast-icon { color: var(--accent-yellow); } |
| | .toast.info .toast-icon { color: var(--accent-blue); } |
| |
|
| | .toast-content { |
| | flex: 1; |
| | } |
| |
|
| | .toast-title { |
| | font-weight: 600; |
| | color: var(--text-primary); |
| | margin-bottom: var(--spacing-xs); |
| | } |
| |
|
| | .toast-message { |
| | color: var(--text-secondary); |
| | font-size: 0.9rem; |
| | } |
| |
|
| | .toast-close { |
| | background: none; |
| | border: none; |
| | color: var(--text-tertiary); |
| | cursor: pointer; |
| | padding: var(--spacing-xs); |
| | border-radius: var(--radius-sm); |
| | transition: var(--transition-fast); |
| | } |
| |
|
| | .toast-close:hover { |
| | background: var(--bg-tertiary); |
| | color: var(--text-primary); |
| | } |
| |
|
| | @keyframes slideIn { |
| | from { |
| | transform: translateX(100%); |
| | opacity: 0; |
| | } |
| | to { |
| | transform: translateX(0); |
| | opacity: 1; |
| | } |
| | } |
| |
|
| | |
| | @media (max-width: 1024px) { |
| | :root { |
| | --sidebar-width: 250px; |
| | } |
| | |
| | .grid-4 { grid-template-columns: repeat(2, 1fr); } |
| | .grid-3 { grid-template-columns: repeat(2, 1fr); } |
| | } |
| |
|
| | @media (max-width: 768px) { |
| | :root { |
| | --spacing-xl: 1rem; |
| | } |
| |
|
| | .sidebar { |
| | transform: translateX(-100%); |
| | |
| | transition: transform var(--transition-normal); |
| | } |
| |
|
| | .sidebar.open { |
| | transform: translateX(0); |
| | z-index: 999; |
| | |
| | position: fixed; |
| | top: 0; |
| | left: 0; |
| | height: 100vh; |
| | } |
| |
|
| | |
| | .main-content.sidebar-open::before { |
| | content: ''; |
| | position: fixed; |
| | top: 0; |
| | left: 0; |
| | right: 0; |
| | bottom: 0; |
| | background: rgba(0, 0, 0, 0.5); |
| | z-index: 998; |
| | opacity: 1; |
| | pointer-events: auto; |
| | transition: opacity var(--transition-normal); |
| | } |
| | |
| | .main-content { |
| | margin-left: 0; |
| | } |
| | |
| | .mobile-menu-btn { |
| | display: block; |
| | } |
| | |
| | .sidebar-toggle { |
| | display: block; |
| | } |
| | |
| | .grid-2 { |
| | grid-template-columns: 1fr; |
| | } |
| |
|
| | .grid-3, |
| | .grid-4 { |
| | grid-template-columns: repeat(2, 1fr); |
| | } |
| |
|
| | |
| | .metric-card { |
| | padding: var(--spacing-md); |
| | } |
| |
|
| | .metric-title { |
| | font-size: 0.75rem; |
| | margin-bottom: calc(var(--spacing-sm) * 0.5); |
| | } |
| |
|
| | .metric-value { |
| | font-size: 1.6rem; |
| | } |
| |
|
| | .metric-change { |
| | font-size: 0.75rem; |
| | } |
| |
|
| | .main-header { |
| | padding: 0 var(--spacing-lg); |
| | } |
| | |
| | .content-container { |
| | padding: var(--spacing-lg); |
| | } |
| | |
| | .toast-container { |
| | top: var(--spacing-lg); |
| | right: var(--spacing-lg); |
| | left: var(--spacing-lg); |
| | } |
| | |
| | .toast { |
| | max-width: none; |
| | } |
| | } |
| |
|
| | @media (max-width: 480px) { |
| | .metric-value { |
| | font-size: 1.5rem; |
| | } |
| | |
| | .card { |
| | padding: var(--spacing-lg); |
| | } |
| | |
| | .table th, |
| | .table td { |
| | padding: var(--spacing-sm) var(--spacing-md); |
| | } |
| | } |
| |
|
| | |
| | @media (prefers-color-scheme: dark) { |
| | |
| | } |
| |
|
| | |
| | .text-center { text-align: center; } |
| | .text-left { text-align: left; } |
| | .text-right { text-align: right; } |
| |
|
| | .mb-0 { margin-bottom: 0; } |
| | .mb-1 { margin-bottom: var(--spacing-xs); } |
| | .mb-2 { margin-bottom: var(--spacing-sm); } |
| | .mb-3 { margin-bottom: var(--spacing-md); } |
| | .mb-4 { margin-bottom: var(--spacing-lg); } |
| | .mb-5 { margin-bottom: var(--spacing-xl); } |
| |
|
| | .mt-0 { margin-top: 0; } |
| | .mt-1 { margin-top: var(--spacing-xs); } |
| | .mt-2 { margin-top: var(--spacing-sm); } |
| | .mt-3 { margin-top: var(--spacing-md); } |
| | .mt-4 { margin-top: var(--spacing-lg); } |
| | .mt-5 { margin-top: var(--spacing-xl); } |
| |
|
| | .d-none { display: none; } |
| | .d-block { display: block; } |
| | .d-flex { display: flex; } |
| | .d-grid { display: grid; } |
| |
|
| | .justify-center { justify-content: center; } |
| | .justify-between { justify-content: space-between; } |
| | .align-center { align-items: center; } |
| |
|
| | .w-full { width: 100%; } |
| |
|
| | |
| | .settings-page .form-actions { |
| | display: flex; |
| | gap: 1rem; |
| | margin-top: 2rem; |
| | padding-top: 2rem; |
| | border-top: 1px solid var(--border-color); |
| | } |
| |
|
| | .system-info-grid { |
| | display: grid; |
| | grid-template-columns: 1fr; |
| | gap: 0.75rem; |
| | } |
| |
|
| | .info-row { |
| | display: flex; |
| | justify-content: space-between; |
| | align-items: center; |
| | padding: 0.5rem 0; |
| | border-bottom: 1px solid var(--border-muted); |
| | } |
| |
|
| | .info-row:last-child { |
| | border-bottom: none; |
| | } |
| |
|
| | .info-label { |
| | font-weight: 600; |
| | color: var(--text-primary); |
| | } |
| |
|
| | .info-value { |
| | color: var(--text-secondary); |
| | font-family: var(--font-mono); |
| | } |
| |
|
| | .connection-status { |
| | display: flex; |
| | align-items: center; |
| | gap: 0.5rem; |
| | padding: 1rem; |
| | border-radius: 8px; |
| | font-weight: 500; |
| | } |
| |
|
| | .connection-status.success { |
| | background: var(--success-bg); |
| | border: 1px solid var(--success-border); |
| | color: var(--success-text); |
| | } |
| |
|
| | .connection-status.error { |
| | background: var(--danger-bg); |
| | border: 1px solid var(--danger-border); |
| | color: var(--danger-text); |
| | } |
| |
|
| | .connection-status.testing { |
| | background: var(--warning-bg); |
| | border: 1px solid var(--warning-border); |
| | color: var(--warning-text); |
| | } |
| |
|
| | .connection-status.unknown { |
| | background: var(--surface-secondary); |
| | border: 1px solid var(--border-color); |
| | color: var(--text-secondary); |
| | } |
| |
|
| | .connection-status small { |
| | font-size: 0.8rem; |
| | opacity: 0.8; |
| | } |
| |
|
| | .spinner-sm { |
| | width: 16px; |
| | height: 16px; |
| | border: 2px solid transparent; |
| | border-top: 2px solid currentColor; |
| | border-radius: 50%; |
| | animation: spin 1s linear infinite; |
| | } |
| |
|
| | .form-help { |
| | display: block; |
| | margin-top: 0.25rem; |
| | font-size: 0.8rem; |
| | color: var(--text-muted); |
| | } |
| |
|
| | |
| | .login-container { |
| | min-height: 100vh; |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | background: var(--background-primary); |
| | padding: 2rem; |
| | } |
| |
|
| | .login-card { |
| | width: 100%; |
| | max-width: 400px; |
| | background: var(--surface-primary); |
| | border: 1px solid var(--border-color); |
| | border-radius: 12px; |
| | padding: 2rem; |
| | box-shadow: var(--shadow-lg); |
| | } |
| |
|
| | .login-header { |
| | text-align: center; |
| | margin-bottom: 2rem; |
| | } |
| |
|
| | .login-header h1 { |
| | font-size: 1.8rem; |
| | font-weight: 700; |
| | color: var(--text-primary); |
| | margin-bottom: 0.5rem; |
| | } |
| |
|
| | .login-header p { |
| | color: var(--text-secondary); |
| | font-size: 0.9rem; |
| | } |
| |
|
| | .login-form { |
| | display: flex; |
| | flex-direction: column; |
| | gap: 1.5rem; |
| | } |
| |
|
| | .login-form .form-group { |
| | margin-bottom: 0; |
| | } |
| |
|
| | .login-form .btn { |
| | width: 100%; |
| | padding: 0.75rem; |
| | font-size: 1rem; |
| | font-weight: 600; |
| | } |
| |
|
| | .login-footer { |
| | text-align: center; |
| | margin-top: 2rem; |
| | padding-top: 2rem; |
| | border-top: 1px solid var(--border-color); |
| | font-size: 0.8rem; |
| | color: var(--text-muted); |
| | } |
| |
|
| | |
| | .input-group { |
| | position: relative; |
| | display: flex; |
| | } |
| |
|
| | .input-group .form-input { |
| | padding-right: 3rem; |
| | } |
| |
|
| | .input-group-btn { |
| | position: absolute; |
| | right: 0; |
| | top: 0; |
| | bottom: 0; |
| | padding: 0 0.75rem; |
| | background: none; |
| | border: none; |
| | color: var(--text-secondary); |
| | cursor: pointer; |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | transition: color 0.2s ease; |
| | } |
| |
|
| | .input-group-btn:hover { |
| | color: var(--text-primary); |
| | } |
| |
|
| | .input-group-btn:focus { |
| | outline: 2px solid var(--primary-color); |
| | outline-offset: -2px; |
| | border-radius: 4px; |
| | } |
| |
|
| | |
| | .user-profile { |
| | display: flex; |
| | align-items: center; |
| | gap: 1rem; |
| | } |
| |
|
| | .user-email { |
| | font-size: 0.9rem; |
| | color: var(--text-secondary); |
| | line-height: 1.6; |
| | padding: 0.25rem 0; |
| | min-height: 1.8rem; |
| | } |
| |
|
| | |
| | .loading-overlay { |
| | position: fixed; |
| | top: 0; |
| | left: 0; |
| | right: 0; |
| | bottom: 0; |
| | background: rgba(13, 17, 23, 0.9); |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | z-index: 9999; |
| | backdrop-filter: blur(4px); |
| | } |
| |
|
| | .loading-overlay.hidden { |
| | display: none; |
| | } |
| |
|
| | .loading-overlay .loading-content { |
| | text-align: center; |
| | color: var(--text-primary); |
| | } |
| |
|
| | .loading-overlay .spinner { |
| | margin-bottom: 1rem; |
| | } |
| | .h-full { height: 100%; } |
| |
|
| | |
| | .modal-overlay { |
| | position: fixed; |
| | top: 0; |
| | left: 0; |
| | right: 0; |
| | bottom: 0; |
| | background: rgba(13, 17, 23, 0.9); |
| | backdrop-filter: blur(4px); |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | z-index: 10000; |
| | opacity: 0; |
| | visibility: hidden; |
| | transition: all 0.3s ease; |
| | } |
| |
|
| | .modal-overlay.active { |
| | opacity: 1; |
| | visibility: visible; |
| | } |
| |
|
| | .modal { |
| | background: var(--bg-secondary); |
| | border: 1px solid var(--border-primary); |
| | border-radius: var(--radius-lg); |
| | box-shadow: var(--shadow-xl); |
| | max-height: 90vh; |
| | overflow-y: auto; |
| | width: 90%; |
| | max-width: 500px; |
| | transform: scale(0.9) translateY(20px); |
| | transition: transform 0.3s ease; |
| | } |
| |
|
| | .modal-overlay.active .modal { |
| | transform: scale(1) translateY(0); |
| | } |
| |
|
| | .modal-lg { |
| | max-width: 700px; |
| | } |
| |
|
| | .modal-sm { |
| | max-width: 400px; |
| | } |
| |
|
| | .modal-header { |
| | display: flex; |
| | align-items: center; |
| | justify-content: space-between; |
| | padding: var(--spacing-lg); |
| | border-bottom: 1px solid var(--border-primary); |
| | } |
| |
|
| | .modal-title { |
| | margin: 0; |
| | color: var(--text-primary); |
| | font-size: 1.2rem; |
| | font-weight: 600; |
| | } |
| |
|
| | .modal-close { |
| | background: none; |
| | border: none; |
| | color: var(--text-secondary); |
| | cursor: pointer; |
| | padding: var(--spacing-sm); |
| | border-radius: var(--radius-sm); |
| | transition: color 0.2s ease; |
| | } |
| |
|
| | .modal-close:hover { |
| | color: var(--text-primary); |
| | background: var(--bg-tertiary); |
| | } |
| |
|
| | .modal-body { |
| | padding: var(--spacing-lg); |
| | } |
| |
|
| | .modal-actions { |
| | display: flex; |
| | gap: var(--spacing-md); |
| | justify-content: flex-end; |
| | margin-top: var(--spacing-lg); |
| | padding-top: var(--spacing-lg); |
| | border-top: 1px solid var(--border-primary); |
| | } |
| |
|
| | |
| | .license-form .form-group { |
| | margin-bottom: var(--spacing-lg); |
| | } |
| |
|
| | .license-form .form-label { |
| | display: block; |
| | margin-bottom: var(--spacing-sm); |
| | color: var(--text-primary); |
| | font-weight: 500; |
| | } |
| |
|
| | .license-form .form-input, |
| | .license-form .form-select, |
| | .license-form .form-textarea { |
| | width: 100%; |
| | padding: var(--spacing-md); |
| | background: var(--bg-tertiary); |
| | border: 1px solid var(--border-primary); |
| | border-radius: var(--radius-md); |
| | color: var(--text-primary); |
| | font-size: 0.9rem; |
| | transition: border-color 0.2s ease; |
| | } |
| |
|
| | .license-form .form-select { |
| | -webkit-appearance: none; |
| | -moz-appearance: none; |
| | appearance: none; |
| | padding-right: 3rem; |
| | background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23c9d1d9' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 6l3 3 3-3'/%3E%3C/svg%3E"); |
| | background-repeat: no-repeat; |
| | background-position: right 0.75rem center; |
| | background-size: 16px; |
| | } |
| |
|
| | .license-form .form-input:focus, |
| | .license-form .form-select:focus, |
| | .license-form .form-textarea:focus { |
| | outline: none; |
| | border-color: var(--accent-blue); |
| | box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.2); |
| | } |
| |
|
| | .license-form .form-textarea { |
| | resize: vertical; |
| | min-height: 80px; |
| | } |
| |
|
| | |
| | .confirm-dialog { |
| | text-align: center; |
| | padding: var(--spacing-lg); |
| | } |
| |
|
| | .confirm-dialog p { |
| | margin-bottom: var(--spacing-lg); |
| | color: var(--text-primary); |
| | font-size: 1rem; |
| | line-height: 1.4; |
| | } |
| |
|
| | |
| | .table-container { |
| | overflow-x: auto; |
| | border-radius: var(--radius-md); |
| | border: 1px solid var(--border-primary); |
| | } |
| |
|
| | .table { |
| | width: 100%; |
| | border-collapse: collapse; |
| | background: var(--bg-secondary); |
| | font-size: 0.9rem; |
| | } |
| |
|
| | .table th, |
| | .table td { |
| | padding: var(--spacing-md); |
| | text-align: left; |
| | border-bottom: 1px solid var(--border-primary); |
| | vertical-align: top; |
| | } |
| |
|
| | .table th { |
| | background: var(--bg-tertiary); |
| | color: var(--text-primary); |
| | font-weight: 600; |
| | white-space: nowrap; |
| | position: sticky; |
| | top: 0; |
| | z-index: 1; |
| | } |
| |
|
| | .table tr:hover { |
| | background: rgba(88, 166, 255, 0.05); |
| | } |
| |
|
| | |
| | .user-info { |
| | min-width: 200px; |
| | } |
| |
|
| | .user-name { |
| | color: var(--text-primary); |
| | font-weight: 600; |
| | margin-bottom: var(--spacing-xs); |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-sm); |
| | } |
| |
|
| |
|
| | .license-created { |
| | color: var(--text-tertiary); |
| | font-size: 0.75rem; |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-sm); |
| | } |
| |
|
| | |
| | .license-code-cell { |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-sm); |
| | min-width: 150px; |
| | } |
| |
|
| | .license-code { |
| | background: var(--bg-tertiary); |
| | padding: var(--spacing-xs) var(--spacing-sm); |
| | border-radius: var(--radius-sm); |
| | font-family: 'Courier New', monospace; |
| | font-size: 0.8rem; |
| | color: var(--accent-blue); |
| | border: 1px solid var(--border-primary); |
| | } |
| |
|
| | .btn-copy { |
| | background: none; |
| | border: none; |
| | color: var(--text-secondary); |
| | cursor: pointer; |
| | padding: var(--spacing-xs); |
| | border-radius: var(--radius-sm); |
| | transition: all 0.2s ease; |
| | } |
| |
|
| | .btn-copy:hover { |
| | color: var(--accent-blue); |
| | background: var(--bg-tertiary); |
| | } |
| |
|
| | |
| | .hardware-id { |
| | font-family: 'Courier New', monospace; |
| | color: var(--text-secondary); |
| | font-size: 0.8rem; |
| | max-width: 120px; |
| | word-break: break-all; |
| | } |
| |
|
| | |
| | .badge { |
| | display: inline-flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | padding: var(--spacing-xs) var(--spacing-sm); |
| | border-radius: var(--radius-sm); |
| | font-size: 0.75rem; |
| | font-weight: 600; |
| | white-space: nowrap; |
| | } |
| |
|
| | .badge-success { |
| | background: rgba(63, 185, 80, 0.15); |
| | color: var(--accent-green); |
| | border: 1px solid rgba(63, 185, 80, 0.3); |
| | } |
| |
|
| | .badge-warning { |
| | background: rgba(210, 153, 34, 0.15); |
| | color: var(--accent-yellow); |
| | border: 1px solid rgba(210, 153, 34, 0.3); |
| | } |
| |
|
| | .badge-danger { |
| | background: rgba(248, 81, 73, 0.15); |
| | color: var(--accent-red); |
| | border: 1px solid rgba(248, 81, 73, 0.3); |
| | } |
| |
|
| | .badge-secondary { |
| | background: rgba(125, 133, 144, 0.15); |
| | color: var(--text-secondary); |
| | border: 1px solid rgba(125, 133, 144, 0.3); |
| | } |
| |
|
| | .badge-error { |
| | background: rgba(248, 81, 73, 0.15); |
| | color: var(--accent-red); |
| | border: 1px solid rgba(248, 81, 73, 0.3); |
| | } |
| |
|
| | |
| | .expires-info { |
| | min-width: 140px; |
| | } |
| |
|
| | .expires-date { |
| | color: var(--text-primary); |
| | margin-bottom: var(--spacing-xs); |
| | font-size: 0.8rem; |
| | } |
| |
|
| | .expiry-warning { |
| | font-size: 0.7rem; |
| | padding: 2px var(--spacing-xs); |
| | border-radius: var(--radius-sm); |
| | display: flex; |
| | align-items: center; |
| | gap: 4px; |
| | } |
| |
|
| | .expiry-warning.expired { |
| | background: rgba(248, 81, 73, 0.15); |
| | color: var(--accent-red); |
| | } |
| |
|
| | .expiry-warning.warning { |
| | background: rgba(210, 153, 34, 0.15); |
| | color: var(--accent-yellow); |
| | } |
| |
|
| | .expiry-warning.info { |
| | background: rgba(88, 166, 255, 0.15); |
| | color: var(--accent-blue); |
| | } |
| |
|
| | |
| | .last-used { |
| | color: var(--text-secondary); |
| | font-size: 0.8rem; |
| | } |
| |
|
| | |
| | .action-buttons { |
| | display: flex; |
| | gap: var(--spacing-xs); |
| | align-items: center; |
| | } |
| |
|
| | .action-buttons .btn { |
| | min-width: auto; |
| | padding: var(--spacing-xs); |
| | border-radius: var(--radius-sm); |
| | } |
| |
|
| | |
| | @media (max-width: 1200px) { |
| | .table { |
| | font-size: 0.8rem; |
| | } |
| | |
| | .table th, |
| | .table td { |
| | padding: var(--spacing-sm); |
| | } |
| | |
| | .user-info { |
| | min-width: 150px; |
| | } |
| | } |
| |
|
| | @media (max-width: 768px) { |
| | .table-container { |
| | font-size: 0.75rem; |
| | } |
| | |
| | .table th, |
| | .table td { |
| | padding: var(--spacing-xs); |
| | } |
| | |
| | .user-info { |
| | min-width: 120px; |
| | } |
| | |
| | .license-code-cell { |
| | min-width: 100px; |
| | } |
| | |
| | .action-buttons .btn { |
| | font-size: 0.7rem; |
| | padding: 4px 6px; |
| | } |
| | } |
| |
|
| | |
| | .border-bottom { |
| | border-bottom: 1px solid var(--border-primary) !important; |
| | } |
| |
|
| | |
| | .licenses-grid { |
| | display: flex; |
| | flex-direction: column; |
| | gap: var(--spacing-sm); |
| | margin-top: var(--spacing-md); |
| | } |
| |
|
| | .license-card-compact { |
| | background: var(--bg-secondary); |
| | border: 1px solid var(--border-primary); |
| | border-radius: var(--radius-md); |
| | overflow: hidden; |
| | transition: all 0.2s ease; |
| | height: fit-content; |
| | } |
| |
|
| | .license-card-compact:hover { |
| | border-color: var(--accent-blue); |
| | box-shadow: 0 4px 12px rgba(88, 166, 255, 0.1); |
| | transform: translateY(-2px); |
| | } |
| |
|
| | |
| | .card-header-compact { |
| | display: flex; |
| | justify-content: space-between; |
| | align-items: center; |
| | padding: var(--spacing-sm) var(--spacing-md); |
| | border-bottom: 1px solid var(--border-primary); |
| | background: var(--bg-tertiary); |
| | min-height: 60px; |
| | } |
| |
|
| | .user-section { |
| | flex: 1; |
| | min-width: 0; |
| | } |
| |
|
| | .user-name { |
| | color: var(--text-primary); |
| | font-weight: 600; |
| | font-size: 0.95rem; |
| | margin-bottom: 2px; |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | line-height: 1.3; |
| | } |
| |
|
| | .user-email { |
| | font-size: 0.9rem; |
| | color: var(--text-secondary); |
| | line-height: 1.6; |
| | padding: 0.25rem 0; |
| | min-height: 1.8rem; |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-sm); |
| | overflow: hidden; |
| | text-overflow: ellipsis; |
| | white-space: nowrap; |
| | } |
| |
|
| | .status-section { |
| | flex: 1; |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | padding: var(--spacing-xs) 0; |
| | } |
| |
|
| | |
| | .card-body-compact { |
| | padding: var(--spacing-md); |
| | } |
| |
|
| | .info-grid { |
| | display: flex; |
| | flex-direction: column; |
| | gap: var(--spacing-sm); |
| | } |
| |
|
| | .info-item { |
| | display: flex; |
| | flex-direction: column; |
| | gap: 4px; |
| | } |
| |
|
| | .info-label { |
| | color: var(--text-secondary); |
| | font-size: 0.75rem; |
| | font-weight: 500; |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | line-height: 1.2; |
| | } |
| |
|
| | .info-value { |
| | color: var(--text-primary); |
| | font-size: 0.85rem; |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | line-height: 1.3; |
| | flex-wrap: wrap; |
| | } |
| |
|
| | .info-value .license-code { |
| | font-size: 0.75rem; |
| | padding: 2px 6px; |
| | margin-right: var(--spacing-xs); |
| | } |
| |
|
| | .info-value .hardware-id { |
| | font-family: 'Courier New', monospace; |
| | font-size: 0.75rem; |
| | color: var(--text-secondary); |
| | word-break: break-word; |
| | line-height: 1.2; |
| | } |
| |
|
| | .info-value .expires-date { |
| | font-size: 0.8rem; |
| | line-height: 1.2; |
| | } |
| |
|
| | .info-value .last-used { |
| | font-size: 0.8rem; |
| | color: var(--text-secondary); |
| | line-height: 1.2; |
| | } |
| |
|
| | |
| | .card-footer-compact { |
| | display: flex; |
| | justify-content: space-between; |
| | align-items: center; |
| | padding: var(--spacing-sm) var(--spacing-md); |
| | border-top: 1px solid var(--border-primary); |
| | background: rgba(33, 38, 45, 0.3); |
| | min-height: 44px; |
| | } |
| |
|
| | .created-info { |
| | color: var(--text-tertiary); |
| | font-size: 0.75rem; |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | line-height: 1.2; |
| | } |
| |
|
| | .action-buttons { |
| | display: flex; |
| | gap: 6px; |
| | } |
| |
|
| | |
| |
|
| | .action-buttons .btn { |
| | padding: 6px 10px; |
| | font-size: 0.75rem; |
| | min-width: auto; |
| | line-height: 1; |
| | } |
| |
|
| | |
| | .info-value .expiry-warning { |
| | margin-top: 3px; |
| | font-size: 0.7rem; |
| | padding: 2px 6px; |
| | line-height: 1.1; |
| | } |
| |
|
| | |
| | @media (max-width: 1200px) { |
| | .licenses-grid { |
| | grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); |
| | gap: var(--spacing-sm); |
| | } |
| | } |
| |
|
| | @media (max-width: 768px) { |
| | .licenses-grid { |
| | grid-template-columns: 1fr; |
| | gap: var(--spacing-sm); |
| | } |
| | |
| | .license-card-compact { |
| | margin: 0; |
| | } |
| | |
| | .card-header-compact { |
| | flex-direction: column; |
| | gap: var(--spacing-sm); |
| | align-items: stretch; |
| | } |
| | |
| | .status-section { |
| | margin-left: 0; |
| | text-align: right; |
| | } |
| | |
| | .info-grid { |
| | gap: var(--spacing-xs); |
| | } |
| | |
| | .card-footer-compact { |
| | flex-direction: column; |
| | gap: var(--spacing-sm); |
| | align-items: stretch; |
| | } |
| | } |
| |
|
| | |
| | .license-card-horizontal { |
| | background: var(--bg-secondary); |
| | border: 1px solid var(--border-primary); |
| | border-radius: var(--radius-md); |
| | overflow: hidden; |
| | transition: all 0.2s ease; |
| | height: fit-content; |
| | margin-bottom: var(--spacing-sm); |
| | } |
| |
|
| | .license-card-horizontal:hover { |
| | border-color: var(--accent-blue); |
| | box-shadow: 0 4px 12px rgba(88, 166, 255, 0.1); |
| | transform: translateY(-2px); |
| | } |
| |
|
| | |
| | .card-header-horizontal { |
| | display: flex; |
| | align-items: center; |
| | padding: var(--spacing-sm) var(--spacing-md); |
| | border-bottom: 1px solid var(--border-primary); |
| | background: var(--bg-tertiary); |
| | min-height: 56px; |
| | } |
| |
|
| | .card-header-horizontal .user-section { |
| | flex: 1; |
| | } |
| |
|
| | .card-header-horizontal .status-section { |
| | margin-left: auto; |
| | justify-content: flex-end; |
| | flex: none; |
| | } |
| |
|
| | .card-header-horizontal .action-buttons { |
| | margin-left: var(--spacing-sm); |
| | } |
| |
|
| | .card-header-horizontal .user-name { |
| | margin: 0; |
| | padding: 0; |
| | margin-bottom: 2px; |
| | font-size: 0.9rem; |
| | line-height: 1.2; |
| | } |
| |
|
| | .card-header-horizontal .user-email { |
| | margin: 0; |
| | padding: 0; |
| | font-size: 0.75rem; |
| | line-height: 1.1; |
| | } |
| |
|
| | |
| | .card-body-horizontal { |
| | display: flex; |
| | min-height: 80px; |
| | } |
| |
|
| | .info-column { |
| | flex: 1; |
| | padding: var(--spacing-sm) var(--spacing-md); |
| | border-right: 1px solid var(--border-primary); |
| | display: flex; |
| | flex-direction: column; |
| | justify-content: center; |
| | min-width: 0; |
| | } |
| |
|
| | .info-column:nth-child(1) { |
| | flex: 1.5; |
| | } |
| |
|
| | .info-column:nth-child(2) { |
| | flex: 1.5; |
| | } |
| |
|
| | .info-column:nth-child(3) { |
| | flex: 1.5; |
| | } |
| |
|
| | .info-column:nth-child(4) { |
| | flex: 1.3; |
| | } |
| |
|
| | .info-column:nth-child(5) { |
| | flex: 1.0; |
| | } |
| |
|
| | .info-column:last-child { |
| | border-right: none; |
| | } |
| |
|
| | .column-header { |
| | color: var(--text-secondary); |
| | font-size: 0.75rem; |
| | font-weight: 600; |
| | text-transform: uppercase; |
| | letter-spacing: 0.5px; |
| | margin-bottom: var(--spacing-xs); |
| | white-space: nowrap; |
| | overflow: hidden; |
| | text-overflow: ellipsis; |
| | } |
| |
|
| | .column-content { |
| | color: var(--text-primary); |
| | font-size: 0.9rem; |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | min-height: 24px; |
| | } |
| |
|
| | |
| | .license-code-compact { |
| | background: var(--bg-primary); |
| | color: var(--accent-blue); |
| | padding: 2px 6px; |
| | border-radius: var(--radius-sm); |
| | font-family: 'JetBrains Mono', 'Consolas', monospace; |
| | font-size: 0.8rem; |
| | border: 1px solid var(--border-primary); |
| | font-weight: 500; |
| | } |
| |
|
| | .btn-copy-xs { |
| | background: none; |
| | border: none; |
| | color: var(--text-secondary); |
| | cursor: pointer; |
| | padding: 2px; |
| | border-radius: var(--radius-sm); |
| | transition: all 0.15s ease; |
| | font-size: 0.7rem; |
| | flex-shrink: 0; |
| | } |
| |
|
| | .btn-copy-xs:hover { |
| | color: var(--accent-blue); |
| | background: var(--bg-tertiary); |
| | } |
| |
|
| | .hardware-id-compact { |
| | font-family: 'JetBrains Mono', 'Consolas', monospace; |
| | font-size: 0.8rem; |
| | color: var(--text-secondary); |
| | word-break: break-all; |
| | line-height: 1.2; |
| | } |
| |
|
| | .hardware-id-full { |
| | font-size: 0.9rem; |
| | color: var(--text-primary); |
| | word-break: break-all; |
| | line-height: 1.4; |
| | display: block; |
| | margin-right: 8px; |
| | width: 100%; |
| | max-width: 400px; |
| | overflow-wrap: break-word; |
| | white-space: normal; |
| | } |
| |
|
| | |
| | .user-info-display { |
| | background: var(--bg-tertiary); |
| | padding: 12px; |
| | border-radius: var(--radius-sm); |
| | border: 1px solid var(--border-primary); |
| | } |
| |
|
| | .current-expiry { |
| | background: var(--bg-primary); |
| | color: var(--accent-blue); |
| | padding: 8px 12px; |
| | border-radius: var(--radius-sm); |
| | border: 1px solid var(--border-primary); |
| | font-family: 'JetBrains Mono', 'Consolas', monospace; |
| | font-size: 0.9rem; |
| | } |
| |
|
| | |
| | .machine-name-detail { |
| | display: flex; |
| | align-items: center; |
| | color: var(--text-primary); |
| | font-size: 0.9rem; |
| | } |
| |
|
| | .machine-name-detail i { |
| | color: var(--accent-green); |
| | margin-right: 8px; |
| | flex-shrink: 0; |
| | } |
| |
|
| | .machine-name-compact { |
| | display: flex; |
| | align-items: center; |
| | color: var(--text-primary); |
| | font-size: 0.8rem; |
| | } |
| |
|
| | .machine-name-compact i { |
| | color: var(--accent-green); |
| | margin-right: 6px; |
| | flex-shrink: 0; |
| | } |
| |
|
| | |
| | .hardware-id-detail { |
| | display: flex; |
| | align-items: flex-start; |
| | width: 100%; |
| | } |
| |
|
| | |
| | .license-details-modal .details-grid, |
| | .log-details .details-grid { |
| | gap: 1.5rem; |
| | } |
| |
|
| | .license-details-modal .detail-item, |
| | .log-details .detail-item { |
| | display: flex; |
| | flex-direction: column; |
| | gap: 0.5rem; |
| | } |
| |
|
| | .license-details-modal .detail-item label, |
| | .log-details .detail-item label { |
| | font-size: 0.8rem; |
| | font-weight: 600; |
| | color: var(--text-secondary); |
| | text-transform: uppercase; |
| | letter-spacing: 0.5px; |
| | } |
| |
|
| | .license-details-modal .d-flex.align-center, |
| | .log-details .d-flex.align-center { |
| | align-items: center; |
| | gap: 12px; |
| | } |
| |
|
| | |
| | .license-code { |
| | background: var(--bg-primary); |
| | color: var(--accent-blue); |
| | padding: 8px 12px; |
| | border-radius: var(--radius-sm); |
| | border: 1px solid var(--border-primary); |
| | font-family: 'JetBrains Mono', 'Consolas', monospace; |
| | font-size: 0.9rem; |
| | word-break: break-all; |
| | line-height: 1.4; |
| | flex: 1; |
| | } |
| |
|
| | .expires-date-compact { |
| | font-size: 0.85rem; |
| | line-height: 1.2; |
| | } |
| |
|
| | .last-used-compact { |
| | color: var(--text-secondary); |
| | font-size: 0.85rem; |
| | white-space: nowrap; |
| | overflow: hidden; |
| | text-overflow: ellipsis; |
| | } |
| |
|
| | |
| | .machine-name { |
| | color: var(--text-secondary); |
| | font-size: 0.875rem; |
| | margin-top: 0.25rem; |
| | } |
| |
|
| | .machine-name i { |
| | margin-right: 0.5rem; |
| | color: var(--accent-blue); |
| | } |
| |
|
| | .machine-name-compact { |
| | display: inline-flex; |
| | align-items: center; |
| | font-size: 0.85rem; |
| | color: var(--text-secondary); |
| | gap: 4px; |
| | } |
| |
|
| | .machine-name-compact i { |
| | font-size: 0.75rem; |
| | color: var(--accent-blue); |
| | flex-shrink: 0; |
| | } |
| |
|
| | |
| | .btn-xs { |
| | padding: 3px 6px; |
| | font-size: 0.7rem; |
| | line-height: 1; |
| | border-radius: var(--radius-sm); |
| | min-width: auto; |
| | } |
| |
|
| | .action-buttons .btn-xs { |
| | margin-left: 2px; |
| | } |
| |
|
| | |
| | @media (max-width: 768px) { |
| | .card-body-horizontal { |
| | flex-direction: column; |
| | min-height: auto; |
| | } |
| | |
| | .info-column { |
| | border-right: none; |
| | border-bottom: 1px solid var(--border-primary); |
| | padding: var(--spacing-xs) var(--spacing-md); |
| | flex-direction: row; |
| | justify-content: space-between; |
| | align-items: center; |
| | min-height: 40px; |
| | } |
| | |
| | .info-column:last-child { |
| | border-bottom: none; |
| | } |
| | |
| | .column-header { |
| | margin-bottom: 0; |
| | flex-shrink: 0; |
| | margin-right: var(--spacing-sm); |
| | } |
| | |
| | .column-content { |
| | justify-content: flex-end; |
| | min-height: auto; |
| | } |
| | |
| | .card-header-horizontal { |
| | padding: var(--spacing-xs) var(--spacing-sm); |
| | min-height: 48px; |
| | } |
| | |
| | .card-header-horizontal .user-name { |
| | font-size: 0.8rem; |
| | margin-bottom: 1px; |
| | } |
| | |
| | .card-header-horizontal .user-email { |
| | font-size: 0.7rem; |
| | } |
| | |
| | .card-header-horizontal .status-section { |
| | justify-content: flex-end; |
| | flex: none; |
| | } |
| | |
| | .card-header-horizontal .action-buttons { |
| | display: flex; |
| | gap: 4px; |
| | } |
| | |
| | .card-header-horizontal .action-buttons .btn { |
| | padding: 6px 8px; |
| | font-size: 0.7rem; |
| | min-height: 26px; |
| | } |
| | } |
| |
|
| | |
| | .search-input-container { |
| | position: relative; |
| | display: block; |
| | width: 100%; |
| | } |
| |
|
| | .search-input-container i { |
| | position: absolute; |
| | left: 0.75rem; |
| | top: 50%; |
| | transform: translateY(-50%); |
| | color: var(--text-secondary); |
| | z-index: 1; |
| | pointer-events: none; |
| | } |
| |
|
| | .search-input { |
| | padding-left: 2.5rem !important; |
| | width: 100%; |
| | } |
| |
|
| | |
| | .form-help { |
| | display: block; |
| | font-size: 0.8rem; |
| | color: var(--text-secondary); |
| | margin-top: var(--spacing-xs); |
| | line-height: 1.3; |
| | } |
| |
|
| | .info-box { |
| | background: rgba(88, 166, 255, 0.05); |
| | border: 1px solid rgba(88, 166, 255, 0.2); |
| | border-radius: var(--radius-md); |
| | padding: var(--spacing-md); |
| | margin-top: var(--spacing-md); |
| | } |
| |
|
| | .info-title { |
| | color: var(--accent-blue); |
| | font-weight: 600; |
| | font-size: 0.9rem; |
| | margin-bottom: var(--spacing-sm); |
| | display: flex; |
| | align-items: center; |
| | gap: var(--spacing-xs); |
| | } |
| |
|
| | .info-content p { |
| | color: var(--text-secondary); |
| | font-size: 0.8rem; |
| | margin: 0 0 var(--spacing-xs) 0; |
| | line-height: 1.4; |
| | } |
| |
|
| | .info-content p:last-child { |
| | margin-bottom: 0; |
| | } |
| |
|
| | |
| | .refresh-btn { |
| | height: 40px; |
| | min-height: 40px; |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | gap: var(--spacing-xs); |
| | width: auto; |
| | margin-left: auto; |
| | } |
| |
|
| | |
| | .action-buttons-group { |
| | display: flex; |
| | gap: var(--spacing-sm); |
| | margin-left: auto; |
| | } |
| |
|
| | .action-buttons-group .btn { |
| | height: 40px; |
| | min-height: 40px; |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | gap: var(--spacing-xs); |
| | } |
| |
|
| | |
| | .license-count { |
| | margin-left: 2rem; |
| | font-size: 0.85rem; |
| | color: var(--text-secondary); |
| | font-weight: 500; |
| | } |