use-design-tokens.ts 9.9 KB

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