uno.config.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import type { Preset } from 'unocss'
  2. import { FileSystemIconLoader } from '@iconify/utils/lib/loader/node-loaders'
  3. import {
  4. defineConfig,
  5. presetIcons,
  6. presetWind4,
  7. transformerDirectives,
  8. transformerVariantGroup,
  9. } from 'unocss'
  10. import { presetApplet, presetRemRpx } from 'unocss-applet'
  11. import iconList from './src/utils/icons'
  12. function createColorsPalette(name: string) {
  13. return {
  14. 50: `hsl(var(--${name}-50))`,
  15. 100: `hsl(var(--${name}-100))`,
  16. 200: `hsl(var(--${name}-200))`,
  17. 300: `hsl(var(--${name}-300))`,
  18. 400: `hsl(var(--${name}-400))`,
  19. 500: `hsl(var(--${name}-500))`,
  20. 600: `hsl(var(--${name}-600))`,
  21. 700: `hsl(var(--${name}-700))`,
  22. // 800: `hsl(var(--${name}-800))`,
  23. // 900: `hsl(var(--${name}-900))`,
  24. // 950: `hsl(var(--${name}-950))`,
  25. // 激活状态下的颜色,适用于按钮按下时的背景色或边框色。
  26. active: `hsl(var(--${name}-700))`,
  27. // 浅色背景,适用于输入框或表单区域的背景。
  28. 'background-light': `hsl(var(--${name}-200))`,
  29. // 适用于略浅的背景色,通常用于次要背景或略浅的区域。
  30. 'background-lighter': `hsl(var(--${name}-100))`,
  31. // 最浅的背景色,适用于非常轻微的阴影或卡片的背景。
  32. 'background-lightest': `hsl(var(--${name}-50))`,
  33. // 适用于普通边框,可能用于按钮或卡片的边框。
  34. border: `hsl(var(--${name}-400))`,
  35. // 浅色边框,适用于输入框或卡片的边框。
  36. 'border-light': `hsl(var(--${name}-300))`,
  37. foreground: `hsl(var(--${name}-foreground))`,
  38. // 鼠标悬停状态下的颜色,适用于按钮悬停时的背景色或边框色。
  39. hover: `hsl(var(--${name}-600))`,
  40. // 主色文本
  41. text: `hsl(var(--${name}-500))`,
  42. // 主色文本激活态
  43. 'text-active': `hsl(var(--${name}-700))`,
  44. // 主色文本悬浮态
  45. 'text-hover': `hsl(var(--${name}-600))`,
  46. }
  47. }
  48. const isMp = process.env?.UNI_PLATFORM?.startsWith('mp') ?? false
  49. const presets: Preset[] = []
  50. if (isMp) {
  51. // 使用小程序预设
  52. presets.push(presetApplet() as Preset, presetRemRpx({ mode: 'rem2rpx' }) as Preset)
  53. } else {
  54. presets.push(
  55. // 非小程序用官方预设
  56. presetWind4(),
  57. presetRemRpx({ mode: 'rpx2rem' }) as Preset
  58. )
  59. }
  60. export default defineConfig({
  61. presets: [
  62. ...presets,
  63. presetIcons({
  64. scale: 1.2,
  65. extraProperties: {
  66. display: 'inline-block',
  67. },
  68. // cdn: 'https://esm.sh/'
  69. collections: {
  70. custom: FileSystemIconLoader('./src/static/icons/'),
  71. ep: () => import('@iconify-json/ep/icons.json').then((i) => i.default),
  72. },
  73. }),
  74. ],
  75. transformers: [transformerDirectives(), transformerVariantGroup()],
  76. rules: [
  77. [/^m-h-(.+)$/, ([, d]) => ({ 'margin-left': `${d}`, 'margin-right': `${d}` })],
  78. [/^m-v-(.+)$/, ([, d]) => ({ 'margin-top': `${d}`, 'margin-bottom': `${d}` })],
  79. [/^p-h-(.+)$/, ([, d]) => ({ 'padding-left': `${d}`, 'padding-right': `${d}` })],
  80. [/^p-v-(.+)$/, ([, d]) => ({ 'padding-top': `${d}`, 'padding-bottom': `${d}` })],
  81. [/^max-w-(\s+)$/, ([, d]) => ({ 'max-width': `${d}` })],
  82. [/^min-w-(\s+)$/, ([, d]) => ({ 'min-width': `${d}` })],
  83. [/^max-h-[(\s+)]$/, ([, d]) => ({ 'max-height': `${d}` })],
  84. [/^min-h-[(\s+)]$/, ([, d]) => ({ 'min-height': `${d}` })],
  85. [/^wh-(.+)$/, ([, d]) => ({ width: `${d}`, height: `${d}` })],
  86. ],
  87. safelist: iconList,
  88. shortcuts: {
  89. 'wh-full': 'w-full h-full',
  90. 'mp-0': 'm-0 p-0',
  91. 'ma-x': 'mt-0 mb-0 ml-auto mr-auto',
  92. 'inline-flex-center': 'inline-flex justify-center items-center',
  93. 'flex-center': 'flex justify-center items-center',
  94. 'flex-x-center': 'flex justify-center',
  95. 'flex-y-center': 'flex items-center',
  96. // 文本溢出显示省略号
  97. 'text-overflow': 'overflow-hidden whitespace-nowrap text-ellipsis',
  98. // 文本溢出换行
  99. 'text-break': 'whitespace-normal break-all break-words',
  100. },
  101. theme: {
  102. borderRadius: {
  103. sm: 'calc(var(--radius) - 4px)',
  104. md: 'calc(var(--radius) - 2px)',
  105. lg: 'var(--radius)',
  106. xl: 'calc(var(--radius) + 4px)',
  107. },
  108. breakpoints: {
  109. xs: '480px',
  110. sm: '768px',
  111. md: '992px',
  112. lg: '1200px',
  113. xl: '1920px',
  114. },
  115. colors: {
  116. primary: {
  117. ...createColorsPalette('primary'),
  118. DEFAULT: 'hsl(var(--primary))',
  119. },
  120. success: {
  121. ...createColorsPalette('success'),
  122. DEFAULT: 'hsl(var(--success))',
  123. },
  124. warning: {
  125. ...createColorsPalette('warning'),
  126. DEFAULT: 'hsl(var(--warning))',
  127. },
  128. danger: {
  129. ...createColorsPalette('danger'),
  130. DEFAULT: 'hsl(var(--danger))',
  131. },
  132. info: {
  133. DEFAULT: 'hsl(var(--info))',
  134. },
  135. placeholder: {
  136. DEFAULT: 'hsl(var(--placeholder))',
  137. },
  138. overlay: {
  139. DEFAULT: 'hsl(var(--overlay))',
  140. },
  141. border: {
  142. DEFAULT: 'hsl(var(--border))',
  143. },
  144. error: 'var(--error)',
  145. up: 'var(--up)',
  146. down: 'var(--down)',
  147. '1': 'var(--text-color-1)',
  148. '2': 'var(--text-color-2)',
  149. '3': 'var(--text-color-3)',
  150. '4': 'var(--bg-color-4)',
  151. },
  152. },
  153. })