Basic contact page and social media links.
This commit is contained in:
parent
5fa222df0c
commit
7746112afe
@ -1,8 +1,9 @@
|
|||||||
package com.jessebrault.site
|
package com.jessebrault.site
|
||||||
|
|
||||||
|
import com.jessebrault.ssg.di.Global
|
||||||
import groowt.view.component.web.BaseWebViewComponent
|
import groowt.view.component.web.BaseWebViewComponent
|
||||||
import groowt.view.component.web.WebViewComponent
|
import groowt.view.component.web.WebViewComponent
|
||||||
|
import jakarta.inject.Inject
|
||||||
import org.jetbrains.annotations.Nullable
|
import org.jetbrains.annotations.Nullable
|
||||||
|
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
@ -10,10 +11,15 @@ import java.time.format.DateTimeFormatter
|
|||||||
|
|
||||||
class StandardPage extends BaseWebViewComponent {
|
class StandardPage extends BaseWebViewComponent {
|
||||||
|
|
||||||
|
final String spotifyUrl
|
||||||
|
final String youtubeUrl
|
||||||
final String title
|
final String title
|
||||||
final Closure<WebViewComponent> banner
|
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.title = attr.title
|
||||||
this.banner = attr.banner ?: { '' }
|
this.banner = attr.banner ?: { '' }
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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 }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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 }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -16,12 +16,8 @@ import com.jessebrault.site.icon.YoutubeIcon
|
|||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="social-icons">
|
<div class="social-icons">
|
||||||
<a href="https://open.spotify.com/artist/4ea1gZnLlQTrXKIMsnlr45?si=DfR-KCDyTiycbjmYwu566w">
|
<a href={spotifyUrl}><SpotifyIcon /></a>
|
||||||
<SpotifyIcon />
|
<a href={youtubeUrl}><YoutubeIcon /></a>
|
||||||
</a>
|
|
||||||
<a href="https://www.youtube.com/@JesseBrault0709">
|
|
||||||
<YoutubeIcon />
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<p>Copyright $copyrightYear Jesse R. Brault. All rights reserved.</p>
|
<p>Copyright $copyrightYear Jesse R. Brault. All rights reserved.</p>
|
||||||
</footer>
|
</footer>
|
||||||
|
@ -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>
|
@ -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 |
@ -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 |
22
pages/groovy/com/jessebrault/site/contact/ContactPage.groovy
Normal file
22
pages/groovy/com/jessebrault/site/contact/ContactPage.groovy
Normal 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
package com.jessebrault.site.contact
|
||||||
|
|
||||||
|
import com.jessebrault.site.StandardPage
|
||||||
|
---
|
||||||
|
<StandardPage title={title} banner={<ContactBanner />}>
|
||||||
|
<p>Hello</p>
|
||||||
|
</StandardPage>
|
@ -14,8 +14,12 @@ build {
|
|||||||
basePackage 'com.jessebrault.site'
|
basePackage 'com.jessebrault.site'
|
||||||
globals {
|
globals {
|
||||||
siteTagLine = 'Conductor, Composer, Developer'
|
siteTagLine = 'Conductor, Composer, Developer'
|
||||||
menuItems = ['Biography', 'Compositions']
|
menuItems = ['Biography', 'Compositions', 'Contact']
|
||||||
compositionCategories = ['Chamber', 'Solo']
|
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 {
|
objectFactoryBuilder.configure {
|
||||||
configureRegistry {
|
configureRegistry {
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
--light-gray: #dedede;
|
--light-gray: #dedede;
|
||||||
--petrol: #476c77;
|
--petrol: #476c77;
|
||||||
--off-white: #fdfdfd;
|
--off-white: #fdfdfd;
|
||||||
|
--gothic: 'Didact Gothic', sans-serif;
|
||||||
|
--garamond: 'Cormorant Garamond', serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
html {
|
html {
|
||||||
@ -21,7 +23,7 @@ body {
|
|||||||
|
|
||||||
.header-banner-container {
|
.header-banner-container {
|
||||||
background-color: var(--petrol);
|
background-color: var(--petrol);
|
||||||
font-family: 'Didact Gothic', sans-serif;
|
font-family: var(--gothic);
|
||||||
letter-spacing: 0.2em;
|
letter-spacing: 0.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,6 +71,7 @@ nav a:hover {
|
|||||||
.banner {
|
.banner {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
color: var(--off-white);
|
||||||
}
|
}
|
||||||
|
|
||||||
.banner > * {
|
.banner > * {
|
||||||
@ -84,7 +87,7 @@ main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
article {
|
article {
|
||||||
font-family: 'Cormorant Garamond', serif;
|
font-family: var(--garamond);
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
padding: 50px 25px;
|
padding: 50px 25px;
|
||||||
max-width: 700px;
|
max-width: 700px;
|
||||||
@ -97,7 +100,7 @@ footer {
|
|||||||
padding: 20px 50px;
|
padding: 20px 50px;
|
||||||
background-color: var(--petrol);
|
background-color: var(--petrol);
|
||||||
color: var(--off-white);
|
color: var(--off-white);
|
||||||
font-family: 'Cormorant Garamond', serif;
|
font-family: var(--garamond);
|
||||||
}
|
}
|
||||||
|
|
||||||
footer .social-icons {
|
footer .social-icons {
|
||||||
@ -125,7 +128,6 @@ footer svg:hover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.biography-banner .blurb-container {
|
.biography-banner .blurb-container {
|
||||||
color: var(--off-white);
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
row-gap: 36px;
|
row-gap: 36px;
|
||||||
@ -147,6 +149,58 @@ footer svg:hover {
|
|||||||
border: 1px solid var(--light-gray);
|
border: 1px solid var(--light-gray);
|
||||||
width: 150px;
|
width: 150px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
font-family: 'Didact Gothic';
|
font-family: var(--gothic);
|
||||||
font-size: 18px;
|
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
BIN
static/portrait2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 847 KiB |
Loading…
Reference in New Issue
Block a user