tailwind.config.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. '01': 'var(--lx-accent-01)',
  56. '02': 'var(--lx-accent-02)',
  57. '03': 'var(--lx-accent-03)',
  58. '04': 'var(--lx-accent-04)',
  59. '05': 'var(--lx-accent-05)',
  60. '06': 'var(--lx-accent-06)',
  61. '07': 'var(--lx-accent-07)',
  62. '08': 'var(--lx-accent-08)',
  63. '09': 'var(--lx-accent-09)',
  64. '10': 'var(--lx-accent-10)',
  65. '11': 'var(--lx-accent-11)',
  66. '12': 'var(--lx-accent-12)',
  67. '01-alpha': 'var(--lx-accent-01-alpha)',
  68. '02-alpha': 'var(--lx-accent-02-alpha)',
  69. '03-alpha': 'var(--lx-accent-03-alpha)',
  70. '04-alpha': 'var(--lx-accent-04-alpha)',
  71. '05-alpha': 'var(--lx-accent-05-alpha)',
  72. '06-alpha': 'var(--lx-accent-06-alpha)',
  73. '07-alpha': 'var(--lx-accent-07-alpha)',
  74. '08-alpha': 'var(--lx-accent-08-alpha)',
  75. '09-alpha': 'var(--lx-accent-09-alpha)',
  76. '10-alpha': 'var(--lx-accent-10-alpha)',
  77. '11-alpha': 'var(--lx-accent-11-alpha)',
  78. '12-alpha': 'var(--lx-accent-12-alpha)',
  79. }
  80. const gray = {
  81. ...colors.gray,
  82. '01': 'var(--lx-gray-01)',
  83. '02': 'var(--lx-gray-02)',
  84. '03': 'var(--lx-gray-03)',
  85. '04': 'var(--lx-gray-04)',
  86. '05': 'var(--lx-gray-05)',
  87. '06': 'var(--lx-gray-06)',
  88. '07': 'var(--lx-gray-07)',
  89. '08': 'var(--lx-gray-08)',
  90. '09': 'var(--lx-gray-09)',
  91. '10': 'var(--lx-gray-10)',
  92. '11': 'var(--lx-gray-11)',
  93. '12': 'var(--lx-gray-12)',
  94. '01-alpha': 'var(--lx-gray-01-alpha)',
  95. '02-alpha': 'var(--lx-gray-02-alpha)',
  96. '03-alpha': 'var(--lx-gray-03-alpha)',
  97. '04-alpha': 'var(--lx-gray-04-alpha)',
  98. '05-alpha': 'var(--lx-gray-05-alpha)',
  99. '06-alpha': 'var(--lx-gray-06-alpha)',
  100. '07-alpha': 'var(--lx-gray-07-alpha)',
  101. '08-alpha': 'var(--lx-gray-08-alpha)',
  102. '09-alpha': 'var(--lx-gray-09-alpha)',
  103. '10-alpha': 'var(--lx-gray-10-alpha)',
  104. '11-alpha': 'var(--lx-gray-11-alpha)',
  105. '12-alpha': 'var(--lx-gray-12-alpha)',
  106. }
  107. function exposeColorsToCssVars ({ addBase, theme }) {
  108. function extractColorVars (colorObj, colorGroup = '') {
  109. return Object.keys(colorObj).reduce((vars, colorKey) => {
  110. const value = colorObj[colorKey]
  111. const newVars =
  112. typeof value === 'string'
  113. ? { [`--color${colorGroup}-${colorKey}`]: value }
  114. : extractColorVars(value, `-${colorKey}`)
  115. return { ...vars, ...newVars }
  116. }, {})
  117. }
  118. addBase({
  119. ':root': extractColorVars(theme('colors')),
  120. })
  121. }
  122. const withOverride = plugin(function({ matchUtilities }) {
  123. matchUtilities({
  124. 'or': (value, b) => {
  125. // check if the value starts with "bg-"
  126. if (value.startsWith('bg-')) {
  127. return { [`--lx-bg-override`]: `var(--lx-${value})` }
  128. }
  129. // check if the value starts with "text-"
  130. if (value.startsWith('text-')) {
  131. return { [`--lx-text-override`]: `var(--lx-${value})` }
  132. }
  133. // check if the value starts with "border-"
  134. if (value.startsWith('border-')) {
  135. return { [`--lx-border-override`]: `var(--lx-${value})` }
  136. }
  137. }
  138. }, {
  139. values: {}
  140. })
  141. })
  142. function buildColor(color, custom) {
  143. const base = custom || colors[color] || {}
  144. for (const [xName, xValue] of Object.entries(radix[color] || {})) {
  145. const regexResult = xName.match(/\d+$/)
  146. if (!regexResult) { continue; }
  147. const xStep = regexResult[0]
  148. base[xStep] = xValue
  149. }
  150. return base
  151. }
  152. function getDarkSelector(config) {
  153. const darkMode = config("darkMode");
  154. const prefix = config("prefix");
  155. if (Array.isArray(darkMode)) {
  156. if (darkMode.length < 2) {
  157. throw new Error(
  158. "To customize the dark mode selector, `darkMode` should contain two items. Documentation: https://tailwindcss.com/docs/dark-mode#customizing-the-class-name"
  159. );
  160. }
  161. if (darkMode[0] !== "class") {
  162. throw new Error(
  163. 'To customize the dark mode selector, `darkMode` should have "class" as its first item. Documentation: https://tailwindcss.com/docs/dark-mode#customizing-the-class-name'
  164. );
  165. }
  166. return darkMode[1] + " &";
  167. }
  168. if (darkMode === "media") {
  169. return "@media (prefers-color-scheme: dark)";
  170. }
  171. if (darkMode !== "class") {
  172. throw new Error(
  173. "Invalid `darkMode`. Documentation: https://tailwindcss.com/docs/dark-mode"
  174. );
  175. }
  176. if (prefix) {
  177. return `[class~="${prefix}dark"] &`;
  178. }
  179. return '[class~="dark"] &';
  180. }
  181. module.exports = {
  182. darkMode: 'class',
  183. content: [
  184. './src/**/*.js',
  185. './src/**/*.cljs',
  186. './resources/**/*.html',
  187. './deps/shui/src/**/*.cljs',
  188. ],
  189. safelist: [
  190. 'bg-black', 'bg-white', 'capitalize-first',
  191. { pattern: /bg-(gray|red|yellow|green|blue|orange|indigo|rose|purple|pink)-(100|200|300|400|500|600|700|800|900)/ },
  192. { pattern: /text-(gray|red|yellow|green|blue|orange|indigo|rose|purple|pink)-(100|200|300|400|500|600|700|800|900)/ },
  193. { pattern: /columns-([1-9]|1[0-2])|(auto|3xs|2xs|xs|sm|md|lg|xl)|([2-7]xl)/ },
  194. ],
  195. plugins: [
  196. require('@tailwindcss/forms'),
  197. require('@tailwindcss/typography'),
  198. require('@tailwindcss/aspect-ratio'),
  199. require('@tailwindcss/line-clamp'),
  200. require('tailwind-capitalize-first-letter'),
  201. exposeColorsToCssVars,
  202. withOverride,
  203. ],
  204. theme: {
  205. extend: {
  206. backgroundImage: {
  207. 'gradient-conic': 'conic-gradient(var(--tw-gradient-stops))',
  208. '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))',
  209. 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
  210. },
  211. fontSize: {
  212. '2xs': ['0.625rem', '0.875rem']
  213. },
  214. animation: {
  215. 'spin-reverse': 'spin 2s linear infinite reverse',
  216. },
  217. spacing: {
  218. '128': '32rem',
  219. '144': '36rem'
  220. },
  221. scale: {
  222. '200': '2',
  223. '250': '2.5',
  224. '300': '3',
  225. '400': '4',
  226. },
  227. width: {
  228. 'lsm': '600px',
  229. 'lmd': '728px',
  230. 'llg': '960px'
  231. },
  232. backgroundColor: {
  233. ...lx('--lx-bg-override'),
  234. },
  235. textColor: {
  236. ...lx('--lx-text-override'),
  237. },
  238. borderColor: {
  239. ...lx('--lx-border-override'),
  240. },
  241. },
  242. colors: {
  243. // Tailwind colors
  244. gray: gray,
  245. accent: accent,
  246. red: colors.red,
  247. green: colors.green,
  248. blue: colors.blue,
  249. black: colors.black,
  250. orange: colors.orange,
  251. indigo: colors.indigo,
  252. rose: colors.rose,
  253. purple: colors.purple,
  254. pink: colors.pink,
  255. yellow: colors.yellow,
  256. current: 'currentColor',
  257. transparent: 'transparent',
  258. white: colors.white,
  259. }
  260. }
  261. }