@@ -164,7 +164,8 @@ function EarnDemo() {
164
164
export function LiveDemo ( ) {
165
165
const [ theme , setTheme ] = useState < 'light' | 'dark' > ( 'dark' ) ;
166
166
const [ isMounted , setIsMounted ] = useState ( false ) ;
167
- // const [highlightedCode, setHighlightedCode] = useState('');
167
+ const [ content , setContent ] = useState < 'code' | 'preview' > ( 'code' ) ;
168
+ const [ isComponentMenuOpen , setIsComponentMenuOpen ] = useState ( false ) ;
168
169
const [ activeTab , setActiveTab ] = useState < Tab > ( 'onboard' ) ;
169
170
const [ copied , setCopied ] = useState ( false ) ;
170
171
@@ -235,26 +236,145 @@ export function LiveDemo() {
235
236
return (
236
237
< section className = "w-full" >
237
238
< style > { styles } </ style >
238
- < div className = "mb-9 flex flex-row gap-2" >
239
+ < div className = "mb-9 flex flex-col gap-2 md:flex-row " >
239
240
< Title level = { TitleLevel . Title1 } > Try it out!</ Title >
240
241
< Title level = { TitleLevel . Title1 } className = "text-dark-palette-foregroundMuted" >
241
242
Experience how easy it is to build on Base.
242
243
</ Title >
243
244
</ div >
244
245
< div
245
246
className = { classNames (
246
- 'rounded-xl border transition-colors' ,
247
+ 'relative rounded-xl border transition-colors' ,
247
248
theme === 'dark'
248
249
? 'border-dark-palette-line/50 bg-black'
249
250
: 'border-dark-palette-line/50 bg-white' ,
250
251
) }
251
252
>
253
+ { isComponentMenuOpen && (
254
+ < div
255
+ className = { classNames (
256
+ 'md:hidden' ,
257
+ 'h-full w-3/4 p-6' ,
258
+ 'absolute right-0 top-0 z-10' ,
259
+ 'border-l border-palette-lineHeavy/65' ,
260
+ 'rounded-r-xl' ,
261
+ 'font-medium' ,
262
+ theme === 'dark' ? 'bg-palette-foreground' : 'bg-white' ,
263
+ ) }
264
+ >
265
+ < div className = "flex w-full flex-col items-start space-y-4 px-1" >
266
+ < div className = "flex w-full justify-between" >
267
+ < button
268
+ type = "button"
269
+ onClick = { ( ) => {
270
+ setActiveTab ( 'onboard' ) ;
271
+ setIsComponentMenuOpen ( false ) ;
272
+ } }
273
+ className = { classNames (
274
+ 'whitespace-nowrap rounded-lg text-base font-medium transition-colors' ,
275
+ activeTab === 'onboard' ? buttonClasses . active : buttonClasses . inactive ,
276
+ ) }
277
+ >
278
+ Sign in
279
+ </ button >
280
+ < button
281
+ type = "button"
282
+ aria-label = "Close component menu"
283
+ onClick = { ( ) => setIsComponentMenuOpen ( false ) }
284
+ className = { classNames (
285
+ 'rounded-lg p-2' ,
286
+ theme === 'dark' ? 'text-white' : 'text-dark-palette-backgroundAlternate' ,
287
+ ) }
288
+ >
289
+ < Icon name = "close" color = "currentColor" width = { 16 } height = { 16 } />
290
+ </ button >
291
+ </ div >
292
+ < button
293
+ type = "button"
294
+ onClick = { ( ) => {
295
+ setActiveTab ( 'onramp' ) ;
296
+ setIsComponentMenuOpen ( false ) ;
297
+ } }
298
+ className = { classNames (
299
+ 'whitespace-nowrap rounded-lg text-base font-medium transition-colors' ,
300
+ activeTab === 'onramp' ? buttonClasses . active : buttonClasses . inactive ,
301
+ ) }
302
+ >
303
+ Onramp
304
+ </ button >
305
+ < button
306
+ type = "button"
307
+ onClick = { ( ) => {
308
+ setActiveTab ( 'pay' ) ;
309
+ setIsComponentMenuOpen ( false ) ;
310
+ } }
311
+ className = { classNames (
312
+ 'whitespace-nowrap rounded-lg text-base font-medium transition-colors' ,
313
+ activeTab === 'pay' ? buttonClasses . active : buttonClasses . inactive ,
314
+ ) }
315
+ >
316
+ Pay
317
+ </ button >
318
+ < button
319
+ type = "button"
320
+ onClick = { ( ) => {
321
+ setActiveTab ( 'swap' ) ;
322
+ setIsComponentMenuOpen ( false ) ;
323
+ } }
324
+ className = { classNames (
325
+ 'whitespace-nowrap rounded-lg text-base font-medium transition-colors' ,
326
+ activeTab === 'swap' ? buttonClasses . active : buttonClasses . inactive ,
327
+ ) }
328
+ >
329
+ Swap
330
+ </ button >
331
+ < button
332
+ type = "button"
333
+ onClick = { ( ) => {
334
+ setActiveTab ( 'earn' ) ;
335
+ setIsComponentMenuOpen ( false ) ;
336
+ } }
337
+ className = { classNames (
338
+ 'whitespace-nowrap rounded-lg text-base font-medium transition-colors' ,
339
+ activeTab === 'earn' ? buttonClasses . active : buttonClasses . inactive ,
340
+ ) }
341
+ >
342
+ Earn yield
343
+ </ button >
344
+ </ div >
345
+ </ div >
346
+ ) }
252
347
< div
253
- className = { `flex items-center justify-between border-b py-2 pl-6 pr-2 transition-colors ${
254
- theme === 'dark' ? 'border-dark-palette-line/50' : 'border-dark-palette-line/50'
255
- } `}
348
+ className = { classNames (
349
+ 'flex items-center justify-between border-b py-2 pl-6 pr-2 transition-colors' ,
350
+ theme === 'dark' ? 'border-dark-palette-line/50' : 'border-dark-palette-line/50' ,
351
+ ) }
256
352
>
257
- < div className = "no-scrollbar flex items-center space-x-8 overflow-x-auto" >
353
+ < div className = "no-scrollbar flex items-center space-x-8 overflow-x-auto md:hidden" >
354
+ < div className = "flex space-x-8 px-1" >
355
+ < button
356
+ type = "button"
357
+ onClick = { ( ) => setContent ( 'code' ) }
358
+ className = { classNames (
359
+ 'whitespace-nowrap rounded-lg text-base font-medium transition-colors' ,
360
+ content === 'code' ? buttonClasses . active : buttonClasses . inactive ,
361
+ ) }
362
+ >
363
+ Code
364
+ </ button >
365
+ < button
366
+ type = "button"
367
+ onClick = { ( ) => setContent ( 'preview' ) }
368
+ className = { classNames (
369
+ 'whitespace-nowrap rounded-lg text-base font-medium transition-colors' ,
370
+ content === 'preview' ? buttonClasses . active : buttonClasses . inactive ,
371
+ ) }
372
+ >
373
+ Preview
374
+ </ button >
375
+ </ div >
376
+ </ div >
377
+ < div className = "no-scrollbar hidden items-center space-x-8 overflow-x-auto md:flex" >
258
378
< div className = "flex space-x-8 px-1" >
259
379
< button
260
380
type = "button"
@@ -314,7 +434,7 @@ export function LiveDemo() {
314
434
type = "button"
315
435
onClick = { handleCopy }
316
436
className = { classNames (
317
- 'rounded-lg border p-2 transition-colors' ,
437
+ 'hidden rounded-lg border p-2 transition-colors md:block ' ,
318
438
theme === 'dark'
319
439
? 'border-dark-palette-line/50 hover:bg-white/10'
320
440
: 'border-dark-palette-line/50 text-dark-palette-backgroundAlternate hover:bg-white/10' ,
@@ -328,6 +448,25 @@ export function LiveDemo() {
328
448
< Icon name = "copy" color = "currentColor" width = { 16 } height = { 16 } />
329
449
) }
330
450
</ button >
451
+ < button
452
+ type = "button"
453
+ aria-label = "Toggle component menu"
454
+ onClick = { ( ) => setIsComponentMenuOpen ( ( prev ) => ! prev ) }
455
+ className = { classNames (
456
+ 'rounded-lg border p-2 transition-colors md:hidden' ,
457
+ theme === 'dark'
458
+ ? 'border-dark-palette-line/50 hover:bg-white/10'
459
+ : 'border-dark-palette-line/50 text-dark-palette-backgroundAlternate hover:bg-white/10' ,
460
+ ) }
461
+ >
462
+ < div
463
+ className = { classNames (
464
+ theme === 'dark' ? 'text-white' : 'text-dark-palette-backgroundAlternate' ,
465
+ ) }
466
+ >
467
+ < Icon name = "hamburger" color = "currentColor" width = { 16 } height = { 16 } />
468
+ </ div >
469
+ </ button >
331
470
< button
332
471
type = "button"
333
472
onClick = { toggleTheme }
@@ -347,7 +486,28 @@ export function LiveDemo() {
347
486
</ div >
348
487
</ div >
349
488
350
- < div className = "grid grid-cols-1 lg:grid-cols-2" >
489
+ < div className = "grid grid-cols-1 text-xs md:hidden" >
490
+ { content === 'preview' ? (
491
+ < div
492
+ className = { classNames (
493
+ 'h-[300px] p-8 lg:h-[500px] lg:p-12' ,
494
+ 'border-b lg:border-b-0 lg:border-r' ,
495
+ 'flex items-center justify-center transition-colors' ,
496
+ 'overflow-visible' ,
497
+ theme === 'dark' ? 'border-dark-palette-line/50' : 'border-dark-palette-line/50' ,
498
+ ) }
499
+ >
500
+ < DynamicCryptoProviders > { demoComponent } </ DynamicCryptoProviders >
501
+ </ div >
502
+ ) : (
503
+ < div className = "h-[300px] p-6" >
504
+ < div className = { `${ theme } relative h-full` } >
505
+ < DynamicCodeSnippet code = { codeSnippets [ activeTab ] } />
506
+ </ div >
507
+ </ div >
508
+ ) }
509
+ </ div >
510
+ < div className = "hidden grid-cols-1 md:grid lg:grid-cols-2" >
351
511
< div
352
512
className = { classNames (
353
513
'h-[300px] p-8 lg:h-[500px] lg:p-12' ,
0 commit comments