Skip to content
Nitro Kitv2.0.0.beta.3

Search gallery…

IntroductionGalleryAgent guideGalleryHuman guideGalleryColorsFoundations · ThemeTypographyFoundations · ThemeSpacing & sizingFoundations · ThemeEffectsFoundations · ThemeButtonComponents · ActionsButton groupComponents · ActionsButton toComponents · ActionsAppearance pickerComponents · FormsCheckboxComponents · FormsCheckbox groupComponents · FormsComboboxComponents · FormsControl groupComponents · FormsDropzoneComponents · FormsFieldComponents · FormsField groupComponents · FormsFieldsetComponents · FormsInputComponents · FormsLabelComponents · FormsRadio buttonComponents · FormsRadio button groupComponents · FormsRich text areaComponents · FormsSelectComponents · FormsSwitchComponents · FormsTextareaComponents · FormsCommand paletteComponents · OverlaysDialogComponents · OverlaysDropdownComponents · OverlaysSheetComponents · OverlaysTooltipComponents · OverlaysAlertComponents · FeedbackEmpty stateComponents · FeedbackToastComponents · FeedbackAccordionComponents · Data displayAvatarComponents · Data displayAvatar stackComponents · Data displayBadgeComponents · Data displayDetails tableComponents · Data displayIconComponents · Data displayProgressive imageComponents · Data displayStat gridComponents · Data displayTableComponents · Data displayTypesetComponents · Data displayPaginationComponents · NavigationPagination barComponents · NavigationTabsComponents · NavigationToolbarComponents · NavigationCardComponents · LayoutContainerComponents · LayoutFlexComponents · LayoutGridComponents · LayoutApplication navigationComponents · ApplicationApplication shellComponents · ApplicationAuthentication shellComponents · ApplicationDanger zoneComponents · ApplicationData sectionComponents · ApplicationForm sectionComponents · ApplicationPage headerComponents · ApplicationSettings layoutComponents · ApplicationSign inCompositions · Access & onboardingPassword resetCompositions · Access & onboardingEmail verificationCompositions · Access & onboardingInvitation acceptanceCompositions · Access & onboardingAccount creationCompositions · Access & onboardingAccount securityCompositions · Access & onboardingWorkspace onboardingCompositions · Access & onboardingBranched onboardingCompositions · Access & onboardingWorkspace dashboardCompositions · Workspace & organizationWorkspace settingsCompositions · Workspace & organizationAccount workspaceCompositions · Workspace & organizationWorkspace usersCompositions · Workspace & organizationTeam managementCompositions · Workspace & organizationAPI credentialsCompositions · Workspace & organizationOrganization overviewCompositions · Workspace & organizationOrganization settingsCompositions · Workspace & organizationTeam activityCompositions · Workspace & organizationTeam memberCompositions · Workspace & organizationSubscription billingCompositions · Billing & commerceCheckout and paymentCompositions · Billing & commerceCheckout resultsCompositions · Billing & commerceData resource overviewCompositions · Data & operationsData resource activityCompositions · Data & operationsData resource settingsCompositions · Data & operationsProduct resource lifecycleCompositions · Data & operationsAPI webhooksCompositions · Data & operationsIntegration managementCompositions · Data & operationsFile uploadsCompositions · Data & operationsActivity and audit logCompositions · Data & operationsChangelogCompositions · Product & supportHelp centerCompositions · Product & supportSystem status and errorsCompositions · Product & supportProduct landingCompositions · MarketingPublic pricingCompositions · MarketingProduct featuresCompositions · MarketingPublic contactCompositions · MarketingSidebar operations applicationCompositions · Complete applicationsTopbar media applicationCompositions · Complete applicationsStress labCompositions · Quality

