Components Navigation

NavMenu

An app’s sidebar: its pages as links under headings, the current one marked; collapses to icons.

import { NavMenu } from '@kition/tessera-ui'

Examples

Admin sidebar
nav-menu.tsx
import { useState } from 'react'
import { NavMenu, Switch } from '@kition/tessera-ui'
import { CreditCardIcon, KeyRoundIcon, LayoutDashboardIcon, MessageSquareIcon, UsersIcon } from '@kition/tessera-icons/react'

export default function Demo() {
  const [selected, setSelected] = useState('users')
  const [collapsed, setCollapsed] = useState(false)
  return (
    <div style={{ display: 'flex', gap: 24, alignItems: 'flex-start' }}>
      <div style={{ width: collapsed ? 52 : 220, padding: 8, borderRight: '1px solid var(--kit-border)' }}>
        <NavMenu
          label="Admin"
          selectedKey={selected}
          collapsed={collapsed}
          renderLink={(href, props) => <a href={href} {...props} onClick={(event) => { event.preventDefault(); setSelected(href.slice(1)) }} />}
          items={[
            { key: 'overview', label: 'Overview', icon: LayoutDashboardIcon, href: '#overview' },
            { key: 'people', label: 'People', items: [{ key: 'users', label: 'Users', icon: UsersIcon, href: '#users', badge: 1284 }, { key: 'feedback', label: 'Feedback', icon: MessageSquareIcon, href: '#feedback' }] },
            { key: 'billing', label: 'Billing', items: [{ key: 'orders', label: 'Orders', icon: CreditCardIcon, href: '#orders' }, { key: 'keys', label: 'API keys', icon: KeyRoundIcon, href: '#keys' }] },
          ]}
        />
      </div>
      <label style={{ display: 'inline-flex', gap: 8, alignItems: 'center' }}>
        <Switch checked={collapsed} onCheckedChange={setCollapsed} /> Collapsed
      </label>
    </div>
  )
}

Props

NavMenu

An app's sidebar: its pages as links, grouped under headings, the current one marked.

PropTypeDefaultDescription
itemsrequiredreadonly (NavItem | NavGroup)[]—Pages, or groups of pages under a heading.
selectedKeystring—The current page's key.
collapsedboolean—Icons only, each page's label in its tooltip (a collapsed sidebar).
renderLink(href: string, props: AnchorHTMLAttributes<HTMLAnchorElement> & { children: ReactNode }) => ReactNode—Draws a link; a router passes its own (<Link to={href} … />). A plain <a> by default.
labelrequiredstring—
classNamestring—