LogList
Timestamped log rows, optionally multi-column.
19:06:00NODE sup-458 entered SUPPLY CHAIN · intake
19:06:08EDGE mkt-398 ↔ reg-129 · appears in one filing · linked
19:06:16EDGE sup-445 ↔ idx-460 · shares a supplier · linked
19:06:24SHIP sup-764 exported · [[sup-764]] in vault · vault
19:06:32NODE idx-355 entered INDEX EXPOSURE · intake
19:06:40EDGE mkt-528 ↔ idx-552 · same index membership · linked
19:06:48EDGE sup-970 ↔ idx-844 · overlapping guidance · linked
19:06:56SHIP reg-636 exported · [[reg-636]] in vault · vault
19:07:04NODE mkt-431 entered MARKETS · intake
19:07:12EDGE sup-343 ↔ idx-419 · same index membership · linked
10 ENTRIES · TAIL -F /VAR/LOG/MISSION
Source
"use client"
import { graphPhaseAt, phaseLogEntry } from "@/apps/docs/demo/data"
import type { GraphPhase } from "@/apps/docs/demo/data"
import type { Tone } from "@/registry/warren/lib/tone"
import { LogList } from "@/registry/warren/log-list/log-list"
import type { LogEntry } from "@/registry/warren/log-list/log-list"
const PHASE_TONE: Record<GraphPhase, Tone> = {
INTAKE: "accent",
LINKING: "primary",
CLUSTERING: "teal",
EXPORT: "success",
}
const ENTRIES: LogEntry[] = Array.from({ length: 10 }, (_, i) => {
const tick = i * 8
return { ...phaseLogEntry(tick), tone: PHASE_TONE[graphPhaseAt(tick)] }
})
export default function LogListDemo() {
return (
<LogList
items={ENTRIES}
footer={
<span className="font-mono text-xs text-muted-foreground">
10 ENTRIES · TAIL -F /VAR/LOG/MISSION
</span>
}
/>
)
}
Installation
npx shadcn@latest add https://warren.eduard3v.com/r/log-list.jsonUsage
import { LogList } from "@/registry/warren/log-list/log-list"<LogList
items={[
{ time: "19:06:08", message: "EDGE mkt-398 ↔ reg-129 · appears in one filing · linked", tone: "primary" },
{ time: "19:06:24", message: "SHIP sup-764 exported · [[sup-764]] in vault · vault", tone: "success" },
]}
/>Columns
19:06:00NODE sup-458 entered SUPPLY CHAIN · intake
19:06:08EDGE mkt-398 ↔ reg-129 · appears in one filing · linked
19:06:16EDGE sup-445 ↔ idx-460 · shares a supplier · linked
19:06:24SHIP sup-764 exported · [[sup-764]] in vault · vault
19:06:32NODE idx-355 entered INDEX EXPOSURE · intake
19:06:40EDGE mkt-528 ↔ idx-552 · same index membership · linked
19:06:48EDGE sup-970 ↔ idx-844 · overlapping guidance · linked
19:06:56SHIP reg-636 exported · [[reg-636]] in vault · vault
19:07:04NODE mkt-431 entered MARKETS · intake
19:07:12EDGE sup-343 ↔ idx-419 · same index membership · linked
19:07:20EDGE reg-733 ↔ reg-479 · overlapping guidance · linked
19:07:28SHIP sup-483 exported · [[sup-483]] in vault · vault
12 ENTRIES · 2 COLUMNS · ROW-MAJOR
Source
"use client"
import { graphPhaseAt, phaseLogEntry } from "@/apps/docs/demo/data"
import type { GraphPhase } from "@/apps/docs/demo/data"
import type { Tone } from "@/registry/warren/lib/tone"
import { LogList } from "@/registry/warren/log-list/log-list"
import type { LogEntry } from "@/registry/warren/log-list/log-list"
const PHASE_TONE: Record<GraphPhase, Tone> = {
INTAKE: "accent",
LINKING: "primary",
CLUSTERING: "teal",
EXPORT: "success",
}
const ENTRIES: LogEntry[] = Array.from({ length: 12 }, (_, i) => {
const tick = i * 8
return { ...phaseLogEntry(tick), tone: PHASE_TONE[graphPhaseAt(tick)] }
})
export default function LogListColumns() {
return (
<LogList
items={ENTRIES}
columns={2}
footer={
<span className="font-mono text-xs text-muted-foreground">
12 ENTRIES · 2 COLUMNS · ROW-MAJOR
</span>
}
/>
)
}
Pass columns for 2+ columns: the grid fills row-major, so time reads left→right, top→bottom. Below lg the list always stacks to a single column. Rows truncate by default — set expandable to expand a row in place on click, or hover for the native title tooltip. Expandable rows render as real buttons exposing aria-expanded, so the collapse state is announced.
API Reference
Prop
Type
LogEntry
Prop
Type