Active projects
Three need a decision this week.
Sidebar, topbar, and hybrid application frames that reflow one AppNavigation tree through an accessible narrow drawer.
app/components/nitro_kit/app_shell.rbNitroKit::AppShell.new(id:, layout: :sidebar, skip_link_label:, open_navigation_label:, close_navigation_label:, navigation_dialog_label:) { |shell| shell.navigation { ... }; shell.main { ... } }All three layouts reflow the same AppNavigation tree while the application supplies brand, actions, routes, and main content.
Brand, navigation, and account actions share the desktop header before the same tree becomes a narrow drawer.
Topbar
A caller-owned dashboard composed from ordinary Nitro components.
Three need a decision this week.
All production checks are passing.
Both have an assigned responder.
test/dummy/app/components/gallery/components/app_shell_page.rbrender_workspace_shell(id: "gallery-app-shell-topbar", layout: :topbar, current: :projects)Persistent navigation and a sticky action row combine without a second navigation copy.
Hybrid
A caller-owned dashboard composed from ordinary Nitro components.
Three need a decision this week.
All production checks are passing.
Both have an assigned responder.
test/dummy/app/components/gallery/components/app_shell_page.rbrender_workspace_shell(id: "gallery-app-shell-hybrid", layout: :hybrid, current: :incidents, dense: true)Optional regions disappear cleanly while long destinations, nested content, and narrow disclosure keep the same contract.
Brand and topbar are optional; the required navigation and main regions still form a complete application frame.
Sidebar
A caller-owned dashboard composed from ordinary Nitro components.
Three need a decision this week.
All production checks are passing.
Both have an assigned responder.
test/dummy/app/components/gallery/components/app_shell_page.rbrender_workspace_shell(
id: "gallery-app-shell-minimal",
layout: :sidebar,
current: :overview,
brand: false,
actions: false
)Long brand, route, and content copy shrink inside the owned columns without a layout option or utility class.
Hybrid
Coordinate analytical engine capacity, operational handoffs, and incident readiness across every research and production region.
Three need a decision this week.
All production checks are passing.
Both have an assigned responder.
test/dummy/app/components/gallery/components/app_shell_page.rbrender_workspace_shell(
id: "gallery-app-shell-long",
layout: :hybrid,
current: :capacity,
long: true,
dense: true
)Constructor options, rendered root, closed vocabularies, and compound boundary for this component, exactly as shipped.
docs/component_contracts.md · NitroKit::AppShell
id:; layout: :sidebar; configurable skip/open/close/dialog labels defaulting to nitro_kit.app_shell.*div[data-nk=app-shell][data-layout]; layouts sidebar topbar hybrid; states open closed; data-enhanced is written by the Stimulus controller and reservednavigation and one main; optional brand and topbar are unique. Regions are declared inside the render block only. One navigation tree moves between its neutral desktop wrapper and a native modal dialog at narrow widths. IDs are fragment-safe; product policy remains caller-owned.Application conventions this component belongs to. Each summary is the leading section of its pattern document.
docs/patterns/application_foundation.md · docs/patterns/crud_resource.md
User, Team, and Membership; roles belong to memberships, and tenant-owned records load through Current.team.AppShell for the authenticated product and one application-owned content gutter inside shell.main.Toolbar; keep destinations in AppNavigation.Toast::FlashMessages region for server feedback.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.