From 17cf2c83809f1cd0af475170403558fcaaa306a2 Mon Sep 17 00:00:00 2001 From: Yasser Boulayoune Date: Thu, 8 Oct 2026 16:26:00 +0200 Subject: [PATCH] =?UTF-8?q?Mode=20clair=20/=20sombre=20et=20th=C3=A8mes=20?= =?UTF-8?q?de=20saison?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/css/effects.css | 132 +++ assets/css/seasons.css | 375 ++++++++ assets/css/style.css | 804 +++++++++++++++++ assets/fonts/Archivo-100-900-latin-ext.woff2 | Bin 0 -> 86240 bytes assets/fonts/Archivo-100-900-latin.woff2 | Bin 0 -> 90104 bytes .../fonts/JetBrainsMono-400-latin-ext.woff2 | Bin 0 -> 11624 bytes assets/fonts/JetBrainsMono-400-latin.woff2 | Bin 0 -> 31432 bytes assets/fonts/fonts.css | 75 ++ assets/js/about.js | 57 ++ assets/js/competences.js | 193 +++++ assets/js/cursor.js | 106 +++ assets/js/effects.js | 258 ++++++ assets/js/orb.js | 322 +++++++ assets/js/seasons.js | 813 ++++++++++++++++++ functions.php | 291 +++++++ index.php | 25 + page-contact.php | 90 ++ page.php | 13 + style.css | 9 + 19 files changed, 3563 insertions(+) create mode 100644 assets/css/effects.css create mode 100644 assets/css/seasons.css create mode 100644 assets/css/style.css create mode 100644 assets/fonts/Archivo-100-900-latin-ext.woff2 create mode 100644 assets/fonts/Archivo-100-900-latin.woff2 create mode 100644 assets/fonts/JetBrainsMono-400-latin-ext.woff2 create mode 100644 assets/fonts/JetBrainsMono-400-latin.woff2 create mode 100644 assets/fonts/fonts.css create mode 100644 assets/js/about.js create mode 100644 assets/js/competences.js create mode 100644 assets/js/cursor.js create mode 100644 assets/js/effects.js create mode 100644 assets/js/orb.js create mode 100644 assets/js/seasons.js create mode 100644 functions.php create mode 100644 index.php create mode 100644 page-contact.php create mode 100644 page.php create mode 100644 style.css diff --git a/assets/css/effects.css b/assets/css/effects.css new file mode 100644 index 0000000..dcb565b --- /dev/null +++ b/assets/css/effects.css @@ -0,0 +1,132 @@ +/* effects.css : thème yb2026 (base : handoff/theme-assets/effects.css, design v3) */ +:root { + --bg:#0a0a0a; --card:#101010; --ph:#141414; --ink:#f5f5f0; --lime:#d3fd50; + --bg-rgb:10,10,10; --ink-rgb:245,245,240; --lime-rgb:211,253,80; + --blend-ink:#f5f5f0; /* titre en mix-blend-mode: difference */ + --gut:44px; color-scheme:dark; +} +/* Mode clair : papier, encre presque noire, accent chartreuse profond (contraste 5:1) */ +html[data-theme="light"] { + --bg:#f3f2ed; --card:#ffffff; --ph:#e7e6e0; --ink:#111111; --lime:#4a7300; + --bg-rgb:243,242,237; --ink-rgb:17,17,17; --lime-rgb:74,115,0; + --blend-ink:#ffffff; --cursor-blend:normal; color-scheme:light; +} +@media (max-width:1024px) { :root { --gut:30px; } } +@media (max-width:720px) { :root { --gut:20px; } } +::selection { background:var(--lime); color:var(--bg); } +.has-custom-cursor, .has-custom-cursor * { cursor:none !important; } +body.no-scroll { overflow:hidden; } +html { background-color:var(--bg); } + +/* Grain filmique */ +body::after { content:''; position:fixed; inset:0; z-index:96; pointer-events:none; opacity:.05; + background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23n)'/%3E%3C/svg%3E"); } + +/* Barre de progression + nav */ +/* Barre dessinée en ombre interne (pas en fond) : Safari iOS teinte ses barres avec le fond des éléments fixés en haut */ +.scroll-progress { position:fixed; top:0; left:0; right:0; height:2px; z-index:60; box-shadow:inset 0 2px 0 var(--lime); transform:scaleX(0); transform-origin:left; pointer-events:none; } +.site-nav { position:fixed; top:0; left:0; right:0; z-index:50; transition:transform .5s cubic-bezier(.2,.8,.2,1); + background:rgba(var(--bg-rgb), .55); backdrop-filter:blur(14px); border-bottom:1px solid rgba(var(--ink-rgb), .07); } + +/* Rail */ +.section-rail [data-rail-target] { color:rgba(var(--ink-rgb), .35); transition:color .3s; } +.section-rail [data-rail-target]::after { content:''; display:inline-block; width:5px; height:5px; margin-left:9px; border-radius:50%; background:rgba(var(--ink-rgb), .25); transition:background .3s, box-shadow .3s; } +.section-rail .is-active { color:var(--lime); } +.section-rail .is-active::after { background:var(--lime); box-shadow:0 0 10px rgba(var(--lime-rgb), .8); } + +/* Reveals */ +[data-reveal] { opacity:0; transform:translateY(48px); transition:opacity .9s cubic-bezier(.2,.7,.2,1), transform .9s cubic-bezier(.2,.7,.2,1); } +[data-reveal].is-in { opacity:1; transform:none; } + +/* Hero : titre révélé ligne par ligne (chaque ligne dans un wrapper overflow:hidden) */ +@keyframes yb-line-up { from { transform:translateY(115%); } to { transform:none; } } +.line-mask { overflow:hidden; } +.line-mask > * { animation:yb-line-up 1.05s cubic-bezier(.2,.8,.2,1) backwards; } +.line-mask:nth-child(2) > * { animation-delay:.14s; } +.line-mask:nth-child(3) > * { animation-delay:.28s; } +@keyframes yb-arrow { 0%,100% { transform:none; } 50% { transform:translateX(9px); } } +.scroll-hint__arrow { display:inline-block; animation:yb-arrow 1.6s ease-in-out infinite; } + +/* Wipe */ +/* Rideau masqué (visibility) au repos : sinon Safari iOS garde sa couleur pour ses barres haut et bas */ +.yb-wipe { position:fixed; inset:0; z-index:9990; background:var(--lime); display:flex; align-items:center; justify-content:center; + transform:translateY(100%); visibility:hidden; transition:transform .45s cubic-bezier(.7,0,.3,1), visibility 0s .45s; pointer-events:none; } +.yb-wipe.is-covering { transform:none; visibility:visible; transition:transform .45s cubic-bezier(.7,0,.3,1), visibility 0s; } +html.is-entering .yb-wipe { transform:none; visibility:visible; transition:none; } +html:not(.is-entering) .yb-wipe:not(.is-covering) { transform:translateY(-100%); visibility:hidden; transition:transform .55s cubic-bezier(.7,0,.3,1), visibility 0s .55s; } +.yb-wipe__label { font:700 16px 'JetBrains Mono',monospace; color:var(--bg); letter-spacing:.3em; } + +/* Marquee */ +@keyframes yb-mq { to { transform:translateX(-50%); } } +.marquee { overflow:hidden; } +.marquee-track { display:flex; width:max-content; white-space:nowrap; animation:yb-mq 16s linear infinite; } +.marquee-track--reverse { animation-direction:reverse; } + +/* Divers */ +@keyframes yb-spin { to { transform:rotate(360deg); } } +.spin-circle { width:52px; height:52px; border:1px dashed var(--lime); border-radius:50%; animation:yb-spin 12s linear infinite; } +@keyframes yb-pulse { 50% { opacity:.35; } } +.pulse-dot { width:7px; height:7px; border-radius:50%; background:var(--lime); animation:yb-pulse 2s infinite; } +.card-img img { filter:grayscale(.35) contrast(1.05); transition:filter .4s, transform .5s; } +.card:hover .card-img img { filter:none; transform:scale(1.04); } +.outline-lime { color:transparent; -webkit-text-stroke:2px var(--lime); } + +/* Menu mobile */ +[data-menu] { position:fixed; inset:0; z-index:48; background:rgba(var(--bg-rgb), .96); backdrop-filter:blur(18px); + display:flex; flex-direction:column; justify-content:center; padding:90px 24px 40px; opacity:0; visibility:hidden; transition:opacity .3s, visibility .3s; } +[data-menu].is-open { opacity:1; visibility:visible; } +[data-menu-toggle] { display:none; } + +/* ---------- Responsive ---------- */ +@media (max-width:1100px) { + .site-nav__links { display:none; } + [data-menu-toggle] { display:flex; white-space:nowrap; } + .hero__vertical-label, .hero__aside { display:none; } +} +@media (max-width:720px) { + .section-rail { display:none; } + .hero__title { font-size:min(16.5vw,145px); } + .hero__content { left:var(--gut); right:var(--gut); bottom:84px; } + /* Travaux : plus de section sticky, piste en scroll-snap natif = fluide au doigt */ + #travaux { height:auto !important; } + #travaux .works-sticky { position:static; height:auto; padding:110px 0 60px; } + .works-track { overflow-x:auto; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; width:auto !important; gap:20px; padding:0 var(--gut); scrollbar-width:none; } + .works-track::-webkit-scrollbar { display:none; } + .works-track .card { width:84vw; scroll-snap-align:center; } + .works-track .card-img { height:52vw; } + .grid-auto { grid-template-columns:1fr !important; } + .article__meta { position:static; width:100%; } +} +@media (pointer:coarse) { .card-img img { filter:none; } } +/* Animations inconditionnelles (choix de Yasser : son système active « réduire les animations » + et il veut voir le site animé). Seul ?ybstatic=1 → html.yb-static fige tout, pour les captures. */ +html.yb-static *, html.yb-static *::before, html.yb-static *::after { animation:none !important; transition:none !important; } +html.yb-static [data-reveal] { opacity:1; transform:none; } +html.yb-static .yb-wipe { display:none; } + +/* Curseur custom (cursor.js) : point accent qui s'étire en index, puis la main apparaît autour du doigt */ +.yb-cursor { position:fixed; left:0; top:0; z-index:9999; pointer-events:none; } +.yb-cursor__dot { position:absolute; left:0; top:0; width:12px; height:12px; margin:-6px 0 0 -6px; border-radius:6px; background:var(--lime); + mix-blend-mode:var(--cursor-blend,difference); + transition:width .22s cubic-bezier(.2,.8,.2,1), height .22s cubic-bezier(.2,.8,.2,1), margin .22s cubic-bezier(.2,.8,.2,1), border-radius .22s, opacity .18s .1s; } +.yb-cursor__hand { position:absolute; left:-12.5px; top:-2px; width:34px; height:38px; opacity:0; + transform-origin:12.5px 2px; transform:scale(.3) rotate(10deg); + filter:drop-shadow(0 3px 6px rgba(0,0,0,.35)); + transition:opacity .16s, transform .3s cubic-bezier(.2,.8,.2,1); } +.yb-cursor__hand svg { display:block; overflow:visible; } +.yb-cursor.is-hand .yb-cursor__dot { width:7px; height:17px; margin:-1px 0 0 -3.5px; border-radius:3.5px; opacity:0; } +.yb-cursor.is-hand .yb-cursor__hand { opacity:1; transform:scale(1) rotate(-8deg); transition:opacity .18s .08s, transform .34s .04s cubic-bezier(.3,1.4,.5,1); } +.yb-cursor__label { position:absolute; left:16px; top:-11px; font:700 11px 'JetBrains Mono',monospace; color:var(--bg); background:var(--lime); + padding:4px 9px; border-radius:3px; white-space:nowrap; opacity:0; transform:scale(.6); transform-origin:left center; transition:opacity .18s, transform .18s, left .25s; } +.yb-cursor.is-hand .yb-cursor__label { left:30px; } +.yb-hand-spark { transform-box:fill-box; transform-origin:center; animation:yb-spark 1.2s ease-in-out infinite; } +@keyframes yb-spark { 50% { transform:scale(.4) rotate(45deg); opacity:.5; } } + +/* Roue des projets et articles : le point s'ouvre en loupe, centre de la lentille sur la souris */ +.yb-cursor__loupe { position:absolute; left:-14px; top:-14px; width:34px; height:34px; opacity:0; + transform-origin:14px 14px; transform:scale(.35) rotate(-40deg); filter:drop-shadow(0 3px 6px rgba(0,0,0,.35)); + transition:opacity .16s, transform .3s cubic-bezier(.2,.8,.2,1); } +.yb-cursor__loupe svg { display:block; overflow:visible; } +.yb-cursor.is-loupe .yb-cursor__dot { width:20px; height:20px; margin:-10px 0 0 -10px; border-radius:10px; opacity:0; } +.yb-cursor.is-loupe .yb-cursor__loupe { opacity:1; transform:none; transition:opacity .18s .06s, transform .36s .03s cubic-bezier(.3,1.4,.5,1); } +.yb-cursor.is-loupe .yb-cursor__label { left:32px; } diff --git a/assets/css/seasons.css b/assets/css/seasons.css new file mode 100644 index 0000000..c4250f0 --- /dev/null +++ b/assets/css/seasons.css @@ -0,0 +1,375 @@ +/* seasons.css : thèmes saisonniers (html[data-season="halloween" | "noel"]). + Chargé seulement pendant une saison (inc/seasons.php). Le décor animé vient de seasons.js. */ + +/* ══ Palettes ════════════════════════════════════════════════════════ */ +/* Halloween sombre : nuit violacée, accent citrouille */ +html[data-season="halloween"]:not([data-theme="light"]) { + --bg:#0d0a10; --card:#140f18; --ph:#1b1520; --ink:#f4eee4; --lime:#ff7b1c; + --bg-rgb:13,10,16; --ink-rgb:244,238,228; --lime-rgb:255,123,28; --blend-ink:#f4eee4; + --season-2:#a77bff; --season-2-rgb:167,123,255; +} +/* Halloween clair : parchemin, encre aubergine, orange brûlé (contraste 5:1) */ +html[data-season="halloween"][data-theme="light"] { + --bg:#f3ece1; --card:#fffaf1; --ph:#e9e0d0; --ink:#1b1320; --lime:#ad4500; + --bg-rgb:243,236,225; --ink-rgb:27,19,32; --lime-rgb:173,69,0; + --season-2:#6b3fc4; --season-2-rgb:107,63,196; +} +/* Noël sombre : vert sapin profond, accent rouge */ +html[data-season="noel"]:not([data-theme="light"]) { + --bg:#07110d; --card:#0c1712; --ph:#111f19; --ink:#f3f1ea; --lime:#ff4a5a; + --bg-rgb:7,17,13; --ink-rgb:243,241,234; --lime-rgb:255,74,90; --blend-ink:#f3f1ea; + --season-2:#f2c14e; --season-2-rgb:242,193,78; +} +/* Noël clair : neige, encre sapin, rouge houx */ +html[data-season="noel"][data-theme="light"] { + --bg:#f5f2ec; --card:#ffffff; --ph:#e8e4dc; --ink:#10201a; --lime:#b0122a; + --bg-rgb:245,242,236; --ink-rgb:16,32,26; --lime-rgb:176,18,42; + --season-2:#9a6b00; --season-2-rgb:154,107,0; +} +/* Palettes des autres fêtes : [clé, sombre(bg card ph ink accent second), clair(...)] générées ci-dessous */ +html[data-season="nouvel-an"]:not([data-theme="light"]) { + --bg:#0a0a12; --card:#10101b; --ph:#161624; --ink:#f5f1e6; --lime:#f2c14e; + --bg-rgb:10,10,18; --ink-rgb:245,241,230; --lime-rgb:242,193,78; --blend-ink:#f5f1e6; + --season-2:#d9dde8; --season-2-rgb:217,221,232; +} +html[data-season="nouvel-an"][data-theme="light"] { + --bg:#f6f3ea; --card:#fffdf7; --ph:#e9e4d6; --ink:#16141c; --lime:#8a6400; + --bg-rgb:246,243,234; --ink-rgb:22,20,28; --lime-rgb:138,100,0; + --season-2:#55607a; --season-2-rgb:85,96,122; +} +html[data-season="st-patrick"]:not([data-theme="light"]) { + --bg:#06120b; --card:#0b1a11; --ph:#102318; --ink:#eef4ec; --lime:#3ddc84; + --bg-rgb:6,18,11; --ink-rgb:238,244,236; --lime-rgb:61,220,132; --blend-ink:#eef4ec; + --season-2:#f2c14e; --season-2-rgb:242,193,78; +} +html[data-season="st-patrick"][data-theme="light"] { + --bg:#f1f5ee; --card:#ffffff; --ph:#e1eadb; --ink:#0f2216; --lime:#13703a; + --bg-rgb:241,245,238; --ink-rgb:15,34,22; --lime-rgb:19,112,58; + --season-2:#8f6a00; --season-2-rgb:143,106,0; +} +html[data-season="paques"]:not([data-theme="light"]) { + --bg:#100d15; --card:#17131d; --ph:#1e1926; --ink:#f7f1ea; --lime:#ff9fcb; + --bg-rgb:16,13,21; --ink-rgb:247,241,234; --lime-rgb:255,159,203; --blend-ink:#f7f1ea; + --season-2:#8ee6c2; --season-2-rgb:142,230,194; +} +html[data-season="paques"][data-theme="light"] { + --bg:#fbf6ee; --card:#ffffff; --ph:#efe7da; --ink:#2a1f2e; --lime:#b02a72; + --bg-rgb:251,246,238; --ink-rgb:42,31,46; --lime-rgb:176,42,114; + --season-2:#23805a; --season-2-rgb:35,128,90; +} +html[data-season="poisson"]:not([data-theme="light"]) { + --bg:#07121a; --card:#0c1922; --ph:#11212c; --ink:#eef6f8; --lime:#4fd1ff; + --bg-rgb:7,18,26; --ink-rgb:238,246,248; --lime-rgb:79,209,255; --blend-ink:#eef6f8; + --season-2:#ffb347; --season-2-rgb:255,179,71; +} +html[data-season="poisson"][data-theme="light"] { + --bg:#f0f5f7; --card:#ffffff; --ph:#e0eaee; --ink:#0d2230; --lime:#006b94; + --bg-rgb:240,245,247; --ink-rgb:13,34,48; --lime-rgb:0,107,148; + --season-2:#b35c00; --season-2-rgb:179,92,0; +} +html[data-season="musique"]:not([data-theme="light"]) { + --bg:#0c0a14; --card:#13101d; --ph:#1a1626; --ink:#f4f1fa; --lime:#ff5cc8; + --bg-rgb:12,10,20; --ink-rgb:244,241,250; --lime-rgb:255,92,200; --blend-ink:#f4f1fa; + --season-2:#5ce1ff; --season-2-rgb:92,225,255; +} +html[data-season="musique"][data-theme="light"] { + --bg:#f6f3f8; --card:#ffffff; --ph:#e9e3ef; --ink:#1c1426; --lime:#a3127f; + --bg-rgb:246,243,248; --ink-rgb:28,20,38; --lime-rgb:163,18,127; + --season-2:#0a6f8a; --season-2-rgb:10,111,138; +} +html[data-season="juillet"]:not([data-theme="light"]) { + --bg:#070b16; --card:#0c1220; --ph:#111a2c; --ink:#f4f3ee; --lime:#ff4a5a; + --bg-rgb:7,11,22; --ink-rgb:244,243,238; --lime-rgb:255,74,90; --blend-ink:#f4f3ee; + --season-2:#5b8bff; --season-2-rgb:91,139,255; +} +html[data-season="juillet"][data-theme="light"] { + --bg:#f4f4f1; --card:#ffffff; --ph:#e5e6e2; --ink:#0e1630; --lime:#1f3fa8; + --bg-rgb:244,244,241; --ink-rgb:14,22,48; --lime-rgb:31,63,168; + --season-2:#c8102e; --season-2-rgb:200,16,46; +} +html[data-season="black-friday"]:not([data-theme="light"]) { + --bg:#050505; --card:#0d0d0d; --ph:#151515; --ink:#f5f5f0; --lime:#ffd400; + --bg-rgb:5,5,5; --ink-rgb:245,245,240; --lime-rgb:255,212,0; --blend-ink:#f5f5f0; + --season-2:#ffffff; --season-2-rgb:255,255,255; +} +html[data-season="black-friday"][data-theme="light"] { + --bg:#f4f3ee; --card:#ffffff; --ph:#e6e4dc; --ink:#0b0b0b; --lime:#8f6f00; + --bg-rgb:244,243,238; --ink-rgb:11,11,11; --lime-rgb:143,111,0; + --season-2:#111111; --season-2-rgb:17,17,17; +} +html[data-season="anniversaire"]:not([data-theme="light"]) { + --bg:#0b0d16; --card:#111422; --ph:#171b2c; --ink:#f3f4fa; --lime:#2ee6c5; + --bg-rgb:11,13,22; --ink-rgb:243,244,250; --lime-rgb:46,230,197; --blend-ink:#f3f4fa; + --season-2:#ffcf4a; --season-2-rgb:255,207,74; +} +html[data-season="anniversaire"][data-theme="light"] { + --bg:#f4f6f8; --card:#ffffff; --ph:#e3e8ec; --ink:#121827; --lime:#00806b; + --bg-rgb:244,246,248; --ink-rgb:18,24,39; --lime-rgb:0,128,107; + --season-2:#9a6b00; --season-2-rgb:154,107,0; +} +html[data-season="algerie"]:not([data-theme="light"]) { + --bg:#05100a; --card:#0a1810; --ph:#0f2016; --ink:#f3f5f1; --lime:#2fbf71; + --bg-rgb:5,16,10; --ink-rgb:243,245,241; --lime-rgb:47,191,113; --blend-ink:#f3f5f1; + --season-2:#e63946; --season-2-rgb:230,57,70; +} +html[data-season="algerie"][data-theme="light"] { + --bg:#f3f6f2; --card:#ffffff; --ph:#e2e9e1; --ink:#0c1f14; --lime:#006233; + --bg-rgb:243,246,242; --ink-rgb:12,31,20; --lime-rgb:0,98,51; + --season-2:#c8102e; --season-2-rgb:200,16,46; +} +html[data-season="japon"]:not([data-theme="light"]) { + --bg:#0e0a0b; --card:#161012; --ph:#1d1618; --ink:#f5efe8; --lime:#ff5a3c; + --bg-rgb:14,10,11; --ink-rgb:245,239,232; --lime-rgb:255,90,60; --blend-ink:#f5efe8; + --season-2:#ffb7c5; --season-2-rgb:255,183,197; +} +html[data-season="japon"][data-theme="light"] { + --bg:#f5f1e8; --card:#fffdf8; --ph:#ebe4d6; --ink:#1b1416; --lime:#b8321d; + --bg-rgb:245,241,232; --ink-rgb:27,20,22; --lime-rgb:184,50,29; + --season-2:#c4607a; --season-2-rgb:196,96,122; +} +html[data-season="hack"]:not([data-theme="light"]) { + --bg:#020604; --card:#06100a; --ph:#0a1810; --ink:#d8ffe4; --lime:#00ff66; + --bg-rgb:2,6,4; --ink-rgb:216,255,228; --lime-rgb:0,255,102; --blend-ink:#d8ffe4; + --season-2:#00e5ff; --season-2-rgb:0,229,255; +} +html[data-season="hack"][data-theme="light"] { + --bg:#eef3ef; --card:#ffffff; --ph:#dde8e0; --ink:#06180c; --lime:#007a33; + --bg-rgb:238,243,239; --ink-rgb:6,24,12; --lime-rgb:0,122,51; + --season-2:#00788a; --season-2-rgb:0,120,138; +} +/* Terminal et blocs de code (toujours sombres) : l'accent suit la saison */ +html[data-season="halloween"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#ff7b1c; --lime-rgb:255,123,28; } +html[data-season="noel"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#ff4a5a; --lime-rgb:255,74,90; } +html[data-season="nouvel-an"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#f2c14e; --lime-rgb:242,193,78; } +html[data-season="st-patrick"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#3ddc84; --lime-rgb:61,220,132; } +html[data-season="paques"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#ff9fcb; --lime-rgb:255,159,203; } +html[data-season="poisson"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#4fd1ff; --lime-rgb:79,209,255; } +html[data-season="musique"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#ff5cc8; --lime-rgb:255,92,200; } +html[data-season="juillet"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#ff4a5a; --lime-rgb:255,74,90; } +html[data-season="anniversaire"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#2ee6c5; --lime-rgb:46,230,197; } +html[data-season="algerie"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#2fbf71; --lime-rgb:47,191,113; } +html[data-season="japon"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#ff5a3c; --lime-rgb:255,90,60; } +html[data-season="hack"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#00ff66; --lime-rgb:0,255,102; } +html[data-season="black-friday"] :is(.term, .prose pre, .prose :not(pre) > code) { --lime:#ffd400; --lime-rgb:255,212,0; } + +/* ══ Bouton de la barre (citrouille / flocon) ═══════════════════════ */ +.season-toggle { + position: relative; width: 36px; height: 36px; flex: none; padding: 0; cursor: pointer; + border: 1px solid rgba(var(--lime-rgb), .55); border-radius: 50%; background: rgba(var(--lime-rgb), .08); color: var(--lime); + transition: border-color .25s, background .25s, color .25s, transform .4s cubic-bezier(.2,.8,.2,1); +} +.season-toggle:hover { transform: rotate(-12deg) scale(1.06); background: rgba(var(--lime-rgb), .16); } +.season-toggle svg { + position: absolute; inset: 0; margin: auto; width: 19px; height: 19px; + fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; +} +.season-toggle .st-face { fill: currentColor; stroke: none; } +html[data-season-off] .season-toggle { color: var(--mut50); border-color: rgba(var(--ink-rgb), .25); background: transparent; } +html[data-season-off] .season-toggle::after { + content: ''; position: absolute; left: 7px; right: 7px; top: 50%; height: 1.6px; background: currentColor; transform: rotate(-45deg); +} +html[data-season="halloween"] .season-toggle { animation: st-flicker 4s infinite; } +@keyframes st-flicker { 0%,100% { box-shadow: 0 0 0 rgba(var(--lime-rgb),0); } 48% { box-shadow: 0 0 14px rgba(var(--lime-rgb),.45); } 52% { box-shadow: 0 0 6px rgba(var(--lime-rgb),.2); } } + +/* ══ Calques communs ════════════════════════════════════════════════ */ +.season-fx { position: fixed; inset: 0; width: 100vw; height: 100vh; z-index: 45; pointer-events: none; } +html:not([data-season]) .season-deco { display: none !important; } + +/* Chapeau posé sur le logo YB©2026 */ +.site-nav__logo { position: relative; } +.season-hat { position: absolute; left: -9px; top: -19px; width: 30px; height: 26px; pointer-events: none; transform: rotate(-14deg); transform-origin: 50% 100%; } +.season-hat svg { width: 100%; height: 100%; overflow: visible; } +.site-nav__logo:hover .season-hat { animation: hat-tip .7s cubic-bezier(.2,.8,.2,1); } +@keyframes hat-tip { 40% { transform: rotate(-30deg) translateY(-6px); } } + +/* ══ Halloween ══════════════════════════════════════════════════════ */ +/* Brume au ras du sol */ +.season-fog { position: fixed; left: 0; right: 0; bottom: 0; height: 34vh; z-index: 44; pointer-events: none; overflow: hidden; + -webkit-mask-image: linear-gradient(to top, #000 10%, transparent); mask-image: linear-gradient(to top, #000 10%, transparent); } +.season-fog i { position: absolute; bottom: -12vh; left: -50%; width: 200%; height: 44vh; opacity: .16; + background: + radial-gradient(closest-side, rgba(var(--ink-rgb), .9), transparent) 0 60% / 34% 70% repeat-x, + radial-gradient(closest-side, rgba(var(--season-2-rgb), .8), transparent) 17% 100% / 26% 60% repeat-x; + filter: blur(18px); animation: fog-drift 46s linear infinite; } +.season-fog i + i { opacity: .1; bottom: -18vh; animation-duration: 70s; animation-direction: reverse; } +html[data-theme="light"] .season-fog i { opacity: .05; } +html[data-theme="light"] .season-fog i + i { opacity: .035; } +@keyframes fog-drift { to { transform: translateX(25%); } } + +/* Araignée suspendue : descend avec le scroll, remonte quand on l'approche */ +.season-spider { position: fixed; top: 0; right: 13vw; z-index: 46; width: 30px; pointer-events: none; + transform: translateY(calc(var(--drop, 90px) - 100%)); transition: transform 1.1s cubic-bezier(.3,1.5,.5,1); } +.season-spider.is-fleeing { transition-duration: .35s; transition-timing-function: cubic-bezier(.5,0,.8,.4); } +.season-spider__thread { display: block; width: 1px; height: 100vh; margin: 0 auto; background: linear-gradient(rgba(var(--ink-rgb), 0), rgba(var(--ink-rgb), .45)); } +.season-spider svg { display: block; width: 30px; height: 30px; margin-top: -2px; pointer-events: auto; cursor: pointer; animation: spider-sway 3.2s ease-in-out infinite; transform-origin: 50% -40px; } +@keyframes spider-sway { 50% { transform: rotate(7deg); } } +@media (max-width: 720px) { .season-spider { right: 22vw; } } + +/* Toile dans le coin du pied de page */ +.season-web { position: absolute; left: 0; top: 0; width: 150px; height: 150px; pointer-events: none; opacity: .35; } +.season-web--r { left: auto; right: 0; transform: scaleX(-1); width: 110px; height: 110px; } + +/* ══ Noël ═══════════════════════════════════════════════════════════ */ +/* Guirlande lumineuse sous la barre de navigation */ +.season-lights { position: absolute; left: 0; right: 0; top: 100%; height: 34px; pointer-events: none; } +.season-lights svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; } +.season-lights path { fill: none; stroke: rgba(var(--ink-rgb), .35); stroke-width: 1.2; } +.season-bulb { position: absolute; width: 8px; height: 12px; margin: -1px 0 0 -4px; border-radius: 45% 45% 50% 50% / 35% 35% 65% 65%; + background: var(--c); box-shadow: 0 0 12px 2px var(--c); transform: rotate(var(--r, 0deg)); transform-origin: 50% 0; + animation: bulb-blink 2.4s infinite; animation-delay: var(--d, 0s); } +.season-bulb::before { content: ''; position: absolute; left: 2px; top: -3px; width: 4px; height: 4px; border-radius: 1px; background: rgba(var(--ink-rgb), .55); } +@keyframes bulb-blink { 0%,100% { opacity: 1; } 50% { opacity: .25; box-shadow: 0 0 2px 0 var(--c); } } + +/* Neige accumulée sur le pied de page (mode sombre seulement : invisible sur fond clair) */ +html[data-season="noel"]:not([data-theme="light"]) .site-footer::before { + content: ''; position: absolute; left: 0; right: 0; top: -9px; height: 12px; pointer-events: none; + background: radial-gradient(14px 9px at 14px 100%, #f3f1ea 98%, transparent) 0 0 / 28px 12px repeat-x, + radial-gradient(22px 7px at 40px 100%, #f3f1ea 98%, transparent) 0 0 / 73px 12px repeat-x; + opacity: .9; filter: drop-shadow(0 -2px 6px rgba(255,255,255,.15)); +} + +/* ══ Autres fêtes ═══════════════════════════════════════════════════ */ +/* Bandeau discret en bas d'écran (compte à rebours du Nouvel An, chasse aux œufs) */ +.season-pill { position: fixed; left: 50%; bottom: 22px; z-index: 47; transform: translateX(-50%); + font: 700 11.5px var(--mono); letter-spacing: .12em; text-transform: uppercase; white-space: nowrap; + color: var(--bg); background: var(--lime); padding: 8px 14px; border-radius: 99px; + box-shadow: 0 8px 30px rgba(var(--lime-rgb), .35); transition: transform .4s cubic-bezier(.2,.8,.2,1), opacity .4s; } +.season-pill.is-hidden { transform: translate(-50%, 140%); opacity: 0; } +.season-pill b { font-variant-numeric: tabular-nums; } + +/* Pâques : œufs cachés dans les pages */ +.season-egg { position: absolute; z-index: 30; width: 26px; height: 34px; padding: 0; border: 0; background: none; cursor: pointer; + transform: rotate(var(--r, 0deg)); transition: transform .3s cubic-bezier(.3,1.6,.5,1), opacity .4s; filter: drop-shadow(0 3px 6px rgba(0,0,0,.25)); } +.season-egg:hover { transform: rotate(var(--r, 0deg)) scale(1.25); } +.season-egg svg { width: 100%; height: 100%; display: block; } +.season-egg.is-found { transform: translateY(-60px) scale(.2) rotate(180deg); opacity: 0; pointer-events: none; } + +/* Poisson d'avril : poisson en papier collé au curseur et sur le premier titre */ +.season-fish { position: fixed; left: 0; top: 0; z-index: 9998; width: 54px; pointer-events: none; transform-origin: 0 50%; } +.season-fish--tape { position: absolute; z-index: 6; left: auto; top: auto; width: 70px; pointer-events: auto; cursor: pointer; transition: transform .5s cubic-bezier(.3,1.6,.5,1); } +.season-fish--tape:hover { transform: rotate(-24deg) scale(1.1) !important; } +.season-fish svg { width: 100%; display: block; filter: drop-shadow(0 4px 6px rgba(0,0,0,.25)); } + +/* Fête de la musique : égaliseur au ras du bas d'écran */ +.season-eq { position: fixed; left: 0; right: 0; bottom: 0; z-index: 44; height: 64px; display: flex; align-items: flex-end; gap: 3px; padding: 0 3px; pointer-events: none; opacity: .32; + -webkit-mask-image: linear-gradient(to top, #000, transparent); mask-image: linear-gradient(to top, #000, transparent); } +.season-eq i { flex: 1; height: 100%; background: linear-gradient(to top, var(--lime), var(--season-2)); transform-origin: bottom; transform: scaleY(.1); border-radius: 2px 2px 0 0; } + +/* Black Friday : ruban de chantier en travers du coin */ +.season-tape { position: fixed; z-index: 46; right: -120px; bottom: 70px; width: 520px; transform: rotate(-32deg); pointer-events: none; overflow: hidden; + background: repeating-linear-gradient(-45deg, #ffd400 0 18px, #0b0b0b 18px 36px); padding: 6px 0; box-shadow: 0 10px 30px rgba(0,0,0,.35); } +.season-tape span { display: flex; width: max-content; font: 800 13px var(--mono); letter-spacing: .14em; color: #0b0b0b; background: #ffd400; padding: 5px 0; animation: tape-run 18s linear infinite; } +.season-tape span em { font-style: normal; padding: 0 18px; } +@keyframes tape-run { to { transform: translateX(-50%); } } +@media (max-width: 720px) { .season-tape { width: 380px; right: -110px; bottom: 50px; } .season-tape span { font-size: 11px; } } + +/* Anniversaire : flamme de la bougie du logo */ +.season-flame { transform-box: fill-box; transform-origin: 50% 100%; animation: flame 0.9s ease-in-out infinite alternate; } +@keyframes flame { from { transform: scale(1, 1) rotate(-4deg); } to { transform: scale(.85, 1.15) rotate(4deg); } } + +/* Japon : frise de vagues seigaiha au ras du bas d'écran */ +.season-waves { position:fixed; left:0; right:0; bottom:0; height:70px; z-index:44; pointer-events:none; opacity:.16; + -webkit-mask-image:linear-gradient(to top, #000 20%, transparent); mask-image:linear-gradient(to top, #000 20%, transparent); + background: + radial-gradient(circle at 50% 100%, transparent 6px, var(--lime) 7px 8px, transparent 9px 12px, var(--lime) 13px 14px, transparent 15px 18px, var(--lime) 19px 20px, transparent 21px) 0 0 / 40px 20px repeat, + radial-gradient(circle at 50% 100%, transparent 6px, var(--lime) 7px 8px, transparent 9px 12px, var(--lime) 13px 14px, transparent 15px 18px, var(--lime) 19px 20px, transparent 21px) 20px 10px / 40px 20px repeat; + animation: waves-drift 18s linear infinite; } +html[data-theme="light"] .season-waves { opacity:.12; } +@keyframes waves-drift { to { background-position: 40px 0, 60px 10px; } } + +/* Hack : lignes de balayage d'écran CRT, curseur de terminal après le logo, glitch au clic */ +.season-scan { position:fixed; inset:0; z-index:46; pointer-events:none; opacity:.35; + background:repeating-linear-gradient(to bottom, rgba(0,0,0,0) 0 2px, rgba(0,0,0,.22) 2px 3px); } +.season-scan::after { content:''; position:absolute; left:0; right:0; height:22vh; top:-22vh; + background:linear-gradient(to bottom, transparent, rgba(var(--lime-rgb),.05), transparent); animation:scan-sweep 7s linear infinite; } +html[data-theme="light"] .season-scan { opacity:.18; } +@keyframes scan-sweep { to { transform:translateY(130vh); } } +.season-caret { display:inline-block; width:.55em; height:1em; margin-left:3px; vertical-align:-2px; background:var(--lime); animation:caret-blink 1s steps(1) infinite; } +@keyframes caret-blink { 50% { opacity:0; } } +html.season-glitch #yb-root, html.season-glitch .site-nav { animation:glitch-shift .28s steps(2) 1; } +@keyframes glitch-shift { + 0% { transform:translate(0); filter:none; } + 20% { transform:translate(-6px, 2px); filter:hue-rotate(90deg) saturate(2); clip-path:inset(12% 0 58% 0); } + 40% { transform:translate(5px, -2px); filter:hue-rotate(-60deg); clip-path:inset(46% 0 22% 0); } + 60% { transform:translate(-3px, 1px); clip-path:inset(70% 0 6% 0); } + 100% { transform:translate(0); filter:none; clip-path:none; } +} +html[data-season="hack"] .hero__title .line-mask > span { text-shadow:0 0 18px rgba(var(--lime-rgb),.25); } + +/* Hack : intrusion au premier passage de la session (fenêtre de terminal centrée, site flouté derrière) */ +.season-hack-intro { position:fixed; inset:0; z-index:9000; display:grid; place-items:center; padding:20px; cursor:pointer; + background:rgba(2,6,4,.55); backdrop-filter:blur(10px) saturate(.7); -webkit-backdrop-filter:blur(10px) saturate(.7); + animation:intro-in .45s ease both; transition:opacity .7s ease, backdrop-filter .7s ease, -webkit-backdrop-filter .7s ease; } +.season-hack-intro.is-out { opacity:0; backdrop-filter:blur(0); -webkit-backdrop-filter:blur(0); pointer-events:none; } +@keyframes intro-in { from { opacity:0; backdrop-filter:blur(0); -webkit-backdrop-filter:blur(0); } } +.season-term { position:relative; width:min(640px, 100%); background:#050b07; border:1px solid rgba(0,255,102,.28); border-radius:12px; overflow:hidden; + box-shadow:0 30px 80px rgba(0,0,0,.6), 0 0 0 1px rgba(0,0,0,.4), 0 0 60px rgba(0,255,102,.12); + animation:term-pop .5s .1s cubic-bezier(.2,.9,.25,1.2) both; transition:transform .6s cubic-bezier(.7,0,.3,1); } +.season-hack-intro.is-out .season-term { transform:scale(.92) translateY(10px); } +@keyframes term-pop { from { opacity:0; transform:scale(.9) translateY(14px); } } +.season-term__bar { display:flex; align-items:center; gap:7px; padding:11px 14px; background:#0b1610; border-bottom:1px solid rgba(0,255,102,.14); } +.season-term__bar i { width:11px; height:11px; border-radius:50%; background:#ff5f57; } +.season-term__bar i:nth-child(2) { background:#febc2e; } .season-term__bar i:nth-child(3) { background:#28c840; } +.season-term__bar span { flex:1; text-align:center; margin-right:40px; font:500 12px 'JetBrains Mono', monospace; color:rgba(216,255,228,.55); } +.season-term__body { margin:0; padding:18px 20px 22px; min-height:190px; font:500 14px/1.65 'JetBrains Mono', monospace; color:#d8ffe4; + white-space:pre-wrap; word-break:break-word; text-shadow:0 0 6px rgba(0,255,102,.25); + background:repeating-linear-gradient(to bottom, transparent 0 2px, rgba(0,0,0,.18) 2px 3px); } +.season-term__body .t-prompt { color:#00ff66; font-weight:700; } +.season-term__body .t-path { color:#00e5ff; } +.season-term__body .t-dim { color:rgba(216,255,228,.5); } +.season-term__body .t-ok { color:#00ff66; } +.season-term__body .t-bar { color:#00ff66; } +.season-term__body .season-caret { background:#00ff66; } +.season-term__granted { position:absolute; inset:46px 0 0; display:grid; place-items:center; font:800 clamp(26px, 6vw, 46px) 'JetBrains Mono', monospace; letter-spacing:.12em; + color:#00ff66; text-shadow:0 0 18px rgba(0,255,102,.75), 0 0 46px rgba(0,255,102,.4); background:rgba(5,11,7,.88); + opacity:0; transform:scale(1.25); transition:opacity .3s, transform .45s cubic-bezier(.2,.9,.25,1.2); pointer-events:none; } +.season-hack-intro.is-granted .season-term__granted { opacity:1; transform:none; animation:granted-flicker .9s steps(1) 1; } +.season-hack-intro.is-granted .season-term { border-color:rgba(0,255,102,.7); box-shadow:0 30px 80px rgba(0,0,0,.6), 0 0 80px rgba(0,255,102,.35); } +@keyframes granted-flicker { 10% { opacity:.3; } 20% { opacity:1; } 30% { opacity:.6; } 40%, 100% { opacity:1; } } +@media (max-width:620px) { .season-term__body { font-size:12px; padding:14px 14px 18px; min-height:170px; } } + +/* ══ Roue de sélection ═══════════════════════════════════════════════ */ +.season-toggle--latent { display: none; } +html[data-sx] .season-toggle--latent { display: block; } +.season-wheel { --rad: min(250px, 36vw, 36vh); --it: 70px; position: fixed; inset: 0; z-index: 95; display: grid; place-items: center; + background: rgba(var(--bg-rgb), 0); backdrop-filter: blur(0); transition: background .35s, backdrop-filter .35s; } +.season-wheel.is-open { background: rgba(var(--bg-rgb), .72); backdrop-filter: blur(10px); } +.season-wheel__ring { position: relative; width: calc(var(--rad) * 2 + var(--it)); aspect-ratio: 1; border-radius: 50%; } +.season-wheel__ring::before { content: ''; position: absolute; inset: calc(var(--it) / 2); border-radius: 50%; border: 1px dashed rgba(var(--ink-rgb), .2); + transform: scale(.6); opacity: 0; transition: transform .5s cubic-bezier(.2,.8,.2,1), opacity .4s; } +.season-wheel.is-open .season-wheel__ring::before { transform: none; opacity: 1; } +.season-wheel__item { position: absolute; left: 50%; top: 50%; width: var(--it); height: var(--it); margin: calc(var(--it) / -2) 0 0 calc(var(--it) / -2); + display: grid; place-items: center; padding: 0; cursor: pointer; border-radius: 50%; color: var(--ink); + border: 1px solid rgba(var(--ink-rgb), .2); background: var(--card); + transform: translate(0, 0) scale(.3); opacity: 0; + transition: transform .5s cubic-bezier(.2,.8,.2,1) calc(var(--i) * 25ms), opacity .3s calc(var(--i) * 25ms), border-color .2s, background .2s, color .2s, box-shadow .2s; } +.season-wheel.is-open .season-wheel__item { transform: translate(calc(var(--x) * var(--rad)), calc(var(--y) * var(--rad))); opacity: 1; } +.season-wheel.is-open .season-wheel__item:is(:hover, :focus-visible) { transform: translate(calc(var(--x) * var(--rad)), calc(var(--y) * var(--rad))) scale(1.16); + border-color: var(--lime); color: var(--lime); box-shadow: 0 0 0 2px var(--lime), 0 0 30px rgba(var(--lime-rgb), .35); outline: none; transition-delay: 0s; } +.season-wheel__item.is-current { border-color: var(--lime); background: rgba(var(--lime-rgb), .14); color: var(--lime); } +.season-wheel__item svg { width: 28px; height: 28px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; } +.season-wheel__item svg .st-face { fill: currentColor; stroke: none; } +.season-wheel__item em { position: absolute; top: calc(100% + 6px); left: 50%; transform: translateX(-50%); white-space: nowrap; font: 600 9.5px var(--mono); font-style: normal; letter-spacing: .08em; text-transform: uppercase; color: var(--mut70); } +.season-wheel__hub { position: absolute; display: flex; flex-direction: column; align-items: center; gap: 6px; text-align: center; width: calc(var(--rad) * 1.2); pointer-events: none; + opacity: 0; transform: scale(.8); transition: opacity .35s .1s, transform .45s .1s cubic-bezier(.2,.8,.2,1); } +.season-wheel.is-open .season-wheel__hub { opacity: 1; transform: none; } +.season-wheel__hub small { font: 600 10px var(--mono); letter-spacing: .25em; color: var(--lime); } +.season-wheel__hub strong { font: 800 clamp(20px, 3.4vw, 34px)/1.05 var(--sans); letter-spacing: -.01em; color: var(--ink); } +.season-wheel__hub span { font: 500 11.5px var(--mono); color: var(--mut60); } +@media (max-width: 720px) { + .season-wheel { --rad: min(42vw, 170px); --it: 54px; } + .season-wheel__item svg { width: 22px; height: 22px; } + .season-wheel__item em { display: none; } +} + +/* ══ Accessibilité ══════════════════════════════════════════════════ */ +/* Pas de coupure « prefers-reduced-motion » : le portfolio reste animé (choix de l'utilisateur), seul ?ybstatic=1 fige tout. */ +@media print { .season-deco, .season-fx { display: none !important; } } + +/* Black Friday : le label du curseur devient une étiquette de prix (pointe + trou) */ +html[data-season="black-friday"] .yb-cursor__label { + color: #0b0b0b; font-weight: 800; padding: 5px 10px 5px 19px; border-radius: 0 3px 3px 0; + background: radial-gradient(circle at 10px 50%, transparent 2.3px, #ffd400 2.8px); + clip-path: polygon(8px 0, 100% 0, 100% 100%, 8px 100%, 0 50%); + filter: drop-shadow(0 3px 6px rgba(0,0,0,.35)); rotate: -6deg; +} diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..85f6ebe --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,804 @@ +/* +Theme Name: yb2026 +Theme URI: https://yasser.boulayoune.com +Author: Yasser Boulayoune +Description: Portfolio v3 « sombre & premium » : Archivo/JetBrains Mono, accent lime, orbe persistante, transitions wipe. Porté depuis le prototype Claude Design (handoff v3). Effets dans effects.css. +Version: 3.0 +Requires PHP: 8.0 +Text Domain: yb2026 +*/ + +/* ══ Tokens (design-spec.md ; --bg/--card/--ink/--lime/--gut viennent d'effects.css) ══ */ +:root { + --term: #0d0f0c; + --b1: rgba(var(--ink-rgb), .08); + --b2: rgba(var(--ink-rgb), .14); + --mut40: rgba(var(--ink-rgb), .4); + --mut45: rgba(var(--ink-rgb), .45); + --mut50: rgba(var(--ink-rgb), .5); + --mut60: rgba(var(--ink-rgb), .6); + --mut65: rgba(var(--ink-rgb), .65); + --mut70: rgba(var(--ink-rgb), .7); + --mut75: rgba(var(--ink-rgb), .75); + --sans: 'Archivo', sans-serif; + --mono: 'JetBrains Mono', monospace; + --ease: cubic-bezier(.2, .8, .2, 1); + --nav-h: 68px; + --admin: 0px; +} +body.admin-bar { --admin: 32px; } +/* Zones toujours sombres (terminal, blocs de code), quel que soit le thème : + on redéclare toute la palette, y compris les gris dérivés calculés sur :root */ +.term, .prose pre, .prose :not(pre) > code { + --bg: #0a0a0a; --card: #101010; --ph: #141414; --ink: #f5f5f0; --lime: #d3fd50; + --bg-rgb: 10,10,10; --ink-rgb: 245,245,240; --lime-rgb: 211,253,80; + --b1: rgba(245,245,240,.08); --b2: rgba(245,245,240,.14); + --mut40: rgba(245,245,240,.4); --mut45: rgba(245,245,240,.45); --mut50: rgba(245,245,240,.5); + --mut60: rgba(245,245,240,.6); --mut65: rgba(245,245,240,.65); --mut70: rgba(245,245,240,.7); --mut75: rgba(245,245,240,.75); + color: var(--ink); +} + +@media (max-width: 782px) { body.admin-bar { --admin: 46px; } } + +/* ══ Base ════════════════════════════════════════════════════════════ */ +* { box-sizing: border-box; } +html { scroll-behavior: auto; } +body { + margin: 0; + background: var(--bg); + color: var(--ink); + font: 400 16px/1.6 var(--sans); + overflow-x: clip; +} +a { color: var(--lime); text-decoration: none; } +a:hover { color: var(--ink); } +img { max-width: 100%; height: auto; } +h1, h2, h3 { margin: 0; font-weight: inherit; } +:focus-visible { outline: 2px solid var(--lime); outline-offset: 3px; } +.lime { color: var(--lime); } +.mono { font-family: var(--mono); } + +@keyframes riseIn { from { transform: translateY(50px); opacity: 0; } to { transform: none; opacity: 1; } } +@keyframes imgIn { from { transform: scale(1.12); } to { transform: none; } } +@keyframes barGrow { from { transform: scaleX(0); } to { transform: scaleX(1); } } +@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } +@keyframes lineUp { from { transform: translateY(115%); } to { transform: none; } } + +/* ══ Nav ═════════════════════════════════════════════════════════════ */ +.site-nav { + top: var(--admin); + display: flex; align-items: center; justify-content: space-between; gap: 20px; + padding: 20px var(--gut); +} +.site-nav__logo { font: 700 15px var(--mono); letter-spacing: .05em; color: var(--ink); white-space: nowrap; } +.site-nav__logo:hover { color: var(--ink); } +.site-nav__links { display: flex; gap: 30px; font: 500 12.5px var(--mono); } +.site-nav__links a { color: var(--mut75); transition: color .2s; } +.site-nav__links a:hover, .site-nav__links a.is-active { color: var(--lime); } +.site-nav__right { display: flex; align-items: center; gap: 12px; } +.site-nav__badge { + display: flex; align-items: center; gap: 8px; white-space: nowrap; + font: 500 11.5px var(--mono); color: var(--lime); + border: 1px solid rgba(var(--lime-rgb), .35); border-radius: 99px; padding: 6px 13px; +} +.site-nav__burger { + align-items: center; gap: 8px; background: none; cursor: pointer; + font: 700 12px var(--mono); color: var(--ink); + border: 1px solid rgba(var(--ink-rgb), .3); border-radius: 99px; padding: 8px 16px; +} +.scroll-progress { top: var(--admin); } + +/* Menu mobile plein écran */ +.mobile-menu { top: var(--admin); } +.mobile-menu__links { display: flex; flex-direction: column; gap: 8px; } +.mobile-menu__link { overflow: hidden; border-bottom: 1px solid var(--b1); padding-bottom: 8px; color: var(--ink); } +.mobile-menu__link:last-child { border-bottom: 0; } +.mobile-menu__link.is-active, .mobile-menu__link:hover { color: var(--lime); } +.mobile-menu__txt { + display: flex; justify-content: space-between; align-items: center; + font: 900 min(10vw, 58px) var(--sans); letter-spacing: -.03em; line-height: 1.05; +} +.mobile-menu__arrow { font: 700 20px var(--mono); color: var(--lime); } +.mobile-menu.is-open .mobile-menu__txt { animation: lineUp .55s var(--ease) backwards; animation-delay: calc(.04s + var(--i) * .06s); } +.mobile-menu__contact { margin-top: 44px; display: flex; flex-direction: column; gap: 12px; font: 500 13px var(--mono); } +.mobile-menu.is-open .mobile-menu__contact { animation: fadeIn .6s .4s ease-out backwards; } +.mobile-menu__loc { color: var(--mut45); } + +/* ══ Patterns partagés ═══════════════════════════════════════════════ */ +.kicker { font: 500 13px var(--mono); color: var(--lime); letter-spacing: .15em; margin-bottom: 16px; } +.page-wrap { padding: calc(150px + var(--admin)) var(--gut) 80px; min-height: 100vh; } +.page-wrap--narrow { max-width: 980px; } +.page-wrap--tight { padding-bottom: 0; min-height: 0; } +.page-title { font: 900 min(9vw, 120px) var(--sans); line-height: .88; letter-spacing: -.035em; margin-bottom: 60px; } +.page-title--small { font-size: min(7vw, 76px); } +.page-lead { max-width: 560px; font: 400 16px/1.6 var(--sans); color: var(--mut60); margin: -36px 0 56px; } +.page-foot-note { margin-top: 44px; font: 500 13px var(--mono); color: var(--mut45); } +.section-label { font: 700 14px var(--mono); color: var(--lime); letter-spacing: .12em; margin-bottom: 24px; } +.link-underline { font: 700 14px var(--mono); color: var(--lime); border-bottom: 1px solid var(--lime); padding-bottom: 4px; } +.note-l { border-left: 2px solid var(--lime); padding: 6px 0 6px 22px; font: 500 14px/1.6 var(--mono); color: var(--mut60); } +.pill-btn { + display: block; text-align: center; font: 700 13px var(--mono); color: var(--lime); + border: 1px solid rgba(var(--lime-rgb), .4); border-radius: 99px; padding: 12px 20px; transition: all .25s; +} +.pill-btn:hover { background: var(--lime); color: var(--bg); } + +/* ══ Accueil ═════════════════════════════════════════════════════════ */ +.orb-canvas { position: fixed; inset: 0; width: 100vw; height: 100vh; z-index: 0; pointer-events: none; animation: fadeIn 1.6s ease-out; } +.home #yb-root > section { position: relative; z-index: 1; } +/* À propos : pas de contexte d'empilement, sinon le titre en mix-blend-mode: difference + ne « voit » pas le fond de la page (titre blanc invisible en mode clair) */ +.home #yb-root > section#apropos { z-index: auto; } + +/* Rail vertical */ +.section-rail { + position: fixed; right: 20px; top: 50%; transform: translateY(-50%); z-index: 40; + display: flex; flex-direction: column; gap: 16px; align-items: flex-end; + font: 600 9.5px var(--mono); letter-spacing: .22em; +} +.section-rail a:hover { color: var(--ink); } + +/* Hero */ +.hero { height: 100vh; min-height: 640px; overflow: hidden; } +.hero__vertical-label { + position: absolute; left: var(--gut); top: 50%; transform: translateY(-50%); z-index: 5; + font: 500 11px var(--mono); color: var(--mut40); writing-mode: vertical-rl; letter-spacing: .3em; +} +.hero__content { position: absolute; left: var(--gut); bottom: 110px; z-index: 5; will-change: transform; } +.hero__kicker { font: 500 13px var(--mono); color: var(--lime); letter-spacing: .15em; margin-bottom: 16px; } +.hero__title { display: block; font: 900 min(10.5vw, 145px) var(--sans); line-height: .92; letter-spacing: -.035em; } +.hero__title .line-mask { display: block; } +.hero__title .line-mask > span { display: block; } +.hero__sub { font: 500 11px var(--mono); color: var(--mut45); letter-spacing: .28em; } +.hero__sub-mask { margin-top: 18px; } +/* Révélation ligne par ligne : kicker → YASSER → BOULAYOUNE → sous-titre */ +.hero__content .hero__kicker-mask > * { animation-duration: .9s; animation-delay: .15s; } +.hero__title .line-mask:nth-child(1) > * { animation-delay: .3s; } +.hero__title .line-mask:nth-child(2) > * { animation-delay: .44s; } +.hero__content .hero__sub-mask > * { animation-duration: .9s; animation-delay: .6s; } +.hero__aside { + position: absolute; right: var(--gut); bottom: 130px; z-index: 5; text-align: right; max-width: 250px; + animation: fadeIn 1.1s .75s ease-out backwards; +} +.hero__aside p { font: 400 14px/1.5 var(--sans); color: var(--mut60); margin: 0; } +.scroll-hint { + display: flex; align-items: center; justify-content: flex-end; gap: 10px; margin-top: 16px; + font: 500 11px var(--mono); color: var(--lime); letter-spacing: .2em; +} +.hero__marquee { + position: absolute; left: 0; right: 0; bottom: 0; z-index: 5; + border-top: 1px solid rgba(var(--ink-rgb), .12); background: rgba(var(--bg-rgb), .55); padding: 12px 0; + font: 800 26px var(--sans); letter-spacing: -.01em; +} +.marquee-track > span { padding-right: 24px; } + +/* Travaux (scroll horizontal) */ +.works { height: 560vh; } +.works-sticky { position: sticky; top: 0; height: 100vh; overflow: hidden; display: flex; flex-direction: column; justify-content: center; } +.works-head { + position: absolute; top: 100px; left: var(--gut); right: var(--gut); + display: flex; justify-content: space-between; align-items: baseline; gap: 20px; +} +.works-title { font: 900 min(7vw, 92px) var(--sans); line-height: 1; letter-spacing: -.03em; } +.works-sub { font: 500 10.5px var(--mono); color: var(--mut40); letter-spacing: .26em; margin-top: 10px; } +.works-meta { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; } +.works-hint { font: 500 12px var(--mono); color: var(--mut50); } +.works-count { font: 700 13px var(--mono); color: var(--lime); } +.works-track { display: flex; gap: var(--gut); padding: 0 var(--gut); width: max-content; will-change: transform; margin-top: 120px; } +.works-end { width: 520px; flex: none; display: flex; align-items: center; justify-content: center; } +.works-end span { + font: 900 64px var(--sans); line-height: 1; text-align: center; + color: transparent; -webkit-text-stroke: 1.5px rgba(var(--lime-rgb), .6); transition: -webkit-text-stroke-color .3s; +} +.works-end:hover span { -webkit-text-stroke-color: var(--lime); } + +/* Cartes projet */ +.card { + display: block; color: var(--ink); background: var(--card); + border: 1px solid var(--b2); border-radius: 12px; overflow: hidden; transition: border-color .3s; +} +.card:hover { border-color: var(--lime); color: var(--ink); } +.card--home { width: 620px; flex: none; } +.card-img { display: block; height: 230px; position: relative; overflow: hidden; background: var(--ph); } +.card--home .card-img { height: 340px; } +.card-img img { width: 100%; height: 100%; object-fit: cover; display: block; } +.card-num, .card-year { + position: absolute; top: 14px; padding: 4px 8px; border-radius: 4px; background: rgba(var(--bg-rgb), .7); +} +.card-num { left: 16px; font: 700 12px var(--mono); color: var(--lime); } +.card-year { right: 16px; font: 500 11px var(--mono); color: var(--mut75); } +.card--home .card-num, .card--home .card-year { top: 18px; } +.card--home .card-num { left: 20px; font-size: 13px; } +.card--home .card-year { right: 20px; } +.card-body { display: flex; flex-direction: column; gap: 9px; padding: 22px 24px 26px; } +.card--home .card-body { gap: 12px; padding: 26px 28px 30px; } +.card-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; } +.card-name { font: 800 22px var(--sans); letter-spacing: -.02em; } +.card--home .card-name { font-size: 30px; } +.card-arrow { font: 700 17px var(--mono); color: var(--lime); } +.card--home .card-arrow { font-size: 20px; } +.card-tag { font: 500 11.5px var(--mono); color: var(--lime); letter-spacing: .08em; } +.card--home .card-tag { font-size: 12px; } +.card-short { font: 400 13.5px/1.55 var(--sans); color: var(--mut60); } +.card--home .card-short { font-size: 14px; } + +/* À propos */ +.about { min-height: 100vh; overflow: hidden; display: flex; flex-direction: column; justify-content: center; padding: 120px 0; } +.about-blob { + position: absolute; left: 0; top: 0; width: 460px; height: 460px; margin: -230px 0 0 -230px; + border-radius: 50%; background: radial-gradient(circle, var(--lime) 0%, rgba(var(--lime-rgb), .35) 45%, transparent 70%); + pointer-events: none; filter: blur(8px); opacity: 0; +} +.about__title-wrap { position: relative; z-index: 2; mix-blend-mode: difference; padding: 0 var(--gut); } +.about__title { font: 900 min(12vw, 165px) var(--sans); line-height: .85; letter-spacing: -.04em; color: var(--blend-ink); } +.about__cols { position: relative; z-index: 2; display: flex; gap: 60px; padding: 70px var(--gut) 0; flex-wrap: wrap; } +.about__text { max-width: 480px; margin: 0; font: 400 17px/1.65 var(--sans); color: var(--mut70); } +.about__list { display: flex; flex-direction: column; gap: 14px; font: 500 13px var(--mono); color: var(--mut60); } +.about__more { position: relative; z-index: 2; padding: 60px var(--gut) 0; } + +/* Marquees compétences */ +.skills-mq { + padding: 40px 0; border-top: 1px solid rgba(var(--ink-rgb), .1); border-bottom: 1px solid rgba(var(--ink-rgb), .1); + overflow: hidden; display: flex; flex-direction: column; gap: 18px; +} +.skills-mq__track { animation-duration: 22s; font: 800 44px var(--sans); letter-spacing: -.02em; color: rgba(var(--ink-rgb), .9); } +.skills-mq__track > span { padding-right: 28px; } +.skills-mq__track--outline { color: transparent; -webkit-text-stroke: 1.2px rgba(var(--lime-rgb), .7); } + +/* CTA */ +.cta { min-height: 80vh; display: flex; flex-direction: column; justify-content: center; padding: 100px var(--gut) 60px; } +.cta .kicker, .contact .kicker { margin-bottom: 20px; } +.cta__title { display: block; font: 900 min(11vw, 150px) var(--sans); line-height: .88; letter-spacing: -.04em; color: var(--ink); } +.cta__title:hover { color: var(--ink); } +.cta__title:hover .outline-lime { -webkit-text-stroke-color: var(--ink); } + +/* ══ Qui suis-je ═════════════════════════════════════════════════════ */ +.qsn-grid { display: flex; gap: 60px; flex-wrap: wrap; align-items: flex-start; } +.qsn-side { flex: none; width: 340px; } +.qsn-card { border: 1px solid var(--b2); border-radius: 12px; overflow: hidden; background: var(--card); } +.qsn-card img { width: 100%; aspect-ratio: 1; object-fit: cover; display: block; filter: grayscale(.25); } +.qsn-fiche { padding: 20px 22px; display: flex; flex-direction: column; gap: 10px; font: 500 12.5px var(--mono); color: var(--mut70); } +.qsn-main { flex: 1; min-width: min(400px, 100%); display: flex; flex-direction: column; gap: 56px; } +.qsn-intro { max-width: 640px; margin: 0; font: 400 19px/1.65 var(--sans); color: var(--mut75); } +.skills { display: flex; flex-direction: column; gap: 18px; max-width: 640px; } +.skill { display: flex; flex-direction: column; gap: 7px; } +.skill__head { display: flex; justify-content: space-between; gap: 12px; font: 500 13px var(--mono); } +.skill__level { color: var(--mut45); } +.skill__bar { height: 4px; background: rgba(var(--ink-rgb), .1); border-radius: 2px; overflow: hidden; } +.skill__fill { height: 100%; background: var(--lime); border-radius: 2px; transform-origin: left; transform: scaleX(0); } +.skill__fill.is-in { animation: barGrow 1.1s var(--ease) forwards; } +html.yb-static .skill__fill { transform: none; } +.timeline { display: flex; flex-direction: column; max-width: 640px; } +.tl-item { display: flex; gap: 24px; padding: 22px 0; border-top: 1px solid rgba(var(--ink-rgb), .1); } +.tl-date { flex: none; width: 170px; font: 500 12px var(--mono); color: var(--lime); } +.tl-body { display: flex; flex-direction: column; gap: 5px; } +.tl-title { font: 700 18px var(--sans); } +.tl-place { font: 500 12px var(--mono); color: var(--mut50); } +.tl-desc { font: 400 14px/1.55 var(--sans); color: var(--mut65); } + +/* ══ Compétences ═════════════════════════════════════════════════════ */ +.svc-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr)); gap: 24px; margin-bottom: 80px; } +.svc-card { + border: 1px solid var(--b2); border-radius: 12px; background: var(--card); transition: border-color .3s; + padding: 36px 32px; display: flex; flex-direction: column; gap: 16px; +} +.svc-card:hover { border-color: var(--lime); } +.svc-num { font: 700 15px var(--mono); color: var(--lime); } +.svc-title { font: 800 26px var(--sans); letter-spacing: -.02em; } +.svc-desc { font: 400 15px/1.6 var(--sans); color: var(--mut65); } +.infra-title { font: 900 min(6vw, 72px) var(--sans); line-height: .9; letter-spacing: -.03em; margin-bottom: 20px; } +.infra-lead { max-width: 640px; font: 400 16px/1.6 var(--sans); color: var(--mut65); margin: 0 0 40px; } +.infra-cols { display: flex; gap: 24px; flex-wrap: wrap; align-items: flex-start; margin-bottom: 60px; } +.term { flex: 1; min-width: min(380px, 100%); border: 1px solid var(--b2); border-radius: 12px; background: var(--term); overflow: hidden; } +.term-bar { display: flex; align-items: center; gap: 8px; padding: 12px 18px; border-bottom: 1px solid rgba(var(--ink-rgb), .1); background: var(--card); } +.term-dot { width: 10px; height: 10px; border-radius: 50%; } +.term-dot--r { background: #ff5f57; } +.term-dot--y { background: #febc2e; } +.term-dot--g { background: #28c840; } +.term-title { font: 500 12px var(--mono); color: var(--mut50); margin-left: 8px; } +.term-body { padding: 20px 22px; display: flex; flex-direction: column; gap: 8px; font: 500 12.5px var(--mono); } +.term-muted { color: var(--mut40); } +.term-foot { margin-top: 8px; } +.term-row { display: flex; justify-content: space-between; gap: 16px; } +.infra-points { flex: 1; min-width: min(320px, 100%); display: flex; flex-direction: column; gap: 20px; } +.ipoint { border-left: 2px solid var(--lime); padding: 4px 0 4px 20px; } +.ipoint-title { font: 700 17px var(--sans); margin-bottom: 6px; } +.ipoint-desc { font: 400 14px/1.55 var(--sans); color: var(--mut65); } +.infra-strip { font: 500 12px var(--mono); color: var(--mut45); } + +/* ══ Réalisations ════════════════════════════════════════════════════ */ +.real-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(380px, 100%), 1fr)); gap: 28px; } + +/* ══ Blog ════════════════════════════════════════════════════════════ */ +.blog-list { display: flex; flex-direction: column; max-width: 1100px; } +.blog-row { + display: flex; align-items: baseline; gap: 28px; padding: 30px 8px; color: var(--ink); + border-top: 1px solid rgba(var(--ink-rgb), .12); transition: padding-left .3s, background .3s; +} +.blog-row:hover { padding-left: 24px; background: rgba(var(--lime-rgb), .04); color: var(--ink); } +.blog-num { flex: none; font: 700 13px var(--mono); color: var(--lime); } +.blog-title { flex: 1; font: 800 clamp(17px, 3.4vw, 32px) var(--sans); letter-spacing: -.02em; line-height: 1.15; } +.blog-tag { flex: none; font: 500 12px var(--mono); color: var(--mut45); } +.blog-arrow { flex: none; font: 700 18px var(--mono); color: var(--lime); } + +/* ══ Contact ═════════════════════════════════════════════════════════ */ +.contact { display: flex; flex-direction: column; justify-content: center; padding-bottom: 60px; } +.contact-cols { display: flex; gap: 60px; margin-top: 70px; flex-wrap: wrap; } +.contact-col { display: flex; flex-direction: column; gap: 16px; font: 500 14px var(--mono); } +.contact-k { color: var(--mut40); font-size: 12px; } +.contact-muted { color: var(--mut65); } + +/* ══ Étude de cas / article ══════════════════════════════════════════ */ +.case-hero { height: 56vh; min-height: 320px; overflow: hidden; position: relative; } +.case-hero-img, .case-hero img { width: 100%; height: 100%; object-fit: cover; display: block; animation: imgIn 1.1s var(--ease); } +.case-hero-fade { position: absolute; inset: 0; background: linear-gradient(to top, var(--bg), transparent 60%); } +.case-hero-text { position: absolute; left: var(--gut); bottom: 36px; right: var(--gut); } +.case-hero-text .kicker { letter-spacing: .12em; margin-bottom: 12px; } +.case-title { font: 900 min(8vw, 100px) var(--sans); line-height: .88; letter-spacing: -.035em; } +.case-title--post { font-size: min(5.5vw, 64px); line-height: 1; } +.rise { animation: riseIn .7s var(--ease) backwards; } +.rise-1 { animation-delay: .1s; } +.rise-2 { animation-delay: .2s; } +.rise-3 { animation-delay: .3s; } +.case-cols { display: flex; gap: 70px; padding: 60px var(--gut) 30px; flex-wrap: wrap; } +.case-meta { + flex: none; width: 260px; display: flex; flex-direction: column; gap: 22px; + font: 500 13px var(--mono); position: sticky; top: 110px; align-self: flex-start; +} +.case-meta-k { color: var(--mut40); margin-bottom: 5px; } +.case-body { flex: 1; min-width: min(400px, 100%); max-width: 760px; display: flex; flex-direction: column; gap: 44px; } +.case-lead { font: 400 21px/1.6 var(--sans); color: rgba(var(--ink-rgb), .85); } +.case-sec { display: flex; flex-direction: column; gap: 16px; } +.case-sec-h { font: 800 30px var(--sans); letter-spacing: -.02em; } +.case-sec-p { font: 400 16.5px/1.7 var(--sans); color: var(--mut70); margin: 0; } +.case-next { + padding: 70px var(--gut) 90px; border-top: 1px solid var(--b1); margin-top: 40px; color: var(--ink); + display: flex; justify-content: space-between; align-items: center; gap: 24px; +} +.case-next:hover { color: var(--ink); } +.case-next-k { font: 500 12px var(--mono); color: var(--mut45); margin-bottom: 10px; } +.case-next-name { font: 900 min(6vw, 72px) var(--sans); line-height: .9; letter-spacing: -.03em; color: transparent; -webkit-text-stroke: 1.8px var(--lime); } +.case-next:hover .case-next-name { color: var(--lime); } +.case-next-arrow { font: 700 44px var(--mono); color: var(--lime); } + +/* ══ Prose (contenu WP) ══════════════════════════════════════════════ */ +.prose { font: 400 16.5px/1.7 var(--sans); color: var(--mut70); max-width: 760px; } +.prose h2, .prose h3 { font: 800 30px var(--sans); letter-spacing: -.02em; color: var(--ink); margin: 1.6em 0 .6em; } +.prose h3 { font-size: 23px; } +.prose h2::before, .prose h3::before { content: '/ '; color: var(--lime); } +.prose a { border-bottom: 1px solid rgba(var(--lime-rgb), .4); } +.prose img { border-radius: 12px; border: 1px solid var(--b2); } +.prose blockquote { margin: 1.5em 0; border-left: 2px solid var(--lime); padding: 6px 0 6px 22px; font: 500 14px/1.6 var(--mono); color: var(--mut60); } +.prose pre, .prose code { font-family: var(--mono); background: var(--term); border-radius: 6px; } +.prose code { padding: 2px 6px; font-size: .85em; color: var(--lime); } +.prose pre { padding: 18px 22px; overflow-x: auto; border: 1px solid var(--b1); } +.prose pre code { padding: 0; background: none; } +.prose ul li::marker { color: var(--lime); } +.prose figure { margin: 1.5em 0; } +.prose figcaption { font: 500 12px var(--mono); color: var(--mut45); margin-top: 8px; } + +/* ══ Footer ══════════════════════════════════════════════════════════ */ +.site-footer { + position: relative; z-index: 1; + display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px; + padding: 28px var(--gut); border-top: 1px solid var(--b1); +} +.site-footer__logo { font: 700 14px var(--mono); } +.spin-circle { flex: none; } +.site-footer__copy { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; font: 500 11.5px var(--mono); color: var(--mut40); text-align: right; } +.site-footer__copy a { color: var(--mut40); } +.site-footer__copy a:hover { color: var(--lime); } + +/* ══ 404 ═════════════════════════════════════════════════════════════ */ +.page-404 { display: flex; flex-direction: column; justify-content: center; min-height: 80vh; } +.page-404 .page-lead { margin-top: 0; } +.page-404 .link-underline { align-self: flex-start; } + +/* ══ Responsive (les bascules principales sont dans effects.css) ═════ */ +@media (min-width: 1101px) { + .site-nav__burger { display: none; } +} +@media (max-width: 1100px) { + /* Bascules d'effects.css que nos règles de base (chargées après) masqueraient */ + .site-nav__links { display: none; } + .works-hint { display: none; } +} +@media (max-width: 860px) { + .site-nav { padding: 14px var(--gut); } + .page-wrap { padding-top: calc(110px + var(--admin)); } + .qsn-side { width: 100%; max-width: 380px; } + .case-meta { position: static; width: 100%; flex-direction: row; flex-wrap: wrap; gap: 28px; } + .case-cols { gap: 40px; padding-top: 40px; } + .case-next { padding: 50px var(--gut) 60px; } + .blog-row { gap: 14px; flex-wrap: wrap; padding: 22px 4px; } + .blog-title { flex: 1 1 100%; order: 3; font-size: 22px; } + .tl-item { flex-direction: column; gap: 8px; } + .tl-date { width: auto; } + .contact-cols { gap: 32px; } + .site-footer { flex-direction: column; text-align: center; } + .site-footer__copy { align-items: center; text-align: center; } +} +@media (max-width: 720px) { + .site-nav__badge, .section-rail { display: none; } + .hero__content { left: var(--gut); right: var(--gut); bottom: 84px; } + /* 16.5vw du prototype : « BOULAYOUNE » déborde à 390px avec Archivo 900 */ + .hero__title { font-size: min(12vw, 145px); } + .card--home .card-img { height: 52vw; } + .works-head { position: static; padding: 0 var(--gut); margin-bottom: 28px; } + .works-track { margin-top: 0; } + .works-sticky { display: block; overflow: visible; } + .card--home .card-name { font-size: 24px; } + .works-end { width: 70vw; scroll-snap-align: center; } + .works-end span { font-size: 40px; } + .about { min-height: 0; padding: 90px 0; } + .about__cols { gap: 36px; padding-top: 44px; } + .cta { min-height: 60vh; padding-top: 60px; } + .qsn-main { min-width: 0; } + .case-body { min-width: 0; } +} +/* Mode capture ?ybstatic=1 : piste des travaux à plat */ +html.yb-static .works { height: auto; } +html.yb-static .works-sticky { position: static; height: auto; overflow: visible; display: block; padding: 110px 0 60px; } +html.yb-static .works-head { position: static; padding: 0 var(--gut); margin-bottom: 28px; } +html.yb-static .works-track { margin-top: 0; width: auto; overflow-x: auto; } + +/* Captures dans une étude de cas : jamais plus hautes que l'écran (captures mobiles) */ +.case-figs { display: flex; flex-direction: column; gap: 32px; } +.case-figs figure { margin: 0; text-align: center; } +.case-figs img { width: auto; max-width: 100%; max-height: 78vh; margin: 0 auto; display: block; } + +/* ══ Page Compétences (/competences/) ════════════════════════════════ + Pas de cartes ni de tableaux : typo géante, rideaux, bandeaux, scroll. */ +.cp .page-wrap { min-height: 0; padding-top: 0; padding-bottom: 0; } +.cp-open.page-wrap { padding-top: calc(150px + var(--admin)); padding-bottom: 110px; } +.cp-title { font: 900 min(11.2vw, 172px) var(--sans); line-height: .84; letter-spacing: -.045em; margin-bottom: 70px; } +.cp-manifest { + max-width: 1280px; margin: 0; + font: 800 min(5vw, 68px)/1.08 var(--sans); letter-spacing: -.03em; color: var(--ink); +} +.cp-num { + display: inline-block; min-width: 1ch; font-size: 1.32em; line-height: .8; vertical-align: -.06em; + color: transparent; -webkit-text-stroke: 2px var(--lime); font-variant-numeric: tabular-nums; +} +.cp-h { font: 900 min(9vw, 128px) var(--sans); line-height: .86; letter-spacing: -.04em; margin: 0 0 44px; } +.cp-head { margin-bottom: 10px; } + +/* Services : lignes éditoriales, rideau lime au survol */ +.cp-svc { border-bottom: 1px solid var(--b2); margin-bottom: 150px; } +.cp-svc__row { + position: relative; overflow: hidden; isolation: isolate; + display: grid; grid-template-columns: minmax(150px, 1fr) 3fr minmax(220px, 2fr); align-items: center; gap: 36px; + padding: 40px var(--gut); border-top: 1px solid var(--b2); cursor: default; +} +.cp-svc__row::before { + content: ''; position: absolute; inset: 0; z-index: -1; background: var(--lime); + transform: scaleX(0); transform-origin: left; transition: transform .7s cubic-bezier(.7, 0, .3, 1); +} +.cp-svc__row:hover::before { transform: scaleX(1); } +.cp-svc__n { font: 900 min(13vw, 180px) var(--sans); line-height: .78; letter-spacing: -.05em; color: transparent; -webkit-text-stroke: 2px var(--lime); transition: -webkit-text-stroke-color .4s .15s; } +.cp-svc__t { font: 900 min(5.4vw, 84px) var(--sans); line-height: .92; letter-spacing: -.035em; transition: color .4s .15s; } +.cp-svc__d { margin: 0; font: 400 16px/1.6 var(--sans); color: var(--mut65); transition: color .4s .15s; } +.cp-svc__row:hover .cp-svc__n { -webkit-text-stroke-color: var(--bg); } +.cp-svc__row:hover .cp-svc__t, .cp-svc__row:hover .cp-svc__d { color: var(--bg); } + +/* Boîte à outils : bandeaux défilants géants */ +.cp-tools { margin-bottom: 150px; } +.cp-tools__row { border-top: 1px solid var(--b1); padding: 22px 0 18px; } +.cp-tools__row:last-child { border-bottom: 1px solid var(--b1); } +.cp-tools__label { padding: 0 var(--gut) 10px; font: 500 12px var(--mono); letter-spacing: .2em; color: var(--mut50); } +.cp-tools__mq .marquee-track { animation-duration: var(--dur, 30s); font: 900 min(8vw, 112px) var(--sans); letter-spacing: -.03em; line-height: 1; } +.cp-tools__mq b { font-weight: 900; color: var(--ink); transition: color .35s, -webkit-text-stroke-color .35s; } +.cp-tools__mq b.is-outline { color: transparent; -webkit-text-stroke: 1.5px rgba(var(--ink-rgb), .55); } +.cp-tools__mq i { font-style: normal; font-size: .42em; margin: 0 .55em; vertical-align: .55em; } +.cp-tools__row:hover .marquee-track { animation-play-state: paused; } +.cp-tools__row:hover b { color: var(--lime); } +.cp-tools__row:hover b.is-outline { color: transparent; -webkit-text-stroke-color: var(--lime); } +.cp-tools__row:hover .cp-tools__label { color: var(--lime); } + +/* Méthode : grand numéro fixé à gauche, étapes qui défilent */ +.cp-method { display: grid; grid-template-columns: 1fr 1.15fr; gap: 60px; margin-bottom: 120px; } +.cp-method__aside { + position: sticky; top: calc(96px + var(--admin)); align-self: start; + /* Jamais plus haut que l'écran : tout est dimensionné aussi sur la hauteur (vh) */ + max-height: calc(100vh - 120px - var(--admin)); display: flex; flex-direction: column; +} +.cp-method__aside .cp-h { font-size: min(7vw, 11vh, 110px); margin-bottom: 2vh; } +.cp-method__big { position: relative; flex: 1 1 auto; min-height: 0; height: min(24vw, 36vh, 340px); } +.cp-method__num { + position: absolute; left: -.04em; bottom: 0; + font: 900 min(28vw, 42vh, 400px) var(--sans); line-height: .78; letter-spacing: -.06em; + color: transparent; -webkit-text-stroke: 2.5px var(--lime); + opacity: 0; transform: translateY(40%); transition: opacity .5s, transform .7s cubic-bezier(.2, .8, .2, 1); +} +.cp-method__num.is-on { opacity: 1; transform: none; } +.cp-method__steps { list-style: none; margin: 0; padding: 0; } +.cp-method__step { + min-height: min(62vh, 620px); display: flex; flex-direction: column; justify-content: center; gap: 14px; padding: 4vh 0; + border-top: 1px solid var(--b1); opacity: .22; transition: opacity .5s; +} +.cp-method__step.is-on { opacity: 1; } +.cp-method__k { font: 700 13px var(--mono); color: var(--lime); letter-spacing: .1em; } +.cp-method__t { font: 900 min(7vw, 12vh, 104px) var(--sans); line-height: .9; letter-spacing: -.04em; } +.cp-method__d { max-width: 460px; font: 400 18px/1.6 var(--sans); color: var(--mut70); } + +.cp-infra { margin-bottom: 150px; } + +/* Preuves : liste géante + vignette qui suit la souris */ +.cp-proofs { margin-bottom: 40px; } +.cp-proofs__list { list-style: none; margin: 0; padding: 0; border-bottom: 1px solid var(--b1); } +.cp-proof { + /* Liens toujours sous le nom de la compétence (plus de bascule à droite / dessous) */ + display: flex; flex-direction: column; align-items: flex-start; gap: 14px; + padding: 22px var(--gut); border-top: 1px solid var(--b1); transition: padding-left .4s cubic-bezier(.2, .8, .2, 1); +} +.cp-proof__skill { + font: 900 min(6.4vw, 92px) var(--sans); line-height: .95; letter-spacing: -.035em; + color: transparent; -webkit-text-stroke: 1.5px rgba(var(--ink-rgb), .6); transition: color .35s, -webkit-text-stroke-color .35s; +} +.cp-proof:hover { padding-left: calc(var(--gut) + 28px); } +.cp-proof:hover .cp-proof__skill { color: var(--lime); -webkit-text-stroke-color: var(--lime); } +.cp-proof__links { display: flex; flex-wrap: wrap; gap: 22px; font: 700 14px var(--mono); } +.cp-proof__links a { color: var(--ink); border-bottom: 1px solid rgba(var(--lime-rgb), .4); padding-bottom: 3px; } +.cp-proof__links a:hover { color: var(--lime); border-color: var(--lime); } +.cp-preview { + position: fixed; left: 0; top: 0; z-index: 70; width: 340px; aspect-ratio: 16 / 10; pointer-events: none; + opacity: 0; transform: translate(-50%, -50%) scale(.8) rotate(var(--tilt, 0deg)); + transition: opacity .25s, transform .35s cubic-bezier(.2, .8, .2, 1); +} +.cp-preview.is-on { opacity: 1; transform: translate(-50%, -50%) scale(1) rotate(var(--tilt, 0deg)); } +/* Paquet : la carte de devant (k=0) est au-dessus, les autres décalées vers le haut-droite, un coin visible */ +.cp-deck__card { + position: absolute; inset: 0; border-radius: 12px; overflow: hidden; background: var(--card); + border: 1px solid rgba(var(--ink-rgb), .18); box-shadow: 0 14px 34px rgba(0, 0, 0, .55); + transform: translate(calc(var(--k) * 16px), calc(var(--k) * -14px)) rotate(calc(var(--k) * 5deg)); + transition: transform .4s cubic-bezier(.2, .8, .2, 1); +} +.cp-deck__card[style*="--k:0"] { border-color: var(--lime); } +.cp-preview:not(.is-stack) .cp-deck__card { transform: none; } +.cp-preview.is-stack.is-on .cp-deck__card { transform: translate(calc(var(--k) * 22px), calc(var(--k) * -18px)) rotate(calc(var(--k) * 6deg)); } +.cp-deck__card img { width: 100%; height: 100%; object-fit: cover; display: block; } +.cp-deck__name { position: absolute; left: 12px; bottom: 10px; z-index: 5; font: 700 12px var(--mono); color: var(--bg); background: var(--lime); padding: 4px 8px; border-radius: 4px; } +.cp-deck__count { position: absolute; right: -10px; top: -12px; z-index: 5; font: 700 12px var(--mono); color: var(--bg); background: var(--ink); padding: 4px 8px; border-radius: 99px; } +/* Roue ouverte : le paquet se fige et s'efface au centre */ +.cp-preview.is-pinned { opacity: 0; transform: translate(-50%, -50%) scale(.35) rotate(0deg); transition: opacity .3s, transform .45s cubic-bezier(.2, .8, .2, 1); } +@media (pointer: coarse) { .cp-preview { display: none; } } + +/* Roue de sélection façon « menu d'armes » */ +.cp-wheel { position: fixed; inset: 0; z-index: 90; background: rgba(var(--bg-rgb), 0); transition: background .3s; cursor: crosshair; } +.cp-wheel.is-open { background: rgba(var(--bg-rgb), .72); } +.cp-wheel__svg { + position: absolute; transform: translate(-50%, -50%) scale(.6); border-radius: 50%; + border: 1.5px dashed rgba(var(--lime-rgb), .35); opacity: 0; transition: opacity .3s, transform .5s cubic-bezier(.2, .8, .2, 1); +} +.cp-wheel.is-open .cp-wheel__svg { opacity: 1; transform: translate(-50%, -50%) scale(1); } +/* Cartes du menu : elles partent du paquet (centre) et rejoignent leur place sur le cercle */ +.cp-wheel__card { + position: absolute; border-radius: 12px; overflow: hidden; background: var(--card); + border: 1px solid rgba(var(--ink-rgb), .2); box-shadow: 0 16px 40px rgba(0, 0, 0, .6); + opacity: 0; transform: translate(-50%, -50%) scale(.45); + transition: transform .55s cubic-bezier(.2, .8, .2, 1) var(--d), opacity .3s var(--d), filter .3s, border-color .3s, box-shadow .3s; +} +.cp-wheel.is-open .cp-wheel__card { opacity: 1; transform: translate(calc(-50% + var(--tx)), calc(-50% + var(--ty))) scale(1); } +.cp-wheel.is-open .cp-wheel__card.is-hot { + z-index: 3; border-color: var(--lime); box-shadow: 0 0 0 2px var(--lime), 0 0 40px rgba(var(--lime-rgb), .35), 0 20px 50px rgba(0, 0, 0, .7); + transform: translate(calc(-50% + var(--tx) * 1.08), calc(-50% + var(--ty) * 1.08)) scale(1.12); transition-delay: 0s; +} +.cp-wheel.has-hot .cp-wheel__card:not(.is-hot) { filter: brightness(.45) saturate(.6); } +.cp-wheel__card img { width: 100%; height: 100%; object-fit: cover; object-position: center; display: block; } +.cp-wheel__label { position: absolute; left: 10px; bottom: 9px; font: 700 11px var(--mono); color: var(--bg); background: var(--lime); padding: 3px 7px; border-radius: 4px; } +.cp-wheel.is-go .cp-wheel__card.is-hot { transform: translate(calc(-50% + var(--tx) * 1.08), calc(-50% + var(--ty) * 1.08)) scale(1.3); opacity: 0; transition: transform .3s, opacity .3s .05s; } +.cp-wheel__center { + position: absolute; z-index: 2; transform: translate(-50%, -50%); border-radius: 50%; width: 150px; height: 150px; + border: 1.5px dashed rgba(var(--lime-rgb), .5); background: rgba(var(--bg-rgb), .88); + display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; text-align: center; padding: 0 14px; + opacity: 0; transition: opacity .3s .15s; pointer-events: none; +} +.cp-wheel.is-open .cp-wheel__center { opacity: 1; } +.cp-wheel__skill { font: 500 9.5px var(--mono); letter-spacing: .14em; color: var(--mut50); text-transform: uppercase; } +.cp-wheel__name { font: 900 21px var(--sans); line-height: 1; letter-spacing: -.02em; color: var(--lime); } +.cp-wheel__hint { font: 500 9.5px var(--mono); letter-spacing: .06em; color: var(--mut65); } +@media (max-width: 720px) { .cp-wheel__center { width: 100px; height: 100px; } .cp-wheel__name { font-size: 15px; } .cp-wheel__skill, .cp-wheel__hint { font-size: 8.5px; } } +html.has-custom-cursor .cp-wheel { cursor: none; } +.cp-proof { cursor: pointer; } + +@media (max-width: 860px) { + .cp-svc__row { grid-template-columns: auto 1fr; gap: 10px 22px; padding: 30px var(--gut); } + .cp-svc__d { grid-column: 1 / -1; } + .cp-method { grid-template-columns: 1fr; gap: 10px; } + .cp-method__aside { position: static; } + .cp-method__big { display: none; } + .cp-method__step { min-height: 0; padding: 34px 0; opacity: 1; } + .cp-svc, .cp-tools, .cp-infra { margin-bottom: 100px; } +} +html.yb-static .cp-method__step { opacity: 1; } +@media (max-height: 560px) and (min-width: 861px) { + .cp-method__aside { position: static; max-height: none; } + .cp-method__big { display: none; } + .cp-method__step { min-height: 0; padding: 30px 0; opacity: 1; } +} +@media (max-width: 720px) { + .cp-manifest { font-size: 27px; line-height: 1.12; } + .cp-proof__skill { color: var(--ink); -webkit-text-stroke: 0; font-size: 30px; } + .cp-proof:hover { padding-left: var(--gut); } +} + +/* Preuves : étiquette « ARTICLE » pour les liens vers le blog */ +.cp-proof__kind { font: 700 9.5px var(--mono); letter-spacing: .12em; color: var(--bg); background: rgba(var(--ink-rgb), .75); padding: 2px 5px; border-radius: 3px; vertical-align: 2px; } +.cp-proof__links a.is-article { border-bottom-style: dashed; } +.cp-wheel__label.is-article { background: var(--ink); } + +/* ══ Bascule clair / sombre ══════════════════════════════════════════ */ +.theme-toggle { + position: relative; width: 36px; height: 36px; flex: none; padding: 0; cursor: pointer; + border: 1px solid rgba(var(--ink-rgb), .3); border-radius: 50%; background: transparent; color: var(--ink); + transition: border-color .25s, background .25s, color .25s; +} +.theme-toggle:hover { border-color: var(--lime); color: var(--lime); } +.theme-toggle svg { + position: absolute; inset: 0; margin: auto; width: 17px; height: 17px; + fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; + transition: transform .55s cubic-bezier(.2, .8, .2, 1), opacity .3s; +} +.theme-toggle__moon { fill: currentColor; stroke: none; } +/* En sombre : on montre le soleil (« passer en clair ») ; en clair : la lune */ +.theme-toggle__moon { opacity: 0; transform: rotate(-90deg) scale(.4); } +html[data-theme="light"] .theme-toggle__sun { opacity: 0; transform: rotate(90deg) scale(.4); } +html[data-theme="light"] .theme-toggle__moon { opacity: 1; transform: none; } + +/* Bascule animée : cercle qui s'étend depuis le bouton (View Transitions) */ +::view-transition-old(root), ::view-transition-new(root) { animation: none; mix-blend-mode: normal; } +::view-transition-new(root) { z-index: 9999; } +/* Navigateurs sans View Transitions : fondu des couleurs le temps de la bascule */ +html.theme-fade, html.theme-fade * { transition: background-color .45s, color .45s, border-color .45s, fill .45s, stroke .45s !important; } + +/* ══ Page Qui suis-je (refonte) ══════════════════════════════════════ */ +.qs .page-wrap { min-height: 0; padding-top: 0; padding-bottom: 0; } +.qs-hero.page-wrap { + padding-top: calc(150px + var(--admin)); padding-bottom: 110px; + display: grid; grid-template-columns: 1.3fr minmax(280px, 1fr); gap: 70px; align-items: end; +} +.qs-title { font: 900 min(7.6vw, 124px) var(--sans); line-height: .84; letter-spacing: -.045em; margin: 0 0 54px; } +.qs-lead { margin: 0 0 26px; max-width: 900px; font: 800 min(3.3vw, 44px)/1.12 var(--sans); letter-spacing: -.02em; color: var(--ink); } +.qs-sub { margin: 0; max-width: 620px; font: 400 17px/1.7 var(--sans); color: var(--mut70); } + +/* Portrait : cadre lime décalé, gris → couleur et inclinaison au survol */ +.qs-portrait { position: relative; margin: 0 18px 18px 0; } +.qs-portrait::before { + content: ''; position: absolute; inset: 0; transform: translate(18px, 18px); + border: 2px solid var(--lime); border-radius: 16px; transition: transform .5s cubic-bezier(.2, .8, .2, 1); +} +.qs-portrait:hover::before { transform: translate(26px, 26px); } +.qs-portrait__frame { + position: relative; aspect-ratio: 1; border-radius: 16px; overflow: hidden; background: var(--ph); + transform: perspective(900px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg)); transition: transform .2s ease-out; +} +.qs-portrait__frame img { width: 100%; height: 100%; object-fit: cover; display: block; filter: grayscale(1) contrast(1.06); transform: scale(1.04); transition: filter .6s, transform .8s cubic-bezier(.2, .8, .2, 1); } +.qs-portrait:hover .qs-portrait__frame img { filter: none; transform: scale(1); } +.qs-portrait__cap { margin-top: 44px; font: 500 11px var(--mono); letter-spacing: .2em; color: var(--mut50); } + +/* Fiche en terminal tapé */ +.qs-who { margin-bottom: 150px; } +.qs-term { max-width: 820px; } +.qs-term__body { font-size: 14px; gap: 10px; } +.qs-term__row { display: grid; grid-template-columns: 150px 1fr; gap: 18px; } +.qs-term__k { color: var(--mut45); } +.qs-term__k::after { content: ' :'; } +.qs-term__v { color: var(--ink); } +.qs-term__caret { display: inline-block; width: .6em; height: 1.1em; vertical-align: -.2em; background: var(--lime); animation: yb-pulse 1s steps(1) infinite; } +.qs-term [data-type-row] { opacity: 0; transform: translateY(6px); transition: opacity .3s, transform .3s; } +.qs-term [data-type-row].is-typed { opacity: 1; transform: none; } +html.yb-static .qs-term [data-type-row] { opacity: 1; transform: none; } + +/* Compétences : nom géant en contour qui se remplit de lime jusqu'au pourcentage */ +.qs-skills { margin-bottom: 150px; } +.qs-gauges { list-style: none; margin: 0; padding: 0; border-bottom: 1px solid var(--b1); } +.qs-gauge { + display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; flex-wrap: wrap; + padding: 22px var(--gut) 20px; border-top: 1px solid var(--b1); +} +.qs-gauge__name { + position: relative; display: inline-block; + font: 900 min(6.6vw, 96px) var(--sans); line-height: .95; letter-spacing: -.035em; + color: transparent; -webkit-text-stroke: 1.5px rgba(var(--ink-rgb), .35); +} +.qs-gauge__name::after { + content: attr(data-text); position: absolute; inset: 0; color: var(--lime); -webkit-text-stroke: 0; + clip-path: inset(0 100% 0 0); transition: clip-path 1.6s cubic-bezier(.2, .8, .2, 1); +} +.qs-gauge.is-in .qs-gauge__name::after { clip-path: inset(0 calc(100% - var(--pct)) 0 0); } +html.yb-static .qs-gauge__name::after { clip-path: inset(0 calc(100% - var(--pct)) 0 0); transition: none; } +.qs-gauge__meta { display: flex; align-items: baseline; gap: 16px; font: 500 12px var(--mono); letter-spacing: .12em; color: var(--mut50); text-transform: uppercase; } +.qs-gauge__meta b { font: 900 min(4vw, 48px) var(--sans); letter-spacing: -.03em; color: var(--lime); } + +/* Parcours : frise, ligne lime tracée au scroll */ +.qs-path { margin-bottom: 140px; } +.qs-tl { position: relative; padding-left: 44px; } +.qs-tl__line { position: absolute; left: 6px; top: 10px; bottom: 10px; width: 2px; background: var(--b2); } +.qs-tl__fill { position: absolute; left: 0; top: 0; width: 100%; height: var(--p, 0%); background: var(--lime); } +html.yb-static .qs-tl__fill { height: 100%; } +.qs-tl__list { list-style: none; margin: 0; padding: 0; } +.qs-tl__item { position: relative; display: grid; grid-template-columns: minmax(170px, 260px) 1fr; gap: 40px; padding: 34px 0; border-top: 1px solid var(--b1); } +.qs-tl__dot { position: absolute; left: -44px; top: 46px; width: 14px; height: 14px; border-radius: 50%; background: var(--bg); border: 2px solid var(--lime); } +.qs-tl__item.is-now .qs-tl__dot { background: var(--lime); box-shadow: 0 0 0 6px rgba(var(--lime-rgb), .2); animation: yb-pulse 2s infinite; } +.qs-tl__year { font: 900 min(8vw, 116px) var(--sans); line-height: .82; letter-spacing: -.05em; color: transparent; -webkit-text-stroke: 2px var(--lime); } +.qs-tl__item.is-now .qs-tl__year { color: var(--lime); -webkit-text-stroke: 0; } +.qs-tl__year small { display: block; margin-top: 10px; font: 700 13px var(--mono); letter-spacing: .1em; color: var(--mut50); -webkit-text-stroke: 0; } +.qs-tl__date { font: 500 12px var(--mono); letter-spacing: .1em; color: var(--lime); margin-bottom: 10px; } +.qs-tl__now { display: inline-block; margin-left: 10px; padding: 2px 8px; border-radius: 4px; background: var(--lime); color: var(--bg); font-weight: 700; letter-spacing: .14em; } +.qs-tl__title { font: 900 min(3.4vw, 46px) var(--sans); line-height: 1; letter-spacing: -.025em; margin-bottom: 10px; } +.qs-tl__place { font: 500 12px var(--mono); letter-spacing: .1em; color: var(--mut50); margin-bottom: 14px; } +.qs-tl__desc { margin: 0; max-width: 640px; font: 400 16px/1.65 var(--sans); color: var(--mut70); } +.qs-mq { margin-bottom: 0; } +.qs-mq .skills-mq__track { font-size: min(5vw, 64px); } +.qs-mq i { font-style: normal; font-size: .5em; vertical-align: .4em; } + +@media (max-width: 960px) { + .qs-hero.page-wrap { grid-template-columns: 1fr; gap: 50px; padding-bottom: 80px; } + .qs-portrait { max-width: 420px; } + .qs-lead { font-size: 26px; } +} +@media (max-width: 720px) { + .qs-term__row { grid-template-columns: 1fr; gap: 2px; } + .qs-term__body { font-size: 12.5px; } + .qs-gauge__name { font-size: 30px; } + .qs-tl { padding-left: 30px; } + .qs-tl__dot { left: -30px; } + .qs-tl__item { grid-template-columns: 1fr; gap: 14px; } + .qs-tl__title { font-size: 26px; } + .qs-who, .qs-skills, .qs-path { margin-bottom: 100px; } +} +.qs-title .outline-lime { white-space: nowrap; } +@media (max-width: 960px) { .qs-title { font-size: min(15vw, 124px); } } + +/* ══ Page Contact (refonte) ══════════════════════════════════════════ */ +.ct .page-wrap { min-height: 0; padding-bottom: 0; } +.ct-open.page-wrap { padding-top: calc(150px + var(--admin)); padding-bottom: 80px; } +.ct-title { font-size: min(11.4vw, 168px); } +.ct-meta { display: flex; flex-wrap: wrap; gap: 14px 34px; margin-top: 48px; font: 500 12px var(--mono); letter-spacing: .14em; color: var(--mut50); } +.ct-meta b { font-weight: 700; } +.ct-list { list-style: none; margin: 0 0 110px; padding: 0; border-bottom: 1px solid var(--b2); } +.ct-row { + position: relative; isolation: isolate; overflow: hidden; + display: grid; grid-template-columns: minmax(150px, 220px) 1fr auto; align-items: center; gap: 28px; + padding: 30px var(--gut); border-top: 1px solid var(--b2); +} +.ct-row::before { + content: ''; position: absolute; inset: 0; z-index: -1; background: rgba(var(--lime-rgb), .07); + transform: scaleY(0); transform-origin: bottom; transition: transform .5s cubic-bezier(.2, .8, .2, 1); +} +.ct-row:hover::before { transform: scaleY(1); } +.ct-row__k { font: 500 12px var(--mono); letter-spacing: .18em; color: var(--mut50); } +.ct-row__big { + font: 900 min(4.3vw, 64px) var(--sans); line-height: 1; letter-spacing: -.035em; white-space: nowrap; min-width: 0; + color: transparent; -webkit-text-stroke: 1.5px rgba(var(--ink-rgb), .55); transition: color .35s, -webkit-text-stroke-color .35s; +} +.ct-row:hover .ct-row__big { color: var(--lime); -webkit-text-stroke-color: var(--lime); } +.ct-row__acts { display: flex; gap: 10px; align-items: center; } +.ct-copy, .ct-row__act { + font: 700 12px var(--mono); letter-spacing: .08em; padding: 10px 16px; border-radius: 99px; white-space: nowrap; cursor: pointer; + border: 1px solid rgba(var(--ink-rgb), .3); background: transparent; color: var(--ink); transition: background .25s, color .25s, border-color .25s; +} +.ct-row__act { border-color: rgba(var(--lime-rgb), .5); color: var(--lime); } +.ct-copy:hover { border-color: var(--ink); } +.ct-row__act:hover { background: var(--lime); color: var(--bg); } +.ct-preview { + position: fixed; left: 0; top: 0; z-index: 70; width: 230px; aspect-ratio: 210 / 297; pointer-events: none; + border-radius: 8px; overflow: hidden; border: 1px solid var(--lime); box-shadow: 0 24px 60px rgba(0, 0, 0, .5); + opacity: 0; transform: translate(-50%, -50%) rotate(-5deg) scale(.85); transition: opacity .25s, transform .4s cubic-bezier(.2, .8, .2, 1); +} +.ct-preview.is-on { opacity: 1; transform: translate(-50%, -50%) rotate(-3deg) scale(1); } +.ct-preview img { width: 100%; height: 100%; object-fit: cover; display: block; background: #fff; } +.ct-toast { + position: fixed; left: 50%; bottom: 32px; z-index: 80; transform: translate(-50%, 20px); opacity: 0; pointer-events: none; + font: 700 12px var(--mono); letter-spacing: .06em; color: var(--bg); background: var(--lime); padding: 10px 16px; border-radius: 99px; + transition: opacity .25s, transform .35s cubic-bezier(.2, .8, .2, 1); +} +.ct-toast.is-on { opacity: 1; transform: translate(-50%, 0); } +@media (pointer: coarse) { .ct-preview { display: none; } } +@media (max-width: 860px) { + .ct-row { grid-template-columns: 1fr; gap: 12px; padding: 26px var(--gut); } + .ct-row__big { font-size: min(6.6vw, 44px); color: var(--ink); -webkit-text-stroke: 0; } + .ct-list { margin-bottom: 80px; } +} + +/* Coordonnées protégées : « •••••••• » tant qu'elles ne sont pas décodées */ +.yb-pv { letter-spacing: .08em; } diff --git a/assets/fonts/Archivo-100-900-latin-ext.woff2 b/assets/fonts/Archivo-100-900-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c0dbc07286a52f02ca15fedf2119f424bb3493c9 GIT binary patch literal 86240 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Μ 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/fonts.css b/assets/fonts/fonts.css new file mode 100644 index 0000000..e746e9f --- /dev/null +++ b/assets/fonts/fonts.css @@ -0,0 +1,75 @@ +/* Polices auto-hébergées (licence SIL OFL 1.1) : Archivo, JetBrains Mono. Sous-ensembles latin + latin-ext. */ +/* latin-ext */ +@font-face { + font-family: 'Archivo'; + font-style: normal; + font-weight: 100 900; + font-stretch: 62% 125%; + font-display: swap; + src: url(Archivo-100-900-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Archivo'; + font-style: normal; + font-weight: 100 900; + font-stretch: 62% 125%; + font-display: swap; + src: url(Archivo-100-900-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(JetBrainsMono-400-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(JetBrainsMono-400-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(JetBrainsMono-400-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(JetBrainsMono-400-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(JetBrainsMono-400-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(JetBrainsMono-400-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/assets/js/about.js b/assets/js/about.js new file mode 100644 index 0000000..a75eb2e --- /dev/null +++ b/assets/js/about.js @@ -0,0 +1,57 @@ +/* about.js : interactions propres à la page « Qui suis-je » + - terminal : la commande se tape lettre par lettre, puis les lignes de la fiche apparaissent + - portrait : légère inclinaison 3D qui suit la souris + - parcours : la ligne de la frise se remplit selon le scroll + Mode capture ?ybstatic=1 : tout est affiché d'emblée. */ +(function () { + const STATIC = document.documentElement.classList.contains('yb-static'); + const TOUCH = matchMedia('(pointer: coarse)').matches; + + /* Terminal tapé */ + const term = document.querySelector('[data-type]'); + if (term) { + const cmd = term.querySelector('[data-type-cmd]'), rows = [...term.querySelectorAll('[data-type-row]')]; + const full = cmd ? cmd.textContent : ''; + if (STATIC) rows.forEach(r => r.classList.add('is-typed')); + else { + if (cmd) cmd.textContent = ''; + const io = new IntersectionObserver(es => es.forEach(en => { + if (!en.isIntersecting) return; + io.disconnect(); + let i = 0; + const type = () => { + if (cmd && i <= full.length) { cmd.textContent = full.slice(0, i++); return setTimeout(type, 45 + Math.random() * 40); } + rows.forEach((r, k) => setTimeout(() => r.classList.add('is-typed'), 180 + k * 160)); + }; + setTimeout(type, 300); + }), { threshold: 0.45 }); + io.observe(term); + } + } + + /* Portrait incliné à la souris */ + const frame = document.querySelector('[data-tilt]'); + if (frame && !STATIC && !TOUCH) { + const fig = frame.parentElement; + fig.addEventListener('mousemove', e => { + const r = frame.getBoundingClientRect(); + const x = (e.clientX - r.left) / r.width - 0.5, y = (e.clientY - r.top) / r.height - 0.5; + frame.style.setProperty('--ry', (x * 10).toFixed(2) + 'deg'); + frame.style.setProperty('--rx', (-y * 10).toFixed(2) + 'deg'); + }); + fig.addEventListener('mouseleave', () => { frame.style.setProperty('--ry', '0deg'); frame.style.setProperty('--rx', '0deg'); }); + } + + /* Frise du parcours */ + const tl = document.querySelector('[data-timeline]'); + if (tl && !STATIC) { + const fill = tl.querySelector('.qs-tl__fill'); + const tick = () => { + const r = tl.getBoundingClientRect(); + const p = Math.max(0, Math.min(1, (innerHeight * 0.6 - r.top) / r.height)); + fill.style.height = (p * 100).toFixed(1) + '%'; + requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); + } +})(); diff --git a/assets/js/competences.js b/assets/js/competences.js new file mode 100644 index 0000000..c095a9a --- /dev/null +++ b/assets/js/competences.js @@ -0,0 +1,193 @@ +/* competences.js : interactions propres à la page /competences/ + - chiffres du manifeste qui défilent jusqu'à leur valeur à l'entrée dans l'écran + - méthode : l'étape au centre de l'écran s'allume, le grand numéro suit + - preuves : la vignette du projet suit la souris (lerp, comme le curseur) + Mode capture ?ybstatic=1 (html.yb-static) : tout reste figé dans son état final. */ +(function () { + const STATIC = document.documentElement.classList.contains('yb-static'); + + /* Compteurs */ + const nums = document.querySelectorAll('.cp-num[data-count]'); + const show = (el, v) => { + const pad = +el.dataset.pad || 0, suf = el.dataset.suffix || ''; + el.textContent = String(Math.round(v)).padStart(pad, '0') + suf; + }; + if (!STATIC && nums.length) { + nums.forEach(el => show(el, 0)); + const io = new IntersectionObserver(es => es.forEach(en => { + if (!en.isIntersecting) return; + io.unobserve(en.target); + const el = en.target, to = +el.dataset.count, t0 = performance.now(), dur = 1400; + const step = now => { + const k = Math.min(1, (now - t0) / dur), e = 1 - Math.pow(1 - k, 3); + show(el, to * e); + if (k < 1) requestAnimationFrame(step); + }; + requestAnimationFrame(step); + }), { threshold: 0.6 }); + nums.forEach(el => io.observe(el)); + } + + /* Méthode */ + const steps = [...document.querySelectorAll('.cp-method__step')]; + const bigs = [...document.querySelectorAll('.cp-method__num')]; + if (steps.length && !STATIC) { + const set = i => { + steps.forEach((s, k) => s.classList.toggle('is-on', k === i)); + bigs.forEach((b, k) => b.classList.toggle('is-on', k === i)); + }; + const io = new IntersectionObserver(es => es.forEach(en => { if (en.isIntersecting) set(+en.target.dataset.step); }), + { rootMargin: '-45% 0px -45% 0px' }); + steps.forEach(s => io.observe(s)); + } + + /* ── Preuves : paquet de cartes qui suit la souris + roue de sélection ── + - plusieurs projets : paquet (le premier devant, les autres derrière, un coin visible) + - près du bord droit, l'aperçu passe à gauche du curseur en glissant + - clic sur une compétence à plusieurs projets : le paquet se fige et une roue + façon « menu d'armes » s'ouvre autour ; la direction de la souris choisit le projet */ + const prev = document.querySelector('.cp-preview'); + const wheel = document.querySelector('.cp-wheel'); + const rows = [...document.querySelectorAll('.cp-proof')]; + if (!prev || !rows.length) return; + const TOUCH = matchMedia('(pointer: coarse)').matches; + const esc = t => String(t).replace(/[&<>"]/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"' }[c])); + const itemsOf = li => [...li.querySelectorAll('a[data-thumb]')].map(a => ({ a, name: a.dataset.name, thumb: a.dataset.thumb, tag: a.dataset.tag || '', kind: a.dataset.kind || 'projet' })); + const label = it => (it.kind === 'article' ? 'ARTICLE · ' : '') + it.name; + + /* Paquet de cartes */ + const buildDeck = (items, frontIdx = 0) => { + const order = [items[frontIdx], ...items.filter((_, k) => k !== frontIdx)].slice(0, 3); + prev.innerHTML = order.map((it, k) => `
`).reverse().join('') + + `${esc(label(order[0]))}` + + (items.length > 1 ? `+${items.length - 1}` : ''); + prev.classList.toggle('is-stack', items.length > 1); + }; + + /* Suivi de la souris avec bascule gauche/droite fluide */ + const W = () => prev.offsetWidth || 360, GAP = 40; + const m = { x: innerWidth / 2, y: innerHeight / 2, cx: innerWidth / 2, cy: innerHeight / 2, off: 1 }; + let hovering = false, pinned = false, curRow = null; + if (!STATIC && !TOUCH) { + addEventListener('mousemove', e => { m.x = e.clientX; m.y = e.clientY; }, { passive: true }); + rows.forEach(li => { + li.addEventListener('mouseenter', () => { if (pinned) return; curRow = li; buildDeck(itemsOf(li)); prev.classList.add('is-on'); hovering = true; }); + li.addEventListener('mouseleave', () => { if (pinned) return; prev.classList.remove('is-on'); hovering = false; }); + itemsOf(li).forEach((it, k) => it.a.addEventListener('mouseenter', () => { if (!pinned) buildDeck(itemsOf(li), k); })); + }); + (function loop() { + if (!pinned) { + const w = W(); + /* Côté voulu : à droite du curseur, sauf si l'aperçu sortirait de l'écran */ + const want = (m.x + GAP + w + 24 > innerWidth) ? -1 : 1; + m.off += (want - m.off) * 0.12; // glisse d'un côté à l'autre + const tx = m.x + m.off * (GAP + w / 2); + const ty = Math.max(w * 0.32 + 16, Math.min(innerHeight - w * 0.32 - 16, m.y)); + m.cx += (tx - m.cx) * 0.16; m.cy += (ty - m.cy) * 0.16; + prev.style.left = m.cx + 'px'; prev.style.top = m.cy + 'px'; + prev.style.setProperty('--tilt', Math.max(-7, Math.min(7, (tx - m.cx) * 0.03)) + 'deg'); + } + requestAnimationFrame(loop); + })(); + } + + /* ── Menu circulaire : les cartes du paquet s'écartent en cercle autour du clic ── + 2 cartes : gauche / droite ; 3 et plus : réparties en partant du haut. + La direction de la souris (ou du doigt) choisit la carte, comme une roue de jeu. */ + if (!wheel) return; + const ring = wheel.querySelector('.cp-wheel__svg'); + const cSkill = wheel.querySelector('.cp-wheel__skill'), cName = wheel.querySelector('.cp-wheel__name'), cHint = wheel.querySelector('.cp-wheel__hint'); + let wItems = [], cards = [], angles = [], hot = -1, wc = { x: 0, y: 0 }, rad = 230; + const setHot = i => { + if (i === hot) return; + hot = i; + cards.forEach((c, k) => c.classList.toggle('is-hot', k === i)); + wheel.classList.toggle('has-hot', i >= 0); + const it = wItems[i]; + cName.textContent = it ? it.name : ''; + cHint.textContent = it ? (it.kind === 'article' ? it.tag : (it.tag ? it.tag.split(' · ').slice(0, 2).join(' · ') : 'VOIR LE PROJET')) : ''; + }; + function openWheel(li, x, y) { + wItems = itemsOf(li); + if (wItems.length < 2) { wItems[0] && wItems[0].a.click(); return; } + pinned = true; hot = -1; + const N = wItems.length, small = innerWidth < 720; + const cw = small ? Math.min(132, innerWidth * 0.34) : 250, ch = cw / 1.6; + const start = N === 2 ? Math.PI : -Math.PI / 2, step = (Math.PI * 2) / N; + const base = wItems.map((_, k) => start + k * step); + const maxCos = Math.max(...base.map(a => Math.abs(Math.cos(a)))) || 0.01; + const maxSin = Math.max(...base.map(a => Math.abs(Math.sin(a)))) || 0.01; + /* Écartement voulu, puis réduit si la carte la plus excentrée sortirait de l'écran. + Sur téléphone le cercle devient un ovale : étroit en largeur, plus haut. */ + const want = small ? cw * 0.95 + 24 : (N === 2 ? cw * 0.82 + 40 : cw * 0.95 + 20); + /* La carte visée grossit (×1.12) et s'écarte (×1.08) : on réserve cette place */ + const HX = 1.08, HW = 0.56; + const rx = Math.min(want, (innerWidth / 2 - cw * HW - 10) / (maxCos * HX)); + const ry = Math.min(small ? Math.max(want, rx * 1.35, ch + 70) : want, (innerHeight / 2 - ch * HW - 10) / (maxSin * HX)); + rad = Math.max(rx, ry); + const ex = maxCos * rx * HX + cw * HW + 10, ey = maxSin * ry * HX + ch * HW + 10; + wc.x = Math.max(ex, Math.min(innerWidth - ex, x)); + wc.y = Math.max(ey, Math.min(innerHeight - ey, y)); + /* Angles réels des cartes (ovale) : servent à la visée par direction */ + angles = base.map(a => Math.atan2(Math.sin(a) * ry, Math.cos(a) * rx)); + const pos = base.map(a => [Math.cos(a) * rx, Math.sin(a) * ry]); + ring.innerHTML = ''; + wheel.querySelectorAll('.cp-wheel__card').forEach(c => c.remove()); + cards = wItems.map((it, k) => { + const el = document.createElement('div'); + el.className = 'cp-wheel__card'; + el.style.cssText = `width:${cw}px;height:${ch}px;left:${wc.x}px;top:${wc.y}px;--d:${k * 45}ms;--tx:${pos[k][0]}px;--ty:${pos[k][1]}px`; + el.innerHTML = `${esc(label(it))}`; + el.addEventListener('pointerenter', () => setHot(k)); + wheel.appendChild(el); + return el; + }); + ring.style.cssText = `left:${wc.x}px;top:${wc.y}px;width:${rx * 2}px;height:${ry * 2}px`; + const c = wheel.querySelector('.cp-wheel__center'); + c.style.left = wc.x + 'px'; c.style.top = wc.y + 'px'; + cSkill.textContent = li.querySelector('.cp-proof__skill').textContent; + wheel.hidden = false; + requestAnimationFrame(() => requestAnimationFrame(() => wheel.classList.add('is-open'))); + prev.classList.add('is-pinned'); + document.body.classList.add('no-scroll'); + setHot(0); + } + function closeWheel() { + if (wheel.hidden) return; + wheel.classList.remove('is-open', 'has-hot'); prev.classList.remove('is-pinned'); + document.body.classList.remove('no-scroll'); + setTimeout(() => { wheel.hidden = true; pinned = false; if (!hovering) prev.classList.remove('is-on'); }, 380); + } + rows.forEach(li => li.addEventListener('click', e => { + if (e.target.closest('a')) return; // les liens texte restent des liens + const rect = prev.getBoundingClientRect(); + const onDeck = prev.classList.contains('is-on') && !TOUCH; + openWheel(li, onDeck ? rect.left + rect.width / 2 : (TOUCH ? innerWidth / 2 : e.clientX), onDeck ? rect.top + rect.height / 2 : (TOUCH ? innerHeight / 2 : e.clientY)); + })); + /* Carte la plus proche de la direction visée */ + const aim = (x, y) => { + const dx = x - wc.x, dy = y - wc.y; + if (Math.hypot(dx, dy) < 40) return; + const a = Math.atan2(dy, dx); + let best = 0, bd = 9; + angles.forEach((b, k) => { const d = Math.abs(Math.atan2(Math.sin(a - b), Math.cos(a - b))); if (d < bd) { bd = d; best = k; } }); + setHot(best); + }; + wheel.addEventListener('pointermove', e => aim(e.clientX, e.clientY)); + wheel.addEventListener('click', e => { + const d = Math.hypot(e.clientX - wc.x, e.clientY - wc.y); + const onCard = e.target.closest('.cp-wheel__card'); + if (!onCard && (d > rad * 1.9 || d < 40)) return closeWheel(); // clic au centre ou loin dehors + if (!onCard) aim(e.clientX, e.clientY); + const it = wItems[hot]; + if (it) { wheel.classList.add('is-go'); setTimeout(() => it.a.click(), 180); } + }); + addEventListener('keydown', e => { + if (wheel.hidden) return; + if (e.key === 'Escape') closeWheel(); + if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { e.preventDefault(); setHot((hot + 1) % wItems.length); } + if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); setHot((hot - 1 + wItems.length) % wItems.length); } + if (e.key === 'Enter' && wItems[hot]) wItems[hot].a.click(); + }); + addEventListener('pageshow', () => { wheel.classList.remove('is-open', 'is-go', 'has-hot'); wheel.hidden = true; pinned = false; document.body.classList.remove('no-scroll'); }); +})(); diff --git a/assets/js/cursor.js b/assets/js/cursor.js new file mode 100644 index 0000000..1cf9cf1 --- /dev/null +++ b/assets/js/cursor.js @@ -0,0 +1,106 @@ +/* cursor.js : Curseur custom (desktop uniquement) + YBCursor.init(); + Au repos : point accent. Sur un lien / bouton : le point s'étire en index et la main apparaît autour + (le bout du doigt reste sur la position de la souris). data-cursor-label="VOIR LE PROJET" = label contextuel. + La main change selon la fête quand c'est cohérent (html[data-season]), relue à chaque événement yb:theme. + Dans la roue des projets et articles (.cp-wheel) : le point devient une loupe, elle aussi accordée à la fête. */ +window.YBCursor = (function () { + let wrap, dot, hand, loupe, lbl, curSeason = null, override = null; + const m = { x: -100, y: -100, cx: -100, cy: -100 }; + + /* Silhouette commune : main qui pointe, bout de l'index en (11.5, 1) */ + const SHAPE = 'M11.5 1C13.2 1 14.5 2.3 14.5 4v9.2c.5-.7 1.4-1.1 2.4-1.1 1.3 0 2.4.8 2.7 1.9.5-.5 1.3-.8 2.2-.8 1.5 0 2.7 1.1 2.8 2.5.5-.4 1.2-.6 1.9-.6 1.5 0 2.7 1.2 2.7 2.7V25c0 5.5-4 9.5-9.5 9.5h-2.3c-3.4 0-5.8-1.3-7.8-3.9l-5.4-7.1c-.9-1.2-.7-2.9.5-3.8 1.2-.9 2.8-.7 3.7.4l.1.1V4c0-1.7 1.3-3 3-3z'; + const CREASES = 'M14.5 13.2V19M19.6 14v5.5M24.6 15.7V20'; + const base = (fill, stroke, extra, crease) => + '' + + '' + (extra || ''); + const HANDS = { + '': () => base('var(--lime)', 'var(--bg)'), + // gant squelette : os blancs sur gant noir + halloween: () => base('#15101a', 'var(--lime)', + '', '#efe6d2'), + // gant rouge et revers en fourrure blanche + noel: () => base('#d61f35', '#5a0b16', + '', '#8e1222'), + // gant vert, trèfle doré sur le dos de la main + 'st-patrick': () => base('#1b8f4c', '#0b3d21', + ''), + // gant blanc de cérémonie, revers doré, étincelle au bout du doigt + 'nouvel-an': () => base('#ffffff', '#16141c', + '', '#9aa0b0'), + // gant de fête : turquoise, petite bague dorée + anniversaire: () => base('var(--lime)', 'var(--bg)', + '') + }; + + /* Loupe : centre de la lentille en (14, 14) = position de la souris ; manche dessiné à plat puis tourné à 45° */ + const lens = (ring, glass, handle, extra, inside) => + '' + (extra || '') + '' + + '' + (inside || '') + + '' + + ''; + const stripes = (cols, w) => cols.map((c, i) => '').join(''); + const LOUPES = { + '': () => lens('var(--lime)', 'rgba(255,255,255,.08)', 'var(--ink)'), + // toile d'araignée dans le verre, manche en bois sombre + halloween: () => lens('var(--lime)', 'rgba(255,123,28,.1)', '#9a6a3a', '', + ''), + // manche en sucre d'orge, cerclage doré + noel: () => lens('#f2c14e', 'rgba(255,255,255,.1)', '#fdfbf6', stripes(['#d61f35', 'transparent', '#d61f35', 'transparent', '#d61f35', 'transparent', '#d61f35'], 2)), + 'st-patrick': () => lens('#f2c14e', 'rgba(61,220,132,.12)', '#1b8f4c', '', ''), + 'nouvel-an': () => lens('#f2c14e', 'rgba(242,193,78,.1)', '#d9dde8', stripes(['#f2c14e', '#f2c14e'], 2), ''), + juillet: () => lens('#ffffff', 'rgba(255,255,255,.08)', '#ffffff', stripes(['#1f3fa8', '#1f3fa8', '#ffffff', '#ffffff', '#c8102e', '#c8102e', '#c8102e'], 2)), + 'black-friday': () => lens('#ffd400', 'rgba(255,212,0,.1)', '#0b0b0b', stripes(['#ffd400', '#0b0b0b', '#ffd400', '#0b0b0b', '#ffd400', '#0b0b0b', '#ffd400'], 2)), + anniversaire: () => lens('var(--lime)', 'rgba(46,230,197,.1)', '#ffffff', stripes(['#2ee6c5', '#ffffff', '#ff6b81', '#ffffff', '#ffcf4a', '#ffffff', '#2ee6c5'], 2)), + poisson: () => lens('#4fd1ff', 'rgba(79,209,255,.12)', '#ffb347', '', '') + }; + + function paint() { + const s = override !== null ? override : document.documentElement.getAttribute('data-season') || ''; + const k = HANDS[s] ? s : ''; + // aperçu (roue des thèmes) : la main prend aussi l'accent de la fête survolée + const acc = override !== null && override ? (((window.YB_SEASONS || {}).list || {})[override] || {}).accent || '' : ''; + [hand, loupe].forEach(e => acc ? e.style.setProperty('--lime', acc) : e.style.removeProperty('--lime')); + const key = s + '|' + k; + if (key === curSeason) return; + curSeason = key; + hand.innerHTML = '' + HANDS[k]() + ''; + loupe.innerHTML = '' + (LOUPES[s] || LOUPES[''])() + ''; + } + function setState(label, link, inWheel) { + lbl.textContent = label || ''; + lbl.style.opacity = label ? '1' : '0'; + lbl.style.transform = label ? 'scale(1)' : 'scale(.6)'; + wrap.classList.toggle('is-loupe', !!inWheel); + wrap.classList.toggle('is-hand', !!link && !inWheel); + } + function loop() { + m.cx += (m.x - m.cx) * 0.25; m.cy += (m.y - m.cy) * 0.25; + wrap.style.transform = 'translate(' + m.cx + 'px,' + m.cy + 'px)'; + requestAnimationFrame(loop); + } + return { + /* Montre la main d'une fête sans l'activer ('' = main normale, null = revenir à la fête affichée) */ + preview(key) { if (!hand) return; override = key; curSeason = null; paint(); }, + init() { + // Animations inconditionnelles : seul ?ybstatic=1 (html.yb-static) coupe le curseur + if (matchMedia('(pointer: coarse)').matches || document.documentElement.classList.contains('yb-static')) return; + document.documentElement.classList.add('has-custom-cursor'); // CSS : .has-custom-cursor, .has-custom-cursor * { cursor:none } + wrap = document.createElement('div'); wrap.className = 'yb-cursor'; + dot = document.createElement('div'); dot.className = 'yb-cursor__dot'; + hand = document.createElement('div'); hand.className = 'yb-cursor__hand'; + loupe = document.createElement('div'); loupe.className = 'yb-cursor__loupe'; + lbl = document.createElement('div'); lbl.className = 'yb-cursor__label'; + wrap.append(dot, hand, loupe, lbl); document.body.appendChild(wrap); + paint(); addEventListener('yb:theme', paint); + addEventListener('mousemove', e => { m.x = e.clientX; m.y = e.clientY; }); + document.addEventListener('mouseover', e => { + const w = e.target.closest('.cp-wheel'); + const t = e.target.closest('[data-cursor-label], a, button, [data-cursor]'); + if (!t) return setState('', false, w); + setState(t.getAttribute('data-cursor-label') || '', true, w); + }); + requestAnimationFrame(loop); + } + }; +})(); diff --git a/assets/js/effects.js b/assets/js/effects.js new file mode 100644 index 0000000..f4c98b0 --- /dev/null +++ b/assets/js/effects.js @@ -0,0 +1,258 @@ +/* effects.js : Scroll inertiel, nav auto-masquée, progression, rail, reveals, + scroll horizontal + skew, blob, wipe de page, menu mobile. Vanilla JS. + Base : handoff/theme-assets/effects.js (design v3), adapté au site : + - animations inconditionnelles (choix de Yasser) : seul ?ybstatic=1 + (html.yb-static, posé dans header.php) les coupe, pour les captures ; + - le wipe couvre tous les liens internes, pas seulement [data-wipe] ; + - barres de compétences [data-bar], compteur des travaux = nb réel de cartes. */ +const YB_STATIC = document.documentElement.classList.contains('yb-static'); +const YB_TOUCH = matchMedia('(pointer: coarse)').matches; + +/* Scroll inertiel (façon Lenis) : desktop uniquement ; sur mobile on garde le scroll natif. */ +window.YBSmooth = { v: 0, init() { + if (YB_STATIC || YB_TOUCH) return; + let cur = scrollY, tgt = scrollY, wt = 0; + addEventListener('wheel', e => { + if (e.ctrlKey || document.body.classList.contains('no-scroll')) return; + e.preventDefault(); + const max = document.documentElement.scrollHeight - innerHeight; + tgt = Math.max(0, Math.min(max, tgt + e.deltaY)); wt = performance.now(); + }, { passive: false }); + const tick = () => { + if (performance.now() - wt < 1600) { cur += (tgt - cur) * 0.095; scrollTo(0, cur); } + else { cur = tgt = scrollY; } + this.v += ((tgt - cur) - this.v) * 0.12; // vélocité, utilisée pour le skew + requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); +}}; + +/* Nav qui se masque en descendant + barre de progression lime en haut */ +window.YBNav = { init(navSel, progSel) { + const nav = document.querySelector(navSel), prog = document.querySelector(progSel); + let last = scrollY; + const tick = () => { + const y = scrollY, max = Math.max(1, document.documentElement.scrollHeight - innerHeight); + if (prog) prog.style.transform = 'scaleX(' + Math.min(1, y / max) + ')'; + if (nav && !document.body.classList.contains('no-scroll')) { + if (y - last > 1.5 && y > 180) nav.style.transform = 'translateY(-104%)'; + else if (y - last < -1.5 || y <= 180) nav.style.transform = 'translateY(0)'; + } + last = y; requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); +}}; + +/* Rail vertical : chaque item [data-rail-target="#section"] s'allume quand sa section passe à mi-écran */ +window.YBRail = { init(railSel) { + const rail = document.querySelector(railSel); if (!rail) return; + const items = [...rail.querySelectorAll('[data-rail-target]')]; + const tick = () => { + let act = 0; + items.forEach((it, i) => { const s = document.querySelector(it.dataset.railTarget); if (s && s.getBoundingClientRect().top <= innerHeight * 0.5) act = i; }); + items.forEach((it, i) => it.classList.toggle('is-active', i === act)); + requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); +}}; + +/* Reveals au scroll : [data-reveal] ; les barres [data-bar] se remplissent à leur entrée */ +window.YBReveals = { init() { + const all = document.querySelectorAll('[data-reveal], [data-bar]'); + if (YB_STATIC) { all.forEach(el => el.classList.add('is-in')); return; } + const io = new IntersectionObserver(es => es.forEach(en => { + if (en.isIntersecting) { en.target.classList.add('is-in'); io.unobserve(en.target); } + }), { threshold: 0.12 }); + all.forEach(el => io.observe(el)); +}}; + +/* Scroll horizontal des travaux (desktop/tablette) + skew selon la vélocité + compteur 01/06. + Mobile (<720px) : CSS bascule la piste en scroll-snap horizontal natif (voir effects.css). */ +window.YBHScroll = { init(secSel, trackSel, countSel) { + const sec = document.querySelector(secSel), track = document.querySelector(trackSel), count = document.querySelector(countSel); + if (!sec || !track || YB_STATIC) return; + const total = Math.max(1, track.querySelectorAll('.card').length); + const pad = n => String(n).padStart(2, '0'); + const tick = () => { + if (innerWidth >= 720) { + const r = sec.getBoundingClientRect(); + const prog = Math.max(0, Math.min(1, -r.top / (r.height - innerHeight))); + const dist = Math.max(0, track.scrollWidth - innerWidth); + const skew = Math.max(-4.5, Math.min(4.5, (YBSmooth.v || 0) * 0.011)); + track.style.transform = 'translateX(' + (-prog * dist) + 'px) skewX(' + (-skew) + 'deg)'; + if (count) count.textContent = pad(Math.min(total, 1 + Math.floor(prog * total))) + ' / ' + pad(total); + } else track.style.transform = ''; + requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); +}}; + +/* Blob lumineux : suit la souris dans la zone, fondu + rétrécit quand elle sort */ +window.YBBlob = { init(zoneSel, blobSel) { + const zone = document.querySelector(zoneSel), blob = document.querySelector(blobSel); + if (!zone || !blob || YB_TOUCH || YB_STATIC) { if (blob) blob.style.display = 'none'; return; } + const m = { x: 0, y: 0, bx: 0, by: 0, bo: 0 }; + addEventListener('mousemove', e => { m.x = e.clientX; m.y = e.clientY; }); + const tick = () => { + const r = zone.getBoundingClientRect(); + m.bx += (m.x - r.left - m.bx) * 0.06; m.by += (m.y - r.top - m.by) * 0.06; + const inside = m.x >= r.left && m.x <= r.right && m.y >= r.top - 60 && m.y <= r.bottom + 60; + m.bo += ((inside ? 1 : 0) - m.bo) * 0.08; + blob.style.transform = 'translate(' + m.bx + 'px,' + m.by + 'px) scale(' + (0.6 + m.bo * 0.4) + ')'; + blob.style.opacity = m.bo.toFixed(3); + requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); +}}; + +/* Hero : légère parallaxe du bloc titre à la souris (desktop) */ +window.YBHeroParallax = { init(sel) { + const el = document.querySelector(sel); + if (!el || YB_TOUCH || YB_STATIC) return; + const m = { x: innerWidth / 2, y: innerHeight / 2, cx: innerWidth / 2, cy: innerHeight / 2 }; + addEventListener('mousemove', e => { m.x = e.clientX; m.y = e.clientY; }); + const tick = () => { + m.cx += (m.x - m.cx) * 0.25; m.cy += (m.y - m.cy) * 0.25; + if (el.getBoundingClientRect().bottom > 0) el.style.transform = 'translate(' + (m.cx - innerWidth / 2) * -0.012 + 'px,' + (m.cy - innerHeight / 2) * -0.008 + 'px)'; + requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); +}}; + +/* Wipe de page : rideau lime. Le rideau (.yb-wipe) est rendu par header.php et + couvre l'écran dès le premier paint (html.is-entering) ; il remonte une fois la page prête. + Toute navigation interne le fait redescendre ; le libellé vient de data-wipe et + survit au changement de page via sessionStorage (clé ybWipe). */ +/* Couleur des barres du navigateur (meta theme-color) : fond du thème, accent pendant le rideau */ +window.YBBar = (function () { + let meta, wiping = false; + const css = v => getComputedStyle(document.documentElement).getPropertyValue(v).trim(); + const set = c => { if (meta && c && meta.content !== c) meta.content = c; }; + return { + accent() { wiping = true; set(css('--lime')); }, + base() { wiping = false; set(css('--bg')); }, + init() { + meta = document.querySelector('meta[name="theme-color"]'); + if (!meta) { meta = document.createElement('meta'); meta.name = 'theme-color'; document.head.appendChild(meta); } + addEventListener('yb:theme', () => setTimeout(() => wiping ? this.accent() : this.base(), 0)); + } + }; +})(); + +window.YBWipe = { init() { + let w = document.querySelector('.yb-wipe'); + if (!w) { + w = document.createElement('div'); + w.className = 'yb-wipe'; + w.innerHTML = ''; + document.body.appendChild(w); + } + const label = w.querySelector('.yb-wipe__label'); + try { sessionStorage.removeItem('ybWipe'); } catch (e) {} + if (!YB_STATIC) { YBBar.accent(); setTimeout(() => YBBar.base(), 520); } else YBBar.base(); + requestAnimationFrame(() => requestAnimationFrame(() => document.documentElement.classList.remove('is-entering'))); + if (YB_STATIC) return; + document.addEventListener('click', e => { + const a = e.target.closest('a[href]'); + if (!a || a.target === '_blank' || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button !== 0) return; + const href = a.getAttribute('href'); + if (!href || href.charAt(0) === '#' || /^(mailto:|tel:|javascript:)/i.test(href)) return; + if (a.host !== location.host) return; + if (/\/wp-(admin|login)/.test(a.pathname) || /\.(pdf|zip|png|jpe?g|webp|svg|gif)$/i.test(a.pathname)) return; + if (a.pathname === location.pathname && a.hash) return; + e.preventDefault(); + const txt = a.dataset.wipe || ''; + try { sessionStorage.setItem('ybWipe', txt); } catch (err) {} + label.textContent = txt; + w.classList.add('is-covering'); YBBar.accent(); + setTimeout(() => { location.href = a.href; }, 480); + }); + /* Retour arrière depuis le cache (bfcache) : ne pas rester bloqué sous le rideau */ + addEventListener('pageshow', e => { if (e.persisted) { w.classList.remove('is-covering'); YBBar.base(); } }); +}}; + +/* Coordonnées protégées contre la collecte automatique : [data-pv] (texte), [data-pv-href] (lien), + [data-pv-copy] (bouton copier). Encodage côté PHP : ROT13 → inversion → base64. + Décodage au premier geste humain (souris, toucher, clavier, focus, scroll). */ +window.YBProtect = (function () { + let done = false; + const rot13 = t => t.replace(/[a-z]/gi, c => { const b = c <= 'Z' ? 65 : 97; return String.fromCharCode((c.charCodeAt(0) - b + 13) % 26 + b); }); + const dec = v => { try { return rot13(decodeURIComponent(escape(atob(v))).split('').reverse().join('')); } catch (e) { return ''; } }; + function reveal() { + if (done) return; done = true; + document.querySelectorAll('[data-pv]').forEach(el => { el.textContent = dec(el.dataset.pv); el.removeAttribute('data-pv'); }); + document.querySelectorAll('[data-pv-href]').forEach(el => { el.setAttribute('href', dec(el.dataset.pvHref)); el.removeAttribute('data-pv-href'); }); + document.querySelectorAll('[data-pv-copy]').forEach(el => { el.dataset.copy = dec(el.dataset.pvCopy); el.removeAttribute('data-pv-copy'); }); + EVENTS.forEach(ev => removeEventListener(ev, reveal, true)); + } + const EVENTS = ['pointermove', 'pointerdown', 'touchstart', 'keydown', 'focusin', 'wheel', 'scroll']; + return { reveal, init() { + if (!document.querySelector('[data-pv],[data-pv-href],[data-pv-copy]')) return; + if (YB_STATIC) return reveal(); + EVENTS.forEach(ev => addEventListener(ev, reveal, { capture: true, passive: true })); + /* Un clic sur un lien protégé avant décodage : on décode puis on relance le clic */ + document.addEventListener('click', e => { + const a = e.target.closest('[data-pv-href]'); + if (!a) return; + e.preventDefault(); reveal(); a.click(); + }, true); + } }; +})(); + +/* Thème clair / sombre : bouton [data-theme-toggle], choix mémorisé (localStorage yb-theme). + Bascule animée : un cercle s'étend depuis le bouton (View Transitions), fondu sinon. */ +window.YBTheme = { init() { + const btn = document.querySelector('[data-theme-toggle]'); if (!btn) return; + const root = document.documentElement; + const cur = () => root.getAttribute('data-theme') === 'light' ? 'light' : 'dark'; + const label = () => btn.setAttribute('aria-label', cur() === 'light' ? 'Passer en mode sombre' : 'Passer en mode clair'); + const apply = t => { + root.setAttribute('data-theme', t); + try { localStorage.setItem('yb-theme', t); } catch (e) {} + label(); + dispatchEvent(new CustomEvent('yb:theme', { detail: t })); + }; + label(); + btn.addEventListener('click', () => { + const next = cur() === 'light' ? 'dark' : 'light'; + const r = btn.getBoundingClientRect(), x = r.left + r.width / 2, y = r.top + r.height / 2; + if (!document.startViewTransition || YB_STATIC) { + root.classList.add('theme-fade'); apply(next); + setTimeout(() => root.classList.remove('theme-fade'), 500); + return; + } + const end = Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y)); + const vt = document.startViewTransition(() => apply(next)); + vt.ready.then(() => root.animate( + { clipPath: ['circle(0px at ' + x + 'px ' + y + 'px)', 'circle(' + end + 'px at ' + x + 'px ' + y + 'px)'] }, + { duration: 750, easing: 'cubic-bezier(.7,0,.3,1)', pseudoElement: '::view-transition-new(root)' } + )); + }); +}}; + +/* Menu mobile plein écran : bouton [data-menu-toggle], panneau [data-menu] */ +window.YBMenu = { init() { + const btn = document.querySelector('[data-menu-toggle]'), panel = document.querySelector('[data-menu]'); + if (!btn || !panel) return; + const set = open => { + panel.classList.toggle('is-open', open); + document.body.classList.toggle('no-scroll', open); + btn.textContent = open ? 'FERMER ✕' : 'MENU'; + btn.setAttribute('aria-expanded', open ? 'true' : 'false'); + panel.setAttribute('aria-hidden', open ? 'false' : 'true'); + }; + btn.addEventListener('click', () => set(!panel.classList.contains('is-open'))); + panel.querySelectorAll('a').forEach(a => a.addEventListener('click', () => set(false))); + addEventListener('keydown', e => { if (e.key === 'Escape' && panel.classList.contains('is-open')) set(false); }); +}}; + +document.addEventListener('DOMContentLoaded', () => { + YBBar.init(); YBProtect.init(); YBTheme.init(); YBSmooth.init(); YBReveals.init(); YBWipe.init(); YBMenu.init(); + YBNav.init('.site-nav', '.scroll-progress'); + YBRail.init('.section-rail'); + YBHScroll.init('#travaux', '.works-track', '.works-count'); + YBBlob.init('#apropos', '.about-blob'); + YBHeroParallax.init('.hero__content'); + if (window.YBCursor) YBCursor.init(); + if (window.YBOrb) YBOrb.init('#orb-canvas', { sections: { works: '#travaux', about: '#apropos', cta: '#cta' } }); +}); diff --git a/assets/js/orb.js b/assets/js/orb.js new file mode 100644 index 0000000..8e22029 --- /dev/null +++ b/assets/js/orb.js @@ -0,0 +1,322 @@ +/* orb.js : Orbe de particules persistante (vanilla JS) + en position:fixed; inset:0; z-index:0; pointer-events:none + YBOrb.init('#orb-canvas', { sections: { works:'#travaux', about:'#apropos', cta:'#cta' } }); + Sur les pages internes (sans sections), l'orbe reste dans son état "hero". */ +window.YBOrb = (function () { + let cv, ctx, cw, ch, run = false, secs = {}; + const m = { x: -9999, y: -9999 }; + const pts = [], rx = [], ry = []; + const N = 550; + for (let i = 0; i < N; i++) { + const y = 1 - (i / (N - 1)) * 2, r = Math.sqrt(1 - y * y), th = i * 2.39996323; + pts.push([Math.cos(th) * r, y, Math.sin(th) * r]); + rx.push(Math.sin(i * 12.9898) * 0.9 + Math.sin(i * 0.7) * 0.4); + ry.push(Math.cos(i * 78.233) * 0.9 + Math.cos(i * 1.3) * 0.4); + } + // États [cx, cy, R, éclatement, alpha] (fractions du viewport) + const A = [0.72, 0.42, 0.34, 0, 1]; // hero : grande, à droite + const B = [0.11, 0.24, 0.16, 0, 0.55]; // travaux : petite lune en haut à gauche + const C = [0.5, 0.48, 0.46, 1, 0.4]; // à propos : éclatée en champ d'étoiles + const D = [0.76, 0.52, 0.3, 0, 0.95]; // CTA : reformée + const c01 = v => Math.max(0, Math.min(1, v)); + const ease = k => k * k * (3 - 2 * k); + const mix = (a, b, k) => a.map((v, i) => v + (b[i] - v) * k); + const top = el => el ? el.getBoundingClientRect().top : null; + /* Couleurs lues dans le thème (--lime-rgb / --ink-rgb), relues à chaque bascule clair/sombre */ + let LIME = '211,253,80', INK = '245,245,240', GOLD = '242,193,78'; + function readColors() { + const cs = getComputedStyle(document.documentElement); + LIME = cs.getPropertyValue('--lime-rgb').trim() || LIME; + INK = cs.getPropertyValue('--ink-rgb').trim() || INK; + GOLD = cs.getPropertyValue('--season-2-rgb').trim() || GOLD; + } + /* Halloween : visage de citrouille (repère de la sphère, y vers le bas, rayon 1) */ + const inTri = (x, y, a, b, c) => { + const d = (p, q, r) => (p[0] - r[0]) * (q[1] - r[1]) - (q[0] - r[0]) * (p[1] - r[1]); + const P = [x, y], d1 = d(P, a, b), d2 = d(P, b, c), d3 = d(P, c, a); + return !((d1 < 0 || d2 < 0 || d3 < 0) && (d1 > 0 || d2 > 0 || d3 > 0)); + }; + const EYE_L = [[-0.55, -0.06], [-0.17, -0.06], [-0.36, -0.42]], EYE_R = [[0.17, -0.06], [0.55, -0.06], [0.36, -0.42]]; + const NOSE = [[-0.08, 0.13], [0.08, 0.13], [0, 0.01]]; + const smile = x => { const k = 1 - (x / 0.64) * (x / 0.64); return [0.2 + 0.13 * k, 0.27 + 0.3 * k]; }; + function inFace(x, y) { + if (inTri(x, y, ...EYE_L) || inTri(x, y, ...EYE_R) || inTri(x, y, ...NOSE)) return true; + if (Math.abs(x) > 0.64) return false; + const [t, b] = smile(x); + if (y < t || y > b) return false; + if (Math.abs(Math.abs(x) - 0.22) < 0.07 && y < t + 0.09) return false; // dents du haut + if (Math.abs(x) < 0.08 && y > b - 0.09) return false; // dent du bas + return true; + } + /* Autres fêtes : forme de l'orbe [kx, ky], pulsation, couleur des points, décor dessous / dessus. + point() renvoie [rgb, alpha, taille] ou rien (couleur par défaut). C = { LIME, INK, GOLD } */ + const tag = (c, x, y, w, h, txt, C, a) => { // étiquette de prix suspendue + c.save(); c.translate(x, y); c.rotate(0.12); + c.fillStyle = 'rgba(' + C.LIME + ',' + a + ')'; + c.beginPath(); c.moveTo(0, 0); c.lineTo(w, 0); c.lineTo(w, h); c.lineTo(0, h); c.lineTo(-h * 0.45, h / 2); c.closePath(); c.fill(); + c.fillStyle = 'rgba(0,0,0,' + a + ')'; c.font = '800 ' + Math.round(h * 0.46) + 'px "JetBrains Mono", monospace'; + c.textBaseline = 'middle'; c.fillText(txt, h * 0.12, h / 2 + 1); + c.beginPath(); c.arc(-h * 0.12, h / 2, h * 0.09, 0, 6.283); c.fill(); c.restore(); + }; + const PASTEL = ['255,159,203', '142,230,194', '255,222,120', '190,160,255', '140,200,255']; + const SEASON = { + 'nouvel-an': { + point: (i, p, x, y, z, lime, a, t) => { const tw = Math.sin(t * 4 + i * 1.7); return tw > 0.75 ? ['255,255,255', Math.min(1, a + 0.5), 1.5] : [i % 2 ? GOLD_() : LIME, a * 1.1, 1]; }, + over: (c, cx, cy, R, t, k, C) => { // boule à facettes suspendue + c.strokeStyle = 'rgba(' + C.INK + ',' + 0.3 * k + ')'; c.lineWidth = 1; + c.beginPath(); c.moveTo(cx, 0); c.lineTo(cx, cy - R * 1.02); c.stroke(); + for (let j = 0; j < 4; j++) { const ang = t * 0.6 + j * 1.57, rr = R * 1.12; // reflets qui tournent + c.fillStyle = 'rgba(255,255,255,' + 0.5 * k * (0.5 + 0.5 * Math.sin(t * 3 + j)) + ')'; + c.beginPath(); c.arc(cx + Math.cos(ang) * rr, cy + Math.sin(ang) * rr * 0.35, 2.2, 0, 6.283); c.fill(); } + } + }, + 'juillet': { + point: (i, p, x, y, z, lime, a) => [x < -0.33 ? '40,90,255' : x > 0.33 ? '255,60,80' : INK, a * 1.15, 1] + }, + 'st-patrick': { + point: (i, p, x, y, z, lime, a, t) => i % 9 === 0 ? [GOLD, Math.min(1, a + 0.3 * (0.5 + 0.5 * Math.sin(t * 3 + i))), 1.3] : [i % 3 ? LIME : INK, a, 1], + under: (c, cx, cy, R, t, k) => { // arc-en-ciel derrière l'orbe + ['255,80,80', '255,160,60', '255,225,80', '80,210,120', '80,150,255', '160,100,255'].forEach((col, j) => { + c.strokeStyle = 'rgba(' + col + ',' + 0.16 * k + ')'; c.lineWidth = R * 0.035; + c.beginPath(); c.arc(cx, cy, R * (1.42 - j * 0.04), Math.PI * 1.12, Math.PI * 1.88); c.stroke(); + }); + } + }, + 'paques': { + shape: [0.84, 1.1], + point: (i, p, x, y, z, lime, a) => { const band = Math.floor((p[1] + 1) * 4.5); return [band % 2 ? PASTEL[band % PASTEL.length] : INK, a * (band % 2 ? 1.25 : 0.8), band % 2 ? 1.2 : 1]; } + }, + 'poisson': { + shape: [1.14, 0.8], + point: (i, p, x, y, z, lime, a) => [(Math.round(x * 6) + Math.round(y * 6)) % 2 ? LIME : GOLD, a * 1.05, 1], + over: (c, cx, cy, R, t, k, C) => { + const w = Math.sin(t * 5) * R * 0.08; + c.fillStyle = 'rgba(' + C.LIME + ',' + 0.55 * k + ')'; + c.beginPath(); c.moveTo(cx + R * 1.02, cy); c.lineTo(cx + R * 1.5, cy - R * 0.42 + w); c.lineTo(cx + R * 1.38, cy + w * 0.3); c.lineTo(cx + R * 1.5, cy + R * 0.42 + w); c.closePath(); c.fill(); // queue + c.beginPath(); c.moveTo(cx - R * 0.2, cy - R * 0.74); c.quadraticCurveTo(cx + R * 0.2, cy - R * 1.12, cx + R * 0.5, cy - R * 0.66); c.closePath(); c.fill(); // nageoire + c.fillStyle = 'rgba(' + C.INK + ',' + k + ')'; c.beginPath(); c.arc(cx - R * 0.62, cy - R * 0.12, R * 0.09, 0, 6.283); c.fill(); // œil + c.fillStyle = 'rgba(' + C.LIME + ',' + k + ')'; c.beginPath(); c.arc(cx - R * 0.6, cy - R * 0.14, R * 0.035, 0, 6.283); c.fill(); + for (let j = 0; j < 3; j++) { const ph = (t * 0.5 + j / 3) % 1; // bulles + c.strokeStyle = 'rgba(' + C.INK + ',' + 0.45 * k * (1 - ph) + ')'; c.lineWidth = 1.2; + c.beginPath(); c.arc(cx - R * 1.1 - Math.sin(ph * 9) * 6, cy - R * 0.2 - ph * R * 0.9, 3 + j * 2, 0, 6.283); c.stroke(); } + } + }, + 'musique': { + pulse: t => { const b = (t * 2) % 1; return 1 + 0.035 * Math.exp(-b * 6); }, // 120 BPM + point: (i, p, x, y, z, lime, a, t) => [i % 4 === 0 ? GOLD : lime ? LIME : INK, a, 1], + under: (c, cx, cy, R, t, k, C) => { // vinyle : sillons + macaron + c.save(); c.translate(cx, cy); c.rotate(t * 1.4); + for (let r = 0.3; r < 0.98; r += 0.06) { c.strokeStyle = 'rgba(' + C.INK + ',' + 0.07 * k + ')'; c.lineWidth = 1; c.beginPath(); c.arc(0, 0, R * r, 0, 6.283); c.stroke(); } + for (let j = 0; j < 2; j++) { c.strokeStyle = 'rgba(255,255,255,' + 0.1 * k + ')'; c.lineWidth = R * 0.012; c.beginPath(); c.arc(0, 0, R * (0.5 + j * 0.2), -0.3 + j * 3.14, 0.3 + j * 3.14); c.stroke(); } + c.fillStyle = 'rgba(' + C.LIME + ',' + 0.7 * k + ')'; c.beginPath(); c.arc(0, 0, R * 0.22, 0, 6.283); c.fill(); + c.fillStyle = 'rgba(' + C.GOLD + ',' + 0.8 * k + ')'; c.fillRect(-R * 0.12, -R * 0.03, R * 0.24, R * 0.06); + c.fillStyle = 'rgba(0,0,0,' + 0.8 * k + ')'; c.beginPath(); c.arc(0, 0, R * 0.025, 0, 6.283); c.fill(); + c.restore(); + } + }, + 'anniversaire': { + shape: [0.9, 1.06], + point: (i, p, x, y, z, lime, a) => [i % 5 === 0 ? GOLD : i % 5 === 1 ? '255,107,129' : lime || i % 2 ? LIME : INK, a * 1.1, 1], + over: (c, cx, cy, R, t, k, C) => { // ballon : nœud + ficelle qui ondule + const by = cy + R * 1.06; + c.fillStyle = 'rgba(' + C.LIME + ',' + 0.8 * k + ')'; + c.beginPath(); c.moveTo(cx, by - R * 0.02); c.lineTo(cx - R * 0.07, by + R * 0.1); c.lineTo(cx + R * 0.07, by + R * 0.1); c.closePath(); c.fill(); + c.strokeStyle = 'rgba(' + C.INK + ',' + 0.4 * k + ')'; c.lineWidth = 1.2; + c.beginPath(); c.moveTo(cx, by + R * 0.1); + for (let j = 1; j <= 12; j++) c.lineTo(cx + Math.sin(t * 2 + j * 0.8) * R * 0.05 * (j / 12), by + R * 0.1 + j * R * 0.07); + c.stroke(); + } + }, + 'algerie': { + // drapeau : moitié verte / moitié blanche, croissant et étoile rouges au centre + point: (i, p, x, y, z, lime, a) => [x < 0 ? '0,150,75' : INK, a * 1.2, 1], + over: (c, cx, cy, R, t, k) => { + c.save(); c.fillStyle = 'rgba(210,16,52,' + 0.92 * k + ')'; c.shadowColor = 'rgba(210,16,52,' + 0.6 * k + ')'; c.shadowBlur = 18; + // croissant : arc extérieur (r1) puis arc intérieur (r2) entre leurs deux points d'intersection + const x1 = cx + R * 0.02, r1 = R * 0.36, x2 = cx + R * 0.11, r2 = R * 0.29, d = x2 - x1; + const ix = (d * d + r1 * r1 - r2 * r2) / (2 * d), iy = Math.sqrt(Math.max(0, r1 * r1 - ix * ix)); + const a1 = Math.atan2(iy, ix), a2 = Math.atan2(iy, ix - d); + c.beginPath(); c.arc(x1, cy, r1, a1, 2 * Math.PI - a1, false); c.arc(x2, cy, r2, 2 * Math.PI - a2, a2, true); c.closePath(); c.fill(); + const sx = cx + R * 0.2, sr = R * 0.12; c.beginPath(); + for (let j = 0; j < 10; j++) { const ang = -Math.PI / 2 + j * Math.PI / 5, rr = j % 2 ? sr * 0.42 : sr; c.lineTo(sx + Math.cos(ang) * rr, cy + Math.sin(ang) * rr); } + c.closePath(); c.fill(); c.restore(); + } + }, + 'japon': { + // soleil levant derrière l'orbe, points rose sakura et encre + point: (i, p, x, y, z, lime, a) => [i % 3 === 0 ? '255,183,197' : (lime ? LIME : INK), a * (i % 3 === 0 ? 1.3 : 1), i % 3 === 0 ? 1.2 : 1], + under: (c, cx, cy, R, t, k) => { + const g = c.createRadialGradient(cx, cy, R * 0.1, cx, cy, R * 0.62); + g.addColorStop(0, 'rgba(220,40,40,' + 0.55 * k + ')'); g.addColorStop(0.85, 'rgba(200,30,30,' + 0.42 * k + ')'); g.addColorStop(1, 'rgba(200,30,30,0)'); + c.fillStyle = g; c.beginPath(); c.arc(cx, cy, R * 0.62, 0, 6.283); c.fill(); + } + }, + 'hack': { + // radar : un balayage tourne, les points s'allument à son passage puis s'éteignent + point: (i, p, x, y, z, lime, a, t) => { + const sweep = (t * 1.4) % 6.283, ang = (Math.atan2(y, x) + 6.283) % 6.283; + const d = (sweep - ang + 6.283) % 6.283, hit = d < 0.9 ? 1 - d / 0.9 : 0; + return hit > 0 ? ['220,255,230', Math.min(1, a + hit * 0.8), 1 + hit * 0.9] : [LIME, a * 0.55, 1]; + }, + over: (c, cx, cy, R, t, k, C) => { + const sweep = (t * 1.4) % 6.283; + c.save(); + c.strokeStyle = 'rgba(' + C.LIME + ',' + 0.18 * k + ')'; c.lineWidth = 1; + [0.35, 0.7, 1.02].forEach(r => { c.beginPath(); c.arc(cx, cy, R * r, 0, 6.283); c.stroke(); }); + c.beginPath(); c.moveTo(cx - R * 1.1, cy); c.lineTo(cx + R * 1.1, cy); c.moveTo(cx, cy - R * 1.1); c.lineTo(cx, cy + R * 1.1); c.stroke(); + const g = c.createConicGradient ? c.createConicGradient(sweep - 0.9, cx, cy) : null; + if (g) { + g.addColorStop(0, 'rgba(' + C.LIME + ',0)'); g.addColorStop(0.143, 'rgba(' + C.LIME + ',' + 0.22 * k + ')'); g.addColorStop(0.1431, 'rgba(' + C.LIME + ',0)'); g.addColorStop(1, 'rgba(' + C.LIME + ',0)'); + c.fillStyle = g; c.beginPath(); c.arc(cx, cy, R * 1.02, 0, 6.283); c.fill(); + } + c.strokeStyle = 'rgba(' + C.LIME + ',' + 0.8 * k + ')'; c.lineWidth = 1.5; + c.beginPath(); c.moveTo(cx, cy); c.lineTo(cx + Math.cos(sweep) * R * 1.02, cy + Math.sin(sweep) * R * 1.02); c.stroke(); + c.restore(); + } + }, + 'black-friday': { + point: (i, p, x, y, z, lime, a) => [lime || i % 3 === 0 ? LIME : INK, a * 1.1, 1], + over: (c, cx, cy, R, t, k, C) => { + const ax = cx + R * 0.62, ay = cy - R * 0.8, sw = Math.sin(t * 1.6) * 0.08; + c.strokeStyle = 'rgba(' + C.INK + ',' + 0.6 * k + ')'; c.lineWidth = 1.2; + c.beginPath(); c.moveTo(ax, ay); c.lineTo(ax + R * 0.18, ay + R * 0.3); c.stroke(); + c.save(); c.translate(ax + R * 0.18, ay + R * 0.3); c.rotate(sw); tag(c, 0, 0, R * 0.62, R * 0.24, '-100 %', C, k); c.restore(); + } + } + }; + const GOLD_ = () => GOLD; + function facePath(cx, cy, R) { + const P = (x, y) => [cx + x * R, cy + y * R]; + ctx.beginPath(); + [EYE_L, EYE_R, NOSE].forEach(tri => { tri.forEach((v, i) => ctx[i ? 'lineTo' : 'moveTo'](...P(v[0], v[1]))); ctx.closePath(); }); + const top = [], bot = []; + for (let k = 0; k <= 24; k++) { const x = -0.64 + k * 0.64 * 2 / 24, [t, b] = smile(x); top.push([x, t]); bot.push([x, b]); } + // contour de la bouche avec deux dents en haut et une en bas + ctx.moveTo(...P(top[0][0], top[0][1])); + top.forEach(([x, t]) => { + const tooth = Math.abs(Math.abs(x) - 0.22) < 0.07; + ctx.lineTo(...P(x, tooth ? t + 0.09 : t)); + }); + bot.reverse().forEach(([x, b]) => ctx.lineTo(...P(x, Math.abs(x) < 0.08 ? b - 0.09 : b))); + ctx.closePath(); + } + + function size() { + const dpr = Math.min(devicePixelRatio || 1, 2); + cw = innerWidth; ch = innerHeight; + cv.width = cw * dpr; cv.height = ch * dpr; + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + } + function state() { + const vh = innerHeight; let s = A, t; + if ((t = top(secs.works)) !== null) s = mix(s, B, ease(c01(1 - t / vh))); + if ((t = top(secs.about)) !== null) s = mix(s, C, ease(c01((vh - t) / (vh * 0.9)))); + if ((t = top(secs.cta)) !== null) s = mix(s, D, ease(c01((vh - t) / (vh * 0.9)))); + // Mobile : orbe recentrée et un peu plus petite + if (cw < 720) s = [s[0] * 0.5 + 0.25, s[1] * 0.8, s[2] * 0.85, s[3], s[4] * 0.8]; + return s; + } + function draw(t) { + ctx.clearRect(0, 0, cw, ch); + const S = document.documentElement.getAttribute('data-season') || ''; + const [fx, fy, fr, spread, ga] = state(); + let cx = cw * fx, cy = ch * fy, R = Math.min(cw, ch) * fr; + if (S) { R *= 0.88; cy += R * 0.17; } // saison : orbe un peu plus basse pour que l'attache de la boule de Noël sorte de sous la barre + const H = SEASON[S], C = { LIME, INK, GOLD }, sol = ga * Math.max(0, 1 - spread * 2.2); + if (H && H.pulse) R *= H.pulse(t); + const kx = H && H.shape ? H.shape[0] : 1, ky = H && H.shape ? H.shape[1] : 1; + // Orientation neutre tant que la souris/le doigt n'a pas bougé (chargement, mobile) + const has = m.x > -9000, sx = has ? (m.x - cx) / cw : 0, sy = has ? (m.y - cy) / ch : 0; + const rY = t * 0.35 + sx * 1.2, rX = 0.35 + sy * 0.8; + const cY = Math.cos(rY), sY = Math.sin(rY), cX = Math.cos(rX), sX = Math.sin(rX); + const g = ctx.createRadialGradient(cx, cy, R * 0.2, cx, cy, R * 1.6); + g.addColorStop(0, 'rgba(' + LIME + ',' + 0.08 * ga * (1 - spread * 0.8) + ')'); + g.addColorStop(1, 'rgba(' + LIME + ',0)'); + ctx.fillStyle = g; ctx.fillRect(cx - R * 2, cy - R * 2, R * 4, R * 4); + if (H && H.under && sol > 0.01) H.under(ctx, cx, cy, R, t, sol, C); + for (let i = 0; i < N; i++) { + const p = pts[i]; + let x = p[0] * cY + p[2] * sY, z = -p[0] * sY + p[2] * cY; + const y = p[1] * cX - z * sX; z = p[1] * sX + z * cX; + const f = 2.4 / (2.4 + z); + let px = cx + x * kx * R * f + rx[i] * spread * cw * 0.42; + let py = cy + y * ky * R * f + ry[i] * spread * ch * 0.42; + let boost = 0; + const dx = px - m.x, dy = py - m.y, d2 = dx * dx + dy * dy; + if (d2 < 32400) { // répulsion souris, rayon 180px + const d = Math.sqrt(d2) || 1, k = (1 - d / 180) * 46; + px += dx / d * k; py += dy / d * k; boost = 1 - d / 180; + } + const s = Math.max(0.4, (1 - z) * 1.5) + boost * 2.4; + const a = Math.max(0.05, (1 - z) * 0.5) * ga + boost * 0.55; + const lime = boost > 0.15 || p[1] > 0.72 || x > 0.85; + if (H && H.point) { + const r = H.point(i, p, x, y, z, lime, a, t); + if (r) { ctx.fillStyle = 'rgba(' + r[0] + ',' + Math.min(r[1], 1) + ')'; ctx.beginPath(); ctx.arc(px, py, s * (r[2] || 1), 0, 6.283); ctx.fill(); continue; } + } + if (S === 'halloween') { + // citrouille : points orangés, le visage reste vide (la lueur est dessinée après) + if (z < 0.1 && spread < 0.5 && inFace((px - cx) / R, (py - cy) / R)) continue; + ctx.fillStyle = 'rgba(' + (lime ? LIME : (i % 3 ? LIME : INK)) + ',' + Math.min(a * (lime ? 1.3 : 0.85), 1) + ')'; + ctx.beginPath(); ctx.arc(px, py, s, 0, 6.283); ctx.fill(); + continue; + } + if (S === 'noel' && Math.abs(Math.abs(p[1]) - 0.3) < 0.075) { + // boule de Noël : deux bandes dorées qui scintillent + const tw = 0.6 + 0.4 * Math.sin(t * 3 + i); + ctx.fillStyle = 'rgba(' + GOLD + ',' + Math.min((a + 0.3 * ga) * tw, 1) + ')'; + ctx.beginPath(); ctx.arc(px, py, s * 1.15, 0, 6.283); ctx.fill(); + continue; + } + ctx.fillStyle = lime ? 'rgba(' + LIME + ',' + Math.min(a + 0.25 * ga, 1) + ')' : 'rgba(' + INK + ',' + a + ')'; + ctx.beginPath(); ctx.arc(px, py, s, 0, 6.283); ctx.fill(); + } + const solid = sol; // décor visible tant que l'orbe n'est pas éclatée + if (H && H.over && solid > 0.01) H.over(ctx, cx, cy, R, t, solid, C); + if (S === 'halloween' && solid > 0.01) { + // lueur de bougie qui vacille + const fl = 0.78 + 0.14 * Math.sin(t * 9) + 0.08 * Math.sin(t * 23 + 1.3); + ctx.save(); + facePath(cx, cy, R); + const fg = ctx.createRadialGradient(cx, cy + R * 0.1, R * 0.05, cx, cy + R * 0.1, R * 0.8); + fg.addColorStop(0, 'rgba(255,236,150,' + solid * fl + ')'); + fg.addColorStop(1, 'rgba(' + LIME + ',' + solid * fl * 0.9 + ')'); + ctx.shadowColor = 'rgba(' + LIME + ',' + solid + ')'; ctx.shadowBlur = 28 * fl; + ctx.fillStyle = fg; ctx.fill(); + ctx.restore(); + } + if (S === 'noel' && solid > 0.01) { + // attache dorée et fil qui pend depuis le haut de l'écran + const w = R * 0.3, h = R * 0.15, top = cy - R * 1.02; + ctx.strokeStyle = 'rgba(' + INK + ',' + 0.3 * solid + ')'; ctx.lineWidth = 1; + ctx.beginPath(); ctx.moveTo(cx, 0); ctx.lineTo(cx, top - h - R * 0.08); ctx.stroke(); + ctx.strokeStyle = 'rgba(' + GOLD + ',' + solid + ')'; ctx.lineWidth = Math.max(1.5, R * 0.02); + ctx.beginPath(); ctx.ellipse(cx, top - h - R * 0.04, R * 0.05, R * 0.06, 0, 0, 6.283); ctx.stroke(); + const cg = ctx.createLinearGradient(cx - w / 2, 0, cx + w / 2, 0); + cg.addColorStop(0, 'rgba(' + GOLD + ',' + 0.55 * solid + ')'); cg.addColorStop(0.45, 'rgba(255,240,200,' + solid + ')'); cg.addColorStop(1, 'rgba(' + GOLD + ',' + 0.5 * solid + ')'); + ctx.fillStyle = cg; ctx.fillRect(cx - w / 2, top - h, w, h); + } + if (spread < 0.6) { + ctx.strokeStyle = 'rgba(' + LIME + ',' + 0.22 * ga * (1 - spread) + ')'; + ctx.lineWidth = 1; ctx.beginPath(); + ctx.ellipse(cx, cy, R * 1.3, R * 0.4, -0.3 + sx * 0.3, 0, 6.283); ctx.stroke(); + } + } + function loop(ms) { if (!run) return; try { draw(ms / 1000); } catch (e) {} requestAnimationFrame(loop); } + return { + init(sel, opts) { + cv = document.querySelector(sel); if (!cv) return; + ctx = cv.getContext('2d'); + const o = (opts && opts.sections) || {}; + secs = { works: document.querySelector(o.works), about: document.querySelector(o.about), cta: document.querySelector(o.cta) }; + readColors(); addEventListener('yb:theme', () => { readColors(); if (!run) draw(0); }); + size(); addEventListener('resize', size); + addEventListener('mousemove', e => { m.x = e.clientX; m.y = e.clientY; }); + addEventListener('touchmove', e => { const t = e.touches[0]; m.x = t.clientX; m.y = t.clientY; }, { passive: true }); + addEventListener('touchend', () => { m.x = m.y = -9999; }); + if (document.documentElement.classList.contains('yb-static')) { draw(0); return; } // ?ybstatic=1 : image fixe + run = true; requestAnimationFrame(loop); + }, + destroy() { run = false; } + }; +})(); diff --git a/assets/js/seasons.js b/assets/js/seasons.js new file mode 100644 index 0000000..1cd1d94 --- /dev/null +++ b/assets/js/seasons.js @@ -0,0 +1,813 @@ +/* seasons.js : décor animé des thèmes saisonniers (html[data-season]). + Halloween : chauves-souris, braises, brume, araignée suspendue, toiles, chapeau de sorcière. + Noël : neige qui fuit la souris, guirlande lumineuse sous la barre, bonnet sur le logo. + Bouton [data-season-toggle] : coupe / remet le décor (localStorage yb-season=off). */ +window.YBSeason = (function () { + const root = document.documentElement; + const NS = 'http://www.w3.org/2000/svg'; + /* Comme le reste du portfolio (choix « toujours animé ») : seul ?ybstatic=1 fige le décor. + Le réglage système « réduire les animations » coupe seulement le glitch au clic (flash). */ + const CALM = typeof YB_STATIC !== 'undefined' && YB_STATIC; + const REDUCED = matchMedia('(prefers-reduced-motion: reduce)').matches; + let season = '', built = false, run = false, cv, ctx, cw = 0, ch = 0, raf = 0; + let gen = 0, timers = [], clickFx = null, resizeFx = null; // remis à zéro à chaque changement de fête + const m = { x: -9999, y: -9999, vx: 0 }; + let INK = '245,245,240', LIME = '255,123,28', S2 = '242,193,78', BG = '10,10,10', LIGHT = false; + + /* Quantité réglée dans l'admin (Profil → Saisons), en % par fête : multiplie les nombres, divise les délais */ + const D = () => { const d = ((window.YB_SEASONS || {}).density || {})[season]; return d === undefined ? 1 : Math.max(0, d) / 100; }; + const iv = ms => D() > 0 ? ms / D() : Infinity; + const el = (tag, cls, html) => { const e = document.createElement(tag); if (cls) e.className = cls; if (html) e.innerHTML = html; return e; }; + const rnd = (a, b) => a + Math.random() * (b - a); + function colors() { + const cs = getComputedStyle(root); + INK = cs.getPropertyValue('--ink-rgb').trim() || INK; + LIME = cs.getPropertyValue('--lime-rgb').trim() || LIME; + S2 = cs.getPropertyValue('--season-2-rgb').trim() || S2; + BG = cs.getPropertyValue('--bg-rgb').trim() || BG; + LIGHT = root.getAttribute('data-theme') === 'light'; + } + function size() { + const dpr = Math.min(devicePixelRatio || 1, 2); + cw = innerWidth; ch = innerHeight; + cv.width = cw * dpr; cv.height = ch * dpr; ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + } + + /* ── Halloween ─────────────────────────────────────────────────── */ + const HAT_WITCH = ''; + const SPIDER = ''; + /* Toile : rayons depuis le coin + fils qui s'affaissent entre deux rayons */ + const WEB = (() => { + const rays = [0, 0.3, 0.62, 0.95, 1.26, Math.PI / 2], L = 150; + let d = rays.map(a => 'M0 0L' + (Math.cos(a) * L).toFixed(1) + ' ' + (Math.sin(a) * L).toFixed(1)).join(''); + for (let r = 22; r < 140; r += 20 + r * 0.12) for (let i = 0; i < rays.length - 1; i++) { + const a1 = rays[i], a2 = rays[i + 1], am = (a1 + a2) / 2, rm = r * 0.86; + d += 'M' + (Math.cos(a1) * r).toFixed(1) + ' ' + (Math.sin(a1) * r).toFixed(1) + 'Q' + (Math.cos(am) * rm).toFixed(1) + ' ' + (Math.sin(am) * rm).toFixed(1) + ' ' + (Math.cos(a2) * r).toFixed(1) + ' ' + (Math.sin(a2) * r).toFixed(1); + } + return ''; + })(); + let bats = [], embers = [], spider, nextBats = 0; + + function spawnBats(n, x0, y0) { + const fromLeft = x0 === undefined ? Math.random() < 0.5 : x0 < cw / 2; + for (let i = 0; i < n; i++) bats.push({ + x: x0 !== undefined ? x0 + rnd(-20, 20) : (fromLeft ? -40 - i * 50 : cw + 40 + i * 50), + y: y0 !== undefined ? y0 + rnd(-20, 20) : rnd(ch * 0.12, ch * 0.55) + rnd(-30, 30), + vx: (fromLeft ? 1 : -1) * rnd(2.2, 3.6), vy: x0 !== undefined ? rnd(-3, -1.2) : 0, + s: rnd(9, 17), ph: rnd(0, 6.28), f: rnd(0.24, 0.34), wob: rnd(0, 6.28) + }); + } + function drawBat(b) { + const fl = Math.sin(b.ph), s = b.s, wy = fl * s * 0.9; + ctx.save(); ctx.translate(b.x, b.y); if (b.vx < 0) ctx.scale(-1, 1); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.quadraticCurveTo(-s * 0.6, -wy - s * 0.2, -s * 1.6, -wy); + ctx.quadraticCurveTo(-s * 1.2, -wy * 0.3 + s * 0.15, -s * 1.1, s * 0.25 - wy * 0.2); + ctx.quadraticCurveTo(-s * 0.7, s * 0.05, -s * 0.5, s * 0.35); + ctx.quadraticCurveTo(-s * 0.3, s * 0.15, 0, s * 0.4); + ctx.quadraticCurveTo(s * 0.3, s * 0.15, s * 0.5, s * 0.35); + ctx.quadraticCurveTo(s * 0.7, s * 0.05, s * 1.1, s * 0.25 - wy * 0.2); + ctx.quadraticCurveTo(s * 1.2, -wy * 0.3 + s * 0.15, s * 1.6, -wy); + ctx.quadraticCurveTo(s * 0.6, -wy - s * 0.2, 0, 0); + ctx.fill(); + ctx.beginPath(); ctx.ellipse(0, s * 0.12, s * 0.22, s * 0.32, 0, 0, 6.283); ctx.fill(); // corps + ctx.beginPath(); ctx.moveTo(-s * 0.16, -s * 0.12); ctx.lineTo(-s * 0.1, -s * 0.34); ctx.lineTo(-s * 0.02, -s * 0.14); + ctx.moveTo(s * 0.16, -s * 0.12); ctx.lineTo(s * 0.1, -s * 0.34); ctx.lineTo(s * 0.02, -s * 0.14); ctx.fill(); // oreilles + ctx.restore(); + } + function halloweenFrame(now) { + ctx.clearRect(0, 0, cw, ch); + // braises qui montent de la brume + for (const e of embers) { + e.y -= e.v; e.x += Math.sin(now / 900 + e.ph) * 0.35; + if (e.y < ch * 0.35) { e.y = ch + 10; e.x = rnd(0, cw); } + const life = Math.min(1, (ch - e.y) / 80) * Math.min(1, (e.y - ch * 0.35) / (ch * 0.25)); + ctx.fillStyle = 'rgba(' + LIME + ',' + (0.55 * life * (0.6 + 0.4 * Math.sin(now / 200 + e.ph))) + ')'; + ctx.beginPath(); ctx.arc(e.x, e.y, e.r, 0, 6.283); ctx.fill(); + } + // vols de chauves-souris, qui s'écartent de la souris + if (now > nextBats) { spawnBats(Math.round(rnd(2, 5))); nextBats = now + iv(rnd(9000, 16000)); } + ctx.fillStyle = 'rgba(' + INK + ',' + (LIGHT ? 0.82 : 0.6) + ')'; + bats = bats.filter(b => b.x > -200 && b.x < cw + 200 && b.y > -200); + for (const b of bats) { + const dx = b.x - m.x, dy = b.y - m.y, d = Math.hypot(dx, dy); + if (d < 140) { b.vy += dy / d * 0.5; b.vx += dx / d * 0.25; } + b.vy = b.vy * 0.96 + Math.sin(b.wob += 0.05) * 0.06; + b.x += b.vx; b.y += b.vy; b.ph += b.f * 1.5; + drawBat(b); + } + } + function buildHalloween() { + const logo = document.querySelector('.site-nav__logo'); + if (logo) logo.prepend(el('span', 'season-hat season-deco', HAT_WITCH)); + const fog = el('div', 'season-fog season-deco', ''); fog.setAttribute('aria-hidden', 'true'); + document.body.appendChild(fog); + spider = el('div', 'season-spider season-deco', '' + SPIDER); + spider.setAttribute('aria-hidden', 'true'); document.body.appendChild(spider); + const flee = () => { + if (spider.classList.contains('is-fleeing')) return; + spider.classList.add('is-fleeing'); spider.style.setProperty('--drop', '0px'); + setTimeout(() => { spider.classList.remove('is-fleeing'); dropSpider(); }, 2600); + }; + spider.querySelector('svg').addEventListener('pointerenter', flee); + spider.querySelector('svg').addEventListener('click', flee); + dropSpider(); + const foot = document.querySelector('.site-footer'); + if (foot) { foot.prepend(el('span', 'season-web season-deco', WEB)); foot.prepend(el('span', 'season-web season-web--r season-deco', WEB)); } + for (let i = 0; i < Math.round(Math.min(34, innerWidth / 45) * D()); i++) embers.push({ x: rnd(0, innerWidth), y: rnd(innerHeight * 0.4, innerHeight), v: rnd(0.25, 0.7), r: rnd(0.8, 2.1), ph: rnd(0, 6.28) }); + nextBats = performance.now() + 1500; + clickFx = (x, y) => spawnBats(3, x, y); // clic dans le vide : une petite nuée s'envole du curseur + } + function dropSpider() { + if (!spider || spider.classList.contains('is-fleeing')) return; + const nav = (document.querySelector('.site-nav') || {}).offsetHeight || 70; + const k = Math.min(1, scrollY / 900); + spider.style.setProperty('--drop', Math.round(nav + 40 + k * innerHeight * 0.32) + 'px'); + } + + /* ── Noël ──────────────────────────────────────────────────────── */ + const HAT_SANTA = ''; + const BULBS = ['var(--lime)', 'var(--season-2)', '#3ddc84', '#7cc8ff', '#fff3c4']; + let flakes = []; + function buildLights() { + const nav = document.querySelector('.site-nav'); if (!nav) return; + let box = nav.querySelector('.season-lights'); + if (!box) { box = el('div', 'season-lights season-deco'); box.setAttribute('aria-hidden', 'true'); nav.appendChild(box); } + box.innerHTML = ''; + const W = nav.clientWidth, span = W < 720 ? 110 : 150, n = Math.max(2, Math.round(W / span)), sw = W / n, sag = 16; + const svg = document.createElementNS(NS, 'svg'), path = document.createElementNS(NS, 'path'); + let d = 'M0 2'; + for (let i = 0; i < n; i++) d += ' Q' + (i * sw + sw / 2) + ' ' + (2 + sag * 2) + ' ' + ((i + 1) * sw) + ' 2'; + path.setAttribute('d', d); svg.appendChild(path); box.appendChild(svg); + let k = 0; + for (let i = 0; i < n; i++) for (let j = 1; j <= 3; j++) { + const u = j / 4, x = i * sw + sw * u, y = 2 + 2 * u * (1 - u) * sag * 2; // point sur la courbe + const b = el('span', 'season-bulb'); + b.style.cssText = 'left:' + x + 'px;top:' + y + 'px;--c:' + BULBS[k % BULBS.length] + ';--d:' + (-(k % 7) * 0.35) + 's;--r:' + ((u - 0.5) * -40) + 'deg'; + box.appendChild(b); k++; + } + } + function makeFlakes() { + const n = Math.round(Math.min(170, cw * ch / 9000) * D()); + flakes = Array.from({ length: n }, () => newFlake(true)); + } + function newFlake(any) { + const r = Math.random() < 0.1 ? rnd(3.5, 6) : rnd(0.8, 2.6); + return { x: rnd(0, cw), y: any ? rnd(-ch, ch) : rnd(-60, -10), r, v: 0.35 + r * 0.22, ph: rnd(0, 6.28), sw: rnd(0.3, 1.1), dx: 0, rot: rnd(0, 6.28) }; + } + function crystal(f) { + ctx.save(); ctx.translate(f.x, f.y); ctx.rotate(f.rot); ctx.beginPath(); + for (let a = 0; a < 6; a++) { + ctx.moveTo(0, 0); ctx.lineTo(0, f.r * 1.6); + ctx.moveTo(-f.r * 0.45, f.r); ctx.lineTo(0, f.r * 1.25); ctx.lineTo(f.r * 0.45, f.r); + ctx.rotate(Math.PI / 3); + } + ctx.stroke(); ctx.restore(); + } + function noelFrame(now) { + ctx.clearRect(0, 0, cw, ch); + const col = LIGHT ? '120,140,165' : '255,255,255'; + m.vx *= 0.94; + ctx.lineWidth = 1; ctx.lineCap = 'round'; + for (let i = 0; i < flakes.length; i++) { + const f = flakes[i]; + const dx = f.x - m.x, dy = f.y - m.y, d2 = dx * dx + dy * dy; + if (d2 < 14400) { const d = Math.sqrt(d2) || 1, k = (1 - d / 120) * 2.2; f.dx += dx / d * k; f.y += dy / d * k * 0.5; } + f.dx = f.dx * 0.95 + m.vx * 0.012 * f.r; + f.y += f.v; f.x += Math.sin(now / 1400 + f.ph) * f.sw + f.dx * 0.15; f.rot += 0.004; + if (f.y > ch + 10 || f.x < -30 || f.x > cw + 30) { flakes[i] = newFlake(false); continue; } + const a = (f.r > 3 ? 0.7 : 0.35 + f.r * 0.18) * (LIGHT ? 0.9 : 1); + if (f.r > 3) { ctx.strokeStyle = 'rgba(' + col + ',' + a + ')'; crystal(f); } + else { ctx.fillStyle = 'rgba(' + col + ',' + a + ')'; ctx.beginPath(); ctx.arc(f.x, f.y, f.r, 0, 6.283); ctx.fill(); } + } + } + function buildNoel() { + const logo = document.querySelector('.site-nav__logo'); + if (logo) logo.prepend(el('span', 'season-hat season-deco', HAT_SANTA)); + buildLights(); + resizeFx = () => { buildLights(); makeFlakes(); }; + makeFlakes(); + } + + /* ── Moteurs partagés ──────────────────────────────────────────── */ + /* Feux d'artifice : fusées depuis le bas, gerbes avec gravité ; clic dans le vide = gerbe au curseur */ + let rockets = [], sparks = [], nextRocket = 0, fwPal = () => ['255,255,255']; + function burst(x, y, pal) { + const n = Math.round(rnd(50, 80)), col = pal[Math.floor(Math.random() * pal.length)], ring = Math.random() < 0.3; + for (let i = 0; i < n; i++) { + const ang = (i / n) * 6.283 + rnd(-0.05, 0.05), sp = ring ? 3.4 : rnd(0.8, 4.2); + sparks.push({ x, y, vx: Math.cos(ang) * sp, vy: Math.sin(ang) * sp, life: 1, dec: rnd(0.011, 0.02), c: Math.random() < 0.2 ? pal[Math.floor(Math.random() * pal.length)] : col }); + } + } + function fireworksFrame(now, rate) { + if (now > nextRocket) { + const x = rnd(cw * 0.1, cw * 0.9); + rockets.push({ x, y: ch + 5, vx: rnd(-0.6, 0.6), vy: -Math.sqrt(2 * 0.12 * rnd(ch * 0.45, ch * 0.8)) }); + nextRocket = now + iv(rnd(rate * 0.5, rate * 1.4)); + } + ctx.globalCompositeOperation = LIGHT ? 'source-over' : 'lighter'; + rockets = rockets.filter(r => { + r.x += r.vx; r.y += r.vy; r.vy += 0.12; + ctx.strokeStyle = 'rgba(' + INK + ',.6)'; ctx.lineWidth = 1.6; + ctx.beginPath(); ctx.moveTo(r.x, r.y); ctx.lineTo(r.x - r.vx * 4, r.y - r.vy * 4); ctx.stroke(); + if (r.vy >= -0.4) { burst(r.x, r.y, fwPal()); return false; } + return true; + }); + ctx.lineWidth = 1.8; ctx.lineCap = 'round'; + sparks = sparks.filter(p => { + p.vx *= 0.985; p.vy = p.vy * 0.985 + 0.045; p.x += p.vx; p.y += p.vy; p.life -= p.dec; + if (p.life <= 0) return false; + ctx.strokeStyle = 'rgba(' + p.c + ',' + p.life + ')'; + ctx.beginPath(); ctx.moveTo(p.x, p.y); ctx.lineTo(p.x - p.vx * 3, p.y - p.vy * 3); ctx.stroke(); + return true; + }); + ctx.globalCompositeOperation = 'source-over'; + } + /* Objets qui tombent (ou montent si dir = -1) en tournoyant, écartés par la souris */ + let drift = []; + function driftFill(n, make) { drift = Array.from({ length: Math.round(n * D()) }, () => Object.assign(make(), { y: rnd(-ch, ch) })); } + function driftFrame(now, make, draw) { + for (let i = 0; i < drift.length; i++) { + const f = drift[i]; + const dx = f.x - m.x, dy = f.y - m.y, d2 = dx * dx + dy * dy; + if (d2 < 14400) { const d = Math.sqrt(d2) || 1, k = (1 - d / 120) * 2.2; f.x += dx / d * k; f.y += dy / d * k * 0.5; } + f.y += f.v * (f.dir || 1); f.x += Math.sin(now / 1400 + f.ph) * f.sw; f.rot += f.vr; + if (f.y > ch + 40 || f.y < -60 || f.x < -60 || f.x > cw + 60) { drift[i] = make(); continue; } + ctx.save(); ctx.translate(f.x, f.y); ctx.rotate(f.rot); draw(f); ctx.restore(); + } + } + const fall = (o) => Object.assign({ x: rnd(0, cw), y: rnd(-60, -20), v: rnd(0.5, 1.2), ph: rnd(0, 6.28), sw: rnd(0.2, 0.8), rot: rnd(0, 6.28), vr: rnd(-0.02, 0.02) }, o); + const rise = (o) => Object.assign(fall(o), { y: ch + rnd(10, 40), dir: -1 }); + function pill(html) { + let p = document.querySelector('.season-pill'); + if (!p) { p = el('div', 'season-pill season-deco'); p.setAttribute('aria-live', 'polite'); document.body.appendChild(p); } + p.innerHTML = html; return p; + } + const onEmptyClick = fn => { clickFx = fn; }; + function hat(svg) { const logo = document.querySelector('.site-nav__logo'); if (logo) logo.prepend(el('span', 'season-hat season-deco', svg)); } + + /* ── Nouvel An : feux d'artifice or et argent, compte à rebours ─── */ + const HAT_PARTY = ''; + function buildNouvelAn() { + hat(HAT_PARTY); + fwPal = () => LIGHT ? ['138,100,0', '85,96,122', '176,18,42'] : ['242,193,78', '255,240,200', '217,221,232', '255,255,255']; + const p = pill(''), pad = n => String(n).padStart(2, '0'); + let wasCount = false; + const tick = () => { + const now = new Date(), y = now.getFullYear(); + if (now.getMonth() === 0) { + p.innerHTML = 'BONNE ANNÉE ' + y + ' ✦'; + if (wasCount) for (let i = 0; i < 6; i++) setTimeout(() => burst(rnd(cw * 0.2, cw * 0.8), rnd(ch * 0.15, ch * 0.5), fwPal()), i * 250); // minuit ! + wasCount = false; + } else { + const s = Math.floor((new Date(y + 1, 0, 1) - now) / 1000), d = Math.floor(s / 86400); + p.innerHTML = '' + (y + 1) + ' DANS ' + (d ? d + ' J ' : '') + '' + pad(Math.floor(s / 3600) % 24) + ':' + pad(Math.floor(s / 60) % 60) + ':' + pad(s % 60) + ''; + wasCount = true; + } + }; + tick(); timers.push(setInterval(tick, 1000)); + onEmptyClick((x, y) => burst(x, y, fwPal())); + } + + /* ── 14 juillet : feux d'artifice tricolores, cocarde ─────────── */ + const HAT_COCKADE = ''; + function buildJuillet() { + hat(HAT_COCKADE); + fwPal = () => LIGHT ? ['31,63,168', '200,16,46', '120,130,150'] : ['60,110,255', '255,255,255', '255,60,80']; + onEmptyClick((x, y) => burst(x, y, fwPal())); + } + + /* ── Saint-Patrick : trèfles qui tombent, chapeau de lutin ─────── */ + const HAT_LEPRE = ''; + function clover(f) { + const r = f.r, col = f.gold ? 'rgba(242,193,78,.9)' : 'rgba(' + LIME + ',' + f.a + ')'; + ctx.fillStyle = col; + for (let k = 0; k < (f.gold ? 4 : 3); k++) { + ctx.rotate(6.283 / (f.gold ? 4 : 3)); + ctx.beginPath(); ctx.arc(-r * 0.32, -r * 0.62, r * 0.42, 0, 6.283); ctx.arc(r * 0.32, -r * 0.62, r * 0.42, 0, 6.283); ctx.fill(); + } + ctx.strokeStyle = col; ctx.lineWidth = Math.max(1, r * 0.14); ctx.beginPath(); ctx.moveTo(0, 0); ctx.quadraticCurveTo(r * 0.3, r * 0.8, r * 0.1, r * 1.3); ctx.stroke(); + } + const makeClover = () => fall({ r: rnd(5, 11), a: rnd(0.35, 0.75), gold: Math.random() < 0.05 }); + function buildStPatrick() { hat(HAT_LEPRE); driftFill(Math.min(46, Math.round(cw / 32)), makeClover); } + + /* ── Pâques : pétales, oreilles de lapin, chasse aux œufs ──────── */ + const HAT_BUNNY = ''; + const EGG_COLS = [['#ff9fcb', '#fff1a8'], ['#8ee6c2', '#ff9fcb'], ['#bfa2ff', '#fff1a8'], ['#ffd36e', '#8ec9ff'], ['#8ec9ff', '#ffffff']]; + const eggSvg = c => ''; + function petal(f) { ctx.fillStyle = 'rgba(' + f.c + ',' + f.a + ')'; ctx.beginPath(); ctx.ellipse(0, 0, f.r, f.r * 0.55, 0, 0, 6.283); ctx.fill(); } + const makePetal = () => fall({ r: rnd(3, 6.5), a: rnd(0.35, 0.7), c: ['255,159,203', '255,210,230', '190,160,255', '142,230,194'][Math.floor(Math.random() * 4)], vr: rnd(-0.04, 0.04) }); + function buildPaques() { + hat(HAT_BUNNY); + driftFill(Math.min(36, Math.round(cw / 40)), makePetal); + const total = 3, H = document.documentElement.scrollHeight; let found = 0; + const say = () => pill(found < total ? '' + (total - found) + ' ŒUF' + (total - found > 1 ? 'S' : '') + ' CACHÉ' + (total - found > 1 ? 'S' : '') + ' SUR CETTE PAGE' : 'BRAVO, TOUS TROUVÉS ✦'); + say(); + for (let i = 0; i < total; i++) { + const b = el('button', 'season-egg season-deco', eggSvg(EGG_COLS[i % EGG_COLS.length])); + b.type = 'button'; b.setAttribute('aria-label', 'Œuf de Pâques caché'); + b.style.cssText = 'left:' + rnd(4, 92) + '%;top:' + Math.round(rnd(0.12 + i * 0.28, 0.36 + i * 0.28) * (H - 120)) + 'px;--r:' + rnd(-30, 30) + 'deg'; + b.addEventListener('click', () => { + if (b.classList.contains('is-found')) return; + b.classList.add('is-found'); found++; say(); + const r = b.getBoundingClientRect(); burst(r.left + 13, r.top + 17, PASTELS); + if (found === total) for (let k = 0; k < 5; k++) setTimeout(() => burst(rnd(cw * 0.2, cw * 0.8), rnd(ch * 0.2, ch * 0.6), PASTELS), k * 220); + }); + document.body.appendChild(b); + } + } + const PASTELS = ['255,159,203', '142,230,194', '255,222,120', '190,160,255', '140,200,255']; + function paquesFrame(now) { driftFrame(now, makePetal, petal); fireworksFrame(now, 1e12); } + + /* ── Poisson d'avril : bancs de poissons, bulles, poisson collé ── */ + const FISH = (c1, c2) => ''; + const HAT_FISH = '' + FISH('rgb(var(--lime-rgb))', 'rgb(var(--season-2-rgb))').replace(/<\/?svg[^>]*>/g, '') + ''; + let fishes = [], nextFish = 0; + function drawFish(f) { + const s = f.s, w = Math.sin(f.ph) * s * 0.25; + ctx.save(); ctx.translate(f.x, f.y); if (f.vx < 0) ctx.scale(-1, 1); + ctx.fillStyle = 'rgba(' + f.c + ',' + f.a + ')'; + ctx.beginPath(); ctx.ellipse(0, 0, s, s * 0.45, 0, 0, 6.283); ctx.fill(); + ctx.beginPath(); ctx.moveTo(-s * 0.85, 0); ctx.lineTo(-s * 1.5, -s * 0.45 + w); ctx.lineTo(-s * 1.5, s * 0.45 + w); ctx.closePath(); ctx.fill(); + ctx.fillStyle = 'rgba(' + BG + ',' + f.a + ')'; ctx.beginPath(); ctx.arc(s * 0.55, -s * 0.08, s * 0.1, 0, 6.283); ctx.fill(); + ctx.restore(); + } + function poissonFrame(now) { + if (now > nextFish) { + const left = Math.random() < 0.5, y = rnd(ch * 0.15, ch * 0.85), n = Math.round(rnd(3, 7)), c = Math.random() < 0.5 ? LIME : S2; + for (let i = 0; i < n; i++) fishes.push({ x: left ? -40 - i * rnd(25, 45) : cw + 40 + i * rnd(25, 45), y: y + rnd(-40, 40), vx: (left ? 1 : -1) * rnd(1.4, 2.2), s: rnd(7, 12), ph: rnd(0, 6), c, a: rnd(0.35, 0.6) }); + nextFish = now + iv(rnd(4000, 9000)); + } + fishes = fishes.filter(f => f.x > -300 && f.x < cw + 300); + for (const f of fishes) { + const dx = f.x - m.x, dy = f.y - m.y, d = Math.hypot(dx, dy); + if (d < 120) { f.y += dy / d * 2.4; f.vx += Math.sign(dx) * 0.05; } + f.x += f.vx; f.y += Math.sin(f.ph * 0.3) * 0.3; f.ph += 0.25; drawFish(f); + } + driftFrame(now, makeBubble, bubble); + } + function bubble(f) { ctx.strokeStyle = 'rgba(' + INK + ',' + f.a + ')'; ctx.lineWidth = 1; ctx.beginPath(); ctx.arc(0, 0, f.r, 0, 6.283); ctx.stroke(); } + const makeBubble = () => rise({ r: rnd(2, 6), a: rnd(0.15, 0.35), v: rnd(0.4, 1), vr: 0 }); + function buildPoisson() { + hat(HAT_FISH); + driftFill(Math.min(26, Math.round(cw / 55)), makeBubble); + nextFish = performance.now() + 800; + const paper = () => FISH(LIGHT ? '#ffd0a1' : '#ffb347', '#e56b00'); + // poisson collé au premier grand titre ; un clic le décolle + const h = document.querySelector('main h1, #yb-root h1, .hero__title'); + if (h) { + const r = h.getBoundingClientRect(), t = el('div', 'season-fish season-fish--tape season-deco', paper()); + t.style.left = Math.min(r.right + scrollX - 50, document.documentElement.clientWidth - 90) + 'px'; t.style.top = (r.top + scrollY + r.height * 0.15) + 'px'; t.style.transform = 'rotate(-12deg)'; + t.title = 'Poisson d\'avril !'; + t.addEventListener('click', () => { t.style.transition = 'transform 1s cubic-bezier(.5,0,.8,.4), opacity 1s'; t.style.transform = 'translateY(70vh) rotate(160deg)'; t.style.opacity = '0'; pill('POISSON D\'AVRIL ! 🐟').classList.remove('is-hidden'); setTimeout(() => document.querySelector('.season-pill').classList.add('is-hidden'), 2600); }); + document.body.appendChild(t); + } + // et un autre accroché au curseur, comme dans le dos de quelqu'un (souris uniquement) + if (!matchMedia('(pointer: coarse)').matches && !CALM) { + const c = el('div', 'season-fish season-deco', paper()); document.body.appendChild(c); + let fx = -200, fy = -200, ang = 0; const g = gen; + const follow = () => { + if (g !== gen) return; + if (m.x > -9000) { const tx = m.x + 14, ty = m.y + 18; ang = ang * 0.9 + Math.max(-0.6, Math.min(0.6, (tx - fx) * 0.02)) * 0.1; fx += (tx - fx) * 0.18; fy += (ty - fy) * 0.18; } + c.style.transform = 'translate(' + fx + 'px,' + fy + 'px) rotate(' + (0.4 + ang) + 'rad)'; + requestAnimationFrame(follow); + }; + follow(); + } + } + + /* ── Fête de la musique : notes, égaliseur, clic = une note jouée ─ */ + const HAT_PHONES = ''; + function note(f) { + const r = f.r; ctx.fillStyle = ctx.strokeStyle = 'rgba(' + f.c + ',' + f.a + ')'; ctx.lineWidth = Math.max(1.2, r * 0.22); + ctx.beginPath(); ctx.ellipse(0, 0, r, r * 0.72, -0.4, 0, 6.283); ctx.fill(); + ctx.beginPath(); ctx.moveTo(r * 0.85, -r * 0.2); ctx.lineTo(r * 0.85, -r * 3.2); + if (f.dbl) { ctx.lineTo(r * 3.6, -r * 3.7); ctx.lineTo(r * 3.6, -r * 0.7); ctx.stroke(); ctx.beginPath(); ctx.ellipse(r * 2.75, -r * 0.5, r, r * 0.72, -0.4, 0, 6.283); ctx.fill(); } + else { ctx.quadraticCurveTo(r * 2.2, -r * 2.4, r * 2, -r * 1.2); ctx.stroke(); } + } + const makeNote = () => rise({ r: rnd(3.5, 6.5), a: rnd(0.3, 0.65), c: Math.random() < 0.5 ? LIME : S2, dbl: Math.random() < 0.35, v: rnd(0.5, 1.1), vr: rnd(-0.01, 0.01), rot: rnd(-0.3, 0.3) }); + let audio, eqBars = []; + function play(x) { + try { + audio = audio || new (window.AudioContext || window.webkitAudioContext)(); + const scale = [261.6, 293.7, 329.6, 392, 440, 523.3, 587.3, 659.3, 784]; + const o = audio.createOscillator(), g = audio.createGain(), t = audio.currentTime; + o.type = 'triangle'; o.frequency.value = scale[Math.min(scale.length - 1, Math.floor(x / cw * scale.length))]; + g.gain.setValueAtTime(0.0001, t); g.gain.exponentialRampToValueAtTime(0.12, t + 0.02); g.gain.exponentialRampToValueAtTime(0.0001, t + 0.9); + o.connect(g).connect(audio.destination); o.start(t); o.stop(t + 1); + } catch (e) {} + } + function buildMusique() { + hat(HAT_PHONES); + driftFill(Math.min(30, Math.round(cw / 48)), makeNote); + const eq = el('div', 'season-eq season-deco'); eq.setAttribute('aria-hidden', 'true'); + const n = Math.min(64, Math.round(innerWidth / 22)); + for (let i = 0; i < n; i++) eqBars.push(eq.appendChild(el('i'))); + document.body.appendChild(eq); + onEmptyClick((x, y) => { play(x); for (let i = 0; i < 4; i++) drift.push(Object.assign(makeNote(), { x: x + rnd(-20, 20), y: y + rnd(-10, 10), v: rnd(1, 2) })); }); + } + function musiqueFrame(now) { + driftFrame(now, makeNote, note); + if (drift.length > 60) drift.length = 60; + const t = now / 1000, beat = Math.exp(-((t * 2) % 1) * 5); + eqBars.forEach((b, i) => { + const k = i / eqBars.length, v = 0.18 + 0.32 * beat * (1 - k) + 0.25 * Math.abs(Math.sin(t * 3.1 + i * 0.7)) * Math.abs(Math.sin(t * 1.3 + i * 0.23)) + 0.12 * Math.sin(t * 7 + i); + b.style.transform = 'scaleY(' + Math.max(0.06, Math.min(1, v)).toFixed(3) + ')'; + }); + } + + /* ── Black Friday : ruban jaune et noir, étiquettes qui tombent ── */ + const HAT_TAG = '-100%'; + const PRICES = ['-30 %', '-50 %', '-70 %', '-100 %', 'OFFERT']; + function priceTag(f) { + const w = f.r * 5.2, h = f.r * 2.1; + ctx.fillStyle = 'rgba(255,212,0,' + f.a + ')'; + ctx.beginPath(); ctx.moveTo(-w / 2, -h / 2); ctx.lineTo(w / 2, -h / 2); ctx.lineTo(w / 2, h / 2); ctx.lineTo(-w / 2, h / 2); ctx.lineTo(-w / 2 - h * 0.45, 0); ctx.closePath(); ctx.fill(); + ctx.fillStyle = 'rgba(11,11,11,' + f.a + ')'; ctx.font = '800 ' + Math.round(h * 0.5) + 'px "JetBrains Mono", monospace'; + ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillText(f.t, 0, 1); + } + const makeTag = () => fall({ r: rnd(4, 7), a: rnd(0.45, 0.85), t: PRICES[Math.floor(Math.random() * PRICES.length)], vr: rnd(-0.015, 0.015) }); + function buildBlackFriday() { + hat(HAT_TAG); + driftFill(Math.min(7, Math.round(cw / 220)), makeTag); + const txt = 'BLACK FRIDAYCV À -100 %CONTACT GRATUITSTOCK LIMITÉ : 1 YASSER'; + const tape = el('div', 'season-tape season-deco', '' + txt + txt + txt + txt + ''); tape.setAttribute('aria-hidden', 'true'); + document.body.appendChild(tape); + } + + /* ── Anniversaire : ballons à éclater, confettis, bougie ──────── */ + const HAT_CANDLE = ''; + const PARTY = ['46,230,197', '255,207,74', '255,107,129', '120,150,255', '190,120,255', '255,150,60']; + let balloons = [], nextBalloon = 0; + function confetti(f) { ctx.fillStyle = 'rgba(' + f.c + ',' + f.a + ')'; ctx.fillRect(-f.r, -f.r * 0.45, f.r * 2, f.r * 0.9); } + const makeConfetti = () => fall({ r: rnd(2.5, 5), a: rnd(0.5, 0.85), c: PARTY[Math.floor(Math.random() * PARTY.length)], v: rnd(0.8, 1.6), vr: rnd(-0.12, 0.12) }); + function newBalloon(any) { + const r = rnd(16, 26); + return { x: rnd(r, cw - r), y: any ? rnd(ch * 0.3, ch * 1.3) : ch + r * 3, r, v: rnd(0.45, 0.9), ph: rnd(0, 6.28), c: PARTY[Math.floor(Math.random() * PARTY.length)] }; + } + function drawBalloon(b, now) { + const x = b.x + Math.sin(now / 1300 + b.ph) * 6, y = b.y, r = b.r; + ctx.strokeStyle = 'rgba(' + INK + ',.3)'; ctx.lineWidth = 1; + ctx.beginPath(); ctx.moveTo(x, y + r * 1.15); + for (let k = 1; k <= 6; k++) ctx.lineTo(x + Math.sin(now / 500 + b.ph + k) * 3, y + r * 1.15 + k * r * 0.35); + ctx.stroke(); + ctx.fillStyle = 'rgba(' + b.c + ',.82)'; + ctx.beginPath(); ctx.ellipse(x, y, r * 0.86, r, 0, 0, 6.283); ctx.fill(); + ctx.beginPath(); ctx.moveTo(x, y + r * 0.95); ctx.lineTo(x - r * 0.14, y + r * 1.17); ctx.lineTo(x + r * 0.14, y + r * 1.17); ctx.closePath(); ctx.fill(); + ctx.fillStyle = 'rgba(255,255,255,.35)'; ctx.beginPath(); ctx.ellipse(x - r * 0.32, y - r * 0.38, r * 0.16, r * 0.28, -0.5, 0, 6.283); ctx.fill(); + b.sx = x; + } + function anniversaireFrame(now) { + driftFrame(now, makeConfetti, confetti); + if (now > nextBalloon && balloons.length < 9 * D()) { balloons.push(newBalloon(false)); nextBalloon = now + iv(rnd(1800, 4200)); } + balloons = balloons.filter(b => b.y > -b.r * 4); + for (const b of balloons) { + const dx = (b.sx || b.x) - m.x, dy = b.y - m.y, d = Math.hypot(dx, dy); + if (d < 90) b.x += dx / d * 1.2; + b.y -= b.v; drawBalloon(b, now); + } + fireworksFrame(now, 1e12); + } + function buildAnniversaire() { + hat(HAT_CANDLE); + driftFill(Math.min(40, Math.round(cw / 36)), makeConfetti); + balloons = Array.from({ length: Math.round(Math.min(6, cw / 220) * D()) }, () => newBalloon(true)); + nextBalloon = performance.now() + 1500; + const p = pill('14 MAI · C\'EST MON ANNIVERSAIRE ✦'); + timers.push(setTimeout(() => p.classList.add('is-hidden'), 6000)); + // clic sur un ballon : il éclate ; ailleurs : poignée de confettis + clickFx = (x, y) => { + const i = balloons.findIndex(b => Math.hypot((b.sx || b.x) - x, (b.y - y) * 0.86) < b.r * 1.1); + if (i > -1) { const b = balloons.splice(i, 1)[0]; burst(b.sx || b.x, b.y, [b.c, '255,255,255']); } + else burst(x, y, PARTY); + }; + } + + /* ── Indépendance de l'Algérie : drapeau, feux d'artifice et confettis vert / blanc / rouge ── */ + const HAT_DZ = ''; + const DZ = ['0,98,51', '255,255,255', '210,16,52', '47,191,113']; + const makeConfettiDZ = () => fall({ r: rnd(2.5, 5), a: rnd(0.5, 0.85), c: DZ[Math.floor(Math.random() * DZ.length)], v: rnd(0.8, 1.6), vr: rnd(-0.12, 0.12) }); + function buildAlgerie() { + hat(HAT_DZ); + fwPal = () => LIGHT ? ['0,98,51', '200,16,46', '90,110,100'] : ['47,191,113', '255,255,255', '230,57,70']; + driftFill(Math.min(34, Math.round(cw / 42)), makeConfettiDZ); + const p = pill('5 JUILLET · INDÉPENDANCE DE L\'ALGÉRIE ✦'); + timers.push(setTimeout(() => p.classList.add('is-hidden'), 6000)); + clickFx = (x, y) => burst(x, y, fwPal()); + } + function algerieFrame(now) { driftFrame(now, makeConfettiDZ, confetti); fireworksFrame(now, 1700); } + + /* ── Japon : torii, pétales de sakura, vagues seigaiha ─────────── */ + const HAT_TORII = ''; + function sakura(f) { + ctx.fillStyle = 'rgba(' + f.c + ',' + f.a + ')'; + ctx.beginPath(); // pétale : goutte avec une petite encoche au bout + ctx.moveTo(0, -f.r); ctx.quadraticCurveTo(f.r * 0.9, -f.r * 0.2, 0, f.r); + ctx.quadraticCurveTo(-f.r * 0.9, -f.r * 0.2, 0, -f.r); ctx.fill(); + ctx.fillStyle = 'rgba(' + BG + ',' + f.a + ')'; + ctx.beginPath(); ctx.moveTo(-f.r * 0.18, -f.r * 0.98); ctx.lineTo(0, -f.r * 0.7); ctx.lineTo(f.r * 0.18, -f.r * 0.98); ctx.fill(); + } + const SAKURA = ['255,183,197', '255,205,215', '250,160,180', '255,226,232']; + const makeSakura = () => fall({ r: rnd(3.5, 7), a: rnd(0.45, 0.85), c: SAKURA[Math.floor(Math.random() * SAKURA.length)], v: rnd(0.4, 0.95), sw: rnd(0.5, 1.4), vr: rnd(-0.03, 0.03) }); + function buildJapon() { + hat(HAT_TORII); + driftFill(Math.min(40, Math.round(cw / 38)), makeSakura); + const w = el('div', 'season-waves season-deco'); w.setAttribute('aria-hidden', 'true'); document.body.appendChild(w); + clickFx = (x, y) => { for (let i = 0; i < 8; i++) drift.push(Object.assign(makeSakura(), { x: x + rnd(-30, 30), y: y + rnd(-20, 10) })); if (drift.length > 90) drift.splice(0, drift.length - 90); }; + } + + /* ── Hack (30 novembre, journée de la sécurité informatique) : pluie de code, intrusion tapée, glitch ── */ + const GLYPHS = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン0123456789ABCDEF<>/{}[]$#'; + const glyph = () => GLYPHS[Math.floor(Math.random() * GLYPHS.length)]; + let rain = []; + const STEP = 18; + function newDrop(x, any) { + const len = Math.round(rnd(6, 22)); + return { x, y: any ? rnd(-ch, ch) : rnd(-ch * 0.6, -20), v: rnd(1.6, 4.2), len, ch: Array.from({ length: len }, glyph), boost: 0 }; + } + function buildRain() { + const cols = Math.floor(cw / STEP), n = Math.round(cols * 0.32 * D()); + const xs = Array.from({ length: cols }, (_, i) => i * STEP + 4).sort(() => Math.random() - 0.5).slice(0, n); + rain = xs.map(x => newDrop(x, true)); + } + function hackFrame() { + ctx.font = '600 14px "JetBrains Mono", ui-monospace, monospace'; + ctx.textAlign = 'center'; + const head = LIGHT ? '6,24,12' : '220,255,230'; + for (let i = 0; i < rain.length; i++) { + const d = rain[i]; + d.y += d.v * (d.boost ? 1.8 : 1); + if (Math.random() < 0.06) d.ch[Math.floor(Math.random() * d.len)] = glyph(); + for (let k = 0; k < d.len; k++) { + const y = d.y - k * STEP; + if (y < -STEP || y > ch + STEP) continue; + const a = k === 0 ? 0.95 : (1 - k / d.len) * (LIGHT ? 0.45 : 0.55) * (d.boost ? 1.6 : 1); + ctx.fillStyle = 'rgba(' + (k === 0 ? head : LIME) + ',' + Math.min(a, 1) + ')'; + ctx.fillText(d.ch[k], d.x, y); + } + if (d.y - d.len * STEP > ch) rain[i] = d.boost ? null : newDrop(d.x, false); + } + rain = rain.filter(Boolean); + } + /* Intrusion : fenêtre de terminal au centre, site flouté derrière, une fois par session de navigation + (sessionStorage : F5 / Ctrl+R ne la rejouent pas, fermer l'onglet et revenir oui, quelle que soit la page). */ + function hackIntro() { + try { if (sessionStorage.getItem('yb-hack-intro')) return; sessionStorage.setItem('yb-hack-intro', '1'); } catch (e) {} + if (CALM) return; + const ov = el('div', 'season-hack-intro season-deco', + ''); + document.body.appendChild(ov); + const body = ov.querySelector('.season-term__body'), g = gen; + const add = html => { body.insertAdjacentHTML('beforeend', html); }; + const caret = ''; + let finished = false; + const finish = () => { + if (finished) return; finished = true; + ov.classList.add('is-granted'); + timers.push(setTimeout(() => ov.classList.add('is-out'), 1100)); + timers.push(setTimeout(() => ov.remove(), 1900)); + }; + const skip = () => { if (!finished) { finished = true; ov.classList.add('is-out'); timers.push(setTimeout(() => ov.remove(), 700)); } }; + ov.addEventListener('click', skip); + addEventListener('keydown', function k(e) { if (e.key === 'Escape') { skip(); removeEventListener('keydown', k); } }); + // étapes : [type, texte, pause après] + const steps = [ + ['cmd', 'ssh servyass', 250], + ['out', 'Connexion établie · clé ed25519 · chiffrement chacha20-poly1305', 350], + ['cmd', 'sudo ./portfolio --unlock', 220], + ['out', '[sudo] mot de passe pour yass : ••••••••••', 320], + ['bar', '', 250], + ['out', '✓ 13 modules déchiffrés · 0 alerte', 550] + ]; + let si = 0; + const next = () => { + if (g !== gen || finished) return; + if (si >= steps.length) return finish(); + const [type, txt, pause] = steps[si++]; + if (type === 'out') { add(txt + '\n'); return timers.push(setTimeout(next, pause)); } + if (type === 'bar') { + add('\n'); + const bar = [...body.querySelectorAll('.t-bar')].pop(); let n = 0; + const fill = () => { + if (g !== gen || finished) return; + n++; bar.textContent = '[' + '█'.repeat(n) + '░'.repeat(24 - n) + '] ' + Math.round(n / 24 * 100) + ' %'; + timers.push(setTimeout(n < 24 ? fill : next, n < 24 ? 32 : pause)); + }; + return fill(); + } + // commande tapée lettre par lettre derrière un prompt + add('yass@servyass:~$ ' + caret); + const cmd = [...body.querySelectorAll('.t-cmd')].pop(); let ci = 0; + const type1 = () => { + if (g !== gen || finished) return; + cmd.textContent = txt.slice(0, ++ci); + if (ci < txt.length) return timers.push(setTimeout(type1, 26 + Math.random() * 30)); + body.querySelectorAll('.season-caret').forEach(c => c.remove()); add('\n'); + timers.push(setTimeout(next, pause)); + }; + timers.push(setTimeout(type1, 200)); + }; + timers.push(setTimeout(next, 650)); // laisse le rideau de page se lever + } + const esc = t => t.replace(/[&<>]/g, c => ({ '&': '&', '<': '<', '>': '>' }[c])); + function buildHack() { + const logo = document.querySelector('.site-nav__logo'); + if (logo) logo.appendChild(el('span', 'season-caret season-deco')); + const scan = el('div', 'season-scan season-deco'); scan.setAttribute('aria-hidden', 'true'); document.body.appendChild(scan); + buildRain(); resizeFx = buildRain; + hackIntro(); + clickFx = x => { + for (let k = -1; k <= 1; k++) rain.push(Object.assign(newDrop(Math.round(x / STEP) * STEP + 4 + k * STEP, false), { y: rnd(-60, 0), v: rnd(5, 8), boost: 1 })); + if (CALM || REDUCED) return; + root.classList.remove('season-glitch'); void root.offsetWidth; root.classList.add('season-glitch'); + timers.push(setTimeout(() => root.classList.remove('season-glitch'), 320)); + }; + } + + /* ── Boucle commune ────────────────────────────────────────────── */ + const BUILDS = { halloween: buildHalloween, noel: buildNoel, 'nouvel-an': buildNouvelAn, juillet: buildJuillet, 'st-patrick': buildStPatrick, paques: buildPaques, poisson: buildPoisson, musique: buildMusique, 'black-friday': buildBlackFriday, anniversaire: buildAnniversaire, algerie: buildAlgerie, japon: buildJapon, hack: buildHack }; + const FRAMES = { + halloween: halloweenFrame, noel: noelFrame, + 'nouvel-an': now => fireworksFrame(now, 1400), juillet: now => fireworksFrame(now, 900), + 'st-patrick': now => driftFrame(now, makeClover, clover), paques: paquesFrame, poisson: poissonFrame, + musique: musiqueFrame, anniversaire: anniversaireFrame, algerie: algerieFrame, japon: now => driftFrame(now, makeSakura, sakura), hack: hackFrame, 'black-friday': now => driftFrame(now, makeTag, priceTag) + }; + function frame(now) { + if (!run) return; + try { ctx.clearRect(0, 0, cw, ch); (FRAMES[season] || (() => {}))(now); } catch (e) {} + raf = requestAnimationFrame(frame); + } + function start() { + if (run) return; + if (CALM) { // mouvement réduit : une seule image fixe + ctx.clearRect(0, 0, cw, ch); + if (season === 'halloween') embers.forEach(e => { ctx.fillStyle = 'rgba(' + LIME + ',.4)'; ctx.beginPath(); ctx.arc(e.x, e.y, e.r, 0, 6.283); ctx.fill(); }); + else if (FRAMES[season]) FRAMES[season](0); + return; + } + run = true; raf = requestAnimationFrame(frame); + } + function stop() { run = false; cancelAnimationFrame(raf); if (ctx) ctx.clearRect(0, 0, cw, ch); } + + /* Calque commun + écouteurs, une seule fois ; chaque fête branche clickFx / resizeFx */ + function setup() { + if (built) return; built = true; + cv = el('canvas', 'season-fx'); cv.setAttribute('aria-hidden', 'true'); + document.body.appendChild(cv); ctx = cv.getContext('2d'); + size(); colors(); + let rt; + addEventListener('resize', () => { size(); clearTimeout(rt); rt = setTimeout(() => resizeFx && resizeFx(), 200); }); + addEventListener('scroll', dropSpider, { passive: true }); + addEventListener('pointermove', e => { m.vx += (e.clientX - (m.x > -9000 ? m.x : e.clientX)) * 0.3; m.x = e.clientX; m.y = e.clientY; }, { passive: true }); + addEventListener('touchend', () => { m.x = m.y = -9999; }); + addEventListener('pointerdown', e => { + if (!run || !clickFx || e.target.closest('a, button, input, textarea, select, label, [data-cursor-label], .season-wheel')) return; + clickFx(e.clientX, e.clientY); + }); + addEventListener('yb:theme', colors); + } + /* Retire tout le décor de la fête en cours */ + function teardown() { + gen++; stop(); + document.querySelectorAll('.season-deco').forEach(e => e.remove()); + timers.forEach(t => { clearInterval(t); clearTimeout(t); }); timers = []; + clickFx = resizeFx = null; spider = null; + bats = []; embers = []; balloons = []; rain = []; + root.classList.remove('season-glitch'); flakes = []; rockets = []; sparks = []; drift = []; fishes = []; eqBars = []; + } + /* Monte le décor d'une fête ('' = aucune) */ + function mount(key) { + teardown(); + if (key) { root.setAttribute('data-season', key); root.removeAttribute('data-season-off'); } + else { root.removeAttribute('data-season'); if (season) root.setAttribute('data-season-off', season); } + if (key) season = key; + setup(); colors(); + if (key) { (BUILDS[key] || (() => {}))(); start(); } + syncCV(); syncButton(); + dispatchEvent(new CustomEvent('yb:theme', { detail: root.getAttribute('data-theme') || 'dark' })); // l'orbe relit ses couleurs + } + /* Bascule animée comme le mode clair / sombre : cercle qui s'étend depuis le bouton */ + function swap(key, from) { + if (!document.startViewTransition || CALM) { + root.classList.add('theme-fade'); mount(key); + return setTimeout(() => root.classList.remove('theme-fade'), 500); + } + const r = (from || btn || document.body).getBoundingClientRect(), x = r.left + r.width / 2, y = r.top + r.height / 2; + const end = Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y)); + const vt = document.startViewTransition(() => mount(key)); + vt.ready.then(() => root.animate( + { clipPath: ['circle(0px at ' + x + 'px ' + y + 'px)', 'circle(' + end + 'px at ' + x + 'px ' + y + 'px)'] }, + { duration: 750, easing: 'cubic-bezier(.7,0,.3,1)', pseudoElement: '::view-transition-new(root)' } + )).catch(() => {}); + } + + /* CV assorti : liens et aperçus [data-cv] pointent vers la version de la fête active, sinon la version par défaut */ + function syncCV() { + const on = root.getAttribute('data-season'), list = (window.YB_SEASONS || {}).cv || []; + document.querySelectorAll('[data-cv]').forEach(e => { + const attr = e.tagName === 'IMG' ? 'src' : e.hasAttribute('data-preview') && e.tagName !== 'A' ? 'data-preview' : 'href'; + if (!e.dataset.cvBase) e.dataset.cvBase = e.getAttribute(e.dataset.cv || attr) || ''; + const base = e.dataset.cvBase, k = on && list.indexOf(on) > -1 ? on : ''; + e.setAttribute(e.dataset.cv || attr, k ? base.replace('/uploads/cv/', '/uploads/cv/saisons/' + k + '/') : base); + }); + } + + /* ── Roue de sélection ─────────────────────────────────────────── */ + let btn, wheel; + const DATA = () => window.YB_SEASONS || { list: {} }; + function syncButton() { + if (!btn) return; + const on = root.getAttribute('data-season'), d = DATA().list[on || season]; + if (d && btn.dataset.icon !== (on || season)) { btn.innerHTML = d.icon; btn.dataset.icon = on || season; } + btn.setAttribute('aria-pressed', on ? 'true' : 'false'); + btn.setAttribute('aria-label', PICK() ? 'Choisir un thème' : on ? btn.dataset.labelOff : btn.dataset.labelOn); + } + const PICK = () => root.hasAttribute('data-sx'); + function toast(t) { + const e = el('div', 'season-pill'); e.textContent = t; e.classList.add('is-hidden'); document.body.appendChild(e); + requestAnimationFrame(() => requestAnimationFrame(() => e.classList.remove('is-hidden'))); + setTimeout(() => { e.classList.add('is-hidden'); setTimeout(() => e.remove(), 500); }, 2200); + } + function flip() { + const on = !PICK(); + try { on ? localStorage.setItem('yb-sx', '1') : (localStorage.removeItem('yb-sx'), localStorage.removeItem('yb-sp')); } catch (e) {} + on ? root.setAttribute('data-sx', '') : root.removeAttribute('data-sx'); + syncButton(); toast(on ? '✦ ✦ ✦' : '✕'); + if (on) return setTimeout(openWheel, 300); + closeWheel(); + const a = DATA().auto || ''; + if (a !== (root.getAttribute('data-season') || '')) swap(a); + } + function listen() { + const q = "&&((%'%'BA"; let n = 0; + const step = c => { n = c === q.charCodeAt(n) ? n + 1 : c === q.charCodeAt(0) ? Math.min(n, 2) || 1 : 0; if (n === q.length) { n = 0; flip(); } }; + addEventListener('keydown', e => { if (!e.target.closest('input, textarea, select, [contenteditable]')) step(e.keyCode); }); + let t0 = null; + addEventListener('touchstart', e => { const t = e.touches[0]; t0 = [t.clientX, t.clientY]; }, { passive: true }); + addEventListener('touchend', e => { + if (!t0) return; const t = e.changedTouches[0], dx = t.clientX - t0[0], dy = t.clientY - t0[1]; t0 = null; + if (Math.max(Math.abs(dx), Math.abs(dy)) < 40) return step(n > 7 ? q.charCodeAt(n) : 0); + step(Math.abs(dx) > Math.abs(dy) ? (dx > 0 ? 39 : 37) : (dy > 0 ? 40 : 38)); + }, { passive: true }); + } + function openWheel() { + if (wheel) return closeWheel(); + const L = DATA().list, keys = Object.keys(L), cur = root.getAttribute('data-season') || ''; + const items = keys.map(k => ({ k, label: L[k].label, when: L[k].when, icon: L[k].icon })) + .concat([{ k: '', label: 'Sans décor', when: 'le site normal', icon: '' }, + { k: 'auto', label: 'Automatique', when: 'la fête du moment' + (DATA().auto ? ' : ' + L[DATA().auto].label : ' (aucune)'), icon: '' }]); + const picked = (() => { try { return localStorage.getItem('yb-sp'); } catch (e) { return null; } })(); + wheel = el('div', 'season-wheel'); + wheel.setAttribute('role', 'dialog'); wheel.setAttribute('aria-label', 'Choisir le thème de fête'); + wheel.innerHTML = '
THÈME
'; + const ring = wheel.firstChild, hub = wheel.querySelector('.season-wheel__hub'), n = items.length; + const show = it => { hub.querySelector('strong').textContent = it.label; hub.querySelector('span').textContent = it.when; }; + items.forEach((it, i) => { + const a = -Math.PI / 2 + i * 2 * Math.PI / n, b = el('button', 'season-wheel__item'); + b.type = 'button'; b.innerHTML = it.icon + '' + it.label + ''; + b.style.setProperty('--x', Math.cos(a).toFixed(4)); b.style.setProperty('--y', Math.sin(a).toFixed(4)); b.style.setProperty('--i', i); + const active = it.k === 'auto' ? picked === null : (picked !== null && it.k === cur); + if (active) b.classList.add('is-current'); + const prev = () => window.YBCursor && YBCursor.preview(it.k === 'auto' ? (DATA().auto || '') : it.k); + b.addEventListener('pointerenter', () => { show(it); prev(); }); b.addEventListener('focus', () => show(it)); + b.addEventListener('pointerleave', () => window.YBCursor && YBCursor.preview(null)); + b.addEventListener('click', () => { + try { it.k === 'auto' ? localStorage.removeItem('yb-sp') : localStorage.setItem('yb-sp', it.k || 'none'); } catch (e) {} + const target = it.k === 'auto' ? (DATA().auto || '') : it.k; + closeWheel(); if (target !== (root.getAttribute('data-season') || '')) swap(target, b); + }); + ring.appendChild(b); + }); + show(items.find(it => it.k === cur) || items[n - 1]); + wheel.addEventListener('click', e => { if (e.target === wheel) closeWheel(); }); + document.body.appendChild(wheel); + requestAnimationFrame(() => wheel.classList.add('is-open')); + (ring.querySelector('.is-current') || ring.firstChild).focus({ preventScroll: true }); + } + function closeWheel() { + if (!wheel) return; const w = wheel; wheel = null; + if (window.YBCursor) YBCursor.preview(null); + w.classList.remove('is-open'); setTimeout(() => w.remove(), 350); if (btn) btn.focus({ preventScroll: true }); + } + + return { init() { + season = root.getAttribute('data-season') || root.getAttribute('data-season-off') || ''; + btn = document.querySelector('[data-season-toggle]'); + if (btn) btn.addEventListener('click', () => { + if (PICK()) return openWheel(); + const on = root.hasAttribute('data-season'); + try { localStorage.setItem('yb-season', on ? 'off' : 'on'); } catch (e) {} + swap(on ? '' : season); + }); + addEventListener('keydown', e => { if (e.key === 'Escape') closeWheel(); }); + listen(); + syncButton(); syncCV(); + if (root.hasAttribute('data-season')) { setup(); (BUILDS[season] || (() => {}))(); start(); } + document.addEventListener('visibilitychange', () => { if (document.hidden) stop(); else if (root.hasAttribute('data-season') && built) start(); }); + } }; +})(); +document.addEventListener('DOMContentLoaded', () => YBSeason.init()); diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..974808e --- /dev/null +++ b/functions.php @@ -0,0 +1,291 @@ + array( + 'name' => 'Réalisations', + 'singular_name' => 'Réalisation', + 'add_new_item' => 'Ajouter une réalisation', + 'edit_item' => 'Modifier la réalisation', + ), + 'public' => true, + 'has_archive' => false, + 'supports' => array('title', 'editor', 'thumbnail', 'excerpt'), + 'menu_icon' => 'dashicons-portfolio', + 'show_in_rest' => true, + 'rewrite' => array('slug' => 'realisations'), + )); + + register_post_type('service', array( + 'labels' => array( + 'name' => 'Services', + 'singular_name' => 'Service', + 'add_new_item' => 'Ajouter un service', + 'edit_item' => 'Modifier le service', + ), + 'public' => true, + 'has_archive' => false, + 'supports' => array('title', 'editor', 'thumbnail', 'excerpt'), + 'menu_icon' => 'dashicons-portfolio', + 'show_in_rest' => true, + 'rewrite' => array('slug' => 'services'), + )); +} +add_action('init', 'yb2026_post_types'); + +function yb2026_flush() +{ + yb2026_post_types(); + flush_rewrite_rules(); +} +add_action('after_switch_theme', 'yb2026_flush'); + +/* ── Meta-box réalisation : champs de l'étude de cas ────────────────── */ +function yb2026_add_metaboxes() +{ + add_meta_box('yb_real_meta', 'Étude de cas (design v2)', 'yb2026_render_real_metabox', 'realisation', 'normal', 'high'); +} +add_action('add_meta_boxes', 'yb2026_add_metaboxes'); + +function yb2026_render_real_metabox($post) +{ + wp_nonce_field('yb_real_nonce_action', 'yb_real_nonce'); + $f = function ($k) use ($post) { return esc_attr(get_post_meta($post->ID, $k, true)); }; + $sections = get_post_meta($post->ID, '_yb_sections', true); + $sections_txt = ''; + if ($sections) { + $arr = json_decode($sections, true); + if (is_array($arr)) { + foreach ($arr as $s) { + $sections_txt .= '/ ' . $s['h'] . "\n" . $s['p'] . "\n\n"; + } + } + } + ?> + +
+ + + + + + + + + + + + + + + + +
+ '_yb_order', 'yb_tag' => '_yb_tag', 'yb_year' => '_yb_year', 'yb_role' => '_yb_role', 'yb_short' => '_yb_short', 'yb_note' => '_yb_note') as $field => $key) { + if (isset($_POST[$field])) { + update_post_meta($post_id, $key, sanitize_text_field($_POST[$field])); + } + } + if (isset($_POST['yb_desc'])) { + update_post_meta($post_id, '_yb_desc', sanitize_textarea_field($_POST['yb_desc'])); + } + if (isset($_POST['yb_sections'])) { + $raw = str_replace("\r\n", "\n", (string) $_POST['yb_sections']); + $out = array(); + foreach (preg_split('/\n\s*\n/', trim($raw)) as $block) { + $lines = explode("\n", trim($block)); + if (count($lines) < 2 || strpos($lines[0], '/') !== 0) continue; + $out[] = array( + 'h' => sanitize_text_field(ltrim(substr($lines[0], 1))), + 'p' => sanitize_textarea_field(implode(' ', array_slice($lines, 1))), + ); + } + update_post_meta($post_id, '_yb_sections', $out ? wp_json_encode($out, JSON_UNESCAPED_UNICODE) : ''); + } +} +add_action('save_post_realisation', 'yb2026_save_metaboxes'); + +/* ── Helpers ─────────────────────────────────────────────────────────── */ + +/** Toutes les réalisations triées par _yb_order (fallback date). */ +function yb2026_get_projects($limit = -1) +{ + $q = new WP_Query(array( + 'post_type' => 'realisation', + 'posts_per_page' => $limit, + 'meta_key' => '_yb_order', + 'orderby' => array('meta_value_num' => 'ASC', 'date' => 'DESC'), + 'no_found_rows' => true, + )); + return $q->posts; +} + +/** Numéro « 01 » d'une réalisation. */ +function yb2026_num($post_id) +{ + $o = (int) get_post_meta($post_id, '_yb_order', true); + return str_pad($o ? $o : 1, 2, '0', STR_PAD_LEFT); +} + +/** Nom court d'un projet : partie avant le « : » du titre WP (ancien séparateur « : » toléré). */ +function yb2026_short_title($p) +{ + $t = get_the_title($p); + $parts = preg_split('/\s+[:\x{2014}]\s+/u', $t, 2); + return $parts[0]; +} + +/** Carte projet (piste des travaux sur l'accueil + grille réalisations). + Classes .card / .card-img attendues par effects.css et effects.js (compteur, hover N&B). */ +function yb2026_project_card($p, $home = false) +{ + $tag = get_post_meta($p->ID, '_yb_tag', true); + if (!$tag) $tag = strtoupper((string) get_post_meta($p->ID, '_real_technologies', true)); + $short = get_post_meta($p->ID, '_yb_short', true); + if (!$short) $short = get_the_excerpt($p); + $year = get_post_meta($p->ID, '_yb_year', true); + $name = yb2026_short_title($p); + ?> +
> + + 'lazy', 'alt' => esc_attr($name))); ?> + ID)); ?> + + + + → + + + + + ]*>(?:(?!).)*?' . $basename . '(?:(?!).)*?#is', '', $content); + $content = preg_replace('#]*?' . $basename . '[^>]*?/?>#i', '', $content); + $content = preg_replace('#

\s*

#i', '', $content); + return $content; +}, 20); + +/* ── Options pages ACF (shim) ────────────────────────────────────────── */ +add_action('acf/init', function () { + if (function_exists('acf_add_options_page')) { + acf_add_options_page(array( + 'page_title' => 'Theme General Settings', + 'menu_title' => 'Theme Settings', + 'menu_slug' => 'theme-general-settings', + 'capability' => 'edit_posts', + 'redirect' => false, + )); + acf_add_options_sub_page(array('page_title' => 'Theme Header Settings', 'menu_title' => 'Header', 'parent_slug' => 'theme-general-settings')); + acf_add_options_sub_page(array('page_title' => 'Theme Social Settings', 'menu_title' => 'Social', 'parent_slug' => 'theme-general-settings')); + acf_add_options_sub_page(array('page_title' => 'Theme Coordonnée Settings', 'menu_title' => 'Coordonnée', 'parent_slug' => 'theme-general-settings')); + } +}); + +/* Autoptimize : ne pas agréger le script inline anti-flash du wipe + (il doit s'exécuter immédiatement après l'élément #yb-wipe, avant le paint). */ +add_filter('autoptimize_filter_js_exclude', function ($exclude) { + return $exclude . ', ybWipe, ybTheme'; +}); + +/* Shortcode hérité (présent dans d'anciens contenus) */ +add_shortcode('tavu', function () { + return "

T'a vue ?

"; +}); + +/* Ancienne adresse de la page Compétences : /services/ → /competences/ (301). + Les contenus du CPT « service » gardent leurs adresses /services//. */ +add_action('template_redirect', function () { + $path = trim((string) parse_url($_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH), '/'); + if ($path === 'services') { + wp_redirect(home_url('/competences/'), 301); + exit; + } +}, 1); + +/* ── Ressources tierces : rien n'est chargé depuis un CDN externe côté visiteur ── */ +add_action('wp_enqueue_scripts', function () { + wp_dequeue_style('acf-shim-fontawesome'); // icônes Font Awesome de l'admin ACF, inutiles sur le site +}, 100); diff --git a/index.php b/index.php new file mode 100644 index 0000000..e50f8a5 --- /dev/null +++ b/index.php @@ -0,0 +1,25 @@ + + +
+ +

+ + +

RIEN ICI

+

Aucun contenu trouvé.

+ +
+ + diff --git a/page-contact.php b/page-contact.php new file mode 100644 index 0000000..0bc9ca4 --- /dev/null +++ b/page-contact.php @@ -0,0 +1,90 @@ + 'EMAIL', 'big' => $email, 'href' => 'mailto:' . $email, 'act' => 'ÉCRIRE ↗', 'copy' => $email, 'cursor' => "M'ÉCRIRE", 'protect' => true), + array('k' => 'TÉLÉPHONE', 'big' => $tel, 'href' => yb2026_tel_href($tel), 'act' => 'APPELER ↗', 'copy' => $tel, 'cursor' => 'APPELER', 'protect' => true), +); +if ($linkedin) $actions[] = array('k' => 'LINKEDIN', 'big' => 'Yasser Boulayoune', 'href' => $linkedin, 'act' => 'VOIR LE PROFIL ↗', 'blank' => true, 'cursor' => 'LINKEDIN'); +$actions[] = array('k' => 'CV', 'big' => 'Télécharger mon CV', 'href' => $cv . ($cv_v ? '?v=' . $cv_v : ''), 'act' => 'PDF ↓', 'blank' => true, 'cursor' => 'TÉLÉCHARGER', 'preview' => home_url('/wp-content/uploads/cv/cv-apercu.png')); +?> + +
+
+
+ data-cursor-label="M'ÉCRIRE" data-reveal>TRAVAILLONS
ENSEMBLE →
+
+ + + À LYON, IL EST --:-- +
+
+ + + +
+
+ + + + diff --git a/page.php b/page.php new file mode 100644 index 0000000..173598b --- /dev/null +++ b/page.php @@ -0,0 +1,13 @@ + + +
+
+

+
+
+ + diff --git a/style.css b/style.css new file mode 100644 index 0000000..33ef737 --- /dev/null +++ b/style.css @@ -0,0 +1,9 @@ +/* +Theme Name: yb2026 +Theme URI: https://yasser.boulayoune.com +Author: Yasser Boulayoune +Description: Portfolio v3 « sombre & premium » : Archivo/JetBrains Mono, accent lime, orbe canvas, transitions wipe. Porté depuis le prototype Claude Design (handoff). Le CSS est dans assets/css/style.css. +Version: 3.0 +Requires PHP: 8.0 +Text Domain: yb2026 +*/