{"id":1975,"date":"2026-03-12T17:01:49","date_gmt":"2026-03-12T17:01:49","guid":{"rendered":"https:\/\/fredericmartel.com\/?page_id=1975"},"modified":"2026-03-12T18:29:37","modified_gmt":"2026-03-12T18:29:37","slug":"occidents","status":"publish","type":"page","link":"https:\/\/fredericmartel.com\/en\/occidents\/","title":{"rendered":"Occidents"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"background-color: rgba(255,255,255,0);background-position: center center;background-repeat: no-repeat;border-width: 0px 0px 0px 0px;border-color:#e2e2e2;border-style:solid;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_3_5 3_5 fusion-flex-column\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\" style=\"background-position:left top;background-repeat:no-repeat;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;padding: 0px 0px 0px 0px;\"><!doctype html>\n<html lang=\"fr\">\n\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>Occidents \u2014 Fr\u00e9d\u00e9ric Martel<\/title>\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin \/>\n  <link\n    href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,700;1,400;1,500&family=Inter:wght@300;400;500;600&family=Lora:ital,wght@0,400;0,500;0,600;1,400;1,500&family=Crimson+Pro:ital,wght@0,400;0,600;1,400&family=Montserrat:wght@300;400;500;600&family=Roboto+Mono:wght@400;500&display=swap\"\n    rel=\"stylesheet\" \/>\n  <style>\n    \/* \u2500\u2500\u2500 Reset & Base \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    *,\n    *::before,\n    *::after {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n    }\n\n    :root {\n      --bg: #f6f0e4;\n      --surface: #ece5d1;\n      --gold: #870000;\n      --gold-light: #a11414;\n      --cream: #f0ead8;\n      --text: #2c1f0e;\n      --muted: #7a6a52;\n      \/* Geometry Constants *\/\n      --spine-w: 52px;\n      --book-w: 260px;\n      --book-h: 423px;\n    }\n\n    html {\n      scroll-behavior: smooth;\n    }\n\n    body {\n      background: var(--bg);\n      color: var(--text);\n      font-family: 'Playfair Display', Georgia, serif;\n      overflow-x: hidden;\n      cursor: auto;\n    }\n\n    \/* \u2500\u2500\u2500 Custom cursor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #cursor {\n      position: fixed;\n      width: 10px;\n      height: 10px;\n      background: var(--gold);\n      border-radius: 50%;\n      pointer-events: none;\n      transform: translate(-50%, -50%);\n      transition: transform 0.1s ease, width 0.25s, height 0.25s;\n      z-index: 9999;\n      mix-blend-mode: multiply;\n    }\n\n    #cursor-ring {\n      position: fixed;\n      width: 36px;\n      height: 36px;\n      border: 1px solid rgba(135, 96, 0, 0.4);\n      border-radius: 50%;\n      pointer-events: none;\n      transform: translate(-50%, -50%);\n      transition: transform 0.18s ease, width 0.25s, height 0.25s, border-color 0.25s;\n      z-index: 9998;\n    }\n\n    \/* \u2500\u2500\u2500 Hero Layout (top-center the book) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #hero {\n      min-height: 100vh;\n      display: flex;\n      justify-content: center; \/* center horizontally *\/\n      align-items: flex-start; \/* align to top *\/\n      padding-top: 2.5rem !important; \/* small offset from top *\/\n      padding-left: 0 !important;\n      padding-right: 0 !important;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .hero-text {\n      position: relative;\n      z-index: 2;\n    }\n\n    h1 {\n      font-size: clamp(4rem, 8vw, 7.5rem);\n      font-weight: 300;\n      line-height: 0.92;\n      margin-bottom: 1.6rem;\n    }\n\n    h1 em {\n      font-style: italic;\n      color: var(--gold-light);\n    }\n\n    .pretitle {\n      font-family: 'Inter', sans-serif;\n      font-size: 0.65rem;\n      letter-spacing: 0.35em;\n      text-transform: uppercase;\n      color: var(--gold);\n      margin-bottom: 1.4rem;\n    }\n\n    .tagline {\n      font-size: clamp(1.05rem, 1.8vw, 1.35rem);\n      font-weight: 400;\n      font-style: italic;\n      line-height: 1.75;\n      color: rgba(44, 31, 14, 0.80);\n      max-width: 38ch;\n      margin-bottom: 2.4rem;\n    }\n\n    \/* \u2500\u2500\u2500 IMPROVED 3D BOOK GEOMETRY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    .book-stage {\n      perspective: 1200px;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      position: relative;\n      z-index: 5;\n      cursor: grab;\n    }\n\n    \/* \u2500\u2500\u2500 Book shadow \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    .book-shadow {\n      position: absolute;\n      bottom: -28px;\n      left: 50%;\n      width: 260px;\n      height: 40px;\n      margin-left: -130px;\n      border-radius: 50%;\n      background: radial-gradient(ellipse at center, rgba(44, 20, 6, 0.55) 0%, rgba(44, 20, 6, 0.18) 45%, transparent 72%);\n      filter: blur(8px);\n      pointer-events: none;\n      will-change: transform, opacity;\n      z-index: 0;\n    }\n\n    .book-wrapper {\n      position: relative;\n      width: var(--book-w);\n      height: var(--book-h);\n      transform-style: preserve-3d;\n      will-change: transform;\n      transition: transform 0.1s ease-out;\n      user-select: none;\n      -webkit-user-select: none;\n    }\n\n    .face {\n      position: absolute;\n      backface-visibility: hidden;\n      background-color: #111;\n      \/* Dynamic Shading Layer *\/\n      --shade: 0;\n    }\n\n    \/* Dark overlay that reacts to JS variable --shade *\/\n    .face::after {\n      content: '';\n      position: absolute;\n      inset: 0;\n      background: black;\n      opacity: var(--shade);\n      pointer-events: none;\n      transition: opacity 0.1s ease;\n    }\n\n    \/* Front Face *\/\n    .front {\n      width: var(--book-w);\n      height: var(--book-h);\n      transform: rotateY(0deg) translateZ(calc(var(--spine-w) \/ 2));\n      z-index: 2;\n    }\n\n    \/* Back Face *\/\n    .back {\n      width: var(--book-w);\n      height: var(--book-h);\n      transform: rotateY(180deg) translateZ(calc(var(--spine-w) \/ 2));\n    }\n\n    \/* Spine Face (Left) *\/\n    .spine {\n      width: var(--spine-w);\n      height: var(--book-h);\n      left: 50%;\n      margin-left: calc(var(--spine-w) \/ -2);\n      transform: rotateY(-90deg) translateZ(calc(var(--book-w) \/ 2));\n    }\n\n    \/* Pages Face (Right) *\/\n    .pages {\n      width: var(--spine-w);\n      height: var(--book-h);\n      left: 50%;\n      margin-left: calc(var(--spine-w) \/ -2);\n      transform: rotateY(90deg) translateZ(calc(var(--book-w) \/ 2));\n      background: repeating-linear-gradient(to right, #ede3c8, #ede3c8 2px, #d6c9a8 3px);\n    }\n\n    \/* Top Face (Closing the box) *\/\n    .top-face {\n      width: var(--book-w);\n      height: var(--spine-w);\n      top: 50%;\n      margin-top: calc(var(--spine-w) \/ -2);\n      transform: rotateX(90deg) translateZ(calc(var(--book-h) \/ 2));\n      background: #ede3c8;\n    }\n\n    \/* Bottom Face (Closing the box) *\/\n    .bottom-face {\n      width: var(--book-w);\n      height: var(--spine-w);\n      top: 50%;\n      margin-top: calc(var(--spine-w) \/ -2);\n      transform: rotateX(-90deg) translateZ(calc(var(--book-h) \/ 2));\n      background: #ede3c8;\n    }\n\n    \/* \u2500\u2500\u2500 Book Cover Design \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    \/* Cover sprite: BookCover.jpg scaled to 914\u00d7423 (book height)\n         Layout: [174px back-flap] [260px back] [52px spine] [260px front] [168px front-flap]\n         Measured from pixel scan of the high-res print file. *\/\n    :root {\n      --cvr-bg: url('images\/BookCover.jpg');\n      --cvr-sz: 914px 423px;\n    }\n\n    .front-inner {\n      width: 100%;\n      height: 100%;\n      background: var(--cvr-bg) no-repeat;\n      background-size: var(--cvr-sz);\n      background-position: -486px 0;\n    }\n\n    .spine-inner {\n      width: 100%;\n      height: 100%;\n      background: var(--cvr-bg) no-repeat;\n      background-size: var(--cvr-sz);\n      background-position: -434px 0;\n    }\n\n    .back-inner {\n      width: 100%;\n      height: 100%;\n      background: var(--cvr-bg) no-repeat;\n      background-size: var(--cvr-sz);\n      background-position: -174px 0;\n    }\n\n    \/* \u2500\u2500\u2500 Bookmark (SVG cloth) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    .bookmark-svg {\n      position: absolute;\n      top: calc(var(--book-h) - 28px);\n      left: 60px;\n      transform: translateZ(10px);\n      z-index: 10;\n      overflow: visible;\n      pointer-events: none;\n    }\n\n    \/* \u2500\u2500\u2500 Noise overlay \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    body::before {\n      content: '';\n      position: fixed;\n      inset: 0;\n      background-image: url(\"data:image\/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'\/%3E%3C\/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'\/%3E%3C\/svg%3E\");\n      background-size: 200px;\n      pointer-events: none;\n      z-index: 100;\n      opacity: 0.12;\n    }\n\n    \/* \u2500\u2500\u2500 Hero glow behind book \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #hero::after {\n      content: '';\n      position: absolute;\n      right: 18%;\n      top: 50%;\n      transform: translateY(-50%);\n      width: 420px;\n      height: 420px;\n      background: radial-gradient(circle, rgba(135, 96, 0, 0.09) 0%, transparent 70%);\n      border-radius: 50%;\n      pointer-events: none;\n      filter: blur(20px);\n    }\n\n    \/* \u2500\u2500\u2500 Hero text \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    .pretitle {\n      font-family: 'Inter', sans-serif;\n      font-size: 0.65rem;\n      font-weight: 500;\n      letter-spacing: 0.35em;\n      text-transform: uppercase;\n      color: var(--gold);\n      margin-bottom: 1.4rem;\n      opacity: 0;\n      animation: fadeUp 0.8s 0.2s ease forwards;\n    }\n\n    h1 {\n      font-size: clamp(4rem, 8vw, 7.5rem);\n      font-weight: 300;\n      line-height: 0.92;\n      letter-spacing: -0.02em;\n      color: var(--text);\n      margin-bottom: 1.6rem;\n      opacity: 0;\n      animation: fadeUp 0.9s 0.35s ease forwards;\n    }\n\n    h1 em {\n      font-style: italic;\n      color: var(--gold-light);\n    }\n\n    .tagline {\n      font-size: clamp(1.05rem, 1.8vw, 1.35rem);\n      font-weight: 300;\n      font-style: italic;\n      line-height: 1.65;\n      color: rgba(44, 31, 14, 0.68);\n      max-width: 38ch;\n      margin-bottom: 2.4rem;\n      opacity: 0;\n      animation: fadeUp 0.9s 0.5s ease forwards;\n    }\n\n    .cta {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.7rem;\n      font-family: 'Inter', sans-serif;\n      font-size: 0.7rem;\n      font-weight: 500;\n      letter-spacing: 0.28em;\n      text-transform: uppercase;\n      text-decoration: none;\n      color: var(--gold);\n      border-bottom: 1px solid rgba(135, 96, 0, 0.35);\n      padding-bottom: 3px;\n      transition: color 0.25s, border-color 0.25s, gap 0.25s;\n      opacity: 0;\n      animation: fadeUp 0.9s 0.65s ease forwards;\n    }\n\n    .cta:hover {\n      color: var(--gold-light);\n      border-color: var(--gold-light);\n      gap: 1.1rem;\n    }\n\n    .cta svg {\n      transition: transform 0.25s;\n    }\n\n    .cta:hover svg {\n      transform: translateX(4px);\n    }\n\n    \/* \u2500\u2500\u2500 UI Components \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    .drag-hint {\n      position: absolute;\n      bottom: -5rem;\n      left: 50%;\n      transform: translateX(-50%);\n      display: flex;\n      align-items: center;\n      gap: 0.45rem;\n      font-family: 'Inter', sans-serif;\n      font-size: 0.6rem;\n      letter-spacing: 0.22em;\n      text-transform: uppercase;\n      color: var(--muted);\n      white-space: nowrap;\n      pointer-events: none;\n      opacity: 1;\n      transition: opacity 0.5s;\n    }\n\n    .drag-hint.hidden {\n      opacity: 0;\n    }\n\n    .divider {\n      width: 1px;\n      height: 80px;\n      background: linear-gradient(to bottom, transparent, var(--gold), transparent);\n      margin: 0 auto;\n    }\n\n    \/* \u2500\u2500\u2500 Sections \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    section {\n      padding: 7rem clamp(2rem, 10vw, 14rem);\n      position: relative;\n    }\n\n    .reveal {\n      opacity: 0;\n      transform: translateY(28px);\n      transition: opacity 0.9s ease, transform 0.9s ease;\n    }\n\n    .reveal.visible {\n      opacity: 1;\n      transform: none;\n    }\n\n    .section-label {\n      font-family: 'Inter', sans-serif;\n      font-size: 0.62rem;\n      font-weight: 500;\n      letter-spacing: 0.32em;\n      text-transform: uppercase;\n      color: var(--gold);\n      padding-top: 6px;\n    }\n\n    \/* \u2500\u2500\u2500 Bio \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #bio {\n      display: grid;\n      grid-template-columns: 1fr 2fr;\n      gap: 4rem;\n      align-items: start;\n      padding-top: 5rem;\n      padding-bottom: 5rem;\n    }\n\n    .bio-text {\n      font-size: clamp(1.1rem, 1.6vw, 1.3rem);\n      font-weight: 400;\n      line-height: 1.9;\n      color: rgba(44, 31, 14, 0.85);\n    }\n\n    \/* \u2500\u2500\u2500 Quote \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #quote {\n      background: var(--surface);\n      text-align: center;\n      padding: 7rem clamp(2rem, 14vw, 20rem);\n      border-top: 1px solid rgba(135, 96, 0, 0.12);\n      border-bottom: 1px solid rgba(135, 96, 0, 0.12);\n    }\n\n    blockquote {\n      font-size: clamp(1.5rem, 3vw, 2.4rem);\n      font-weight: 400;\n      font-style: italic;\n      line-height: 1.65;\n      color: var(--text);\n      position: relative;\n      padding: 0 1rem;\n    }\n\n    blockquote::before {\n      content: '\\201C';\n      position: absolute;\n      top: -0.6em;\n      left: -0.3em;\n      font-size: 5em;\n      line-height: 1;\n      color: rgba(135, 96, 0, 0.10);\n      font-style: normal;\n      pointer-events: none;\n    }\n\n    cite {\n      display: block;\n      font-family: 'Inter', sans-serif;\n      font-size: 0.65rem;\n      font-weight: 400;\n      letter-spacing: 0.25em;\n      text-transform: uppercase;\n      color: var(--gold);\n      margin-top: 2rem;\n      font-style: normal;\n    }\n\n    \/* \u2500\u2500\u2500 Author \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #author {\n      display: grid;\n      grid-template-columns: 120px 1fr auto;\n      gap: 3rem;\n      align-items: start;\n      padding-top: 6rem;\n      padding-bottom: 6rem;\n    }\n\n    .author-avatar {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      border: 1px solid rgba(135, 96, 0, 0.25);\n      overflow: hidden;\n      flex-shrink: 0;\n      box-shadow: 0 4px 20px rgba(44, 31, 14, 0.18);\n    }\n\n    .author-avatar img {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n      object-position: center top;\n      display: block;\n    }\n\n    .author-content h2 {\n      font-size: clamp(1.6rem, 2.5vw, 2.4rem);\n      font-weight: 400;\n      color: var(--text);\n      margin-bottom: 1rem;\n    }\n\n    .author-content p {\n      font-size: clamp(1rem, 1.4vw, 1.2rem);\n      font-weight: 400;\n      font-style: normal;\n      line-height: 1.9;\n      color: rgba(44, 31, 14, 0.82);\n      max-width: 60ch;\n      margin-bottom: 1.8rem;\n    }\n\n    .author-link {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.6rem;\n      font-family: 'Inter', sans-serif;\n      font-size: 0.65rem;\n      font-weight: 500;\n      letter-spacing: 0.28em;\n      text-transform: uppercase;\n      text-decoration: none;\n      color: var(--gold);\n      border-bottom: 1px solid rgba(135, 96, 0, 0.3);\n      padding-bottom: 3px;\n      transition: color 0.25s, border-color 0.25s, gap 0.25s;\n    }\n\n    .author-link:hover {\n      color: var(--gold-light);\n      border-color: var(--gold-light);\n      gap: 1rem;\n    }\n\n    \/* \u2500\u2500\u2500 Bookshelf \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    .shelf-wrap {\n      display: inline-block;\n      position: relative;\n      margin-top: 2rem;\n    }\n\n    .shelf-books {\n      display: flex;\n      align-items: flex-end;\n      gap: 5px;\n      padding: 0 8px;\n    }\n\n    .shelf-book {\n      position: relative;\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n      align-items: center;\n      padding: 14px 0 10px;\n      border-radius: 2px 2px 0 0;\n      cursor: pointer;\n      text-decoration: none;\n      transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.3s ease, filter 0.3s ease;\n      box-shadow: 2px 0 6px rgba(0, 0, 0, 0.18), -1px 0 3px rgba(0, 0, 0, 0.1);\n    }\n\n    .shelf-book:hover {\n      transform: translateY(-8px) scale(1.02);\n      box-shadow: 4px 6px 15px rgba(0, 0, 0, 0.25);\n      z-index: 2;\n    }\n\n    .shelf-book::after {\n      content: '';\n      position: absolute;\n      top: 0;\n      bottom: 0;\n      left: 0;\n      width: 3px;\n      background: linear-gradient(to right, rgba(255, 255, 255, 0.08), transparent);\n      border-radius: 2px 0 0 0;\n    }\n\n    .shelf-book:hover {\n      transform: translateY(-10px);\n      box-shadow: 4px 0 16px rgba(0, 0, 0, 0.25), -1px 0 4px rgba(0, 0, 0, 0.12);\n    }\n\n    .shelf-book span {\n      writing-mode: vertical-rl;\n      transform: rotate(180deg);\n      text-align: center;\n    }\n\n    .sb-title {\n      font-family: 'Playfair Display', serif;\n      font-size: 10.5px;\n      font-weight: 400;\n      letter-spacing: 0.14em;\n      color: var(--cream);\n      text-transform: uppercase;\n      flex: 1;\n      display: flex;\n      align-items: center;\n    }\n\n    .sb-author {\n      font-family: 'Inter', sans-serif;\n      font-size: 6.5px;\n      letter-spacing: 0.18em;\n      color: rgba(240, 234, 216, 0.45);\n      text-transform: uppercase;\n      margin: 6px 0;\n    }\n\n    .sb-year {\n      font-family: 'Inter', sans-serif;\n      font-size: 6.5px;\n      letter-spacing: 0.12em;\n      color: rgba(240, 234, 216, 0.3);\n    }\n\n    .sb-sodoma {\n      width: 44px;\n      height: 185px;\n      background: linear-gradient(180deg, #3b0a0a 0%, #220505 50%, #1a0206 100%);\n    }\n\n    .sb-sodoma .sb-title {\n      color: #e8c97e;\n    }\n\n    .sb-smart {\n      width: 34px;\n      height: 168px;\n      background: linear-gradient(180deg, #1c3a28 0%, #0e2018 100%);\n    }\n\n    .sb-globalgay {\n      width: 32px;\n      height: 162px;\n      background: linear-gradient(180deg, #2e1820 0%, #1a0d12 100%);\n    }\n\n    .sb-mainstream {\n      width: 40px;\n      height: 175px;\n      background: linear-gradient(180deg, #10213a 0%, #081220 100%);\n    }\n\n    .sb-culture {\n      width: 42px;\n      height: 178px;\n      background: linear-gradient(180deg, #1e1a0c 0%, #110e06 100%);\n    }\n\n    .shelf-plank {\n      height: 14px;\n      background: linear-gradient(180deg, #c4924e 0%, #a06e30 55%, #7a5020 100%);\n      border-radius: 2px;\n      margin: 0 -6px;\n      box-shadow: 0 5px 18px rgba(0, 0, 0, 0.22), inset 0 1px 0 rgba(255, 255, 255, 0.28), inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n    }\n\n    .shelf-shadow {\n      height: 10px;\n      background: radial-gradient(ellipse at center, rgba(44, 31, 14, 0.18) 0%, transparent 70%);\n      margin: 2px -6px 0;\n    }\n\n    \/* \u2500\u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    footer {\n      border-top: 1px solid rgba(135, 96, 0, 0.14);\n      padding: 2.5rem clamp(2rem, 8vw, 8rem);\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      gap: 1rem;\n    }\n\n    footer p {\n      font-family: 'Inter', sans-serif;\n      font-size: 0.6rem;\n      letter-spacing: 0.2em;\n      color: var(--muted);\n      text-transform: uppercase;\n    }\n\n    .footer-dot {\n      width: 4px;\n      height: 4px;\n      border-radius: 50%;\n      background: rgba(135, 96, 0, 0.3);\n    }\n\n\n\n    .cms-fields {\n      flex: 1;\n      overflow-y: auto;\n      padding: 1.5rem;\n      display: flex;\n      flex-direction: column;\n      gap: 1.5rem;\n    }\n\n    .cms-field label {\n      display: block;\n      font-size: 0.7rem;\n      font-weight: 600;\n      color: var(--gold);\n      margin-bottom: 0.5rem;\n      text-transform: uppercase;\n      letter-spacing: 0.1em;\n    }\n\n    .cms-field textarea {\n      width: 100%;\n      min-height: 80px;\n      padding: 0.8rem;\n      font-family: inherit;\n      font-size: 0.85rem;\n      border: 1px solid rgba(135, 96, 0, 0.2);\n      border-radius: 4px;\n      background: rgba(255, 255, 255, 0.6);\n      color: var(--text);\n      resize: vertical;\n      line-height: 1.6;\n      transition: border-color 0.25s, background 0.25s;\n    }\n\n    .cms-field textarea:focus {\n      outline: none;\n      border-color: var(--gold);\n      background: #fff;\n    }\n\n    .cms-footer {\n      padding: 1.5rem;\n      border-top: 1px solid rgba(135, 96, 0, 0.1);\n      background: var(--surface);\n    }\n\n    #cms-save {\n      width: 100%;\n      padding: 1rem;\n      background: var(--gold);\n      color: #fff;\n      border: none;\n      border-radius: 4px;\n      font-weight: 600;\n      font-size: 0.8rem;\n      cursor: pointer;\n      text-transform: uppercase;\n      letter-spacing: 0.15em;\n      transition: background 0.25s;\n    }\n\n    #cms-save:hover {\n      background: var(--gold-light);\n    }\n\n    #cms-save:disabled {\n      background: var(--muted);\n      cursor: not-allowed;\n    }\n\n    .cms-notification {\n      position: fixed;\n      bottom: 30px;\n      left: 50%;\n      transform: translateX(-50%) translateY(20px);\n      background: #111;\n      color: #fff;\n      padding: 12px 24px;\n      border-radius: 4px;\n      font-family: 'Inter', sans-serif;\n      font-size: 13px;\n      letter-spacing: 0.05em;\n      opacity: 0;\n      pointer-events: none;\n      transition: opacity 0.3s, transform 0.3s;\n      z-index: 10001;\n    }\n\n    .cms-notification.show {\n      opacity: 1;\n      transform: translateX(-50%) translateY(0);\n    }\n\n    #admin-login-trigger {\n      font-family: 'Inter', sans-serif;\n      font-size: 0.6rem;\n      letter-spacing: 0.2em;\n      color: var(--muted);\n      text-transform: uppercase;\n      text-decoration: none;\n      cursor: pointer;\n      position: relative;\n      z-index: 20;\n      transition: color 0.2s;\n    }\n\n    #admin-login-trigger:hover {\n      color: var(--gold);\n    }\n\n    \/* \u2500\u2500\u2500 Animations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    @keyframes fadeUp {\n      from {\n        opacity: 0;\n        transform: translateY(22px);\n      }\n\n      to {\n        opacity: 1;\n        transform: translateY(0);\n      }\n    }\n\n    @keyframes fadeIn {\n      from {\n        opacity: 0;\n      }\n\n      to {\n        opacity: 1;\n      }\n    }\n\n    \/* \u2500\u2500\u2500 Language Switcher \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #lang-switcher {\n      position: fixed;\n      top: 1.5rem;\n      right: clamp(2rem, 8vw, 8rem);\n      z-index: 9997;\n      display: flex;\n      border: 1px solid rgba(135, 96, 0, 0.28);\n      border-radius: 4px;\n      overflow: hidden;\n      background: rgba(246, 240, 228, 0.88);\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n    }\n\n    #lang-switcher button {\n      font-family: 'Inter', sans-serif;\n      font-size: 0.58rem;\n      font-weight: 500;\n      letter-spacing: 0.2em;\n      text-transform: uppercase;\n      color: var(--muted);\n      background: transparent;\n      border: none;\n      padding: 0.5rem 0.8rem;\n      cursor: none;\n      transition: background 0.2s, color 0.2s;\n    }\n\n    #lang-switcher button+button {\n      border-left: 1px solid rgba(135, 96, 0, 0.2);\n    }\n\n    #lang-switcher button:hover {\n      color: var(--gold);\n    }\n\n    #lang-switcher button.active {\n      background: rgba(135, 96, 0, 0.1);\n      color: var(--gold);\n    }\n\n    @media (max-width: 860px) {\n      body, a, button, #lang-switcher button {\n        cursor: auto;\n      }\n      #cursor, #cursor-ring {\n        display: none !important;\n      }\n\n      #hero {\n        grid-template-columns: 1fr;\n        text-align: center;\n        padding-top: 5rem;\n        padding-bottom: 3rem;\n      }\n\n      .hero-text {\n        order: 2;\n      }\n\n      .book-stage {\n        order: 1;\n        margin-bottom: 5rem;\n      }\n\n      .tagline {\n        margin: 0 auto 2.4rem;\n      }\n\n      .cta {\n        display: none;\n      }\n\n      #bio {\n        grid-template-columns: 1fr;\n        gap: 1.5rem;\n      }\n\n      #author {\n        grid-template-columns: 1fr;\n        text-align: center;\n      }\n\n      .author-avatar {\n        margin: 0 auto;\n      }\n\n      #author {\n        grid-template-columns: 1fr;\n      }\n\n      .author-shelf {\n        order: 3;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n      }\n\n      footer {\n        flex-direction: column;\n        text-align: center;\n      }\n\n      footer .footer-dot {\n        display: none;\n      }\n    }\n  <\/style>\n  <style>\n    \/* Remove paddings site-wide for a tight layout and eliminate bottom spacing *\/\n    html, body {\n      height: 100%;\n      min-height: 100%;\n      margin: 0;\n      padding: 0 !important;\n      box-sizing: border-box;\n    }\n    body { padding-bottom: 0 !important; }\n\n    body, section, footer, .shelf-wrap, .shelf-books, .book-stage, .book-wrapper {\n      padding: 0 !important;\n      margin: 0 !important;\n    }\n\n    \/* Explicitly remove bottom padding on sections and footer *\/\n    section, footer { padding-bottom: 0 !important; }\n\n    \/* Ensure no bottom margin on book elements *\/\n    .book-stage, .book-wrapper { margin-bottom: 0 !important; }\n\n    \/* Ensure drag hint doesn't offset layout *\/\n    .drag-hint { bottom: 0 !important; left: 50% !important; transform: translateX(-50%) !important; }\n  <\/style>\n<\/head>\n\n<body>\n\n  <section id=\"hero\">\n    <div class=\"book-stage\">\n      <div class=\"book-shadow\" id=\"book-shadow\"><\/div>\n      <div class=\"book-wrapper\" id=\"book\">\n        <div class=\"face front\" data-face=\"front\">\n          <div class=\"front-inner\"><\/div>\n        <\/div>\n        <div class=\"face back\" data-face=\"back\">\n          <div class=\"back-inner\"><\/div>\n        <\/div>\n        <div class=\"face spine\" data-face=\"spine\">\n          <div class=\"spine-inner\"><\/div>\n        <\/div>\n        <div class=\"face pages\" data-face=\"pages\"><\/div>\n        <div class=\"face top-face\" data-face=\"top\"><\/div>\n        <div class=\"face bottom-face\" data-face=\"bottom\"><\/div>\n        <svg id=\"bookmark-svg\" class=\"bookmark-svg\" width=\"30\" height=\"10\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n          overflow=\"visible\">\n          <defs>\n            <linearGradient id=\"bm-grad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n              <stop offset=\"0%\" stop-color=\"#7a1a24\" \/>\n              <stop offset=\"40%\" stop-color=\"#8f2030\" \/>\n              <stop offset=\"70%\" stop-color=\"#7e1c2b\" \/>\n              <stop offset=\"100%\" stop-color=\"#651520\" \/>\n            <\/linearGradient>\n            <linearGradient id=\"bm-shine\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n              <stop offset=\"0%\" stop-color=\"rgba(255,255,255,0)\" \/>\n              <stop offset=\"25%\" stop-color=\"rgba(255,255,255,0.09)\" \/>\n              <stop offset=\"50%\" stop-color=\"rgba(255,255,255,0)\" \/>\n            <\/linearGradient>\n          <\/defs>\n          <path id=\"bm-body\" fill=\"url(#bm-grad)\" \/>\n          <path id=\"bm-shine\" fill=\"url(#bm-shine)\" opacity=\"0.55\" \/>\n        <\/svg>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <script>\n    \/\/ \u2500\u2500\u2500 3D BOOK LOGIC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const book = document.getElementById('book');\n    const stage = document.querySelector('.book-stage');\n    const hint = document.getElementById('drag-hint');\n    const faces = document.querySelectorAll('.face');\n    const shadow = document.getElementById('book-shadow');\n    const bmBody = document.getElementById('bm-body');\n    const bmShine = document.getElementById('bm-shine');\n\n    let rotY = -30, rotX = 28;\n    const INIT_ROT_Y = -30, INIT_ROT_X = 28;\n    let isDragging = false;\n    let lastX = 0, lastY = 0;\n    let hasInteracted = false;\n    \/\/ Inertia variables\n    let velocityX = 0, velocityY = 0;\n    let inertiaActive = false;\n    let snapBackActive = false;\n\n    \/\/ \u2500\u2500 Verlet cloth chain for bookmark \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const BM_N = 14;   \/\/ more nodes for smoother cloth\n    const BM_SEG = 6;    \/\/ px per segment \u2192 60px total\n    const BM_HALF_W = 11;   \/\/ ribbon half-width\n    const BM_G = 0.5;  \/\/ gravity strength\n    const BM_DAMP = 0.96;\n    const BM_STIFF = 0.32; \/\/ bending stiffness (lower = more floppy)\n    const BM_AX = 15, BM_AY = 0;\n    let bmPos = [], bmOld = [];\n    for (let i = 0; i < BM_N; i++) {\n      bmPos.push({ x: BM_AX, y: i * BM_SEG });\n      bmOld.push({ x: BM_AX, y: i * BM_SEG });\n    }\n    \/\/ Track previous rotation to compute angular velocity for inertia\n    let prevRotY = rotY, prevRotX = rotX;\n\n    function updateBookmark() {\n      const rxR = rotX * Math.PI \/ 180;\n      const ryR = rotY * Math.PI \/ 180;\n\n      \/\/ \u2500\u2500 Proper gravity projection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      \/\/ World gravity (0,1,0) projected into bookmark's SVG local axes\n      \/\/ via inverse of book transform rotateY(rotY)*rotateX(rotX):\n      const gy = BM_G * Math.cos(rxR);                   \/\/ vertical pull, weakens as book tilts\n      const gx = BM_G * Math.sin(rxR) * Math.sin(ryR);   \/\/ horizontal when tilted in both axes\n\n      \/\/ \u2500\u2500 Inertial drag from rotation velocity \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      \/\/ When book spins (\u0394rotY), ribbon lags \u2192 swings opposite to spin\n      \/\/ When book tilts (\u0394rotX), ribbon tip leads the tilt\n      const dRotY = rotY - prevRotY;\n      const dRotX = rotX - prevRotX;\n      prevRotY = rotY;\n      prevRotX = rotX;\n\n      \/\/ Verlet integrate free nodes\n      for (let i = 1; i < BM_N; i++) {\n        const t = i \/ (BM_N - 1); \/\/ 0 at anchor \u2192 1 at tip\n        const vx = (bmPos[i].x - bmOld[i].x) * BM_DAMP;\n        const vy = (bmPos[i].y - bmOld[i].y) * BM_DAMP;\n        bmOld[i].x = bmPos[i].x; bmOld[i].y = bmPos[i].y;\n        \/\/ Inertial kick: tip swings more than root, rotY drives x, rotX drives y\n        bmPos[i].x += vx + gx - dRotY * 0.22 * t;\n        bmPos[i].y += vy + gy - dRotX * 0.14 * t;\n      }\n\n      \/\/ Distance + anchor constraints (10 iterations for stability)\n      for (let iter = 0; iter < 10; iter++) {\n        bmPos[0].x = BM_AX; bmPos[0].y = BM_AY;\n        for (let i = 0; i < BM_N - 1; i++) {\n          const dx = bmPos[i + 1].x - bmPos[i].x;\n          const dy = bmPos[i + 1].y - bmPos[i].y;\n          const dist = Math.sqrt(dx * dx + dy * dy) || 0.001;\n          const diff = (dist - BM_SEG) \/ dist;\n          if (i === 0) {\n            bmPos[i + 1].x -= dx * diff;\n            bmPos[i + 1].y -= dy * diff;\n          } else {\n            bmPos[i].x += dx * diff * 0.5;\n            bmPos[i].y += dy * diff * 0.5;\n            bmPos[i + 1].x -= dx * diff * 0.5;\n            bmPos[i + 1].y -= dy * diff * 0.5;\n          }\n        }\n      }\n\n      \/\/ Bending stiffness\n      for (let i = 1; i < BM_N - 1; i++) {\n        bmPos[i].x += ((bmPos[i - 1].x + bmPos[i + 1].x) \/ 2 - bmPos[i].x) * BM_STIFF;\n        bmPos[i].y += ((bmPos[i - 1].y + bmPos[i + 1].y) \/ 2 - bmPos[i].y) * BM_STIFF;\n      }\n      bmPos[0].x = BM_AX; bmPos[0].y = BM_AY;\n\n      \/\/ Build ribbon polygon (left edge \u2192 tip \u2192 right edge)\n      const L = [], R = [];\n      for (let i = 0; i < BM_N; i++) {\n        let tdx, tdy;\n        if (i < BM_N - 1) { tdx = bmPos[i + 1].x - bmPos[i].x; tdy = bmPos[i + 1].y - bmPos[i].y; }\n        else { tdx = bmPos[i].x - bmPos[i - 1].x; tdy = bmPos[i].y - bmPos[i - 1].y; }\n        const tlen = Math.sqrt(tdx * tdx + tdy * tdy) || 1;\n        const px = -tdy \/ tlen, py = tdx \/ tlen;\n        const w = BM_HALF_W * (i === BM_N - 1 ? 0 : 1);\n        L.push({ x: bmPos[i].x + px * w, y: bmPos[i].y + py * w });\n        R.push({ x: bmPos[i].x - px * w, y: bmPos[i].y - py * w });\n      }\n      const tip = bmPos[BM_N - 1];\n      const f = (v) => v.toFixed(2);\n      let d = `M${f(L[0].x)} ${f(L[0].y)}`;\n      for (let i = 1; i < BM_N - 1; i++) d += ` L${f(L[i].x)} ${f(L[i].y)}`;\n      d += ` L${f(tip.x)} ${f(tip.y)}`;\n      for (let i = BM_N - 2; i >= 0; i--) d += ` L${f(R[i].x)} ${f(R[i].y)}`;\n      d += ' Z';\n      bmBody.setAttribute('d', d);\n      bmShine.setAttribute('d', d);\n    }\n\n    function updateBook() {\n      \/\/ Apply rotation\n      book.style.transform = `rotateY(${rotY}deg) rotateX(${rotX}deg)`;\n\n      \/\/ DYNAMIC LIGHTING CALCULATION\n      \/\/ We assume a light source is sitting at the front-right (approx 45deg)\n      const lightAngle = 45;\n\n      faces.forEach(face => {\n        const type = face.getAttribute('data-face');\n        let angleOffset = 0;\n\n        \/\/ Map face orientation to degrees\n        if (type === 'front') angleOffset = 0;\n        if (type === 'pages') angleOffset = 90;\n        if (type === 'back') angleOffset = 180;\n        if (type === 'spine') angleOffset = 270;\n\n        \/\/ Calculate how much the face \"sees\" the light\n        \/\/ Math.cos of the difference determines the brightness\n        const faceAngle = (rotY + angleOffset) % 360;\n        const rad = (faceAngle - lightAngle) * (Math.PI \/ 180);\n        const intensity = (Math.cos(rad) + 1) \/ 2; \/\/ Normalize to 0-1\n\n        \/\/ Apply shade (inverse of intensity). \n        \/\/ 0.7 is the max darkness so it's never pitch black.\n        const shade = (1 - intensity) * 0.7;\n        face.style.setProperty('--shade', shade);\n      });\n\n      \/\/ \u2500\u2500 Realtime shadow \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const rxR = rotX * Math.PI \/ 180;\n      const ryR = rotY * Math.PI \/ 180;\n      \/\/ scaleX: narrowest when edge-on (rotY=\u00b190), full when facing forward\n      const sx = Math.abs(Math.cos(ryR)) * 0.55 + 0.45;\n      \/\/ shadow shifts laterally opposite to book's Y rotation\n      const tx = -Math.sin(ryR) * 55;\n      \/\/ shadow shifts down as book tilts back (rotX > 0 = top toward viewer)\n      const ty = Math.sin(rxR) * 30;\n      \/\/ lighten shadow as book tilts dramatically\n      const op = 0.9 - Math.abs(rotX) \/ 45 * 0.35;\n      shadow.style.transform = `translateX(${tx.toFixed(1)}px) translateY(${ty.toFixed(1)}px) scaleX(${sx.toFixed(3)})`;\n      shadow.style.opacity = op.toFixed(3);\n    }\n\n    \/\/ Initial Call\n    updateBook();\n\n    \/\/ Drag Events\n    function startDrag(x, y) {\n      isDragging = true;\n      lastX = x; lastY = y;\n      hint.classList.add('hidden');\n      hasInteracted = true;\n      velocityX = 0;\n      velocityY = 0;\n      inertiaActive = false;\n    }\n\n    function moveDrag(x, y) {\n      if (!isDragging) return;\n      const dx = x - lastX;\n      const dy = y - lastY;\n\n      rotY += dx * 0.5;\n      rotX -= dy * 0.5;\n\n      \/\/ Limit X rotation to prevent flipping upside down\n      rotX = Math.max(-45, Math.min(45, rotX));\n\n      \/\/ Store velocity for inertia (pixels per frame)\n      velocityY = dx * 0.5;\n      velocityX = -dy * 0.5;\n\n      lastX = x; lastY = y;\n      updateBook();\n    }\n\n    stage.addEventListener('mousedown', e => { e.preventDefault(); startDrag(e.clientX, e.clientY); });\n    window.addEventListener('mousemove', e => moveDrag(e.clientX, e.clientY));\n    window.addEventListener('mouseup', () => {\n      isDragging = false;\n      hint.classList.remove('hidden');\n      \/\/ Always snap back to initial rotation after dragging\n      velocityX = 0; velocityY = 0;\n      inertiaActive = false;\n      snapBackActive = true;\n    });\n\n    \/\/ Mobile Touch\n    stage.addEventListener('touchstart', e => startDrag(e.touches[0].clientX, e.touches[0].clientY));\n    window.addEventListener('touchmove', e => moveDrag(e.touches[0].clientX, e.touches[0].clientY));\n    window.addEventListener('touchend', () => {\n      isDragging = false;\n      hint.classList.remove('hidden');\n      \/\/ Always snap back to initial rotation after dragging\n      velocityX = 0; velocityY = 0;\n      inertiaActive = false;\n      snapBackActive = true;\n    });\n\n    \/\/ Idle Rotation (Slowly spins until user touches it)\n    function idleSpin() {\n      if (isDragging) {\n        \/\/ No idle or inertia while dragging\n      } else if (inertiaActive) {\n        \/\/ Inertia animation\n        rotY += velocityY;\n        rotX += velocityX;\n        \/\/ Clamp X rotation\n        rotX = Math.max(-45, Math.min(45, rotX));\n        \/\/ Friction\n        velocityY *= 0.94;\n        velocityX *= 0.94;\n        \/\/ Stop inertia if slow\n        if (Math.abs(velocityX) < 0.1 && Math.abs(velocityY) < 0.1) {\n          inertiaActive = false;\n          snapBackActive = true;\n        }\n        updateBook();\n      } else if (snapBackActive) {\n        \/\/ Snap back to initial rotation (slower, more satisfying)\n        \/\/ Use a smaller lerp factor for slower movement\n        const snapLerp = 0.045; \/\/ smaller = slower\n        rotY += (INIT_ROT_Y - rotY) * snapLerp;\n        rotX += (INIT_ROT_X - rotX) * snapLerp;\n        \/\/ Clamp X rotation\n        rotX = Math.max(-45, Math.min(45, rotX));\n        \/\/ If close enough, stop snapping (ease out)\n        if (Math.abs(rotY - INIT_ROT_Y) < 0.08 && Math.abs(rotX - INIT_ROT_X) < 0.08) {\n          rotY = INIT_ROT_Y;\n          rotX = INIT_ROT_X;\n          snapBackActive = false;\n        }\n        updateBook();\n      } else {\n        \/\/ Idle spin\n        rotY += 0.2;\n        updateBook();\n      }\n      updateBookmark();\n      requestAnimationFrame(idleSpin);\n    }\n    idleSpin();\n\n    \/\/ Intersection Observer for animations\n    const observer = new IntersectionObserver(entries => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) entry.target.classList.add('visible');\n      });\n    }, { threshold: 0.1 });\n\n    document.querySelectorAll('.reveal').forEach(el => observer.observe(el));\n\n    \/\/ \u2500\u2500\u2500 I18N & CMS INTEGRATION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const defaultTranslations = {\n      en: {\n        pretitle: 'New Release \u00b7 2026',\n        tagline: '\u00ab Occidents \u00bb draws on hundreds of portraits and testimonies. By seeking to explain the \u00ab West \u00bb through the hatreds it provokes, the author ultimately, at the end of this exceptional reportage (around 2000 interviews in 52 countries), sheds light on the truth of what we are.',\n        cta: 'Discover the book',\n        'drag-hint': 'Drag to rotate 360\u00b0',\n        'bio-label': 'About the Book',\n        'bio-text': 'A global war of ideas is unfolding before our eyes. Yet we have not fully grasped that it is directed against our most fundamental values: democracy, pluralism, human rights, freedom of expression. From Moscow to Beijing, from Caracas to Tehran, our enemies seek to dismantle Europe and destroy the West. To better understand this threat, the journalist and researcher Fr\u00e9d\u00e9ric Martel travelled widely, conducting fieldwork and \u00ab face to face \u00bb with the intellectuals of Xi Jinping, the ideologues of Vladimir Putin, the propagandists of Hamas \u2013 but also with advisers to Donald Trump. Over the course of an eight-year investigation, carried out in fifty-two countries, he interviewed nearly two thousand protagonists \u2013 witnesses and actors alike \u2013 in the vast disorder of the contemporary world. This \"larger than life\" book reveals the hidden side of our current history. It tells the story of our age and its obsession with the \u00ab West \u00bb \u2013 rejected by those who, like China or Iran, seek to annihilate it; glorified by others, from Russian and Hungarian to American and Brazilian populists, who claim to exalt it. There is no longer a single West, but many \u00ab Wests \u00bb \u2013 projected, imagined, often contradictory. In the end, those who demand \u00ab more \u00bb West converge with those who want \u00ab less \u00bb of it: a convergence of extremes and, in both cases, the same illusion. The same pathology. Such is the subject of this book: the West and its enemies. Our enemies.',\n        'quote-text': '\"This book is not an essay \u2013 it is a work of field investigation. I went everywhere, infiltrating our enemies as no one had previously done from such a scale and global perspective. I set out to meet and interview the \u00ab bad guys \u00bb, the \u00ab villains \u00bb of our time \u2013 our enemies. And in doing so, I ultimately came to understand that our values must be defended \u2013 those of Europe, the only ones capable of calming the noise and the fury of the world.\"',\n        'quote-cite': '\u2014 Fr\u00e9d\u00e9ric Martel, <em>Occidents<\/em>',\n        'author-bio': 'Fr\u00e9d\u00e9ric Martel is a professor at the Zurich University of the Arts (ZHdK) and an expert on the United States. A journalist at Radio France, he hosts the leading program on media, culture, and the digital world, \u00ab Soft Power \u00bb (France Culture). He has published around fifteen books, translated into some thirty languages, including Mainstream and Sodoma, both of which became global bestsellers.',\n        'shelf-label': 'Bibliography',\n        'footer-pub': 'OCCIDENTS \u2013 EDITIONS PLON',\n        'book-1-title': 'Sodoma',\n        'book-1-link': 'https:\/\/www.amazon.com\/Sodoma-Inquiry-Heart-Vatican-Martel\/dp\/1472966144',\n        'book-2-title': 'Smart',\n        'book-2-link': 'https:\/\/www.amazon.com\/Smart-Fr%C3%A9d%C3%A9ric-Martel\/dp\/235837013X',\n        'book-3-title': 'Global Gay',\n        'book-3-link': 'https:\/\/www.amazon.com\/Global-Gay-Fr%C3%A9d%C3%A9ric-Martel\/dp\/026203781X',\n        'book-4-title': 'Mainstream',\n        'book-4-link': 'https:\/\/www.amazon.com\/Mainstream-How-Culture-Whole-World\/dp\/2081236113',\n        'book-5-title': 'De la culture en Am\u00e9rique',\n        'book-5-link': 'https:\/\/www.amazon.com\/culture-en-Amerique-Frederic-Martel\/dp\/2070776461',\n        'global-font': '',\n        'global-font-enabled': false\n      },\n      fr: {\n        pretitle: 'Nouveaut\u00e9 \u00b7 2026',\n        tagline: 'Grande fresque intellectuelle, \u00ab Occidents \u00bb est nourri de centaines de portraits et de t\u00e9moignages. Et en cherchant \u00e0 expliquer l\u2019\u00ab Occident \u00bb par les haines qu\u2019il suscite, l\u2019auteur finit, au terme de cette enqu\u00eate exceptionnelle (pr\u00e8s de 2000 interviews dans 52 pays), par nous \u00e9clairer sur la v\u00e9rit\u00e9 de ce que nous sommes.',\n        cta: 'D\u00e9couvrir le livre',\n        'drag-hint': 'Faites glisser pour pivoter 360\u00b0',\n        'bio-label': '\u00c0 propos du livre',\n        'bio-text': 'Une guerre mondiale des id\u00e9es se d\u00e9roule sous nos yeux. Mais nous n\u2019avons pas encore compris qu\u2019elle visait nos valeurs : d\u00e9mocratie, pluralisme, droits de l\u2019homme, libert\u00e9 d\u2019expression. De Moscou \u00e0 Beijing, de Caracas \u00e0 T\u00e9h\u00e9ran, nos ennemis entendent d\u00e9faire l\u2019Europe et d\u00e9truire l\u2019Occident. Pour mieux identifier cette menace, le journaliste et chercheur Fr\u00e9d\u00e9ric Martel est all\u00e9 partout, sur le terrain, \u00ab au contact \u00bb des intellectuels de Xi Jinping, des id\u00e9ologues de Poutine, des propagandistes du Hamas \u2013 mais aussi des conseillers de Donald Trump. Au cours d\u2019une enqu\u00eate de huit ann\u00e9es, men\u00e9e dans cinquante-deux pays, il a interview\u00e9 pr\u00e8s de deux mille protagonistes, t\u00e9moins ou acteurs, du grand chaos du monde. Ce livre hors norme d\u00e9voile l\u2019envers de notre histoire contemporaine. Il raconte notre \u00e9poque et son obsession de l\u2019\u00ab Occident \u00bb. Rejet\u00e9 par ceux qui, comme la Chine ou l\u2019Iran, veulent l\u2019an\u00e9antir ; glorifi\u00e9 par d\u2019autres, populistes russes, hongrois, am\u00e9ricains ou br\u00e9siliens, qui pr\u00e9tendent l\u2019exalter. Il n\u2019y a plus un Occident, mais des \u00ab Occidents \u00bb \u2013 projet\u00e9s, fantasm\u00e9s, souvent contradictoires. Au bout du compte, ceux qui veulent \u00ab plus \u00bb d\u2019Occident rejoignent ceux qui en veulent \u00ab moins \u00bb : une convergence des extr\u00eames et, dans les deux cas, une m\u00eame illusion. Une m\u00eame pathologie. Voil\u00e0 le sujet de ce livre : L\\'Occident et ses ennemis. Nos ennemis.',\n        'quote-text': '\u00abCe livre n\\'est pas un essai : c\\'est une enqu\u00eate de terrain. J\\'ai infiltr\u00e9 nos ennemis partout, comme personne ne l\\'avait fait jusque l\u00e0 avec ce prisme global. Je suis all\u00e9 voir et interviewer les \u00ab m\u00e9chants \u00bb, les \u00ab vilains \u00bb de notre \u00e9poque \u2013 nos ennemis. Et ce faisant j\\'ai fini par comprendre qu\\'il fallait revenir \u00e0 nos valeurs, celles de l\\'Europe, les seules \u00e0 pouvoir calmer le bruit et la fureur du monde.\u00bb',\n        'quote-cite': '\u2014 Fr\u00e9d\u00e9ric Martel, <em>Occidents<\/em>',\n        'author-bio': 'Fr\u00e9d\u00e9ric Martel est professeur \u00e0 l\u2019universit\u00e9 ZHdK de Zurich et sp\u00e9cialiste des \u00c9tats-Unis. Journaliste \u00e0 Radio France, il anime l\u2019\u00e9mission de r\u00e9f\u00e9rence sur les m\u00e9dias, la culture et le num\u00e9rique, \u00ab Soft Power \u00bb (France Culture). Il a publi\u00e9 une quinzaine de livres, traduits dans une trentaine de langues, dont Mainstream et Sodoma, qui ont \u00e9t\u00e9 des best-sellers mondiaux.',\n        'shelf-label': 'Bibliographie',\n        'footer-pub': 'OCCIDENTS \u2013 EDITIONS PLON',\n        'book-1-title': 'Sodoma',\n        'book-1-link': 'https:\/\/www.amazon.com\/Sodoma-Inquiry-Heart-Vatican-Martel\/dp\/1472966144',\n        'book-2-title': 'Smart',\n        'book-2-link': 'https:\/\/www.amazon.com\/Smart-Fr%C3%A9d%C3%A9ric-Martel\/dp\/235837013X',\n        'book-3-title': 'Global Gay',\n        'book-3-link': 'https:\/\/www.amazon.com\/Global-Gay-Fr%C3%A9d%C3%A9ric-Martel\/dp\/026203781X',\n        'book-4-title': 'Mainstream',\n        'book-4-link': 'https:\/\/www.amazon.com\/Mainstream-How-Culture-Whole-World\/dp\/2081236113',\n        'book-5-title': 'De la culture en Am\u00e9rique',\n        'book-5-link': 'https:\/\/www.amazon.com\/culture-en-Amerique-Frederic-Martel\/dp\/2070776461',\n        'global-font': '',\n        'global-font-enabled': false\n      },\n      es: {\n        pretitle: 'Nueva publicaci\u00f3n \u00b7 2026',\n        tagline: 'Gran fresco intelectual, \u00abOccidentes\u00bb se nutre de cientos de retratos y testimonios. Al buscar explicar Occidente a trav\u00e9s de los odios que suscita, el autor termina \u2014al t\u00e9rmino de esta investigaci\u00f3n excepcional (casi 2000 entrevistas en 52 pa\u00edses)\u2014 por esclarecer la verdad de lo que somos.',\n        cta: 'Descubrir el libro',\n        'drag-hint': 'Arrastra para rotar 360\u00b0',\n        'bio-label': 'Sobre el libro',\n        \"bio-text\": \"Una guerra mundial de las ideas se desarrolla ante nuestros ojos. Pero a\u00fan no hemos comprendido que apunta a nuestros valores: democracia, pluralismo, derechos humanos, libertad de expresi\u00f3n. De Mosc\u00fa a Pek\u00edn, de Caracas a Teher\u00e1n, nuestros enemigos pretenden deshacer Europa y destruir Occidente. Para identificar mejor esta amenaza, el periodista e investigador Fr\u00e9d\u00e9ric Martel ha ido a todas partes, sobre el terreno, \u00aben contacto\u00bb con los intelectuales de Xi Jinping, los ide\u00f3logos de Putin, los propagandistas de Ham\u00e1s \u2014pero tambi\u00e9n con los asesores de Donald Trump. A lo largo de una investigaci\u00f3n de ocho a\u00f1os, realizada en cincuenta y dos pa\u00edses, ha entrevistado a cerca de dos mil protagonistas, testigos o actores, del gran caos del mundo. Este libro fuera de lo com\u00fan revela el reverso de nuestra historia contempor\u00e1nea. Relata nuestra \u00e9poca y su obsesi\u00f3n por \u00abOccidente\u00bb. Rechazado por quienes, como China o Ir\u00e1n, quieren aniquilarlo; glorificado por otros \u2014populistas rusos, h\u00fangaros, estadounidenses o brasile\u00f1os\u2014 que pretenden exaltarlo. Ya no hay un Occidente, sino \u00abOccidentes\u00bb: proyectados, fantaseados, a menudo contradictorios. Al final, quienes quieren \u00abm\u00e1s\u00bb Occidente se unen a quienes quieren \u00abmenos\u00bb: una convergencia de extremos y, en ambos casos, una misma ilusi\u00f3n. Una misma patolog\u00eda. He aqu\u00ed el tema de este libro: Occidente y sus enemigos. Nuestros enemigos.\", 'quote-text': '\"Pens\u00e1bamos que Occidente era un destino. En realidad, solo es siempre una direcci\u00f3n \u2014 y las direcciones cambian con la luz.\"',\n        'quote-cite': '\u2014 Fr\u00e9d\u00e9ric Martel, <em>Occidents<\/em>',\n        'author-bio': 'Fr\u00e9d\u00e9ric Martel es profesor en la Universidad de las Artes de Z\u00farich (ZHdK) y experto en Estados Unidos. Periodista en Radio France, dirige el programa de referencia sobre medios, cultura y el mundo digital, \u00abSoft Power\u00bb (France Culture). Ha publicado cerca de quince libros, traducidos a unos treinta idiomas, entre ellos Mainstream y Sodoma, ambos convertidos en \u00e9xitos de ventas mundiales.',\n        'shelf-label': 'Bibliograf\u00eda',\n        'footer-pub': 'OCCIDENTS \u2013 EDITIONS PLON',\n        'book-1-title': 'Sodoma',\n        'book-1-link': 'https:\/\/www.amazon.com\/Sodoma-Inquiry-Heart-Vatican-Martel\/dp\/1472966144',\n        'book-2-title': 'Smart',\n        'book-2-link': 'https:\/\/www.amazon.com\/Smart-Fr%C3%A9d%C3%A9ric-Martel\/dp\/235837013X',\n        'book-3-title': 'Global Gay',\n        'book-3-link': 'https:\/\/www.amazon.com\/Global-Gay-Fr%C3%A9d%C3%A9ric-Martel\/dp\/026203781X',\n        'book-4-title': 'Mainstream',\n        'book-4-link': 'https:\/\/www.amazon.com\/Mainstream-How-Culture-Whole-World\/dp\/2081236113',\n        'book-5-title': 'De la culture en Am\u00e9rique',\n        'book-5-link': 'https:\/\/www.amazon.com\/culture-en-Amerique-Frederic-Martel\/dp\/2070776461',\n        'global-font': '',\n        'global-font-enabled': false\n      }\n    };\n\n    \/\/ Create a mutable copy of the defaults\n    let translations = JSON.parse(JSON.stringify(defaultTranslations));\n    let currentLang = 'fr';\n\n    function setLang(lang) {\n      currentLang = lang;\n      document.documentElement.lang = lang;\n      \/\/ Plain text fields\n      document.querySelectorAll('[data-i18n]').forEach(el => {\n        const key = el.dataset.i18n;\n        if (translations[lang] && translations[lang][key] !== undefined) el.textContent = translations[lang][key];\n      });\n      \/\/ HTML fields\n      document.querySelectorAll('[data-i18n-html]').forEach(el => {\n        const key = el.dataset.i18nHtml;\n        if (translations[lang] && translations[lang][key] !== undefined) el.innerHTML = translations[lang][key];\n      });\n      \/\/ Link fields (href)\n      document.querySelectorAll('[data-i18n-href]').forEach(el => {\n        const key = el.dataset.i18nHref;\n        if (translations[lang] && translations[lang][key] !== undefined) el.setAttribute('href', translations[lang][key]);\n      });\n\n      \/\/ Special handling for Book Cover (CSS Variable)\n      if (translations[lang] && translations[lang]['book-cover']) {\n        document.documentElement.style.setProperty('--cvr-bg', `url('${translations[lang]['book-cover']}')`);\n      } else {\n        document.documentElement.style.setProperty('--cvr-bg', \"url('https:\/\/fredericmartel.com\/wp-content\/uploads\/2026\/03\/BookCover-scaled.jpg')\");\n      }\n\n      \/\/ Global Font Override\n      const globalEnabled = (translations[lang] && translations[lang]['global-font-enabled']) === true;\n      const globalFont = (translations[lang] && translations[lang]['global-font']) || '';\n      \n      let overrideStyle = document.getElementById('global-override-css');\n      if (!overrideStyle) {\n        overrideStyle = document.createElement('style');\n        overrideStyle.id = 'global-override-css';\n        document.head.appendChild(overrideStyle);\n      }\n\n      if (globalEnabled && globalFont) {\n        const fallbacks = ['Playfair Display', 'Lora', 'Crimson Pro', 'Georgia'].includes(globalFont) ? 'serif' : 'sans-serif';\n        overrideStyle.textContent = `\n          * { font-family: '${globalFont}', ${fallbacks} !important; }\n        `;\n      } else {\n        overrideStyle.textContent = '';\n      }\n\n      \/\/ Update active button\n      document.querySelectorAll('#lang-switcher button').forEach(btn => {\n        btn.classList.toggle('active', btn.dataset.lang === lang);\n      });\n    }\n\n    document.querySelectorAll('#lang-switcher button').forEach(btn => {\n      btn.addEventListener('click', () => setLang(btn.dataset.lang));\n    });\n\n    \/\/ Load live content from Firestore for public read\n    async function loadFirestoreContent() {\n      if (!db) return;\n      try {\n        const langs = ['en', 'fr', 'es'];\n        for (const l of langs) {\n          const docRef = doc(db, \"content\", l);\n          const docSnap = await getDoc(docRef);\n          if (docSnap.exists()) {\n            translations[l] = { ...translations[l], ...docSnap.data() };\n          }\n        }\n        \/\/ Refresh UI with database values\n        setLang(currentLang);\n      } catch (e) {\n        console.error(\"Error fetching content from Firestore\", e);\n      }\n    }\n\n    \/\/ Initial Call\n    setLang('fr');\n    \/\/ Fetch data in background\n    loadFirestoreContent();\n\n    \/\/ \u2500\u2500\u2500 CMS Preview Communication \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    if (window !== window.parent) {\n      \/\/ Listen for message from CMS to scroll to a section\n      window.addEventListener('message', (e) => {\n        if (e.data.type === 'SCROLL_TO') {\n          const key = e.data.key;\n          let el = document.querySelector(`[data-i18n-html=\"${key}\"]`);\n          if (!el) el = document.querySelector(`[data-i18n=\"${key}\"]`);\n          if (el) {\n            el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n            \/\/ Add a temporary highlight\n            const originalTransition = el.style.transition;\n            const originalBackground = el.style.background;\n            el.style.transition = 'background 0.5s';\n            el.style.background = 'rgba(135, 0, 0, 0.1)';\n            setTimeout(() => {\n              el.style.background = originalBackground;\n              setTimeout(() => el.style.transition = originalTransition, 500);\n            }, 1000);\n          }\n        }\n      });\n\n      \/\/ Notify CMS when an editable element is clicked\n      document.addEventListener('click', (e) => {\n        const el = e.target.closest('[data-i18n], [data-i18n-html], [data-i18n-href]');\n        if (el) {\n          e.preventDefault();\n          e.stopPropagation();\n          const key = el.dataset.i18n || el.dataset.i18nHtml || el.dataset.i18nHref;\n          window.parent.postMessage({ type: 'FIELD_CLICKED', key: key }, '*');\n        }\n      }, true);\n    }\n  <\/script>\n<\/body>\n\n<\/html><\/div><style type=\"text\/css\">.fusion-body .fusion-builder-column-0{width:60% !important;margin-top : 0px;margin-bottom : 20px;}.fusion-builder-column-0 > .fusion-column-wrapper {padding-top : 0px !important;padding-right : 0px !important;margin-right : 3.2%;padding-bottom : 0px !important;padding-left : 0px !important;margin-left : 3.2%;}@media only screen and (max-width:1024px) {.fusion-body .fusion-builder-column-0{width:60% !important;order : 0;}.fusion-builder-column-0 > .fusion-column-wrapper {margin-right : 3.2%;margin-left : 3.2%;}}@media only screen and (max-width:640px) {.fusion-body .fusion-builder-column-0{width:100% !important;order : 0;}.fusion-builder-column-0 > .fusion-column-wrapper {margin-right : 1.92%;margin-left : 1.92%;}}<\/style><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_2_5 2_5 fusion-flex-column\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\" style=\"background-position:left top;background-repeat:no-repeat;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;padding: 0px 0px 0px 0px;\"><style type=\"text\/css\">.fusion-accordian  #accordion-1975-1 .panel-title a .fa-fusion-box{ color: #ffffff;}.fusion-accordian  #accordion-1975-1 .panel-title a .fa-fusion-box:before{ font-size: 16px; width: 16px;}.fusion-accordian  #accordion-1975-1 .panel-title a{font-size:28px;}.fusion-accordian  #accordion-1975-1 .fa-fusion-box { background-color: #212934;border-color: #212934;}.fusion-accordian  #accordion-1975-1 .panel-title a:hover, #accordion-1975-1 .fusion-toggle-boxed-mode:hover .panel-title a { color: #65bc7b;}.fusion-accordian  #accordion-1975-1 .panel-title .active .fa-fusion-box,.fusion-accordian  #accordion-1975-1 .panel-title a:hover .fa-fusion-box { background-color: #65bc7b!important;border-color: #65bc7b!important;}<\/style><div class=\"accordian fusion-accordian\"><div class=\"panel-group\" id=\"accordion-1975-1\"><div class=\"fusion-panel panel-default\"><div class=\"panel-heading\"><h4 class=\"panel-title toggle\"><a class=\"active\" aria-expanded=\"true\" aria-controls=\"a37c378069b5c80e2\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-1975-1\" data-target=\"#a37c378069b5c80e2\" href=\"#a37c378069b5c80e2\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">About the book<\/span><\/a><\/h4><\/div><div id=\"a37c378069b5c80e2\" class=\"panel-collapse collapse in\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>A global war of ideas is unfolding before our eyes. Yet we have not fully grasped that it is directed against our most fundamental values: democracy, pluralism, human rights, freedom of expression. From Moscow to Beijing, from Caracas to Tehran, our enemies seek to dismantle Europe and destroy the West.<\/p>\n<p>To better understand this threat, the journalist and researcher\u00a0<span class=\"il\">Fr\u00e9d\u00e9ric<\/span>\u00a0Martel travelled widely, conducting fieldwork and\u00a0\u00ab face to face \u00bb with the intellectuals of Xi Jinping, the ideologues of Vladimir Putin, the propagandists of Hamas \u2013 but also with advisers to Donald Trump. Over the course of an eight-year investigation, carried out in fifty-two countries, he interviewed nearly two thousand protagonists \u2013 witnesses and actors alike \u2013 in the vast disorder of the contemporary world.<\/p>\n<p>This &#8220;larger than life&#8221; book reveals the hidden side of our current history. It tells the story of our age and its obsession with the \u00ab West \u00bb \u2013 rejected by those who, like China or Iran, seek to annihilate it; glorified by others, from Russian and Hungarian to American and Brazilian populists, who claim to exalt it. There is no longer a single West, but many \u00ab Wests \u00bb \u2013 projected, imagined, often contradictory. In the end, those who demand \u00ab more \u00bb West converge with those who want \u00ab less \u00bb of it: a convergence of extremes and, in both cases, the same illusion. The same pathology.<\/p>\n<p>Such is the subject of this book: the West and its enemies. Our enemies.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default\"><div class=\"panel-heading\"><h4 class=\"panel-title toggle\"><a class=\"active\" aria-expanded=\"true\" aria-controls=\"b07a5b30bdece77ba\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-1975-1\" data-target=\"#b07a5b30bdece77ba\" href=\"#b07a5b30bdece77ba\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">Sources &amp; Bibliography<\/span><\/a><\/h4><\/div><div id=\"b07a5b30bdece77ba\" class=\"panel-collapse collapse in\"><div class=\"panel-body toggle-content fusion-clearfix\"><\/div><\/div><\/div><div class=\"fusion-panel panel-default\"><div class=\"panel-heading\"><h4 class=\"panel-title toggle\"><a aria-expanded=\"false\" aria-controls=\"3fda30c5342b37a53\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-1975-1\" data-target=\"#3fda30c5342b37a53\" href=\"#3fda30c5342b37a53\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">Media<\/span><\/a><\/h4><\/div><div id=\"3fda30c5342b37a53\" class=\"panel-collapse collapse \"><div class=\"panel-body toggle-content fusion-clearfix\"><\/div><\/div><\/div><\/div><\/div><\/div><style type=\"text\/css\">.fusion-body .fusion-builder-column-1{width:40% !important;margin-top : 0px;margin-bottom : 20px;}.fusion-builder-column-1 > .fusion-column-wrapper {padding-top : 0px !important;padding-right : 0px !important;margin-right : 4.8%;padding-bottom : 0px !important;padding-left : 0px !important;margin-left : 4.8%;}@media only screen and (max-width:1024px) {.fusion-body .fusion-builder-column-1{width:40% !important;order : 0;}.fusion-builder-column-1 > .fusion-column-wrapper {margin-right : 4.8%;margin-left : 4.8%;}}@media only screen and (max-width:640px) {.fusion-body .fusion-builder-column-1{width:100% !important;order : 0;}.fusion-builder-column-1 > .fusion-column-wrapper {margin-right : 1.92%;margin-left : 1.92%;}}<\/style><\/div><\/div><style type=\"text\/css\">.fusion-body .fusion-flex-container.fusion-builder-row-1{ padding-top : 0px;margin-top : 0px;padding-right : 0px;padding-bottom : 0px;margin-bottom : 0px;padding-left : 0px;}<\/style><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"background-color: rgba(255,255,255,0);background-position: center center;background-repeat: no-repeat;border-width: 0px 0px 0px 0px;border-color:#e2e2e2;border-style:solid;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\" style=\"background-position:left top;background-repeat:no-repeat;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;padding: 0px 0px 0px 0px;\"><\/div><style type=\"text\/css\">.fusion-body .fusion-builder-column-2{width:100% !important;margin-top : 0px;margin-bottom : 20px;}.fusion-builder-column-2 > .fusion-column-wrapper {padding-top : 0px !important;padding-right : 0px !important;margin-right : 1.92%;padding-bottom : 0px !important;padding-left : 0px !important;margin-left : 1.92%;}@media only screen and (max-width:1024px) {.fusion-body .fusion-builder-column-2{width:100% !important;order : 0;}.fusion-builder-column-2 > .fusion-column-wrapper {margin-right : 1.92%;margin-left : 1.92%;}}@media only screen and (max-width:640px) {.fusion-body .fusion-builder-column-2{width:100% !important;order : 0;}.fusion-builder-column-2 > .fusion-column-wrapper {margin-right : 1.92%;margin-left : 1.92%;}}<\/style><\/div><\/div><style type=\"text\/css\">.fusion-body .fusion-flex-container.fusion-builder-row-2{ padding-top : 0px;margin-top : 0px;padding-right : 0px;padding-bottom : 0px;margin-bottom : 0px;padding-left : 0px;}<\/style><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/fredericmartel.com\/en\/wp-json\/wp\/v2\/pages\/1975"}],"collection":[{"href":"https:\/\/fredericmartel.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fredericmartel.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fredericmartel.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fredericmartel.com\/en\/wp-json\/wp\/v2\/comments?post=1975"}],"version-history":[{"count":10,"href":"https:\/\/fredericmartel.com\/en\/wp-json\/wp\/v2\/pages\/1975\/revisions"}],"predecessor-version":[{"id":1992,"href":"https:\/\/fredericmartel.com\/en\/wp-json\/wp\/v2\/pages\/1975\/revisions\/1992"}],"wp:attachment":[{"href":"https:\/\/fredericmartel.com\/en\/wp-json\/wp\/v2\/media?parent=1975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}