Layout
Layout composes application shells with header, sider, content, and footer regions.
@duskmoon-dev/components/layout Usage
When to use
- Use it to build predictable page, toolbar, panel, or grid structure.
- Keep layout primitives responsible for geometry and let child components own behavior.
Implementation notes
Features
Documents spacing, responsive behavior, and nested regions used to build larger screens.
Examples keep predictable dimensions so the surrounding UI does not jump while content changes.
Layout is most often configured through `hasSider`, `collapsible`, `collapsed`, `defaultCollapsed`.
Renders root and static sections with quiet classes
Feature Demos
Feature demos are authored for the component page, then supplemented with behavior scenarios from the component test coverage.
Basic usage
Import the component stylesheet and Layout from its package subpath, then render it with the core props.
import "@duskmoon-dev/components/styles.css";
import { Layout } from "@duskmoon-dev/components/layout";
export function Example() {
return (<Layout style={{ width: "100%", maxWidth: 640 }}>
<Layout.Header>Header</Layout.Header>
<Layout hasSider>
<Layout.Sider width={160}>Sider</Layout.Sider>
<Layout.Content>Content</Layout.Content>
</Layout>
<Layout.Footer>Footer</Layout.Footer>
</Layout>);
} Renders root and static sections with quiet classes
test-backedLayout scenario from the component test coverage: renders root and static sections with quiet classes.
import "@duskmoon-dev/components/styles.css";
import { Layout } from "@duskmoon-dev/components/layout";
export function LayoutRendersRootAndStaticDemo() {
return (<Layout style={{ width: "100%", maxWidth: 640 }}>
<Layout.Header>Header</Layout.Header>
<Layout hasSider>
<Layout.Sider width={160}>Sider</Layout.Sider>
<Layout.Content>Content</Layout.Content>
</Layout>
<Layout.Footer>Footer</Layout.Footer>
</Layout>);
} Passes native div props and style through root
test-backedLayout scenario from the component test coverage: passes native div props and style through root.
import "@duskmoon-dev/components/styles.css";
import { Layout } from "@duskmoon-dev/components/layout";
export function LayoutPassesNativeDivPropsDemo() {
return (<Layout style={{ width: "100%", maxWidth: 640 }}>
<Layout.Header>Header</Layout.Header>
<Layout hasSider>
<Layout.Sider width={160}>Sider</Layout.Sider>
<Layout.Content>Content</Layout.Content>
</Layout>
<Layout.Footer>Footer</Layout.Footer>
</Layout>);
} Supports uncontrolled sider collapse from defaultCollapsed
test-backedLayout scenario from the component test coverage: supports uncontrolled sider collapse from defaultcollapsed.
import "@duskmoon-dev/components/styles.css";
import { Layout } from "@duskmoon-dev/components/layout";
export function LayoutSupportsUncontrolledSiderCollapseDemo() {
return (<Layout style={{ width: "100%", maxWidth: 640 }}>
<Layout.Header>Header</Layout.Header>
<Layout hasSider>
<Layout.Sider width={160}>Sider</Layout.Sider>
<Layout.Content>Content</Layout.Content>
</Layout>
<Layout.Footer>Footer</Layout.Footer>
</Layout>);
} Supports controlled sider collapse and reports trigger changes
test-backedLayout scenario from the component test coverage: supports controlled sider collapse and reports trigger changes.
import "@duskmoon-dev/components/styles.css";
import { Layout } from "@duskmoon-dev/components/layout";
export function LayoutSupportsControlledSiderCollapseDemo() {
return (<Layout style={{ width: "100%", maxWidth: 640 }}>
<Layout.Header>Header</Layout.Header>
<Layout hasSider>
<Layout.Sider width={160}>Sider</Layout.Sider>
<Layout.Content>Content</Layout.Content>
</Layout>
<Layout.Footer>Footer</Layout.Footer>
</Layout>);
} Omits trigger when trigger is null
test-backedLayout scenario from the component test coverage: omits trigger when trigger is null.
import "@duskmoon-dev/components/styles.css";
import { Layout } from "@duskmoon-dev/components/layout";
export function LayoutOmitsTriggerWhenTriggerDemo() {
return (<Layout style={{ width: "100%", maxWidth: 640 }}>
<Layout.Header>Header</Layout.Header>
<Layout hasSider>
<Layout.Sider width={160}>Sider</Layout.Sider>
<Layout.Content>Content</Layout.Content>
</Layout>
<Layout.Footer>Footer</Layout.Footer>
</Layout>);
} Theme aware
Docs previews inherit the DuskMoon data-theme value. Use the header switch to compare light and dark rendering.
<div data-theme="sunshine">
<Layout style={{ width: "100%", maxWidth: 640 }}>
<Layout.Header>Header</Layout.Header>
<Layout hasSider>
<Layout.Sider width={160}>Sider</Layout.Sider>
<Layout.Content>Content</Layout.Content>
</Layout>
<Layout.Footer>Footer</Layout.Footer>
</Layout>
</div>
<div data-theme="moonlight">
<Layout style={{ width: "100%", maxWidth: 640 }}>
<Layout.Header>Header</Layout.Header>
<Layout hasSider>
<Layout.Sider width={160}>Sider</Layout.Sider>
<Layout.Content>Content</Layout.Content>
</Layout>
<Layout.Footer>Footer</Layout.Footer>
</Layout>
</div> API
The API reference below lists every parsed exported type or interface for Layout. Start with `hasSider`, `collapsible`, `collapsed`, `defaultCollapsed` for common usage.
packages/components/src/components/layout/Layout.types.ts
Scenarios: packages/components/src/components/layout/Layout.test.tsx | Prop | Type | Required | Description |
|---|---|---|---|
hasSider | boolean | No | hasSider configures Layout. |
| Prop | Type | Required | Description |
|---|---|---|---|
collapsible | boolean | No | collapsible configures Layout. |
collapsed | boolean | No | collapsed configures Layout. |
defaultCollapsed | boolean | No | defaultCollapsed configures Layout. |
onCollapse | (collapsed: boolean, type: CollapseType) => void | No | onCollapse configures Layout. |
width | CSSProperties["width"] | No | width configures Layout. |
collapsedWidth | CSSProperties["width"] | No | collapsedWidth configures Layout. |
trigger | ReactNode | No | trigger configures Layout. |
breakpoint | LayoutBreakpoint | No | breakpoint configures Layout. |
| Prop | Type | Required | Description |
|---|---|---|---|
Header | ForwardRefExoticComponent< | Yes | Header configures Layout. |
Sider | ForwardRefExoticComponent< | Yes | Sider configures Layout. |
Content | ForwardRefExoticComponent< | Yes | Content configures Layout. |
Footer | ForwardRefExoticComponent< | Yes | Footer configures Layout. |
"xs" | "sm" | "md" | "lg" | "xl" | "xxl" Omit<ComponentProps<"div">, "ref"> "clickTrigger" | "responsive"