Skip to content

Commit e8bafcd

Browse files
ten9876claude
andcommitted
Blog: pin the first-contribution post to the top
It was already first by date, which would have stopped being true the next time anything shipped. Marks it with is-pinned and a Pinned badge so it holds position on merit rather than by accident, and so readers understand why it sits above a newer post later on. The card order is hand-maintained DOM order, so the intent is recorded where it can actually be acted on: a PINNED comment above the card and a README note telling you to insert new posts below it. Bumps the stylesheet to ?v=4 — styles.css is served with max-age=14400, so without a new URL the badge would render unstyled against fresh markup for up to four hours. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 02250d7 commit e8bafcd

5 files changed

Lines changed: 32 additions & 5 deletions

File tree

404.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1" />
66
<title>Signal lost — AetherSDR</title>
77
<link rel="icon" type="image/png" href="/assets/img/logo-96.png" />
8-
<link rel="stylesheet" href="/styles.css?v=3" />
8+
<link rel="stylesheet" href="/styles.css?v=4" />
99
<style>
1010
.nf { min-height: 78vh; display: grid; place-items: center; text-align: center; }
1111
.nf-inner { max-width: 30rem; padding: 0 24px; }

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ is two blocks that share a slug:
3939

4040
1. **A card** in the `.blog-grid`, linking to `#your-slug`. The description is
4141
clamped to four lines, so write 3–4 lines and don't worry about matching
42-
neighbouring card heights.
42+
neighbouring card heights. Cards are ordered newest-first by hand — insert
43+
yours **below the pinned card** and above the newest release post.
4344
2. **An `<article class="blog-post" data-post="your-slug" ... hidden>`** further
4445
down, holding the hero image and full body. Keep the `hidden` attribute — it
4546
is what keeps the post off the index until it's routed to.
@@ -53,6 +54,15 @@ styles headings, lists, links, quotes, and code blocks for you.
5354
> out-specifies the browser's `[hidden] { display: none }` and every post would
5455
> render on the index at once.
5556
57+
The first card carries `is-pinned` and a **Pinned** badge, holding it at the top
58+
of the index whatever its date. To pin a different post, move the class, the
59+
badge markup, and the `<!-- PINNED -->` comment to that card.
60+
61+
Editing `styles.css`? Bump the `?v=` on the three `<link rel="stylesheet">` tags
62+
(`index.html`, `blog.html`, `404.html`). The file is served with `max-age=14400`,
63+
so without a new URL a browser can pair a stale stylesheet with fresh markup for
64+
up to four hours.
65+
5666
Cloudflare Pages serves the page extensionless at **`/blog`** and 308-redirects
5767
`/blog.html` to it, so `canonical` and the `og:`/`twitter:` URLs point at `/blog`.
5868
Internal links keep the `blog.html` form on purpose — it resolves under

blog.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
<link rel="icon" type="image/png" href="assets/img/logo-96.png" />
3030
<link rel="apple-touch-icon" href="assets/img/apple-touch-icon.png" />
31-
<link rel="stylesheet" href="styles.css?v=3" />
31+
<link rel="stylesheet" href="styles.css?v=4" />
3232

3333
<!-- Without JS there's nothing to route, so show every post stacked under
3434
the index rather than a grid of cards that go nowhere. -->
@@ -100,13 +100,20 @@ <h2>The AetherSDR blog</h2>
100100

101101
<div class="blog-grid">
102102

103-
<a class="blog-card" href="#first-contribution">
103+
<!-- PINNED: stays at the top regardless of date. New posts go BELOW
104+
this card, above the newest release post. -->
105+
<a class="blog-card is-pinned" href="#first-contribution">
104106
<div class="blog-card-media">
105107
<!-- Topmost card is above the fold: eager, so it isn't the LCP holdup. -->
106108
<img width="640" height="560" src="assets/img/first-contribution-card.svg" alt="A contribution pipeline drawn as a signal chain — issue, fix, merged — over a spectrum trace" />
107109
</div>
108110
<div class="blog-card-body">
109111
<span class="blog-meta">
112+
<span class="blog-pin">
113+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 17v5"/><path d="M9 10.8V4h6v6.8l2.5 3.2h-11z"/></svg>
114+
Pinned
115+
</span>
116+
<span class="sep" aria-hidden="true">·</span>
110117
<time datetime="2026-07-26">July 26, 2026</time>
111118
<span class="sep" aria-hidden="true">·</span>
112119
<span>8 min read</span>

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
<link rel="icon" type="image/png" href="assets/img/logo-96.png" />
3131
<link rel="apple-touch-icon" href="assets/img/apple-touch-icon.png" />
32-
<link rel="stylesheet" href="styles.css?v=3" />
32+
<link rel="stylesheet" href="styles.css?v=4" />
3333
</head>
3434
<body>
3535

styles.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,16 @@ footer.foot { border-top: 1px solid var(--line); margin-top: 30px; padding: 46px
589589
color: var(--muted-dim); font-size: 12.5px;
590590
font-family: var(--mono); letter-spacing: 0.01em;
591591
}
592+
/* Pinned card — held at the top of the index regardless of date. */
593+
.blog-card.is-pinned { border-color: var(--line-hi); }
594+
.blog-card.is-pinned:hover { border-color: var(--cyan); }
595+
.blog-pin {
596+
display: inline-flex; align-items: center; gap: 5px;
597+
color: var(--cyan); font-weight: 700; letter-spacing: 0.06em;
598+
text-transform: uppercase; font-size: 11.5px;
599+
}
600+
.blog-pin svg { width: 13px; height: 13px; }
601+
592602
.blog-more {
593603
display: inline-flex; align-items: center; gap: 7px;
594604
margin-top: 15px; color: var(--cyan); font-size: 13.5px; font-weight: 600;

0 commit comments

Comments
 (0)