LeftTopMode.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <script lang="ts" setup>
  2. import { computed } from "vue"
  3. import { storeToRefs } from "pinia"
  4. import { useAppStore } from "@/store/modules/app"
  5. import { useSettingsStore } from "@/store/modules/settings"
  6. import { AppMain, NavigationBar, Sidebar, TagsView, Logo } from "./components"
  7. const appStore = useAppStore()
  8. const settingsStore = useSettingsStore()
  9. const { showTagsView, showLogo } = storeToRefs(settingsStore)
  10. /** 定义计算属性 layoutClasses,用于控制布局的类名 */
  11. const layoutClasses = computed(() => {
  12. return {
  13. hideSidebar: !appStore.sidebar.opened
  14. }
  15. })
  16. </script>
  17. <template>
  18. <div :class="layoutClasses" class="app-wrapper">
  19. <!-- 头部导航栏和标签栏 -->
  20. <div class="fixed-header layout-header">
  21. <Logo v-if="showLogo" :collapse="false" class="logo" />
  22. <div class="content">
  23. <NavigationBar />
  24. <TagsView v-show="showTagsView" />
  25. </div>
  26. </div>
  27. <!-- 主容器 -->
  28. <div :class="{ hasTagsView: showTagsView }" class="main-container">
  29. <!-- 左侧边栏 -->
  30. <Sidebar class="sidebar-container" />
  31. <!-- 页面主体内容 -->
  32. <AppMain class="app-main" />
  33. </div>
  34. </div>
  35. </template>
  36. <style lang="scss" scoped>
  37. @import "@/styles/mixins.scss";
  38. $transition-time: 0.35s;
  39. .app-wrapper {
  40. @extend %clearfix;
  41. width: 100%;
  42. }
  43. .fixed-header {
  44. position: fixed;
  45. top: 0;
  46. z-index: 1002;
  47. width: 100%;
  48. display: flex;
  49. .logo {
  50. width: var(--v3-sidebar-width);
  51. }
  52. .content {
  53. flex: 1;
  54. position: relative;
  55. }
  56. }
  57. .layout-header {
  58. background-color: var(--v3-header-bg-color);
  59. box-shadow: var(--v3-header-box-shadow);
  60. border-bottom: var(--v3-header-border-bottom);
  61. }
  62. .main-container {
  63. min-height: 100%;
  64. }
  65. .sidebar-container {
  66. transition: width $transition-time;
  67. width: var(--v3-sidebar-width) !important;
  68. height: 100%;
  69. position: fixed;
  70. left: 0;
  71. z-index: 1001;
  72. overflow: hidden;
  73. border-right: var(--v3-sidebar-border-right);
  74. padding-top: var(--v3-navigationbar-height);
  75. }
  76. .app-main {
  77. transition: padding-left $transition-time;
  78. padding-top: var(--v3-navigationbar-height);
  79. padding-left: var(--v3-sidebar-width);
  80. height: 100vh;
  81. overflow: auto;
  82. }
  83. .hideSidebar {
  84. .sidebar-container {
  85. width: var(--v3-sidebar-hide-width) !important;
  86. }
  87. .app-main {
  88. padding-left: var(--v3-sidebar-hide-width);
  89. }
  90. }
  91. .hasTagsView {
  92. .sidebar-container {
  93. padding-top: var(--v3-header-height);
  94. }
  95. .app-main {
  96. padding-top: var(--v3-header-height);
  97. }
  98. }
  99. </style>