Merge pull request #2 from thisloke/home-page

Home page
This commit is contained in:
Lorenzo Iovino 2024-01-10 05:11:26 +01:00 committed by GitHub
commit 851efbcc82
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
123 changed files with 1941 additions and 10 deletions

8
package-lock.json generated
View file

@ -15197,6 +15197,14 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true "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": { "nice-napi": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",

View file

@ -24,6 +24,7 @@
"aws-cdk-lib": "^2.117.0", "aws-cdk-lib": "^2.117.0",
"constructs": "^10.3.0", "constructs": "^10.3.0",
"express": "^4.18.2", "express": "^4.18.2",
"ng2-fittext": "^1.4.0",
"rxjs": "~7.8.0", "rxjs": "~7.8.0",
"tslib": "^2.3.0", "tslib": "^2.3.0",
"zone.js": "~0.14.2" "zone.js": "~0.14.2"

View file

@ -1 +1,6 @@
<iov-menu></iov-menu> <header class="inset-x-0 top-0 z-50 bg-secondary">
<iov-menu></iov-menu>
</header>
<router-outlet>
</router-outlet>
<iov-footer></iov-footer>

View file

@ -2,11 +2,14 @@ import { Component } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { RouterOutlet } from '@angular/router'; import { RouterOutlet } from '@angular/router';
import {MenuComponent} from "./menu/menu.component"; 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({ @Component({
selector: 'iov-root', selector: 'iov-root',
standalone: true, standalone: true,
imports: [CommonModule, RouterOutlet, MenuComponent], imports: [CommonModule, RouterOutlet, MenuComponent, HeroComponent, SectionComponent, FooterComponent],
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrl: './app.component.scss' styleUrl: './app.component.scss'
}) })

View file

@ -1,3 +1,57 @@
import { Routes } from '@angular/router'; 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,
}
]
}
];

View file

@ -0,0 +1,5 @@
<div class="arrow left-1/2" (click)="scrollDown()" *ngIf="visible">
<span></span>
<span></span>
<span></span>
</div>

View file

@ -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);
}
}

View file

@ -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<ArrowScrollDownComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ArrowScrollDownComponent]
})
.compileComponents();
fixture = TestBed.createComponent(ArrowScrollDownComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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;
}
}

View file

@ -0,0 +1,3 @@
<pre>
{{photos[index]}}
</pre>

View file

@ -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<AsciiPhotoComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [AsciiPhotoComponent]
})
.compileComponents();
fixture = TestBed.createComponent(AsciiPhotoComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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úô20CIîí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%ïjuO§žì\`
\`ˆ¯Ddñ$m8èP6™YC¤oCxhb8ôv´
¨?ÕqÕAAqA$ÙÿZäåðŠA¾;
|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ðéÚ8mppãð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éððG88âÐÀgÔêGãmãøøøéðÚÚÜÜéøøøøøâéøéðéðøøðømAXKÀÄÕøéøøÜ$$dÖbZú¯
\`[ûÜéßâÚðããðÚ¶RÁRmmßßmm¶øéÚÚð8éÜéðø¶âââ¶¶G¶øðé8éøðøGmßÔŽÄNœA¶ãpâé88ÜëÞÿbÝ<\`
sÿÙÜðAÕGÜÚðð88ÔEppppâGé888éÚé8øâããâââøøðÚéøøãpÔêHþEqããÔâðøéÜëdýÖPz
çÙÙ$88GAßøÚÚéðãgÛAÔÔApãGðð8éøðããããããGømâãAŠgÀÁEÕßÔã$DàÓð88é$ýFU}·
²ôÚÚëÚééømm8ë$GggÔÕqŠÔmãGGøðøøâmmmmmmâããâããßpßÔÐRþæÁÛD±ccµ9nj¾8dåZ^\`
¡mGÜÚÚé8ððÜéÔŽqêgêÛÔApmãâãGãGâãâmppppppßßÔÔÕ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ÐêÕppAAÔÔAÔÔÔÕŠÛêqÛqqêÐœŽœý0z½¤t½ti<tƒrùÖããøÙFò
ˆƒÓâââãâðÚ$ðÖeùÍ2§8ÛêÛm8ÔmŠÔAÕqŠqÐÐÐÐÐggœœKë½trVó3Y©ùfP$ãð$ëÙÞ¥ô˜
¼ýÚé8ððøãpmmÚf1í=í=írjrzÇédááÕmëéÙdéGèýýøðãÚAðÙhfõ6eÝÖðâÙdëëéãGâŠêéÒÒFU
\` sÜøGéé €ßÕЊÔÓ½1í=ïìíí=íÍGAZŸðÚÙáãýëøø$Ü$GãëÜ$ëðãëÙé8Ú8ð8éãÔßéøâããmããâmébDk¹
\` nÜãããpêKEHRXÛßÔ¶w%oí<<<[7=©øÚÙÿhhýgøé¶m¶8ø¶mÔG¶ø$éßmÚÜø¶øðø¶âãÔÕâðGp€Am¶øø$¥h
öÚãÕÕßpmmmâGðéÿf&Lc=ì<<<üÍ©OÚqmâppÕã8ðâpÔAmßméðpGÜãâGâmÔßøãð8Öh°
\`\` ½ÜâAÛgêÔÔApmãmã¶Gøø8äyúüüüaúõúx߀AAÔŠqÐÔð$Ú¶AÔAAÛÔ¶ðøéÚ$Úøâ¶Gâââã€Ap¶øø¶¶éÜèŸ;`]
}

View file

@ -0,0 +1,5 @@
<a href="{{url}}" class="mr-2 text-lg px-4 sm:px-12 py-4 rounded-full mt-4 font-bold
ring-white text-white bg-secondary ring-2
hover:ring-accent hover:text-accent hover:bg-transparent hover:ring-2">
<ng-content></ng-content>
</a>

View file

@ -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<ButtonCtaComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ButtonCtaComponent]
})
.compileComponents();
fixture = TestBed.createComponent(ButtonCtaComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 = '';
}

View file

@ -0,0 +1,17 @@
<div class="relative bg-clip-border {{borderRounded ? 'rounded-2xl' : 'rounded-0'}} shadow-2xl shadow-accent bg-white text-gray-700 w-full items-center text-center">
<div class="grid grid-cols-3 justify-items-center bg-slate-100 p-4">
<div class="text-2xl font-bold text-center self-center">
<ng-content select="[left]"></ng-content>
</div>
<div class="self-center">
<ng-content select="[center]"></ng-content>
</div>
<div class="self-center">
<iov-button-cta
[url]="ctaUrl">
<ng-content select="[right]">
</ng-content>
</iov-button-cta>
</div>
</div>
</div>

View file

