/** @type {import('tailwindcss').Config} */ export default { content: [ "./index.html", "./src/**/*.{js,ts,jsx,tsx}", ], darkMode: 'class', theme: { extend: { colors: { // ── Semantic surface tokens (theme-aware via CSS vars) ────────── surface: { base: 'var(--color-surface-base)', raised: 'var(--color-surface-raised)', overlay: 'var(--color-surface-overlay)', inset: 'var(--color-surface-inset)', hover: 'var(--color-surface-hover)', active: 'var(--color-surface-active)', }, // ── Legacy dark-* aliases (backward compat → surface tokens) ─── dark: { 950: 'var(--color-surface-base)', 900: 'var(--color-surface-base)', 850: 'var(--color-surface-raised)', 800: 'var(--color-surface-raised)', 700: 'var(--color-surface-overlay)', 600: 'var(--color-surface-inset)', 500: 'var(--color-text-dim)', }, // ── Accent colors (RGB channels → /opacity works in light & dark) ── accent: { blue: 'rgb(var(--color-accent-blue-rgb) / )', 'blue-hover': 'rgb(var(--color-accent-blue-hover-rgb) / )', green: 'rgb(var(--color-accent-green-rgb) / )', purple: 'rgb(var(--color-accent-purple-rgb) / )', orange: 'rgb(var(--color-accent-orange-rgb) / )', red: 'rgb(var(--color-accent-red-rgb) / )', }, // ── Content / text tokens ────────────────────────────────────── content: { primary: 'var(--color-content-primary)', secondary: 'var(--color-content-secondary)', tertiary: 'var(--color-content-tertiary)', inverse: 'var(--color-content-inverse)', }, // ── Text tokens (direct mapping) ─────────────────────────────── txt: { primary: 'var(--color-text-primary)', secondary: 'var(--color-text-secondary)', muted: 'var(--color-text-muted)', faint: 'var(--color-text-faint)', dim: 'var(--color-text-dim)', }, // ── Border tokens ────────────────────────────────────────────── border: { DEFAULT: 'var(--color-border-default)', subtle: 'var(--color-border-subtle)', strong: 'var(--color-border-strong)', focus: 'var(--color-border-focus)', }, // ── Placeholder tokens ───────────────────────────────────────── ph: { DEFAULT: 'var(--color-placeholder)', disabled: 'var(--color-placeholder-disabled)', }, // ── Feedback / status tokens ─────────────────────────────────── feedback: { success: 'rgb(var(--color-feedback-success-rgb) / )', 'success-bg': 'var(--color-feedback-success-bg)', warning: 'rgb(var(--color-feedback-warning-rgb) / )', 'warning-bg': 'var(--color-feedback-warning-bg)', error: 'rgb(var(--color-feedback-error-rgb) / )', 'error-bg': 'var(--color-feedback-error-bg)', info: 'rgb(var(--color-feedback-info-rgb) / )', 'info-bg': 'var(--color-feedback-info-bg)', }, }, fontFamily: { sans: [ 'Inter', '-apple-system', 'BlinkMacSystemFont', '"Segoe UI"', 'Roboto', '"Helvetica Neue"', 'Arial', '"Noto Sans SC"', '"PingFang SC"', '"Microsoft YaHei"', 'sans-serif', ], mono: [ 'Menlo', 'Monaco', 'Consolas', '"Liberation Mono"', '"Courier New"', 'monospace', ], }, animation: { 'fade-in': 'fadeIn 0.15s ease-out', 'slide-up': 'slideUp 0.2s ease-out', 'scale-in': 'scaleIn 0.15s ease-out', }, keyframes: { fadeIn: { '0%': { opacity: '0' }, '100%': { opacity: '1' }, }, slideUp: { '0%': { opacity: '0', transform: 'translateY(8px)' }, '100%': { opacity: '1', transform: 'translateY(0)' }, }, scaleIn: { '0%': { opacity: '0', transform: 'scale(0.96)' }, '100%': { opacity: '1', transform: 'scale(1)' }, }, }, }, }, plugins: [], }