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