1+ <!doctype html>
2+ < html lang ="en ">
3+ < head >
4+ < meta charset ="UTF-8 ">
5+ < meta name ="viewport " content ="width=device-width, initial-scale=1.0 ">
6+ < title > Franz Lor Portfolio</ title >
7+ < link rel ="stylesheet " href ="/styles.css ">
8+
9+ <!-- Preload important resources -->
10+ < link rel ="preload " href ="/scripts/hamburger.js " as ="script ">
11+ < link rel ="preload " href ="/scripts/smooth-scrolling.js " as ="script ">
12+
13+ <!-- Favicons -->
14+ < link rel ="apple-touch-icon " sizes ="180x180 " href ="/icons/apple-touch-icon.png ">
15+ < link rel ="icon " type ="image/png " sizes ="32x32 " href ="/icons/favicon-32x32.png ">
16+ < link rel ="icon " type ="image/png " sizes ="16x16 " href ="/icons/favicon-16x16.png ">
17+ < link rel ="manifest " href ="/icons/site.webmanifest ">
18+
19+ < meta name ="msapplication-TileColor " content ="#da532c ">
20+ < meta name ="theme-color " content ="#ffffff ">
21+ </ head >
22+ < body >
23+ < header >
24+ < nav >
25+ <!-- Left side of the navbar -->
26+ < div class ="navbar-left ">
27+ < a href ="https://github.com/FranzLor " target ="_blank " rel ="noopener noreferrer ">
28+ < img src ="/icons/GitHubIcon.png " alt ="GitHub Profile Pic " width ="40 " height ="40 ">
29+ </ a >
30+ < span > FRANZ LOR</ span >
31+ </ div >
32+
33+ <!-- Right side of the navbar -->
34+ < div class ="navbar-right ">
35+ < a href ="/#about " class ="nav-link "> ABOUT</ a >
36+ < a href ="/#projects " class ="nav-link "> PROJECTS</ a >
37+ < a href ="/#devblog " class ="nav-link "> DEVBLOG</ a >
38+ < a href ="https://www.nexusmods.com/users/81433168/?tab=user+files " target ="_blank " rel ="noopener noreferrer " class ="nav-link "> MODS</ a >
39+ < a href ="/#contact " class ="nav-link "> CONTACT</ a >
40+ </ div >
41+
42+ < div class ="hamburger " id ="hamburger ">
43+ < span > </ span >
44+ < span > </ span >
45+ < span > </ span >
46+ </ div >
47+ </ nav >
48+ < div class ="mobile-menu " id ="mobileMenu ">
49+ < div class ="close-btn " id ="closeBtn "> </ div >
50+ < a href ="/#about " class ="mobile-nav-link "> ABOUT</ a >
51+ < a href ="/#projects " class ="mobile-nav-link "> PROJECTS</ a >
52+ < a href ="/#devblog " class ="mobile-nav-link "> DEVBLOG</ a >
53+ < a href ="https://www.nexusmods.com/users/81433168/?tab=user+files " target ="_blank " rel ="noopener noreferrer " class ="mobile-nav-link "> MODS</ a >
54+ < a href ="/#contact " class ="mobile-nav-link "> CONTACT</ a >
55+ </ div >
56+ </ header >
57+
58+ < main >
59+
60+ < section id ="about ">
61+ < h2 > HEY THERE, I'M FRANZ</ h2 >
62+ < h3 > < strong > I'm a programmer.</ strong > </ h3 > < br >
63+ < p >
64+ I have a passion for games—whether it's playing or learning all about them.< br >
65+ With this passion comes my motivation to develop< br >
66+ games using C++, C#, or with game engines.< br > < br >
67+ < strong > Check them out here</ strong > !
68+ </ p >
69+ < div class ="button-container ">
70+ < a href ="#projects " class ="btn "> PROJECTS</ a >
71+ </ div >
72+
73+ </ section >
74+
75+ < section id ="projects ">
76+ < h2 > PROJECTS</ h2 >
77+ < div class ="project-intro ">
78+ < p >
79+ Check out the projects I've worked on.< br >
80+ Each one carrying a unique learning experience.< br >
81+ < strong > Click on a project to learn more about it</ strong > .< br >
82+ </ p >
83+ </ div >
84+
85+ < div class ="projects-grid ">
86+
87+ </ div >
88+
89+ < div class ="project-conclusion ">
90+ < p >
91+ I'll be showcasing more projects in the future.< br >
92+ Meanwhile, check out the rest of my projects on my GitHub.
93+ </ p >
94+ < div class ="button-container ">
95+ < a href ="https://github.com/FranzLor?tab=repositories " class ="btn "> View All Projects</ a >
96+ </ div >
97+ </ div >
98+ </ section >
99+
100+ < section id ="devblog ">
101+ < h2 > DEVBLOG</ h2 >
102+ < div class ="devblog-intro ">
103+ < p >
104+ Dive into my development journey with tutorials and insights.< br >
105+ These articles cover different aspects of game development< br >
106+ such as coding patterns and game design.< br >
107+ < strong > Click on a devblog to read more about it.</ strong >
108+ </ p >
109+ </ div >
110+
111+ < div class ="devblog-grid ">
112+
113+ </ div >
114+ </ section >
115+
116+ < section id ="contact ">
117+ < div class ="contact-main ">
118+ < h2 > CONTACT</ h2 >
119+ < p >
120+ For career opportunities, game dev collaborations, and questions.< br >
121+ Feel free to contact me anytime and I'll get back to you.< br >
122+ </ p >
123+ < div class ="contact-form-container ">
124+ < form onsubmit ="return sendMail(); ">
125+ < label for ="name "> Name</ label >
126+ < input type ="text " id ="name " name ="name " required >
127+
128+ < label for ="email "> Email</ label >
129+ < input type ="email " id ="email " name ="email " required >
130+
131+ < label for ="subject "> Subject</ label >
132+ < input type ="text " id ="subject " name ="subject " required >
133+
134+ < label for ="message "> Message</ label >
135+ < textarea id ="message " name ="message " rows ="4 " required > </ textarea >
136+
137+ < button type ="submit " id ="button "> </ button >
138+ </ form >
139+ </ div >
140+ </ div >
141+ </ section >
142+
143+
144+ <!-- Mobile / Tablet Project Tile -->
145+ < script >
146+ // Add click event listener to all project tiles
147+ document . querySelectorAll ( '.project-tile' ) . forEach ( tile => {
148+ tile . addEventListener ( 'click' , function ( e ) {
149+ // Remove 'active' class from other tiles
150+ document . querySelectorAll ( '.project-tile.active' ) . forEach ( activeTile => {
151+ if ( activeTile !== tile ) {
152+ activeTile . classList . remove ( 'active' ) ;
153+ }
154+ } ) ;
155+
156+ // Toggle 'active' class on the clicked tile
157+ this . classList . toggle ( 'active' ) ;
158+ } ) ;
159+ } ) ;
160+ </ script >
161+
162+
163+ <!-- Contact Form Button Animation -->
164+ < script >
165+ document . addEventListener ( 'DOMContentLoaded' , function ( ) {
166+ const button = document . getElementById ( "button" ) ;
167+ const form = document . querySelector ( "form" ) ;
168+
169+ if ( button && form ) {
170+ button . addEventListener ( "click" , function ( event ) {
171+ if ( form . checkValidity ( ) ) {
172+ // Button animation
173+ button . classList . add ( "onclic" ) ;
174+
175+ setTimeout ( function ( ) {
176+ button . classList . remove ( "onclic" ) ;
177+ button . classList . add ( "validate" ) ;
178+
179+ setTimeout ( function ( ) {
180+ button . classList . remove ( "validate" ) ;
181+ } , 1250 ) ;
182+ } , 2250 ) ;
183+ } else {
184+ form . querySelector ( ":invalid" ) . focus ( ) ;
185+ }
186+ } ) ;
187+ }
188+ } ) ;
189+ </ script >
190+
191+ <!-- Smooth Scrolling from Clicks Script -->
192+ < script >
193+ document . addEventListener ( "DOMContentLoaded" , function ( ) {
194+ const smoothScrollLinks = document . querySelectorAll ( 'a[href^="#"]' ) ;
195+ smoothScrollLinks . forEach ( ( link ) => {
196+ link . addEventListener ( "click" , function ( e ) {
197+ e . preventDefault ( ) ;
198+
199+ const targetId = this . getAttribute ( "href" ) . substring ( 1 ) ;
200+ const targetElement = document . getElementById ( targetId ) ;
201+
202+ targetElement . scrollIntoView ( {
203+ behavior : "smooth" ,
204+ } ) ;
205+ } ) ;
206+ } ) ;
207+ } ) ;
208+ </ script >
209+ </ main >
210+
211+ < footer >
212+ < div class ="footer-container ">
213+ < div class ="footer-left ">
214+ < h2 > Franz Lor</ h2 >
215+ < p > A Portfolio</ p >
216+ </ div >
217+ < div class ="footer-right ">
218+ < a href ="https://www.linkedin.com/in/franz-lor-a19a04186/ " target ="_blank "> LinkedIn</ a >
219+ < a href ="https://github.com/FranzLor " target ="_blank "> GitHub</ a >
220+ < a href ="https://franzlor.itch.io/ " target ="_blank "> Itch.io</ a >
221+ < a href ="https://www.instagram.com/justfraaaanz/ " target ="_blank "> Instagram</ a >
222+ </ div >
223+ < div class ="footer-bottom ">
224+ < p > © Copyright 2025. Developed by Franz Lor.</ p >
225+ </ div >
226+ </ div >
227+ </ footer >
228+
229+ <!-- Load jQuery only if needed -->
230+
231+ < script src ="https://code.jquery.com/jquery-3.6.4.min.js "> </ script >
232+
233+
234+ <!-- Core scripts -->
235+ < script src ="/scripts/hamburger.js "> </ script >
236+ < script src ="/scripts/smooth-scrolling.js "> </ script >
237+
238+ <!-- Page-specific scripts -->
239+
240+ < script src ="/scripts/scroll-animations.js "> </ script >
241+ < script src ="/scripts/devblog-animations.js "> </ script >
242+ < script src ="/scripts/contact-button-animations.js "> </ script >
243+ < script src ="/scripts/navigation.js "> </ script >
244+
245+ < script src ="/scripts/validate.js "> </ script >
246+
247+ <!-- EmailJS only needed on homepage -->
248+ < script src ="https://smtpjs.com/v3/smtp.js "> </ script >
249+ < script type ="text/javascript " src ="https://cdn.jsdelivr.net/npm/@emailjs/browser@4/dist/email.min.js "> </ script >
250+
251+ </ body >
252+ </ html >
0 commit comments