Interactive
Hover and focus styles for clickable cards.
Frames a focused item, metric, plan, or form.
See it in context
For personal projects and prototypes.
A quieter surface for secondary content.
Hover and focus styles for clickable cards.
Copy a working example
---
import {
Button,
Card
} from '@santi020k/lumen-astro'
---
<div style="display: grid; gap: 0.75rem; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));">
<Card>
<h3>Starter</h3>
<p>For personal projects and prototypes.</p>
<Button size="sm">Choose plan</Button>
</Card>
<Card variant="muted">
<h3>Muted</h3>
<p>A quieter surface for secondary content.</p>
</Card>
<Card as="article" variant="interactive">
<h3>Interactive</h3>
<p>Hover and focus styles for clickable cards.</p>
</Card>
</div>---
import {
Button,
Card
} from '@santi020k/lumen-astro'
---
<div style="display: grid; gap: 0.75rem; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));">
<Card>
<h3>Starter</h3>
<p>For personal projects and prototypes.</p>
<Button size="sm">Choose plan</Button>
</Card>
<Card variant="muted">
<h3>Muted</h3>
<p>A quieter surface for secondary content.</p>
</Card>
<Card as="article" variant="interactive">
<h3>Interactive</h3>
<p>Hover and focus styles for clickable cards.</p>
</Card>
</div>import { Button, Card } from '@santi020k/lumen-react'
export const Example = () => (
<>
<div style={{ display: 'grid', gap: '0.75rem', gridTemplateColumns: 'repeat(auto-fit, minmax(14rem, 1fr))' }}>
<Card>
<h3>Starter</h3>
<p>For personal projects and prototypes.</p>
<Button size="sm">Choose plan</Button>
</Card>
<Card variant="muted">
<h3>Muted</h3>
<p>A quieter surface for secondary content.</p>
</Card>
<Card as="article" variant="interactive">
<h3>Interactive</h3>
<p>Hover and focus styles for clickable cards.</p>
</Card>
</div>
</>
)import { Button, Card } from '@santi020k/lumen-react'
export const Example = () => (
<>
<div style={{ display: 'grid', gap: '0.75rem', gridTemplateColumns: 'repeat(auto-fit, minmax(14rem, 1fr))' }}>
<Card>
<h3>Starter</h3>
<p>For personal projects and prototypes.</p>
<Button size="sm">Choose plan</Button>
</Card>
<Card variant="muted">
<h3>Muted</h3>
<p>A quieter surface for secondary content.</p>
</Card>
<Card as="article" variant="interactive">
<h3>Interactive</h3>
<p>Hover and focus styles for clickable cards.</p>
</Card>
</div>
</>
)<script type="module">
import { defineLumenElements } from '@santi020k/lumen-elements/define'
defineLumenElements()
</script>
<div style="display: grid; gap: 0.75rem; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));">
<lumen-card>
<h3>Starter</h3>
<p>For personal projects and prototypes.</p>
<lumen-button size="sm">Choose plan</lumen-button>
</lumen-card>
<lumen-card variant="muted">
<h3>Muted</h3>
<p>A quieter surface for secondary content.</p>
</lumen-card>
<lumen-card as="article" variant="interactive">
<h3>Interactive</h3>
<p>Hover and focus styles for clickable cards.</p>
</lumen-card>
</div><script type="module">
import { defineLumenElements } from '@santi020k/lumen-elements/define'
defineLumenElements()
</script>
<div style="display: grid; gap: 0.75rem; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));">
<lumen-card>
<h3>Starter</h3>
<p>For personal projects and prototypes.</p>
<lumen-button size="sm">Choose plan</lumen-button>
</lumen-card>
<lumen-card variant="muted">
<h3>Muted</h3>
<p>A quieter surface for secondary content.</p>
</lumen-card>
<lumen-card as="article" variant="interactive">
<h3>Interactive</h3>
<p>Hover and focus styles for clickable cards.</p>
</lumen-card>
</div>Choose your target
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 Cardlumen add Cardpnpm add @santi020k/lumen-reactpnpm add @santi020k/lumen-reactlumen add Card --target reactlumen add Card --target reactpnpm add @santi020k/lumen-elementspnpm add @santi020k/lumen-elementslumen add Card --target elementslumen add Card --target elementsAdd 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.
Every surface primitive with the liquid-glass treatment, themed by tokens.
---
import {
Badge,
Button,
Card
} from '@santi020k/lumen-astro'
---
<div class="docs-glass-demo" style="justify-items: center;">
<Card glass variant="interactive" style="max-width: 20rem; display: grid; gap: 0.6rem;">
<Badge variant="outline">Pro</Badge>
<h3 style="margin: 0;">$12 / month</h3>
<p style="margin: 0;">Every surface primitive with the liquid-glass treatment, themed by tokens.</p>
<Button size="sm">Choose plan</Button>
</Card>
</div>---
import {
Badge,
Button,
Card
} from '@santi020k/lumen-astro'
---
<div class="docs-glass-demo" style="justify-items: center;">
<Card glass variant="interactive" style="max-width: 20rem; display: grid; gap: 0.6rem;">
<Badge variant="outline">Pro</Badge>
<h3 style="margin: 0;">$12 / month</h3>
<p style="margin: 0;">Every surface primitive with the liquid-glass treatment, themed by tokens.</p>
<Button size="sm">Choose plan</Button>
</Card>
</div>import { Badge, Button, Card } from '@santi020k/lumen-react'
export const Example = () => (
<>
<div className="docs-glass-demo" style={{ justifyItems: 'center' }}>
<Card glass variant="interactive" style={{ maxWidth: '20rem', display: 'grid', gap: '0.6rem' }}>
<Badge variant="outline">Pro</Badge>
<h3 style={{ margin: '0' }}>$12 / month</h3>
<p style={{ margin: '0' }}>Every surface primitive with the liquid-glass treatment, themed by tokens.</p>
<Button size="sm">Choose plan</Button>
</Card>
</div>
</>
)import { Badge, Button, Card } from '@santi020k/lumen-react'
export const Example = () => (
<>
<div className="docs-glass-demo" style={{ justifyItems: 'center' }}>
<Card glass variant="interactive" style={{ maxWidth: '20rem', display: 'grid', gap: '0.6rem' }}>
<Badge variant="outline">Pro</Badge>
<h3 style={{ margin: '0' }}>$12 / month</h3>
<p style={{ margin: '0' }}>Every surface primitive with the liquid-glass treatment, themed by tokens.</p>
<Button size="sm">Choose plan</Button>
</Card>
</div>
</>
)<script type="module">
import { defineLumenElements } from '@santi020k/lumen-elements/define'
defineLumenElements()
</script>
<div class="docs-glass-demo" style="justify-items: center;">
<lumen-card glass variant="interactive" style="max-width: 20rem; display: grid; gap: 0.6rem;">
<lumen-badge variant="outline">Pro</lumen-badge>
<h3 style="margin: 0;">$12 / month</h3>
<p style="margin: 0;">Every surface primitive with the liquid-glass treatment, themed by tokens.</p>
<lumen-button size="sm">Choose plan</lumen-button>
</lumen-card>
</div><script type="module">
import { defineLumenElements } from '@santi020k/lumen-elements/define'
defineLumenElements()
</script>
<div class="docs-glass-demo" style="justify-items: center;">
<lumen-card glass variant="interactive" style="max-width: 20rem; display: grid; gap: 0.6rem;">
<lumen-badge variant="outline">Pro</lumen-badge>
<h3 style="margin: 0;">$12 / month</h3>
<p style="margin: 0;">Every surface primitive with the liquid-glass treatment, themed by tokens.</p>
<lumen-button size="sm">Choose plan</lumen-button>
</lumen-card>
</div>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. |
| as | "div" | "article" | "section" | "div" | Changes the rendered HTML element. |
| variant | "default" | "muted" | "interactive" | "glass" | "default" | Controls the card surface and affordance; variant="glass" is kept as a compatibility alias. |
| 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. |