diff --git a/package-lock.json b/package-lock.json index 53d4e78..28ecb6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15197,6 +15197,14 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "ng2-fittext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ng2-fittext/-/ng2-fittext-1.4.0.tgz", + "integrity": "sha512-l6Vkq/3dRPXy5yJYmTBmHSWAFd7FCSxTP8iz+Jn+X5xmSaLoX0PTeI9Y4SQTa+K3tB28TrF7mXSdDKGaiutnFw==", + "requires": { + "tslib": "^2.3.0" + } + }, "nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", diff --git a/package.json b/package.json index 973b88e..331664c 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "aws-cdk-lib": "^2.117.0", "constructs": "^10.3.0", "express": "^4.18.2", + "ng2-fittext": "^1.4.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.14.2" diff --git a/src/app/app.component.html b/src/app/app.component.html index f5c1a6e..c956840 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1 +1,6 @@ - +
+ +
+ + + diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 136719a..a6dd4c1 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -2,11 +2,14 @@ import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterOutlet } from '@angular/router'; import {MenuComponent} from "./menu/menu.component"; +import {HeroComponent} from "./hero/hero.component"; +import {SectionComponent} from "./section/section.component"; +import {FooterComponent} from "./footer/footer.component"; @Component({ selector: 'iov-root', standalone: true, - imports: [CommonModule, RouterOutlet, MenuComponent], + imports: [CommonModule, RouterOutlet, MenuComponent, HeroComponent, SectionComponent, FooterComponent], templateUrl: './app.component.html', styleUrl: './app.component.scss' }) diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index dc39edb..4d5a95b 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,3 +1,57 @@ import { Routes } from '@angular/router'; +import {BiographyPage} from "./pages/biography/biography.page"; +import {BlogPage} from "./pages/blog/blog.page"; +import {ProjectsPage} from "./pages/projects/projects.page"; +import {HomePage} from "./pages/home/home.page"; +import {PortfolioPage} from "./pages/portfolio/portfolio.page"; +import {ContactMePage} from "./pages/contact-me/contact-me.page"; +import {PageComponent} from "./page/page.component"; +import {LikeDislikePage} from "./pages/like-dislike/like-dislike.page"; +import {DisclaimerComponent as PortfolioDisclaimerComponent} from "./pages/portfolio/disclaimer/disclaimer.component"; -export const routes: Routes = []; +export const routes: Routes = [ + { + path: '', + component: HomePage + }, + { + path: '', + component: PageComponent, + children: [ + { + path: 'biography', + component: BiographyPage, + }, + { + path : 'portfolio', + component: PageComponent, + children: [ + { + path: '', + component: PortfolioPage, + }, + { + path: 'disclaimer', + component: PortfolioDisclaimerComponent, + } + ] + }, + { + path: 'projects', + component: ProjectsPage, + }, + { + path: 'like-dislike', + component: LikeDislikePage, + }, + { + path : 'blog', + component: BlogPage, + }, + { + path: 'hello', + component: ContactMePage, + } + ] + } +]; diff --git a/src/app/arrow-scroll-down/arrow-scroll-down.component.html b/src/app/arrow-scroll-down/arrow-scroll-down.component.html new file mode 100644 index 0000000..1a84243 --- /dev/null +++ b/src/app/arrow-scroll-down/arrow-scroll-down.component.html @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/src/app/arrow-scroll-down/arrow-scroll-down.component.scss b/src/app/arrow-scroll-down/arrow-scroll-down.component.scss new file mode 100644 index 0000000..228a5bb --- /dev/null +++ b/src/app/arrow-scroll-down/arrow-scroll-down.component.scss @@ -0,0 +1,38 @@ +.arrow { + position: absolute; + transform: translate(-50%, -50%) rotate(0deg); + cursor: pointer; +} + +.arrow span { + display: block; + width: 1.5vw; + height: 1.5vw; + border-bottom: 5px solid white; + border-right: 5px solid white; + transform: rotate(45deg); + margin: -10px; + animation: animate 2s infinite; +} + +.arrow span:nth-child(2) { + animation-delay: -0.2s; +} + +.arrow span:nth-child(3) { + animation-delay: -0.4s; +} + +@keyframes animate { + 0% { + opacity: 0; + transform: rotate(45deg) translate(-20px, -20px); + } + 50% { + opacity: 1; + } + 100% { + opacity: 0; + transform: rotate(45deg) translate(20px, 20px); + } +} diff --git a/src/app/arrow-scroll-down/arrow-scroll-down.component.spec.ts b/src/app/arrow-scroll-down/arrow-scroll-down.component.spec.ts new file mode 100644 index 0000000..c4b71a3 --- /dev/null +++ b/src/app/arrow-scroll-down/arrow-scroll-down.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ArrowScrollDownComponent } from './arrow-scroll-down.component'; + +describe('ArrowScrollDownComponent', () => { + let component: ArrowScrollDownComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ArrowScrollDownComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ArrowScrollDownComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/arrow-scroll-down/arrow-scroll-down.component.ts b/src/app/arrow-scroll-down/arrow-scroll-down.component.ts new file mode 100644 index 0000000..f89b250 --- /dev/null +++ b/src/app/arrow-scroll-down/arrow-scroll-down.component.ts @@ -0,0 +1,28 @@ +import {Component, HostListener} from '@angular/core'; +import {NgIf} from "@angular/common"; + +@Component({ + selector: 'iov-arrow-scroll-down', + standalone: true, + imports: [ + NgIf + ], + templateUrl: './arrow-scroll-down.component.html', + styleUrl: './arrow-scroll-down.component.scss' +}) +export class ArrowScrollDownComponent { + + visible: boolean = true; + + scrollDown() { + window.scrollBy({ + top: window.innerHeight, + behavior: 'smooth' + }); + } + + @HostListener('window:scroll', ['$event']) + checkIfPageIsStillOnTop() { + this.visible = window.scrollY <= 100; + } +} diff --git a/src/app/ascii-photo/ascii-photo.component.html b/src/app/ascii-photo/ascii-photo.component.html new file mode 100644 index 0000000..f65148e --- /dev/null +++ b/src/app/ascii-photo/ascii-photo.component.html @@ -0,0 +1,3 @@ +
+  {{photos[index]}}
+
diff --git a/src/app/ascii-photo/ascii-photo.component.scss b/src/app/ascii-photo/ascii-photo.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/ascii-photo/ascii-photo.component.spec.ts b/src/app/ascii-photo/ascii-photo.component.spec.ts new file mode 100644 index 0000000..b02d9a9 --- /dev/null +++ b/src/app/ascii-photo/ascii-photo.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AsciiPhotoComponent } from './ascii-photo.component'; + +describe('AsciiPhotoComponent', () => { + let component: AsciiPhotoComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AsciiPhotoComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AsciiPhotoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/ascii-photo/ascii-photo.component.ts b/src/app/ascii-photo/ascii-photo.component.ts new file mode 100644 index 0000000..da2f950 --- /dev/null +++ b/src/app/ascii-photo/ascii-photo.component.ts @@ -0,0 +1,166 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + selector: 'iov-ascii-photo', + standalone: true, + imports: [], + templateUrl: './ascii-photo.component.html', + styleUrl: './ascii-photo.component.scss' +}) +export class AsciiPhotoComponent { + @Input() index: number = 0; + photos = [` + **#*+====*#%%@@%%@%%+==+#######*++*##*+*++*#%*=========================+++*+*++++++=+=============== + *##*======+###%%@%%%+==+*##%%%##++###*+*=+##*=====================+++**#*******#*+++++============== + ##*+=======+***%%@%%#==++#%%%%##**###*++++#*+==++==============++***##*+=====++=++**++============== + *#++=========****#%%##%**#%%%%##*####++=+*##==++++====++=====++*####*===============+=============== + **++======--==+*#%%#%%%*+#%%%%%%###**+=+*######**++***====+**#####+================================= + **++*+++=+=====+*##%%%%#+*#%%%%%###***+**###*=++*##*+=-==**####++++=====-=========================== + ******####*+++==+**##%%#*+*#%%%%##***+*#%##++**##*=====+**##+=++++===--===-----------------========= + **+**#++==+*#%#**+#+#%%%##*#%%%%%#*#*+#%##*##*#+===-=*+*#*===+***++++==----------------------------- + *+++===-====-=+####*###%##*##%%%%#*##*####*+#*=-===+*##+-==+**###*+=++================-------------- + +*##+=-==========#####*#######%%%#*#*####+##+---==+**=-==++####++=+##+*+**####***+=----------------- + #++=+##+******+**++#%#########%%%%##*###+*#=----++*+--==+**%##*###############****+====------------- + #%#+*++##*++------+**#%#+#####%%%##**##***----=+*+--==***##*####*+===------=+++*####*++==----------- + *####%#+==*+=-------+###**#####%%##**#*+*=---==*=--++*####*+++==-------------====*###*=------------- + ===**#%#*++=+==-------*#######%%%#######+--==++--=+=*#+=--------------------==--=+++**=-=----------- + ---=----+*#*+=+=---====+##*##%%%%#%####**+**##*+=+**=-=----------:::::::::-=++--====+*++---:::::::-- + ------------=**+*=======+#**#%###%%######*+*+=-**+---:-----::::::::::::::::-==----====+==--::::::::: + -=======-=++=++*#**++=-==+#*#%#######+###**+==++=*=====---:::::::::::::::::-++==--=-===*++====+++=== + =+**********+--=+***++--===++#####%**##*#*=+++###%%%%%@#=-================+=======++==++*++=-------- + *+-::::-==+++++=---++*+----+=*#*###**#**++*#%%%%%%%%%@@@%******+++==-----------------==++====------- + ++===+=+===+====+++==*+++===**#*##*####+*#%%%%%%%%%%%%**#%%%%%%%%%%%%#%%#-----------=-=+====------== + +*****+===-=---------==****+*##*###+*###%%%%%%%%#%###+++*%%%@@%%%%%%@@@@@#+++++++++**+**+*+++++=++++ + -:-----:------==--::::-+*##*=#%##%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%@@@%%%##*++**+=++*+++++==+++=== + :--========+======+*++**######%%%#%%%%%%%%%%%%%%@@@@%#####%%%%%%%@@@%%%%%@@%###*+====-====--=----==- + +*++++***+++++++**+**####%%%%%%#%@%%%%%%%%%%#**+++++++++++++++*#%@@@@@@@%@%%%**##**==--------------- + =+===+=--=+=-===-=**###%%%%%%%##%%%%%%%%%#++=========+++==++++++++**#%@@@@%%#+--#*++=--------------- + -------------=+*######**%%%%%%%#%%%%%%#++===================+++++++++**%@%%%%#+-:+##++=---:::--::-:: + :::::------:-*%##=###+***+%#@@%%%%%%*++===========================+++++**%@@@%%*---##+=---:-----==== + ::::--::::-=**#*+#%**++*++%@%%%%%@%*++============================+++++++*#%@@%#=-:-*##*++++++++++++ + -:----:::=*#*#**##**+++*+=#@%%%%@#+++===============================+++++++*%@@%*:::-+***=----::---- + :::---:-=##**#-*#*=--:=*:::-#%@%*++++==============================+++++++++*%%@%=:::-+*+=---------- + --------+###*++##*=---=*---+%%#++++++================================++++++++*%@%*::::=***#*######## + ::::-:-+##*++=**#=+########%%#+++++++================================++++++++*%%@%-::::=******#***** + -:::--+#*#*=-=#+*-+******##%%*+++++===============================+++++++++***#%@%-:::::=*****##**** + :-::-+###*=:-=*+--+******#%%#++++++++****#######*++++===========+++++++++++****%%%-::::-:*****##**** + ::---****=-::--=:-*******#%%*++++++*#%%%%%%%%%%%###**+++++++++++******+++++++**#%#-::::::+*****#**** + -::-=*+++-::::--:-******##@%*++++*#####*******######**+++++++**###%%%%%###**+**#%+::::::--*****#**++ + :::-=*+=-::::::::-******#%@%*+++*####*********######**+===++*###%%%%%%%%%%%%#**#%=::::::--+****#**** + -::-+*=-:::::::::=******#%@%*+++**####%%%%%%%%%%%%#**++====+*##%%#########%%%#*%#:::::::::=****##*** + ::--++--:::::::::+******#*@#++++***##%%%#%@@@@##%%#**+======+#%%%%%########%%%#%-:::::::-:-*****#*** + ---------:::::---**++***#*##+++++***********####****++======+*%%#%@@@@@%%%#####*::::::::::-*****#*** + ---:::-:::::::---**++****++*+++++++++************+++=========**#####%##%%%%##*#=::::::::---*******++ + -----------:::---#*+++++#*+*++++======+++*****+++============+****#*########***=========++++++++++++ + =============++==+====+*****+++=========================--===+*****#***********+----:-----::----:::: + ==============--=-----+*++*#*++++================+====----====++++++***+++++++**=:::-::::--::::::-:: + ------=----------::--:=++*##**+++============+++=====------====+++++++++++++++**---------========--= + ------=--------=------=+**#%#**+++=++=====++++++======-----===++**++++++=+++***+=++++++*++++++++++++ + *+++++::::::--:::...::-+++*%#**+++++++++++**+=+++++++++=====+++*+**+++++++++**#+++++*+++++++++++===+ + *##**+::::::::::::-=+==+++*%%#*++*#*+++***+====+*%%%%#**++++*****+++++++*++**##=----------------:::: + ==+++-::::::::::=*#**#**+++#%#*++**++***++++++++*##########%@%#**++++++******%#-:::::::::-::--:----- + --=--:::::::::::+**###*##+*%%#*****+*#****#####%#%%%%%%%%%%@@%%#**+++**+****##+:::::::::-:::-::::-:: + ==--=::::::::::-+******#@@@%%#*+***+*####%%%%%%%%%%%%%%%%%@%@%%%%####*******##=--:::::-:-::::::::--: + ---=-::::::::::=+******#@@@@%#***##*###%%%%%#######**##%%##%%%%%%%%%%##*****##+-:-::::--::--------=- + -----:::::::::-=======-*@@@@%%#*###**##%@%%##%#################%%%%%%%%#######=-------------------:- + -----::--:==--=+=--::::*@@@@%%###%%#*##%#**++++++++++++++++**###%%@@@%%######+=:------------:--:-:-- + ----:::---:-::===--::::=%@@@@%%##%%%###**+++++++**++++++++++++*****#%%##%%%##=-:::::--------:-::---- + --=-:::::::::::-========*@@@@@%%%%%%%###**++==++*##############*****#%##%%%%+-:::::::--------------= + ----::::::::::::::::::::::*%@@@%%%%%%%%%##*++++++***##%%%%###**++***#%%%%%%*-::::::::-:::-----=--=*# + ----:::::::::::-:::::-:::-=*#*#@@%%%%%%%%##*+++++++**#######**++****#%%%%%%=::::::::---:::::---=*### + --=-==++++*#########%%%%%%###***%%%%%%%%%##*+++++++++********++***#%%%%@@%+-----::-------------***## + ----==++=+#%%%@%%%%%%%%%%%#****+*%%%%%%%%%%#****++++++++++*+*++**#%%%%%@#=---------------------*#### + ----=-====################****+++**%@@%%%%%%##**#****++****#***###%%%%@%+----:-----------------+#*%# + =-=======+#%%%%%%%%%%%%%%%#****++***%@@@@%%%%%######******#####%%%%%@@#++---::::::-:::-:-------=+*** + -========+#%%@@@@%%%%%%%%%#****++++**#%%%%%@%%%%%############%%%%@@@@%###*************+::------=*++* + ---=-==--+#%%%@@%%@%*##%%#****++++++**##%@@@@@@%%%%%%%%%%%%%%%%@@@@%#*%%%%%%%%%%%%%%%%#--------=*#*# + +++++*+++*#########****##****+++++++++**#%@@@@@@@%%%%%%%%%%%%@@@@%#***%%%%%%%%%%%%%%%%#========-++*+ + --=-=====*##%%%@%%@#####+**++++++++++++***##%@@@@@@@@%@@@@@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%##+++*##* + ==+=====+#%#%%%%%%#+==--=*+++++++++++++++*****#%%@@@@@@@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=+##* + ========+#%#%%#+===-==---++++++++++++++++++******##########**#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+=*** + --======*#*=====+=--==----+++++++++++++++++++****************#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+=*** + =-=============++===-==---=**++++++++++++++++++**************#%%%%%%%%%#%%%%##%%#%#%%#%%%%%%%%%+=+++ + =======---===+++====--=----=**+++++++++++++++++++***********+#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*=+*+ + ========--=++++======-===----+*+++++++++++++++++++++++****+++#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+=+## + =====+==--=+++=========-==-----++++++++++++++++++++++++++*+++#%%%%%%%%%%%%#%%%%%%#%#%%%%%%%%%%%+==== + ======+==--=++===-======-==-----=++++++++++++++++++++++*+++++#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+==== + =======+==-=++===-=======--==------=**+++++++************+++*#=-------------------------------*+=+== + ===========-+++===-=======---=--------=++++**************++*+#-::::::=-=--=--==---==-:=-::::::*+=++= + =====+======+++======-=====----=---------==++******#***++====*-:::::-:---:-::---:-:--:=-::::::*+=++= + ====++==---=+++===-==-=======----==-----=====================*-:::::::::::::::::::::::::::::::*+==++ + ====++===--==+++=====---========----==-----==================*-:::::::::::::::::::::::::::::::*+==++ + ===+++====-==+++======--============--====----===============*-:::::::::::::::::::::::::::::::*+==++ + +++++++==--==+*+=======--====================================****=-:::::::::::::::::::::::-+*+#+==++ + +++++++==---=+*++=======-=====================================##+-:=+#*=-:::::::::::-+*#+-:-+#*===++ + +++++++==--==+*++========--=======================================+***+====+*+++++=-=+***++=++====++ + +++++++==---=+*++========================================================+*##+=*##*+++======+++====+ + ++++++====--=+*++===================================================================++=======++====+ + +++++++===--==*++===================================================================+++=======+++==+ + +++++++===--==*++===================================================================+++========+++=+ + ==+++++==---==*++===================================================================+++=========++++ + ==+++++===--==**++===========================================++=====================+*+==========+++ + ===+++++===-==**++=+==+===================+=++===============+==================+===+*++===+====++++ + +===++++======**++++=+++=========+==============+++=========++=================++===+*++========++++ + +===+++++=====+*++++++++==================================++++=================+++==+**++=+====+++++ + +====++++=====+*+++++++===========++==+=======+===++=+===+++++================++++===+*++=++===+++++ + +====++++=====+*+++++++==========+++++++==+=++=+++++====+++++===============+=++++===+*++==+=++++*++ + ++++=++++=====+*++++++============+++++==++++++++++++++++++++================++++++==+*+++==+++++*++ + ++++==+++=====+*++++++++==========+++++++=+++++++++++++++++++======+========+++++++==+*+++=++++++*++ + *++++=+++=====+*+++++++==========++++++++++++++++++++++++++++++++===========+++++++==+*+++++++++*+++`, + ` + + + + + + ´›¦)vòri¯…\` + \`­ceåëëýýÖÒÞŸj°‚ + \`¯ôÚðÒkµ5ç±Cò‰öVµ0)´ + …?§åÝú±sƒorvvjvjctu2sº + …>DU©ó‰JIrì[[[7>ï1c¤JÌ0¡\` + tÓxLÌò¼¤jl<[¿[[¿7ì1o%‡Ìw”\` + ¨žå©çVósƒrï†?¿[¿†ïcJó±ò‰©Í:\` + ‚Þxúô20C‡IîíiiïcCΞ5ùaaÍsÎï· + …äf5õaÍönôx5©¢í=ÏhZÿÎ2Í@½‰y½ò¨ + Jšyf&6àkÎUDÒµ‰=ï%@03½trî%Ï5C; + ~ÇTOSZád$àwVçÍI[†ïvjrîoc%Ïkçcˆ + …iZy9ààžyôóuLLJ?/[1IJsu@CóUyj‹ + \`›£Çx5Vs¤î1oó2eS5§Úx5aaLCÌüÝr… + \`’shSξç@u‡z0šGŽÐéñSUhbá¾f2ô• + \`~TñèDŸ6T5ÏÍyñÓýšL‰ƒ½tcuõž6x¡ + ·+9ÓmëkUSfÇâpDµõykUCcrsfÝžS¹ + ·*üámÓTkFášOúúaYV%ïju™O§žì\` + \`ˆ›¯Ddñ$m8èP6™YC¤oCxhb8ôv´ + ¨?ÕqÕAAqA$ÙÿZäåðŠA¾sï; + |ZgXgHÁ#Nþæ##ê®Í½1i¡\` + ›Vx§áåðH#ê$Ÿõ£sIí>׫˜¨\` + !bõYaõOUT¾úY±ò½%l[?×?[òÇŸ>…\` + ¨|OÕæÛóóÍ0©ü2çù0sztí7}×׿7@åèdÓFä9ö|’\` + \`›ÏÜÔœÁNÅBp3nòsnC±@¢‡o=[++?*׉áëÚ$ýåÞÞÿDZähkVª¨ + \`°ÏñÞëð XÄ#æQHšCs½‡½zJtj=†}†[†CèܶðëÙÙ$ÚdèÖåÞFáñDhôv› + \`^2FÞÙýëððøâããßqŽþÁ#ÁXS3öö@Ìöƒìi=wÙG¶ãéëddëÚéëýÙÜÞÖÓdÞåDPûí… + \`’‡áÞë$ë$éé8¶¶ððG¶¶ãßÐÄNÁEþRKgÛÔApmmA€âøÚ$$$ë8¶ð$$éÜýýmëýëÙèFû>· + \`/Pè8$$ø€âÜ8Úðø88¶mâ¶ø¶pÛRÄÀHXœÐÛÛÕÕp¶ððéÚ8Ü$ÚðGGÚéøÚëpÜýâ¶ëÞbá§•\` + \`÷šådÚø¶ðÚÔqÚ$8¶ðÚðGââ¶ðøð¶ãÔÐqmøðéðððéééÚéé8Ü$éøß8¶¶Ú¶GÜ€âÜëÜÙÿäž¹ + ;µå$ë$ð¶G¶éŠÔÜÚGðÜéðé¶øøðéø¶mpÔÕAââGðøðððÚÜé8Ú8éâ€øãGðß¶ŠßðGðëýÞDš2… + \`¿àè$Gâð¶mø¶¶ÐøéøðÚ8éÜðéé88ðøðmmÔÔpâøøéðÚÚðééð8ééGÔâpã¶ãqÛãßâÚÜ$ÞÒ¥Ý* + ‚ôFëÚðpÔøøÔâGp¶ø¶øÚéðéÚÚÚÚ8ðéÚ8¶mppã¶ð8Ú8Ü8ÚÚÚ8Úð¶Õm€ß〜AÔââ¶Ú$$ÙÓš2… + \`[ûÞÜðø¶pÕããKmAãø¶øÚÚÚéÚÚÚÚÚÚðéøéð¶â¶øð8é888Ú8ðéÜ8¶AmÔêAêqŠßAGøãøëýÓ¥e” + …Låë$ܶp€€ÛAßÄÔ€ðééééðð8Ú88ÚÚé¶ðø¶ø¶G¶éðððð8Úéé8ééâp€ÔœêHÐÔÐmÕßéÚÚ$ÓF𱂠+ ‹4Ùððé8ÜøÔêÐAâK€ðøø¶¶øøð8éÚÜÚ8Üø¶¶¶ø¶¶ðøéððð8ééðððøpAAœXHŽHAÔ¶éé8ÜdýÿZ®I· + —edéððG¶88âÐÀgÔê¶Gãmã¶øøøéðÚÚÜÜéøøø¶øøâ¶éøéðéðøøðø¶m€AXKÀÄÕ€øéøøÜ$$dÖbZú¯ + \`[ûÜéßâÚðããðÚ¶RÁRmmßßmm¶øéÚÚð8éÜéðø¶âââ¶¶G¶øðé8éøðøGmßÔŽÄNœA¶ãpâé88ÜëÞÿbÝ<\` + …sÿÙÜðAÕGÜÚðð88ÔE€p€pppâG¶é888éÚé8ø¶âããâââøøðÚéøø¶¶ãpÔêHþEqããÔâð¶øéÜëdýÖPz’ + ’çÙÙ$88GAßøÚÚéðãgÛAÔÔA€pãG¶¶¶ðð8éøð¶ããããããG¶¶¶ø¶¶mâãAŠgÀÁEÕßÔã$DàÓð88é$ýFU}· + ²ôÚ¶ÚëÚééømm8ë$GggÔÕqŠÔ€mãG¶G¶øðøø¶¶âmmmmmmâããâããßpßÔÐRþæÁÛ€D±cc‡µ9nj¾8dåZ™^\` + ¡OÙ¶mGÜÚÚé8ð¶ðÜéÔŽqêgêÛÔApmãâãGãGâ¶ãâmp€ppppp߀ßÔÔÕqÐŽÀNQãõjïI‡¤ííïoJ5Ü8èÒP¼‚ + (kÙ8¶ÔÔGÚ8ð88ðÚémKgœŽœÐêÛÔ€pmmmmm€ãpp€ßA€ÔÔÔAÔÔÔÔŠqgœHEE¥uvo¼l[[íƒzovJÝð$ýb9^\` + ´iPÙÚøø€qÔâéðøéðéâHHHŽœgêêÛÕ€pmpßm€ß€€AAÔÔÛÕÕŠÛÛÛŠêgœREŽŸ½‰¢%%î1j<>jr¼ÒGðÜýÒPï· + …rÒdðøøGmÔŠ€øéâøðâÄNÀXXXggÐêÕ€pp€AAÔÔAÔÔÔÕŠÛêqÛqqêÐœŽœý0z½‰¤t½ti + + diff --git a/src/app/button-cta/button-cta.component.scss b/src/app/button-cta/button-cta.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/button-cta/button-cta.component.spec.ts b/src/app/button-cta/button-cta.component.spec.ts new file mode 100644 index 0000000..33b818e --- /dev/null +++ b/src/app/button-cta/button-cta.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ButtonCtaComponent } from './button-cta.component'; + +describe('ButtonCtaComponent', () => { + let component: ButtonCtaComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ButtonCtaComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ButtonCtaComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/button-cta/button-cta.component.ts b/src/app/button-cta/button-cta.component.ts new file mode 100644 index 0000000..7433b3d --- /dev/null +++ b/src/app/button-cta/button-cta.component.ts @@ -0,0 +1,12 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + selector: 'iov-button-cta', + standalone: true, + imports: [], + templateUrl: './button-cta.component.html', + styleUrl: './button-cta.component.scss' +}) +export class ButtonCtaComponent { + @Input() url: string = ''; +} diff --git a/src/app/card-cta/card-cta.component.html b/src/app/card-cta/card-cta.component.html new file mode 100644 index 0000000..1a2bd35 --- /dev/null +++ b/src/app/card-cta/card-cta.component.html @@ -0,0 +1,17 @@ +
+
+
+ +
+
+ +
+
+ + + + +
+
+
diff --git a/src/app/card-cta/card-cta.component.scss b/src/app/card-cta/card-cta.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/card-cta/card-cta.component.spec.ts b/src/app/card-cta/card-cta.component.spec.ts new file mode 100644 index 0000000..23d1a66 --- /dev/null +++ b/src/app/card-cta/card-cta.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CardCtaComponent } from './card-cta.component'; + +describe('CardComponent', () => { + let component: CardCtaComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [CardCtaComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(CardCtaComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/card-cta/card-cta.component.ts b/src/app/card-cta/card-cta.component.ts new file mode 100644 index 0000000..b31e7f8 --- /dev/null +++ b/src/app/card-cta/card-cta.component.ts @@ -0,0 +1,18 @@ +import {Component, Input} from '@angular/core'; +import {ButtonCtaComponent} from "../button-cta/button-cta.component"; + +@Component({ + selector: 'iov-card', + standalone: true, + imports: [ + ButtonCtaComponent + ], + templateUrl: './card-cta.component.html', + styleUrl: './card-cta.component.scss' +}) +export class CardCtaComponent { + + @Input() color: 'light' | 'dark' = 'light'; + @Input() ctaUrl: string = ''; + @Input() borderRounded: boolean = true; +} diff --git a/src/app/fish/fish.component.html b/src/app/fish/fish.component.html new file mode 100644 index 0000000..a5e5ac4 --- /dev/null +++ b/src/app/fish/fish.component.html @@ -0,0 +1,37 @@ +
+ + + + + + + + +
diff --git a/src/app/fish/fish.component.scss b/src/app/fish/fish.component.scss new file mode 100644 index 0000000..53f9a36 --- /dev/null +++ b/src/app/fish/fish.component.scss @@ -0,0 +1,122 @@ +svg#fish { +} +/* Fish Animation */ +svg.fish{ + overflow:visible; +} + +@-webkit-keyframes swim +{ + 0% {left: -235px} + 90% {left: calc(100% - 235px); width: 235px;} + 100% {left: calc(100%); width: 0} +} + +@keyframes swim +{ + 0% {left: -235px} + 70% {left: calc(100% - 235px); width: 235px;} + 100% {left: calc(100%); width: 0} +} + +.fish{ + width: 235px; + height: 104px; + left: -235px; + position: absolute; + opacity: 0.4; + animation: swim 20s; + -webkit-animation: swim 20s; + animation-iteration-count: infinite; + -webkit-animation-iteration-count: infinite; + animation-timing-function: linear; + -webkit-animation-timing-function: linear; +} + +svg #fish1, +svg #fish2, +svg #fish3, +svg #fish4, +svg #fish5, +svg #fish6 { + fill:#528484; + + -moz-animation: bounce 2s infinite; + -webkit-animation: bounce 2s infinite; + animation: bounce 2s infinite; +} + +svg #fish2{ + animation-delay: 0.5s; + -webkit-animation-delay: 0.5s; +} + +svg #fish3{ + animation-delay: 0.2s; + -webkit-animation-delay: 0.2s; +} + +svg #fish4{ + animation-delay: 0.4s; + -webkit-animation-delay: 0.4s; +} + +svg #fish5{ + animation-delay: 0.1s; + -webkit-animation-delay: 0.1s; +} + +svg #fish6{ + animation-delay: 0.3s; + -webkit-animation-delay: 0.3s; +} + +/**/ +@-moz-keyframes bounce { + 0%, 50%, 100% { + -moz-transform: translateY(0); + transform: translateY(0); + } + 25% { + -moz-transform: translateY(-5px); + transform: translateY(-5px); + } + 75% { + -moz-transform: translateY(-3px); + transform: translateY(-3px); + } +} +@-webkit-keyframes bounce { + 0%, 50%, 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 25% { + -webkit-transform: translateY(-5px); + transform: translateY(-5px); + } + 75% { + -webkit-transform: translateY(-3px); + transform: translateY(-3px); + } +} +@keyframes bounce { + 0%, 50%, 100% { + -moz-transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + transform: translateY(0); + } + 25% { + -moz-transform: translateY(-5px); + -ms-transform: translateY(-5px); + -webkit-transform: translateY(-5px); + transform: translateY(-5px); + } + 75% { + -moz-transform: translateY(-3px); + -ms-transform: translateY(-3px); + -webkit-transform: translateY(-3px); + transform: translateY(-3px); + } +} diff --git a/src/app/fish/fish.component.spec.ts b/src/app/fish/fish.component.spec.ts new file mode 100644 index 0000000..f3e6084 --- /dev/null +++ b/src/app/fish/fish.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FishComponent } from './fish.component'; + +describe('FishComponent', () => { + let component: FishComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [FishComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(FishComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/fish/fish.component.ts b/src/app/fish/fish.component.ts new file mode 100644 index 0000000..0f435c2 --- /dev/null +++ b/src/app/fish/fish.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'iov-fish', + standalone: true, + imports: [], + templateUrl: './fish.component.html', + styleUrl: './fish.component.scss' +}) +export class FishComponent { + +} diff --git a/src/app/footer/footer.component.html b/src/app/footer/footer.component.html new file mode 100644 index 0000000..fb1418b --- /dev/null +++ b/src/app/footer/footer.component.html @@ -0,0 +1,32 @@ +
+ + +
+
Made with Angular + + + + and TailwindCSS + + + +
+
+ + Check the source code +
+
+
diff --git a/src/app/footer/footer.component.scss b/src/app/footer/footer.component.scss new file mode 100644 index 0000000..12f7a5d --- /dev/null +++ b/src/app/footer/footer.component.scss @@ -0,0 +1,6 @@ +:host-context { + position: relative; + width: 100%; + display: block; + bottom: 0px; +} diff --git a/src/app/footer/footer.component.spec.ts b/src/app/footer/footer.component.spec.ts new file mode 100644 index 0000000..4647de8 --- /dev/null +++ b/src/app/footer/footer.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FooterComponent } from './footer.component'; + +describe('FooterComponent', () => { + let component: FooterComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [FooterComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(FooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts new file mode 100644 index 0000000..ae62538 --- /dev/null +++ b/src/app/footer/footer.component.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core'; +import {FishComponent} from "../fish/fish.component"; +import {CardCtaComponent} from "../card-cta/card-cta.component"; +import {NgOptimizedImage} from "@angular/common"; + +@Component({ + selector: 'iov-footer', + standalone: true, + imports: [ + CardCtaComponent, + FishComponent, + NgOptimizedImage + ], + templateUrl: './footer.component.html', + styleUrl: './footer.component.scss' +}) +export class FooterComponent { + +} diff --git a/src/app/hero/hero.component.html b/src/app/hero/hero.component.html new file mode 100644 index 0000000..498c79c --- /dev/null +++ b/src/app/hero/hero.component.html @@ -0,0 +1,44 @@ +
+
+
+
+ + +
+ +

Hey, I'm Lorenzo!

+
+

+ I'm on a quest to uncover life's meaning while diving deep into my passion for Computer Science as a Software Engineer. +
Here, on my personal website, I share my projects and occasional thoughts. +

+ +
+ Explore more about me and feel free to reach out for any questions or collaborations via + email + or on socials! + +
+
+
+
+
+
+
+
+
diff --git a/src/app/hero/hero.component.scss b/src/app/hero/hero.component.scss new file mode 100644 index 0000000..a6511e4 --- /dev/null +++ b/src/app/hero/hero.component.scss @@ -0,0 +1,28 @@ +@keyframes blink { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes blink-inverted { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +#asciiPhoto { + opacity: 0; + animation: blink-inverted 2s 1; +} + +#originalPhoto { + opacity: 1; + animation: blink 2s 1; +} + diff --git a/src/app/hero/hero.component.spec.ts b/src/app/hero/hero.component.spec.ts new file mode 100644 index 0000000..13beb6c --- /dev/null +++ b/src/app/hero/hero.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HeroComponent } from './hero.component'; + +describe('HeroComponent', () => { + let component: HeroComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HeroComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HeroComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/hero/hero.component.ts b/src/app/hero/hero.component.ts new file mode 100644 index 0000000..9a27a6e --- /dev/null +++ b/src/app/hero/hero.component.ts @@ -0,0 +1,23 @@ +import {Component} from '@angular/core'; +import {AsciiPhotoComponent} from "../ascii-photo/ascii-photo.component"; +import {AsyncPipe, NgClass, NgIf, NgOptimizedImage} from "@angular/common"; +import {Ng2FittextModule} from "ng2-fittext"; + +@Component({ + selector: 'iov-hero', + standalone: true, + imports: [ + AsciiPhotoComponent, + NgIf, + NgClass, + AsyncPipe, + NgOptimizedImage, + Ng2FittextModule, + ], + templateUrl: './hero.component.html', + styleUrl: './hero.component.scss' +}) +export class HeroComponent { + constructor() { + } +} diff --git a/src/app/highlight/highlight.component.html b/src/app/highlight/highlight.component.html new file mode 100644 index 0000000..abedd3d --- /dev/null +++ b/src/app/highlight/highlight.component.html @@ -0,0 +1,14 @@ + +

Latest blog post

+
+
+ + +
+ View all posts +
+
+

No posts yet.

+
+
+
diff --git a/src/app/highlight/highlight.component.scss b/src/app/highlight/highlight.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/highlight/highlight.component.spec.ts b/src/app/highlight/highlight.component.spec.ts new file mode 100644 index 0000000..af97bc6 --- /dev/null +++ b/src/app/highlight/highlight.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HighlightComponent } from './highlight.component'; + +describe('HighlightComponent', () => { + let component: HighlightComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HighlightComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HighlightComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/highlight/highlight.component.ts b/src/app/highlight/highlight.component.ts new file mode 100644 index 0000000..af9876c --- /dev/null +++ b/src/app/highlight/highlight.component.ts @@ -0,0 +1,68 @@ +import { Component } from '@angular/core'; +import {SectionComponent} from "../section/section.component"; +import {Post} from "../models/post"; +import {PostCardComponent} from "../post-card/post-card.component"; +import {NgForOf, NgIf} from "@angular/common"; +import {RouterLink} from "@angular/router"; + +@Component({ + selector: 'iov-highlight', + standalone: true, + imports: [ + SectionComponent, + PostCardComponent, + NgForOf, + NgIf, + RouterLink + ], + templateUrl: './highlight.component.html', + styleUrl: './highlight.component.scss' +}) +export class HighlightComponent { + posts: Post[] = [ + { + title: 'Post 1', + description: 'Description 1', + content: 'Content 1', + date: new Date(), + readTime: 1, + slug: 'post-1', + image: 'https://picsum.photos/300/200' + }, + { + title: 'Post 1', + description: 'Description 1', + content: 'Content 1', + date: new Date(), + readTime: 1, + slug: 'post-1', + image: 'https://picsum.photos/300/200' + }, + { + title: 'Post 1', + description: 'Description 1', + content: 'Content 1', + date: new Date(), + readTime: 1, + slug: 'post-1', + image: 'https://picsum.photos/300/200' + },{ + title: 'Post 1', + description: 'Description 1', + content: 'Content 1', + date: new Date(), + readTime: 1, + slug: 'post-1', + image: 'https://picsum.photos/300/200' + },{ + title: 'Post 1', + description: 'Description 1', + content: 'Content 1', + date: new Date(), + readTime: 1, + slug: 'post-1', + image: 'https://picsum.photos/300/200' + } + ] + +} diff --git a/src/app/menu/menu.component.html b/src/app/menu/menu.component.html index a1081eb..bae1019 100644 --- a/src/app/menu/menu.component.html +++ b/src/app/menu/menu.component.html @@ -1,3 +1,37 @@ -

- menu works! -

+ + diff --git a/src/app/menu/menu.component.ts b/src/app/menu/menu.component.ts index a675060..1179cf2 100644 --- a/src/app/menu/menu.component.ts +++ b/src/app/menu/menu.component.ts @@ -1,12 +1,21 @@ import { Component } from '@angular/core'; +import {ButtonCtaComponent} from "../button-cta/button-cta.component"; +import {Router} from "@angular/router"; @Component({ selector: 'iov-menu', standalone: true, - imports: [], + imports: [ + ButtonCtaComponent + ], templateUrl: './menu.component.html', styleUrl: './menu.component.scss' }) export class MenuComponent { + constructor(public router: Router) { + + } + + } diff --git a/src/app/models/job.ts b/src/app/models/job.ts new file mode 100644 index 0000000..4e1302e --- /dev/null +++ b/src/app/models/job.ts @@ -0,0 +1,7 @@ +export interface Job { + website: string | undefined + image: string | undefined; + description: string; + role: string; + name: string; +} diff --git a/src/app/models/post.ts b/src/app/models/post.ts new file mode 100644 index 0000000..d586af1 --- /dev/null +++ b/src/app/models/post.ts @@ -0,0 +1,9 @@ +export interface Post { + title: string; + slug: string; + description: string; + content: string; + date: Date; + readTime: number; + image: string; +} diff --git a/src/app/page/page.component.html b/src/app/page/page.component.html new file mode 100644 index 0000000..1301a6c --- /dev/null +++ b/src/app/page/page.component.html @@ -0,0 +1,5 @@ +
+
+ +
+
diff --git a/src/app/page/page.component.scss b/src/app/page/page.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/page/page.component.spec.ts b/src/app/page/page.component.spec.ts new file mode 100644 index 0000000..c389595 --- /dev/null +++ b/src/app/page/page.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PageComponent } from './page.component'; + +describe('PageComponent', () => { + let component: PageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PageComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/page/page.component.ts b/src/app/page/page.component.ts new file mode 100644 index 0000000..333aad4 --- /dev/null +++ b/src/app/page/page.component.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core'; +import {FooterComponent} from "../footer/footer.component"; +import {RouterOutlet} from "@angular/router"; + +@Component({ + selector: 'iov-page', + standalone: true, + imports: [ + FooterComponent, + RouterOutlet + ], + templateUrl: './page.component.html', + styleUrl: './page.component.scss' +}) +export class PageComponent { + +} diff --git a/src/app/pages/biography/biography.page.html b/src/app/pages/biography/biography.page.html new file mode 100644 index 0000000..1aaa83f --- /dev/null +++ b/src/app/pages/biography/biography.page.html @@ -0,0 +1,163 @@ + +
+

Hello world!

+

+ Hello! I'm Lorenzo Iovino, and i hope that i would be something more that only a "Software Engineer" (that's my job and one of my passions)
+ I'm embarking on an exhilarating journey that began back in December 1988 and continues to evolve with each passing day. +
+ Join me on this riveting expedition where technology meets creativity, thoughts are shared, and passions are pursued. That's my life. +

+
+ +
+

Childhood Nostalgia 🧒

+
+ + My love affair with technology sparked at the tender age of four when I delved into the realms of Prince of Persia on the Apple II. +
+ Super young software developer with an Apple II + Super young software developer with an Apple II +
+ Fast forward to the present, and computers have seamlessly woven into the fabric of my professional life, while everything IT-related has become the heartbeat of my passion.
+ Rewind to my childhood in Ispica, where I initially balanced my time between studying, playing video games, and kicking a football around with friends, it was a simple life, but it was a happy one.
+ The town of Ispica is located in the south of sicily, and it's a place where time seems to stand still. The unhurried pace of life, the warmth of the people, and the breathtaking landscapes create a serene backdrop for my childhood memories. But it was something that i really hated when i was child, infact i was always dreaming to live in a big city, where i could find more opportunities.



+
+ Pokemon Yellow + Pokemon Yellow and Game Boy Advance +
+ The gaming sessions with friends extended to the world of Pokemon and Nintendo consoles, a phase that not only provided joy but also unraveled the mysteries of computer programming.
+ At the age of 15, the discovery of rock music sparked a new passion, and I eagerly picked up a guitar to learn its rhythmic language and stunning solos. +
+
+ Guitarist + My dream guitar "Fender stratocaster" +
+ The gaming and music universe made me a "nerd," leading to my fascination with understanding the intricacies of computers, programming languages, and the magic beneath the hood.
+ At 17, I ventured into the realm of Magic: The Gathering, further enriching my interests. To this day, I continue to enjoy occasional matches in my spare time. +
+
+ +
+

University and Personal Growth 🏫

+
+ Educationally, I've left no stone unturned.
+ I've immersed myself in the intricacies of computer science attending the Computer Science course at the University of Pisa, devouring books (not exactly the suggested ones for the class), retry +
+ Me in Pisa + Me burning out studying Computability and
Complexity exam
+
+ N-times the same exam and engaging in online courses and workshops in order to understand better what it's exactly computer science + (and i've still have a lot of doubdts regarding Computability and Complexity topic) + +
+
+ It's this insatiable appetite for knowledge and networking that fuels my perpetual quest for growth and it did it never surrender despite my long journey as a student (i took just 12 years to get my Bachelor of Arts).

+ Anyway, embarking on the journey that led me to the picturesque city of Pisa was not merely a pursuit of knowledge in computer science (the University of Pisa, with its rich history and academic excellence, provided the perfect backdrop for me to immerse myself in this world of endless possibilities); it was a harmonious convergence of two profound needs: computer science and the curiosity about the world (the non-digital one). +
+ My goliardo + My student hat (that's not an hat) "goliardo" +
+

+ During my university years, I not only delved into the world of computer science but also embraced the richness of life's experiences; I spent considerable time getting to know people, immersing myself in the Goliardia culture, honing my taste buds through a wine Sommelier course, attending concert and meet all kind of people in music club borderline (that one I really loved to do), unlimited speech with perfect stranger during my "Aperitivo" around the city, sharing experience and learning everyday something new.
This period of exploration ignited a passion for travel, opening my eyes to diverse cultures and expanding my horizons. +
+
+ +
+

Embarking on Hackathon Adventures 🚀

+
+
+ Me with moverio smart glasses + Me wearing moverio smart glasses +
+ My journey into the world of hackathons began with one organized by Vargroup.
+ The whole team was completly created there, nobody of us will know each other, but we all have shared a passion for technology, and together, + we crafted a Proof of Concept software and a business plan (in 24 hours) for a revolutionary retail application focused on furniture sales.
+ The application, designed for Epson Moverio Smartglass, allowed customers to virtually furnish their homes, creating a unique and immersive shopping experience. +

+ This inaugural hackathon experience ignited my enthusiasm, leading me to participate in various other hackathons, including Hackaton Toscana for mobility and engaging in many other game jams. Each hackathon presented new challenges, fostering collaboration and pushing the boundaries of my skills.
+
+ Me at global game jam presenting our game + Me and the team presenting the game developed.
Gameplay of our game "Oh No My Husband is coming" developed for GGJ 2015: Youtube link
+
+
+
+ +
+

Erasmus Project in Valencia 🌍

+
+ A pivotal chapter in my journey unfolded during my Erasmus project in the vibrant city of Valencia. I continued study Computer Science in the Universidad Politecnica +
+ Valencia turia + Beautiful sunny day in Valencia +
+ where i also meet a lot of people from all over the world, and i had the opportunity to learn a lot of things about different cultures and languages.

+ The IT environment in Valencia was a stark contrast to the Italian landscape, offering a unique perspective on the world of technology, new startups and innovative companies were emerging in that period, and the city was a hotbed of innovation.
+ Surrounded by the stunning blend of modern architecture and traditional Spanish charm, this cultural immersion not only enriched my academic pursuits but also offered a canvas for personal growth. +
+
+ +
+

Embracing the Tranquility of Sicily 🏡

+
+ Nestled in the heart of Sicily, my decision to return to my hometown wasn't just a homecoming; it was a deliberate choice to create a life where the pace of time mirrors the gentle ebb and flow of the Mediterranean waves.
+
+ Remote working + Working remote watching the sea +
+ + Transitioning from the bustling tech hubs to the serene landscapes of Sicily has been a profound and intentional shift. Rediscover the beauty of slowness and the joy of doing "nothing special" every day, and i've found a new balance between my professional and personal life. + When the "nothing special" turn in "something special" and you can enjoy the beauty of the nature that surround you.

+ As a remote worker, I've found solace in the unhurried rhythm of life here. The island's charm lies not only in its breathtaking landscapes but also in the unhurried passage of time.
+ Sicily has a unique way of making each moment feel like an eternity, a welcome departure from the frenetic pace of urban life.
It's a place where the clock seems to pause, allowing me to savor every nuance of existence.
+
+ Dogs watch wineyard + My wineyard +
+ Family plays a central role in my Sicilian life, in the pursuit of passions beyond the realms of technology, I embarked on a delightful side project alongside my sister (she's the agronomist). + Together, we decided to make our wine, planting and growing up a wineyard in a waste terrain near the sea, so it birth www.netum.it, that's the culmination of our shared love for winemaking, and with only 1 hectar of wineyard, we produce a limited amount of bottles of a unique wine. +
+ Dogs watch wineyard + The wine produced "Zia Lina" +
+

+ And then, of course, there's the food. Sicilian cuisine is a symphony of flavors that dance on the taste buds. Each bite is a celebration of the island's rich culinary heritage. The slow food movement isn't just a trend here; it's a way of life.
Dining is an experience, a time to savor and appreciate the artistry that goes into every dish.
+ (i will not post any photo of food, because i'm not a food blogger, but trust me, it's really good).

+ + In the midst of vineyards and olive groves, my life as a remote worker in Sicily is a testament to the beauty of simplicity. + +
It's a daily reminder that success isn't just measured in code lines but also in the quality of life we cultivate. Sicily, with its unhurried pace, has become more than a backdrop for my career; it's a canvas on which I paint the vibrant tapestry of my life. Here, time may move slowly, but the impact is timeless. 🌿🍷🌞
+
+ Modica view + Modica view from my house +
+
+
+ +
+

Life at 35

+
+ Fast forward to the present day, where I've embraced the roles of a husband to my wonderful wife, Amanda, and a proud father of a little joy named Leonardo.
Life's journey has woven a tapestry of experiences, blending the worlds of technology, family, and personal passions.
+ + +
+ Me and my wife + Me and my wife Amanda +
+
+
+
diff --git a/src/app/pages/biography/biography.page.scss b/src/app/pages/biography/biography.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/biography/biography.page.spec.ts b/src/app/pages/biography/biography.page.spec.ts new file mode 100644 index 0000000..5b7aab5 --- /dev/null +++ b/src/app/pages/biography/biography.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BiographyPage } from './biography.page'; + +describe('BiographyPage', () => { + let component: BiographyPage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [BiographyPage] + }) + .compileComponents(); + + fixture = TestBed.createComponent(BiographyPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/biography/biography.page.ts b/src/app/pages/biography/biography.page.ts new file mode 100644 index 0000000..67680d4 --- /dev/null +++ b/src/app/pages/biography/biography.page.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core'; +import {SectionComponent} from "../../section/section.component"; +import {PageComponent} from "../../page/page.component"; +import {NgOptimizedImage} from "@angular/common"; + +@Component({ + selector: 'iov-biography-page', + standalone: true, + imports: [ + SectionComponent, + PageComponent, + NgOptimizedImage + ], + templateUrl: './biography.page.html', + styleUrl: './biography.page.scss' +}) +export class BiographyPage { + +} diff --git a/src/app/pages/blog/blog.page.html b/src/app/pages/blog/blog.page.html new file mode 100644 index 0000000..ff0c151 --- /dev/null +++ b/src/app/pages/blog/blog.page.html @@ -0,0 +1 @@ +

blog works!

diff --git a/src/app/pages/blog/blog.page.scss b/src/app/pages/blog/blog.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/blog/blog.page.spec.ts b/src/app/pages/blog/blog.page.spec.ts new file mode 100644 index 0000000..e3a0350 --- /dev/null +++ b/src/app/pages/blog/blog.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BlogPage } from './blog.page'; + +describe('BlogComponent', () => { + let component: BlogPage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [BlogPage] + }) + .compileComponents(); + + fixture = TestBed.createComponent(BlogPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/blog/blog.page.ts b/src/app/pages/blog/blog.page.ts new file mode 100644 index 0000000..e53f7f3 --- /dev/null +++ b/src/app/pages/blog/blog.page.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'iov-blog-page', + standalone: true, + imports: [], + templateUrl: './blog.page.html', + styleUrl: './blog.page.scss' +}) +export class BlogPage { + +} diff --git a/src/app/pages/contact-me/contact-me.page.html b/src/app/pages/contact-me/contact-me.page.html new file mode 100644 index 0000000..63c441f --- /dev/null +++ b/src/app/pages/contact-me/contact-me.page.html @@ -0,0 +1 @@ +

contact-me works!

diff --git a/src/app/pages/contact-me/contact-me.page.scss b/src/app/pages/contact-me/contact-me.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/contact-me/contact-me.page.spec.ts b/src/app/pages/contact-me/contact-me.page.spec.ts new file mode 100644 index 0000000..6758399 --- /dev/null +++ b/src/app/pages/contact-me/contact-me.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ContactMePage } from './contact-me.page'; + +describe('ContactMeComponent', () => { + let component: ContactMePage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ContactMePage] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ContactMePage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/contact-me/contact-me.page.ts b/src/app/pages/contact-me/contact-me.page.ts new file mode 100644 index 0000000..8a42aa5 --- /dev/null +++ b/src/app/pages/contact-me/contact-me.page.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'iov-contact-me-page', + standalone: true, + imports: [], + templateUrl: './contact-me.page.html', + styleUrl: './contact-me.page.scss' +}) +export class ContactMePage { + +} diff --git a/src/app/pages/home/home.page.html b/src/app/pages/home/home.page.html new file mode 100644 index 0000000..c69f1bd --- /dev/null +++ b/src/app/pages/home/home.page.html @@ -0,0 +1,14 @@ +
+ +
+ + + + + diff --git a/src/app/pages/home/home.page.scss b/src/app/pages/home/home.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/home/home.page.spec.ts b/src/app/pages/home/home.page.spec.ts new file mode 100644 index 0000000..87c7e5d --- /dev/null +++ b/src/app/pages/home/home.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomePage } from './home.page'; + +describe('HomeComponent', () => { + let component: HomePage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HomePage] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HomePage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/home/home.page.ts b/src/app/pages/home/home.page.ts new file mode 100644 index 0000000..00d5304 --- /dev/null +++ b/src/app/pages/home/home.page.ts @@ -0,0 +1,29 @@ +import { Component } from '@angular/core'; +import {HeroComponent} from "../../hero/hero.component"; +import {SectionComponent} from "../../section/section.component"; +import {PageComponent} from "../../page/page.component"; +import {FooterComponent} from "../../footer/footer.component"; +import {ArrowScrollDownComponent} from "../../arrow-scroll-down/arrow-scroll-down.component"; +import {FishComponent} from "../../fish/fish.component"; +import {HighlightComponent} from "../../highlight/highlight.component"; +import {CardCtaComponent} from "../../card-cta/card-cta.component"; + +@Component({ + selector: 'iov-home-page', + standalone: true, + imports: [ + HeroComponent, + SectionComponent, + PageComponent, + FooterComponent, + CardCtaComponent, + ArrowScrollDownComponent, + FishComponent, + HighlightComponent + ], + templateUrl: './home.page.html', + styleUrl: './home.page.scss' +}) +export class HomePage { + +} diff --git a/src/app/pages/like-dislike/like-dislike.page.html b/src/app/pages/like-dislike/like-dislike.page.html new file mode 100644 index 0000000..f8ceafb --- /dev/null +++ b/src/app/pages/like-dislike/like-dislike.page.html @@ -0,0 +1,2 @@ +

like-dislike works!

+What i like and what i dislike in general, funny section diff --git a/src/app/pages/like-dislike/like-dislike.page.scss b/src/app/pages/like-dislike/like-dislike.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/like-dislike/like-dislike.page.spec.ts b/src/app/pages/like-dislike/like-dislike.page.spec.ts new file mode 100644 index 0000000..1fc598f --- /dev/null +++ b/src/app/pages/like-dislike/like-dislike.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LikeDislikePage } from './like-dislike.page'; + +describe('LikeDislikeComponent', () => { + let component: LikeDislikePage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [LikeDislikePage] + }) + .compileComponents(); + + fixture = TestBed.createComponent(LikeDislikePage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/like-dislike/like-dislike.page.ts b/src/app/pages/like-dislike/like-dislike.page.ts new file mode 100644 index 0000000..38bf1e7 --- /dev/null +++ b/src/app/pages/like-dislike/like-dislike.page.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'iov-like-dislike', + standalone: true, + imports: [], + templateUrl: './like-dislike.page.html', + styleUrl: './like-dislike.page.scss' +}) +export class LikeDislikePage { + +} diff --git a/src/app/pages/portfolio/disclaimer/disclaimer.component.html b/src/app/pages/portfolio/disclaimer/disclaimer.component.html new file mode 100644 index 0000000..a286238 --- /dev/null +++ b/src/app/pages/portfolio/disclaimer/disclaimer.component.html @@ -0,0 +1,13 @@ + + + +
+

⚠️I accept the risk to get a non-complete portfolio experience ⚠️

+ I've no fear! Bring me to Mordor +
+
diff --git a/src/app/pages/portfolio/disclaimer/disclaimer.component.scss b/src/app/pages/portfolio/disclaimer/disclaimer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/portfolio/disclaimer/disclaimer.component.spec.ts b/src/app/pages/portfolio/disclaimer/disclaimer.component.spec.ts new file mode 100644 index 0000000..17cca29 --- /dev/null +++ b/src/app/pages/portfolio/disclaimer/disclaimer.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DisclaimerComponent } from './disclaimer.component'; + +describe('DisclaimerComponent', () => { + let component: DisclaimerComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DisclaimerComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DisclaimerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/portfolio/disclaimer/disclaimer.component.ts b/src/app/pages/portfolio/disclaimer/disclaimer.component.ts new file mode 100644 index 0000000..027ccec --- /dev/null +++ b/src/app/pages/portfolio/disclaimer/disclaimer.component.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core'; +import {SectionComponent} from "../../../section/section.component"; +import {NgOptimizedImage} from "@angular/common"; + +@Component({ + selector: 'iov-disclaimer', + standalone: true, + imports: [ + SectionComponent, + NgOptimizedImage + ], + templateUrl: './disclaimer.component.html', + styleUrl: './disclaimer.component.scss' +}) +export class DisclaimerComponent { + +} diff --git a/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.html b/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.html new file mode 100644 index 0000000..951f4f8 --- /dev/null +++ b/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.html @@ -0,0 +1,27 @@ +
+ +
{{job?.name}}
{{job?.role}}
+
+
{{job?.name}}
{{job?.role}}
+
+ + Visit Website + +
+ +
+ diff --git a/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.scss b/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.spec.ts b/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.spec.ts new file mode 100644 index 0000000..b96c3da --- /dev/null +++ b/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PortfolioItemCardComponent } from './portfolio-item-card.component'; + +describe('PortfolioCardComponent', () => { + let component: PortfolioItemCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PortfolioItemCardComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PortfolioItemCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.ts b/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.ts new file mode 100644 index 0000000..257690e --- /dev/null +++ b/src/app/pages/portfolio/portfolio-item-card/portfolio-item-card.component.ts @@ -0,0 +1,19 @@ +import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Job} from "../../../models/job"; +import {NgIf, NgOptimizedImage} from "@angular/common"; + +@Component({ + selector: 'iov-portfolio-item-card', + standalone: true, + imports: [ + NgOptimizedImage, + NgIf + ], + templateUrl: './portfolio-item-card.component.html', + styleUrl: './portfolio-item-card.component.scss' +}) +export class PortfolioItemCardComponent { + @Output() expand: EventEmitter = new EventEmitter(); + @Input() job: Job | undefined + @Input() expanded: boolean = false; +} diff --git a/src/app/pages/portfolio/portfolio.page.html b/src/app/pages/portfolio/portfolio.page.html new file mode 100644 index 0000000..b911122 --- /dev/null +++ b/src/app/pages/portfolio/portfolio.page.html @@ -0,0 +1,11 @@ + +
+
+
+ + +
+
+
+
diff --git a/src/app/pages/portfolio/portfolio.page.scss b/src/app/pages/portfolio/portfolio.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/portfolio/portfolio.page.spec.ts b/src/app/pages/portfolio/portfolio.page.spec.ts new file mode 100644 index 0000000..6fd38e3 --- /dev/null +++ b/src/app/pages/portfolio/portfolio.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PortfolioPage } from './portfolio.page'; + +describe('WorksComponent', () => { + let component: PortfolioPage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PortfolioPage] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PortfolioPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/portfolio/portfolio.page.ts b/src/app/pages/portfolio/portfolio.page.ts new file mode 100644 index 0000000..f233c21 --- /dev/null +++ b/src/app/pages/portfolio/portfolio.page.ts @@ -0,0 +1,100 @@ +import { Component } from '@angular/core'; +import {SectionComponent} from "../../section/section.component"; +import {PageComponent} from "../../page/page.component"; +import {FooterComponent} from "../../footer/footer.component"; +import {RouterOutlet} from "@angular/router"; +import {NgForOf, NgIf} from "@angular/common"; +import {PortfolioItemCardComponent} from "./portfolio-item-card/portfolio-item-card.component"; +import {Job} from "../../models/job"; +@Component({ + selector: 'iov-portfolio-page', + standalone: true, + imports: [ + SectionComponent, + PageComponent, + FooterComponent, + RouterOutlet, + NgForOf, + NgIf, + PortfolioItemCardComponent + ], + templateUrl: './portfolio.page.html', + styleUrl: './portfolio.page.scss' +}) +export class PortfolioPage { + + expandedJob: number = -1; + jobs: Job[] = [ + { + name: 'ChiamarsiBomber', + role: 'Tech Lead', + description: 'I lead the charge in developing a cutting-edge web platform for football infotainment.
Navigating the intricacies of real-time data integration and ensuring high availability during peak periods, I orchestrate the small (3 person) team to deliver the best experience for our customers.', + website: 'https://chiamarsibomber.com/', + image: 'assets/portfolio/chiamarsibomber.jpeg' + }, + { + name: 'Iubenda', + role: 'Lead Backend Engineer', + description: 'I assumed the role of Lead Backend Engineer, steering a small team in the maintenance and evolution of the critical Radar code product (NodeJs + Typescript).
' + + 'This crawler identifies GDPR non-compliant websites, playing a pivotal role in revenue generation.
', + website: 'https://radar.iubenda.com/docs/', + image: 'assets/portfolio/iubenda.png' + }, + { + name: 'Alcon', + role: 'Frontend Developer', + description: 'I was responsible for the development of a new web platform for the Vision Care department.
' + + 'I worked closely with the UX team and a huge FE team (30 people) to deliver a seamless experience, and with the backend team to ensure a smooth integration with the existing systems.
' + + 'The whole project was based on Angular + SAP Spartacus for FE.
', + website: 'https://www.myalcon.com', + image: 'assets/portfolio/alcon.png' + }, + { + name: 'Acker', + role: 'Lead Frontend Developer', + description: 'I spearheaded the development of an educational website for kids for the acker german startup.
' + + 'I also made architectural decisions in order to improve SEO and speed, deciding to utilize Nuxt (a Vue framework) for FE and Strapi for the BE and to manage the myriad of integrated external services.
' + + 'I’ve also worked on the implementation of their backoffice bootstrapping the project and then handing over the know-how and the codebase to their internal tech team.
', + website: 'https://acker.co/', + image: 'assets/portfolio/acker.svg' + }, + { + name: 'Medicami', + role: 'Tech Lead', + description: 'I\'ve realized a mobile App with Angular + Ionic + Loopack that communicates with neoped (pediatric CRM) to manage medical remote visits, managing health documents. I’ve also built the whole CI/CDAWS infrastructure (ECS + ECR).
' + + 'The backoffice and the landing page was realized in Nuxt with a focus on SEO and performance.
' + + 'The app was in the app stores for 3 years (with 4.5 avg point review), then the company was dismissed and neoped product sold.
', + website: undefined, + image: 'assets/portfolio/medicami.png' + }, + { + name: 'Fullstack Agency', + role: 'Frontend Developer', + description: 'As a Frontend Developer at FullstackAgency, I was responsible for the development of the first version of the frontend of one of their MVP products.
' + + 'I worked closely with the UX team and with the backend team to ensure a smooth integration with the existing systems.
' + + 'I also realized for the project (in Angular) a huge UI library with Storybook with reusable components.
', + website: 'https://www.fullstackagency.it/', + image: 'assets/portfolio/fullstackagency.png' + }, + { + name: 'CsProject', + role: 'Tech Lead', + description: 'My role at CsProject involved creating a new web-based product based on a legacy .NET system (PROMAN), not only from the implementation point of view (Angular + Express) but also taking care of creating up a development team, making a delivery plan and allocating resources.
' + + 'Through strategic planning and team collaboration, we successfully bridged the past and future, delivering a modern, responsive, and user-friendly experience.
', + website: 'https://www.csproject.it/', + image: 'assets/portfolio/csproject.png' + }, + { + name: 'Tuotempo', + role: 'Frontend Developer', + description: 'As part of the team at Tuotempo, I actively contributed to the development of a crucial web application for healthcare management. This application is a SaaS and it serves multiple hospitals (worldwide), streamlining patient care processes.
' + + 'I evolved and maintained the existing application utilizing Backbone.js to ensure an efficient and responsive user experience.
', + website: 'https://tuotempo.it/', + image: 'assets/portfolio/tuotempo.svg' + }, + ] + + expand(index: number) { + this.expandedJob = index; + } +} diff --git a/src/app/pages/projects/projects.page.html b/src/app/pages/projects/projects.page.html new file mode 100644 index 0000000..0ec7d57 --- /dev/null +++ b/src/app/pages/projects/projects.page.html @@ -0,0 +1,5 @@ + + + +

ng2 fittext + netum In progress...

diff --git a/src/app/pages/projects/projects.page.scss b/src/app/pages/projects/projects.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/projects/projects.page.spec.ts b/src/app/pages/projects/projects.page.spec.ts new file mode 100644 index 0000000..ab45e00 --- /dev/null +++ b/src/app/pages/projects/projects.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProjectsPage } from './projects.page'; + +describe('ProjectsComponent', () => { + let component: ProjectsPage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProjectsPage] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ProjectsPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/projects/projects.page.ts b/src/app/pages/projects/projects.page.ts new file mode 100644 index 0000000..bbe6ca3 --- /dev/null +++ b/src/app/pages/projects/projects.page.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core'; +import {SectionComponent} from "../../section/section.component"; +import {PageComponent} from "../../page/page.component"; + +@Component({ + selector: 'iov-projects-page', + standalone: true, + imports: [ + SectionComponent, + PageComponent + ], + templateUrl: './projects.page.html', + styleUrl: './projects.page.scss' +}) +export class ProjectsPage { + +} diff --git a/src/app/post-card/post-card.component.html b/src/app/post-card/post-card.component.html new file mode 100644 index 0000000..2d3961d --- /dev/null +++ b/src/app/post-card/post-card.component.html @@ -0,0 +1,16 @@ +
+
+ + + +
+ +
{{post?.title}}
+
+

{{post?.description}}

+ + Read more + +
+
+
diff --git a/src/app/post-card/post-card.component.scss b/src/app/post-card/post-card.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/post-card/post-card.component.spec.ts b/src/app/post-card/post-card.component.spec.ts new file mode 100644 index 0000000..30f4f4c --- /dev/null +++ b/src/app/post-card/post-card.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PostCardComponent } from './post-card.component'; + +describe('PostCardComponent', () => { + let component: PostCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PostCardComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PostCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/post-card/post-card.component.ts b/src/app/post-card/post-card.component.ts new file mode 100644 index 0000000..208787c --- /dev/null +++ b/src/app/post-card/post-card.component.ts @@ -0,0 +1,17 @@ +import {Component, Input} from '@angular/core'; +import {Post} from "../models/post"; +import {JsonPipe, NgOptimizedImage} from "@angular/common"; + +@Component({ + selector: 'iov-post-card', + standalone: true, + imports: [ + JsonPipe, + NgOptimizedImage + ], + templateUrl: './post-card.component.html', + styleUrl: './post-card.component.scss' +}) +export class PostCardComponent { + @Input() post: Post | undefined; +} diff --git a/src/app/section/section.component.html b/src/app/section/section.component.html new file mode 100644 index 0000000..89caf40 --- /dev/null +++ b/src/app/section/section.component.html @@ -0,0 +1,10 @@ +
+

{{title}}

+
+
+ +
diff --git a/src/app/section/section.component.scss b/src/app/section/section.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/section/section.component.spec.ts b/src/app/section/section.component.spec.ts new file mode 100644 index 0000000..ac46d65 --- /dev/null +++ b/src/app/section/section.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SectionComponent } from './section.component'; + +describe('SectionComponent', () => { + let component: SectionComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SectionComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SectionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/section/section.component.ts b/src/app/section/section.component.ts new file mode 100644 index 0000000..8603fae --- /dev/null +++ b/src/app/section/section.component.ts @@ -0,0 +1,17 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + selector: 'iov-section', + standalone: true, + imports: [ + ], + templateUrl: './section.component.html', + styleUrl: './section.component.scss' +}) +export class SectionComponent { + @Input() title: string = ''; + @Input() titleColor: 'light' | 'dark' = 'light'; + @Input() backgroundImageUrl: string = ''; + @Input() backgroundColor: 'light' | 'dark' = 'light'; + @Input() noHeight: boolean = false; +} diff --git a/src/assets/angular.svg b/src/assets/angular.svg new file mode 100644 index 0000000..bf081ac --- /dev/null +++ b/src/assets/angular.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/src/assets/cat.jpg b/src/assets/cat.jpg new file mode 100755 index 0000000..d287b26 Binary files /dev/null and b/src/assets/cat.jpg differ diff --git a/src/assets/cloud.JPG b/src/assets/cloud.JPG new file mode 100755 index 0000000..5403a8b Binary files /dev/null and b/src/assets/cloud.JPG differ diff --git a/src/assets/github.svg b/src/assets/github.svg new file mode 100644 index 0000000..2dfec51 --- /dev/null +++ b/src/assets/github.svg @@ -0,0 +1,19 @@ + + + + + github [#142] + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/green.JPG b/src/assets/green.JPG new file mode 100755 index 0000000..9185379 Binary files /dev/null and b/src/assets/green.JPG differ diff --git a/src/assets/linkedin.svg b/src/assets/linkedin.svg new file mode 100644 index 0000000..02530e7 --- /dev/null +++ b/src/assets/linkedin.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/assets/photos/dogs.jpg b/src/assets/photos/dogs.jpg new file mode 100644 index 0000000..d4b33c8 Binary files /dev/null and b/src/assets/photos/dogs.jpg differ diff --git a/src/assets/photos/game-jam.jpg b/src/assets/photos/game-jam.jpg new file mode 100644 index 0000000..a1dc302 Binary files /dev/null and b/src/assets/photos/game-jam.jpg differ diff --git a/src/assets/photos/goliardia.jpg b/src/assets/photos/goliardia.jpg new file mode 100644 index 0000000..90b9a39 Binary files /dev/null and b/src/assets/photos/goliardia.jpg differ diff --git a/src/assets/photos/me-amanda.jpg b/src/assets/photos/me-amanda.jpg new file mode 100644 index 0000000..0f384e3 Binary files /dev/null and b/src/assets/photos/me-amanda.jpg differ diff --git a/src/assets/photos/me-baby.jpg b/src/assets/photos/me-baby.jpg new file mode 100644 index 0000000..ec8526b Binary files /dev/null and b/src/assets/photos/me-baby.jpg differ diff --git a/src/assets/photos/me-cc.jpg b/src/assets/photos/me-cc.jpg new file mode 100644 index 0000000..453bf0a Binary files /dev/null and b/src/assets/photos/me-cc.jpg differ diff --git a/src/assets/photos/me-guitar-17.JPG b/src/assets/photos/me-guitar-17.JPG new file mode 100644 index 0000000..018c212 Binary files /dev/null and b/src/assets/photos/me-guitar-17.JPG differ diff --git a/src/assets/photos/me-moverio.jpg b/src/assets/photos/me-moverio.jpg new file mode 100644 index 0000000..2f06111 Binary files /dev/null and b/src/assets/photos/me-moverio.jpg differ diff --git a/src/assets/photos/me-wine.jpg b/src/assets/photos/me-wine.jpg new file mode 100644 index 0000000..0b9f2ce Binary files /dev/null and b/src/assets/photos/me-wine.jpg differ diff --git a/src/assets/photos/me.png b/src/assets/photos/me.png new file mode 100644 index 0000000..01f4e4e Binary files /dev/null and b/src/assets/photos/me.png differ diff --git a/src/assets/photos/modica.jpg b/src/assets/photos/modica.jpg new file mode 100644 index 0000000..76b3751 Binary files /dev/null and b/src/assets/photos/modica.jpg differ diff --git a/src/assets/photos/pokemon.JPG b/src/assets/photos/pokemon.JPG new file mode 100755 index 0000000..88d4f23 Binary files /dev/null and b/src/assets/photos/pokemon.JPG differ diff --git a/src/assets/photos/remote.jpg b/src/assets/photos/remote.jpg new file mode 100644 index 0000000..5904bcb Binary files /dev/null and b/src/assets/photos/remote.jpg differ diff --git a/src/assets/photos/valencia-turia.jpg b/src/assets/photos/valencia-turia.jpg new file mode 100644 index 0000000..b54972e Binary files /dev/null and b/src/assets/photos/valencia-turia.jpg differ diff --git a/src/assets/photos/wine.jpg b/src/assets/photos/wine.jpg new file mode 100644 index 0000000..53e80c8 Binary files /dev/null and b/src/assets/photos/wine.jpg differ diff --git a/src/assets/plane.JPG b/src/assets/plane.JPG new file mode 100755 index 0000000..1266ad6 Binary files /dev/null and b/src/assets/plane.JPG differ diff --git a/src/assets/portfolio/acker.svg b/src/assets/portfolio/acker.svg new file mode 100644 index 0000000..12c75b4 --- /dev/null +++ b/src/assets/portfolio/acker.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/portfolio/alcon.png b/src/assets/portfolio/alcon.png new file mode 100644 index 0000000..d3408e2 Binary files /dev/null and b/src/assets/portfolio/alcon.png differ diff --git a/src/assets/portfolio/chiamarsibomber.jpeg b/src/assets/portfolio/chiamarsibomber.jpeg new file mode 100644 index 0000000..0c98542 Binary files /dev/null and b/src/assets/portfolio/chiamarsibomber.jpeg differ diff --git a/src/assets/portfolio/csproject.png b/src/assets/portfolio/csproject.png new file mode 100644 index 0000000..3a890c7 Binary files /dev/null and b/src/assets/portfolio/csproject.png differ diff --git a/src/assets/portfolio/fullstackagency.png b/src/assets/portfolio/fullstackagency.png new file mode 100644 index 0000000..0faa115 Binary files /dev/null and b/src/assets/portfolio/fullstackagency.png differ diff --git a/src/assets/portfolio/hotelnet.png b/src/assets/portfolio/hotelnet.png new file mode 100644 index 0000000..1d72462 Binary files /dev/null and b/src/assets/portfolio/hotelnet.png differ diff --git a/src/assets/portfolio/iubenda.png b/src/assets/portfolio/iubenda.png new file mode 100644 index 0000000..aa4557b Binary files /dev/null and b/src/assets/portfolio/iubenda.png differ diff --git a/src/assets/portfolio/medicami.png b/src/assets/portfolio/medicami.png new file mode 100644 index 0000000..1b0a6c4 Binary files /dev/null and b/src/assets/portfolio/medicami.png differ diff --git a/src/assets/portfolio/tuotempo.svg b/src/assets/portfolio/tuotempo.svg new file mode 100644 index 0000000..8eeea3c --- /dev/null +++ b/src/assets/portfolio/tuotempo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/tailwind.svg b/src/assets/tailwind.svg new file mode 100644 index 0000000..49e5824 --- /dev/null +++ b/src/assets/tailwind.svg @@ -0,0 +1 @@ + diff --git a/src/index.html b/src/index.html index dc8ef2e..d20fa85 100644 --- a/src/index.html +++ b/src/index.html @@ -2,12 +2,12 @@ - LoreiovCom + Lorenzo Iovino - Personal page - + diff --git a/tailwind.config.js b/tailwind.config.js index 7586753..4743c3a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -4,7 +4,25 @@ module.exports = { "./src/**/*.{html,ts}", ], theme: { - extend: {}, + colors: { + white: "#FEFEFF", + primary: "#FFB600", + secondary: "#00baff", + accent: "#0028FF", + neutral: "#2a2009", + "base-100": "#fffafd", + info: "#00bade", + success: "#00c448", + warning: "#ff8b00", + error: "#ff5f7d", + transparent: "transparent", + }, + fontFamily: { + sans: ['Graphik', 'sans-serif'], + serif: ['Merriweather', 'serif'], + }, + extend: { + }, }, plugins: [], }