ComponentsContainer
Container
Center page content and limit its width.
On this page
Use this component from the local workspace package. Follow the setup guide first. A public npm package and registry are not available yet.
View registry filesImport the component into your page or component file.
import { Container } from "@dethink/components";Try the examples, then open the code to use them in your app.
Sizes
Each size is a tokenized max width; gutters keep content off the viewport edges.
size="sm" — centered with a max width and gutters
size="md" — centered with a max width and gutters
size="lg" — centered with a max width and gutters
Show sourceexamples/container/basic.tsx
"use client";
import { Box, Container, Text } from "@dethink/components";
const sizes = ["sm", "md", "lg"] as const;
export function ContainerBasic() {
return (
<div className="space-y-3">
{sizes.map((size) => (
<Container key={size} size={size} gutter="md">
<Box p="2" radius="sm" surface="muted">
<Text size="sm" align="center">
size="{size}" — centered with a max width and gutters
</Text>
</Box>
</Container>
))}
</div>
);
}Combine the layout components to build a dashboard.
Dashboard skeleton
Container centers, Flex lays out the header, Grid places the tiles, Stack handles rhythm, Separator divides, and Box provides every surface.
Operations
Production · last 24 hours
All systems normal
Requests
1.2M
+8.1% vs yesterday
p99 latency
212 ms
−4.3% vs yesterday
Error rate
0.04%
−0.01% vs yesterday
Traffic is shifting to EU West — consider raising the regional capacity floor.
Review →
Show sourceexamples/layout/recipe-dashboard.tsx
"use client";
import {
Box,
Container,
Flex,
FlexItem,
Grid,
GridItem,
Heading,
Separator,
Stack,
Text,
} from "@dethink/components";
const stats = [
{ label: "Requests", value: "1.2M", delta: "+8.1%" },
{ label: "p99 latency", value: "212 ms", delta: "−4.3%" },
{ label: "Error rate", value: "0.04%", delta: "−0.01%" },
];
/**
* A dashboard skeleton built only from the layout and typography
* primitives — no custom CSS. Container centers, Flex lays out the header,
* Grid places the stat tiles, Stack handles vertical rhythm, and Box
* provides every surface.
*/
export function LayoutRecipeDashboard() {
return (
<Container size="md" gutter="none">
<Stack gap="4">
<Flex align="center" justify="between" gap="4">
<Stack gap="1">
<Heading level={3}>Operations</Heading>
<Text size="sm" tone="muted">
Production · last 24 hours
</Text>
</Stack>
<Box px="3" py="1" radius="full" surface="muted">
<Text size="xs" weight="medium">
All systems normal
</Text>
</Box>
</Flex>
<Separator spacing="none" />
<Grid columns="3" gap="3">
{stats.map((stat) => (
<GridItem key={stat.label}>
<Box p="4" radius="md" border="default" surface="background">
<Stack gap="1">
<Text size="xs" tone="muted">
{stat.label}
</Text>
<Text size="xl" weight="semibold">
{stat.value}
</Text>
<Text size="xs" tone="subtle">
{stat.delta} vs yesterday
</Text>
</Stack>
</Box>
</GridItem>
))}
<GridItem colSpan="full">
<Box p="4" radius="md" surface="muted">
<Flex align="center" gap="3">
<FlexItem grow="1">
<Text size="sm">
Traffic is shifting to EU West — consider raising the
regional capacity floor.
</Text>
</FlexItem>
<Text size="xs" tone="primary" weight="medium">
Review →
</Text>
</Flex>
</Box>
</GridItem>
</Grid>
</Stack>
</Container>
);
}| Prop | What it does | Default |
|---|---|---|
size"sm" | "md" | "lg" | "xl" | "2xl" | "full" | Max content width. | "xl" |
gutter"none" | "sm" | "md" | "lg" | "xl" | Horizontal padding inside the viewport. | "md" |
align / as / asChildstart–end / element / boolean | Horizontal placement, semantic element, or child merging. | center |