No destinations found.

  • Introduction
  • Agent guide
  • Human guide
  • Foundations
    • Colors
    • Typography
    • Spacing & sizing
    • Effects
  • Actions
    • Button
    • Button group
    • Button to
  • Forms
    • Appearance picker
    • Checkbox
    • Checkbox group
    • Combobox
    • Control group
    • Dropzone
    • Field
    • Field group
    • Fieldset
    • Input
    • Label
    • Radio button
    • Radio button group
    • Rich text area
    • Select
    • Switch
    • Textarea
  • Overlays
    • Command palette
    • Dialog
    • Dropdown
    • Sheet
    • Tooltip
  • Feedback
    • Alert
    • Empty state
    • Toast
  • Data display
    • Accordion
    • Avatar
    • Avatar stack
    • Badge
    • Details table
    • Icon
    • Progressive image
    • Stat grid
    • Table
    • Typeset
  • Navigation
    • Pagination
    • Pagination bar
    • Tabs
    • Toolbar
  • Layout
    • Card
    • Container
    • Flex
    • Grid
  • Application
    • Application navigation
    • Application shell
    • Authentication shell
    • Danger zone
    • Data section
    • Form section
    • Page header
    • Settings layout
  • Access & onboarding
    • Sign in
    • Password reset
    • Email verification
    • Invitation acceptance
    • Account creation
    • Account security
    • Workspace onboarding
    • Branched onboarding
  • Workspace & organization
    • Workspace dashboard
    • Workspace settings
    • Account workspace
    • Workspace users
    • Team management
    • API credentials
    • Organization overview
    • Organization settings
    • Team activity
    • Team member
  • Billing & commerce
    • Subscription billing
    • Checkout and payment
    • Checkout results
  • Data & operations
    • Data resource overview
    • Data resource activity
    • Data resource settings
    • Product resource lifecycle
    • API webhooks
    • Integration management
    • File uploads
    • Activity and audit log
  • Product & support
    • Changelog
    • Help center
    • System status and errors
  • Marketing
    • Product landing
    • Public pricing
    • Product features
    • Public contact
  • Complete applications
    • Sidebar operations application
    • Topbar media application
  • Quality
    • Stress lab

Card

A compound surface with typed title, body, divider, and footer slots.

Source
app/components/nitro_kit/card.rb
API
NitroKit::Card.new(size: :md, variant: :default) { |card| card.header { card.title; card.description; card.actions }; card.body; card.footer }

Overview

A card groups related content on one surface. Title, description, body, and footer are all optional; use the ones the content needs.

Simple

Delete this project?

Its exports and activity history are removed permanently. This can’t be undone.

Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
render NitroKit::Card.new(id: "gallery-card-simple") do |card|
  card.title("Delete this project?", level: 3)
  card.description("Its exports and activity history are removed permanently. This can’t be undone.")
  card.footer do
    render NitroKit::Button.new("Delete project", variant: :destructive, size: :sm)
    render NitroKit::Button.new("Cancel", size: :sm)
  end
end

Header, body, and footer

Profile

This is how others see you around the workspace.



Last saved 2 minutes ago
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
render NitroKit::Card.new(id: "gallery-card-profile") do |card|
  card.header do
    card.title("Profile", level: 3)
    card.description("This is how others see you around the workspace.")
    card.actions do
      render NitroKit::Dropdown.new(id: "gallery-card-profile-menu", placement: :bottom_end) do |menu|
        menu.trigger(icon: :ellipsis, label: "Profile actions", size: :sm)
        menu.item("Copy profile link", icon: :link)
        menu.item("Reset to defaults", icon: :rotate_ccw)
      end
    end
  end
  card.divider
  card.body do
    form(id: "gallery-card-profile-form", action: "#profile", method: "post") do
      render NitroKit::FieldGroup.new do
        render NitroKit::Field.new(
          nil,
          :name,
          id: "gallery-card-profile-name",
          name: "profile[name]",
          value: "Ada Lovelace",
          label: "Name",
          autocomplete: "name",
          required: true,
          html: { id: "gallery-card-profile-name-field" }
        )
        render NitroKit::Field.new(
          nil,
          :bio,
          as: :textarea,
          id: "gallery-card-profile-bio",
          name: "profile[bio]",
          label: "Bio",
          placeholder: "A few words about yourself",
          rows: 3,
          html: { id: "gallery-card-profile-bio-field" }
        )
      end
    end
  end
  card.divider
  card.footer do
    plain "Last saved 2 minutes ago"
    card.actions do
      render NitroKit::Button.new("Cancel", type: :reset, form: "gallery-card-profile-form", size: :sm)
      render NitroKit::Button.new(
        "Save",
        id: "gallery-card-profile-save",
        type: :submit,
        form: "gallery-card-profile-form",
        variant: :primary,
        size: :sm
      )
    end
  end
