- _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>
63 lines
3.4 KiB
Plaintext
63 lines
3.4 KiB
Plaintext
{# AI Usage Widget — compact sidebar version of the /ai/ page AI transparency graph #}
|
|
{% set stats = collections.posts | aiStats %}
|
|
{% set aiPostsList = collections.posts | aiPosts %}
|
|
{% if stats and stats.total > 0 %}
|
|
<is-land on:visible>
|
|
<div class="widget">
|
|
<h3 class="widget-title flex items-center gap-2">
|
|
<svg class="w-5 h-5 text-amber-500" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/>
|
|
</svg>
|
|
AI Transparency
|
|
</h3>
|
|
|
|
{# Mini stats — 2x2 grid #}
|
|
<div class="grid grid-cols-2 gap-2 mb-3">
|
|
<div class="text-center p-2 rounded-lg bg-surface-50 dark:bg-surface-800 border border-surface-200 dark:border-surface-700">
|
|
<div class="text-lg font-bold text-surface-900 dark:text-surface-100">{{ stats.total }}</div>
|
|
<div class="text-[10px] text-surface-600 dark:text-surface-400">Total</div>
|
|
</div>
|
|
<div class="text-center p-2 rounded-lg bg-surface-50 dark:bg-surface-800 border border-surface-200 dark:border-surface-700">
|
|
<div class="text-lg font-bold text-amber-600 dark:text-amber-400">{{ stats.aiCount }}</div>
|
|
<div class="text-[10px] text-surface-600 dark:text-surface-400">AI-involved</div>
|
|
</div>
|
|
<div class="text-center p-2 rounded-lg bg-surface-50 dark:bg-surface-800 border border-surface-200 dark:border-surface-700">
|
|
<div class="text-lg font-bold text-emerald-600 dark:text-emerald-400">{{ stats.total - stats.aiCount }}</div>
|
|
<div class="text-[10px] text-surface-600 dark:text-surface-400">Human-only</div>
|
|
</div>
|
|
<div class="text-center p-2 rounded-lg bg-surface-50 dark:bg-surface-800 border border-surface-200 dark:border-surface-700">
|
|
<div class="text-lg font-bold text-surface-900 dark:text-surface-100">{{ stats.percentage }}%</div>
|
|
<div class="text-[10px] text-surface-600 dark:text-surface-400">AI ratio</div>
|
|
</div>
|
|
</div>
|
|
|
|
{# Level breakdown — compact pills #}
|
|
<div class="flex flex-wrap gap-1.5 text-[10px] mb-3">
|
|
<span class="px-2 py-0.5 rounded-full bg-surface-100 dark:bg-surface-700 text-surface-600 dark:text-surface-300">
|
|
L0: {{ stats.byLevel[0] }}
|
|
</span>
|
|
<span class="px-2 py-0.5 rounded-full bg-amber-50 dark:bg-amber-900/20 text-amber-700 dark:text-amber-300">
|
|
L1: {{ stats.byLevel[1] }}
|
|
</span>
|
|
<span class="px-2 py-0.5 rounded-full bg-amber-100 dark:bg-amber-900/40 text-amber-800 dark:text-amber-200">
|
|
L2: {{ stats.byLevel[2] }}
|
|
</span>
|
|
<span class="px-2 py-0.5 rounded-full bg-amber-200 dark:bg-amber-900/60 text-amber-900 dark:text-amber-100">
|
|
L3: {{ stats.byLevel[3] }}
|
|
</span>
|
|
</div>
|
|
|
|
{# Compact post-graph — current year only, AI posts highlighted #}
|
|
{% if aiPostsList and aiPostsList.length %}
|
|
<div class="text-[10px] text-surface-600 dark:text-surface-400 mb-2">AI-involved posts this year</div>
|
|
{% postGraph aiPostsList, { prefix: "ai-widget", limit: 1, noLabels: true, boxColorDark: "#44403c", highlightColorLight: "#d97706", highlightColorDark: "#fbbf24" } %}
|
|
{% endif %}
|
|
|
|
<a href="/ai/" class="text-sm text-amber-600 dark:text-amber-400 hover:underline flex items-center gap-1 mt-3">
|
|
View full AI report
|
|
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
|
|
</a>
|
|
</div>
|
|
</is-land>
|
|
{% endif %}
|