View file

@ -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<CardCtaComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [CardCtaComponent]
})
.compileComponents();
fixture = TestBed.createComponent(CardCtaComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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;
}

View file

@ -0,0 +1,37 @@
<div class="w-full overflow-hidden block">
<svg class="fish" id="fish">
<path
id="fish2"
d="m 172.04828,20.913839 c 0.0489,-0.444179 -0.2178,-0.896934 -1.01784,-1.415715 -0.72801,-0.475049 -1.4826,-0.932948 -2.2149,-1.401138 -1.6035,-1.028129 -3.29018,-1.969653 -4.89798,-3.079244 -4.67074,-3.24131 -10.22127,-4.404923 -15.76322,-5.1509392 -2.27235,-0.286401 -4.81223,-0.168925 -6.72186,-1.574351 -1.48174,-1.081294 -4.04993,-4.828523 -6.86506,-6.456038 -0.4862,-0.290688 -2.77227,-1.44486897 -2.77227,-1.44486897 0,0 1.30939,3.55000597 1.60951,4.26429497 0.69542,1.644664 -0.38158,3.063809 -0.83262,4.642447 -0.29069,1.0418502 2.13772,0.8129002 2.26463,1.7827212 0.18179,1.432007 -4.15197,1.936211 -6.59152,2.417263 -3.65634,0.715146 -7.91635,2.082841 -11.56925,0.884071 -4.3046,-1.38313 -7.37269,-4.129669 -10.46566,-7.2354952 1.43801,6.7252892 5.4382,10.6028562 5.6157,11.4226162 0.18607,0.905509 -0.45961,1.091584 -1.04099,1.682394 -1.28967,1.265655 -6.91566,7.731125 -6.93366,9.781383 1.61379,-0.247815 3.56115,-1.660957 4.9803,-2.485862 1.58035,-0.905509 7.60593,-5.373029 9.29347,-6.065023 0.38587,-0.160351 5.0549,-1.531476 5.09434,-0.932949 0.0695,0.932949 -0.30784,1.137031 -0.18436,1.527189 0.22638,0.746016 1.44144,1.465449 2.02282,1.985088 1.50918,1.292237 3.21044,2.42841 4.27373,4.156252 1.49203,2.401827 1.55805,4.999163 1.98251,7.677102 0.99469,-0.111473 2.0091,-2.17545 2.55961,-2.992638 0.51278,-0.772598 2.38639,-4.07136 3.09725,-4.275442 0.67227,-0.204082 2.75511,0.958673 3.50284,1.180763 2.85973,0.848057 5.644,1.353976 8.56032,1.353976 3.50799,0.0094 12.726,0.258104 19.55505,-4.800226 0.75545,-0.567658 2.55703,-2.731104 2.55703,-2.731104 0,0 -0.37644,-0.577091 -1.04785,-0.790605 0.89779,-0.584808 1.8659,-1.211633 1.94993,-1.925922 z"
style="fill:#528484;fill-opacity:1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccccccccccccccccccc" />
<path
sodipodi:nodetypes="cccccccccccccccccccccccccccccccc"
inkscape:connector-curvature="0"
style="fill:#528484;fill-opacity:1"
d="m 234.99441,42.953992 c 0.0489,-0.44418 -0.2178,-0.896934 -1.01784,-1.415715 -0.72801,-0.47505 -1.4826,-0.932949 -2.2149,-1.401138 -1.6035,-1.02813 -3.29018,-1.969653 -4.89798,-3.079245 -4.67074,-3.24131 -10.22127,-4.404923 -15.76322,-5.150939 -2.27235,-0.286401 -4.81223,-0.168925 -6.72186,-1.574351 -1.48174,-1.081294 -4.04993,-4.828523 -6.86506,-6.456038 -0.4862,-0.290688 -2.77227,-1.444869 -2.77227,-1.444869 0,0 1.30939,3.550006 1.60951,4.264295 0.69542,1.644664 -0.38158,3.063809 -0.83262,4.642447 -0.29069,1.04185 2.13772,0.8129 2.26463,1.782721 0.18179,1.432007 -4.15197,1.936211 -6.59152,2.417263 -3.65634,0.715146 -7.91635,2.082842 -11.56925,0.884072 -4.3046,-1.383131 -7.37269,-4.12967 -10.46566,-7.235496 1.43801,6.725289 5.4382,10.602857 5.6157,11.422617 0.18607,0.905508 -0.45961,1.091583 -1.04099,1.682394 -1.28967,1.265654 -6.91566,7.731125 -6.93366,9.781382 1.61379,-0.247815 3.56115,-1.660957 4.9803,-2.485862 1.58035,-0.905509 7.60593,-5.373029 9.29347,-6.065023 0.38587,-0.160351 5.0549,-1.531476 5.09434,-0.932948 0.0695,0.932948 -0.30784,1.137031 -0.18436,1.527188 0.22638,0.746016 1.44144,1.46545 2.02282,1.985088 1.50918,1.292237 3.21044,2.42841 4.27373,4.156252 1.49203,2.401827 1.55805,4.999163 1.98251,7.677102 0.99469,-0.111473 2.0091,-2.17545 2.55961,-2.992638 0.51278,-0.772598 2.38639,-4.071359 3.09725,-4.275442 0.67227,-0.204082 2.75511,0.958673 3.50284,1.180763 2.85973,0.848057 5.644,1.353976 8.56032,1.353976 3.50799,0.0094 12.726,0.258104 19.55505,-4.800226 0.75545,-0.567658 2.55703,-2.731104 2.55703,-2.731104 0,0 -0.37644,-0.57709 -1.04785,-0.790605 0.89779,-0.584808 1.8659,-1.211633 1.94993,-1.925921 z"
id="fish3" />
<path
id="fish6"
d="m 200.07076,80.737109 c 0.0489,-0.44418 -0.2178,-0.896934 -1.01784,-1.415715 -0.72801,-0.47505 -1.4826,-0.932949 -2.2149,-1.401138 -1.6035,-1.02813 -3.29018,-1.969653 -4.89798,-3.079245 -4.67074,-3.24131 -10.22127,-4.404923 -15.76322,-5.150939 -2.27235,-0.286401 -4.81223,-0.168925 -6.72186,-1.574351 -1.48174,-1.081294 -4.04993,-4.828523 -6.86506,-6.456038 -0.4862,-0.290688 -2.77227,-1.444869 -2.77227,-1.444869 0,0 1.30939,3.550006 1.60951,4.264295 0.69542,1.644664 -0.38158,3.063809 -0.83262,4.642447 -0.29069,1.04185 2.13772,0.8129 2.26463,1.782721 0.18179,1.432007 -4.15197,1.936211 -6.59152,2.417263 -3.65634,0.715146 -7.91635,2.082842 -11.56925,0.884072 -4.3046,-1.383131 -7.37269,-4.12967 -10.46566,-7.235496 1.43801,6.725289 5.4382,10.602857 5.6157,11.422617 0.18607,0.905508 -0.45961,1.091583 -1.04099,1.682394 -1.28967,1.265654 -6.91566,7.731125 -6.93366,9.781382 1.61379,-0.247815 3.56115,-1.660957 4.9803,-2.485862 1.58035,-0.905509 7.60593,-5.373029 9.29347,-6.065023 0.38587,-0.160351 5.0549,-1.531476 5.09434,-0.932948 0.0695,0.932948 -0.30784,1.137031 -0.18436,1.527188 0.22638,0.746016 1.44144,1.46545 2.02282,1.985088 1.50918,1.292237 3.21044,2.42841 4.27373,4.156252 1.49203,2.401827 1.55805,4.999163 1.98251,7.677102 0.99469,-0.111473 2.0091,-2.17545 2.55961,-2.992638 0.51278,-0.772598 2.38639,-4.071359 3.09725,-4.275442 0.67227,-0.204082 2.75511,0.958673 3.50284,1.180763 2.85973,0.848057 5.644,1.353976 8.56032,1.353976 3.50799,0.0094 12.726,0.258104 19.55505,-4.800226 0.75545,-0.567658 2.55703,-2.731104 2.55703,-2.731104 0,0 -0.37644,-0.57709 -1.04785,-0.790605 0.89779,-0.584808 1.8659,-1.211633 1.94993,-1.925921 z"
style="fill:#528484;fill-opacity:1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccccccccccccccccccc" />
<path
sodipodi:nodetypes="cccccccccccccccccccccccccccccccc"
inkscape:connector-curvature="0"
style="fill:#528484;fill-opacity:1"
d="m 77.275623,89.018799 c 0.0489,-0.44418 -0.2178,-0.896934 -1.01784,-1.415715 -0.72801,-0.47505 -1.4826,-0.932949 -2.2149,-1.401138 -1.6035,-1.02813 -3.29018,-1.969653 -4.89798,-3.079245 -4.67074,-3.24131 -10.22127,-4.404923 -15.76322,-5.150939 -2.272347,-0.286401 -4.812227,-0.168925 -6.721857,-1.574351 -1.48174,-1.081294 -4.04993,-4.828523 -6.86506,-6.456038 -0.4862,-0.290688 -2.77227,-1.444869 -2.77227,-1.444869 0,0 1.30939,3.550006 1.60951,4.264295 0.69542,1.644664 -0.38158,3.063809 -0.83262,4.642447 -0.29069,1.04185 2.13772,0.8129 2.26463,1.782721 0.18179,1.432007 -4.15197,1.936211 -6.59152,2.417263 -3.65634,0.715146 -7.91635,2.082842 -11.56925,0.884072 -4.3046,-1.383131 -7.37269,-4.12967 -10.46566,-7.235496 1.43801,6.725289 5.4382,10.602857 5.6157,11.422617 0.18607,0.905508 -0.45961,1.091583 -1.04099,1.682394 -1.28967,1.265654 -6.9156603,7.731122 -6.9336603,9.781382 1.6137903,-0.24782 3.5611503,-1.66096 4.9803003,-2.48586 1.58035,-0.90551 7.60593,-5.37303 9.29347,-6.065025 0.38587,-0.160351 5.0549,-1.531476 5.09434,-0.932948 0.0695,0.932948 -0.30784,1.137031 -0.18436,1.527183 0.22638,0.74602 1.44144,1.46546 2.02282,1.98509 1.50918,1.29224 3.21044,2.42841 4.27373,4.15625 1.49203,2.40183 1.55805,4.999171 1.98251,7.677111 0.99469,-0.11148 2.0091,-2.17545 2.55961,-2.99264 0.51278,-0.7726 2.38639,-4.071361 3.09725,-4.275441 0.67227,-0.20408 2.75511,0.95867 3.50284,1.18076 2.85973,0.84806 5.644,1.35398 8.560317,1.35398 3.50799,0.009 12.726,0.2581 19.55505,-4.80023 0.75545,-0.56766 2.55703,-2.7311 2.55703,-2.7311 0,0 -0.37644,-0.57709 -1.04785,-0.79061 0.89779,-0.58481 1.8659,-1.211632 1.94993,-1.92592 z"
id="fish4" />
<path
id="fish5"
d="m 127.65312,60.900973 c 0.0489,-0.44418 -0.2178,-0.896934 -1.01784,-1.415715 -0.72801,-0.47505 -1.4826,-0.932949 -2.2149,-1.401138 -1.6035,-1.02813 -3.29018,-1.969653 -4.89799,-3.079245 -4.67074,-3.24131 -10.22127,-4.404923 -15.76322,-5.150939 -2.27235,-0.286401 -4.812228,-0.168925 -6.721858,-1.574351 -1.48174,-1.081294 -4.04993,-4.828523 -6.86506,-6.456038 -0.4862,-0.290688 -2.77227,-1.444869 -2.77227,-1.444869 0,0 1.30939,3.550006 1.60951,4.264295 0.69542,1.644664 -0.38158,3.063809 -0.83262,4.642447 -0.29069,1.04185 2.13772,0.8129 2.26463,1.782721 0.18179,1.432007 -4.15197,1.936211 -6.59152,2.417263 -3.65634,0.715146 -7.91635,2.082842 -11.56925,0.884072 -4.3046,-1.383131 -7.37269,-4.12967 -10.46566,-7.235496 1.43801,6.725289 5.4382,10.602857 5.6157,11.422617 0.18607,0.905508 -0.45961,1.091583 -1.04099,1.682394 -1.28967,1.265654 -6.91566,7.731125 -6.93366,9.781382 1.61379,-0.247815 3.56115,-1.660957 4.9803,-2.485862 1.58035,-0.905509 7.60593,-5.373029 9.29347,-6.065023 0.38587,-0.160351 5.0549,-1.531476 5.09434,-0.932948 0.0695,0.932948 -0.30784,1.137031 -0.18436,1.527188 0.22638,0.746016 1.44144,1.46545 2.02282,1.985088 1.50918,1.292237 3.21044,2.42841 4.27373,4.156252 1.49203,2.401827 1.55805,4.999163 1.98251,7.677102 0.99469,-0.111473 2.0091,-2.17545 2.55961,-2.992638 0.51278,-0.772598 2.38639,-4.071359 3.09725,-4.275442 0.67227,-0.204082 2.75511,0.958673 3.50284,1.180763 2.85973,0.848057 5.643998,1.353976 8.560318,1.353976 3.50799,0.0094 12.726,0.258104 19.55506,-4.800226 0.75545,-0.567658 2.55703,-2.731104 2.55703,-2.731104 0,0 -0.37644,-0.57709 -1.04785,-0.790605 0.89779,-0.584808 1.8659,-1.211633 1.94993,-1.925921 z"
style="fill:#528484;fill-opacity:1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccccccccccccccccccc" />
<path
d="m 68.19699,20.522295 c 0.0489,-0.44418 -0.2178,-0.896934 -1.01784,-1.415715 -0.72801,-0.47505 -1.4826,-0.932949 -2.2149,-1.401138 -1.6035,-1.02813 -3.29018,-1.969653 -4.89798,-3.079245 C 55.39553,11.384887 49.845,10.221274 44.30305,9.4752582 42.0307,9.1888572 39.49082,9.3063332 37.58119,7.900907 36.09945,6.819613 33.53126,3.072384 30.71613,1.444869 30.22993,1.154181 27.94386,0 27.94386,0 c 0,0 1.30939,3.550006 1.60951,4.264295 0.69542,1.644664 -0.38158,3.063809 -0.83262,4.642447 -0.29069,1.0418502 2.13772,0.8129002 2.26463,1.782721 0.18179,1.432007 -4.15197,1.936211 -6.59152,2.417263 -3.65634,0.715146 -7.91635,2.082842 -11.56925,0.884072 C 8.52001,12.607667 5.45192,9.8611282 2.35895,6.755302 3.79696,13.480591 7.79715,17.358159 7.97465,18.177919 8.16072,19.083427 7.51504,19.269502 6.93366,19.860313 5.64399,21.125967 0.018,27.591438 0,29.641695 1.61379,29.39388 3.56115,27.980738 4.9803,27.155833 c 1.58035,-0.905509 7.60593,-5.373029 9.29347,-6.065023 0.38587,-0.160351 5.0549,-1.531476 5.09434,-0.932948 0.0695,0.932948 -0.30784,1.137031 -0.18436,1.527188 0.22638,0.746016 1.44144,1.46545 2.02282,1.985088 1.50918,1.292237 3.21044,2.42841 4.27373,4.156252 1.49203,2.401827 1.55805,4.999163 1.98251,7.677102 0.99469,-0.111473 2.0091,-2.17545 2.55961,-2.992638 0.51278,-0.772598 2.38639,-4.071359 3.09725,-4.275442 0.67227,-0.204082 2.75511,0.958673 3.50284,1.180763 2.85973,0.848057 5.644,1.353976 8.56032,1.353976 3.50799,0.0094 12.726,0.258104 19.55505,-4.800226 0.75545,-0.567658 2.55703,-2.731104 2.55703,-2.731104 0,0 -0.37644,-0.57709 -1.04785,-0.790605 0.89779,-0.584808 1.8659,-1.211633 1.94993,-1.925921 z"
id="fish1" />
</svg>
</div>

