Refine homepage project discovery
Deploy production / deploy (push) Successful in 5s

This commit is contained in:
2026-08-12 07:19:27 -07:00
parent 4223691e43
commit 84fad22f4c
4 changed files with 51 additions and 25 deletions
+19 -9
View File
@@ -31,14 +31,14 @@ a:hover, a:focus-visible { color: var(--teal); }
.header-meta { display: flex; justify-content: space-between; padding: 0 0 22px; color: var(--dim); font-size: 10px; }
.socials { display: flex; flex-wrap: wrap; gap: 20px; color: var(--muted); text-transform: none; letter-spacing: .04em; }
.hero { border-bottom: 1px solid var(--rule); padding: 60px 0 55px; }
.hero { border-bottom: 1px solid var(--rule); padding: 54px 0 48px; }
.hero.compact { padding-block: 58px; }
.eyebrow { margin: 0 0 18px; color: var(--magenta); font-size: 11px; }
.eyebrow::before { content: "— "; }
h1, h2 { font-family: var(--serif); }
h1 { max-width: 650px; margin: 0; font-size: clamp(30px, 4vw, 45px); font-style: italic; line-height: 1.25; }
h1 { max-width: 880px; margin: 0; font-size: clamp(30px, 4vw, 45px); font-style: italic; line-height: 1.25; }
.entry-hero h1 { font-style: normal; }
.dek { max-width: 650px; margin-top: 18px; color: var(--muted); }
.dek { max-width: 700px; margin-top: 18px; color: var(--muted); }
.dek p { margin: 0; }
.activity-section { min-height: 370px; padding: 48px 0 72px; }
@@ -53,7 +53,7 @@ h1 { max-width: 650px; margin: 0; font-size: clamp(30px, 4vw, 45px); font-style:
.accent-blog::before { border-color: var(--violet); }
.accent-article::before { border-color: var(--magenta); }
.entry-meta { display: flex; align-items: center; gap: 16px; color: var(--muted); font-size: 10px; }
.label { border: 1px solid currentColor; padding: 2px 8px; color: var(--teal); }
.label { border: 1px solid currentColor; padding: 2px 8px; color: var(--teal); text-transform: uppercase; }
.accent-blog .label { color: var(--violet); }
.accent-article .label { color: var(--magenta); }
.timeline-entry h2, .entry-card h2 { margin: 10px 0 5px; font-size: 21px; line-height: 1.3; }
@@ -77,11 +77,20 @@ h1 { max-width: 650px; margin: 0; font-size: clamp(30px, 4vw, 45px); font-style:
.activity-more-button:focus-visible { border-color: var(--teal); color: var(--teal); }
.activity-more-button:disabled { cursor: default; opacity: .55; }
.featured-project-list { border-bottom: 1px solid var(--rule); }
.featured-project { padding: 22px 0 24px; }
.featured-project + .featured-project { border-top: 1px solid rgba(39,48,57,.65); }
.featured-project h2 { margin: 10px 0 5px; font-size: 21px; line-height: 1.3; }
.featured-project p { margin: 0 0 10px; color: var(--muted); font-size: 14px; line-height: 1.55; }
.featured-project-list { display: grid; gap: 14px; }
.featured-project-card { border: 1px solid var(--rule); border-top-color: var(--teal); background: var(--panel); padding: 22px; }
.featured-project-meta { display: flex; align-items: center; justify-content: space-between; gap: 14px; color: var(--muted); font: 10px var(--mono); letter-spacing: .12em; }
.featured-project-card h2 { margin: 15px 0 7px; font-size: 25px; line-height: 1.2; }
.featured-project-card > p { margin: 0; color: var(--muted); font-size: 14px; line-height: 1.55; }
.featured-project-technologies { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 17px; }
.featured-project-technologies span { border: 1px solid rgba(81,182,165,.55); padding: 3px 6px; color: var(--teal); font: 500 9px var(--mono); letter-spacing: .08em; text-transform: uppercase; }
.featured-project-latest { display: grid; gap: 7px; margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--rule); }
.featured-project-latest > span { color: var(--dim); font: 500 9px var(--mono); letter-spacing: .12em; text-transform: uppercase; }
.featured-project-latest a { color: var(--ink); font: 14px/1.45 var(--serif); }
.featured-project-latest time { color: var(--teal); font: 500 9px var(--mono); letter-spacing: .07em; }
.featured-project-actions { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 21px; }
.featured-project-actions a { color: var(--magenta); font: 500 10px var(--mono); letter-spacing: .1em; text-transform: uppercase; }
.featured-project-actions a:first-child { color: var(--teal); }
.featured-projects-empty { margin: 0; padding: 24px 0; color: var(--muted); }
.featured-projects-link { display: inline-block; margin-top: 22px; color: var(--teal); font: 500 10px var(--mono); letter-spacing: .12em; text-transform: uppercase; }
@@ -312,6 +321,7 @@ h1 { max-width: 650px; margin: 0; font-size: clamp(30px, 4vw, 45px); font-style:
.hero, .hero.compact { padding-block: 44px; }
h1 { font-size: 30px; }
.homepage-discovery-grid { grid-template-columns: 1fr; gap: 48px; }
.featured-project-card { padding: 20px; }
.card-grid { grid-template-columns: 1fr; }
.tag-directory { grid-template-columns: 1fr; }
.tag-filter { padding-block: 18px; }
+3 -4
View File
@@ -4,9 +4,8 @@ title: Home
---
eyebrow: The Chronicle
---
summary: A living record of what's shipping, what's written, and what's quietly under construction.
summary: Things built. Lessons learned. Work still in progress.
---
body:
Every entry is maintained in Git and published through a repeatable static build.
Commit it, deploy it, and it appears.
A running record of projects, experiments, technical writing, and the occasional
idea that refused to stay hypothetical.
+1 -1
View File
@@ -9,7 +9,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=Inter:wght@400;500&family=Playfair+Display:ital,wght@0,600;0,700;1,500;1,600&display=swap" rel="stylesheet">
<link rel="icon" href="{{ '/static/favicon.svg'|url }}" type="image/svg+xml">
<link rel="stylesheet" href="{{ '/static/style.css'|url }}?v=11">
<link rel="stylesheet" href="{{ '/static/style.css'|url }}?v=12">
<script src="{{ '/static/tags.js'|url }}?v=1" defer></script>
<script src="{{ '/static/activity.js'|url }}?v=1" defer></script>
</head>
+28 -11
View File
@@ -21,14 +21,12 @@
{% if entries.append(item) %}{% endif %}
{% endfor %}
{% endfor %}
{% for project in site.query('/projects') %}
{% if project._model == 'project' %}
{% set devlog = site.get(project.path ~ '/devlog') %}
{% if devlog %}
{% for entry in devlog.children %}
{% if entries.append(entry) %}{% endif %}
{% endfor %}
{% endif %}
{% for project in site.query('/projects').filter(F._model == 'project') %}
{% set devlog = site.get(project.path ~ '/devlog') %}
{% if devlog %}
{% for entry in devlog.children %}
{% if entries.append(entry) %}{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
{% for item in entries|sort(attribute='date', reverse=true) %}
@@ -56,14 +54,33 @@
</div>
<div class="featured-project-list">
{% for project in site.query('/projects').filter(F._model == 'project').filter(F.featured == true).order_by('featured_order', '-date').limit(3) %}
<article class="featured-project">
<div class="entry-meta">
{% set devlog = site.get(project.path ~ '/devlog') %}
{% set latest_activity = devlog.children.order_by('-date', '-source_commit_time').first() if devlog else none %}
<article class="featured-project-card">
<div class="featured-project-meta">
<span class="label">{{ project.status }}</span>
<time datetime="{{ project.date }}">{{ project.date|dateformat('YYYY.MM.dd') }}</time>
</div>
<h2><a href="{{ project|url }}">{{ project.title }}</a></h2>
<p>{{ project.summary }}</p>
<a class="read-more" href="{{ project|url }}">View project →</a>
{% if project.technology_labels %}
<div class="featured-project-technologies" aria-label="Technologies">
{% for technology in project.technology_labels[:4] %}
{% set parts = technology.split('\t', 1) %}
<span>{{ parts[1] if parts|length > 1 else parts[0] }}</span>
{% endfor %}
</div>
{% endif %}
{% if latest_activity %}
<div class="featured-project-latest">
<span>Latest activity</span>
<a href="{{ latest_activity|url }}"><time datetime="{{ latest_activity.date }}">{{ latest_activity.date|dateformat('YYYY.MM.dd') }}</time> {{ latest_activity.title }} →</a>
</div>
{% endif %}
<div class="featured-project-actions">
<a href="{{ project|url }}">View project →</a>
{% if devlog %}<a href="{{ devlog|url }}">Devlog →</a>{% endif %}
</div>
</article>
{% else %}
<p class="featured-projects-empty">Selected projects will appear here.</p>