@vllnt/ui 0.2.0 → 0.2.1-canary.06f0e84

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 (202) hide show
  1. package/CHANGELOG.md +46 -1
  2. package/README.md +27 -12
  3. package/dist/components/activity-log/activity-log.js +1 -0
  4. package/dist/components/agent-activity/agent-activity.js +311 -0
  5. package/dist/components/agent-activity/index.js +18 -0
  6. package/dist/components/ai-artifact/ai-artifact.js +422 -0
  7. package/dist/components/ai-artifact/index.js +24 -0
  8. package/dist/components/ai-sidebar/ai-sidebar.js +254 -0
  9. package/dist/components/ai-sidebar/index.js +22 -0
  10. package/dist/components/alert-pulse/alert-pulse.js +93 -0
  11. package/dist/components/alert-pulse/index.js +6 -0
  12. package/dist/components/anchor-port/anchor-port.js +51 -0
  13. package/dist/components/anchor-port/index.js +4 -0
  14. package/dist/components/animated-text/animated-text.js +1 -0
  15. package/dist/components/auto-reload/auto-reload.js +367 -0
  16. package/dist/components/auto-reload/index.js +6 -0
  17. package/dist/components/banner/banner.js +155 -0
  18. package/dist/components/banner/index.js +10 -0
  19. package/dist/components/bottom-activity-strip/bottom-activity-strip.js +91 -0
  20. package/dist/components/bottom-activity-strip/index.js +6 -0
  21. package/dist/components/bottom-bar/bottom-bar.js +25 -0
  22. package/dist/components/bottom-bar/index.js +4 -0
  23. package/dist/components/canvas-shell/canvas-foundation-demo.js +183 -0
  24. package/dist/components/canvas-shell/canvas-shell-route-config.js +0 -0
  25. package/dist/components/canvas-shell/canvas-shell.js +261 -0
  26. package/dist/components/canvas-shell/index.js +4 -0
  27. package/dist/components/canvas-view/canvas-view.js +461 -0
  28. package/dist/components/canvas-view/index.js +6 -0
  29. package/dist/components/chart/area-chart.js +1 -0
  30. package/dist/components/chart/line-chart.js +1 -0
  31. package/dist/components/chat-dock-section/chat-dock-section.js +56 -0
  32. package/dist/components/chat-dock-section/index.js +6 -0
  33. package/dist/components/checklist/checklist.js +7 -0
  34. package/dist/components/checklist/index.js +3 -1
  35. package/dist/components/choropleth-map/choropleth-map.js +373 -0
  36. package/dist/components/choropleth-map/index.js +10 -0
  37. package/dist/components/chronological-timeline/chronological-timeline.js +337 -0
  38. package/dist/components/chronological-timeline/index.js +8 -0
  39. package/dist/components/civilization-card/civilization-card.js +258 -0
  40. package/dist/components/civilization-card/index.js +8 -0
  41. package/dist/components/combobox/combobox.js +44 -20
  42. package/dist/components/comment-pin/comment-pin.js +104 -0
  43. package/dist/components/comment-pin/index.js +6 -0
  44. package/dist/components/connector-edge/connector-edge.js +66 -0
  45. package/dist/components/connector-edge/index.js +6 -0
  46. package/dist/components/context-lens/context-lens.js +98 -0
  47. package/dist/components/context-lens/index.js +6 -0
  48. package/dist/components/conversation-thread/conversation-thread.js +348 -0
  49. package/dist/components/conversation-thread/index.js +20 -0
  50. package/dist/components/copy-button/copy-button.js +189 -0
  51. package/dist/components/copy-button/index.js +8 -0
  52. package/dist/components/curriculum/curriculum.js +349 -0
  53. package/dist/components/curriculum/index.js +10 -0
  54. package/dist/components/data-list/data-list.js +1 -0
  55. package/dist/components/document-sibling-nav/document-sibling-nav.js +111 -0
  56. package/dist/components/document-sibling-nav/index.js +8 -0
  57. package/dist/components/edge-label/edge-label.js +26 -0
  58. package/dist/components/edge-label/index.js +4 -0
  59. package/dist/components/empty-state/empty-state.js +93 -0
  60. package/dist/components/empty-state/index.js +8 -0
  61. package/dist/components/era-comparison/era-comparison.js +198 -0
  62. package/dist/components/era-comparison/index.js +16 -0
  63. package/dist/components/floating-toolbar/floating-toolbar.js +66 -0
  64. package/dist/components/floating-toolbar/index.js +6 -0
  65. package/dist/components/follow-mode/follow-mode.js +89 -0
  66. package/dist/components/follow-mode/index.js +6 -0
  67. package/dist/components/form/form.js +432 -0
  68. package/dist/components/form/index.js +20 -0
  69. package/dist/components/gantt-chart/gantt-chart.js +331 -0
  70. package/dist/components/gantt-chart/index.js +6 -0
  71. package/dist/components/geography-quiz-map/geography-quiz-map.js +343 -0
  72. package/dist/components/geography-quiz-map/index.js +12 -0
  73. package/dist/components/glass-panel/glass-panel.js +21 -0
  74. package/dist/components/glass-panel/index.js +4 -0
  75. package/dist/components/globe-3d/globe-3d.js +417 -0
  76. package/dist/components/globe-3d/index.js +10 -0
  77. package/dist/components/group-hull/group-hull.js +29 -0
  78. package/dist/components/group-hull/index.js +4 -0
  79. package/dist/components/handoff-beacon/handoff-beacon.js +78 -0
  80. package/dist/components/handoff-beacon/index.js +6 -0
  81. package/dist/components/heat-map-overlay/heat-map-overlay.js +215 -0
  82. package/dist/components/heat-map-overlay/index.js +6 -0
  83. package/dist/components/heat-overlay/heat-overlay.js +92 -0
  84. package/dist/components/heat-overlay/index.js +6 -0
  85. package/dist/components/historic-timeline/historic-timeline.js +342 -0
  86. package/dist/components/historic-timeline/index.js +6 -0
  87. package/dist/components/historical-figure-card/historical-figure-card.js +273 -0
  88. package/dist/components/historical-figure-card/index.js +6 -0
  89. package/dist/components/index.js +568 -1
  90. package/dist/components/infinite-plane/index.js +6 -0
  91. package/dist/components/infinite-plane/infinite-plane.js +75 -0
  92. package/dist/components/interactive-timeline/index.js +16 -0
  93. package/dist/components/interactive-timeline/interactive-timeline.js +708 -0
  94. package/dist/components/jarvis-dock/index.js +6 -0
  95. package/dist/components/jarvis-dock/jarvis-dock.js +98 -0
  96. package/dist/components/kbd/index.js +5 -0
  97. package/dist/components/kbd/kbd.js +117 -0
  98. package/dist/components/knowledge-check/index.js +6 -0
  99. package/dist/components/knowledge-check/knowledge-check.js +448 -0
  100. package/dist/components/left-rail/index.js +4 -0
  101. package/dist/components/left-rail/left-rail.js +25 -0
  102. package/dist/components/live-cursor/index.js +6 -0
  103. package/dist/components/live-cursor/live-cursor.js +62 -0
  104. package/dist/components/map-2d/index.js +20 -0
  105. package/dist/components/map-2d/map-2d.js +455 -0
  106. package/dist/components/map-timeline/index.js +16 -0
  107. package/dist/components/map-timeline/map-timeline.js +506 -0
  108. package/dist/components/metric-cluster/index.js +6 -0
  109. package/dist/components/metric-cluster/metric-cluster.js +96 -0
  110. package/dist/components/mini-map-panel/index.js +6 -0
  111. package/dist/components/mini-map-panel/mini-map-panel.js +74 -0
  112. package/dist/components/model-comparison/index.js +12 -0
  113. package/dist/components/model-comparison/model-comparison.js +211 -0
  114. package/dist/components/multi-select/index.js +6 -0
  115. package/dist/components/multi-select/multi-select.js +258 -0
  116. package/dist/components/multi-select-lasso/index.js +6 -0
  117. package/dist/components/multi-select-lasso/multi-select-lasso.js +76 -0
  118. package/dist/components/newsletter-signup/index.js +8 -0
  119. package/dist/components/newsletter-signup/newsletter-signup.js +269 -0
  120. package/dist/components/object-card/index.js +6 -0
  121. package/dist/components/object-card/object-card.js +126 -0
  122. package/dist/components/object-handle/index.js +4 -0
  123. package/dist/components/object-handle/object-handle.js +38 -0
  124. package/dist/components/object-inspector/index.js +6 -0
  125. package/dist/components/object-inspector/object-inspector.js +136 -0
  126. package/dist/components/overview-board/index.js +8 -0
  127. package/dist/components/overview-board/overview-board.js +127 -0
  128. package/dist/components/parallel-timeline/index.js +6 -0
  129. package/dist/components/parallel-timeline/parallel-timeline.js +251 -0
  130. package/dist/components/playback-ghost/index.js +6 -0
  131. package/dist/components/playback-ghost/playback-ghost.js +83 -0
  132. package/dist/components/policy-delivery-panel/index.js +6 -0
  133. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +99 -0
  134. package/dist/components/presence-stack/index.js +6 -0
  135. package/dist/components/presence-stack/presence-stack.js +108 -0
  136. package/dist/components/presence-sync-indicator/index.js +6 -0
  137. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +73 -0
  138. package/dist/components/pricing-table/index.js +8 -0
  139. package/dist/components/pricing-table/pricing-table.js +247 -0
  140. package/dist/components/primary-source-viewer/index.js +26 -0
  141. package/dist/components/primary-source-viewer/primary-source-viewer.js +439 -0
  142. package/dist/components/progress-tracker/index.js +20 -0
  143. package/dist/components/progress-tracker/progress-tracker.js +527 -0
  144. package/dist/components/prompt-templates/index.js +6 -0
  145. package/dist/components/prompt-templates/prompt-templates.js +403 -0
  146. package/dist/components/property-section/index.js +6 -0
  147. package/dist/components/property-section/property-section.js +101 -0
  148. package/dist/components/relationship-inspector/index.js +6 -0
  149. package/dist/components/relationship-inspector/relationship-inspector.js +102 -0
  150. package/dist/components/right-dock/index.js +4 -0
  151. package/dist/components/right-dock/right-dock.js +28 -0
  152. package/dist/components/route-map/index.js +6 -0
  153. package/dist/components/route-map/route-map.js +339 -0
  154. package/dist/components/routing-assignment-panel/index.js +6 -0
  155. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +122 -0
  156. package/dist/components/run-timeline/index.js +6 -0
  157. package/dist/components/run-timeline/run-timeline.js +221 -0
  158. package/dist/components/runtime-overview-panel/index.js +6 -0
  159. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +89 -0
  160. package/dist/components/segmented-control/index.js +12 -0
  161. package/dist/components/segmented-control/segmented-control.js +61 -0
  162. package/dist/components/selection-halo/index.js +6 -0
  163. package/dist/components/selection-halo/selection-halo.js +72 -0
  164. package/dist/components/selection-presence/index.js +6 -0
  165. package/dist/components/selection-presence/selection-presence.js +50 -0
  166. package/dist/components/snap-guides/index.js +6 -0
  167. package/dist/components/snap-guides/snap-guides.js +45 -0
  168. package/dist/components/spinner/unicode-spinner.js +1 -0
  169. package/dist/components/state-badge-overlay/index.js +6 -0
  170. package/dist/components/state-badge-overlay/state-badge-overlay.js +90 -0
  171. package/dist/components/sticky-metric/index.js +6 -0
  172. package/dist/components/sticky-metric/sticky-metric.js +83 -0
  173. package/dist/components/story-map/index.js +8 -0
  174. package/dist/components/story-map/story-map.js +414 -0
  175. package/dist/components/tags-input/index.js +4 -0
  176. package/dist/components/tags-input/tags-input.js +178 -0
  177. package/dist/components/thread-bubble/index.js +6 -0
  178. package/dist/components/thread-bubble/thread-bubble.js +85 -0
  179. package/dist/components/threshold-ring/index.js +6 -0
  180. package/dist/components/threshold-ring/threshold-ring.js +160 -0
  181. package/dist/components/timeline/index.js +12 -0
  182. package/dist/components/timeline/timeline.js +239 -0
  183. package/dist/components/timeline-scrubber/index.js +6 -0
  184. package/dist/components/timeline-scrubber/timeline-scrubber.js +179 -0
  185. package/dist/components/top-bar/index.js +4 -0
  186. package/dist/components/top-bar/top-bar.js +31 -0
  187. package/dist/components/transaction-list/index.js +14 -0
  188. package/dist/components/transaction-list/transaction-list.js +226 -0
  189. package/dist/components/tree-view/index.js +6 -0
  190. package/dist/components/tree-view/tree-view.js +298 -0
  191. package/dist/components/usage-breakdown/usage-breakdown.js +1 -0
  192. package/dist/components/viewport-bookmarks/index.js +6 -0
  193. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +116 -0
  194. package/dist/components/workspace-switcher/index.js +6 -0
  195. package/dist/components/workspace-switcher/workspace-switcher.js +61 -0
  196. package/dist/components/world-breadcrumbs/index.js +6 -0
  197. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +114 -0
  198. package/dist/components/zoom-hud/index.js +4 -0
  199. package/dist/components/zoom-hud/zoom-hud.js +61 -0
  200. package/dist/index.d.ts +7906 -225
  201. package/dist/index.js +3 -1
  202. package/package.json +9 -5
