@adea-ai/ui 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/components/account-drawer.d.ts +1 -1
  2. package/dist/components/account-drawer.js +12 -12
  3. package/dist/components/on-screen-controls.js +12 -12
  4. package/dist/components/scene-settings.d.ts +3 -3
  5. package/dist/components/scene-settings.js +11 -11
  6. package/dist/components/theme-provider.d.ts +1 -1
  7. package/dist/components/theme-provider.js +2 -2
  8. package/dist/components/theme-toggle.js +8 -8
  9. package/dist/components/ui/badge.d.ts +3 -3
  10. package/dist/components/ui/badge.js +15 -15
  11. package/dist/components/ui/button.d.ts +2 -2
  12. package/dist/components/ui/button.js +19 -19
  13. package/dist/components/ui/card.d.ts +1 -1
  14. package/dist/components/ui/card.js +3 -3
  15. package/dist/components/ui/dialog.d.ts +4 -4
  16. package/dist/components/ui/dialog.js +10 -10
  17. package/dist/components/ui/drawer.d.ts +5 -5
  18. package/dist/components/ui/drawer.js +26 -26
  19. package/dist/components/ui/dropdown-menu.d.ts +5 -5
  20. package/dist/components/ui/dropdown-menu.js +12 -12
  21. package/dist/components/ui/empty.d.ts +7 -7
  22. package/dist/components/ui/empty.js +11 -11
  23. package/dist/components/ui/field.d.ts +12 -12
  24. package/dist/components/ui/field.js +22 -22
  25. package/dist/components/ui/input.d.ts +2 -2
  26. package/dist/components/ui/input.js +3 -3
  27. package/dist/components/ui/label.d.ts +2 -2
  28. package/dist/components/ui/label.js +3 -3
  29. package/dist/components/ui/radio-group.d.ts +2 -2
  30. package/dist/components/ui/radio-group.js +6 -6
  31. package/dist/components/ui/separator.d.ts +1 -1
  32. package/dist/components/ui/separator.js +5 -5
  33. package/dist/components/ui/skeleton.d.ts +1 -1
  34. package/dist/components/ui/skeleton.js +2 -2
  35. package/dist/components/ui/spinner.d.ts +2 -2
  36. package/dist/components/ui/spinner.js +3 -3
  37. package/dist/components/ui/switch.d.ts +2 -2
  38. package/dist/components/ui/switch.js +5 -5
  39. package/dist/components/ui/tabs.d.ts +2 -2
  40. package/dist/components/ui/tabs.js +13 -13
  41. package/dist/components/ui/toggle-group.d.ts +6 -6
  42. package/dist/components/ui/toggle-group.js +13 -13
  43. package/dist/components/ui/toggle.d.ts +2 -2
  44. package/dist/components/ui/toggle.js +11 -11
  45. package/dist/components/ui/tooltip.d.ts +3 -3
  46. package/dist/components/ui/tooltip.js +5 -5
  47. package/dist/components/version-dialog.d.ts +1 -1
  48. package/dist/components/version-dialog.js +33 -33
  49. package/dist/components/workspace-brand.js +1 -1
  50. package/dist/components/workspace-logo.d.ts +1 -1
  51. package/dist/index.d.ts +19 -19
  52. package/dist/index.js +19 -19
  53. package/dist/lib/utils.d.ts +1 -1
  54. package/dist/lib/utils.js +2 -2
  55. package/dist/lib/version-notes.js +18 -18
  56. package/package.json +9 -9
  57. package/src/components/account-drawer.tsx +27 -27
  58. package/src/components/on-screen-controls.tsx +45 -45
  59. package/src/components/scene-settings.tsx +55 -55
  60. package/src/components/theme-provider.tsx +7 -7
  61. package/src/components/theme-toggle.tsx +20 -20
  62. package/src/components/ui/badge.tsx +20 -20
  63. package/src/components/ui/button.tsx +24 -24
  64. package/src/components/ui/card.tsx +6 -6
  65. package/src/components/ui/dialog.tsx +24 -24
  66. package/src/components/ui/drawer.tsx +55 -55
  67. package/src/components/ui/dropdown-menu.tsx +39 -39
  68. package/src/components/ui/empty.tsx +25 -25
  69. package/src/components/ui/field.tsx +55 -55
  70. package/src/components/ui/input.tsx +7 -7
  71. package/src/components/ui/label.tsx +7 -7
  72. package/src/components/ui/radio-group.tsx +9 -9
  73. package/src/components/ui/separator.tsx +7 -7
  74. package/src/components/ui/skeleton.tsx +5 -5
  75. package/src/components/ui/spinner.tsx +6 -6
  76. package/src/components/ui/switch.tsx +8 -8
  77. package/src/components/ui/tabs.tsx +21 -21
  78. package/src/components/ui/toggle-group.tsx +25 -25
  79. package/src/components/ui/toggle.tsx +15 -15
  80. package/src/components/ui/tooltip.tsx +13 -13
  81. package/src/components/version-dialog.tsx +113 -113
  82. package/src/components/workspace-brand.tsx +4 -4
  83. package/src/components/workspace-logo.tsx +2 -2
  84. package/src/index.tsx +19 -19
  85. package/src/lib/utils.ts +3 -3
  86. package/src/lib/version-notes.ts +23 -23
  87. package/src/styles/conventional-workspace.css +26 -26
  88. package/src/styles/globals.css +2 -2
  89. package/src/styles/theme.css +1 -1
  90. package/src/styles/workspace-shell.css +2 -2
