feat(site): merge /anti-patterns and /visual-mode into /slop

Top nav was at six items and growing. The anti-patterns catalog and the
visual-mode overlay demo were always two views of the same subject (the
rule set and seeing it caught in place), so collapsing them into one page
reduces nav weight and puts the catalog + live demo next to each other.

Four sections in one scroll: See it (iframe demo), Try it live (specimen
gallery), The catalog (full rule list), Run it yourself (invocation
methods). Sidebar TOC nests the catalog sections under "The catalog" for
deep linking. 301s from the old URLs preserve external links.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Paul Bakaus
2026-04-23 13:13:56 -07:00
co-authored by Claude Opus 4.7
parent c160ffc38d
commit 5316809139
12 changed files with 310 additions and 224 deletions
+2 -3
View File
@@ -272,8 +272,7 @@ export function writeFile(filePath, content) {
*/
// Curated short-list for the homepage Antidote section. Intentionally
// hand-written (not auto-extracted) so the copy stays tight and
// editorial. The long-form catalog lives on /anti-patterns — this is
// the teaser.
// editorial. The long-form catalog lives on /slop — this is the teaser.
const CURATED_CATEGORIES = [
{
name: 'Typography',
@@ -356,7 +355,7 @@ const CURATED_CATEGORIES = [
export function readPatterns(_rootDir, _relativePath) {
// Hand-curated list — see CURATED_CATEGORIES above. The homepage
// Antidote teaser uses this; the full catalog lives on /anti-patterns.
// Antidote teaser uses this; the full catalog lives on /slop.
return {
patterns: CURATED_CATEGORIES.map((c) => ({ name: c.name, items: c.do })),
antipatterns: CURATED_CATEGORIES.map((c) => ({ name: c.name, items: c.dont })),