1- import { Button , Tabs , Dropdown , Menu , Space } from "antd" ;
1+ import { Button , Tabs , Dropdown , Menu , Space } from "antd" ; // Restored Menu
22const { TabPane } = Tabs ;
3- import { DownOutlined , PlayCircleOutlined } from "@ant-design/icons" ;
3+ import { DownOutlined , PlayCircleOutlined , FullscreenOutlined , FullscreenExitOutlined } from "@ant-design/icons" ;
4+ import { useIsMobile } from "./useIsMobile" ;
5+ import React , { useState , useEffect } from 'react' ; // Added useEffect
46import preinstalled_programs from "../utils/preinstalled_programs" ;
57import dynamic from 'next/dynamic'
68const Editor = dynamic ( import ( './Editor' ) , {
79 ssr : false
810} )
911
1012function TextBox ( { disabled, sourceCode, setSourceCode, exampleName, setExampleName, activeTab, handleUserTabChange, myHeight } ) {
13+ const isMobile = useIsMobile ( ) ; // ADDED THIS
14+ // ADDED THIS FUNCTION
15+ const [ isFullScreen , setIsFullScreen ] = useState ( false ) ;
16+
17+ // Listen for fullscreen changes (Esc key, browser buttons, etc.)
18+ useEffect ( ( ) => {
19+ const handler = ( ) => setIsFullScreen ( ! ! document . fullscreenElement ) ;
20+ document . addEventListener ( "fullscreenchange" , handler ) ;
21+ return ( ) => document . removeEventListener ( "fullscreenchange" , handler ) ;
22+ } , [ ] ) ;
23+
24+ const handleFullScreen = ( ) => {
25+ if ( ! document . fullscreenElement ) {
26+ document . documentElement . requestFullscreen ( ) ;
27+ } else {
28+ document . exitFullscreen ( ) ;
29+ }
30+ } ;
31+
1132 var menu_items = [ ] ;
1233 for ( let category in preinstalled_programs ) {
1334 var category_examples = [ ]
@@ -31,27 +52,57 @@ function TextBox({ disabled, sourceCode, setSourceCode, exampleName, setExampleN
3152
3253 const examples_menu = ( < Menu items = { menu_items } > </ Menu > ) ;
3354 const extraOperations = {
34- right : < Button disabled = { disabled } onClick = { ( ) => handleUserTabChange ( activeTab ) } > < PlayCircleOutlined /> Run </ Button > ,
35- left : < Dropdown overlay = { examples_menu } trigger = "hover" >
55+ right : (
56+ < Space >
57+ < Button
58+ onClick = { handleFullScreen }
59+ icon = { isFullScreen ? < FullscreenExitOutlined /> : < FullscreenOutlined /> }
60+ >
61+ { /* Now both text options only show on desktop, keeping mobile clean */ }
62+ { ! isMobile && ( isFullScreen ? " Exit Fullscreen" : " Fullscreen" ) }
63+ </ Button >
64+ < Button
65+ disabled = { disabled }
66+ onClick = { ( ) => handleUserTabChange ( activeTab ) }
67+ icon = { < PlayCircleOutlined /> }
68+ >
69+ Run
70+ </ Button >
71+ </ Space >
72+ ) ,
73+ left : (
74+ < Dropdown menu = { { items : menu_items } } trigger = { [ "hover" ] } >
3675 < a onClick = { ( e ) => e . preventDefault ( ) } >
37- < Space style = { { marginRight : "10px" } } >
38- Examples < DownOutlined />
76+ < Space style = { { marginRight : "10px" } } >
77+ { ! isMobile && " Examples" } < DownOutlined />
3978 </ Space >
4079 </ a >
4180 </ Dropdown >
81+ )
4282 } ;
4383
44- return (
45- < div className = "card-container" style = { { height : "100%" } } >
46- < Tabs tabBarExtraContent = { extraOperations } style = { { height : "100%" } } >
47- < TabPane tab = { `${ exampleName } .f90` } key = "1" style = { { height : myHeight } } >
84+ const tabItems = [
85+ {
86+ key : '1' ,
87+ label : `${ exampleName } .f90` ,
88+ children : (
89+ < div style = { { height : myHeight } } >
4890 < Editor
4991 sourceCode = { sourceCode }
5092 setSourceCode = { setSourceCode }
5193 />
52- </ TabPane >
94+ </ div >
95+ ) ,
96+ } ,
97+ ] ;
5398
54- </ Tabs >
99+ return (
100+ < div className = "card-container" style = { { height : "100%" } } >
101+ < Tabs
102+ tabBarExtraContent = { extraOperations }
103+ style = { { height : "100%" } }
104+ items = { tabItems } // UPDATED TO MODERN SYNTAX
105+ />
55106 </ div >
56107 ) ;
57108}
0 commit comments