slide-menu.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <template>
  2. <div class="slide-menu" id="slide-menu">
  3. <div
  4. v-for="item in items"
  5. :class="{ active: item.name === activeName }"
  6. :key="item.name"
  7. @click="$emit('changeItem', item as any)"
  8. >
  9. <ui-icon :type="item.icon" :tip="item.title" class="icon" />
  10. </div>
  11. </div>
  12. </template>
  13. <script lang="ts" setup>
  14. import { metas, RoutesName, router, getRouteConfig } from "@/router";
  15. import { views, records } from "@/store";
  16. import { computed } from "vue";
  17. import type { RouteRaw } from "@/router";
  18. export type MenuItem = {
  19. name: RoutesName;
  20. config: RouteRaw;
  21. } & typeof metas[keyof typeof metas];
  22. defineProps<{ activeName: RoutesName }>();
  23. defineEmits<{ (e: "changeItem", item: MenuItem): void }>();
  24. const items = computed(() => {
  25. const items = [
  26. {
  27. name: RoutesName.fireInfo,
  28. config: getRouteConfig(RoutesName.fireInfo),
  29. ...metas[RoutesName.fireInfo],
  30. },
  31. {
  32. name: RoutesName.summaryShow,
  33. config: getRouteConfig(RoutesName.summaryShow),
  34. ...metas[RoutesName.summaryShow],
  35. },
  36. ];
  37. if (views.value.length) {
  38. items.push({
  39. name: RoutesName.viewShow,
  40. config: getRouteConfig(RoutesName.viewShow),
  41. ...metas[RoutesName.viewShow],
  42. });
  43. }
  44. if (records.value.length) {
  45. items.push({
  46. name: RoutesName.recordShow,
  47. config: getRouteConfig(RoutesName.recordShow),
  48. ...metas[RoutesName.recordShow],
  49. });
  50. }
  51. // if (floders.value.length) {
  52. // items.push({
  53. // name: RoutesName.folderShow,
  54. // config: getRouteConfig(RoutesName.folderShow),
  55. // ...metas[RoutesName.folderShow],
  56. // });
  57. // }
  58. return items;
  59. });
  60. </script>
  61. <style lang="scss" scoped>
  62. .slide-menu {
  63. width: var(--editor-menu-width);
  64. filter: var(--editor-menu-filter);
  65. background-color: var(--editor-menu-back);
  66. position: fixed;
  67. left: var(--editor-menu-left);
  68. top: calc(var(--editor-head-height) + var(--header-top));
  69. bottom: 0;
  70. z-index: 200;
  71. overflow: hidden;
  72. backdrop-filter: blur(4px);
  73. transition: all 0.3s ease;
  74. > div {
  75. height: 70px;
  76. display: flex;
  77. align-items: center;
  78. justify-content: center;
  79. position: relative;
  80. color: rgba(255, 255, 255, 0.6);
  81. transition: color 0.3s ease;
  82. cursor: pointer;
  83. &::before {
  84. content: "";
  85. position: absolute;
  86. left: 0;
  87. top: 0;
  88. bottom: 0;
  89. width: 0;
  90. background: currentColor;
  91. transition: width 0.3s ease;
  92. }
  93. &.active,
  94. &:hover {
  95. color: #00c8af;
  96. }
  97. &.active::before {
  98. width: 4px;
  99. }
  100. .icon {
  101. font-size: 24px;
  102. color: currentColor;
  103. }
  104. }
  105. }
  106. </style>