index.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import type { Config } from 'tailwindcss';
  2. import path from 'node:path';
  3. import { fs, getPackagesSync } from '@vben/node-utils';
  4. import { addDynamicIconSelectors } from '@iconify/tailwind';
  5. import formsPlugin from '@tailwindcss/forms';
  6. import typographyPlugin from '@tailwindcss/typography';
  7. import animate from 'tailwindcss-animate';
  8. import { enterAnimationPlugin } from './plugins/entry';
  9. // import defaultTheme from 'tailwindcss/defaultTheme';
  10. const { packages } = getPackagesSync();
  11. const tailwindPackages: string[] = [];
  12. packages.forEach((pkg) => {
  13. // apps目录下和 @vben-core/tailwind-ui 包需要使用到 tailwindcss ui
  14. if (fs.existsSync(path.join(pkg.dir, 'tailwind.config.mjs'))) {
  15. tailwindPackages.push(pkg.dir);
  16. }
  17. });
  18. function createColorsPattern(name: string) {
  19. return {
  20. 100: `hsl(var(--${name}-100))`,
  21. 200: `hsl(var(--${name}-200))`,
  22. 300: `hsl(var(--${name}-300))`,
  23. 400: `hsl(var(--${name}-400))`,
  24. 500: `hsl(var(--${name}-500))`,
  25. 600: `hsl(var(--${name}-600))`,
  26. 700: `hsl(var(--${name}-700))`,
  27. 800: `hsl(var(--${name}-800))`,
  28. 900: `hsl(var(--${name}-900))`,
  29. 1000: `hsl(var(--${name}-1000))`,
  30. active: `hsl(var(--${name}-700))`,
  31. background: `hsl(var(--${name}-100))`,
  32. 'background-hover': `hsl(var(--${name}-200))`,
  33. border: `hsl(var(--${name}-300))`,
  34. 'border-hover': `hsl(var(--${name}-400))`,
  35. foreground: `hsl(var(--${name}-foreground))`,
  36. hover: `hsl(var(--${name}-500))`,
  37. text: `hsl(var(--${name}-900))`,
  38. 'text-active': `hsl(var(--${name}-1000))`,
  39. 'text-hover': `hsl(var(--${name}-800))`,
  40. };
  41. }
  42. export default {
  43. content: [
  44. './index.html',
  45. ...tailwindPackages.map((item) =>
  46. path.join(item, 'src/**/*.{vue,js,ts,jsx,tsx,svelte,astro,html}'),
  47. ),
  48. ],
  49. darkMode: 'class',
  50. plugins: [
  51. animate,
  52. formsPlugin,
  53. typographyPlugin,
  54. addDynamicIconSelectors(),
  55. enterAnimationPlugin,
  56. ],
  57. prefix: '',
  58. safelist: ['dark'],
  59. theme: {
  60. container: {
  61. center: true,
  62. padding: '2rem',
  63. screens: {
  64. '2xl': '1400px',
  65. },
  66. },
  67. extend: {
  68. animation: {
  69. 'accordion-down': 'accordion-down 0.2s ease-out',
  70. 'accordion-up': 'accordion-up 0.2s ease-out',
  71. 'collapsible-down': 'collapsible-down 0.2s ease-in-out',
  72. 'collapsible-up': 'collapsible-up 0.2s ease-in-out',
  73. float: 'float 5s linear 0ms infinite',
  74. },
  75. animationDuration: {
  76. '2000': '2000ms',
  77. '3000': '3000ms',
  78. },
  79. borderRadius: {
  80. lg: 'var(--radius)',
  81. md: 'calc(var(--radius) - 2px)',
  82. sm: 'calc(var(--radius) - 4px)',
  83. xl: 'calc(var(--radius) + 4px)',
  84. },
  85. colors: {
  86. accent: {
  87. DEFAULT: 'hsl(var(--accent))',
  88. foreground: 'hsl(var(--accent-foreground))',
  89. hover: 'hsl(var(--accent-hover))',
  90. },
  91. authentication: 'hsl(var(--authentication))',
  92. background: 'hsl(var(--background))',
  93. border: 'hsl(var(--border))',
  94. card: {
  95. DEFAULT: 'hsl(var(--card))',
  96. foreground: 'hsl(var(--card-foreground))',
  97. },
  98. destructive: {
  99. ...createColorsPattern('destructive'),
  100. DEFAULT: 'hsl(var(--destructive))',
  101. },
  102. foreground: 'hsl(var(--foreground))',
  103. green: {
  104. ...createColorsPattern('green'),
  105. foreground: 'hsl(var(--success-foreground))',
  106. },
  107. heavy: {
  108. DEFAULT: 'hsl(var(--heavy))',
  109. foreground: 'hsl(var(--heavy-foreground))',
  110. },
  111. input: {
  112. DEFAULT: 'hsl(var(--input))',
  113. background: 'hsl(var(--input-background))',
  114. },
  115. muted: {
  116. DEFAULT: 'hsl(var(--muted))',
  117. foreground: 'hsl(var(--muted-foreground))',
  118. },
  119. overlay: 'hsl(var(--overlay))',
  120. popover: {
  121. DEFAULT: 'hsl(var(--popover))',
  122. foreground: 'hsl(var(--popover-foreground))',
  123. },
  124. primary: {
  125. ...createColorsPattern('primary'),
  126. DEFAULT: 'hsl(var(--primary))',
  127. },
  128. red: {
  129. ...createColorsPattern('red'),
  130. foreground: 'hsl(var(--destructive-foreground))',
  131. },
  132. ring: 'hsl(var(--ring))',
  133. secondary: {
  134. DEFAULT: 'hsl(var(--secondary))',
  135. desc: 'hsl(var(--secondary-desc))',
  136. foreground: 'hsl(var(--secondary-foreground))',
  137. },
  138. success: {
  139. ...createColorsPattern('success'),
  140. DEFAULT: 'hsl(var(--success))',
  141. },
  142. warning: {
  143. ...createColorsPattern('warning'),
  144. DEFAULT: 'hsl(var(--warning))',
  145. },
  146. yellow: {
  147. ...createColorsPattern('yellow'),
  148. foreground: 'hsl(var(--warning-foreground))',
  149. },
  150. },
  151. fontFamily: {
  152. sans: [
  153. 'var(--font-geist-sans)',
  154. // ...defaultTheme.fontFamily.sans
  155. ],
  156. },
  157. keyframes: {
  158. 'accordion-down': {
  159. from: { height: '0' },
  160. to: { height: 'var(--radix-accordion-content-height)' },
  161. },
  162. 'accordion-up': {
  163. from: { height: 'var(--radix-accordion-content-height)' },
  164. to: { height: '0' },
  165. },
  166. 'collapsible-down': {
  167. from: { height: '0' },
  168. to: { height: 'var(--radix-collapsible-content-height)' },
  169. },
  170. 'collapsible-up': {
  171. from: { height: 'var(--radix-collapsible-content-height)' },
  172. to: { height: '0' },
  173. },
  174. float: {
  175. '0%': { transform: 'translateY(0)' },
  176. '50%': { transform: 'translateY(-20px)' },
  177. '100%': { transform: 'translateY(0)' },
  178. },
  179. },
  180. zIndex: {
  181. '100': '100',
  182. '1000': '1000',
  183. },
  184. },
  185. },
  186. } as Config;