Corex. Tooltip
(Corex v0.1.0-rc.0)
View Source
Phoenix implementation of Zag.js Tooltip.
Anatomy
Minimal
<.tooltip class="tooltip" show_arrow={false}>
<:trigger>Hover me</:trigger>
<:content>Tooltip content</:content>
</.tooltip>With arrow
<.tooltip class="tooltip">
<:trigger>Hover me</:trigger>
<:content>Tooltip content</:content>
</.tooltip>Placement
<.tooltip class="tooltip" positioning={%Corex.Positioning{placement: "bottom"}}>
<:trigger>Bottom</:trigger>
<:content>Tooltip below</:content>
</.tooltip>API
Requires a stable id on <.tooltip>.
| Function | Action | Returns |
|---|---|---|
set_open/2 | Set open state (client) | %Phoenix.LiveView.JS{} |
set_open/3 | Set open state (server) | socket |
Events
Pick an event name and pass it to on_* on <.tooltip>.
Server events
| Event | When | Payload |
|---|---|---|
on_open_change="tooltip_open_changed" | Open state changes | %{"id" => id, "open" => boolean} |
on_trigger_value_change="tooltip_trigger_changed" | Active trigger changes (multi-trigger) | %{"id" => id, "value" => value} |
on_open_change
<.tooltip class="tooltip" on_open_change="tooltip_open_changed">
<:trigger>Hover me</:trigger>
<:content>Tooltip content</:content>
</.tooltip>def handle_event("tooltip_open_changed", %{"id" => _id, "open" => open}, socket) do
{:noreply, assign(socket, :tooltip_open, open)}
endClient events
| Event | When | event.detail |
|---|---|---|
on_open_change_client="tooltip-open-changed" | Open state changes | id, open |
on_trigger_value_change_client="tooltip-trigger-changed" | Active trigger changes | id, value |
Patterns
Multi-trigger
One content panel, several triggers. Each trigger value must be unique.
<.tooltip
class="tooltip"
on_trigger_value_change="tooltip_trigger_changed"
>
<:trigger value="a">First</:trigger>
<:trigger value="b">Second</:trigger>
<:content>Active: {@active_trigger}</:content>
</.tooltip>def handle_event("tooltip_trigger_changed", %{"value" => value}, socket) do
{:noreply, assign(socket, :active_trigger, value)}
endStyle
Target parts with data-scope and data-part, or use Corex Design: import tokens and tooltip.css, then set class="tooltip" on <.tooltip>.
[data-scope="tooltip"][data-part="trigger"] {}
[data-scope="tooltip"][data-part="positioner"] {}
[data-scope="tooltip"][data-part="content"] {}
[data-scope="tooltip"][data-part="arrow"] {}@import "../corex/main.css";
@import "../corex/tokens/themes/neo/light.css";
@import "../corex/components/tooltip.css";Stack modifiers on the host (class on <.tooltip>).
Color
| Modifier | Classes |
|---|---|
| Default | tooltip |
| Accent | tooltip tooltip--accent |
| Brand | tooltip tooltip--brand |
| Alert | tooltip tooltip--alert |
| Info | tooltip tooltip--info |
| Success | tooltip tooltip--success |
Size
| Modifier | Classes |
|---|---|
| SM | tooltip tooltip--sm |
| MD | tooltip tooltip--md |
| LG | tooltip tooltip--lg |
| XL | tooltip tooltip--xl |
Text
| Modifier | Classes |
|---|---|
| SM | tooltip tooltip--text-sm |
| XL | tooltip tooltip--text-xl |
Summary
Components
Attributes
id(:string) - The id of the tooltip, useful for API to identify the tooltip.disabled(:boolean) - Whether the tooltip is disabled. Defaults tofalse.dir(:string) - The direction of the tooltip. When nil, derived from document. Defaults tonil. Must be one ofnil,"ltr", or"rtl".orientation(:string) - Layout orientation for CSS. Defaults to"horizontal". Must be one of"horizontal", or"vertical".open_delay(:integer) - Delay in ms before opening. Default from Zag is 400. Defaults to0.close_delay(:integer) - Delay in ms before closing. Default from Zag is 150. Defaults to0.positioning(Corex.Positioning) - Positioning options for the floating content. Defaults to%Corex.Positioning{hide_when_detached: true, strategy: "fixed", placement: "bottom", gutter: 8, shift: 0, overflow_padding: 0, arrow_padding: 4, flip: true, slide: true, overlap: false, same_width: false, fit_viewport: true, offset: nil}.close_on_escape(:boolean) - Whether to close on Escape. Default true. Defaults totrue.close_on_click(:boolean) - Whether to close on click. Default true. Defaults totrue.close_on_pointer_down(:boolean) - Whether to close on pointer down on the trigger. Default false. Defaults tofalse.close_on_scroll(:boolean) - Whether to close on scroll. Default false. Defaults tofalse.interactive(:boolean) - Whether the tooltip content is interactive (stays open when hovering content). Defaults totrue.on_open_change(:string) - The server event name when the open state changes. Defaults tonil.on_open_change_client(:string) - The client event name when the open state changes. Defaults tonil.on_trigger_value_change(:string) - LiveView event when the active trigger value changes (multi-trigger). Params include id (tooltip root) and value (trigger value string). Defaults tonil.on_trigger_value_change_client(:string) - The client event name when the active trigger value changes. Defaults tonil.show_arrow(:boolean) - Whether to show an arrow pointing to the trigger. Defaults totrue.trigger_tag(:atom) - Use :span when the tooltip sits inside another button-like control (e.g. tree view row) to avoid nested <button> elements. Defaults to:button. Must be one of:button, or:span.- Global attributes are accepted.
Slots
trigger(required) - Trigger element content. Use :let={tooltip} for assigns such as disabled. With more than one <:trigger>, each must set value="…" (unique, stable across LiveView patches). Accepts attributes:class(:string)value(:string)
content(required) - Tooltip content. Use :let={tooltip} for assigns such as disabled. Accepts attributes:class(:string)
API
Set tooltip open state from a control (phx-click).
<.action phx-click={Corex.Tooltip.set_open("my-tooltip", true)}>Show</.action>
<.tooltip id="my-tooltip" class="tooltip">
<:trigger>Target</:trigger>
<:content>Hint</:content>
</.tooltip>document.getElementById("my-tooltip")?.dispatchEvent(
new CustomEvent("corex:tooltip:set-open", {
bubbles: false,
detail: { open: true },
})
);
Set open state from handle_event.
<.action phx-click="show_tip">Show</.action>
<.tooltip id="my-tooltip" class="tooltip">
<:trigger>Target</:trigger>
<:content>Hint</:content>
</.tooltip>def handle_event("show_tip", _, socket) do
{:noreply, Corex.Tooltip.set_open(socket, "my-tooltip", true)}
end