{"id":996,"date":"2026-05-04T20:04:51","date_gmt":"2026-05-04T20:04:51","guid":{"rendered":"https:\/\/museumofhumangoals.org\/?page_id=996"},"modified":"2026-05-08T02:53:10","modified_gmt":"2026-05-08T02:53:10","slug":"online-manifestation-2","status":"publish","type":"page","link":"https:\/\/muhugo.org\/?page_id=996","title":{"rendered":"ONLINE MANIFESTATION 2"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"996\" class=\"elementor elementor-996\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-181ffaf e-flex e-con-boxed e-con e-parent\" data-id=\"181ffaf\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-acc6715 elementor-widget elementor-widget-html\" data-id=\"acc6715\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"muhugo-participation\">\n  <div class=\"muhugo-left\">\n    <h2>Join the Living Artwork<\/h2>\n    <p class=\"intro\">Write your goal and send it into the collective MuHuGo artwork.<\/p>\n\n    <div class=\"preview-card\" id=\"previewCard\">\n      <img decoding=\"async\" src=\"https:\/\/muhugo.org\/wp-content\/uploads\/2026\/05\/goal-card-1-1.png\" alt=\"Goal Card\">\n\n      <div class=\"preview-name\" id=\"previewName\">NAME<\/div>\n      <div class=\"preview-location\" id=\"previewLocation\">LOCATION<\/div>\n      <div class=\"preview-date\" id=\"previewDate\">DATE<\/div>\n      <div class=\"preview-number\" id=\"previewNumber\">No. 001<\/div>\n\n      <svg class=\"circle-text-svg\" viewBox=\"0 0 1000 1000\">\n        <defs>\n          <path id=\"previewCirclePath1\" d=\"M 500,520 m -300,0 a 300,300 0 1,1 600,0 a 300,300 0 1,1 -600,0\" \/>\n          <path id=\"previewCirclePath2\" d=\"M 500,520 m -240,0 a 240,240 0 1,1 480,0 a 240,240 0 1,1 -480,0\" \/>\n          <path id=\"previewCirclePath3\" d=\"M 500,520 m -180,0 a 180,180 0 1,1 360,0 a 180,180 0 1,1 -360,0\" \/>\n        <\/defs>\n        <text class=\"circle-goal-text\"><textPath href=\"#previewCirclePath1\" startOffset=\"0%\" id=\"previewCircleText1\">MY GOAL IS TO...<\/textPath><\/text>\n        <text class=\"circle-goal-text\"><textPath href=\"#previewCirclePath2\" startOffset=\"0%\" id=\"previewCircleText2\"><\/textPath><\/text>\n        <text class=\"circle-goal-text\"><textPath href=\"#previewCirclePath3\" startOffset=\"0%\" id=\"previewCircleText3\"><\/textPath><\/text>\n      <\/svg>\n    <\/div>\n\n    <textarea id=\"goalInput\" maxlength=\"260\" placeholder=\"My goal is to...\"><\/textarea>\n    <input id=\"nameInput\" type=\"text\" maxlength=\"55\" placeholder=\"Name and surname\">\n    <input id=\"locationInput\" type=\"text\" maxlength=\"55\" placeholder=\"City, state \/ country\">\n\n    <button id=\"sendGoalBtn\">Send Goal<\/button>\n    <div id=\"successMessage\" style=\"display:none;\"><\/div>\n\n    <a class=\"collection-btn\" href=\"https:\/\/muhugo.org\/collection\">Collection<\/a>\n\n    <p class=\"note\">Your goal becomes part of the artwork after curation.<\/p>\n  <\/div>\n\n  <div class=\"muhugo-right\">\n    <div id=\"artGrid\"><\/div>\n  <\/div>\n<\/div>\n\n<div id=\"cardModal\" class=\"card-modal\">\n  <div class=\"card-modal-content\">\n    <button id=\"closeCardModal\" class=\"close-card-modal\">\u00d7<\/button>\n    <div id=\"modalCard\"><\/div>\n  <\/div>\n<\/div>\n\n<div id=\"submitPopup\" class=\"submit-popup\">\n  <div class=\"submit-popup-box\">\n    <button id=\"closeSubmitPopup\" class=\"submit-popup-close\">\u00d7<\/button>\n    <h3>Goal Card Submitted<\/h3>\n    <p id=\"submitPopupText\"><\/p>\n    <button id=\"submitPopupButton\" class=\"submit-popup-button\">Close<\/button>\n  <\/div>\n<\/div>\n\n<style>\n#muhugo-participation {\n  display: grid;\n  grid-template-columns: 380px 1fr;\n  gap: 36px;\n  align-items: start;\n  font-family: Georgia, serif;\n  max-width: 1400px;\n  margin: 0 auto;\n  padding: 30px;\n}\n\n.muhugo-left h2 {\n  font-size: 34px;\n  margin-bottom: 10px;\n  color: #3b2a16;\n}\n\n.intro {\n  font-size: 16px;\n  color: #6b5a42;\n  line-height: 1.5;\n  margin-bottom: 20px;\n}\n\n.preview-card {\n  position: relative;\n  width: 100%;\n  aspect-ratio: 1 \/ 1;\n  border: 1px solid rgba(90,70,40,0.25);\n  box-shadow: 0 12px 35px rgba(0,0,0,0.15);\n  overflow: hidden;\n  background: #e8d6ad;\n  margin-bottom: 16px;\n}\n\n.preview-card img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n\n.preview-name,\n.preview-location,\n.preview-date,\n.preview-number {\n  position: absolute;\n  font-family: Arial, sans-serif;\n  color: rgba(55,43,26,0.82);\n  text-transform: uppercase;\n  z-index: 5;\n}\n\n.preview-name,\n.preview-location {\n  top: 16.7%;\n  font-size: 10px;\n  line-height: 1.08;\n  letter-spacing: 0.9px;\n  white-space: normal;\n  overflow-wrap: break-word;\n}\n\n.preview-name {\n  left: 16.5%;\n  width: 23%;\n}\n\n.preview-location {\n  left: 41.5%;\n  width: 25%;\n  text-align: center;\n}\n\n.preview-date {\n  top: 17.2%;\n  left: 70%;\n  width: 18%;\n  font-size: 10px;\n  letter-spacing: 1.1px;\n  text-align: center;\n  white-space: nowrap;\n}\n\n.preview-number {\n  right: 8.5%;\n  bottom: 6.8%;\n  font-size: 12px;\n  letter-spacing: 1px;\n}\n\n.circle-text-svg {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  pointer-events: none;\n  z-index: 4;\n}\n\n.circle-goal-text {\n  font-family: Georgia, serif;\n  font-size: 22px;\n  letter-spacing: 2.4px;\n  fill: rgba(48,37,22,0.78);\n  text-transform: uppercase;\n}\n\n#goalInput,\n#nameInput,\n#locationInput {\n  width: 100%;\n  box-sizing: border-box;\n  margin-bottom: 10px;\n  border: 1px solid rgba(90,70,40,0.3);\n  background: #fbf5e8;\n  padding: 12px;\n  font-size: 15px;\n  color: #3b2a16;\n}\n\n#goalInput {\n  min-height: 95px;\n  resize: vertical;\n}\n\n#sendGoalBtn,\n.collection-btn {\n  display: block;\n  width: 100%;\n  box-sizing: border-box;\n  padding: 14px 18px;\n  border: none;\n  text-align: center;\n  text-decoration: none;\n  font-size: 16px;\n  letter-spacing: 1px;\n  cursor: pointer;\n  transition: 0.25s;\n}\n\n#sendGoalBtn {\n  background: #3b2a16;\n  color: #fff7e8;\n  margin-bottom: 10px;\n}\n\n#sendGoalBtn:hover {\n  background: #6b4a24;\n}\n\n.collection-btn {\n  background: #f4ead6;\n  color: #3b2a16;\n  border: 1px solid rgba(90,70,40,0.35);\n}\n\n.collection-btn:hover {\n  background: #e7d4ad;\n}\n\n#successMessage {\n  margin-bottom: 10px;\n  padding: 12px;\n  background: #f4ead6;\n  border: 1px solid rgba(90,70,40,0.3);\n  color: #3b2a16;\n  font-size: 14px;\n  line-height: 1.4;\n}\n\n.note {\n  margin-top: 12px;\n  font-size: 13px;\n  color: #7d6b50;\n}\n\n#artGrid {\n  position: relative;\n  width: 100%;\n  max-width: 900px;\n  aspect-ratio: 1 \/ 1;\n  display: grid;\n  grid-template-columns: repeat(10, 1fr);\n  grid-template-rows: repeat(10, 1fr);\n  border: 1px solid rgba(60,45,25,0.35);\n  overflow: hidden;\n  background: #e8d6ad;\n  box-shadow: 0 20px 50px rgba(0,0,0,0.18);\n}\n\n.tile {\n  position: relative;\n  overflow: hidden;\n  border: 1px solid rgba(60,45,25,0.18);\n  background-image: url(\"https:\/\/muhugo.org\/wp-content\/uploads\/2026\/05\/goal-card-1-1.png\");\n  background-size: cover;\n  background-position: center;\n}\n\n.tile.open {\n  cursor: pointer;\n}\n\n.tile.local-pending {\n  outline: 2px solid rgba(190, 135, 48, 0.85);\n  box-shadow: inset 0 0 18px rgba(255, 206, 110, 0.65);\n}\n\n.tile.local-pending::after {\n  content: \"Pending curation\";\n  position: absolute;\n  left: 8%;\n  right: 8%;\n  bottom: 13%;\n  text-align: center;\n  font-family: Arial, sans-serif;\n  font-size: clamp(4px, 0.48vw, 8px);\n  color: rgba(59, 42, 22, 0.75);\n  letter-spacing: 0.4px;\n  text-transform: uppercase;\n  z-index: 6;\n}\n\n.tile-art {\n  position: absolute;\n  inset: 0;\n  background-image: url(\"https:\/\/muhugo.org\/wp-content\/uploads\/2026\/05\/goal-cards-art-250-.png\");\n  background-size: 1000% 1000%;\n  opacity: 0;\n  transition: opacity 0.8s ease;\n  pointer-events: none;\n  mix-blend-mode: multiply;\n  z-index: 1;\n}\n\n.tile.open .tile-art {\n  opacity: 0.42;\n}\n\n.tile-svg {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 3;\n  opacity: 0;\n  transition: 0.6s ease;\n  pointer-events: none;\n}\n\n.tile.open .tile-svg {\n  opacity: 1;\n}\n\n.tile-svg text {\n  font-family: Georgia, serif;\n  font-size: 35px;\n  letter-spacing: 3.2px;\n  fill: rgba(45,34,20,0.72);\n  text-transform: uppercase;\n}\n\n.tile-name,\n.tile-location,\n.tile-date,\n.tile-number {\n  position: absolute;\n  font-family: Arial, sans-serif;\n  color: rgba(45,34,20,0.68);\n  text-transform: uppercase;\n  opacity: 0;\n  z-index: 4;\n  overflow-wrap: break-word;\n}\n\n.tile-name,\n.tile-location {\n  top: 16.5%;\n  font-size: clamp(2.5px, 0.38vw, 12px);\n  line-height: 1.05;\n  letter-spacing: 0.3px;\n}\n\n.tile-name {\n  left: 16.5%;\n  width: 23%;\n}\n\n.tile-location {\n  left: 41.5%;\n  width: 25%;\n  text-align: center;\n}\n\n.tile-date {\n  top: 16.5%;\n  left: 70%;\n  width: 18%;\n  font-size: clamp(3px, 0.4vw, 12px);\n  text-align: center;\n  white-space: nowrap;\n}\n\n.tile-number {\n  right: 8%;\n  bottom: 6.5%;\n  font-size: clamp(3px, 0.42vw, 12px);\n  letter-spacing: 0.4px;\n  white-space: nowrap;\n}\n\n.tile.open .tile-name,\n.tile.open .tile-location,\n.tile.open .tile-date,\n.tile.open .tile-number {\n  opacity: 1;\n}\n\n.flying-card {\n  position: fixed;\n  z-index: 999999;\n  width: 180px;\n  height: 180px;\n  pointer-events: none;\n  transition: all 1.1s cubic-bezier(.25,.8,.25,1);\n  box-shadow: 0 12px 40px rgba(0,0,0,0.25);\n  overflow: hidden;\n}\n\n.card-modal,\n.submit-popup {\n  display: none;\n  position: fixed;\n  inset: 0;\n  background: rgba(0,0,0,0.68);\n  z-index: 9999999;\n  align-items: center;\n  justify-content: center;\n  padding: 20px;\n}\n\n.card-modal-content {\n  position: relative;\n  width: min(90vw, 760px);\n  aspect-ratio: 1 \/ 1;\n  background: #e8d6ad;\n  box-shadow: 0 30px 90px rgba(0,0,0,0.5);\n}\n\n.close-card-modal {\n  position: absolute;\n  right: -14px;\n  top: -14px;\n  width: 38px;\n  height: 38px;\n  border-radius: 50%;\n  border: none;\n  background: #3b2a16;\n  color: #fff7e8;\n  font-size: 26px;\n  cursor: pointer;\n  z-index: 20;\n  line-height: 1;\n}\n\n#modalCard {\n  width: 100%;\n  height: 100%;\n}\n\n#modalCard .tile {\n  width: 100%;\n  height: 100%;\n  border: none;\n}\n\n#modalCard .tile-svg text {\n  font-size: 35px;\n  letter-spacing: 3.2px;\n}\n\n#modalCard .tile-name,\n#modalCard .tile-location {\n  font-size: 18px;\n}\n\n#modalCard .tile-date,\n#modalCard .tile-number {\n  font-size: 18px;\n}\n\n.submit-popup-box {\n  position: relative;\n  width: min(92vw, 520px);\n  background: #fbf5e8;\n  border: 1px solid rgba(90,70,40,0.35);\n  box-shadow: 0 30px 90px rgba(0,0,0,0.45);\n  padding: 30px;\n  color: #3b2a16;\n  font-family: Georgia, serif;\n}\n\n.submit-popup-box h3 {\n  margin: 0 0 14px;\n  font-size: 26px;\n  color: #3b2a16;\n}\n\n#submitPopupText {\n  font-size: 16px;\n  line-height: 1.55;\n  margin: 0 0 22px;\n}\n\n.submit-popup-close {\n  position: absolute;\n  right: -12px;\n  top: -12px;\n  width: 36px;\n  height: 36px;\n  border-radius: 50%;\n  border: none;\n  background: #3b2a16;\n  color: #fff7e8;\n  font-size: 24px;\n  cursor: pointer;\n  line-height: 1;\n}\n\n.submit-popup-button {\n  width: 100%;\n  padding: 13px 18px;\n  border: none;\n  background: #3b2a16;\n  color: #fff7e8;\n  font-size: 15px;\n  cursor: pointer;\n  letter-spacing: 0.8px;\n}\n\n@media (max-width: 900px) {\n  #muhugo-participation {\n    grid-template-columns: 1fr;\n    padding: 18px;\n  }\n\n  #artGrid {\n    max-width: 100%;\n  }\n\n  .card-modal-content {\n    width: 94vw;\n  }\n\n  .submit-popup-box {\n    padding: 24px 20px;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  const firebaseConfig = {\n    apiKey: \"AIzaSyB-v9iQ6n9yx-oIETozD_AGA7D1_vTTiS4\",\n    authDomain: \"muhugo-online.firebaseapp.com\",\n    databaseURL: \"https:\/\/muhugo-online-default-rtdb.firebaseio.com\/\",\n    projectId: \"muhugo-online\",\n    storageBucket: \"muhugo-online.firebasestorage.app\",\n    messagingSenderId: \"1084194134486\",\n    appId: \"1:1084194134486:web:420f79b15d769622112c77\"\n  };\n\n  const firebaseAppUrl = \"https:\/\/www.gstatic.com\/firebasejs\/9.23.0\/firebase-app-compat.js\";\n  const firebaseDbUrl = \"https:\/\/www.gstatic.com\/firebasejs\/9.23.0\/firebase-database-compat.js\";\n\n  const grid = document.getElementById(\"artGrid\");\n  const goalInput = document.getElementById(\"goalInput\");\n  const nameInput = document.getElementById(\"nameInput\");\n  const locationInput = document.getElementById(\"locationInput\");\n  const previewName = document.getElementById(\"previewName\");\n  const previewLocation = document.getElementById(\"previewLocation\");\n  const previewDate = document.getElementById(\"previewDate\");\n  const previewNumber = document.getElementById(\"previewNumber\");\n  const previewCircleText1 = document.getElementById(\"previewCircleText1\");\n  const previewCircleText2 = document.getElementById(\"previewCircleText2\");\n  const previewCircleText3 = document.getElementById(\"previewCircleText3\");\n  const previewCard = document.getElementById(\"previewCard\");\n  const sendBtn = document.getElementById(\"sendGoalBtn\");\n  const successMessage = document.getElementById(\"successMessage\");\n  const cardModal = document.getElementById(\"cardModal\");\n  const modalCard = document.getElementById(\"modalCard\");\n  const closeCardModal = document.getElementById(\"closeCardModal\");\n  const submitPopup = document.getElementById(\"submitPopup\");\n  const submitPopupText = document.getElementById(\"submitPopupText\");\n  const closeSubmitPopup = document.getElementById(\"closeSubmitPopup\");\n  const submitPopupButton = document.getElementById(\"submitPopupButton\");\n\n  let db = null;\n  let submissions = [];\n  let lastSubmitTime = 0;\n\n  const today = new Date();\n  const autoDate = today.toLocaleDateString(\"en-US\", {\n    month: \"2-digit\",\n    day: \"2-digit\",\n    year: \"numeric\"\n  });\n\n  const TILE_ORDER = [\n    42, 57, 13, 86, 24, 68, 5, 91, 37, 73,\n    18, 50, 2, 99, 61, 30, 76, 45, 9, 84,\n    27, 64, 11, 53, 78, 34, 70, 1, 95, 48,\n    21, 59, 89, 16, 40, 72, 7, 66, 31, 97,\n    25, 55, 80, 3, 43, 69, 14, 92, 36, 74,\n    19, 51, 83, 28, 62, 10, 46, 87, 33, 71,\n    6, 94, 39, 22, 58, 77, 12, 49, 85, 29,\n    63, 4, 41, 90, 17, 54, 75, 32, 67, 98,\n    23, 56, 81, 8, 44, 88, 15, 52, 79, 35,\n    65, 0, 93, 20, 60, 82, 26, 47, 96, 38\n  ];\n\n  function getLocalPendingKeys() {\n    try {\n      return JSON.parse(sessionStorage.getItem(\"muhugoLocalPendingKeys\") || \"[]\");\n    } catch (e) {\n      return [];\n    }\n  }\n\n  function addLocalPendingKey(key) {\n    const keys = getLocalPendingKeys();\n    if (!keys.includes(key)) keys.push(key);\n    sessionStorage.setItem(\"muhugoLocalPendingKeys\", JSON.stringify(keys));\n  }\n\n  function loadScript(src) {\n    return new Promise(function(resolve, reject) {\n      if (document.querySelector('script[src=\"' + src + '\"]')) {\n        resolve();\n        return;\n      }\n\n      const script = document.createElement(\"script\");\n      script.src = src;\n      script.onload = resolve;\n      script.onerror = reject;\n      document.head.appendChild(script);\n    });\n  }\n\n  function initFirebase() {\n    return loadScript(firebaseAppUrl)\n      .then(function() {\n        return loadScript(firebaseDbUrl);\n      })\n      .then(function() {\n        if (!firebase.apps.length) {\n          firebase.initializeApp(firebaseConfig);\n        }\n        db = firebase.database();\n        listenToFirebase();\n      })\n      .catch(function(error) {\n        console.error(\"Firebase load error:\", error);\n        showInlineMessage(\"Firebase connection error. Please reload the page.\", true);\n      });\n  }\n\n  function formatNumber(num) {\n    return \"No. \" + String(num).padStart(3, \"0\");\n  }\n\n  function showInlineMessage(text, isError) {\n    successMessage.style.display = \"block\";\n    successMessage.style.background = isError ? \"#f8d7da\" : \"#f4ead6\";\n    successMessage.style.borderColor = isError ? \"#c62828\" : \"rgba(90,70,40,0.3)\";\n    successMessage.innerHTML = text;\n  }\n\n  function hideInlineMessage() {\n    successMessage.style.display = \"none\";\n  }\n\n  function showSubmitPopup(number) {\n    submitPopupText.innerHTML =\n      \"Your Goal Card has been submitted successfully.<br><br>\" +\n      \"<strong>Your Goal Card Registration Number:<\/strong> \" + number +\n      \"<br><br>Your card is now visible on your screen. It will appear publicly in the shared artwork after curation.<br><br>\" +\n      \"Please save this number. You will be able to use it later to find your card in the collection.\";\n    submitPopup.style.display = \"flex\";\n  }\n\n  function closeSubmitPopupBox() {\n    submitPopup.style.display = \"none\";\n  }\n\n  closeSubmitPopup.addEventListener(\"click\", closeSubmitPopupBox);\n  submitPopupButton.addEventListener(\"click\", closeSubmitPopupBox);\n\n  submitPopup.addEventListener(\"click\", function(e) {\n    if (e.target === submitPopup) {\n      closeSubmitPopupBox();\n    }\n  });\n\n  function splitGoalIntoRings(text) {\n    const clean = (text || \"MY GOAL IS TO...\").toUpperCase().trim();\n    const max1 = 118;\n    const max2 = 94;\n    const max3 = 72;\n\n    let words = clean.split(\/\\s+\/).filter(Boolean);\n    let rings = [\"\", \"\", \"\"];\n\n    function fillRing(limit) {\n      let line = \"\";\n      while (words.length) {\n        const next = words[0];\n        const test = line ? line + \" \" + next : next;\n        if (test.length > limit) break;\n        line = test;\n        words.shift();\n      }\n      return line;\n    }\n\n    rings[0] = fillRing(max1);\n    rings[1] = fillRing(max2);\n    rings[2] = fillRing(max3);\n\n    if (words.length) {\n      const rest = words.join(\" \");\n      rings[2] = rings[2] ? rings[2] + \" \" + rest : rest;\n    }\n\n    return rings;\n  }\n\n  function validateGoalSubmission(goal, name, location) {\n    const combinedText = (goal + \" \" + name + \" \" + location).toLowerCase();\n\n    if (!goal || goal.trim().length < 5) {\n      return \"Please write a more meaningful goal.\";\n    }\n\n    const linkPattern = \/(https?:\\\/\\\/|www\\.|\\.com|\\.net|\\.org|\\.ru|\\.ua|\\.xyz|\\.info|\\.online)\/i;\n    if (linkPattern.test(combinedText)) {\n      return \"Links are not allowed in Goal Cards.\";\n    }\n\n    const emailPattern = \/[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}\/i;\n    if (emailPattern.test(combinedText)) {\n      return \"Email addresses are not allowed in Goal Cards.\";\n    }\n\n    const phonePattern = \/(\\+?\\d[\\d\\s().-]{7,}\\d)\/;\n    if (phonePattern.test(combinedText)) {\n      return \"Phone numbers are not allowed in Goal Cards.\";\n    }\n\n    const repeatPattern = \/(.)\\1{5,}\/;\n    if (repeatPattern.test(combinedText)) {\n      return \"Please avoid repeated characters or spam-like text.\";\n    }\n\n    const lettersOnly = goal.replace(\/[^A-Za-z\u0410-\u042f\u0430-\u044f]\/g, \"\");\n    const upperOnly = goal.replace(\/[^A-Z\u0410-\u042f]\/g, \"\");\n\n    if (lettersOnly.length > 20 && upperOnly.length \/ lettersOnly.length > 0.75) {\n      return \"Please avoid writing the entire goal in capital letters.\";\n    }\n\n    const bannedWords = [\n      \"fuck\", \"shit\", \"bitch\", \"asshole\", \"dick\", \"pussy\", \"porn\", \"sex\",\n      \"scam\", \"crypto\", \"bitcoin\", \"casino\", \"viagra\", \"loan\", \"click here\",\n      \"buy now\", \"free money\",\n      \"\u0431\u043b\u044f\u0434\", \"\u0441\u0443\u043a\u0430\", \"\u0445\u0443\u0439\", \"\u043f\u0438\u0437\u0434\", \"\u0435\u0431\u0430\", \"\u0451\u0431\u0430\", \"\u043c\u0440\u0430\u0437\u044c\", \"\u0433\u0430\u043d\u0434\u043e\u043d\",\n      \"\u043f\u043e\u0440\u043d\u043e\", \"\u0441\u0435\u043a\u0441\", \"\u043a\u0430\u0437\u0438\u043d\u043e\", \"\u043a\u0440\u0438\u043f\u0442\u0430\", \"\u0431\u0438\u0442\u043a\u043e\u0438\u043d\", \"\u0437\u0430\u0439\u043c\", \"\u043a\u0440\u0435\u0434\u0438\u0442\",\n      \"\u043f\u0435\u0440\u0435\u0439\u0434\u0438\", \"\u0436\u043c\u0438 \u0441\u044e\u0434\u0430\", \"\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0434\u0435\u043d\u044c\u0433\u0438\"\n    ];\n\n    for (const word of bannedWords) {\n      if (combinedText.includes(word)) {\n        return \"Please rewrite your goal using respectful language.\";\n      }\n    }\n\n    if (Date.now() - lastSubmitTime < 60000) {\n      return \"Please wait before sending another Goal Card.\";\n    }\n\n    return null;\n  }\n\n  function createGrid() {\n    grid.innerHTML = \"\";\n\n    for (let i = 0; i < 100; i++) {\n      const tile = document.createElement(\"div\");\n      tile.className = \"tile\";\n      tile.dataset.index = i;\n\n      const art = document.createElement(\"div\");\n      art.className = \"tile-art\";\n\n      const col = i % 10;\n      const row = Math.floor(i \/ 10);\n      art.style.backgroundPosition = `${col * 11.111}% ${row * 11.111}%`;\n\n      const svg = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"svg\");\n      svg.setAttribute(\"class\", \"tile-svg\");\n      svg.setAttribute(\"viewBox\", \"0 0 1000 1000\");\n\n      const defs = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"defs\");\n      svg.appendChild(defs);\n\n      [300, 240, 180].forEach(function(r, ringIndex) {\n        const path = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"path\");\n        const pathId = \"circlePathTile\" + i + \"_\" + ringIndex;\n\n        path.setAttribute(\"id\", pathId);\n        path.setAttribute(\"d\", `M 500,500 m -${r},0 a ${r},${r} 0 1,1 ${r * 2},0 a ${r},${r} 0 1,1 -${r * 2},0`);\n        defs.appendChild(path);\n\n        const text = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"text\");\n        const textPath = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"textPath\");\n\n        textPath.setAttribute(\"href\", \"#\" + pathId);\n        textPath.setAttributeNS(\"http:\/\/www.w3.org\/1999\/xlink\", \"href\", \"#\" + pathId);\n        textPath.setAttribute(\"startOffset\", \"0%\");\n        textPath.setAttribute(\"class\", \"tile-ring-text\");\n\n        text.appendChild(textPath);\n        svg.appendChild(text);\n      });\n\n      const name = document.createElement(\"div\");\n      name.className = \"tile-name\";\n\n      const location = document.createElement(\"div\");\n      location.className = \"tile-location\";\n\n      const date = document.createElement(\"div\");\n      date.className = \"tile-date\";\n\n      const number = document.createElement(\"div\");\n      number.className = \"tile-number\";\n\n      tile.appendChild(art);\n      tile.appendChild(svg);\n      tile.appendChild(name);\n      tile.appendChild(location);\n      tile.appendChild(date);\n      tile.appendChild(number);\n\n      grid.appendChild(tile);\n    }\n  }\n\n  function updatePreview() {\n    const goal = goalInput.value.trim();\n    const name = nameInput.value.trim();\n    const location = locationInput.value.trim();\n    const rings = splitGoalIntoRings(goal || \"MY GOAL IS TO...\");\n\n    previewCircleText1.textContent = rings[0] || \"\";\n    previewCircleText2.textContent = rings[1] || \"\";\n    previewCircleText3.textContent = rings[2] || \"\";\n\n    previewName.textContent = name ? name.toUpperCase() : \"NAME\";\n    previewLocation.textContent = location ? location.toUpperCase() : \"LOCATION\";\n    previewDate.textContent = autoDate;\n    previewNumber.textContent = formatNumber(submissions.length + 1);\n  }\n\n  function clearGridCards() {\n    document.querySelectorAll(\".tile\").forEach(function(tile) {\n      tile.classList.remove(\"open\");\n      tile.classList.remove(\"local-pending\");\n      tile.onclick = null;\n\n      tile.querySelectorAll(\".tile-ring-text\").forEach(function(tp) {\n        tp.textContent = \"\";\n      });\n\n      tile.querySelector(\".tile-name\").textContent = \"\";\n      tile.querySelector(\".tile-location\").textContent = \"\";\n      tile.querySelector(\".tile-date\").textContent = \"\";\n      tile.querySelector(\".tile-number\").textContent = \"\";\n    });\n  }\n\n  function isLocalPending(item) {\n    return item.status === \"pending\" && item.firebaseKey && getLocalPendingKeys().includes(item.firebaseKey);\n  }\n\n  function renderSubmissions() {\n    clearGridCards();\n\n    const visibleCards = submissions.filter(function(item) {\n      return item.status === \"approved\" || isLocalPending(item);\n    });\n\n    const tiles = document.querySelectorAll(\".tile\");\n\n    visibleCards.forEach(function(item, index) {\n      if (index >= 100) return;\n\n      const tileIndex = typeof item.tileIndex === \"number\" ? item.tileIndex : TILE_ORDER[index];\n      const tile = tiles[tileIndex];\n      if (!tile) return;\n\n      tile.classList.add(\"open\");\n\n      if (isLocalPending(item)) {\n        tile.classList.add(\"local-pending\");\n      }\n\n      const rings = splitGoalIntoRings(item.goal);\n      const textPaths = tile.querySelectorAll(\".tile-ring-text\");\n\n      textPaths.forEach(function(tp, idx) {\n        tp.textContent = rings[idx] || \"\";\n      });\n\n      tile.querySelector(\".tile-name\").textContent = item.name || \"\";\n      tile.querySelector(\".tile-location\").textContent = item.location || \"\";\n      tile.querySelector(\".tile-date\").textContent = item.date || \"\";\n      tile.querySelector(\".tile-number\").textContent = item.number || formatNumber(index + 1);\n\n      tile.onclick = function() {\n        openCardModal(tile);\n      };\n    });\n\n    updatePreview();\n  }\n\n  function openCardModal(tile) {\n    modalCard.innerHTML = \"\";\n    const clone = tile.cloneNode(true);\n    clone.classList.add(\"open\");\n    clone.onclick = null;\n    modalCard.appendChild(clone);\n    cardModal.style.display = \"flex\";\n  }\n\n  closeCardModal.addEventListener(\"click\", function() {\n    cardModal.style.display = \"none\";\n    modalCard.innerHTML = \"\";\n  });\n\n  cardModal.addEventListener(\"click\", function(e) {\n    if (e.target === cardModal) {\n      cardModal.style.display = \"none\";\n      modalCard.innerHTML = \"\";\n    }\n  });\n\n  function listenToFirebase() {\n    if (!db) return;\n\n    db.ref(\"cards\").on(\"value\", function(snapshot) {\n      const data = snapshot.val();\n\n      if (!data) {\n        submissions = [];\n        renderSubmissions();\n        return;\n      }\n\n      submissions = Object.keys(data).map(function(key) {\n        return Object.assign({ firebaseKey: key }, data[key]);\n      }).sort(function(a, b) {\n        return (a.numberNumeric || 0) - (b.numberNumeric || 0);\n      });\n\n      renderSubmissions();\n    }, function(error) {\n      console.error(\"Firebase read error:\", error);\n      showInlineMessage(\"Firebase read error: \" + error.message, true);\n    });\n  }\n\n  function reserveNextNumber() {\n    return db.ref(\"meta\/currentCount\").transaction(function(current) {\n      const next = (current || 0) + 1;\n      if (next > 100) return;\n      return next;\n    });\n  }\n\n  function saveCardToFirebase(cardData) {\n    const ref = db.ref(\"cards\").push();\n    return ref.set(cardData).then(function() {\n      return ref.key;\n    });\n  }\n\n  function animateCardToTile(targetTile, callback) {\n    if (!targetTile) {\n      callback();\n      return;\n    }\n\n    const start = previewCard.getBoundingClientRect();\n    const end = targetTile.getBoundingClientRect();\n\n    const flyer = previewCard.cloneNode(true);\n    flyer.className = \"flying-card\";\n\n    flyer.style.left = start.left + \"px\";\n    flyer.style.top = start.top + \"px\";\n    flyer.style.width = start.width + \"px\";\n    flyer.style.height = start.height + \"px\";\n\n    document.body.appendChild(flyer);\n\n    requestAnimationFrame(function() {\n      flyer.style.left = end.left + \"px\";\n      flyer.style.top = end.top + \"px\";\n      flyer.style.width = end.width + \"px\";\n      flyer.style.height = end.height + \"px\";\n      flyer.style.opacity = \"0.25\";\n      flyer.style.transform = \"rotate(4deg) scale(0.96)\";\n    });\n\n    setTimeout(function() {\n      flyer.remove();\n      callback();\n    }, 1150);\n  }\n\n  goalInput.addEventListener(\"input\", function() {\n    updatePreview();\n    hideInlineMessage();\n  });\n\n  nameInput.addEventListener(\"input\", function() {\n    updatePreview();\n    hideInlineMessage();\n  });\n\n  locationInput.addEventListener(\"input\", function() {\n    updatePreview();\n    hideInlineMessage();\n  });\n\n  sendBtn.addEventListener(\"click\", function() {\n    const goal = goalInput.value.trim();\n    const name = nameInput.value.trim();\n    const location = locationInput.value.trim();\n\n    const validationError = validateGoalSubmission(goal, name, location);\n\n    if (validationError) {\n      showInlineMessage(validationError, true);\n      return;\n    }\n\n    if (!db) {\n      showInlineMessage(\"Firebase is not ready yet. Please reload the page.\", true);\n      return;\n    }\n\n    sendBtn.disabled = true;\n    sendBtn.textContent = \"Sending...\";\n\n    let orderNumber = \"\";\n    let tileIndex = null;\n    let cardData = null;\n\n    reserveNextNumber()\n      .then(function(result) {\n        if (!result.committed || !result.snapshot.val()) {\n          throw new Error(\"This artwork is complete.\");\n        }\n\n        const numberNumeric = result.snapshot.val();\n        orderNumber = formatNumber(numberNumeric);\n        tileIndex = TILE_ORDER[numberNumeric - 1];\n        const targetTile = document.querySelector(`.tile[data-index=\"${tileIndex}\"]`);\n\n        cardData = {\n          goal: goal,\n          name: name.toUpperCase(),\n          location: location.toUpperCase(),\n          date: autoDate,\n          number: orderNumber,\n          numberNumeric: numberNumeric,\n          tileIndex: tileIndex,\n          status: \"pending\",\n          createdAt: Date.now()\n        };\n\n        return new Promise(function(resolve, reject) {\n          animateCardToTile(targetTile, function() {\n            saveCardToFirebase(cardData)\n              .then(function(firebaseKey) {\n  addLocalPendingKey(firebaseKey);\n  renderSubmissions();\n  resolve(orderNumber);\n              })\n              .catch(reject);\n          });\n        });\n      })\n      .then(function(submittedNumber) {\n        lastSubmitTime = Date.now();\n\n        goalInput.value = \"\";\n        nameInput.value = \"\";\n        locationInput.value = \"\";\n        updatePreview();\n\n        showSubmitPopup(submittedNumber);\n      })\n      .catch(function(error) {\n        console.error(\"Submit error:\", error);\n        showInlineMessage(error.message || \"Something went wrong. Please try again.\", true);\n      })\n      .finally(function() {\n        sendBtn.disabled = false;\n        sendBtn.textContent = \"Send Goal\";\n      });\n  });\n\n  createGrid();\n  updatePreview();\n  initFirebase();\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Join the Living Artwork Write your goal and send it into the collective MuHuGo artwork. NAME LOCATION DATE No. 001 MY GOAL IS TO&#8230; Send Goal Collection Your goal becomes part of the artwork after curation. \u00d7 \u00d7 Goal Card Submitted Close<\/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-996","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/muhugo.org\/index.php?rest_route=\/wp\/v2\/pages\/996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/muhugo.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/muhugo.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/muhugo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/muhugo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=996"}],"version-history":[{"count":5,"href":"https:\/\/muhugo.org\/index.php?rest_route=\/wp\/v2\/pages\/996\/revisions"}],"predecessor-version":[{"id":1074,"href":"https:\/\/muhugo.org\/index.php?rest_route=\/wp\/v2\/pages\/996\/revisions\/1074"}],"wp:attachment":[{"href":"https:\/\/muhugo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}