{"id":10069,"date":"2026-04-04T12:36:00","date_gmt":"2026-04-04T12:36:00","guid":{"rendered":"https:\/\/www.animcloud.fr\/?page_id=10069"},"modified":"2026-04-04T12:36:02","modified_gmt":"2026-04-04T12:36:02","slug":"admin-paques","status":"publish","type":"page","link":"https:\/\/www.animcloud.fr\/en\/admin-paques\/","title":{"rendered":"admin paques"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Admin &#8211; Chasse aux \u0152ufs<\/title>\n  <style>\n    * { margin: 0; padding: 0; box-sizing: border-box; }\n\n    body {\n      background: #0a0a0f;\n      color: white;\n      font-family: 'Segoe UI', sans-serif;\n      min-height: 100vh;\n      padding: 30px 20px;\n    }\n\n    .wrap {\n      max-width: 600px;\n      margin: 0 auto;\n      display: flex;\n      flex-direction: column;\n      gap: 20px;\n    }\n\n    h1 {\n      text-align: center;\n      font-size: 1.6rem;\n      color: #6366f1;\n      padding-bottom: 15px;\n      border-bottom: 1px solid #1f2937;\n    }\n\n    .card {\n      background: #111827;\n      border: 1px solid #1f2937;\n      border-radius: 16px;\n      padding: 25px;\n    }\n\n    .card h2 {\n      font-size: 0.85rem;\n      text-transform: uppercase;\n      letter-spacing: 2px;\n      margin-bottom: 20px;\n    }\n\n    .card-normal h2 { color: #6366f1; }\n    .card-or h2 { color: #eab308; }\n\n    \/* AFFICHAGE *\/\n    .gros-chiffre {\n      font-size: 5rem;\n      font-weight: 900;\n      text-align: center;\n      margin-bottom: 5px;\n    }\n\n    .card-normal .gros-chiffre { color: #a5b4fc; }\n    .card-or .gros-chiffre { color: #fde047; }\n\n    .sous-chiffre {\n      text-align: center;\n      font-size: 0.85rem;\n      color: #6b7280;\n      margin-bottom: 20px;\n    }\n\n    \/* GRILLE BOUTONS *\/\n    .grille {\n      display: grid;\n      grid-template-columns: repeat(3, 1fr);\n      gap: 8px;\n      margin-bottom: 15px;\n    }\n\n    .btn {\n      padding: 12px 8px;\n      border: none;\n      border-radius: 10px;\n      cursor: pointer;\n      font-size: 0.95rem;\n      font-weight: 700;\n      transition: all 0.15s;\n    }\n\n    .btn:active { transform: scale(0.93); }\n\n    .btn-plus-n { background: #6366f1; color: white; }\n    .btn-plus-n:hover { background: #4f46e5; }\n\n    .btn-moins-n { background: #1f2937; color: #a5b4fc; border: 1px solid #374151; }\n    .btn-moins-n:hover { background: #374151; }\n\n    .btn-plus-o { background: #eab308; color: #000; }\n    .btn-plus-o:hover { background: #ca8a04; }\n\n    .btn-moins-o { background: #1f2937; color: #fde047; border: 1px solid #374151; }\n    .btn-moins-o:hover { background: #374151; }\n\n    .btn-reset-n {\n      grid-column: span 3;\n      background: #7f1d1d;\n      color: #fca5a5;\n      border: 1px solid #991b1b;\n    }\n    .btn-reset-n:hover { background: #991b1b; }\n\n    .btn-reset-o {\n      grid-column: span 3;\n      background: #78350f;\n      color: #fde68a;\n      border: 1px solid #92400e;\n    }\n    .btn-reset-o:hover { background: #92400e; }\n\n    \/* D\u00c9FINIR *\/\n    .definir-row {\n      display: flex;\n      gap: 8px;\n    }\n\n    .definir-row input {\n      flex: 1;\n      background: #1f2937;\n      border: 1px solid #374151;\n      border-radius: 8px;\n      color: white;\n      padding: 10px 14px;\n      font-size: 1rem;\n      text-align: center;\n      outline: none;\n    }\n\n    .definir-row input:focus { border-color: #6366f1; }\n\n    .btn-def-n {\n      background: #6366f1;\n      color: white;\n      padding: 10px 16px;\n      border: none;\n      border-radius: 8px;\n      cursor: pointer;\n      font-weight: 700;\n    }\n\n    .btn-def-o {\n      background: #eab308;\n      color: #000;\n      padding: 10px 16px;\n      border: none;\n      border-radius: 8px;\n      cursor: pointer;\n      font-weight: 700;\n    }\n\n    \/* IMAGE *\/\n    label {\n      display: block;\n      font-size: 0.82rem;\n      color: #9ca3af;\n      margin-bottom: 5px;\n    }\n\n    input[type=text] {\n      width: 100%;\n      background: #1f2937;\n      border: 1px solid #374151;\n      border-radius: 8px;\n      color: white;\n      padding: 10px 14px;\n      font-size: 0.9rem;\n      outline: none;\n      margin-bottom: 12px;\n    }\n\n    input[type=text]:focus { border-color: #6366f1; }\n\n    .btn-save {\n      width: 100%;\n      background: linear-gradient(135deg, #6366f1, #8b5cf6);\n      color: white;\n      padding: 13px;\n      border: none;\n      border-radius: 10px;\n      cursor: pointer;\n      font-weight: 700;\n      font-size: 1rem;\n      transition: opacity 0.2s;\n    }\n\n    .btn-save:hover { opacity: 0.85; }\n\n    \/* TOAST *\/\n    .toast {\n      position: fixed;\n      bottom: 25px;\n      right: 25px;\n      background: #10b981;\n      color: white;\n      padding: 13px 22px;\n      border-radius: 10px;\n      font-weight: 600;\n      font-size: 0.95rem;\n      transform: translateY(80px);\n      opacity: 0;\n      transition: all 0.3s;\n      z-index: 999;\n    }\n\n    .toast.show { transform: translateY(0); opacity: 1; }\n    .toast.err { background: #ef4444; }\n\n    \/* PREVIEW IMAGE *\/\n    .preview {\n      width: 100%;\n      aspect-ratio: 16\/9;\n      border-radius: 10px;\n      object-fit: cover;\n      margin-bottom: 12px;\n      border: 1px solid #374151;\n      display: none;\n    }\n  <\/style>\n<\/head>\n<body>\n\n<div class=\"wrap\">\n\n  <h1>\ud83e\udd5a Admin \u2014 Chasse aux \u0152ufs<\/h1>\n\n  <!-- OEUFS NORMAUX -->\n  <div class=\"card card-normal\">\n    <h2>\ud83e\udd5a \u0152ufs normaux \u2014 max 160<\/h2>\n\n    <div class=\"gros-chiffre\" id=\"affN\">\u2014<\/div>\n    <div class=\"sous-chiffre\" id=\"pctAffN\">0 \/ 160<\/div>\n\n    <div class=\"grille\">\n      <button class=\"btn btn-moins-n\" onclick=\"maj('normal', -10)\">\u221210<\/button>\n      <button class=\"btn btn-moins-n\" onclick=\"maj('normal', -5)\">\u22125<\/button>\n      <button class=\"btn btn-moins-n\" onclick=\"maj('normal', -1)\">\u22121<\/button>\n      <button class=\"btn btn-plus-n\" onclick=\"maj('normal', 1)\">+1<\/button>\n      <button class=\"btn btn-plus-n\" onclick=\"maj('normal', 5)\">+5<\/button>\n      <button class=\"btn btn-plus-n\" onclick=\"maj('normal', 10)\">+10<\/button>\n      <button class=\"btn btn-reset-n\" onclick=\"reset('normal')\">\ud83d\udd04 Remettre \u00e0 z\u00e9ro<\/button>\n    <\/div>\n\n    <div class=\"definir-row\">\n      <input type=\"number\" id=\"valN\" placeholder=\"D\u00e9finir valeur exacte (ex: 47)\">\n      <button class=\"btn-def-n\" onclick=\"definir('normal')\">D\u00e9finir<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- OEUFS OR -->\n  <div class=\"card card-or\">\n    <h2>\ud83e\udd47 \u0152ufs en Or \u2014 max 4<\/h2>\n\n    <div class=\"gros-chiffre\" id=\"affOr\">\u2014<\/div>\n    <div class=\"sous-chiffre\" id=\"pctAffOr\">0 \/ 4<\/div>\n\n    <div class=\"grille\">\n      <button class=\"btn btn-moins-o\" onclick=\"maj('or', -1)\">\u22121<\/button>\n      <button class=\"btn btn-plus-o\" onclick=\"maj('or', 1)\">+1<\/button>\n      <button class=\"btn btn-plus-o\" onclick=\"maj('or', 2)\">+2<\/button>\n      <button class=\"btn btn-reset-o\" onclick=\"reset('or')\">\ud83d\udd04 Remettre \u00e0 z\u00e9ro<\/button>\n    <\/div>\n\n    <div class=\"definir-row\">\n      <input type=\"number\" id=\"valOr\" placeholder=\"D\u00e9finir (0 \u00e0 4)\" min=\"0\" max=\"4\">\n      <button class=\"btn-def-o\" onclick=\"definir('or')\">D\u00e9finir<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- IMAGE DE FOND -->\n  <div class=\"card\">\n    <h2 style=\"color:#6366f1; font-size:0.85rem; text-transform:uppercase; letter-spacing:2px; margin-bottom:15px;\">\ud83d\uddbc\ufe0f Image de fond<\/h2>\n\n    <img id=\"previewImg\" class=\"preview\" alt=\"Aper\u00e7u\">\n\n    <label>URL de l&rsquo;image (depuis ton site)<\/label>\n    <input type=\"text\" id=\"inputImg\" placeholder=\"https:\/\/animcloud.fr\/wp-content\/uploads\/oeuf-map.jpg\" oninput=\"previewImage(this.value)\">\n\n    <label>Sous-titre affich\u00e9 sur la page<\/label>\n    <input type=\"text\" id=\"inputSousTitre\" placeholder=\"Retrouvez tous les \u0153ufs cach\u00e9s !\">\n\n    <button class=\"btn-save\" onclick=\"sauvegarderConfig()\">\ud83d\udcbe Sauvegarder<\/button>\n  <\/div>\n\n<\/div>\n\n<div class=\"toast\" id=\"toast\">\u2705 OK<\/div>\n\n<script type=\"module\">\n  import { initializeApp } from \"https:\/\/www.gstatic.com\/firebasejs\/10.7.0\/firebase-app.js\";\n  import { getDatabase, ref, onValue, update } from \"https:\/\/www.gstatic.com\/firebasejs\/10.7.0\/firebase-database.js\";\n\n  \/\/ \ud83d\udd27 TA CONFIG FIREBASE\n  const firebaseConfig = {\n    apiKey: \"TON_API_KEY\",\n    authDomain: \"TON_PROJECT.firebaseapp.com\",\n    databaseURL: \"https:\/\/TON_PROJECT-default-rtdb.firebaseio.com\",\n    projectId: \"TON_PROJECT\",\n    storageBucket: \"TON_PROJECT.appspot.com\",\n    messagingSenderId: \"TON_ID\",\n    appId: \"TON_APP_ID\"\n  };\n\n  const app = initializeApp(firebaseConfig);\n  const db = getDatabase(app);\n  const dataRef = ref(db, 'oeufs');\n\n  const MAX = { normal: 160, or: 4 };\n  let vals = { normal: 0, or: 0 };\n\n  onValue(dataRef, (snap) => {\n    const d = snap.val() || {};\n    vals.normal = d.normal || 0;\n    vals.or = d.or || 0;\n\n    document.getElementById('affN').textContent = vals.normal;\n    document.getElementById('pctAffN').textContent = `${vals.normal} \/ 160`;\n    document.getElementById('affOr').textContent = vals.or;\n    document.getElementById('pctAffOr').textContent = `${vals.or} \/ 4`;\n\n    if (d.image) {\n      document.getElementById('inputImg').value = d.image;\n      previewImage(d.image);\n    }\n    if (d.sousTitre) document.getElementById('inputSousTitre').value = d.sousTitre;\n  });\n\n  function toast(msg, err = false) {\n    const t = document.getElementById('toast');\n    t.textContent = msg;\n    t.className = 'toast' + (err ? ' err' : '') + ' show';\n    setTimeout(() => t.className = 'toast', 2500);\n  }\n\n  window.maj = (type, delta) => {\n    const nv = Math.max(0, Math.min(vals[type] + delta, MAX[type]));\n    update(dataRef, { [type]: nv })\n      .then(() => toast(`\u2705 ${type === 'or' ? '\ud83e\udd47' : '\ud83e\udd5a'} ${nv} \/ ${MAX[type]}`))\n      .catch(() => toast('\u274c Erreur Firebase', true));\n  };\n\n  window.reset = (type) => {\n    if (!confirm(`Remettre les \u0153ufs ${type === 'or' ? 'en or' : 'normaux'} \u00e0 0 ?`)) return;\n    update(dataRef, { [type]: 0 }).then(() => toast('\ud83d\udd04 Remis \u00e0 z\u00e9ro'));\n  };\n\n  window.definir = (type) => {\n    const input = document.getElementById(type === 'or' ? 'valOr' : 'valN');\n    const val = parseInt(input.value);\n    if (isNaN(val) || val < 0 || val > MAX[type]) {\n      return toast(`\u274c Valeur entre 0 et ${MAX[type]}`, true);\n    }\n    update(dataRef, { [type]: val })\n      .then(() => { toast(`\u2705 D\u00e9fini \u00e0 ${val}`); input.value = ''; })\n      .catch(() => toast('\u274c Erreur', true));\n  };\n\n  window.sauvegarderConfig = () => {\n    update(dataRef, {\n      image: document.getElementById('inputImg').value,\n      sousTitre: document.getElementById('inputSousTitre').value,\n    }).then(() => toast('\u2705 Config sauvegard\u00e9e !'))\n      .catch(() => toast('\u274c Erreur', true));\n  };\n\n  window.previewImage = (url) => {\n    const img = document.getElementById('previewImg');\n    if (url) {\n      img.src = url;\n      img.style.display = 'block';\n    } else {\n      img.style.display = 'none';\n    }\n  };\n<\/script>\n\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Admin &#8211; Chasse aux \u0152ufs \ud83e\udd5a Admin \u2014 Chasse aux \u0152ufs \ud83e\udd5a \u0152ufs normaux \u2014 max 160 \u2014 0 \/ 160 \u221210 \u22125 \u22121 +1 +5 +10 \ud83d\udd04 Remettre \u00e0 z\u00e9ro D\u00e9finir \ud83e\udd47 \u0152ufs en Or \u2014 max 4 \u2014 0 \/ 4 \u22121 +1 +2 \ud83d\udd04 Remettre \u00e0 z\u00e9ro D\u00e9finir \ud83d\uddbc\ufe0f Image de fond [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-10069","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.animcloud.fr\/en\/wp-json\/wp\/v2\/pages\/10069","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.animcloud.fr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.animcloud.fr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.animcloud.fr\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.animcloud.fr\/en\/wp-json\/wp\/v2\/comments?post=10069"}],"version-history":[{"count":1,"href":"https:\/\/www.animcloud.fr\/en\/wp-json\/wp\/v2\/pages\/10069\/revisions"}],"predecessor-version":[{"id":10071,"href":"https:\/\/www.animcloud.fr\/en\/wp-json\/wp\/v2\/pages\/10069\/revisions\/10071"}],"wp:attachment":[{"href":"https:\/\/www.animcloud.fr\/en\/wp-json\/wp\/v2\/media?parent=10069"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}