The Preview Card component displays a popup with rich content when hovering over or focusing on a trigger element. It’s perfect for showing user profiles, link previews, or additional context.
Basic Usage
import reflex_ui as ui
ui.preview_card(
trigger=ui.link("@username"),
content=rx.vstack(
rx.text("John Doe", font_weight="600"),
rx.text("Software Engineer", font_size="0.875rem", color="gray.600"),
spacing="0.25rem"
)
)
User Profile Preview
ui.preview_card(
trigger=rx.hstack(
ui.gradient_profile(seed="user123", class_name="size-8"),
rx.text("@johndoe"),
spacing="0.5rem"
),
content=rx.vstack(
rx.hstack(
ui.gradient_profile(seed="user123", class_name="size-16"),
rx.vstack(
rx.text("John Doe", font_weight="600", font_size="1.125rem"),
rx.text("@johndoe", color="gray.600", font_size="0.875rem"),
align_items="flex-start",
spacing="0.125rem"
),
spacing="0.75rem"
),
rx.text(
"Building amazing web apps with Reflex. Love Python and open source.",
font_size="0.875rem",
line_height="1.5"
),
rx.hstack(
rx.text("1.2K", font_weight="600"),
rx.text("Followers", color="gray.600", font_size="0.875rem"),
rx.text("•", color="gray.400"),
rx.text("432", font_weight="600"),
rx.text("Following", color="gray.600", font_size="0.875rem"),
spacing="0.5rem"
),
align_items="flex-start",
spacing="1rem",
width="100%"
),
delay=600
)
Link Preview
ui.preview_card(
trigger=ui.link("reflex.dev", show_icon=True),
content=rx.vstack(
rx.image(
src="https://reflex.dev/og.png",
width="100%",
height="120px",
object_fit="cover",
border_radius="0.5rem"
),
rx.text("Reflex", font_weight="600"),
rx.text(
"Build web apps in pure Python",
font_size="0.875rem",
color="gray.600"
),
align_items="flex-start",
spacing="0.75rem",
width="100%"
)
)
Component Structure
For more control, use the component parts:
ui.preview_card.root(
ui.preview_card.trigger(
render_=ui.link("Hover me")
),
ui.preview_card.portal(
ui.preview_card.positioner(
ui.preview_card.popup(
rx.text("Preview content here"),
# Your preview content
),
side="top",
align="center"
)
),
delay=600,
close_delay=300
)
Props Reference
Root Props
Whether the preview card is currently open (controlled)
Whether the preview card is initially open (uncontrolled)
Event handler called when the preview card is opened or closed
How long to wait before the preview card opens in milliseconds
How long to wait before closing the preview card in milliseconds
High-Level Props
The component that triggers the preview card on hover
The content to display in the preview card popup
Positioning Props
side
Literal['bottom', 'inline-end', 'inline-start', 'left', 'right', 'top']
default:"bottom"
Which side of the trigger to display the preview card
align
Literal['start', 'center', 'end']
default:"center"
How to align the popup relative to the trigger
Distance between the trigger and the popup in pixels
Whether to maintain the popup in the viewport after scrolling
Styling
From source code at reflex_ui/components/base/preview_card.py:18-27:
- Popup has rounded corners, border, shadow, and smooth transitions
- Minimum width of 16rem (256px)
- Padding of 0.75rem
- Scale and opacity animations on open/close
- Smooth transform origin transitions
Common Patterns
Repository Card
ui.preview_card(
trigger=ui.link("awesome-project"),
content=rx.vstack(
rx.text("awesome-project", font_weight="600"),
rx.text(
"A collection of awesome things",
font_size="0.875rem",
color="gray.600"
),
rx.hstack(
ui.badge("Python", color="blue", size="xs"),
rx.text("⭐ 1.2k", font_size="0.875rem"),
rx.text("🍴 234", font_size="0.875rem"),
spacing="0.75rem"
),
align_items="flex-start",
spacing="0.75rem",
width="100%"
)
)
Implementation Details
From source code at reflex_ui/components/base/preview_card.py:199-257:
- High-level API automatically creates all subcomponents
- Opens on hover with configurable delay
- Closes after mouse leaves with close delay
- Smooth animations for better UX
- Portal support for proper layering
- Automatic collision detection and repositioning