@vllnt/ui 0.2.0 → 0.2.1-canary.73a93ee

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 (86) hide show
  1. package/CHANGELOG.md +12 -1
  2. package/README.md +27 -12
  3. package/dist/components/activity-log/activity-log.js +1 -0
  4. package/dist/components/anchor-port/anchor-port.js +51 -0
  5. package/dist/components/anchor-port/index.js +4 -0
  6. package/dist/components/animated-text/animated-text.js +1 -0
  7. package/dist/components/bottom-bar/bottom-bar.js +25 -0
  8. package/dist/components/bottom-bar/index.js +4 -0
  9. package/dist/components/canvas-shell/canvas-foundation-demo.js +183 -0
  10. package/dist/components/canvas-shell/canvas-shell-route-config.js +0 -0
  11. package/dist/components/canvas-shell/canvas-shell.js +261 -0
  12. package/dist/components/canvas-shell/index.js +4 -0
  13. package/dist/components/canvas-view/canvas-view.js +461 -0
  14. package/dist/components/canvas-view/index.js +6 -0
  15. package/dist/components/chart/area-chart.js +1 -0
  16. package/dist/components/chart/line-chart.js +1 -0
  17. package/dist/components/chat-dock-section/chat-dock-section.js +56 -0
  18. package/dist/components/chat-dock-section/index.js +6 -0
  19. package/dist/components/checklist/checklist.js +7 -0
  20. package/dist/components/checklist/index.js +3 -1
  21. package/dist/components/comment-pin/comment-pin.js +104 -0
  22. package/dist/components/comment-pin/index.js +6 -0
  23. package/dist/components/connector-edge/connector-edge.js +66 -0
  24. package/dist/components/connector-edge/index.js +6 -0
  25. package/dist/components/conversation-thread/conversation-thread.js +348 -0
  26. package/dist/components/conversation-thread/index.js +20 -0
  27. package/dist/components/curriculum/curriculum.js +349 -0
  28. package/dist/components/curriculum/index.js +10 -0
  29. package/dist/components/data-list/data-list.js +1 -0
  30. package/dist/components/edge-label/edge-label.js +26 -0
  31. package/dist/components/edge-label/index.js +4 -0
  32. package/dist/components/form/form.js +432 -0
  33. package/dist/components/form/index.js +20 -0
  34. package/dist/components/glass-panel/glass-panel.js +21 -0
  35. package/dist/components/glass-panel/index.js +4 -0
  36. package/dist/components/group-hull/group-hull.js +29 -0
  37. package/dist/components/group-hull/index.js +4 -0
  38. package/dist/components/index.js +176 -0
  39. package/dist/components/infinite-plane/index.js +6 -0
  40. package/dist/components/infinite-plane/infinite-plane.js +75 -0
  41. package/dist/components/left-rail/index.js +4 -0
  42. package/dist/components/left-rail/left-rail.js +25 -0
  43. package/dist/components/live-cursor/index.js +6 -0
  44. package/dist/components/live-cursor/live-cursor.js +62 -0
  45. package/dist/components/mini-map-panel/index.js +6 -0
  46. package/dist/components/mini-map-panel/mini-map-panel.js +74 -0
  47. package/dist/components/multi-select/index.js +6 -0
  48. package/dist/components/multi-select/multi-select.js +258 -0
  49. package/dist/components/object-card/index.js +6 -0
  50. package/dist/components/object-card/object-card.js +126 -0
  51. package/dist/components/object-handle/index.js +4 -0
  52. package/dist/components/object-handle/object-handle.js +38 -0
  53. package/dist/components/overview-board/index.js +8 -0
  54. package/dist/components/overview-board/overview-board.js +127 -0
  55. package/dist/components/presence-stack/index.js +6 -0
  56. package/dist/components/presence-stack/presence-stack.js +108 -0
  57. package/dist/components/presence-sync-indicator/index.js +6 -0
  58. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +73 -0
  59. package/dist/components/progress-tracker/index.js +20 -0
  60. package/dist/components/progress-tracker/progress-tracker.js +527 -0
  61. package/dist/components/right-dock/index.js +4 -0
  62. package/dist/components/right-dock/right-dock.js +28 -0
  63. package/dist/components/run-timeline/index.js +6 -0
  64. package/dist/components/run-timeline/run-timeline.js +221 -0
  65. package/dist/components/segmented-control/index.js +12 -0
  66. package/dist/components/segmented-control/segmented-control.js +61 -0
  67. package/dist/components/selection-presence/index.js +6 -0
  68. package/dist/components/selection-presence/selection-presence.js +50 -0
  69. package/dist/components/spinner/unicode-spinner.js +1 -0
  70. package/dist/components/tags-input/index.js +4 -0
  71. package/dist/components/tags-input/tags-input.js +178 -0
  72. package/dist/components/thread-bubble/index.js +6 -0
  73. package/dist/components/thread-bubble/thread-bubble.js +85 -0
  74. package/dist/components/top-bar/index.js +4 -0
  75. package/dist/components/top-bar/top-bar.js +31 -0
  76. package/dist/components/usage-breakdown/usage-breakdown.js +1 -0
  77. package/dist/components/viewport-bookmarks/index.js +6 -0
  78. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +116 -0
  79. package/dist/components/workspace-switcher/index.js +6 -0
  80. package/dist/components/workspace-switcher/workspace-switcher.js +61 -0
  81. package/dist/components/world-breadcrumbs/index.js +6 -0
  82. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +114 -0
  83. package/dist/components/zoom-hud/index.js +4 -0
  84. package/dist/components/zoom-hud/zoom-hud.js +61 -0
  85. package/dist/index.d.ts +1468 -6
  86. package/package.json +7 -3
