Skip to content

Commit 4f763c4

Browse files
Codestzclaude
andcommitted
feat: add AI Convergence blog post and StatBlock MDX component
New blog post exploring why AI coding tools converge on two defaults: React + TypeScript for app builders (V0, Bolt, Lovable) and plain HTML/CSS for chat interfaces (Claude, Gemini). Covers training data dynamics, type system information density, compiler feedback loops, ecosystem gravity, and the convenience loop killing language innovation. Also adds the StatBlock MDX component for displaying key metrics, registers it in mdx-components.tsx, and updates featured flags. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c462212 commit 4f763c4

9 files changed

Lines changed: 499 additions & 2 deletions

File tree

mdx-components.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
ToolCall,
1010
Callout,
1111
ProcessFlow,
12+
StatBlock,
1213
} from '@/components/mdx';
1314
import { Mermaid } from '@/components/mdx/Mermaid';
1415

@@ -30,6 +31,7 @@ export const mdxComponents: MDXComponents = {
3031
ToolCall,
3132
Callout,
3233
ProcessFlow,
34+
StatBlock,
3335
// Headings
3436
h1: ({ children }) => (
3537
<h1 className="mb-4 sm:mb-6 mt-6 sm:mt-8 font-heading text-3xl sm:text-4xl font-bold uppercase text-foreground">
1.66 MB
Loading
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
'use client';
2+
3+
import { cn } from '@/lib/utils';
4+
import type { StatBlockProps } from './StatBlock.types';
5+
6+
/**
7+
* StatBlock Component - Horizontal Stat Row
8+
* Neo-Brutalist stat display for surfacing key metrics
9+
* Uses thick borders, secondary accents, and monospace typography
10+
*/
11+
export function StatBlock({ stats, title, className }: StatBlockProps) {
12+
return (
13+
<div
14+
className={cn(
15+
'my-8 overflow-hidden rounded-none border-[4px] border-foreground bg-bg-elevated shadow-[8px_8px_0px_0px] shadow-black',
16+
className
17+
)}
18+
>
19+
{/* Header */}
20+
{title && (
21+
<div className="border-b-[4px] border-foreground bg-secondary px-4 py-2">
22+
<span className="font-mono text-[10px] font-bold text-secondary-text uppercase tracking-widest">
23+
{title}
24+
</span>
25+
</div>
26+
)}
27+
28+
{/* Stats Grid */}
29+
<div
30+
className={cn(
31+
'grid divide-y-[3px] sm:divide-y-0 sm:divide-x-[3px] divide-foreground',
32+
stats.length <= 2 && 'sm:grid-cols-2',
33+
stats.length === 3 && 'sm:grid-cols-3',
34+
stats.length >= 4 && 'grid-cols-2 sm:grid-cols-4'
35+
)}
36+
>
37+
{stats.map((stat, index) => (
38+
<div key={index} className="flex flex-col items-center justify-center px-4 py-4 sm:py-6">
39+
{stat.icon && <span className="mb-1 text-lg">{stat.icon}</span>}
40+
<span className="font-mono text-2xl sm:text-3xl font-black text-foreground leading-none">
41+
{stat.value}
42+
</span>
43+
<span className="mt-1.5 font-mono text-[10px] sm:text-xs font-bold uppercase tracking-widest text-muted">
44+
{stat.label}
45+
</span>
46+
</div>
47+
))}
48+
</div>
49+
</div>
50+
);
51+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export interface Stat {
2+
value: string;
3+
label: string;
4+
icon?: string;
5+
}
6+
7+
export interface StatBlockProps {
8+
stats: Stat[];
9+
title?: string;
10+
className?: string;
11+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { StatBlock } from './StatBlock';
2+
export type { StatBlockProps, Stat } from './StatBlock.types';

src/components/mdx/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ export { Callout } from './Callout';
1818
export type { CalloutProps } from './Callout';
1919
export { ProcessFlow } from './ProcessFlow';
2020
export type { ProcessFlowProps, ProcessStep } from './ProcessFlow';
21+
export { StatBlock } from './StatBlock';
22+
export type { StatBlockProps, Stat } from './StatBlock';

src/content/blog/sparc-methodology-ai-development.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ publishedAt: '2026-03-09'
55
category: 'ai'
66
tags:
77
['sparc', 'ai-development', 'methodology', 'agentic-engineering', 'tdd', 'software-architecture']
8-
featured: true
8+
featured: false
99
type: 'experiment'
1010
author: 'Esteban Estrada'
1111
---

src/content/blog/spec-driven-development-tessl.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ tags:
1212
'specifications',
1313
'methodology',
1414
]
15-
featured: true
15+
featured: false
1616
type: 'experiment'
1717
author: 'Esteban Estrada'
1818
---

src/content/blog/why-ai-defaults-to-typescript.mdx

Lines changed: 429 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)