Files
regress/frontend/src/style.css
T
ssmithx bb03bfc365 Go global: worldwide BTC Map sync, marker clustering, response compression
- Sync now pulls every BTC Map place worldwide (~29k live), not just
  Madeira — dropped BTCMAP_CENTER_LAT/LON/RADIUS_KM entirely.
- Incremental via a stored watermark (settings.btcmap_synced_since):
  only fetches what changed since the last sync, not the whole dataset
  every time. Handles deletions too (BTC Map delistings correctly evict
  the local place + cascade its claim/links, not just go unclaimed).
- Real bug caught and fixed before it shipped: tried BTC Map's own
  recommended updated_since+limit pagination first, but their timestamps
  mix millisecond and whole-second precision, and naive string comparison
  across that isn't chronologically safe — silently truncated a real
  sync to ~4,000 of ~42,000 records with no error. Measured the
  alternative (single unpaginated request) instead: 2-3s for the full
  dataset, simpler and actually correct. Full writeup in
  services/btcmap.ts, regression test for the specific bug in
  services/btcmap.test.ts.
- @fastify/compress added — the places list is now tens of thousands of
  rows, gzip/br/zstd auto-negotiated.
- Also fixed while touching dependencies: @fastify/static had a real
  high-severity path-traversal/auth-bypass advisory (GHSA-pr96-94w5-mx2h
  et al) affecting the version we were pinned to — bumped to the patched
  10.1.2.
- Frontend: leaflet.markercluster (raw per-marker rendering doesn't scale
  to tens of thousands of points), cyberpunk-themed cluster icons to
  match the existing HUD styling, batch marker insertion (addLayers, not
  a per-marker addLayer loop) since that's dramatically faster at this
  scale. Default map view is now world-scale, recentering on the
  player's location if geolocation is available.
- 60 backend tests passing throughout (7 new for the sync rewrite).
2026-08-05 17:32:54 +00:00

104 lines
2.9 KiB
CSS

@tailwind base;
@tailwind components;
@tailwind utilities;
html, body, #app {
height: 100%;
margin: 0;
}
body {
background: #050508;
color: #d8fbff;
font-family: 'Share Tech Mono', monospace;
}
h1, h2, .font-display {
font-family: 'Orbitron', sans-serif;
}
/* Subtle animated scanline field over the whole app — cheap, pure-CSS. */
#app::before {
content: '';
position: fixed;
inset: 0;
pointer-events: none;
z-index: 2000;
background-image: repeating-linear-gradient(
0deg,
rgba(0, 255, 242, 0.035) 0px,
rgba(0, 255, 242, 0.035) 1px,
transparent 1px,
transparent 3px
);
mix-blend-mode: screen;
}
.text-glow-cyan { text-shadow: 0 0 8px rgba(0, 255, 242, 0.85); }
.text-glow-orange { text-shadow: 0 0 8px rgba(255, 95, 31, 0.9); }
.text-glow-green { text-shadow: 0 0 8px rgba(57, 255, 20, 0.9); }
.hud-panel {
background: rgba(8, 10, 20, 0.88);
backdrop-filter: blur(10px);
border: 1px solid rgba(0, 255, 242, 0.35);
box-shadow: 0 0 20px rgba(0, 255, 242, 0.12), inset 0 0 30px rgba(0, 255, 242, 0.04);
clip-path: polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 12px 100%, 0 calc(100% - 12px));
}
/* Darken + tint the CARTO dark tiles a bit further and desaturate slightly
so our neon markers/links pop harder against the basemap. */
.leaflet-tile-pane {
filter: brightness(0.75) saturate(1.3) hue-rotate(-6deg);
}
.leaflet-container {
background: #050508 !important;
}
.leaflet-popup-content-wrapper,
.leaflet-tooltip {
background: rgba(8, 10, 20, 0.92) !important;
color: #d8fbff !important;
border: 1px solid rgba(0, 255, 242, 0.4) !important;
font-family: 'Share Tech Mono', monospace !important;
box-shadow: 0 0 12px rgba(0, 255, 242, 0.25) !important;
}
.leaflet-popup-tip {
background: rgba(8, 10, 20, 0.92) !important;
}
.regress-portal-marker {
filter: drop-shadow(0 0 4px var(--portal-glow, #9ca3af));
}
.regress-portal-marker.claimed {
animation: portal-pulse 2.4s ease-in-out infinite;
}
@keyframes portal-pulse {
0%, 100% { filter: drop-shadow(0 0 4px var(--portal-glow, #9ca3af)); }
50% { filter: drop-shadow(0 0 10px var(--portal-glow, #9ca3af)); }
}
.regress-link-orange { filter: drop-shadow(0 0 4px #ff5f1f); }
.regress-link-green { filter: drop-shadow(0 0 4px #39ff14); }
.regress-field-orange { filter: drop-shadow(0 0 6px #ff5f1f); }
.regress-field-green { filter: drop-shadow(0 0 6px #39ff14); }
/* Reskin leaflet.markercluster's default light-green bubble look to match
the HUD theme — overrides MarkerCluster.Default.css. */
.regress-cluster div {
width: 100%;
height: 100%;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: radial-gradient(circle at 35% 35%, rgba(0, 255, 242, 0.35), rgba(0, 255, 242, 0.12) 70%);
border: 2px solid #00fff2;
color: #d8fbff;
font-family: 'Share Tech Mono', monospace;
font-weight: bold;
font-size: 12px;
box-shadow: 0 0 10px rgba(0, 255, 242, 0.5);
}