end

Sizes

Size coordinates padding, spacing, corner radius, and title size. Small suits dense widgets, medium most records, and large roomy forms.

Every size

sm

Weekly report


Tight, for small widgets and stats.
md

Weekly report


The default, for most content.
lg

Weekly report


Roomy, for forms and settings.
ViewportFull width
Rubytest/dummy/app/components/gallery/components/card_page.rb
{
  sm: "Tight, for small widgets and stats.",
  md: "The default, for most content.",
  lg: "Roomy, for forms and settings."
}.each do |size, text|
  sample(size.to_s, slug: "size-#{size}") do
    render NitroKit::Card.new(size:) do |card|
      card.header do
        card.title("Weekly report", level: 3)
        card.actions { render NitroKit::Button.new("Edit", size: :sm) }
      end
      card.divider
      card.body(text)
    end
  end
end

Surfaces

Default is raised for primary content. Muted is a quiet tint for secondary panels, and outline keeps only the edge over whatever is behind it.

Every surface

default

Default

Raised, for primary content.

muted

Muted

A quieter tint for secondary panels.

outline

Outline

Just an edge over the surrounding surface.

ViewportFull width
Rubytest/dummy/app/components/gallery/components/card_page.rb
{
  default: "Raised, for primary content.",
  muted: "A quieter tint for secondary panels.",
  outline: "Just an edge over the surrounding surface."
}.each do |variant, text|
  sample(variant.to_s, slug: "surface-#{variant}") do
    render NitroKit::Card.new(size: :sm, variant:) do |card|
      card.title(variant.to_s.capitalize, level: 3)
      card.description(text)
    end
  end
end

Sizes on every surface

sm · default

Workspace

12 active members · Team plan


Renews August 1
sm · outline

Workspace

12 active members · Team plan


Renews August 1
sm · muted

Workspace

12 active members · Team plan


Renews August 1
md · default

Workspace

12 active members · Team plan


Renews August 1
md · outline

Workspace

12 active members · Team plan


Renews August 1
md · muted

Workspace

12 active members · Team plan


Renews August 1
lg · default

Workspace

12 active members · Team plan


Renews August 1
lg · outline

Workspace

12 active members · Team plan


Renews August 1
lg · muted

Workspace

12 active members · Team plan


Renews August 1
ViewportFull width
Rubytest/dummy/app/components/gallery/components/card_page.rb
NitroKit::Card::SIZES.product(NitroKit::Card::VARIANTS).each do |size, variant|
  sample("#{size} · #{variant}", slug: "#{size}-#{variant}") do
    render NitroKit::Card.new(size:, variant:) do |card|
      card.header do
        card.title("Workspace", level: 3)
        card.description("12 active members · Team plan")
      end
      card.divider
      card.footer do
        plain "Renews August 1"
        card.actions { render NitroKit::Button.new("Manage", size: :sm) }
      end
    end
  end
end

Sections

Dividers split a card into sections. A header or footer set apart by a divider becomes a band with even spacing above and below its content.

Settings list

Security

Keep your account protected.


Password

Last changed 3 months ago


Two-factor authentication

A code from your authenticator app at sign in

