@@ -36,9 +36,10 @@ import { useIsMobile } from "@/hooks/use-mobile";
3636import SocialLinks from "@/components/form-builder/sidebar/socialLinks" ;
3737import { OpenJsonDialog } from "@/components/form-builder/dialogs/open-json-dialog" ;
3838import { useForm } from "react-hook-form" ;
39- import { getGridRows , updateColSpans } from "@/lib/utils" ;
39+ import { cn , getGridRows , updateColSpans } from "@/lib/utils" ;
4040import { RenderEditorComponent } from "@/components/form-builder/helpers/render-editor-component" ;
4141import { FormComponentModel } from "@/models/FormComponent" ;
42+ import { EditorToolbar } from "@/components/form-builder/form-components/wysiwyg/editor-toolbar" ;
4243
4344export default function FormBuilderPage ( ) {
4445 const isMobile = useIsMobile ( ) ;
@@ -60,7 +61,8 @@ export default function FormBuilderPage() {
6061 code : string ;
6162 dependenciesImports : DependenciesImports ;
6263 } > ( { code : "" , dependenciesImports : { } } ) ;
63- const [ draggingDOMElement , setDraggingDOMElement ] = useState < HTMLElement | null > ( null ) ;
64+ const [ draggingDOMElement , setDraggingDOMElement ] =
65+ useState < HTMLElement | null > ( null ) ;
6466 const form = useForm ( ) ;
6567
6668 // Memoize static values
@@ -85,7 +87,7 @@ export default function FormBuilderPage() {
8587 const moveComponent = useFormBuilderStore ( ( state ) => state . moveComponent ) ;
8688 const addComponent = useFormBuilderStore ( ( state ) => state . addComponent ) ;
8789 const gridRows = getGridRows ( components , viewport ) ;
88-
90+ const editor = useFormBuilderStore ( ( state ) => state . editor ) ;
8991 const handleGenerateCode = async ( ) => {
9092 const generatedCode = await generateFormCode ( components ) ;
9193 setGeneratedCode ( generatedCode ) ;
@@ -99,12 +101,8 @@ export default function FormBuilderPage() {
99101 } ,
100102 } ) ;
101103
102-
103104 // Memoize sensors array
104- const sensors = useMemo (
105- ( ) => [ pointerSensor ] ,
106- [ pointerSensor ]
107- ) ;
105+ const sensors = useMemo ( ( ) => [ pointerSensor ] , [ pointerSensor ] ) ;
108106
109107 // Memoize drag end handler
110108 const handleDragEnd = ( event : any ) => {
@@ -223,7 +221,9 @@ export default function FormBuilderPage() {
223221 const handleDragStart = useCallback (
224222 ( event : DragStartEvent ) => {
225223 selectComponent ( null ) ;
226- const element = document . querySelector ( `[data-item-id="${ event . active . data . current ?. component . id } "]` ) ;
224+ const element = document . querySelector (
225+ `[data-item-id="${ event . active . data . current ?. component . id } "]`
226+ ) ;
227227 if ( element ) {
228228 setDraggingDOMElement ( element as HTMLElement ) ;
229229 }
@@ -233,7 +233,7 @@ export default function FormBuilderPage() {
233233
234234 return (
235235 < div >
236- < div className = "fixed top-0 w-full flex flex-row gap-2 justify-between bg-white border-b z-10 " >
236+ < div className = "fixed top-0 w-full flex flex-row gap-2 justify-between bg-white border-b z-30 " >
237237 < div className = "flex flex-row gap-2 items-center justify-center md:justify-start p-2 px-4 border-r w-full md:w-[300px]" >
238238 < BlocksIcon className = "h-6 w-6" strokeWidth = { 2 } />
239239 < h2 className = "text-lg font-semibold" >
@@ -243,24 +243,35 @@ export default function FormBuilderPage() {
243243 </ sup >
244244 </ h2 >
245245 </ div >
246- < div className = "p-2 flex-1 grid-cols-2 xl:grid-cols-3 hidden md:grid" >
247- < div className = "hidden xl:block col-span-1" >
246+ < div className = "p-2 flex-1 grid grid-cols-7 2xl:grid-cols-3" >
247+ < div
248+ className = { cn ( "hidden 2xl:block col-span-1" , editor && "2xl:hidden" ) }
249+ >
248250 { process . env . NODE_ENV === "development" && < OpenJsonDialog /> }
249251 </ div >
250- < div className = "col-span-1 flex xl:justify-center" >
251- < div className = " text-center flex flex-row items-center justify-center gap-1 border rounded-md h-9 px-4" >
252- < div
253- className = "max-w-80 overflow-y-hidden whitespace-nowrap text-sm outline-none scrollbar-hide"
254- contentEditable
255- suppressContentEditableWarning
256- onBlur = { ( e ) => updateFormTitle ( e . target . innerText ) }
257- >
258- { formTitle }
252+ < div className = "col-span-5 2xl:col-span-1 2xl:col-start-2 flex 2xl:justify-center" >
253+ { editor ? (
254+ < EditorToolbar editor = { editor } isEditable = { true } />
255+ ) : (
256+ < div className = "text-center flex flex-row items-center justify-center gap-1 border rounded-md h-9 px-4" >
257+ < div
258+ className = "max-w-80 overflow-y-hidden whitespace-nowrap text-sm outline-none scrollbar-hide"
259+ contentEditable
260+ suppressContentEditableWarning
261+ onBlur = { ( e ) => updateFormTitle ( e . target . innerText ) }
262+ >
263+ { formTitle }
264+ </ div >
265+ < span className = "text-muted-foreground text-xs" > .tsx</ span >
259266 </ div >
260- < span className = "text-muted-foreground text-xs" > .tsx</ span >
261- </ div >
267+ ) }
262268 </ div >
263- < div className = "col-span-1 hidden md:flex justify-end gap-4 " >
269+ < div
270+ className = { cn (
271+ "col-span-2 2xl:col-span-1 hidden md:flex justify-end gap-4" ,
272+ editor && ""
273+ ) }
274+ >
264275 { process . env . NODE_ENV === "development" && (
265276 < Button
266277 variant = "ghost"
@@ -335,7 +346,12 @@ export default function FormBuilderPage() {
335346 < DragOverlay >
336347 { draggingDOMElement && (
337348 < div className = "bg-white p-2 rounded-md shadow opacity-80" >
338- < div dangerouslySetInnerHTML = { { __html : draggingDOMElement . innerHTML } } className = "max-h-52 overflow-hidden" />
349+ < div
350+ dangerouslySetInnerHTML = { {
351+ __html : draggingDOMElement . innerHTML ,
352+ } }
353+ className = "max-h-52 overflow-hidden"
354+ />
339355 </ div >
340356 ) }
341357 </ DragOverlay >
0 commit comments