openoperator / tailwind.config.ts
Leon4gr45's picture
Deploy to clean space
75fefa7 verified
/* eslint-disable @typescript-eslint/no-require-imports */
import defaultTheme from "tailwindcss/defaultTheme";
import type { Config } from "tailwindcss";
import colorsJson from "./colors.json";
const colors = Object.keys(colorsJson).reduce(
(acc, key) => {
acc[key] = `var(--${key})`;
return acc;
},
{} as Record<string, string>
);
const sizes = Array.from({ length: 1000 }, (_, i) => i).reduce(
(acc, curr) => {
acc[curr] = `${curr}px`;
return acc;
},
{
max: "max-content",
unset: "unset",
full: "100%",
inherit: "inherit",
"1/2": "50%",
"1/3": "33.3%",
"2/3": "66.6%",
"1/4": "25%",
"1/6": "16.6%",
"2/6": "33.3%",
"3/6": "50%",
"4/6": "66.6%",
"5/6": "83.3%"
} as Record<string, string>
);
const opacities = Array.from({ length: 100 }, (_, i) => i).reduce(
(acc, curr) => {
acc[curr] = curr / 100 + "";
return acc;
},
{} as Record<string, string>
);
const transitionDurations = Array.from({ length: 60 }, (_, i) => i).reduce(
(acc, curr) => {
acc[curr] = curr * 50 + "";
return acc;
},
{} as Record<string, string>
);
const themeConfig: Config = {
darkMode: "class",
content: [
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
"./components/**/*.{js,ts,jsx,tsx,mdx}",
"./app/**/*.{js,ts,jsx,tsx,mdx}",
"./components-new/**/*.{js,ts,jsx,tsx,mdx}",
"./styling-reference/ai-ready-website/app/**/*.{ts,tsx}",
"./styling-reference/ai-ready-website/components/**/*.{ts,tsx}",
"./styling-reference/ai-ready-website/components-new/**/*.{ts,tsx}",
],
theme: {
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
fontFamily: {
sans: ["var(--font-geist-sans)", "var(--font-inter)", ...defaultTheme.fontFamily.sans],
mono: ["var(--font-geist-mono)", ...defaultTheme.fontFamily.mono],
ascii: ["var(--font-roboto-mono)", ...defaultTheme.fontFamily.mono]
},
fontSize: {
"title-h1": [
"60px",
{
"lineHeight": "64px",
"letterSpacing": "-0.3px",
"fontWeight": "500"
}
],
"title-h2": [
"52px",
{
"lineHeight": "56px",
"letterSpacing": "-0.52px",
"fontWeight": "500"
}
],
"title-h3": [
"40px",
{
"lineHeight": "44px",
"letterSpacing": "-0.4px",
"fontWeight": "500"
}
],
"title-h4": [
"32px",
{
"lineHeight": "36px",
"letterSpacing": "-0.32px",
"fontWeight": "500"
}
],
"title-h5": [
"24px",
{
"lineHeight": "32px",
"letterSpacing": "-0.24px",
"fontWeight": "500"
}
],
"body-x-large": [
"20px",
{
"lineHeight": "28px",
"letterSpacing": "-0.1px",
"fontWeight": "400"
}
],
"body-large": [
"16px",
{
"lineHeight": "24px",
"letterSpacing": "0px",
"fontWeight": "400"
}
],
"body-medium": [
"14px",
{
"lineHeight": "20px",
"letterSpacing": "0.14px",
"fontWeight": "400"
}
],
"body-small": [
"13px",
{
"lineHeight": "20px",
"letterSpacing": "0px",
"fontWeight": "400"
}
],
"body-input": [
"15px",
{
"lineHeight": "24px",
"letterSpacing": "0px",
"fontWeight": "400"
}
],
"label-x-large": [
"20px",
{
"lineHeight": "28px",
"letterSpacing": "-0.1px",
"fontWeight": "450"
}
],
"label-large": [
"16px",
{
"lineHeight": "24px",
"letterSpacing": "0px",
"fontWeight": "450"
}
],
"label-medium": [
"14px",
{
"lineHeight": "20px",
"letterSpacing": "0px",
"fontWeight": "450"
}
],
"label-small": [
"13px",
{
"lineHeight": "20px",
"letterSpacing": "0px",
"fontWeight": "450"
}
],
"label-x-small": [
"12px",
{
"lineHeight": "20px",
"letterSpacing": "0px",
"fontWeight": "450"
}
],
"mono-medium": [
"14px",
{
"lineHeight": "22px",
"letterSpacing": "0px",
"fontWeight": "400"
}
],
"mono-small": [
"13px",
{
"lineHeight": "20px",
"letterSpacing": "0px",
"fontWeight": "500"
}
],
"mono-x-small": [
"12px",
{
"lineHeight": "16px",
"letterSpacing": "0px",
"fontWeight": "400"
}
],
"title-blog": [
"28px",
{
"lineHeight": "36px",
"letterSpacing": "-0.28px",
"fontWeight": "500"
}
]
},
colors: {
transparent: "transparent",
current: "currentColor",
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))",
},
...colors
},
screens: {
xs: { min: "390px" },
"xs-max": { max: "389px" },
sm: { min: "576px" },
"sm-max": { max: "575px" },
md: { min: "768px" },
"md-max": { max: "767px" },
lg: { min: "996px" },
"lg-max": { max: "995px" },
xl: { min: "1200px" },
"xl-max": { max: "1199px" }
},
opacity: opacities,
spacing: {
...sizes,
'root': 'var(--root-padding)'
},
width: sizes,
maxWidth: sizes,
height: sizes,
inset: sizes,
borderWidth: sizes,
backdropBlur: Array.from({ length: 20 }, (_, i) => i).reduce(
(acc, curr) => {
acc[curr] = curr + "px";
return acc;
},
{} as Record<string, string>
),
transitionTimingFunction: { DEFAULT: "cubic-bezier(0.25, 0.1, 0.25, 1)" },
transitionDuration: {
DEFAULT: "200ms",
...transitionDurations
},
transitionDelay: {
...transitionDurations
},
borderRadius: (() => {
const radius: Record<string | number, string> = {
full: "999px",
inherit: "inherit",
0: "0px",
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
};
for (let i = 1; i <= 32; i += 1) {
radius[i] = `${i}px`;
}
return radius;
})()
}
},
plugins: [
({
addUtilities, matchUtilities
}: any) => {
addUtilities({
// Inside-border utilities are defined in inside-border-fix.css to avoid Tailwind variant conflicts
'.mask-border': {
"mask": "linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
"mask-composite": "exclude",
"pointer-events": "none"
},
".center-x": { "@apply absolute left-1/2 -translate-x-1/2": {} },
".center-y": { "@apply absolute top-1/2 -translate-y-1/2": {} },
".center": { "@apply absolute left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2": {} },
".flex-center": { "@apply flex items-center justify-center": {} },
".overlay": { "@apply absolute top-0 left-0 w-full h-full rounded-inherit": {} },
".text-gradient": { "@apply !bg-clip-text !text-transparent": {} }
});
matchUtilities(
{
'cw': (value: string) => {
const width = parseInt(value);
return {
width: value,
left: `calc(50% - ${width / 2}px)`
};
},
'ch': (value: string) => {
const height = parseInt(value);
return {
height: value,
top: `calc(50% - ${height / 2}px)`
};
},
'cs': (value: string) => {
const size = parseInt(value);
return {
width: size,
height: size,
left: `calc(50% - ${size / 2}px)`,
top: `calc(50% - ${size / 2}px)`
};
},
'cmw': (value: string) => {
const [maxWidth, paddingX] = value.split(',').map((v) => parseInt(v));
const width = paddingX ? `calc(100% - ${paddingX * 2}px)` : '100%';
return {
maxWidth: maxWidth,
width,
left: `calc(50% - (min(${maxWidth}px, ${width}) / 2))`
};
},
'mw': (value: string) => {
const [maxWidth, paddingX] = value.split(',').map((v) => parseInt(v));
const width = paddingX ? `calc(100% - ${paddingX * 2}px)` : '100%';
return {
maxWidth: maxWidth,
width
};
}
},
{ values: sizes }
);
},
require("tailwind-gradient-mask-image"),
require("@tailwindcss/typography"),
]
};
export default themeConfig;