TreeView

Organism

Collapsible tree with keyboard navigation, selection, and aria-tree roles.

File tree

Preview
  • src
    • components
      • Button.ejs
      • Card.ejs
    • routes
      • index.ts
      • users.ts
    • app.ts
  • package.json
Code
<%- include('modules/ui/TreeView', {
  label: 'Files',
  selectedId: selectedId,
  nodes: [
    { id: 'src', label: 'src', children: [
      { id: 'components', label: 'components', children: [
        { id: 'Button', label: 'Button.ejs' },
        { id: 'Card',   label: 'Card.ejs' },
      ]},
      { id: 'routes', label: 'routes', children: [
        { id: 'index', label: 'index.ts' },
        { id: 'users', label: 'users.ts' },
      ]},
    ]},
    { id: 'package', label: 'package.json' },
  ]
}) %>

Navigation menu

Preview
  • Account
    • Profile
    • Password
  • Workspace
    • General
    • Billing
  • Integrations
Code
<%- include('modules/ui/TreeView', {
  label: 'Settings navigation',
  selectedId: 'billing',
  nodes: [
    { id: 'account', label: 'Account', children: [
      { id: 'profile',  label: 'Profile' },
      { id: 'password', label: 'Password' },
    ]},
    { id: 'workspace', label: 'Workspace', children: [
      { id: 'general', label: 'General' },
      { id: 'billing', label: 'Billing' },
    ]},
    { id: 'integrations', label: 'Integrations' },
  ]
}) %>

Flat list

Preview
  • TypeScript
  • JavaScript
  • Python
  • Go
Code
<%- include('modules/ui/TreeView', {
  label: 'Language selector',
  selectedId: 'ts',
  nodes: [
    { id: 'ts', label: 'TypeScript' },
    { id: 'js', label: 'JavaScript' },
    { id: 'py', label: 'Python' },
    { id: 'go', label: 'Go' },
  ]
}) %>

Multi-select + type-ahead

Preview
  • Documents
    • spec.md
    • roadmap.md
  • src
    • Button.ejs
    • Card.ejs
    • Drawer.ejs
    • TreeView.ejs
  • tests
    • unit
    • e2e
Code
<%- include('modules/ui/TreeView', {
  label: 'Project files',
  selectionMode: 'multi',
  selectedIds: ['Card'],
  nodes: [
    { id: 'docs', label: 'Documents', children: [
      { id: 'spec',    label: 'spec.md' },
      { id: 'roadmap', label: 'roadmap.md' },
    ]},
    { id: 'src', label: 'src', children: [
      { id: 'Button',   label: 'Button.ejs' },
      { id: 'Card',     label: 'Card.ejs' },
      { id: 'Drawer',   label: 'Drawer.ejs' },
      { id: 'TreeView', label: 'TreeView.ejs' },
    ]},
  ]
}) %>

<%# Try it:
%   - Cmd/Ctrl-click       → toggle individual rows
%   - Shift-click          → range-select between anchor and clicked row
%   - Type "tre"           → focus jumps to "TreeView.ejs"
%   - Cmd/Ctrl+A           → select all visible rows
%   - Arrow keys / Home / End / Space / Enter — full keyboard nav.
%>
Source modules/ui/TreeView/TreeView.ejs