@dxos/react-ui-trace 0.11.1 → 0.14.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 (115) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/index.mjs +1722 -561
  3. package/dist/lib/index.mjs.map +1 -1
  4. package/dist/lib/testing.mjs +9 -8
  5. package/dist/lib/testing.mjs.map +1 -1
  6. package/dist/lib/translations.mjs +5 -0
  7. package/dist/lib/translations.mjs.map +1 -1
  8. package/dist/types/src/components/Gantt/Gantt.d.ts +109 -24
  9. package/dist/types/src/components/Gantt/Gantt.d.ts.map +1 -1
  10. package/dist/types/src/components/Gantt/Gantt.stories.d.ts +73 -3
  11. package/dist/types/src/components/Gantt/Gantt.stories.d.ts.map +1 -1
  12. package/dist/types/src/components/Gantt/gantt-rows.d.ts +26 -0
  13. package/dist/types/src/components/Gantt/gantt-rows.d.ts.map +1 -0
  14. package/dist/types/src/components/Gantt/gantt-rows.test.d.ts +2 -0
  15. package/dist/types/src/components/Gantt/gantt-rows.test.d.ts.map +1 -0
  16. package/dist/types/src/components/Gantt/gantt-scale.d.ts +57 -0
  17. package/dist/types/src/components/Gantt/gantt-scale.d.ts.map +1 -0
  18. package/dist/types/src/components/Gantt/gantt-scale.test.d.ts +2 -0
  19. package/dist/types/src/components/Gantt/gantt-scale.test.d.ts.map +1 -0
  20. package/dist/types/src/components/Gantt/index.d.ts +2 -0
  21. package/dist/types/src/components/Gantt/index.d.ts.map +1 -1
  22. package/dist/types/src/components/Gantt/useEnter.d.ts +13 -0
  23. package/dist/types/src/components/Gantt/useEnter.d.ts.map +1 -0
  24. package/dist/types/src/components/Gantt/useRangeTween.d.ts +12 -0
  25. package/dist/types/src/components/Gantt/useRangeTween.d.ts.map +1 -0
  26. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +3 -3
  27. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
  28. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/Timeline/Timeline.d.ts +10 -2
  30. package/dist/types/src/components/Timeline/Timeline.d.ts.map +1 -1
  31. package/dist/types/src/components/Timeline/Timeline.stories.d.ts +8 -4
  32. package/dist/types/src/components/Timeline/Timeline.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Timeline/timeline-layout.d.ts +35 -0
  34. package/dist/types/src/components/Timeline/timeline-layout.d.ts.map +1 -0
  35. package/dist/types/src/components/Timeline/timeline-layout.test.d.ts +2 -0
  36. package/dist/types/src/components/Timeline/timeline-layout.test.d.ts.map +1 -0
  37. package/dist/types/src/components/TracePanel/SpanTreeView.d.ts +15 -0
  38. package/dist/types/src/components/TracePanel/SpanTreeView.d.ts.map +1 -0
  39. package/dist/types/src/components/TracePanel/TracePanel.d.ts +3 -3
  40. package/dist/types/src/components/TracePanel/TracePanel.d.ts.map +1 -1
  41. package/dist/types/src/components/TracePanel/TracePanel.stories.d.ts +46 -0
  42. package/dist/types/src/components/TracePanel/TracePanel.stories.d.ts.map +1 -0
  43. package/dist/types/src/components/TracePanel/trace-filter.d.ts +7 -2
  44. package/dist/types/src/components/TracePanel/trace-filter.d.ts.map +1 -1
  45. package/dist/types/src/components/TracePanel/useTraceMenu.d.ts.map +1 -1
  46. package/dist/types/src/execution-graph/execution-graph.d.ts +1 -1
  47. package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
  48. package/dist/types/src/hooks/useExecutionGraph.d.ts +2 -2
  49. package/dist/types/src/hooks/useExecutionGraph.d.ts.map +1 -1
  50. package/dist/types/src/hooks/useSessionTimeline.d.ts +1 -1
  51. package/dist/types/src/hooks/useSessionTimeline.d.ts.map +1 -1
  52. package/dist/types/src/hooks/useTraceMessages.d.ts +1 -1
  53. package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -1
  54. package/dist/types/src/session-timeline/TaskHistory.stories.d.ts +12 -0
  55. package/dist/types/src/session-timeline/TaskHistory.stories.d.ts.map +1 -0
  56. package/dist/types/src/session-timeline/gantt-mapping.d.ts +14 -0
  57. package/dist/types/src/session-timeline/gantt-mapping.d.ts.map +1 -0
  58. package/dist/types/src/session-timeline/gantt-mapping.test.d.ts +2 -0
  59. package/dist/types/src/session-timeline/gantt-mapping.test.d.ts.map +1 -0
  60. package/dist/types/src/session-timeline/index.d.ts +1 -0
  61. package/dist/types/src/session-timeline/index.d.ts.map +1 -1
  62. package/dist/types/src/session-timeline/session-timeline.d.ts +17 -2
  63. package/dist/types/src/session-timeline/session-timeline.d.ts.map +1 -1
  64. package/dist/types/src/session-timeline/types.d.ts +32 -0
  65. package/dist/types/src/session-timeline/types.d.ts.map +1 -1
  66. package/dist/types/src/testing/simulated-agent.d.ts +5 -4
  67. package/dist/types/src/testing/simulated-agent.d.ts.map +1 -1
  68. package/dist/types/src/testing/test-trace.d.ts +2 -2
  69. package/dist/types/src/testing/test-trace.d.ts.map +1 -1
  70. package/dist/types/src/translations.d.ts +5 -0
  71. package/dist/types/src/translations.d.ts.map +1 -1
  72. package/dist/types/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +30 -26
  74. package/src/components/Gantt/Gantt.stories.tsx +914 -96
  75. package/src/components/Gantt/Gantt.tsx +964 -261
  76. package/src/components/Gantt/gantt-rows.test.ts +123 -0
  77. package/src/components/Gantt/gantt-rows.ts +71 -0
  78. package/src/components/Gantt/gantt-scale.test.ts +105 -0
  79. package/src/components/Gantt/gantt-scale.ts +143 -0
  80. package/src/components/Gantt/index.ts +2 -0
  81. package/src/components/Gantt/useEnter.ts +33 -0
  82. package/src/components/Gantt/useRangeTween.ts +61 -0
  83. package/src/components/ProcessTree/ProcessTree.stories.tsx +2 -3
  84. package/src/components/ProcessTree/ProcessTree.tsx +99 -90
  85. package/src/components/Timeline/Timeline.stories.tsx +110 -22
  86. package/src/components/Timeline/Timeline.tsx +319 -271
  87. package/src/components/Timeline/timeline-layout.test.ts +177 -0
  88. package/src/components/Timeline/timeline-layout.ts +153 -0
  89. package/src/components/TracePanel/SpanTreeView.tsx +39 -0
  90. package/src/components/TracePanel/TracePanel.stories.tsx +106 -0
  91. package/src/components/TracePanel/TracePanel.tsx +113 -106
  92. package/src/components/TracePanel/trace-filter.test.ts +31 -2
  93. package/src/components/TracePanel/trace-filter.ts +28 -3
  94. package/src/components/TracePanel/useTraceMenu.ts +0 -1
  95. package/src/execution-graph/SPEC.md +10 -10
  96. package/src/execution-graph/execution-graph.test.ts +16 -15
  97. package/src/execution-graph/execution-graph.ts +108 -60
  98. package/src/execution-graph/pending-block-status.ts +1 -1
  99. package/src/execution-graph/sub-agent-delegation.test.ts +1 -1
  100. package/src/hooks/useExecutionGraph.ts +14 -11
  101. package/src/hooks/useSessionTimeline.ts +35 -9
  102. package/src/hooks/useTraceMessages.ts +1 -1
  103. package/src/session-timeline/TaskHistory.stories.tsx +142 -0
  104. package/src/session-timeline/gantt-mapping.test.ts +118 -0
  105. package/src/session-timeline/gantt-mapping.ts +158 -0
  106. package/src/session-timeline/index.ts +1 -0
  107. package/src/session-timeline/session-timeline.test.ts +585 -35
  108. package/src/session-timeline/session-timeline.ts +433 -62
  109. package/src/session-timeline/types.ts +14 -0
  110. package/src/testing/simulated-agent.ts +17 -16
  111. package/src/testing/test-trace.ts +14 -12
  112. package/src/translations.ts +8 -2
  113. package/dist/types/src/execution-graph/remote-snapshot.test.d.ts +0 -2
  114. package/dist/types/src/execution-graph/remote-snapshot.test.d.ts.map +0 -1
  115. package/src/execution-graph/remote-snapshot.test.ts +0 -116