View file

@ -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);
}
}

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FishComponent } from './fish.component';
describe('FishComponent', () => {
let component: FishComponent;
let fixture: ComponentFixture<FishComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [FishComponent]
})
.compileComponents();
fixture = TestBed.createComponent(FishComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1,32 @@
<div class="bottom-0 min-h-[200px] bg-secondary w-full my-4 h-full grid grid-cols-1 content-end justify-end bg-slate-100 gap-8">
<iov-fish></iov-fish>
<iov-card [ctaUrl]="'mailto:thisloke@gmail.com'"
[borderRounded]="false"
class="mr-8 ml-8 relative -top-12 hidden">
<span left>
<span class="text-accent"> Talk is cheap</span>
</span>
<span center>
Interested in working together? <br/> We should schedule a <b class="text-accent">time to chat</b>. <br/>Ill bring the tea :)
</span>
<span right>
Let's Talk!
</span>
</iov-card>
<div class="text-right text-xs text-white p-4 leading-none sm:leading-tight relative">
<div class="">Made with Angular
<a href="https://angular.io/">
<img class="h-6 w-6 mx-1 inline-grid" ngSrc="/assets/angular.svg" height="16" width="16">
</a>
and TailwindCSS
<a href="https://tailwindcss.com/">
<img class="h-6 w-6 mx-1 inline-grid" ngSrc="/assets/tailwind.svg" height="16" width="16">
</a>
<br/>
<br/>
<a href="https://github.com/lokenxo/loreiov.com">
Check the source code <img ngSrc="/assets/github.svg" class="h-6 w-6 mx-1 inline-block" alt="" height="800"
width="800"></a>
</div>
</div>
</div>

