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:)

Variants

Every visual intent uses the same native button contract.

Variant matrix

Default
Primary
Destructive
Ghost
ViewportFull width
Rubytest/dummy/app/components/gallery/components/button_page.rb
Gallery::Data.button_variants.each do |button|
  sample(button.label, slug: button.slug) do
    render_button(button, id: "gallery-button-variant-#{button.slug}")
  end
end

Sizes

Five closed sizes cover compact controls through high-emphasis calls to action.

Size scale

Extra small
Small
Medium
Large
Extra large
ViewportFull width
Rubytest/dummy/app/components/gallery/components/button_page.rb
Gallery::Data.button_sizes.each do |button|
  sample(button.label, slug: button.slug) do
    render_button(button, id: "gallery-button-size-#{button.slug}")
  end
end

Content modes

Text, leading and trailing icons, icon-only controls, links, and block labels stay explicit.

Content combinations

Leading icon
Trailing icon
Icon only
Link
Block label
Long label
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/button_page.rb
sample("Leading icon", slug: "leading-icon") do
  render NitroKit::Button.new(
    "Save report",
    id: "gallery-button-leading-icon",
    icon: :save,
    variant: :primary
  )
end
sample("Trailing icon", slug: "trailing-icon") do
  render NitroKit::Button.new(
    "Continue",
    id: "gallery-button-trailing-icon",
    icon_right: :arrow_right
  )
end
sample("Icon only", slug: "icon-only") do
  render NitroKit::Button.new(
    id: "gallery-button-icon-only",
    icon: :x,
    variant: :ghost,
    aria: { label: "Close notification" }
  )
end
sample("Link", slug: "link") do
  render NitroKit::Button.new(
    "Read documentation",
    id: "gallery-button-link",
    href: "#button-documentation",
    icon_right: :arrow_right
  )
end
sample("Block label", slug: "block-label") do
  render NitroKit::Button.new(id: "gallery-button-block-label") do
    "Label supplied by a Phlex block"
  end
end
sample("Long label", slug: "long-label") do
  render NitroKit::Button.new(
    "Download the complete workspace activity archive",
    id: "gallery-button-long-label",
    icon: :download
  )
end

Native states

Disabled controls retain visible state while links lose navigation and expose ARIA disabled.

Enabled and disabled

Available linkUnavailable link
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/button_page.rb
render NitroKit::Button.new(
  "Submit invoice",
  id: "gallery-button-submit",
  type: :submit,
  variant: :primary
)
render NitroKit::Button.new(
  "Delete workspace",
  id: "gallery-button-disabled",
  variant: :destructive,
  disabled: true
)
render NitroKit::Button.new(
  "Available link",
  id: "gallery-button-link-enabled",
  href: "#button-enabled"
)
render NitroKit::Button.new(
  "Unavailable link",
  id: "gallery-button-link-disabled",
  href: "#button-disabled",
  disabled: true
)