Docs Components Overlays

Popover

React example follows below.
ts
const popoverFixture = {
id: "popover",
trigger: "ledger-api",
title: "ledger-api",
body: "Event-sourced payments ledger.",
side: "bottom",
align: "start",
} satisfies {
id: string;
trigger: string;
title: string;
body: string;
side: "top" | "bottom";
align: "start" | "end";
};
import { Popover } from "@grassroot/ui-react";
export default function PopoverDemo() {
return (
<div>
<Popover
trigger={popoverFixture.trigger}
side={popoverFixture.side}
align={popoverFixture.align}
>
<div className="px-1.5 py-1 font-semibold text-heading">{popoverFixture.title}</div>
<div className="px-1.5 pb-2 text-body">{popoverFixture.body}</div>
</Popover>
</div>
);
}
ts
<script setup lang="ts">
const popoverFixture = {
id: "popover",
trigger: "ledger-api",
title: "ledger-api",
body: "Event-sourced payments ledger.",
side: "bottom",
align: "start",
} satisfies {
id: string;
trigger: string;
title: string;
body: string;
side: "top" | "bottom";
align: "start" | "end";
};
import { Popover } from "@grassroot/ui-vue";
</script>
<template>
<div>
<Popover :side="popoverFixture.side" :align="popoverFixture.align">
<template #trigger>{{ popoverFixture.trigger }}</template>
<div class="px-1.5 py-1 font-semibold text-heading">{{ popoverFixture.title }}</div>
<div class="px-1.5 pb-2 text-body">{{ popoverFixture.body }}</div>
</Popover>
</div>
</template>
ts
import { Component } from "@angular/core";
const popoverFixture = {
id: "popover",
trigger: "ledger-api",
title: "ledger-api",
body: "Event-sourced payments ledger.",
side: "bottom",
align: "start",
} satisfies {
id: string;
trigger: string;
title: string;
body: string;
side: "top" | "bottom";
align: "start" | "end";
};
import { GrassrootPopover } from "@grassroot/ui-angular";
@Component({
selector: "app-popover-demo",
standalone: true,
imports: [GrassrootPopover],
template: `
<div>
<grassroot-popover [side]="fixture.side" [align]="fixture.align">
<ng-container ngProjectAs="[trigger]">{{ fixture.trigger }}</ng-container>
<div class="px-1.5 py-1 font-semibold text-heading">{{ fixture.title }}</div>
<div class="px-1.5 pb-2 text-body">{{ fixture.body }}</div>
</grassroot-popover>
</div>
`,
})
export class PopoverDemoComponent {
protected readonly fixture = popoverFixture;
}
export default PopoverDemoComponent;
ts
<script lang="ts">
import { Popover } from "@grassroot/ui-svelte";
const popoverFixture = {
id: "popover",
trigger: "ledger-api",
title: "ledger-api",
body: "Event-sourced payments ledger.",
side: "bottom",
align: "start",
} satisfies {
id: string;
trigger: string;
title: string;
body: string;
side: "top" | "bottom";
align: "start" | "end";
};
</script>
{#snippet trigger()}{popoverFixture.trigger}{/snippet}
{#snippet children()}<div class="px-1.5 py-1 font-semibold text-heading">
{popoverFixture.title}
</div>
<div class="px-1.5 pb-2 text-body">{popoverFixture.body}</div>{/snippet}
<div>
<Popover side={popoverFixture.side} align={popoverFixture.align} {trigger} {children} />
</div>
ts
/** @jsxImportSource solid-js */
import { Popover } from "@grassroot/ui-solid";
const popoverFixture = {
id: "popover",
trigger: "ledger-api",
title: "ledger-api",
body: "Event-sourced payments ledger.",
side: "bottom",
align: "start",
} satisfies {
id: string;
trigger: string;
title: string;
body: string;
side: "top" | "bottom";
align: "start" | "end";
};
export default function PopoverDemo() {
return (
<div>
<Popover
trigger={popoverFixture.trigger}
side={popoverFixture.side}
align={popoverFixture.align}
>
<div class="px-1.5 py-1 font-semibold text-heading">{popoverFixture.title}</div>
<div class="px-1.5 pb-2 text-body">{popoverFixture.body}</div>
</Popover>
</div>
);
}

Installation

API Reference

Import

import { Popover } from "@grassroot/ui-react";

Props

Prop
Type
Default
Requirement
Description
side
"top" | "bottom" | undefined
"bottom"
optional
—
align
"start" | "end" | undefined
"start" (left)
optional
Horizontal edge the panel anchors to.
defaultOpen
boolean | undefined
—
optional
—
className
string | undefined
—
optional
—
contentClassName
string | undefined
—
optional
—
triggerClassName
string | undefined
—
optional
Override the trigger button styling (e.g.
Prop
side
Type
"top" | "bottom" | undefined
Default
"bottom"
Requirement
optional
Description
—
Prop
align
Type
"start" | "end" | undefined
Default
"start" (left)
Requirement
optional
Description
Horizontal edge the panel anchors to.
Prop
defaultOpen
Type
boolean | undefined
Default
—
Requirement
optional
Description
—
Prop
className
Type
string | undefined
Default
—
Requirement
optional
Description
—
Prop
contentClassName
Type
string | undefined
Default
—
Requirement
optional
Description
—
Prop
triggerClassName
Type
string | undefined
Default
—
Requirement
optional
Description
Override the trigger button styling (e.g.

Content regions

  • children
  • trigger

Import

import { Popover } from "@grassroot/ui-vue";

Props

Prop
Type
Default
Requirement
side
"top" | "bottom"
"bottom"
optional
align
"start" | "end"
"start"
optional
defaultOpen
boolean
false
optional
contentClassName
string | undefined
undefined
optional
triggerClassName
string | undefined
undefined
optional
Prop
side
Type
"top" | "bottom"
Default
"bottom"
Requirement
optional
Prop
align
Type
"start" | "end"
Default
"start"
Requirement
optional
Prop
defaultOpen
Type
boolean
Default
false
Requirement
optional
Prop
contentClassName
Type
string | undefined
Default
undefined
Requirement
optional
Prop
triggerClassName
Type
string | undefined
Default
undefined
Requirement
optional

Content regions

  • default
  • trigger

Import

import { Component } from "@angular/core";
import { GrassrootPopover } from "@grassroot/ui-angular";

Props

Prop
Type
Default
Requirement
side
"top" | "bottom"
"bottom"
optional
align
"start" | "end"
"start"
optional
defaultOpen
boolean
false
optional
contentClassName
string | undefined
undefined
optional
triggerClassName
string | undefined
undefined
optional
Prop
side
Type
"top" | "bottom"
Default
"bottom"
Requirement
optional
Prop
align
Type
"start" | "end"
Default
"start"
Requirement
optional
Prop
defaultOpen
Type
boolean
Default
false
Requirement
optional
Prop
contentClassName
Type
string | undefined
Default
undefined
Requirement
optional
Prop
triggerClassName
Type
string | undefined
Default
undefined
Requirement
optional

Content regions

  • default
  • trigger

Import

import { Popover } from "@grassroot/ui-svelte";

Props

Prop
Type
Default
Requirement
side
"top" | "bottom"
"bottom"
optional
align
"start" | "end"
"start"
optional
defaultOpen
boolean
false
optional
className
string
—
optional
contentClassName
string
—
optional
triggerClassName
string
—
optional
Prop
side
Type
"top" | "bottom"
Default
"bottom"
Requirement
optional
Prop
align
Type
"start" | "end"
Default
"start"
Requirement
optional
Prop
defaultOpen
Type
boolean
Default
false
Requirement
optional
Prop
className
Type
string
Default
—
Requirement
optional
Prop
contentClassName
Type
string
Default
—
Requirement
optional
Prop
triggerClassName
Type
string
Default
—
Requirement
optional

Content regions

  • children
  • trigger

Import

import { Popover } from "@grassroot/ui-solid";

Props

Prop
Type
Default
Requirement
side
"top" | "bottom"
"bottom"
optional
align
"start" | "end"
"start"
optional
defaultOpen
boolean
—
optional
className
string
—
optional
contentClassName
string
—
optional
triggerClassName
string
—
optional
Prop
side
Type
"top" | "bottom"
Default
"bottom"
Requirement
optional
Prop
align
Type
"start" | "end"
Default
"start"
Requirement
optional
Prop
defaultOpen
Type
boolean
Default
—
Requirement
optional
Prop
className
Type
string
Default
—
Requirement
optional
Prop
contentClassName
Type
string
Default
—
Requirement
optional
Prop
triggerClassName
Type
string
Default
—
Requirement
optional

Content regions

  • children
  • trigger