/*
Theme Name: Mohamed Elkattoufi
Theme URI: https://github.com/ElkattoufiMohamed
Author: Mohamed Elkattoufi
Author URI: https://www.linkedin.com/in/mohamed-elkattoufi/
Description: Personal portfolio theme for Mohamed Elkattoufi, AI Researcher and ML Engineer. A single-page site with project articles, publications, and a light/dark warm-ink design. Self-contained, self-hosted fonts, no page builder required.
Version: 1.5.0
Requires at least: 6.0
Tested up to: 6.7
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: mohamed-elkattoufi
*/

/* Self-hosted fonts: Hanken Grotesk, Newsreader, JetBrains Mono */
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:300;font-display:swap;src:url(assets/fonts/hanken-300-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:300;font-display:swap;src:url(assets/fonts/hanken-300.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}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/hanken-400-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/hanken-400.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}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/hanken-500-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/hanken-500.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}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:600;font-display:swap;src:url(assets/fonts/hanken-600-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:600;font-display:swap;src:url(assets/fonts/hanken-600.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}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:700;font-display:swap;src:url(assets/fonts/hanken-700-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:700;font-display:swap;src:url(assets/fonts/hanken-700.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}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:800;font-display:swap;src:url(assets/fonts/hanken-800-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:800;font-display:swap;src:url(assets/fonts/hanken-800.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}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/jbmono-400-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/jbmono-400.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}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/jbmono-500-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/jbmono-500.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}
@font-face{font-family:'Newsreader';font-style:italic;font-weight:300;font-display:swap;src:url(assets/fonts/newsreader-300-italic-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Newsreader';font-style:italic;font-weight:300;font-display:swap;src:url(assets/fonts/newsreader-300-italic.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}
@font-face{font-family:'Newsreader';font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/newsreader-400-italic-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Newsreader';font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/newsreader-400-italic.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}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:300;font-display:swap;src:url(assets/fonts/newsreader-300-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:300;font-display:swap;src:url(assets/fonts/newsreader-300.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}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/newsreader-400-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/newsreader-400.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}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/newsreader-500-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/newsreader-500.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}

/* ===========================================================
   Mohamed Elkattoufi — portfolio
   Standalone build (ported off the Claude design canvas).
   Colour + type tokens follow the Identity sheet.
   =========================================================== */

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:var(--bg,#f4f1ea);
  font-family:'Hanken Grotesk',system-ui,sans-serif;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}
::selection{background:var(--ink,#15130e);color:var(--bg,#f4f1ea)}
a{color:inherit}
img{max-width:100%}

/* animated underline links */
.lk{
  position:relative;text-decoration:none;
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:background-size .4s cubic-bezier(.16,1,.3,1),opacity .3s;
}
.lk:hover{background-size:100% 1px}

/* During a theme switch we suppress every transition. Transitioning an
   inherited color/border that is driven by a CSS variable can freeze on the
   old value when the variable changes (Chromium quirk); snapping avoids it. */
html.theme-anim-off *,
html.theme-anim-off *::before,
html.theme-anim-off *::after{transition:none !important}

/* reveal-on-scroll base handled in JS */

/* ---- reusable pill buttons (replace the canvas style-hover) ---- */
.btn{
  font-size:15px;font-weight:500;padding:13px 24px;border-radius:999px;
  text-decoration:none;display:inline-flex;align-items:center;gap:9px;
  transition:opacity .3s,transform .2s,border-color .3s;
}
.btn-sm{font-size:14px;padding:9px 17px}
.btn-primary{background:var(--ink,#15130e);color:var(--bg,#f4f1ea);border:1px solid var(--ink,#15130e)}
.btn-primary:hover{opacity:.85;transform:translateY(-1px)}
.btn-ghost{background:transparent;color:var(--ink,#15130e);border:1px solid var(--line,rgba(21,19,14,.14))}
.btn-ghost:hover{border-color:var(--ink,#15130e);transform:translateY(-1px)}

.mono{font-family:'JetBrains Mono',monospace}

/* project + next cards */
.proj-card{transition:background .35s}
.proj-card:hover{background:var(--surface,#fbf9f4)}
.next-card{transition:background .35s,border-color .35s}
.next-card:hover{background:var(--surface,#fbf9f4);border-color:var(--ink,#15130e)}

/* theme toggle */
.theme-btn{
  flex:none;width:36px;height:36px;border-radius:999px;
  border:1px solid var(--line,rgba(21,19,14,.12));
  background:transparent;color:var(--ink2,#57524a);cursor:pointer;
  display:flex;align-items:center;justify-content:center;padding:0;line-height:0;
  transition:border-color .3s,color .3s,background .3s,transform .2s;
}
.theme-btn:hover{border-color:var(--ink,#15130e);color:var(--ink,#15130e);background:var(--surface,#fbf9f4);transform:translateY(-1px)}
.theme-btn svg{display:block}

/* tag chips get their palette from inline vars set in JS */
.tag-chip{
  font-size:13px;font-family:'JetBrains Mono',monospace;
  padding:8px 15px;border-radius:999px;cursor:pointer;transition:all .3s;
}

/* ---- mobile navigation ---- */
.nav-toggle{
  flex:none;width:36px;height:36px;border-radius:999px;
  border:1px solid var(--line,rgba(21,19,14,.12));
  background:transparent;color:var(--ink2,#57524a);cursor:pointer;
  display:none;align-items:center;justify-content:center;padding:0;line-height:0;
  transition:border-color .3s,color .3s;
}
.nav-toggle:hover{border-color:var(--ink,#15130e);color:var(--ink,#15130e)}
.nav-toggle svg{display:block}

.mobile-menu{
  position:fixed;top:0;left:0;right:0;z-index:40;
  padding:82px clamp(20px,5vw,64px) 26px;
  background:var(--bg,#f4f1ea);border-bottom:1px solid var(--line,rgba(21,19,14,.12));
  display:none;flex-direction:column;
}
/* visibility is a plain display toggle (never gated on the animation clock);
   the slide-in is decorative only, so the menu is always usable */
.mobile-menu.open{display:flex;animation:mmIn .3s cubic-bezier(.16,1,.3,1)}
@keyframes mmIn{from{transform:translateY(-12px)}to{transform:translateY(0)}}
.mobile-menu a{
  font-size:20px;font-weight:600;letter-spacing:-.015em;text-decoration:none;
  color:var(--ink,#15130e);padding:16px 2px;border-top:1px solid var(--line2,rgba(21,19,14,.08));
  display:flex;align-items:center;justify-content:space-between;
}
.mobile-menu a::after{content:'\2192';color:var(--ink3,#8c867a);font-family:'JetBrains Mono',monospace;font-size:15px}
.mobile-menu a:first-child{border-top:none}

@media (max-width:860px){
  #navlinks{display:none !important}
  .nav-cta{display:none}
  .nav-toggle{display:inline-flex}
}
/* the mobile menu can never show on desktop, whatever its state */
@media (min-width:861px){ .mobile-menu{display:none !important} }
