SidebarMenuButton.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <script setup lang="ts">
  2. import type { Component } from "vue"
  3. import type { SidebarMenuButtonProps } from "./SidebarMenuButtonChild.vue"
  4. import { reactiveOmit } from "@vueuse/core"
  5. import { Tooltip, TooltipContent, TooltipTrigger } from '@/Packages/Shadcn/Components/ui/tooltip'
  6. import SidebarMenuButtonChild from "./SidebarMenuButtonChild.vue"
  7. import { useSidebar } from "./utils"
  8. defineOptions({
  9. inheritAttrs: false,
  10. })
  11. const props = withDefaults(defineProps<SidebarMenuButtonProps & {
  12. tooltip?: string | Component
  13. }>(), {
  14. as: "button",
  15. variant: "default",
  16. size: "default",
  17. })
  18. const { isMobile, state } = useSidebar()
  19. const delegatedProps = reactiveOmit(props, "tooltip")
  20. </script>
  21. <template>
  22. <SidebarMenuButtonChild v-if="!tooltip" v-bind="{ ...delegatedProps, ...$attrs }">
  23. <slot />
  24. </SidebarMenuButtonChild>
  25. <Tooltip v-else>
  26. <TooltipTrigger as-child>
  27. <SidebarMenuButtonChild v-bind="{ ...delegatedProps, ...$attrs }">
  28. <slot />
  29. </SidebarMenuButtonChild>
  30. </TooltipTrigger>
  31. <TooltipContent
  32. side="right"
  33. align="center"
  34. :hidden="state !== 'collapsed' || isMobile"
  35. >
  36. <template v-if="typeof tooltip === 'string'">
  37. {{ tooltip }}
  38. </template>
  39. <component :is="tooltip" v-else />
  40. </TooltipContent>
  41. </Tooltip>
  42. </template>