···11import gleam/dict
22import gleam/list
33+import homepage/stuff.{type Element, type Route}
34import lustre/attribute.{attribute}
44-import lustre/element.{type Element}
55+import lustre/element
56import lustre/element/html
6777-pub fn view(in_dutch: Bool) -> Element(a) {
88+// #(keyname, #(eng,dut))
99+const translations = [
1010+ #("langswitch", #("🇳🇱 NL", "🇬🇧 EN")),
1111+ #("header-summary", #("About", "Over")),
1212+ #("header-profiles", #("Profiles", "Online")),
1313+ #("header-interests", #("Interests", "Interesses")),
1414+ #("header-skills", #("Skills", "Vaardigheden")),
1515+ #("header-experience", #("Experience", "Ervaring")),
1616+ #("subheader-experience-older", #("Earlier", "Eerder")),
1717+ #("header-education", #("Education", "Opleidingen")),
1818+ #("header-languages", #("Languages", "Talen")),
1919+ #("lang-dut", #("Dutch", "Nederlands")),
2020+ #("lang-eng", #("English", "Engels")),
2121+ #("word-native", #("Native.", "Moedertaal.")),
2222+ #(
2323+ "cambridge-daily",
2424+ #(
2525+ "Daily speaker, Cambridge C1 level.",
2626+ "Dagelijkse spreker, Cambridge C1 niveau.",
2727+ ),
2828+ ),
2929+ #("date-2/'26", #("February 2026", "Februari 2026")),
3030+ #("attribution-1", #("Based on the design from ", "Ontworpen naar ")),
3131+ #("attribution-2", #(", delivered in Gleam. ", ", uitgevoerd in Gleam. ")),
3232+ #("present", #("Present", "Heden")),
3333+ #(
3434+ "education-fontys-institute",
3535+ #("Fontys University of Applied Sciences", "Fontys Hogeschool"),
3636+ ),
3737+ #("education-fontys-level", #("Bachelor", "HBO/Bachelor")),
3838+ #(
3939+ "education-fontys-orientation",
4040+ #("ICT / Software Engineering", "ICT / Software Engineering"),
4141+ ),
4242+ #("education-fontys-summary", #("", "")),
4343+ #(
4444+ "education-kw1c-institute",
4545+ #("Koning Willem 1 College", "Koning Willem 1 College, Den Bosch"),
4646+ ),
4747+ #("education-kw1c-level", #("College", "MBO 4+")),
4848+ #(
4949+ "education-kw1c-orientation",
5050+ #("Software Development", "Softwareontwikkeling"),
5151+ ),
5252+ #(
5353+ "education-kw1c-period",
5454+ #("February 2024 - January 2026", "Februari 2024 - Januari 2026"),
5555+ ),
5656+ #(
5757+ "education-kw1c-summary",
5858+ #(
5959+ "Finished with submodule certificates before switching to Fontys.",
6060+ "Afgerond met deelcertificaten voor mijn afslag naar Fontys.",
6161+ ),
6262+ ),
6363+ #("education-bs-institute", #("Berkenschutse", "De Berkenschutse, Heeze")),
6464+ #("education-bs-level", #("MAVO/HAVO", "MAVO/HAVO")),
6565+ #(
6666+ "education-bs-orientation",
6767+ #(
6868+ "Theoretical learning path / Economics and Society (E&M)",
6969+ "Theoretische leerweg / Economie en Maatschappij (E&M)",
7070+ ),
7171+ ),
7272+ #(
7373+ "education-bs-period",
7474+ #("February 2024 - January 2026", "Februari 2024 - Januari 2026"),
7575+ ),
7676+ #("education-bs-summary", #("", "")),
7777+ #(
7878+ "education-stercollege-institute",
7979+ #("Ster College", "Ster College Eindhoven"),
8080+ ),
8181+ #("education-stercollege-level", #("HAVO", "HAVO/VAVO")),
8282+ #(
8383+ "education-stercollege-orientation",
8484+ #("Culture and society (C&M)", "Cultuur en maatschappij (C&M)"),
8585+ ),
8686+ #("education-stercollege-summary", #("", "")),
8787+ #("education-roc-institute", #("ROC", "ROC Tilburg")),
8888+ #("education-roc-level", #("College", "MBO4")),
8989+ #(
9090+ "education-roc-orientation",
9191+ #("Social / Disability Care", "Maatschappelijke Zorg"),
9292+ ),
9393+ #("education-roc-summary", #("", "")),
9494+ #("experience-asml-internship-title", #("ASML", "ASML")),
9595+ #(
9696+ "experience-asml-internship-tagline",
9797+ #("Internship software engineering", "Stage als software engineer"),
9898+ ),
9999+ #(
100100+ "experience-asml-internship-summary",
101101+ #(
102102+ "This internship solidified my passion for software architecture and inspired me to switch from college to pursuing a Bachelor’s degree at Fontys University.",
103103+ "Deze stage heeft mijn passie voor softwarearchitectuur bevestigd en me geïnspireerd om van het mbo over te stappen naar een hbo-opleiding aan Fontys Hogeschool.",
104104+ ),
105105+ ),
106106+ #("experience-maintain-oss-title", #("", "")),
107107+ #(
108108+ "experience-maintain-oss-tagline",
109109+ #(
110110+ "Contributing to and developing Open-Source Software.",
111111+ "Bijdragen aan en ontwikkeling van open-source-software.",
112112+ ),
113113+ ),
114114+ #(
115115+ "experience-maintain-oss-summary",
116116+ #(
117117+ "Maintenance and development of multiple small-scale open-source-software projects some of those in use at small to mid-sized companies.",
118118+ "Maintainer meerdere kleinschalige opensourcesoftwareprojecten met gebruiken door kleinere tot middelgrote bedrijven.",
119119+ ),
120120+ ),
121121+ #(
122122+ "experience-maintain-oss-location",
123123+ #("Online and at meets", "Online en bij congressen"),
124124+ ),
125125+ #("experience-ksf-title", #("Korean Soul Food", "Korean Soul Food")),
126126+ #("experience-ksf-tagline", #("Catering services", "Horecamedewerker")),
127127+ #(
128128+ "experience-ksf-summary",
129129+ #(
130130+ "Servicing, maintaining customer contacts, coordinating home-delivery/takeout counter, preparation of some cold dishes",
131131+ "Bediening, onderhouden van klantcontacten, coördineren van de thuisbezorging/afhaalbalie, en het bereiden van enkele koude gerechten",
132132+ ),
133133+ ),
134134+ #("experience-spotta-title", #("Spotta", "Spotta")),
135135+ #("experience-spotta-tagline", #("Brochure delivery", "Folderbezorging")),
136136+ #(
137137+ "experience-spotta-summary",
138138+ #(
139139+ "Deliverer of weekend brochures and sometimes specific pamphlets.",
140140+ "Bezorgen van weekendfolders en soms speciale pamfletten.",
141141+ ),
142142+ ),
143143+ #("interests-coding", #("Writing code", "Schrijven van code")),
144144+ #(
145145+ "interests-reading",
146146+ #("Reading (fiction, philosophy)", "Lezen (fictie, filosofie)"),
147147+ ),
148148+ #(
149149+ "interests-music",
150150+ #(
151151+ "Listening to music, visiting bands",
152152+ "Luisteren naar muziek, bands bezoeken",
153153+ ),
154154+ ),
155155+ #(
156156+ "interests-party",
157157+ #("Member of political party", "Lid van een politieke partij"),
158158+ ),
159159+ #(
160160+ "interests-horse",
161161+ #(
162162+ "Horse care, with the occasional ride",
163163+ "Paardenverzorging, en af en toe ook een ritje",
164164+ ),
165165+ ),
166166+ #(
167167+ "skills-rust-title",
168168+ #("Rust (programming language)", "Rust (programmeertaal)"),
169169+ ),
170170+ #(
171171+ "skills-gleam-title",
172172+ #("Gleam (programming language)", "Gleam (programmeertaal)"),
173173+ ),
174174+ #(
175175+ "skills-php-title",
176176+ #("PHP (programming language)", "PHP (programmeertaal)"),
177177+ ),
178178+ #(
179179+ "skills-php-desc",
180180+ #(
181181+ "7 & 8, SymfonyPHP, API's and fullstack applications",
182182+ "7 & 8, SymfonyPHP, API's en volledige applicaties",
183183+ ),
184184+ ),
185185+ #(
186186+ "skills-js-title",
187187+ #(
188188+ "JavaScript / TypeScript (programming language)",
189189+ "JavaScript / TypeScript (programmeertaal)",
190190+ ),
191191+ ),
192192+ #(
193193+ "skills-js-desc",
194194+ #(
195195+ "Fullstack, NodeJS/BunJS, backend, ExpressJS, browsers",
196196+ "Fullstack, NodeJS/BunJS, backend, ExpressJS, browsers",
197197+ ),
198198+ ),
199199+ #("view-source", #("[source code]", "[broncode]")),
200200+ #("translate", #("to Dutch", "naar Engels")),
201201+ #("eindhoven-nl", #("Eindhoven, The Netherlands", "Eindhoven, Noord-Brabant")),
202202+ #(
203203+ "headline",
204204+ #(
205205+ "Driven by creativity, activated by curiosity.",
206206+ "Gedreven door creativiteit, geactiveerd door nieuwsgierigheid.",
207207+ ),
208208+ ),
209209+ #(
210210+ "summary-summary",
211211+ #(
212212+ "I am deeply passionate about the intersection of people, society, and developing things! As a versatile professional, I thrive on navigating complex challenges and driving meaningful impact across diverse environments.",
213213+ "Ik heb een enorme passie voor het snijvlak van mens, maatschappij en ontwikkeling! Als veelzijdige professional krijg ik energie van het aanpakken van complexe uitdagingen en het maken van een betekenisvolle impact in uiteenlopende omgevingen.",
214214+ ),
215215+ ),
216216+ #(
217217+ "subheader-languages",
218218+ #(
219219+ "Good verbal and written language skills in both Dutch and English.",
220220+ "Goede gesproken en geschreven kennis in zowel Nederlands als Engels.",
221221+ ),
222222+ ),
223223+]
224224+225225+pub fn view(model: stuff.Model, in_dutch: Bool) -> Element {
226226+ let href = fn(r: Route) { stuff.href(r, model.raw_posts) }
8227 // Dict(keyname, #(english, dutch))
9228 let translations =
1010- [
1111- #("langswitch", #("🇳🇱 NL", "🇬🇧 EN")),
1212- #("header-summary", #("About", "Over")),
1313- #("header-profiles", #("Profiles", "Online")),
1414- #("header-interests", #("Interests", "Interesses")),
1515- #("header-skills", #("Skills", "Vaardigheden")),
1616- #("header-experience", #("Experience", "Ervaring")),
1717- #("subheader-experience-older", #("Earlier", "Eerder")),
1818- #("header-education", #("Education", "Opleidingen")),
1919- #("header-languages", #("Languages", "Talen")),
2020- #("lang-dut", #("Dutch", "Nederlands")),
2121- #("lang-eng", #("English", "Engels")),
2222- #("word-native", #("Native.", "Moedertaal.")),
2323- #("cambridge-daily", #(
2424- "Daily speaker, Cambridge C1 level.",
2525- "Dagelijkse spreker, Cambridge C1 niveau.",
2626- )),
2727- #("date-2/'26", #("February 2026", "Februari 2026")),
2828- #("attribution-1", #("Based on the design from ", "Ontworpen naar ")),
2929- #("attribution-2", #(", delivered in Gleam. ", ", uitgevoerd in Gleam. ")),
3030- #("present", #("Present", "Heden")),
3131- #("education-fontys-institute", #(
3232- "Fontys University of Applied Sciences",
3333- "Fontys Hogeschool",
3434- )),
3535- #("education-fontys-level", #("Bachelor", "HBO/Bachelor")),
3636- #("education-fontys-orientation", #(
3737- "ICT / Software Engineering",
3838- "ICT / Software Engineering",
3939- )),
4040- #("education-fontys-summary", #("", "")),
4141- #("education-kw1c-institute", #(
4242- "Koning Willem 1 College",
4343- "Koning Willem 1 College, Den Bosch",
4444- )),
4545- #("education-kw1c-level", #("College", "MBO 4+")),
4646- #("education-kw1c-orientation", #(
4747- "Software Development",
4848- "Softwareontwikkeling",
4949- )),
5050- #("education-kw1c-period", #(
5151- "February 2024 - January 2026",
5252- "Februari 2024 - Januari 2026",
5353- )),
5454- #("education-kw1c-summary", #(
5555- "Finished with submodule certificates before switching to Fontys.",
5656- "Afgerond met deelcertificaten voor mijn afslag naar Fontys.",
5757- )),
5858- #("education-bs-institute", #("Berkenschutse", "De Berkenschutse, Heeze")),
5959- #("education-bs-level", #("MAVO/HAVO", "MAVO/HAVO")),
6060- #("education-bs-orientation", #(
6161- "Theoretical learning path / Economics and Society (E&M)",
6262- "Theoretische leerweg / Economie en Maatschappij (E&M)",
6363- )),
6464- #("education-bs-period", #(
6565- "February 2024 - January 2026",
6666- "Februari 2024 - Januari 2026",
6767- )),
6868- #("education-bs-summary", #("", "")),
6969- #("education-stercollege-institute", #(
7070- "Ster College",
7171- "Ster College Eindhoven",
7272- )),
7373- #("education-stercollege-level", #("HAVO", "HAVO/VAVO")),
7474- #("education-stercollege-orientation", #(
7575- "Culture and society (C&M)",
7676- "Cultuur en maatschappij (C&M)",
7777- )),
7878- #("education-stercollege-summary", #("", "")),
7979- #("education-roc-institute", #("ROC", "ROC Tilburg")),
8080- #("education-roc-level", #("College", "MBO4")),
8181- #("education-roc-orientation", #(
8282- "Social / Disability Care",
8383- "Maatschappelijke Zorg",
8484- )),
8585- #("education-roc-summary", #("", "")),
8686- #("experience-asml-internship-title", #("ASML", "ASML")),
8787- #("experience-asml-internship-tagline", #(
8888- "Internship software engineering",
8989- "Stage als software engineer",
9090- )),
9191- #("experience-asml-internship-summary", #(
9292- "This internship solidified my passion for software architecture and inspired me to switch from college to pursuing a Bachelor’s degree at Fontys University.",
9393- "Deze stage heeft mijn passie voor softwarearchitectuur bevestigd en me geïnspireerd om van het mbo over te stappen naar een hbo-opleiding aan Fontys Hogeschool.",
9494- )),
9595- #("experience-maintain-oss-title", #("", "")),
9696- #("experience-maintain-oss-tagline", #(
9797- "Contributing to and developing Open-Source Software.",
9898- "Bijdragen aan en ontwikkeling van open-source-software.",
9999- )),
100100- #("experience-maintain-oss-summary", #(
101101- "Maintenance and development of multiple small-scale open-source-software projects some of those in use at small to mid-sized companies.",
102102- "Maintainer meerdere kleinschalige opensourcesoftwareprojecten met gebruiken door kleinere tot middelgrote bedrijven.",
103103- )),
104104- #("experience-maintain-oss-location", #(
105105- "Online and at meets",
106106- "Online en bij congressen",
107107- )),
108108- #("experience-ksf-title", #("Korean Soul Food", "Korean Soul Food")),
109109- #("experience-ksf-tagline", #("Catering services", "Horecamedewerker")),
110110- #("experience-ksf-summary", #(
111111- "Servicing, maintaining customer contacts, coordinating home-delivery/takeout counter, preparation of some cold dishes",
112112- "Bediening, onderhouden van klantcontacten, coördineren van de thuisbezorging/afhaalbalie, en het bereiden van enkele koude gerechten",
113113- )),
114114- #("experience-spotta-title", #("Spotta", "Spotta")),
115115- #("experience-spotta-tagline", #("Brochure delivery", "Folderbezorging")),
116116- #("experience-spotta-summary", #(
117117- "Deliverer of weekend brochures and sometimes specific pamphlets.",
118118- "Bezorgen van weekendfolders en soms speciale pamfletten.",
119119- )),
120120- #("interests-coding", #("Writing code", "Schrijven van code")),
121121- #("interests-reading", #(
122122- "Reading (fiction, philosophy)",
123123- "Lezen (fictie, filosofie)",
124124- )),
125125- #("interests-music", #(
126126- "Listening to music, visiting bands",
127127- "Luisteren naar muziek, bands bezoeken",
128128- )),
129129- #("interests-party", #(
130130- "Member of political party",
131131- "Lid van een politieke partij",
132132- )),
133133- #("interests-horse", #(
134134- "Horse care, with the occasional ride",
135135- "Paardenverzorging, en af en toe ook een ritje",
136136- )),
137137- #("skills-rust-title", #(
138138- "Rust (programming language)",
139139- "Rust (programmeertaal)",
140140- )),
141141- #("skills-gleam-title", #(
142142- "Gleam (programming language)",
143143- "Gleam (programmeertaal)",
144144- )),
145145- #("skills-php-title", #(
146146- "PHP (programming language)",
147147- "PHP (programmeertaal)",
148148- )),
149149- #("skills-php-desc", #(
150150- "7 & 8, SymfonyPHP, API's and fullstack applications",
151151- "7 & 8, SymfonyPHP, API's en volledige applicaties",
152152- )),
153153- #("skills-js-title", #(
154154- "JavaScript / TypeScript (programming language)",
155155- "JavaScript / TypeScript (programmeertaal)",
156156- )),
157157- #("skills-js-desc", #(
158158- "Fullstack, NodeJS/BunJS, backend, ExpressJS, browsers",
159159- "Fullstack, NodeJS/BunJS, backend, ExpressJS, browsers",
160160- )),
161161- #("view-source", #("[source code]", "[broncode]")),
162162- #("translate", #("to Dutch", "naar Engels")),
163163- #("eindhoven-nl", #(
164164- "Eindhoven, The Netherlands",
165165- "Eindhoven, Noord-Brabant",
166166- )),
167167- #("headline", #(
168168- "Driven by creativity, activated by curiosity.",
169169- "Gedreven door creativiteit, geactiveerd door nieuwsgierigheid.",
170170- )),
171171- #("summary-summary", #(
172172- "I am deeply passionate about the intersection of people, society, and developing things! As a versatile professional, I thrive on navigating complex challenges and driving meaningful impact across diverse environments.",
173173- "Ik heb een enorme passie voor het snijvlak van mens, maatschappij en ontwikkeling! Als veelzijdige professional krijg ik energie van het aanpakken van complexe uitdagingen en het maken van een betekenisvolle impact in uiteenlopende omgevingen.",
174174- )),
175175- #("subheader-languages", #(
176176- "Good verbal and written language skills in both Dutch and English.",
177177- "Goede gesproken en geschreven kennis in zowel Nederlands als Engels.",
178178- )),
179179- ]
229229+ translations
180230 |> dict.from_list()
181231 let localise = fn(keyname) {
182232 case translations |> dict.get(keyname) {
183233 Ok(v) ->
184234 case in_dutch {
185185- True -> v.1
186235 False -> v.0
236236+ True -> v.1
187237 }
188238 |> element.text()
189239···247297 html.li([], [
248298 html.a(
249299 [
250250- attribute.href(case in_dutch {
251251- False -> "/cv/nl"
252252- True -> "/cv/en"
253253- }),
300300+ case in_dutch {
301301+ // eng -> dut
302302+ False -> href(stuff.CuriculumVitae(True))
303303+ // dut -> eng
304304+ True -> href(stuff.CuriculumVitae(False))
305305+ },
254306 attribute.class("tooltip tooltip-bottom"),
255307 ],
256308 [
···313365 )
314366}
315367316316-fn view_cv_inner(localise: fn(String) -> Element(a)) {
368368+fn view_cv_inner(localise: fn(String) -> Element) {
317369 [
318370 html.div(
319371 [
···1141119311421194fn experience_item(
11431195 primary primary: Bool,
11441144- localise localise: fn(String) -> element.Element(a),
11961196+ localise localise: fn(String) -> Element,
11451197 name name: String,
11461146- location location: element.Element(a),
11471147- period period: List(element.Element(a)),
11981198+ location location: Element,
11991199+ period period: List(Element),
11481200) {
11491201 let bordercolour = case primary {
11501202 True -> " border-primary"
···1200125212011253fn education_item(
12021254 primary primary: Bool,
12031203- localise localise: fn(String) -> element.Element(a),
12551255+ localise localise: fn(String) -> Element,
12041256 name name: String,
12051205- period period: List(element.Element(a)),
12571257+ period period: List(Element),
12061258) {
12071259 let bordercolour = case primary {
12081260 True -> " border-primary"
···12601312}
1261131312621314fn skill_item(
12631263- name skillname: List(Element(a)),
12641264- description skilldesc: List(element.Element(a)),
13151315+ name skillname: List(Element),
13161316+ description skilldesc: List(Element),
12651317 strength strength: Float,
12661318) {
12671319 let unfilled_skill_block =
+42
src/homepage/view/not_found.gleam
···11+import gleam/list
22+import homepage/stuff.{type Element}
33+import homepage/stuff/prestyled_elements.{paragraph, title}
44+55+pub fn view() -> List(Element) {
66+ let first =
77+ "You glimpse into the void and see -- nothing?
88+ Well that was somewhat expected."
99+ [
1010+ title("Not found"),
1111+ paragraph(
1212+ case
1313+ [
1414+ first,
1515+ "You've wandered off the map. There are no monsters here, just an endless, pixelated silence.",
1616+ "This page has achieved enlightenment and transcended the physical server. It no longer exists in this dimension.",
1717+ "Error 404: The digital equivalent of walking into a room and forgetting why you came here.",
1818+ "Everything you see here is a hallucination. Especially this 404 page.",
1919+ "You reached the end of the internet. Please turn around and head back the way you came.",
2020+ "404: A quiet space for reflection. Or just a broken link. Mostly the broken link thing.",
2121+ "Lost in the sauce? This page certainly is.",
2222+ "Nothing to see here. Move along, citizen.",
2323+ "You picked a bad time to get lost, friend!",
2424+ "This page is currently 'Works on my machine'—but apparently not on yours.",
2525+ "A 404 error has occurred. Please pet your nearest cat and try again.",
2626+ "You took a wrong turn at the last hyperlink. Care for a juice box while you find your way back?",
2727+ "Oh no! The pixels for this page haven't been delivered yet. The digital mail is running late.",
2828+ "You found a secret area! Unfortunately, the secret is that there’s nothing here.",
2929+ "Error 404: The hamsters powering this specific page are currently on their lunch break.",
3030+ "404: Under Construction... indefinitely. (Just kidding, it's just gone.)",
3131+ "This URL did not exist. Please refresh your browser or your outlook on life.",
3232+ "Nope, not here!",
3333+ ]
3434+ |> list.shuffle()
3535+ |> list.first()
3636+ {
3737+ Error(_) -> first
3838+ Ok(r) -> r
3939+ },
4040+ ),
4141+ ]
4242+}