On
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
render NitroKit::Card.new(id: "gallery-card-security") do |card|
  card.header do
    card.title("Security", level: 3)
    card.description("Keep your account protected.")
  end
  card.divider
  card.header do
    card.title("Password", level: 4)
    card.description("Last changed 3 months ago")
    card.actions { render NitroKit::Button.new("Change", size: :sm) }
  end
  card.divider
  card.header do
    card.title("Two-factor authentication", level: 4)
    card.description("A code from your authenticator app at sign in")
    card.actions { render NitroKit::Badge.new("On", color: :success, size: :sm) }
  end
end

Notifications form

sm

Notifications

Choose what you hear about.


md

Notifications

Choose what you hear about.


lg

Notifications

Choose what you hear about.


ViewportFull width
Rubytest/dummy/app/components/gallery/components/card_page.rb
NitroKit::Card::SIZES.each do |size|
  sample(size.to_s, slug: "form-#{size}") do
    form_id = "gallery-card-preferences-#{size}"
    render NitroKit::Card.new(size:) do |card|
      card.header do
        card.title("Notifications", level: 3)
        card.description("Choose what you hear about.")
      end
      card.body do
        form(id: form_id, action: "#preferences", method: "get") do
          render NitroKit::FieldGroup.new do
            render NitroKit::Switch.new(label: "Product updates", name: "updates", checked: true)
            render NitroKit::Switch.new(label: "Weekly digest", name: "digest")
            render NitroKit::Switch.new(label: "Security alerts", name: "security", checked: true)
          end
        end
      end
      card.divider
      card.footer do
        card.actions do
          render NitroKit::Button.new("Reset", type: :reset, form: form_id, size: :sm)
          render NitroKit::Button.new("Save", variant: :primary, type: :submit, form: form_id, size: :sm)
        end
      end
    end
  end
end

Full-width content

Full regions bleed to the card's edges and take its corner radius where they touch one. Only the region clips, so menus and tooltips can still escape the card.

Media

sm
Layered green hills beneath a warm sun

Morning hike

September 12 · 8.4 km

md
Layered green hills beneath a warm sun

Morning hike

September 12 · 8.4 km

lg
Layered green hills beneath a warm sun

Morning hike

September 12 · 8.4 km

ViewportFull width
Rubytest/dummy/app/components/gallery/components/card_page.rb
NitroKit::Card::SIZES.each do |size|
  sample(size.to_s, slug: "media-#{size}") do
    render NitroKit::Card.new(size:) do |card|
      card.full do
        img(src: "/gallery/card-landscape.svg", alt: "Layered green hills beneath a warm sun", width: 800, height: 360)
      end
      card.header do
        card.title("Morning hike", level: 3)
        card.description("September 12 · 8.4 km")
        card.actions { render NitroKit::Button.new(icon: :heart, label: "Save hike", size: :sm) }
      end
    end
  end
end

Table

Past transactions

Transactions this week
MerchantCategoryAmount
Blue Bottle CoffeeDining−$6.50
FigmaSoftware−$15.00
Client paymentIncome+$2,400.00
Showing the last 7 days
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
render NitroKit::Card.new(id: "gallery-card-transactions") do |card|
  card.header do
    card.title("Past transactions", level: 3)
    card.actions { render NitroKit::Button.new("Export", icon: :download, size: :sm) }
  end
  card.full do
    render NitroKit::Table.new do |table|
      table.caption("Transactions this week")
      table.thead do
        table.tr do
          table.th("Merchant")
          table.th("Category")
          table.th("Amount", align: :right)
        end
      end
      table.tbody do
        [
          [ "Blue Bottle Coffee", "Dining", "−$6.50" ],
          [ "Figma", "Software", "−$15.00" ],
          [ "Client payment", "Income", "+$2,400.00" ]
        ].each do |merchant, category, amount|
          table.tr do
            table.th(merchant, scope: :row)
            table.td(category)
            table.td(amount, align: :right)
          end
        end
      end
    end
  end
  card.footer("Showing the last 7 days")
end

Media only

