:root { --bg: #0d1117; --bg-card: #161b22; --bg-nav: #161b22; --border: #30363d; --border-light: #21262d; --text: #e6edf3; --text-muted: #8b949e; --text-dim: #6e7681; --accent: #58a6ff; --accent-hover: #79c0ff; --green: #3fb950; --green-bg: #12261c; --red: #f85149; --red-bg: #3d1214; --orange: #d29922; --orange-bg: #2d1f0d; --purple: #bc8cff; --purple-bg: #21173d; --cyan: #79c0ff; --cyan-bg: #0a1f3a; --pink: #f778ba; --pink-bg: #2d1524; --radius: 6px; --radius-lg: 12px; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Inter', -apple-system, sans-serif; background: var(--bg); color: var(--text); line-height: 1.5; min-height: 100vh; } .container { max-width: 960px; margin: 0 auto; padding: 1.5rem; } /* Navbar */ .navbar { background: var(--bg-nav); border-bottom: 1px solid var(--border); position: sticky; top: 0; z-index: 100; } .nav-inner { max-width: 960px; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; padding: 0 1rem; height: 48px; } .nav-brand { display: flex; align-items: center; gap: .4rem; color: var(--text); text-decoration: none; font-weight: 600; font-size: .9rem; } .nav-logo { height: 32px; width: auto; } .login-logo-img { height: 80px; width: auto; margin-bottom: .5rem; } .nav-links { display: flex; gap: 2px; align-items: center; } .nav-link { padding: .3rem .6rem; border-radius: var(--radius); color: var(--text-muted); text-decoration: none; font-size: .8rem; font-weight: 500; transition: all .15s; white-space: nowrap; } .nav-link:hover { color: var(--text); background: var(--border-light); } .nav-link.active { color: var(--text); background: var(--border-light); } .nav-link.logout { color: var(--red); } .nav-link.logout:hover { background: var(--red-bg); } /* Dashboard */ .dash-header { margin-bottom: 1.5rem; } .dash-header h1 { font-size: 1.5rem; color: var(--text); font-weight: 600; } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: .75rem; margin-bottom: 1.5rem; } .stat-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem; } .stat-number { font-size: 1.75rem; font-weight: 700; color: var(--accent); } .stat-card.green .stat-number { color: var(--green); } .stat-card.orange .stat-number { color: var(--orange); } .stat-card.purple .stat-number { color: var(--purple); } .stat-label { font-size: .75rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: .3px; margin-top: 2px; } /* Client grid */ .client-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: .75rem; } .client-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem; text-decoration: none; color: inherit; transition: all .15s; } .client-card:hover { border-color: var(--text-dim); } .client-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: .5rem; } .client-card-header h4 { font-size: .9rem; color: var(--text); font-weight: 600; } .client-meta { font-size: .8rem; color: var(--text-muted); } .client-meta.warn { color: var(--orange); } .client-meta.small { font-size: .7rem; } /* Status badges */ .status-badge { display: inline-block; padding: .15rem .5rem; border-radius: 999px; font-size: .65rem; font-weight: 500; border: 1px solid transparent; } .status-badge.lead { border-color: var(--accent); color: var(--accent); } .status-badge.active { border-color: var(--green); color: var(--green); } .status-badge.paused { border-color: var(--orange); color: var(--orange); } .status-badge.archived { border-color: var(--text-dim); color: var(--text-dim); } .status-badge.planned { border-color: var(--accent); color: var(--accent); } .status-badge.in_progress { border-color: var(--green); color: var(--green); } .status-badge.completed { border-color: var(--purple); color: var(--purple); } .status-badge.on_hold { border-color: var(--orange); color: var(--orange); } .status-badge.todo { border-color: var(--text-dim); color: var(--text-dim); } .status-badge.done { border-color: var(--green); color: var(--green); } /* Engagement type */ .engagement-type { display: inline-block; padding: .1rem .45rem; border-radius: 3px; font-size: .65rem; font-weight: 500; } .engagement-type.assessment { background: var(--cyan-bg); color: var(--cyan); } .engagement-type.architecture { background: var(--purple-bg); color: var(--purple); } .engagement-type.implementation { background: var(--green-bg); color: var(--green); } .engagement-type.monitoring { background: var(--orange-bg); color: var(--orange); } .engagement-type.consulting { background: var(--pink-bg); color: var(--pink); } .engagement-type.training { background: var(--red-bg); color: var(--red); } /* Tables */ .data-table { width: 100%; border-collapse: collapse; } .data-table th { text-align: left; padding: .5rem .75rem; font-size: .7rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: .3px; border-bottom: 1px solid var(--border); background: var(--bg-card); } .data-table td { padding: .5rem .75rem; border-bottom: 1px solid var(--border-light); font-size: .8rem; } .data-table tr:hover td { background: var(--border-light); } /* Engagement list */ .engagement-list { display: flex; flex-direction: column; gap: .35rem; } .engagement-row { display: flex; align-items: center; gap: .75rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: .6rem .75rem; text-decoration: none; color: inherit; transition: all .15s; } .engagement-row:hover { border-color: var(--text-dim); } .engagement-title { flex: 1; font-weight: 500; color: var(--text); font-size: .85rem; } .engagement-client { color: var(--text-muted); font-size: .8rem; } .engagement-date { color: var(--text-dim); font-size: .75rem; } /* Page header */ .page-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.25rem; } .page-header h1 { font-size: 1.3rem; color: var(--text); font-weight: 600; } .header-actions { display: flex; gap: .5rem; align-items: center; } .back-link { color: var(--text-muted); text-decoration: none; font-size: .8rem; display: inline-block; margin-bottom: .35rem; transition: all .12s; } .back-link:hover { color: var(--accent); padding-left: 2px; } .back-link svg { width: 14px; height: 14px; vertical-align: middle; margin-right: 2px; } .breadcrumb { display: flex; align-items: center; gap: .35rem; font-size: .75rem; color: var(--text-dim); margin-bottom: .75rem; flex-wrap: wrap; } .breadcrumb a { color: var(--text-muted); text-decoration: none; transition: color .12s; } .breadcrumb a:hover { color: var(--accent); } .breadcrumb .sep { color: var(--border); font-size: .6rem; } .breadcrumb .current { color: var(--text); font-weight: 500; } /* Detail grid */ .detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: .75rem; margin-bottom: 1.5rem; } @media (max-width: 640px) { .detail-grid { grid-template-columns: 1fr; } } .detail-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem; } .detail-card h3 { font-size: .75rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: .3px; margin-bottom: .75rem; } /* Forms */ .form-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; } .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: .75rem; } @media (max-width: 640px) { .form-grid { grid-template-columns: 1fr; } } .form-actions { display: flex; gap: .5rem; margin-top: 1rem; } input, textarea, select { width: 100%; padding: .45rem .6rem; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font-size: .85rem; font-family: inherit; transition: border-color .15s; } input:focus, textarea:focus, select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px rgba(88,166,255,.15); } select { cursor: pointer; } select option { background: var(--bg); color: var(--text); } /* Alerts */ .alert { padding: .5rem .75rem; border-radius: var(--radius); margin-bottom: .75rem; font-size: .8rem; } .alert-error { background: var(--red-bg); border: 1px solid var(--red); color: var(--red); } /* Advice */ .advice-list { display: flex; flex-direction: column; gap: .35rem; } .advice-card { display: flex; align-items: flex-start; gap: .5rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: .6rem .75rem; border-left: 3px solid var(--border); } .advice-card.critical { border-left-color: var(--red); } .advice-card.high { border-left-color: var(--orange); } .advice-card.medium { border-left-color: var(--accent); } .advice-card.low { border-left-color: var(--green); } .advice-prio { font-size: .55rem; font-weight: 600; text-transform: uppercase; padding: .1rem .35rem; border-radius: 3px; white-space: nowrap; } .advice-prio.critical { background: var(--red-bg); color: var(--red); } .advice-prio.high { background: var(--orange-bg); color: var(--orange); } .advice-prio.medium { background: var(--cyan-bg); color: var(--cyan); } .advice-prio.low { background: var(--green-bg); color: var(--green); } .advice-body { flex: 1; } .advice-body p { font-size: .8rem; color: var(--text); } /* Tasks */ .task-list { display: flex; flex-direction: column; gap: .35rem; } .task-item { display: flex; align-items: center; gap: .5rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: .5rem .75rem; } .task-item.done { opacity: .5; } .task-item.done .task-title { text-decoration: line-through; } .task-status-form select { width: auto; padding: .2rem .4rem; font-size: .7rem; } .task-body { flex: 1; display: flex; flex-direction: column; gap: .1rem; } .task-title { font-size: .85rem; color: var(--text); font-weight: 500; } .task-desc { font-size: .75rem; color: var(--text-muted); } .task-meta { font-size: .7rem; color: var(--accent); } .task-prio { font-size: .55rem; font-weight: 600; text-transform: uppercase; padding: .1rem .35rem; border-radius: 3px; } .task-prio.critical { background: var(--red-bg); color: var(--red); } .task-prio.high { background: var(--orange-bg); color: var(--orange); } .task-prio.medium { background: var(--cyan-bg); color: var(--cyan); } .task-prio.low { background: var(--green-bg); color: var(--green); } .task-due { font-size: .7rem; color: var(--text-muted); } .task-due.overdue { color: var(--red); font-weight: 500; } .task-form { margin-bottom: .75rem; } .task-form-grid { display: flex; gap: .35rem; align-items: flex-end; flex-wrap: wrap; } .task-form-grid input, .task-form-grid select { width: auto; min-width: 120px; flex: 1; } .section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: .75rem; } /* Assessment list */ .assess-list { display: flex; flex-direction: column; gap: .35rem; } .assess-item { display: flex; align-items: center; gap: .75rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: .6rem .75rem; } .assess-date { font-size: .8rem; color: var(--text-muted); } .assess-id { font-weight: 500; color: var(--text); flex: 1; font-size: .85rem; } /* Empty state */ .empty-state { text-align: center; padding: 2.5rem 1rem; color: var(--text-muted); } .empty-state p { font-size: .85rem; } /* Status form */ .status-form { display: flex; gap: .35rem; align-items: center; } .status-form select { width: auto; } /* Buttons */ .btn { padding: .45rem .9rem; border: none; border-radius: var(--radius); font-size: .8rem; font-weight: 500; cursor: pointer; transition: all .15s; text-decoration: none; display: inline-block; text-align: center; line-height: 1.4; } .btn-primary { background: #238636; color: #fff; } .btn-primary:hover { background: #2ea043; } .btn-secondary { background: var(--border-light); color: var(--text-muted); border: 1px solid var(--border); } .btn-secondary:hover { background: var(--border); color: var(--text); } .btn-accent { background: var(--accent); color: #fff; } .btn-accent:hover { background: var(--accent-hover); } .btn-full { width: 100%; } .btn-small { padding: .2rem .5rem; border: none; border-radius: 4px; font-size: .7rem; cursor: pointer; background: var(--border-light); color: var(--text-muted); text-decoration: none; display: inline-block; } .btn-small:hover { background: var(--border); color: var(--text); } .btn-small.danger { background: var(--red-bg); color: var(--red); } .btn-small.danger:hover { background: #4d1a1c; } /* Login */ .login-container { display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 1.5rem; } .login-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 2rem; width: 100%; max-width: 360px; } .login-logo { text-align: center; margin-bottom: 1.5rem; } .login-logo h1 { font-size: 1.25rem; color: var(--text); } /* Header */ .header { margin-bottom: 1.5rem; } .logo { display: flex; align-items: center; gap: .75rem; margin-bottom: 1rem; } .logo-icon { font-size: 1.5rem; font-weight: 800; color: var(--accent); } .logo h1 { font-size: 1.25rem; font-weight: 600; color: var(--text); } .subtitle { font-size: .8rem; color: var(--text-muted); } /* Progress bar */ .progress-bar { width: 100%; height: 3px; background: var(--border-light); border-radius: 2px; overflow: hidden; margin-bottom: 1rem; } .progress-fill { height: 100%; background: var(--accent); transition: width .3s; border-radius: 2px; } /* Assessment steps */ .step { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.5rem; } .step-header { margin-bottom: 1rem; } .step-number { font-size: .7rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: .5px; } .step-header h2 { font-size: 1.1rem; font-weight: 600; color: var(--text); margin-top: .15rem; } .fields { display: flex; flex-direction: column; gap: .75rem; } .field label { display: block; font-size: .8rem; font-weight: 500; color: var(--text-muted); margin-bottom: .25rem; } .step-actions { display: flex; justify-content: space-between; margin-top: 1.5rem; } /* Report */ .report-header { text-align: center; padding: 1.5rem 0; border-bottom: 1px solid var(--border); margin-bottom: 1.5rem; } .report-org { margin-bottom: 1rem; } .report-org h1 { font-size: 1.5rem; color: var(--text); } .report-title-block h2 { font-size: 1.3rem; color: var(--text); margin-bottom: .35rem; } .report-client, .report-date { color: var(--text-muted); font-size: .85rem; } .section { margin-bottom: 1.5rem; } .section-title { font-size: 1rem; font-weight: 600; color: var(--text); margin-bottom: .75rem; padding-bottom: .35rem; border-bottom: 2px solid var(--accent); display: inline-block; } .card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: .75rem; } .card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: .75rem; } .info-table { width: 100%; border-collapse: collapse; } .info-table td { padding: .4rem .6rem; border-bottom: 1px solid var(--border-light); font-size: .8rem; } .info-table tr:last-child td { border-bottom: none; } .info-table td:first-child { width: 35%; color: var(--text-muted); } .badge { display: inline-block; padding: .15rem .6rem; border-radius: 999px; font-size: .7rem; font-weight: 500; } .badge.Starter { background: var(--green-bg); color: var(--green); } .badge.Standard { background: var(--cyan-bg); color: var(--cyan); } .badge.Advanced { background: var(--purple-bg); color: var(--purple); } .badge.Enterprise { background: var(--red-bg); color: var(--red); } .diagram { background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius); padding: .75rem; overflow-x: auto; } .ascii-diagram { font-family: 'Courier New', monospace; font-size: .65rem; line-height: 1.3; color: var(--text-muted); } .phase { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: .75rem; margin-bottom: .75rem; } .phase h4 { color: var(--purple); margin-bottom: .5rem; font-size: .9rem; } .phase ul { list-style: none; } .phase li { padding: .25rem 0; color: var(--text); font-size: .85rem; } .phase li::before { content: '→ '; color: var(--accent); } .tech-stack { display: flex; flex-direction: column; gap: .35rem; } .tech-item { display: flex; justify-content: space-between; align-items: center; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: .5rem .75rem; } .tech-label { color: var(--text-muted); font-size: .8rem; } .tech-val { color: var(--text); font-weight: 500; font-size: .85rem; text-align: right; } .report-footer { text-align: center; padding: 1.5rem 0; border-top: 1px solid var(--border); margin-top: 1.5rem; } .report-footer p { color: var(--text-muted); font-size: .75rem; margin-bottom: .75rem; } .link { color: var(--accent); text-decoration: none; } .link:hover { text-decoration: underline; } /* Rack */ .rack-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: .75rem; } .rack-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem; text-decoration: none; color: inherit; display: flex; gap: .75rem; transition: all .15s; } .rack-card:hover { border-color: var(--text-dim); } .rack-mini { width: 20px; display: flex; flex-direction: column; gap: 2px; } .rack-mini-u { width: 100%; height: 5px; background: var(--border); border-radius: 1px; } .rack-mini-u.filled { background: var(--accent); } .rack-card-body h4 { font-size: .9rem; color: var(--text); } .rack-layout { display: flex; gap: 1.5rem; align-items: flex-start; } @media (max-width: 768px) { .rack-layout { flex-direction: column; } } .rack-view { flex-shrink: 0; width: 240px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; } .rack-header { background: var(--bg-nav); padding: .35rem .75rem; font-size: .75rem; color: var(--text-muted); text-align: center; border-bottom: 1px solid var(--border); } .rack-body { display: flex; flex-direction: column; } .rack-empty { display: flex; align-items: center; padding: 0 .4rem; height: 28px; border-bottom: 1px solid var(--border-light); background: var(--bg); } .rack-u { width: 22px; font-size: .55rem; color: var(--text-dim); flex-shrink: 0; text-align: right; margin-right: .35rem; } .rack-device { display: flex; align-items: center; padding: 0 .4rem; gap: .25rem; border-bottom: 1px solid var(--border-light); cursor: pointer; transition: all .15s; font-size: .6rem; overflow: hidden; } .rack-device:hover { filter: brightness(1.15); } .rack-device.server { background: linear-gradient(90deg, var(--cyan-bg), var(--bg)); border-left: 2px solid var(--accent); } .rack-device.switch { background: linear-gradient(90deg, var(--purple-bg), var(--bg)); border-left: 2px solid var(--purple); } .rack-device.storage { background: linear-gradient(90deg, var(--green-bg), var(--bg)); border-left: 2px solid var(--green); } .rack-device.firewall { background: linear-gradient(90deg, var(--red-bg), var(--bg)); border-left: 2px solid var(--red); } .rack-device.patch_panel { background: linear-gradient(90deg, var(--orange-bg), var(--bg)); border-left: 2px solid var(--orange); } .rack-device.pdu { background: linear-gradient(90deg, var(--cyan-bg), var(--bg)); border-left: 2px solid var(--cyan); } .rack-device.ups { background: linear-gradient(90deg, var(--purple-bg), var(--bg)); border-left: 2px solid var(--purple); } .rack-device-name { flex: 1; font-weight: 500; color: var(--text); white-space: nowrap; font-size: .65rem; } /* Modal */ .modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,.7); z-index: 1000; display: flex; align-items: center; justify-content: center; } .modal-content { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 1.25rem; width: 90%; max-width: 560px; max-height: 80vh; overflow-y: auto; } .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: .75rem; } .modal-header h3 { color: var(--text); font-size: 1rem; } /* Network */ .device-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: .5rem; } .device-card { display: flex; align-items: center; gap: .5rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: .75rem; text-decoration: none; color: inherit; transition: all .15s; } .device-card:hover { border-color: var(--text-dim); } .device-icon { width: 32px; height: 32px; border-radius: var(--radius); display: flex; align-items: center; justify-content: center; font-size: 1rem; flex-shrink: 0; } .device-card.switch .device-icon { background: var(--purple-bg); color: var(--purple); } .device-card.router .device-icon { background: var(--cyan-bg); color: var(--cyan); } .device-card.firewall .device-icon { background: var(--red-bg); color: var(--red); } .device-info { flex: 1; display: flex; flex-direction: column; gap: .1rem; } .device-info strong { font-size: .85rem; color: var(--text); } .media-badge { display: inline-block; padding: .1rem .35rem; border-radius: 3px; font-size: .65rem; font-weight: 500; } .media-badge.copper { background: var(--orange-bg); color: var(--orange); } .media-badge.sfp, .media-badge.sfp\+ { background: var(--cyan-bg); color: var(--cyan); } .media-badge.qsfp { background: var(--purple-bg); color: var(--purple); } .media-badge.dac { background: var(--green-bg); color: var(--green); } .media-badge.fiber { background: var(--pink-bg); color: var(--pink); } .conn-list { display: flex; flex-direction: column; gap: .35rem; } .conn-item { background: var(--bg); border: 1px solid var(--border-light); border-radius: var(--radius); padding: .5rem .6rem; } .conn-name { font-size: .8rem; color: var(--text); font-weight: 500; } .conn-path { font-size: .7rem; color: var(--text-muted); } .conn-meta { font-size: .65rem; color: var(--accent); } /* Diagram grid */ .diagram-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: .75rem; } .diagram-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem; text-decoration: none; color: inherit; display: flex; gap: .75rem; transition: all .15s; position: relative; } .diagram-card:hover { border-color: var(--text-dim); } .diagram-card .diagram-card-body { padding-bottom: 1.5rem; } .diagram-card-type { width: 36px; height: 36px; border-radius: var(--radius); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: .7rem; flex-shrink: 0; } .diagram-card-type.data_architecture { background: var(--cyan-bg); color: var(--cyan); } .diagram-card-type.network_topology { background: var(--purple-bg); color: var(--purple); } .diagram-card-type.system_architecture { background: var(--green-bg); color: var(--green); } .diagram-card-body h4 { font-size: .85rem; color: var(--text); } code { background: var(--border-light); padding: .1rem .3rem; border-radius: 3px; font-size: .75rem; color: var(--accent); } @media print { body { background: #fff; color: #000; } .navbar { display: none; } .step, .card, .phase, .tech-item, .diagram, .detail-card, .client-card, .advice-card, .engagement-row, .task-item, .assess-item, .stat-card, .data-table { background: #f5f5f5; border-color: #ddd; } .report-header { border-bottom-color: #ddd; } .section-title { border-bottom-color: #58a6ff; } .logo h1, .step-header h2, .report-title-block h2, .report-org h1, .phase h4, .tech-val, .detail-card h3 { color: #000; } .btn, .nav-links, .header-actions, .btn-small { display: none; } .info-table td { border-bottom-color: #ddd; } .ascii-diagram { color: #333; } } /* 🔥 PREMIUM ANIMATIONS */ @keyframes pulse { 0%,100% { opacity:1 } 50% { opacity:.7 } } @keyframes pulse-glow { 0%,100% { box-shadow:0 0 0 0 rgba(88,166,255,.15) } 50% { box-shadow:0 0 15px 4px rgba(88,166,255,.08) } } @keyframes shimmer { 0% { background-position:-200% 0 } 100% { background-position:200% 0 } } @keyframes fadeInUp { from { opacity:0; transform:translateY(12px) } to { opacity:1; transform:translateY(0) } } @keyframes fadeIn { from { opacity:0 } to { opacity:1 } } @keyframes slideInLeft { from { opacity:0; transform:translateX(-8px) } to { opacity:1; transform:translateX(0) } } @keyframes gradientShift { 0% { background-position:0% 50% } 50% { background-position:100% 50% } 100% { background-position:0% 50% } } @keyframes float { 0%,100% { transform:translateY(0) } 50% { transform:translateY(-4px) } } @keyframes borderGlow { 0%,100% { border-color:var(--border) } 50% { border-color:rgba(88,166,255,.3) } } .pulse { animation: pulse 2s ease-in-out infinite } .pulse-glow { animation: pulse-glow 3s ease-in-out infinite } .fade-in { animation: fadeIn .4s ease-out } .fade-in-up { animation: fadeInUp .5s ease-out } .slide-in { animation: slideInLeft .4s ease-out } .gradient-text { background: linear-gradient(135deg, var(--accent), var(--purple), var(--accent)); background-size: 200% auto; -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: gradientShift 4s ease infinite; } .gradient-border { position:relative; background:var(--bg-card); border:1px solid transparent; background-clip:padding-box; } .gradient-border::before { content:''; position:absolute; inset:0; margin:-1px; border-radius:inherit; background:linear-gradient(135deg,var(--accent),transparent 40%,var(--purple) 60%,transparent); z-index:-1; opacity:.3; transition:opacity .3s; } .gradient-border:hover::before { opacity:.6 } /* Card premium hover */ .card-hover { transition: all .25s cubic-bezier(.4,0,.2,1); } .card-hover:hover { transform: translateY(-2px); box-shadow: 0 8px 30px rgba(0,0,0,.12), 0 0 0 1px var(--accent); border-color: var(--accent); } /* KPI pulse dots */ .kpi-dot { width:8px;height:8px;border-radius:50%;display:inline-block; background:var(--green);animation:pulse-glow 2s ease-in-out infinite; } /* Shimmer loading */ .shimmer { background:linear-gradient(90deg,var(--border-light) 25%,var(--border) 50%,var(--border-light) 75%); background-size:200% 100%; animation:shimmer 2s infinite; border-radius:var(--radius); height:16px; } /* Theme toggle */ .theme-toggle { width:44px;height:24px;border-radius:12px;background:var(--border); cursor:pointer;position:relative;transition:all .3s;border:none;flex-shrink:0; } .theme-toggle::after { content:'';position:absolute;top:2px;left:2px;width:20px;height:20px; border-radius:50%;background:var(--accent);transition:all .3s; box-shadow:0 1px 3px rgba(0,0,0,.2); } .theme-toggle.light { background:var(--accent) } .theme-toggle.light::after { left:22px; background:#fff } /* Light mode overrides */ body.light-mode { --bg: #f8f9fa; --bg-card: #ffffff; --bg-nav: #ffffff; --border: #e0e4e8; --border-light: #f0f2f5; --text: #1a1d21; --text-muted: #5a5f66; --text-dim: #8b9098; --accent: #0969da; --accent-hover: #0550ae; --green: #1a7f37; --green-bg: #dafbe1; --red: #cf222e; --red-bg: #ffebe9; --orange: #953800; --orange-bg: #fff1e5; --purple: #8250df; --purple-bg: #fbefff; --cyan: #0550ae; --cyan-bg: #ddf4ff; --pink: #bf3989; --pink-bg: #ffeff7; } body.light-mode .navbar { box-shadow: 0 1px 3px rgba(0,0,0,.04), 0 1px 6px rgba(0,0,0,.03) } body.light-mode .sidebar { box-shadow: 1px 0 3px rgba(0,0,0,.03) } body.light-mode .card-hover:hover { box-shadow: 0 4px 20px rgba(0,0,0,.06), 0 0 0 1px var(--accent) } body.light-mode .kpi-card { box-shadow: 0 1px 2px rgba(0,0,0,.02) } body.light-mode .kpi-card:hover { box-shadow: 0 2px 8px rgba(0,0,0,.06) } /* Smooth transitions for theme switch */ body, .navbar, .sidebar, .card, .kpi-card, .client-card, .data-table, input, select, textarea, .btn { transition: background-color .3s ease, color .3s ease, border-color .3s ease, box-shadow .3s ease; }