feat: crisp HUD charts (drop blur glow) + richer cyber backdrop
All checks were successful
deploy / deploy (push) Successful in 58s

- Remove the drop-shadow blur from SlippageCurve/DepthHistory/HealthRadial so
  the segmented meter, depth trace and health dial render crisp.
- CyberGrid: add a dotted survey field, two targeting reticles, a katakana
  lexicon rail, corner brackets and a coordinate header alongside the existing
  survey lines and decoding labels.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Денис Зефиров 2026-07-12 00:13:14 +04:00
parent a0da0712c7
commit c05b185b99
4 changed files with 62 additions and 19 deletions

View file

@ -45,12 +45,7 @@ export function DepthHistory({
const gid = `dh-${salt}`;
return (
<svg
viewBox={`0 0 ${W} ${H}`}
className="h-14 w-full"
aria-hidden
style={{ filter: "drop-shadow(0 0 3px rgba(200, 255, 0, 0.4))" }}
>
<svg viewBox={`0 0 ${W} ${H}`} className="h-14 w-full" aria-hidden>
<defs>
<linearGradient id={gid} x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stopColor="#c8ff00" stopOpacity="0.22" />

View file

@ -24,7 +24,7 @@ export function HealthRadial({ score }: { score: number }) {
<circle cx={CX} cy={CY} r="37" fill="none" stroke="#1c1c1c" strokeWidth="1" />
{/* dial ticks */}
<g style={{ filter: `drop-shadow(0 0 2.5px ${color})` }}>
<g>
{Array.from({ length: TICKS }, (_, i) => {
const deg = START + (i / (TICKS - 1)) * SWEEP;
const on = i < lit;

View file

@ -32,7 +32,6 @@ export function SlippageCurve({ liquidityUsd }: { liquidityUsd: number }) {
preserveAspectRatio="none"
viewBox={`0 0 ${CELLS * STEP} 12`}
aria-hidden
style={{ filter: `drop-shadow(0 0 2.5px ${color})` }}
>
{Array.from({ length: CELLS }, (_, i) => {
const lit = i < on;

View file

@ -1,9 +1,31 @@
import type { CSSProperties } from "react";
import { Scramble } from "./Scramble";
/** A small targeting reticle: dashed halo, ring, crosshair ticks, center dot. */
function Reticle({ className, style }: { className?: string; style?: CSSProperties }) {
return (
<svg viewBox="0 0 64 64" className={className} style={style} aria-hidden>
<circle cx="32" cy="32" r="27" fill="none" stroke="#8a5cff" strokeWidth="0.6" strokeOpacity="0.22" strokeDasharray="1.5 4.5" />
<circle cx="32" cy="32" r="19" fill="none" stroke="#8a5cff" strokeWidth="1" strokeOpacity="0.55" />
<circle cx="32" cy="32" r="1.8" fill="#8a5cff" fillOpacity="0.8" />
<g stroke="#8a5cff" strokeWidth="1" strokeOpacity="0.55">
<line x1="32" y1="5" x2="32" y2="14" />
<line x1="32" y1="50" x2="32" y2="59" />
<line x1="5" y1="32" x2="14" y2="32" />
<line x1="50" y1="32" x2="59" y2="32" />
</g>
</svg>
);
}
// Romanised DeFi lexicon in katakana/kanji, read top-to-bottom on the rail.
const TERMS = "ハッシュ ・ 流動性 ・ デプス ・ ヴォルト ・ チェーン ・ 報酬 ・ 清算 ・ スプレッド ・ 市場深度";
/**
* Site-wide cyber backdrop: survey column lines, cross marks, barcode ticks and
* decoding mono/kanji labels. Fixed behind all content, palette-clean, static
* except the two decoding labels. Drop one per non-hero screen.
* Site-wide cyber backdrop: dotted survey field, column lines with cross
* marks, targeting reticles, decoding mono/kanji labels and corner brackets.
* Fixed behind all content, palette-clean, static except the decoding labels.
* Drop one per non-hero screen.
*/
export function CyberGrid() {
return (
@ -11,6 +33,15 @@ export function CyberGrid() {
aria-hidden
className="pointer-events-none fixed inset-0 -z-10 overflow-hidden"
>
{/* dotted survey field */}
<div
className="absolute inset-0 opacity-40"
style={{
backgroundImage: "radial-gradient(#3d3d3d 0.5px, transparent 0.6px)",
backgroundSize: "24px 24px",
}}
/>
{/* survey column lines with cross marks */}
<div className="relative mx-auto h-full max-w-7xl px-4 md:px-8">
{[25, 50, 75].map((p) => (
@ -32,23 +63,41 @@ export function CyberGrid() {
))}
</div>
{/* corner locators */}
{/* corner brackets */}
<div className="absolute left-3 top-3 hidden h-6 w-6 border-l border-t border-edge/60 md:block" />
<div className="absolute bottom-3 right-3 hidden h-6 w-6 border-b border-r border-edge/60 md:block" />
{/* top coordinate header */}
<span className="absolute right-4 top-4 hidden font-mono text-[9px] uppercase tracking-[0.3em] text-fog-dim/45 md:block">
RH-L2 4663 E-2026.07
</span>
{/* targeting reticles */}
<Reticle className="absolute right-8 top-16 hidden h-16 w-16 xl:block" style={{ opacity: 0.55 }} />
<Reticle className="absolute left-[7%] top-[46%] hidden h-11 w-11 xl:block" style={{ opacity: 0.35 }} />
{/* katakana lexicon rail */}
<span
className="absolute right-5 top-1/2 hidden -translate-y-1/2 font-mono text-[9px] uppercase tracking-[0.28em] text-fog-dim/40 xl:block"
style={{ writingMode: "vertical-rl" }}
>
{TERMS}
</span>
{/* corner locators (decoding labels) */}
<span className="absolute left-4 top-28 hidden font-mono text-[9px] uppercase leading-[1.6] tracking-[0.24em] text-fog-dim/45 md:block">
<Scramble text="Desk 00 // Surface data" interval={13000} />
<br />
</span>
<span
className="absolute right-4 top-1/3 hidden font-mono text-[9px] uppercase tracking-[0.3em] text-fog-dim/45 xl:block"
style={{ writingMode: "vertical-rl" }}
>
// RH-L2 4663
</span>
<span className="absolute bottom-8 left-4 hidden font-mono text-[9px] uppercase tracking-[0.22em] text-fog-dim/40 md:block">
<Scramble text="Accuracy not guaranteed" interval={15000} /> // 市場深度
</span>
<span className="absolute bottom-8 right-4 hidden font-mono text-[9px] uppercase tracking-[0.22em] text-fog-dim/35 lg:block">
// Surface data
</span>
</div>
);
}