/* 组件样式 */ /* 按钮样式增强 */ .btn { font-weight: 500; transition: var(--transition); border: none; padding: 0.5rem 1.25rem; } .btn:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); } .btn-icon { padding: 0.5rem; line-height: 1; } /* 卡片样式增强 */ .card { border: none; border-radius: var(--border-radius-lg); box-shadow: var(--shadow-sm); transition: var(--transition); } .card:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); } .card-header { background: transparent; border-bottom: 1px solid var(--border-light); padding: var(--spacing-lg); font-weight: 600; } /* 统计卡片 */ .stat-card { background: linear-gradient(135deg, var(--primary-color), var(--primary-dark)); color: var(--text-white); border-radius: var(--border-radius-lg); padding: var(--spacing-lg); position: relative; overflow: hidden; } .stat-card::before { content: ''; position: absolute; top: 0; right: 0; width: 100px; height: 100px; background: rgba(255,255,255,0.1); border-radius: 50%; transform: translate(30px, -30px); } .stat-card.success { background: linear-gradient(135deg, var(--success-color), #1e7e34); } .stat-card.warning { background: linear-gradient(135deg, var(--warning-color), #e0a800); } .stat-card.danger { background: linear-gradient(135deg, var(--danger-color), #bd2130); } .stat-card.info { background: linear-gradient(135deg, var(--info-color), #138496); } .stat-number { font-size: 2.5rem; font-weight: bold; line-height: 1; margin-bottom: 0.5rem; } .stat-label { font-size: var(--font-size-sm); opacity: 0.9; } /* 数据表格 */ .data-table { background: var(--bg-primary); border-radius: var(--border-radius); overflow: hidden; } .data-table table { margin-bottom: 0; } .data-table th { background: var(--bg-secondary); border-bottom: 2px solid var(--border-color); font-weight: 600; text-transform: uppercase; font-size: var(--font-size-sm); padding: var(--spacing); } .data-table td { padding: var(--spacing); vertical-align: middle; } .data-table tbody tr:hover { background: var(--bg-secondary); } /* 表格工具栏 */ .table-toolbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing); flex-wrap: wrap; gap: var(--spacing); } .table-search { position: relative; flex: 1; max-width: 300px; } .table-search input { padding-left: 2.5rem; } .table-search i { position: absolute; left: 0.75rem; top: 50%; transform: translateY(-50%); color: var(--text-muted); } /* 分页 */ .pagination { margin-bottom: 0; } .pagination .page-link { border: none; color: var(--primary-color); padding: 0.5rem 0.75rem; } .pagination .page-item.active .page-link { background: var(--primary-color); border-color: var(--primary-color); } /* 模态框增强 */ .modal-content { border: none; border-radius: var(--border-radius-lg); box-shadow: var(--shadow-lg); } .modal-header { border-bottom: 1px solid var(--border-light); padding: var(--spacing-lg); } .modal-footer { border-top: 1px solid var(--border-light); padding: var(--spacing-lg); } /* 表单样式 */ .form-label { font-weight: 500; margin-bottom: 0.5rem; color: var(--text-primary); } .form-control, .form-select { border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 0.75rem; transition: var(--transition-fast); } .form-control:focus, .form-select:focus { border-color: var(--primary-color); box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.25); } /* 徽章 */ .badge { font-weight: 500; padding: 0.375em 0.75em; } /* 进度条 */ .progress { height: 8px; border-radius: 4px; background: var(--bg-light); } .progress-bar { border-radius: 4px; } /* Toast 通知 */ .toast-container { position: fixed; top: var(--navbar-height); right: var(--spacing); z-index: var(--z-tooltip); } .toast { min-width: 300px; border: none; box-shadow: var(--shadow-md); margin-bottom: var(--spacing); } .toast.success { background: var(--success-color); color: var(--text-white); } .toast.error { background: var(--danger-color); color: var(--text-white); } .toast.warning { background: var(--warning-color); color: var(--text-primary); } .toast.info { background: var(--info-color); color: var(--text-white); } /* 加载动画 */ .spinner { display: inline-block; width: 2rem; height: 2rem; border: 3px solid var(--border-light); border-top-color: var(--primary-color); border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* 骨架屏 */ .skeleton { background: linear-gradient(90deg, var(--bg-light) 25%, var(--border-light) 50%, var(--bg-light) 75%); background-size: 200% 100%; animation: loading 1.5s infinite; } @keyframes loading { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } /* 空状态 */ .empty-state { text-align: center; padding: var(--spacing-xl); color: var(--text-muted); } .empty-state i { font-size: 4rem; margin-bottom: var(--spacing); opacity: 0.5; } /* 状态指示器 */ .status-indicator { display: inline-flex; align-items: center; gap: 0.5rem; font-size: var(--font-size-sm); } .status-indicator::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: currentColor; } .status-indicator.online { color: var(--success-color); } .status-indicator.offline { color: var(--danger-color); } .status-indicator.pending { color: var(--warning-color); } /* 标签页 */ .nav-tabs { border-bottom: 2px solid var(--border-light); } .nav-tabs .nav-link { border: none; color: var(--text-secondary); padding: var(--spacing) var(--spacing-lg); transition: var(--transition-fast); } .nav-tabs .nav-link:hover { color: var(--primary-color); border: none; } .nav-tabs .nav-link.active { color: var(--primary-color); background: transparent; border: none; border-bottom: 2px solid var(--primary-color); } /* 折叠/展开 */ .collapsible { cursor: pointer; user-select: none; } .collapsible-icon { transition: transform 0.3s ease; } .collapsible.collapsed .collapsible-icon { transform: rotate(-90deg); } /* 代码块 */ .code-block { background: var(--bg-dark); color: var(--text-white); padding: var(--spacing); border-radius: var(--border-radius); overflow-x: auto; font-family: 'Courier New', monospace; font-size: var(--font-size-sm); } /* 时间线 */ .timeline { position: relative; padding-left: 2rem; } .timeline::before { content: ''; position: absolute; left: 0.5rem; top: 0; bottom: 0; width: 2px; background: var(--border-color); } .timeline-item { position: relative; margin-bottom: var(--spacing-lg); } .timeline-item::before { content: ''; position: absolute; left: -1.5rem; top: 0.5rem; width: 10px; height: 10px; border-radius: 50%; background: var(--primary-color); border: 2px solid var(--bg-primary); } /* 响应式调整 */ @media (max-width: 768px) { .table-toolbar { flex-direction: column; align-items: stretch; } .table-search { max-width: 100%; } .stat-number { font-size: 2rem; } .toast-container { left: var(--spacing); right: var(--spacing); } .toast { min-width: auto; } } /* 导航栏样式 */ .navbar { height: var(--navbar-height); background: var(--bg-primary); border-bottom: 1px solid var(--border-light); display: flex; align-items: center; justify-content: space-between; padding: 0 var(--spacing-lg); position: relative; z-index: var(--z-sticky); } .navbar-brand { display: flex; align-items: center; gap: var(--spacing-sm); font-size: 1.25rem; font-weight: 700; color: var(--primary-color); text-decoration: none; } .navbar-brand i { font-size: 1.5rem; } .navbar-toggler { display: none; background: none; border: none; color: var(--text-secondary); font-size: 1.25rem; padding: var(--spacing-sm); border-radius: var(--border-radius); transition: var(--transition); cursor: pointer; } .navbar-toggler:hover { background: var(--bg-hover); color: var(--text-primary); } .navbar-nav { display: flex; align-items: center; list-style: none; margin: 0; padding: 0; gap: var(--spacing); } .nav-item { position: relative; } .nav-link { display: flex; align-items: center; gap: var(--spacing-xs); padding: var(--spacing-sm) var(--spacing); color: var(--text-secondary); text-decoration: none; border-radius: var(--border-radius); transition: var(--transition); font-weight: 500; } .nav-link:hover { color: var(--text-primary); background: var(--bg-hover); } .nav-link i { font-size: 1rem; } /* 响应式导航栏 */ @media (max-width: 768px) { .navbar-toggler { display: block; order: -1; } .navbar-brand span { display: none; } .navbar-nav { display: none; } }