tailwind.config.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. import { join } from "node:path";
  2. import type { Config } from "tailwindcss";
  3. // 自动推导所有主色和表面色的类型
  4. type primaryColor =
  5. | "emerald"
  6. | "green"
  7. | "lime"
  8. | "orange"
  9. | "amber"
  10. | "yellow"
  11. | "teal"
  12. | "cyan"
  13. | "sky"
  14. | "blue"
  15. | "indigo"
  16. | "violet"
  17. | "purple"
  18. | "fuchsia"
  19. | "pink";
  20. type surfaceColor = "slate" | "gray" | "zinc" | "neutral" | "stone" | "soho" | "viva" | "ocean";
  21. /**
  22. * 主题主色调色板
  23. */
  24. export const PRIMARY_COLOR_PALETTES = [
  25. {
  26. name: "emerald",
  27. palette: {
  28. 50: "#ecfdf5",
  29. 100: "#d1fae5",
  30. 200: "#a7f3d0",
  31. 300: "#6ee7b7",
  32. 400: "#34d399",
  33. 500: "#10b981",
  34. 600: "#059669",
  35. 700: "#047857",
  36. 800: "#065f46",
  37. 900: "#064e3b",
  38. 950: "#022c22"
  39. }
  40. },
  41. {
  42. name: "green",
  43. palette: {
  44. 50: "#f0fdf4",
  45. 100: "#dcfce7",
  46. 200: "#bbf7d0",
  47. 300: "#86efac",
  48. 400: "#4ade80",
  49. 500: "#22c55e",
  50. 600: "#16a34a",
  51. 700: "#15803d",
  52. 800: "#166534",
  53. 900: "#14532d",
  54. 950: "#052e16"
  55. }
  56. },
  57. {
  58. name: "lime",
  59. palette: {
  60. 50: "#f7fee7",
  61. 100: "#ecfccb",
  62. 200: "#d9f99d",
  63. 300: "#bef264",
  64. 400: "#a3e635",
  65. 500: "#84cc16",
  66. 600: "#65a30d",
  67. 700: "#4d7c0f",
  68. 800: "#3f6212",
  69. 900: "#365314",
  70. 950: "#1a2e05"
  71. }
  72. },
  73. {
  74. name: "orange",
  75. palette: {
  76. 50: "#fff7ed",
  77. 100: "#ffedd5",
  78. 200: "#fed7aa",
  79. 300: "#fdba74",
  80. 400: "#fb923c",
  81. 500: "#f97316",
  82. 600: "#ea580c",
  83. 700: "#c2410c",
  84. 800: "#9a3412",
  85. 900: "#7c2d12",
  86. 950: "#431407"
  87. }
  88. },
  89. {
  90. name: "amber",
  91. palette: {
  92. 50: "#fffbeb",
  93. 100: "#fef3c7",
  94. 200: "#fde68a",
  95. 300: "#fcd34d",
  96. 400: "#fbbf24",
  97. 500: "#f59e0b",
  98. 600: "#d97706",
  99. 700: "#b45309",
  100. 800: "#92400e",
  101. 900: "#78350f",
  102. 950: "#451a03"
  103. }
  104. },
  105. {
  106. name: "yellow",
  107. palette: {
  108. 50: "#fefce8",
  109. 100: "#fef9c3",
  110. 200: "#fef08a",
  111. 300: "#fde047",
  112. 400: "#facc15",
  113. 500: "#eab308",
  114. 600: "#ca8a04",
  115. 700: "#a16207",
  116. 800: "#854d0e",
  117. 900: "#713f12",
  118. 950: "#422006"
  119. }
  120. },
  121. {
  122. name: "teal",
  123. palette: {
  124. 50: "#f0fdfa",
  125. 100: "#ccfbf1",
  126. 200: "#99f6e4",
  127. 300: "#5eead4",
  128. 400: "#2dd4bf",
  129. 500: "#14b8a6",
  130. 600: "#0d9488",
  131. 700: "#0f766e",
  132. 800: "#115e59",
  133. 900: "#134e4a",
  134. 950: "#042f2e"
  135. }
  136. },
  137. {
  138. name: "cyan",
  139. palette: {
  140. 50: "#ecfeff",
  141. 100: "#cffafe",
  142. 200: "#a5f3fc",
  143. 300: "#67e8f9",
  144. 400: "#22d3ee",
  145. 500: "#06b6d4",
  146. 600: "#0891b2",
  147. 700: "#0e7490",
  148. 800: "#155e75",
  149. 900: "#164e63",
  150. 950: "#083344"
  151. }
  152. },
  153. {
  154. name: "sky",
  155. palette: {
  156. 50: "#f0f9ff",
  157. 100: "#e0f2fe",
  158. 200: "#bae6fd",
  159. 300: "#7dd3fc",
  160. 400: "#38bdf8",
  161. 500: "#0ea5e9",
  162. 600: "#0284c7",
  163. 700: "#0369a1",
  164. 800: "#075985",
  165. 900: "#0c4a6e",
  166. 950: "#082f49"
  167. }
  168. },
  169. {
  170. name: "blue",
  171. palette: {
  172. 50: "#eff6ff",
  173. 100: "#dbeafe",
  174. 200: "#bfdbfe",
  175. 300: "#93c5fd",
  176. 400: "#60a5fa",
  177. 500: "#3b82f6",
  178. 600: "#2563eb",
  179. 700: "#1d4ed8",
  180. 800: "#1e40af",
  181. 900: "#1e3a8a",
  182. 950: "#172554"
  183. }
  184. },
  185. {
  186. name: "indigo",
  187. palette: {
  188. 50: "#eef2ff",
  189. 100: "#e0e7ff",
  190. 200: "#c7d2fe",
  191. 300: "#a5b4fc",
  192. 400: "#818cf8",
  193. 500: "#6366f1",
  194. 600: "#4f46e5",
  195. 700: "#4338ca",
  196. 800: "#3730a3",
  197. 900: "#312e81",
  198. 950: "#1e1b4b"
  199. }
  200. },
  201. {
  202. name: "violet",
  203. palette: {
  204. 50: "#f5f3ff",
  205. 100: "#ede9fe",
  206. 200: "#ddd6fe",
  207. 300: "#c4b5fd",
  208. 400: "#a78bfa",
  209. 500: "#8b5cf6",
  210. 600: "#7c3aed",
  211. 700: "#6d28d9",
  212. 800: "#5b21b6",
  213. 900: "#4c1d95",
  214. 950: "#2e1065"
  215. }
  216. },
  217. {
  218. name: "purple",
  219. palette: {
  220. 50: "#faf5ff",
  221. 100: "#f3e8ff",
  222. 200: "#e9d5ff",
  223. 300: "#d8b4fe",
  224. 400: "#c084fc",
  225. 500: "#a855f7",
  226. 600: "#9333ea",
  227. 700: "#7e22ce",
  228. 800: "#6b21a8",
  229. 900: "#581c87",
  230. 950: "#3b0764"
  231. }
  232. },
  233. {
  234. name: "fuchsia",
  235. palette: {
  236. 50: "#fdf4ff",
  237. 100: "#fae8ff",
  238. 200: "#f5d0fe",
  239. 300: "#f0abfc",
  240. 400: "#e879f9",
  241. 500: "#d946ef",
  242. 600: "#c026d3",
  243. 700: "#a21caf",
  244. 800: "#86198f",
  245. 900: "#701a75",
  246. 950: "#4a044e"
  247. }
  248. },
  249. {
  250. name: "pink",
  251. palette: {
  252. 50: "#fdf2f8",
  253. 100: "#fce7f3",
  254. 200: "#fbcfe8",
  255. 300: "#f9a8d4",
  256. 400: "#f472b6",
  257. 500: "#ec4899",
  258. 600: "#db2777",
  259. 700: "#be185d",
  260. 800: "#9d174d",
  261. 900: "#831843",
  262. 950: "#500724"
  263. }
  264. }
  265. ];
  266. /**
  267. * 表面色调色板
  268. */
  269. export const SURFACE_PALETTES = [
  270. {
  271. name: "slate",
  272. palette: {
  273. 0: "#ffffff",
  274. 50: "#f8fafc",
  275. 100: "#f1f5f9",
  276. 200: "#e2e8f0",
  277. 300: "#cbd5e1",
  278. 400: "#94a3b8",
  279. 500: "#64748b",
  280. 600: "#475569",
  281. 700: "#334155",
  282. 800: "#1e293b",
  283. 900: "#0f172a",
  284. 950: "#020617"
  285. }
  286. },
  287. {
  288. name: "gray",
  289. palette: {
  290. 0: "#ffffff",
  291. 50: "#f9fafb",
  292. 100: "#f3f4f6",
  293. 200: "#e5e7eb",
  294. 300: "#d1d5db",
  295. 400: "#9ca3af",
  296. 500: "#6b7280",
  297. 600: "#4b5563",
  298. 700: "#374151",
  299. 800: "#1f2937",
  300. 900: "#111827",
  301. 950: "#030712"
  302. }
  303. },
  304. {
  305. name: "zinc",
  306. palette: {
  307. 0: "#ffffff",
  308. 50: "#fafafa",
  309. 100: "#f4f4f5",
  310. 200: "#e4e4e7",
  311. 300: "#d4d4d8",
  312. 400: "#a1a1aa",
  313. 500: "#71717a",
  314. 600: "#52525b",
  315. 700: "#3f3f46",
  316. 800: "#27272a",
  317. 900: "#18181b",
  318. 950: "#09090b"
  319. }
  320. },
  321. {
  322. name: "neutral",
  323. palette: {
  324. 0: "#ffffff",
  325. 50: "#fafafa",
  326. 100: "#f5f5f5",
  327. 200: "#e5e5e5",
  328. 300: "#d4d4d4",
  329. 400: "#a3a3a3",
  330. 500: "#737373",
  331. 600: "#525252",
  332. 700: "#404040",
  333. 800: "#262626",
  334. 900: "#171717",
  335. 950: "#0a0a0a"
  336. }
  337. },
  338. {
  339. name: "stone",
  340. palette: {
  341. 0: "#ffffff",
  342. 50: "#fafaf9",
  343. 100: "#f5f5f4",
  344. 200: "#e7e5e4",
  345. 300: "#d6d3d1",
  346. 400: "#a8a29e",
  347. 500: "#78716c",
  348. 600: "#57534e",
  349. 700: "#44403c",
  350. 800: "#292524",
  351. 900: "#1c1917",
  352. 950: "#0c0a09"
  353. }
  354. },
  355. {
  356. name: "soho",
  357. palette: {
  358. 0: "#ffffff",
  359. 50: "#f4f4f4",
  360. 100: "#e8e9e9",
  361. 200: "#d2d2d4",
  362. 300: "#bbbcbe",
  363. 400: "#a5a5a9",
  364. 500: "#8e8f93",
  365. 600: "#77787d",
  366. 700: "#616268",
  367. 800: "#4a4b52",
  368. 900: "#34343d",
  369. 950: "#1d1e27"
  370. }
  371. },
  372. {
  373. name: "viva",
  374. palette: {
  375. 0: "#ffffff",
  376. 50: "#f3f3f3",
  377. 100: "#e7e7e8",
  378. 200: "#cfd0d0",
  379. 300: "#b7b8b9",
  380. 400: "#9fa1a1",
  381. 500: "#87898a",
  382. 600: "#6e7173",
  383. 700: "#565a5b",
  384. 800: "#3e4244",
  385. 900: "#262b2c",
  386. 950: "#0e1315"
  387. }
  388. },
  389. {
  390. name: "ocean",
  391. palette: {
  392. 0: "#ffffff",
  393. 50: "#fbfcfc",
  394. 100: "#F7F9F8",
  395. 200: "#EFF3F2",
  396. 300: "#DADEDD",
  397. 400: "#B1B7B6",
  398. 500: "#828787",
  399. 600: "#5F7274",
  400. 700: "#415B61",
  401. 800: "#29444E",
  402. 900: "#183240",
  403. 950: "#0c1920"
  404. }
  405. }
  406. ];
  407. /**
  408. * 获取指定主色调色板
  409. * @param name 主色名称
  410. * @returns 以 primary-开头的色值对象
  411. */
  412. function getPrimary(name: primaryColor): Record<string, string> {
  413. const color = PRIMARY_COLOR_PALETTES.find((c) => c.name == name);
  414. if (!color) return {};
  415. const result: Record<string, string> = {};
  416. Object.entries(color.palette).forEach(([key, value]) => {
  417. result[`primary-${key}`] = value;
  418. });
  419. return result;
  420. }
  421. /**
  422. * 获取指定表面色调色板
  423. * @param name 表面色名称
  424. * @returns 以 surface-开头的色值对象,0为 surface
  425. */
  426. function getSurface(name: surfaceColor): Record<string, string> {
  427. const color = SURFACE_PALETTES.find((c) => c.name == name);
  428. if (!color) return {};
  429. const result: Record<string, string> = {};
  430. Object.entries(color.palette).forEach(([key, value]) => {
  431. result[key == "0" ? "surface" : `surface-${key}`] = value;
  432. });
  433. return result;
  434. }
  435. // 获取项目根目录
  436. const resolve = (dir: string) => join(__dirname, dir);
  437. export default {
  438. content: [
  439. resolve("./**/*.{uvue,vue}"),
  440. "./.cool/**/*.{uvue,vue}",
  441. "!**/node_modules/**",
  442. "!**/dist/**"
  443. ],
  444. darkMode: "class",
  445. theme: {
  446. extend: {
  447. colors: {
  448. ...getPrimary("teal"),
  449. ...getSurface("zinc")
  450. },
  451. fontSize: {
  452. md: ["1rem", "1.5rem"]
  453. },
  454. scale: {
  455. "80": "0.8"
  456. }
  457. }
  458. },
  459. corePlugins: {
  460. preflight: false
  461. }
  462. } as Config;