The Louis Clergerie Letter Website · michaeldbush.org/clergerie
| Context | Text |
|---|---|
| Full title (H1, home page) | The Louis Clergerie Letter: A Soldier's Account of the China Campaign, 1860 |
Browser tab / <title> tag | The Louis Clergerie Letter |
| Navigation bar | The Clergerie Letter |
| Layer | Technology | Notes |
|---|---|---|
| Markup | HTML5 | Hand-authored; no templating engine |
| Styling | CSS3 with custom properties | One main stylesheet + one print stylesheet |
| Behavior | Vanilla JavaScript ES6+ | Two files only: lightbox + tab switcher |
| Fonts | Google Fonts CDN | Playfair Display, Source Serif 4, DM Mono |
| Server | Apache on Alabama (Raspberry Pi) | Static file serving only |
| Development | ELMORE (Ubuntu 24.04) | See §8 for rationale |
| PHP / Node.js / MySQL | Available, not used | No backend logic required |
| Build tools | None | No npm, no bundler, no preprocessor |
The site is small, long-lived, and will be maintained by non-specialist family members in the future. Vanilla HTML/CSS/JS requires no toolchain to modify or understand. It will still work correctly in ten years without dependency rot.
/[alabama-webroot]/clergerie/
|
|== index.html ← Home page
|== letter.html ← Letter viewer
|== context.html ← Historical context + SVG map
|== campaign.html ← China campaign document
|== research.html ← Genealogical research guide
|== downloads.html ← Downloads page
|== about.html ← About / family connection
|
|== css/
| |== style.css ← Main stylesheet (all pages)
| \== print.css ← Print stylesheet
|
|== js/
| |== lightbox.js ← ~80 lines, no dependencies
| \== tabs.js ← ~30 lines, no dependencies
|
|== images/
| |== letter/
| | |== page1-thumb.jpg ← 800px wide thumbnail
| | |== page2-thumb.jpg
| | |== page3-thumb.jpg
| | |== page4-thumb.jpg
| | |== page1-full.jpg ← Original resolution (lightbox only)
| | |== page2-full.jpg
| | |== page3-full.jpg
| | \== page4-full.jpg
| \== map/
| \== jura-voyage.svg ← Self-contained SVG
|
\== downloads/
|== clergerie-transcription.docx
|== artillerie-chine-1860.pdf
|== clergerie-letter-pages.pdf
\== shd-request-letter.txt
:root {
/* Colors */
--color-parchment: #F5F0E8;
--color-text: #2C2C2C;
--color-text-light: #555555;
--color-gold: #C9A84C;
--color-navy: #1F3864;
--color-rust: #8B3A2A;
--color-border: #D4C9B0;
/* Typography */
--font-heading: 'Playfair Display', Georgia, serif;
--font-body: 'Source Serif 4', Georgia, serif;
--font-mono: 'DM Mono', 'Courier New', monospace;
/* Layout */
--max-width: 900px;
--gutter: 2rem;
--section-gap: 3.5rem;
}
:root)Mobile-first. Base styles target narrow viewports. Two breakpoints: @media (min-width: 700px) activates the two-column letter viewer and expands navigation; @media (min-width: 900px) applies full max-width layout.
Constructed from the letter (pages 1–3) and the Scherer military study (artillerie.asso.fr, 2026):
| # | Location | Coordinates | Source |
|---|---|---|---|
| 1 | Toulon (departure) | 43.1°N, 5.9°E | Letter p.1 |
| 2 | Strait of Gibraltar | 36.1°N, 5.3°W | Letter p.3 |
| 3 | Santa Cruz de Tenerife | 28.5°N, 16.3°W | Letter p.3 (water stop, Christmas Day) |
| 4 | Cape of Good Hope | 34.4°S, 18.5°E | Letter p.2 (letter dated here, 25 Feb 1860) |
| 5 | Réunion / Mauritius | 20.9°S, 55.5°E | Standard French colonial route |
| 6 | Singapore / Strait of Malacca | 1.3°N, 103.8°E | Standard route to Far East |
| 7 | Shanghai | 31.2°N, 121.5°E | Scherer PDF — troops assembled here |
| 8 | Nagasaki, Japan | 32.7°N, 129.9°E | Scherer: Jura carried 114 horses from Japan |
| 9 | Shanghai (return) | 31.2°N, 121.5°E | Scherer PDF |
| 10 | Tché-fou / Beitang | 37.5°N, 121.4°E | Scherer PDF — disembarkation point |
Pékin (Beijing, 39.9°N, 116.4°E) marked as a non-visited reference point. The campaign's decisive battles — Palikao, the Summer Palace — are noted with smaller markers.
| Property | Value |
|---|---|
| Viewport | 1000 × 600px; viewBox="0 0 1000 600"; scales via CSS width:100%; height:auto |
| Projection | Simple equirectangular — covers 40°W to 150°E, 45°S to 50°N |
| Background | #EDE8DC — aged paper |
| Coastlines | Simplified paths, #C9B99A — no country borders |
| Sea areas | #D6E4F0 |
| Route line | Dashed, #C9A84C (gold), stroke-width 2.5, directional arrowheads |
| Waypoint markers | Filled circles, #1F3864 (navy), radius 5 |
| Labels | Playfair Display, 11px, #2C2C2C |
| Style | Cartographic, period-appropriate; compass rose bottom-right |
| Embedding | Inline in context.html — no external file reference needed |
CSS Grid: grid-template-columns: 1fr 1fr. Left column: active image + four thumbnail buttons. Right column: language tab switcher + active text panel (French or English). Each column scrolls independently. Active thumbnail indicated by gold border.
Single column, top to bottom: horizontal scrolling thumbnail row → active page image (full width) → language tab switcher → active text panel.
js/lightbox.js)background: rgba(0,0,0,0.88)max-width: 95vw; max-height: 90vh<span aria-live="polite">Page 2 of 4</span><a href="page1-full.jpg">js/tabs.js)// On tab click:
// 1. Remove 'active' class from all tabs
// 2. Add 'active' to clicked tab
// 3. Set hidden attribute on all tabpanels
// 4. Remove hidden from corresponding tabpanel
// 5. Store selection: sessionStorage.setItem('lang', 'fr' | 'en')
// On page load:
// Read sessionStorage('lang') — default 'fr'
// Restore previously selected tab
| Page | Key elements |
|---|---|
| index.html | Full-bleed hero (letter page 1 image + overlay text); epigraph blockquote (ocean sunset passage); two-sentence introduction; six navigation cards |
| letter.html | Two-column / stacked viewer; transcription conventions note; four-page navigation; lightbox; language tabs (French + English) |
| context.html | Three sections; embedded SVG voyage map (section 2); pull-quotes; key-dates aside in section 3 |
| campaign.html | Scherer findings summary; highlighted passage naming the Jura's cargo; Japan horse excursion note; PDF download card |
| research.html | Six-step guide; SHD Vincennes and Toulon info boxes; draft request letter in <pre> block; external links |
| downloads.html | Four download cards: Word doc, Scherer PDF, combined letter PDF, SHD request letter |
| about.html | Family connection statement; research origin; attribution |
Source files: Clergerie-1s.jpg through Clergerie-4s.jpg. Run on ELMORE using ImageMagick:
# Install ImageMagick if needed
sudo apt install imagemagick
# Copy and rename originals
cp Clergerie-1s.jpg images/letter/page1-full.jpg
cp Clergerie-2s.jpg images/letter/page2-full.jpg
cp Clergerie-3s.jpg images/letter/page3-full.jpg
cp Clergerie-4s.jpg images/letter/page4-full.jpg
# Create 800px thumbnails
convert images/letter/page1-full.jpg -resize 800x images/letter/page1-thumb.jpg
convert images/letter/page2-full.jpg -resize 800x images/letter/page2-thumb.jpg
convert images/letter/page3-full.jpg -resize 800x images/letter/page3-thumb.jpg
convert images/letter/page4-full.jpg -resize 800x images/letter/page4-thumb.jpg
# Create combined PDF of all four pages
convert images/letter/page{1,2,3,4}-full.jpg downloads/clergerie-letter-pages.pdf
| ELMORE | Alabama | |
|---|---|---|
| CPU | AMD Ryzen 7 7700X | Raspberry Pi ARM |
| Architecture | x86-64 — native for Claude Code | ARM — occasional npm friction |
| Role | Development machine | Web server |
| ImageMagick | Full speed | Slow |
| Claude Code | Recommended | Not recommended |
cd /home/mike/clergerie
python3 -m http.server 8080
# Open browser to http://10.12.1.20:8080
# Adjust path to match actual CIFS mount point
cp -r /home/mike/clergerie/* /mnt/data/[alabama-webroot]/clergerie/
# Verify after deployment
curl -I https://michaeldbush.org/clergerie/
# Expected: HTTP/1.1 200 OK
No .htaccess changes needed. No virtual host modifications. Apache's DirectoryIndex handles index.html automatically.
| Asset | Target |
|---|---|
| Each thumbnail × 4 | ≤ 300 KB each |
| Each full-resolution page × 4 (lightbox only) | ≤ 2 MB each |
| SVG voyage map | ≤ 80 KB |
| All HTML pages combined | ≤ 200 KB |
| CSS + JS combined | ≤ 40 KB |
| First load weight (index.html, no lightbox) | ~500–700 KB total |
<img> elements have descriptive alt attributes<nav aria-label="Main navigation">aria-modal="true", focus trapped, aria-live page counterrole="tablist", role="tab", role="tabpanel", aria-selectedlang="en" on <html>; French text blocks marked lang="fr"css/style.css — custom properties, base styles, typography, navigationcss/print.css — print stylesheetindex.html — home page; validates overall design and layoutletter.html — letter viewer shell, without JavaScriptjs/lightbox.js + js/tabs.js — interactive behaviorcontext.html — historical context, text content onlyimages/map/jura-voyage.svg — voyage map SVGcontext.htmlcampaign.html, research.html, downloads.html, about.htmlcurlEach Claude Code session begins by confirming the current state of the relevant file before making changes. Deviations from this specification require a conscious decision and a note — not silent improvisation.