MDK Logo

Layout components

Container and structure components for organizing UI

Layout components

Layout components provide structure and organization for your application's UI.

Card

Flexible container component with optional header, body, and footer slots.

Import

import { Card, CardHeader, CardBody, CardFooter } from '@mdk/core'

Props

PropTypeDefaultDescription
classNamestringnoneAdditional CSS class
onClickfunctionnoneClick handler (adds clickable styling)
childrenReactNodenoneCard content

Basic usage

<Card>
  <Card.Header>Title</Card.Header>
  <Card.Body>Content goes here</Card.Body>
  <Card.Footer>Actions</Card.Footer>
</Card>

Default children are automatically wrapped in the body slot:

<Card>
  <Card.Header>Title</Card.Header>
  This content goes to the body automatically
</Card>

Clickable card

<Card onClick={() => navigate('/details')}>
  <Card.Header>Click me</Card.Header>
  <Card.Body>Navigates on click</Card.Body>
</Card>

Styling

  • .mdk-card: Root container
  • .mdk-card--clickable: Applied when onClick is provided
  • .mdk-card__header: Header slot
  • .mdk-card__body: Body slot
  • .mdk-card__footer: Footer slot

Dialog

Modal dialog built on Radix UI primitives.

Import

import {
  Dialog,
  DialogTrigger,
  DialogContent,
  DialogHeader,
  DialogTitle,
  DialogDescription,
  DialogFooter,
  DialogClose,
} from '@mdk/core'

DialogContent props

PropTypeDefaultDescription
titlestringnoneDialog title
descriptionstringnoneDialog description
closablebooleanfalseShow close button
onClosefunctionnoneClose callback
closeOnClickOutsidebooleantrueClose when clicking outside
closeOnEscapebooleantrueClose on Escape key
barebooleanfalseMinimal header styling

Basic usage

<Dialog>
  <DialogTrigger asChild>
    <Button>Open Dialog</Button>
  </DialogTrigger>
  <DialogContent title="Confirm Action" closable onClose={() => {}}>
    <p>Are you sure you want to proceed?</p>
    <DialogFooter>
      <DialogClose asChild>
        <Button variant="secondary">Cancel</Button>
      </DialogClose>
      <Button>Confirm</Button>
    </DialogFooter>
  </DialogContent>
</Dialog>

Styling

  • .mdk-dialog__overlay: Background overlay
  • .mdk-dialog__content: Dialog container
  • .mdk-dialog__header: Header area
  • .mdk-dialog__title: Title text
  • .mdk-dialog__description: Description text
  • .mdk-dialog__footer: Footer area

Accordion

Collapsible content sections built on Radix UI primitives.

Import

import {
  Accordion,
  AccordionItem,
  AccordionTrigger,
  AccordionContent,
} from '@mdk/core'

Accordion props

PropTypeDefaultDescription
titlestring''Accordion header title
isOpenedbooleanfalseInitially expanded
isRowbooleanfalseRow layout for content
unpaddedbooleanfalseRemove content padding
noBorderbooleanfalseRemove trigger border
solidBackgroundbooleanfalseSolid background color
showToggleIconbooleantrueShow expand/collapse icon
toggleIconPosition'left' | 'right''left'Icon position
customLabelReactNodenoneCustom label next to title
onValueChangefunctionnoneCallback when state changes

Basic usage

<Accordion title="FAQ Section">
  <p>This content can be expanded or collapsed.</p>
</Accordion>

With custom label

<Accordion
  title="System Status"
  customLabel={<Badge variant="success">Active</Badge>}
  showToggleIcon={false}
>
  <p>All systems operational.</p>
</Accordion>

Multiple items

<AccordionRoot type="multiple">
  <AccordionItem value="item-1">
    <AccordionTrigger>Section 1</AccordionTrigger>
    <AccordionContent>Content 1</AccordionContent>
  </AccordionItem>
  <AccordionItem value="item-2">
    <AccordionTrigger>Section 2</AccordionTrigger>
    <AccordionContent>Content 2</AccordionContent>
  </AccordionItem>
</AccordionRoot>

