Link Preview
Displays a summarized preview of a linked content's details or information.
Overview
A component that lets users preview a link before they decide to follow it. This is useful for providing non-essential context or additional information about a link without having to navigate away from the current page.
A note about mobile devices!
This component is only intended to be used with a mouse or other pointing device. It doesn't respond to touch events, and the preview content cannot be accessed via the keyboard. On touch devices, the link will be followed immediately. As it is not accessible to all users, the preview should not contain vital information.
Structure
Managing Open State
Bits UI offers several approaches to manage and synchronize the Link Preview's open state, catering to different levels of control and integration needs.
1. Two-Way Binding
For seamless state synchronization, use Svelte's bind:open
directive. This method automatically keeps your local state in sync with the component's internal state.
Key Benefits
- Simplifies state management
- Automatically updates
isOpen
when the preview closes/opens (e.g., via escape key) - Allows external control (e.g., opening via a separate button)
2. Change Handler
For more granular control or to perform additional logic on state changes, use the onOpenChange
prop. This approach is useful when you need to execute custom logic alongside state updates.
Use Cases
- Implementing custom behaviors on open/close
- Integrating with external state management solutions
- Triggering side effects (e.g., logging, data fetching)
3. Fully Controlled
For complete control over the dialog's open state, use the controlledOpen
prop. This approach requires you to manually manage the open state, giving you full control over when and how the dialog responds to open/close events.
To implement controlled state:
- Set the
controlledOpen
prop totrue
on theLinkPreview.Root
component. - Provide an
open
prop toLinkPreview.Root
, which should be a variable holding the current state. - Implement an
onOpenChange
handler to update the state when the internal state changes.
When to Use
- Implementing complex open/close logic
- Coordinating multiple UI elements
- Debugging state-related issues
Note
While powerful, fully controlled state should be used judiciously as it increases complexity and can cause unexpected behaviors if not handled carefully.
For more in-depth information on controlled components and advanced state management techniques, refer to our Controlled State documentation.
Opt-out of Floating UI
When you use the LinkPreview.Content
component, Bits UI uses Floating UI to position the content relative to the trigger, similar to other popover-like components.
You can opt-out of this behavior by instead using the LinkPreview.ContentStatic
component. This component does not use Floating UI and leaves positioning the content entirely up to you.
Heads up!
The LinkPreview.Arrow
component is designed to be used with Floating UI and LinkPreview.Content
, so you may experience unexpected behavior if you attempt to use it with LinkPreview.ContentStatic
.
Custom Anchor
By default, the LinkPreview.Content
is anchored to the LinkPreview.Trigger
component, which determines where the content is positioned.
If you wish to instead anchor the content to a different element, you can pass either a selector string
or an HTMLElement
to the customAnchor
prop of the LinkPreview.Content
component.
Svelte Transitions
You can use the forceMount
prop along with the child
snippet to forcefully mount the LinkPreview.Content
component to use Svelte Transitions or another animation library that requires more control.
Of course, this isn't the prettiest syntax, so it's recommended to create your own reusable content component that handles this logic if you intend to use this approach. For more information on using transitions with Bits UI components, see the Transitions documentation.
API Reference
The root component used to manage the state of the state of the link preview.
Property | Type | Description |
---|---|---|
open $bindable | boolean | The open state of the link preview component. Default: false |
onOpenChange | function | A callback that fires when the open state changes. Default: undefined |
controlledOpen | boolean | Whether or not the open state is controlled or not. If Default: false |
openDelay | number | The amount of time in milliseconds to delay opening the preview when hovering over the trigger. Default: 700 |
closeDelay | number | The amount of time in milliseconds to delay closing the preview when the mouse leaves the trigger. Default: 300 |
disabled | boolean | Whether or not the link preview is disabled. Default: false |
ignoreNonKeyboardFocus | boolean | Whether the link preview should ignore non-keyboard focus. Default: false |
children | Snippet | The children content to render. Default: undefined |
A component which triggers the opening and closing of the link preview on hover or focus.
Property | Type | Description |
---|---|---|
ref $bindable | HTMLAnchorElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default: undefined |
children | Snippet | The children content to render. Default: undefined |
child | Snippet | Use render delegation to render your own element. See Child Snippet docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-state | enum | Whether the accordion item is open or closed. |
data-link-preview-trigger | '' | Present on the trigger element. |
The contents of the link preview which are displayed when the preview is open.
Property | Type | Description |
---|---|---|
side | enum | The preferred side of the anchor to render the floating element against when open. Will be reversed when collisions occur. Default: bottom |
sideOffset | number | The distance in pixels from the anchor to the floating element. Default: 0 |
align | enum | The preferred alignment of the anchor to render the floating element against when open. This may change when collisions occur. Default: start |
alignOffset | number | The distance in pixels from the anchor to the floating element. Default: 0 |
arrowPadding | number | The amount in pixels of virtual padding around the viewport edges to check for overflow which will cause a collision. Default: 0 |
avoidCollisions | boolean | When Default: true |
collisionBoundary | union | A boundary element or array of elements to check for collisions against. Default: undefined |
collisionPadding | union | The amount in pixels of virtual padding around the viewport edges to check for overflow which will cause a collision. Default: 0 |
sticky | enum | The sticky behavior on the align axis. Default: partial |
hideWhenDetached | boolean | When Default: true |
updatePositionStrategy | enum | The strategy to use when updating the position of the content. When Default: optimized |
strategy | enum | The positioning strategy to use for the floating element. When Default: fixed |
preventScroll | boolean | When Default: true |
customAnchor | union | Use an element other than the trigger to anchor the content to. If provided, the content will be anchored to the provided element instead of the trigger. Default: null |
onInteractOutside | function | Callback fired when an outside interaction event occurs, which is a Default: undefined |
onFocusOutside | function | Callback fired when focus leaves the dismissible layer. You can call Default: undefined |
interactOutsideBehavior | enum | The behavior to use when an interaction occurs outside of the floating content. Default: close |
onEscapeKeydown | function | Callback fired when an escape keydown event occurs in the floating content. You can call Default: undefined |
escapeKeydownBehavior | enum | The behavior to use when an escape keydown event occurs in the floating content. Default: close |
onOpenAutoFocus | function | Event handler called when auto-focusing the content as it is opened. Can be prevented. Default: undefined |
onCloseAutoFocus | function | Event handler called when auto-focusing the content as it is closed. Can be prevented. Default: undefined |
trapFocus | boolean | Whether or not to trap the focus within the content when open. Default: true |
dir | enum | The reading direction of the app. Default: ltr |
forceMount | boolean | Whether or not to forcefully mount the content. This is useful if you want to use Svelte transitions or another animation library for the content. Default: false |
ref $bindable | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default: undefined |
children | Snippet | The children content to render. Default: undefined |
child | Snippet | Use render delegation to render your own element. See Child Snippet docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-state | enum | Whether the accordion item is open or closed. |
data-link-preview-content | '' | Present on the content element. |
The contents of the link preview which are displayed when the preview is open. (Static/No Floating UI)
Property | Type | Description |
---|---|---|
onInteractOutside | function | Callback fired when an outside interaction event occurs, which is a Default: undefined |
onFocusOutside | function | Callback fired when focus leaves the dismissible layer. You can call Default: undefined |
interactOutsideBehavior | enum | The behavior to use when an interaction occurs outside of the floating content. Default: close |
onEscapeKeydown | function | Callback fired when an escape keydown event occurs in the floating content. You can call Default: undefined |
escapeKeydownBehavior | enum | The behavior to use when an escape keydown event occurs in the floating content. Default: close |
onOpenAutoFocus | function | Event handler called when auto-focusing the content as it is opened. Can be prevented. Default: undefined |
onCloseAutoFocus | function | Event handler called when auto-focusing the content as it is closed. Can be prevented. Default: undefined |
trapFocus | boolean | Whether or not to trap the focus within the content when open. Default: true |
dir | enum | The reading direction of the app. Default: ltr |
forceMount | boolean | Whether or not to forcefully mount the content. This is useful if you want to use Svelte transitions or another animation library for the content. Default: false |
ref $bindable | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default: undefined |
children | Snippet | The children content to render. Default: undefined |
child | Snippet | Use render delegation to render your own element. See Child Snippet docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-state | enum | Whether the accordion item is open or closed. |
data-link-preview-content | '' | Present on the content element. |
An optional arrow element which points to the trigger when the preview is open.
Property | Type | Description |
---|---|---|
width | number | The width of the arrow in pixels. Default: 8 |
height | number | The height of the arrow in pixels. Default: 8 |
ref $bindable | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default: undefined |
children | Snippet | The children content to render. Default: undefined |
child | Snippet | Use render delegation to render your own element. See Child Snippet docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-link-preview-arrow | '' | Present on the arrow element. |