@@ -3,6 +3,7 @@ import { SignIn, SignUp } from '@clerk/clerk-react'
33import { ThemeProvider , useTheme } from './context/ThemeContext'
44import { ToastProvider } from './context/ToastContext'
55import Navbar from './components/Navbar'
6+ import ScrollToTop from './components/ScrollToTop'
67import Landing from './pages/Landing'
78import UsernameSelection from './pages/UsernameSelection'
89import Onboarding from './pages/Onboarding'
@@ -14,106 +15,8 @@ import Analytics from './pages/Analytics'
1415import Premium from './pages/Premium'
1516import Portfolio from './pages/Portfolio'
1617import ProtectedRoute from './components/ProtectedRoute'
17-
18- // Clerk appearance config based on theme
19- const getClerkAppearance = ( theme ) => ( {
20- baseTheme : theme === 'dark' ? undefined : undefined ,
21- variables : {
22- colorPrimary : '#6366f1' ,
23- colorBackground : theme === 'dark' ? '#1e1e2a' : '#ffffff' ,
24- colorText : theme === 'dark' ? '#ffffff' : '#0f172a' ,
25- colorTextSecondary : theme === 'dark' ? '#a0a0b0' : '#475569' ,
26- colorInputBackground : theme === 'dark' ? '#1a1a25' : '#f1f5f9' ,
27- colorInputText : theme === 'dark' ? '#ffffff' : '#0f172a' ,
28- colorNeutral : theme === 'dark' ? '#a0a0b0' : '#475569' ,
29- borderRadius : '12px' ,
30- fontFamily : 'Inter, system-ui, sans-serif'
31- } ,
32- elements : {
33- rootBox : {
34- boxShadow : theme === 'dark'
35- ? '0 25px 50px -12px rgba(0, 0, 0, 0.5)'
36- : '0 25px 50px -12px rgba(0, 0, 0, 0.15)'
37- } ,
38- card : {
39- backgroundColor : theme === 'dark' ? '#1e1e2a' : '#ffffff' ,
40- border : theme === 'dark' ? '1px solid rgba(255,255,255,0.08)' : '1px solid rgba(0,0,0,0.08)' ,
41- boxShadow : 'none'
42- } ,
43- headerTitle : {
44- color : theme === 'dark' ? '#ffffff' : '#0f172a'
45- } ,
46- headerSubtitle : {
47- color : theme === 'dark' ? '#a0a0b0' : '#475569'
48- } ,
49- socialButtonsBlockButton : {
50- backgroundColor : theme === 'dark' ? '#12121a' : '#f8fafc' ,
51- border : theme === 'dark' ? '1px solid rgba(255,255,255,0.1)' : '1px solid rgba(0,0,0,0.1)' ,
52- color : theme === 'dark' ? '#ffffff' : '#0f172a' ,
53- '&:hover' : {
54- backgroundColor : theme === 'dark' ? '#1a1a25' : '#f1f5f9'
55- }
56- } ,
57- formFieldLabel : {
58- color : theme === 'dark' ? '#a0a0b0' : '#475569'
59- } ,
60- formFieldInput : {
61- backgroundColor : theme === 'dark' ? '#12121a' : '#f8fafc' ,
62- borderColor : theme === 'dark' ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.1)' ,
63- color : theme === 'dark' ? '#ffffff' : '#0f172a' ,
64- '&:focus' : {
65- borderColor : '#6366f1' ,
66- boxShadow : '0 0 0 3px rgba(99, 102, 241, 0.2)'
67- }
68- } ,
69- formButtonPrimary : {
70- background : 'linear-gradient(135deg, #6366f1, #a855f7)' ,
71- '&:hover' : {
72- background : 'linear-gradient(135deg, #4f46e5, #9333ea)'
73- }
74- } ,
75- footerActionLink : {
76- color : '#6366f1'
77- } ,
78- identityPreviewText : {
79- color : theme === 'dark' ? '#ffffff' : '#0f172a'
80- } ,
81- identityPreviewEditButton : {
82- color : '#6366f1'
83- } ,
84- formFieldHintText : {
85- color : theme === 'dark' ? '#6b6b7b' : '#94a3b8'
86- } ,
87- dividerLine : {
88- backgroundColor : theme === 'dark' ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.1)'
89- } ,
90- dividerText : {
91- color : theme === 'dark' ? '#6b6b7b' : '#94a3b8'
92- } ,
93- userButtonPopoverCard : {
94- backgroundColor : theme === 'dark' ? '#1e1e2a' : '#ffffff' ,
95- border : theme === 'dark' ? '1px solid rgba(255,255,255,0.08)' : '1px solid rgba(0,0,0,0.08)'
96- } ,
97- userButtonPopoverActionButton : {
98- color : theme === 'dark' ? '#ffffff' : '#0f172a' ,
99- '&:hover' : {
100- backgroundColor : theme === 'dark' ? '#12121a' : '#f1f5f9'
101- }
102- } ,
103- userButtonPopoverActionButtonText : {
104- color : theme === 'dark' ? '#ffffff' : '#0f172a'
105- } ,
106- userButtonPopoverActionButtonIcon : {
107- color : theme === 'dark' ? '#a0a0b0' : '#475569'
108- } ,
109- userPreviewMainIdentifier : {
110- color : theme === 'dark' ? '#ffffff' : '#0f172a'
111- } ,
112- userPreviewSecondaryIdentifier : {
113- color : theme === 'dark' ? '#a0a0b0' : '#475569'
114- }
115- }
116- } )
18+ import DashboardLayout from './components/DashboardLayout'
19+ import { getClerkAppearance } from './utils/clerkAppearance'
11720
11821// Layout wrapper that conditionally shows navbar
11922function AppLayout ( { children } ) {
@@ -133,12 +36,14 @@ function AppLayout({ children }) {
13336
13437 return (
13538 < >
136- { /* Background orbs */ }
137- < div className = "bg-orb orb-1" />
138- < div className = "bg-orb orb-2" />
139- < div className = "bg-orb orb-3" />
39+ { /* Background orbs — clipped so they never cause horizontal scroll */ }
40+ < div className = "orb-container" aria-hidden = "true" >
41+ < div className = "bg-orb orb-1" />
42+ < div className = "bg-orb orb-2" />
43+ < div className = "bg-orb orb-3" />
44+ </ div >
14045
141- < div className = "min-h-screen relative" >
46+ < div className = "min-h-screen relative overflow-x-clip " >
14247 { ! isPortfolioPage && < Navbar /> }
14348 { children }
14449 </ div >
@@ -152,7 +57,7 @@ function SignInPage() {
15257 const redirectUrl = location . state ?. from ?. pathname || '/dashboard'
15358
15459 return (
155- < div className = "min-h-screen flex items-center justify-center pt-20 " >
60+ < div className = "min-h-screen flex items-center justify-center pt-navbar " >
15661 < SignIn
15762 routing = "path"
15863 path = "/sign-in"
@@ -168,7 +73,7 @@ function SignInPage() {
16873function SignUpPage ( ) {
16974 const { theme } = useTheme ( )
17075 return (
171- < div className = "min-h-screen flex items-center justify-center pt-20 " >
76+ < div className = "min-h-screen flex items-center justify-center pt-navbar " >
17277 < SignUp
17378 routing = "path"
17479 path = "/sign-up"
@@ -199,36 +104,18 @@ function AppRoutes() {
199104 < Onboarding />
200105 </ ProtectedRoute >
201106 } />
202- < Route path = "/upload" element = {
203- < ProtectedRoute >
204- < ResumeUpload />
205- </ ProtectedRoute >
206- } />
207- < Route path = "/editor" element = {
208- < ProtectedRoute >
209- < ProfileEditor />
210- </ ProtectedRoute >
211- } />
212- < Route path = "/dashboard" element = {
213- < ProtectedRoute >
214- < Dashboard />
215- </ ProtectedRoute >
216- } />
217- < Route path = "/settings" element = {
218- < ProtectedRoute >
219- < Settings />
220- </ ProtectedRoute >
221- } />
222- < Route path = "/analytics" element = {
107+ < Route element = {
223108 < ProtectedRoute >
224- < Analytics />
109+ < DashboardLayout />
225110 </ ProtectedRoute >
226- } />
227- < Route path = "/premium" element = {
228- < ProtectedRoute >
229- < Premium />
230- </ ProtectedRoute >
231- } />
111+ } >
112+ < Route path = "/upload" element = { < ResumeUpload /> } />
113+ < Route path = "/editor" element = { < ProfileEditor /> } />
114+ < Route path = "/dashboard" element = { < Dashboard /> } />
115+ < Route path = "/settings" element = { < Settings /> } />
116+ < Route path = "/analytics" element = { < Analytics /> } />
117+ < Route path = "/premium" element = { < Premium /> } />
118+ </ Route >
232119
233120 { /* Public portfolio route - must be last */ }
234121 < Route path = "/:username" element = { < Portfolio /> } />
@@ -242,6 +129,7 @@ function App() {
242129 < ThemeProvider >
243130 < ToastProvider >
244131 < Router >
132+ < ScrollToTop />
245133 < AppRoutes />
246134 </ Router >
247135 </ ToastProvider >
0 commit comments