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é)
This commit is contained in:
commit
8e7ec41f18
104 changed files with 19256 additions and 0 deletions
99
public/zmap/web/style.css
Normal file
99
public/zmap/web/style.css
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
*{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}
|
||||
}
|
||||
Loading…
Reference in a new issue