Basic contact page and social media links.

This commit is contained in:
JesseBrault0709 2024-06-06 07:16:06 +02:00
parent 5fa222df0c
commit 7746112afe
13 changed files with 188 additions and 14 deletions

View File

@ -1,8 +1,9 @@
package com.jessebrault.site
import com.jessebrault.ssg.di.Global
import groowt.view.component.web.BaseWebViewComponent
import groowt.view.component.web.WebViewComponent
import jakarta.inject.Inject
import org.jetbrains.annotations.Nullable
import java.time.LocalDate
@ -10,10 +11,15 @@ import java.time.format.DateTimeFormatter
class StandardPage extends BaseWebViewComponent {
final String spotifyUrl
final String youtubeUrl
final String title
final Closure<WebViewComponent> banner
StandardPage(Map attr) {
@Inject
StandardPage(@Global('spotifyUrl') String spotifyUrl, @Global('youtubeUrl') String youtubeUrl, Map attr) {
this.spotifyUrl = spotifyUrl
this.youtubeUrl = youtubeUrl
this.title = attr.title
this.banner = attr.banner ?: { '' }
}

View File

@ -0,0 +1,27 @@
package com.jessebrault.site.contact
import com.jessebrault.ssg.di.Global
import groowt.view.component.web.BaseWebViewComponent
import jakarta.inject.Inject
class ContactBanner extends BaseWebViewComponent {
final String spotifyUrl
final String youtubeUrl
final String linkedInUrl
final String githubUrl
@Inject
ContactBanner(
@Global('spotifyUrl') String spotifyUrl,
@Global('youtubeUrl') String youtubeUrl,
@Global('linkedInUrl') String linkedInUrl,
@Global('githubUrl') String githubUrl
) {
this.youtubeUrl = youtubeUrl
this.spotifyUrl = spotifyUrl
this.linkedInUrl = linkedInUrl
this.githubUrl = githubUrl
}
}

View File

@ -0,0 +1,17 @@
package com.jessebrault.site.icon
import com.jessebrault.ssg.view.SkipTemplate
import groowt.view.View
import groowt.view.component.web.lib.DelegatingWebViewComponent
@SkipTemplate
class GithubIcon extends DelegatingWebViewComponent {
private static final String svgText = GithubIcon.getResource('Github.txt').text
@Override
protected View getDelegate() {
return { Writer w -> w << svgText }
}
}

View File

@ -0,0 +1,17 @@
package com.jessebrault.site.icon
import com.jessebrault.ssg.view.SkipTemplate
import groowt.view.View
import groowt.view.component.web.lib.DelegatingWebViewComponent
@SkipTemplate
class LinkedInIcon extends DelegatingWebViewComponent {
private static final String svgText = LinkedInIcon.getResource('LinkedIn.txt').text
@Override
protected View getDelegate() {
return { Writer w -> w << svgText }
}
}

View File

@ -16,12 +16,8 @@ import com.jessebrault.site.icon.YoutubeIcon
</main>
<footer>
<div class="social-icons">
<a href="https://open.spotify.com/artist/4ea1gZnLlQTrXKIMsnlr45?si=DfR-KCDyTiycbjmYwu566w">
<SpotifyIcon />
</a>
<a href="https://www.youtube.com/@JesseBrault0709">
<YoutubeIcon />
</a>
<a href={spotifyUrl}><SpotifyIcon /></a>
<a href={youtubeUrl}><YoutubeIcon /></a>
</div>
<p>Copyright $copyrightYear Jesse R. Brault. All rights reserved.</p>
</footer>

View File

@ -0,0 +1,19 @@
---
package com.jessebrault.site.contact
import com.jessebrault.site.icon.*
---
<div class="banner contact-banner">
<div class="headshot-container">
<img src="/portrait2.jpg" class="headshot" />
</div>
<article class="social-media-links">
<h1>Social Media</h1>
<div class="social-media-links">
<a href={spotifyUrl}><SpotifyIcon /><span>Spotify Profile</span></a>
<a href={youtubeUrl}><YoutubeIcon /><span>Youtube Channel</span></a>
<a href={linkedInUrl}><LinkedInIcon /><span>LinkedIn Profile</span></a>
<a href={githubUrl}><GithubIcon /><span>Github Profile</span></a>
</div>
</article>
</div>

View File

@ -0,0 +1,2 @@
<!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,2 @@
<!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg>

After

Width:  |  Height:  |  Size: 717 B

View File

@ -0,0 +1,22 @@
package com.jessebrault.site.contact
import com.jessebrault.site.util.TitleMaker
import com.jessebrault.ssg.page.PageSpec
import com.jessebrault.ssg.view.WvcPageView
import jakarta.inject.Inject
@PageSpec(name = 'Contact', path = '/contact')
class ContactPage extends WvcPageView {
private final TitleMaker titleMaker
@Inject
ContactPage(TitleMaker titleMaker) {
this.titleMaker = titleMaker
}
String getTitle() {
titleMaker.makeTitle(pageTitle)
}
}

View File

@ -0,0 +1,8 @@
---
package com.jessebrault.site.contact
import com.jessebrault.site.StandardPage
---
<StandardPage title={title} banner={<ContactBanner />}>
<p>Hello</p>
</StandardPage>

View File

@ -14,8 +14,12 @@ build {
basePackage 'com.jessebrault.site'
globals {
siteTagLine = 'Conductor, Composer, Developer'
menuItems = ['Biography', 'Compositions']
menuItems = ['Biography', 'Compositions', 'Contact']
compositionCategories = ['Chamber', 'Solo']
spotifyUrl = 'https://open.spotify.com/artist/4ea1gZnLlQTrXKIMsnlr45?si=DfR-KCDyTiycbjmYwu566w'
youtubeUrl = 'https://www.youtube.com/@JesseBrault0709'
linkedInUrl = 'https://www.linkedin.com/in/jessebrault0709/'
githubUrl = 'https://github.com/JesseBrault0709'
}
objectFactoryBuilder.configure {
configureRegistry {

View File

@ -7,6 +7,8 @@
--light-gray: #dedede;
--petrol: #476c77;
--off-white: #fdfdfd;
--gothic: 'Didact Gothic', sans-serif;
--garamond: 'Cormorant Garamond', serif;
}
html {
@ -21,7 +23,7 @@ body {
.header-banner-container {
background-color: var(--petrol);
font-family: 'Didact Gothic', sans-serif;
font-family: var(--gothic);
letter-spacing: 0.2em;
}
@ -69,6 +71,7 @@ nav a:hover {
.banner {
display: flex;
align-items: center;
color: var(--off-white);
}
.banner > * {
@ -84,7 +87,7 @@ main {
}
article {
font-family: 'Cormorant Garamond', serif;
font-family: var(--garamond);
letter-spacing: 0.05em;
padding: 50px 25px;
max-width: 700px;
@ -97,7 +100,7 @@ footer {
padding: 20px 50px;
background-color: var(--petrol);
color: var(--off-white);
font-family: 'Cormorant Garamond', serif;
font-family: var(--garamond);
}
footer .social-icons {
@ -125,7 +128,6 @@ footer svg:hover {
}
.biography-banner .blurb-container {
color: var(--off-white);
display: flex;
flex-direction: column;
row-gap: 36px;
@ -147,6 +149,58 @@ footer svg:hover {
border: 1px solid var(--light-gray);
width: 150px;
height: 40px;
font-family: 'Didact Gothic';
font-family: var(--gothic);
font-size: 18px;
}
.contact-banner article.social-media-links {
font-family: var(--gothic);
}
.contact-banner article.social-media-links h1 {
font-size: 36px;
color: var(--light-gray);
text-align: center;
}
.contact-banner div.social-media-links {
display: grid;
grid-template-columns: max-content 1fr;
align-items: center;
gap: 20px;
}
.contact-banner a {
display: contents;
color: var(--light-gray);
fill: var(--light-gray);
text-decoration: none;
}
.contact-banner a:hover {
& span {
color: var(--off-white);
}
& svg {
fill: var(--off-white);
}
}
.contact-banner a:visited {
& span {
color: var(--off-white);
}
& svg {
fill: var(--off-white);
}
}
.contact-banner svg {
height: 72px;
justify-self: center;
}
.contact-banner a span {
font-size: 27px;
justify-self: stretch;
}

BIN
static/portrait2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 KiB