feat: 初始化提交
笑笑 authored at 2025-05-13 21:25:06
3.08 KiB
cube-front
<script setup lang="ts">
import { ref } from 'vue';
import Navbar from './Navbar/index.vue';
import Content from './Content/index.vue';
import Sider from './Sider/index.vue';
import { useUserStore } from 'cube-front/core/stores/user';

const userStore = useUserStore();
const collapsed = ref(false);

const navbarHeight = 56;
const menuWidth = collapsed.value ? 48 : 120;
const paddingLeft = { paddingLeft: menuWidth + 'px' };
const paddingTop = { paddingTop: navbarHeight + 'px' };

const paddingStyle = { ...paddingLeft, ...paddingTop };
</script>

<template>
  <div class="layout">
    <div class="layoutNavbar">
      <Navbar :currentUser="userStore.userInfo" :logout="userStore.logout" :collapsed="false" />
    </div>
    <div class="layoutMain">
      <div class="layoutSidebar" :style="{ ...paddingTop, width: menuWidth + 'px' }">
        <Sider />
      </div>
      <div class="layoutContent" :style="paddingStyle">
        <div class="layoutContentWrapper">
          <!-- <div v-if="breadcrumb.length > 0" class="layoutBreadcrumb">
            <Breadcrumb></Breadcrumb>
          </div> -->
          <Content>
            <slot></slot>
          </Content>
        </div>
      </div>
    </div>
  </div>
</template>

<style lang="scss" scoped>
$nav-size-height: 56px;
$layout-max-width: 1100px;

.layout {
  width: 100%;
  height: 100%;
  background-color: #e9f6fe;
}

.layoutNavbar {
  position: fixed;
  width: 100%;
  min-width: $layout-max-width;
  top: 0;
  left: 0;
  height: $nav-size-height;
  z-index: 100;

  &-hidden {
    height: 0;
  }
}

.layoutMain {
  .layoutSidebar {
    position: fixed;
    height: 100%;
    top: 0;
    left: 0;
    z-index: 99;
    box-sizing: border-box;

    ::-webkit-scrollbar {
      width: 12px;
      height: 4px;
    }

    ::-webkit-scrollbar-thumb {
      border: 4px solid transparent;
      background-clip: padding-box;
      border-radius: 7px;
      background-color: var(--color-text-4);
    }

    ::-webkit-scrollbar-thumb:hover {
      background-color: var(--color-text-3);
    }

    &::after {
      content: '';
      display: block;
      position: absolute;
      top: 0;
      right: -1px;
      width: 1px;
      height: 100%;
      background-color: var(--color-border);
    }

    .collapseBtn {
      height: 24px;
      width: 24px;
      background-color: var(--color-fill-1);
      color: var(--color-text-3);
      border-radius: 2px;
      cursor: pointer;
      display: flex;
      justify-content: center;
      align-items: center;
      // 位置
      position: absolute;
      bottom: 12px;
      right: 12px;

      &:hover {
        background-color: var(--color-fill-3);
      }
    }
  }

  .layoutContent {
    background-color: #e9f6fe;
    min-width: $layout-max-width;
    min-height: 100vh;
    height: 100vh;
    transition: padding-left 0.2s;
    box-sizing: border-box;
    padding-right: 5px;
    padding-bottom: 5px;
  }

  .layoutContentWrapper {
    height: 100%;
    background-color: #fff;
    border-radius: 14px;
    padding: 16px 6px 0 16px;
    box-sizing: border-box;
  }

  .layoutBreadcrumb {
    margin-bottom: 16px;
  }
}
</style>