tailwind.config.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. const colors = require('tailwindcss/colors')
  2. const plugin = require('tailwindcss/plugin')
  3. const radix = require('@radix-ui/colors')
  4. const accent = {
  5. 'DEFAULT': 'hsl(var(--accent))',
  6. 'base': 'hsl(var(--accent))',
  7. 'foreground': 'hsl(var(--accent-foreground))',
  8. '01': 'var(--lx-accent-01, --rx-gray-01)',
  9. '02': 'var(--lx-accent-02, hsl(var(--accent)/.1))',
  10. '03': 'var(--lx-accent-03, hsl(var(--accent)/.15))',
  11. '04': 'var(--lx-accent-04, hsl(var(--accent)/.2))',
  12. '05': 'var(--lx-accent-05, hsl(var(--accent)/.3))',
  13. '06': 'var(--lx-accent-06, hsl(var(--accent)/.4))',
  14. '07': 'var(--lx-accent-07, hsl(var(--accent)/.5))',
  15. '08': 'var(--lx-accent-08, hsl(var(--accent)/.6))',
  16. '09': 'var(--lx-accent-09, hsl(var(--accent)/.7))',
  17. '10': 'var(--lx-accent-10, hsl(var(--accent)/.8))',
  18. '11': 'var(--lx-accent-11, hsl(var(--accent)/.9))',
  19. '12': 'var(--lx-accent-12, --rx-gray-12)',
  20. '01-alpha': 'var(--lx-accent-01-alpha)',
  21. '02-alpha': 'var(--lx-accent-02-alpha)',
  22. '03-alpha': 'var(--lx-accent-03-alpha)',
  23. '04-alpha': 'var(--lx-accent-04-alpha)',
  24. '05-alpha': 'var(--lx-accent-05-alpha)',
  25. '06-alpha': 'var(--lx-accent-06-alpha)',
  26. '07-alpha': 'var(--lx-accent-07-alpha)',
  27. '08-alpha': 'var(--lx-accent-08-alpha)',
  28. '09-alpha': 'var(--lx-accent-09-alpha)',
  29. '10-alpha': 'var(--lx-accent-10-alpha)',
  30. '11-alpha': 'var(--lx-accent-11-alpha)',
  31. '12-alpha': 'var(--lx-accent-12-alpha)',
  32. }
  33. const gray = {
  34. ...colors.gray,
  35. '01': 'var(--lx-gray-01, var(--ls-primary-background-color, var(--rx-gray-01)))',
  36. '02': 'var(--lx-gray-02, var(--ls-secondary-background-color, var(--rx-gray-02)))',
  37. '03': 'var(--lx-gray-03, var(--ls-tertiary-background-color, var(--rx-gray-03)))',
  38. '04': 'var(--lx-gray-04, var(--ls-quaternary-background-color, var(--rx-gray-04)))',
  39. '05': 'var(--lx-gray-05, var(--ls-quaternary-background-color, var(--rx-gray-05)))',
  40. '06': 'var(--lx-gray-06, var(--ls-quaternary-background-color, var(--rx-gray-06)))',
  41. '07': 'var(--lx-gray-07, var(--ls-quaternary-background-color, var(--rx-gray-07)))',
  42. '08': 'var(--lx-gray-08, var(--rx-gray-08))',
  43. '09': 'var(--lx-gray-09, var(--rx-gray-09))',
  44. '10': 'var(--lx-gray-10, var(--rx-gray-10))',
  45. '11': 'var(--lx-gray-11, var(--rx-gray-11))',
  46. '12': 'var(--lx-gray-12, var(--rx-gray-12))',
  47. '01-alpha': 'var(--lx-gray-01-alpha, var(--rx-gray-01-alpha))',
  48. '02-alpha': 'var(--lx-gray-02-alpha, var(--rx-gray-02-alpha))',
  49. '03-alpha': 'var(--lx-gray-03-alpha, var(--rx-gray-03-alpha))',
  50. '04-alpha': 'var(--lx-gray-04-alpha, var(--rx-gray-04-alpha))',
  51. '05-alpha': 'var(--lx-gray-05-alpha, var(--rx-gray-05-alpha))',
  52. '06-alpha': 'var(--lx-gray-06-alpha, var(--rx-gray-06-alpha))',
  53. '07-alpha': 'var(--lx-gray-07-alpha, var(--rx-gray-07-alpha))',
  54. '08-alpha': 'var(--lx-gray-08-alpha, var(--rx-gray-08-alpha))',
  55. '09-alpha': 'var(--lx-gray-09-alpha, var(--rx-gray-09-alpha))',
  56. '10-alpha': 'var(--lx-gray-10-alpha, var(--rx-gray-10-alpha))',
  57. '11-alpha': 'var(--lx-gray-11-alpha, var(--rx-gray-11-alpha))',
  58. '12-alpha': 'var(--lx-gray-12-alpha, var(--rx-gray-12-alpha))',
  59. }
  60. function exposeColorsToCssVars ({ addBase, theme }) {
  61. function extractColorVars (colorObj, colorGroup = '') {
  62. return Object.keys(colorObj).reduce((vars, colorKey) => {
  63. const value = colorObj[colorKey]
  64. const newVars =
  65. typeof value === 'string'
  66. ? { [`--color${colorGroup}-${colorKey}`]: value }
  67. : extractColorVars(value, `-${colorKey}`)
  68. return { ...vars, ...newVars }
  69. }, {})
  70. }
  71. addBase({
  72. ':root': extractColorVars(theme('colors')),
  73. })
  74. }
  75. const withOverride = plugin(function ({ matchUtilities }) {
  76. matchUtilities({
  77. 'or': (value, b) => {
  78. // check if the value starts with "bg-"
  79. if (value.startsWith('bg-')) {
  80. return { [`--lx-bg-override`]: `var(--lx-${value})` }
  81. }
  82. // check if the value starts with "text-"
  83. if (value.startsWith('text-')) {
  84. return { [`--lx-text-override`]: `var(--lx-${value})` }
  85. }
  86. // check if the value starts with "border-"
  87. if (value.startsWith('border-')) {
  88. return { [`--lx-border-override`]: `var(--lx-${value})` }
  89. }
  90. }
  91. }, {
  92. values: {}
  93. })
  94. })
  95. function mapRadixColorToTailwind (color) {
  96. const radixColor = radix[color]
  97. if (!radixColor) throw new Error(`[radix color] not exist for ${color}`)
  98. const twSteps = [10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]
  99. const rxSteps = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  100. const colors = {}
  101. twSteps.forEach((twStep, index) => {
  102. const rxStep = rxSteps[index]
  103. // base color
  104. colors[twStep] = radixColor[`${color}${rxStep}`]
  105. // theme vars color
  106. const rxStepName = `${(rxStep < 10) ? '0' : ''}${rxStep}`
  107. const rxVarName = `--rx-${color}-${rxStepName}`
  108. colors[`rx-${rxStepName}`] = `var(${rxVarName})`
  109. colors[`rx-${rxStepName}-alpha`] = `var(${rxVarName}-alpha)`
  110. })
  111. return colors
  112. }
  113. module.exports = {
  114. darkMode: 'class',
  115. content: [
  116. './src/**/*.js',
  117. './src/**/*.cljs',
  118. './resources/**/*.html',
  119. './deps/shui/src/**/*.cljs',
  120. './deps/shui/src/**/*.cljc',
  121. './packages/ui/@/components/**/*.{ts,tsx}',
  122. './packages/ui/src/amplify/**/*.{ts,tsx}'
  123. ],
  124. safelist: [
  125. 'bg-black', 'bg-white', 'capitalize-first',
  126. { pattern: /bg-(gray|red|yellow|green|blue|orange|indigo|rose|purple|pink)-(100|200|300|400|500|600|700|800|900)/ },
  127. { pattern: /text-(gray|red|yellow|green|blue|orange|indigo|rose|purple|pink)-(100|200|300|400|500|600|700|800|900)/ },
  128. { pattern: /columns-([1-9]|1[0-2])|(auto|3xs|2xs|xs|sm|md|lg|xl)|([2-7]xl)/ },
  129. ],
  130. plugins: [
  131. require('@tailwindcss/forms'),
  132. require('@tailwindcss/typography'),
  133. require('@tailwindcss/aspect-ratio'),
  134. require('tailwind-capitalize-first-letter'),
  135. require('tailwindcss-animate'),
  136. exposeColorsToCssVars
  137. ],
  138. theme: {
  139. extend: {
  140. backgroundImage: {
  141. 'gradient-conic': 'conic-gradient(var(--tw-gradient-stops))',
  142. 'gradient-conic-bounce': 'conic-gradient(var(--tw-gradient-from), var(--tw-gradient-via), var(--tw-gradient-to), var(--tw-gradient-via), var(--tw-gradient-from))',
  143. 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
  144. },
  145. fontSize: {
  146. '2xs': ['0.625rem', '0.875rem']
  147. },
  148. animation: {
  149. 'spin-reverse': 'spin 2s linear infinite reverse',
  150. 'accordion-down': 'accordion-down 0.2s ease-out',
  151. 'accordion-up': 'accordion-up 0.2s ease-out',
  152. },
  153. spacing: {
  154. '128': '32rem',
  155. '144': '36rem'
  156. },
  157. scale: {
  158. '200': '2',
  159. '250': '2.5',
  160. '300': '3',
  161. '400': '4',
  162. },
  163. width: {
  164. 'lsm': '600px',
  165. 'lmd': '728px',
  166. 'llg': '960px'
  167. },
  168. // backgroundColor: {
  169. // ...lx('--lx-bg-override'),
  170. // },
  171. // textColor: {
  172. // ...lx('--lx-text-override'),
  173. // },
  174. // borderColor: {
  175. // ...lx('--lx-border-override'),
  176. // },
  177. borderRadius: {
  178. lg: 'var(--radius)',
  179. md: 'calc(var(--radius) - 2px)',
  180. sm: 'calc(var(--radius) - 4px)',
  181. },
  182. keyframes: {
  183. 'accordion-down': {
  184. from: { height: 0 },
  185. to: { height: 'var(--radix-accordion-content-height)' },
  186. },
  187. 'accordion-up': {
  188. from: { height: 'var(--radix-accordion-content-height)' },
  189. to: { height: 0 },
  190. },
  191. },
  192. },
  193. colors: {
  194. // Theme basic
  195. border: 'hsl(var(--border))',
  196. input: 'hsl(var(--input))',
  197. ring: 'hsl(var(--ring))',
  198. background: 'hsl(var(--background))',
  199. foreground: 'hsl(var(--foreground))',
  200. primary: {
  201. DEFAULT: 'hsl(var(--primary))',
  202. foreground: 'hsl(var(--primary-foreground))',
  203. },
  204. secondary: {
  205. DEFAULT: 'hsl(var(--secondary))',
  206. foreground: 'hsl(var(--secondary-foreground))',
  207. },
  208. destructive: {
  209. DEFAULT: 'hsl(var(--destructive))',
  210. foreground: 'hsl(var(--destructive-foreground))',
  211. },
  212. muted: {
  213. DEFAULT: 'hsl(var(--muted))',
  214. foreground: 'hsl(var(--muted-foreground))',
  215. },
  216. popover: {
  217. DEFAULT: 'hsl(var(--popover))',
  218. foreground: 'hsl(var(--popover-foreground))',
  219. },
  220. popovelx: {
  221. DEFAULT: 'var(--lx-gray-03, hsl(var(--popover)))',
  222. },
  223. card: {
  224. DEFAULT: 'hsl(var(--card))',
  225. foreground: 'hsl(var(--card-foreground))',
  226. },
  227. // Tailwind colors
  228. gray: gray,
  229. accent: accent,
  230. current: 'currentColor',
  231. transparent: 'transparent',
  232. black: colors.black,
  233. white: colors.white,
  234. red: mapRadixColorToTailwind('red'),
  235. pink: mapRadixColorToTailwind('pink'),
  236. orange: mapRadixColorToTailwind('orange'),
  237. yellow: mapRadixColorToTailwind('yellow'),
  238. green: mapRadixColorToTailwind('green'),
  239. blue: mapRadixColorToTailwind('blue'),
  240. indigo: mapRadixColorToTailwind('indigo'),
  241. purple: mapRadixColorToTailwind('purple'),
  242. rose: mapRadixColorToTailwind('red'),
  243. amber: mapRadixColorToTailwind('amber'),
  244. bronze: mapRadixColorToTailwind('bronze'),
  245. brown: mapRadixColorToTailwind('brown'),
  246. crimson: mapRadixColorToTailwind('crimson'),
  247. cyan: mapRadixColorToTailwind('cyan'),
  248. gold: mapRadixColorToTailwind('gold'),
  249. grass: mapRadixColorToTailwind('grass'),
  250. lime: mapRadixColorToTailwind('lime'),
  251. mauve: mapRadixColorToTailwind('mauve'),
  252. mint: mapRadixColorToTailwind('mint'),
  253. olive: mapRadixColorToTailwind('olive'),
  254. plum: mapRadixColorToTailwind('plum'),
  255. sage: mapRadixColorToTailwind('sage'),
  256. sand: mapRadixColorToTailwind('sand'),
  257. sky: mapRadixColorToTailwind('sky'),
  258. slate: mapRadixColorToTailwind('slate'),
  259. teal: mapRadixColorToTailwind('teal'),
  260. tomato: mapRadixColorToTailwind('tomato'),
  261. violet: mapRadixColorToTailwind('violet'),
  262. }
  263. },
  264. corePlugins: {
  265. preflight: true
  266. }
  267. }