diff --git a/src/templates/dashboard_template.py b/src/templates/dashboard_template.py index f6ef2eb..04b653e 100644 --- a/src/templates/dashboard_template.py +++ b/src/templates/dashboard_template.py @@ -395,101 +395,47 @@ def generate_dashboard(stats: dict, dashboard_path: str = '') -> str: color: #8b949e; border: 1px solid #8b949e; }} - .timeline-container {{ + .timeline-section {{ margin-top: 15px; padding-top: 15px; border-top: 1px solid #30363d; }} - .timeline-title {{ - color: #58a6ff; - font-size: 13px; - font-weight: 600; + .timeline-container {{ + display: flex; + gap: 20px; + min-height: 200px; + }} + .timeline-column {{ + flex: 1; + min-width: 0; + overflow: auto; + max-height: 350px; + }} + .timeline-column:first-child {{ + flex: 1.5; + }} + .timeline-column:last-child {{ + flex: 1; }} .timeline-header {{ - display: flex; - justify-content: space-between; - align-items: center; - gap: 10px; - margin-bottom: 10px; - }} - .timeline {{ - position: relative; - padding-left: 30px; - }} - .timeline::before {{ - content: ''; - position: absolute; - left: 12px; - top: 5px; - bottom: 5px; - width: 3px; - background: #30363d; - }} - .timeline-item {{ - position: relative; - padding-bottom: 15px; - }} - .timeline-item:last-child {{ - padding-bottom: 0; - }} - .timeline-marker {{ - position: absolute; - left: -26px; - width: 16px; - height: 16px; - border-radius: 50%; - border: 2px solid #0d1117; - }} - .timeline-marker.attacker {{ - background: #f85149; - }} - .timeline-marker.good-crawler {{ - background: #3fb950; - }} - .timeline-marker.bad-crawler {{ - background: #f0883e; - }} - .timeline-marker.regular-user {{ - background: #58a6ff; - }} - .timeline-marker.unknown {{ - background: #8b949e; - }} - .timeline-content {{ - font-size: 12px; - }} - .timeline-category {{ - font-weight: 600; - }} - .timeline-timestamp {{ - color: #8b949e; - font-size: 11px; - margin-top: 2px; - }} - .timeline-arrow {{ - color: #8b949e; - margin: 0 7px; - }} - .reputation-container {{ - margin-top: 15px; - padding-top: 15px; - border-top: 1px solid #30363d; - }} - .reputation-title {{ color: #58a6ff; font-size: 13px; font-weight: 600; + margin-bottom: 12px; + padding-bottom: 8px; + border-bottom: 1px solid #30363d; }} - .reputation-badges {{ - display: flex; - flex-wrap: wrap; - gap: 6px; - align-items: center; + .reputation-title {{ + color: #8b949e; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + margin-bottom: 8px; }} .reputation-badge {{ display: inline-flex; align-items: center; - gap: 4px; + gap: 3px; padding: 4px 8px; background: #161b22; border: 1px solid #f851494d; @@ -498,28 +444,60 @@ def generate_dashboard(stats: dict, dashboard_path: str = '') -> str: color: #f85149; text-decoration: none; transition: all 0.2s; + margin-bottom: 6px; + margin-right: 6px; + white-space: nowrap; }} .reputation-badge:hover {{ background: #1c2128; border-color: #f85149; }} - .reputation-badge-icon {{ - font-size: 12px; - }} .reputation-clean {{ display: inline-flex; align-items: center; - gap: 6px; - padding: 4px 10px; + gap: 3px; + padding: 4px 8px; background: #161b22; border: 1px solid #3fb9504d; border-radius: 4px; font-size: 11px; color: #3fb950; + margin-bottom: 6px; }} - .reputation-clean-icon {{ - font-size: 13px; + .timeline {{ + position: relative; + padding-left: 28px; }} + .timeline::before {{ + content: ''; + position: absolute; + left: 11px; + top: 0; + bottom: 0; + width: 2px; + background: #30363d; + }} + .timeline-item {{ + position: relative; + padding-bottom: 12px; + font-size: 12px; + }} + .timeline-item:last-child {{ + padding-bottom: 0; + }} + .timeline-marker {{ + position: absolute; + left: -23px; + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid #0d1117; + }} + .timeline-marker.attacker {{ background: #f85149; }} + .timeline-marker.good-crawler {{ background: #3fb950; }} + .timeline-marker.bad-crawler {{ background: #f0883e; }} + .timeline-marker.regular-user {{ background: #58a6ff; }} + .timeline-marker.unknown {{ background: #8b949e; }} @@ -838,71 +816,62 @@ def generate_dashboard(stats: dict, dashboard_path: str = '') -> str: }} if (stats.category_history && stats.category_history.length > 0) {{ + html += '