menu-item-child.vue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <template>
  2. <template v-if="menuItem.children && menuItem.children.length">
  3. <ui-icon type="pull-more" class="menu-more-icon" size="12px" />
  4. <ui-floating
  5. :mount="mountEl"
  6. :refer="refer"
  7. dire="right-top"
  8. class="menu-children strengthen"
  9. :class="{ show }"
  10. @enter="emit('enter')"
  11. @leave="emit('leave')"
  12. >
  13. <menu-child
  14. :menu="menuItem.children"
  15. :active-paths="activePaths"
  16. :level="level"
  17. @enter="emit('enter')"
  18. @leave="emit('leave')"
  19. @select="item => emit('select', item)"
  20. />
  21. </ui-floating>
  22. </template>
  23. </template>
  24. <script setup lang="ts">
  25. import MenuChild from './menu-item.vue'
  26. import type { Item, Items } from './index.vue'
  27. const mountEl = document.body
  28. defineProps<{
  29. menuItem: Item
  30. activePaths: Array<string>
  31. refer: any
  32. level: number
  33. show: boolean
  34. }>()
  35. const emit = defineEmits<{
  36. (event: 'enter'): void
  37. (event: 'leave'): void
  38. (event: 'select', menu: Item): void
  39. }>()
  40. </script>
  41. <style lang="sass" scoped>
  42. @import './style.scss'
  43. </style>
  44. <style>
  45. .menu-children {
  46. backdrop-filter: blur(4px);
  47. background-color: var(--editor-menu-back);
  48. transform: translateY(0) scaleY(0);
  49. opacity: 0;
  50. transform-origin: center top;
  51. transition: transform 0.3s ease, opacity 0.3s ease;
  52. }
  53. .menu-children.show {
  54. transform: translateY(0) scaleY(1);
  55. opacity: 1;
  56. }
  57. </style>