@gram-ai/elements 1.27.4 → 1.27.6
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/README.md +72 -60
- package/README.typedoc.md +6 -6
- package/bin/cli.js +74 -74
- package/dist/compat-shims-CO9JXXV4.cjs.map +1 -1
- package/dist/{compat-shims-BPJ7Q68c.js → compat-shims-DxtUrORi.js} +4 -2
- package/dist/compat-shims-DxtUrORi.js.map +1 -0
- package/dist/components/ShareButton/index.d.ts +2 -2
- package/dist/components/assistant-ui/message-feedback.d.ts +1 -1
- package/dist/components/assistant-ui/tooltip-icon-button.d.ts +2 -2
- package/dist/components/ui/avatar.d.ts +2 -2
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/calendar.d.ts +1 -1
- package/dist/components/ui/collapsible.d.ts +1 -1
- package/dist/components/ui/dialog.d.ts +4 -4
- package/dist/components/ui/popover.d.ts +2 -2
- package/dist/components/ui/skeleton.d.ts +1 -1
- package/dist/components/ui/time-range-picker.d.ts +1 -1
- package/dist/components/ui/tool-ui.d.ts +7 -7
- package/dist/components/ui/tooltip.d.ts +2 -2
- package/dist/contexts/ConnectionStatusContext.d.ts +1 -1
- package/dist/elements.cjs +1 -1
- package/dist/elements.css +1 -1
- package/dist/elements.js +2 -2
- package/dist/hooks/useDensity.d.ts +73 -73
- package/dist/hooks/useMCPTools.d.ts +1 -1
- package/dist/hooks/useRadius.d.ts +1 -1
- package/dist/{index-KSX4Qjip.cjs → index-A17b62wR.cjs} +10 -10
- package/dist/index-A17b62wR.cjs.map +1 -0
- package/dist/{index-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
- package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
- package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
- package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
- package/dist/{index-D0bAYNQy.js → index-Dm2wLFTN.js} +304 -282
- package/dist/index-Dm2wLFTN.js.map +1 -0
- package/dist/lib/cassette.d.ts +4 -4
- package/dist/lib/errorTracking.d.ts +1 -1
- package/dist/lib/messageConverter.d.ts +1 -1
- package/dist/lib/models.d.ts +1 -1
- package/dist/plugins/chart/ui/bar-chart.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/accordion-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/accordion.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/action-button.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/alert-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/alert.d.ts +4 -4
- package/dist/plugins/generative-ui/ui/avatar.d.ts +5 -5
- package/dist/plugins/generative-ui/ui/badge.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/button-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/button.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/card-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/card.d.ts +8 -8
- package/dist/plugins/generative-ui/ui/checkbox.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/data-table.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/dialog.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/dropdown-menu.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/grid.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/input-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/input.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/label.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/metric.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/pagination.d.ts +6 -6
- package/dist/plugins/generative-ui/ui/popover.d.ts +4 -4
- package/dist/plugins/generative-ui/ui/progress.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/radio-group.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/select.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/separator.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/skeleton.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/stack.d.ts +6 -6
- package/dist/plugins/generative-ui/ui/switch.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/table.d.ts +9 -9
- package/dist/plugins/generative-ui/ui/tabs-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/tabs.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/text.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/textarea.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/tooltip.d.ts +1 -1
- package/dist/plugins.cjs +1 -1
- package/dist/plugins.js +1 -1
- package/dist/{profiler-CyzxBxVz.cjs → profiler-Cbbf4eEX.cjs} +2 -2
- package/dist/{profiler-CyzxBxVz.cjs.map → profiler-Cbbf4eEX.cjs.map} +1 -1
- package/dist/{profiler-BFkhZRxj.js → profiler-mca4IXaY.js} +2 -2
- package/dist/{profiler-BFkhZRxj.js.map → profiler-mca4IXaY.js.map} +1 -1
- package/dist/react-shim.js +1 -1
- package/dist/server/express.cjs.map +1 -1
- package/dist/server/express.js.map +1 -1
- package/dist/{startRecording-C-PPAs_Z.js → startRecording-BCafdS7B.js} +2 -2
- package/dist/{startRecording-C-PPAs_Z.js.map → startRecording-BCafdS7B.js.map} +1 -1
- package/dist/{startRecording-Dq92sEHf.cjs → startRecording-Eb5f7wqP.cjs} +2 -2
- package/dist/{startRecording-Dq92sEHf.cjs.map → startRecording-Eb5f7wqP.cjs.map} +1 -1
- package/dist/types/index.d.ts +4 -4
- package/package.json +1 -5
- package/src/compat-plugin.ts +14 -14
- package/src/compat-shims.ts +33 -31
- package/src/compat.test.ts +48 -48
- package/src/compat.ts +6 -6
- package/src/components/Chat/index.tsx +17 -17
- package/src/components/Chat/stories/Charts.stories.tsx +98 -98
- package/src/components/Chat/stories/Composer.stories.tsx +15 -15
- package/src/components/Chat/stories/ConnectionConfiguration.stories.tsx +44 -44
- package/src/components/Chat/stories/CustomComponents.stories.tsx +17 -17
- package/src/components/Chat/stories/Density.stories.tsx +20 -20
- package/src/components/Chat/stories/ErrorBoundary.stories.tsx +47 -47
- package/src/components/Chat/stories/FrontendTools.stories.tsx +39 -39
- package/src/components/Chat/stories/GenerativeUI.stories.tsx +48 -48
- package/src/components/Chat/stories/MessageFeedback.stories.tsx +52 -52
- package/src/components/Chat/stories/Modal.stories.tsx +28 -28
- package/src/components/Chat/stories/Model.stories.tsx +11 -11
- package/src/components/Chat/stories/Radius.stories.tsx +20 -20
- package/src/components/Chat/stories/Sidecar.stories.tsx +13 -13
- package/src/components/Chat/stories/StyleIsolation.stories.tsx +11 -11
- package/src/components/Chat/stories/Theme.stories.tsx +25 -25
- package/src/components/Chat/stories/Thread.stories.tsx +25 -25
- package/src/components/Chat/stories/ToolApproval.stories.tsx +55 -55
- package/src/components/Chat/stories/ToolMentions.stories.tsx +17 -17
- package/src/components/Chat/stories/Tools.stories.tsx +88 -88
- package/src/components/Chat/stories/Variants.stories.tsx +32 -32
- package/src/components/Chat/stories/Welcome.stories.tsx +14 -14
- package/src/components/ChatHistory.tsx +7 -7
- package/src/components/FrontendTools/index.tsx +5 -5
- package/src/components/Replay.stories.tsx +157 -157
- package/src/components/Replay.tsx +76 -73
- package/src/components/ShadowRoot.tsx +40 -40
- package/src/components/ShareButton/index.tsx +32 -32
- package/src/components/assistant-ui/assistant-modal.tsx +92 -87
- package/src/components/assistant-ui/assistant-sidecar.tsx +35 -35
- package/src/components/assistant-ui/attachment.tsx +80 -80
- package/src/components/assistant-ui/connection-status-indicator.tsx +33 -33
- package/src/components/assistant-ui/error-boundary.tsx +34 -34
- package/src/components/assistant-ui/follow-on-suggestions.tsx +26 -26
- package/src/components/assistant-ui/markdown-text.tsx +69 -69
- package/src/components/assistant-ui/mentioned-tools-badges.tsx +38 -38
- package/src/components/assistant-ui/message-feedback.tsx +57 -50
- package/src/components/assistant-ui/reasoning.tsx +83 -83
- package/src/components/assistant-ui/thread-list.tsx +45 -45
- package/src/components/assistant-ui/thread.tsx +278 -278
- package/src/components/assistant-ui/tool-fallback.tsx +37 -37
- package/src/components/assistant-ui/tool-group.tsx +26 -26
- package/src/components/assistant-ui/tool-mention-autocomplete.tsx +122 -122
- package/src/components/assistant-ui/tooltip-icon-button.tsx +18 -18
- package/src/components/ui/avatar.tsx +12 -12
- package/src/components/ui/button.tsx +12 -12
- package/src/components/ui/buttonVariants.ts +17 -17
- package/src/components/ui/calendar.tsx +106 -106
- package/src/components/ui/charts.stories.tsx +56 -56
- package/src/components/ui/collapsible.tsx +5 -5
- package/src/components/ui/dialog.tsx +30 -30
- package/src/components/ui/generative-ui.stories.tsx +200 -200
- package/src/components/ui/generative-ui.tsx +26 -26
- package/src/components/ui/popover.tsx +14 -14
- package/src/components/ui/skeleton.tsx +5 -5
- package/src/components/ui/time-range-picker.stories.tsx +80 -80
- package/src/components/ui/time-range-picker.tsx +248 -246
- package/src/components/ui/tool-ui.stories.tsx +37 -37
- package/src/components/ui/tool-ui.tsx +221 -215
- package/src/components/ui/tooltip.tsx +15 -15
- package/src/constants/tailwind.ts +1 -1
- package/src/contexts/ChatIdContext.tsx +7 -7
- package/src/contexts/ConnectionStatusContext.tsx +64 -64
- package/src/contexts/ElementsProvider.tsx +214 -213
- package/src/contexts/ReplayContext.ts +3 -3
- package/src/contexts/ToolApprovalContext.tsx +54 -54
- package/src/contexts/ToolExecutionContext.tsx +34 -34
- package/src/contexts/contexts.ts +7 -7
- package/src/contexts/portal-container-context.ts +2 -2
- package/src/contexts/portal-container.tsx +7 -7
- package/src/embedded.ts +1 -1
- package/src/global.css +25 -25
- package/src/hooks/useAuth.ts +72 -72
- package/src/hooks/useDensity.ts +79 -79
- package/src/hooks/useElements.ts +6 -6
- package/src/hooks/useExpanded.ts +12 -12
- package/src/hooks/useFollowOnSuggestions.ts +83 -83
- package/src/hooks/useGramThreadListAdapter.tsx +99 -99
- package/src/hooks/useMCPTools.ts +47 -47
- package/src/hooks/useModel.ts +14 -14
- package/src/hooks/usePluginComponents.ts +11 -11
- package/src/hooks/usePortalContainer.ts +5 -5
- package/src/hooks/useRadius.ts +23 -23
- package/src/hooks/useRecordCassette.ts +34 -34
- package/src/hooks/useSession.ts +11 -11
- package/src/hooks/useThemeProps.ts +13 -13
- package/src/hooks/useThreadId.ts +4 -4
- package/src/hooks/useToolApproval.ts +7 -7
- package/src/hooks/useToolMentions.ts +40 -40
- package/src/index.ts +26 -26
- package/src/lib/api.test.ts +61 -61
- package/src/lib/api.ts +4 -3
- package/src/lib/auth.ts +13 -13
- package/src/lib/cassette.ts +84 -84
- package/src/lib/easing.ts +1 -1
- package/src/lib/errorTracking.config.ts +5 -5
- package/src/lib/errorTracking.ts +29 -29
- package/src/lib/generative-ui.ts +7 -7
- package/src/lib/humanize.ts +3 -3
- package/src/lib/messageConverter.test.ts +130 -127
- package/src/lib/messageConverter.ts +196 -196
- package/src/lib/models.ts +28 -20
- package/src/lib/token.test.ts +56 -56
- package/src/lib/token.ts +14 -14
- package/src/lib/tool-mentions.ts +45 -45
- package/src/lib/tools.ts +66 -62
- package/src/lib/utils.ts +5 -5
- package/src/lib.d.ts +1 -1
- package/src/plugins/README.md +5 -5
- package/src/plugins/chart/catalog.ts +18 -18
- package/src/plugins/chart/chart.test.ts +31 -31
- package/src/plugins/chart/component.tsx +34 -34
- package/src/plugins/chart/index.ts +4 -4
- package/src/plugins/chart/ui/area-chart.tsx +42 -42
- package/src/plugins/chart/ui/bar-chart.tsx +46 -46
- package/src/plugins/chart/ui/donut-chart.tsx +48 -48
- package/src/plugins/chart/ui/index.ts +7 -7
- package/src/plugins/chart/ui/line-chart.tsx +43 -43
- package/src/plugins/chart/ui/pie-chart.tsx +44 -44
- package/src/plugins/chart/ui/radar-chart.tsx +33 -33
- package/src/plugins/chart/ui/scatter-chart.tsx +43 -43
- package/src/plugins/components/MacOSWindowFrame.tsx +15 -15
- package/src/plugins/components/PluginLoadingState.tsx +10 -10
- package/src/plugins/components/index.ts +1 -1
- package/src/plugins/generative-ui/catalog.ts +54 -54
- package/src/plugins/generative-ui/component.tsx +85 -85
- package/src/plugins/generative-ui/index.ts +4 -4
- package/src/plugins/generative-ui/ui/accordion-wrapper.tsx +16 -16
- package/src/plugins/generative-ui/ui/accordion.tsx +16 -16
- package/src/plugins/generative-ui/ui/action-button.tsx +28 -28
- package/src/plugins/generative-ui/ui/alert-wrapper.tsx +8 -8
- package/src/plugins/generative-ui/ui/alert.tsx +20 -20
- package/src/plugins/generative-ui/ui/avatar-wrapper.tsx +7 -7
- package/src/plugins/generative-ui/ui/avatar.tsx +30 -30
- package/src/plugins/generative-ui/ui/badge.tsx +22 -22
- package/src/plugins/generative-ui/ui/button-wrapper.tsx +12 -12
- package/src/plugins/generative-ui/ui/button.tsx +28 -28
- package/src/plugins/generative-ui/ui/card-wrapper.tsx +8 -8
- package/src/plugins/generative-ui/ui/card.tsx +27 -27
- package/src/plugins/generative-ui/ui/checkbox-wrapper.tsx +9 -9
- package/src/plugins/generative-ui/ui/checkbox.tsx +9 -9
- package/src/plugins/generative-ui/ui/data-table.tsx +8 -8
- package/src/plugins/generative-ui/ui/dialog.tsx +31 -31
- package/src/plugins/generative-ui/ui/dropdown-menu.tsx +44 -44
- package/src/plugins/generative-ui/ui/grid.tsx +12 -12
- package/src/plugins/generative-ui/ui/index.ts +40 -40
- package/src/plugins/generative-ui/ui/input-wrapper.tsx +11 -11
- package/src/plugins/generative-ui/ui/input.tsx +9 -9
- package/src/plugins/generative-ui/ui/label.tsx +8 -8
- package/src/plugins/generative-ui/ui/list.tsx +11 -11
- package/src/plugins/generative-ui/ui/metric.tsx +23 -23
- package/src/plugins/generative-ui/ui/pagination.tsx +28 -28
- package/src/plugins/generative-ui/ui/popover.tsx +21 -21
- package/src/plugins/generative-ui/ui/progress.tsx +13 -13
- package/src/plugins/generative-ui/ui/radio-group.tsx +12 -12
- package/src/plugins/generative-ui/ui/select-wrapper.tsx +7 -7
- package/src/plugins/generative-ui/ui/select.tsx +37 -37
- package/src/plugins/generative-ui/ui/separator.tsx +9 -9
- package/src/plugins/generative-ui/ui/skeleton-wrapper.tsx +10 -10
- package/src/plugins/generative-ui/ui/skeleton.tsx +5 -5
- package/src/plugins/generative-ui/ui/stack.tsx +28 -28
- package/src/plugins/generative-ui/ui/switch.tsx +11 -11
- package/src/plugins/generative-ui/ui/table.tsx +32 -32
- package/src/plugins/generative-ui/ui/tabs-wrapper.tsx +11 -11
- package/src/plugins/generative-ui/ui/tabs.tsx +26 -26
- package/src/plugins/generative-ui/ui/text.tsx +12 -12
- package/src/plugins/generative-ui/ui/textarea.tsx +7 -7
- package/src/plugins/generative-ui/ui/tooltip.tsx +12 -12
- package/src/plugins/index.ts +7 -7
- package/src/react-shim.ts +6 -6
- package/src/server/bun.ts +12 -12
- package/src/server/core.ts +25 -25
- package/src/server/express.ts +17 -15
- package/src/server/fastify.ts +14 -14
- package/src/server/hono.ts +9 -9
- package/src/server/nextjs.ts +12 -12
- package/src/server/tanstack-start.ts +12 -12
- package/src/server.ts +27 -27
- package/src/storybook.d.ts +4 -4
- package/src/types/index.ts +124 -124
- package/src/types/plugins.ts +7 -7
- package/src/vite-env.d.ts +12 -12
- package/dist/compat-shims-BPJ7Q68c.js.map +0 -1
- package/dist/index-D0bAYNQy.js.map +0 -1
- package/dist/index-KSX4Qjip.cjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { cn } from
|
|
4
|
-
import { FC, useMemo } from
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
import { FC, useMemo } from "react";
|
|
5
5
|
import {
|
|
6
6
|
LineChart as RechartsLineChart,
|
|
7
7
|
Line,
|
|
@@ -12,12 +12,12 @@ import {
|
|
|
12
12
|
Legend,
|
|
13
13
|
ResponsiveContainer,
|
|
14
14
|
TooltipProps,
|
|
15
|
-
} from
|
|
15
|
+
} from "recharts";
|
|
16
16
|
|
|
17
17
|
const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
|
|
18
|
-
if (!active || !payload || payload.length === 0) return null
|
|
18
|
+
if (!active || !payload || payload.length === 0) return null;
|
|
19
19
|
return (
|
|
20
|
-
<div className="
|
|
20
|
+
<div className="rounded-md border border-border bg-background px-2 py-1.5 text-xs text-foreground shadow-sm">
|
|
21
21
|
{payload.map((entry, index) => (
|
|
22
22
|
<div key={index} className="flex items-center gap-2">
|
|
23
23
|
<span
|
|
@@ -26,38 +26,38 @@ const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
|
|
|
26
26
|
/>
|
|
27
27
|
<span>{entry.name}:</span>
|
|
28
28
|
<span className="font-medium">
|
|
29
|
-
{typeof entry.value ===
|
|
29
|
+
{typeof entry.value === "number"
|
|
30
30
|
? entry.value.toLocaleString()
|
|
31
31
|
: entry.value}
|
|
32
32
|
</span>
|
|
33
33
|
</div>
|
|
34
34
|
))}
|
|
35
35
|
</div>
|
|
36
|
-
)
|
|
37
|
-
}
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
38
|
|
|
39
39
|
const COLORS = [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
]
|
|
40
|
+
"var(--chart-1)",
|
|
41
|
+
"var(--chart-2)",
|
|
42
|
+
"var(--chart-3)",
|
|
43
|
+
"var(--chart-4)",
|
|
44
|
+
"var(--chart-5)",
|
|
45
|
+
];
|
|
46
46
|
|
|
47
47
|
interface SeriesDataPoint {
|
|
48
|
-
label: string
|
|
49
|
-
[key: string]: string | number
|
|
48
|
+
label: string;
|
|
49
|
+
[key: string]: string | number;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export interface LineChartProps {
|
|
53
|
-
title?: string
|
|
54
|
-
data: SeriesDataPoint[]
|
|
55
|
-
series?: string[]
|
|
56
|
-
showGrid?: boolean
|
|
57
|
-
showLegend?: boolean
|
|
58
|
-
showDots?: boolean
|
|
59
|
-
curved?: boolean
|
|
60
|
-
className?: string
|
|
53
|
+
title?: string;
|
|
54
|
+
data: SeriesDataPoint[];
|
|
55
|
+
series?: string[];
|
|
56
|
+
showGrid?: boolean;
|
|
57
|
+
showLegend?: boolean;
|
|
58
|
+
showDots?: boolean;
|
|
59
|
+
curved?: boolean;
|
|
60
|
+
className?: string;
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
export const LineChart: FC<LineChartProps> = ({
|
|
@@ -72,16 +72,16 @@ export const LineChart: FC<LineChartProps> = ({
|
|
|
72
72
|
}) => {
|
|
73
73
|
// Auto-detect series from data keys if not provided
|
|
74
74
|
const seriesKeys = useMemo(() => {
|
|
75
|
-
if (series && series.length > 0) return series
|
|
76
|
-
if (data.length === 0) return []
|
|
77
|
-
const keys = Object.keys(data[0]).filter((k) => k !==
|
|
78
|
-
return keys
|
|
79
|
-
}, [data, series])
|
|
75
|
+
if (series && series.length > 0) return series;
|
|
76
|
+
if (data.length === 0) return [];
|
|
77
|
+
const keys = Object.keys(data[0]).filter((k) => k !== "label");
|
|
78
|
+
return keys;
|
|
79
|
+
}, [data, series]);
|
|
80
80
|
|
|
81
81
|
return (
|
|
82
|
-
<div className={cn(
|
|
82
|
+
<div className={cn("flex flex-col gap-2", className)}>
|
|
83
83
|
{title && (
|
|
84
|
-
<h3 className="text-
|
|
84
|
+
<h3 className="text-sm font-medium text-foreground">{title}</h3>
|
|
85
85
|
)}
|
|
86
86
|
<div className="h-[250px] w-full">
|
|
87
87
|
<ResponsiveContainer width="100%" height="100%">
|
|
@@ -97,28 +97,28 @@ export const LineChart: FC<LineChartProps> = ({
|
|
|
97
97
|
)}
|
|
98
98
|
<XAxis
|
|
99
99
|
dataKey="label"
|
|
100
|
-
tick={{ fill:
|
|
101
|
-
axisLine={{ stroke:
|
|
102
|
-
tickLine={{ stroke:
|
|
100
|
+
tick={{ fill: "var(--foreground)", fontSize: 12 }}
|
|
101
|
+
axisLine={{ stroke: "var(--border)" }}
|
|
102
|
+
tickLine={{ stroke: "var(--border)" }}
|
|
103
103
|
/>
|
|
104
104
|
<YAxis
|
|
105
|
-
tick={{ fill:
|
|
106
|
-
axisLine={{ stroke:
|
|
107
|
-
tickLine={{ stroke:
|
|
105
|
+
tick={{ fill: "var(--foreground)", fontSize: 12 }}
|
|
106
|
+
axisLine={{ stroke: "var(--border)" }}
|
|
107
|
+
tickLine={{ stroke: "var(--border)" }}
|
|
108
108
|
/>
|
|
109
109
|
<Tooltip content={<CustomTooltip />} />
|
|
110
110
|
{showLegend && seriesKeys.length > 1 && (
|
|
111
111
|
<Legend
|
|
112
|
-
wrapperStyle={{ color:
|
|
112
|
+
wrapperStyle={{ color: "var(--foreground)" }}
|
|
113
113
|
formatter={(value) => (
|
|
114
|
-
<span style={{ color:
|
|
114
|
+
<span style={{ color: "var(--foreground)" }}>{value}</span>
|
|
115
115
|
)}
|
|
116
116
|
/>
|
|
117
117
|
)}
|
|
118
118
|
{seriesKeys.map((key, index) => (
|
|
119
119
|
<Line
|
|
120
120
|
key={key}
|
|
121
|
-
type={curved ?
|
|
121
|
+
type={curved ? "monotone" : "linear"}
|
|
122
122
|
dataKey={key}
|
|
123
123
|
stroke={COLORS[index % COLORS.length]}
|
|
124
124
|
strokeWidth={2}
|
|
@@ -131,5 +131,5 @@ export const LineChart: FC<LineChartProps> = ({
|
|
|
131
131
|
</ResponsiveContainer>
|
|
132
132
|
</div>
|
|
133
133
|
</div>
|
|
134
|
-
)
|
|
135
|
-
}
|
|
134
|
+
);
|
|
135
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { cn } from
|
|
4
|
-
import { FC } from
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
import { FC } from "react";
|
|
5
5
|
import {
|
|
6
6
|
PieChart as RechartsPieChart,
|
|
7
7
|
Pie,
|
|
@@ -10,42 +10,42 @@ import {
|
|
|
10
10
|
Legend,
|
|
11
11
|
ResponsiveContainer,
|
|
12
12
|
TooltipProps,
|
|
13
|
-
} from
|
|
13
|
+
} from "recharts";
|
|
14
14
|
|
|
15
15
|
const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
|
|
16
|
-
if (!active || !payload || payload.length === 0) return null
|
|
17
|
-
const entry = payload[0]
|
|
16
|
+
if (!active || !payload || payload.length === 0) return null;
|
|
17
|
+
const entry = payload[0];
|
|
18
18
|
return (
|
|
19
|
-
<div className="
|
|
19
|
+
<div className="rounded-md border border-border bg-background px-2 py-1 text-xs text-foreground shadow-sm">
|
|
20
20
|
<span className="font-medium">
|
|
21
|
-
{typeof entry?.value ===
|
|
21
|
+
{typeof entry?.value === "number"
|
|
22
22
|
? entry.value.toLocaleString()
|
|
23
23
|
: entry?.value}
|
|
24
24
|
</span>
|
|
25
25
|
</div>
|
|
26
|
-
)
|
|
27
|
-
}
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
28
|
|
|
29
29
|
const COLORS = [
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
]
|
|
30
|
+
"var(--chart-1)",
|
|
31
|
+
"var(--chart-2)",
|
|
32
|
+
"var(--chart-3)",
|
|
33
|
+
"var(--chart-4)",
|
|
34
|
+
"var(--chart-5)",
|
|
35
|
+
];
|
|
36
36
|
|
|
37
37
|
interface DataPoint {
|
|
38
|
-
label: string
|
|
39
|
-
value: number
|
|
40
|
-
color?: string
|
|
38
|
+
label: string;
|
|
39
|
+
value: number;
|
|
40
|
+
color?: string;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
export interface PieChartProps {
|
|
44
|
-
title?: string
|
|
45
|
-
data: DataPoint[]
|
|
46
|
-
showLabels?: boolean
|
|
47
|
-
showLegend?: boolean
|
|
48
|
-
className?: string
|
|
44
|
+
title?: string;
|
|
45
|
+
data: DataPoint[];
|
|
46
|
+
showLabels?: boolean;
|
|
47
|
+
showLegend?: boolean;
|
|
48
|
+
className?: string;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
export const PieChart: FC<PieChartProps> = ({
|
|
@@ -60,12 +60,12 @@ export const PieChart: FC<PieChartProps> = ({
|
|
|
60
60
|
name: d.label,
|
|
61
61
|
value: d.value,
|
|
62
62
|
color: d.color,
|
|
63
|
-
}))
|
|
63
|
+
}));
|
|
64
64
|
|
|
65
65
|
return (
|
|
66
|
-
<div className={cn(
|
|
66
|
+
<div className={cn("flex flex-col gap-2", className)}>
|
|
67
67
|
{title && (
|
|
68
|
-
<h3 className="text-
|
|
68
|
+
<h3 className="text-sm font-medium text-foreground">{title}</h3>
|
|
69
69
|
)}
|
|
70
70
|
<div className="h-[320px] w-full">
|
|
71
71
|
<ResponsiveContainer width="100%" height="100%">
|
|
@@ -90,33 +90,33 @@ export const PieChart: FC<PieChartProps> = ({
|
|
|
90
90
|
midAngle,
|
|
91
91
|
outerRadius,
|
|
92
92
|
}: {
|
|
93
|
-
name?: string
|
|
94
|
-
percent?: number
|
|
95
|
-
cx?: number
|
|
96
|
-
cy?: number
|
|
97
|
-
midAngle?: number
|
|
98
|
-
outerRadius?: number
|
|
93
|
+
name?: string;
|
|
94
|
+
percent?: number;
|
|
95
|
+
cx?: number;
|
|
96
|
+
cy?: number;
|
|
97
|
+
midAngle?: number;
|
|
98
|
+
outerRadius?: number;
|
|
99
99
|
}) => {
|
|
100
|
-
const RADIAN = Math.PI / 180
|
|
101
|
-
const radius = (outerRadius ?? 80) + 25
|
|
100
|
+
const RADIAN = Math.PI / 180;
|
|
101
|
+
const radius = (outerRadius ?? 80) + 25;
|
|
102
102
|
const x =
|
|
103
103
|
(cx ?? 0) +
|
|
104
|
-
radius * Math.cos(-((midAngle ?? 0) * RADIAN))
|
|
104
|
+
radius * Math.cos(-((midAngle ?? 0) * RADIAN));
|
|
105
105
|
const y =
|
|
106
106
|
(cy ?? 0) +
|
|
107
|
-
radius * Math.sin(-((midAngle ?? 0) * RADIAN))
|
|
107
|
+
radius * Math.sin(-((midAngle ?? 0) * RADIAN));
|
|
108
108
|
return (
|
|
109
109
|
<text
|
|
110
110
|
x={x}
|
|
111
111
|
y={y}
|
|
112
112
|
fill="var(--foreground)"
|
|
113
|
-
textAnchor={x > (cx ?? 0) ?
|
|
113
|
+
textAnchor={x > (cx ?? 0) ? "start" : "end"}
|
|
114
114
|
dominantBaseline="central"
|
|
115
115
|
fontSize={12}
|
|
116
116
|
>
|
|
117
|
-
{`${name ??
|
|
117
|
+
{`${name ?? ""} (${((percent ?? 0) * 100).toFixed(0)}%)`}
|
|
118
118
|
</text>
|
|
119
|
-
)
|
|
119
|
+
);
|
|
120
120
|
}
|
|
121
121
|
: undefined
|
|
122
122
|
}
|
|
@@ -134,9 +134,9 @@ export const PieChart: FC<PieChartProps> = ({
|
|
|
134
134
|
{showLegend && (
|
|
135
135
|
<Legend
|
|
136
136
|
verticalAlign="bottom"
|
|
137
|
-
wrapperStyle={{ color:
|
|
137
|
+
wrapperStyle={{ color: "var(--foreground)", paddingTop: 20 }}
|
|
138
138
|
formatter={(value) => (
|
|
139
|
-
<span style={{ color:
|
|
139
|
+
<span style={{ color: "var(--foreground)" }}>{value}</span>
|
|
140
140
|
)}
|
|
141
141
|
/>
|
|
142
142
|
)}
|
|
@@ -144,5 +144,5 @@ export const PieChart: FC<PieChartProps> = ({
|
|
|
144
144
|
</ResponsiveContainer>
|
|
145
145
|
</div>
|
|
146
146
|
</div>
|
|
147
|
-
)
|
|
148
|
-
}
|
|
147
|
+
);
|
|
148
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { cn } from
|
|
4
|
-
import { FC } from
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
import { FC } from "react";
|
|
5
5
|
import {
|
|
6
6
|
RadarChart as RechartsRadarChart,
|
|
7
7
|
Radar,
|
|
@@ -12,41 +12,41 @@ import {
|
|
|
12
12
|
Legend,
|
|
13
13
|
ResponsiveContainer,
|
|
14
14
|
TooltipProps,
|
|
15
|
-
} from
|
|
15
|
+
} from "recharts";
|
|
16
16
|
|
|
17
17
|
const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
|
|
18
|
-
if (!active || !payload || payload.length === 0) return null
|
|
19
|
-
const entry = payload[0]
|
|
18
|
+
if (!active || !payload || payload.length === 0) return null;
|
|
19
|
+
const entry = payload[0];
|
|
20
20
|
return (
|
|
21
|
-
<div className="
|
|
21
|
+
<div className="rounded-md border border-border bg-background px-2 py-1 text-xs text-foreground shadow-sm">
|
|
22
22
|
<span className="font-medium">
|
|
23
|
-
{typeof entry?.value ===
|
|
23
|
+
{typeof entry?.value === "number"
|
|
24
24
|
? entry.value.toLocaleString()
|
|
25
25
|
: entry?.value}
|
|
26
26
|
</span>
|
|
27
27
|
</div>
|
|
28
|
-
)
|
|
29
|
-
}
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
30
|
|
|
31
31
|
const COLORS = [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
]
|
|
32
|
+
"var(--chart-1)",
|
|
33
|
+
"var(--chart-2)",
|
|
34
|
+
"var(--chart-3)",
|
|
35
|
+
"var(--chart-4)",
|
|
36
|
+
"var(--chart-5)",
|
|
37
|
+
];
|
|
38
38
|
|
|
39
39
|
interface DataPoint {
|
|
40
|
-
label: string
|
|
41
|
-
value: number
|
|
42
|
-
color?: string
|
|
40
|
+
label: string;
|
|
41
|
+
value: number;
|
|
42
|
+
color?: string;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export interface RadarChartProps {
|
|
46
|
-
title?: string
|
|
47
|
-
data: DataPoint[]
|
|
48
|
-
showLegend?: boolean
|
|
49
|
-
className?: string
|
|
46
|
+
title?: string;
|
|
47
|
+
data: DataPoint[];
|
|
48
|
+
showLegend?: boolean;
|
|
49
|
+
className?: string;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export const RadarChart: FC<RadarChartProps> = ({
|
|
@@ -56,12 +56,12 @@ export const RadarChart: FC<RadarChartProps> = ({
|
|
|
56
56
|
className,
|
|
57
57
|
}) => {
|
|
58
58
|
// Transform data for Recharts (uses 'subject' for labels)
|
|
59
|
-
const chartData = data.map((d) => ({ subject: d.label, value: d.value }))
|
|
59
|
+
const chartData = data.map((d) => ({ subject: d.label, value: d.value }));
|
|
60
60
|
|
|
61
61
|
return (
|
|
62
|
-
<div className={cn(
|
|
62
|
+
<div className={cn("flex flex-col gap-2", className)}>
|
|
63
63
|
{title && (
|
|
64
|
-
<h3 className="text-
|
|
64
|
+
<h3 className="text-sm font-medium text-foreground">{title}</h3>
|
|
65
65
|
)}
|
|
66
66
|
<div className="h-[250px] w-full">
|
|
67
67
|
<ResponsiveContainer width="100%" height="100%">
|
|
@@ -74,18 +74,18 @@ export const RadarChart: FC<RadarChartProps> = ({
|
|
|
74
74
|
<PolarGrid stroke="var(--border)" />
|
|
75
75
|
<PolarAngleAxis
|
|
76
76
|
dataKey="subject"
|
|
77
|
-
tick={{ fill:
|
|
77
|
+
tick={{ fill: "var(--foreground)", fontSize: 12 }}
|
|
78
78
|
/>
|
|
79
79
|
<PolarRadiusAxis
|
|
80
|
-
tick={{ fill:
|
|
81
|
-
axisLine={{ stroke:
|
|
80
|
+
tick={{ fill: "var(--foreground)", fontSize: 10 }}
|
|
81
|
+
axisLine={{ stroke: "var(--border)" }}
|
|
82
82
|
/>
|
|
83
83
|
<Tooltip content={<CustomTooltip />} />
|
|
84
84
|
{showLegend && (
|
|
85
85
|
<Legend
|
|
86
|
-
wrapperStyle={{ color:
|
|
86
|
+
wrapperStyle={{ color: "var(--foreground)" }}
|
|
87
87
|
formatter={(value) => (
|
|
88
|
-
<span style={{ color:
|
|
88
|
+
<span style={{ color: "var(--foreground)" }}>{value}</span>
|
|
89
89
|
)}
|
|
90
90
|
/>
|
|
91
91
|
)}
|
|
@@ -101,5 +101,5 @@ export const RadarChart: FC<RadarChartProps> = ({
|
|
|
101
101
|
</ResponsiveContainer>
|
|
102
102
|
</div>
|
|
103
103
|
</div>
|
|
104
|
-
)
|
|
105
|
-
}
|
|
104
|
+
);
|
|
105
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { cn } from
|
|
4
|
-
import { FC } from
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
import { FC } from "react";
|
|
5
5
|
import {
|
|
6
6
|
ScatterChart as RechartsScatterChart,
|
|
7
7
|
Scatter,
|
|
@@ -13,43 +13,43 @@ import {
|
|
|
13
13
|
ZAxis,
|
|
14
14
|
Cell,
|
|
15
15
|
TooltipProps,
|
|
16
|
-
} from
|
|
16
|
+
} from "recharts";
|
|
17
17
|
|
|
18
18
|
interface ScatterDataPoint {
|
|
19
|
-
x: number
|
|
20
|
-
y: number
|
|
21
|
-
label?: string
|
|
22
|
-
size?: number
|
|
23
|
-
color?: string
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
label?: string;
|
|
22
|
+
size?: number;
|
|
23
|
+
color?: string;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
|
|
27
|
-
if (!active || !payload || payload.length === 0) return null
|
|
28
|
-
const point = payload[0]?.payload as ScatterDataPoint | undefined
|
|
27
|
+
if (!active || !payload || payload.length === 0) return null;
|
|
28
|
+
const point = payload[0]?.payload as ScatterDataPoint | undefined;
|
|
29
29
|
return (
|
|
30
|
-
<div className="
|
|
30
|
+
<div className="rounded-md border border-border bg-background px-2 py-1.5 text-xs text-foreground shadow-sm">
|
|
31
31
|
{point?.label && <div className="font-medium">{point.label}</div>}
|
|
32
32
|
<div>x: {point?.x?.toLocaleString()}</div>
|
|
33
33
|
<div>y: {point?.y?.toLocaleString()}</div>
|
|
34
34
|
</div>
|
|
35
|
-
)
|
|
36
|
-
}
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
37
|
|
|
38
38
|
const COLORS = [
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
]
|
|
39
|
+
"var(--chart-1)",
|
|
40
|
+
"var(--chart-2)",
|
|
41
|
+
"var(--chart-3)",
|
|
42
|
+
"var(--chart-4)",
|
|
43
|
+
"var(--chart-5)",
|
|
44
|
+
];
|
|
45
45
|
|
|
46
46
|
export interface ScatterChartProps {
|
|
47
|
-
title?: string
|
|
48
|
-
data: ScatterDataPoint[]
|
|
49
|
-
xLabel?: string
|
|
50
|
-
yLabel?: string
|
|
51
|
-
showGrid?: boolean
|
|
52
|
-
className?: string
|
|
47
|
+
title?: string;
|
|
48
|
+
data: ScatterDataPoint[];
|
|
49
|
+
xLabel?: string;
|
|
50
|
+
yLabel?: string;
|
|
51
|
+
showGrid?: boolean;
|
|
52
|
+
className?: string;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
export const ScatterChart: FC<ScatterChartProps> = ({
|
|
@@ -61,12 +61,12 @@ export const ScatterChart: FC<ScatterChartProps> = ({
|
|
|
61
61
|
className,
|
|
62
62
|
}) => {
|
|
63
63
|
// Check if we have size data for bubble chart effect
|
|
64
|
-
const hasSizeData = data.some((d) => d.size !== undefined)
|
|
64
|
+
const hasSizeData = data.some((d) => d.size !== undefined);
|
|
65
65
|
|
|
66
66
|
return (
|
|
67
|
-
<div className={cn(
|
|
67
|
+
<div className={cn("flex flex-col gap-2", className)}>
|
|
68
68
|
{title && (
|
|
69
|
-
<h3 className="text-
|
|
69
|
+
<h3 className="text-sm font-medium text-foreground">{title}</h3>
|
|
70
70
|
)}
|
|
71
71
|
<div className="h-[250px] w-full">
|
|
72
72
|
<ResponsiveContainer width="100%" height="100%">
|
|
@@ -82,17 +82,17 @@ export const ScatterChart: FC<ScatterChartProps> = ({
|
|
|
82
82
|
<XAxis
|
|
83
83
|
type="number"
|
|
84
84
|
dataKey="x"
|
|
85
|
-
name={xLabel ||
|
|
86
|
-
tick={{ fill:
|
|
87
|
-
axisLine={{ stroke:
|
|
88
|
-
tickLine={{ stroke:
|
|
85
|
+
name={xLabel || "x"}
|
|
86
|
+
tick={{ fill: "var(--foreground)", fontSize: 12 }}
|
|
87
|
+
axisLine={{ stroke: "var(--border)" }}
|
|
88
|
+
tickLine={{ stroke: "var(--border)" }}
|
|
89
89
|
label={
|
|
90
90
|
xLabel
|
|
91
91
|
? {
|
|
92
92
|
value: xLabel,
|
|
93
|
-
position:
|
|
93
|
+
position: "bottom",
|
|
94
94
|
offset: -5,
|
|
95
|
-
fill:
|
|
95
|
+
fill: "var(--foreground)",
|
|
96
96
|
}
|
|
97
97
|
: undefined
|
|
98
98
|
}
|
|
@@ -100,17 +100,17 @@ export const ScatterChart: FC<ScatterChartProps> = ({
|
|
|
100
100
|
<YAxis
|
|
101
101
|
type="number"
|
|
102
102
|
dataKey="y"
|
|
103
|
-
name={yLabel ||
|
|
104
|
-
tick={{ fill:
|
|
105
|
-
axisLine={{ stroke:
|
|
106
|
-
tickLine={{ stroke:
|
|
103
|
+
name={yLabel || "y"}
|
|
104
|
+
tick={{ fill: "var(--foreground)", fontSize: 12 }}
|
|
105
|
+
axisLine={{ stroke: "var(--border)" }}
|
|
106
|
+
tickLine={{ stroke: "var(--border)" }}
|
|
107
107
|
label={
|
|
108
108
|
yLabel
|
|
109
109
|
? {
|
|
110
110
|
value: yLabel,
|
|
111
111
|
angle: -90,
|
|
112
|
-
position:
|
|
113
|
-
fill:
|
|
112
|
+
position: "left",
|
|
113
|
+
fill: "var(--foreground)",
|
|
114
114
|
}
|
|
115
115
|
: undefined
|
|
116
116
|
}
|
|
@@ -128,5 +128,5 @@ export const ScatterChart: FC<ScatterChartProps> = ({
|
|
|
128
128
|
</ResponsiveContainer>
|
|
129
129
|
</div>
|
|
130
130
|
</div>
|
|
131
|
-
)
|
|
132
|
-
}
|
|
131
|
+
);
|
|
132
|
+
};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { useRadius } from
|
|
4
|
-
import { cn } from
|
|
5
|
-
import { FC, ReactNode } from
|
|
3
|
+
import { useRadius } from "@/hooks/useRadius";
|
|
4
|
+
import { cn } from "@/lib/utils";
|
|
5
|
+
import { FC, ReactNode } from "react";
|
|
6
6
|
|
|
7
7
|
interface MacOSWindowFrameProps {
|
|
8
|
-
children: ReactNode
|
|
9
|
-
className?: string
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
className?: string;
|
|
10
10
|
/** Optional title to display in the title bar */
|
|
11
|
-
title?: string
|
|
11
|
+
title?: string;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -20,20 +20,20 @@ export const MacOSWindowFrame: FC<MacOSWindowFrameProps> = ({
|
|
|
20
20
|
className,
|
|
21
21
|
title,
|
|
22
22
|
}) => {
|
|
23
|
-
const r = useRadius()
|
|
23
|
+
const r = useRadius();
|
|
24
24
|
|
|
25
25
|
return (
|
|
26
26
|
<div className="@container my-4 w-full first:mt-0">
|
|
27
27
|
<div
|
|
28
28
|
className={cn(
|
|
29
29
|
// after:hidden prevents assistant-ui from showing its default code block loading indicator
|
|
30
|
-
|
|
31
|
-
r(
|
|
32
|
-
className
|
|
30
|
+
"w-full overflow-hidden border border-border after:hidden @sm:max-w-md @md:max-w-lg @lg:max-w-xl @xl:max-w-2xl",
|
|
31
|
+
r("lg"),
|
|
32
|
+
className,
|
|
33
33
|
)}
|
|
34
34
|
>
|
|
35
35
|
{/* Title bar */}
|
|
36
|
-
<div className="
|
|
36
|
+
<div className="flex h-8 items-center gap-2 border-b border-border bg-muted/50 px-3">
|
|
37
37
|
{/* Traffic lights */}
|
|
38
38
|
<div className="flex items-center gap-1.5">
|
|
39
39
|
<div className="size-3 rounded-full bg-[#FF5F57]" />
|
|
@@ -42,7 +42,7 @@ export const MacOSWindowFrame: FC<MacOSWindowFrameProps> = ({
|
|
|
42
42
|
</div>
|
|
43
43
|
{/* Title */}
|
|
44
44
|
{title && (
|
|
45
|
-
<span className="
|
|
45
|
+
<span className="flex-1 text-center text-xs font-medium text-muted-foreground">
|
|
46
46
|
{title}
|
|
47
47
|
</span>
|
|
48
48
|
)}
|
|
@@ -51,5 +51,5 @@ export const MacOSWindowFrame: FC<MacOSWindowFrameProps> = ({
|
|
|
51
51
|
{children}
|
|
52
52
|
</div>
|
|
53
53
|
</div>
|
|
54
|
-
)
|
|
55
|
-
}
|
|
54
|
+
);
|
|
55
|
+
};
|