Layered green hills beneath a warm sun
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
render NitroKit::Container.new(size: :sm) do
  render NitroKit::Card.new(id: "gallery-card-media-only") do |card|
    card.full do
      img(src: "/gallery/card-landscape.svg", alt: "Layered green hills beneath a warm sun", width: 800, height: 360)
    end
  end
end

Composition

Cards hold ordinary Nitro components. Parents own the width and the layout of a collection.

Related resources

Heading

Create hierarchical section headings for pages and panels.

Table

Display structured data with sorting and row actions.

Field

Pair inputs with labels, descriptions, and errors.

ViewportFull width
Rubytest/dummy/app/components/gallery/components/card_page.rb
render NitroKit::Grid.new(cols: "1 sm:2 lg:3", gap: 4) do
  [
    [ "Heading", "Create hierarchical section headings for pages and panels." ],
    [ "Table", "Display structured data with sorting and row actions." ],
    [ "Field", "Pair inputs with labels, descriptions, and errors." ]
  ].each do |title, text|
    render NitroKit::Card.new(size: :sm) do |card|
      card.header do
        card.title(title, level: 3)
        card.description(text)
        card.actions { render NitroKit::Button.new(icon: :arrow_up_right, label: "Open #{title}", href: "#", size: :sm) }
      end
    end
  end
end

Integration detail

Slack

Post alerts to the team operations channel.

Action required
ConnectedApril 18, 2026 11:45
Delivery targetTeam operations channel

Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
integration = Gallery::Data.integrations.fetch(1)

render NitroKit::Card.new(id: "gallery-card-integration") do |card|
  card.header do
    card.title(integration.name, level: 3)
    card.description(integration.description)
    card.actions do
      render NitroKit::Badge.new(
        "Action required",
        id: "gallery-card-integration-status",
        color: :warning,
        size: :sm
      )
    end
  end
  card.body do
    render NitroKit::DetailsTable.new(
      integration,
      id: "gallery-card-integration-details",
      label: "Slack integration details"
    ) do |details|
      details.field(:connected_at, label: "Connected")
      details.field(:delivery_target, label: "Delivery target", value: "Team operations channel")
    end
  end
  card.divider
  card.footer do
    render NitroKit::ButtonGroup.new(
      id: "gallery-card-integration-actions",
      label: "Slack integration actions"
    ) do |group|
      group.button(
        "Reconnect",
        id: "gallery-card-integration-reconnect",
        variant: :primary,
        size: :sm,
        icon: :refresh_cw
      )
      group.button(
        "Disconnect",
        id: "gallery-card-integration-disconnect",
        variant: :destructive,
        size: :sm
      )
    end
  end
end

Footer action states

ready

Workspace access

Changes apply to all workspace members.


saving

Workspace access

Changes apply to all workspace members.


read only

Workspace access

Changes apply to all workspace members.


ViewportFull width
Rubytest/dummy/app/components/gallery/components/card_page.rb
[ :ready, :saving, :read_only ].each do |state|
  sample(state.to_s.tr("_", " "), slug: "footer-#{state}") do
    render NitroKit::Card.new(size: :sm, variant: :outline) do |card|
      card.title("Workspace access", level: 3)
      card.description("Changes apply to all workspace members.")
      card.divider
      card.footer do
        card.actions do
          render NitroKit::Button.new("Cancel", size: :sm, disabled: state == :saving)
          render NitroKit::Button.new("Save", variant: :primary, size: :sm, loading: state == :saving, disabled: state == :read_only)
        end
      end
    end
  end
end

Heading levels

The title slot emits the requested semantic heading level from one through six without changing its size.

Complete title scale

Heading level 1

Level 1 title

Card titles follow the surrounding document hierarchy.

Heading level 2

Level 2 title

Card titles follow the surrounding document hierarchy.

Heading level 3

Level 3 title

Card titles follow the surrounding document hierarchy.

Heading level 4

Level 4 title

Card titles follow the surrounding document hierarchy.

