AppDarkModeToggle.vue 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <template>
  2. <div v-if="getShowDarkModeToggle" :class="getClass" @click="toggleDarkMode">
  3. <div :class="`${prefixCls}-inner`"></div>
  4. <SvgIcon size="14" name="sun" />
  5. <SvgIcon size="14" name="moon" />
  6. </div>
  7. </template>
  8. <script lang="ts" setup>
  9. import { computed, unref } from 'vue';
  10. import { SvgIcon } from '/@/components/Icon';
  11. import { useDesign } from '/@/hooks/web/useDesign';
  12. import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  13. import { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';
  14. import { updateDarkTheme } from '/@/logics/theme/dark';
  15. import { ThemeEnum } from '/@/enums/appEnum';
  16. const { prefixCls } = useDesign('dark-switch');
  17. const { getDarkMode, setDarkMode, getShowDarkModeToggle } = useRootSetting();
  18. const isDark = computed(() => getDarkMode.value === ThemeEnum.DARK);
  19. const getClass = computed(() => [
  20. prefixCls,
  21. {
  22. [`${prefixCls}--dark`]: unref(isDark),
  23. },
  24. ]);
  25. function toggleDarkMode() {
  26. const darkMode = getDarkMode.value === ThemeEnum.DARK ? ThemeEnum.LIGHT : ThemeEnum.DARK;
  27. setDarkMode(darkMode);
  28. updateDarkTheme(darkMode);
  29. updateHeaderBgColor();
  30. updateSidebarBgColor();
  31. }
  32. </script>
  33. <style lang="less" scoped>
  34. @prefix-cls: ~'@{namespace}-dark-switch';
  35. html[data-theme='dark'] {
  36. .@{prefix-cls} {
  37. border: 1px solid rgb(196 188 188);
  38. }
  39. }
  40. .@{prefix-cls} {
  41. display: flex;
  42. position: relative;
  43. align-items: center;
  44. justify-content: space-between;
  45. width: 50px;
  46. height: 26px;
  47. margin-left: auto;
  48. padding: 0 6px;
  49. border-radius: 30px;
  50. background-color: #151515;
  51. cursor: pointer;
  52. &-inner {
  53. position: absolute;
  54. z-index: 1;
  55. width: 18px;
  56. height: 18px;
  57. transition: transform 0.5s, background-color 0.5s;
  58. border-radius: 50%;
  59. background-color: #fff;
  60. will-change: transform;
  61. }
  62. &--dark {
  63. .@{prefix-cls}-inner {
  64. transform: translateX(calc(100% + 2px));
  65. }
  66. }
  67. }
  68. </style>