1- import React from 'react' ;
2- import './App.css ';
1+ // src/App.tsx
2+ import React , { useState } from 'react ';
33import { BrowserRouter as Router , Routes , Route , NavLink } from 'react-router-dom' ;
4+ import './App.css' ;
5+ import TopNav from './components/TopNav' ;
46import MyProfile from './components/MyProfile' ;
57import Policies from './components/Policies' ;
68import Achievements from './components/Achievements' ;
79import Announcement from './components/Announcement' ;
810import Organization from './components/Organization' ;
911import EmployeeInfo from './components/EmployeeInfo' ;
1012
13+ // Extend CSSProperties so TS accepts our custom CSS variables
14+ type LayoutCSSVars = React . CSSProperties & {
15+ [ '--sidebar-expanded' ] ?: string ;
16+ [ '--sidebar-collapsed' ] ?: string ;
17+ [ '--header-h' ] ?: string ;
18+ [ '--sidebar-current-width' ] ?: string ;
19+ } ;
20+
1121function App ( ) {
22+ // Layout constants
23+ const SIDEBAR_WIDTH = 240 ;
24+ const SIDEBAR_WIDTH_COLLAPSED = 72 ;
25+ const HEADER_HEIGHT = 56 ;
26+
27+ // UI state
28+ const [ sidebarCollapsed , setSidebarCollapsed ] = useState ( false ) ;
29+ const [ mobileSidebarOpen , setMobileSidebarOpen ] = useState ( false ) ;
30+
31+ // CSS vars consumed by App.css
32+ const layoutVars : LayoutCSSVars = {
33+ '--sidebar-expanded' : `${ SIDEBAR_WIDTH } px` ,
34+ '--sidebar-collapsed' : `${ SIDEBAR_WIDTH_COLLAPSED } px` ,
35+ '--header-h' : `${ HEADER_HEIGHT } px` ,
36+ '--sidebar-current-width' : sidebarCollapsed
37+ ? `${ SIDEBAR_WIDTH_COLLAPSED } px`
38+ : `${ SIDEBAR_WIDTH } px` ,
39+ } ;
40+
41+ const toggleDesktopSidebar = ( ) => setSidebarCollapsed ( ( v ) => ! v ) ;
42+ const toggleMobileSidebar = ( ) => setMobileSidebarOpen ( ( v ) => ! v ) ;
1243
1344 return (
14- < div className = "xyz-management" >
45+ < div
46+ className = { `app-layout ${ sidebarCollapsed ? 'sidebar-is-collapsed' : '' } ${
47+ mobileSidebarOpen ? 'mobile-sidebar-is-open' : ''
48+ } `}
49+ style = { layoutVars }
50+ >
1551 < Router >
16- < div className = "xyz-management-content" style = { { width : '100%' } } >
17- < div className = "row" >
18- < div className = "col-md-2 sidebar" >
19- < div className = 'sidebar-brand' >
20- < div className = "title" > NexGen7 Software</ div >
21- < span className = "e-icons e-line-very-small" > </ span >
22- </ div >
23- < ul className = "nav flex-column" >
24- < li className = "nav-item" >
25- < NavLink className = "nav-link" to = "/" >
26- My Profile
27- </ NavLink >
28- </ li >
29- < li className = "nav-item" >
30- < NavLink className = "nav-link" to = "/organization" >
31- Organization
32- </ NavLink >
33- </ li >
34- < li className = "nav-item" >
35- < NavLink className = "nav-link" to = "/policies" >
36- Policies
37- </ NavLink >
38- </ li >
39- < li className = "nav-item" >
40- < NavLink className = "nav-link" to = "/achievements" >
41- Achievements
42- </ NavLink >
43- </ li >
44- < li className = "nav-item" >
45- < NavLink className = "nav-link" to = "/announcement" >
46- Announcement
47- </ NavLink >
48- </ li >
49- </ ul >
50- </ div >
51- < div className = "col-md-10 main-content" >
52- < Routes >
53- < Route path = "/" element = { < MyProfile /> } />
54- < Route path = "/organization" element = { < Organization /> } />
55- < Route path = "/policies" element = { < Policies /> } />
56- < Route path = "/achievements" element = { < Achievements /> } />
57- < Route path = "/announcement" element = { < Announcement /> } />
58- < Route path = "/employeeinfo" element = { < EmployeeInfo /> } />
59- </ Routes >
60- </ div >
52+ < TopNav
53+ companyName = "Syncfusion Software"
54+ userFullName = "Test Person"
55+ sidebarWidth = { SIDEBAR_WIDTH }
56+ collapsedSidebarWidth = { SIDEBAR_WIDTH_COLLAPSED }
57+ sidebarCollapsed = { sidebarCollapsed }
58+ onToggleSidebar = { toggleDesktopSidebar }
59+ onSearch = { ( q ) => console . log ( 'Search:' , q ) }
60+ />
61+
62+ { /* Sidebar */ }
63+ < aside className = "app-sidebar" role = "navigation" aria-label = "Main" >
64+ < div className = "sidebar-brand" >
65+ < div className = "title" > HR Portal</ div >
66+ < span className = "e-icons e-line-very-small" > </ span >
6167 </ div >
62- </ div >
68+
69+ < ul className = "nav flex-column" >
70+ < li className = "nav-item" >
71+ < NavLink className = "nav-link" to = "/" end > My Profile</ NavLink >
72+ </ li >
73+ < li className = "nav-item" >
74+ < NavLink className = "nav-link" to = "/organization" > Organization</ NavLink >
75+ </ li >
76+ < li className = "nav-item" >
77+ < NavLink className = "nav-link" to = "/policies" > Policies</ NavLink >
78+ </ li >
79+ < li className = "nav-item" >
80+ < NavLink className = "nav-link" to = "/achievements" > Achievements</ NavLink >
81+ </ li >
82+ < li className = "nav-item" >
83+ < NavLink className = "nav-link" to = "/announcement" > Announcement</ NavLink >
84+ </ li >
85+ </ ul >
86+ </ aside >
87+
88+ { /* Main content */ }
89+ < main className = "app-main" >
90+ < Routes >
91+ < Route path = "/" element = { < MyProfile /> } />
92+ < Route path = "/organization" element = { < Organization /> } />
93+ < Route path = "/policies" element = { < Policies /> } />
94+ < Route path = "/achievements" element = { < Achievements /> } />
95+ < Route path = "/announcement" element = { < Announcement /> } />
96+ < Route path = "/employeeinfo" element = { < EmployeeInfo /> } />
97+ </ Routes >
98+ </ main >
6399 </ Router >
64100 </ div >
65101 ) ;
66102}
67103
68- export default App ;
104+ export default App ;
0 commit comments