Skip to content

Popover

Displays rich content in a portal, triggered by a button.

Installation

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

Usage

API Reference

Props

PropTypeDefaultDescriptionFrameworks
openbooleanundefinedControlled open stateReact, Vue, Angular
defaultOpenbooleanfalseUncontrolled initial open stateAll
onOpenChange(open: boolean) => void-Called when open state changesReact, Vue, Angular
modalbooleanfalseWhether popover is modalAll
side'top' | 'bottom' | 'left' | 'right''bottom'Side to render popoverReact, Vue, Angular
sideOffsetnumber4Offset from sideReact, Vue, Angular
align'start' | 'center' | 'end''center'Alignment along sideReact, Vue, Angular
alignOffsetnumber0Offset from alignmentReact, Vue, Angular
avoidCollisionsbooleantrueWhether to avoid collisionsAll
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

Subcomponents

PopoverTrigger

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

PopoverContent

PropTypeDefaultDescriptionFrameworks
side'top' | 'bottom' | 'left' | 'right''bottom'Side to render contentReact, Vue, Angular
sideOffsetnumber4Offset from sideReact, Vue, Angular
align'start' | 'center' | 'end''center'Alignment along sideReact, Vue, Angular
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

Vue

vue
<script setup lang="ts">
import { Popover, PopoverTrigger, PopoverContent } from '@/components/ui'
</script>

<template>
  <Popover>
    <PopoverTrigger>Open</PopoverTrigger>
    <PopoverContent>
      <div class="space-y-2">
        <h4 class="font-medium">Dimensions</h4>
        <p class="text-sm">Set the dimensions for the layer.</p>
      </div>
    </PopoverContent>
  </Popover>
</template>

React

tsx
import { Popover, PopoverTrigger, PopoverContent } from '@/components/ui'

export default function PopoverDemo() {
  return (
    <Popover>
      <PopoverTrigger>Open</PopoverTrigger>
      <PopoverContent>
        <div className="space-y-2">
          <h4 className="font-medium">Dimensions</h4>
          <p className="text-sm">Set the dimensions for the layer.</p>
        </div>
      </PopoverContent>
    </Popover>
  )
}

Angular

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

@Component({
  selector: 'app-popover-demo',
  standalone: true,
  imports: [PopoverComponent],
  template: `
    <ui-popover>
      <button trigger>Open</button>
      <div content>
        <h4>Dimensions</h4>
        <p>Set the dimensions for the layer.</p>
      </div>
    </ui-popover>
  `
})
export class PopoverDemoComponent {}

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.