2026-05-14 13:52:45 +09:00
|
|
|
/** @type {import('tailwindcss').Config} */
|
|
|
|
|
export default {
|
2026-05-20 18:43:08 +09:00
|
|
|
darkMode: "class",
|
|
|
|
|
content: ["./index.html", "./src/**/*.{ts,tsx}"],
|
2026-05-14 13:52:45 +09:00
|
|
|
theme: {
|
2026-05-20 18:43:08 +09:00
|
|
|
container: {
|
|
|
|
|
center: true,
|
|
|
|
|
padding: "1rem",
|
|
|
|
|
screens: { "2xl": "1440px" },
|
|
|
|
|
},
|
2026-05-14 13:52:45 +09:00
|
|
|
extend: {
|
|
|
|
|
colors: {
|
|
|
|
|
border: "hsl(var(--border))",
|
2026-05-20 18:43:08 +09:00
|
|
|
"border-strong": "hsl(var(--border-strong))",
|
2026-05-14 13:52:45 +09:00
|
|
|
input: "hsl(var(--input))",
|
|
|
|
|
ring: "hsl(var(--ring))",
|
|
|
|
|
background: "hsl(var(--background))",
|
2026-05-20 18:43:08 +09:00
|
|
|
"background-subtle": "hsl(var(--background-subtle))",
|
|
|
|
|
surface: "hsl(var(--surface))",
|
|
|
|
|
"surface-raised": "hsl(var(--surface-raised))",
|
2026-05-14 13:52:45 +09:00
|
|
|
foreground: "hsl(var(--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))",
|
|
|
|
|
},
|
2026-05-20 18:43:08 +09:00
|
|
|
card: {
|
|
|
|
|
DEFAULT: "hsl(var(--card))",
|
|
|
|
|
foreground: "hsl(var(--card-foreground))",
|
|
|
|
|
},
|
|
|
|
|
popover: {
|
|
|
|
|
DEFAULT: "hsl(var(--popover))",
|
|
|
|
|
foreground: "hsl(var(--popover-foreground))",
|
|
|
|
|
},
|
|
|
|
|
// Brand scale (indigo-cyan blend tuned for analytics products)
|
|
|
|
|
brand: {
|
|
|
|
|
50: "hsl(var(--brand-50))",
|
|
|
|
|
100: "hsl(var(--brand-100))",
|
|
|
|
|
200: "hsl(var(--brand-200))",
|
|
|
|
|
300: "hsl(var(--brand-300))",
|
|
|
|
|
400: "hsl(var(--brand-400))",
|
|
|
|
|
500: "hsl(var(--brand-500))",
|
|
|
|
|
600: "hsl(var(--brand-600))",
|
|
|
|
|
700: "hsl(var(--brand-700))",
|
|
|
|
|
800: "hsl(var(--brand-800))",
|
|
|
|
|
900: "hsl(var(--brand-900))",
|
|
|
|
|
950: "hsl(var(--brand-950))",
|
|
|
|
|
},
|
|
|
|
|
// Semantic states (each has bg/border/foreground)
|
|
|
|
|
success: {
|
|
|
|
|
DEFAULT: "hsl(var(--success))",
|
|
|
|
|
foreground: "hsl(var(--success-foreground))",
|
|
|
|
|
subtle: "hsl(var(--success-subtle))",
|
|
|
|
|
border: "hsl(var(--success-border))",
|
|
|
|
|
},
|
|
|
|
|
warning: {
|
|
|
|
|
DEFAULT: "hsl(var(--warning))",
|
|
|
|
|
foreground: "hsl(var(--warning-foreground))",
|
|
|
|
|
subtle: "hsl(var(--warning-subtle))",
|
|
|
|
|
border: "hsl(var(--warning-border))",
|
|
|
|
|
},
|
|
|
|
|
danger: {
|
|
|
|
|
DEFAULT: "hsl(var(--danger))",
|
|
|
|
|
foreground: "hsl(var(--danger-foreground))",
|
|
|
|
|
subtle: "hsl(var(--danger-subtle))",
|
|
|
|
|
border: "hsl(var(--danger-border))",
|
|
|
|
|
},
|
|
|
|
|
info: {
|
|
|
|
|
DEFAULT: "hsl(var(--info))",
|
|
|
|
|
foreground: "hsl(var(--info-foreground))",
|
|
|
|
|
subtle: "hsl(var(--info-subtle))",
|
|
|
|
|
border: "hsl(var(--info-border))",
|
|
|
|
|
},
|
|
|
|
|
// alias for legacy code paths
|
|
|
|
|
destructive: {
|
|
|
|
|
DEFAULT: "hsl(var(--danger))",
|
|
|
|
|
foreground: "hsl(var(--danger-foreground))",
|
|
|
|
|
},
|
|
|
|
|
// Chart palette — qualitative, 12 hues
|
|
|
|
|
chart: {
|
|
|
|
|
1: "hsl(var(--chart-1))",
|
|
|
|
|
2: "hsl(var(--chart-2))",
|
|
|
|
|
3: "hsl(var(--chart-3))",
|
|
|
|
|
4: "hsl(var(--chart-4))",
|
|
|
|
|
5: "hsl(var(--chart-5))",
|
|
|
|
|
6: "hsl(var(--chart-6))",
|
|
|
|
|
7: "hsl(var(--chart-7))",
|
|
|
|
|
8: "hsl(var(--chart-8))",
|
|
|
|
|
9: "hsl(var(--chart-9))",
|
|
|
|
|
10: "hsl(var(--chart-10))",
|
|
|
|
|
11: "hsl(var(--chart-11))",
|
|
|
|
|
12: "hsl(var(--chart-12))",
|
|
|
|
|
},
|
2026-05-14 13:52:45 +09:00
|
|
|
},
|
|
|
|
|
borderRadius: {
|
2026-05-20 18:43:08 +09:00
|
|
|
xs: "calc(var(--radius) - 6px)",
|
2026-05-14 13:52:45 +09:00
|
|
|
sm: "calc(var(--radius) - 4px)",
|
2026-05-20 18:43:08 +09:00
|
|
|
md: "calc(var(--radius) - 2px)",
|
|
|
|
|
lg: "var(--radius)",
|
|
|
|
|
xl: "calc(var(--radius) + 4px)",
|
|
|
|
|
"2xl": "calc(var(--radius) + 8px)",
|
|
|
|
|
},
|
|
|
|
|
fontFamily: {
|
|
|
|
|
sans: ["var(--font-sans)"],
|
|
|
|
|
mono: ["var(--font-mono)"],
|
|
|
|
|
heading: ["var(--font-display)"],
|
|
|
|
|
},
|
|
|
|
|
fontSize: {
|
|
|
|
|
// Type ramp tuned for dense enterprise UI (line-height as second value)
|
|
|
|
|
"2xs": ["0.6875rem", { lineHeight: "1rem", letterSpacing: "0.01em" }],
|
|
|
|
|
xs: ["0.75rem", { lineHeight: "1.125rem" }],
|
|
|
|
|
sm: ["0.8125rem", { lineHeight: "1.25rem" }],
|
|
|
|
|
base: ["0.875rem", { lineHeight: "1.375rem" }],
|
|
|
|
|
md: ["0.9375rem", { lineHeight: "1.5rem" }],
|
|
|
|
|
lg: ["1rem", { lineHeight: "1.5rem" }],
|
|
|
|
|
xl: ["1.125rem", { lineHeight: "1.75rem" }],
|
|
|
|
|
"2xl": ["1.375rem", { lineHeight: "1.875rem", letterSpacing: "-0.01em" }],
|
|
|
|
|
"3xl": ["1.75rem", { lineHeight: "2.125rem", letterSpacing: "-0.015em" }],
|
|
|
|
|
"4xl": ["2.25rem", { lineHeight: "2.625rem", letterSpacing: "-0.02em" }],
|
|
|
|
|
display: ["3rem", { lineHeight: "3.25rem", letterSpacing: "-0.025em", fontWeight: "600" }],
|
|
|
|
|
},
|
|
|
|
|
spacing: {
|
|
|
|
|
// density-aware row heights
|
|
|
|
|
"row-compact": "32px",
|
|
|
|
|
"row-cozy": "40px",
|
|
|
|
|
"row-comfortable": "48px",
|
|
|
|
|
header: "56px",
|
|
|
|
|
"header-sm": "48px",
|
|
|
|
|
},
|
|
|
|
|
boxShadow: {
|
|
|
|
|
xs: "var(--shadow-xs)",
|
|
|
|
|
sm: "var(--shadow-sm)",
|
|
|
|
|
md: "var(--shadow-md)",
|
|
|
|
|
lg: "var(--shadow-lg)",
|
|
|
|
|
xl: "var(--shadow-xl)",
|
|
|
|
|
"2xl": "var(--shadow-2xl)",
|
|
|
|
|
"focus-ring": "0 0 0 2px hsl(var(--background)), 0 0 0 4px hsl(var(--ring))",
|
|
|
|
|
"inner-border": "inset 0 0 0 1px hsl(var(--border))",
|
|
|
|
|
},
|
|
|
|
|
transitionTimingFunction: {
|
|
|
|
|
"out-expo": "cubic-bezier(0.16, 1, 0.3, 1)",
|
|
|
|
|
"in-out-expo": "cubic-bezier(0.87, 0, 0.13, 1)",
|
|
|
|
|
},
|
|
|
|
|
transitionDuration: {
|
|
|
|
|
instant: "80ms",
|
|
|
|
|
fast: "120ms",
|
|
|
|
|
DEFAULT: "200ms",
|
|
|
|
|
slow: "320ms",
|
|
|
|
|
},
|
|
|
|
|
keyframes: {
|
|
|
|
|
"fade-in": {
|
|
|
|
|
from: { opacity: "0" },
|
|
|
|
|
to: { opacity: "1" },
|
|
|
|
|
},
|
|
|
|
|
"fade-in-up": {
|
|
|
|
|
from: { opacity: "0", transform: "translateY(4px)" },
|
|
|
|
|
to: { opacity: "1", transform: "translateY(0)" },
|
|
|
|
|
},
|
|
|
|
|
"slide-in-right": {
|
|
|
|
|
from: { transform: "translateX(8px)", opacity: "0" },
|
|
|
|
|
to: { transform: "translateX(0)", opacity: "1" },
|
|
|
|
|
},
|
|
|
|
|
shimmer: {
|
|
|
|
|
"100%": { transform: "translateX(100%)" },
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
animation: {
|
|
|
|
|
"fade-in": "fade-in 200ms cubic-bezier(0.16, 1, 0.3, 1)",
|
|
|
|
|
"fade-in-up": "fade-in-up 240ms cubic-bezier(0.16, 1, 0.3, 1)",
|
|
|
|
|
"slide-in-right": "slide-in-right 200ms cubic-bezier(0.16, 1, 0.3, 1)",
|
|
|
|
|
shimmer: "shimmer 1.6s linear infinite",
|
2026-05-14 13:52:45 +09:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
plugins: [],
|
2026-05-20 18:43:08 +09:00
|
|
|
};
|