Compare commits

...

14 commits

24 changed files with 132 additions and 46 deletions

5
_config/shortcodes.js Normal file
View file

@ -0,0 +1,5 @@
import link from "./shortcodes/link.js"
export default function (eleventyConfig, pluginOptions) {
eleventyConfig.addPairedShortcode("link", link);
}

View file

@ -0,0 +1,3 @@
export default (content, url, target = "_blank", attr = "") => {
return `<a href="${url}" target="${target}" ${attr} class="button">${content}</a>`
}

View file

@ -2,6 +2,7 @@ import { inspect } from "util";
import pluginIcons from 'eleventy-plugin-icons'; import pluginIcons from 'eleventy-plugin-icons';
import pluginPDF from "./_config/eleventy-plugin-pdf.js"; import pluginPDF from "./_config/eleventy-plugin-pdf.js";
import pluginTokens from "./_config/eleventy-plugin-tokens.js"; import pluginTokens from "./_config/eleventy-plugin-tokens.js";
import shortcodes from "./_config/shortcodes.js";
export default async function (eleventyConfig) { export default async function (eleventyConfig) {
eleventyConfig.setUseGitIgnore(false); eleventyConfig.setUseGitIgnore(false);
@ -29,6 +30,7 @@ export default async function (eleventyConfig) {
eleventyConfig.addPassthroughCopy('src/favicon.ico') eleventyConfig.addPassthroughCopy('src/favicon.ico')
eleventyConfig.addPlugin(shortcodes);
eleventyConfig.addPlugin(pluginTokens, { tokens: "./src/_data/tokens.json", destination: "./src/css/theme.css" }); eleventyConfig.addPlugin(pluginTokens, { tokens: "./src/_data/tokens.json", destination: "./src/css/theme.css" });
eleventyConfig.addPlugin(pluginPDF); eleventyConfig.addPlugin(pluginPDF);
eleventyConfig.addPlugin(pluginIcons, { eleventyConfig.addPlugin(pluginIcons, {

View file

@ -9,10 +9,13 @@
"skills": [ "skills": [
"HTML", "HTML",
"CSS", "CSS",
"Bootstrap",
"Javascript", "Javascript",
"Accessibilité",
"Bootstrap",
"Figma",
"jQuery", "jQuery",
"Figma" "SCSS",
"Git"
], ],
"lang": [ "lang": [
"Français (langue maternelle)", "Français (langue maternelle)",

View file

@ -3,7 +3,24 @@
<h1 class="hero-title">{% if section.data.displayedTitle %}{{ section.data.displayedTitle }}{% else %}{{ section.data.title }}{% endif %}</h1> <h1 class="hero-title">{% if section.data.displayedTitle %}{{ section.data.displayedTitle }}{% else %}{{ section.data.title }}{% endif %}</h1>
<p>{{section.data.description}}</p> <p>{{section.data.description}}</p>
{{ section.templateContent }} {{ section.templateContent }}
{% render 'partials/components/socials', socials: author.socials, mail: author.mail, showLabel: true %} <ul class="list-inline socials-list socials-list--label">
{% if author.socials %}
{% for social in author.socials %}
<li>
{% link social.link, "_blank", "data-ghost-button" %}{% icon social.icon %} {{ social.title }}{% endlink %}
</li>
{% endfor %}
{% endif %}
{% if author.mail %}
<li>
{% capture href %}mailto:{{ author.mail }}{% endcapture %}
{% link href, "_blank", "data-ghost-button" %}{% icon "mail" %} Me contacter{% endlink %}
</li>
{% endif %}
<li>
{% link "/resume.pdf", "_blank", "data-ghost-button" %}{% icon "download" %} Télécharger en PDF{% endlink %}
</li>
</ul>
</div> </div>
</section> </section>

View file

@ -4,13 +4,18 @@
<span></span> <span></span>
<div class="links"> <div class="links">
{%- for link in links -%} {%- for link in links -%}
{% render 'partials/components/link', icon: link.icon, showLabel: false, label: link.title, href: link.link, class: classes, target: "_blank" %} {% link link.link, "_blank", "data-ghost-button" %}{% icon link.icon %} <span class="sr-only">{{ social.title }}</span>{% endlink %}
{%- endfor -%} {%- endfor -%}
</div> </div>
</div> </div>
<div class="content"> <div class="content">
<h3>{{ title }}</h3> <h3>{{ title }}</h3>
<p>{{ description }}</p> <p>{{ description }}</p>
<ul class="list-inline">
{% for tag in tags %}
<li><span class="badge">{{ tag }}</span></li>
{% endfor %}
</ul>
</div> </div>
</article> </article>
</li> </li>

View file

@ -6,7 +6,8 @@
background: data.background, background: data.background,
links: data.links, links: data.links,
title: data.title, title: data.title,
description: data.description %} description: data.description,
tags: data.tags %}
{%- endfor -%} {%- endfor -%}
</ul> </ul>
{% endif %} {% endif %}

View file

@ -2,13 +2,13 @@
{% if socials %} {% if socials %}
{% for social in socials %} {% for social in socials %}
<li> <li>
{% render 'partials/components/link', icon: social.icon, showLabel: showLabel, label: social.title, href: social.link, class: "button", attr: "data-ghost-button", target: "_blank" %} {% link social.link, "_blank", "data-ghost-button" %}{% icon social.icon %} <span class="sr-only">{{social.title}}</span>{% endlink %}
</li> </li>
{% endfor %} {% endfor %}
{% if mail %} {% if mail %}
<li> <li>
{% capture href %}mailto:{{ mail }}{% endcapture %} {% capture href %}mailto:{{ mail }}{% endcapture %}
{% render 'partials/components/link', icon: "mail", showLabel: showLabel, label: "Contactez moi par mail", href: href, class: "button", attr: "data-ghost-button", target: "_blank" %} {% link href, "_blank", "data-ghost-button" %}{% icon "mail" %} <span class="sr-only">Me contacter</span>{% endlink %}
</li> </li>
{% endif %} {% endif %}
{% endif %} {% endif %}

View file

@ -76,5 +76,8 @@
--button-bg: transparent; --button-bg: transparent;
--button-border-color: transparent; --button-border-color: transparent;
--button-color: currentColor; --button-color: currentColor;
--button-hover-bg: transparent;
--button-hover-bg: color-mix(in srgb, var(--color-neutral-500) 35%, transparent 65%);
--button-hover-color: currentColor;
--button-padding: .2em .4em; --button-padding: .2em .4em;
} }

View file

@ -1,12 +1,23 @@
.competences-section .col { .skills-gallery {
width: 100%; display: grid;
margin-bottom: 2rem; gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
} }
@media screen and (min-width: 991px) { .skill {
.competences-section > div { font-size: 2rem;
flex-direction: row; font-size: clamp(2rem, 1.2967rem + 2.1978vw, 3rem);
font-weight: 500;
text-align: center;
}
@media screen and (min-width: 768px) {
.skill {
text-align: left;
} }
.competences-section .col { }
width: 40%;
@media screen and (min-width: 991px) {
.skills-gallery {
row-gap: 3.5rem;
} }
} }

View file

@ -1,14 +1,17 @@
.project-grid { .project-grid {
grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
gap: 1rem; gap: 1rem;
display: grid; display: grid;
} }
.project-grid li { .project-grid > li {
border-radius: var(--border-radius); border-radius: var(--border-radius);
overflow: hidden; overflow: hidden;
} }
.project-grid .button {
--button-padding: .2em;
}
.card { .card {
--background: url(https://placehold.co/200x150); --background: linear-gradient(45deg, var(--color-neutral-100) 30%, var(--color-neutral-300) 100%);
z-index: 1; z-index: 1;
background: var(--background); background: var(--background);
background-repeat: no-repeat; background-repeat: no-repeat;
@ -45,4 +48,7 @@
} }
.card .content { .card .content {
padding: 1rem 0.4rem 0; padding: 1rem 0.4rem 0;
}
.card .list-inline {
gap: 0.5ch;
} }

View file

@ -8,6 +8,7 @@
.timeline:before { .timeline:before {
content: ""; content: "";
background-color: var(--color-neutral-200); background-color: var(--color-neutral-200);
background: linear-gradient(180deg, var(--color-neutral-200) 0%, var(--color-neutral-200) 85%, transparent 100%);
inline-size: 6px; inline-size: 6px;
margin-inline-start: -3px; margin-inline-start: -3px;
position: absolute; position: absolute;
@ -31,7 +32,7 @@
aspect-ratio: 1; aspect-ratio: 1;
inline-size: var(--size); inline-size: var(--size);
background-color: var(--color-neutral-200); background-color: var(--color-neutral-200);
border: 6px solid var(--color-primary-400); border: 6px solid var(--color-primary-600);
z-index: 1; z-index: 1;
border-radius: 50%; border-radius: 50%;
transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out;
@ -41,5 +42,5 @@
transform: translateY(50%); transform: translateY(50%);
} }
.timeline li:hover:before { .timeline li:hover:before {
border-color: var(--color-primary-700); border-color: var(--color-secondary-600);
} }

View file

@ -16,4 +16,7 @@ footer .socials-list {
--item-gap: 0.2ch; --item-gap: 0.2ch;
--item-separator: ""; --item-separator: "";
margin: 0; margin: 0;
}
footer .button.button {
--button-padding: .2em;
} }

View file

@ -5,6 +5,10 @@ header {
inset-block-start: 0; inset-block-start: 0;
inset-inline: 0; inset-inline: 0;
} }
header.scroll {
box-shadow: hsla(0 0% 0% / 0.1) 0 0.5rem 1rem;
transition-duration: 400ms;
}
header nav ul { header nav ul {
flex-wrap: wrap; flex-wrap: wrap;
justify-content: flex-end; justify-content: flex-end;

View file

@ -104,4 +104,16 @@ main li {
section { section {
margin-block: 3.5rem; margin-block: 3.5rem;
padding-block: 2rem; padding-block: 2rem;
}
.badge {
display: inline-flex;
justify-content: center;
line-height: 1;
padding: .2em .3em;
font-size: .75em;
border-radius: .4em;
color: var(--badge-color, var(--color-secondary-600));
background: color-mix(in srgb, var(--badge-color, var(--color-secondary-600)) 40%, white 100%);
border: 1px solid color-mix(in srgb, var(--badge-color, var(--color-secondary-600)) 90%, white 100%);
} }

View file

@ -1,11 +1,24 @@
// Javascript is active // Javascript is active
document.documentElement.classList.add('js'); document.documentElement.classList.add('js');
// Add class when scrolling in the page
const header = document.getElementById("site-header");
const intercept = document.createElement("div");
intercept.setAttribute("data-observer-intercept", "");
header.before(intercept);
const observer = new IntersectionObserver(([entry]) => {
header.classList.toggle("scroll", !entry.isIntersecting);
});
observer.observe(intercept);
// Update navigation according to page scroll // Update navigation according to page scroll
const options = { const options = {
rootMargin: '0px 0px -60% 0px' rootMargin: '0px 0px -60% 0px'
}; };
const observer = new IntersectionObserver(entries => { const sectionObserver = new IntersectionObserver(entries => {
entries.forEach(entry => { entries.forEach(entry => {
const id = entry.target.getAttribute("id"); const id = entry.target.getAttribute("id");
if (entry.isIntersecting) { if (entry.isIntersecting) {
@ -21,7 +34,7 @@ const observer = new IntersectionObserver(entries => {
},options); },options);
document.querySelectorAll('section').forEach(function(section, i) { document.querySelectorAll('section').forEach(function(section, i) {
observer.observe(section); sectionObserver.observe(section);
}); });
// Random accent font & color // Random accent font & color

View file

@ -2,15 +2,12 @@
title: Compétences title: Compétences
displayedTitle: Mes compétences displayedTitle: Mes compétences
order: 1 order: 1
classes: 'competences-section langues-section' showTitle: false
--- ---
<div class="flex justify-center">
<div class="col"> <ul class="skills-gallery">
{% render "partials/components/list", title: "Compétences techniques", content: author.skills %} {% for skill in author.skills %}
</div> <li class="skill">{{skill}}</li>
{% endfor %}
<div class="col"> </ul>
{% render "partials/components/list", title: "Langues", content: author.lang %}
</div>
</div>

View file

@ -1,12 +0,0 @@
---
title: Téléchargement
showTitle: false
excludeFromPdf: true
order: 4
---
<div class="flex justify-center items-center download">
<p>Vous souhaitez imprimer ce document ?</p>
<i>--></i>
<button type="button" onclick="window.print()" class="button">Télécharger en PDF {% icon "download" %}</button>
</div>

View file

@ -1,6 +1,6 @@
--- ---
layout: pdf layout: pdf
permalink: "pdf.pdf" permalink: "resume.pdf"
eleventyComputed: eleventyComputed:
title: "{{author.firstName}} {{author.name}}, {{author.occupation}}" title: "{{author.firstName}} {{author.name}}, {{author.occupation}}"
links: links:

View file

@ -5,6 +5,9 @@ links:
- title: Voir sur Github - title: Voir sur Github
link: https://github.com link: https://github.com
icon: simple-icons:github icon: simple-icons:github
tags:
- C#
- Unity
--- ---
* desc1 * desc1

View file

@ -5,4 +5,6 @@ links:
- title: Voir sur Github - title: Voir sur Github
link: https://github.com link: https://github.com
icon: simple-icons:github icon: simple-icons:github
tags:
- Python
--- ---

View file

@ -8,4 +8,7 @@ links:
- title: Voir sur Github - title: Voir sur Github
link: https://github.com link: https://github.com
icon: simple-icons:github icon: simple-icons:github
tags:
- PHP
- LDAP
--- ---

View file

@ -8,4 +8,7 @@ links:
- title: Voir sur Github - title: Voir sur Github
link: https://github.com link: https://github.com
icon: simple-icons:github icon: simple-icons:github
tags:
- JS
- IOT
--- ---

View file

@ -1,9 +1,10 @@
--- ---
title: Snake title: Snake
description: Un snake réalisé en Java description: Un snake réalisé en Java
background: rgb(255, 143, 143)
links: links:
- title: Voir sur Github - title: Voir sur Github
link: https://github.com link: https://github.com
icon: simple-icons:github icon: simple-icons:github
tags:
- Java
--- ---