chore: sync upstream — performance, webmentions v2, OG v3
- _data: switch to cachedFetch wrapper (10s timeout + 4h watch cache) - js/webmentions.js: owner reply threading, platform provenance badges, DOM dedup, Micropub reply support - js/comments.js: owner detection, reply system, Alpine.store integration - _includes/components/webmentions.njk: data-wm-* attrs, provenance badge slots, reply buttons - _includes/components/comments.njk: owner-aware comment form, threaded replies - widgets/toc.njk: Alpine.js tocScanner upgrade (replaces is-land/inline-JS) - lib/og.js + og-cli.js: OG card v3 (light theme, avatar, batched spawn, DESIGN_VERSION=3) - eleventy.config.js: hasOgImage cache, memoized date filters, batched OG/unfurl, post-build GC, YouTube check opt - base.njk: Inter font preloads + toc-scanner.js script - critical.css: font-face declarations (font-display:optional) - tailwind.css: font-display swap→optional - tailwind.config.js: prose link colors -700→-600 - Color design system: accent-700/300 → accent-600/400 across components Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -18,7 +18,7 @@ withSidebar: false
|
||||
<template x-for="tab in tabs" :key="tab.key">
|
||||
<button
|
||||
@click="activeTab = tab.key"
|
||||
:class="activeTab === tab.key ? 'border-b-2 border-accent-500 text-accent-700 dark:text-accent-300' : 'text-surface-600 dark:text-surface-400 hover:text-surface-700 dark:hover:text-surface-300'"
|
||||
:class="activeTab === tab.key ? 'border-b-2 border-accent-500 text-accent-600 dark:text-accent-400' : 'text-surface-600 dark:text-surface-400 hover:text-surface-700 dark:hover:text-surface-300'"
|
||||
:aria-selected="(activeTab === tab.key).toString()"
|
||||
role="tab"
|
||||
class="flex items-center gap-1.5 px-3 py-2 text-sm font-medium transition-colors -mb-px whitespace-nowrap flex-shrink-0"
|
||||
@@ -53,7 +53,7 @@ withSidebar: false
|
||||
<li class="bg-surface-50 dark:bg-surface-800 border border-surface-200 dark:border-surface-700 rounded-lg p-4 shadow-sm">
|
||||
<div class="flex items-start gap-3">
|
||||
<a :href="commit.url" target="_blank" rel="noopener"
|
||||
class="font-mono text-xs bg-surface-100 dark:bg-surface-800 px-1.5 py-0.5 rounded text-accent-700 dark:text-accent-300 hover:underline flex-shrink-0 mt-0.5"
|
||||
class="font-mono text-xs bg-surface-100 dark:bg-surface-800 px-1.5 py-0.5 rounded text-accent-600 dark:text-accent-400 hover:underline flex-shrink-0 mt-0.5"
|
||||
x-text="commit.sha"></a>
|
||||
<div class="min-w-0 flex-1">
|
||||
<p class="text-sm font-medium text-surface-900 dark:text-surface-100 break-words" x-text="commit.title"></p>
|
||||
@@ -64,7 +64,7 @@ withSidebar: false
|
||||
x-text="categoryLabels[commit.category] || commit.category"
|
||||
></span>
|
||||
<a :href="commit.repoUrl" target="_blank" rel="noopener"
|
||||
class="text-xs px-2 py-0.5 rounded-full bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-400 hover:text-accent-700 dark:hover:text-accent-300"
|
||||
class="text-xs px-2 py-0.5 rounded-full bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-400 hover:text-accent-600 dark:hover:text-accent-400"
|
||||
x-text="commit.repoName"></a>
|
||||
<span class="text-xs text-surface-600 dark:text-surface-400 font-mono" x-text="formatDate(commit.date)"></span>
|
||||
<span class="text-xs text-surface-600 dark:text-surface-400" x-text="'by ' + commit.author"></span>
|
||||
@@ -118,32 +118,34 @@ function changelogApp() {
|
||||
|
||||
tabs: [
|
||||
{ key: 'all', label: 'All' },
|
||||
{ key: 'features', label: 'Features' },
|
||||
{ key: 'fixes', label: 'Fixes' },
|
||||
{ key: 'performance', label: 'Performance' },
|
||||
{ key: 'accessibility', label: 'Accessibility' },
|
||||
{ key: 'documentation', label: 'Docs' },
|
||||
{ key: 'style', label: 'Style' },
|
||||
{ key: 'other', label: 'Other' },
|
||||
{ key: 'core', label: 'Core' },
|
||||
{ key: 'deployment', label: 'Deployment' },
|
||||
{ key: 'theme', label: 'Theme' },
|
||||
{ key: 'endpoints', label: 'Endpoints' },
|
||||
{ key: 'syndicators', label: 'Syndicators' },
|
||||
{ key: 'post-types', label: 'Post Types' },
|
||||
{ key: 'presets', label: 'Presets' },
|
||||
],
|
||||
|
||||
categoryLabels: {
|
||||
features: 'Features',
|
||||
fixes: 'Fixes',
|
||||
performance: 'Performance',
|
||||
accessibility: 'Accessibility',
|
||||
documentation: 'Docs',
|
||||
style: 'Style',
|
||||
core: 'Core',
|
||||
deployment: 'Deployment',
|
||||
theme: 'Theme',
|
||||
endpoints: 'Endpoint',
|
||||
syndicators: 'Syndicator',
|
||||
'post-types': 'Post Type',
|
||||
presets: 'Preset',
|
||||
other: 'Other',
|
||||
},
|
||||
|
||||
categoryColors: {
|
||||
features: 'bg-green-100 dark:bg-green-900 text-green-700 dark:text-green-300',
|
||||
fixes: 'bg-orange-100 dark:bg-orange-900 text-orange-700 dark:text-orange-300',
|
||||
performance: 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300',
|
||||
accessibility: 'bg-purple-100 dark:bg-purple-900 text-purple-700 dark:text-purple-300',
|
||||
documentation: 'bg-yellow-100 dark:bg-yellow-900 text-yellow-700 dark:text-yellow-300',
|
||||
style: 'bg-pink-100 dark:bg-pink-900 text-pink-700 dark:text-pink-300',
|
||||
core: 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300',
|
||||
deployment: 'bg-orange-100 dark:bg-orange-900 text-orange-700 dark:text-orange-300',
|
||||
theme: 'bg-purple-100 dark:bg-purple-900 text-purple-700 dark:text-purple-300',
|
||||
endpoints: 'bg-green-100 dark:bg-green-900 text-green-700 dark:text-green-300',
|
||||
syndicators: 'bg-teal-100 dark:bg-teal-900 text-teal-700 dark:text-teal-300',
|
||||
'post-types': 'bg-pink-100 dark:bg-pink-900 text-pink-700 dark:text-pink-300',
|
||||
presets: 'bg-yellow-100 dark:bg-yellow-900 text-yellow-700 dark:text-yellow-300',
|
||||
other: 'bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300',
|
||||
},
|
||||
|
||||
@@ -156,37 +158,11 @@ function changelogApp() {
|
||||
await this.fetchChangelog(30);
|
||||
},
|
||||
|
||||
async fetchJson(paths) {
|
||||
for (const path of paths) {
|
||||
try {
|
||||
const response = await fetch(path);
|
||||
if (response.ok) {
|
||||
return {
|
||||
ok: true,
|
||||
data: await response.json(),
|
||||
};
|
||||
}
|
||||
} catch {
|
||||
// Try next candidate path.
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
ok: false,
|
||||
data: null,
|
||||
};
|
||||
},
|
||||
|
||||
async fetchChangelog(days) {
|
||||
try {
|
||||
const result = await this.fetchJson([
|
||||
'/github/api/changelog?days=' + days,
|
||||
'/githubapi/api/changelog?days=' + days,
|
||||
]);
|
||||
|
||||
if (!result.ok) throw new Error('Failed to fetch');
|
||||
|
||||
const data = result.data || {};
|
||||
const response = await fetch('/githubapi/api/changelog?days=' + days);
|
||||
if (!response.ok) throw new Error('Failed to fetch');
|
||||
const data = await response.json();
|
||||
this.commits = data.commits || [];
|
||||
this.categories = data.categories || {};
|
||||
this.currentDays = data.days;
|
||||
|
||||
Reference in New Issue
Block a user