uno.config.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { defineConfig, toEscapedSelector as e, presetUno, presetIcons } from 'unocss'
  2. import transformerVariantGroup from '@unocss/transformer-variant-group'
  3. import { loadEnv } from 'vite'
  4. import { ICON_PREFIX } from './src/constants'
  5. const root = process.cwd()
  6. const createPresetIcons = () => {
  7. const isBuild = !!process.argv[4]
  8. let env = {} as any
  9. if (!isBuild) {
  10. env = loadEnv(process.argv[3], root)
  11. } else {
  12. env = loadEnv(process.argv[4], root)
  13. }
  14. // @ts-ignore
  15. if (env.VITE_USE_ONLINE_ICON === 'true') {
  16. return []
  17. } else {
  18. return [
  19. presetIcons({
  20. autoInstall: false,
  21. prefix: ICON_PREFIX
  22. })
  23. ]
  24. }
  25. }
  26. export default defineConfig({
  27. // ...UnoCSS options
  28. rules: [
  29. [
  30. /^overflow-ellipsis$/,
  31. ([], { rawSelector }) => {
  32. const selector = e(rawSelector)
  33. return ` ${selector} { text-overflow: ellipsis; }`
  34. }
  35. ],
  36. [
  37. /^custom-hover$/,
  38. ([], { rawSelector }) => {
  39. const selector = e(rawSelector)
  40. return `
  41. ${selector} {
  42. display: flex;
  43. height: 100%;
  44. padding: 1px 10px 0;
  45. cursor: pointer;
  46. align-items: center;
  47. transition: background var(--transition-time-02);
  48. }
  49. /* you can have multiple rules */
  50. ${selector}:hover {
  51. background-color: var(--top-header-hover-color);
  52. }
  53. .dark ${selector}:hover {
  54. background-color: var(--el-bg-color-overlay);
  55. }
  56. `
  57. }
  58. ],
  59. [
  60. /^layout-border__left$/,
  61. ([], { rawSelector }) => {
  62. const selector = e(rawSelector)
  63. return `
  64. ${selector}:before {
  65. content: "";
  66. position: absolute;
  67. top: 0;
  68. left: 0;
  69. width: 1px;
  70. height: 100%;
  71. background-color: var(--el-border-color);
  72. z-index: 3;
  73. }
  74. `
  75. }
  76. ],
  77. [
  78. /^layout-border__right$/,
  79. ([], { rawSelector }) => {
  80. const selector = e(rawSelector)
  81. return `
  82. ${selector}:after {
  83. content: "";
  84. position: absolute;
  85. top: 0;
  86. right: 0;
  87. width: 1px;
  88. height: 100%;
  89. background-color: var(--el-border-color);
  90. z-index: 3;
  91. }
  92. `
  93. }
  94. ],
  95. [
  96. /^layout-border__top$/,
  97. ([], { rawSelector }) => {
  98. const selector = e(rawSelector)
  99. return `
  100. ${selector}:before {
  101. content: "";
  102. position: absolute;
  103. top: 0;
  104. left: 0;
  105. width: 100%;
  106. height: 1px;
  107. background-color: var(--el-border-color);
  108. z-index: 3;
  109. }
  110. `
  111. }
  112. ],
  113. [
  114. /^layout-border__bottom$/,
  115. ([], { rawSelector }) => {
  116. const selector = e(rawSelector)
  117. return `
  118. ${selector}:after {
  119. content: "";
  120. position: absolute;
  121. bottom: 0;
  122. left: 0;
  123. width: 100%;
  124. height: 1px;
  125. background-color: var(--el-border-color);
  126. z-index: 3;
  127. }
  128. `
  129. }
  130. ]
  131. ],
  132. presets: [presetUno({ dark: 'class', attributify: false }), ...createPresetIcons()],
  133. transformers: [transformerVariantGroup()],
  134. content: {
  135. pipeline: {
  136. include: [/\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html|ts)($|\?)/]
  137. }
  138. }
  139. })