Button
Native buttons and links with typed variants, sizes, and icons.
- Source
app/components/nitro_kit/button.rb- API
NitroKit::Button.new(text, variant:, size:, icon:, submission_indicator:)
Component contract
Constructor options, rendered root, closed vocabularies, and compound boundary for this component, exactly as shipped.
docs/component_contracts.md · NitroKit::Button
- Constructor-specific options
- optional text or block
href: nil,variant: :default,size: :md,icon: nil,icon_end: nil,label: nil,id: nil,type: :button,name: nil,value: nil,form: nil,target: nil,rel: nil,download: nil,disabled: false,loading: false,submission_indicator: nil
- Root and closed vocabulary
- native
buttonora[data-nk=button]; variantsdefault primary destructive ghost; sizesxs sm md lg xl; typesbutton submit reset - Compound contract
- Requires text, a block, or an icon.
defaultis the ordinary action treatment;ghostis reserved for deliberately low-emphasis interface chrome, not routine secondary actions. Icon-only buttons requirelabel:,aria: { label: }, oraria: { labelledby: };label:andaria: { label: }are the same attribute and collide.icon_end:matches thebutton-icon-endslot. Blank text, treatment vocabularies, and link/button option mixing raise on construction; text-plus-block and the icon-only accessible name raise at render because only render time knows whether a block supplies the label.type:applies to native buttons only and raises when combined withhref:.loading: truedisables the control, setsaria-busy="true", and replaces the leading icon with thebutton-spinnerslot. Disabled links losehref, receivearia-disabled, and leave the tab order.submission_indicator: :spinnerapplies only to native submit Buttons, cannot combine withloading:, and renders thebutton-submission-spinnerslot thatnk--buttonreveals during a slow Turbo submission.
System rules for coding agents
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
View agent instructions
- Nitro Kit 2.0 is a gem-owned, Phlex-only UI system for Rails. Render components directly:
render NitroKit::Button.new("Save", variant: :primary). - Compose Nitro components inside application-owned Phlex classes. Public initializers and declared slots are the component API; private methods are not.
- Public options are explicit keywords, and enumerated options are closed vocabularies. Invalid names or values raise
ArgumentError; this component's accepted options are in the contract above. - Pass native attributes through their typed boundary:
html:for HTML,aria:for ARIA, anddata:for application data.classandstyleare forbidden, including insidehtml:. - Nitro owns
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 throughdata:.data-action,data-controllerare additive and compose with Nitro behavior. - If an integration truly requires a class, use
desperately_need_a_class:. It requires a non-blank String and marks the exception withdata-nk-escape="class". - Every root emits
data-nk; owned parts emit component-qualifieddata-slotvalues such asfield-controlorcard-title. Select on those attributes, never on classes. - Customize components with documented
--nk-*custom properties in an application stylesheet. Variables beginning with--_nk-*are private component mechanics. - Use
NitroKit::FlexandNitroKit::Gridfor layout. Parents own external placement and available width; components own their intrinsic geometry. - Preserve native elements and accessibility semantics. State is exposed through native semantics and ARIA first, and through
data-statewhen styling or behavior also needs it.