@@ -18,14 +18,22 @@ import { cn } from "@/utils/cn";
18
18
import {
19
19
ActivityIcon ,
20
20
BugIcon ,
21
+ DownloadIcon ,
21
22
ExternalLinkIcon ,
22
23
LoaderIcon ,
23
24
PlayIcon ,
24
25
ScrollTextIcon ,
25
26
XIcon ,
26
27
} from "lucide-react" ;
27
28
import { AnimatePresence , motion } from "motion/react" ;
28
- import { type FC , useEffect , useMemo , useState } from "react" ;
29
+ import {
30
+ type FC ,
31
+ useCallback ,
32
+ useEffect ,
33
+ useMemo ,
34
+ useRef ,
35
+ useState ,
36
+ } from "react" ;
29
37
import { useSearchParams } from "react-router" ;
30
38
31
39
export const Preview : FC = ( ) => {
@@ -40,6 +48,20 @@ export const Preview: FC = () => {
40
48
const [ params ] = useSearchParams ( ) ;
41
49
const isDebug = useMemo ( ( ) => params . has ( "debug" ) , [ params ] ) ;
42
50
51
+
52
+ const onDownloadOutput = useCallback ( ( ) => {
53
+ const blob = new Blob ( [ JSON . stringify ( output , null , 2 ) ] , {
54
+ type : "application/json" ,
55
+ } ) ;
56
+
57
+ const url = URL . createObjectURL ( blob ) ;
58
+
59
+ const link = document . createElement ( "a" ) ;
60
+ link . href = url ;
61
+ link . download = "output.json" ;
62
+ link . click ( ) ;
63
+ } , [ output ] ) ;
64
+
43
65
useEffect ( ( ) => {
44
66
if ( ! window . go_preview ) {
45
67
return ;
@@ -93,9 +115,20 @@ export const Preview: FC = () => {
93
115
</ div >
94
116
) : null }
95
117
96
- < Tabs . List className = { ! isDebug ? "hidden" : undefined } >
97
- < Tabs . Trigger value = "preview" icon = { PlayIcon } label = "Preview" />
98
- < Tabs . Trigger value = "debug" icon = { BugIcon } label = "Debugger" />
118
+ < Tabs . List
119
+ className = { cn (
120
+ "justify-between pr-3" ,
121
+ ! isDebug ? "hidden" : undefined ,
122
+ ) }
123
+ >
124
+ < div className = "flex" >
125
+ < Tabs . Trigger value = "preview" icon = { PlayIcon } label = "Preview" />
126
+ < Tabs . Trigger value = "debug" icon = { BugIcon } label = "Debugger" />
127
+ </ div >
128
+ < Button size = "sm" variant = "outline" className = "self-center" onClick = { onDownloadOutput } >
129
+ < DownloadIcon />
130
+ Download output
131
+ </ Button >
99
132
</ Tabs . List >
100
133
101
134
< Tabs . Content value = "preview" asChild = { true } >
0 commit comments