Styling

  • .mdk-accordion: Root container
  • .mdk-accordion--solid-background: Solid background variant
  • .mdk-accordion__item: Individual item
  • .mdk-accordion__trigger: Clickable header
  • .mdk-accordion__content: Collapsible content area

Tabs

Tab navigation for organizing content into panels.

Import

import { Tabs, TabsList, TabsTrigger, TabsContent } from '@mdk/core'

Props

PropTypeDefaultDescription
defaultValuestringnoneInitially active tab
valuestringnoneControlled active tab
onValueChangefunctionnoneTab change callback
variant'default' | 'side''default'Tab layout variant

Basic usage

<Tabs defaultValue="overview">
  <TabsList>
    <TabsTrigger value="overview">Overview</TabsTrigger>
    <TabsTrigger value="settings">Settings</TabsTrigger>
    <TabsTrigger value="logs" disabled>Logs</TabsTrigger>
  </TabsList>
  <TabsContent value="overview">
    Overview content here
  </TabsContent>
  <TabsContent value="settings">
    Settings content here
  </TabsContent>
</Tabs>

Side variant

<Tabs defaultValue="tab1" variant="side">
  <TabsList variant="side">
    <TabsTrigger value="tab1" variant="side">Tab 1</TabsTrigger>
    <TabsTrigger value="tab2" variant="side">Tab 2</TabsTrigger>
  </TabsList>
  <TabsContent value="tab1">Content 1</TabsContent>
  <TabsContent value="tab2">Content 2</TabsContent>
</Tabs>

Styling

  • .mdk_tabs: Root container
  • .mdk_tabs__list: Tab button container
  • .mdk_tabs__list--side: Side variant list
  • .mdk_tabs__trigger: Individual tab button
  • .mdk_tabs__content: Tab panel content

Navigation sidebar with expand/collapse and overlay modes.

Import

import {
  Sidebar,
  useSidebarExpandedState,
  useSidebarSectionState,
  clearSidebarState,
} from '@mdk/core'

Props

PropTypeDefaultDescription
itemsSidebarMenuItem[]noneRequired: Menu items array
activeIdstringnoneCurrently active item ID
expandedbooleannoneControlled expanded state
defaultExpandedbooleanfalseInitial expanded state
visiblebooleantrueSidebar visibility
overlaybooleanfalseOverlay mode (mobile)
headerReactNodenoneHeader content
onItemClickfunctionnoneItem click callback
onExpandedChangefunctionnoneExpand state callback
onClosefunctionnoneClose callback (overlay mode)

SidebarMenuItem type

type SidebarMenuItem = {
  id: string
  label: string
  icon?: ReactNode
  href?: string
  children?: SidebarMenuItem[]
  disabled?: boolean
}

Basic usage

const items = [
  { id: 'dashboard', label: 'Dashboard', icon: <DashboardIcon /> },
  { id: 'settings', label: 'Settings', icon: <SettingsIcon /> },
  {
    id: 'reports',
    label: 'Reports',
    icon: <ReportsIcon />,
    children: [
      { id: 'daily', label: 'Daily' },
      { id: 'weekly', label: 'Weekly' },
    ],
  },
]

<Sidebar
  items={items}
  activeId="dashboard"
  onItemClick={(item) => navigate(item.href)}
/>

With persisted state

function App() {
  const [expanded, setExpanded] = useSidebarExpandedState(true)
  
  return (
    <Sidebar
      items={items}
      expanded={expanded}
      onExpandedChange={setExpanded}
    />
  )
}

Styling

  • .mdk-sidebar: Root container
  • .mdk-sidebar--expanded: Expanded state
  • .mdk-sidebar--hidden: Hidden state
  • .mdk-sidebar--overlay: Overlay mode
  • .mdk-sidebar__toggle: Expand/collapse button
  • .mdk-sidebar__menu: Menu container
  • .mdk-sidebar__backdrop: Overlay backdrop

Additional layout components

ComponentDescription
PopoverFloating content panel (Radix-based)
DropdownMenuDropdown menu system (Radix-based)
DividerVisual separator line
SeparatorHorizontal/vertical separator
LabeledCardCard with label decoration
MosaicGrid/mosaic layout container

On this page