uno.config.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // https://unocss.nodejs.cn/guide/config-file
  2. import {
  3. defineConfig,
  4. presetAttributify,
  5. presetIcons,
  6. presetTypography,
  7. presetUno,
  8. presetWebFonts,
  9. transformerDirectives,
  10. transformerVariantGroup,
  11. } from "unocss";
  12. import { FileSystemIconLoader } from "@iconify/utils/lib/loader/node-loaders";
  13. import fs from "fs";
  14. // 本地SVG图标目录
  15. const iconsDir = "./src/assets/icons";
  16. // 读取本地 SVG 目录,自动生成 safelist
  17. const generateSafeList = () => {
  18. try {
  19. return fs
  20. .readdirSync(iconsDir)
  21. .filter((file) => file.endsWith(".svg"))
  22. .map((file) => `i-svg:${file.replace(".svg", "")}`);
  23. } catch (error) {
  24. console.error("无法读取图标目录:", error);
  25. return [];
  26. }
  27. };
  28. export default defineConfig({
  29. // 自定义快捷类
  30. shortcuts: {
  31. "wh-full": "w-full h-full",
  32. "flex-center": "flex justify-center items-center",
  33. "flex-x-center": "flex justify-center",
  34. "flex-y-center": "flex items-center",
  35. "flex-x-start": "flex items-center justify-start",
  36. "flex-x-between": "flex items-center justify-between",
  37. "flex-x-end": "flex items-center justify-end",
  38. },
  39. theme: {
  40. colors: {
  41. primary: "var(--el-color-primary)",
  42. primary_dark: "var(--el-color-primary-light-5)",
  43. },
  44. breakpoints: Object.fromEntries(
  45. [640, 768, 1024, 1280, 1536, 1920, 2560].map((size, index) => [
  46. ["sm", "md", "lg", "xl", "2xl", "3xl", "4xl"][index],
  47. `${size}px`,
  48. ])
  49. ),
  50. },
  51. presets: [
  52. presetUno(),
  53. presetAttributify(),
  54. presetIcons({
  55. // 额外属性
  56. extraProperties: {
  57. display: "inline-block",
  58. width: "1em",
  59. height: "1em",
  60. },
  61. // 图表集合
  62. collections: {
  63. // svg 是图标集合名称,使用 `i-svg:图标名` 调用
  64. svg: FileSystemIconLoader(iconsDir, (svg) => {
  65. // 如果 `fill` 没有定义,则添加 `fill="currentColor"`
  66. return svg.includes('fill="') ? svg : svg.replace(/^<svg /, '<svg fill="currentColor" ');
  67. }),
  68. },
  69. }),
  70. presetTypography(),
  71. presetWebFonts({
  72. fonts: {
  73. // ...
  74. },
  75. }),
  76. ],
  77. safelist: generateSafeList(),
  78. transformers: [transformerDirectives(), transformerVariantGroup()],
  79. });