Compare commits

..

5 Commits

Author SHA1 Message Date
509b398b6d feat: Added featured post
All checks were successful
Deploy Blog to Folder / deploy (push) Successful in 4s
2025-08-23 13:39:09 -04:00
c25f32592b fix: Fixed CSS for post thumbnail
All checks were successful
Deploy Blog to Folder / deploy (push) Successful in 4s
2025-08-22 23:29:28 -04:00
b7822c8080 fix: Added padding to post thumbnail image
All checks were successful
Deploy Blog to Folder / deploy (push) Successful in 4s
2025-08-22 23:22:05 -04:00
d6439e36d7 feat: Finished initial individual post layout
All checks were successful
Deploy Blog to Folder / deploy (push) Successful in 5s
2025-08-22 23:20:15 -04:00
abb4861389 feat: Finished all blog posts layout page 2025-08-22 22:47:43 -04:00
23 changed files with 172 additions and 71 deletions

View File

@ -126,6 +126,7 @@ main > :last-child {
object-fit: cover; object-fit: cover;
object-position: center; object-position: center;
width: 100%; width: 100%;
border: 4px solid white;
} }
.featured > h1, .featured > h1,
.about > h1 { .about > h1 {
@ -151,6 +152,14 @@ main > :last-child {
font-weight: 300; font-weight: 300;
margin-top: 1rem; margin-top: 1rem;
} }
.featured .featured-text {
display: flex;
flex-direction: column;
}
.featured-text span {
color: rgba(var(--black), .56);
font-size: .85rem;
}
.about > div { .about > div {
margin-top: 2rem; margin-top: 2rem;
@ -226,4 +235,7 @@ main > :last-child {
text-align: end; text-align: end;
padding-left: 2rem; padding-left: 2rem;
} }
.featured > div > div {
width: 50%;
}
} }

View File

@ -2,6 +2,25 @@
margin-bottom: 2rem; margin-bottom: 2rem;
} }
.post-layout {
display: flex;
flex-direction: column;
}
.post-layout main {
flex: 1;
}
.post-layout main .thumbnail {
width: 100%;
height: 300px;
object-fit: contain;
object-position: center;
}
.post-layout main > div {
background-color: rgba(255, 255, 255, .71);
padding: 2rem;
height: 100%;
}
.posts { .posts {
display: grid; display: grid;
grid-template-columns: 1fr; grid-template-columns: 1fr;
@ -9,17 +28,50 @@
grid-column-gap: 2rem; grid-column-gap: 2rem;
grid-row-gap: 2rem; grid-row-gap: 2rem;
} }
.posts > a {
text-decoration: none;
color: rgba(var(--black), .76);
}
.posts > div { .posts > div {
width: 100%; width: 100%;
} }
.post-card {
background-color: white;
border-radius: 1rem;
box-shadow: 0 2px 4px rgba(var(--black), .21);
transition: transform 0.3s ease, box-shadow 0.3s ease;
margin: 0 1rem;
}
.post-card:hover {
transform: translate(-4px, -4px); /* Up and left by 4px */
box-shadow: 0 8px 16px rgba(var(--black), 0.3); /* deeper shadow for “lifted” look */
}
.post-card > img { .post-card > img {
width: 100%; width: 100%;
object-fit: cover; object-fit: cover;
object-position: center; object-position: center;
border-top-left-radius: 1rem;
border-top-right-radius: 1rem;
}
.post-card .post-body {
padding: 2rem;
} }
@media (min-width: 768px) {
.post-layout main .thumbnail {
height: 375px;
margin: 1rem 0;
}
}
@media (min-width: 992px) { @media (min-width: 992px) {
.posts { .posts {
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
} }
.post-card {
margin: 0;
}
.post-layout main .thumbnail {
height: 375px;
margin: 2rem 0;
}
} }

38
public/js/navbar.js Normal file
View File

@ -0,0 +1,38 @@
const mobileNav = document.getElementById('mobile-nav');
function toggleMobileNav() {
if (mobileNav.classList.contains('show')) {
removeBackdrop()
} else {
const backdrop = document.createElement('div');
backdrop.className = 'mobile-nav-backdrop';
document.body.appendChild(backdrop);
backdrop.addEventListener('click', () => {
mobileNav.classList.remove('show');
removeBackdrop();
});
setTimeout(() => backdrop.classList.add('show'), 10);
}
mobileNav.classList.toggle('show');
}
function removeBackdrop() {
const backdrop = document.querySelector('.mobile-nav-backdrop');
if (backdrop) {
backdrop.classList.remove('show');
setTimeout(() => {
backdrop.remove();
}, 250);
}
}
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
if (mobileNav.classList.contains('show')) {
mobileNav.classList.remove('show');
removeBackdrop();
}
}
});
document.getElementById('mobile-nav-btn').addEventListener('click', toggleMobileNav);
document.getElementById('mobile-nav-close-btn').addEventListener('click', toggleMobileNav);

View File

@ -7,4 +7,9 @@ export default function(eleventyConfig) {
return array[0]; return array[0];
}); });
eleventyConfig.addFilter("firstWords", function (content, numWords = 100) {
if (!content) return "";
return content.split(/\s+/).slice(0, numWords).join(" ");
});
}; };

View File

@ -1,2 +1,3 @@
<script type="module" src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"></script> <script type="module" src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"></script>
<script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script> <script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script>
<script src="/js/navbar.js"></script>

View File

