@jorgerdz/timeview 0.1.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 (90) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +263 -0
  4. package/dist/cli/timeview.js +6710 -0
  5. package/dist/timeview.cjs +1 -0
  6. package/dist/timeview.js +5667 -0
  7. package/dist/tokens.css +67 -0
  8. package/dist/types/timeview/BandedTimeline.d.ts +11 -0
  9. package/dist/types/timeview/BandedTimeline.d.ts.map +1 -0
  10. package/dist/types/timeview/DensityHeatmap.d.ts +11 -0
  11. package/dist/types/timeview/DensityHeatmap.d.ts.map +1 -0
  12. package/dist/types/timeview/LaneCalendar.d.ts +11 -0
  13. package/dist/types/timeview/LaneCalendar.d.ts.map +1 -0
  14. package/dist/types/timeview/MetricTimeline.d.ts +8 -0
  15. package/dist/types/timeview/MetricTimeline.d.ts.map +1 -0
  16. package/dist/types/timeview/SpanMatrix.d.ts +8 -0
  17. package/dist/types/timeview/SpanMatrix.d.ts.map +1 -0
  18. package/dist/types/timeview/config.d.ts +22 -0
  19. package/dist/types/timeview/config.d.ts.map +1 -0
  20. package/dist/types/timeview/core/aggregate.d.ts +113 -0
  21. package/dist/types/timeview/core/aggregate.d.ts.map +1 -0
  22. package/dist/types/timeview/core/calendar.d.ts +27 -0
  23. package/dist/types/timeview/core/calendar.d.ts.map +1 -0
  24. package/dist/types/timeview/core/intervals.d.ts +8 -0
  25. package/dist/types/timeview/core/intervals.d.ts.map +1 -0
  26. package/dist/types/timeview/core/labels.d.ts +5 -0
  27. package/dist/types/timeview/core/labels.d.ts.map +1 -0
  28. package/dist/types/timeview/core/metric.d.ts +58 -0
  29. package/dist/types/timeview/core/metric.d.ts.map +1 -0
  30. package/dist/types/timeview/core/time.d.ts +22 -0
  31. package/dist/types/timeview/core/time.d.ts.map +1 -0
  32. package/dist/types/timeview/dashboard.d.ts +17 -0
  33. package/dist/types/timeview/dashboard.d.ts.map +1 -0
  34. package/dist/types/timeview/data.d.ts +21 -0
  35. package/dist/types/timeview/data.d.ts.map +1 -0
  36. package/dist/types/timeview/export.d.ts +14 -0
  37. package/dist/types/timeview/export.d.ts.map +1 -0
  38. package/dist/types/timeview/index.d.ts +28 -0
  39. package/dist/types/timeview/index.d.ts.map +1 -0
  40. package/dist/types/timeview/registry.d.ts +285 -0
  41. package/dist/types/timeview/registry.d.ts.map +1 -0
  42. package/dist/types/timeview/shared/Caption.d.ts +9 -0
  43. package/dist/types/timeview/shared/Caption.d.ts.map +1 -0
  44. package/dist/types/timeview/shared/EmptyState.d.ts +16 -0
  45. package/dist/types/timeview/shared/EmptyState.d.ts.map +1 -0
  46. package/dist/types/timeview/shared/Legend.d.ts +10 -0
  47. package/dist/types/timeview/shared/Legend.d.ts.map +1 -0
  48. package/dist/types/timeview/shared/Tooltip.d.ts +15 -0
  49. package/dist/types/timeview/shared/Tooltip.d.ts.map +1 -0
  50. package/dist/types/timeview/shared/useMeasuredWidth.d.ts +2 -0
  51. package/dist/types/timeview/shared/useMeasuredWidth.d.ts.map +1 -0
  52. package/dist/types/timeview/types.d.ts +158 -0
  53. package/dist/types/timeview/types.d.ts.map +1 -0
  54. package/docs/AGENT-USAGE.md +93 -0
  55. package/docs/COMPATIBILITY.md +134 -0
  56. package/docs/STUDIO.md +41 -0
  57. package/examples/README.md +21 -0
  58. package/examples/configs/bandedTimeline.json +31 -0
  59. package/examples/configs/densityHeatmap.json +33 -0
  60. package/examples/configs/laneCalendar.json +31 -0
  61. package/examples/configs/metricTimeline.json +51 -0
  62. package/examples/configs/spanMatrix.json +31 -0
  63. package/package.json +94 -0
  64. package/render.html +12 -0
  65. package/src/render.tsx +67 -0
  66. package/src/styles/tokens.css +67 -0
  67. package/src/timeview/BandedTimeline.tsx +620 -0
  68. package/src/timeview/DensityHeatmap.tsx +513 -0
  69. package/src/timeview/LaneCalendar.tsx +496 -0
  70. package/src/timeview/MetricTimeline.tsx +993 -0
  71. package/src/timeview/SpanMatrix.tsx +721 -0
  72. package/src/timeview/config.ts +399 -0
  73. package/src/timeview/core/aggregate.ts +317 -0
  74. package/src/timeview/core/calendar.ts +81 -0
  75. package/src/timeview/core/intervals.ts +52 -0
  76. package/src/timeview/core/labels.ts +19 -0
  77. package/src/timeview/core/metric.ts +263 -0
  78. package/src/timeview/core/time.ts +103 -0
  79. package/src/timeview/dashboard.ts +80 -0
  80. package/src/timeview/data.ts +242 -0
  81. package/src/timeview/export.ts +48 -0
  82. package/src/timeview/index.ts +106 -0
  83. package/src/timeview/registry.ts +207 -0
  84. package/src/timeview/shared/Caption.tsx +40 -0
  85. package/src/timeview/shared/EmptyState.tsx +90 -0
  86. package/src/timeview/shared/Legend.tsx +67 -0
  87. package/src/timeview/shared/Tooltip.tsx +59 -0
  88. package/src/timeview/shared/useMeasuredWidth.ts +21 -0
  89. package/src/timeview/types.ts +159 -0
  90. package/vite.config.ts +11 -0
