use-design-tokens.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import { reactive, watch } from 'vue';
  2. import { preferences, usePreferences } from '@vben/preferences';
  3. import { convertToRgb, updateCSSVariables } from '@vben/utils';
  4. /**
  5. * 用于适配各个框架的设计系统
  6. */
  7. export function useAntdDesignTokens() {
  8. const rootStyles = getComputedStyle(document.documentElement);
  9. const tokens = reactive({
  10. borderRadius: '' as any,
  11. colorBgBase: '',
  12. colorBgContainer: '',
  13. colorBgElevated: '',
  14. colorBgLayout: '',
  15. colorBgMask: '',
  16. colorBorder: '',
  17. colorBorderSecondary: '',
  18. colorError: '',
  19. colorInfo: '',
  20. colorPrimary: '',
  21. colorSuccess: '',
  22. colorTextBase: '',
  23. colorWarning: '',
  24. zIndexPopupBase: 2000, // 调整基础弹层层级,避免下拉等组件被弹窗或者最大化状态下的表格遮挡
  25. });
  26. const getCssVariableValue = (variable: string, isColor: boolean = true) => {
  27. const value = rootStyles.getPropertyValue(variable);
  28. return isColor ? `hsl(${value})` : value;
  29. };
  30. watch(
  31. () => preferences.theme,
  32. () => {
  33. tokens.colorPrimary = getCssVariableValue('--primary');
  34. tokens.colorInfo = getCssVariableValue('--primary');
  35. tokens.colorError = getCssVariableValue('--destructive');
  36. tokens.colorWarning = getCssVariableValue('--warning');
  37. tokens.colorSuccess = getCssVariableValue('--success');
  38. tokens.colorTextBase = getCssVariableValue('--foreground');
  39. getCssVariableValue('--primary-foreground');
  40. tokens.colorBorderSecondary = tokens.colorBorder =
  41. getCssVariableValue('--border');
  42. tokens.colorBgElevated = getCssVariableValue('--popover');
  43. tokens.colorBgContainer = getCssVariableValue('--card');
  44. tokens.colorBgBase = getCssVariableValue('--background');
  45. const radius = Number.parseFloat(getCssVariableValue('--radius', false));
  46. // 1rem = 16px
  47. tokens.borderRadius = radius * 16;
  48. tokens.colorBgLayout = getCssVariableValue('--background-deep');
  49. tokens.colorBgMask = getCssVariableValue('--overlay');
  50. },
  51. { immediate: true },
  52. );
  53. return {
  54. tokens,
  55. };
  56. }
  57. export function useNaiveDesignTokens() {
  58. const rootStyles = getComputedStyle(document.documentElement);
  59. const commonTokens = reactive({
  60. baseColor: '',
  61. bodyColor: '',
  62. borderColor: '',
  63. borderRadius: '',
  64. cardColor: '',
  65. dividerColor: '',
  66. errorColor: '',
  67. errorColorHover: '',
  68. errorColorPressed: '',
  69. errorColorSuppl: '',
  70. invertedColor: '',
  71. modalColor: '',
  72. popoverColor: '',
  73. primaryColor: '',
  74. primaryColorHover: '',
  75. primaryColorPressed: '',
  76. primaryColorSuppl: '',
  77. successColor: '',
  78. successColorHover: '',
  79. successColorPressed: '',
  80. successColorSuppl: '',
  81. tableColor: '',
  82. textColorBase: '',
  83. warningColor: '',
  84. warningColorHover: '',
  85. warningColorPressed: '',
  86. warningColorSuppl: '',
  87. });
  88. const getCssVariableValue = (variable: string, isColor: boolean = true) => {
  89. const value = rootStyles.getPropertyValue(variable);
  90. return isColor ? convertToRgb(`hsl(${value})`) : value;
  91. };
  92. watch(
  93. () => preferences.theme,
  94. () => {
  95. commonTokens.primaryColor = getCssVariableValue('--primary');
  96. commonTokens.primaryColorHover = getCssVariableValue('--primary-600');
  97. commonTokens.primaryColorPressed = getCssVariableValue('--primary-700');
  98. commonTokens.primaryColorSuppl = getCssVariableValue('--primary-800');
  99. commonTokens.errorColor = getCssVariableValue('--destructive');
  100. commonTokens.errorColorHover = getCssVariableValue('--destructive-600');
  101. commonTokens.errorColorPressed = getCssVariableValue('--destructive-700');
  102. commonTokens.errorColorSuppl = getCssVariableValue('--destructive-800');
  103. commonTokens.warningColor = getCssVariableValue('--warning');
  104. commonTokens.warningColorHover = getCssVariableValue('--warning-600');
  105. commonTokens.warningColorPressed = getCssVariableValue('--warning-700');
  106. commonTokens.warningColorSuppl = getCssVariableValue('--warning-800');
  107. commonTokens.successColor = getCssVariableValue('--success');
  108. commonTokens.successColorHover = getCssVariableValue('--success-600');
  109. commonTokens.successColorPressed = getCssVariableValue('--success-700');
  110. commonTokens.successColorSuppl = getCssVariableValue('--success-800');
  111. commonTokens.textColorBase = getCssVariableValue('--foreground');
  112. commonTokens.baseColor = getCssVariableValue('--primary-foreground');
  113. commonTokens.dividerColor = commonTokens.borderColor =
  114. getCssVariableValue('--border');
  115. commonTokens.modalColor = commonTokens.popoverColor =
  116. getCssVariableValue('--popover');
  117. commonTokens.tableColor = commonTokens.cardColor =
  118. getCssVariableValue('--card');
  119. commonTokens.bodyColor = getCssVariableValue('--background');
  120. commonTokens.invertedColor = getCssVariableValue('--background-deep');
  121. commonTokens.borderRadius = getCssVariableValue('--radius', false);
  122. },
  123. { immediate: true },
  124. );
  125. return {
  126. commonTokens,
  127. };
  128. }
  129. export function useElementPlusDesignTokens() {
  130. const { isDark } = usePreferences();
  131. const rootStyles = getComputedStyle(document.documentElement);
  132. const getCssVariableValueRaw = (variable: string) => {
  133. return rootStyles.getPropertyValue(variable);
  134. };
  135. const getCssVariableValue = (variable: string, isColor: boolean = true) => {
  136. const value = getCssVariableValueRaw(variable);
  137. return isColor ? convertToRgb(`hsl(${value})`) : value;
  138. };
  139. watch(
  140. () => preferences.theme,
  141. () => {
  142. const background = getCssVariableValue('--background');
  143. const border = getCssVariableValue('--border');
  144. const accent = getCssVariableValue('--accent');
  145. const variables: Record<string, string> = {
  146. '--el-bg-color': background,
  147. '--el-bg-color-overlay': getCssVariableValue('--popover'),
  148. '--el-bg-color-page': getCssVariableValue('--background-deep'),
  149. '--el-border-color': border,
  150. '--el-border-color-dark': border,
  151. '--el-border-color-extra-light': border,
  152. '--el-border-color-hover': accent,
  153. '--el-border-color-light': border,
  154. '--el-border-color-lighter': border,
  155. '--el-border-radius-base': getCssVariableValue('--radius', false),
  156. '--el-color-danger': getCssVariableValue('--destructive-500'),
  157. '--el-color-danger-dark-2': getCssVariableValue('--destructive'),
  158. '--el-color-danger-light-3': getCssVariableValue('--destructive-400'),
  159. '--el-color-danger-light-5': getCssVariableValue('--destructive-300'),
  160. '--el-color-danger-light-7': getCssVariableValue('--destructive-200'),
  161. '--el-color-danger-light-8': isDark.value
  162. ? border
  163. : getCssVariableValue('--destructive-100'),
  164. '--el-color-danger-light-9': isDark.value
  165. ? accent
  166. : getCssVariableValue('--destructive-50'),
  167. '--el-color-error': getCssVariableValue('--destructive-500'),
  168. '--el-color-error-dark-2': getCssVariableValue('--destructive'),
  169. '--el-color-error-light-3': getCssVariableValue('--destructive-400'),
  170. '--el-color-error-light-5': getCssVariableValue('--destructive-300'),
  171. '--el-color-error-light-7': getCssVariableValue('--destructive-200'),
  172. '--el-color-error-light-8': isDark.value
  173. ? border
  174. : getCssVariableValue('--destructive-100'),
  175. '--el-color-error-light-9': isDark.value
  176. ? accent
  177. : getCssVariableValue('--destructive-50'),
  178. '--el-color-info-light-8': border,
  179. '--el-color-info-light-9': getCssVariableValue('--info'), // getCssVariableValue('--secondary'),
  180. '--el-color-primary': getCssVariableValue('--primary-500'),
  181. '--el-color-primary-dark-2': getCssVariableValue('--primary'),
  182. '--el-color-primary-light-3': getCssVariableValue('--primary-400'),
  183. '--el-color-primary-light-5': getCssVariableValue('--primary-300'),
  184. '--el-color-primary-light-7': isDark.value
  185. ? border
  186. : getCssVariableValue('--primary-200'),
  187. '--el-color-primary-light-8': isDark.value
  188. ? border
  189. : getCssVariableValue('--primary-100'),
  190. '--el-color-primary-light-9': isDark.value
  191. ? accent
  192. : getCssVariableValue('--primary-50'),
  193. '--el-color-success': getCssVariableValue('--success-500'),
  194. '--el-color-success-dark-2': getCssVariableValue('--success'),
  195. '--el-color-success-light-3': getCssVariableValue('--success-400'),
  196. '--el-color-success-light-5': getCssVariableValue('--success-300'),
  197. '--el-color-success-light-7': getCssVariableValue('--success-200'),
  198. '--el-color-success-light-8': isDark.value
  199. ? border
  200. : getCssVariableValue('--success-100'),
  201. '--el-color-success-light-9': isDark.value
  202. ? accent
  203. : getCssVariableValue('--success-50'),
  204. '--el-color-warning': getCssVariableValue('--warning-500'),
  205. '--el-color-warning-dark-2': getCssVariableValue('--warning'),
  206. '--el-color-warning-light-3': getCssVariableValue('--warning-400'),
  207. '--el-color-warning-light-5': getCssVariableValue('--warning-300'),
  208. '--el-color-warning-light-7': getCssVariableValue('--warning-200'),
  209. '--el-color-warning-light-8': isDark.value
  210. ? border
  211. : getCssVariableValue('--warning-100'),
  212. '--el-color-warning-light-9': isDark.value
  213. ? accent
  214. : getCssVariableValue('--warning-50'),
  215. '--el-fill-color': getCssVariableValue('--accent'),
  216. '--el-fill-color-blank': background,
  217. '--el-fill-color-light': getCssVariableValue('--accent'),
  218. '--el-fill-color-lighter': getCssVariableValue('--accent-lighter'),
  219. '--el-fill-color-dark': getCssVariableValue('--accent-dark'),
  220. '--el-fill-color-darker': getCssVariableValue('--accent-darker'),
  221. // 解决ElLoading背景色问题
  222. '--el-mask-color': isDark.value
  223. ? 'rgba(0,0,0,.8)'
  224. : 'rgba(255,255,255,.9)',
  225. '--el-text-color-primary': getCssVariableValue('--foreground'),
  226. '--el-text-color-regular': getCssVariableValue('--foreground'),
  227. };
  228. updateCSSVariables(variables, `__vben_design_styles__`);
  229. },
  230. { immediate: true },
  231. );
  232. }