diff --git a/bun.lockb b/bun.lockb old mode 100755 new mode 100644 index d6a5ad9e..34b171d5 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index a8956340..a02170e4 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "@tscircuit/3d-viewer": "^0.0.32", "@tscircuit/footprinter": "^0.0.68", "@tscircuit/pcb-viewer": "^1.10.5", + "@types/file-saver": "^2.0.7", "@types/ms": "^0.7.34", "@typescript/ata": "^0.9.7", "@valtown/codemirror-ts": "^2.2.0", @@ -66,6 +67,7 @@ "easyeda": "^0.0.32", "embla-carousel-react": "^8.3.0", "fflate": "^0.8.2", + "file-saver": "^2.0.5", "immer": "^10.1.1", "input-otp": "^1.2.4", "jose": "^5.9.3", diff --git a/src/components/CodeAndPreview.tsx b/src/components/CodeAndPreview.tsx index 246fd12a..787484ba 100644 --- a/src/components/CodeAndPreview.tsx +++ b/src/components/CodeAndPreview.tsx @@ -114,6 +114,7 @@ export function CodeAndPreview({ snippet }: Props) { return (
@@ -20,14 +31,15 @@ export function DownloadButtonAndMenu({ className }: { className?: string }) { - - - Download TSX - - tsx - - - + + downloadCircuitJson( + circuitJson, + snippetUnscopedName || "circuit" + ".json", + ) + } + > Download Circuit JSON diff --git a/src/components/EditorNav.tsx b/src/components/EditorNav.tsx index 1268527a..650830e2 100644 --- a/src/components/EditorNav.tsx +++ b/src/components/EditorNav.tsx @@ -24,6 +24,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" +import { useRunTsx } from "@/hooks/use-run-tsx" import { OpenInNewWindowIcon } from "@radix-ui/react-icons" import { encodeTextToUrlHash } from "@/lib/encodeTextToUrlHash" import { Snippet } from "fake-snippets-api/lib/db/schema" @@ -35,6 +36,7 @@ import { SnippetLink } from "./SnippetLink" import { useGlobalStore } from "@/hooks/use-global-store" export default function EditorNav({ + circuitJson, snippet, code, hasUnsavedChanges, @@ -45,6 +47,7 @@ export default function EditorNav({ isSaving, }: { snippet?: Snippet + circuitJson: any code: string snippetType?: string hasUnsavedChanges: boolean @@ -125,7 +128,11 @@ export default function EditorNav({ Edit with AI - + diff --git a/src/hooks/use-global-store.ts b/src/hooks/use-global-store.ts index 0c8fd81c..2d34fed5 100644 --- a/src/hooks/use-global-store.ts +++ b/src/hooks/use-global-store.ts @@ -9,6 +9,8 @@ export type Store = { github_username: string } | null setSession: (session: Store["session"]) => any + should_onboarding_tips_be_closed: boolean + setOnboardingTipsClosed: (closed: boolean) => any } export const useGlobalStore = create()( @@ -16,6 +18,9 @@ export const useGlobalStore = create()( (set) => ({ session: null, setSession: (session) => set({ session }), + should_onboarding_tips_be_closed: false, + setOnboardingTipsClosed: (closed) => + set({ should_onboarding_tips_be_closed: closed }), }), { name: "session_store", diff --git a/src/lib/download-fns/createBlobURL.ts b/src/lib/download-fns/createBlobURL.ts new file mode 100644 index 00000000..e82784ba --- /dev/null +++ b/src/lib/download-fns/createBlobURL.ts @@ -0,0 +1,4 @@ +export const createBlobURL = (content: string) => { + const blob = new Blob([content], { type: "text/plain" }) + return URL.createObjectURL(blob) +} diff --git a/src/lib/download-fns/download-circuit-json-fn.ts b/src/lib/download-fns/download-circuit-json-fn.ts new file mode 100644 index 00000000..926da6ab --- /dev/null +++ b/src/lib/download-fns/download-circuit-json-fn.ts @@ -0,0 +1,7 @@ +import { saveAs } from "file-saver" +import { createBlobURL } from "./createBlobURL" +export const downloadCircuitJson = (content: any, fileName: string) => { + const circuitJson = JSON.stringify(content, null, 2) + const blob = new Blob([circuitJson], { type: "application/json" }) + saveAs(blob, fileName) +} diff --git a/src/pages/view-snippet.tsx b/src/pages/view-snippet.tsx index d8db8258..ac37b172 100644 --- a/src/pages/view-snippet.tsx +++ b/src/pages/view-snippet.tsx @@ -45,7 +45,11 @@ export const ViewSnippetPage = () => { Copy URL - +
Code