feat: Add demo card on demos page for first showcased demo

- add _data/demos.js data file
- add Nunjucks logic for dynamically injecting demo attributes into demo cards
- add style rules for demo cards
This commit is contained in:
2025-09-07 17:24:16 -05:00
parent 264529c428
commit 3c22c88396
8 changed files with 212 additions and 46 deletions

55
src/_data/demos.js Normal file
View File

@@ -0,0 +1,55 @@
/**
* @fileoverview This file holds the data for demo cards served on https://dlseitz.dev/demos/
*/
const DEMOS = [
    {
        "title": "Bloom Valley Nursery",
"id": "bvn",
        "imageFile": "bloom-valley-nursery-demo.jpg",
        "altText": "A screenshot of the Bloom Valley Nursery Demo landing page",
        "description": "This demo is a modern e-commerce website (front end) designed to help a fictional family-owned business expand its reach to a broader online audience. It focuses on clean design, data-driven interactivity, and a personal, community-focused touch.",
        "demoUrl": "https://bloomvalleydemo.dlseitz.dev",
        "repoUrl": "https://gitea.dlseitz.dev/dereklseitz/BloomValleyNursery",
        "techstack": [
"11ty",
"HTML",
"CSS",
"JavaScript",
"Nunjucks",
"Node.js",
"Font Awesome",
"Zoho Calendar API"
],
"featuresShort": [
"Data-driven content",
"Interactive carousels",
"Shopping cart functionality",
"Customer feedback & newsletter subscription",
"Third-party API integration",
"Web performance optimizations",
"Accessibility features",
"Modular design"
],
"featuresLong": [
"Data-driven content for products, promotions, testimonials, and events.",
"Interactive carousels on the homepage and gallery to showcase featured items, promotions, and testimonials.",
"Shopping cart functionality with temporary session storage.",
"Customer feedback form with client-side validation and local storage.",
"Newsletter subscription with client-side validation.",
"Dynamic integration with the Zoho Calendar API to display community events.",
"Responsive design that adapts to various screen sizes.",
"Accessibility features, including ARIA labels and semantic HTML.",
"Web performance optimizations, such as lazy loading for images.",
"Modular code and file structure for improved scalability and maintenance."
],
        "category": "e-commerce",
        "problemStatement": "To help a small, family-owned and operated business with deep roots in community involvement and public service expand their reach to customers who may prefer shopping online.",
        "solutionSummary": "This front end site is built to emulate a seamless online shopping experience that captures the fictional brand's community-focused story. The design prioritizes accessibility, visual harmony, and usability, while the data-driven functionality allows for a scalable and easily updatable web application.",
"isLive": false
    }
]
module.exports = {
    DEMOS
};

View File

@@ -22,7 +22,7 @@
<body>
<!-- <a href="https://www.svgbackgrounds.com/set/free-svg-backgrounds-and-patterns/">Free SVG Backgrounds and Patterns by SVGBackgrounds.com</a> -->
{% include "header.html" %}
{% include "header.njk" %}
<main>
@@ -30,7 +30,7 @@
</main>
{% include "footer.html" %}
{% include "footer.njk" %}
{% if pageScripts %}
{% for script in pageScripts %}

View File

@@ -1,25 +1,25 @@
<footer>
<ul class="social-links">
<li class="linkedin"><a href="https://linkedin.com/in/dereklseitz" target="_blank" rel="noopener noreferrer"
>Connect on LinkedIn</a></li>
<li class="gitea"><a href="https://gitea.dlseitz.dev/dereklseitz" target="_blank" rel="noopener noreferrer"
>My Project Repos</a></li>
<li class="campfire"><a href="https://campfire.dlseitz.dev" target=_blank" rel="noopener noreferrer">Campfire Logs</a></li>
</ul>
<nav aria-label="Footer navigation">
<ul class="footer-links">
<li><a href="#top">Back to Top</a></li>
<li><a href="/">Home</a></li>
<li><a href="/about/">About</a></li>
<li><a href="/demos/">Demos</a></li>
<li><a href="/about/#contact">Contact</a></li>
<li><a href="/privacy-policy/" target="_blank" rel="noopener noreferrer"
>Privacy Policy</a></li>
</ul>
</nav>
<p class="copyright">&copy; 2025, Derek L. Seitz, All rights reserved.</p>
<footer>
<ul class="social-links">
<li class="linkedin"><a href="https://linkedin.com/in/dereklseitz" target="_blank" rel="noopener noreferrer"
>Connect on LinkedIn</a></li>
<li class="gitea"><a href="https://gitea.dlseitz.dev/dereklseitz" target="_blank" rel="noopener noreferrer"
>My Project Repos</a></li>
<li class="campfire"><a href="https://campfire.dlseitz.dev" target=_blank" rel="noopener noreferrer">Campfire Logs</a></li>
</ul>
<nav aria-label="Footer navigation">
<ul class="footer-links">
<li><a href="#top">Back to Top</a></li>
<li><a href="/">Home</a></li>
<li><a href="/about/">About</a></li>
<li><a href="/demos/">Demos</a></li>
<li><a href="/about/#contact">Contact</a></li>
<li><a href="/privacy-policy/" target="_blank" rel="noopener noreferrer"
>Privacy Policy</a></li>
</ul>
</nav>
<p class="copyright">&copy; 2025, Derek L. Seitz, All rights reserved.</p>
</footer>

