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.