w5isp.com/static/css/scene.css
Graham McIntire 2097dbc018
Modernize why-signals-bend with project findings, polish scenes
Rewrite the NLOS post to reflect what microwaveprop has learned:
M-refractivity and dM/dh as the actual duct discriminant, the four
duct taxonomy with radiation ducts as the North Texas mechanism,
binary duct detection as a coin flip, low pressure beating high,
shallow boundary layer winning, PWAT sweet spot, seasonal pattern
(spring worst, summer best), troposcatter as the floor, and real
numbers for the 65 km QTH-to-W5HN/B path.

New interactive scenes: N vs M side-by-side refractivity profile,
pressure/HPBL/binary-duct bar chart, band-vs-dawn enhancement,
PWAT sweet spot with draggable cursor, monthly ducting probability,
and a 10 GHz link-budget decomposition showing how the 36 dB
diffraction gap gets closed.

Polish pass across all scenes: softer palette, rounded stroke
caps/joins, prettier slider styling in scene.css and nlos.css,
signal-pulse animations on NF cascade / single-stage / LNA
placement, trail persistence on the ray-trace scene, animated
glints along trapped rays in the duct scene, and animated TCP
sequence diagrams.

Add local-serve preview mode so future-dated posts show up on
zola serve but stay hidden on the deployed build.
2026-04-22 14:10:58 -05:00

155 lines
3.8 KiB
CSS

/* Scene styles, polished. Only loaded by posts that link this stylesheet. */
.scene-host {
--s-bg: #1a1d24;
--s-bg-2: #232831;
--s-panel: #242932;
--s-fg: #d8dce4;
--s-dim: #8189a0;
--s-grid: #2d323d;
--s-grid-strong: #3a414e;
--s-blue: #78b5f3;
--s-cyan: #6dc5d3;
--s-green: #9dca83;
--s-amber: #d6a86a;
--s-red: #e58089;
--s-yellow: #e2c37d;
--s-magenta: #c78de0;
--s-shadow: 0 10px 30px rgba(0, 0, 0, 0.4), 0 2px 6px rgba(0, 0, 0, 0.25);
}
.scene-box {
margin: 2.75rem 0;
background:
radial-gradient(ellipse at top left, rgba(120, 181, 243, 0.035) 0%, transparent 55%),
radial-gradient(ellipse at bottom right, rgba(199, 141, 224, 0.025) 0%, transparent 55%),
linear-gradient(180deg, var(--s-bg) 0%, var(--s-bg-2) 100%);
border: 1px solid var(--s-grid);
border-radius: 10px;
padding: 0.85rem 0.85rem 1.1rem;
box-shadow: var(--s-shadow);
}
.scene-box canvas {
display: block;
width: 100%;
height: auto;
touch-action: none;
cursor: grab;
background: transparent;
image-rendering: auto;
}
.scene-box canvas:active { cursor: grabbing; }
.scene-controls {
display: grid;
grid-template-columns: 1fr;
gap: 0.65rem 0.9rem;
margin-top: 0.85rem;
font-size: 0.9rem;
}
@media (min-width: 640px) {
.scene-controls { grid-template-columns: repeat(2, 1fr); }
.scene-controls.scene-controls--three { grid-template-columns: repeat(3, 1fr); }
}
.scene-control { display: flex; flex-direction: column; gap: 0.3rem; }
.scene-control label {
color: var(--s-dim);
font-size: 0.8rem;
display: flex;
justify-content: space-between;
gap: 0.5rem;
letter-spacing: 0.01em;
}
.scene-control label .scene-value {
color: var(--s-fg);
font-variant-numeric: tabular-nums;
font-weight: 500;
}
/* Prettier slider. Custom track and thumb on both webkit and firefox. */
.scene-control input[type="range"] {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 20px;
background: transparent;
cursor: pointer;
padding: 0;
margin: 0;
}
.scene-control input[type="range"]::-webkit-slider-runnable-track {
height: 4px;
border-radius: 4px;
background: linear-gradient(90deg, var(--s-grid-strong), var(--s-grid));
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4);
}
.scene-control input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 14px;
height: 14px;
border-radius: 50%;
background: var(--s-cyan);
border: 2px solid var(--s-bg);
margin-top: -5px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 0 0 0 rgba(109, 197, 211, 0);
transition: box-shadow 160ms ease, transform 120ms ease;
}
.scene-control input[type="range"]:hover::-webkit-slider-thumb,
.scene-control input[type="range"]:focus::-webkit-slider-thumb {
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 0 0 6px rgba(109, 197, 211, 0.12);
}
.scene-control input[type="range"]::-moz-range-track {
height: 4px;
border-radius: 4px;
background: var(--s-grid-strong);
}
.scene-control input[type="range"]::-moz-range-thumb {
width: 14px;
height: 14px;
border-radius: 50%;
background: var(--s-cyan);
border: 2px solid var(--s-bg);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
transition: box-shadow 160ms ease;
}
.scene-control input[type="range"]:focus { outline: none; }
.scene-box .scene-caption {
margin-top: 0.65rem;
font-size: 0.85rem;
color: var(--s-dim);
line-height: 1.55;
max-width: 62em;
}
.scene-box .scene-readout {
display: flex;
flex-wrap: wrap;
gap: 0.5rem 1.4rem;
padding: 0.45rem 0.1rem 0.3rem;
margin-top: 0.15rem;
color: var(--s-fg);
font-size: 0.82rem;
font-variant-numeric: tabular-nums;
letter-spacing: 0.01em;
border-bottom: 1px dashed var(--s-grid);
}
.scene-box .scene-readout .scene-readout-item span:first-child {
color: var(--s-dim);
margin-right: 0.35rem;
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.72rem;
}