@@ -0,0 +1,285 @@
1
+ import type { ComponentType } from "react";
2
+ import { BandedTimeline } from "./BandedTimeline";
3
+ import type { BandedTimelineProps } from "./BandedTimeline";
4
+ import { LaneCalendar } from "./LaneCalendar";
5
+ import type { LaneCalendarProps } from "./LaneCalendar";
6
+ import { DensityHeatmap } from "./DensityHeatmap";
7
+ import type { DensityHeatmapProps } from "./DensityHeatmap";
8
+ import { SpanMatrix } from "./SpanMatrix";
9
+ import type { SpanMatrixProps } from "./SpanMatrix";
10
+ import { MetricTimeline } from "./MetricTimeline";
11
+ import type { MetricTimelineProps } from "./MetricTimeline";
12
+ import type { BandedTimelineSpec, DensityHeatmapSpec, LaneCalendarSpec, MetricTimelineSpec, SpanMatrixSpec, TimeDataset } from "./types";
13
+ export type VisualizerId = "bandedTimeline" | "laneCalendar" | "densityHeatmap" | "spanMatrix" | "metricTimeline";
14
+ type VisualizerSpec = BandedTimelineSpec | LaneCalendarSpec | DensityHeatmapSpec | SpanMatrixSpec | MetricTimelineSpec;
15
+ export type VisualizerProps = BandedTimelineProps | LaneCalendarProps | DensityHeatmapProps | SpanMatrixProps | MetricTimelineProps;
16
+ export interface TimeviewVisualizer {
17
+ id: VisualizerId;
18
+ kind: NonNullable<VisualizerSpec["kind"]>;
19
+ label: string;
20
+ description: string;
21
+ Component: ComponentType<any>;
22
+ defaultDataset: TimeDataset;
23
+ defaultSpec: VisualizerSpec;
24
+ defaultPalette: string[];
25
+ controls: {
26
+ legend: boolean;
27
+ events: boolean;
28
+ caption: boolean;
29
+ today: boolean;
30
+ options: string[];
31
+ };
32
+ agentGuide: string;
33
+ }
34
+ export declare const TV_VISUALIZERS: ({
35
+ id: "bandedTimeline";
36
+ kind: "bandedTimeline";
37
+ label: string;
38
+ description: string;
39
+ Component: typeof BandedTimeline;
40
+ defaultDataset: TimeDataset;
41
+ defaultSpec: {
42
+ kind: "bandedTimeline";
43
+ title: string | undefined;
44
+ overlapMode: "lanes";
45
+ density: "comfortable";
46
+ legend: {
47
+ enabled: true;
48
+ position: "bottom";
49
+ };
50
+ caption: {
51
+ enabled: true;
52
+ position: "bottom";
53
+ text: string;
54
+ };
55
+ events: {
56
+ showPoints: true;
57
+ showLabels: true;
58
+ showMarkers?: undefined;
59
+ };
60
+ laneMode?: undefined;
61
+ today?: undefined;
62
+ bucket?: undefined;
63
+ measure?: undefined;
64
+ groupBy?: undefined;
65
+ scaleMode?: undefined;
66
+ showValues?: undefined;
67
+ stateMode?: undefined;
68
+ yAxis?: undefined;
69
+ defaultDays?: undefined;
70
+ showPoints?: undefined;
71
+ showTarget?: undefined;
72
+ minimap?: undefined;
73
+ zoom?: undefined;
74
+ showCounts?: undefined;
75
+ };
76
+ defaultPalette: string[];
77
+ controls: {
78
+ legend: true;
79
+ events: true;
80
+ caption: true;
81
+ today: false;
82
+ options: string[];
83
+ };
84
+ agentGuide: string;
85
+ } | {
86
+ id: "laneCalendar";
87
+ kind: "laneCalendar";
88
+ label: string;
89
+ description: string;
90
+ Component: typeof LaneCalendar;
91
+ defaultDataset: TimeDataset;
92
+ defaultSpec: {
93
+ kind: "laneCalendar";
94
+ title: string | undefined;
95
+ laneMode: "packed";
96
+ density: "comfortable";
97
+ legend: {
98
+ enabled: true;
99
+ position: "bottom";
100
+ };
101
+ caption: {
102
+ enabled: true;
103
+ position: "bottom";
104
+ text: string;
105
+ };
106
+ events: {
107
+ showLabels: true;
108
+ showPoints?: undefined;
109
+ showMarkers?: undefined;
110
+ };
111
+ today: null;
112
+ overlapMode?: undefined;
113
+ bucket?: undefined;
114
+ measure?: undefined;
115
+ groupBy?: undefined;
116
+ scaleMode?: undefined;
117
+ showValues?: undefined;
118
+ stateMode?: undefined;
119
+ yAxis?: undefined;
120
+ defaultDays?: undefined;
121
+ showPoints?: undefined;
122
+ showTarget?: undefined;
123
+ minimap?: undefined;
124
+ zoom?: undefined;
125
+ showCounts?: undefined;
126
+ };
127
+ defaultPalette: string[];
128
+ controls: {
129
+ legend: true;
130
+ events: true;
131
+ caption: true;
132
+ today: true;
133
+ options: string[];
134
+ };
135
+ agentGuide: string;
136
+ } | {
137
+ id: "densityHeatmap";
138
+ kind: "densityHeatmap";
139
+ label: string;
140
+ description: string;
141
+ Component: typeof DensityHeatmap;
142
+ defaultDataset: TimeDataset;
143
+ defaultSpec: {
144
+ kind: "densityHeatmap";
145
+ title: string | undefined;
146
+ bucket: "day";
147
+ measure: "count";
148
+ groupBy: "category";
149
+ scaleMode: "category";
150
+ density: "comfortable";
151
+ showValues: true;
152
+ caption: {
153
+ enabled: true;
154
+ position: "bottom";
155
+ text: string;
156
+ };
157
+ overlapMode?: undefined;
158
+ legend?: undefined;
159
+ events?: undefined;
160
+ laneMode?: undefined;
161
+ today?: undefined;
162
+ stateMode?: undefined;
163
+ yAxis?: undefined;
164
+ defaultDays?: undefined;
165
+ showPoints?: undefined;
166
+ showTarget?: undefined;
167
+ minimap?: undefined;
168
+ zoom?: undefined;
169
+ showCounts?: undefined;
170
+ };
171
+ defaultPalette: string[];
172
+ controls: {
173
+ legend: false;
174
+ events: false;
175
+ caption: true;
176
+ today: false;
177
+ options: string[];
178
+ };
179
+ agentGuide: string;
180
+ } | {
181
+ id: "metricTimeline";
182
+ kind: "metricTimeline";
183
+ label: string;
184
+ description: string;
185
+ Component: typeof MetricTimeline;
186
+ defaultDataset: TimeDataset;
187
+ defaultSpec: {
188
+ kind: "metricTimeline";
189
+ title: string | undefined;
190
+ stateMode: "band";
191
+ yAxis: "auto";
192
+ defaultDays: 90;
193
+ today: string;
194
+ density: "comfortable";
195
+ showPoints: true;
196
+ showValues: false;
197
+ showTarget: true;
198
+ minimap: true;
199
+ legend: {
200
+ enabled: true;
201
+ position: "bottom";
202
+ };
203
+ caption: {
204
+ enabled: true;
205
+ position: "bottom";
206
+ text: string;
207
+ };
208
+ events: {
209
+ showMarkers: true;
210
+ showPoints?: undefined;
211
+ showLabels?: undefined;
212
+ };
213
+ overlapMode?: undefined;
214
+ laneMode?: undefined;
215
+ bucket?: undefined;
216
+ measure?: undefined;
217
+ groupBy?: undefined;
218
+ scaleMode?: undefined;
219
+ zoom?: undefined;
220
+ showCounts?: undefined;
221
+ };
222
+ defaultPalette: string[];
223
+ controls: {
224
+ legend: true;
225
+ events: true;
226
+ caption: true;
227
+ today: true;
228
+ options: string[];
229
+ };
230
+ agentGuide: string;
231
+ } | {
232
+ id: "spanMatrix";
233
+ kind: "spanMatrix";
234
+ label: string;
235
+ description: string;
236
+ Component: typeof SpanMatrix;
237
+ defaultDataset: TimeDataset;
238
+ defaultSpec: {
239
+ kind: "spanMatrix";
240
+ title: string | undefined;
241
+ bucket: "day";
242
+ groupBy: "category";
243
+ zoom: number;
244
+ density: "comfortable";
245
+ showCounts: true;
246
+ legend: {
247
+ enabled: true;
248
+ position: "bottom";
249
+ };
250
+ caption: {
251
+ enabled: true;
252
+ position: "bottom";
253
+ text: string;
254
+ };
255
+ events: {
256
+ showMarkers: true;
257
+ showPoints?: undefined;
258
+ showLabels?: undefined;
259
+ };
260
+ today: string;
261
+ overlapMode?: undefined;
262
+ laneMode?: undefined;
263
+ measure?: undefined;
264
+ scaleMode?: undefined;
265
+ showValues?: undefined;
266
+ stateMode?: undefined;
267
+ yAxis?: undefined;
268
+ defaultDays?: undefined;
269
+ showPoints?: undefined;
270
+ showTarget?: undefined;
271
+ minimap?: undefined;
272
+ };
273
+ defaultPalette: string[];
274
+ controls: {
275
+ legend: true;
276
+ events: true;
277
+ caption: true;
278
+ today: true;
279
+ options: string[];
280
+ };
281
+ agentGuide: string;
282
+ })[];
283
+ export declare const TV_VISUALIZER_BY_ID: Record<VisualizerId, TimeviewVisualizer>;
284
+ export {};
285
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/timeview/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzI,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,cAAc,GAAG,gBAAgB,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAClH,KAAK,cAAc,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,cAAc,GAAG,kBAAkB,CAAC;AACvH,MAAM,MAAM,eAAe,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAEpI,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAC9B,cAAc,EAAE,WAAW,CAAC;IAC5B,WAAW,EAAE,cAAc,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkKK,CAAC;AAEjC,eAAO,MAAM,mBAAmB,EAA2E,MAAM,CAC/G,YAAY,EACZ,kBAAkB,CACnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CaptionPosition } from "../types";
2
+ interface CaptionProps {
3
+ position: CaptionPosition;
4
+ text: string;
5
+ narrow: boolean;
6
+ }
7
+ export declare function Caption({ position, text, narrow }: CaptionProps): import("react").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Caption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Caption.d.ts","sourceRoot":"","sources":["../../../../src/timeview/shared/Caption.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,UAAU,YAAY;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,+BA6B/D"}
@@ -0,0 +1,16 @@
1
+ import type { CSSProperties } from "react";
2
+ type EmptyStateIcon = "calendar" | "grid" | "matrix" | "trend";
3
+ type EmptyStateVariant = "overlay" | "panel";
4
+ interface EmptyStateProps {
5
+ title: string;
6
+ description?: string;
7
+ icon?: EmptyStateIcon;
8
+ variant?: EmptyStateVariant;
9
+ background?: boolean;
10
+ bordered?: boolean;
11
+ height?: CSSProperties["height"];
12
+ narrow?: boolean;
13
+ }
14
+ export declare function EmptyState({ title, description, icon, variant, background, bordered, height, narrow, }: EmptyStateProps): import("react").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../../src/timeview/shared/EmptyState.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,KAAK,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC/D,KAAK,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7C,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAiB,EACjB,OAAmB,EACnB,UAAkB,EAClB,QAAgB,EAChB,MAAY,EACZ,MAAc,GACf,EAAE,eAAe,+BAgCjB"}
@@ -0,0 +1,10 @@
1
+ import type { LegendPosition, TimeLabel } from "../types";
2
+ interface LegendProps {
3
+ labels: TimeLabel[];
4
+ colors: Record<string, string>;
5
+ position: LegendPosition;
6
+ vertical?: boolean;
7
+ }
8
+ export declare function Legend({ labels, colors, position, vertical }: LegendProps): import("react").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=Legend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Legend.d.ts","sourceRoot":"","sources":["../../../../src/timeview/shared/Legend.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1D,UAAU,WAAW;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAgB,EAAE,EAAE,WAAW,+BAuDjF"}
@@ -0,0 +1,15 @@
1
+ interface TooltipProps {
2
+ left: number;
3
+ top: number;
4
+ width: number;
5
+ color: string;
6
+ label: string;
7
+ title: string;
8
+ line: string;
9
+ sub: string;
10
+ kindLabel: string;
11
+ isEvent: boolean;
12
+ }
13
+ export declare function Tooltip({ left, top, width, color, label, title, line, sub, kindLabel, isEvent }: TooltipProps): import("react").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=Tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../../src/timeview/shared/Tooltip.tsx"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,YAAY,+BAyC7G"}
@@ -0,0 +1,2 @@
1
+ export declare function useMeasuredWidth<T extends HTMLElement>(defaultWidth?: number): readonly [import("react").RefObject<T>, number];
2
+ //# sourceMappingURL=useMeasuredWidth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMeasuredWidth.d.ts","sourceRoot":"","sources":["../../../../src/timeview/shared/useMeasuredWidth.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAAE,YAAY,SAAO,mDAgB1E"}
@@ -0,0 +1,158 @@
1
+ /** Anything the helpers will accept as a moment in time. */
2
+ export type TimeInput = number | string | Date;
3
+ /** A categorical label. `color` is advisory — at render time the active
4
+ * `palette[i]` (mapped by index) wins, so a dataset re-themes by swapping
5
+ * the palette without touching the data. */
6
+ export interface TimeLabel {
7
+ id: string;
8
+ name: string;
9
+ color?: string;
10
+ }
11
+ /** An instant event (milestone). Rendered as a hollow diamond. */
12
+ export interface TimeEvent {
13
+ id: string;
14
+ at: string;
15
+ title: string;
16
+ labelIds?: string[];
17
+ }
18
+ /** A date range. Rendered as an interval band in a lane. */
19
+ export interface TimeInterval {
20
+ id: string;
21
+ range: {
22
+ start: string;
23
+ end: string;
24
+ };
25
+ title: string;
26
+ labelIds?: string[];
27
+ }
28
+ /** A dated numeric sample for metric visualizers. */
29
+ export interface MetricSample {
30
+ at: string;
31
+ value: number;
32
+ }
33
+ /** Optional numeric series carried by metric-oriented visualizers. */
34
+ export interface MetricSeries {
35
+ id: string;
36
+ name: string;
37
+ unit?: string;
38
+ samples: MetricSample[];
39
+ target?: {
40
+ value: number;
41
+ label?: string;
42
+ };
43
+ }
44
+ /** schema `timeview.dataset.v1` */
45
+ export interface TimeDataset {
46
+ schemaVersion: "timeview.dataset.v1";
47
+ timezone: string;
48
+ meta?: {
49
+ title?: string;
50
+ description?: string;
51
+ };
52
+ labels: TimeLabel[];
53
+ events: TimeEvent[];
54
+ intervals: TimeInterval[];
55
+ series?: MetricSeries;
56
+ }
57
+ export type Density = "comfortable" | "compact";
58
+ export type LegendPosition = "top" | "bottom" | "right" | "off";
59
+ export type CaptionPosition = "top" | "bottom" | "off";
60
+ export type OverlapMode = "lanes" | "packed" | "layered" | "hatched";
61
+ export type LaneMode = "packed" | "category";
62
+ export type TodayMode = "auto";
63
+ export type TodayValue = string | TodayMode | null;
64
+ export type TimeBucketMode = "day" | "week";
65
+ export type HeatmapMeasure = "count" | "duration";
66
+ export type HeatmapGroupBy = "category" | "none";
67
+ export type HeatmapScaleMode = "category" | "uniform";
68
+ export type MetricStateMode = "band" | "tint" | "off";
69
+ export type MetricYAxisMode = "auto" | "full";
70
+ export type MetricDefaultDays = 30 | 90 | 180 | 365;
71
+ /** Options shared by every Timeview visualizer. */
72
+ export interface ViewSpecBase {
73
+ title?: string;
74
+ /** "comfortable" | "compact" */
75
+ density?: Density;
76
+ legend?: {
77
+ enabled?: boolean;
78
+ position?: LegendPosition;
79
+ };
80
+ caption?: {
81
+ enabled?: boolean;
82
+ position?: CaptionPosition;
83
+ text?: string;
84
+ };
85
+ events?: {
86
+ showPoints?: boolean;
87
+ showLabels?: boolean;
88
+ showMarkers?: boolean;
89
+ };
90
+ }
91
+ /** View-specific projection for BandedTimeline. */
92
+ export interface BandedTimelineSpec extends ViewSpecBase {
93
+ kind?: "bandedTimeline";
94
+ /** how simultaneously-active intervals are resolved */
95
+ overlapMode?: OverlapMode;
96
+ }
97
+ /** View-specific projection for LaneCalendar. */
98
+ export interface LaneCalendarSpec extends ViewSpecBase {
99
+ kind?: "laneCalendar";
100
+ /** how interval rows are preserved across week rows */
101
+ laneMode?: LaneMode;
102
+ /** "auto" uses browser-local today, ISO strings freeze the marker, null/omitted disables it */
103
+ today?: TodayValue;
104
+ }
105
+ /** View-specific projection for DensityHeatmap. */
106
+ export interface DensityHeatmapSpec extends ViewSpecBase {
107
+ kind?: "densityHeatmap";
108
+ /** time bucket granularity */
109
+ bucket?: TimeBucketMode;
110
+ /** density value encoded by cell intensity */
111
+ measure?: HeatmapMeasure;
112
+ /** row grouping derived from existing dataset dimensions */
113
+ groupBy?: HeatmapGroupBy;
114
+ /** category-colored rows or one neutral comparable ramp */
115
+ scaleMode?: HeatmapScaleMode;
116
+ /** show count/duration text inside cells when space allows */
117
+ showValues?: boolean;
118
+ }
119
+ /** View-specific projection for SpanMatrix. */
120
+ export interface SpanMatrixSpec extends ViewSpecBase {
121
+ kind?: "spanMatrix";
122
+ /** time bucket granularity */
123
+ bucket?: TimeBucketMode;
124
+ /** row grouping derived from existing dataset dimensions */
125
+ groupBy?: HeatmapGroupBy;
126
+ /** column scale multiplier; 1 is the default bucket width */
127
+ zoom?: number;
128
+ /** show overlap counts inside present cells */
129
+ showCounts?: boolean;
130
+ /** ISO string freezes the marker; null/omitted disables it */
131
+ today?: string | null;
132
+ }
133
+ /** View-specific projection for MetricTimeline. */
134
+ export interface MetricTimelineSpec extends ViewSpecBase {
135
+ kind?: "metricTimeline";
136
+ /** State intervals as a separate band row, line tinting, or hidden. */
137
+ stateMode?: MetricStateMode;
138
+ /** Fit y-axis to visible window or full series. */
139
+ yAxis?: MetricYAxisMode;
140
+ /** Opening viewport span ending at today or the series end. */
141
+ defaultDays?: MetricDefaultDays;
142
+ /** ISO string freezes the default viewport end; null/omitted uses the series end. */
143
+ today?: string | null;
144
+ showPoints?: boolean;
145
+ showValues?: boolean;
146
+ showTarget?: boolean;
147
+ minimap?: boolean;
148
+ }
149
+ /** Back-compat alias for the first Timeview visualizer's spec. */
150
+ export type ViewSpec = BandedTimelineSpec | LaneCalendarSpec | DensityHeatmapSpec | SpanMatrixSpec | MetricTimelineSpec;
151
+ /** A linear time→pixel scale (callable, with d3-style extras). */
152
+ export interface TvScale {
153
+ (t: TimeInput): number;
154
+ invert: (px: number) => Date;
155
+ domain: [number, number];
156
+ width: number;
157
+ }
158
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/timeview/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ # Timeview Agent Usage
2
+
3
+ Use this guide when an automation agent, cron job, or local script needs to generate
4
+ Timeview charts or dashboards.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ npm install @jorgerdz/timeview
10
+ npx playwright install chromium
11
+ ```
12
+
13
+ The package exposes a `timeview` command:
14
+
15
+ ```bash
16
+ npx timeview describe --json
17
+ npx timeview validate ./chart.json --json
18
+ npx timeview render ./chart.json --format png --preset 1600x900 --out ./out/chart.png --json
19
+ npx timeview render-dashboard ./dashboard.json --out ./out --today 2026-06-10 --json
20
+ ```
21
+
22
+ From this repository checkout, use the local script instead:
23
+
24
+ ```bash
25
+ npm run --silent timeview -- describe --json
26
+ ```
27
+
28
+ ## Contract
29
+
30
+ Agents should create a complete `TimeviewConfigV1`:
31
+
32
+ ```json
33
+ {
34
+ "v": 1,
35
+ "visualizer": "bandedTimeline",
36
+ "dataset": {
37
+ "schemaVersion": "timeview.dataset.v1",
38
+ "timezone": "UTC",
39
+ "labels": [],
40
+ "events": [],
41
+ "intervals": []
42
+ },
43
+ "spec": { "kind": "bandedTimeline" },
44
+ "palette": ["#2563eb", "#16a34a", "#dc2626"]
45
+ }
46
+ ```
47
+
48
+ Rules:
49
+
50
+ - Run `timeview describe --json` before choosing a visualizer.
51
+ - Validate the JSON before rendering.
52
+ - Use complete datasets rather than fixture names.
53
+ - Use ISO date strings.
54
+ - Use `today: null` or an explicit ISO date for deterministic exports.
55
+ - Use `today: "auto"` only for live browser previews; the CLI freezes it during export.
56
+ - Keep palette arrays in config. Palette order maps to `dataset.labels` by index.
57
+
58
+ ## Error Handling
59
+
60
+ The CLI writes human-readable errors to stderr and exits non-zero when validation or
61
+ rendering fails. Add `--json` to receive a machine-readable stderr payload:
62
+
63
+ ```json
64
+ {
65
+ "ok": false,
66
+ "code": "TIMEVIEW_CONFIG_INVALID",
67
+ "message": "Invalid Timeview config.",
68
+ "errors": ["schemaVersion must be \"timeview.dataset.v1\"."]
69
+ }
70
+ ```
71
+
72
+ Exit codes:
73
+
74
+ - `1`: unexpected error
75
+ - `2`: usage error
76
+ - `3`: file or JSON read error
77
+ - `4`: config or dashboard validation error
78
+ - `5`: render error
79
+
80
+ Prefer repairing the config and re-running validation before rendering.
81
+
82
+ Future releases should keep `describe --json` machine-readable and additive whenever
83
+ possible.
84
+
85
+ ## Examples
86
+
87
+ Complete configs live in `examples/configs`:
88
+
89
+ - `bandedTimeline.json`
90
+ - `laneCalendar.json`
91
+ - `densityHeatmap.json`
92
+ - `metricTimeline.json`
93
+ - `spanMatrix.json`