465 lines
7.6 KiB
TypeScript
465 lines
7.6 KiB
TypeScript
|
|
import { join } from "node:path";
|
|||
|
|
import type { Config } from "tailwindcss";
|
|||
|
|
|
|||
|
|
// 自动推导所有主色和表面色的类型
|
|||
|
|
type primaryColor =
|
|||
|
|
| "emerald"
|
|||
|
|
| "green"
|
|||
|
|
| "lime"
|
|||
|
|
| "orange"
|
|||
|
|
| "amber"
|
|||
|
|
| "yellow"
|
|||
|
|
| "teal"
|
|||
|
|
| "cyan"
|
|||
|
|
| "sky"
|
|||
|
|
| "blue"
|
|||
|
|
| "indigo"
|
|||
|
|
| "violet"
|
|||
|
|
| "purple"
|
|||
|
|
| "fuchsia"
|
|||
|
|
| "pink";
|
|||
|
|
type surfaceColor = "slate" | "gray" | "zinc" | "neutral" | "stone" | "soho" | "viva" | "ocean";
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 主题主色调色板
|
|||
|
|
*/
|
|||
|
|
export const PRIMARY_COLOR_PALETTES = [
|
|||
|
|
{
|
|||
|
|
name: "emerald",
|
|||
|
|
palette: {
|
|||
|
|
50: "#ecfdf5",
|
|||
|
|
100: "#d1fae5",
|
|||
|
|
200: "#a7f3d0",
|
|||
|
|
300: "#6ee7b7",
|
|||
|
|
400: "#34d399",
|
|||
|
|
500: "#10b981",
|
|||
|
|
600: "#059669",
|
|||
|
|
700: "#047857",
|
|||
|
|
800: "#065f46",
|
|||
|
|
900: "#064e3b",
|
|||
|
|
950: "#022c22"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "green",
|
|||
|
|
palette: {
|
|||
|
|
50: "#f0fdf4",
|
|||
|
|
100: "#dcfce7",
|
|||
|
|
200: "#bbf7d0",
|
|||
|
|
300: "#86efac",
|
|||
|
|
400: "#4ade80",
|
|||
|
|
500: "#22c55e",
|
|||
|
|
600: "#16a34a",
|
|||
|
|
700: "#15803d",
|
|||
|
|
800: "#166534",
|
|||
|
|
900: "#14532d",
|
|||
|
|
950: "#052e16"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "lime",
|
|||
|
|
palette: {
|
|||
|
|
50: "#f7fee7",
|
|||
|
|
100: "#ecfccb",
|
|||
|
|
200: "#d9f99d",
|
|||
|
|
300: "#bef264",
|
|||
|
|
400: "#a3e635",
|
|||
|
|
500: "#84cc16",
|
|||
|
|
600: "#65a30d",
|
|||
|
|
700: "#4d7c0f",
|
|||
|
|
800: "#3f6212",
|
|||
|
|
900: "#365314",
|
|||
|
|
950: "#1a2e05"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "orange",
|
|||
|
|
palette: {
|
|||
|
|
50: "#fff7ed",
|
|||
|
|
100: "#ffedd5",
|
|||
|
|
200: "#fed7aa",
|
|||
|
|
300: "#fdba74",
|
|||
|
|
400: "#fb923c",
|
|||
|
|
500: "#f97316",
|
|||
|
|
600: "#ea580c",
|
|||
|
|
700: "#c2410c",
|
|||
|
|
800: "#9a3412",
|
|||
|
|
900: "#7c2d12",
|
|||
|
|
950: "#431407"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "amber",
|
|||
|
|
palette: {
|
|||
|
|
50: "#fffbeb",
|
|||
|
|
100: "#fef3c7",
|
|||
|
|
200: "#fde68a",
|
|||
|
|
300: "#fcd34d",
|
|||
|
|
400: "#fbbf24",
|
|||
|
|
500: "#f59e0b",
|
|||
|
|
600: "#d97706",
|
|||
|
|
700: "#b45309",
|
|||
|
|
800: "#92400e",
|
|||
|
|
900: "#78350f",
|
|||
|
|
950: "#451a03"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "yellow",
|
|||
|
|
palette: {
|
|||
|
|
50: "#fefce8",
|
|||
|
|
100: "#fef9c3",
|
|||
|
|
200: "#fef08a",
|
|||
|
|
300: "#fde047",
|
|||
|
|
400: "#facc15",
|
|||
|
|
500: "#eab308",
|
|||
|
|
600: "#ca8a04",
|
|||
|
|
700: "#a16207",
|
|||
|
|
800: "#854d0e",
|
|||
|
|
900: "#713f12",
|
|||
|
|
950: "#422006"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "teal",
|
|||
|
|
palette: {
|
|||
|
|
50: "#f0fdfa",
|
|||
|
|
100: "#ccfbf1",
|
|||
|
|
200: "#99f6e4",
|
|||
|
|
300: "#5eead4",
|
|||
|
|
400: "#2dd4bf",
|
|||
|
|
500: "#14b8a6",
|
|||
|
|
600: "#0d9488",
|
|||
|
|
700: "#0f766e",
|
|||
|
|
800: "#115e59",
|
|||
|
|
900: "#134e4a",
|
|||
|
|
950: "#042f2e"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "cyan",
|
|||
|
|
palette: {
|
|||
|
|
50: "#ecfeff",
|
|||
|
|
100: "#cffafe",
|
|||
|
|
200: "#a5f3fc",
|
|||
|
|
300: "#67e8f9",
|
|||
|
|
400: "#22d3ee",
|
|||
|
|
500: "#06b6d4",
|
|||
|
|
600: "#0891b2",
|
|||
|
|
700: "#0e7490",
|
|||
|
|
800: "#155e75",
|
|||
|
|
900: "#164e63",
|
|||
|
|
950: "#083344"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "sky",
|
|||
|
|
palette: {
|
|||
|
|
50: "#f0f9ff",
|
|||
|
|
100: "#e0f2fe",
|
|||
|
|
200: "#bae6fd",
|
|||
|
|
300: "#7dd3fc",
|
|||
|
|
400: "#38bdf8",
|
|||
|
|
500: "#0ea5e9",
|
|||
|
|
600: "#0284c7",
|
|||
|
|
700: "#0369a1",
|
|||
|
|
800: "#075985",
|
|||
|
|
900: "#0c4a6e",
|
|||
|
|
950: "#082f49"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "blue",
|
|||
|
|
palette: {
|
|||
|
|
50: "#eff6ff",
|
|||
|
|
100: "#dbeafe",
|
|||
|
|
200: "#bfdbfe",
|
|||
|
|
300: "#93c5fd",
|
|||
|
|
400: "#60a5fa",
|
|||
|
|
500: "#3b82f6",
|
|||
|
|
600: "#2563eb",
|
|||
|
|
700: "#1d4ed8",
|
|||
|
|
800: "#1e40af",
|
|||
|
|
900: "#1e3a8a",
|
|||
|
|
950: "#172554"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "indigo",
|
|||
|
|
palette: {
|
|||
|
|
50: "#eef2ff",
|
|||
|
|
100: "#e0e7ff",
|
|||
|
|
200: "#c7d2fe",
|
|||
|
|
300: "#a5b4fc",
|
|||
|
|
400: "#818cf8",
|
|||
|
|
500: "#6366f1",
|
|||
|
|
600: "#4f46e5",
|
|||
|
|
700: "#4338ca",
|
|||
|
|
800: "#3730a3",
|
|||
|
|
900: "#312e81",
|
|||
|
|
950: "#1e1b4b"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "violet",
|
|||
|
|
palette: {
|
|||
|
|
50: "#f5f3ff",
|
|||
|
|
100: "#ede9fe",
|
|||
|
|
200: "#ddd6fe",
|
|||
|
|
300: "#c4b5fd",
|
|||
|
|
400: "#a78bfa",
|
|||
|
|
500: "#8b5cf6",
|
|||
|
|
600: "#7c3aed",
|
|||
|
|
700: "#6d28d9",
|
|||
|
|
800: "#5b21b6",
|
|||
|
|
900: "#4c1d95",
|
|||
|
|
950: "#2e1065"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "purple",
|
|||
|
|
palette: {
|
|||
|
|
50: "#faf5ff",
|
|||
|
|
100: "#f3e8ff",
|
|||
|
|
200: "#e9d5ff",
|
|||
|
|
300: "#d8b4fe",
|
|||
|
|
400: "#c084fc",
|
|||
|
|
500: "#a855f7",
|
|||
|
|
600: "#9333ea",
|
|||
|
|
700: "#7e22ce",
|
|||
|
|
800: "#6b21a8",
|
|||
|
|
900: "#581c87",
|
|||
|
|
950: "#3b0764"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "fuchsia",
|
|||
|
|
palette: {
|
|||
|
|
50: "#fdf4ff",
|
|||
|
|
100: "#fae8ff",
|
|||
|
|
200: "#f5d0fe",
|
|||
|
|
300: "#f0abfc",
|
|||
|
|
400: "#e879f9",
|
|||
|
|
500: "#d946ef",
|
|||
|
|
600: "#c026d3",
|
|||
|
|
700: "#a21caf",
|
|||
|
|
800: "#86198f",
|
|||
|
|
900: "#701a75",
|
|||
|
|
950: "#4a044e"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "pink",
|
|||
|
|
palette: {
|
|||
|
|
50: "#fdf2f8",
|
|||
|
|
100: "#fce7f3",
|
|||
|
|
200: "#fbcfe8",
|
|||
|
|
300: "#f9a8d4",
|
|||
|
|
400: "#f472b6",
|
|||
|
|
500: "#ec4899",
|
|||
|
|
600: "#db2777",
|
|||
|
|
700: "#be185d",
|
|||
|
|
800: "#9d174d",
|
|||
|
|
900: "#831843",
|
|||
|
|
950: "#500724"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 表面色调色板
|
|||
|
|
*/
|
|||
|
|
export const SURFACE_PALETTES = [
|
|||
|
|
{
|
|||
|
|
name: "slate",
|
|||
|
|
palette: {
|
|||
|
|
0: "#ffffff",
|
|||
|
|
50: "#f8fafc",
|
|||
|
|
100: "#f1f5f9",
|
|||
|
|
200: "#e2e8f0",
|
|||
|
|
300: "#cbd5e1",
|
|||
|
|
400: "#94a3b8",
|
|||
|
|
500: "#64748b",
|
|||
|
|
600: "#475569",
|
|||
|
|
700: "#334155",
|
|||
|
|
800: "#1e293b",
|
|||
|
|
900: "#0f172a",
|
|||
|
|
950: "#020617"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "gray",
|
|||
|
|
palette: {
|
|||
|
|
0: "#ffffff",
|
|||
|
|
50: "#f9fafb",
|
|||
|
|
100: "#f3f4f6",
|
|||
|
|
200: "#e5e7eb",
|
|||
|
|
300: "#d1d5db",
|
|||
|
|
400: "#9ca3af",
|
|||
|
|
500: "#6b7280",
|
|||
|
|
600: "#4b5563",
|
|||
|
|
700: "#374151",
|
|||
|
|
800: "#1f2937",
|
|||
|
|
900: "#111827",
|
|||
|
|
950: "#030712"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "zinc",
|
|||
|
|
palette: {
|
|||
|
|
0: "#ffffff",
|
|||
|
|
50: "#fafafa",
|
|||
|
|
100: "#f4f4f5",
|
|||
|
|
200: "#e4e4e7",
|
|||
|
|
300: "#d4d4d8",
|
|||
|
|
400: "#a1a1aa",
|
|||
|
|
500: "#71717a",
|
|||
|
|
600: "#52525b",
|
|||
|
|
700: "#3f3f46",
|
|||
|
|
800: "#27272a",
|
|||
|
|
900: "#18181b",
|
|||
|
|
950: "#09090b"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "neutral",
|
|||
|
|
palette: {
|
|||
|
|
0: "#ffffff",
|
|||
|
|
50: "#fafafa",
|
|||
|
|
100: "#f5f5f5",
|
|||
|
|
200: "#e5e5e5",
|
|||
|
|
300: "#d4d4d4",
|
|||
|
|
400: "#a3a3a3",
|
|||
|
|
500: "#737373",
|
|||
|
|
600: "#525252",
|
|||
|
|
700: "#404040",
|
|||
|
|
800: "#262626",
|
|||
|
|
900: "#171717",
|
|||
|
|
950: "#0a0a0a"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "stone",
|
|||
|
|
palette: {
|
|||
|
|
0: "#ffffff",
|
|||
|
|
50: "#fafaf9",
|
|||
|
|
100: "#f5f5f4",
|
|||
|
|
200: "#e7e5e4",
|
|||
|
|
300: "#d6d3d1",
|
|||
|
|
400: "#a8a29e",
|
|||
|
|
500: "#78716c",
|
|||
|
|
600: "#57534e",
|
|||
|
|
700: "#44403c",
|
|||
|
|
800: "#292524",
|
|||
|
|
900: "#1c1917",
|
|||
|
|
950: "#0c0a09"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "soho",
|
|||
|
|
palette: {
|
|||
|
|
0: "#ffffff",
|
|||
|
|
50: "#f4f4f4",
|
|||
|
|
100: "#e8e9e9",
|
|||
|
|
200: "#d2d2d4",
|
|||
|
|
300: "#bbbcbe",
|
|||
|
|
400: "#a5a5a9",
|
|||
|
|
500: "#8e8f93",
|
|||
|
|
600: "#77787d",
|
|||
|
|
700: "#616268",
|
|||
|
|
800: "#4a4b52",
|
|||
|
|
900: "#34343d",
|
|||
|
|
950: "#1d1e27"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "viva",
|
|||
|
|
palette: {
|
|||
|
|
0: "#ffffff",
|
|||
|
|
50: "#f3f3f3",
|
|||
|
|
100: "#e7e7e8",
|
|||
|
|
200: "#cfd0d0",
|
|||
|
|
300: "#b7b8b9",
|
|||
|
|
400: "#9fa1a1",
|
|||
|
|
500: "#87898a",
|
|||
|
|
600: "#6e7173",
|
|||
|
|
700: "#565a5b",
|
|||
|
|
800: "#3e4244",
|
|||
|
|
900: "#262b2c",
|
|||
|
|
950: "#0e1315"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "ocean",
|
|||
|
|
palette: {
|
|||
|
|
0: "#ffffff",
|
|||
|
|
50: "#fbfcfc",
|
|||
|
|
100: "#F7F9F8",
|
|||
|
|
200: "#EFF3F2",
|
|||
|
|
300: "#DADEDD",
|
|||
|
|
400: "#B1B7B6",
|
|||
|
|
500: "#828787",
|
|||
|
|
600: "#5F7274",
|
|||
|
|
700: "#415B61",
|
|||
|
|
800: "#29444E",
|
|||
|
|
900: "#183240",
|
|||
|
|
950: "#0c1920"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取指定主色调色板
|
|||
|
|
* @param name 主色名称
|
|||
|
|
* @returns 以 primary-开头的色值对象
|
|||
|
|
*/
|
|||
|
|
function getPrimary(name: primaryColor): Record<string, string> {
|
|||
|
|
const color = PRIMARY_COLOR_PALETTES.find((c) => c.name == name);
|
|||
|
|
if (!color) return {};
|
|||
|
|
const result: Record<string, string> = {};
|
|||
|
|
Object.entries(color.palette).forEach(([key, value]) => {
|
|||
|
|
result[`primary-${key}`] = value;
|
|||
|
|
});
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取指定表面色调色板
|
|||
|
|
* @param name 表面色名称
|
|||
|
|
* @returns 以 surface-开头的色值对象,0为 surface
|
|||
|
|
*/
|
|||
|
|
function getSurface(name: surfaceColor): Record<string, string> {
|
|||
|
|
const color = SURFACE_PALETTES.find((c) => c.name == name);
|
|||
|
|
if (!color) return {};
|
|||
|
|
const result: Record<string, string> = {};
|
|||
|
|
Object.entries(color.palette).forEach(([key, value]) => {
|
|||
|
|
result[key == "0" ? "surface" : `surface-${key}`] = value;
|
|||
|
|
});
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取项目根目录
|
|||
|
|
const resolve = (dir: string) => join(__dirname, dir);
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
content: [resolve("./**/*.{uvue,vue}"), "!**/node_modules/**", "!**/dist/**"],
|
|||
|
|
darkMode: "class",
|
|||
|
|
theme: {
|
|||
|
|
extend: {
|
|||
|
|
colors: {
|
|||
|
|
...getPrimary("teal"),
|
|||
|
|
...getSurface("zinc")
|
|||
|
|
},
|
|||
|
|
fontSize: {
|
|||
|
|
md: ["1rem", "1.5rem"]
|
|||
|
|
},
|
|||
|
|
scale: {
|
|||
|
|
"80": "0.8"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
corePlugins: {
|
|||
|
|
preflight: false
|
|||
|
|
}
|
|||
|
|
} as Config;
|