@@ -1,38 +1,91 @@
1
- import React, { type ReactNode } from 'react';
2
- import { type ThemedClassName } from '@dxos/react-ui';
3
- export type GanttLaneKind = 'session' | 'task';
1
+ import React, { type PropsWithChildren, type ReactNode } from 'react';
2
+ import * as Util from '@dxos/react-ui/Util';
3
+ import { type Hue } from '@dxos/ui-theme';
4
+ import { type GanttAxis } from './gantt-scale.ts';
5
+ /**
6
+ * The chart's vocabulary is groups, lanes, segments and markers — deliberately not the vocabulary of
7
+ * whatever is being charted. A host maps its own nouns onto these (a process onto a group, a task
8
+ * onto a lane, a status change onto a marker) and the chart stays ignorant of what they mean.
9
+ */
4
10
  export type GanttLaneStatus = 'pending' | 'blocked' | 'running' | 'review' | 'done' | 'failed';
5
- export type GanttMarkerKind = 'request' | 'operation' | 'tool' | 'message' | 'error' | 'delegation' | 'task';
11
+ /**
12
+ * A band of related lanes, enclosed by one rectangle. Pure structure: the lanes inside carry the
13
+ * labels, so a group needs no name of its own.
14
+ */
15
+ export type GanttGroup = {
16
+ id: string;
17
+ /** Indents under another group; a nested group's band is drawn after its parent's. */
18
+ parentId?: string;
19
+ };
20
+ /** One stretch during which a lane was worked. `end` is absent while the stretch is still open. */
21
+ export type GanttSegment = {
22
+ start: number;
23
+ end?: number;
24
+ };
25
+ /** A fact the host wants beside a lane: the legend shows it in place of, or over, the lane's title, and never interprets it. */
26
+ export type GanttMeta = {
27
+ label: string;
28
+ title?: string;
29
+ };
30
+ /**
31
+ * One row. Its three references are deliberately distinct: `groupId` is which band it sits in,
32
+ * `parentId` is what it nests under, and `openedFrom` is what caused it. Collapsing any two of them
33
+ * into one edge is what left the previous model unable to hold a task hierarchy and a process tree
34
+ * at the same time.
35
+ */
6
36
  export type GanttLane = {
7
37
  id: string;
8
- kind: GanttLaneKind;
9
38
  label: string;
10
39
  status: GanttLaneStatus;
11
- start?: number;
12
- end?: number;
40
+ /** The band this lane sits in. */
41
+ groupId?: string;
42
+ /** Indents under another lane of the same group — nesting, nothing more. */
13
43
  parentId?: string;
14
- taskId?: string;
15
- blockedOn?: readonly string[];
16
- delegatedFrom?: {
44
+ /** Every stretch this lane was worked. A lane with none exists but has no extent, so no bar. */
45
+ segments?: readonly GanttSegment[];
46
+ /** The node this lane opened out of, on another lane. */
47
+ openedFrom?: {
17
48
  laneId: string;
18
49
  markerId: string;
19
50
  };
20
- tokens?: {
21
- input: number;
22
- output: number;
23
- total: number;
51
+ /**
52
+ * The node this lane's result came back into, on another lane — the mirror of `openedFrom`, and a
53
+ * separate fact: a lane can open out of another and end without ever reporting back.
54
+ */
55
+ closedInto?: {
56
+ laneId: string;
57
+ markerId: string;
24
58
  };
25
- toolCalls?: number;
59
+ /** Colours the legend dot, the bar, its nodes and its thread in place of the status colour. */
60
+ hue?: Hue;
61
+ /** Lanes this one waits on. */
62
+ blockedOn?: readonly string[];
63
+ meta?: readonly GanttMeta[];
26
64
  };
27
65
  export type GanttMarker = {
28
66
  id: string;
29
67
  laneId: string;
30
- kind: GanttMarkerKind;
68
+ /** The host's own word for what happened; shown in the hover card, never interpreted. */
69
+ kind?: string;
31
70
  timestamp: number;
32
71
  label: string;
33
72
  level?: 'info' | 'warn' | 'error';
73
+ /**
74
+ * A wait begun at this node and since ended — a question put to the reader and answered. Drawn as a
75
+ * dashed line along the lane to the node that ended it; a wait still open draws nothing, so the lane
76
+ * ends at the question until the answer lands.
77
+ */
78
+ wait?: {
79
+ until: string;
80
+ };
81
+ /** Awaiting a response — an unanswered question. The node pings until the response arrives. */
82
+ pending?: boolean;
34
83
  };
84
+ /** What the legend's column shows per lane: its title, or the facts the host attached to it. */
85
+ export type GanttLegendMode = 'title' | 'stats';
35
86
  export type GanttData = {
87
+ /** The bands. A chart with none draws its lanes plain, with no rectangles. */
88
+ groups?: readonly GanttGroup[];
36
89
  lanes: readonly GanttLane[];
37
90
  markers?: readonly GanttMarker[];
38
91
  range?: {
@@ -41,15 +94,48 @@ export type GanttData = {
41
94
  };
42
95
  now?: number;
43
96
  showNow?: boolean;
97
+ /**
98
+ * What the horizontal axis measures: `unit` steps once per event and scrolls to follow the newest;
99
+ * `time` fits the whole range to the width and eases to new bounds. `unit` by default.
100
+ */
101
+ axis?: GanttAxis;
102
+ /** Pixels per event on the `unit` axis. */
103
+ unitStep?: number;
104
+ /**
105
+ * Slide a newly arrived event out of the one before it — out of the node that opened its lane, for
106
+ * a lane's first — and grow its bar to meet it, on the `unit` axis. Only events that arrive while the
107
+ * chart is on screen animate, so a chart that is merely mounted is still.
108
+ */
109
+ animate?: boolean;
44
110
  onLaneSelect?: (lane: GanttLane) => void;
45
111
  onMarkerSelect?: (marker: GanttMarker) => void;
112
+ /** Called by `Gantt.AxisToggle`; without it the toggle does not render. */
113
+ onAxisChange?: (axis: GanttAxis) => void;
114
+ /** What the legend's column shows; held by the root when absent, `title` to begin with. */
115
+ legend?: GanttLegendMode;
116
+ /** Called by `Gantt.LegendToggle`. */
117
+ onLegendChange?: (legend: GanttLegendMode) => void;
46
118
  };
47
- type GanttRootProps = ThemedClassName<GanttData & {
119
+ type GanttRootProps = Util.ThemedClassName<GanttData & {
48
120
  children?: ReactNode;
49
121
  }>;
50
- type GanttLegendProps = ThemedClassName<{}>;
51
- type GanttMetaProps = ThemedClassName<{}>;
52
- type GanttChartProps = ThemedClassName<{}>;
122
+ type GanttLegendProps = Util.ThemedClassName<PropsWithChildren>;
123
+ type GanttAxisToggleProps = {};
124
+ /**
125
+ * Switches the chart between its axes: `time`, the run fitted to the width, and `unit`, one step per
126
+ * event. Renders nothing unless the root was given `onAxisChange`, since the axis is the host's state.
127
+ */
128
+ declare const GanttAxisToggle: {
129
+ (_: GanttAxisToggleProps): React.JSX.Element | null;
130
+ displayName: string;
131
+ };
132
+ type GanttLegendToggleProps = {};
133
+ /** Switches the legend's column between the lanes' titles and their stats. */
134
+ declare const GanttLegendToggle: {
135
+ (_: GanttLegendToggleProps): React.JSX.Element;
136
+ displayName: string;
137
+ };
138
+ type GanttChartProps = Util.ThemedClassName<{}>;
53
139
  export declare const Gantt: {
54
140
  Root: React.ForwardRefExoticComponent<Omit<GanttRootProps, "className"> & {
55
141
  classNames?: import("@dxos/ui-types").ClassNameValue;
@@ -57,12 +143,11 @@ export declare const Gantt: {
57
143
  Legend: React.ForwardRefExoticComponent<Omit<GanttLegendProps, "className"> & {
58
144
  classNames?: import("@dxos/ui-types").ClassNameValue;
59
145
  } & Pick<React.HTMLAttributes<Element>, "children" | "role" | "style"> & React.RefAttributes<HTMLDivElement>>;
146
+ AxisToggle: typeof GanttAxisToggle;
147
+ LegendToggle: typeof GanttLegendToggle;
60
148
  Chart: React.ForwardRefExoticComponent<Omit<{}, "className"> & {
61
149
  classNames?: import("@dxos/ui-types").ClassNameValue;
62
150
  } & React.RefAttributes<SVGSVGElement>>;
63
- Meta: React.ForwardRefExoticComponent<Omit<GanttMetaProps, "className"> & {
64
- classNames?: import("@dxos/ui-types").ClassNameValue;
65
- } & Pick<React.HTMLAttributes<Element>, "children" | "role" | "style"> & React.RefAttributes<HTMLDivElement>>;
66
151
  };
67
- export type { GanttChartProps, GanttLegendProps, GanttMetaProps, GanttRootProps };
152
+ export type { GanttAxisToggleProps, GanttChartProps, GanttLegendProps, GanttLegendToggleProps, GanttRootProps };
68
153
  //# sourceMappingURL=Gantt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Gantt.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/Gantt.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAsB,KAAK,SAAS,EAAoD,MAAM,OAAO,CAAC;AAGpH,OAAO,EAAa,KAAK,eAAe,EAA+B,MAAM,gBAAgB,CAAC;AAI9F,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAC/C,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAC/F,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,MAAM,CAAC;AAE7G,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CACnC,CAAC;AA6HF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAChD,CAAC;AAkBF,KAAK,cAAc,GAAG,eAAe,CAAC,SAAS,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AA4D5E,KAAK,gBAAgB,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;AA+C5C,KAAK,cAAc,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;AA8B1C,KAAK,eAAe,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;AA+P3C,eAAO,MAAM,KAAK;IAChB,IAAI;;;IACJ,MAAM;;;IACN,KAAK;;;IACL,IAAI;;;CACL,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"Gantt.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/Gantt.tsx"],"names":[],"mappings":"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"}
@@ -1,16 +1,39 @@
1
1
  import { type StoryObj } from '@storybook/react-vite';
2
2
  import React from 'react';
3
- import { type GanttData, type GanttLane, type GanttMarker } from './Gantt.tsx';
4
- type StoryArgs = GanttData & {
3
+ import { type GanttData, type GanttGroup, type GanttLane, type GanttMarker } from './Gantt.tsx';
4
+ type EventStreamOptions = {
5
+ /** How often an event arrives, in milliseconds. The stream is static without it. */
6
+ interval?: number;
7
+ /** The supervisor lane: what spawns the first children, and what they report back to. */
8
+ laneId: string;
9
+ /** How far each arrival advances the clock — the axis reads the instant, `interval` is real time. */
10
+ step: number;
11
+ /** The supervisor opens another child every so many arrivals. */
12
+ spawnEvery?: number;
13
+ /** How many events of its own a lane runs before it is finished, inclusive. */
14
+ childEvents?: readonly [number, number];
15
+ /** Percent chance a direct child delegates rather than works; halved at each level below it. */
16
+ nestedChance?: number;
17
+ /**
18
+ * How many lanes may be opened at each depth, deepest last. This is what makes the run finite: the
19
+ * budget is spent, everything in flight reports back, and the chart comes to rest — a demo that
20
+ * grows for as long as it is left open never shows what finishing looks like.
21
+ */
22
+ maxSpawns?: readonly number[];
23
+ };
24
+ type StoryArgs = GanttData & Partial<EventStreamOptions> & {
5
25
  /** Render the drawing alone, as a host that already lists the lanes does. */
6
26
  chartOnly?: boolean;
27
+ /** Show the data the chart was drawn from beneath it. */
28
+ inspect?: boolean;
7
29
  };
8
- declare const DefaultStory: (props: StoryArgs) => React.JSX.Element;
30
+ declare const DefaultStory: ({ chartOnly, inspect, interval, laneId, step, spawnEvery, childEvents, nestedChance, maxSpawns, ...data }: StoryArgs) => React.JSX.Element;
9
31
  declare const meta: {
10
32
  title: string;
11
33
  render: typeof DefaultStory;
12
34
  decorators: import("@storybook/react").Decorator[];
13
35
  args: {
36
+ groups: GanttGroup[];
14
37
  lanes: GanttLane[];
15
38
  markers: GanttMarker[];
16
39
  now: number;
@@ -18,6 +41,7 @@ declare const meta: {
18
41
  start: number;
19
42
  end: number;
20
43
  };
44
+ inspect: true;
21
45
  onLaneSelect: (lane: GanttLane) => void;
22
46
  onMarkerSelect: (marker: GanttMarker) => void;
23
47
  };
@@ -26,5 +50,51 @@ export default meta;
26
50
  type Story = StoryObj<typeof meta>;
27
51
  export declare const Default: Story;
28
52
  export declare const ChartOnly: Story;
53
+ /** The time axis under a stream: every arrival widens the range, so the whole history shifts left. */
29
54
  export declare const Live: Story;
55
+ /** The same run on the fitted axis, for contrast with {@link Live}: gaps argue for space by duration. */
56
+ export declare const TimeAxis: Story;
57
+ /** The primitives alone: one lane, one event a second, each opening out of the one before it. */
58
+ export declare const SingleLane: Story;
59
+ /**
60
+ * The supervisor fans out: every third arrival opens another child, and a child may delegate again
61
+ * rather than work — less likely the deeper it already is. Each lane runs a handful of events,
62
+ * reports back into a node of its own, and waits on anything it opened before it does.
63
+ *
64
+ * The run finishes: `maxSpawns` bounds how many lanes each depth may open, so the branches unwind
65
+ * from the leaves up, the supervisor closes its own span, and the chart comes to rest.
66
+ */
67
+ export declare const Delegation: Story;
68
+ /** One band, one lane, six events. */
69
+ export declare const OneLane: Story;
70
+ /** One band, four lanes over different spans — one worked twice, one still open. */
71
+ export declare const ManyLanes: Story;
72
+ /** A chart wider than its viewport opens scrolled to its newest events, not to the start of the history. */
73
+ export declare const TestOpensAtNewest: Story;
74
+ /** Beside the legend column the chart takes the remaining width, rather than collapsing to nothing. */
75
+ export declare const TestChartFillsRow: Story;
76
+ /**
77
+ * The legend's toggle switches its column between the lanes' titles and their stats, and hovering a
78
+ * title shows the stats it is not showing.
79
+ *
80
+ * 1. Hover the first lane's title: its card shows the lane's token count.
81
+ * 2. Press the legend toggle: the column shows stats instead of titles.
82
+ * 3. Press it again: the titles are back.
83
+ */
84
+ export declare const TestLegendStats: Story;
85
+ /** In a host taller than its lanes the chart fills it, so the horizontal scroll bar is at the host's foot. */
86
+ export declare const TestScrollerAtFoot: Story;
87
+ /**
88
+ * The drawing is one keyboard stop that walks its nodes.
89
+ *
90
+ * 1. Click the first node of the second lane: the chart takes focus and that node is current.
91
+ * 2. ArrowRight: the next node along the same lane.
92
+ * 3. ArrowDown: the nearest node on the lane below.
93
+ * 4. Space opens the current node's card; Space again closes it.
94
+ */
95
+ export declare const TestKeyboardNodes: Story;
96
+ /** One band whose lanes branch off one another: `parentId` indents, `openedFrom` and `closedInto` connect. */
97
+ export declare const Branching: Story;
98
+ /** Four bands: two nested under the first, one unrelated. */
99
+ export declare const ManyGroups: Story;
30
100
  //# sourceMappingURL=Gantt.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Gantt.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/Gantt.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAA8C,MAAM,OAAO,CAAC;AAMnE,OAAO,EAAS,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAuJtF,KAAK,SAAS,GAAG,SAAS,GAAG;IAC3B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAUF,QAAA,MAAM,YAAY,UAAW,SAAS,sBAKrC,CAAC;AAkCF,QAAA,MAAM,IAAI;;;;;;;;;YAQG,KAAK;YAAM,GAAG;;6BACF,SAAS;iCACL,WAAW;;CAEH,CAAC;eAEvB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC"}
1
+ {"version":3,"file":"Gantt.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/Gantt.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAA8C,MAAM,OAAO,CAAC;AAOnE,OAAO,EAAS,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAqYvG,KAAK,kBAAkB,GAAG;IACxB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAsQF,KAAK,SAAS,GAAG,SAAS,GACxB,OAAO,CAAC,kBAAkB,CAAC,GAAG;IAC5B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAKJ,QAAA,MAAM,YAAY,8GAWf,SAAS,sBAyCX,CAAC;AAEF,QAAA,MAAM,IAAI;;;;;;;;;;YASG,KAAK;YAAM,GAAG;;;6BAEF,SAAS;iCACL,WAAW;;CAEH,CAAC;eAEvB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,SAAS,EAAE,KAIvB,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,IAAI,EAAE,KAKlB,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,QAAQ,EAAE,KAItB,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,UAAU,EAAE,KAcxB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAMF,sCAAsC;AACtC,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,SAAS,EAAE,KASvB,CAAC;AAEF,4GAA4G;AAC5G,eAAO,MAAM,iBAAiB,EAAE,KAuB/B,CAAC;AAEF,uGAAuG;AACvG,eAAO,MAAM,iBAAiB,EAAE,KAe/B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,KAoC7B,CAAC;AAEF,8GAA8G;AAC9G,eAAO,MAAM,kBAAkB,EAAE,KAqChC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAyC/B,CAAC;AAEF,8GAA8G;AAC9G,eAAO,MAAM,SAAS,EAAE,KASvB,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,UAAU,EAAE,KASxB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type GanttGroup, type GanttLane } from './Gantt.tsx';
2
+ export type Row = {
3
+ lane: GanttLane;
4
+ depth: number;
5
+ index: number;
6
+ groupId: string | undefined;
7
+ };
8
+ /** A group's rows, contiguous — which is what lets one rectangle enclose them. */
9
+ export type Band = {
10
+ group: GanttGroup;
11
+ first: number;
12
+ last: number;
13
+ };
14
+ /**
15
+ * Rows in reading order: the ungrouped lanes, then each group's band, a nested group's band directly
16
+ * after its parent's. Within a band the lanes come in the order given, each nested under its
17
+ * `parentId`.
18
+ *
19
+ * A band is contiguous by construction, which is the whole reason the order is settled here rather
20
+ * than left to the caller: one rectangle can only enclose a run of adjacent rows.
21
+ */
22
+ export declare const orderRows: (groups: readonly GanttGroup[], lanes: readonly GanttLane[]) => {
23
+ rows: Row[];
24
+ bands: Band[];
25
+ };
26
+ //# sourceMappingURL=gantt-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-rows.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/gantt-rows.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,MAAM,GAAG,GAAG;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,IAAI,GAAG;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,WACZ,SAAS,UAAU,EAAE,SACtB,SAAS,SAAS,EAAE,KAC1B;IAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAoC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gantt-rows.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-rows.test.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/gantt-rows.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * What the horizontal axis measures.
3
+ * - `time` — real duration, fitted to the width available: an idle gap is as wide as it was long.
4
+ * - `unit` — one fixed step per event: a burst and a lull read alike, and the drawing grows to the
5
+ * right instead of compressing, so an event already placed never moves again. That is what makes a
6
+ * live chart watchable — on a fitted axis every arrival shifts the whole history left.
7
+ */
8
+ export type GanttAxis = 'time' | 'unit';
9
+ /** A labelled gridline, positioned in the same pixels as `GanttScale.at`. */
10
+ export type GanttTick = {
11
+ at: number;
12
+ label: string;
13
+ };
14
+ /** The mapping every part of the drawing shares: an instant to a horizontal offset in pixels. */
15
+ export type GanttScale = {
16
+ at: (time: number) => number;
17
+ /** The drawing's width: the time axis takes what it is given, the unit axis states its own. */
18
+ width: number;
19
+ /** The labelled gridlines, as many as fit — the label's own width decides, so the scale owns this. */
20
+ ticks: GanttTick[];
21
+ };
22
+ /**
23
+ * Elapsed time since the start of the axis. The span picks the form for every tick alike, so a
24
+ * run's labels read as one unit: `0.2s` below a second's step, `45s` below a minute, `1:05` below an
25
+ * hour, `1:02:05` beyond.
26
+ */
27
+ export declare const formatElapsed: (elapsed: number, { span, step }: {
28
+ span: number;
29
+ step: number;
30
+ }) => string;
31
+ export type TimeScaleOptions = {
32
+ range: {
33
+ start: number;
34
+ end: number;
35
+ };
36
+ /** The width the range is fitted into. */
37
+ width: number;
38
+ /** Clearance at each end, so a bar's cap and the first tick's label stay inside the drawing. */
39
+ pad: number;
40
+ };
41
+ /** Duration against width, labelled with the time elapsed since the start of the range. */
42
+ export declare const timeScale: ({ range, width, pad }: TimeScaleOptions) => GanttScale;
43
+ export type UnitScaleOptions = {
44
+ /** Every event's instant; order and duplicates do not matter. */
45
+ times: readonly number[];
46
+ /** Pixels per event — the axis's one unit. */
47
+ step: number;
48
+ /** Clearance at each end, which also keeps the newest node off the edge. */
49
+ pad: number;
50
+ };
51
+ /**
52
+ * One step per event, in the order they happened. Ordinals are global rather than per lane: a
53
+ * delegation drops from a parent's node to its child's first node, and only a shared ordering keeps
54
+ * those two at the same offset.
55
+ */
56
+ export declare const unitScale: ({ times, step, pad }: UnitScaleOptions) => GanttScale;
57
+ //# sourceMappingURL=gantt-scale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-scale.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/gantt-scale.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC,6EAA6E;AAC7E,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD,iGAAiG;AACjG,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,+FAA+F;IAC/F,KAAK,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC;AAcF;;;;GAIG;AACH,eAAO,MAAM,aAAa,YAAa,MAAM,kBAAkB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,KAAG,MAY/F,CAAC;AAKF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,SAAS,0BAA2B,gBAAgB,KAAG,UAanE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iEAAiE;IACjE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,yBAA0B,gBAAgB,KAAG,UA6ClE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gantt-scale.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-scale.test.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/gantt-scale.test.ts"],"names":[],"mappings":""}
@@ -1,2 +1,4 @@
1
1
  export * from './Gantt.tsx';
2
+ export * from './gantt-rows.ts';
3
+ export * from './gantt-scale.ts';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Which of `ids` arrived since the last frame.
3
+ *
4
+ * A caller draws an entering element at the place it came from — the event before it, the node that
5
+ * spawned its lane — and the next frame draws it where it belongs, leaving a CSS transition to carry
6
+ * it the rest of the way. That is all the bookkeeping an enter animation needs: everything else in
7
+ * the drawing animates from its own previous value, which the browser already has.
8
+ *
9
+ * Nothing present on mount ever counts as entering — a chart that animates its whole history open on
10
+ * first paint is noise, since the reader was not there to see it arrive.
11
+ */
12
+ export declare const useEnter: (ids: readonly string[]) => ((id: string) => boolean);
13
+ //# sourceMappingURL=useEnter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEnter.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/useEnter.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,QAAS,SAAS,MAAM,EAAE,KAAG,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAezE,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type TimeRange = {
2
+ start: number;
3
+ end: number;
4
+ };
5
+ /**
6
+ * The range to draw with: `target`, reached over a short ease rather than in one step, so a
7
+ * time axis whose bounds move (a new event, `now` advancing) slides every span, node and tick to
8
+ * its new place together instead of jumping. A new target mid-flight eases on from wherever the
9
+ * drawing is, so a stream of updates reads as one continuous motion.
10
+ */
11
+ export declare const useRangeTween: (target: TimeRange, enabled: boolean) => TimeRange;
12
+ //# sourceMappingURL=useRangeTween.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRangeTween.d.ts","sourceRoot":"","sources":["../../../../../src/components/Gantt/useRangeTween.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAavD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,WAAY,SAAS,WAAW,OAAO,KAAG,SAmCnE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import * as Process from '@dxos/compute/Process';
3
3
  export type ProcessTreeProps = {
4
- processes: readonly Process.Info[];
4
+ processes: readonly Process.Process[];
5
5
  /**
6
6
  * Maximum nesting depth from the root (1 = top-level processes only).
7
7
  *
@@ -14,12 +14,12 @@ export type ProcessTreeProps = {
14
14
  *
15
15
  * Must be referentially stable — `ProcessTree` is memoized on its props.
16
16
  */
17
- resolveLabel?: (process: Process.Info) => string | undefined;
17
+ resolveLabel?: (process: Process.Process) => string | undefined;
18
18
  /** Pids drawn as selected; the tree is controlled, so a click reports through `onSelectedChange`. */
19
19
  selected?: readonly string[];
20
20
  /** The selection after a click: the clicked pid alone, or toggled among the others on a meta-click. */
21
21
  onSelectedChange?: (selected: string[]) => void;
22
- onProcessTerminate?: (process: Process.Info) => void;
22
+ onProcessTerminate?: (process: Process.Process) => void;
23
23
  };
24
24
  /**
25
25
  * The agent's running processes as a tree, one row per process with its status glyph and metrics
@@ -1 +1 @@
1
- {"version":3,"file":"ProcessTree.d.ts","sourceRoot":"","sources":["../../../../../src/components/ProcessTree/ProcessTree.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AAcjD,MAAM,MAAM,gBAAgB,GAAG;IAE7B,SAAS,EAAE,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC;IACnC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,GAAG,SAAS,CAAC;IAC7D,qGAAqG;IACrG,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,uGAAuG;IACvG,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAChD,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;CACtD,CAAC;AAeF;;;;GAIG;AACH,eAAO,MAAM,WAAW;;6GAkFvB,CAAC"}
1
+ {"version":3,"file":"ProcessTree.d.ts","sourceRoot":"","sources":["../../../../../src/components/ProcessTree/ProcessTree.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AAgBjD,MAAM,MAAM,gBAAgB,GAAG;IAE7B,SAAS,EAAE,SAAS,OAAO,CAAC,OAAO,EAAE,CAAC;IACtC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IAChE,qGAAqG;IACrG,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,uGAAuG;IACvG,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAChD,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;CACzD,CAAC;AAeF;;;;GAIG;AACH,eAAO,MAAM,WAAW;;6GAkFvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProcessTree.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/ProcessTree/ProcessTree.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAUjE,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AAuDvE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAKC,CAAC;eAEtB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAKhC,CAAC"}
1
+ {"version":3,"file":"ProcessTree.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/ProcessTree/ProcessTree.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AASjE,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AAuDvE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAKC,CAAC;eAEtB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAKhC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { LogLevel } from '@dxos/log';
3
- import { type ThemedClassName } from '@dxos/react-ui';
3
+ import * as Util from '@dxos/react-ui/Util';
4
4
  import { type TimelineOptions } from './timeline-options.ts';
5
5
  /**
6
6
  * Mercurial-style Commit.
@@ -17,7 +17,7 @@ export type Commit = {
17
17
  /** DXN link for navigation to referenced objects. */
18
18
  link?: string;
19
19
  };
20
- export type TimelineProps = ThemedClassName<{
20
+ export type TimelineProps = Util.ThemedClassName<{
21
21
  /** Optional whitelist. */
22
22
  branches?: string[];
23
23
  /**
@@ -31,6 +31,11 @@ export type TimelineProps = ThemedClassName<{
31
31
  compact?: boolean;
32
32
  options?: TimelineOptions;
33
33
  debug?: boolean;
34
+ /**
35
+ * The element the rows are windowed against, which the host owns: a `ScrollArea.Viewport` or a
36
+ * `ScrollContainer.Viewport`, as `MessageList` binds to. Rows mount once it exists.
37
+ */
38
+ scroller: HTMLElement | null;
34
39
  onChange?: (props: {
35
40
  current?: number;
36
41
  commit?: Commit;
@@ -43,6 +48,9 @@ export type TimelineProps = ThemedClassName<{
43
48
  }>;
44
49
  /**
45
50
  * GitGraph-style timeline.
51
+ *
52
+ * Rows are windowed by `useWindow`, so rendering costs the viewport rather than the history. The
53
+ * layout is still computed over the whole history, so a windowed row draws every lane crossing it.
46
54
  */
47
55
  export declare const Timeline: React.NamedExoticComponent<Omit<TimelineProps, "className"> & {
48
56
  classNames?: import("@dxos/ui-types").ClassNameValue;
@@ -1 +1 @@
1
- {"version":3,"file":"Timeline.d.ts","sourceRoot":"","sources":["../../../../../src/components/Timeline/Timeline.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAQ,KAAK,eAAe,EAAkD,MAAM,gBAAgB,CAAC;AAQ5G,OAAO,EAAE,KAAK,eAAe,EAAkC,MAAM,uBAAuB,CAAC;AAE7F;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAWF,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC;IAC1C,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACjD,CAAC,CAAC;AAEH;;GAEG;AAEH,eAAO,MAAM,QAAQ;;6GAoTpB,CAAC"}
1
+ {"version":3,"file":"Timeline.d.ts","sourceRoot":"","sources":["../../../../../src/components/Timeline/Timeline.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkE,MAAM,OAAO,CAAC;AAGvF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAKrC,OAAO,KAAK,IAAI,MAAM,qBAAqB,CAAC;AAM5C,OAAO,EAAE,KAAK,eAAe,EAAkC,MAAM,uBAAuB,CAAC;AAE7F;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAWF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;IAC/C,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACjD,CAAC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;6GA4LpB,CAAC"}
@@ -1,12 +1,9 @@
1
1
  import { type StoryObj } from '@storybook/react-vite';
2
2
  import React from 'react';
3
3
  import { TimelineProps } from './Timeline.tsx';
4
- declare const DefaultStory: (props: TimelineProps) => React.JSX.Element;
4
+ declare const DefaultStory: (props: Omit<TimelineProps, 'scroller'>) => React.JSX.Element;
5
5
  declare const meta: {
6
6
  title: string;
7
- component: React.NamedExoticComponent<Omit<TimelineProps, "className"> & {
8
- classNames?: import("@dxos/ui-types").ClassNameValue;
9
- } & Pick<React.HTMLAttributes<Element>, "children" | "role" | "style"> & React.RefAttributes<HTMLDivElement>>;
10
7
  render: typeof DefaultStory;
11
8
  decorators: import("@storybook/react").Decorator[];
12
9
  };
@@ -20,5 +17,12 @@ export declare const Linear: Story;
20
17
  export declare const Empty: Story;
21
18
  export declare const Random: Story;
22
19
  export declare const Compact: Story;
20
+ export declare const Large: Story;
21
+ /**
22
+ * Windowing must not cost the graph: a row deep in the history still draws every lane crossing it,
23
+ * because the spans it reads are computed over the whole history, not over the mounted rows.
24
+ */
25
+ export declare const Branching: Story;
26
+ export declare const Keyboard: Story;
23
27
  export declare const Streaming: Story;
24
28
  //# sourceMappingURL=Timeline.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Timeline.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Timeline/Timeline.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAA2B,MAAM,OAAO,CAAC;AAQhD,OAAO,EAAyB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAuHtE,QAAA,MAAM,YAAY,UAAW,aAAa,sBAQzC,CAAC;AAEF,QAAA,MAAM,IAAI;;;;;;;CAKuB,CAAC;eAEnB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAgBrB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAUpB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KA4BvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAenB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAUpB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAAU,CAAC;AAE/B,eAAO,MAAM,MAAM,EAAE,KAEpB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAqEvB,CAAC"}
1
+ {"version":3,"file":"Timeline.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Timeline/Timeline.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAA2B,MAAM,OAAO,CAAC;AAchD,OAAO,EAAyB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAuHtE,QAAA,MAAM,YAAY,UAAW,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,sBAU3D,CAAC;AAEF,QAAA,MAAM,IAAI;;;;CAI2B,CAAC;eAEvB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAgBrB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAUpB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KA4BvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAenB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAUpB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAAU,CAAC;AAE/B,eAAO,MAAM,MAAM,EAAE,KAEpB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAuBF,eAAO,MAAM,KAAK,EAAE,KAanB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAqBvB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAetB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAsEvB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type Commit } from './Timeline.tsx';
2
+ /** The row range a branch's line covers, in commit indices. */
3
+ export type TimelineSpan = {
4
+ start: number;
5
+ end: number;
6
+ };
7
+ export type TimelineRow = {
8
+ commit: Commit;
9
+ /** Index into the commit list the layout was built from; `spans` share these coordinates. */
10
+ index: number;
11
+ };
12
+ export type TimelineLayout = {
13
+ /** One row per commit on a whitelisted branch, in commit order. */
14
+ rows: TimelineRow[];
15
+ /** Lane per branch; a branch outside the whitelist gets none, and so gets no rows. */
16
+ branchLane: Map<string, number>;
17
+ /** Lanes the row graphic has to be wide enough for. */
18
+ laneCount: number;
19
+ /** The span each branch's line covers. */
20
+ spans: Map<string, TimelineSpan>;
21
+ /** Row index per commit index — the keyboard navigates in commit indices but scrolls rows. */
22
+ rowByCommitIndex: Map<number, number>;
23
+ /** Commit index per commit id — a click names a commit, everything else speaks in indices. */
24
+ commitIndexById: Map<string, number>;
25
+ };
26
+ /**
27
+ * Lays a commit graph out into rows: which lane each branch draws in, how far each branch's line
28
+ * runs, and which commits get a row at all.
29
+ *
30
+ * Pure and linear in the number of commits: every lookup a commit makes about a parent, and every
31
+ * lane release, is served from an index built in one pass. Commits are assumed to be in topological
32
+ * order — a parent always precedes its children.
33
+ */
34
+ export declare const layoutTimeline: (commits: readonly Commit[], branches: readonly string[]) => TimelineLayout;
35
+ //# sourceMappingURL=timeline-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-layout.d.ts","sourceRoot":"","sources":["../../../../../src/components/Timeline/timeline-layout.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,+DAA+D;AAC/D,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,6FAA6F;IAC7F,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,mEAAmE;IACnE,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,sFAAsF;IACtF,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjC,8FAA8F;IAC9F,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,8FAA8F;IAC9F,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,YAAa,SAAS,MAAM,EAAE,YAAY,SAAS,MAAM,EAAE,KAAG,cA+GxF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timeline-layout.test.d.ts.map