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
	 JesseBrault0709
						JesseBrault0709