liquefy-ui
uiglass-cardsource: ok · hit
GlassCard
A content card with eyebrow, title, description, body and footer slots on the liquid surface.
npx shadcn add "https://liquefy-ui.com/r/glass-card.json"free
Where it goes
footer
Visual style
glass-blur
Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.
Dependencies
Bundle weight · lightRegistry dependencies
https://liquefy-ui.com/r/liquefy-ui.jsonhttps://liquefy-ui.com/r/liquid-surface.json
Files1 · source cached 10/14/2026, 2:14:47 PM
registry/glass-card.tsx
'use client'
import { forwardRef, type ReactNode } from 'react'
import { LiquidSurface, type LiquidSurfaceProps } from '@/components/ui/liquid-surface'
// `title` is omitted alongside `children` because HTMLAttributes declares it as
// the tooltip attribute, i.e. a `string`. Intersecting that with `ReactNode`
// leaves `string`, so the heading below could never be given an element. Every
// component here that renders a `title` into an element omits it for this reason.
export type GlassCardProps = Omit<LiquidSurfaceProps, 'children' | 'title'> & {
children: ReactNode
description?: ReactNode
eyebrow?: ReactNode
footer?: ReactNode
title?: ReactNode
}
export const GlassCard = forwardRef<HTMLDivElement, GlassCardProps>(({
children,
className,
description,
eyebrow,
footer,
title,
...props
}, ref) => {
return (
<LiquidSurface className={['lq-card', className].filter(Boolean).join(' ')} ref={ref} {...props}>
{(eyebrow || title || description) && (
<header className="lq-card__header">
{eyebrow && <span className="lq-card__eyebrow">{eyebrow}</span>}
{title && <h3 className="lq-card__title">{title}</h3>}
{description && <p className="lq-card__description">{description}</p>}
</header>
)}
<div className="lq-card__body">{children}</div>
{footer && <footer className="lq-card__footer">{footer}</footer>}
</LiquidSurface>
)
})
GlassCard.displayName = 'GlassCard'