zektyc/public/zmap/web/style.css
riricdev 8e7ec41f18 chore: checkpoint initial — Zektyc dataset, avant humanisation
- site vitrine + fingerprint test + zmap + z-panel
- remplacement duckdns -> riricdev.tail5ea5cd.ts.net (canonical/og/alternates/docs)
- suppression du token DuckDNS (plus utilisé)
2026-09-06 13:03:25 +02:00

99 lines
6.9 KiB
CSS

*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#0c0c0f;--surface:#16161a;--surface2:#1e1e24;--border:#2a2a32;--text:#e8e8ed;--dim:#8888a0;--accent:#3b82f6;--accent2:#2563eb;--green:#22c55e;--red:#ef4444;--orange:#f59e0b;--radius:12px;--radius-sm:8px}
html,body{height:100%;overflow:hidden}
body{font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased}
#map{position:fixed;top:0;left:0;right:0;bottom:0;z-index:0}
/* --- Top bar --- */
.topbar{position:fixed;top:12px;left:12px;right:12px;z-index:1000;display:flex;gap:8px;align-items:center}
.search-wrap{flex:1;position:relative}
.search-wrap input{width:100%;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:12px 14px 12px 40px;color:var(--text);font-size:14px;outline:none;transition:border-color .2s}
.search-wrap input:focus{border-color:var(--accent)}
.search-wrap input::placeholder{color:var(--dim)}
.search-wrap .icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--dim);pointer-events:none}
.search-results{position:absolute;top:calc(100% + 4px);left:0;right:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;display:none;max-height:320px;overflow-y:auto;box-shadow:0 8px 32px rgba(0,0,0,.5);z-index:2000}
.search-results.open{display:block}
.search-results .sr-item{padding:10px 14px;cursor:pointer;font-size:13px;border-bottom:1px solid var(--border);transition:background .15s}
.search-results .sr-item:last-child{border-bottom:none}
.search-results .sr-item:hover{background:var(--surface2)}
.search-results .sr-item .sr-type{font-size:11px;color:var(--dim)}
.icon-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);width:44px;height:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--text);transition:all .2s;flex-shrink:0}
.icon-btn:hover{background:var(--surface2);border-color:var(--accent)}
.icon-btn.active{background:var(--accent);border-color:var(--accent);color:#fff}
/* --- Side panel --- */
.panel{position:fixed;top:68px;left:12px;z-index:1000;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:0;width:340px;max-height:calc(100vh - 92px);overflow:hidden;display:none;box-shadow:0 8px 32px rgba(0,0,0,.4)}
.panel.open{display:block}
.panel-head{padding:16px 16px 0;display:flex;align-items:center;justify-content:space-between}
.panel-head h2{font-size:16px;font-weight:700}
.panel-close{background:none;border:none;color:var(--dim);cursor:pointer;padding:4px;font-size:20px}
.panel-close:hover{color:var(--text)}
.panel-body{padding:12px 16px 16px}
.point-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.point-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
.point-dot.from{background:var(--green)}
.point-dot.to{background:var(--red)}
.point-row input{flex:1;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 10px;color:var(--text);font-size:13px;outline:none}
.point-row input:focus{border-color:var(--accent)}
.actions{display:flex;gap:6px;margin-top:4px}
.btn{background:var(--accent);color:#fff;border:none;border-radius:var(--radius-sm);padding:10px 16px;font-size:13px;font-weight:600;cursor:pointer;transition:background .2s}
.btn:hover{background:var(--accent2)}
.btn:disabled{opacity:.35;cursor:default}
.btn-outline{background:transparent;border:1px solid var(--border);color:var(--text)}
.btn-outline:hover{background:var(--surface2);border-color:var(--accent)}
.btn-danger{background:var(--red)}
.btn-danger:hover{background:#dc2626}
/* Route info */
.route-info{background:var(--bg);border-radius:var(--radius-sm);padding:12px;margin-top:10px;font-size:13px;line-height:1.7}
.route-info .ri-main{font-size:18px;font-weight:700;margin-bottom:2px}
.route-info .ri-sub{color:var(--dim);font-size:12px}
.route-info .ri-stat{display:inline-block;margin-right:12px}
.route-info .ri-stat b{color:var(--accent)}
/* Speed legend */
.speed-legend{display:flex;gap:4px;margin-top:10px;flex-wrap:wrap}
.speed-legend span{padding:4px 8px;border-radius:4px;font-size:11px;font-weight:700;letter-spacing:.3px}
.sl-20{background:#ef4444;color:#fff}.sl-40{background:#f59e0b;color:#000}.sl-60{background:#eab308;color:#000}
.sl-80{background:#22c55e;color:#000}.sl-100{background:#06b6d4;color:#000}.sl-120{background:#3b82f6;color:#fff}
.sl-max{background:#8b5cf6;color:#fff}.sl-unk{background:#555;color:#aaa}
.speed-bar{display:flex;height:8px;border-radius:4px;overflow:hidden;margin-top:6px}
.speed-bar div{height:100%;transition:width .3s}
.speed-distrib{display:flex;gap:8px;margin-top:4px;flex-wrap:wrap;font-size:11px;color:var(--dim)}
.speed-distrib span{display:flex;align-items:center;gap:3px}
.speed-distrib .sd-dot{width:8px;height:8px;border-radius:2px;flex-shrink:0}
.hint{margin-top:12px;font-size:11px;color:var(--dim);text-align:center}
/* --- GPS button --- */
.gps-active .gps-dot{animation:pulse 1.5s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(59,130,246,.5)}50%{box-shadow:0 0 0 8px rgba(59,130,246,0)}}
/* --- Loading --- */
/* --- Leaflet overrides --- */
.leaflet-control-zoom{border:none!important}
.leaflet-control-zoom a{background:var(--surface)!important;color:var(--text)!important;border:1px solid var(--border)!important;border-radius:var(--radius-sm)!important;width:36px!important;height:36px!important;line-height:36px!important;font-size:18px!important}
.leaflet-control-zoom a:hover{background:var(--surface2)!important}
.leaflet-control-zoom{gap:0;margin-right:54px!important}
/* --- Marker popups --- */
.leaflet-popup-content-wrapper{background:var(--surface)!important;color:var(--text)!important;border-radius:var(--radius-sm)!important;border:1px solid var(--border)!important;box-shadow:0 4px 16px rgba(0,0,0,.4)!important}
.leaflet-popup-tip{background:var(--surface)!important;border:1px solid var(--border)!important}
.leaflet-popup-content{font-size:13px;margin:8px 12px!important}
.gps-dot{width:14px;height:14px;background:var(--accent);border:3px solid #fff;border-radius:50%;box-shadow:0 0 8px rgba(59,130,246,.6)}
.station-dot{width:10px;height:10px;background:var(--green);border:2px solid #fff;border-radius:50%}
.loading{display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2000;background:var(--surface);padding:14px 22px;border-radius:var(--radius);font-size:13px;border:1px solid var(--border);box-shadow:0 8px 32px rgba(0,0,0,.5);align-items:center;gap:8px}
.loading.show{display:flex}
.spinner{width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .6s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
/* --- Responsive --- */
@media(max-width:600px){
.topbar{top:8px;left:8px;right:8px}
.panel{left:8px;right:8px;width:auto;top:60px;max-height:55vh}
.map-ctrls.top{top:8px}
.map-ctrls.bottom{bottom:8px}
}