View file

@ -0,0 +1,6 @@
:host-context {
position: relative;
width: 100%;
display: block;
bottom: 0px;
}

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FooterComponent } from './footer.component';
describe('FooterComponent', () => {
let component: FooterComponent;
let fixture: ComponentFixture<FooterComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [FooterComponent]
})
.compileComponents();
fixture = TestBed.createComponent(FooterComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1,44 @@
<div class="bg-secondary">
<div class="relative px-6 pt-0 lg:pt-14 lg:px-8">
<div class="mx-auto max-w-4xl py-16 pb-32 sm:py-48 lg:py-56">
<div class="flex rounded-2xl text-sm leading-6 text-gray-600 border-l-8 border-primary hover:ring-gray-900/20 overflow-hidden bg-white max-h-[279px]">
<iov-ascii-photo [index]="1"
id="asciiPhoto"
class="hidden sm:block absolute text-[5px] rounded-x-2xl leading-none tracking-tighter overflow-hidden"></iov-ascii-photo>
<img ngSrc="/assets/photos/me.png"
id="originalPhoto"
class="h-[279px] hidden sm:block "
alt="" height="300" width="300">
<div class="self-center pt-6 sm:pt-0">
<img ngSrc="/assets/photos/me.png"
class="h-[120px] sm:hidden block float-left"
alt="" height="120" width="120">
<h1 class="text-2xl font-bold tracking-tight text-gray-900 sm:text-4xl sm:py-8 sm:top-8 mt-4 sm:mt-0 mb-2 sm:mb-0">Hey, I'm Lorenzo!</h1>
<div class="">
<h2 class="text-sm mx-4 sm:mx-0 sm:text-base leading-2 mr-4">
I'm on a quest to uncover life's meaning while diving deep into my passion for Computer Science as a <span class="text-primary font-bold">Software Engineer</span>.
<br>Here, on my personal website, I share my projects and occasional thoughts.
</h2>
<div class="mt-4 mx-4 sm:mx-0 text-sm sm:text-base leading-2 mr-4">
Explore more about me and feel free to reach out for any questions or collaborations via
<a class="cursor-pointer underline text-primary hover:text-accent" href="mailto:thisloke@gmail.com">email</a>
or on socials!
<div class="flex justify-center sm:justify-end h-[60px] mr-0 sm:mr-4">
<a class="mx-2 relative cursor-pointer" href="https://www.linkedin.com/in/lorenzoiovino/">
<img ngSrc="/assets/linkedin.svg" class="h-6 sm:h-8 inline-block" alt="" height="30" width="30">
</a>
<a class="mx-2 relative cursor-pointer" href="
https://github.com/thisloke">
<img ngSrc="/assets/github.svg" class="h-6 sm:h-8 inline-block" alt="" height="30" width="30">
</a>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -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;
}

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HeroComponent } from './hero.component';
describe('HeroComponent', () => {
let component: HeroComponent;
let fixture: ComponentFixture<HeroComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [HeroComponent]
})
.compileComponents();
fixture = TestBed.createComponent(HeroComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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() {
}
}