@@ -1,5 +1,5 @@
1
- import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
2
- import { type VariantProps } from "class-variance-authority";
1
+ import { Toggle as TogglePrimitive } from '@base-ui/react/toggle';
2
+ import { type VariantProps } from 'class-variance-authority';
3
3
  declare const toggleVariants: (props?: ({
4
4
  variant?: "default" | "outline" | null | undefined;
5
5
  size?: "default" | "sm" | "lg" | null | undefined;
@@ -1,26 +1,26 @@
1
- "use client";
1
+ 'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
4
- import { cva } from "class-variance-authority";
5
- import { cn } from "#lib/utils";
3
+ import { Toggle as TogglePrimitive } from '@base-ui/react/toggle';
4
+ import { cva } from 'class-variance-authority';
5
+ import { cn } from '#lib/utils';
6
6
  const toggleVariants = cva("group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
7
7
  variants: {
8
8
  variant: {
9
- default: "bg-transparent",
10
- outline: "border border-input bg-transparent hover:bg-muted",
9
+ default: 'bg-transparent',
10
+ outline: 'border border-input bg-transparent hover:bg-muted',
11
11
  },
12
12
  size: {
13
- default: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
13
+ default: 'h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',
14
14
  sm: "h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
15
- lg: "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
15
+ lg: 'h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',
16
16
  },
17
17
  },
18
18
  defaultVariants: {
19
- variant: "default",
20
- size: "default",
19
+ variant: 'default',
20
+ size: 'default',
21
21
  },
22
22
  });
23
- function Toggle({ className, variant = "default", size = "default", ...props }) {
23
+ function Toggle({ className, variant = 'default', size = 'default', ...props }) {
24
24
  return (_jsx(TogglePrimitive, { "data-slot": "toggle", className: cn(toggleVariants({ variant, size, className })), ...props }));
25
25
  }
26
26
  export { Toggle, toggleVariants };
@@ -1,8 +1,8 @@
1
- import * as React from "react";
2
- import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
1
+ import * as React from 'react';
2
+ import { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';
3
3
  declare const TOOLTIP_DELAY = 200;
4
4
  declare function TooltipProvider({ delay, ...props }: TooltipPrimitive.Provider.Props): React.JSX.Element;
5
5
  declare function Tooltip({ ...props }: TooltipPrimitive.Root.Props): React.JSX.Element;
6
6
  declare function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props): React.JSX.Element;
7
- declare function TooltipContent({ className, side, sideOffset, align, alignOffset, children, ...props }: TooltipPrimitive.Popup.Props & Pick<TooltipPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">): React.JSX.Element;
7
+ declare function TooltipContent({ className, side, sideOffset, align, alignOffset, children, ...props }: TooltipPrimitive.Popup.Props & Pick<TooltipPrimitive.Positioner.Props, 'align' | 'alignOffset' | 'side' | 'sideOffset'>): React.JSX.Element;
8
8
  export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TOOLTIP_DELAY };
@@ -1,7 +1,7 @@
1
- "use client";
1
+ 'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
4
- import { cn } from "#lib/utils";
3
+ import { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';
4
+ import { cn } from '#lib/utils';
5
5
  const TOOLTIP_DELAY = 200;
6
6
  function TooltipProvider({ delay = TOOLTIP_DELAY, ...props }) {
7
7
  return _jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delay: delay, ...props });
@@ -12,7 +12,7 @@ function Tooltip({ ...props }) {
12
12
  function TooltipTrigger({ ...props }) {
13
13
  return _jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
14
14
  }
15
- function TooltipContent({ className, side = "top", sideOffset = 4, align, alignOffset, children, ...props }) {
16
- return (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Positioner, { className: "isolate z-[160] outline-none", align: align, alignOffset: alignOffset, side: side, sideOffset: sideOffset, children: _jsx(TooltipPrimitive.Popup, { "data-slot": "tooltip-content", className: cn("max-w-72 rounded-md bg-popover px-2.5 py-1.5 text-sm leading-5 text-popover-foreground shadow-md ring-1 ring-foreground/10", className), ...props, children: children }) }) }));
15
+ function TooltipContent({ className, side = 'top', sideOffset = 4, align, alignOffset, children, ...props }) {
16
+ return (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Positioner, { className: "isolate z-[160] outline-none", align: align, alignOffset: alignOffset, side: side, sideOffset: sideOffset, children: _jsx(TooltipPrimitive.Popup, { "data-slot": "tooltip-content", className: cn('max-w-72 rounded-md bg-popover px-2.5 py-1.5 text-sm leading-5 text-popover-foreground shadow-md ring-1 ring-foreground/10', className), ...props, children: children }) }) }));
17
17
  }
18
18
  export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TOOLTIP_DELAY };