View File

@@ -1,17 +1,17 @@
<header class="main-header top">
<nav class="main-nav">
<ul class="nav-list">
<li class="nav-item nav-logo"><a href="/">Derek L. Seitz</a></li>
<li class="nav-item nav-about"><a href="/about/">About</a></li>
<li class="nav-item nav-demos"><a href="/demos/">Demos</a></li>
<li class="nav-item nav-contact"><a href="/about/#contact">Contact</a></li>
<li class="nav-item nav-blog"><a href="https://campfire.dlseitz.dev" target="_blank" rel="noopener noreferrer"
>Blog</a></li>
<li class="nav-item nav-repos"><a href="https://gitea.dlseitz.dev" target="_blank" rel="noopener noreferrer"
>My Repos</a></li>
</ul>
</nav>
<header class="main-header top">
<nav class="main-nav">
<ul class="nav-list">
<li class="nav-item nav-logo"><a href="/">Derek L. Seitz</a></li>
<li class="nav-item nav-about"><a href="/about/">About</a></li>
<li class="nav-item nav-demos"><a href="/demos/">Demos</a></li>
<li class="nav-item nav-contact"><a href="/about/#contact">Contact</a></li>
<li class="nav-item nav-blog"><a href="https://campfire.dlseitz.dev" target="_blank" rel="noopener noreferrer"
>Blog</a></li>
<li class="nav-item nav-repos"><a href="https://gitea.dlseitz.dev" target="_blank" rel="noopener noreferrer"
>My Repos</a></li>
</ul>
</nav>
</header>

View File

@@ -6,4 +6,23 @@ stylesheet: /styles/demos.css
isLandingPage: false
---
<h1>Demos Coming Soon!</h1>
<h1>A Preview of What's Comming!</h1>
{% for demo in demos.DEMOS %}
<div class="{{ demo.id }}-demo-card">
<div class="{{ demo.id }}-demo module">
<h2 class="demo-title">{{ demo.title }}</h2>
<img class="demo-image" src="/images/_demo-thumbs/{{ demo.imageFile }}" alt="{{ demo.altText }}">
<p class="demo-description">{{ demo.description}}</p>
<h3>Business Problem</h3>
<p class="demo-problem">{{ demo.problemStatement }}</p>
<h3>Solution</h3>
<p class="demo-solution">{{ demo.solutionSummary }}</p>
{% if demo.isLive === false %}
<p class="coming-soon">Check back soon for full access to this demo!</p>
{% else %}
<a href="{{ demo.demoUrl }}" class="demo-link" target="_blank" rel="noopener noreferrer">Access the live demo here!</a>
{% endif %}
<a href="{{ demo.repoUrl }}" class="demo-repo" target="_blank" rel="noopener noreferrer">View Demo's Source Code</a>
</div>
</div>
{% endfor %}

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

View File

@@ -16,4 +16,96 @@ h1, h2 {
text-align: center;
margin-top: 200px;
font-size: 2.5rem;
margin-top: 50px;
}
.demo-card {
box-shadow: var(--shadow-small);
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.demo-card:hover {
transform: translateY(-5px);
box-shadow: var(--shadow-medium);
}
.demo-title {
margin-top: 0;
font-size: 2rem;
color: var(--primary-color);
margin-bottom: var(--margin-small);
}
.demo-image {
width: 70%;
height: auto;
border-radius: 8px;
box-shadow: var(--shadow-small);
margin-bottom: var(--margin-medium);
}
.demo-description,
.demo-problem,
.demo-solution,
.coming-soon {
line-height: 1.6;
margin-bottom: var(--margin-small);
font-size: 1.25rem;
text-align: center;
}
.demo-problem,
.demo-solution {
font-weight: 500;
}
h3 {
font-weight: bold;
color: var(--primary-color);
font-size: 2rem;
}
.coming-soon {
font-weight: bold;
color: var(--secondary-color);
text-align: center;
font-style: italic;
margin-top: 10px;
}
.demo-link,
.demo-repo {
display: inline-block;
padding: 8px 25px;
margin: 20px 10px;
background-color: var(--secondary-color);
color: var(--light-bg-color);
text-decoration: none;
font-weight: 600;
border-radius: 50px;
transition: background-color 0.3s ease, box-shadow 0.3s ease;
}
.demo-link:hover,
.demo-repo:hover {
background-color: var(--primary-color);
box-shadow: 0 4px 8px rgba(46, 151, 190, 0.2);
}
/* Responsive tweaks */
@media (max-width: 768px) {
h1 {
font-size: 2rem;
}
.demo-card {
padding: var(--padding-medium);
}
.demo-link,
.demo-repo {
display: block;
margin: 10px auto;
width: fit-content;
}
}

View File

@@ -56,9 +56,9 @@
}
.nav-logo a:hover {
color: var(--secondary-color); /* This will now be applied */
background-color: transparent; /* Override the background change */
box-shadow: none; /* Remove the shadow */
color: var(--secondary-color);
background-color: transparent;
box-shadow: none;
}
/*? ↓  Start Footer ↓ */