@@ -0,0 +1,339 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ forwardRef,
5
+ useId,
6
+ useMemo
7
+ } from "react";
8
+ import { cn } from "../../lib/utils";
9
+ const VIEWBOX_WIDTH = 1e3;
10
+ const VIEWBOX_HEIGHT = 500;
11
+ const ROUTE_PALETTE = {
12
+ amber: {
13
+ dot: "fill-amber-500",
14
+ line: "stroke-amber-500",
15
+ text: "text-amber-600"
16
+ },
17
+ blue: {
18
+ dot: "fill-blue-500",
19
+ line: "stroke-blue-500",
20
+ text: "text-blue-600"
21
+ },
22
+ emerald: {
23
+ dot: "fill-emerald-500",
24
+ line: "stroke-emerald-500",
25
+ text: "text-emerald-600"
26
+ },
27
+ purple: {
28
+ dot: "fill-purple-500",
29
+ line: "stroke-purple-500",
30
+ text: "text-purple-600"
31
+ },
32
+ red: { dot: "fill-red-500", line: "stroke-red-500", text: "text-red-600" },
33
+ rose: {
34
+ dot: "fill-rose-500",
35
+ line: "stroke-rose-500",
36
+ text: "text-rose-600"
37
+ }
38
+ };
39
+ const LINE_DASH = {
40
+ dashed: "10,8",
41
+ dotted: "2,6",
42
+ solid: "0"
43
+ };
44
+ const DEFAULT_LABELS = {
45
+ region: "Route map"
46
+ };
47
+ function projectEquirectangular(position) {
48
+ const [lng, lat] = position;
49
+ const x = (lng + 180) / 360 * VIEWBOX_WIDTH;
50
+ const y = (90 - lat) / 180 * VIEWBOX_HEIGHT;
51
+ return { x, y };
52
+ }
53
+ function projectWaypoints(waypoints) {
54
+ return waypoints.map((waypoint, index) => {
55
+ const point = projectEquirectangular(waypoint.position);
56
+ return {
57
+ ordinal: waypoint.order ?? index + 1,
58
+ raw: waypoint,
59
+ x: point.x,
60
+ y: point.y
61
+ };
62
+ });
63
+ }
64
+ function pathFor(points) {
65
+ if (points.length === 0) return "";
66
+ return points.map(
67
+ (point, index) => `${index === 0 ? "M" : "L"}${point.x.toString()},${point.y.toString()}`
68
+ ).join(" ");
69
+ }
70
+ function pathLength(points) {
71
+ if (points.length < 2) return 0;
72
+ const total = points.reduce(
73
+ (accumulator, point) => {
74
+ if (!accumulator.previous) return { length: 0, previous: point };
75
+ const dx = point.x - accumulator.previous.x;
76
+ const dy = point.y - accumulator.previous.y;
77
+ return {
78
+ length: accumulator.length + Math.hypot(dx, dy),
79
+ previous: point
80
+ };
81
+ },
82
+ { length: 0 }
83
+ );
84
+ return total.length;
85
+ }
86
+ function RouteLine({
87
+ animated,
88
+ animationDurationSeconds,
89
+ color,
90
+ lineStyle,
91
+ pathDefinition,
92
+ pathId,
93
+ totalLength
94
+ }) {
95
+ if (!pathDefinition) return null;
96
+ const palette = ROUTE_PALETTE[color];
97
+ const dashArray = animated ? totalLength > 0 ? `${totalLength.toString()} ${totalLength.toString()}` : LINE_DASH[lineStyle] : LINE_DASH[lineStyle];
98
+ return /* @__PURE__ */ jsx("g", { "data-route-line": true, children: /* @__PURE__ */ jsx(
99
+ "path",
100
+ {
101
+ className: cn("fill-none stroke-[3]", palette.line),
102
+ d: pathDefinition,
103
+ id: pathId,
104
+ strokeDasharray: dashArray,
105
+ strokeDashoffset: animated ? totalLength : 0,
106
+ strokeLinecap: "round",
107
+ strokeLinejoin: "round",
108
+ children: animated ? /* @__PURE__ */ jsx(
109
+ "animate",
110
+ {
111
+ attributeName: "stroke-dashoffset",
112
+ dur: `${animationDurationSeconds.toString()}s`,
113
+ fill: "freeze",
114
+ from: totalLength,
115
+ to: "0"
116
+ }
117
+ ) : null
118
+ }
119
+ ) });
120
+ }
121
+ function ProgressIndicator({
122
+ animationDurationSeconds,
123
+ color,
124
+ pathId,
125
+ visible
126
+ }) {
127
+ if (!visible) return null;
128
+ const palette = ROUTE_PALETTE[color];
129
+ return /* @__PURE__ */ jsx("g", { "data-route-progress": true, children: /* @__PURE__ */ jsx(
130
+ "circle",
131
+ {
132
+ className: cn("stroke-background", palette.dot),
133
+ r: "6",
134
+ strokeWidth: "2",
135
+ children: /* @__PURE__ */ jsx(
136
+ "animateMotion",
137
+ {
138
+ dur: `${animationDurationSeconds.toString()}s`,
139
+ repeatCount: "indefinite",
140
+ rotate: "auto",
141
+ children: /* @__PURE__ */ jsx("mpath", { href: `#${pathId}` })
142
+ }
143
+ )
144
+ }
145
+ ) });
146
+ }
147
+ function WaypointDots({ color, waypoints }) {
148
+ const palette = ROUTE_PALETTE[color];
149
+ return /* @__PURE__ */ jsx("g", { "data-route-waypoints": true, children: waypoints.map((point) => {
150
+ const labelText = typeof point.raw.label === "string" ? point.raw.label : void 0;
151
+ return /* @__PURE__ */ jsxs(
152
+ "g",
153
+ {
154
+ "data-waypoint-id": point.raw.id,
155
+ "data-waypoint-ordinal": point.ordinal,
156
+ transform: `translate(${point.x.toString()}, ${point.y.toString()})`,
157
+ children: [
158
+ /* @__PURE__ */ jsx(
159
+ "circle",
160
+ {
161
+ className: cn(
162
+ "stroke-background outline-none focus-visible:ring-2 focus-visible:ring-ring",
163
+ palette.dot
164
+ ),
165
+ r: "6",
166
+ strokeWidth: "2",
167
+ children: labelText ? /* @__PURE__ */ jsx("title", { children: labelText }) : null
168
+ }
169
+ ),
170
+ /* @__PURE__ */ jsx(
171
+ "text",
172
+ {
173
+ className: cn(
174
+ "select-none text-[10px] font-semibold",
175
+ palette.text
176
+ ),
177
+ dominantBaseline: "middle",
178
+ textAnchor: "middle",
179
+ y: "-12",
180
+ children: point.raw.label
181
+ }
182
+ ),
183
+ /* @__PURE__ */ jsx(
184
+ "text",
185
+ {
186
+ className: "select-none fill-background text-[8px] font-bold",
187
+ dominantBaseline: "central",
188
+ textAnchor: "middle",
189
+ y: "0",
190
+ children: point.ordinal
191
+ }
192
+ )
193
+ ]
194
+ },
195
+ point.raw.id
196
+ );
197
+ }) });
198
+ }
199
+ function DataSummary({ titleId, waypoints }) {
200
+ return /* @__PURE__ */ jsxs("div", { "aria-labelledby": titleId, className: "sr-only", role: "region", children: [
201
+ /* @__PURE__ */ jsx("h3", { id: titleId, children: "Route waypoint summary" }),
202
+ /* @__PURE__ */ jsx("ol", { children: waypoints.map((waypoint) => /* @__PURE__ */ jsxs("li", { children: [
203
+ typeof waypoint.label === "string" ? waypoint.label : `Waypoint ${waypoint.id}`,
204
+ `: ${waypoint.position[0].toString()}, ${waypoint.position[1].toString()}`
205
+ ] }, waypoint.id)) })
206
+ ] });
207
+ }
208
+ function Stage(props) {
209
+ const {
210
+ animated,
211
+ animationDurationSeconds,
212
+ backdrop,
213
+ backdropAlt,
214
+ color,
215
+ lineStyle,
216
+ pathDefinition,
217
+ pathId,
218
+ showProgressIndicator,
219
+ totalLength,
220
+ waypoints
221
+ } = props;
222
+ const showProgress = showProgressIndicator && totalLength > 0;
223
+ return /* @__PURE__ */ jsxs(
224
+ "svg",
225
+ {
226
+ "aria-hidden": "true",
227
+ className: "block h-full w-full",
228
+ preserveAspectRatio: "xMidYMid meet",
229
+ viewBox: `0 0 ${VIEWBOX_WIDTH.toString()} ${VIEWBOX_HEIGHT.toString()}`,
230
+ children: [
231
+ /* @__PURE__ */ jsx(
232
+ "rect",
233
+ {
234
+ className: "fill-muted",
235
+ height: VIEWBOX_HEIGHT,
236
+ width: VIEWBOX_WIDTH,
237
+ x: "0",
238
+ y: "0"
239
+ }
240
+ ),
241
+ backdrop ? /* @__PURE__ */ jsx(
242
+ "image",
243
+ {
244
+ "aria-label": backdropAlt,
245
+ height: VIEWBOX_HEIGHT,
246
+ href: backdrop,
247
+ preserveAspectRatio: "xMidYMid slice",
248
+ width: VIEWBOX_WIDTH,
249
+ x: "0",
250
+ y: "0"
251
+ }
252
+ ) : null,
253
+ /* @__PURE__ */ jsx(
254
+ RouteLine,
255
+ {
256
+ animated,
257
+ animationDurationSeconds,
258
+ color,
259
+ lineStyle,
260
+ pathDefinition,
261
+ pathId,
262
+ totalLength
263
+ }
264
+ ),
265
+ /* @__PURE__ */ jsx(WaypointDots, { color, waypoints }),
266
+ /* @__PURE__ */ jsx(
267
+ ProgressIndicator,
268
+ {
269
+ animationDurationSeconds,
270
+ color,
271
+ pathId,
272
+ visible: showProgress
273
+ }
274
+ )
275
+ ]
276
+ }
277
+ );
278
+ }
279
+ const RouteMap = forwardRef((props, ref) => {
280
+ const {
281
+ animated = false,
282
+ animationDurationSeconds = 4,
283
+ backdrop,
284
+ backdropAlt,
285
+ children,
286
+ className,
287
+ color = "red",
288
+ labels,
289
+ lineStyle = "solid",
290
+ showProgressIndicator = false,
291
+ waypoints,
292
+ ...rest
293
+ } = props;
294
+ const titleId = useId();
295
+ const pathId = useId();
296
+ const resolvedLabels = useMemo(
297
+ () => ({ ...DEFAULT_LABELS, ...labels }),
298
+ [labels]
299
+ );
300
+ const projected = useMemo(() => projectWaypoints(waypoints), [waypoints]);
301
+ const pathDefinition = useMemo(() => pathFor(projected), [projected]);
302
+ const totalLength = useMemo(() => pathLength(projected), [projected]);
303
+ return /* @__PURE__ */ jsxs(
304
+ "section",
305
+ {
306
+ "aria-label": resolvedLabels.region,
307
+ className: cn(
308
+ "relative aspect-[2/1] w-full overflow-hidden rounded-2xl border bg-background text-foreground",
309
+ className
310
+ ),
311
+ ref,
312
+ ...rest,
313
+ children: [
314
+ /* @__PURE__ */ jsx(
315
+ Stage,
316
+ {
317
+ animated,
318
+ animationDurationSeconds,
319
+ backdrop,
320
+ backdropAlt,
321
+ color,
322
+ lineStyle,
323
+ pathDefinition,
324
+ pathId,
325
+ showProgressIndicator,
326
+ totalLength,
327
+ waypoints: projected
328
+ }
329
+ ),
330
+ children ? /* @__PURE__ */ jsx("div", { className: "absolute bottom-3 left-3 z-10 max-w-xs rounded-md border bg-background/95 px-3 py-2 text-xs text-foreground shadow-sm backdrop-blur", children }) : null,
331
+ /* @__PURE__ */ jsx(DataSummary, { titleId, waypoints })
332
+ ]
333
+ }
334
+ );
335
+ });
336
+ RouteMap.displayName = "RouteMap";
337
+ export {
338
+ RouteMap
339
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ RoutingAssignmentPanel
3
+ } from "./routing-assignment-panel";
4
+ export {
5
+ RoutingAssignmentPanel
6
+ };
@@ -0,0 +1,122 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ forwardRef
5
+ } from "react";
6
+ import { cn } from "../../lib/utils";
7
+ const ROLE_LABEL = {
8
+ fallback: "Fallback",
9
+ primary: "Primary",
10
+ shadow: "Shadow"
11
+ };
12
+ const ROLE_TONE = {
13
+ fallback: "border-amber-500/40 bg-amber-500/10 text-amber-700 dark:text-amber-300",
14
+ primary: "border-emerald-500/40 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300",
15
+ shadow: "border-border bg-muted/40 text-muted-foreground"
16
+ };
17
+ const DEFAULT_LABELS = {
18
+ empty: "No assignments",
19
+ region: "Routing assignments"
20
+ };
21
+ const clampLoad = (value) => {
22
+ if (value < 0) {
23
+ return 0;
24
+ }
25
+ if (value > 1) {
26
+ return 1;
27
+ }
28
+ return value;
29
+ };
30
+ const RowBody = (props) => {
31
+ const { assignment } = props;
32
+ const load = assignment.load === void 0 ? null : clampLoad(assignment.load);
33
+ return /* @__PURE__ */ jsxs("span", { className: "flex flex-1 flex-col gap-1", children: [
34
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center justify-between gap-2", children: [
35
+ /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-foreground", children: assignment.agent }),
36
+ /* @__PURE__ */ jsx(
37
+ "span",
38
+ {
39
+ className: cn(
40
+ "rounded-full border px-1.5 py-0.5 text-[10px] uppercase tracking-wide",
41
+ ROLE_TONE[assignment.role]
42
+ ),
43
+ children: ROLE_LABEL[assignment.role]
44
+ }
45
+ )
46
+ ] }),
47
+ load === null ? null : /* @__PURE__ */ jsx(
48
+ "span",
49
+ {
50
+ "aria-hidden": "true",
51
+ className: "h-1 w-full overflow-hidden rounded-full bg-muted/40",
52
+ children: /* @__PURE__ */ jsx(
53
+ "span",
54
+ {
55
+ className: "block h-full rounded-full bg-foreground/50",
56
+ style: { width: `${load * 100}%` }
57
+ }
58
+ )
59
+ }
60
+ )
61
+ ] });
62
+ };
63
+ const Row = (props) => {
64
+ const { assignment } = props;
65
+ if (assignment.onActivate) {
66
+ const handleClick = () => {
67
+ assignment.onActivate?.();
68
+ };
69
+ return /* @__PURE__ */ jsx(
70
+ "button",
71
+ {
72
+ className: "flex w-full items-center gap-2 rounded-md border border-transparent px-2 py-1.5 text-left transition-colors hover:border-border hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
73
+ "data-routing-assignment": assignment.id,
74
+ "data-routing-role": assignment.role,
75
+ onClick: handleClick,
76
+ type: "button",
77
+ children: /* @__PURE__ */ jsx(RowBody, { assignment })
78
+ }
79
+ );
80
+ }
81
+ return /* @__PURE__ */ jsx(
82
+ "div",
83
+ {
84
+ className: "flex w-full items-center gap-2 rounded-md px-2 py-1.5",
85
+ "data-routing-assignment": assignment.id,
86
+ "data-routing-role": assignment.role,
87
+ children: /* @__PURE__ */ jsx(RowBody, { assignment })
88
+ }
89
+ );
90
+ };
91
+ const RoutingAssignmentPanel = forwardRef((props, ref) => {
92
+ const { assignments, className, labels, title = "Routing", ...rest } = props;
93
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
94
+ return /* @__PURE__ */ jsxs(
95
+ "section",
96
+ {
97
+ "aria-label": resolvedLabels.region,
98
+ className: cn(
99
+ "flex w-full flex-col gap-2 rounded-lg border bg-background p-3 text-foreground",
100
+ className
101
+ ),
102
+ "data-routing-assignment-panel": true,
103
+ ref,
104
+ ...rest,
105
+ children: [
106
+ /* @__PURE__ */ jsx("header", { children: /* @__PURE__ */ jsx("h3", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: title }) }),
107
+ assignments.length === 0 ? /* @__PURE__ */ jsx(
108
+ "p",
109
+ {
110
+ className: "px-2 py-3 text-center text-xs text-muted-foreground",
111
+ "data-routing-state": "empty",
112
+ children: resolvedLabels.empty
113
+ }
114
+ ) : /* @__PURE__ */ jsx("ul", { className: "space-y-0.5", children: assignments.map((assignment) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Row, { assignment }) }, assignment.id)) })
115
+ ]
116
+ }
117
+ );
118
+ });
119
+ RoutingAssignmentPanel.displayName = "RoutingAssignmentPanel";
120
+ export {
121
+ RoutingAssignmentPanel
122
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ RunTimeline
3
+ } from "./run-timeline";
4
+ export {
5
+ RunTimeline
6
+ };
@@ -0,0 +1,221 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ forwardRef
5
+ } from "react";
6
+ import { cn } from "../../lib/utils";
7
+ const STATE_FILL = {
8
+ complete: "bg-emerald-500/70",
9
+ failed: "bg-red-500/70",
10
+ queued: "bg-amber-500/70",
11
+ running: "bg-blue-500/70",
12
+ stopped: "bg-muted-foreground/40"
13
+ };
14
+ const STATE_LABEL = {
15
+ complete: "Complete",
16
+ failed: "Failed",
17
+ queued: "Queued",
18
+ running: "Running",
19
+ stopped: "Stopped"
20
+ };
21
+ const DEFAULT_LABELS = {
22
+ empty: "No phases",
23
+ region: "Run timeline"
24
+ };
25
+ const clamp = (v, min, max) => {
26
+ if (v < min) {
27
+ return min;
28
+ }
29
+ if (v > max) {
30
+ return max;
31
+ }
32
+ return v;
33
+ };
34
+ const Endpoints = (props) => {
35
+ const fmt = props.format;
36
+ const showCursor = typeof props.cursor === "number";
37
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2 text-[11px] text-muted-foreground", children: [
38
+ /* @__PURE__ */ jsx("span", { "data-run-timeline-start": true, children: fmt ? fmt(props.start) : props.start }),
39
+ showCursor ? /* @__PURE__ */ jsx(
40
+ "span",
41
+ {
42
+ className: "font-semibold text-foreground",
43
+ "data-run-timeline-cursor-label": true,
44
+ children: fmt ? fmt(props.cursor ?? 0) : props.cursor
45
+ }
46
+ ) : null,
47
+ /* @__PURE__ */ jsx("span", { "data-run-timeline-end": true, children: fmt ? fmt(props.end) : props.end })
48
+ ] });
49
+ };
50
+ const PhaseBar = (props) => {
51
+ const { laneIndex, laneTotal, phase, span, start } = props;
52
+ const left = clamp((phase.start - start) / span, 0, 1) * 100;
53
+ const right = clamp((phase.end - start) / span, 0, 1) * 100;
54
+ const width = Math.max(right - left, 0.5);
55
+ const top = laneIndex / laneTotal * 100;
56
+ const height = 100 / laneTotal;
57
+ const state = phase.state ?? "running";
58
+ const sharedStyle = {
59
+ height: `${height}%`,
60
+ left: `${left}%`,
61
+ top: `${top}%`,
62
+ width: `${width}%`
63
+ };
64
+ const ariaLabel = `${STATE_LABEL[state]} ${phase.start} \u2192 ${phase.end}`;
65
+ if (phase.onActivate) {
66
+ const handleClick = () => {
67
+ phase.onActivate?.();
68
+ };
69
+ return /* @__PURE__ */ jsx(
70
+ "button",
71
+ {
72
+ "aria-label": ariaLabel,
73
+ className: cn(
74
+ "absolute flex items-center justify-start overflow-hidden truncate rounded-sm border border-border/50 px-1 text-left text-[10px] text-foreground transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
75
+ STATE_FILL[state]
76
+ ),
77
+ "data-run-phase": phase.id,
78
+ "data-run-phase-state": state,
79
+ onClick: handleClick,
80
+ style: sharedStyle,
81
+ type: "button",
82
+ children: phase.label
83
+ }
84
+ );
85
+ }
86
+ return /* @__PURE__ */ jsx(
87
+ "span",
88
+ {
89
+ "aria-label": ariaLabel,
90
+ className: cn(
91
+ "absolute flex items-center justify-start overflow-hidden truncate rounded-sm border border-border/50 px-1 text-[10px] text-foreground",
92
+ STATE_FILL[state]
93
+ ),
94
+ "data-run-phase": phase.id,
95
+ "data-run-phase-state": state,
96
+ role: "img",
97
+ style: sharedStyle,
98
+ children: phase.label
99
+ }
100
+ );
101
+ };
102
+ const TrackBody = (props) => {
103
+ const { cursor, end, lanes, phases, start } = props;
104
+ const span = end - start;
105
+ const cursorRatio = typeof cursor === "number" ? clamp((cursor - start) / span, 0, 1) : null;
106
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-stretch", children: [
107
+ /* @__PURE__ */ jsx("div", { className: "flex w-24 flex-col gap-px text-[10px] uppercase tracking-wide text-muted-foreground", children: lanes.map((lane) => /* @__PURE__ */ jsx(
108
+ "div",
109
+ {
110
+ className: "flex h-7 items-center px-2",
111
+ "data-run-timeline-lane": lane.id,
112
+ children: lane.label
113
+ },
114
+ lane.id
115
+ )) }),
116
+ /* @__PURE__ */ jsxs(
117
+ "div",
118
+ {
119
+ className: "relative flex-1 overflow-hidden rounded-md border border-border bg-muted/20",
120
+ "data-run-timeline-track": true,
121
+ style: { height: `${lanes.length * 28}px` },
122
+ children: [
123
+ phases.map((phase) => {
124
+ const index = lanes.findIndex(
125
+ (lane) => lane.id === (phase.laneId ?? "default")
126
+ );
127
+ if (index === -1) {
128
+ return null;
129
+ }
130
+ return /* @__PURE__ */ jsx(
131
+ PhaseBar,
132
+ {
133
+ laneIndex: index,
134
+ laneTotal: lanes.length,
135
+ phase,
136
+ span,
137
+ start
138
+ },
139
+ phase.id
140
+ );
141
+ }),
142
+ cursorRatio === null ? null : /* @__PURE__ */ jsx(
143
+ "span",
144
+ {
145
+ "aria-hidden": "true",
146
+ className: "absolute top-0 bottom-0 w-px bg-foreground",
147
+ "data-run-timeline-cursor": true,
148
+ style: { left: `${cursorRatio * 100}%` }
149
+ }
150
+ )
151
+ ]
152
+ }
153
+ )
154
+ ] });
155
+ };
156
+ const resolveLanes = (explicit) => {
157
+ if (explicit && explicit.length > 0) {
158
+ return explicit;
159
+ }
160
+ return [{ id: "default", label: "Run" }];
161
+ };
162
+ const RunTimeline = forwardRef(
163
+ (props, ref) => {
164
+ const {
165
+ className,
166
+ cursor,
167
+ end,
168
+ formatValue,
169
+ labels,
170
+ lanes,
171
+ phases,
172
+ start,
173
+ ...rest
174
+ } = props;
175
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
176
+ const safeEnd = end <= start ? start + 1 : end;
177
+ const resolvedLanes = resolveLanes(lanes);
178
+ return /* @__PURE__ */ jsxs(
179
+ "section",
180
+ {
181
+ "aria-label": resolvedLabels.region,
182
+ className: cn("flex w-full flex-col gap-2", className),
183
+ "data-run-timeline": true,
184
+ ref,
185
+ ...rest,
186
+ children: [
187
+ /* @__PURE__ */ jsx(
188
+ Endpoints,
189
+ {
190
+ cursor,
191
+ end: safeEnd,
192
+ format: formatValue,
193
+ start
194
+ }
195
+ ),
196
+ phases.length === 0 ? /* @__PURE__ */ jsx(
197
+ "p",
198
+ {
199
+ className: "rounded-md border border-border bg-muted/20 px-2 py-3 text-center text-[11px] text-muted-foreground",
200
+ "data-run-timeline-state": "empty",
201
+ children: resolvedLabels.empty
202
+ }
203
+ ) : /* @__PURE__ */ jsx(
204
+ TrackBody,
205
+ {
206
+ cursor,
207
+ end: safeEnd,
208
+ lanes: resolvedLanes,
209
+ phases,
210
+ start
211
+ }
212
+ )
213
+ ]
214
+ }
215
+ );
216
+ }
217
+ );
218
+ RunTimeline.displayName = "RunTimeline";
219
+ export {
220
+ RunTimeline
221
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ RuntimeOverviewPanel
3
+ } from "./runtime-overview-panel";
4
+ export {
5
+ RuntimeOverviewPanel
6
+ };