@@ -5,7 +5,7 @@ export type SharedDesktopUpdate = Readonly<{
5
5
  downloaded_bytes: number;
6
6
  error: string | null;
7
7
  github_url: string;
8
- phase: "idle" | "checking" | "current" | "available" | "downloading" | "installing" | "installed" | "failed";
8
+ phase: 'idle' | 'checking' | 'current' | 'available' | 'downloading' | 'installing' | 'installed' | 'failed';
9
9
  release_date: string | null;
10
10
  release_notes: string | null;
11
11
  restart_required: boolean;
@@ -1,38 +1,38 @@
1
- "use client";
1
+ 'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useCallback, useEffect, useMemo, useState } from "react";
4
- import { Check, Download, ExternalLink, FileText, LoaderCircle, RefreshCw, Sparkles, } from "lucide-react";
5
- import { formatReleaseDate, plainTextFromMarkdown } from "#lib/version-notes";
6
- import { Button } from "#components/ui/button";
7
- import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "#components/ui/dialog";
3
+ import { useCallback, useEffect, useMemo, useState } from 'react';
4
+ import { Check, Download, ExternalLink, FileText, LoaderCircle, RefreshCw, Sparkles, } from 'lucide-react';
5
+ import { formatReleaseDate, plainTextFromMarkdown } from '#lib/version-notes';
6
+ import { Button } from '#components/ui/button';
7
+ import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '#components/ui/dialog';
8
8
  function errorMessage(caught, fallback) {
9
9
  if (caught instanceof Error && caught.message)
10
10
  return caught.message;
11
- if (typeof caught === "string" && caught)
11
+ if (typeof caught === 'string' && caught)
12
12
  return caught;
13
13
  return fallback;
14
14
  }
15
15
  function phaseLabel(update, fallbackVersion) {
16
16
  if (!update)
17
17
  return `Adea v${fallbackVersion}`;
18
- if (update.phase === "checking")
19
- return "Checking for updates…";
20
- if (update.phase === "available" && update.available_version) {
18
+ if (update.phase === 'checking')
19
+ return 'Checking for updates…';
20
+ if (update.phase === 'available' && update.available_version) {
21
21
  return `Update v${update.available_version} available`;
22
22
  }
23
- if (update.phase === "downloading" || update.phase === "installing") {
24
- return "Installing update…";
23
+ if (update.phase === 'downloading' || update.phase === 'installing') {
24
+ return 'Installing update…';
25
25
  }
26
- if (update.phase === "failed")
26
+ if (update.phase === 'failed')
27
27
  return `Version ${update.current_version} · Retry`;
28
28
  return `Adea v${update.current_version || fallbackVersion}`;
29
29
  }
30
30
  function isUpdateBusy(update) {
31
- return (update?.phase === "checking" ||
32
- update?.phase === "downloading" ||
33
- update?.phase === "installing");
31
+ return (update?.phase === 'checking' ||
32
+ update?.phase === 'downloading' ||
33
+ update?.phase === 'installing');
34
34
  }
35
- export function VersionDialog({ adapter, fallbackVersion = "0.1.0", onOpenChange, open: controlledOpen, }) {
35
+ export function VersionDialog({ adapter, fallbackVersion = '0.1.0', onOpenChange, open: controlledOpen, }) {
36
36
  const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
37
37
  const open = controlledOpen ?? uncontrolledOpen;
38
38
  const setOpen = useCallback((nextOpen) => {
@@ -43,7 +43,7 @@ export function VersionDialog({ adapter, fallbackVersion = "0.1.0", onOpenChange
43
43
  const [desktopRuntime, setDesktopRuntime] = useState(false);
44
44
  const [update, setUpdate] = useState(null);
45
45
  const [busy, setBusy] = useState(false);
46
- const [error, setError] = useState("");
46
+ const [error, setError] = useState('');
47
47
  useEffect(() => setDesktopRuntime(adapter.isDesktopRuntime()), [adapter]);
48
48
  const loadCurrentStatus = useCallback(async () => {
49
49
  if (!desktopRuntime)
@@ -52,7 +52,7 @@ export function VersionDialog({ adapter, fallbackVersion = "0.1.0", onOpenChange
52
52
  setUpdate(await adapter.getStatus());
53
53
  }
54
54
  catch (caught) {
55
- setError(errorMessage(caught, "Version status is unavailable"));
55
+ setError(errorMessage(caught, 'Version status is unavailable'));
56
56
  }
57
57
  }, [adapter, desktopRuntime]);
58
58
  useEffect(() => {
@@ -61,16 +61,16 @@ export function VersionDialog({ adapter, fallbackVersion = "0.1.0", onOpenChange
61
61
  }, [desktopRuntime, loadCurrentStatus]);
62
62
  const checkForUpdates = useCallback(async () => {
63
63
  if (!desktopRuntime) {
64
- setError("Update checks are available from the desktop app.");
64
+ setError('Update checks are available from the desktop app.');
65
65
  return;
66
66
  }
67
67
  setBusy(true);
68
- setError("");
68
+ setError('');
69
69
  try {
70
70
  setUpdate(await adapter.check());
71
71
  }
72
72
  catch (caught) {
73
- setError(errorMessage(caught, "Could not check for updates"));
73
+ setError(errorMessage(caught, 'Could not check for updates'));
74
74
  await loadCurrentStatus();
75
75
  }
76
76
  finally {
@@ -81,7 +81,7 @@ export function VersionDialog({ adapter, fallbackVersion = "0.1.0", onOpenChange
81
81
  if (!open || !desktopRuntime)
82
82
  return;
83
83
  let active = true;
84
- setError("");
84
+ setError('');
85
85
  setBusy(true);
86
86
  void (async () => {
87
87
  try {
@@ -95,7 +95,7 @@ export function VersionDialog({ adapter, fallbackVersion = "0.1.0", onOpenChange
95
95
  }
96
96
  catch (caught) {
97
97
  if (active)
98
- setError(errorMessage(caught, "Could not check for updates"));
98
+ setError(errorMessage(caught, 'Could not check for updates'));
99
99
  }
100
100
  finally {
101
101
  if (active)
@@ -111,26 +111,26 @@ export function VersionDialog({ adapter, fallbackVersion = "0.1.0", onOpenChange
111
111
  if (!version)
112
112
  return;
113
113
  setBusy(true);
114
- setError("");
114
+ setError('');
115
115
  try {
116
116
  setUpdate(await adapter.install(version));
117
117
  }
118
118
  catch (caught) {
119
- setError(errorMessage(caught, "Update installation failed"));
119
+ setError(errorMessage(caught, 'Update installation failed'));
120
120
  await loadCurrentStatus();
121
121
  }
122
122
  finally {
123
123
  setBusy(false);
124
124
  }
125
125
  };
126
- const currentChangelog = useMemo(() => plainTextFromMarkdown(update?.changelog || "Changelog is loading…"), [update?.changelog]);
127
- const releaseNotes = update?.release_notes ? plainTextFromMarkdown(update.release_notes) : "";
126
+ const currentChangelog = useMemo(() => plainTextFromMarkdown(update?.changelog || 'Changelog is loading…'), [update?.changelog]);
127
+ const releaseNotes = update?.release_notes ? plainTextFromMarkdown(update.release_notes) : '';
128
128
  const busyFromSnapshot = isUpdateBusy(update);
129
- return (_jsxs(Dialog, { open: open, onOpenChange: setOpen, children: [controlledOpen === undefined ? (_jsxs(DialogTrigger, { render: _jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": "Open version and updates dialog", "aria-haspopup": "dialog", onClick: () => setOpen(true) }), children: [update?.phase === "available" ? (_jsx(Sparkles, { "aria-hidden": "true" })) : (_jsx(FileText, { "aria-hidden": "true" })), phaseLabel(update, fallbackVersion)] })) : null, _jsxs(DialogContent, { className: "max-w-3xl", children: [_jsx(DialogHeader, { children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "flex size-10 items-center justify-center rounded-xl bg-primary text-primary-foreground", children: _jsx(Sparkles, { className: "size-5", "aria-hidden": "true" }) }), _jsxs("div", { children: [_jsx(DialogTitle, { children: "Version & updates" }), _jsx(DialogDescription, { children: "Keep Adea current and review what changed in each release." })] })] }) }), _jsxs("div", { className: "min-h-0 space-y-5 overflow-y-auto p-6", children: [_jsx("section", { className: "rounded-xl border bg-background/45 p-4", "aria-label": "Version status", children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: "Installed version" }), _jsxs("p", { className: "text-xl font-semibold tracking-tight", children: ["v", update?.current_version || fallbackVersion] }), _jsx("p", { className: "text-sm text-muted-foreground", children: update?.phase === "current"
130
- ? "You are running the latest desktop release."
131
- : update?.phase === "available" && update.available_version
129
+ return (_jsxs(Dialog, { open: open, onOpenChange: setOpen, children: [controlledOpen === undefined ? (_jsxs(DialogTrigger, { render: _jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": "Open version and updates dialog", "aria-haspopup": "dialog", onClick: () => setOpen(true) }), children: [update?.phase === 'available' ? (_jsx(Sparkles, { "aria-hidden": "true" })) : (_jsx(FileText, { "aria-hidden": "true" })), phaseLabel(update, fallbackVersion)] })) : null, _jsxs(DialogContent, { className: "max-w-3xl", children: [_jsx(DialogHeader, { children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "flex size-10 items-center justify-center rounded-xl bg-primary text-primary-foreground", children: _jsx(Sparkles, { className: "size-5", "aria-hidden": "true" }) }), _jsxs("div", { children: [_jsx(DialogTitle, { children: "Version & updates" }), _jsx(DialogDescription, { children: "Keep Adea current and review what changed in each release." })] })] }) }), _jsxs("div", { className: "min-h-0 space-y-5 overflow-y-auto p-6", children: [_jsx("section", { className: "rounded-xl border bg-background/45 p-4", "aria-label": "Version status", children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: "Installed version" }), _jsxs("p", { className: "text-xl font-semibold tracking-tight", children: ["v", update?.current_version || fallbackVersion] }), _jsx("p", { className: "text-sm text-muted-foreground", children: update?.phase === 'current'
130
+ ? 'You are running the latest desktop release.'
131
+ : update?.phase === 'available' && update.available_version
132
132
  ? `A newer desktop release, v${update.available_version}, is ready.`
133
133
  : desktopRuntime
134
- ? "Check the release channel for the latest signed build."
135
- : "Open this dialog inside the desktop app to check for updates." })] }), _jsxs(Button, { type: "button", variant: "outline", size: "sm", disabled: !desktopRuntime || busy || busyFromSnapshot, onClick: () => void checkForUpdates(), children: [busy || busyFromSnapshot ? (_jsx(LoaderCircle, { className: "animate-spin", "aria-hidden": "true" })) : (_jsx(RefreshCw, { "aria-hidden": "true" })), "Check latest version"] })] }) }), update?.phase === "available" && update.available_version ? (_jsx("section", { className: "rounded-xl border border-primary/35 bg-primary/8 p-4", "aria-label": "Available update", children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("p", { className: "flex items-center gap-2 text-sm font-semibold", children: [_jsx(Sparkles, { className: "size-4 text-primary", "aria-hidden": "true" }), "Version ", update.available_version, " is ready"] }), _jsx("p", { className: "text-sm text-muted-foreground", children: "The signed installer will be verified before Adea restarts." }), formatReleaseDate(update.release_date) ? (_jsxs("p", { className: "text-xs text-muted-foreground", children: ["Released ", formatReleaseDate(update.release_date)] })) : null] }), _jsxs(Button, { type: "button", size: "sm", disabled: busy || busyFromSnapshot, onClick: () => void install(), children: [busy || busyFromSnapshot ? (_jsx(LoaderCircle, { className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Download, { "aria-hidden": "true" })), "Install and restart"] })] }) })) : null, update?.phase === "current" ? (_jsxs("p", { className: "flex items-center gap-2 text-sm text-emerald-700 dark:text-emerald-300", role: "status", children: [_jsx(Check, { className: "size-4", "aria-hidden": "true" }), "Adea is up to date."] })) : null, error ? (_jsx("p", { className: "rounded-lg border border-destructive/35 bg-destructive/8 px-3 py-2 text-sm text-destructive", role: "alert", children: error })) : null, releaseNotes ? (_jsxs("section", { className: "space-y-2", "aria-labelledby": "adea-release-notes", children: [_jsxs("div", { children: [_jsx("h2", { id: "adea-release-notes", className: "text-sm font-semibold", children: "What changed in this release" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Release notes are shown as readable text." })] }), _jsx("div", { className: "max-h-52 overflow-y-auto whitespace-pre-wrap rounded-xl border bg-background/45 p-4 font-mono text-xs leading-5 text-muted-foreground", children: releaseNotes })] })) : null, _jsxs("section", { className: "space-y-2", "aria-labelledby": "agent-hq-changelog", children: [_jsxs("div", { children: [_jsx("h2", { id: "agent-hq-changelog", className: "text-sm font-semibold", children: "Installed changelog" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "A plain-text history of the installed channel." })] }), _jsx("div", { className: "max-h-72 overflow-y-auto whitespace-pre-wrap rounded-xl border bg-background/45 p-4 font-mono text-xs leading-5 text-muted-foreground", children: currentChangelog })] })] }), _jsxs(DialogFooter, { children: [update?.github_url ? (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => window.open(update.github_url, "_blank", "noopener,noreferrer"), children: [_jsx(ExternalLink, { "aria-hidden": "true" }), "View releases"] })) : null, _jsx(DialogClose, { render: _jsx(Button, { type: "button", variant: "outline", size: "sm" }), children: "Close" })] })] })] }));
134
+ ? 'Check the release channel for the latest signed build.'
135
+ : 'Open this dialog inside the desktop app to check for updates.' })] }), _jsxs(Button, { type: "button", variant: "outline", size: "sm", disabled: !desktopRuntime || busy || busyFromSnapshot, onClick: () => void checkForUpdates(), children: [busy || busyFromSnapshot ? (_jsx(LoaderCircle, { className: "animate-spin", "aria-hidden": "true" })) : (_jsx(RefreshCw, { "aria-hidden": "true" })), "Check latest version"] })] }) }), update?.phase === 'available' && update.available_version ? (_jsx("section", { className: "rounded-xl border border-primary/35 bg-primary/8 p-4", "aria-label": "Available update", children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("p", { className: "flex items-center gap-2 text-sm font-semibold", children: [_jsx(Sparkles, { className: "size-4 text-primary", "aria-hidden": "true" }), "Version ", update.available_version, " is ready"] }), _jsx("p", { className: "text-sm text-muted-foreground", children: "The signed installer will be verified before Adea restarts." }), formatReleaseDate(update.release_date) ? (_jsxs("p", { className: "text-xs text-muted-foreground", children: ["Released ", formatReleaseDate(update.release_date)] })) : null] }), _jsxs(Button, { type: "button", size: "sm", disabled: busy || busyFromSnapshot, onClick: () => void install(), children: [busy || busyFromSnapshot ? (_jsx(LoaderCircle, { className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Download, { "aria-hidden": "true" })), "Install and restart"] })] }) })) : null, update?.phase === 'current' ? (_jsxs("p", { className: "flex items-center gap-2 text-sm text-emerald-700 dark:text-emerald-300", role: "status", children: [_jsx(Check, { className: "size-4", "aria-hidden": "true" }), "Adea is up to date."] })) : null, error ? (_jsx("p", { className: "rounded-lg border border-destructive/35 bg-destructive/8 px-3 py-2 text-sm text-destructive", role: "alert", children: error })) : null, releaseNotes ? (_jsxs("section", { className: "space-y-2", "aria-labelledby": "adea-release-notes", children: [_jsxs("div", { children: [_jsx("h2", { id: "adea-release-notes", className: "text-sm font-semibold", children: "What changed in this release" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Release notes are shown as readable text." })] }), _jsx("div", { className: "max-h-52 overflow-y-auto whitespace-pre-wrap rounded-xl border bg-background/45 p-4 font-mono text-xs leading-5 text-muted-foreground", children: releaseNotes })] })) : null, _jsxs("section", { className: "space-y-2", "aria-labelledby": "agent-hq-changelog", children: [_jsxs("div", { children: [_jsx("h2", { id: "agent-hq-changelog", className: "text-sm font-semibold", children: "Installed changelog" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "A plain-text history of the installed channel." })] }), _jsx("div", { className: "max-h-72 overflow-y-auto whitespace-pre-wrap rounded-xl border bg-background/45 p-4 font-mono text-xs leading-5 text-muted-foreground", children: currentChangelog })] })] }), _jsxs(DialogFooter, { children: [update?.github_url ? (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => window.open(update.github_url, '_blank', 'noopener,noreferrer'), children: [_jsx(ExternalLink, { "aria-hidden": "true" }), "View releases"] })) : null, _jsx(DialogClose, { render: _jsx(Button, { type: "button", variant: "outline", size: "sm" }), children: "Close" })] })] })] }));
136
136
  }
@@ -1,4 +1,4 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- export function WorkspaceBrand({ title, eyebrow = "AGENT OPERATIONS" }) {
2
+ export function WorkspaceBrand({ title, eyebrow = 'AGENT OPERATIONS' }) {
3
3
  return (_jsxs("div", { className: "workspace-brand", children: [_jsx("div", { className: "workspace-brand__mark", "aria-hidden": "true", children: _jsx("span", { children: "HQ" }) }), _jsxs("div", { children: [_jsx("p", { className: "workspace-eyebrow", children: eyebrow }), _jsx("h1", { children: title })] })] }));
4
4
  }
@@ -1,3 +1,3 @@
1
- import type { SVGProps } from "react";
1
+ import type { SVGProps } from 'react';
2
2
  /** The canonical Adea mark used by web, desktop, and dialogs. */
3
3
  export declare function WorkspaceLogo(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
package/dist/index.d.ts CHANGED
@@ -1,19 +1,19 @@
1
- export { Button, buttonVariants } from "./components/ui/button";
2
- export { Switch } from "./components/ui/switch";
3
- export { Toggle } from "./components/ui/toggle";
4
- export { ToggleGroup, ToggleGroupItem } from "./components/ui/toggle-group";
5
- export { RadioGroup, RadioGroupItem } from "./components/ui/radio-group";
6
- export { ThemeToggle } from "./components/theme-toggle";
7
- export { ThemeProvider } from "./components/theme-provider";
8
- export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerSwipeHandle, DrawerTitle, DrawerTrigger, } from "./components/ui/drawer";
9
- export { AccountDrawer, type AccountDrawerProps } from "./components/account-drawer";
10
- export { WorkspaceBrand, type WorkspaceBrandProps } from "./components/workspace-brand";
11
- export { WorkspaceLogo } from "./components/workspace-logo";
12
- export { OnScreenControls } from "./components/on-screen-controls";
13
- export { SceneSettings, type SceneSettingsProps } from "./components/scene-settings";
14
- export { VersionDialog, type SharedDesktopUpdate, type VersionDialogAdapter, } from "./components/version-dialog";
15
- export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./components/ui/tooltip";
16
- export { Card, CardContent } from "./components/ui/card";
17
- export { Spinner } from "./components/ui/spinner";
18
- export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, } from "./components/ui/dialog";
19
- export { cn } from "./lib/utils";
1
+ export { Button, buttonVariants } from './components/ui/button';
2
+ export { Switch } from './components/ui/switch';
3
+ export { Toggle } from './components/ui/toggle';
4
+ export { ToggleGroup, ToggleGroupItem } from './components/ui/toggle-group';
5
+ export { RadioGroup, RadioGroupItem } from './components/ui/radio-group';
6
+ export { ThemeToggle } from './components/theme-toggle';
7
+ export { ThemeProvider } from './components/theme-provider';
8
+ export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerSwipeHandle, DrawerTitle, DrawerTrigger, } from './components/ui/drawer';
9
+ export { AccountDrawer, type AccountDrawerProps } from './components/account-drawer';
10
+ export { WorkspaceBrand, type WorkspaceBrandProps } from './components/workspace-brand';
11
+ export { WorkspaceLogo } from './components/workspace-logo';
12
+ export { OnScreenControls } from './components/on-screen-controls';
13
+ export { SceneSettings, type SceneSettingsProps } from './components/scene-settings';
14
+ export { VersionDialog, type SharedDesktopUpdate, type VersionDialogAdapter, } from './components/version-dialog';
15
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './components/ui/tooltip';
16
+ export { Card, CardContent } from './components/ui/card';
17
+ export { Spinner } from './components/ui/spinner';
18
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, } from './components/ui/dialog';
19
+ export { cn } from './lib/utils';
package/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
- export { Button, buttonVariants } from "./components/ui/button";
2
- export { Switch } from "./components/ui/switch";
3
- export { Toggle } from "./components/ui/toggle";
4
- export { ToggleGroup, ToggleGroupItem } from "./components/ui/toggle-group";
5
- export { RadioGroup, RadioGroupItem } from "./components/ui/radio-group";
6
- export { ThemeToggle } from "./components/theme-toggle";
7
- export { ThemeProvider } from "./components/theme-provider";
8
- export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerSwipeHandle, DrawerTitle, DrawerTrigger, } from "./components/ui/drawer";
9
- export { AccountDrawer } from "./components/account-drawer";
10
- export { WorkspaceBrand } from "./components/workspace-brand";
11
- export { WorkspaceLogo } from "./components/workspace-logo";
12
- export { OnScreenControls } from "./components/on-screen-controls";
13
- export { SceneSettings } from "./components/scene-settings";
14
- export { VersionDialog, } from "./components/version-dialog";
15
- export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./components/ui/tooltip";
16
- export { Card, CardContent } from "./components/ui/card";
17
- export { Spinner } from "./components/ui/spinner";
18
- export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, } from "./components/ui/dialog";
19
- export { cn } from "./lib/utils";
1
+ export { Button, buttonVariants } from './components/ui/button';
2
+ export { Switch } from './components/ui/switch';
3
+ export { Toggle } from './components/ui/toggle';
4
+ export { ToggleGroup, ToggleGroupItem } from './components/ui/toggle-group';
5
+ export { RadioGroup, RadioGroupItem } from './components/ui/radio-group';
6
+ export { ThemeToggle } from './components/theme-toggle';
7
+ export { ThemeProvider } from './components/theme-provider';
8
+ export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerSwipeHandle, DrawerTitle, DrawerTrigger, } from './components/ui/drawer';
9
+ export { AccountDrawer } from './components/account-drawer';
10
+ export { WorkspaceBrand } from './components/workspace-brand';
11
+ export { WorkspaceLogo } from './components/workspace-logo';
12
+ export { OnScreenControls } from './components/on-screen-controls';
13
+ export { SceneSettings } from './components/scene-settings';
14
+ export { VersionDialog, } from './components/version-dialog';
15
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './components/ui/tooltip';
16
+ export { Card, CardContent } from './components/ui/card';
17
+ export { Spinner } from './components/ui/spinner';
18
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, } from './components/ui/dialog';
19
+ export { cn } from './lib/utils';
@@ -1,2 +1,2 @@
1
- import { type ClassValue } from "clsx";
1
+ import { type ClassValue } from 'clsx';
2
2
  export declare function cn(...inputs: ClassValue[]): string;
package/dist/lib/utils.js CHANGED
@@ -1,5 +1,5 @@
1
- import { clsx } from "clsx";
2
- import { twMerge } from "tailwind-merge";
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
3
  export function cn(...inputs) {
4
4
  return twMerge(clsx(inputs));
5
5
  }
@@ -1,20 +1,20 @@
1
1
  export function plainTextFromMarkdown(markdown) {
2
2
  return markdown
3
- .replace(/\r\n/g, "\n")
4
- .replace(/!\[([^\]]*)\]\([^)]*\)/g, "$1")
5
- .replace(/\[([^\]]+)\]\([^)]*\)/g, "$1")
6
- .replace(/^[ \t]*#{1,6}[ \t]*/gm, "")
7
- .replace(/^[ \t]*>[ \t]?/gm, "")
8
- .replace(/^[ \t]*---+[ \t]*$/gm, "")
9
- .replace(/^[ \t]*[-*+][ \t]+/gm, "• ")
10
- .replace(/^[ \t]*\d+\.[ \t]+/gm, "")
11
- .replace(/```[^\n]*\n?/g, "")
12
- .replace(/`([^`]+)`/g, "$1")
13
- .replace(/\*\*([^*]+)\*\*/g, "$1")
14
- .replace(/__([^_]+)__/g, "$1")
15
- .replace(/\*([^*]+)\*/g, "$1")
16
- .replace(/_([^_]+)_/g, "$1")
17
- .replace(/\n{3,}/g, "\n\n")
3
+ .replace(/\r\n/g, '\n')
4
+ .replace(/!\[([^\]]*)\]\([^)]*\)/g, '$1')
5
+ .replace(/\[([^\]]+)\]\([^)]*\)/g, '$1')
6
+ .replace(/^[ \t]*#{1,6}[ \t]*/gm, '')
7
+ .replace(/^[ \t]*>[ \t]?/gm, '')
8
+ .replace(/^[ \t]*---+[ \t]*$/gm, '')
9
+ .replace(/^[ \t]*[-*+][ \t]+/gm, '• ')
10
+ .replace(/^[ \t]*\d+\.[ \t]+/gm, '')
11
+ .replace(/```[^\n]*\n?/g, '')
12
+ .replace(/`([^`]+)`/g, '$1')
13
+ .replace(/\*\*([^*]+)\*\*/g, '$1')
14
+ .replace(/__([^_]+)__/g, '$1')
15
+ .replace(/\*([^*]+)\*/g, '$1')
16
+ .replace(/_([^_]+)_/g, '$1')
17
+ .replace(/\n{3,}/g, '\n\n')
18
18
  .trim();
19
19
  }
20
20
  export function formatReleaseDate(value) {
@@ -24,8 +24,8 @@ export function formatReleaseDate(value) {
24
24
  if (Number.isNaN(date.getTime()))
25
25
  return value;
26
26
  return new Intl.DateTimeFormat(undefined, {
27
- day: "numeric",
28
- month: "short",
29
- year: "numeric",
27
+ day: 'numeric',
28
+ month: 'short',
29
+ year: 'numeric',
30
30
  }).format(date);
31
31
  }
package/package.json CHANGED
@@ -1,9 +1,6 @@
1
1
  {
2
2
  "name": "@adea-ai/ui",
3
- "version": "0.12.0",
4
- "type": "module",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
3
+ "version": "0.12.1",
7
4
  "files": [
8
5
  "dist",
9
6
  "src",
@@ -11,6 +8,13 @@
11
8
  "tsconfig.json",
12
9
  "README.md"
13
10
  ],
11
+ "type": "module",
12
+ "main": "dist/index.js",
13
+ "types": "dist/index.d.ts",
14
+ "imports": {
15
+ "#components/*": "./src/components/*.tsx",
16
+ "#lib/*": "./src/lib/*.ts"
17
+ },
14
18
  "exports": {
15
19
  ".": {
16
20
  "types": "./dist/index.d.ts",
@@ -33,12 +37,8 @@
33
37
  "./theme.css": "./src/styles/theme.css",
34
38
  "./workspace-shell.css": "./src/styles/workspace-shell.css"
35
39
  },
36
- "imports": {
37
- "#components/*": "./src/components/*.tsx",
38
- "#lib/*": "./src/lib/*.ts"
39
- },
40
40
  "scripts": {
41
- "lint": "eslint .",
41
+ "lint": "oxlint",
42
42
  "build": "tsc -p tsconfig.json",
43
43
  "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput",
44
44
  "typecheck": "tsc -p tsconfig.json --noEmit"
@@ -1,9 +1,9 @@
1
- "use client";
1
+ 'use client'
2
2
 
3
- import { createPortal } from "react-dom";
4
- import { useEffect, useState, type ReactNode } from "react";
5
- import { UserRound } from "lucide-react";
6
- import { Button } from "#components/ui/button";
3
+ import { createPortal } from 'react-dom'
4
+ import { useEffect, useState, type ReactNode } from 'react'
5
+ import { UserRound } from 'lucide-react'
6
+ import { Button } from '#components/ui/button'
7
7
  import {
8
8
  Drawer,
9
9
  DrawerClose,
@@ -12,21 +12,21 @@ import {
12
12
  DrawerHeader,
13
13
  DrawerTitle,
14
14
  DrawerTrigger,
15
- } from "#components/ui/drawer";
16
- import { ThemeToggle } from "./theme-toggle";
15
+ } from '#components/ui/drawer'
16
+ import { ThemeToggle } from './theme-toggle'
17
17
 
18
18
  export type AccountDrawerProps = {
19
- accountLabel?: string;
20
- authenticated?: boolean;
21
- busy?: boolean;
22
- musicControl?: ReactNode;
23
- triggerTargetId?: string;
24
- onSignIn?: () => void;
25
- onSignOut?: () => void;
26
- };
19
+ accountLabel?: string
20
+ authenticated?: boolean
21
+ busy?: boolean
22
+ musicControl?: ReactNode
23
+ triggerTargetId?: string
24
+ onSignIn?: () => void
25
+ onSignOut?: () => void
26
+ }
27
27
 
28
28
  export function AccountDrawer({
29
- accountLabel = "Sign in",
29
+ accountLabel = 'Sign in',
30
30
  authenticated = false,
31
31
  busy = false,
32
32
  musicControl,
@@ -34,11 +34,11 @@ export function AccountDrawer({
34
34
  onSignIn,
35
35
  onSignOut,
36
36
  }: AccountDrawerProps) {
37
- const [triggerTarget, setTriggerTarget] = useState<HTMLElement | null>(null);
37
+ const [triggerTarget, setTriggerTarget] = useState<HTMLElement | null>(null)
38
38
 
39
39
  useEffect(() => {
40
- setTriggerTarget(triggerTargetId ? document.getElementById(triggerTargetId) : null);
41
- }, [triggerTargetId]);
40
+ setTriggerTarget(triggerTargetId ? document.getElementById(triggerTargetId) : null)
41
+ }, [triggerTargetId])
42
42
 
43
43
  const trigger = (
44
44
  <DrawerTrigger
@@ -55,7 +55,7 @@ export function AccountDrawer({
55
55
  <UserRound aria-hidden="true" />
56
56
  <span>{accountLabel}</span>
57
57
  </DrawerTrigger>
58
- );
58
+ )
59
59
 
60
60
  return (
61
61
  <Drawer swipeDirection="right">
@@ -75,8 +75,8 @@ export function AccountDrawer({
75
75
  <DrawerTitle className="truncate">{accountLabel}</DrawerTitle>
76
76
  <DrawerDescription>
77
77
  {authenticated
78
- ? "Signed in · workspace saved"
79
- : "Guest workspace · sign in anytime"}
78
+ ? 'Signed in · workspace saved'
79
+ : 'Guest workspace · sign in anytime'}
80
80
  </DrawerDescription>
81
81
  </div>
82
82
  </div>
@@ -108,8 +108,8 @@ export function AccountDrawer({
108
108
  </h2>
109
109
  <p className="text-sm text-muted-foreground">
110
110
  {authenticated
111
- ? "Sign out on this device without removing your saved workspace."
112
- : "Sign in or create an account to keep this workspace across devices."}
111
+ ? 'Sign out on this device without removing your saved workspace.'
112
+ : 'Sign in or create an account to keep this workspace across devices.'}
113
113
  </p>
114
114
  </div>
115
115
  <DrawerClose
@@ -117,17 +117,17 @@ export function AccountDrawer({
117
117
  <Button
118
118
  type="button"
119
119
  className="shrink-0"
120
- variant={authenticated ? "outline" : "default"}
120
+ variant={authenticated ? 'outline' : 'default'}
121
121
  disabled={busy}
122
122
  onClick={authenticated ? onSignOut : onSignIn}
123
123
  />
124
124
  }
125
125
  >
126
- {authenticated ? "Sign out" : "Sign in"}
126
+ {authenticated ? 'Sign out' : 'Sign in'}
127
127
  </DrawerClose>
128
128
  </section>
129
129
  </div>
130
130
  </DrawerContent>
131
131
  </Drawer>
132
- );
132
+ )
133
133
  }