diff --git a/components/groovy/com/jessebrault/site/StandardPage.groovy b/components/groovy/com/jessebrault/site/StandardPage.groovy index fcd1ae0..0894da7 100644 --- a/components/groovy/com/jessebrault/site/StandardPage.groovy +++ b/components/groovy/com/jessebrault/site/StandardPage.groovy @@ -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 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 ?: { '' } } diff --git a/components/groovy/com/jessebrault/site/contact/ContactBanner.groovy b/components/groovy/com/jessebrault/site/contact/ContactBanner.groovy new file mode 100644 index 0000000..0a2012d --- /dev/null +++ b/components/groovy/com/jessebrault/site/contact/ContactBanner.groovy @@ -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 + } + +} diff --git a/components/groovy/com/jessebrault/site/icon/GithubIcon.groovy b/components/groovy/com/jessebrault/site/icon/GithubIcon.groovy new file mode 100644 index 0000000..3a9ba59 --- /dev/null +++ b/components/groovy/com/jessebrault/site/icon/GithubIcon.groovy @@ -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 } + } + +} diff --git a/components/groovy/com/jessebrault/site/icon/LinkedInIcon.groovy b/components/groovy/com/jessebrault/site/icon/LinkedInIcon.groovy new file mode 100644 index 0000000..e3e1602 --- /dev/null +++ b/components/groovy/com/jessebrault/site/icon/LinkedInIcon.groovy @@ -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 } + } + +} diff --git a/components/resources/com/jessebrault/site/StandardPageTemplate.wvc b/components/resources/com/jessebrault/site/StandardPageTemplate.wvc index bc0f183..d967d1a 100644 --- a/components/resources/com/jessebrault/site/StandardPageTemplate.wvc +++ b/components/resources/com/jessebrault/site/StandardPageTemplate.wvc @@ -16,12 +16,8 @@ import com.jessebrault.site.icon.YoutubeIcon diff --git a/components/resources/com/jessebrault/site/contact/ContactBannerTemplate.wvc b/components/resources/com/jessebrault/site/contact/ContactBannerTemplate.wvc new file mode 100644 index 0000000..c5cda3f --- /dev/null +++ b/components/resources/com/jessebrault/site/contact/ContactBannerTemplate.wvc @@ -0,0 +1,19 @@ +--- +package com.jessebrault.site.contact + +import com.jessebrault.site.icon.* +--- + diff --git a/components/resources/com/jessebrault/site/icon/Github.txt b/components/resources/com/jessebrault/site/icon/Github.txt new file mode 100644 index 0000000..ccfbaf2 --- /dev/null +++ b/components/resources/com/jessebrault/site/icon/Github.txt @@ -0,0 +1,2 @@ + + diff --git a/components/resources/com/jessebrault/site/icon/LinkedIn.txt b/components/resources/com/jessebrault/site/icon/LinkedIn.txt new file mode 100644 index 0000000..6a46edb --- /dev/null +++ b/components/resources/com/jessebrault/site/icon/LinkedIn.txt @@ -0,0 +1,2 @@ + + diff --git a/pages/groovy/com/jessebrault/site/contact/ContactPage.groovy b/pages/groovy/com/jessebrault/site/contact/ContactPage.groovy new file mode 100644 index 0000000..5980087 --- /dev/null +++ b/pages/groovy/com/jessebrault/site/contact/ContactPage.groovy @@ -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) + } + +} diff --git a/pages/resources/com/jessebrault/site/contact/ContactPageTemplate.wvc b/pages/resources/com/jessebrault/site/contact/ContactPageTemplate.wvc new file mode 100644 index 0000000..d87ab15 --- /dev/null +++ b/pages/resources/com/jessebrault/site/contact/ContactPageTemplate.wvc @@ -0,0 +1,8 @@ +--- +package com.jessebrault.site.contact + +import com.jessebrault.site.StandardPage +--- +}> +

Hello

+
diff --git a/ssg/default.groovy b/ssg/default.groovy index eddcc58..3b27eb3 100644 --- a/ssg/default.groovy +++ b/ssg/default.groovy @@ -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 { diff --git a/static/main.css b/static/main.css index 6fc6e73..dcdcae8 100644 --- a/static/main.css +++ b/static/main.css @@ -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; +} diff --git a/static/portrait2.jpg b/static/portrait2.jpg new file mode 100644 index 0000000..acc4afc Binary files /dev/null and b/static/portrait2.jpg differ