tpmjs/packages/config/tailwind/base.ts
Ajax Davis 27f867ff24 feat(design-system): complete blueprint aesthetic redesign with editorial typography
- Replace Geist fonts with Space Grotesk + Space Mono via next/font/google
- Make dotted borders default for all card variants (default, elevated, outline)
- Add blueprint grid backgrounds to homepage sections and playground
- Create Section layout component with flexible semantic elements and spacing variants
- Create GridContainer component with auto-fit/auto-fill responsive grid support
- Add blueprint variants to Tabs and Button components (dotted borders)
- Add editorial typography tokens (line-heights, letter-spacing) to Tailwind config
- Add spacing tokens for airy editorial layouts
- Add shadow utilities for blueprint aesthetic (shadow-blueprint, shadow-blueprint-hover)
- Update 59 component tests for new variants and styling
- All 429 tests passing, zero hardcoded colors, fully themeable

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 08:52:57 +10:00

185 lines
4.8 KiB
TypeScript

import type { Config } from "tailwindcss";
export default {
content: [],
safelist: [
// Custom border utilities
"border-dotted-1",
"border-dotted-2",
"border-dashed-1",
"border-t-dotted",
"border-b-dotted",
"border-l-dotted",
"border-r-dotted",
// Custom shadow utilities
"shadow-blueprint",
"shadow-blueprint-hover",
// Grid backgrounds
"dotted-grid-background",
"blueprint-background",
"grid-background",
],
theme: {
extend: {
colors: {
// Backgrounds & Surfaces
background: "hsl(var(--background))",
surface: "hsl(var(--surface))",
"surface-elevated": "hsl(var(--surface-elevated))",
"surface-overlay": "hsl(var(--surface-overlay))",
// Foreground (Text)
foreground: {
DEFAULT: "hsl(var(--foreground))",
secondary: "hsl(var(--foreground-secondary))",
tertiary: "hsl(var(--foreground-tertiary))",
muted: "hsl(var(--foreground-muted))",
},
// Borders
border: {
DEFAULT: "hsl(var(--border))",
strong: "hsl(var(--border-strong))",
subtle: "hsl(var(--border-subtle))",
},
// Interactive States
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
secondary: {
DEFAULT: "hsl(var(--secondary))",
foreground: "hsl(var(--secondary-foreground))",
},
accent: {
DEFAULT: "hsl(var(--accent))",
foreground: "hsl(var(--accent-foreground))",
},
muted: {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
// Status Colors
success: {
DEFAULT: "hsl(var(--success))",
foreground: "hsl(var(--success-foreground))",
},
error: {
DEFAULT: "hsl(var(--error))",
foreground: "hsl(var(--error-foreground))",
},
warning: {
DEFAULT: "hsl(var(--warning))",
foreground: "hsl(var(--warning-foreground))",
},
info: {
DEFAULT: "hsl(var(--info))",
foreground: "hsl(var(--info-foreground))",
},
// Destructive (legacy support)
destructive: {
DEFAULT: "hsl(var(--destructive))",
foreground: "hsl(var(--destructive-foreground))",
},
// Form Elements
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",
// Card
card: {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
// Grid/Blueprint
grid: "hsl(var(--grid-color))",
},
borderRadius: {
sm: "var(--radius-sm)",
md: "var(--radius-md)",
lg: "var(--radius-lg)",
xl: "var(--radius-xl)",
},
fontFamily: {
sans: "var(--font-sans)",
mono: "var(--font-mono)",
},
lineHeight: {
tight: "var(--leading-tight)",
snug: "var(--leading-snug)",
normal: "var(--leading-normal)",
relaxed: "var(--leading-relaxed)",
loose: "var(--leading-loose)",
editorial: "var(--leading-editorial)",
},
letterSpacing: {
tighter: "var(--tracking-tighter)",
tight: "var(--tracking-tight)",
normal: "var(--tracking-normal)",
wide: "var(--tracking-wide)",
wider: "var(--tracking-wider)",
widest: "var(--tracking-widest)",
},
keyframes: {
"slide-up": {
from: { transform: "translateY(10px)", opacity: "0" },
to: { transform: "translateY(0)", opacity: "1" },
},
"slide-down": {
from: { transform: "translateY(-10px)", opacity: "0" },
to: { transform: "translateY(0)", opacity: "1" },
},
"slide-left": {
from: { transform: "translateX(10px)", opacity: "0" },
to: { transform: "translateX(0)", opacity: "1" },
},
"slide-right": {
from: { transform: "translateX(-10px)", opacity: "0" },
to: { transform: "translateX(0)", opacity: "1" },
},
"scale-in": {
from: { transform: "scale(0.95)", opacity: "0" },
to: { transform: "scale(1)", opacity: "1" },
},
"scale-out": {
from: { transform: "scale(1)", opacity: "1" },
to: { transform: "scale(0.95)", opacity: "0" },
},
shimmer: {
"0%": { backgroundPosition: "-1000px 0" },
"100%": { backgroundPosition: "1000px 0" },
},
pulse: {
"0%, 100%": { opacity: "1" },
"50%": { opacity: "0.5" },
},
"grid-pulse": {
"0%, 100%": { opacity: "0.4" },
"50%": { opacity: "0.6" },
},
},
animation: {
"slide-up": "slide-up 300ms cubic-bezier(0.4, 0, 0.2, 1)",
"slide-down": "slide-down 300ms cubic-bezier(0.4, 0, 0.2, 1)",
"slide-left": "slide-left 300ms cubic-bezier(0.4, 0, 0.2, 1)",
"slide-right": "slide-right 300ms cubic-bezier(0.4, 0, 0.2, 1)",
"scale-in": "scale-in 200ms cubic-bezier(0.4, 0, 0.2, 1)",
"scale-out": "scale-out 200ms cubic-bezier(0.4, 0, 0.2, 1)",
shimmer: "shimmer 2s infinite linear",
pulse: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",
"grid-pulse": "grid-pulse 8s ease-in-out infinite",
},
},
},
plugins: [],
} satisfies Config;