View file

@ -0,0 +1,14 @@
<iov-section [noHeight]="true">
<h2 class="text-2xl font-bold my-8" *ngIf="posts.length > 0">Latest blog post</h2>
<div class="grid grid-cols-3 justify-items-center bg-slate-100 gap-8">
<div *ngFor="let post of posts.slice(0,3)">
<iov-post-card [post]="post">
</iov-post-card>
</div>
<a class="font-bold text-primary ring-secondary border-l-8 px-2" routerLink="/blog">View all posts</a>
</div>
<div class="text-center" *ngIf="posts.length === 0">
<p class="text-base">No posts yet.</p>
<br>
</div>
</iov-section>

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HighlightComponent } from './highlight.component';
describe('HighlightComponent', () => {
let component: HighlightComponent;
let fixture: ComponentFixture<HighlightComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [HighlightComponent]
})
.compileComponents();
fixture = TestBed.createComponent(HighlightComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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'
}
]
}

View file

@ -1,3 +1,37 @@
<h1 class="text-3xl font-bold underline"> <nav class="flex items-center flex-wrap bg-teal-500 p-6">
menu works! <div class="flex items-center flex-shrink-0 text-white mr-6 {{router.url == '/' ? 'text-white' : 'text-neutral'}}">
</h1> <span class="font-semibold text-xl tracking-tight">
<a href="/">Home</a>
</span>
</div>
<div class="text-xl font-bold lg:flex-grow">
<span class="font-semibold text-xl tracking-tight">
<a href="biography"
class="block mt-0 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4 {{router.url == '/biography' ? 'text-white' : 'text-neutral'}}">
Bio
</a>
</span>
<!--<a href="portfolio" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4">
Portfolio
</a>-->
<!--<a href="projects" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4">
Projects
</a>-->
<!--<a href="like-dislike" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4">
Like/Dislike
</a>
<a href="links" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4">
Links
</a>-->
<!--<a href="blog" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4">
Blog
</a>-->
</div>
<!--<div class="">
<iov-button-cta
[url]="'mailto:thisloke@gmail.com'">
Say Hello
</iov-button-cta>
</div>-->
</nav>

View file

@ -1,12 +1,21 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import {ButtonCtaComponent} from "../button-cta/button-cta.component";
import {Router} from "@angular/router";
@Component({ @Component({
selector: 'iov-menu', selector: 'iov-menu',
standalone: true, standalone: true,
imports: [], imports: [
ButtonCtaComponent
],
templateUrl: './menu.component.html', templateUrl: './menu.component.html',
styleUrl: './menu.component.scss' styleUrl: './menu.component.scss'
}) })
export class MenuComponent { export class MenuComponent {
constructor(public router: Router) {
}
} }

7
src/app/models/job.ts Normal file
View file

@ -0,0 +1,7 @@
export interface Job {
website: string | undefined
image: string | undefined;
description: string;
role: string;
name: string;
}

9
src/app/models/post.ts Normal file
View file

@ -0,0 +1,9 @@
export interface Post {
title: string;
slug: string;
description: string;
content: string;
date: Date;
readTime: number;
image: string;
}

View file

@ -0,0 +1,5 @@
<div class="relative bg-white">
<div class="mx-auto pb-24">
<router-outlet></router-outlet>
</div>
</div>

