@vllnt/ui 0.2.1-canary.b3f1dff → 0.2.1-canary.b8f8468
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.
- package/CHANGELOG.md +34 -0
- package/dist/components/accordion/accordion.js +2 -2
- package/dist/components/activity-heatmap/activity-heatmap.js +15 -13
- package/dist/components/activity-log/activity-log.js +5 -5
- package/dist/components/agent-activity/agent-activity.js +311 -0
- package/dist/components/agent-activity/index.js +18 -0
- package/dist/components/ai-artifact/ai-artifact.js +422 -0
- package/dist/components/ai-artifact/index.js +24 -0
- package/dist/components/ai-chat-input/ai-chat-input.js +1 -1
- package/dist/components/ai-message-bubble/ai-message-bubble.js +1 -1
- package/dist/components/ai-sidebar/ai-sidebar.js +254 -0
- package/dist/components/ai-sidebar/index.js +22 -0
- package/dist/components/ai-source-citation/ai-source-citation.js +2 -2
- package/dist/components/ai-tool-call-display/ai-tool-call-display.js +4 -4
- package/dist/components/alert-pulse/alert-pulse.js +93 -0
- package/dist/components/alert-pulse/index.js +6 -0
- package/dist/components/animated-text/animated-text.js +1 -4
- package/dist/components/auto-reload/auto-reload.js +377 -0
- package/dist/components/auto-reload/index.js +6 -0
- package/dist/components/avatar/avatar.js +1 -1
- package/dist/components/avatar-group/avatar-group.js +4 -4
- package/dist/components/banner/banner.js +155 -0
- package/dist/components/banner/index.js +10 -0
- package/dist/components/bottom-activity-strip/bottom-activity-strip.js +1 -1
- package/dist/components/breadcrumb/breadcrumb.js +33 -26
- package/dist/components/button/button.js +1 -1
- package/dist/components/calendar/calendar.js +6 -6
- package/dist/components/callout/callout.js +1 -1
- package/dist/components/candlestick-chart/candlestick-chart.js +1 -1
- package/dist/components/canvas-shell/canvas-foundation-demo.js +4 -4
- package/dist/components/carousel/carousel.js +4 -4
- package/dist/components/checkbox/checkbox.js +2 -2
- package/dist/components/checklist/checklist.js +3 -3
- package/dist/components/choropleth-map/choropleth-map.js +373 -0
- package/dist/components/choropleth-map/index.js +10 -0
- package/dist/components/chronological-timeline/chronological-timeline.js +338 -0
- package/dist/components/chronological-timeline/index.js +8 -0
- package/dist/components/civilization-card/civilization-card.js +258 -0
- package/dist/components/civilization-card/index.js +8 -0
- package/dist/components/code-block/code-block.js +2 -2
- package/dist/components/code-playground/code-playground.js +8 -7
- package/dist/components/combobox/combobox.js +46 -22
- package/dist/components/command/command.js +1 -1
- package/dist/components/comment-pin/comment-pin.js +1 -1
- package/dist/components/comparison/comparison.js +9 -9
- package/dist/components/completion-dialog/completion-dialog.js +1 -1
- package/dist/components/content-intro/content-intro.js +6 -5
- package/dist/components/context-lens/context-lens.js +98 -0
- package/dist/components/context-lens/index.js +6 -0
- package/dist/components/context-menu/context-menu.js +3 -3
- package/dist/components/conversation-thread/conversation-thread.js +8 -8
- package/dist/components/cookie-consent/cookie-consent.js +1 -1
- package/dist/components/copy-button/copy-button.js +189 -0
- package/dist/components/copy-button/index.js +8 -0
- package/dist/components/countdown-timer/countdown-timer.js +8 -7
- package/dist/components/credit-badge/credit-badge.js +1 -7
- package/dist/components/curriculum/curriculum.js +10 -10
- package/dist/components/data-table/data-table.js +5 -4
- package/dist/components/date-picker/date-picker.js +1 -1
- package/dist/components/dialog/dialog.js +1 -1
- package/dist/components/document-sibling-nav/document-sibling-nav.js +111 -0
- package/dist/components/document-sibling-nav/index.js +8 -0
- package/dist/components/dropdown-menu/dropdown-menu.js +2 -2
- package/dist/components/empty-state/empty-state.js +93 -0
- package/dist/components/empty-state/index.js +8 -0
- package/dist/components/era-comparison/era-comparison.js +198 -0
- package/dist/components/era-comparison/index.js +16 -0
- package/dist/components/exercise/exercise.js +4 -4
- package/dist/components/faq/faq.js +2 -2
- package/dist/components/file-upload/file-upload.js +3 -3
- package/dist/components/filter-bar/filter-bar.js +2 -1
- package/dist/components/flashcard/flashcard.js +1 -1
- package/dist/components/floating-action-button/floating-action-button.js +1 -1
- package/dist/components/floating-toolbar/floating-toolbar.js +66 -0
- package/dist/components/floating-toolbar/index.js +6 -0
- package/dist/components/flow-diagram/flow-controls.js +9 -9
- package/dist/components/flow-diagram/flow-error-boundary.js +2 -2
- package/dist/components/flow-diagram/flow-fullscreen.js +2 -2
- package/dist/components/follow-mode/follow-mode.js +89 -0
- package/dist/components/follow-mode/index.js +6 -0
- package/dist/components/gantt-chart/gantt-chart.js +333 -0
- package/dist/components/gantt-chart/index.js +6 -0
- package/dist/components/geography-quiz-map/geography-quiz-map.js +343 -0
- package/dist/components/geography-quiz-map/index.js +12 -0
- package/dist/components/globe-3d/globe-3d.js +417 -0
- package/dist/components/globe-3d/index.js +10 -0
- package/dist/components/handoff-beacon/handoff-beacon.js +78 -0
- package/dist/components/handoff-beacon/index.js +6 -0
- package/dist/components/heat-map-overlay/heat-map-overlay.js +215 -0
- package/dist/components/heat-map-overlay/index.js +6 -0
- package/dist/components/historic-timeline/historic-timeline.js +342 -0
- package/dist/components/historic-timeline/index.js +6 -0
- package/dist/components/historical-figure-card/historical-figure-card.js +273 -0
- package/dist/components/historical-figure-card/index.js +6 -0
- package/dist/components/horizontal-scroll-row/horizontal-scroll-row.js +4 -4
- package/dist/components/index.js +368 -1
- package/dist/components/input-otp/input-otp.js +1 -1
- package/dist/components/interactive-timeline/index.js +16 -0
- package/dist/components/interactive-timeline/interactive-timeline.js +708 -0
- package/dist/components/jarvis-dock/index.js +6 -0
- package/dist/components/jarvis-dock/jarvis-dock.js +98 -0
- package/dist/components/kbd/index.js +5 -0
- package/dist/components/kbd/kbd.js +117 -0
- package/dist/components/key-concept/key-concept.js +4 -4
- package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +2 -2
- package/dist/components/knowledge-check/index.js +6 -0
- package/dist/components/knowledge-check/knowledge-check.js +448 -0
- package/dist/components/learning-objectives/learning-objectives.js +12 -12
- package/dist/components/live-feed/live-feed.js +15 -13
- package/dist/components/map-2d/index.js +20 -0
- package/dist/components/map-2d/map-2d.js +455 -0
- package/dist/components/map-timeline/index.js +16 -0
- package/dist/components/map-timeline/map-timeline.js +506 -0
- package/dist/components/market-treemap/market-treemap.js +1 -1
- package/dist/components/mdx-content/mdx-content.js +2 -1
- package/dist/components/menubar/menubar.js +3 -3
- package/dist/components/metric-cluster/metric-cluster.js +1 -1
- package/dist/components/metric-gauge/metric-gauge.js +1 -1
- package/dist/components/model-comparison/index.js +12 -0
- package/dist/components/model-comparison/model-comparison.js +211 -0
- package/dist/components/model-selector/model-selector.js +2 -2
- package/dist/components/multi-select/multi-select.js +3 -3
- package/dist/components/multi-select-lasso/index.js +6 -0
- package/dist/components/multi-select-lasso/multi-select-lasso.js +76 -0
- package/dist/components/navbar-saas/navbar-saas.js +3 -2
- package/dist/components/navigation-menu/navigation-menu.js +2 -2
- package/dist/components/newsletter-signup/index.js +8 -0
- package/dist/components/newsletter-signup/newsletter-signup.js +269 -0
- package/dist/components/number-input/number-input.js +1 -1
- package/dist/components/number-ticker/number-ticker.js +11 -4
- package/dist/components/object-inspector/index.js +6 -0
- package/dist/components/object-inspector/object-inspector.js +136 -0
- package/dist/components/parallel-timeline/index.js +6 -0
- package/dist/components/parallel-timeline/parallel-timeline.js +251 -0
- package/dist/components/password-input/password-input.js +1 -1
- package/dist/components/plan-badge/plan-badge.js +1 -7
- package/dist/components/policy-delivery-panel/index.js +6 -0
- package/dist/components/policy-delivery-panel/policy-delivery-panel.js +99 -0
- package/dist/components/presence-stack/presence-stack.js +2 -2
- package/dist/components/presence-sync-indicator/presence-sync-indicator.js +1 -1
- package/dist/components/pricing-table/index.js +8 -0
- package/dist/components/pricing-table/pricing-table.js +247 -0
- package/dist/components/primary-source-viewer/index.js +26 -0
- package/dist/components/primary-source-viewer/primary-source-viewer.js +439 -0
- package/dist/components/pro-tip/pro-tip.js +6 -6
- package/dist/components/profile-section/profile-section.js +1 -1
- package/dist/components/progress-card/progress-card.js +4 -3
- package/dist/components/progress-tracker/progress-tracker.js +7 -5
- package/dist/components/prompt-templates/index.js +6 -0
- package/dist/components/prompt-templates/prompt-templates.js +403 -0
- package/dist/components/property-section/index.js +6 -0
- package/dist/components/property-section/property-section.js +101 -0
- package/dist/components/quiz/quiz.js +5 -5
- package/dist/components/radio-group/radio-group.js +2 -2
- package/dist/components/rating/rating.js +3 -3
- package/dist/components/relationship-inspector/index.js +6 -0
- package/dist/components/relationship-inspector/relationship-inspector.js +102 -0
- package/dist/components/resizable/resizable.js +1 -1
- package/dist/components/route-map/index.js +6 -0
- package/dist/components/route-map/route-map.js +339 -0
- package/dist/components/routing-assignment-panel/index.js +6 -0
- package/dist/components/routing-assignment-panel/routing-assignment-panel.js +122 -0
- package/dist/components/runtime-overview-panel/index.js +6 -0
- package/dist/components/runtime-overview-panel/runtime-overview-panel.js +89 -0
- package/dist/components/scope-selector/scope-selector.js +4 -4
- package/dist/components/search-bar/search-bar.js +24 -2
- package/dist/components/search-dialog/search-dialog.js +1 -1
- package/dist/components/select/select.js +4 -4
- package/dist/components/selection-halo/index.js +6 -0
- package/dist/components/selection-halo/selection-halo.js +72 -0
- package/dist/components/severity-badge/severity-badge.js +2 -2
- package/dist/components/sheet/sheet.js +1 -1
- package/dist/components/sidebar/sidebar.js +1 -1
- package/dist/components/sidebar-toggle/sidebar-toggle.js +2 -2
- package/dist/components/slider/slider.js +1 -1
- package/dist/components/slideshow/slideshow.js +11 -10
- package/dist/components/snap-guides/index.js +6 -0
- package/dist/components/snap-guides/snap-guides.js +45 -0
- package/dist/components/social-fab/social-fab.js +2 -1
- package/dist/components/sparkline-grid/sparkline-grid.js +1 -1
- package/dist/components/spinner/spinner.js +3 -3
- package/dist/components/stat-card/stat-card.js +3 -3
- package/dist/components/state-badge-overlay/state-badge-overlay.js +1 -1
- package/dist/components/status-board/status-board.js +1 -1
- package/dist/components/status-indicator/status-indicator.js +3 -3
- package/dist/components/step-by-step/step-by-step.js +8 -7
- package/dist/components/step-navigation/step-navigation.js +2 -2
- package/dist/components/stepper/stepper.js +3 -3
- package/dist/components/sticky-metric/index.js +6 -0
- package/dist/components/sticky-metric/sticky-metric.js +83 -0
- package/dist/components/story-map/index.js +8 -0
- package/dist/components/story-map/story-map.js +414 -0
- package/dist/components/switch/switch.js +1 -1
- package/dist/components/table-of-contents-panel/table-of-contents-panel.js +5 -5
- package/dist/components/tags-input/tags-input.js +1 -1
- package/dist/components/terminal/terminal.js +48 -34
- package/dist/components/thinking-block/thinking-block.js +1 -1
- package/dist/components/threshold-ring/index.js +6 -0
- package/dist/components/threshold-ring/threshold-ring.js +160 -0
- package/dist/components/ticker-tape/ticker-tape.js +2 -2
- package/dist/components/timeline/index.js +12 -0
- package/dist/components/timeline/timeline.js +239 -0
- package/dist/components/tldr-section/tldr-section.js +2 -2
- package/dist/components/tour/tour.js +1 -1
- package/dist/components/transaction-list/index.js +14 -0
- package/dist/components/transaction-list/transaction-list.js +247 -0
- package/dist/components/tree-view/index.js +6 -0
- package/dist/components/tree-view/tree-view.js +298 -0
- package/dist/components/tutorial-complete/tutorial-complete.js +8 -8
- package/dist/components/usage-breakdown/usage-breakdown.js +9 -5
- package/dist/components/video-embed/video-embed.js +2 -2
- package/dist/components/viewport-bookmarks/viewport-bookmarks.js +1 -1
- package/dist/components/watchlist/watchlist.js +5 -5
- package/dist/components/world-clock-bar/world-clock-bar.js +32 -12
- package/dist/index.d.ts +5855 -143
- package/dist/index.js +3 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,40 @@ All notable changes to `@vllnt/ui` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
> Target version: **`0.3.0`** — canary only; not yet published. See [ROADMAP.md](../../ROADMAP.md) for shipping criteria.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Hooks + utility primitives** — `CopyButton` (+ `useCopyToClipboard` hook), `Banner` + `BannerAction`, `Kbd`, `EmptyState`, `DocumentSiblingNav`.
|
|
14
|
+
- **Pricing + identity cards** — `PricingTable` + `PricingPlan`, `HistoricalFigureCard`, `CivilizationCard` (+ `CivilizationComparison`).
|
|
15
|
+
- **Newsletter** — `NewsletterSignup` (state-machine driven submit flow).
|
|
16
|
+
- **AI compound families** — `ModelComparison` (+ `Column`, `Meta`, `Vote`), `PromptTemplates`, `AgentActivity`, `AISidebar`, `AIArtifact`.
|
|
17
|
+
- **Era / financial** — `EraComparison`, `TransactionList`.
|
|
18
|
+
- **Forms** — `Form`, `MultiSelect`, `SegmentedControl`, `TagsInput`, `AutoReload`.
|
|
19
|
+
- **Educational** — `KnowledgeCheck` (inline question runner).
|
|
20
|
+
- **Charts + timelines** — `GanttChart`, `ParallelTimeline`, `Timeline` + `TimelineItem`, `HistoricTimeline`, `InteractiveTimeline`, `ChronologicalTimeline`, `TreeView`.
|
|
21
|
+
- **Document + reading** — `PrimarySourceViewer` compound family.
|
|
22
|
+
- **Maps + geography** — `Map2D`, `ChoroplethMap`, `RouteMap`, `HeatMapOverlay`, `GeographyQuizMap`, `MapTimeline`, `StoryMap`, `Globe3D`.
|
|
23
|
+
- **Canvas foundation** — `CanvasShell`, `CanvasView`, `InfinitePlane`, `ViewportBookmarks`, `WorldBreadcrumbs`, `TopBar`, `LeftRail`, `RightDock`, `ZoomHud`, `MiniMapPanel`, `WorkspaceSwitcher`.
|
|
24
|
+
- **Canvas selection + manipulation** — `SelectionHalo`, `SnapGuides`, `FloatingToolbar`, `MultiSelectLasso`, `FollowMode`, `HandoffBeacon`.
|
|
25
|
+
- **Canvas spatial objects** — `ObjectCard`, `ObjectHandle`, `AnchorPort`, `ConnectorEdge`, `EdgeLabel`, `GroupHull`.
|
|
26
|
+
- **Canvas collaboration primitives** — `LiveCursor`, `CommentPin`, `PresenceSyncIndicator`, `PresenceStack`, `SelectionPresence`, `ThreadBubble`.
|
|
27
|
+
- **Inspector + dock panels** — `PropertySection`, `ObjectInspector`, `RelationshipInspector`, `RuntimeOverviewPanel`, `RoutingAssignmentPanel`, `PolicyDeliveryPanel`.
|
|
28
|
+
- **Runtime overlays** — `AlertPulse`, `ThresholdRing`, `StickyMetric`, `HeatOverlay`, `StateBadgeOverlay`, `MetricCluster`, `JarvisDock`, `ContextLens`.
|
|
29
|
+
- **Time navigation** — `TimelineScrubber`, `PlaybackGhost`, `BottomActivityStrip`, `RunTimeline`.
|
|
30
|
+
- Total component count: **225** (up from 140).
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- Registry installs use a **hybrid CLI strategy** — leaf component source is inlined, sibling registry items resolve via `@vllnt/ui` to keep installs minimal and dedupe shared primitives.
|
|
35
|
+
|
|
36
|
+
### Notes
|
|
37
|
+
|
|
38
|
+
- `ROADMAP.md` added at repo root tracking 50 open issues across 8 phases gating the `0.3.0` cut.
|
|
39
|
+
- `0.3.0` requires the codebase-health gate (`react-doctor` CI + 0 errors), the agent-first surface (`/llms.txt`, `/mcp`, sitemap, JSON-LD), and the rebuilt landing page before shipping.
|
|
40
|
+
|
|
7
41
|
## [0.2.1] - 2026-04-21
|
|
8
42
|
|
|
9
43
|
### Fixed
|
|
@@ -104,7 +104,7 @@ function AccordionTrigger({
|
|
|
104
104
|
"span",
|
|
105
105
|
{
|
|
106
106
|
className: cn(
|
|
107
|
-
"
|
|
107
|
+
"size-4 flex-shrink-0 transition-transform duration-200",
|
|
108
108
|
isOpen && "rotate-180"
|
|
109
109
|
),
|
|
110
110
|
children: icon
|
|
@@ -113,7 +113,7 @@ function AccordionTrigger({
|
|
|
113
113
|
"svg",
|
|
114
114
|
{
|
|
115
115
|
className: cn(
|
|
116
|
-
"
|
|
116
|
+
"size-4 flex-shrink-0 transition-transform duration-200",
|
|
117
117
|
isOpen && "rotate-180"
|
|
118
118
|
),
|
|
119
119
|
fill: "none",
|
|
@@ -72,19 +72,21 @@ function getGridData(data, endDate, weeks) {
|
|
|
72
72
|
});
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
|
+
const MONTH_LABEL_FORMATTER = new Intl.DateTimeFormat("en-US", {
|
|
76
|
+
month: "short",
|
|
77
|
+
timeZone: "UTC"
|
|
78
|
+
});
|
|
79
|
+
const TOOLTIP_DATE_FORMATTER = new Intl.DateTimeFormat("en-US", {
|
|
80
|
+
day: "numeric",
|
|
81
|
+
month: "short",
|
|
82
|
+
timeZone: "UTC",
|
|
83
|
+
year: "numeric"
|
|
84
|
+
});
|
|
75
85
|
function formatMonthLabel(date) {
|
|
76
|
-
return
|
|
77
|
-
month: "short",
|
|
78
|
-
timeZone: "UTC"
|
|
79
|
-
}).format(date);
|
|
86
|
+
return MONTH_LABEL_FORMATTER.format(date);
|
|
80
87
|
}
|
|
81
88
|
function formatTooltip(date, count) {
|
|
82
|
-
const formattedDate =
|
|
83
|
-
day: "numeric",
|
|
84
|
-
month: "short",
|
|
85
|
-
timeZone: "UTC",
|
|
86
|
-
year: "numeric"
|
|
87
|
-
}).format(date);
|
|
89
|
+
const formattedDate = TOOLTIP_DATE_FORMATTER.format(date);
|
|
88
90
|
return `${count} activity ${count === 1 ? "event" : "events"} on ${formattedDate}`;
|
|
89
91
|
}
|
|
90
92
|
function HeatmapGrid({
|
|
@@ -127,15 +129,15 @@ function HeatmapGrid({
|
|
|
127
129
|
),
|
|
128
130
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2 text-xs text-muted-foreground", children: [
|
|
129
131
|
/* @__PURE__ */ jsx("span", { children: "Less" }),
|
|
130
|
-
LEVEL_CLASS_NAMES.map((className
|
|
132
|
+
LEVEL_CLASS_NAMES.map((className) => /* @__PURE__ */ jsx(
|
|
131
133
|
"span",
|
|
132
134
|
{
|
|
133
135
|
className: cn(
|
|
134
|
-
"
|
|
136
|
+
"size-3 rounded-[3px] border border-border/40",
|
|
135
137
|
className
|
|
136
138
|
)
|
|
137
139
|
},
|
|
138
|
-
`legend-${
|
|
140
|
+
`legend-${className}`
|
|
139
141
|
)),
|
|
140
142
|
/* @__PURE__ */ jsx("span", { children: "More" })
|
|
141
143
|
] })
|
|
@@ -82,7 +82,7 @@ function PaginationControls({
|
|
|
82
82
|
size: "sm",
|
|
83
83
|
variant: "outline",
|
|
84
84
|
children: [
|
|
85
|
-
/* @__PURE__ */ jsx(ChevronLeft, { className: "
|
|
85
|
+
/* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" }),
|
|
86
86
|
"Previous"
|
|
87
87
|
]
|
|
88
88
|
}
|
|
@@ -111,7 +111,7 @@ function PaginationControls({
|
|
|
111
111
|
variant: "outline",
|
|
112
112
|
children: [
|
|
113
113
|
"Next",
|
|
114
|
-
/* @__PURE__ */ jsx(ChevronRight, { className: "
|
|
114
|
+
/* @__PURE__ */ jsx(ChevronRight, { className: "size-4" })
|
|
115
115
|
]
|
|
116
116
|
}
|
|
117
117
|
)
|
|
@@ -132,18 +132,18 @@ function ActivityRow({ item }) {
|
|
|
132
132
|
{
|
|
133
133
|
"aria-hidden": "true",
|
|
134
134
|
className: cn(
|
|
135
|
-
"absolute left-4 top-3
|
|
135
|
+
"absolute left-4 top-3 size-3 rounded-full ring-4 ring-background",
|
|
136
136
|
palette.markerClassName
|
|
137
137
|
)
|
|
138
138
|
}
|
|
139
139
|
),
|
|
140
140
|
/* @__PURE__ */ jsx("div", { className: "rounded-lg border bg-background/70 p-4", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
|
|
141
141
|
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-start gap-3", children: [
|
|
142
|
-
/* @__PURE__ */ jsx(Avatar, { className: "
|
|
142
|
+
/* @__PURE__ */ jsx(Avatar, { className: "size-9 border bg-muted", children: /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(item.actor) }) }),
|
|
143
143
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-1", children: [
|
|
144
144
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
145
145
|
/* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: item.actor }),
|
|
146
|
-
/* @__PURE__ */ jsx(ArrowRight, { className: "
|
|
146
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "size-3.5 text-muted-foreground" }),
|
|
147
147
|
/* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: item.action }),
|
|
148
148
|
item.target ? /* @__PURE__ */ jsx("span", { className: "truncate text-sm font-medium text-foreground", children: item.target }) : null
|
|
149
149
|
] }),
|
|
@@ -0,0 +1,311 @@
|
|
|
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 {
|
|
13
|
+
AlertTriangle,
|
|
14
|
+
CheckCircle2,
|
|
15
|
+
ChevronDown,
|
|
16
|
+
Circle,
|
|
17
|
+
Loader2,
|
|
18
|
+
MinusCircle
|
|
19
|
+
} from "lucide-react";
|
|
20
|
+
import { cn } from "../../lib/utils";
|
|
21
|
+
const STATUS_CLASSES = {
|
|
22
|
+
completed: {
|
|
23
|
+
iconClass: "text-emerald-600 dark:text-emerald-400",
|
|
24
|
+
ringClass: "ring-emerald-500/30",
|
|
25
|
+
rowClass: "border-border bg-background"
|
|
26
|
+
},
|
|
27
|
+
error: {
|
|
28
|
+
iconClass: "text-destructive",
|
|
29
|
+
ringClass: "ring-destructive/40",
|
|
30
|
+
rowClass: "border-destructive/40 bg-destructive/5"
|
|
31
|
+
},
|
|
32
|
+
pending: {
|
|
33
|
+
iconClass: "text-muted-foreground",
|
|
34
|
+
ringClass: "ring-border",
|
|
35
|
+
rowClass: "border-border bg-muted/20 text-muted-foreground"
|
|
36
|
+
},
|
|
37
|
+
running: {
|
|
38
|
+
iconClass: "text-primary",
|
|
39
|
+
ringClass: "ring-primary/30",
|
|
40
|
+
rowClass: "border-primary/30 bg-primary/5"
|
|
41
|
+
},
|
|
42
|
+
skipped: {
|
|
43
|
+
iconClass: "text-muted-foreground/60",
|
|
44
|
+
ringClass: "ring-border",
|
|
45
|
+
rowClass: "border-border bg-background text-muted-foreground/80"
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const DEFAULT_STATUS_ICON = {
|
|
49
|
+
completed: /* @__PURE__ */ jsx(CheckCircle2, { "aria-hidden": "true", className: "size-4" }),
|
|
50
|
+
error: /* @__PURE__ */ jsx(AlertTriangle, { "aria-hidden": "true", className: "size-4" }),
|
|
51
|
+
pending: /* @__PURE__ */ jsx(Circle, { "aria-hidden": "true", className: "size-4" }),
|
|
52
|
+
running: /* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "size-4 animate-spin" }),
|
|
53
|
+
skipped: /* @__PURE__ */ jsx(MinusCircle, { "aria-hidden": "true", className: "size-4" })
|
|
54
|
+
};
|
|
55
|
+
const StepContext = createContext({ status: "pending" });
|
|
56
|
+
const DEFAULT_LABELS = {
|
|
57
|
+
activity: "Activity",
|
|
58
|
+
collapse: "Hide details",
|
|
59
|
+
elapsed: "Elapsed",
|
|
60
|
+
expand: "Show details"
|
|
61
|
+
};
|
|
62
|
+
const ACTIVITY_LIVE_REGION_ROLE = {
|
|
63
|
+
completed: "status",
|
|
64
|
+
error: "status",
|
|
65
|
+
idle: "status",
|
|
66
|
+
running: "log"
|
|
67
|
+
};
|
|
68
|
+
const AgentActivity = forwardRef(
|
|
69
|
+
(props, ref) => {
|
|
70
|
+
const {
|
|
71
|
+
children,
|
|
72
|
+
className,
|
|
73
|
+
elapsed,
|
|
74
|
+
labels,
|
|
75
|
+
status = "idle",
|
|
76
|
+
...rest
|
|
77
|
+
} = props;
|
|
78
|
+
const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
|
|
79
|
+
return /* @__PURE__ */ jsxs(
|
|
80
|
+
"section",
|
|
81
|
+
{
|
|
82
|
+
"aria-live": status === "running" ? "polite" : "off",
|
|
83
|
+
className: cn(
|
|
84
|
+
"flex flex-col gap-3 rounded-2xl border bg-background p-4",
|
|
85
|
+
className
|
|
86
|
+
),
|
|
87
|
+
"data-status": status,
|
|
88
|
+
ref,
|
|
89
|
+
role: ACTIVITY_LIVE_REGION_ROLE[status],
|
|
90
|
+
...rest,
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-3", children: [
|
|
93
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold tracking-tight text-foreground", children: resolvedLabels.activity }),
|
|
94
|
+
elapsed ? /* @__PURE__ */ jsx(
|
|
95
|
+
"span",
|
|
96
|
+
{
|
|
97
|
+
"aria-label": resolvedLabels.elapsed,
|
|
98
|
+
className: "text-xs font-mono text-muted-foreground",
|
|
99
|
+
children: elapsed
|
|
100
|
+
}
|
|
101
|
+
) : null
|
|
102
|
+
] }),
|
|
103
|
+
/* @__PURE__ */ jsx("ol", { className: "flex flex-col gap-2", children })
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
AgentActivity.displayName = "AgentActivity";
|
|
110
|
+
function getDisplayName(value) {
|
|
111
|
+
if (value !== null && (typeof value === "object" || typeof value === "function") && "displayName" in value && typeof value.displayName === "string") {
|
|
112
|
+
return value.displayName;
|
|
113
|
+
}
|
|
114
|
+
return void 0;
|
|
115
|
+
}
|
|
116
|
+
function isAgentStepDetailElement(child) {
|
|
117
|
+
if (child === null || typeof child !== "object") return false;
|
|
118
|
+
if (!("type" in child)) return false;
|
|
119
|
+
return getDisplayName(child.type) === "AgentStepDetail";
|
|
120
|
+
}
|
|
121
|
+
function splitChildren(children) {
|
|
122
|
+
const items = Array.isArray(children) ? children : [children];
|
|
123
|
+
return items.reduce(
|
|
124
|
+
(split, child) => {
|
|
125
|
+
if (isAgentStepDetailElement(child)) {
|
|
126
|
+
split.body.push(child);
|
|
127
|
+
} else {
|
|
128
|
+
split.header.push(child);
|
|
129
|
+
}
|
|
130
|
+
return split;
|
|
131
|
+
},
|
|
132
|
+
{ body: [], header: [] }
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
function StepRow({
|
|
136
|
+
detailsId,
|
|
137
|
+
hasDetails,
|
|
138
|
+
header,
|
|
139
|
+
icon,
|
|
140
|
+
iconClass,
|
|
141
|
+
labels,
|
|
142
|
+
onToggle,
|
|
143
|
+
open
|
|
144
|
+
}) {
|
|
145
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 px-3 py-2", children: [
|
|
146
|
+
/* @__PURE__ */ jsx(
|
|
147
|
+
"span",
|
|
148
|
+
{
|
|
149
|
+
"aria-hidden": "true",
|
|
150
|
+
className: cn(
|
|
151
|
+
"mt-0.5 inline-flex size-5 shrink-0 items-center justify-center",
|
|
152
|
+
iconClass
|
|
153
|
+
),
|
|
154
|
+
children: icon
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
/* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: header }),
|
|
158
|
+
hasDetails ? /* @__PURE__ */ jsx(
|
|
159
|
+
"button",
|
|
160
|
+
{
|
|
161
|
+
"aria-controls": detailsId,
|
|
162
|
+
"aria-expanded": open,
|
|
163
|
+
"aria-label": open ? labels.collapse : labels.expand,
|
|
164
|
+
className: "ml-auto inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
165
|
+
onClick: onToggle,
|
|
166
|
+
type: "button",
|
|
167
|
+
children: /* @__PURE__ */ jsx(
|
|
168
|
+
ChevronDown,
|
|
169
|
+
{
|
|
170
|
+
"aria-hidden": "true",
|
|
171
|
+
className: cn(
|
|
172
|
+
"size-4 transition-transform",
|
|
173
|
+
open ? "rotate-180" : "rotate-0"
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
)
|
|
177
|
+
}
|
|
178
|
+
) : null
|
|
179
|
+
] });
|
|
180
|
+
}
|
|
181
|
+
const AgentStep = forwardRef(
|
|
182
|
+
(props, ref) => {
|
|
183
|
+
const {
|
|
184
|
+
children,
|
|
185
|
+
className,
|
|
186
|
+
defaultOpen = true,
|
|
187
|
+
icon,
|
|
188
|
+
status,
|
|
189
|
+
...rest
|
|
190
|
+
} = props;
|
|
191
|
+
const split = useMemo(() => splitChildren(children), [children]);
|
|
192
|
+
const palette = STATUS_CLASSES[status];
|
|
193
|
+
const hasDetails = split.body.length > 0;
|
|
194
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
195
|
+
const detailsId = useId();
|
|
196
|
+
const handleToggle = useCallback(() => {
|
|
197
|
+
setOpen((value) => !value);
|
|
198
|
+
}, []);
|
|
199
|
+
const contextValue = useMemo(
|
|
200
|
+
() => ({ status }),
|
|
201
|
+
[status]
|
|
202
|
+
);
|
|
203
|
+
const resolvedIcon = icon ?? DEFAULT_STATUS_ICON[status];
|
|
204
|
+
return /* @__PURE__ */ jsx(
|
|
205
|
+
"li",
|
|
206
|
+
{
|
|
207
|
+
className: cn(
|
|
208
|
+
"rounded-xl border ring-1",
|
|
209
|
+
palette.rowClass,
|
|
210
|
+
palette.ringClass,
|
|
211
|
+
className
|
|
212
|
+
),
|
|
213
|
+
"data-status": status,
|
|
214
|
+
ref,
|
|
215
|
+
...rest,
|
|
216
|
+
children: /* @__PURE__ */ jsxs(StepContext.Provider, { value: contextValue, children: [
|
|
217
|
+
/* @__PURE__ */ jsx(
|
|
218
|
+
StepRow,
|
|
219
|
+
{
|
|
220
|
+
detailsId,
|
|
221
|
+
hasDetails,
|
|
222
|
+
header: split.header,
|
|
223
|
+
icon: resolvedIcon,
|
|
224
|
+
iconClass: palette.iconClass,
|
|
225
|
+
labels: DEFAULT_LABELS,
|
|
226
|
+
onToggle: handleToggle,
|
|
227
|
+
open
|
|
228
|
+
}
|
|
229
|
+
),
|
|
230
|
+
hasDetails && open ? /* @__PURE__ */ jsx(
|
|
231
|
+
"div",
|
|
232
|
+
{
|
|
233
|
+
className: "border-t border-border/60 px-3 py-2 text-xs",
|
|
234
|
+
id: detailsId,
|
|
235
|
+
children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 pl-8", children: split.body })
|
|
236
|
+
}
|
|
237
|
+
) : null
|
|
238
|
+
] })
|
|
239
|
+
}
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
AgentStep.displayName = "AgentStep";
|
|
244
|
+
const AgentStepTitle = forwardRef(({ className, ...rest }, ref) => /* @__PURE__ */ jsx(
|
|
245
|
+
"p",
|
|
246
|
+
{
|
|
247
|
+
className: cn(
|
|
248
|
+
"text-sm font-medium leading-tight text-foreground",
|
|
249
|
+
className
|
|
250
|
+
),
|
|
251
|
+
ref,
|
|
252
|
+
...rest
|
|
253
|
+
}
|
|
254
|
+
));
|
|
255
|
+
AgentStepTitle.displayName = "AgentStepTitle";
|
|
256
|
+
const AgentStepDuration = forwardRef(({ className, ...rest }, ref) => /* @__PURE__ */ jsx(
|
|
257
|
+
"span",
|
|
258
|
+
{
|
|
259
|
+
className: cn("font-mono text-xs text-muted-foreground", className),
|
|
260
|
+
ref,
|
|
261
|
+
...rest
|
|
262
|
+
}
|
|
263
|
+
));
|
|
264
|
+
AgentStepDuration.displayName = "AgentStepDuration";
|
|
265
|
+
const AgentStepProgress = forwardRef(({ className, label = "Step progress", value, ...rest }, ref) => {
|
|
266
|
+
const clamped = Math.max(0, Math.min(100, value));
|
|
267
|
+
return /* @__PURE__ */ jsx(
|
|
268
|
+
"div",
|
|
269
|
+
{
|
|
270
|
+
"aria-label": label,
|
|
271
|
+
"aria-valuemax": 100,
|
|
272
|
+
"aria-valuemin": 0,
|
|
273
|
+
"aria-valuenow": clamped,
|
|
274
|
+
className: cn("h-1.5 w-full rounded-full bg-muted", className),
|
|
275
|
+
ref,
|
|
276
|
+
role: "progressbar",
|
|
277
|
+
...rest,
|
|
278
|
+
children: /* @__PURE__ */ jsx(
|
|
279
|
+
"span",
|
|
280
|
+
{
|
|
281
|
+
className: "block h-full rounded-full bg-primary transition-[width]",
|
|
282
|
+
style: { width: `${clamped.toString()}%` }
|
|
283
|
+
}
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
});
|
|
288
|
+
AgentStepProgress.displayName = "AgentStepProgress";
|
|
289
|
+
const AgentStepDetail = forwardRef(
|
|
290
|
+
({ className, ...rest }, ref) => /* @__PURE__ */ jsx(
|
|
291
|
+
"div",
|
|
292
|
+
{
|
|
293
|
+
className: cn("text-xs text-muted-foreground", className),
|
|
294
|
+
ref,
|
|
295
|
+
...rest
|
|
296
|
+
}
|
|
297
|
+
)
|
|
298
|
+
);
|
|
299
|
+
AgentStepDetail.displayName = "AgentStepDetail";
|
|
300
|
+
function useAgentStepStatus() {
|
|
301
|
+
return useContext(StepContext).status;
|
|
302
|
+
}
|
|
303
|
+
export {
|
|
304
|
+
AgentActivity,
|
|
305
|
+
AgentStep,
|
|
306
|
+
AgentStepDetail,
|
|
307
|
+
AgentStepDuration,
|
|
308
|
+
AgentStepProgress,
|
|
309
|
+
AgentStepTitle,
|
|
310
|
+
useAgentStepStatus
|
|
311
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AgentActivity,
|
|
3
|
+
AgentStep,
|
|
4
|
+
AgentStepDetail,
|
|
5
|
+
AgentStepDuration,
|
|
6
|
+
AgentStepProgress,
|
|
7
|
+
AgentStepTitle,
|
|
8
|
+
useAgentStepStatus
|
|
9
|
+
} from "./agent-activity";
|
|
10
|
+
export {
|
|
11
|
+
AgentActivity,
|
|
12
|
+
AgentStep,
|
|
13
|
+
AgentStepDetail,
|
|
14
|
+
AgentStepDuration,
|
|
15
|
+
AgentStepProgress,
|
|
16
|
+
AgentStepTitle,
|
|
17
|
+
useAgentStepStatus
|
|
18
|
+
};
|