Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/web/.source/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ const create = browser<typeof Config, import("fumadocs-mdx/runtime/types").Inter
}
}>();
const browserCollections = {
docs: create.doc("docs", {"conditional-logic.mdx": () => import("../content/docs/conditional-logic.mdx?collection=docs"), "configuration.mdx": () => import("../content/docs/configuration.mdx?collection=docs"), "custom-rendering.mdx": () => import("../content/docs/custom-rendering.mdx?collection=docs"), "form-component.mdx": () => import("../content/docs/form-component.mdx?collection=docs"), "index.mdx": () => import("../content/docs/index.mdx?collection=docs"), "installation.mdx": () => import("../content/docs/installation.mdx?collection=docs"), "quick-start.mdx": () => import("../content/docs/quick-start.mdx?collection=docs"), "schema.mdx": () => import("../content/docs/schema.mdx?collection=docs"), "validation.mdx": () => import("../content/docs/validation.mdx?collection=docs"), "your-first-form.mdx": () => import("../content/docs/your-first-form.mdx?collection=docs"), "fields/types.mdx": () => import("../content/docs/fields/types.mdx?collection=docs"), "fields/data/checkbox-group.mdx": () => import("../content/docs/fields/data/checkbox-group.mdx?collection=docs"), "fields/data/checkbox.mdx": () => import("../content/docs/fields/data/checkbox.mdx?collection=docs"), "fields/data/date.mdx": () => import("../content/docs/fields/data/date.mdx?collection=docs"), "fields/data/number.mdx": () => import("../content/docs/fields/data/number.mdx?collection=docs"), "fields/data/password.mdx": () => import("../content/docs/fields/data/password.mdx?collection=docs"), "fields/data/radio.mdx": () => import("../content/docs/fields/data/radio.mdx?collection=docs"), "fields/data/select.mdx": () => import("../content/docs/fields/data/select.mdx?collection=docs"), "fields/data/switch.mdx": () => import("../content/docs/fields/data/switch.mdx?collection=docs"), "fields/data/tags.mdx": () => import("../content/docs/fields/data/tags.mdx?collection=docs"), "fields/data/text.mdx": () => import("../content/docs/fields/data/text.mdx?collection=docs"), "fields/data/textarea.mdx": () => import("../content/docs/fields/data/textarea.mdx?collection=docs"), "fields/data/upload.mdx": () => import("../content/docs/fields/data/upload.mdx?collection=docs"), "fields/layout/array.mdx": () => import("../content/docs/fields/layout/array.mdx?collection=docs"), "fields/layout/collapsible.mdx": () => import("../content/docs/fields/layout/collapsible.mdx?collection=docs"), "fields/layout/group.mdx": () => import("../content/docs/fields/layout/group.mdx?collection=docs"), "fields/layout/row.mdx": () => import("../content/docs/fields/layout/row.mdx?collection=docs"), "fields/layout/tabs.mdx": () => import("../content/docs/fields/layout/tabs.mdx?collection=docs"), }),
docs: create.doc("docs", {"conditional-logic.mdx": () => import("../content/docs/conditional-logic.mdx?collection=docs"), "configuration.mdx": () => import("../content/docs/configuration.mdx?collection=docs"), "custom-rendering.mdx": () => import("../content/docs/custom-rendering.mdx?collection=docs"), "form-component.mdx": () => import("../content/docs/form-component.mdx?collection=docs"), "index.mdx": () => import("../content/docs/index.mdx?collection=docs"), "installation.mdx": () => import("../content/docs/installation.mdx?collection=docs"), "quick-start.mdx": () => import("../content/docs/quick-start.mdx?collection=docs"), "schema.mdx": () => import("../content/docs/schema.mdx?collection=docs"), "validation.mdx": () => import("../content/docs/validation.mdx?collection=docs"), "your-first-form.mdx": () => import("../content/docs/your-first-form.mdx?collection=docs"), "fields/types.mdx": () => import("../content/docs/fields/types.mdx?collection=docs"), "fields/layout/array.mdx": () => import("../content/docs/fields/layout/array.mdx?collection=docs"), "fields/layout/collapsible.mdx": () => import("../content/docs/fields/layout/collapsible.mdx?collection=docs"), "fields/layout/group.mdx": () => import("../content/docs/fields/layout/group.mdx?collection=docs"), "fields/layout/row.mdx": () => import("../content/docs/fields/layout/row.mdx?collection=docs"), "fields/layout/tabs.mdx": () => import("../content/docs/fields/layout/tabs.mdx?collection=docs"), "fields/data/checkbox-group.mdx": () => import("../content/docs/fields/data/checkbox-group.mdx?collection=docs"), "fields/data/checkbox.mdx": () => import("../content/docs/fields/data/checkbox.mdx?collection=docs"), "fields/data/date.mdx": () => import("../content/docs/fields/data/date.mdx?collection=docs"), "fields/data/number.mdx": () => import("../content/docs/fields/data/number.mdx?collection=docs"), "fields/data/password.mdx": () => import("../content/docs/fields/data/password.mdx?collection=docs"), "fields/data/radio.mdx": () => import("../content/docs/fields/data/radio.mdx?collection=docs"), "fields/data/select.mdx": () => import("../content/docs/fields/data/select.mdx?collection=docs"), "fields/data/switch.mdx": () => import("../content/docs/fields/data/switch.mdx?collection=docs"), "fields/data/tags.mdx": () => import("../content/docs/fields/data/tags.mdx?collection=docs"), "fields/data/text.mdx": () => import("../content/docs/fields/data/text.mdx?collection=docs"), "fields/data/textarea.mdx": () => import("../content/docs/fields/data/textarea.mdx?collection=docs"), "fields/data/upload.mdx": () => import("../content/docs/fields/data/upload.mdx?collection=docs"), }),
};
export default browserCollections;
40 changes: 20 additions & 20 deletions apps/web/.source/server.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
// @ts-nocheck
import * as __fd_glob_31 from "../content/docs/fields/layout/tabs.mdx?collection=docs"
import * as __fd_glob_30 from "../content/docs/fields/layout/row.mdx?collection=docs"
import * as __fd_glob_29 from "../content/docs/fields/layout/group.mdx?collection=docs"
import * as __fd_glob_28 from "../content/docs/fields/layout/collapsible.mdx?collection=docs"
import * as __fd_glob_27 from "../content/docs/fields/layout/array.mdx?collection=docs"
import * as __fd_glob_26 from "../content/docs/fields/data/upload.mdx?collection=docs"
import * as __fd_glob_25 from "../content/docs/fields/data/textarea.mdx?collection=docs"
import * as __fd_glob_24 from "../content/docs/fields/data/text.mdx?collection=docs"
import * as __fd_glob_23 from "../content/docs/fields/data/tags.mdx?collection=docs"
import * as __fd_glob_22 from "../content/docs/fields/data/switch.mdx?collection=docs"
import * as __fd_glob_21 from "../content/docs/fields/data/select.mdx?collection=docs"
import * as __fd_glob_20 from "../content/docs/fields/data/radio.mdx?collection=docs"
import * as __fd_glob_19 from "../content/docs/fields/data/password.mdx?collection=docs"
import * as __fd_glob_18 from "../content/docs/fields/data/number.mdx?collection=docs"
import * as __fd_glob_17 from "../content/docs/fields/data/date.mdx?collection=docs"
import * as __fd_glob_16 from "../content/docs/fields/data/checkbox.mdx?collection=docs"
import * as __fd_glob_15 from "../content/docs/fields/data/checkbox-group.mdx?collection=docs"
import * as __fd_glob_31 from "../content/docs/fields/data/upload.mdx?collection=docs"
import * as __fd_glob_30 from "../content/docs/fields/data/textarea.mdx?collection=docs"
import * as __fd_glob_29 from "../content/docs/fields/data/text.mdx?collection=docs"
import * as __fd_glob_28 from "../content/docs/fields/data/tags.mdx?collection=docs"
import * as __fd_glob_27 from "../content/docs/fields/data/switch.mdx?collection=docs"
import * as __fd_glob_26 from "../content/docs/fields/data/select.mdx?collection=docs"
import * as __fd_glob_25 from "../content/docs/fields/data/radio.mdx?collection=docs"
import * as __fd_glob_24 from "../content/docs/fields/data/password.mdx?collection=docs"
import * as __fd_glob_23 from "../content/docs/fields/data/number.mdx?collection=docs"
import * as __fd_glob_22 from "../content/docs/fields/data/date.mdx?collection=docs"
import * as __fd_glob_21 from "../content/docs/fields/data/checkbox.mdx?collection=docs"
import * as __fd_glob_20 from "../content/docs/fields/data/checkbox-group.mdx?collection=docs"
import * as __fd_glob_19 from "../content/docs/fields/layout/tabs.mdx?collection=docs"
import * as __fd_glob_18 from "../content/docs/fields/layout/row.mdx?collection=docs"
import * as __fd_glob_17 from "../content/docs/fields/layout/group.mdx?collection=docs"
import * as __fd_glob_16 from "../content/docs/fields/layout/collapsible.mdx?collection=docs"
import * as __fd_glob_15 from "../content/docs/fields/layout/array.mdx?collection=docs"
import * as __fd_glob_14 from "../content/docs/fields/types.mdx?collection=docs"
import * as __fd_glob_13 from "../content/docs/your-first-form.mdx?collection=docs"
import * as __fd_glob_12 from "../content/docs/validation.mdx?collection=docs"
Expand All @@ -27,8 +27,8 @@ import * as __fd_glob_7 from "../content/docs/form-component.mdx?collection=docs
import * as __fd_glob_6 from "../content/docs/custom-rendering.mdx?collection=docs"
import * as __fd_glob_5 from "../content/docs/configuration.mdx?collection=docs"
import * as __fd_glob_4 from "../content/docs/conditional-logic.mdx?collection=docs"
import { default as __fd_glob_3 } from "../content/docs/fields/data/meta.json?collection=docs"
import { default as __fd_glob_2 } from "../content/docs/fields/layout/meta.json?collection=docs"
import { default as __fd_glob_3 } from "../content/docs/fields/layout/meta.json?collection=docs"
import { default as __fd_glob_2 } from "../content/docs/fields/data/meta.json?collection=docs"
import { default as __fd_glob_1 } from "../content/docs/fields/meta.json?collection=docs"
import { default as __fd_glob_0 } from "../content/docs/meta.json?collection=docs"
import { server } from 'fumadocs-mdx/runtime/server';
Expand All @@ -39,4 +39,4 @@ const create = server<typeof Config, import("fumadocs-mdx/runtime/types").Intern
}
}>({"doc":{"passthroughs":["extractedReferences"]}});

