1
0

tailwind.config.js 13 KB

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