index.ts 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. import type { Config } from 'tailwindcss';
  2. import path from 'node:path';
  3. import { addDynamicIconSelectors } from '@iconify/tailwind';
  4. import { getPackagesSync } from '@manypkg/get-packages';
  5. import typographyPlugin from '@tailwindcss/typography';
  6. import animate from 'tailwindcss-animate';
  7. import { enterAnimationPlugin } from './plugins/entry';
  8. // import defaultTheme from 'tailwindcss/defaultTheme';
  9. const { packages } = getPackagesSync(process.cwd());
  10. const tailwindPackages: string[] = [];
  11. packages.forEach((pkg) => {
  12. // apps目录下和 @vben-core/tailwind-ui 包需要使用到 tailwindcss ui
  13. // if (fs.existsSync(path.join(pkg.dir, 'tailwind.config.mjs'))) {
  14. tailwindPackages.push(pkg.dir);
  15. // }
  16. });
  17. const shadcnUiColors = {
  18. accent: {
  19. DEFAULT: 'hsl(var(--accent))',
  20. foreground: 'hsl(var(--accent-foreground))',
  21. hover: 'hsl(var(--accent-hover))',
  22. lighter: 'has(val(--accent-lighter))',
  23. },
  24. background: {
  25. deep: 'hsl(var(--background-deep))',
  26. DEFAULT: 'hsl(var(--background))',
  27. },
  28. border: {
  29. DEFAULT: 'hsl(var(--border))',
  30. },
  31. card: {
  32. DEFAULT: 'hsl(var(--card))',
  33. foreground: 'hsl(var(--card-foreground))',
  34. },
  35. destructive: {
  36. ...createColorsPalette('destructive'),
  37. DEFAULT: 'hsl(var(--destructive))',
  38. },
  39. foreground: {
  40. DEFAULT: 'hsl(var(--foreground))',
  41. },
  42. input: {
  43. background: 'hsl(var(--input-background))',
  44. DEFAULT: 'hsl(var(--input))',
  45. },
  46. muted: {
  47. DEFAULT: 'hsl(var(--muted))',
  48. foreground: 'hsl(var(--muted-foreground))',
  49. },
  50. popover: {
  51. DEFAULT: 'hsl(var(--popover))',
  52. foreground: 'hsl(var(--popover-foreground))',
  53. },
  54. primary: {
  55. ...createColorsPalette('primary'),
  56. DEFAULT: 'hsl(var(--primary))',
  57. },
  58. ring: 'hsl(var(--ring))',
  59. secondary: {
  60. DEFAULT: 'hsl(var(--secondary))',
  61. desc: 'hsl(var(--secondary-desc))',
  62. foreground: 'hsl(var(--secondary-foreground))',
  63. },
  64. };
  65. const customColors = {
  66. green: {
  67. ...createColorsPalette('green'),
  68. foreground: 'hsl(var(--success-foreground))',
  69. },
  70. header: {
  71. DEFAULT: 'hsl(var(--header))',
  72. },
  73. heavy: {
  74. DEFAULT: 'hsl(var(--heavy))',
  75. foreground: 'hsl(var(--heavy-foreground))',
  76. },
  77. main: {
  78. DEFAULT: 'hsl(var(--main))',
  79. },
  80. overlay: {
  81. content: 'hsl(var(--overlay-content))',
  82. DEFAULT: 'hsl(var(--overlay))',
  83. },
  84. red: {
  85. ...createColorsPalette('red'),
  86. foreground: 'hsl(var(--destructive-foreground))',
  87. },
  88. sidebar: {
  89. deep: 'hsl(var(--sidebar-deep))',
  90. DEFAULT: 'hsl(var(--sidebar))',
  91. },
  92. success: {
  93. ...createColorsPalette('success'),
  94. DEFAULT: 'hsl(var(--success))',
  95. },
  96. warning: {
  97. ...createColorsPalette('warning'),
  98. DEFAULT: 'hsl(var(--warning))',
  99. },
  100. yellow: {
  101. ...createColorsPalette('yellow'),
  102. foreground: 'hsl(var(--warning-foreground))',
  103. },
  104. };
  105. export default {
  106. content: [
  107. './index.html',
  108. ...tailwindPackages.map((item) =>
  109. path.join(item, 'src/**/*.{vue,js,ts,jsx,tsx,svelte,astro,html}'),
  110. ),
  111. ],
  112. darkMode: 'selector',
  113. plugins: [
  114. animate,
  115. typographyPlugin,
  116. addDynamicIconSelectors(),
  117. enterAnimationPlugin,
  118. ],
  119. prefix: '',
  120. safelist: ['dark'],
  121. theme: {
  122. container: {
  123. center: true,
  124. padding: '2rem',
  125. screens: {
  126. '2xl': '1400px',
  127. },
  128. },
  129. extend: {
  130. animation: {
  131. 'accordion-down': 'accordion-down 0.2s ease-out',
  132. 'accordion-up': 'accordion-up 0.2s ease-out',
  133. 'collapsible-down': 'collapsible-down 0.2s ease-in-out',
  134. 'collapsible-up': 'collapsible-up 0.2s ease-in-out',
  135. float: 'float 5s linear 0ms infinite',
  136. },
  137. animationDuration: {
  138. '2000': '2000ms',
  139. '3000': '3000ms',
  140. },
  141. borderRadius: {
  142. lg: 'var(--radius)',
  143. md: 'calc(var(--radius) - 2px)',
  144. sm: 'calc(var(--radius) - 4px)',
  145. xl: 'calc(var(--radius) + 4px)',
  146. },
  147. boxShadow: {
  148. float: `0 6px 16px 0 rgb(0 0 0 / 8%),
  149. 0 3px 6px -4px rgb(0 0 0 / 12%),
  150. 0 9px 28px 8px rgb(0 0 0 / 5%)`,
  151. },
  152. colors: {
  153. ...customColors,
  154. ...shadcnUiColors,
  155. },
  156. fontFamily: {
  157. sans: [
  158. 'var(--font-family)',
  159. // ...defaultTheme.fontFamily.sans
  160. ],
  161. },
  162. keyframes: {
  163. 'accordion-down': {
  164. from: { height: '0' },
  165. to: { height: 'var(--radix-accordion-content-height)' },
  166. },
  167. 'accordion-up': {
  168. from: { height: 'var(--radix-accordion-content-height)' },
  169. to: { height: '0' },
  170. },
  171. 'collapsible-down': {
  172. from: { height: '0' },
  173. to: { height: 'var(--radix-collapsible-content-height)' },
  174. },
  175. 'collapsible-up': {
  176. from: { height: 'var(--radix-collapsible-content-height)' },
  177. to: { height: '0' },
  178. },
  179. float: {
  180. '0%': { transform: 'translateY(0)' },
  181. '50%': { transform: 'translateY(-20px)' },
  182. '100%': { transform: 'translateY(0)' },
  183. },
  184. },
  185. zIndex: {
  186. '100': '100',
  187. '1000': '1000',
  188. },
  189. },
  190. },
  191. } as Config;
  192. function createColorsPalette(name: string) {
  193. // backgroundLightest: '#EFF6FF', // Tailwind CSS 默认的 `blue-50`
  194. // backgroundLighter: '#DBEAFE', // Tailwind CSS 默认的 `blue-100`
  195. // backgroundLight: '#BFDBFE', // Tailwind CSS 默认的 `blue-200`
  196. // borderLight: '#93C5FD', // Tailwind CSS 默认的 `blue-300`
  197. // border: '#60A5FA', // Tailwind CSS 默认的 `blue-400`
  198. // main: '#3B82F6', // Tailwind CSS 默认的 `blue-500`
  199. // hover: '#2563EB', // Tailwind CSS 默认的 `blue-600`
  200. // active: '#1D4ED8', // Tailwind CSS 默认的 `blue-700`
  201. // backgroundDark: '#1E40AF', // Tailwind CSS 默认的 `blue-800`
  202. // backgroundDarker: '#1E3A8A', // Tailwind CSS 默认的 `blue-900`
  203. // backgroundDarkest: '#172554', // Tailwind CSS 默认的 `blue-950`
  204. // • backgroundLightest (#EFF6FF): 适用于最浅的背景色,可能用于非常轻微的阴影或卡片的背景。
  205. // • backgroundLighter (#DBEAFE): 适用于略浅的背景色,通常用于次要背景或略浅的区域。
  206. // • backgroundLight (#BFDBFE): 适用于浅色背景,可能用于输入框或表单区域的背景。
  207. // • borderLight (#93C5FD): 适用于浅色边框,可能用于输入框或卡片的边框。
  208. // • border (#60A5FA): 适用于普通边框,可能用于按钮或卡片的边框。
  209. // • main (#3B82F6): 适用于主要的主题色,通常用于按钮、链接或主要的强调色。
  210. // • hover (#2563EB): 适用于鼠标悬停状态下的颜色,例如按钮悬停时的背景色或边框色。
  211. // • active (#1D4ED8): 适用于激活状态下的颜色,例如按钮按下时的背景色或边框色。
  212. // • backgroundDark (#1E40AF): 适用于深色背景,可能用于主要按钮或深色卡片背景。
  213. // • backgroundDarker (#1E3A8A): 适用于更深的背景,通常用于头部导航栏或页脚。
  214. // • backgroundDarkest (#172554): 适用于最深的背景,可能用于非常深色的区域或极端对比色。
  215. return {
  216. 50: `hsl(var(--${name}-50))`,
  217. 100: `hsl(var(--${name}-100))`,
  218. 200: `hsl(var(--${name}-200))`,
  219. 300: `hsl(var(--${name}-300))`,
  220. 400: `hsl(var(--${name}-400))`,
  221. 500: `hsl(var(--${name}-500))`,
  222. 600: `hsl(var(--${name}-600))`,
  223. 700: `hsl(var(--${name}-700))`,
  224. // 800: `hsl(var(--${name}-800))`,
  225. // 900: `hsl(var(--${name}-900))`,
  226. // 950: `hsl(var(--${name}-950))`,
  227. // 激活状态下的颜色,适用于按钮按下时的背景色或边框色。
  228. active: `hsl(var(--${name}-700))`,
  229. // 浅色背景,适用于输入框或表单区域的背景。
  230. 'background-light': `hsl(var(--${name}-200))`,
  231. // 适用于略浅的背景色,通常用于次要背景或略浅的区域。
  232. 'background-lighter': `hsl(var(--${name}-100))`,
  233. // 最浅的背景色,适用于非常轻微的阴影或卡片的背景。
  234. 'background-lightest': `hsl(var(--${name}-50))`,
  235. // 适用于普通边框,可能用于按钮或卡片的边框。
  236. border: `hsl(var(--${name}-400))`,
  237. // 浅色边框,适用于输入框或卡片的边框。
  238. 'border-light': `hsl(var(--${name}-300))`,
  239. foreground: `hsl(var(--${name}-foreground))`,
  240. // 鼠标悬停状态下的颜色,适用于按钮悬停时的背景色或边框色。
  241. hover: `hsl(var(--${name}-600))`,
  242. // 主色文本
  243. text: `hsl(var(--${name}-500))`,
  244. // 主色文本激活态
  245. 'text-active': `hsl(var(--${name}-700))`,
  246. // 主色文本悬浮态
  247. 'text-hover': `hsl(var(--${name}-600))`,
  248. };
  249. }