browsertrix/frontend/tailwind.config.js
sua yoo 3b6f63f030
deps: Upgrade to Node 22 (#2274)
- Upgrades build to use Node 22
- Adds version matrix to GH workflow to test compatibility with 20
2025-01-07 11:58:23 -08:00

159 lines
4.5 KiB
JavaScript

import theme from "@webrecorder/hickory/tokens/tailwind";
import { tailwindTransform } from "postcss-lit";
import attributes from "./config/tailwind/plugins/attributes";
import containPlugin from "./config/tailwind/plugins/contain";
import contentVisibilityPlugin from "./config/tailwind/plugins/content-visibility";
import cssPartsPlugin from "./config/tailwind/plugins/parts";
/**
* Merge Shoelace and hickory themes
*
* @returns {import('tailwindcss').Config['theme']}
*/
function makeTheme() {
// Map color grading:
const colorGrades = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900];
/**
* @param {string} color
* @returns {Record<string, string>}
*/
const shoelaceColorPalette = (color) =>
colorGrades.reduce(
/**
* @param {Record<string, string>} acc
* @param {number} v
* @returns
*/
(acc, v) => ({
...acc,
[v]: `var(--sl-color-${color}-${v})`,
}),
{},
);
return {
// https://github.com/tailwindlabs/tailwindcss/blob/52ab3154392ba3d7a05cae643694384e72dc24b2/stubs/defaultConfig.stub.js
colors: {
current: "currentColor",
...theme.colors,
primary: {
...theme.colors.cyan,
DEFAULT: theme.colors.cyan[500],
},
brand: theme.colors.brand,
success: {
...shoelaceColorPalette("success"),
DEFAULT: `var(--success)`,
},
warning: {
...shoelaceColorPalette("warning"),
DEFAULT: `var(--warning)`,
},
danger: {
...shoelaceColorPalette("danger"),
DEFAULT: `var(--danger)`,
},
neutral: {
...shoelaceColorPalette("neutral"),
// Shoelace supports additional neutral variables:
0: `var(--sl-color-neutral-0)`,
950: `var(--sl-color-neutral-950)`,
1000: `var(--sl-color-neutral-1000)`,
},
},
borderColor: {
DEFAULT: `var(--sl-panel-border-color)`,
},
fontFamily: {
sans: `var(--sl-font-sans)`,
serif: `var(--sl-font-serif)`,
mono: `var(--sl-font-mono)`,
},
fontSize: {
xs: ["var(--sl-font-size-x-small)", { lineHeight: "1.33" }],
sm: ["var(--sl-font-size-small)", { lineHeight: "1.25rem" }],
// base: ["var(--sl-font-size-medium)", { lineHeight: "1.5" }],
lg: ["var(--sl-font-size-large)", { lineHeight: "1.6" }],
xl: ["var(--sl-font-size-x-large)", { lineHeight: "1.5" }],
"2xl": ["var(--sl-font-size-2x-large)", { lineHeight: "1.5" }],
"3xl": ["var(--sl-font-size-3x-large)", { lineHeight: "1" }],
"4xl": ["var(--sl-font-size-4x-large)", { lineHeight: "1" }],
},
fontWeight: {
light: "var(--sl-font-weight-light)",
normal: "var(--sl-font-weight-normal)",
medium: "var(--sl-font-weight-medium)",
semibold: "var(--sl-font-weight-semibold)",
bold: "var(--sl-font-weight-bold)",
},
borderRadius: {
sm: `var(--sl-border-radius-small)`,
DEFAULT: `var(--sl-border-radius-medium)`,
md: `var(--sl-border-radius-medium)`,
lg: `var(--sl-border-radius-large)`,
xl: `var(--sl-border-radius-x-large)`,
},
// TODO see if there's a way to use Shoelace's box shadows with customizable colors
// boxShadow: {
// sm: `var(--sl-shadow-small)`,
// DEFAULT: `var(--sl-shadow-medium)`,
// md: `var(--sl-shadow-medium)`,
// lg: `var(--sl-shadow-large)`,
// xl: `var(--sl-shadow-x-large)`,
// },
aspectRatio: {
"4/3": "4 / 3", // For Browsertrix watch/replay
},
gridTemplateColumns: {
13: "repeat(13, minmax(0, 1fr))",
14: "repeat(14, minmax(0, 1fr))",
},
screens: {
desktop: "82.5rem", // 14 4.5rem columns with 1.5rem gutter
// Override default of:
// => @media (min-width: 1024px) { ... }
},
transitionDuration: {
"x-slow": "var(--sl-transition-x-slow)",
slow: "var(--sl-transition-slow)",
medium: "var(--sl-transition-medium)",
fast: "var(--sl-transition-fast)",
"x-fast": "var(--sl-transition-x-fast)",
},
outlineWidth: {
3: "3px",
},
outlineOffset: {
3: "3px",
},
};
}
/** @type {import('tailwindcss').Config} */
module.exports = {
theme: {
extend: makeTheme(),
},
content: {
files: ["./src/**/*.html", "./src/**/*.{ts,js,ejs}"],
transform: {
ts: tailwindTransform,
},
},
extract: {
include: ["./src/**/*.{ts,js}"],
},
plugins: [
require("@tailwindcss/container-queries"),
attributes,
containPlugin,
contentVisibilityPlugin,
cssPartsPlugin,
],
};