import type { Config } from "tailwindcss"; const config: Config = { // Dark is the default; light mode activates when `.light` is NOT absent (i.e. dark when no `.light` class) darkMode: ["selector", ":root:not(.light)"], content: [ "./pages/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}", "./app/**/*.{js,ts,jsx,tsx,mdx}", "./lib/**/*.{js,ts,jsx,tsx}", ], theme: { extend: { colors: { // Semantic tokens — reference CSS custom properties background: "hsl(var(--background))", foreground: "hsl(var(--foreground))", card: { DEFAULT: "hsl(var(--card))", foreground: "hsl(var(--card-foreground))", }, popover: { DEFAULT: "hsl(var(--popover))", foreground: "hsl(var(--popover-foreground))", }, primary: { DEFAULT: "hsl(var(--primary))", foreground: "hsl(var(--primary-foreground))", }, secondary: { DEFAULT: "hsl(var(--secondary))", foreground: "hsl(var(--secondary-foreground))", }, muted: { DEFAULT: "hsl(var(--muted))", foreground: "hsl(var(--muted-foreground))", }, accent: { DEFAULT: "hsl(var(--accent))", foreground: "hsl(var(--accent-foreground))", }, destructive: { DEFAULT: "hsl(var(--destructive))", foreground: "hsl(var(--destructive-foreground))", }, border: "hsl(var(--border))", input: "hsl(var(--input))", ring: "hsl(var(--ring))", // Direct CSS var tokens (non-HSL) canvas: { DEFAULT: "var(--color-bg-primary)", secondary: "var(--color-bg-secondary)", elevated: "var(--color-bg-elevated)", }, ink: { DEFAULT: "var(--color-text-primary)", secondary: "var(--color-text-secondary)", muted: "var(--color-text-muted)", }, "brand-accent": { DEFAULT: "var(--color-accent)", hover: "var(--color-accent-hover)", active: "var(--color-accent-active)", fg: "var(--color-accent-foreground)", }, edge: { DEFAULT: "var(--color-border)", hover: "var(--color-border-hover)", }, success: { DEFAULT: "var(--color-success)", bg: "var(--color-success-bg)", }, warning: { DEFAULT: "var(--color-warning)", bg: "var(--color-warning-bg)", }, error: { DEFAULT: "var(--color-error)", bg: "var(--color-error-bg)", }, info: { DEFAULT: "var(--color-info)", bg: "var(--color-info-bg)", }, "code-surface": { DEFAULT: "var(--color-code-bg)", text: "var(--color-code-text)", }, // Brand palette brand: { 50: "#f5f3ff", 100: "#ede9fe", 200: "#ddd6fe", 300: "#c4b5fd", 400: "#a78bfa", 500: "#8b5cf6", 600: "#7c3aed", 700: "#6d28d9", 800: "#5b21b6", 900: "#4c1d95", 950: "#2e1065", }, // Surface (neutral) palette surface: { 50: "#fafafa", 100: "#f4f4f5", 200: "#e4e4e7", 300: "#d4d4d8", 400: "#a1a1aa", 500: "#71717a", 600: "#52525b", 700: "#3f3f46", 800: "#27272a", 850: "#1f1f23", 900: "#18181b", 950: "#09090b", }, }, fontFamily: { sans: ["var(--font-inter)", "system-ui", "sans-serif"], mono: ["var(--font-jetbrains-mono)", "ui-monospace", "monospace"], }, borderRadius: { lg: "var(--radius)", md: "calc(var(--radius) - 2px)", sm: "calc(var(--radius) - 4px)", }, transitionDuration: { fast: "100ms", normal: "200ms", slow: "300ms", }, animation: { "fade-in": "fadeIn 200ms ease forwards", "fade-out": "fadeOut 200ms ease forwards", "slide-up": "slideUp 300ms ease forwards", "slide-down": "slideDown 300ms ease forwards", "slide-down-out": "slideDownOut 300ms ease forwards", "scale-in": "scaleIn 200ms ease forwards", "scale-out": "scaleOut 200ms ease forwards", shimmer: "shimmer 2s linear infinite", spin: "spin 1s linear infinite", "pulse-soft": "pulseSoft 2s cubic-bezier(0.4, 0, 0.6, 1) infinite", "progress-bar": "progress linear forwards", }, keyframes: { fadeIn: { "0%": { opacity: "0" }, "100%": { opacity: "1" }, }, fadeOut: { "0%": { opacity: "1" }, "100%": { opacity: "0" }, }, slideUp: { "0%": { transform: "translateY(8px)", opacity: "0" }, "100%": { transform: "translateY(0)", opacity: "1" }, }, slideDown: { "0%": { transform: "translateY(-8px)", opacity: "0" }, "100%": { transform: "translateY(0)", opacity: "1" }, }, slideDownOut: { "0%": { transform: "translateY(0)", opacity: "1" }, "100%": { transform: "translateY(8px)", opacity: "0" }, }, scaleIn: { "0%": { transform: "scale(0.95)", opacity: "0" }, "100%": { transform: "scale(1)", opacity: "1" }, }, scaleOut: { "0%": { transform: "scale(1)", opacity: "1" }, "100%": { transform: "scale(0.95)", opacity: "0" }, }, shimmer: { "0%": { backgroundPosition: "-200% 0" }, "100%": { backgroundPosition: "200% 0" }, }, pulseSoft: { "0%, 100%": { opacity: "1" }, "50%": { opacity: "0.5" }, }, progress: { from: { transform: "scaleX(1)" }, to: { transform: "scaleX(0)" }, }, }, }, }, plugins: [], }; export default config;