View file

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PageComponent } from './page.component';
describe('PageComponent', () => {
let component: PageComponent;
let fixture: ComponentFixture<PageComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [PageComponent]
})
.compileComponents();
fixture = TestBed.createComponent(PageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1,163 @@
<iov-section [title]="'About me'"
[titleColor]="'light'"
[backgroundImageUrl]="'/assets/cat.jpg'">
<div class="mb-10">
<h2 class="font-bold text-4xl mt-8 mb-4">Hello world!</h2>
<p class="text-lg">
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)<br/>
I'm embarking on an exhilarating journey that began back in December 1988 and continues to evolve with each passing day.
<br />
Join me on this riveting expedition where technology meets creativity, thoughts are shared, and passions are pursued. That's my life.
</p>
</div>
<div class="mb-10">
<h2 class="font-bold text-4xl mt-8 mb-4">Childhood Nostalgia 🧒</h2>
<div class="text-lg">
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.
<div class="float-right mt-4 mb-2 ml-8">
<img ngSrc="/assets/photos/me-baby.jpg" alt="Super young software developer with an Apple II" class="w-64 rounded-2xl shadow-lg"
height="1415" width="1001"/>
<em class="text-sm">Super young software developer with an Apple II</em>
</div>
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.<br/>
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. <br/>
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.<br/><br/><br/><br/>
<div class="float-left mb-2 mr-8">
<img ngSrc="/assets/photos/pokemon.JPG" alt="Pokemon Yellow" class="w-64 rounded-2xl shadow-lg"
height="1496" width="2256"/>
<em class="text-sm">Pokemon Yellow and Game Boy Advance</em>
</div>
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.<br/>
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.
<br />
<div class="float-right mb-2 mt-4 ml-8">
<img ngSrc="/assets/photos/me-guitar-17.JPG" alt="Guitarist" class="w-64 rounded-2xl shadow-lg"
height="1944" width="2592"/>
<em class="text-sm">My dream guitar "Fender stratocaster"</em>
</div>
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.<br/>
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.
</div>
</div>
<div class="mb-10">
<h2 class="font-bold text-4xl mt-8 mb-4">University and Personal Growth 🏫</h2>
<div class="text-lg">
Educationally, I've left no stone unturned. <br/>
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
<div class="float-right mt-4 mb-2 ml-8">
<img ngSrc="/assets/photos/me-cc.jpg" alt="Me in Pisa" class="w-64 rounded-2xl shadow-lg"
height="1944" width="2592"/>
<em class="text-sm">Me burning out studying Computability and <br/>Complexity exam</em>
</div>
<span class="italic">N-times</span> the same exam and engaging in online courses and workshops in order to understand better what it's exactly computer science
<span class="italic">(and i've still have a lot of doubdts regarding Computability and Complexity topic)</span>
<br/>
<br/>
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).<br/><br/>
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).
<div class="float-left mt-4 mb-2 mr-8">
<img ngSrc="/assets/photos/goliardia.jpg" alt="My goliardo" class="w-64 rounded-2xl shadow-lg"
height="1944" width="2592"/>
<em class="text-sm">My student hat (that's not an hat) "goliardo"</em>
</div>
<br/><br/>
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. <br/> This period of exploration ignited a passion for travel, opening my eyes to diverse cultures and expanding my horizons.
</div>
</div>
<div class="mb-10">
<h2 class="font-bold text-4xl mt-8 mb-4">Embarking on Hackathon Adventures 🚀</h2>
<div class="text-lg">
<div class="float-right mt-4 mb-2 ml-8">
<img ngSrc="/assets/photos/me-moverio.jpg" alt="Me with moverio smart glasses" class="w-48 rounded-2xl shadow-lg"
height="1280" width="960"/>
<em class="text-sm">Me wearing moverio smart glasses</em>
</div>
My journey into the world of hackathons began with one organized by <a class="underline text-accent" href="https://www.vargroup.it/">Vargroup</a>.<br/>
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.<br/>
The application, designed for Epson Moverio Smartglass, allowed customers to virtually furnish their homes, creating a unique and immersive shopping experience.
<br/><br/>
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. <br/>
<div class="mb-2 w-full mt-4">
<img ngSrc="/assets/photos/game-jam.jpg" alt="Me at global game jam presenting our game" class="w-full h-80 rounded-2xl shadow-lg object-cover"
height="612" width="612"/>
<em class="text-sm">Me and the team presenting the game developed. <br/>Gameplay of our game "Oh No My Husband is coming" developed for GGJ 2015: <a href="https://www.youtube.com/embed/z1Kn6agAujI" class="text-accent underline">Youtube link</a></em>
</div>
</div>
</div>
<div class="mb-10">
<h2 class="font-bold text-4xl mt-8 mb-4">Erasmus Project in Valencia 🌍</h2>
<div class="text-lg">
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
<div class="mb-2 mt-4 ml-8 float-right">
<img ngSrc="/assets/photos/valencia-turia.jpg" alt="Valencia turia" class="w-96 rounded-2xl shadow-lg"
height="450" width="800"/>
<em class="text-sm">Beautiful sunny day in Valencia</em>
</div>
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.<br/><br/>
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.<br/>
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.
</div>
</div>
<div class="mb-10">
<h2 class="font-bold text-4xl mt-8 mb-4">Embracing the Tranquility of Sicily 🏡</h2>
<div class="text-lg">
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. <br/>
<div class="mb-2 mt-4 mr-8 float-left">
<img ngSrc="/assets/photos/remote.jpg" alt="Remote working" class="w-64 rounded-2xl shadow-lg"
height="2160" width="3840"/>
<em class="text-sm">Working remote watching the sea</em>
</div>
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.<br/><br/>
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. <br/>
Sicily has a unique way of making each moment feel like an eternity, a welcome departure from the frenetic pace of urban life. <br/>It's a place where the clock seems to pause, allowing me to savor every nuance of existence.<br/>
<div class="mb-2 mt-4 w-full">
<img ngSrc="/assets/photos/dogs.jpg" alt="Dogs watch wineyard" class="w-full h-80 rounded-2xl shadow-lg object-cover"
height="2160" width="3840"/>
<em class="text-sm">My wineyard</em>
</div>
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 <a href="https://netum.it/" class="text-accent underline">www.netum.it</a>, 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.
<div class="mb-2 mt-4 ml-8 float-right">
<img ngSrc="/assets/photos/wine.jpg" alt="Dogs watch wineyard" class="w-48 rounded-2xl shadow-lg"
height="2160" width="3840"/>
<em class="text-sm">The wine produced "Zia Lina"</em>
</div>
<br/><br/>
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.<br/>Dining is an experience, a time to savor and appreciate the artistry that goes into every dish.<br/>
<span class="italic">(i will not post any photo of food, because i'm not a food blogger, but trust me, it's really good).</span><br/><br/>
In the midst of vineyards and olive groves, my life as a remote worker in Sicily is a testament to the beauty of simplicity.
<br/>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. 🌿🍷🌞<br/>
<div class="mb-2 mt-4 w-full">
<img ngSrc="/assets/photos/modica.jpg" alt="Modica view" class="w-full h-80 rounded-2xl shadow-lg"
height="2160" width="3840"/>
<em class="text-sm">Modica view from my house</em>
</div>
</div>
</div>
<div class="mb-10">
<h2 class="font-bold text-4xl mt-8 mb-4">Life at 35</h2>
<div class="text-lg">
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. <br/>Life's journey has woven a tapestry of experiences, blending the worlds of technology, family, and personal passions.<br/>
<!--From here i'm starting sharing my experience and my knowledge with the world using this old-fashioned and anachronistic <a class="text-accent underline" href="blog">blog</a>, and i'm really excited to see what the future will bring to me.-->
<div class="mb-2 mt-4 w-full">
<img ngSrc="/assets/photos/me-amanda.jpg" alt="Me and my wife" class="w-full h-80 rounded-2xl shadow-lg object-cover"
height="2160" width="3840"/>
<em class="text-sm">Me and my wife Amanda</em>
</div>
</div>
</div>
</iov-section>

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { BiographyPage } from './biography.page';
describe('BiographyPage', () => {
let component: BiographyPage;
let fixture: ComponentFixture<BiographyPage>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [BiographyPage]
})
.compileComponents();
fixture = TestBed.createComponent(BiographyPage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1 @@
<p>blog works!</p>

View file

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { BlogPage } from './blog.page';
describe('BlogComponent', () => {
let component: BlogPage;
let fixture: ComponentFixture<BlogPage>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [BlogPage]
})
.compileComponents();
fixture = TestBed.createComponent(BlogPage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1 @@
<p>contact-me works!</p>

View file

@ -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<ContactMePage>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ContactMePage]
})
.compileComponents();
fixture = TestBed.createComponent(ContactMePage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1,14 @@
<div class="bg-secondary mx-auto">
<iov-hero></iov-hero>
</div>
<!--<iov-arrow-scroll-down></iov-arrow-scroll-down>
<div class="mx-auto pb-24">
<iov-section
[backgroundColor]="'dark'">
</iov-section>
<iov-highlight></iov-highlight>
</div>-->

View file

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HomePage } from './home.page';
describe('HomeComponent', () => {
let component: HomePage;
let fixture: ComponentFixture<HomePage>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [HomePage]
})
.compileComponents();
fixture = TestBed.createComponent(HomePage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1,2 @@
<p>like-dislike works!</p>
What i like and what i dislike in general, funny section

View file

@ -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<LikeDislikePage>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [LikeDislikePage]
})
.compileComponents();
fixture = TestBed.createComponent(LikeDislikePage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1,13 @@
<iov-section [title]="'Portfolio'"
[backgroundImageUrl]="'/assets/green.JPG'">
<a href="https://imgflip.com/i/8aw8ki"><img alt="" ngSrc="https://i.imgflip.com/8aw8ki.jpg"
width="500" height="500" class="mx-auto"
title=""/></a>
<div class="items-center text-center flex flex-col">
<h2 class="text-warning text-2xl font-bold mt-4">I accept the risk to get a non-complete portfolio experience ⚠️</h2>
<a href="/portfolio" class="text-lg px-12 py-4 rounded-full mt-4 font-bold
ring-white text-white bg-secondary ring-2
hover:ring-accent hover:text-accent hover:bg-transparent hover:ring-2">I've no fear! Bring me to Mordor</a>
</div>
</iov-section>

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DisclaimerComponent } from './disclaimer.component';
describe('DisclaimerComponent', () => {
let component: DisclaimerComponent;
let fixture: ComponentFixture<DisclaimerComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [DisclaimerComponent]
})
.compileComponents();
fixture = TestBed.createComponent(DisclaimerComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1,27 @@
<div class="bg-white shadow-md border border-primary rounded-lg mb-4 p-4 max-h-80 min-h-80 overflow-hidden flex flex-col flex-wrap">
<img class="rounded-t-lg float-left max-h-32 min-h-32 object-contain {{expanded ? 'object-left max-w-32' : ''}}" ngSrc="{{job?.image}}" alt="" width="300" height="100">
<h5 class="text-gray-900 text-xl tracking-tight mb-2 justify-left" *ngIf="expanded">{{job?.name}} <br/> <em class="text-lg"><i>{{job?.role}}</i></em></h5>
<div class="flex {{expanded ? 'max-w-96 flex-col -ml-1/5' : 'items-center'}} flex-1">
<h5 class="text-gray-900 text-xl tracking-tight mb-2 justify-left" *ngIf="!expanded">{{job?.name}} <br/> <em class="text-lg"><i>{{job?.role}}</i></em></h5>
<div class="font-normal text-gray-700 mb-3" *ngIf="expanded" [innerHTML]="job?.description"></div>
<a *ngIf="expanded" class="text-sm px-6 py-2 rounded-full font-bold
ring-white text-white bg-secondary ring-2
cursor-pointer
text-center
max-w-48
self-end
hover:ring-accent hover:text-accent hover:bg-transparent hover:ring-2"
href="{{job?.website}}" target="_blank">
Visit Website
</a>
</div>
<div class="flex items-center justify-center flex-1" *ngIf="!expanded" >
<a class="text-sm px-6 py-2 rounded-full font-bold relative ring-white text-white bg-secondary ring-2
hover:ring-accent hover:text-accent hover:bg-transparent hover:ring-2
cursor-pointer"
(click)="expand.emit()">
Show more
</a>
</div>
</div>

View file

@ -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<PortfolioItemCardComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [PortfolioItemCardComponent]
})
.compileComponents();
fixture = TestBed.createComponent(PortfolioItemCardComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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<void> = new EventEmitter<void>();
@Input() job: Job | undefined
@Input() expanded: boolean = false;
}

