chore(clean): dedup CV/index CSS, drop dead directives (tour F1-F8)

CV: shared block for xp/project/edu headers + date chips + roles + tags,
2 identical inline style attrs -> .inline-link class, no-op body margin/
padding removed, stray blank collapsed. Proven behavior-preserving: PDF
text-hash + per-page render-hash + full byte-identity vs committed PDF.
index: .stack-note/.theme-list code grouped, 2 no-op .formation overrides
removed. nginx.conf: dead 'deny all' after return 404 removed (nginx -t +
dotfile-404 oracle PASS). .dockerignore: phantom nginx.conf.bak entry.
Snippet comment: CV style attrs no longer exist. CSP hash unchanged.
This commit is contained in:
Bastien Chanot
2026-07-05 22:52:39 +02:00
parent 1aa97f0af0
commit 613bfc0d49
5 changed files with 45 additions and 99 deletions
-1
View File
@@ -11,7 +11,6 @@ docker-compose.yml
.dockerignore
.env
.env.example
nginx.conf.bak
# Editor / OS noise
*.swp
+41 -82
View File
@@ -40,8 +40,6 @@
background: var(--page);
font-family: var(--sans);
-webkit-font-smoothing: antialiased;
margin: 0;
padding: 0;
}
.page {
@@ -174,15 +172,46 @@
background: var(--rule);
}
/* ── XP ── */
.xp-block { margin-bottom: 6px; }
.xp-header {
/* ── SHARED (xp/project/edu headers, date chips, roles, tags, links) ── */
.xp-header, .project-header, .edu-header {
display: flex;
justify-content: space-between;
align-items: baseline;
margin-bottom: 1px;
}
.xp-header, .project-header { margin-bottom: 1px; }
.xp-dates, .project-dates, .edu-dates {
font-family: var(--mono);
color: var(--ink-3);
background: var(--tag);
padding: 1px 6px;
border-radius: 2px;
}
.xp-role, .edu-degree {
font-size: 10pt;
font-weight: 500;
color: var(--g700);
margin-bottom: 3px;
}
.lang-item, .interest-tag {
font-family: var(--mono);
font-size: 8.5pt;
color: var(--g900);
background: var(--g100);
padding: 2px 8px;
border-radius: 10px;
}
.inline-link {
color: var(--g500);
text-decoration: none;
border-bottom: 1px solid var(--g300);
}
/* ── XP ── */
.xp-block { margin-bottom: 6px; }
.xp-company {
font-family: var(--mono);
@@ -191,22 +220,7 @@
color: var(--ink-1);
}
.xp-dates {
font-family: var(--mono);
font-size: 8.5pt;
color: var(--ink-3);
white-space: nowrap;
background: var(--tag);
padding: 1px 6px;
border-radius: 2px;
}
.xp-role {
font-size: 10pt;
font-weight: 500;
color: var(--g700);
margin-bottom: 3px;
}
.xp-dates { font-size: 8.5pt; white-space: nowrap; }
.xp-loc {
font-size: 7.5pt;
@@ -259,13 +273,6 @@
/* ── PROJECTS ── */
.project-block { margin-bottom: 5px; }
.project-header {
display: flex;
justify-content: space-between;
align-items: baseline;
margin-bottom: 1px;
}
.project-name {
font-family: var(--mono);
font-size: 10.5pt;
@@ -280,15 +287,7 @@
font-style: italic;
}
.project-dates {
font-family: var(--mono);
font-size: 8pt;
color: var(--ink-3);
white-space: nowrap;
background: var(--tag);
padding: 1px 6px;
border-radius: 2px;
}
.project-dates { font-size: 8pt; white-space: nowrap; }
.project-desc {
font-size: 10pt;
@@ -328,12 +327,6 @@
/* ── EDU ── */
.edu-block { margin-bottom: 5px; }
.edu-header {
display: flex;
justify-content: space-between;
align-items: baseline;
}
.edu-school {
font-family: var(--mono);
font-size: 11.5pt;
@@ -341,21 +334,7 @@
color: var(--ink-1);
}
.edu-dates {
font-family: var(--mono);
font-size: 7.2pt;
color: var(--ink-3);
background: var(--tag);
padding: 1px 6px;
border-radius: 2px;
}
.edu-degree {
font-size: 10pt;
font-weight: 500;
color: var(--g700);
margin-bottom: 3px;
}
.edu-dates { font-size: 7.2pt; }
.edu-detail {
font-size: 10pt;
@@ -373,15 +352,6 @@
.lang-row { display: flex; gap: 4px; flex-wrap: wrap; }
.lang-item {
font-family: var(--mono);
font-size: 8.5pt;
color: var(--g900);
background: var(--g100);
padding: 2px 8px;
border-radius: 10px;
}
.lang-item .level {
color: var(--ink-3);
font-size: 7.5pt;
@@ -389,15 +359,6 @@
.interests { display: flex; flex-wrap: wrap; gap: 4px; }
.interest-tag {
font-family: var(--mono);
font-size: 8.5pt;
color: var(--g900);
background: var(--g100);
padding: 2px 8px;
border-radius: 10px;
}
/* ── FOOTER ── */
.footer-bar {
background: var(--dark);
@@ -427,7 +388,6 @@
background:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6'%3E%3Ccircle cx='1' cy='1' r='0.6' fill='rgba(27,94,59,0.05)'/%3E%3C/svg%3E"),
linear-gradient(160deg, var(--page) 0%, var(--tag) 55%, var(--page) 100%);
padding: 0;
}
.page { background: transparent; }
.cv-header { padding: 18px 14mm 14px; }
@@ -488,7 +448,6 @@
</head>
<body>
<div class="page">
<div class="cv-header">
@@ -525,7 +484,7 @@
<span class="xp-company">ZenQuality</span>
<span class="xp-dates">Apr 2026 - present</span>
</div>
<div class="xp-role">Développeur indépendant <span class="xp-loc">· Yerres · <a href="https://zenquality.fr" style="color:var(--g500);text-decoration:none;border-bottom:1px solid var(--g300);">zenquality.fr</a></span></div>
<div class="xp-role">Développeur indépendant <span class="xp-loc">· Yerres · <a href="https://zenquality.fr" class="inline-link">zenquality.fr</a></span></div>
<ul class="bullets">
<li>Mission SEO et conformité légale RGPD pour PME service (Île-de-France) — audit technique Core Web Vitals + Schema.org + NAP, refonte CGV B2B/B2C, RGPD, mentions légales, mise en conformité médiateur CM2C. Plan d'action 12 sprints.</li>
<li>Site vitrine WordPress (<span class="tag">Gutenverse</span>) pour PME esthétique — conception, intégration, déploiement et support continu (hébergement client).</li>
@@ -582,7 +541,7 @@
<div class="project-desc">
Configuration Claude Code, dotfiles, projets bas-niveau (42, expérimentations C/Rust) — accessibles publiquement. Mirror automatique vers GitHub via push hook.
</div>
<div class="project-link"><a href="https://git.bchanot.fr/bchanot" style="color:var(--g500);text-decoration:none;border-bottom:1px solid var(--g300);">git.bchanot.fr/bchanot</a></div>
<div class="project-link"><a href="https://git.bchanot.fr/bchanot" class="inline-link">git.bchanot.fr/bchanot</a></div>
</div>
<div class="project-block">
+3 -14
View File
@@ -502,16 +502,16 @@
gap: 8px;
flex-wrap: wrap;
}
.stack-note code {
.stack-note code, .theme-list code {
font-family: var(--mono);
font-size: 12px;
font-weight: 500;
color: var(--g700);
background: var(--g050);
border: 1px solid var(--g100);
padding: 2px 8px;
border-radius: var(--r-sm);
}
.stack-note code { padding: 2px 8px; }
@media (min-width: 768px) { .stack-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1200px) { .stack-grid { grid-template-columns: repeat(3, 1fr); } }
@@ -697,8 +697,6 @@
/* ── FORMATION ── */
.formation { background: var(--g050); }
.formation .timeline { border-left-color: var(--g100); }
.formation .timeline-item::before { box-shadow: 0 0 0 4px var(--g050); }
.formation-school-desc {
font-family: var(--serif);
@@ -758,16 +756,7 @@
line-height: 1.55;
color: var(--ink-2);
}
.theme-list code {
font-family: var(--mono);
font-size: 12px;
font-weight: 500;
color: var(--g700);
background: var(--g050);
border: 1px solid var(--g100);
padding: 1px 7px;
border-radius: var(--r-sm);
}
.theme-list code { padding: 1px 7px; }
.formation-tsrit-list {
list-style: none;
+1 -1
View File
@@ -8,7 +8,7 @@ add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()" always;
# CSP: inline CSS allowed (style attributes in the CV + single-file convention);
# CSP: inline CSS allowed (single-file convention: inline <style> element);
# the inline script is HASH-pinned (no script unsafe-inline). INVARIANT: after
# ANY edit to index.html's inline <script>, recompute the hash (command in
# CLAUDE.md) and update it here — a stale hash silently disables the JS.
-1
View File
@@ -64,7 +64,6 @@ server {
# Block access to dotfiles (defense-in-depth — none are shipped anyway).
location ~ /\. {
deny all;
return 404;
}