@font-face { font-family: "Bender"; src: url("fonts/Bender.woff2") format("woff2"), url("fonts/Bender.woff") format("woff"); font-weight: 400; font-style: normal; } @font-face { font-family: "Bender"; src: url("fonts/Bender-Bold.woff2") format("woff2"), url("fonts/Bender-Bold.woff") format("woff"); font-weight: 700; font-style: normal; } @font-face { font-family: "Bender"; src: url("fonts/Bender-Light.woff2") format("woff2"), url("fonts/Bender-Light.woff") format("woff"); font-weight: 300; font-style: normal; } /* ============================================================ Base ============================================================ */ :root { --bg: #0f141a; --surface: #171e26; --surface-light: #1c252f; --border: #2b3743; --text: #e6edf3; --muted: #8b98a6; --green: #45d483; --yellow: #e5c07b; --red: #ef6262; --accent: #69a7ff; --terminal: #0a0f14; } * { box-sizing: border-box; } html { min-height: 100%; } body { margin: 0; padding: 0; min-height: 100vh; font-family: "Bender", Arial, Helvetica, sans-serif; background: var(--bg); color: var(--text); } a { color: var(--accent); text-decoration: none; } a:hover { color: #9bc4ff; } /* ============================================================ Report header ============================================================ */ .report-header { position: sticky; top: 0; z-index: 1000; width: 100%; background: rgba(15, 20, 26, 0.96); border-bottom: 1px solid var(--border); backdrop-filter: blur(12px); } .report-header-inner { width: 100%; max-width: 1800px; margin: 0 auto; min-height: 68px; display: flex; align-items: center; gap: 36px; padding: 0 30px; } .report-brand { flex: 0 0 auto; display: flex; flex-direction: column; justify-content: center; color: var(--text); text-decoration: none; white-space: nowrap; } .report-brand-title { font-size: 19px; font-weight: 700; letter-spacing: 0.4px; line-height: 1.1; } .report-brand-subtitle { margin-top: 3px; color: var(--muted); font-size: 12px; font-weight: 400; letter-spacing: 0.7px; line-height: 1.1; } .report-brand:hover { color: var(--text); text-decoration: none; } .report-nav { display: flex; align-items: center; gap: 6px; min-width: 0; overflow-x: auto; scrollbar-width: thin; } .report-nav a { display: inline-flex; align-items: center; min-height: 38px; padding: 0 14px; border-radius: 7px; color: var(--muted); font-size: 13px; font-weight: 700; letter-spacing: 0.7px; white-space: nowrap; transition: color 0.15s ease, background 0.15s ease; } .report-nav a:hover { color: var(--text); background: var(--surface-light); text-decoration: none; } .report-nav a.active { color: var(--text); background: var(--surface-light); box-shadow: inset 0 -2px 0 var(--accent); } /* ============================================================ Page layout ============================================================ */ .wrapper { min-height: calc(100vh - 68px); display: block; } .content { width: 100%; max-width: 1800px; margin: 0 auto; padding: 30px; } .page-title { margin-top: 0; margin-bottom: 8px; font-size: 34px; font-weight: 700; letter-spacing: 0.2px; } .page-description { color: var(--muted); margin-bottom: 30px; font-size: 15px; } /* ============================================================ Cards ============================================================ */ .card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 22px; margin-bottom: 24px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.20); } .card h2 { margin-top: 0; margin-bottom: 20px; color: var(--text); font-size: 21px; } .card h3 { margin-top: 0; color: var(--text); } /* ============================================================ Statistics ============================================================ */ .stats-grid { display: grid; grid-template-columns: repeat( auto-fit, minmax(180px, 1fr) ); gap: 18px; } .stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; padding: 18px; text-align: center; } .stat-value { margin-bottom: 8px; color: var(--accent); font-size: 34px; font-weight: 700; } .stat-title { color: var(--muted); font-size: 14px; } /* ============================================================ Tables ============================================================ */ table { width: 100%; border-collapse: collapse; } th { background: var(--surface-light); color: var(--text); font-weight: 700; text-align: left; padding: 12px; border-bottom: 2px solid var(--border); position: sticky; top: 0; z-index: 2; } td { padding: 10px 12px; border-bottom: 1px solid var(--border); vertical-align: top; color: var(--text); } tbody tr:hover { background: rgba(105, 167, 255, 0.05); } .table-container { overflow-x: auto; overflow-y: auto; max-height: 700px; border: 1px solid var(--border); border-radius: 10px; } /* ============================================================ Search ============================================================ */ .search { width: 100%; padding: 12px; font-family: "Bender", Arial, Helvetica, sans-serif; font-size: 15px; color: var(--text); background: var(--terminal); border: 1px solid var(--border); border-radius: 8px; margin-bottom: 18px; } .search:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px rgba(105, 167, 255, 0.12); } /* ============================================================ Buttons ============================================================ */ .button { display: inline-block; background: var(--accent); color: #0f141a; padding: 10px 18px; border: 2px outset ButtonFace; border-radius: 7px; font-weight: 700; text-decoration: none; transition: background 0.15s ease, transform 0.15s ease; } .vendor-actions { display: flex; justify-content: center; margin-top: 24px; } .button:hover { background: #8abaff; color: #0f141a; text-decoration: none; } .button:active { border-style: inset; transform: translateY(1px); } /* ============================================================ Badges ============================================================ */ .badge { display: inline-block; padding: 4px 10px; border-radius: 999px; font-size: 12px; font-weight: 700; } /* ============================================================ Information block ============================================================ */ .info { background: var(--surface-light); border-left: 4px solid var(--accent); padding: 15px; border-radius: 7px; margin-bottom: 20px; } code { background: var(--terminal); color: var(--accent); padding: 2px 6px; border-radius: 5px; } /* ============================================================ Dashboard grids ============================================================ */ .report-grid { display: grid; grid-template-columns: repeat( auto-fit, minmax(420px, 1fr) ); gap: 24px; } .vendor-sync { width: 100%; } .vendor-sync-empty { text-align: center; } /* ============================================================ Session map ============================================================ */ #map { width: 100%; height: 700px; border-radius: 12px; border: 1px solid var(--border); margin-bottom: 20px; overflow: hidden; } .map-layer-dot { display: inline-block; width: 14px; height: 14px; flex: 0 0 14px; box-sizing: border-box; border: 1px solid #FFFFFF; border-radius: 50%; } .map-layer-dot-gps { background: #1565C0; } .map-layer-dot-handshake { background: #E5C07B; } .map-layer-dot-password { background: #E53935; } .map-layer-dot-all { background: #43A047; } .session-map-title { display: flex; align-items: center; flex-wrap: wrap; gap: 18px; } .session-map-title-text { flex: 0 0 auto; } .session-map-controls { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 14px; font-size: 13px; font-weight: normal; } .session-map-controls label { display: inline-flex; align-items: center; gap: 6px; color: var(--text); cursor: pointer; white-space: nowrap; } .session-map-controls input { margin: 0; } /* ============================================================ Footer ============================================================ */ .footer { margin-top: 40px; padding-bottom: 20px; text-align: center; color: var(--muted); font-size: 14px; } /* ============================================================ Responsive ============================================================ */ @media (max-width: 1000px) { .report-header-inner { min-height: auto; align-items: flex-start; flex-direction: column; gap: 8px; padding: 14px 20px; } .report-nav { width: 100%; } .content { padding: 20px; } .stats-grid { grid-template-columns: 1fr; } .report-grid { grid-template-columns: 1fr; } #map { height: 500px; } } @media (max-width: 600px) { .report-brand { font-size: 17px; } .report-nav { gap: 2px; } .report-nav a { padding: 0 10px; font-size: 12px; } .content { padding: 15px; } .page-title { font-size: 28px; } .card { padding: 16px; } } /* ============================================================ Search page ============================================================ */ .search-card { margin-bottom: 24px; } .search-form { margin-top: 20px; } .search-label { display: block; margin-bottom: 8px; color: var(--muted); font-size: 13px; font-weight: 700; text-transform: uppercase; } .search-input-row { display: flex; gap: 12px; align-items: stretch; } .search-input { flex: 1; min-width: 0; padding: 12px 14px; font-family: "Bender", Arial, Helvetica, sans-serif; font-size: 15px; color: var(--text); background: var(--terminal); border: 1px solid var(--border); border-radius: 8px; } .search-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px rgba(105, 167, 255, 0.12); } .search-suggestions { margin-top: 22px; } .search-suggestions-title { margin-bottom: 10px; color: var(--muted); font-size: 13px; font-weight: 700; text-transform: uppercase; } .search-vendor-suggestions { display: grid; grid-template-columns: repeat( auto-fit, minmax(280px, 1fr) ); gap: 5px 24px; padding: 4px 0; } .search-vendor-item { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; padding: 4px 0; color: var(--text); border-bottom: 1px solid rgba(43, 55, 67, 0.45); font-size: 13px; } .search-vendor-name { min-width: 0; overflow-wrap: anywhere; user-select: text; cursor: text; } .search-vendor-count { flex: 0 0 auto; color: var(--muted); font-size: 11px; user-select: text; } .search-future { opacity: 0.78; } .search-future-content { margin-top: 12px; padding: 14px; color: var(--muted); background: var(--terminal); border: 1px dashed var(--border); border-radius: 8px; } .search-results { min-height: 300px; } .search-results-header { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-bottom: 18px; } .search-results-header h2 { margin-bottom: 5px; } .search-status { color: var(--muted); font-size: 13px; } .search-query { margin-bottom: 5px; color: var(--text); font-size: 13px; font-weight: 700; } .search-matched-vendors { margin-bottom: 18px; padding: 12px 14px; background: var(--terminal); border: 1px solid var(--border); border-radius: 8px; } .search-matched-vendors-title { margin-bottom: 8px; color: var(--muted); font-size: 12px; font-weight: 700; text-transform: uppercase; } .search-matched-vendors-list { display: grid; gap: 4px; } .search-matched-vendor { display: flex; align-items: baseline; justify-content: space-between; gap: 20px; padding: 3px 0; color: var(--text); font-size: 13px; } .search-matched-vendor span:first-child { min-width: 0; overflow-wrap: anywhere; } .search-matched-vendor span:last-child { flex: 0 0 auto; color: var(--muted); font-size: 11px; } .search-export { white-space: nowrap; } .search-map-controls { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 14px; padding: 10px 12px; background: var(--surface-light); border: 1px solid var(--border); border-radius: 8px; } .search-map-controls label { display: inline-flex; align-items: center; gap: 6px; color: var(--text); font-size: 13px; cursor: pointer; } .search-map-controls input { margin: 0; } .search-map-controls .map-layer-dot-password { background: #E53935; } .search-map-controls .map-layer-dot-handshake { background: #e5c07b; } .search-map-controls .map-layer-dot-other { background: #69a7ff; } .search-map { width: 100%; height: 700px; border: 1px solid var(--border); border-radius: 12px; overflow: hidden; } .search-map-empty { padding: 60px 20px; color: var(--muted); text-align: center; background: var(--terminal); border: 1px dashed var(--border); border-radius: 10px; } /* ============================================================ Search map popups ============================================================ */ .search-popup { min-width: 260px; max-width: 380px; color: #e6edf3; font-family: "Bender", Arial, Helvetica, sans-serif; font-size: 13px; line-height: 1.45; } .search-popup-title { margin-bottom: 8px; color: #ffffff; font-size: 16px; font-weight: 700; } .search-popup-line { margin: 3px 0; } .search-popup-category { display: inline-block; margin: 10px 0; padding: 5px 9px; border-radius: 5px; font-size: 12px; font-weight: 700; letter-spacing: 0.04em; } .search-popup-category.password { background: rgba(69, 212, 131, 0.16); color: #45d483; } .search-popup-category.handshake { background: rgba(229, 192, 123, 0.16); color: #e5c07b; } .search-popup-category.other { background: rgba(105, 167, 255, 0.16); color: #69a7ff; } .search-popup-section { margin-top: 9px; padding-top: 8px; border-top: 1px solid rgba(43, 55, 67, 0.8); } .search-popup-password-item { margin-bottom: 8px; } .search-popup-password { padding: 8px 10px; color: #ffffff; background: #0a0f14; border: 1px solid #2b3743; border-radius: 6px; font-family: monospace; font-size: 14px; word-break: break-word; } .search-popup-meta { margin-top: 3px; color: #8b98a6; font-size: 11px; } .search-popup-list { margin-top: 4px; color: #c5ced7; font-size: 12px; } .search-popup-muted { color: #8b98a6; } @media (max-width: 700px) { .search-input-row { flex-direction: column; } .search-results-header { align-items: flex-start; flex-direction: column; } .search-export { width: 100%; } .search-map { height: 500px; } } /* ============================================================ MapLibre popups ============================================================ */ body .maplibregl-popup-content { padding: 12px 14px; color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); } /* Popup arrow */ body .maplibregl-popup-anchor-top .maplibregl-popup-tip { border-bottom-color: var(--surface); } body .maplibregl-popup-anchor-top-left .maplibregl-popup-tip { border-bottom-color: var(--surface); } body .maplibregl-popup-anchor-top-right .maplibregl-popup-tip { border-bottom-color: var(--surface); } body .maplibregl-popup-anchor-bottom .maplibregl-popup-tip { border-top-color: var(--surface); } body .maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip { border-top-color: var(--surface); } body .maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip { border-top-color: var(--surface); } body .maplibregl-popup-anchor-left .maplibregl-popup-tip { border-right-color: var(--surface); } body .maplibregl-popup-anchor-right .maplibregl-popup-tip { border-left-color: var(--surface); } /* Popup close button */ body .maplibregl-popup-close-button { color: #ffffff; } body .maplibregl-popup-close-button:hover { color: #ffffff; background: rgba(255, 255, 255, 0.08); } .hashcat-card { margin-bottom: 24px; } .hashcat-command, .hashcat-format { margin: 16px 0; padding: 16px; overflow-x: auto; border-radius: 6px; font-family: monospace; } .hashcat-file-row { display: flex; align-items: center; gap: 16px; margin-top: 20px; } .hashcat-file-row input[type="file"] { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; } .wifitrip-file-row { display: flex; align-items: center; gap: 16px; margin-top: 20px; } .wifitrip-file-row input[type="file"] { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; } .wifitrip-file-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .hashcat-file-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .hashcat-preflight { margin-top: 20px; } .hashcat-preflight .stats-grid { margin-top: 20px; }