export const docs = await create.docs("docs", "content/docs", {"meta.json": __fd_glob_0, "fields/meta.json": __fd_glob_1, "fields/layout/meta.json": __fd_glob_2, "fields/data/meta.json": __fd_glob_3, }, {"conditional-logic.mdx": __fd_glob_4, "configuration.mdx": __fd_glob_5, "custom-rendering.mdx": __fd_glob_6, "form-component.mdx": __fd_glob_7, "index.mdx": __fd_glob_8, "installation.mdx": __fd_glob_9, "quick-start.mdx": __fd_glob_10, "schema.mdx": __fd_glob_11, "validation.mdx": __fd_glob_12, "your-first-form.mdx": __fd_glob_13, "fields/types.mdx": __fd_glob_14, "fields/data/checkbox-group.mdx": __fd_glob_15, "fields/data/checkbox.mdx": __fd_glob_16, "fields/data/date.mdx": __fd_glob_17, "fields/data/number.mdx": __fd_glob_18, "fields/data/password.mdx": __fd_glob_19, "fields/data/radio.mdx": __fd_glob_20, "fields/data/select.mdx": __fd_glob_21, "fields/data/switch.mdx": __fd_glob_22, "fields/data/tags.mdx": __fd_glob_23, "fields/data/text.mdx": __fd_glob_24, "fields/data/textarea.mdx": __fd_glob_25, "fields/data/upload.mdx": __fd_glob_26, "fields/layout/array.mdx": __fd_glob_27, "fields/layout/collapsible.mdx": __fd_glob_28, "fields/layout/group.mdx": __fd_glob_29, "fields/layout/row.mdx": __fd_glob_30, "fields/layout/tabs.mdx": __fd_glob_31, });
export const docs = await create.docs("docs", "content/docs", {"meta.json": __fd_glob_0, "fields/meta.json": __fd_glob_1, "fields/data/meta.json": __fd_glob_2, "fields/layout/meta.json": __fd_glob_3, }, {"conditional-logic.mdx": __fd_glob_4, "configuration.mdx": __fd_glob_5, "custom-rendering.mdx": __fd_glob_6, "form-component.mdx": __fd_glob_7, "index.mdx": __fd_glob_8, "installation.mdx": __fd_glob_9, "quick-start.mdx": __fd_glob_10, "schema.mdx": __fd_glob_11, "validation.mdx": __fd_glob_12, "your-first-form.mdx": __fd_glob_13, "fields/types.mdx": __fd_glob_14, "fields/layout/array.mdx": __fd_glob_15, "fields/layout/collapsible.mdx": __fd_glob_16, "fields/layout/group.mdx": __fd_glob_17, "fields/layout/row.mdx": __fd_glob_18, "fields/layout/tabs.mdx": __fd_glob_19, "fields/data/checkbox-group.mdx": __fd_glob_20, "fields/data/checkbox.mdx": __fd_glob_21, "fields/data/date.mdx": __fd_glob_22, "fields/data/number.mdx": __fd_glob_23, "fields/data/password.mdx": __fd_glob_24, "fields/data/radio.mdx": __fd_glob_25, "fields/data/select.mdx": __fd_glob_26, "fields/data/switch.mdx": __fd_glob_27, "fields/data/tags.mdx": __fd_glob_28, "fields/data/text.mdx": __fd_glob_29, "fields/data/textarea.mdx": __fd_glob_30, "fields/data/upload.mdx": __fd_glob_31, });
81 changes: 72 additions & 9 deletions apps/web/app/(builder)/components/export-sheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { generateComponentCode } from "../lib/code-generator";
import { toBuilderDocument } from "../lib/persistence";
import { nodesToFields } from "../lib/schema-builder";
import { downloadTextFile, toSafeFileName } from "../lib/utils";
import { useBuilderStore } from "../lib/store";

