Production credential
nk_live_7P3F… was last used today at 08:31 UTC.
Contextual descriptions for Buttons, links, mutation forms, and compound focusable triggers.
app/components/nitro_kit/tooltip.rbNitroKit::Tooltip.new(id:, content:) { |tooltip| tooltip.trigger }CSS exposes each description on hover and focus; a tiny controller only adds Escape dismissal.
test/dummy/app/components/gallery/components/tooltip_page.rbNitroKit::Tooltip::PLACEMENTS.each do |placement|
sample(placement.to_s.humanize, slug: placement.to_s) do
render_tip(
"gallery-tooltip-#{placement}",
"This explanation opens on the #{placement} edge.",
placement:
)
end
endTooltip owns a real Button trigger, including icon-only accessible actions.
A contextual explanation composes beside a sensitive setting without wrapping a raw focus target.
nk_live_7P3F… was last used today at 08:31 UTC.
test/dummy/app/components/gallery/components/tooltip_page.rbrender NitroKit::Card.new(id: "gallery-tooltip-api-card") do |card|
card.title("Production credential", level: 3)
card.body do
render NitroKit::Badge.new(
"Read and write",
id: "gallery-tooltip-api-access",
color: :warning,
size: :sm
)
p { "nk_live_7P3F… was last used today at 08:31 UTC." }
end
card.footer do
render NitroKit::Tooltip.new(
id: "gallery-tooltip-rotate-key",
content: "Rotation immediately reveals a new secret once."
) do |tooltip|
tooltip.trigger("How rotation works")
end
render NitroKit::Button.new(
"Rotate credential",
id: "gallery-tooltip-rotate-action",
variant: :destructive
)
end
endLinks use the Button path directly; mutation forms and compound triggers receive Tooltip-owned attributes explicitly.
test/dummy/app/components/gallery/components/tooltip_page.rbsample("Link", slug: "link") do
render NitroKit::Tooltip.new(
id: "gallery-tooltip-link",
content: "Read the deployment runbook in a new tab."
) do |tooltip|
tooltip.trigger("Deployment runbook", href: "#runbook", icon_end: :external_link)
end
end
sample("Rails mutation", slug: "button-to") do
render NitroKit::Tooltip.new(
id: "gallery-tooltip-button-to",
content: "Revoking the token immediately rejects new requests."
) do |tooltip|
tooltip.trigger(as: :custom) do |attributes|
render NitroKit::ButtonTo.new(
"Revoke token",
href: "#revoke-token",
method: :delete,
variant: :destructive,
button_html: attributes.html,
button_aria: attributes.aria,
button_data: attributes.data
)
end
end
end
sample("Dialog trigger", slug: "dialog") do
render NitroKit::Tooltip.new(
id: "gallery-tooltip-dialog",
content: "Review release details before publishing."
) do |tooltip|
tooltip.trigger(as: :custom) do |attributes|
render NitroKit::Dialog.new(id: "gallery-tooltip-release-dialog") do |dialog|
dialog.trigger(
"Review release",
html: attributes.html,
aria: attributes.aria,
data: attributes.data
)
dialog.panel(title: "Publish release 2.0?") do
dialog.close_button(label: "Keep as draft")
end
end
end
end
endConstructor options, rendered root, closed vocabularies, and compound boundary for this component, exactly as shipped.
docs/component_contracts.md · NitroKit::Tooltip
id:, content:placement: :topspan[data-nk=tooltip]; placements top right bottom leftas: NitroKit::Button path supports native buttons and links; Button options on any other trigger raise. as: :div and :span create explicit focusable HTML descriptions. as: :custom yields TriggerAttributes(html:, aria:, data:); applications must forward all three boundaries to the actual focusable control, including ButtonTo's nested Button or a Dialog trigger. Nitro appends the tooltip ID to existing aria-describedby. CSS owns hover/focus visibility; the controller's document-level Escape listener dismisses only while the tooltip is shown, so a wrapping dialog's cancel is not swallowed.Instructions for coding agents, repeated on every component page so one fetched page has enough context. Humans can usually skip this section.
test/dummy/app/components/gallery/agent_rules.rb
render NitroKit::Button.new("Save", variant: :primary).ArgumentError; this component's accepted options are in the contract above.html: for HTML, aria: for ARIA, and data: for application data. class and style are forbidden, including inside html:.NitroKit::Component::RESERVED_DATA_ATTRIBUTES: data-nk, data-slot, data-variant, data-size, data-nk-escape, data-enhanced, data-state, data-disabled, data-required, data-orientation, data-presentation, data-placement, data-layout, data-side, data-field-type, data-dir, data-gap, data-align, data-justify, data-wrap, data-cols, data-mode, data-key. Do not pass them through data:. data-action, data-controller are additive and compose with Nitro behavior.desperately_need_a_class:. It requires a non-blank String and marks the exception with data-nk-escape="class".data-nk; owned parts emit component-qualified data-slot values such as field-control or card-title. Select on those attributes, never on classes.--nk-* custom properties in an application stylesheet. Variables beginning with --_nk-* are private component mechanics.NitroKit::Flex and NitroKit::Grid for layout. Parents own external placement and available width; components own their intrinsic geometry.data-state when styling or behavior also needs it.