Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .eleventy.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,31 @@ module.exports = function (eleventyConfig) {
return collection.getAll().filter((item) => item.data.type);
});

// Ordered sequence of portfolio case studies. Set `portfolioOrder` in a page's
// front matter to include it; Previous/Next buttons are generated from this order.
eleventyConfig.addCollection("portfolioSequence", function (collection) {
return collection
.getAll()
.filter((item) => item.data.portfolioOrder !== undefined)
.sort((a, b) => a.data.portfolioOrder - b.data.portfolioOrder);
});

// Cards for portfolio listing pages, built from each page's `card` front matter.
eleventyConfig.addFilter("cardList", function (sequence, group, featuredOnly) {
return sequence.filter(
(item) =>
item.data.card &&
(!group || item.data.card.group === group) &&
(!featuredOnly || item.data.card.featured)
);
});

eleventyConfig.addFilter("caseStudyNeighbors", function (sequence, url) {
const i = sequence.findIndex((item) => item.url === url);
if (i === -1) return null;
return { prev: sequence[i - 1] || null, next: sequence[i + 1] || null };
});

eleventyConfig.addPlugin(emojiReadTime);

eleventyConfig.addWatchTarget("src/sass/*.scss");
Expand Down
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v25.9.0
v26.8.1
4 changes: 2 additions & 2 deletions social/template.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
<title>Adam Jolicoeur</title>
<meta
name="description"
content="Product Designer who ships code—and understands the business side."
content="Product designer building AI-native products, from interaction patterns to the systems that govern them."
/>
<meta name="generator" content="Eleventy">
<meta property="og:title" content="Adam J. Jolicoeur" />
<meta property="og:url" content="" />
<meta property="og:description" content="Product Designer who ships code—and understands the business side.">
<meta property="og:description" content="Product designer building AI-native products, from interaction patterns to the systems that govern them.">
<meta property="og:site_name" content="Adam J. Jolicoeur">
<meta property="og:type" content="website">
<link rel="apple-touch-icon" sizes="180x180" href="/icon-180.png">
Expand Down
6 changes: 3 additions & 3 deletions src/404.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
<title>Adam Jolicoeur</title>
<meta
name="description"
content="Product Designer who ships code—and understands the business side."
content="Product designer building AI-native products, from interaction patterns to the systems that govern them."
/>
<meta name="generator" content="Eleventy">
<meta property="og:title" content="Adam J. Jolicoeur" />
<meta property="og:url" content="" />
<meta property="og:description" content="Product Designer who ships code—and understands the business side.">
<meta property="og:description" content="Product designer building AI-native products, from interaction patterns to the systems that govern them.">
<meta property="og:site_name" content="Adam J. Jolicoeur">
<meta property="og:type" content="website">
<link rel="apple-touch-icon" sizes="180x180" href="/icon-180.png">
Expand All @@ -34,7 +34,7 @@
/>
<meta
name="og:description"
content="Product Designer who ships code—and understands the business side."
content="Product designer building AI-native products, from interaction patterns to the systems that govern them."
/>
<meta property="og:image" content="https://www.adamjolicoeur.com/assets/img/social_template.webp" />

