/* 外部应用管理样式 */ /* 主容器 */ .client-management { padding: 2rem; background: #f8fafc; min-height: 100vh; } /* 页面头部 */ .page-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 2rem; } .header-left h1 { font-size: 1.75rem; font-weight: 600; color: #1e293b; margin: 0 0 0.5rem 0; } .header-left .subtitle { color: #64748b; font-size: 0.95rem; margin: 0; } .btn-primary { display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: #667eea; color: white; border: none; border-radius: 8px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .btn-primary:hover { background: #5568d3; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); } /* 过滤栏 */ .filter-bar { display: flex; gap: 1rem; margin-bottom: 2rem; align-items: center; flex-wrap: wrap; } /* DataTable 容器 - 与背景区隔 */ .client-management .data-table-wrapper { background: white; border-radius: 12px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } .filter-group { display: flex; align-items: center; gap: 0.5rem; } .filter-group label { color: #64748b; font-weight: 500; font-size: 0.95rem; } .filter-select { padding: 0.75rem 1rem; border: 1px solid #e2e8f0; border-radius: 8px; background: white; color: #1e293b; font-size: 0.95rem; cursor: pointer; transition: border-color 0.2s ease; } .filter-select:focus { outline: none; border-color: #667eea; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); } .client-management .search-box { flex: 1; min-width: 300px; position: relative; display: flex; align-items: center; background: white; border: 1px solid #e2e8f0; border-radius: 8px; padding: 0.75rem 1rem; } .client-management .search-box svg:first-child { color: #94a3b8; margin-right: 0.75rem; margin-left: 0.5rem; } .client-management .search-box input { flex: 1; border: none; outline: none; font-size: 0.95rem; } .client-management .clear-search { background: none; border: none; color: #94a3b8; cursor: pointer; padding: 0.25rem; display: flex; align-items: center; transition: color 0.2s ease; } .client-management .clear-search:hover { color: #64748b; } /* 表格容器 */ .apps-table-container { background: white; border-radius: 12px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } /* 表格样式 */ .apps-table { width: 100%; border-collapse: collapse; } .apps-table thead { background: #f8fafc; border-bottom: 2px solid #e2e8f0; } .apps-table th { padding: 1rem; text-align: left; font-weight: 600; color: #475569; font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.05em; } .apps-table tbody tr { border-bottom: 1px solid #e2e8f0; transition: background-color 0.2s ease; } .apps-table tbody tr:hover { background: #f8fafc; } .apps-table tbody tr:last-child { border-bottom: none; } .apps-table td { padding: 1rem; color: #1e293b; font-size: 0.95rem; vertical-align: middle; } .empty-state { text-align: center; padding: 3rem; color: #94a3b8; font-size: 1rem; } /* 应用名称单元格 */ .app-name-cell { display: flex; align-items: center; gap: 0.75rem; } .app-icon-small { width: 32px; height: 32px; border-radius: 6px; object-fit: cover; flex-shrink: 0; } /* 应用类型徽章 */ .app-type-badge { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.5rem 0.75rem; border-radius: 6px; background-color: #f1f5f9; font-size: 0.875rem; font-weight: 500; color: #475569; } .app-type-badge svg { flex-shrink: 0; } /* 详细信息单元格 */ .info-cell { max-width: 300px; } .info-content { display: flex; flex-direction: column; gap: 0.5rem; font-size: 0.875rem; } .apk-link, .web-link { display: inline-flex; align-items: center; gap: 0.5rem; color: #667eea; text-decoration: none; font-size: 0.875rem; transition: color 0.2s ease; } .apk-link:hover, .web-link:hover { color: #5568d3; text-decoration: underline; } .web-link { max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* 描述单元格 */ .description-cell { max-width: 250px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* 状态开关 */ .client-management .status-toggle { display: flex; align-items: center; gap: 0.5rem; cursor: pointer; } .client-management .toggle-switch { width: 36px; height: 20px; border-radius: 999px; position: relative; transition: background-color 0.2s; } .client-management .toggle-switch.on { background-color: #10b981; } .client-management .toggle-switch.off { background-color: #cbd5e1; } .client-management .toggle-slider { width: 16px; height: 16px; border-radius: 50%; background: white; position: absolute; top: 2px; left: 2px; transition: transform 0.2s; } .client-management .toggle-switch.on .toggle-slider { transform: translateX(16px); } .client-management .status-text { font-size: 0.875rem; color: #64748b; } /* 状态徽章 */ .status-badge { display: inline-block; padding: 0.375rem 0.75rem; border-radius: 6px; font-size: 0.875rem; font-weight: 500; } .status-badge.active { background: #d1fae5; color: #065f46; } .status-badge.inactive { background: #fee2e2; color: #991b1b; } /* 操作按钮 */ .action-buttons { display: flex; gap: 0.5rem; align-items: center; } .client-management .btn-icon { width: 32px; height: 32px; min-width: 32px; min-height: 32px; padding: 0; border: 1px solid #e2e8f0; border-radius: 6px; cursor: pointer; transition: all 0.2s ease; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; background: white; } .client-management .btn-icon:hover { background: #f8fafc; border-color: #cbd5e1; } .client-management .btn-icon svg { display: block; width: 16px !important; height: 16px !important; flex-shrink: 0; } .client-management .btn-edit { color: #3b82f6; } .client-management .btn-delete { color: #ef4444; background: white; } .client-management .btn-delete:hover { background: #fef2f2; border-color: #fecaca; color: #dc2626; transform: none; /* Reset transform if needed */ } /* 加载状态 */ .loading { display: flex; align-items: center; justify-content: center; min-height: 400px; font-size: 1.125rem; color: #94a3b8; } /* 模态框样式 */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; backdrop-filter: blur(2px); } .modal-content { background: white; border-radius: 12px; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1); width: 90%; max-width: 700px; max-height: 90vh; display: flex; flex-direction: column; } .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 1.5rem 2rem; border-bottom: 1px solid #e2e8f0; } .modal-header h2 { margin: 0; font-size: 1.25rem; font-weight: 600; color: #1e293b; } .close-btn { padding: 0.5rem; border: none; border-radius: 6px; background: #f1f5f9; color: #64748b; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; } .close-btn:hover { background: #e2e8f0; color: #1e293b; } .modal-body { padding: 2rem; overflow-y: auto; flex: 1; } .modal-footer { padding: 1rem 2rem; border-top: 1px solid #e2e8f0; display: flex; gap: 1rem; justify-content: flex-end; } /* 表单样式 */ .form-group { margin-bottom: 1.5rem; } .form-group label { display: block; margin-bottom: 0.5rem; font-weight: 500; color: #1e293b; font-size: 0.95rem; } .form-group input, .form-group select, .form-group textarea { width: 100%; padding: 0.75rem; border: 1px solid #e2e8f0; border-radius: 8px; font-family: inherit; font-size: 0.95rem; transition: border-color 0.2s ease; box-sizing: border-box; } .form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; border-color: #667eea; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); } .form-group textarea { resize: vertical; min-height: 100px; } .checkbox-group { display: flex; align-items: center; gap: 0.5rem; } .checkbox-group label { display: flex; align-items: center; gap: 0.5rem; cursor: pointer; font-weight: normal; } .checkbox-group input[type="checkbox"] { width: auto; margin: 0; cursor: pointer; } /* 按钮样式 */ .btn-secondary { padding: 0.75rem 1.5rem; border-radius: 8px; border: none; font-weight: 500; cursor: pointer; transition: all 0.2s ease; background: #f1f5f9; color: #475569; } .btn-secondary:hover { background: #e2e8f0; } /* APK上传区域 */ .upload-apk-section { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; } .btn-upload { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.25rem; background-color: #667eea; color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 0.95rem; font-weight: 500; transition: all 0.2s ease; } .btn-upload:hover { background-color: #5568d3; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); } .btn-upload:disabled { background-color: #94a3b8; cursor: not-allowed; transform: none; box-shadow: none; } .upload-hint { font-size: 0.875rem; color: #64748b; } /* Toast容器 */ .toast-container { position: fixed; top: 1rem; right: 1rem; z-index: 9999; display: flex; flex-direction: column; gap: 0.5rem; }