@@ -3,17 +3,28 @@ import {useElementInteraction} from '../hooks/useElementInteraction';
3
3
import { Toolbar } from './Toolbar' ;
4
4
import { ComponentsSidebar } from './ComponentsSidebar' ;
5
5
import { PropertiesPanel } from './PropertiesPanel' ;
6
+ import PageSettingsPanel from './PageSettingsPanel' ;
6
7
import { ElementRenderer } from './ElementRenderer' ;
7
8
import PreviewMode from './PreviewMode' ;
8
9
import { componentsData } from '../constants/components' ;
9
- import { ComponentProps } from '../types' ;
10
+ import { ComponentProps , PageSettings } from '../types' ;
10
11
import { useEffect , useState } from 'react' ;
11
12
import { XCircle } from 'lucide-react' ;
12
13
14
+ const defaultPageSettings : PageSettings = {
15
+ responsive : true ,
16
+ width : 1200 ,
17
+ height : 800 ,
18
+ maxWidth : 'none' ,
19
+ bgColor : '#ffffff'
20
+ } ;
21
+
13
22
export default function Editor ( ) {
14
23
const [ isSaving , setIsSaving ] = useState ( false ) ;
15
24
const [ isLoading , setIsLoading ] = useState ( true ) ;
16
25
const [ error , setError ] = useState < string | null > ( null ) ;
26
+ const [ showPageSettings , setShowPageSettings ] = useState ( false ) ;
27
+ const [ pageSettings , setPageSettings ] = useState < PageSettings > ( defaultPageSettings ) ;
17
28
18
29
const {
19
30
isPreview,
@@ -50,9 +61,10 @@ export default function Editor() {
50
61
throw new Error ( data . error || 'Failed to load page content' ) ;
51
62
}
52
63
53
- if ( data . data && Array . isArray ( data . data . elements ) ) {
54
- setElements ( data . data . elements ) ;
55
- resetHistory ( data . data . elements ) ;
64
+ if ( data . data ) {
65
+ setElements ( data . data . elements || [ ] ) ;
66
+ setPageSettings ( data . data . settings || defaultPageSettings ) ;
67
+ resetHistory ( data . data . elements || [ ] ) ;
56
68
}
57
69
} catch ( error ) {
58
70
setError ( error instanceof Error ? error . message : 'Failed to load page content' ) ;
@@ -117,7 +129,8 @@ export default function Editor() {
117
129
elements : elements . map ( el => ( {
118
130
...el ,
119
131
id : Number ( el . id )
120
- } ) )
132
+ } ) ) ,
133
+ settings : pageSettings
121
134
} )
122
135
} ) ;
123
136
@@ -133,20 +146,9 @@ export default function Editor() {
133
146
}
134
147
} ;
135
148
136
- if ( isLoading ) {
137
- return (
138
- < div className = "h-screen flex items-center justify-center bg-gray-50" >
139
- < div className = "flex flex-col items-center space-y-4" >
140
- < div className = "w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full animate-spin" />
141
- < div className = "text-gray-600" > Loading editor content...</ div >
142
- </ div >
143
- </ div >
144
- ) ;
145
- }
146
-
147
- if ( isPreview ) {
148
- return < PreviewMode elements = { elements } onExitPreview = { ( ) => setIsPreview ( false ) } /> ;
149
- }
149
+ const handleUpdatePageSettings = ( newSettings : PageSettings ) => {
150
+ setPageSettings ( newSettings ) ;
151
+ } ;
150
152
151
153
const updateElementPosition = ( axis : 'x' | 'y' , value : number ) => {
152
154
const newElements = elements . map ( el =>
@@ -182,13 +184,52 @@ export default function Editor() {
182
184
addToHistory ( newElements ) ;
183
185
} ;
184
186
187
+ const getPageStyle = ( ) => {
188
+ if ( pageSettings . responsive ) {
189
+ return {
190
+ backgroundColor : pageSettings . bgColor ,
191
+ minHeight : '500px' ,
192
+ ...( pageSettings . maxWidth !== 'none' && { maxWidth : pageSettings . maxWidth } )
193
+ } ;
194
+ }
195
+
196
+ return {
197
+ width : `${ pageSettings . width } px` ,
198
+ height : `${ pageSettings . height } px` ,
199
+ backgroundColor : pageSettings . bgColor
200
+ } ;
201
+ } ;
202
+
203
+ if ( isLoading ) {
204
+ return (
205
+ < div className = "h-screen flex items-center justify-center bg-gray-50" >
206
+ < div className = "flex flex-col items-center space-y-4" >
207
+ < div className = "w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full animate-spin" />
208
+ < div className = "text-gray-600" > Loading editor content...</ div >
209
+ </ div >
210
+ </ div >
211
+ ) ;
212
+ }
213
+
214
+ if ( isPreview ) {
215
+ return (
216
+ < PreviewMode
217
+ elements = { elements }
218
+ pageSettings = { pageSettings }
219
+ onExitPreview = { ( ) => setIsPreview ( false ) }
220
+ />
221
+ ) ;
222
+ }
223
+
185
224
return (
186
225
< div className = "h-screen flex" >
187
226
< Toolbar
188
227
showSidebar = { showSidebar }
189
228
setShowSidebar = { setShowSidebar }
190
229
showProperties = { showProperties }
191
230
setShowProperties = { setShowProperties }
231
+ showPageSettings = { showPageSettings }
232
+ setShowPageSettings = { setShowPageSettings }
192
233
isPreview = { isPreview }
193
234
setIsPreview = { setIsPreview }
194
235
canUndo = { historyIndex > 0 }
@@ -220,9 +261,12 @@ export default function Editor() {
220
261
/>
221
262
) }
222
263
223
- < div className = "flex-1 bg-gray-50" >
224
- < div className = "max-w-4xl mx-auto p-8" >
225
- < div className = "relative min-h-[500px] bg-white rounded-lg shadow-sm border" >
264
+ < div className = "flex-1 bg-gray-50 overflow-auto" >
265
+ < div className = { `mx-auto p-8 ${ pageSettings . responsive ? pageSettings . maxWidth : '' } ` } >
266
+ < div
267
+ className = "relative rounded-lg shadow-sm border"
268
+ style = { getPageStyle ( ) }
269
+ >
226
270
{ elements . map ( element => (
227
271
< ElementRenderer
228
272
key = { element . id }
@@ -251,6 +295,14 @@ export default function Editor() {
251
295
onUpdateSize = { updateElementSize }
252
296
/>
253
297
) }
298
+
299
+ { showPageSettings && (
300
+ < PageSettingsPanel
301
+ settings = { pageSettings }
302
+ onUpdate = { handleUpdatePageSettings }
303
+ onClose = { ( ) => setShowPageSettings ( false ) }
304
+ />
305
+ ) }
254
306
</ div >
255
307
</ div >
256
308
) ;
0 commit comments