Skip to content

Hover Card

For sighted users to preview content available behind a link.

Web Only

This component is only available for web frameworks (Vue, React, Angular). Hover interactions are not available on mobile platforms.

@nextjs

Installation

bash
npx @galaxy-stack/nebula-cli@latest add hover-card
bash
pnpm dlx @galaxy-stack/nebula-cli@latest add hover-card
bash
yarn dlx @galaxy-stack/nebula-cli@latest add hover-card
bash
bunx @galaxy-stack/nebula-cli@latest add hover-card
bash
# If you have installed galaxy-design globally
galaxy-design add hover-card

Usage

React

tsx
import {
  HoverCard,
  HoverCardTrigger,
  HoverCardContent,
} from "@/components/ui/hover-card"

export default function App() {
  return (
    <HoverCard>
      <HoverCardTrigger asChild>
        <a href="https://nextjs.org">Hover</a>
      </HoverCardTrigger>
      <HoverCardContent className="w-80">
        <div className="space-y-2">
          <h4 className="text-sm font-semibold">@nextjs</h4>
          <p className="text-sm">
            The React Framework – created and maintained by @vercel.
          </p>
        </div>
      </HoverCardContent>
    </HoverCard>
  )
}

Vue

vue
<script setup lang="ts">
import {
  HoverCard,
  HoverCardTrigger,
  HoverCardContent,
} from '@/components/ui/hover-card'
</script>

<template>
  <HoverCard>
    <HoverCardTrigger asChild>
      <a href="https://nextjs.org">Hover</a>
    </HoverCardTrigger>
    <HoverCardContent class="w-80">
      <div class="space-y-2">
        <h4 class="text-sm font-semibold">@nextjs</h4>
        <p class="text-sm">
          The React Framework – created and maintained by @vercel.
        </p>
      </div>
    </HoverCardContent>
  </HoverCard>
</template>

Angular

typescript
import { Component } from '@angular/core';
import { HoverCardComponent } from '@/components/ui/hover-card';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [HoverCardComponent],
  template: `
    <ui-hover-card>
      <a trigger href="https://nextjs.org">Hover</a>
      <div content class="w-80 space-y-2">
        <h4 class="text-sm font-semibold">@nextjs</h4>
        <p class="text-sm">
          The React Framework – created and maintained by @vercel.
        </p>
      </div>
    </ui-hover-card>
  `
})
export class AppComponent {}

API Reference

Props

PropTypeDefaultDescriptionFrameworks
openboolean-Controlled open stateReact, Vue, Angular
defaultOpenbooleanfalseInitial open state for uncontrolled usageReact, Vue, Angular
onOpenChange(open: boolean) => void-Called when the open state changesReact, Vue, Angular
openDelaynumber700Delay in milliseconds before openingReact, Vue, Angular
closeDelaynumber300Delay in milliseconds before closingReact, Vue, Angular
childrenReactNode-Hover card composition contentReact, Vue, Angular

Sub-components

HoverCardTrigger

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender the trigger as a child elementReact, Vue
asAsTag | Component'button'Element or component to renderVue only

HoverCardContent

PropTypeDefaultDescriptionFrameworks
side'top' | 'right' | 'bottom' | 'left''bottom'Preferred side for the contentReact, Vue, Angular
align'start' | 'center' | 'end''center'Alignment along the sideReact, Vue, Angular
sideOffsetnumber5Offset in pixels from the triggerReact, Vue, Angular
avoidCollisionsbooleantrueWhether to avoid collisions with viewport edgesReact, Vue, Angular
forceMountboolean-Force-mount the content even when closedReact, Vue
className / classstring-CSS class namesReact (className), Vue/Angular (class)

Vue

vue
<script setup lang="ts">
import { HoverCard, HoverCardTrigger, HoverCardContent } from '@/components/ui'
</script>

<template>
  <HoverCard>
    <HoverCardTrigger>Hover</HoverCardTrigger>
    <HoverCardContent>
      <div class="space-y-2">
        <h4 class="text-sm font-semibold">@nextjs</h4>
        <p class="text-sm">The React Framework – created and maintained by @vercel.</p>
      </div>
    </HoverCardContent>
  </HoverCard>
</template>

React

tsx
import { HoverCard, HoverCardTrigger, HoverCardContent } from '@/components/ui'

export default function HoverCardDemo() {
  return (
    <HoverCard>
      <HoverCardTrigger>Hover</HoverCardTrigger>
      <HoverCardContent>
        <div className="space-y-2">
          <h4 className="text-sm font-semibold">@nextjs</h4>
          <p className="text-sm">The React Framework – created and maintained by @vercel.</p>
        </div>
      </HoverCardContent>
    </HoverCard>
  )
}

Angular

typescript
import { Component } from '@angular/core';
import { HoverCardComponent } from '@/components/ui';

@Component({
  selector: 'app-hover-card-demo',
  standalone: true,
  imports: [HoverCardComponent],
  template: `
    <ui-hover-card>
      <span trigger>Hover</span>
      <div content class="space-y-2">
        <h4 class="text-sm font-semibold">@nextjs</h4>
        <p class="text-sm">The React Framework – created and maintained by @vercel.</p>
      </div>
    </ui-hover-card>
  `
})
export class HoverCardDemoComponent {}

Accessibility

  • Keyboard Navigation: [TODO]
  • Screen Reader: [TODO]
  • Focus Management: [TODO]
  • WCAG Compliance: WCAG 2.1 Level AA compliant

Author

Bùi Trọng Hiếu (kevinbui)

License

MIT © 2025 Bùi Trọng Hiếu (kevinbui)

Released under the MIT License.