@@ -0,0 +1,116 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ forwardRef
5
+ } from "react";
6
+ import { cn } from "../../lib/utils";
7
+ const DEFAULT_LABELS = {
8
+ empty: "No saved views",
9
+ region: "Viewport bookmarks"
10
+ };
11
+ const Row = (props) => {
12
+ const { active, bookmark, onSelect } = props;
13
+ const handleClick = () => {
14
+ onSelect?.(bookmark.id);
15
+ };
16
+ const rowClass = "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-xs transition-colors";
17
+ const activeClass = active ? "bg-muted/60 text-foreground" : "text-muted-foreground hover:bg-muted/30 hover:text-foreground";
18
+ if (onSelect) {
19
+ return /* @__PURE__ */ jsx(
20
+ "button",
21
+ {
22
+ "aria-pressed": active,
23
+ className: cn(
24
+ rowClass,
25
+ activeClass,
26
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
27
+ ),
28
+ "data-viewport-bookmark": bookmark.id,
29
+ "data-viewport-bookmark-active": active,
30
+ onClick: handleClick,
31
+ type: "button",
32
+ children: /* @__PURE__ */ jsx(RowBody, { bookmark })
33
+ }
34
+ );
35
+ }
36
+ return /* @__PURE__ */ jsx(
37
+ "span",
38
+ {
39
+ className: cn(rowClass, activeClass),
40
+ "data-viewport-bookmark": bookmark.id,
41
+ "data-viewport-bookmark-active": active,
42
+ children: /* @__PURE__ */ jsx(RowBody, { bookmark })
43
+ }
44
+ );
45
+ };
46
+ const RowBody = (props) => {
47
+ const { bookmark } = props;
48
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
49
+ /* @__PURE__ */ jsx(
50
+ "span",
51
+ {
52
+ "aria-hidden": "true",
53
+ className: "h-1.5 w-1.5 rounded-full",
54
+ style: { backgroundColor: bookmark.color ?? "hsl(var(--foreground))" }
55
+ }
56
+ ),
57
+ /* @__PURE__ */ jsxs("span", { className: "flex flex-1 flex-col text-left", children: [
58
+ /* @__PURE__ */ jsx("span", { className: "truncate font-medium", children: bookmark.label }),
59
+ bookmark.detail ? /* @__PURE__ */ jsx(
60
+ "span",
61
+ {
62
+ className: "truncate text-[10px] text-muted-foreground",
63
+ "data-viewport-bookmark-detail": true,
64
+ children: bookmark.detail
65
+ }
66
+ ) : null
67
+ ] })
68
+ ] });
69
+ };
70
+ const ViewportBookmarks = forwardRef((props, ref) => {
71
+ const {
72
+ activeId,
73
+ bookmarks,
74
+ className,
75
+ labels,
76
+ onSelect,
77
+ title = "Saved views",
78
+ ...rest
79
+ } = props;
80
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
81
+ return /* @__PURE__ */ jsxs(
82
+ "section",
83
+ {
84
+ "aria-label": resolvedLabels.region,
85
+ className: cn(
86
+ "flex w-full flex-col gap-1 rounded-lg border border-border bg-background p-2 text-foreground",
87
+ className
88
+ ),
89
+ "data-viewport-bookmarks": true,
90
+ ref,
91
+ ...rest,
92
+ children: [
93
+ /* @__PURE__ */ jsx("header", { className: "px-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground", children: title }),
94
+ bookmarks.length === 0 ? /* @__PURE__ */ jsx(
95
+ "p",
96
+ {
97
+ className: "px-2 py-3 text-center text-[11px] text-muted-foreground",
98
+ "data-viewport-bookmarks-state": "empty",
99
+ children: resolvedLabels.empty
100
+ }
101
+ ) : /* @__PURE__ */ jsx("ul", { className: "space-y-0.5", children: bookmarks.map((bookmark) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
102
+ Row,
103
+ {
104
+ active: activeId === bookmark.id,
105
+ bookmark,
106
+ onSelect
107
+ }
108
+ ) }, bookmark.id)) })
109
+ ]
110
+ }
111
+ );
112
+ });
113
+ ViewportBookmarks.displayName = "ViewportBookmarks";
114
+ export {
115
+ ViewportBookmarks
116
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ WorkspaceSwitcher
3
+ } from "./workspace-switcher";
4
+ export {
5
+ WorkspaceSwitcher
6
+ };
@@ -0,0 +1,61 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { forwardRef, useMemo, useState } from "react";
4
+ import { cn } from "../../lib/utils";
5
+ const WorkspaceSwitcher = forwardRef(
6
+ ({ className, defaultValue, onValueChange, value, workspaces, ...props }, ref) => {
7
+ const fallbackValue = defaultValue ?? workspaces[0]?.id ?? "";
8
+ const [internalValue, setInternalValue] = useState(fallbackValue);
9
+ const currentValue = value ?? internalValue;
10
+ const currentWorkspace = useMemo(
11
+ () => workspaces.find((workspace) => workspace.id === currentValue),
12
+ [currentValue, workspaces]
13
+ );
14
+ function handleSelect(nextValue) {
15
+ if (value === void 0) {
16
+ setInternalValue(nextValue);
17
+ }
18
+ onValueChange?.(nextValue);
19
+ }
20
+ return /* @__PURE__ */ jsxs(
21
+ "div",
22
+ {
23
+ className: cn(
24
+ "inline-flex min-w-0 items-center gap-1 rounded-full border border-border/70 bg-muted/50 p-1",
25
+ className
26
+ ),
27
+ ref,
28
+ role: "radiogroup",
29
+ ...props,
30
+ children: [
31
+ workspaces.map((workspace) => {
32
+ const isActive = workspace.id === currentValue;
33
+ return /* @__PURE__ */ jsx(
34
+ "button",
35
+ {
36
+ "aria-checked": isActive,
37
+ className: cn(
38
+ "rounded-full px-3 py-1.5 text-sm font-medium transition-colors",
39
+ isActive ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
40
+ ),
41
+ onClick: () => {
42
+ handleSelect(workspace.id);
43
+ },
44
+ role: "radio",
45
+ title: workspace.description,
46
+ type: "button",
47
+ children: workspace.label
48
+ },
49
+ workspace.id
50
+ );
51
+ }),
52
+ currentWorkspace?.description ? /* @__PURE__ */ jsx("span", { className: "hidden pl-2 pr-1 text-xs text-muted-foreground md:inline", children: currentWorkspace.description }) : null
53
+ ]
54
+ }
55
+ );
56
+ }
57
+ );
58
+ WorkspaceSwitcher.displayName = "WorkspaceSwitcher";
59
+ export {
60
+ WorkspaceSwitcher
61
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ WorldBreadcrumbs
3
+ } from "./world-breadcrumbs";
4
+ export {
5
+ WorldBreadcrumbs
6
+ };
@@ -0,0 +1,114 @@
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 KIND_GLYPH = {
8
+ agent: "\u25C7",
9
+ artifact: "\u25CC",
10
+ group: "\u25A4",
11
+ run: "\u25B6",
12
+ task: "\u25A2",
13
+ world: "\u2726"
14
+ };
15
+ const DEFAULT_LABELS = {
16
+ empty: "No location",
17
+ region: "World breadcrumbs"
18
+ };
19
+ const Crumb = (props) => {
20
+ const { crumb, isLast, onSelect } = props;
21
+ const glyph = crumb.kind ? KIND_GLYPH[crumb.kind] : null;
22
+ const handleClick = () => {
23
+ onSelect?.(crumb.id);
24
+ };
25
+ const text = /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
26
+ glyph ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-muted-foreground", children: glyph }) : null,
27
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: crumb.label })
28
+ ] });
29
+ if (isLast || !onSelect) {
30
+ return /* @__PURE__ */ jsx(
31
+ "span",
32
+ {
33
+ "aria-current": isLast ? "location" : void 0,
34
+ className: cn(
35
+ "inline-flex items-center text-xs",
36
+ isLast ? "font-semibold text-foreground" : "text-muted-foreground"
37
+ ),
38
+ "data-world-breadcrumb": crumb.id,
39
+ "data-world-breadcrumb-active": isLast,
40
+ children: text
41
+ }
42
+ );
43
+ }
44
+ return /* @__PURE__ */ jsx(
45
+ "button",
46
+ {
47
+ className: "inline-flex items-center rounded-sm text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
48
+ "data-world-breadcrumb": crumb.id,
49
+ "data-world-breadcrumb-active": "false",
50
+ onClick: handleClick,
51
+ type: "button",
52
+ children: text
53
+ }
54
+ );
55
+ };
56
+ const WorldBreadcrumbs = forwardRef(
57
+ (props, ref) => {
58
+ const { className, crumbs, labels, onSelect, ...rest } = props;
59
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
60
+ if (crumbs.length === 0) {
61
+ return /* @__PURE__ */ jsx(
62
+ "nav",
63
+ {
64
+ "aria-label": resolvedLabels.region,
65
+ className: cn(
66
+ "inline-flex items-center text-xs text-muted-foreground",
67
+ className
68
+ ),
69
+ "data-world-breadcrumbs": true,
70
+ "data-world-breadcrumbs-state": "empty",
71
+ ref,
72
+ ...rest,
73
+ children: resolvedLabels.empty
74
+ }
75
+ );
76
+ }
77
+ return /* @__PURE__ */ jsx(
78
+ "nav",
79
+ {
80
+ "aria-label": resolvedLabels.region,
81
+ className: cn(
82
+ "inline-flex items-center gap-1.5 text-xs text-muted-foreground",
83
+ className
84
+ ),
85
+ "data-world-breadcrumbs": true,
86
+ ref,
87
+ ...rest,
88
+ children: crumbs.map((crumb, index) => /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
89
+ /* @__PURE__ */ jsx(
90
+ Crumb,
91
+ {
92
+ crumb,
93
+ isLast: index === crumbs.length - 1,
94
+ onSelect
95
+ }
96
+ ),
97
+ index < crumbs.length - 1 ? /* @__PURE__ */ jsx(
98
+ "span",
99
+ {
100
+ "aria-hidden": "true",
101
+ className: "text-muted-foreground/60",
102
+ "data-world-breadcrumb-sep": true,
103
+ children: "\u203A"
104
+ }
105
+ ) : null
106
+ ] }, crumb.id))
107
+ }
108
+ );
109
+ }
110
+ );
111
+ WorldBreadcrumbs.displayName = "WorldBreadcrumbs";
112
+ export {
113
+ WorldBreadcrumbs
114
+ };
@@ -0,0 +1,4 @@
1
+ import { ZoomHUD } from "./zoom-hud";
2
+ export {
3
+ ZoomHUD
4
+ };
@@ -0,0 +1,61 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { Minus, Plus, RotateCcw } from "lucide-react";
4
+ import { cn } from "../../lib/utils";
5
+ import { Button } from "../button";
6
+ const ZoomHUD = forwardRef(
7
+ ({ className, onReset, onZoomIn, onZoomOut, zoom, ...props }, ref) => /* @__PURE__ */ jsxs(
8
+ "div",
9
+ {
10
+ className: cn(
11
+ "inline-flex items-center gap-1 rounded-sm border border-border bg-background p-1 font-mono",
12
+ className
13
+ ),
14
+ ref,
15
+ ...props,
16
+ children: [
17
+ /* @__PURE__ */ jsx(
18
+ Button,
19
+ {
20
+ "aria-label": "Zoom out",
21
+ onClick: onZoomOut,
22
+ size: "icon",
23
+ type: "button",
24
+ variant: "ghost",
25
+ children: /* @__PURE__ */ jsx(Minus, { className: "size-4" })
26
+ }
27
+ ),
28
+ /* @__PURE__ */ jsxs("div", { className: "min-w-16 px-2 text-center text-xs font-medium tabular-nums text-foreground", children: [
29
+ Math.round(zoom * 100),
30
+ "%"
31
+ ] }),
32
+ /* @__PURE__ */ jsx(
33
+ Button,
34
+ {
35
+ "aria-label": "Zoom in",
36
+ onClick: onZoomIn,
37
+ size: "icon",
38
+ type: "button",
39
+ variant: "ghost",
40
+ children: /* @__PURE__ */ jsx(Plus, { className: "size-4" })
41
+ }
42
+ ),
43
+ /* @__PURE__ */ jsx(
44
+ Button,
45
+ {
46
+ "aria-label": "Reset zoom",
47
+ onClick: onReset,
48
+ size: "icon",
49
+ type: "button",
50
+ variant: "ghost",
51
+ children: /* @__PURE__ */ jsx(RotateCcw, { className: "size-4" })
52
+ }
53
+ )
54
+ ]
55
+ }
56
+ )
57
+ );
58
+ ZoomHUD.displayName = "ZoomHUD";
59
+ export {
60
+ ZoomHUD
61
+ };