slide-menu.vue 2.7 KB

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