View file

@ -0,0 +1,11 @@
<iov-section [title]="'Portfolio'"
[backgroundImageUrl]="'/assets/green.JPG'">
<div class="mb-10">
<div class="grid grid-cols-3 bg-slate-100 p-4">
<div *ngFor="let job of jobs; index as i" class="m-4 {{expandedJob == i ? ('col-span-3 order-' + i) : 'col-span-1 order-'+ i}}">
<iov-portfolio-item-card [job]="job" (expand)="expand(i)" [expanded]="i == expandedJob">
</iov-portfolio-item-card>
</div>
</div>
</div>
</iov-section>

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PortfolioPage } from './portfolio.page';
describe('WorksComponent', () => {
let component: PortfolioPage;
let fixture: ComponentFixture<PortfolioPage>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [PortfolioPage]
})
.compileComponents();
fixture = TestBed.createComponent(PortfolioPage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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. <br/>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 (<b>NodeJs + Typescript</b>).<br/>' +
'This crawler identifies GDPR non-compliant websites, playing a pivotal role in revenue generation.<br/>',
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.<br/>' +
'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.<br/>' +
'The whole project was based on <b>Angular + SAP Spartacus</b> for FE.<br/>',
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.<br/>' +
'I also made architectural decisions in order to improve SEO and speed, deciding to utilize <b>Nuxt</b> (a <b>Vue</b> framework) for FE and <b>Strapi</b> for the BE and to manage the myriad of integrated external services.<br/>' +
'Ive 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.<br/>',
website: 'https://acker.co/',
image: 'assets/portfolio/acker.svg'
},
{
name: 'Medicami',
role: 'Tech Lead',
description: 'I\'ve realized a mobile App with <b>Angular + Ionic + Loopack</b> that communicates with neoped (pediatric CRM) to manage medical remote visits, managing health documents. Ive also built the whole <b>CI/CD</b< and the <b>AWS</b> infrastructure (ECS + ECR). <br/>' +
'The backoffice and the landing page was realized in <b>Nuxt</b> with a focus on SEO and performance.<br/>' +
'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.<br/>',
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.<br/>' +
'I worked closely with the UX team and with the backend team to ensure a smooth integration with the existing systems.<br/>' +
'I also realized for the project (in <b>Angular</b>) a huge UI library with Storybook with reusable components.<br/>',
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 (<b>Angular + Express</b>) but also taking care of creating up a development team, making a delivery plan and allocating resources.<br/>' +
'Through strategic planning and team collaboration, we successfully bridged the past and future, delivering a modern, responsive, and user-friendly experience.<br/>',
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.<br/>' +
'I evolved and maintained the existing application utilizing <b>Backbone.js</b> to ensure an efficient and responsive user experience.<br/>',
website: 'https://tuotempo.it/',
image: 'assets/portfolio/tuotempo.svg'
},
]
expand(index: number) {
this.expandedJob = index;
}
}

View file

