@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,439 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useCallback,
7
+ useContext,
8
+ useId,
9
+ useMemo,
10
+ useState
11
+ } from "react";
12
+ import { cn } from "../../lib/utils";
13
+ const MIN_ZOOM = 0.25;
14
+ const MAX_ZOOM = 8;
15
+ const ZOOM_STEP = 1.25;
16
+ const ROTATE_STEP = 90;
17
+ const ANNOTATION_PALETTE = {
18
+ amber: {
19
+ border: "border-amber-500",
20
+ chip: "bg-amber-500/15 text-amber-700 dark:text-amber-300",
21
+ fill: "bg-amber-500/15"
22
+ },
23
+ blue: {
24
+ border: "border-blue-500",
25
+ chip: "bg-blue-500/15 text-blue-700 dark:text-blue-300",
26
+ fill: "bg-blue-500/15"
27
+ },
28
+ emerald: {
29
+ border: "border-emerald-500",
30
+ chip: "bg-emerald-500/15 text-emerald-700 dark:text-emerald-300",
31
+ fill: "bg-emerald-500/15"
32
+ },
33
+ purple: {
34
+ border: "border-purple-500",
35
+ chip: "bg-purple-500/15 text-purple-700 dark:text-purple-300",
36
+ fill: "bg-purple-500/15"
37
+ },
38
+ red: {
39
+ border: "border-red-500",
40
+ chip: "bg-red-500/15 text-red-700 dark:text-red-300",
41
+ fill: "bg-red-500/15"
42
+ },
43
+ rose: {
44
+ border: "border-rose-500",
45
+ chip: "bg-rose-500/15 text-rose-700 dark:text-rose-300",
46
+ fill: "bg-rose-500/15"
47
+ }
48
+ };
49
+ const DEFAULT_LABELS = {
50
+ region: "Primary source viewer",
51
+ rotate: "Rotate",
52
+ zoomIn: "Zoom in",
53
+ zoomOut: "Zoom out"
54
+ };
55
+ const ViewerContext = createContext(null);
56
+ function useViewerContext() {
57
+ const ctx = useContext(ViewerContext);
58
+ if (!ctx) {
59
+ throw new Error("PrimarySourceViewer subcomponent used outside its root.");
60
+ }
61
+ return ctx;
62
+ }
63
+ function clamp(value, min, max) {
64
+ return Math.min(Math.max(value, min), max);
65
+ }
66
+ function useViewerState(resolvedLabels) {
67
+ const [zoom, setZoom] = useState(1);
68
+ const [rotation, setRotation] = useState(0);
69
+ const zoomIn = useCallback(() => {
70
+ setZoom((current) => clamp(current * ZOOM_STEP, MIN_ZOOM, MAX_ZOOM));
71
+ }, []);
72
+ const zoomOut = useCallback(() => {
73
+ setZoom((current) => clamp(current / ZOOM_STEP, MIN_ZOOM, MAX_ZOOM));
74
+ }, []);
75
+ const rotate = useCallback(() => {
76
+ setRotation((current) => (current + ROTATE_STEP) % 360);
77
+ }, []);
78
+ return useMemo(
79
+ () => ({
80
+ labels: resolvedLabels,
81
+ rotate,
82
+ rotation,
83
+ zoom,
84
+ zoomIn,
85
+ zoomOut
86
+ }),
87
+ [resolvedLabels, rotate, rotation, zoom, zoomIn, zoomOut]
88
+ );
89
+ }
90
+ const PrimarySourceToolbar = forwardRef(({ children, className, ...rest }, ref) => /* @__PURE__ */ jsx(
91
+ "div",
92
+ {
93
+ className: cn(
94
+ "flex flex-wrap items-center gap-2 border-b border-border bg-muted/40 px-4 py-2",
95
+ className
96
+ ),
97
+ ref,
98
+ role: "toolbar",
99
+ ...rest,
100
+ children
101
+ }
102
+ ));
103
+ PrimarySourceToolbar.displayName = "PrimarySourceToolbar";
104
+ const ToolbarButton = forwardRef(
105
+ ({ ariaLabel, className, glyph, onActivate, ...rest }, ref) => /* @__PURE__ */ jsx(
106
+ "button",
107
+ {
108
+ "aria-label": ariaLabel,
109
+ className: cn(
110
+ "inline-flex h-8 min-w-8 items-center justify-center rounded-md border border-border bg-background px-2 text-sm font-medium hover:bg-accent focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
111
+ className
112
+ ),
113
+ onClick: onActivate,
114
+ ref,
115
+ type: "button",
116
+ ...rest,
117
+ children: glyph
118
+ }
119
+ )
120
+ );
121
+ ToolbarButton.displayName = "ToolbarButton";
122
+ const PrimarySourceZoomIn = forwardRef(({ ...rest }, ref) => {
123
+ const { labels, zoomIn } = useViewerContext();
124
+ return /* @__PURE__ */ jsx(
125
+ ToolbarButton,
126
+ {
127
+ ariaLabel: labels.zoomIn,
128
+ glyph: "+",
129
+ onActivate: zoomIn,
130
+ ref,
131
+ ...rest
132
+ }
133
+ );
134
+ });
135
+ PrimarySourceZoomIn.displayName = "PrimarySourceZoomIn";
136
+ const PrimarySourceZoomOut = forwardRef(({ ...rest }, ref) => {
137
+ const { labels, zoomOut } = useViewerContext();
138
+ return /* @__PURE__ */ jsx(
139
+ ToolbarButton,
140
+ {
141
+ ariaLabel: labels.zoomOut,
142
+ glyph: "\u2212",
143
+ onActivate: zoomOut,
144
+ ref,
145
+ ...rest
146
+ }
147
+ );
148
+ });
149
+ PrimarySourceZoomOut.displayName = "PrimarySourceZoomOut";
150
+ const PrimarySourceRotate = forwardRef(({ ...rest }, ref) => {
151
+ const { labels, rotate } = useViewerContext();
152
+ return /* @__PURE__ */ jsx(
153
+ ToolbarButton,
154
+ {
155
+ ariaLabel: labels.rotate,
156
+ glyph: "\u27F3",
157
+ onActivate: rotate,
158
+ ref,
159
+ ...rest
160
+ }
161
+ );
162
+ });
163
+ PrimarySourceRotate.displayName = "PrimarySourceRotate";
164
+ const PrimarySourceAnnotations = forwardRef(({ children, className, ...rest }, ref) => /* @__PURE__ */ jsx(
165
+ "div",
166
+ {
167
+ "aria-label": "Annotations",
168
+ className: cn("pointer-events-none absolute inset-0 z-10", className),
169
+ ref,
170
+ ...rest,
171
+ children
172
+ }
173
+ ));
174
+ PrimarySourceAnnotations.displayName = "PrimarySourceAnnotations";
175
+ function AnnotationTooltip({
176
+ category,
177
+ color,
178
+ note,
179
+ tooltipId
180
+ }) {
181
+ const palette = ANNOTATION_PALETTE[color];
182
+ return /* @__PURE__ */ jsxs(
183
+ "span",
184
+ {
185
+ className: "pointer-events-none absolute left-0 top-full z-10 mt-1 hidden min-w-44 max-w-sm rounded-md border bg-popover px-2 py-1 text-left text-xs text-popover-foreground shadow-md group-hover:block group-focus-visible:block",
186
+ id: tooltipId,
187
+ role: "tooltip",
188
+ children: [
189
+ category ? /* @__PURE__ */ jsx(
190
+ "span",
191
+ {
192
+ className: cn(
193
+ "mb-1 inline-block rounded px-1 text-[10px] font-medium uppercase tracking-wide",
194
+ palette.chip
195
+ ),
196
+ children: category
197
+ }
198
+ ) : null,
199
+ /* @__PURE__ */ jsx("span", { className: "block", children: note })
200
+ ]
201
+ }
202
+ );
203
+ }
204
+ const PrimarySourceAnnotation = forwardRef((props, ref) => {
205
+ const {
206
+ category,
207
+ className,
208
+ color = "amber",
209
+ id,
210
+ note,
211
+ region,
212
+ ...rest
213
+ } = props;
214
+ const generatedId = useId();
215
+ const annotationId = id ?? generatedId;
216
+ const palette = ANNOTATION_PALETTE[color];
217
+ const tooltipId = `${annotationId}-tooltip`;
218
+ const noteText = typeof note === "string" ? note : "Annotation";
219
+ return /* @__PURE__ */ jsx(
220
+ "button",
221
+ {
222
+ "aria-describedby": tooltipId,
223
+ "aria-label": noteText,
224
+ className: cn(
225
+ "group pointer-events-auto absolute rounded-md border-2 outline-none transition-colors hover:bg-foreground/10 focus-visible:bg-foreground/10",
226
+ palette.border,
227
+ palette.fill,
228
+ className
229
+ ),
230
+ "data-annotation-id": annotationId,
231
+ ref,
232
+ style: {
233
+ height: `${region.height.toString()}%`,
234
+ left: `${region.x.toString()}%`,
235
+ top: `${region.y.toString()}%`,
236
+ width: `${region.width.toString()}%`
237
+ },
238
+ type: "button",
239
+ ...rest,
240
+ children: /* @__PURE__ */ jsx(
241
+ AnnotationTooltip,
242
+ {
243
+ category,
244
+ color,
245
+ note,
246
+ tooltipId
247
+ }
248
+ )
249
+ }
250
+ );
251
+ });
252
+ PrimarySourceAnnotation.displayName = "PrimarySourceAnnotation";
253
+ const PrimarySourceTranscription = forwardRef(({ children, className, ...rest }, ref) => /* @__PURE__ */ jsxs(
254
+ "aside",
255
+ {
256
+ "aria-label": "Transcription",
257
+ className: cn(
258
+ "flex h-full flex-col gap-2 border-l border-border bg-background p-4 text-sm leading-relaxed",
259
+ className
260
+ ),
261
+ ref,
262
+ ...rest,
263
+ children: [
264
+ /* @__PURE__ */ jsx("h3", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Transcription" }),
265
+ /* @__PURE__ */ jsx("div", { className: "space-y-2 text-foreground", children })
266
+ ]
267
+ }
268
+ ));
269
+ PrimarySourceTranscription.displayName = "PrimarySourceTranscription";
270
+ const PrimarySourceContext = forwardRef(({ children, className, ...rest }, ref) => /* @__PURE__ */ jsx(
271
+ "footer",
272
+ {
273
+ className: cn(
274
+ "grid gap-6 border-t border-border bg-muted/30 p-4 md:grid-cols-2",
275
+ className
276
+ ),
277
+ ref,
278
+ ...rest,
279
+ children
280
+ }
281
+ ));
282
+ PrimarySourceContext.displayName = "PrimarySourceContext";
283
+ const PrimarySourceMetadata = forwardRef(({ children, className, ...rest }, ref) => /* @__PURE__ */ jsx(
284
+ "dl",
285
+ {
286
+ "aria-label": "Metadata",
287
+ className: cn(
288
+ "grid grid-cols-[max-content_1fr] gap-x-4 gap-y-1 text-sm",
289
+ className
290
+ ),
291
+ ref,
292
+ ...rest,
293
+ children
294
+ }
295
+ ));
296
+ PrimarySourceMetadata.displayName = "PrimarySourceMetadata";
297
+ const PrimarySourceQuestions = forwardRef(({ children, className, ...rest }, ref) => /* @__PURE__ */ jsxs(
298
+ "div",
299
+ {
300
+ "aria-label": "Discussion questions",
301
+ className: cn("space-y-2 text-sm", className),
302
+ ref,
303
+ ...rest,
304
+ children: [
305
+ /* @__PURE__ */ jsx("h3", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Discussion questions" }),
306
+ /* @__PURE__ */ jsx("div", { className: "space-y-1 text-foreground", children })
307
+ ]
308
+ }
309
+ ));
310
+ PrimarySourceQuestions.displayName = "PrimarySourceQuestions";
311
+ const SLOT_DISPLAY_NAMES = {
312
+ annotations: PrimarySourceAnnotations.displayName,
313
+ context: PrimarySourceContext.displayName,
314
+ toolbar: PrimarySourceToolbar.displayName,
315
+ transcription: PrimarySourceTranscription.displayName
316
+ };
317
+ const SLOT_KEY_BY_NAME = {
318
+ [SLOT_DISPLAY_NAMES.annotations]: "annotations",
319
+ [SLOT_DISPLAY_NAMES.context]: "context",
320
+ [SLOT_DISPLAY_NAMES.toolbar]: "toolbar",
321
+ [SLOT_DISPLAY_NAMES.transcription]: "transcription"
322
+ };
323
+ function bucketChildren(children) {
324
+ const list = Array.isArray(children) ? children : [children];
325
+ return list.reduce(
326
+ (accumulator, child) => {
327
+ const name = displayName(child);
328
+ if (!name) return accumulator;
329
+ const key = SLOT_KEY_BY_NAME[name];
330
+ if (!key) return accumulator;
331
+ accumulator[key] = child;
332
+ return accumulator;
333
+ },
334
+ { annotations: null, context: null, toolbar: null, transcription: null }
335
+ );
336
+ }
337
+ function displayName(child) {
338
+ if (typeof child !== "object" || child === null) return void 0;
339
+ if (!("type" in child)) return void 0;
340
+ const type = child.type;
341
+ if (typeof type !== "object" && typeof type !== "function") return void 0;
342
+ const name = type.displayName;
343
+ return typeof name === "string" ? name : void 0;
344
+ }
345
+ function Stage({ annotations, source }) {
346
+ const { rotation, zoom } = useViewerContext();
347
+ return /* @__PURE__ */ jsx(
348
+ "div",
349
+ {
350
+ className: "relative h-full w-full overflow-auto bg-muted",
351
+ "data-rotation": rotation,
352
+ "data-zoom": zoom,
353
+ children: /* @__PURE__ */ jsxs(
354
+ "div",
355
+ {
356
+ className: "relative inline-block",
357
+ style: {
358
+ transform: `rotate(${rotation.toString()}deg) scale(${zoom.toString()})`,
359
+ transformOrigin: "top left"
360
+ },
361
+ children: [
362
+ /* @__PURE__ */ jsx(
363
+ "img",
364
+ {
365
+ alt: source.alt,
366
+ className: "block h-auto max-w-none select-none",
367
+ draggable: false,
368
+ loading: "lazy",
369
+ src: source.src
370
+ }
371
+ ),
372
+ annotations
373
+ ]
374
+ }
375
+ )
376
+ }
377
+ );
378
+ }
379
+ const PrimarySourceViewer = forwardRef((props, ref) => {
380
+ const {
381
+ children,
382
+ className,
383
+ labels,
384
+ origin,
385
+ period,
386
+ source,
387
+ title,
388
+ ...rest
389
+ } = props;
390
+ const titleId = useId();
391
+ const resolvedLabels = useMemo(
392
+ () => ({ ...DEFAULT_LABELS, ...labels }),
393
+ [labels]
394
+ );
395
+ const ctx = useViewerState(resolvedLabels);
396
+ const buckets = useMemo(() => bucketChildren(children), [children]);
397
+ return /* @__PURE__ */ jsx(ViewerContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxs(
398
+ "section",
399
+ {
400
+ "aria-labelledby": titleId,
401
+ className: cn(
402
+ "flex w-full flex-col overflow-hidden rounded-2xl border bg-background text-foreground",
403
+ className
404
+ ),
405
+ ref,
406
+ ...rest,
407
+ children: [
408
+ /* @__PURE__ */ jsxs("header", { className: "flex flex-col gap-1 border-b border-border px-4 py-3", children: [
409
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold tracking-tight", id: titleId, children: title }),
410
+ period || origin ? /* @__PURE__ */ jsxs("p", { className: "text-xs uppercase tracking-wide text-muted-foreground", children: [
411
+ period,
412
+ period && origin ? " \xB7 " : null,
413
+ origin
414
+ ] }) : null
415
+ ] }),
416
+ buckets.toolbar,
417
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-0 md:grid-cols-[2fr_1fr]", children: [
418
+ /* @__PURE__ */ jsx("div", { className: "relative h-[420px] md:h-[520px]", children: /* @__PURE__ */ jsx(Stage, { annotations: buckets.annotations, source }) }),
419
+ buckets.transcription
420
+ ] }),
421
+ buckets.context
422
+ ]
423
+ }
424
+ ) });
425
+ });
426
+ PrimarySourceViewer.displayName = "PrimarySourceViewer";
427
+ export {
428
+ PrimarySourceAnnotation,
429
+ PrimarySourceAnnotations,
430
+ PrimarySourceContext,
431
+ PrimarySourceMetadata,
432
+ PrimarySourceQuestions,
433
+ PrimarySourceRotate,
434
+ PrimarySourceToolbar,
435
+ PrimarySourceTranscription,
436
+ PrimarySourceViewer,
437
+ PrimarySourceZoomIn,
438
+ PrimarySourceZoomOut
439
+ };
@@ -0,0 +1,20 @@
1
+ import {
2
+ ProgressTracker,
3
+ ProgressTrackerBadge,
4
+ ProgressTrackerModule,
5
+ ProgressTrackerModules,
6
+ ProgressTrackerOverview,
7
+ ProgressTrackerStat,
8
+ ProgressTrackerStats,
9
+ useProgressTrackerContext
10
+ } from "./progress-tracker";
11
+ export {
12
+ ProgressTracker,
13
+ ProgressTrackerBadge,
14
+ ProgressTrackerModule,
15
+ ProgressTrackerModules,
16
+ ProgressTrackerOverview,
17
+ ProgressTrackerStat,
18
+ ProgressTrackerStats,
19
+ useProgressTrackerContext
20
+ };