import { useState } from 'react' import styles from './CompositesSection.module.css' import { Accordion, AlertDialog, AreaChart, AvatarGroup, BarChart, Breadcrumb, CommandPalette, ConfirmDialog, DataTable, DetailPanel, Dropdown, EventFeed, FilterBar, GroupCard, LineChart, MenuItem, Modal, MultiSelect, Popover, ProcessorTimeline, ShortcutsBar, Tabs, ToastProvider, useToast, TreeView, } from '../../../design-system/composites' import type { SearchResult } from '../../../design-system/composites' import { Button } from '../../../design-system/primitives' // ── DemoCard helper ────────────────────────────────────────────────────────── interface DemoCardProps { id: string title: string description: string children: React.ReactNode } function DemoCard({ id, title, description, children }: DemoCardProps) { return (

{title}

{description}

{children}
) } // ── Toast demo inner component (must be inside ToastProvider) ───────────────── function ToastDemo() { const { toast } = useToast() return (
) } // ── Sample data ─────────────────────────────────────────────────────────────── const CHART_SERIES = [ { label: 'Requests', data: [ { x: 0, y: 120 }, { x: 1, y: 180 }, { x: 2, y: 150 }, { x: 3, y: 210 }, { x: 4, y: 190 }, { x: 5, y: 240 }, ], }, { label: 'Errors', data: [ { x: 0, y: 5 }, { x: 1, y: 12 }, { x: 2, y: 8 }, { x: 3, y: 15 }, { x: 4, y: 7 }, { x: 5, y: 10 }, ], color: 'var(--error)', }, ] const BAR_SERIES = [ { label: 'GET', data: [ { x: 'Mon', y: 80 }, { x: 'Tue', y: 95 }, { x: 'Wed', y: 110 }, { x: 'Thu', y: 72 }, { x: 'Fri', y: 130 }, ], }, { label: 'POST', data: [ { x: 'Mon', y: 40 }, { x: 'Tue', y: 55 }, { x: 'Wed', y: 60 }, { x: 'Thu', y: 38 }, { x: 'Fri', y: 75 }, ], color: 'var(--success)', }, ] const COMMAND_PALETTE_DATA: SearchResult[] = [ { id: 'r1', category: 'route', title: 'order-ingest', meta: 'POST /orders/ingest' }, { id: 'r2', category: 'route', title: 'payment-validate', meta: 'POST /payments/validate' }, { id: 'e1', category: 'exchange', title: 'exch-001', meta: 'Started 2m ago' }, { id: 'e2', category: 'exchange', title: 'exch-002', meta: 'Completed 5m ago' }, { id: 'a1', category: 'agent', title: 'camel-agent-prod-1', meta: 'live · 42 tps' }, { id: 'x1', category: 'exchange', title: 'exch-aabb1122', meta: 'route: order-ingest' }, ] interface TableRow { id: string name: string method: string status: string exchanges: number } const TABLE_DATA: TableRow[] = [ { id: '1', name: 'order-ingest', method: 'POST', status: 'live', exchanges: 1243 }, { id: '2', name: 'payment-validate', method: 'POST', status: 'live', exchanges: 987 }, { id: '3', name: 'inventory-check', method: 'GET', status: 'stale', exchanges: 432 }, { id: '4', name: 'notify-customer', method: 'POST', status: 'live', exchanges: 876 }, { id: '5', name: 'archive-order', method: 'PUT', status: 'dead', exchanges: 54 }, ] const NOW = new Date() const minsAgo = (n: number) => new Date(NOW.getTime() - n * 60 * 1000) const FEED_EVENTS = [ { id: 'ev1', severity: 'success' as const, message: 'Route order-ingest started successfully', timestamp: minsAgo(1) }, { id: 'ev2', severity: 'warning' as const, message: 'Agent camel-agent-prod-2 response time elevated', timestamp: minsAgo(3) }, { id: 'ev3', severity: 'error' as const, message: 'Exchange exch-aabb1122 failed: timeout', timestamp: minsAgo(7) }, { id: 'ev4', severity: 'running' as const, message: 'Processor payment-validate processing batch', timestamp: minsAgo(10) }, { id: 'ev5', severity: 'success' as const, message: 'Deployment v3.2.1 completed', timestamp: minsAgo(15) }, ] const TREE_NODES = [ { id: 'app1', label: 'cameleer-prod', icon: '⬡', children: [ { id: 'route1', label: 'order-ingest', icon: '→', children: [ { id: 'proc1', label: 'ValidateOrder', icon: '◈', meta: '12ms' }, { id: 'proc2', label: 'EnrichPayload', icon: '◈', meta: '8ms' }, { id: 'proc3', label: 'RouteToQueue', icon: '◈', meta: '3ms' }, ], }, { id: 'route2', label: 'payment-validate', icon: '→', children: [ { id: 'proc4', label: 'TokenizeCard', icon: '◈', meta: '22ms' }, { id: 'proc5', label: 'AuthorizePayment', icon: '◈', meta: '45ms' }, ], }, ], }, ] // ── CompositesSection ───────────────────────────────────────────────────────── export function CompositesSection() { // 1. Accordion const accordionItems = [ { id: 'a1', title: 'What is Apache Camel?', content: 'Apache Camel is an open-source integration framework based on enterprise integration patterns.' }, { id: 'a2', title: 'How do routes work?', content: 'Routes define the path a message takes through the system, from consumer to producer.', defaultOpen: true }, { id: 'a3', title: 'What are processors?', content: 'Processors transform, filter, enrich, or route messages as they flow through a route.' }, ] // 2. AlertDialog const [alertOpen, setAlertOpen] = useState(false) const [alertVariant, setAlertVariant] = useState<'danger' | 'warning' | 'info'>('danger') // 7. CommandPalette const [cmdOpen, setCmdOpen] = useState(false) // 8. DataTable const tableColumns = [ { key: 'name', header: 'Route', sortable: true }, { key: 'method', header: 'Method', sortable: true }, { key: 'status', header: 'Status', sortable: true }, { key: 'exchanges', header: 'Exchanges', sortable: true }, ] // 9. DetailPanel const [panelOpen, setPanelOpen] = useState(false) // 12. FilterBar const filterOptions = [ { label: 'Live', value: 'live', color: 'success' as const, count: 12 }, { label: 'Stale', value: 'stale', count: 3 }, { label: 'Dead', value: 'dead', color: 'error' as const, count: 1 }, ] const [activeFilters, setActiveFilters] = useState([{ label: 'Live', value: 'live' }]) // ConfirmDialog const [confirmOpen, setConfirmOpen] = useState(false) const [confirmDone, setConfirmDone] = useState(false) // MultiSelect const [multiValue, setMultiValue] = useState(['admin']) // 15. Modal const [modalOpen, setModalOpen] = useState(false) // 19. Tabs const tabItems = [ { label: 'Overview', value: 'overview', count: undefined }, { label: 'Routes', value: 'routes', count: 14 }, { label: 'Agents', value: 'agents', count: 6 }, ] const [activeTab, setActiveTab] = useState('overview') // 21. TreeView const [selectedNode, setSelectedNode] = useState('proc1') return (