@ -23,46 +23,5 @@
</footer> </footer>
{% include "components/scripts.liquid" %} {% include "components/scripts.liquid" %}
<script>
// TODO: move to script file
const mobileNav = document.getElementById('mobile-nav');
function toggleMobileNav() {
if (mobileNav.classList.contains('show')) {
removeBackdrop()
} else {
const backdrop = document.createElement('div');
backdrop.className = 'mobile-nav-backdrop';
document.body.appendChild(backdrop);
backdrop.addEventListener('click', () => {
mobileNav.classList.remove('show');
removeBackdrop();
});
setTimeout(() => backdrop.classList.add('show'), 10);
}
mobileNav.classList.toggle('show');
}
function removeBackdrop() {
const backdrop = document.querySelector('.mobile-nav-backdrop');
if (backdrop) {
backdrop.classList.remove('show');
setTimeout(() => {
backdrop.remove();
}, 250);
}
}
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
if (mobileNav.classList.contains('show')) {
mobileNav.classList.remove('show');
removeBackdrop();
}
}
});
document.getElementById('mobile-nav-btn').addEventListener('click', toggleMobileNav);
document.getElementById('mobile-nav-close-btn').addEventListener('click', toggleMobileNav);
</script>
</body> </body>
</html> </html>

View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="en">
<head>
{% include "components/meta-tags.liquid" %}
{% include "components/headers.liquid" %}
<link rel="stylesheet" href="/css/posts.css">
<title>{{ title | default: metadata.title }} - Cyper's Blog</title>
</head>
<body class="post-layout">
<header>
{% include "components/navbars.liquid" %}
</header>
<main>
<div class="container">
<h1>{{ title }}</h1>
<p class="timestamp">{{ date | date: "%B %-d, %Y" }}</p>
<img class="thumbnail" src="{{ thumbnail }}">
{{ content }}
</div>
</main>
<footer>
{% include "components/footer.liquid" %}
</footer>
{% include "components/scripts.liquid" %}
</body>
</html>

View File

@ -31,7 +31,7 @@ css: about.css
help even one person or introduce a new perspective to someone, then this blog has served its purpose and I can be happy. help even one person or introduce a new perspective to someone, then this blog has served its purpose and I can be happy.
</p> </p>
<p> <p>
While this blog isn't my "safe space" per se, it is a place where I will express my unfiltered thoughts and opinions. I encourage everyone else to do the same, and to please be respectful of others' opinions while doing so. This blog is a place where I will express my unfiltered thoughts and opinions. I encourage everyone else to do the same, and to please be respectful of others' opinions while doing so.
</p> </p>
</div> </div>
</div> </div>

View File

@ -35,15 +35,17 @@ css: home.css
</div> </div>
<div> <div>
<div class="container featured"> <div class="container featured">
{% assign latestPost = collections.posts | last %}
<h1>Featured Posts</h1> <h1>Featured Posts</h1>
<div> <div>
<div> <div>
<img src="https://dummyimage.com/1280x720/fff/aaa" alt="Featured Post Image" /> <img class="featured-image" src="{{ latestPost.data.thumbnail }}" alt="{{ latestPost.data.title }}" />
</div> </div>
<div> <div class="featured-text">
<h2>Latest Post Title Goes Here</h2> <h2>{{ latestPost.data.title }}</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Alias nisi dolorem velit facere ea? Fugit dolor libero dolorem laborum sapiente labore quidem eos, ratione deleniti. Hic sunt ea aspernatur iusto!</p> <span>{{ latestPost.data.date | date: "%B %-d, %Y" }}</span>
<a href="#">Read more...</a> <p>{{ latestPost.templateContent | strip_html | firstWords: 25 }}</p>
<a href="{{ latestPost.url }}">Read more...</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 1 title: Example post 1
date: 2025-08-01 date: 2025-08-01
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
First post! Content change First post! Content change

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 10 title: Example post 10
date: 2025-08-10 date: 2025-08-10
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 3 title: Example post 3
date: 2025-08-11 date: 2025-08-11
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 12 title: Example post 12
date: 2025-08-12 date: 2025-08-12
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 2 - for Paz title: Example post 2 - for Paz
date: 2025-08-02 date: 2025-08-02
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 3 title: Example post 3
date: 2025-08-03 date: 2025-08-03
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 4 title: Example post 4
date: 2025-08-04 date: 2025-08-04
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 5 title: Example post 5
date: 2025-08-05 date: 2025-08-05
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 6 title: Example post 6
date: 2025-08-06 date: 2025-08-06
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 7 title: Example post 7
date: 2025-08-07 date: 2025-08-07
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 8 title: Example post 8
date: 2025-08-08 date: 2025-08-08
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,7 +1,7 @@
--- ---
title: Example post 9 title: Example post 9
date: 2025-08-09 date: 2025-08-09
thumbnail: https://dummyimage.com/1280x720/fff/aaa thumbnail: https://dummyimage.com/1280x720/ccc/fff
--- ---
Second post! Second post!

View File

@ -1,4 +1,4 @@
{ {
"layout": "layout.liquid", "layout": "post-layout.liquid",
"tags": "posts" "tags": "posts"
} }

View File

@ -18,6 +18,7 @@ css: posts.css
</div> </div>
<div class="container posts"> <div class="container posts">
{% for post in pagination.items %} {% for post in pagination.items %}
<a href="{{ post.url }}">
<div class="post-card"> <div class="post-card">
{% if post.data.thumbnail %} {% if post.data.thumbnail %}
<img src="{{ post.data.thumbnail }}" alt="{{ post.data.title }}" /> <img src="{{ post.data.thumbnail }}" alt="{{ post.data.title }}" />
@ -29,6 +30,7 @@ css: posts.css
<!-- <p>Views {} | Likes {}</p> --> <!-- <p>Views {} | Likes {}</p> -->
</div> </div>
</div> </div>
</a>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>