import defaultTheme from 'tailwindcss/defaultTheme'; import flattenColorPalette from 'tailwindcss/lib/util/flattenColorPalette'; function rem2px(input, fontSize = 16) { if (input == null) { return input; } switch (typeof input) { case 'object': { if (Array.isArray(input)) { return input.map((val) => rem2px(val, fontSize)); } const ret = {}; for (const key in input) { ret[key] = rem2px(input[key]); } return ret; } case 'string': return input.replace( /(\d*\.?\d+)rem$/, (_, val) => `${parseFloat(val) * fontSize}px`, ); default: return input; } } /** @type {import('tailwindcss').Config} */ export default { content: ['./src/**/*.{js,ts,jsx,tsx,vue}'], theme: { extend: { fontFamily: { sans: ['Poppins', ...defaultTheme.fontFamily.sans], mono: ['IBM Plex Mono', ...defaultTheme.fontFamily.sans], }, colors: { border: 'hsl(var(--border))', input: 'hsl(var(--input))', ring: 'hsl(var(--ring))', background: 'hsl(var(--background))', foreground: 'hsl(var(--foreground))', primary: { DEFAULT: 'hsl(var(--primary))', foreground: 'hsl(var(--primary-foreground))', }, secondary: { DEFAULT: 'hsl(var(--secondary))', foreground: 'hsl(var(--secondary-foreground))', }, destructive: { DEFAULT: 'hsl(var(--destructive))', foreground: 'hsl(var(--destructive-foreground))', }, muted: { DEFAULT: 'hsl(var(--muted))', foreground: 'hsl(var(--muted-foreground))', }, accent: { DEFAULT: 'hsl(var(--accent))', foreground: 'hsl(var(--accent-foreground))', }, popover: { DEFAULT: 'hsl(var(--popover))', foreground: 'hsl(var(--popover-foreground))', }, card: { DEFAULT: 'hsl(var(--card))', foreground: 'hsl(var(--card-foreground))', }, }, borderRadius: { lg: 'var(--radius)', md: 'calc(var(--radius) - 2px)', sm: 'calc(var(--radius) - 4px)', }, columns: rem2px(defaultTheme.columns), fontSize: rem2px(defaultTheme.fontSize), lineHeight: rem2px(defaultTheme.lineHeight), maxWidth: ({ theme, breakpoints }) => ({ ...rem2px(defaultTheme.maxWidth({ theme, breakpoints })), }), spacing: rem2px(defaultTheme.spacing), }, }, plugins: [ function ({ matchUtilities, theme }) { matchUtilities( { highlight: (value) => ({ boxShadow: `inset 0 1px 0 0 ${value}` }), }, { values: flattenColorPalette(theme('backgroundColor')), type: 'color', }, ); }, ], };