@usetheo/ui 0.22.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/components/composites/annotation-input/annotation-input.d.ts +38 -0
  2. package/dist/components/composites/annotation-input/index.d.ts +4 -0
  3. package/dist/components/composites/annotation-input/types.d.ts +31 -0
  4. package/dist/components/composites/attributes-table/attributes-table.d.ts +20 -0
  5. package/dist/components/composites/attributes-table/index.d.ts +1 -0
  6. package/dist/components/composites/histogram/histogram.d.ts +19 -0
  7. package/dist/components/composites/histogram/index.d.ts +2 -0
  8. package/dist/components/composites/io-cards/index.d.ts +2 -0
  9. package/dist/components/composites/io-cards/io-cards.d.ts +17 -0
  10. package/dist/components/composites/io-cards/message-card.d.ts +21 -0
  11. package/dist/components/composites/percentile-chart/index.d.ts +2 -0
  12. package/dist/components/composites/percentile-chart/percentile-chart.d.ts +37 -0
  13. package/dist/components/composites/session-summary/index.d.ts +1 -0
  14. package/dist/components/composites/session-summary/session-summary.d.ts +18 -0
  15. package/dist/components/composites/session-timeline/index.d.ts +1 -0
  16. package/dist/components/composites/session-timeline/session-timeline.d.ts +22 -0
  17. package/dist/components/composites/span-graph/index.d.ts +1 -0
  18. package/dist/components/composites/span-graph/span-graph.d.ts +19 -0
  19. package/dist/components/composites/span-tree/index.d.ts +2 -0
  20. package/dist/components/composites/span-tree/span-tree-row.d.ts +22 -0
  21. package/dist/components/composites/span-tree/span-tree-virtual.d.ts +7 -0
  22. package/dist/components/composites/span-tree/span-tree.d.ts +34 -0
  23. package/dist/components/composites/span-waterfall/index.d.ts +1 -0
  24. package/dist/components/composites/span-waterfall/span-waterfall.d.ts +28 -0
  25. package/dist/components/composites/trace-compare/index.d.ts +1 -0
  26. package/dist/components/composites/trace-compare/trace-compare.d.ts +27 -0
  27. package/dist/components/composites/trace-transcript/index.d.ts +1 -0
  28. package/dist/components/composites/trace-transcript/trace-transcript.d.ts +26 -0
  29. package/dist/components/primitives/combobox/combobox.d.ts +3 -3
  30. package/dist/index.d.ts +30 -0
  31. package/dist/index.js +2177 -1
  32. package/dist/lib/chart/histogram.d.ts +21 -0
  33. package/dist/lib/chart/index.d.ts +1 -0
  34. package/dist/lib/session/aggregate.d.ts +18 -0
  35. package/dist/lib/session/index.d.ts +2 -0
  36. package/dist/lib/session/types.d.ts +30 -0
  37. package/dist/lib/trace/align.d.ts +41 -0
  38. package/dist/lib/trace/attributes.d.ts +11 -0
  39. package/dist/lib/trace/bar-layout.d.ts +52 -0
  40. package/dist/lib/trace/chat.d.ts +14 -0
  41. package/dist/lib/trace/cost.d.ts +16 -0
  42. package/dist/lib/trace/duration.d.ts +18 -0
  43. package/dist/lib/trace/flatten.d.ts +28 -0
  44. package/dist/lib/trace/graph-layout.d.ts +52 -0
  45. package/dist/lib/trace/index.d.ts +9 -0
  46. package/dist/lib/trace/types.d.ts +80 -0
  47. package/dist/test/fixtures/trace.d.ts +19 -0
  48. package/package.json +3 -1
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Pure histogram binning — distributes numeric values into `binCount`
3
+ * equal-width bins over [min, max] and counts how many fall in each.
4
+ *
5
+ * Zero-dependency, total, deterministic (M11 ADR D2 — binning is pure logic,
6
+ * distinct from the SVG scaling reused from TrendChart). Non-finite values
7
+ * (NaN / ±Infinity) are dropped, mirroring the trace-core `Number.isFinite`
8
+ * discipline. A degenerate range (all values equal) collapses to a single
9
+ * populated bin so no count is lost.
10
+ */
11
+ /** One histogram bucket: half-open [lo, hi) except the final bin, which is [lo, hi] (max-inclusive). */
12
+ export interface HistogramBin {
13
+ lo: number;
14
+ hi: number;
15
+ count: number;
16
+ }
17
+ /**
18
+ * Bin `values` into `binCount` equal-width buckets.
19
+ * Returns `[]` for an empty input or a non-positive `binCount`.
20
+ */
21
+ export declare function computeHistogram(values: number[], binCount: number): HistogramBin[];
@@ -0,0 +1 @@
1
+ export * from "./histogram.js";
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Pure, total session-metric aggregation. Never throws, never does I/O. Honest sums: absent
3
+ * cost/tokens count as 0 (never NaN); the window is max(end) − min(start) over parseable timestamps
4
+ * (an unparseable start is skipped from the window, never a crash).
5
+ */
6
+ import type { SessionMetrics, SessionTraceItem } from "./types.js";
7
+ /**
8
+ * The session's wall-clock window in ns: [min start, max effective end] over the parseable
9
+ * timestamps. An unparseable start is skipped (never a crash); a clock-skewed/absent end falls back
10
+ * to its own start. A session with no parseable timestamps yields 0/0. This is the SINGLE definition
11
+ * of "a session's time window" — both `aggregateSession` (for `windowMs`) and `SessionTimeline` (for
12
+ * the per-trace bar denominator) consume it, so the window semantics live in one place.
13
+ */
14
+ export declare function sessionBounds(items: SessionTraceItem[]): {
15
+ startNs: bigint;
16
+ endNs: bigint;
17
+ };
18
+ export declare function aggregateSession(items: SessionTraceItem[]): SessionMetrics;
@@ -0,0 +1,2 @@
1
+ export * from "./types.js";
2
+ export * from "./aggregate.js";
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Data contracts for the session-level components (M9). A session groups traces that share a
3
+ * `session.id`; `SessionTraceItem` is the trace-level shape both `SessionSummary` and
4
+ * `SessionTimeline` consume — the intersection of the theo-lens traces-list row and the peer
5
+ * session views (phoenix numTraces+latency+cost, langfuse timestamp+name+latency). Timestamps
6
+ * accept unix-ns (bigint | numeric string) or ISO — normalized by the trace-core `toNs`.
7
+ */
8
+ export interface SessionTraceItem {
9
+ id: string;
10
+ name?: string;
11
+ /** Unix ns (bigint | numeric string) or ISO-8601 string. */
12
+ startTime?: bigint | string;
13
+ /** Absent/null = in-flight (renders unbounded on the timeline). */
14
+ endTime?: bigint | string | null;
15
+ status?: "OK" | "ERROR";
16
+ model?: string;
17
+ costUsd?: number;
18
+ totalTokens?: number;
19
+ }
20
+ /** Aggregate metrics over a session's traces. All numeric fields are 0 (never NaN) when absent. */
21
+ export interface SessionMetrics {
22
+ traceCount: number;
23
+ /** Session wall-clock window in ms: max(end) − min(start) across all traces. */
24
+ windowMs: number;
25
+ totalCostUsd: number;
26
+ totalTokens: number;
27
+ errorCount: number;
28
+ /** Distinct models seen, sorted. */
29
+ models: string[];
30
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Pure, total structural alignment + metric aggregation for comparing two
3
+ * traces. Never throws (cycle-guarded), never does I/O. Deltas are honest: a
4
+ * span present in only one trace has NO delta (never a fabricated 1:1 diff).
5
+ */
6
+ import type { TraceSpan } from "./types.js";
7
+ export interface TraceMetrics {
8
+ durationMs: number | null;
9
+ totalTokens: number;
10
+ costUsd: number;
11
+ hasError: boolean;
12
+ spanCount: number;
13
+ }
14
+ /** Aggregate whole-trace metrics: root duration, summed tokens/cost, any-error flag. Total. */
15
+ export declare function traceMetrics(root: TraceSpan): TraceMetrics;
16
+ export interface NumericDelta {
17
+ from: number | null;
18
+ to: number | null;
19
+ deltaPct: number | null;
20
+ }
21
+ export interface AlignDelta {
22
+ durationMs?: NumericDelta;
23
+ tokens?: NumericDelta;
24
+ costUsd?: NumericDelta;
25
+ }
26
+ export interface AlignRow {
27
+ key: string;
28
+ depth: number;
29
+ a?: TraceSpan;
30
+ b?: TraceSpan;
31
+ status: "matched" | "only-in-a" | "only-in-b";
32
+ /** Present ONLY when status === "matched" — an unpaired span has no honest delta. */
33
+ delta?: AlignDelta;
34
+ }
35
+ /**
36
+ * Align two span trees structurally, matching children by name (greedy,
37
+ * first-unused). Produces a flat, depth-annotated row list: matched pairs
38
+ * carry a delta; only-in-a / only-in-b rows do not. Cycle-safe via a visited
39
+ * set on span ids (a malformed self-referential tree cannot loop).
40
+ */
41
+ export declare function alignSpanTrees(a: TraceSpan, b: TraceSpan): AlignRow[];
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Pure grouping of OTel span attributes by namespace (the prefix before the
3
+ * first `.`). Keys without a dot fall into the `general` namespace. Total —
4
+ * never throws; deterministic insertion order preserved within a group.
5
+ */
6
+ export interface AttributeGroup {
7
+ namespace: string;
8
+ entries: Array<[string, unknown]>;
9
+ }
10
+ /** Group attribute entries by their dotted-key namespace, sorted by namespace name. */
11
+ export declare function groupByNamespace(attrs: Record<string, unknown>): AttributeGroup[];
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Waterfall-layout math: trace time envelope, per-span bar geometry, a
3
+ * human-friendly time axis, overlapping-span row packing, and ∑-cost
4
+ * aggregation. Every function is pure and total — it NEVER throws and NEVER
5
+ * does I/O — so skew / missing-timestamp / overlap / degenerate-bounds
6
+ * negative cases are provable without rendering.
7
+ */
8
+ import type { TraceSpan } from "./types.js";
9
+ /**
10
+ * Trace time bounds — min start / max end across ALL spans (ns, bigint-safe):
11
+ * the honest envelope for the waterfall denominator (not root-only, which
12
+ * would let a child overflow). Unparseable timestamps are skipped; a trace
13
+ * with no timestamps returns 0/0.
14
+ */
15
+ export declare function computeTraceBounds(root: TraceSpan): {
16
+ startNs: bigint;
17
+ endNs: bigint;
18
+ };
19
+ export interface BarLayout {
20
+ leftPct: number;
21
+ widthPct: number;
22
+ unbounded: boolean;
23
+ }
24
+ /**
25
+ * Map a span's [start, end] against the trace bounds → clamped {leftPct,
26
+ * widthPct} in [0,100] with `leftPct + widthPct ≤ 100`. Missing end and
27
+ * clock-skew (end < start) are flagged `unbounded` with zero width — never a
28
+ * throw. Percentages carry 2 decimals via integer bigint math.
29
+ */
30
+ export declare function computeBarLayout(spanStart: bigint | string | undefined, spanEnd: bigint | string | null | undefined, traceStartNs: bigint, traceEndNs: bigint): BarLayout;
31
+ /** One tick on the waterfall time axis. */
32
+ export interface AxisTick {
33
+ offsetNs: bigint;
34
+ label: string;
35
+ leftPct: number;
36
+ }
37
+ /**
38
+ * Human-friendly time axis: pick a step from the 1/2/5×10ⁿ ladder so ticks
39
+ * sit ≥70px apart, then emit ticks at 0, step, 2·step, … across the span.
40
+ * Total: a degenerate window or non-positive width yields an empty axis.
41
+ */
42
+ export declare function niceAxisTicks(startNs: bigint, endNs: bigint, pxWidth: number): AxisTick[];
43
+ /**
44
+ * Greedy single-pass row packing for overlapping spans: sort by start, then
45
+ * assign each span the lowest row whose last-placed span ended at/before this
46
+ * span's start. Returns `Map<id, rowIndex>`. Total: `[]` → empty map.
47
+ */
48
+ export declare function packRows(spans: Array<{
49
+ id: string;
50
+ startNs: bigint;
51
+ endNs: bigint;
52
+ }>): Map<string, number>;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ChatML detection + payload pretty-print. Pure and total. Output is ALWAYS
3
+ * plain text/data — nothing here interprets HTML (the transcript/IO renderers
4
+ * inherit the no-dangerouslySetInnerHTML invariant from these totals).
5
+ */
6
+ import type { ChatMessage } from "./types.js";
7
+ /** Parse a value as a chat-message array (`[{role, content}, …]`) or null when it is not one. */
8
+ export declare function asChat(value: string): ChatMessage[] | null;
9
+ /** Pretty-print a stringified value as JSON when parseable, else leave it raw. Always plain text. */
10
+ export declare function prettyValue(value: string): string;
11
+ /** True when a message's content is redacted OR is/contains redacted thinking/reasoning. Pure, total. */
12
+ export declare function isRedactedThinking(m: ChatMessage): boolean;
13
+ /** Extract a plain-text body from a message's content (string, or joined text/thinking blocks). Total. */
14
+ export declare function contentText(content: unknown): string;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Per-span and subtree USD cost. Pure and total — missing/non-numeric costs
3
+ * collapse to 0 (never NaN) so `∑` badges stay honest.
4
+ */
5
+ import type { TraceSpan } from "./types.js";
6
+ /**
7
+ * A single span's own USD cost: the promoted `costUsd` field, else the first
8
+ * parseable cost attribute. Total: missing/non-numeric → 0 (never NaN);
9
+ * negative costs floor to 0.
10
+ */
11
+ export declare function spanCostUsd(span: TraceSpan): number;
12
+ /**
13
+ * Sum a span's own cost + all descendants' (`∑`). Total: missing cost counts as 0, never NaN.
14
+ * Cycle-safe: a repeated/self-referential child is counted at most once (no stack overflow).
15
+ */
16
+ export declare function aggregateCost(span: TraceSpan): number;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Timestamp normalization + duration math. Pure and total — never throws,
3
+ * never does I/O. All internal math is bigint ns (ADR D2 of the plan): no
4
+ * float precision loss on unix-ns timestamps.
5
+ */
6
+ import type { SpanStatus, TraceSpan } from "./types.js";
7
+ /**
8
+ * Normalize a timestamp to unix ns. Accepts bigint ns, a numeric string
9
+ * (treated as ns), or an ISO-8601 string (ms precision → ns). Returns null
10
+ * for anything unparseable — callers treat null as "cannot place this span".
11
+ */
12
+ export declare function toNs(value: bigint | string | null | undefined): bigint | null;
13
+ /** Span duration in ms; null when unavailable or clock-skewed (end < start). */
14
+ export declare function durationMs(span: Pick<TraceSpan, "startTime" | "endTime">): number | null;
15
+ /** Whether a span status counts as an error. Total: unknown statuses are not errors. */
16
+ export declare function isSpanError(status: SpanStatus | string | undefined): boolean;
17
+ /** Compact ms/s/min duration label (`1500 → "1.5s"`). Null → "in-flight". Pure, no locale. */
18
+ export declare function formatDurationMs(ms: number | null): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Tree flattening + the reader-mode transcript row model. Pure and total.
3
+ * `flattenVisible` order is the contract every renderer (tree, waterfall,
4
+ * transcript) shares, so selection/keyboard indices agree across views.
5
+ */
6
+ import type { FlatSpan, TraceSpan, TranscriptRow } from "./types.js";
7
+ /**
8
+ * Above this many visible rows, renderers switch from the recursive path to
9
+ * the react-virtual flat-list (blueprint Corner 2 Q9; langfuse uses 350, the
10
+ * lens origin uses 200 — virtualization only when it earns its complexity).
11
+ */
12
+ export declare const VIRTUALIZE_THRESHOLD = 200;
13
+ /**
14
+ * Depth-first flatten of ALL spans (ignores collapse) — resolve-by-id / envelope input. Cycle-safe:
15
+ * a self-referential or repeated child is visited at most once (a malformed trace cannot stack-overflow).
16
+ */
17
+ export declare function flattenAll(root: TraceSpan): TraceSpan[];
18
+ /**
19
+ * Depth-first flatten of VISIBLE spans (a node in `collapsed` contributes no descendants). Cycle-safe:
20
+ * each span id is emitted at most once.
21
+ */
22
+ export declare function flattenVisible(root: TraceSpan, collapsed: Set<string>): FlatSpan[];
23
+ /**
24
+ * Flatten a span tree into the ordered reader-mode transcript feed. Pre-order
25
+ * walk so `span`-row order matches `flattenVisible`. A fan-out node emits a
26
+ * `group-header` row BEFORE its child rows so the view can collapse the group.
27
+ */
28
+ export declare function toTranscriptRows(root: TraceSpan): TranscriptRow[];
@@ -0,0 +1,52 @@
1
+ /**
2
+ * PURE, deterministic layered layout for the agent-graph view. No I/O, no
3
+ * React: derives each span's semantic kind, lays the trace out as a layered
4
+ * node-edge graph (depth = distance from root, order = index within depth),
5
+ * flags the root→selected execution path, and caps huge traces — so the SVG
6
+ * renderer stays thin. SVG-pure by ADR D4 of the blueprint (no elkjs/d3).
7
+ */
8
+ import type { SpanKind, TraceSpan } from "./types.js";
9
+ /**
10
+ * Derive a span's semantic kind from OTel GenAI signals (the raw `.kind`
11
+ * field is often the OTLP numeric — useless as agent/tool/LLM). Precedence:
12
+ * tool > retriever > embedding > llm > chain(has children) > unknown.
13
+ */
14
+ export declare function deriveSpanKind(span: TraceSpan): SpanKind;
15
+ /** Above this span count the graph renders an honest "too large" state. */
16
+ export declare const GRAPH_NODE_CAP = 200;
17
+ export interface GraphNode {
18
+ spanId: string;
19
+ name: string;
20
+ kind: SpanKind;
21
+ depth: number;
22
+ order: number;
23
+ x: number;
24
+ y: number;
25
+ error: boolean;
26
+ selected: boolean;
27
+ onPath: boolean;
28
+ }
29
+ export interface GraphEdge {
30
+ from: string;
31
+ to: string;
32
+ onPath: boolean;
33
+ }
34
+ export interface LayeredGraph {
35
+ nodes: GraphNode[];
36
+ edges: GraphEdge[];
37
+ width: number;
38
+ height: number;
39
+ truncated: boolean;
40
+ count: number;
41
+ }
42
+ /**
43
+ * Build the deterministic layered graph. Edges come from parent/call order
44
+ * (`parentId`), NOT the nested `children[]`, so malformed inputs are honest:
45
+ * a self-loop or cycle is broken by a visited set; a span whose `parentId`
46
+ * is absent from the trace is attached under the root, never dropped.
47
+ * `onPath` = root→selected ancestor chain; with no selection, root→deepest
48
+ * leaf. Over `cap` spans → `{ truncated: true, nodes: [], edges: [] }`.
49
+ */
50
+ export declare function buildLayeredGraph(root: TraceSpan, selectedId?: string, cap?: number): LayeredGraph;
51
+ /** Kind → display label. */
52
+ export declare const KIND_LABEL: Record<SpanKind, string>;
@@ -0,0 +1,9 @@
1
+ export * from "./types.js";
2
+ export * from "./duration.js";
3
+ export * from "./chat.js";
4
+ export * from "./attributes.js";
5
+ export * from "./align.js";
6
+ export * from "./flatten.js";
7
+ export * from "./bar-layout.js";
8
+ export * from "./cost.js";
9
+ export * from "./graph-layout.js";
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Shared data contracts for the trace-native component family (M8).
3
+ *
4
+ * `TraceSpan` is the intersection of three real shapes (phoenix ISpanItem,
5
+ * langfuse observation, theo-lens TraceSpanNode — blueprint Corner 2): the
6
+ * smallest type every kit component consumes. Transport fields (tRPC/GraphQL)
7
+ * are deliberately absent. Timestamps accept unix-ns (bigint or numeric
8
+ * string) or an ISO-8601 string — `toNs()` normalizes at the boundary.
9
+ *
10
+ * Note: `bigint` values do not JSON-serialize — story/args tooling must use
11
+ * fixtures directly (EC-2 of the plan).
12
+ */
13
+ /** OpenInference / OTel GenAI span-kind vocabulary (subset the kit renders). */
14
+ export type SpanKind = "llm" | "tool" | "retriever" | "embedding" | "agent" | "chain" | "reranker" | "evaluator" | "guardrail" | "unknown";
15
+ export type SpanStatus = "OK" | "ERROR" | "UNSET";
16
+ export interface TraceSpan {
17
+ id: string;
18
+ parentId: string | null;
19
+ name: string;
20
+ /** Raw kind hint; semantic kind is derived via `deriveSpanKind` when absent. */
21
+ kind?: string;
22
+ /** Unix ns (bigint | numeric string) or ISO-8601 string. */
23
+ startTime?: bigint | string;
24
+ /** Absent/null = in-flight span (renders unbounded). */
25
+ endTime?: bigint | string | null;
26
+ status?: SpanStatus;
27
+ model?: string;
28
+ provider?: string;
29
+ inputTokens?: number;
30
+ outputTokens?: number;
31
+ cacheReadTokens?: number;
32
+ cacheCreationTokens?: number;
33
+ ttftMs?: number;
34
+ costUsd?: number;
35
+ /** Raw input/output payloads (JSON string, chat array JSON, or plain text). */
36
+ inputValue?: string;
37
+ outputValue?: string;
38
+ attributes?: Record<string, unknown>;
39
+ events?: Array<{
40
+ name: string;
41
+ time?: bigint | string;
42
+ attributes?: Record<string, unknown>;
43
+ }>;
44
+ children?: TraceSpan[];
45
+ }
46
+ /** One OpenAI-shaped tool call attached to an assistant message. */
47
+ export interface ToolCall {
48
+ id: string;
49
+ function?: {
50
+ name?: string;
51
+ arguments?: string;
52
+ };
53
+ }
54
+ /** ChatML message — the role vocabulary common to phoenix/langfuse/lens. */
55
+ export interface ChatMessage {
56
+ role: string;
57
+ content: unknown;
58
+ tool_calls?: ToolCall[];
59
+ tool_call_id?: string;
60
+ }
61
+ export interface FlatSpan {
62
+ span: TraceSpan;
63
+ depth: number;
64
+ }
65
+ /** Per-row micro-stats surfaced by the transcript feed. Missing inputs collapse to 0/null, never NaN. */
66
+ export interface TranscriptRowStats {
67
+ inputTokens: number;
68
+ outputTokens: number;
69
+ costUsd: number;
70
+ durationMs: number | null;
71
+ }
72
+ /** One row in the reader-mode transcript feed. */
73
+ export interface TranscriptRow {
74
+ kind: "span" | "group-header";
75
+ spanId: string;
76
+ role?: string;
77
+ preview?: string;
78
+ stats?: TranscriptRowStats;
79
+ groupId?: string;
80
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared trace fixtures for the trace-native component family (M8 T1.1).
3
+ * Modeled after real agent traces from the theo-lens suite: branching,
4
+ * a retried tool call, an errored span, an orphan (malformed parent) and a
5
+ * clock-skewed span. Deterministic — no Date.now(), no randomness.
6
+ */
7
+ import type { TraceSpan } from "../../lib/trace/types.js";
8
+ /**
9
+ * Nested agent trace: root agent → llm plan → 2 tool branches (one retried,
10
+ * one errored) → final llm answer. 7 spans, depth 3.
11
+ */
12
+ export declare const NESTED_TRACE: TraceSpan;
13
+ /** Trace with an orphan (parent missing from the tree) and a clock-skewed span. */
14
+ export declare const MALFORMED_TRACE: TraceSpan;
15
+ /**
16
+ * Deterministic wide trace generator for virtualization paths: `n` children
17
+ * under one root, timings derived from the index (no randomness).
18
+ */
19
+ export declare function makeTrace(n: number): TraceSpan;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usetheo/ui",
3
- "version": "0.22.1",
3
+ "version": "0.26.0",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "description": "Violet Forge design system — generic React components + primitives (the non-AI foundation of @theokit/ui).",
@@ -51,6 +51,7 @@
51
51
  "devDependencies": {
52
52
  "@biomejs/biome": "^1.9.4",
53
53
  "@ladle/react": "^4.1.2",
54
+ "@tailwindcss/vite": "^4.3.2",
54
55
  "@testing-library/jest-dom": "^6.6.3",
55
56
  "@testing-library/react": "^16.1.0",
56
57
  "@testing-library/user-event": "^14.5.2",
@@ -71,6 +72,7 @@
71
72
  },
72
73
  "_provenance": "seeded from theo-ui @ 2b46eca (2026-07-03, pivot M-B)",
73
74
  "scripts": {
75
+ "dev": "ladle serve",
74
76
  "typecheck": "tsc --noEmit",
75
77
  "lint": "biome check src",
76
78
  "lint:ci": "biome check src",