Expand Down Expand Up @@ -67,13 +68,26 @@ export function ExportSheet() {
return generateComponentCode(nodes, rootIds, formName);
}, [open, nodes, rootIds, formName]);

const schemaJson = React.useMemo(() => {
if (!open) return "";
const fields = nodesToFields(nodes, rootIds);
return JSON.stringify(fields, null, 2);
}, [open, nodes, rootIds]);

const downloadJson = React.useCallback(() => {
if (!documentJson) return;
const fileName = `${toSafeFileName(formName)}.json`;
const fileName = `${toSafeFileName(formName)}-doc.json`;
downloadTextFile(documentJson, fileName, "application/json");
toast.success("Builder backup exported");
toast.success("Builder Document exported");
}, [documentJson, formName]);

const downloadSchema = React.useCallback(() => {
if (!schemaJson) return;
const fileName = `${toSafeFileName(formName)}.json`;
downloadTextFile(schemaJson, fileName, "application/json");
toast.success("BuzzForm schema exported");
}, [schemaJson, formName]);

const downloadCode = React.useCallback(() => {
if (!componentCode) return;
const fileName = `${toSafeFileName(formName)}.tsx`;
Expand All @@ -99,8 +113,8 @@ export function ExportSheet() {
<SheetHeader className="border-b pr-12">
<SheetTitle>Export Form</SheetTitle>
<SheetDescription>
Export production-ready TSX for your app, or a BuzzForm file for
Builder import.
Export production-ready TSX, portable BuzzForm schema JSON, or a
Builder document file.
</SheetDescription>
</SheetHeader>

Expand All @@ -116,7 +130,12 @@ export function ExportSheet() {
</TabsTrigger>
<TabsTrigger value="json" className="gap-1.5">
<HugeiconsIcon icon={File02Icon} size={16} strokeWidth={2} />
BuzzForm File
Builder Document
<Badge variant="outline">.json</Badge>
</TabsTrigger>
<TabsTrigger value="schema" className="gap-1.5">
<HugeiconsIcon icon={File02Icon} size={16} strokeWidth={2} />
BuzzForm Schema
<Badge variant="outline">.json</Badge>
</TabsTrigger>
</TabsList>
Expand Down Expand Up @@ -172,11 +191,11 @@ export function ExportSheet() {
strokeWidth={1.8}
className="text-muted-foreground"
/>
BuzzForm file
Builder document file
</div>
<p className="text-sm text-muted-foreground">
Keep this as your editable BuzzForm source file to back up,
share, and continue work later in BuzzForm Builder.
Includes Builder metadata and node ids to fully restore your
workspace exactly as-is.
</p>
<div className="mt-2 flex flex-wrap items-center gap-2">
<Button
Expand All @@ -190,7 +209,7 @@ export function ExportSheet() {
size={16}
strokeWidth={2}
/>
Download BuzzForm File
Download Builder Document
</Button>
</div>
</div>
Expand All @@ -201,6 +220,50 @@ export function ExportSheet() {
</div>
</ScrollArea>
</TabsContent>

<TabsContent
value="schema"
className="min-h-0 flex-1 overflow-hidden"
>
<ScrollArea className="h-full px-4 py-2">
<div className="space-y-3 p-1">
<div className="rounded-lg border bg-muted/30 p-3">
<div className="mb-3 flex items-center gap-2 text-sm font-medium">
<HugeiconsIcon
icon={File02Icon}
size={16}
strokeWidth={1.8}
className="text-muted-foreground"
/>
BuzzForm schema
</div>
<p className="text-sm text-muted-foreground">
Pure schema JSON for copy/paste import and runtime form
generation.
</p>
<div className="mt-2 flex flex-wrap items-center gap-2">
<Button
type="button"
variant="outline"
size="sm"
onClick={downloadSchema}
>
<HugeiconsIcon
icon={Download01Icon}
size={16}
strokeWidth={2}
/>
Download BuzzForm Schema
</Button>
</div>
</div>

<div className="[&_figure]:my-0!">
<DynamicCodeBlock lang="json" code={schemaJson} />
</div>
</div>
</ScrollArea>
</TabsContent>
</Tabs>
</SheetContent>
</Sheet>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export function FormManagerDialog() {
}
/>

<DialogContent className="sm:max-w-2xl">
<DialogContent className="sm:max-w-3xl">
<DialogHeader>
<DialogTitle>Forms</DialogTitle>
<DialogDescription>
Expand Down
Loading
Loading