.groups-container { display: flex; flex-direction: column; width: 100%; height: 100%; overflow: hidden; } .header-container { display: flex; justify-content: space-between; align-items: center; padding: 10px 10px; border-bottom: 1px solid #ddd; } .main-container { display: flex; flex-direction: row; width: 100%; height: 100%; overflow: hidden; min-height: 0; will-change: auto; } .clients-mat-divider { display: none; } @media (max-width: 992px) { .main-container { display: flex !important; flex-direction: column !important; width: 100% !important; height: 100% !important; overflow: hidden !important; } .filters-and-tree-container { display: flex !important; flex-direction: row !important; flex-grow: 1 !important; flex-shrink: 1 !important; width: 100% !important; max-width: none !important; min-width: 0 !important; padding: 1rem !important; box-sizing: border-box !important; min-height: 250px !important; overflow: hidden !important; } .filters-panel, .tree-container { flex: 1 1 50% !important; overflow-y: auto !important; padding: 0.5rem !important; box-sizing: border-box !important; margin-bottom: 0 !important; max-height: 300px !important; } .filters-container { padding: 0 !important; } .tree-mat-divider { display: none !important; } .clients-mat-divider { display: inline; } .clients-view-header { display: flex; flex-direction: row !important; justify-content: space-between !important; margin-bottom: 0.5rem !important; margin-top: 0.5rem !important; align-items: center !important; padding-right: 1rem !important; } .groups-button-row { display: none !important; } .cards-view { max-height: calc(100vh - 400px) !important; } .clients-table { max-height: none !important; overflow: auto !important; display: flex !important; flex-direction: column !important; flex: 1 !important; } .clients-container { padding: 0em 1em 0em 1em !important; overflow: auto !important; } } @media (max-width: 1400px) { .type-view-text { display: none; } } @media (max-width: 450px) { .clients-title-name { font-size: 20px !important; } } .header-container-title { flex-grow: 1; text-align: left; margin-left: 1em; } .groups-button-row { display: flex; gap: 15px; padding-right: 0.5rem; } .clients-view-header { display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 0.5rem; margin-top: 0.5rem; align-items: center; padding-right: 1rem; } @media (max-width: 768px) { .clients-view-header { display: flex; flex-direction: column !important; } } .clients-title-name { font-size: x-large; display: block; padding: 1rem 1rem 1rem 13px; margin-left: 0.6rem; flex: 1 1 auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .view-type-container { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; flex-shrink: 0; } .clients-view { flex-grow: 1; display: flex; flex-direction: column; scroll-behavior: smooth; } .cards-view { max-height: calc(100vh - 330px); overflow: auto; display: flex; flex-direction: row; flex-grow: 1; overflow: auto; } .cards-select-all { position: sticky; top: 0; z-index: 1; padding-top: 0.5rem; padding-left: 1rem; } .list-view { overflow-x: auto; display: flex; flex-direction: column; flex: 1; scroll-behavior: smooth; } .clients-table { flex: 1; overflow: auto; display: flex; flex-direction: column; width: 100%; table-layout: auto; border-collapse: collapse; will-change: scroll-position; scroll-behavior: smooth; -webkit-overflow-scrolling: touch; } .clients-table th, .clients-table td { text-align: left; padding: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .clients-table th { font-weight: 500; } .clients-table td { border-bottom: 1px solid #ddd; } .paginator-container { display: flex; justify-content: end; margin-top: auto; } .cards-paginator { width: 100%; margin-left: 1rem; background-color: #fafafa; margin-bottom: 1rem; } .list-paginator { width: 100%; background-color: #f3f3f3; margin-bottom: 1rem; } .actions mat-icon { color: #757575; cursor: pointer; transition: color 0.2s; } .actions mat-icon:hover { color: #1976d2; } .search-container { display: flex; gap: 20px; margin: 20px 0; } .search-container mat-form-field { flex: 1; } mat-tree { background-color: #f9f9f9; padding: 0px 10px 10px 10px; } mat-tree mat-tree-node { display: flex; align-items: center; padding: 10px; border-radius: 6px; transition: background-color 0.2s, color 0.2s; cursor: pointer; } mat-tree mat-tree-node:hover { background-color: #e3f2fd; } mat-tree mat-tree-node button.mat-icon-button { margin-left: auto; color: #757575; } mat-tree mat-tree-node button.mat-icon-button:hover { color: #1976d2; } mat-tree mat-tree-node span { font-size: 16px; font-weight: 500; color: #555; } mat-tree mat-tree-node mat-icon { margin-right: 10px; color: #757575; transition: color 0.2s; } mat-tree mat-tree-node.expandable mat-icon { color: black; cursor: pointer; } mat-tree mat-tree-node.expandable.disabled mat-icon { color: grey; opacity: 0.5; cursor: not-allowed; } mat-tree mat-tree-node:hover mat-icon { color: black; } mat-tree mat-tree-node mat-icon.node-icon { margin-right: 10px; } mat-tree mat-tree-node mat-icon.node-icon.organizational-unit { color: #1976d2; } mat-tree mat-tree-node mat-icon.node-icon.classroom { color: #757575; } mat-tree mat-tree-node mat-icon.node-icon.client { color: #757575; } mat-tree mat-tree-node mat-icon.node-icon.group { color: #757575; } mat-tree mat-tree-node button.mat-icon-button { margin-right: 10px; } mat-tree mat-tree-node button.mat-icon-button.disabled-toggle { color: grey; opacity: 0.5; cursor: not-allowed; } mat-tree mat-tree-node button.mat-icon-button.disabled-toggle:hover { background-color: transparent; } mat-tree mat-tree-node:hover { background-color: #e3f2fd; cursor: pointer; } mat-tree mat-tree-node.disabled { cursor: not-allowed; } mat-tree mat-tree-node.disabled:hover { background-color: transparent; } .selected-node { background-color: #e0f7fa; border-left: 4px solid #3F51B5; padding-left: calc(16px - 4px); } .mat-menu-item .mat-menu-item-submenu-icon { display: none; } .clients-card-container { display: flex; flex-wrap: wrap; gap: 16px; padding: 16px; justify-content: flex-start; } .client-name { display: block; font-weight: 500; margin-bottom: 5px; margin-top: 5px; padding-left: 1rem; padding-right: 1rem; } .clients-container { flex: 8; box-sizing: border-box; overflow: auto; display: flex; flex-direction: column; padding: 0rem 1rem 0rem 0.5rem; background: #fafbfc; border-radius: 12px; margin-left: 0.5rem; min-height: 0; } .filters-and-tree-container { display: flex; flex-direction: column; gap: 0.5rem; flex: 2; min-width: 400px; max-width: 100%; box-sizing: border-box; width: 100%; padding: 0 0.5rem; } .filters-container { display: flex; flex-direction: column; padding: 1em; flex-grow: 1; } .filter-form-field { flex: 1; min-width: 150px; max-width: 100%; box-sizing: border-box; } .filters-panel { flex-shrink: 0; } .tree-container { flex-grow: 1; overflow-y: auto; margin-bottom: 1rem; background: white; border-radius: 12px; border: 1px solid #e9ecef; width: 100%; min-width: 0; max-height: calc(100vh - 400px); min-height: 200px; will-change: scroll-position; scroll-behavior: smooth; -webkit-overflow-scrolling: touch; } .tree-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 24px; border-bottom: 2px solid #e9ecef; background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); border-radius: 12px 12px 0 0; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); } .tree-title { display: flex; align-items: center; gap: 12px; margin: 0; font-size: 1.2rem; font-weight: 700; color: #2c3e50; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } .tree-title mat-icon { color: #3f51b5; font-size: 28px; width: 28px; height: 28px; background: rgba(63, 81, 181, 0.1); border-radius: 50%; padding: 4px; } .tree-actions { display: flex; gap: 8px; } .tree-actions button { color: #6c757d; transition: all 0.3s ease; border-radius: 50%; width: 40px; height: 40px; } .tree-actions button:hover { color: #3f51b5; background-color: rgba(63, 81, 181, 0.1); transform: scale(1.1); box-shadow: 0 2px 8px rgba(63, 81, 181, 0.2); } .modern-tree { background: transparent; padding: 12px 0; border-radius: 0 0 12px 12px; } .tree-node { margin: 2px 8px; border-radius: 8px; transition: all 0.3s ease; position: relative; border-left: 3px solid transparent; } .tree-node:hover { background-color: rgba(102, 126, 234, 0.08); transform: translateX(4px); border-left-color: #667eea; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .node-content { display: flex; align-items: center; padding: 10px 16px; gap: 12px; width: 100%; min-height: 52px; } .expand-button { min-width: 36px; color: #6c757d; transition: all 0.3s ease; border-radius: 50%; } .expand-button:hover:not(.disabled-toggle) { color: #667eea; background-color: rgba(102, 126, 234, 0.1); transform: scale(1.1); } .expand-icon { transition: transform 0.3s ease; font-size: 20px; } .tree-node:hover .expand-icon { transform: scale(1.2); } .node-info { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; } .node-main { display: flex; align-items: center; gap: 8px; } .node-icon { font-size: 22px; width: 22px; height: 22px; transition: all 0.3s ease; border-radius: 50%; padding: 4px; background: rgba(255, 255, 255, 0.8); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } .tree-node:hover .node-icon { transform: scale(1.1); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); } .node-name { font-weight: 500; color: #2c3e50; font-size: 0.95rem; transition: color 0.2s ease; } .tree-node:hover .node-name { color: #1a237e; font-weight: 600; } .node-details { display: flex; flex-direction: column; gap: 4px; font-size: 0.8rem; color: #6c757d; } .node-ip { font-family: 'Courier New', monospace; color: #495057; font-weight: 500; } .node-count { background: rgba(102, 126, 234, 0.1); color: #667eea; padding: 2px 8px; border-radius: 12px; font-size: 0.75rem; font-weight: 600; display: inline-block; margin-top: 2px; } .node-status { padding: 4px 8px; border-radius: 12px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; } .node-status.status-off { background: linear-gradient(135deg, #dc3545, #c82333); color: white; box-shadow: 0 1px 3px rgba(220, 53, 69, 0.3); } .node-status.status-og-live { background: linear-gradient(135deg, #28a745, #20c997); color: white; box-shadow: 0 1px 3px rgba(40, 167, 69, 0.3); } .node-status.status-linux { background: linear-gradient(135deg, #17a2b8, #138496); color: white; box-shadow: 0 1px 3px rgba(23, 162, 184, 0.3); } .node-status.status-windows { background: linear-gradient(135deg, #007bff, #0056b3); color: white; box-shadow: 0 1px 3px rgba(0, 123, 255, 0.3); } .node-status.status-busy { background: linear-gradient(135deg, #ffc107, #e0a800); color: #212529; box-shadow: 0 1px 3px rgba(255, 193, 7, 0.3); } .node-status.status-disconnected { background: linear-gradient(135deg, #6c757d, #545b62); color: white; box-shadow: 0 1px 3px rgba(108, 117, 125, 0.3); } .node-status.status-initializing { background: linear-gradient(135deg, #fd7e14, #e55a00); color: white; box-shadow: 0 1px 3px rgba(253, 126, 20, 0.3); } .node-actions { opacity: 0; transition: opacity 0.2s ease; } .tree-node:hover .node-actions { opacity: 1; } .menu-button { min-width: 32px; color: #6c757d; transition: all 0.2s ease; } .menu-button:hover { color: #667eea; background-color: rgba(102, 126, 234, 0.1); } .selected-node { background: linear-gradient(135deg, rgba(102, 126, 234, 0.15), rgba(102, 126, 234, 0.08)); border-left-color: #667eea; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.2); } .selected-node .node-name { color: #1a237e; font-weight: 600; } .selected-node .node-icon { background: rgba(102, 126, 234, 0.1); box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3); } /* Animaciones */ @keyframes slideIn { from { opacity: 0; transform: translateX(-20px); } to { opacity: 1; transform: translateX(0); } } .tree-node { animation: slideIn 0.3s ease-out; } /* Responsive */ @media (max-width: 768px) { .tree-header { padding: 12px 16px; } .tree-title { font-size: 1rem; } .node-content { padding: 8px 12px; min-height: 48px; } .node-icon { font-size: 20px; width: 20px; height: 20px; } .node-name { font-size: 0.9rem; } .node-details { font-size: 0.75rem; } } .client-item { display: flex; justify-content: center; } .client-card { background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); border: 1.5px solid #e1e5e9cc; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); width: 100%; max-width: 260px; display: flex; flex-direction: column; align-items: center; text-align: center; transition: all 0.2s ease; position: relative; padding: 6px 4px; } .client-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12); background: linear-gradient(135deg, #ffffff 0%, #f0f4ff 100%); } .client-details { flex-grow: 1; display: flex; flex-direction: column; justify-content: space-between; margin-top: 4px; width: 100%; gap: 4px; } .type-view-text { margin-left: 0.5vw; } .action-icons { display: flex; justify-content: center; align-items: center; gap: 1px; margin-top: 4px; padding: 3px; border-radius: 4px; width: 100%; } .action-icons button { transition: all 0.15s ease; } .action-icons button:hover { transform: scale(1.05); background: rgba(63, 81, 181, 0.08); } .client-image { width: 32px; height: 32px; margin: 4px 0; filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1)); transition: transform 0.2s ease; } /* Iconos más grandes solo en vista de tarjetas */ .cards-view .client-image { width: 42px; height: 42px; margin: 5px 0; filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.15)); } .client-card:hover .client-image { transform: scale(1.05); } .cards-view .client-card:hover .client-image { transform: scale(1.1); } .client-name { display: block; font-weight: 600; font-size: 0.85rem; margin-bottom: 2px; padding: 0 4px; color: #2c3e50; line-height: 1.2; word-break: break-word; } .client-ip { display: block; font-size: 0.7rem; color: #6c757d; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; padding: 1px 4px; border-radius: 3px; margin: 1px 0; word-break: break-all; } .client-mac { display: block; font-size: 0.6rem; color: #6c757d; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; padding: 1px 3px; border-radius: 3px; margin: 1px 0; word-break: break-all; } .clients-list { display: flex; flex-direction: column; gap: 4px; } .sync-spinner { position: absolute; top: 4px; right: 4px; z-index: 2; background: rgba(255, 255, 255, 0.9); border-radius: 50%; padding: 1px; } .mat-elevation-z8 { box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.2); } .client-info { display: flex; flex-direction: column; gap: 3px; margin: 5px; } .client-item { position: relative; } .no-clients-info { display: flex; align-items: center; gap: 10px; margin-top: 1.5rem; margin-left: 1.6rem; } mat-button-toggle-group { border: none; } .mat-button-toggle-group .mat-button-toggle { height: 36px; background-color: #3f51b5; color: white; border: none; cursor: pointer; font-size: 16px; transition: transform 0.3s ease; font-family: Roboto, "Helvetica Neue", sans-serif; display: flex; align-items: center; justify-content: center; padding: 0 6px; } .mat-button-toggle-group .mat-button-toggle:first-child { border-top-left-radius: 15px; border-bottom-left-radius: 15px; } .mat-button-toggle-group .mat-button-toggle:last-child { border-top-right-radius: 15px; border-bottom-right-radius: 15px; } .mat-button-toggle-group .mat-button-toggle:not(:first-child):not(:last-child) { border-radius: 0; } .mat-button-toggle-group .mat-button-toggle:hover { background-color: #303f9f; } .mat-button-toggle-group .mat-button-toggle.mat-button-toggle-checked { background-color: #303f9f; } .mat-button-toggle-group .mat-button-toggle.mat-button-toggle-disabled { background-color: #c7c7c7; } .clients-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; padding: 0.5rem 1rem 1rem 1rem; width: 100%; box-sizing: border-box; } /* Estilo para hacer el backdrop no clickeable */ ::ng-deep .non-clickable-backdrop { pointer-events: none !important; } /* Estados de los PCs - Colores exactos de los SVG */ .status-off .client-card { border-color: #b0b0b0cc; background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); } .status-off .client-image { filter: drop-shadow(0 2px 4px rgba(102, 102, 102, 0.3)); } .status-off:hover .client-card { border-color: #a0a0a0cc; background: linear-gradient(135deg, #f8f9fa 0%, #dee2e6 100%); } .status-busy .client-card { border-color: #ea332388; background: linear-gradient(135deg, #fff5f5 0%, #ffe6e6 100%); } .status-busy .client-image { filter: drop-shadow(0 2px 4px rgba(234, 51, 35, 0.3)); } .status-busy:hover .client-card { border-color: #d6338488; background: linear-gradient(135deg, #fff5f5 0%, #ffebeb 100%); } .status-disconnected .client-card { border-color: #ff000088; background: linear-gradient(135deg, #fff5f5 0%, #ffe6e6 100%); } .status-disconnected .client-image { filter: drop-shadow(0 2px 4px rgba(255, 0, 0, 0.3)); } .status-disconnected:hover .client-card { border-color: #dc354588; background: linear-gradient(135deg, #fff5f5 0%, #ffebeb 100%); } .status-initializing .client-card { border-color: #75fbfd88; background: linear-gradient(135deg, #f0f9ff 0%, #e6f3ff 100%); } .status-initializing .client-image { filter: drop-shadow(0 2px 4px rgba(117, 251, 253, 0.3)); } .status-initializing:hover .client-card { border-color: #17a2b888; background: linear-gradient(135deg, #f0f9ff 0%, #d1ecf1 100%); } .status-og-live .client-card { border-color: #ffff5588; background: linear-gradient(135deg, #fffbf0 0%, #fff3cd 100%); } .status-og-live .client-image { filter: drop-shadow(0 2px 4px rgba(255, 255, 85, 0.3)); } .status-og-live:hover .client-card { border-color: #ffc10788; background: linear-gradient(135deg, #fffbf0 0%, #ffeaa7 100%); } .status-linux .client-card { border-color: #ea33f788; background: linear-gradient(135deg, #f8f0ff 0%, #f0e6ff 100%); } .status-linux .client-image { filter: drop-shadow(0 2px 4px rgba(234, 51, 247, 0.3)); } .status-linux:hover .client-card { border-color: #6f42c188; background: linear-gradient(135deg, #f8f0ff 0%, #e6d9ff 100%); } .status-linux-session .client-card { border-color: #ea33f788; background: linear-gradient(135deg, #f8f0ff 0%, #f0e6ff 100%); } .status-linux-session .client-image { filter: drop-shadow(0 2px 4px rgba(234, 51, 247, 0.3)); } .status-linux-session:hover .client-card { border-color: #6f42c188; background: linear-gradient(135deg, #f8f0ff 0%, #e6d9ff 100%); } .status-windows .client-card { border-color: #0000f588; background: linear-gradient(135deg, #f0f8ff 0%, #e6f3ff 100%); } .status-windows .client-image { filter: drop-shadow(0 2px 4px rgba(0, 0, 245, 0.3)); } .status-windows:hover .client-card { border-color: #007bff88; background: linear-gradient(135deg, #f0f8ff 0%, #cce7ff 100%); } .status-windows-session .client-card { border-color: #0000f588; background: linear-gradient(135deg, #f0f8ff 0%, #e6f3ff 100%); } .status-windows-session .client-image { filter: drop-shadow(0 2px 4px rgba(0, 0, 245, 0.3)); } .status-windows-session:hover .client-card { border-color: #007bff88; background: linear-gradient(135deg, #f0f8ff 0%, #cce7ff 100%); } .status-macos .client-card { border-color: #f19e3988; background: linear-gradient(135deg, #fff8f0 0%, #ffe6cc 100%); } .status-macos .client-image { filter: drop-shadow(0 2px 4px rgba(241, 158, 57, 0.3)); } .status-macos:hover .client-card { border-color: #fd7e1488; background: linear-gradient(135deg, #fff8f0 0%, #ffd280 100%); } /* Estilos para el checkbox */ .client-card mat-checkbox { position: absolute; top: 4px; left: 4px; z-index: 2; } /* Responsive adjustments - manteniendo tamaño compacto */ @media (max-width: 768px) { .clients-grid { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 8px; padding: 0.5rem 0.75rem 0.75rem 0.75rem; } .client-card { padding: 5px 3px; } .cards-view .client-image { width: 36px; height: 36px; } .client-name { font-size: 0.75rem; } .client-ip { font-size: 0.6rem; } .client-mac { font-size: 0.5rem; } } @media (max-width: 480px) { .clients-grid { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 6px; padding: 0.5rem; } .client-card { padding: 4px 2px; } .cards-view .client-image { width: 32px; height: 32px; } } /* Gradiente solo en la celda de status (primera columna) */ .status-off.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #f2f4f7 100%) !important; } .status-busy.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #ffeaea 100%) !important; } .status-disconnected.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #ffdede 100%) !important; } .status-initializing.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #e3fafd 100%) !important; } .status-og-live.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #fffbcf 100%) !important; } .status-linux.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #f7eafd 100%) !important; } .status-linux-session.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #f1e3fd 100%) !important; } .status-windows.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #e3eafd 100%) !important; } .status-windows-session.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #e0e7ff 100%) !important; } .status-macos.mat-row .mat-column-status { background: linear-gradient(to right, #fff 20%, #fff2de 100%) !important; } /** Chip de firmware más bonito **/ .firmware-chip { display: inline-flex; align-items: center; background: #e0e0e0; color: #333; border-radius: 6px; border: 1.5px solid #bdbdbd; font-weight: 600; font-size: 0.95em; padding: 0 12px; height: 28px; box-shadow: none; letter-spacing: 0.5px; } .firmware-chip mat-icon { margin-left: 4px; font-size: 16px; width: 16px; height: 16px; } /* Estadísticas */ .stats-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin: 1rem 0; padding: 0 1rem; } .stat-card { background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); border: 1px solid #e9ecef; border-radius: 12px; padding: 1.5rem; display: flex; align-items: center; gap: 1rem; transition: all 0.3s ease; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); position: relative; overflow: hidden; } .stat-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, #667eea, #764ba2); transform: scaleX(0); transition: transform 0.3s ease; } .stat-card:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); } .stat-card:hover::before { transform: scaleX(1); } .stat-icon { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 12px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; font-size: 24px; transition: all 0.3s ease; } .stat-card:hover .stat-icon { transform: scale(1.1); } .stat-icon.online { background: linear-gradient(135deg, #4CAF50 0%, #45a049 100%); } .stat-icon.offline { background: linear-gradient(135deg, #f44336 0%, #d32f2f 100%); } .stat-icon.busy { background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%); } .stat-content { flex: 1; display: flex; flex-direction: column; gap: 0.25rem; } .stat-number { font-size: 1.75rem; font-weight: 700; color: #2c3e50; line-height: 1; } .stat-label { font-size: 0.875rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px; } /* Tabla mejorada */ .table-header { display: flex; justify-content: space-between; align-items: center; padding: 15px 20px; background: #f8f9fa; border-bottom: 1px solid #dee2e6; } .table-info { color: #6c757d; font-size: 0.9rem; } .table-actions { display: flex; gap: 10px; } .column-header { display: flex; align-items: center; gap: 5px; } .sort-button { opacity: 0.5; transition: opacity 0.3s ease; } .sort-button:hover { opacity: 1; } .sort-button.active { opacity: 1; color: #667eea; } /* Celdas mejoradas */ .client-cell { display: flex; flex-direction: column; gap: 2px; } .client-name { font-weight: 500; color: #212529; } .client-ip { font-size: 0.85rem; color: #212529; } .client-mac { font-size: 0.75rem; color: #6c757d; } .oglive-cell { display: flex; flex-direction: column; gap: 2px; } .oglive-kernel { font-size: 0.85rem; color: #212529; } .oglive-date { font-size: 0.7rem; color: #6c757d; font-style: italic; } /* Botones de acción */ .action-buttons { display: flex; gap: 5px; justify-content: center; } /* Filas seleccionadas */ .selected-row { background-color: rgba(102, 126, 234, 0.1) !important; } .mat-row:hover { background-color: rgba(102, 126, 234, 0.05); cursor: pointer; } /* Responsive para nuevas funcionalidades */ @media (max-width: 768px) { .stats-container { grid-template-columns: repeat(2, 1fr); gap: 0.75rem; padding: 0 0.5rem; } .stat-card { padding: 1rem; gap: 0.75rem; } .stat-icon { width: 40px; height: 40px; font-size: 20px; } .stat-number { font-size: 1.5rem; } .stat-label { font-size: 0.75rem; } .table-header { flex-direction: column; gap: 10px; text-align: center; } .action-buttons { flex-direction: column; gap: 2px; } } @media (max-width: 480px) { .stats-container { grid-template-columns: 1fr; gap: 0.5rem; } .stat-card { padding: 0.75rem; } .stat-icon { width: 36px; height: 36px; font-size: 18px; } .stat-number { font-size: 1.25rem; } .stat-label { font-size: 0.7rem; } } /* Animaciones */ @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .stats-container, .table-header { animation: fadeIn 0.5s ease-out; } /* Separadores visuales */ .tree-node:not(:last-child) { border-bottom: 1px solid rgba(0, 0, 0, 0.05); margin-bottom: 2px; } .tree-node:hover:not(:last-child) { border-bottom-color: rgba(102, 126, 234, 0.2); } /* Dashboard de Estadísticas */ .dashboard-stats { margin: 1rem 0 1.5rem 0; padding: 0 1rem; } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; max-width: 100%; } .stat-card { background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); border: 1px solid #e9ecef; border-radius: 12px; padding: 1.5rem; display: flex; align-items: center; gap: 1rem; transition: all 0.3s ease; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); position: relative; overflow: hidden; } .stat-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, #667eea, #764ba2); opacity: 0; transition: opacity 0.3s ease; } .stat-card:hover { transform: translateY(-4px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); border-color: #667eea; } .stat-card:hover::before { opacity: 1; } .stat-icon { display: flex; align-items: center; justify-content: center; width: 60px; height: 60px; border-radius: 50%; background: linear-gradient(135deg, #667eea, #764ba2); color: white; font-size: 28px; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); transition: all 0.3s ease; } .stat-card:hover .stat-icon { transform: scale(1.1); box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4); } .stat-icon.online { background: linear-gradient(135deg, #28a745, #20c997); box-shadow: 0 4px 12px rgba(40, 167, 69, 0.3); } .stat-icon.offline { background: linear-gradient(135deg, #dc3545, #c82333); box-shadow: 0 4px 12px rgba(220, 53, 69, 0.3); } .stat-icon.busy { background: linear-gradient(135deg, #ffc107, #e0a800); box-shadow: 0 4px 12px rgba(255, 193, 7, 0.3); } .stat-content { flex: 1; display: flex; flex-direction: column; gap: 0.25rem; } .stat-number { font-size: 2rem; font-weight: 700; color: #2c3e50; line-height: 1; margin: 0; } .stat-label { font-size: 0.9rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px; margin: 0; } /* Responsive para el dashboard */ @media (max-width: 1200px) { .stats-grid { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 0.75rem; } .stat-card { padding: 1.25rem; } .stat-icon { width: 50px; height: 50px; font-size: 24px; } .stat-number { font-size: 1.75rem; } } @media (max-width: 768px) { .dashboard-stats { margin: 0.75rem 0 1rem 0; padding: 0 0.5rem; } .stats-grid { grid-template-columns: repeat(2, 1fr); gap: 0.5rem; } .stat-card { padding: 1rem; flex-direction: column; text-align: center; gap: 0.75rem; } .stat-icon { width: 45px; height: 45px; font-size: 22px; } .stat-number { font-size: 1.5rem; } .stat-label { font-size: 0.8rem; } } @media (max-width: 480px) { .stats-grid { grid-template-columns: 1fr; } } /* Estilos para truncate en tabla */ .truncate-cell { max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .truncate-cell-wide { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .truncate-cell-medium { max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .truncate-cell-narrow { max-width: 100px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Para vista de tarjetas */ .client-card .client-name { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } /* Responsive para truncate */ @media (max-width: 1200px) { .truncate-cell { max-width: 120px; } .truncate-cell-wide { max-width: 150px; } .truncate-cell-medium { max-width: 110px; } .truncate-cell-narrow { max-width: 80px; } } @media (max-width: 768px) { .truncate-cell { max-width: 100px; } .truncate-cell-wide { max-width: 120px; } .truncate-cell-medium { max-width: 90px; } .truncate-cell-narrow { max-width: 70px; } }