Skip to content

Commit ecc8098

Browse files
aneeshcsclaude
andcommitted
gfd: move gallery HTML into layout template, fix raw-HTML display
Hugo was showing the markdown body as escaped text because goldmark's unsafe mode wasn't applying to section _index.md pages. Fix by moving all gallery HTML/CSS directly into layouts/gfd/list.html (a Hugo template, not markdown) and reducing _index.md to front-matter only. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent ece89ab commit ecc8098

2 files changed

Lines changed: 245 additions & 258 deletions

File tree

content/gfd/_index.md

Lines changed: 0 additions & 257 deletions
Original file line numberDiff line numberDiff line change
@@ -1,260 +1,3 @@
11
---
22
title: GFD Portal
33
---
4-
5-
<style>
6-
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
7-
8-
.gfd-wrap {
9-
width: 100vw;
10-
position: relative;
11-
left: 50%;
12-
margin-left: -50vw;
13-
background: linear-gradient(160deg, #0f2744 0%, #0e3d5c 50%, #082f45 100%);
14-
color: #e2e8f0;
15-
padding: 3rem 1.5rem 4rem;
16-
font-family: "Inter var", "Inter", system-ui, sans-serif;
17-
}
18-
19-
.gfd-inner {
20-
max-width: 900px;
21-
margin: 0 auto;
22-
}
23-
24-
.gfd-hero {
25-
text-align: center;
26-
margin-bottom: 3rem;
27-
}
28-
.gfd-hero h1 {
29-
font-size: 2.2rem;
30-
font-weight: 600;
31-
letter-spacing: -0.01em;
32-
color: #7dd3fc;
33-
margin-bottom: 0.75rem;
34-
}
35-
.gfd-hero p {
36-
font-size: 1rem;
37-
color: #94a3b8;
38-
line-height: 1.7;
39-
max-width: 620px;
40-
margin: 0 auto;
41-
}
42-
43-
.gfd-cards {
44-
display: grid;
45-
grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
46-
gap: 1.5rem;
47-
}
48-
49-
.gfd-card {
50-
background: rgba(10, 25, 47, 0.7);
51-
border: 1px solid rgba(255, 255, 255, 0.1);
52-
border-radius: 12px;
53-
padding: 1.75rem;
54-
display: flex;
55-
flex-direction: column;
56-
gap: 1rem;
57-
transition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
58-
backdrop-filter: blur(6px);
59-
}
60-
.gfd-card:hover {
61-
border-color: #06b6d4;
62-
transform: translateY(-3px);
63-
box-shadow: 0 8px 30px rgba(6, 182, 212, 0.15);
64-
}
65-
66-
.gfd-tag {
67-
font-family: monospace;
68-
font-size: 0.7rem;
69-
text-transform: uppercase;
70-
letter-spacing: 0.12em;
71-
color: #06b6d4;
72-
background: rgba(6, 182, 212, 0.1);
73-
border: 1px solid rgba(6, 182, 212, 0.35);
74-
border-radius: 4px;
75-
padding: 2px 9px;
76-
display: inline-block;
77-
width: fit-content;
78-
}
79-
80-
.gfd-card h2 {
81-
font-size: 1.15rem;
82-
font-weight: 600;
83-
color: #e2e8f0 !important;
84-
line-height: 1.3;
85-
margin: 0;
86-
}
87-
88-
.gfd-desc {
89-
font-size: 0.9rem;
90-
color: #94a3b8 !important;
91-
line-height: 1.65;
92-
flex-grow: 1;
93-
margin: 0;
94-
}
95-
96-
.gfd-eq {
97-
font-family: "Courier New", Courier, monospace;
98-
font-size: 0.85rem;
99-
color: #67e8f9;
100-
background: rgba(6, 182, 212, 0.06);
101-
border: 1px solid rgba(6, 182, 212, 0.2);
102-
border-radius: 6px;
103-
padding: 0.6rem 0.9rem;
104-
line-height: 1.5;
105-
}
106-
107-
.gfd-highlights {
108-
list-style: none !important;
109-
padding: 0 !important;
110-
margin: 0 !important;
111-
display: flex;
112-
flex-direction: column;
113-
gap: 0.35rem;
114-
}
115-
.gfd-highlights li {
116-
font-size: 0.875rem;
117-
color: #94a3b8 !important;
118-
padding-left: 1.1rem !important;
119-
position: relative;
120-
line-height: 1.5;
121-
margin: 0 !important;
122-
}
123-
.gfd-highlights li::before {
124-
content: "";
125-
position: absolute;
126-
left: 0;
127-
color: #06b6d4;
128-
font-size: 0.6rem;
129-
top: 0.25rem;
130-
}
131-
132-
.gfd-btn-link {
133-
display: inline-block;
134-
text-align: center;
135-
padding: 0.6rem 1.3rem;
136-
background: #0369a1;
137-
color: #e0f2fe !important;
138-
border-radius: 7px;
139-
text-decoration: none !important;
140-
font-size: 0.9rem;
141-
font-weight: 500;
142-
transition: background 0.2s ease;
143-
align-self: flex-start;
144-
margin-top: auto;
145-
}
146-
.gfd-btn-link:hover {
147-
background: #0284c7;
148-
color: #fff !important;
149-
}
150-
151-
.gfd-footer-note {
152-
margin-top: 3.5rem;
153-
text-align: center;
154-
font-size: 0.8rem;
155-
color: #475569;
156-
line-height: 1.8;
157-
}
158-
.gfd-footer-note a {
159-
color: #475569;
160-
text-decoration: underline;
161-
text-underline-offset: 2px;
162-
}
163-
.gfd-footer-note a:hover { color: #7dd3fc; }
164-
165-
@media (max-width: 820px) {
166-
.gfd-cards { grid-template-columns: 1fr; }
167-
.gfd-hero h1 { font-size: 1.6rem; }
168-
}
169-
</style>
170-
171-
<div class="gfd-wrap">
172-
<div class="gfd-inner">
173-
174-
<div class="gfd-hero">
175-
<h1>Geophysical Fluid Dynamics</h1>
176-
<p>Interactive pedagogical notebooks exploring the mathematics and physics
177-
of rotating, stratified geophysical flows. Each notebook runs entirely in
178-
your browser via WebAssembly — no installation required.</p>
179-
</div>
180-
181-
<div class="gfd-cards">
182-
183-
<div class="gfd-card">
184-
<span class="gfd-tag">Convection</span>
185-
<h2>Rayleigh-Bénard Convection &amp; Lorenz Chaos</h2>
186-
<p class="gfd-desc">2D thermal convection in a Boussinesq fluid heated from below.
187-
Truncating the governing equations to three Fourier amplitudes yields the Lorenz (1963)
188-
system — the canonical model of deterministic chaos and the original "butterfly effect."</p>
189-
<div class="gfd-eq">Ra = g α ΔT H³ / (ν κ)</div>
190-
<ul class="gfd-highlights">
191-
<li>Lattice-Boltzmann D2Q9 solver with real-time rendering</li>
192-
<li>Lorenz attractor: sensitive dependence on initial conditions</li>
193-
<li>Bifurcation from conduction → steady rolls → chaos</li>
194-
<li>Nusselt number as a function of Rayleigh number</li>
195-
</ul>
196-
<a href="/gfd/rayleighbenard.html" class="gfd-btn-link" target="_blank">▶ Open Notebook</a>
197-
</div>
198-
199-
<div class="gfd-card">
200-
<span class="gfd-tag">Rotating Fluids</span>
201-
<h2>Geostrophic Adjustment &amp; Shallow Water Waves</h2>
202-
<p class="gfd-desc">Linearised shallow water equations on a rotating beta-plane.
203-
A Gaussian height perturbation simultaneously radiates fast inertia-gravity waves
204-
and slowly adjusts toward geostrophic balance, with Rossby waves drifting westward
205-
via the β-effect.</p>
206-
<div class="gfd-eq">ω² = f² + c²(k² + l²) · L_R = c / f₀</div>
207-
<ul class="gfd-highlights">
208-
<li>Pseudo-spectral RK4 solver on a doubly-periodic domain</li>
209-
<li>Inertia-gravity vs. Rossby wave dispersion relations</li>
210-
<li>Rossby deformation radius controls adjustment scale</li>
211-
<li>KE / PE energy partition during geostrophic adjustment</li>
212-
</ul>
213-
<a href="/gfd/shallowwater.html" class="gfd-btn-link" target="_blank">▶ Open Notebook</a>
214-
</div>
215-
216-
<div class="gfd-card">
217-
<span class="gfd-tag">Turbulence</span>
218-
<h2>2D Navier-Stokes Turbulence</h2>
219-
<p class="gfd-desc">Decaying turbulence governed by the 2D incompressible Navier-Stokes
220-
equations in vorticity-streamfunction form. Unlike 3D turbulence, energy cascades
221-
<em>upscale</em> while enstrophy cascades to small scales — a consequence of the
222-
additional conservation law in two dimensions.</p>
223-
<div class="gfd-eq">∂ω/∂t + J(ψ, ω) = ν ∇²ω</div>
224-
<ul class="gfd-highlights">
225-
<li>Pseudo-spectral solver with 2/3-rule dealiasing</li>
226-
<li>Inverse energy cascade: k⁻⁵/³ power-law spectrum</li>
227-
<li>Forward enstrophy cascade: k⁻³ spectrum</li>
228-
<li>Vortex merging and coherent structure formation</li>
229-
</ul>
230-
<a href="/gfd/twodnavierstokes.html" class="gfd-btn-link" target="_blank">▶ Open Notebook</a>
231-
</div>
232-
233-
<div class="gfd-card">
234-
<span class="gfd-tag">Stratification</span>
235-
<h2>Internal Gravity Waves</h2>
236-
<p class="gfd-desc">Internal waves propagate through a stably stratified fluid,
237-
carrying energy at angles set by the ratio of wave frequency to the Brunt-Väisälä
238-
frequency. Their peculiar dispersion relation — energy and phase propagate
239-
perpendicular to each other — makes them unlike any surface wave.</p>
240-
<div class="gfd-eq">N² = -(g/ρ₀)(∂ρ/∂z) · ω = N cos θ</div>
241-
<ul class="gfd-highlights">
242-
<li>Brunt-Väisälä (buoyancy) frequency and stable stratification</li>
243-
<li>Angle-dependent dispersion: group velocity ⊥ phase velocity</li>
244-
<li>Saint Andrews Cross wave-beam pattern</li>
245-
<li>Wave reflection, focusing, and critical layers</li>
246-
</ul>
247-
<a href="/gfd/internalwaves.html" class="gfd-btn-link" target="_blank">▶ Open Notebook</a>
248-
</div>
249-
250-
</div>
251-
252-
<div class="gfd-footer-note">
253-
Built with <a href="https://marimo.io" target="_blank">marimo</a> &amp;
254-
<a href="https://numpy.org" target="_blank">NumPy</a> ·
255-
Runs in-browser via <a href="https://pyodide.org" target="_blank">Pyodide</a> WebAssembly ·
256-
<a href="https://github.com/aneeshcs/aneeshcs.github.io" target="_blank">Source on GitHub</a>
257-
</div>
258-
259-
</div>
260-
</div>

0 commit comments

Comments
 (0)