Heading level 5
Level 5 title

Card titles follow the surrounding document hierarchy.

Heading level 6
Level 6 title

Card titles follow the surrounding document hierarchy.

Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
(1..6).each do |level|
  sample("Heading level #{level}", slug: "heading-#{level}") do
    render NitroKit::Card.new(id: "gallery-card-heading-#{level}", size: :sm) do |card|
      card.title("Level #{level} title", level:)
      card.description("Card titles follow the surrounding document hierarchy.")
    end
  end
end

Slot boundaries

Individual slots and useful partial structures remain valid without placeholder content.

Partial structures

Empty surface
Title only

A title without supporting content

Footer only
Last synchronized July 13, 2026
Body and footer
Three pending invitations
Review access before the next billing cycle
Header with actions only

Invitations

Full-width only
A full-width region can be the only declared slot.
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
sample("Empty surface", slug: "empty") do
  render NitroKit::Card.new(id: "gallery-card-empty") { nil }
end
sample("Title only", slug: "title-only") do
  render NitroKit::Card.new(id: "gallery-card-title-only") do |card|
    card.title("A title without supporting content", level: 3)
  end
end
sample("Footer only", slug: "footer-only") do
  render NitroKit::Card.new(id: "gallery-card-footer-only") do |card|
    card.footer("Last synchronized July 13, 2026")
  end
end
sample("Body and footer", slug: "body-footer") do
  render NitroKit::Card.new(id: "gallery-card-body-footer") do |card|
    card.body("Three pending invitations")
    card.footer("Review access before the next billing cycle")
  end
end
sample("Header with actions only", slug: "header-actions") do
  render NitroKit::Card.new(id: "gallery-card-header-actions") do |card|
    card.header do
      card.title("Invitations", level: 3)
      card.actions { render NitroKit::Button.new("Invite", size: :sm) }
    end
  end
end
sample("Full-width only", slug: "full-only") do
  render NitroKit::Card.new(id: "gallery-card-full-only") do |card|
    card.full { card.body("A full-width region can be the only declared slot.") }
  end
end

Under pressure

A card titled with a hundred-character name, carrying an unbroken-word badge, four paragraphs of pasted prose, a webhook URL and a 130-character email as links, and all twelve hostile actions in its footer; then an unbroken title in a small container.

Hostile size and surface matrix

sm · default
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
sm · outline
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
sm · muted
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
md · default
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
md · outline
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
md · muted
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
lg · default
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
lg · outline
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
lg · muted
Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
NitroKit::Card::SIZES.product(NitroKit::Card::VARIANTS).each do |size, variant|
  sample("#{size} · #{variant}", slug: "hostile-#{size}-#{variant}") do
    render NitroKit::Card.new(size:, variant:) do |card|
      card.full { Gallery::Hostile::LONG_WORD }
      card.header do
        card.title(Gallery::Hostile::LONG_NAME, level: 3)
        card.description(Gallery::Hostile::LONG_WORD)
        card.actions { render NitroKit::Button.new(Gallery::Hostile::ACTION_LABELS.first, size: :sm) }
      end
      card.body(Gallery::Hostile::LONG_EMAIL)
      card.divider
      card.footer do
        plain Gallery::Hostile::LONG_URL
        card.actions { render NitroKit::Button.new(Gallery::Hostile::ACTION_LABELS.last, size: :sm) }
      end
    end
  end
end

Hostile record card

Dr. Maximiliana Wolfeschlegelsteinhausenbergerdorff-Featherstonehaugh von Hohenzollern-Sigmaringen III

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

This description keeps going well past the point where a sensible product would have stopped, because real customers paste release notes, legal disclaimers, and entire support tickets into fields that were designed for a single line of text. This description keeps going well past the point where a sensible product would have stopped, because real customers paste release notes, legal disclaimers, and entire support tickets into fields that were designed for a single line of text. This description keeps going well past the point where a sensible product would have stopped, because real customers paste release notes, legal disclaimers, and entire support tickets into fields that were designed for a single line of text. This description keeps going well past the point where a sensible product would have stopped, because real customers paste release notes, legal disclaimers, and entire support tickets into fields that were designed for a single line of text.