@ -0,0 +1,5 @@
<iov-section [title]="'Projects'"
[backgroundImageUrl]="'/assets/cat.jpg'">
</iov-section>
<p>ng2 fittext + netum In progress...</p>

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ProjectsPage } from './projects.page';
describe('ProjectsComponent', () => {
let component: ProjectsPage;
let fixture: ComponentFixture<ProjectsPage>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ProjectsPage]
})
.compileComponents();
fixture = TestBed.createComponent(ProjectsPage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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 {
}

View file

@ -0,0 +1,16 @@
<div class="">
<div class="bg-white shadow-md border border-gray-200 rounded-lg max-w-sm mb-5">
<a href="/blog/{{post?.slug}}">
<img class="rounded-t-lg" ngSrc="{{post?.image}}" alt="" width="300" height="200">
</a>
<div class="p-5">
<a href="#">
<h5 class="text-gray-900 font-bold text-2xl tracking-tight mb-2">{{post?.title}}</h5>
</a>
<p class="font-normal text-gray-700 mb-3">{{post?.description}}</p>
<a class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-3 py-2 text-center inline-flex items-center" href="/blog/{{post?.slug}}">
Read more
</a>
</div>
</div>
</div>

View file

@ -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<PostCardComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [PostCardComponent]
})
.compileComponents();
fixture = TestBed.createComponent(PostCardComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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;
}

View file

@ -0,0 +1,10 @@
<div class="bg-center bg-no-repeat
{{noHeight ? 'h-[0px]' : 'h-[150px]'}}
bg-{{backgroundColor == 'light' ? 'white' : 'secondary'}}
{{backgroundImageUrl ? 'url(' + backgroundImageUrl +')' : ''}}"
[style.background-image]="backgroundImageUrl ? 'url(' + backgroundImageUrl +')' : ''">
<h2 class="mx-24 pt-8 text-6xl drop-shadow-2xl shadow-black text-gray-600 mr-6 font-extrabold text-{{titleColor == 'light' ? 'white' : 'secondary'}}">{{title}}</h2>
</div>
<section class="max-w-4xl min-h-full py-4 px-6 mx-auto text-gray-700 flex flex-col items-center justify-center">
<ng-content></ng-content>
</section>

View file

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SectionComponent } from './section.component';
describe('SectionComponent', () => {
let component: SectionComponent;
let fixture: ComponentFixture<SectionComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [SectionComponent]
})
.compileComponents();
fixture = TestBed.createComponent(SectionComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -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;
}

16
src/assets/angular.svg Normal file
View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 250 250" style="enable-background:new 0 0 250 250;" xml:space="preserve">
<style type="text/css">
.st0{fill:#DD0031;}
.st1{fill:#C3002F;}
.st2{fill:#FFFFFF;}
</style>
<g>
<polygon class="st0" points="125,30 125,30 125,30 31.9,63.2 46.1,186.3 125,230 125,230 125,230 203.9,186.3 218.1,63.2 "/>
<polygon class="st1" points="125,30 125,52.2 125,52.1 125,153.4 125,153.4 125,230 125,230 203.9,186.3 218.1,63.2 125,30 "/>
<path class="st2" d="M125,52.1L66.8,182.6h0h21.7h0l11.7-29.2h49.4l11.7,29.2h0h21.7h0L125,52.1L125,52.1L125,52.1L125,52.1
L125,52.1z M142,135.4H108l17-40.9L142,135.4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 883 B

BIN
src/assets/cat.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 KiB

BIN
src/assets/cloud.JPG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

19
src/assets/github.svg Normal file
View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>github [#142]</title>
<desc>Created with Sketch.</desc>
<defs>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Dribbble-Light-Preview" transform="translate(-140.000000, -7559.000000)" fill="#000000">
<g id="icons" transform="translate(56.000000, 160.000000)">
<path d="M94,7399 C99.523,7399 104,7403.59 104,7409.253 C104,7413.782 101.138,7417.624 97.167,7418.981 C96.66,7419.082 96.48,7418.762 96.48,7418.489 C96.48,7418.151 96.492,7417.047 96.492,7415.675 C96.492,7414.719 96.172,7414.095 95.813,7413.777 C98.04,7413.523 100.38,7412.656 100.38,7408.718 C100.38,7407.598 99.992,7406.684 99.35,7405.966 C99.454,7405.707 99.797,7404.664 99.252,7403.252 C99.252,7403.252 98.414,7402.977 96.505,7404.303 C95.706,7404.076 94.85,7403.962 94,7403.958 C93.15,7403.962 92.295,7404.076 91.497,7404.303 C89.586,7402.977 88.746,7403.252 88.746,7403.252 C88.203,7404.664 88.546,7405.707 88.649,7405.966 C88.01,7406.684 87.619,7407.598 87.619,7408.718 C87.619,7412.646 89.954,7413.526 92.175,7413.785 C91.889,7414.041 91.63,7414.493 91.54,7415.156 C90.97,7415.418 89.522,7415.871 88.63,7414.304 C88.63,7414.304 88.101,7413.319 87.097,7413.247 C87.097,7413.247 86.122,7413.234 87.029,7413.87 C87.029,7413.87 87.684,7414.185 88.139,7415.37 C88.139,7415.37 88.726,7417.2 91.508,7416.58 C91.513,7417.437 91.522,7418.245 91.522,7418.489 C91.522,7418.76 91.338,7419.077 90.839,7418.982 C86.865,7417.627 84,7413.783 84,7409.253 C84,7403.59 88.478,7399 94,7399" id="github-[#142]">
</path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/green.JPG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

7
src/assets/linkedin.svg Normal file
View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.5 8C7.32843 8 8 7.32843 8 6.5C8 5.67157 7.32843 5 6.5 5C5.67157 5 5 5.67157 5 6.5C5 7.32843 5.67157 8 6.5 8Z" fill="#0F0F0F"/>
<path d="M5 10C5 9.44772 5.44772 9 6 9H7C7.55228 9 8 9.44771 8 10V18C8 18.5523 7.55228 19 7 19H6C5.44772 19 5 18.5523 5 18V10Z" fill="#0F0F0F"/>
<path d="M11 19H12C12.5523 19 13 18.5523 13 18V13.5C13 12 16 11 16 13V18.0004C16 18.5527 16.4477 19 17 19H18C18.5523 19 19 18.5523 19 18V12C19 10 17.5 9 15.5 9C13.5 9 13 10.5 13 10.5V10C13 9.44771 12.5523 9 12 9H11C10.4477 9 10 9.44772 10 10V18C10 18.5523 10.4477 19 11 19Z" fill="#0F0F0F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20 1C21.6569 1 23 2.34315 23 4V20C23 21.6569 21.6569 23 20 23H4C2.34315 23 1 21.6569 1 20V4C1 2.34315 2.34315 1 4 1H20ZM20 3C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20Z" fill="#0F0F0F"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/photos/dogs.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Some files were not shown because too many files have changed in this diff Show more