Composites

{/* 1. Accordion */}
Single mode (default) Multiple mode
{/* 2. AlertDialog */}
setAlertOpen(false)} onConfirm={() => setAlertOpen(false)} title={alertVariant === 'danger' ? 'Delete route?' : alertVariant === 'warning' ? 'Proceed with caution?' : 'Confirm action'} description={ alertVariant === 'danger' ? 'This will permanently delete the route and all its exchange history. This action cannot be undone.' : alertVariant === 'warning' ? 'This operation will restart all active processors. Running exchanges may be interrupted.' : 'This will update the route configuration and apply changes immediately.' } variant={alertVariant} confirmLabel={alertVariant === 'danger' ? 'Delete' : 'Confirm'} />
{/* 2b. ConfirmDialog */} {confirmDone && Deleted!} setConfirmOpen(false)} onConfirm={() => { setConfirmOpen(false); setConfirmDone(true) }} message={'Delete project "my-project"? This cannot be undone.'} confirmText="my-project" /> {/* 3. AreaChart */} {/* 4. AvatarGroup */}
max=3, size=sm max=4, size=md max=2, size=lg
{/* 5. BarChart */}
Grouped Stacked
{/* 6. Breadcrumb */} {/* 7. CommandPalette */} setCmdOpen(false)} onSelect={() => setCmdOpen(false)} data={COMMAND_PALETTE_DATA} /> {/* 8. DataTable */}
{/* 9. DetailPanel */} setPanelOpen(false)} title="Route: order-ingest" tabs={[ { label: 'Overview', value: 'overview', content:
Route processes ~1,243 exchanges/day with avg latency 42ms.
}, { label: 'Processors', value: 'processors', content:
ValidateOrder → EnrichPayload → RouteToQueue
}, { label: 'Errors', value: 'errors', content:
3 errors in last 24h. Last: timeout at EnrichPayload.
}, ]} />
{/* 10. Dropdown */} Actions ▾} items={[ { label: 'View details', icon: '👁', onClick: () => undefined }, { label: 'Edit route', icon: '✏', onClick: () => undefined }, { divider: true, label: '' }, { label: 'Restart', icon: '↺', onClick: () => undefined }, { label: 'Delete', icon: '✕', onClick: () => undefined, disabled: true }, ]} /> {/* 11. EventFeed */}
{/* 11b. GroupCard */}
3 instances} meta={
34.4 msg/s9/9 routes
} footer={undefined} >
Instance rows go here
{/* 12. FilterBar */}
{/* 13. LineChart */} {/* 14. MenuItem */}
{/* 15. Modal */} setModalOpen(false)} title="Configure Route" size="md" >

Adjust the route settings below. Changes will take effect immediately after saving.

Route: order-ingest · Processor chain: 3 steps · Avg latency: 42ms

{/* 15b. MultiSelect */}
Selected: {multiValue.join(', ') || 'none'}
{/* 16. Popover */}
Top} content={
Popover on top
} /> Bottom} content={
Popover on bottom
} /> Left} content={
Popover on left
} /> Right} content={
Popover on right
} />
{/* 17. ProcessorTimeline */}
{/* 18. ShortcutsBar */} {/* 19. Tabs */}
Active tab: {activeTab}
{/* 20. Toast */} {/* 21. TreeView */}
) }