Documentation
OverlaysGlass surface
Popover
Displays lightweight floating content from a trigger.
01
See it in context
Preview
02
Copy a working example
Usage
---
import {
Button,
Field,
Input,
Label,
Popover
} from '@santi020k/lumen-astro'
---
<Popover>
<Button variant="outline" data-ui-trigger>Invite teammates</Button>
<div style="display: grid; gap: 0.75rem;">
<Field>
<Label for="ex-invite">Email address</Label>
<Input id="ex-invite" type="email" placeholder="teammate@example.com" />
</Field>
<Button size="sm">Send invite</Button>
</div>
</Popover>---
import {
Button,
Field,
Input,
Label,
Popover
} from '@santi020k/lumen-astro'
---
<Popover>
<Button variant="outline" data-ui-trigger>Invite teammates</Button>
<div style="display: grid; gap: 0.75rem;">
<Field>
<Label for="ex-invite">Email address</Label>
<Input id="ex-invite" type="email" placeholder="teammate@example.com" />
</Field>
<Button size="sm">Send invite</Button>
</div>
</Popover>import { Button, Field, Input, Label, Popover } from '@santi020k/lumen-react'
export const Example = () => (
<>
<Popover>
<Button variant="outline" data-ui-trigger>Invite teammates</Button>
<div style={{ display: 'grid', gap: '0.75rem' }}>
<Field>
<Label htmlFor="ex-invite">Email address</Label>
<Input id="ex-invite" type="email" placeholder="teammate@example.com" />
</Field>
<Button size="sm">Send invite</Button>
</div>
</Popover>
</>
)import { Button, Field, Input, Label, Popover } from '@santi020k/lumen-react'
export const Example = () => (
<>
<Popover>
<Button variant="outline" data-ui-trigger>Invite teammates</Button>
<div style={{ display: 'grid', gap: '0.75rem' }}>
<Field>
<Label htmlFor="ex-invite">Email address</Label>
<Input id="ex-invite" type="email" placeholder="teammate@example.com" />
</Field>
<Button size="sm">Send invite</Button>
</div>
</Popover>
</>
)<script type="module">
import { defineLumenElements } from '@santi020k/lumen-elements/define'
defineLumenElements()
</script>
<lumen-popover>
<lumen-button variant="outline" data-ui-trigger>Invite teammates</lumen-button>
<div style="display: grid; gap: 0.75rem;">
<lumen-field>
<lumen-label for="ex-invite">Email address</lumen-label>
<lumen-input id="ex-invite" type="email" placeholder="teammate@example.com"></lumen-input>
</lumen-field>
<lumen-button size="sm">Send invite</lumen-button>
</div>
</lumen-popover><script type="module">
import { defineLumenElements } from '@santi020k/lumen-elements/define'
defineLumenElements()
</script>
<lumen-popover>
<lumen-button variant="outline" data-ui-trigger>Invite teammates</lumen-button>
<div style="display: grid; gap: 0.75rem;">
<lumen-field>
<lumen-label for="ex-invite">Email address</lumen-label>
<lumen-input id="ex-invite" type="email" placeholder="teammate@example.com"></lumen-input>
</lumen-field>
<lumen-button size="sm">Send invite</lumen-button>
</div>
</lumen-popover>03
Choose your target
Add this component
Choose the package for your runtime. All adapters share the Lumen stylesheet. Use the matching registry command when you want a local wrapper for that framework.
pnpm add @santi020k/lumen-astropnpm add @santi020k/lumen-astrolumen add Popoverlumen add Popoverpnpm add @santi020k/lumen-reactpnpm add @santi020k/lumen-reactlumen add Popover --target reactlumen add Popover --target reactpnpm add @santi020k/lumen-elementspnpm add @santi020k/lumen-elementslumen add Popover --target elementslumen add Popover --target elementsGlass
Add the glass prop to apply the shared blur, saturation, border, and highlight tokens. Glass reads best over vivid content, so place the surface above imagery or color.
---
import {
Button,
Field,
Input,
Label,
Popover
} from '@santi020k/lumen-astro'
---
<div class="docs-glass-demo docs-glass-demo--float">
<Popover glass>
<Button data-ui-trigger>Open glass popover</Button>
<div style="display: grid; gap: 0.75rem;">
<Field>
<Label for="ex-invite-glass">Email address</Label>
<Input id="ex-invite-glass" type="email" placeholder="teammate@example.com" />
</Field>
<Button size="sm">Send invite</Button>
</div>
</Popover>
</div>---
import {
Button,
Field,
Input,
Label,
Popover
} from '@santi020k/lumen-astro'
---
<div class="docs-glass-demo docs-glass-demo--float">
<Popover glass>
<Button data-ui-trigger>Open glass popover</Button>
<div style="display: grid; gap: 0.75rem;">
<Field>
<Label for="ex-invite-glass">Email address</Label>
<Input id="ex-invite-glass" type="email" placeholder="teammate@example.com" />
</Field>
<Button size="sm">Send invite</Button>
</div>
</Popover>
</div>import { Button, Field, Input, Label, Popover } from '@santi020k/lumen-react'
export const Example = () => (
<>
<div className="docs-glass-demo docs-glass-demo--float">
<Popover glass>
<Button data-ui-trigger>Open glass popover</Button>
<div style={{ display: 'grid', gap: '0.75rem' }}>
<Field>
<Label htmlFor="ex-invite-glass">Email address</Label>
<Input id="ex-invite-glass" type="email" placeholder="teammate@example.com" />
</Field>
<Button size="sm">Send invite</Button>
</div>
</Popover>
</div>
</>
)import { Button, Field, Input, Label, Popover } from '@santi020k/lumen-react'
export const Example = () => (
<>
<div className="docs-glass-demo docs-glass-demo--float">
<Popover glass>
<Button data-ui-trigger>Open glass popover</Button>
<div style={{ display: 'grid', gap: '0.75rem' }}>
<Field>
<Label htmlFor="ex-invite-glass">Email address</Label>
<Input id="ex-invite-glass" type="email" placeholder="teammate@example.com" />
</Field>
<Button size="sm">Send invite</Button>
</div>
</Popover>
</div>
</>
)<script type="module">
import { defineLumenElements } from '@santi020k/lumen-elements/define'
defineLumenElements()
</script>
<div class="docs-glass-demo docs-glass-demo--float">
<lumen-popover glass>
<lumen-button data-ui-trigger>Open glass popover</lumen-button>
<div style="display: grid; gap: 0.75rem;">
<lumen-field>
<lumen-label for="ex-invite-glass">Email address</lumen-label>
<lumen-input id="ex-invite-glass" type="email" placeholder="teammate@example.com"></lumen-input>
</lumen-field>
<lumen-button size="sm">Send invite</lumen-button>
</div>
</lumen-popover>
</div><script type="module">
import { defineLumenElements } from '@santi020k/lumen-elements/define'
defineLumenElements()
</script>
<div class="docs-glass-demo docs-glass-demo--float">
<lumen-popover glass>
<lumen-button data-ui-trigger>Open glass popover</lumen-button>
<div style="display: grid; gap: 0.75rem;">
<lumen-field>
<lumen-label for="ex-invite-glass">Email address</lumen-label>
<lumen-input id="ex-invite-glass" type="email" placeholder="teammate@example.com"></lumen-input>
</lumen-field>
<lumen-button size="sm">Send invite</lumen-button>
</div>
</lumen-popover>
</div>API reference
Lumen-specific props and runtime attributes for the Astro primitive. React props follow the same names; Elements use equivalent kebab-case attributes where custom elements expose them.
| Attribute | Values | Default | Description |
|---|---|---|---|
| glass | boolean | "subtle" | "strong" | false | Applies the tokenized liquid-glass surface treatment with backdrop-filter fallbacks; "subtle" and "strong" adjust the fill intensity. |
| surface | "default" | "glass" | "default" | Deprecated alias for glass; surface="glass" maps to glass={true}. |
| data-ui-trigger | boolean attribute | - | Marks the child trigger that opens and closes the adjacent disclosure panel. |
| class, className | string | "" | Merges custom classes with the generated ui-* root classes. |
| ...native attributes | HTML attributes | - | Forwards standard attributes to the root element unless the component consumes them. |