index.vue 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <script setup lang="ts">
  2. import SiderBar from './components/Sidebar/index.vue'
  3. import Header from './components/Header.vue'
  4. import AppMain from './components/AppMain.vue'
  5. import { useAppStore } from '@/store/modules/app'
  6. const appStore = useAppStore()
  7. </script>
  8. <template>
  9. <div class="app-wrapper" :class="{ 'is-collapsed': appStore.sidebarCollapsed }">
  10. <SiderBar class="sidebar-container" />
  11. <div class="main-wrapper">
  12. <Header class="header-container" />
  13. <AppMain class="main-container" />
  14. </div>
  15. </div>
  16. </template>
  17. <style lang="scss" scoped>
  18. .app-wrapper {
  19. --sidebar-width: 300px;
  20. display: grid;
  21. width: 100%;
  22. height: 100vh;
  23. grid-template-columns: var(--sidebar-width) 1fr;
  24. grid-template-rows: 88px 1fr;
  25. grid-template-areas:
  26. 'sidebar header'
  27. 'sidebar main';
  28. overflow: hidden;
  29. transition: grid-template-columns 0.3s ease;
  30. &.is-collapsed {
  31. --sidebar-width: 64px;
  32. }
  33. }
  34. .sidebar-container {
  35. grid-area: sidebar;
  36. border-right: 1px solid var(--admin-border-color);
  37. }
  38. .main-wrapper {
  39. display: contents; // 让子元素直接参与 grid 布局
  40. }
  41. .header-container {
  42. grid-area: header;
  43. background-color: var(--admin-header-bg);
  44. border-bottom: 1px solid var(--admin-border-color);
  45. }
  46. .main-container {
  47. grid-area: main;
  48. background-color: var(--admin-bg);
  49. overflow: auto;
  50. }
  51. </style>