feat: blog section on homepage
This commit is contained in:
48
components/blog.templ
Normal file
48
components/blog.templ
Normal file
@@ -0,0 +1,48 @@
|
||||
package components
|
||||
|
||||
import "strings"
|
||||
|
||||
type Blog struct {
|
||||
Title string
|
||||
Summary string
|
||||
Link templ.SafeURL
|
||||
}
|
||||
|
||||
templ BlogSummary(entry Blog) {
|
||||
<article
|
||||
aria-labelledby={ "blog-entry-" + strings.ReplaceAll(entry.Title, " ", "-") }
|
||||
>
|
||||
<h3
|
||||
id={ "blog-entry-" + strings.ReplaceAll(entry.Title, " ", "-") }
|
||||
class="font-cal text-xl"
|
||||
>
|
||||
{ entry.Title }
|
||||
</h3>
|
||||
<div class="relative w-fit h-fit">
|
||||
<p class="line-clamp-3 text-justify text-light-gray">
|
||||
{ entry.Summary }
|
||||
</p>
|
||||
<div
|
||||
aria-hidden="true"
|
||||
class="h-0 w-0 pointer-events-none bg-transparent!"
|
||||
>
|
||||
<div
|
||||
class={ "absolute left-0 top-0 h-100% w-100% " +
|
||||
"bg-transparent bg-gradient-to-t from-black/50" }
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<a
|
||||
class={ "transition-1s transition-color text-gray hover:text-light-gray no-underline " +
|
||||
"hover:underline transform-gpu hover:-translate-y-0.2 transition-transform" }
|
||||
href={ entry.Link }
|
||||
>
|
||||
Read all
|
||||
<span
|
||||
class="w-3 h-3 bg-gray hover:bg-light-gray i-solar:arrow-right-up-line-duotone inline-block"
|
||||
></span>
|
||||
</a>
|
||||
</div>
|
||||
</article>
|
||||
}
|
||||
@@ -64,6 +64,45 @@ var mockProjects = []components.Project{
|
||||
},
|
||||
}
|
||||
|
||||
var mockBlog = []components.Blog{
|
||||
{
|
||||
Title: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim.",
|
||||
Summary: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint " +
|
||||
"cillum sint consectetur cupidatat Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.",
|
||||
Link: templ.URL("/001"),
|
||||
},
|
||||
{
|
||||
Title: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim.",
|
||||
Summary: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint " +
|
||||
"cillum sint consectetur cupidatat Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.",
|
||||
Link: templ.URL("/001"),
|
||||
},
|
||||
{
|
||||
Title: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim.",
|
||||
Summary: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint " +
|
||||
"cillum sint consectetur cupidatat Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.",
|
||||
Link: templ.URL("/001"),
|
||||
},
|
||||
{
|
||||
Title: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim.",
|
||||
Summary: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint " +
|
||||
"cillum sint consectetur cupidatat Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.",
|
||||
Link: templ.URL("/001"),
|
||||
},
|
||||
{
|
||||
Title: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim.",
|
||||
Summary: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint " +
|
||||
"cillum sint consectetur cupidatat Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.",
|
||||
Link: templ.URL("/001"),
|
||||
},
|
||||
{
|
||||
Title: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim.",
|
||||
Summary: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint " +
|
||||
"cillum sint consectetur cupidatat Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.",
|
||||
Link: templ.URL("/001"),
|
||||
},
|
||||
}
|
||||
|
||||
var images = []string{
|
||||
"/images/image-1.png",
|
||||
"/images/image-2.png",
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
type HomepageProps struct {
|
||||
Projects []components.Project
|
||||
Blogs []components.Blog
|
||||
Images []string
|
||||
}
|
||||
|
||||
@@ -147,6 +148,44 @@ templ Homepage(props HomepageProps) {
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section
|
||||
aria-labelledby="blog-header"
|
||||
id="blog"
|
||||
class="w-screen min-h-screen flex justify-center items-center"
|
||||
>
|
||||
<div class="w-90% xl:w-50% max-h-60% snap-start">
|
||||
<hgroup class="flex justify-between my-5">
|
||||
<h2 id="blog-header" class="font-cal text-5xl m-0">Blog.</h2>
|
||||
<p class="m-0">
|
||||
<a
|
||||
href="/blog"
|
||||
class="decoration-none text-light-gray flex items-center"
|
||||
>
|
||||
See more
|
||||
<span
|
||||
class="w-5 h-5 bg-light-gray i-solar:arrow-right-up-line-duotone inline-block"
|
||||
></span>
|
||||
</a>
|
||||
</p>
|
||||
</hgroup>
|
||||
<div
|
||||
class={ "w-100% max-h-65vh md:max-h-70vh overflow-hidden " +
|
||||
"md:grid grid-cols-2 gap-4" }
|
||||
>
|
||||
for i, blog := range props.Blogs {
|
||||
if i < 2 {
|
||||
<div class="">
|
||||
@components.BlogSummary(blog)
|
||||
</div>
|
||||
} else if i < 4 {
|
||||
<div class="hidden md:block">
|
||||
@components.BlogSummary(blog)
|
||||
</div>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<footer>
|
||||
<div
|
||||
|
||||
Reference in New Issue
Block a user