https://enterprise-holdings-international.example/workspaces/analytical-engines-research-and-production/settings/integrations/webhooks/deliveries/whd_01J8ZK3Q9W7RX2M5N6P8T4V1Y0/attempts/3?include=headers,body,response&expand=endpoint.owner

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example


Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
render NitroKit::Card.new(id: "gallery-card-hostile") do |card|
  card.title(Gallery::Hostile::LONG_NAME, level: 3)
  card.body do
    render NitroKit::Badge.new(
      Gallery::Hostile::LONG_WORD,
      id: "gallery-card-hostile-status",
      color: :warning,
      size: :sm
    )
    p { Gallery::Hostile::LONG_PARAGRAPH }
    p { a(href: Gallery::Hostile::LONG_URL) { Gallery::Hostile::LONG_URL } }
    p { a(href: "mailto:#{Gallery::Hostile::LONG_EMAIL}") { Gallery::Hostile::LONG_EMAIL } }
  end
  card.divider
  card.footer do
    render NitroKit::ButtonGroup.new(id: "gallery-card-hostile-actions", label: "Hostile record actions") do |group|
      Gallery::Hostile::ACTION_LABELS.each_with_index do |label, index|
        group.button(label, id: "gallery-card-hostile-action-#{index + 1}", size: :sm)
      end
    end
  end
end

Hostile title in a small container

Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepflege

maximiliana.wolfeschlegelsteinhausenbergerdorff+billing.notifications.eu-west-2026@finance.department.enterprise-holdings-international.example
$9,999,999,999,999.99
Viewport640 px · sm
Rubytest/dummy/app/components/gallery/components/card_page.rb
render NitroKit::Container.new(size: :sm, id: "gallery-card-hostile-narrow-container") do
  render NitroKit::Card.new(id: "gallery-card-hostile-narrow") do |card|
    card.title(Gallery::Hostile::LONG_WORD, level: 3)
    card.body(Gallery::Hostile::LONG_EMAIL)
    card.footer(Gallery::Hostile::HUGE_MONEY)
  end
end

Component contract

Constructor options, rendered root, closed vocabularies, and compound boundary for this component, exactly as shipped.

docs/component_contracts.md · NitroKit::Card

Constructor-specific options
  • size: :md, variant: :default, id: nil
Root and closed vocabulary
article[data-nk=card][data-size][data-variant]; sizes sm md lg; variants default muted outline; title levels 1..6
Compound contract
Requires a content block. header, title, description, actions, body, footer, divider, and full render immediately; their count and order are not constrained. title, description, body, and footer require non-blank text or a block; header, actions, and full require a block. header lays out a title and description beside trailing actions; actions inside a footer push to its end. The shadowed Phlex elements remain available as html_title, html_body, html_header, and html_footer. Sizes coordinate padding, gaps, corners, and title size. See Card sizing and surfaces below.

Relevant patterns

Application conventions this component belongs to. Each summary is the leading section of its pattern document.

docs/patterns/inline_edit.md

Inline edit

  • Wrap the complete resource region in one stable Turbo Frame.
  • Show, edit, validation failure, success, and Cancel return the same frame ID.
  • Invalid updates render with 422; successful updates redirect with 303.
  • Use a Turbo Stream only when the update changes another region too. if editing render UI::ProjectForm.new(project) else div do h2 { project.name } render NitroKit::Button.new("Edit", href: edit_project_path(project)) end end

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, and data: for application data. class and style are forbidden, including inside html:.
  • 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 through data:. data-action, data-controller are 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 with data-nk-escape="class".
  • Every root emits data-nk; owned parts emit component-qualified data-slot values such as field-control or card-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::Flex and NitroKit::Grid for 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-state when styling or behavior also needs it.