Logo.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <script setup lang="ts">
  2. import { computed, inject } from 'vue'
  3. import { menuInjectionKey } from '@/injection'
  4. import { useConfigureStore } from '@/stores/configure'
  5. const APP_NAME = import.meta.env.VITE_APP_NAME
  6. const menuInject = inject(menuInjectionKey, null)
  7. const configureStore = useConfigureStore()
  8. const collapseWidth = computed(() => {
  9. return configureStore.configure.menuCollapsed
  10. ? menuInject?.collapse.width
  11. : menuInject?.collapse.maxWidth
  12. })
  13. </script>
  14. <template>
  15. <div
  16. class="shrink-0 border-r border-naive-border transition-[border-color,width] duration-300 ease-naive-bezier"
  17. :style="{
  18. width: `${collapseWidth}px`,
  19. }"
  20. >
  21. <div
  22. class="flex h-full items-center justify-center transition-[opacity,padding] duration-300 ease-naive-bezier"
  23. :class="[
  24. configureStore.configure.menuCollapsed ? 'px-0' : 'px-4',
  25. {
  26. 'opacity-0': !configureStore.configure.showLogo,
  27. },
  28. ]"
  29. >
  30. <div class="size-10 shrink-0">
  31. <div class="size-full rounded bg-primary/10"></div>
  32. </div>
  33. <div
  34. class="flex-1 overflow-hidden transition-[margin-left,max-width] duration-300"
  35. :class="configureStore.configure.menuCollapsed ? 'ml-0 max-w-0' : 'ml-4 max-w-44'"
  36. >
  37. <h1 class="truncate text-xl">
  38. {{ APP_NAME }}
  39. </h1>
  40. </div>
  41. </div>
  42. </div>
  43. </template>