- Upgrades build to use Node 22 - Adds version matrix to GH workflow to test compatibility with 20
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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,
 | |
|   ],
 | |
| };
 |