Expand Down
8 changes: 4 additions & 4 deletions src/_data/meta.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@ module.exports = {
env: process.env.ELEVENTY_ENV,
url: process.env.URL || "http://localhost:8080",
siteName: "Adam Jolicoeur",
siteDescription: "Product Designer who ships code—and understands the business side.",
siteDescription: "Product designer building AI-native products, from interaction patterns to the systems that govern them.",
siteURL: "https://www.adamjolicoeur.com",
authorName: "Adam J. Jolicoeur",
siteMeta:"Adam, Adam Jolicoeur, Adam J. Jolicoeur, AdamJ, Jolicoeur, adamjolicoeur.com, www.adamjolicoeur.com, mindreeper2420, Portfolio, Design, Product Designer, UXD, UX Designer, UX Developer, UX Engineer, Design Technologist, Product Mangement, CSS",
packageVersion: "packageVersion",
blueskyUsername: "adamjol.bsky.social",
blueskyTitle: "Adam Jolicoeur - Product Designer Who Ships Code",
blueskyDescription: "Product Designer who ships code—and understands the business side.",
blueskyTitle: "Adam Jolicoeur: Product Designer for Enterprise Systems and AI",
blueskyDescription: "Product designer building AI-native products, from interaction patterns to the systems that govern them.",
githubURL: "https://github.com/AdamJ",
githubUsername: "AdamJ",
githubDescription: "Follow my work in the open source community.",
linkedinURL: "https://www.linkedin.com/in/ajjolicoeur/",
linkedinDescription: "Product Designer | Design Systems Expert | AWS & Red Hat Alum | I design enterprise apps and code prototypes (HTML/CSS/React)",
linkedinDescription: "Product Designer | Design Systems | AI-Native Products | AWS & Red Hat Alum | 15+ years designing complex enterprise software",
devtoURL: "https://dev.to/adamj",
mastodonUsername: "@adamjol@mastodon.world",
codepenURL: "https://codepen.io/AdamJolicoeur",
Expand Down
14 changes: 14 additions & 0 deletions src/_data/redirects.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Old case study URLs that moved under /portfolio/.
// Each entry generates a static redirect page (meta refresh plus canonical link).
const moved = {
designs: ["alm", "component-library", "customer-engagement", "dashboard-analytics", "task-it"],
development: ["archparser", "timetracker"],
"case-studies": ["soccertracker", "color-picker"]
};

module.exports = Object.entries(moved).flatMap(([dir, slugs]) =>
slugs.map((slug) => ({
from: `/${dir}/${slug}/`,
to: `/portfolio/${slug}/`
}))
);
50 changes: 50 additions & 0 deletions src/_includes/blank.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{%- set pageTitle %}{% if title %}{{ title }} | {% endif %}{{ meta.siteName }}{% endset -%}
{%- set pageDescription %}{% if description %}{{ description }}{% else %}{{ meta.siteDescription }}{% endif %}{% endset -%}
{%- set pageSocialImg %}{{ meta.url }}/previews/{% if title %}{{ title | slug }}{% else %}home{% endif %}.png{% endset -%}
<meta name="keywords" content="@{{ meta.siteMeta }}" />
<title>{{pageTitle}}</title>
<meta
name="description"
content="{{pageDescription}}"
/>
<meta name="generator" content="Eleventy">
<meta property="og:title" content="Adam J. Jolicoeur" />
<meta property="og:url" content="{{siteURL}}" />
<meta property="og:description" content="{{pageDescription}}">
<meta property="og:site_name" content="Adam J. Jolicoeur">
<meta property="og:type" content="website">
<link rel="apple-touch-icon" sizes="180x180" href="{{ '/icon-180.png' | url }}">
<link rel="icon" type="image/png" size="16x16" href="{{ '/icon-16.png' | url }}">
<link rel="icon" type="image/png" size="32x32" href="{{ '/icon-32.png' | url }}">
<link rel="icon" type="image/png" size="192x192" href="{{ '/icon-192.png' | url }}">
<link rel="icon" type="image/png" size="512x512" href="{{ '/icon-512.png' | url }}">
<link rel="manifest" href="{{ '/manifest.json' | url }}">
<meta
name="og:title"
content="{{pageTitle}}"
/>
<meta
name="og:description"
content="{{pageDescription}}"
/>
<meta property="og:image" content="https://www.adamjolicoeur.com/assets/img/social_template.webp" />

<link
rel="alternate"
type="application/rss+xml"
title="RSS Feed for {{ meta.siteName }}"
href="/feed/"
/>
<script src="https://kit.fontawesome.com/0ea2a7621c.js" crossorigin="anonymous"></script>
</head>
<body>
<main id="main-content">
{{ content | safe }}
</main>
</body>
</html>
16 changes: 16 additions & 0 deletions src/_includes/case-study-nav.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{%- set neighbors = collections.portfolioSequence | caseStudyNeighbors(page.url) -%}
{%- if neighbors -%}
<section class="case-study-nav">
<div aria-label="Case study navigation" class="row justify-content-center">
{%- if neighbors.prev %}
<a href="{{ neighbors.prev.url | url }}" class="btn btn-outline btn-sm" aria-label="Previous case study: {{ neighbors.prev.data.title }}">
<i class="fas fa-arrow-left"></i> Previous Case Study</a>
{%- endif %}
{%- if neighbors.next %}
<a href="{{ neighbors.next.url | url }}" class="btn btn-outline btn-sm ms-auto" aria-label="Next case study: {{ neighbors.next.data.title }}">Next Case Study <i class="fas fa-arrow-right"></i></a>
{%- else %}
<a href="{{ '/portfolio/' | url }}" class="btn btn-outline btn-sm ms-auto"><i class="fas fa-refresh"></i> All Case Studies</a>
{%- endif %}
</div>
</section>
{%- endif -%}
3 changes: 3 additions & 0 deletions src/_includes/markdown.njk
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ layout: base.njk
{{ content | safe }}
</content>
{% endif %}

{% include "case-study-nav.njk" %}

2 changes: 2 additions & 0 deletions src/_includes/page.njk
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ layout: base.njk
{{ content | safe }}
</content>

{% include "case-study-nav.njk" %}

{% if customCss %}
<link type="text/css" href="/css/{{ customCss | url }}" rel="stylesheet" />
{% endif %}
18 changes: 18 additions & 0 deletions src/_includes/work-cards.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{%- for item in cardItems -%}
{%- set c = item.data.card -%}
{%- if loop.first %}<div class="work-grid">{% endif %}
<article class="card-image">
{%- if c.image %}
<img src="{{ c.image | url }}" alt="{{ c.imageAlt }}" class="image-top" />
{%- endif %}
<div class="card-body">
<h3 class="two-line-header">{{ c.title }}</h3>
<p>{{ c.summary | safe }}</p>
{%- if c.badges %}
<div class="badges mb-2">{% for b in c.badges %}<span class="badge">{{ b }}</span>{% endfor %}</div>
{%- endif %}
<a href="{{ item.url | url }}" class="btn {{ btnClass or 'btn-primary' }}" aria-label="View {{ c.title }} case study">View Case Study</a>
</div>
</article>
{%- if loop.last %}</div>{% endif %}
{% endfor -%}
Binary file modified src/assets/AdamJolicoeur-Resume.pdf
Binary file not shown.
2 changes: 1 addition & 1 deletion src/feed.njk
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ eleventyExcludeFromCollections: true
"eleventyExcludeFromCollections": true,
"metadata": {
"title": "Adam J. Jolicoeur",
"description": "I'm a Product Designer who ships code—and understands the business side. For 15 years, I've designed enterprise applications at Amazon Web Services, Red Hat, and high-growth B2B companies—turning complex, data-intensive workflows into intuitive interfaces that scale.",
"description": "I'm a product designer building AI-native products. For 15 years, I've designed enterprise applications at Amazon Web Services, Red Hat, and high-growth B2B companies, turning complex, data-intensive workflows into intuitive interfaces that scale.",
"language": "en",
"url": "https://www.adamjolicoeur.com/",
"author": {
Expand Down
Loading
Loading