{"id":93,"date":"2026-10-15T23:41:04","date_gmt":"2026-10-15T23:41:04","guid":{"rendered":"https:\/\/apk.produsenpagarbrc.com\/?p=93"},"modified":"2026-10-15T23:41:04","modified_gmt":"2026-10-15T23:41:04","slug":"mochilight-routecraft","status":"publish","type":"post","link":"https:\/\/play.produsenpagarbrc.com\/?p=93","title":{"rendered":"Mochilight Routecraft"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Mochilight Routecraft is a cozy route-rotation puzzle game set inside the Moon Rabbit Workshop, a hidden celestial workshop floating above the night clouds. Players must rotate handcrafted route tiles to guide streams of creamy moonlight from glowing Moonforge Hubs toward waiting Mochi Parcels. Every completed connection restores another part of the workshop, delivers precious lunar energy, and helps the moon rabbits keep the night sky peaceful until dawn.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The game offers fifty carefully structured puzzle levels that gradually introduce larger boards, locked route pieces, permanent junctions, multiple energy sources, and increasingly complex networks. The basic action is simple: tap or click a movable tile to rotate it clockwise. However, creating a complete route requires observation, spatial reasoning, and the ability to understand how every small section affects the wider network.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/play.produsenpagarbrc.com\/wp-content\/uploads\/2026\/10\/Mochilight-Routecraft-1024x768.png\" alt=\"\" class=\"wp-image-94\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">The Workshop Hidden Above the Night Clouds<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Far beyond the highest mountain and above the quietest layer of clouds stands the Moon Rabbit Workshop. Its wooden rooms are connected by narrow bridges, round windows, cloud balconies, and glowing lanterns. During the day, the workshop disappears behind the sunlight. At night, it awakens beneath the large creamy moon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The moon rabbits who live there are skilled craftspeople. They shape mochi that stores gentle lunar energy, carve tiny wooden mallets, repair broken lanterns, weave protective cloud cloth, and prepare Moon Charms for stars that have lost their way. Their work ensures that villages receive soft moonlight, wandering clouds remain on their routes, and the night never becomes completely dark.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At the center of the workshop is an ancient network called the Mochilight Route. This system carries moonlight from the Moonforge Hubs to every crafting room and delivery station. The routes resemble glowing threads placed inside rotating wooden tiles. When correctly aligned, they form an uninterrupted path of light.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One night, a wave of unstable cloud wind shakes the workshop. The route tiles spin out of position, several connections are broken, and dozens of Mochi Parcels lose access to the energy they need. Without the route network, the parcels cannot be sealed, the lanterns cannot be filled, and the workshop may fail to complete its duties before sunrise.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The player enters the story as a new routekeeper. Rather than carrying a weapon or fighting an enemy, the routekeeper must restore order through patience and careful thinking. Every tile turned in the correct direction brings the workshop one step closer to waking again.<\/p>\n\n\n\n<div id=\"mochilight-routecraft\" aria-label=\"Mochilight Routecraft, a Moon Rabbit Workshop route rotation puzzle\"><p class=\"mrc-loading-note\">Mochilight Routecraft sedang dimuat. Jika pesan ini tetap terlihat setelah halaman selesai dimuat, periksa apakah WordPress menjalankan JavaScript pada blok Custom HTML.<\/p><\/div>\n\n<style>\nhtml.mrc-page-lock,\nbody.mrc-page-lock {\n  overflow: hidden !important;\n  overscroll-behavior: none;\n}\n\n#mochilight-routecraft .mrc-loading-note { margin: auto; max-width: 44rem; padding: 2rem; color: #fff4cf; font: 600 14px\/1.5 system-ui, sans-serif; text-align: center; }\n\n#mochilight-routecraft,\n#mochilight-routecraft * {\n  box-sizing: border-box;\n}\n\n#mochilight-routecraft {\n  --mrc-moon-950: #21132f;\n  --mrc-night-900: #302044;\n  --mrc-violet-800: #4a3564;\n  --mrc-violet-700: #6f568e;\n  --mrc-lavender-300: #b8a7d6;\n  --mrc-cloud-200: #d9d8f4;\n  --mrc-cloud-100: #eceafa;\n  --mrc-moon-cream: #fff4cf;\n  --mrc-paper-ivory: #fffaf0;\n  --mrc-moon-gold: #d7a84e;\n  --mrc-wood-dark: #71482f;\n  --mrc-warm-wood: #b8875c;\n  --mrc-dusty-rose: #d9899a;\n  --mrc-ink-plum: #2a1d36;\n  --mrc-border: rgba(244, 200, 90, .34);\n  --mrc-shadow: rgba(20, 10, 31, .28);\n  position: relative;\n  width: 100%;\n  max-width: 1280px;\n  aspect-ratio: 16 \/ 9;\n  margin: 18px auto;\n  overflow: hidden;\n  isolation: isolate;\n  border: 1px solid var(--mrc-border);\n  border-radius: 20px;\n  color: var(--mrc-ink-plum);\n  color-scheme: light;\n  background:\n    radial-gradient(circle at 82% 10%, rgba(255, 244, 207, .16), transparent 25%),\n    linear-gradient(155deg, #21132f, #3a2752 58%, #6b4b65);\n  font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Arial, sans-serif;\n  line-height: 1.25;\n  user-select: none;\n  -webkit-user-select: none;\n  -webkit-tap-highlight-color: transparent;\n  box-shadow:\n    0 24px 62px rgba(20, 10, 31, .24),\n    inset 0 1px 0 rgba(255, 255, 255, .76);\n}\n\nhtml.is-dark #mochilight-routecraft,\nbody.is-dark #mochilight-routecraft {\n  --mrc-moon-950: #170d24;\n  --mrc-night-900: #21142f;\n  --mrc-violet-800: #332348;\n  --mrc-violet-700: #55406f;\n  --mrc-lavender-300: #9b8bbd;\n  --mrc-cloud-200: #554c6b;\n  --mrc-cloud-100: #342a47;\n  --mrc-moon-cream: #f8ebc7;\n  --mrc-paper-ivory: #d8c7a5;\n  --mrc-moon-gold: #d7a84e;\n  --mrc-wood-dark: #65412c;\n  --mrc-warm-wood: #b8875c;\n  --mrc-dusty-rose: #c9788b;\n  --mrc-ink-plum: #f7efd8;\n  --mrc-border: rgba(184, 167, 214, .28);\n  --mrc-shadow: rgba(0, 0, 0, .38);\n  color-scheme: dark;\n  background:\n    radial-gradient(circle at 80% 9%, rgba(244, 200, 90, .12), transparent 26%),\n    linear-gradient(180deg, #160c22 0%, #241533 58%, #30213d 100%);\n}\n\n#mochilight-routecraft:fullscreen,\n#mochilight-routecraft:-webkit-full-screen,\n#mochilight-routecraft.mrc-fullscreen {\n  position: fixed;\n  inset: 0;\n  z-index: 2147483647;\n  width: 100vw;\n  width: 100dvw;\n  max-width: none;\n  height: 100vh;\n  height: 100dvh;\n  margin: 0;\n  overflow: hidden;\n  border: 0;\n  border-radius: 0;\n  aspect-ratio: auto;\n  background: var(--mrc-moon-950);\n}\n\n#mochilight-routecraft .mrc-stage {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 1280px;\n  height: 720px;\n  overflow: hidden;\n  isolation: isolate;\n  transform: translate3d(-50%, -50%, 0) scale(1);\n  transform-origin: center;\n  will-change: transform;\n  background:\n    radial-gradient(circle at 50% 6%, rgba(255, 244, 207, .18), transparent 31%),\n    linear-gradient(180deg, #2a173d 0%, #3d2b55 59%, #6e506c 100%);\n}\n\nhtml.is-dark #mochilight-routecraft .mrc-stage,\nbody.is-dark #mochilight-routecraft .mrc-stage {\n  background:\n    radial-gradient(circle at 50% 6%, rgba(244, 200, 90, .10), transparent 33%),\n    linear-gradient(180deg, #160c22 0%, #251735 59%, #2f203d 100%);\n}\n\n#mochilight-routecraft .mrc-stage::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  z-index: 44;\n  pointer-events: none;\n  background: radial-gradient(ellipse at 50% 48%, transparent 62%, rgba(15, 7, 24, .24) 100%);\n}\n\nhtml.is-dark #mochilight-routecraft .mrc-stage::after,\nbody.is-dark #mochilight-routecraft .mrc-stage::after {\n  background: radial-gradient(ellipse at 50% 48%, transparent 56%, rgba(0, 0, 0, .36) 100%);\n}\n\n#mochilight-routecraft .mrc-scene {\n  position: absolute;\n  inset: 0;\n  z-index: 1;\n  overflow: hidden;\n  pointer-events: none;\n}\n\n\n\/* Moon Rabbit Workshop environment *\/\n#mochilight-routecraft .mrc-workshop-sky {\n  position: absolute;\n  inset: 0 0 102px;\n  overflow: hidden;\n  background:\n    radial-gradient(circle at 50% 23%, rgba(255, 244, 207, .96) 0 82px, rgba(255, 221, 145, .36) 83px 112px, transparent 113px),\n    radial-gradient(ellipse at 20% 83%, rgba(174, 151, 213, .38) 0 118px, transparent 120px),\n    radial-gradient(ellipse at 80% 79%, rgba(121, 93, 161, .34) 0 142px, transparent 144px),\n    linear-gradient(180deg, #241536 0%, #3a2752 52%, #5e4675 100%);\n}\n\n#mochilight-routecraft .mrc-workshop-sky::before {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  opacity: .88;\n  background:\n    radial-gradient(circle at 8% 18%, #fff4cf 0 2px, transparent 3px),\n    radial-gradient(circle at 16% 39%, rgba(255,244,207,.75) 0 1.5px, transparent 2.5px),\n    radial-gradient(circle at 27% 12%, #d9d8f4 0 2px, transparent 3px),\n    radial-gradient(circle at 34% 42%, rgba(255,244,207,.72) 0 1.5px, transparent 2.5px),\n    radial-gradient(circle at 66% 14%, #fff4cf 0 2px, transparent 3px),\n    radial-gradient(circle at 74% 36%, rgba(217,216,244,.86) 0 1.5px, transparent 2.5px),\n    radial-gradient(circle at 89% 20%, #fff4cf 0 2px, transparent 3px),\n    radial-gradient(circle at 94% 48%, rgba(255,244,207,.72) 0 1.5px, transparent 2.5px);\n}\n\n#mochilight-routecraft .mrc-workshop-sky::after {\n  content: \"\";\n  position: absolute;\n  left: 302px;\n  right: 302px;\n  bottom: 42px;\n  height: 150px;\n  border: 7px solid #6b4937;\n  border-bottom: 0;\n  border-radius: 84px 84px 0 0;\n  background:\n    linear-gradient(90deg, transparent 48.8%, rgba(113,72,47,.88) 49% 51%, transparent 51.2%),\n    linear-gradient(0deg, transparent 48.8%, rgba(113,72,47,.88) 49% 51%, transparent 51.2%),\n    radial-gradient(circle at 50% 50%, rgba(255,244,207,.95) 0 7px, transparent 8px),\n    linear-gradient(180deg, rgba(255,255,255,.08), rgba(24,13,36,.30));\n  box-shadow:\n    inset 0 0 0 3px rgba(255,244,207,.13),\n    0 18px 30px rgba(10,4,18,.25);\n}\n\n#mochilight-routecraft .mrc-lantern-line {\n  position: absolute;\n  left: 64px;\n  right: 64px;\n  top: 16px;\n  height: 106px;\n  border-top: 3px solid rgba(113,72,47,.82);\n  border-radius: 50%;\n}\n\n#mochilight-routecraft .mrc-lantern-line::before,\n#mochilight-routecraft .mrc-lantern-line::after {\n  content: \"\";\n  position: absolute;\n  top: 25px;\n  width: 54px;\n  height: 70px;\n  border: 4px solid #71482f;\n  border-radius: 24px 24px 18px 18px;\n  background:\n    radial-gradient(circle at 50% 52%, #fff9df 0 13px, #f4c85a 14px 24px, #7d5d92 25px 100%);\n  box-shadow:\n    0 0 24px rgba(244,200,90,.56),\n    inset 0 0 0 3px rgba(255,255,255,.16);\n}\n\n#mochilight-routecraft .mrc-lantern-line::before {\n  left: 125px;\n  transform: rotate(-4deg);\n}\n\n#mochilight-routecraft .mrc-lantern-line::after {\n  right: 125px;\n  transform: rotate(4deg);\n}\n\n#mochilight-routecraft .mrc-moon-window {\n  position: absolute;\n  top: 132px;\n  width: 232px;\n  height: 302px;\n  overflow: hidden;\n  border: 8px solid #71482f;\n  border-radius: 116px 116px 34px 34px;\n  background:\n    radial-gradient(circle at 70% 22%, #fff4cf 0 31px, rgba(244,200,90,.44) 32px 47px, transparent 48px),\n    radial-gradient(ellipse at 20% 100%, #8469a5 0 49%, transparent 50%),\n    radial-gradient(ellipse at 74% 100%, #5c4778 0 61%, transparent 62%),\n    linear-gradient(180deg, #241536, #493361 60%, #7f65a2);\n  box-shadow:\n    0 14px 28px rgba(15,7,24,.30),\n    inset 0 0 0 3px rgba(255,244,207,.14);\n}\n\n#mochilight-routecraft .mrc-moon-window::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background:\n    linear-gradient(90deg, transparent 48%, rgba(113,72,47,.82) 48% 52%, transparent 52%),\n    linear-gradient(0deg, transparent 49%, rgba(113,72,47,.82) 49% 53%, transparent 53%);\n}\n\n#mochilight-routecraft .mrc-moon-window-left {\n  left: -58px;\n  transform: rotate(-1deg);\n}\n\n#mochilight-routecraft .mrc-moon-window-right {\n  right: -58px;\n  transform: rotate(1deg);\n}\n\n#mochilight-routecraft .mrc-moon-window span {\n  position: absolute;\n  left: 56px;\n  right: 56px;\n  top: 54px;\n  z-index: 2;\n  height: 96px;\n  border: 5px solid rgba(255,244,207,.64);\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 43% 44%, #241536 0 18px, transparent 19px),\n    radial-gradient(circle, #fff4cf 0 47%, #f4c85a 48% 62%, #6f568e 63% 100%);\n  box-shadow: 0 0 24px rgba(244,200,90,.42);\n}\n\n#mochilight-routecraft .mrc-charm-line {\n  position: absolute;\n  left: 312px;\n  right: 312px;\n  top: 126px;\n  height: 50px;\n  border-top: 3px solid rgba(113,72,47,.60);\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 8% 44%, #f4c85a 0 7px, transparent 8px),\n    radial-gradient(circle at 27% 63%, #b8a7d6 0 7px, transparent 8px),\n    radial-gradient(circle at 48% 40%, #fff4cf 0 7px, transparent 8px),\n    radial-gradient(circle at 69% 63%, #d9899a 0 7px, transparent 8px),\n    radial-gradient(circle at 91% 44%, #f4c85a 0 7px, transparent 8px);\n  filter: drop-shadow(0 0 7px rgba(244,200,90,.42));\n}\n\n#mochilight-routecraft .mrc-tool-rack {\n  position: absolute;\n  left: 40px;\n  bottom: 70px;\n  width: 238px;\n  height: 310px;\n  border: 7px solid #5e3e2c;\n  border-radius: 28px;\n  background:\n    repeating-linear-gradient(0deg, transparent 0 68px, rgba(94,62,44,.86) 68px 75px),\n    linear-gradient(180deg, #9a6b4c, #65432f);\n  box-shadow:\n    0 22px 34px rgba(12,5,20,.30),\n    inset 0 3px 0 rgba(255,255,255,.10);\n}\n\n#mochilight-routecraft .mrc-tool-rack::before {\n  content: \"\";\n  position: absolute;\n  inset: 18px 20px 28px;\n  background:\n    linear-gradient(90deg, transparent 0 12px, #d7a84e 12px 19px, transparent 19px) 8px 12px \/ 60px 70px repeat,\n    radial-gradient(ellipse at 21% 18%, #b8875c 0 13px, #71482f 14px 17px, transparent 18px),\n    radial-gradient(ellipse at 54% 51%, #f4c85a 0 12px, #71482f 13px 16px, transparent 17px),\n    radial-gradient(ellipse at 82% 84%, #b8a7d6 0 13px, #71482f 14px 17px, transparent 18px);\n  opacity: .95;\n}\n\n#mochilight-routecraft .mrc-forge-glow {\n  position: absolute;\n  left: 50%;\n  bottom: 28px;\n  width: 60px;\n  height: 52px;\n  transform: translateX(-50%);\n  border: 4px solid #71482f;\n  border-radius: 17px;\n  background:\n    radial-gradient(circle, #fff9df 0 22%, #f4c85a 23% 56%, #6f568e 57% 100%);\n  box-shadow: 0 0 29px rgba(244,200,90,.76);\n  animation: mrc-forge-pulse 2.5s ease-in-out infinite alternate;\n}\n\n#mochilight-routecraft .mrc-mochi-shelf {\n  position: absolute;\n  right: 40px;\n  bottom: 70px;\n  width: 232px;\n  height: 310px;\n  border: 7px solid #4a3564;\n  border-radius: 28px;\n  background:\n    repeating-linear-gradient(0deg, transparent 0 69px, rgba(48,32,68,.78) 69px 76px),\n    repeating-linear-gradient(90deg, transparent 0 70px, rgba(48,32,68,.78) 70px 77px),\n    linear-gradient(180deg, #8069a0, #4c3b66);\n  box-shadow:\n    0 22px 34px rgba(12,5,20,.30),\n    inset 0 0 0 3px rgba(255,255,255,.10);\n}\n\n#mochilight-routecraft .mrc-mochi-shelf::before {\n  content: \"\";\n  position: absolute;\n  inset: 20px;\n  background:\n    radial-gradient(circle at 18% 13%, #fff4cf 0 15px, #d9899a 16px 19px, transparent 20px),\n    radial-gradient(circle at 50% 13%, #fff4cf 0 15px, #f4c85a 16px 19px, transparent 20px),\n    radial-gradient(circle at 82% 13%, #fff4cf 0 15px, #b8a7d6 16px 19px, transparent 20px),\n    radial-gradient(circle at 18% 50%, #fff4cf 0 15px, #b8a7d6 16px 19px, transparent 20px),\n    radial-gradient(circle at 50% 50%, #fff4cf 0 15px, #d9899a 16px 19px, transparent 20px),\n    radial-gradient(circle at 82% 50%, #fff4cf 0 15px, #f4c85a 16px 19px, transparent 20px),\n    radial-gradient(circle at 18% 87%, #fff4cf 0 15px, #f4c85a 16px 19px, transparent 20px),\n    radial-gradient(circle at 50% 87%, #fff4cf 0 15px, #b8a7d6 16px 19px, transparent 20px),\n    radial-gradient(circle at 82% 87%, #fff4cf 0 15px, #d9899a 16px 19px, transparent 20px);\n}\n\n#mochilight-routecraft .mrc-mallet-table {\n  position: absolute;\n  right: 280px;\n  bottom: 88px;\n  width: 144px;\n  height: 88px;\n  border: 6px solid #5e3e2c;\n  border-radius: 50%;\n  background: linear-gradient(180deg, #9a6b4c, #65432f);\n  box-shadow: 0 13px 21px rgba(12,5,20,.28);\n}\n\n#mochilight-routecraft .mrc-mallet-table::before {\n  content: \"\";\n  position: absolute;\n  left: 58px;\n  top: 68px;\n  width: 20px;\n  height: 68px;\n  border-radius: 8px;\n  background: #5e3e2c;\n  box-shadow: -31px 50px 0 -5px #5e3e2c, 31px 50px 0 -5px #5e3e2c;\n}\n\n#mochilight-routecraft .mrc-moon-lantern {\n  position: absolute;\n  left: 43px;\n  top: -14px;\n  width: 60px;\n  height: 64px;\n  border: 4px solid #71482f;\n  border-radius: 18px 18px 23px 23px;\n  background:\n    radial-gradient(circle at 50% 52%, #fff9df 0 15px, #f4c85a 16px 27px, #6f568e 28px 100%);\n  box-shadow: 0 0 23px rgba(244,200,90,.54);\n}\n\n#mochilight-routecraft .mrc-moon-lantern::before {\n  content: \"\";\n  position: absolute;\n  left: 12px;\n  right: 12px;\n  top: -12px;\n  height: 13px;\n  border: 3px solid #71482f;\n  border-radius: 7px;\n  background: #b8875c;\n}\n\n#mochilight-routecraft .mrc-moon-lantern::after {\n  content: \"\";\n  position: absolute;\n  left: 49%;\n  top: -35px;\n  width: 4px;\n  height: 24px;\n  border-left: 3px solid rgba(255,244,207,.62);\n  animation: mrc-lantern-rise 2.7s ease-in-out infinite;\n}\n\n#mochilight-routecraft .mrc-mochi-tray {\n  position: absolute;\n  left: 282px;\n  bottom: 92px;\n  width: 136px;\n  height: 74px;\n  border: 5px solid #71482f;\n  border-radius: 18px;\n  background:\n    radial-gradient(circle at 23% 56%, #fff4cf 0 18px, #d9899a 19px 22px, transparent 23px),\n    radial-gradient(circle at 53% 50%, #fff4cf 0 21px, #f4c85a 22px 25px, transparent 26px),\n    radial-gradient(circle at 82% 58%, #fff4cf 0 18px, #b8a7d6 19px 22px, transparent 23px),\n    linear-gradient(180deg, #9a6b4c, #65432f);\n}\n\n#mochilight-routecraft .mrc-workshop-floor {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  height: 132px;\n  border-top: 5px solid #5e3e2c;\n  background:\n    repeating-linear-gradient(90deg, rgba(255,255,255,.045) 0 3px, transparent 3px 105px),\n    linear-gradient(180deg, #8a5c43, #4f3428);\n  box-shadow:\n    inset 0 18px 32px rgba(24,12,34,.30),\n    0 -15px 28px rgba(16,7,24,.22);\n}\n\n\n\/* Gameplay structure *\/\n#mochilight-routecraft .mrc-gameplay {\n  position: absolute;\n  inset: 0;\n  z-index: 10;\n  display: grid;\n  grid-template-columns: 184px minmax(0, 1fr) 184px;\n  grid-template-rows: 90px minmax(0, 1fr) 82px;\n  gap: 8px 14px;\n  padding: 16px 23px 18px;\n}\n\n#mochilight-routecraft .mrc-top-left,\n#mochilight-routecraft .mrc-hud,\n#mochilight-routecraft .mrc-side-controls,\n#mochilight-routecraft .mrc-bottom-controls {\n  position: relative;\n  z-index: 20;\n  display: flex;\n  align-items: center;\n}\n\n#mochilight-routecraft .mrc-top-left {\n  grid-column: 1;\n  grid-row: 1;\n  gap: 10px;\n  justify-content: flex-start;\n}\n\n#mochilight-routecraft .mrc-hud {\n  grid-column: 2;\n  grid-row: 1;\n  justify-content: center;\n  gap: 10px;\n}\n\n#mochilight-routecraft .mrc-hud-card {\n  position: relative;\n  width: 136px;\n  height: 60px;\n  padding: 8px 10px 6px;\n  overflow: hidden;\n  border: 1px solid var(--mrc-border);\n  border-radius: 16px;\n  background:\n    radial-gradient(circle at 16px 15px, rgba(157, 75, 66, .13) 0 4px, transparent 5px),\n    radial-gradient(circle at calc(100% - 16px) 15px, rgba(66, 112, 77, .15) 0 4px, transparent 5px),\n    linear-gradient(180deg, var(--mrc-moon-cream), var(--mrc-paper-ivory));\n  box-shadow:\n    0 4px 0 rgba(119, 69, 34, .72),\n    0 9px 17px rgba(20, 10, 31, .21),\n    inset 0 1px 0 rgba(255, 255, 255, .74);\n  text-align: center;\n}\n\nhtml.is-dark #mochilight-routecraft .mrc-hud-card,\nbody.is-dark #mochilight-routecraft .mrc-hud-card {\n  color: #2a1d36;\n  background: linear-gradient(180deg, #fff5d8, #d5c0dc);\n}\n\n#mochilight-routecraft .mrc-hud-label {\n  display: block;\n  color: rgba(32, 49, 38, .68);\n  font: 900 10px\/1 Arial, sans-serif;\n  letter-spacing: 1px;\n  text-transform: uppercase;\n}\n\n#mochilight-routecraft .mrc-hud-value {\n  display: block;\n  margin-top: 4px;\n  color: var(--mrc-night-900);\n  font: 900 22px\/1 Georgia, serif;\n}\n\n#mochilight-routecraft .mrc-board-wrap {\n  grid-column: 2;\n  grid-row: 2 \/ 4;\n  display: grid;\n  place-items: center;\n  min-width: 0;\n  min-height: 0;\n}\n\n#mochilight-routecraft .mrc-board-frame {\n  position: relative;\n  width: 650px;\n  height: 572px;\n  display: grid;\n  place-items: center;\n  border: 7px solid var(--mrc-wood-dark);\n  border-radius: 32px;\n  background:\n    linear-gradient(90deg, rgba(111, 86, 142, .23) 0 50%, rgba(255, 250, 240, .28) 50%) 0 0 \/ 76px 76px,\n    linear-gradient(0deg, rgba(183, 197, 170, .24) 0 50%, rgba(255, 250, 240, .12) 50%) 0 0 \/ 76px 76px,\n    linear-gradient(180deg, #8d79ae, #e6d8ee);\n  box-shadow:\n    0 0 0 4px var(--mrc-moon-cream),\n    0 0 0 8px var(--mrc-moon-gold),\n    0 0 0 12px var(--mrc-violet-800),\n    0 28px 48px rgba(20, 10, 31, .34),\n    inset 12px 0 24px rgba(255, 255, 255, .22),\n    inset -12px -8px 24px rgba(111, 86, 142, .14);\n}\n\nhtml.is-dark #mochilight-routecraft .mrc-board-frame,\nbody.is-dark #mochilight-routecraft .mrc-board-frame {\n  background:\n    linear-gradient(90deg, rgba(111, 86, 142, .30) 0 50%, rgba(239, 228, 207, .12) 50%) 0 0 \/ 76px 76px,\n    linear-gradient(0deg, rgba(184, 167, 214, .15) 0 50%, rgba(239, 228, 207, .07) 50%) 0 0 \/ 76px 76px,\n    linear-gradient(180deg, #514069, #2a1c3a);\n}\n\n#mochilight-routecraft .mrc-board-frame::before {\n  content: \"\";\n  position: absolute;\n  inset: 17px;\n  border: 2px solid rgba(255, 250, 240, .70);\n  border-radius: 23px;\n  pointer-events: none;\n}\n\n#mochilight-routecraft .mrc-board-frame::after {\n  content: \"\";\n  position: absolute;\n  left: 112px;\n  right: 112px;\n  bottom: -12px;\n  height: 32px;\n  border: 4px solid var(--mrc-wood-dark);\n  border-radius: 0 0 18px 18px;\n  background:\n    radial-gradient(circle at 18px 50%, rgba(255, 250, 240, .85) 0 2px, transparent 4px) 0 0 \/ 38px 100% repeat-x,\n    linear-gradient(180deg, var(--mrc-warm-wood), var(--mrc-violet-700));\n}\n\n#mochilight-routecraft .mrc-frame-moon {\n  position: absolute;\n  z-index: 7;\n  width: 31px;\n  height: 31px;\n  border: 3px solid var(--mrc-wood-dark);\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 43% 47%, var(--mrc-moon-cream) 0 9px, transparent 10px),\n    radial-gradient(circle at 57% 40%, var(--mrc-violet-800) 0 9px, transparent 10px),\n    var(--mrc-moon-gold);\n  box-shadow:\n    0 3px 7px rgba(20, 10, 31, .28),\n    0 0 12px rgba(244, 200, 90, .36);\n}\n\n#mochilight-routecraft .mrc-moon-a { left: 23px; top: 23px; }\n#mochilight-routecraft .mrc-moon-b { right: 23px; top: 23px; }\n#mochilight-routecraft .mrc-moon-c { left: 23px; bottom: 23px; }\n#mochilight-routecraft .mrc-moon-d { right: 23px; bottom: 23px; }\n\n#mochilight-routecraft .mrc-board-title {\n  position: absolute;\n  z-index: 8;\n  left: 50%;\n  top: -21px;\n  width: 410px;\n  padding: 10px 20px;\n  overflow: hidden;\n  transform: translateX(-50%);\n  border: 3px solid var(--mrc-wood-dark);\n  border-radius: 13px;\n  background:\n    radial-gradient(circle at 22px 50%, var(--mrc-warm-wood) 0 6px, transparent 7px),\n    radial-gradient(circle at calc(100% - 22px) 50%, var(--mrc-moon-cream) 0 6px, transparent 7px),\n    linear-gradient(180deg, var(--mrc-violet-700), var(--mrc-night-900));\n  box-shadow:\n    0 5px 0 var(--mrc-wood-dark),\n    0 11px 19px rgba(20, 10, 31, .28);\n  color: #fff4cf;\n  font: 900 16px\/1.15 Georgia, serif;\n  text-align: center;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  text-shadow: 0 2px 0 rgba(0, 0, 0, .28);\n}\n\n#mochilight-routecraft .mrc-board {\n  position: relative;\n  z-index: 5;\n  display: grid;\n  width: 506px;\n  height: 506px;\n  gap: var(--mrc-gap, 7px);\n  touch-action: none;\n}\n\n#mochilight-routecraft .mrc-tile {\n  position: relative;\n  min-width: 0;\n  min-height: 0;\n  padding: 0;\n  overflow: hidden;\n  border: 2px solid rgba(119, 69, 34, .55);\n  border-radius: 14px;\n  color: #2a1d36;\n  cursor: pointer;\n  outline: none;\n  appearance: none;\n  -webkit-appearance: none;\n  touch-action: none;\n  background:\n    radial-gradient(circle at 12px 11px, rgba(255, 255, 255, .78) 0 2px, transparent 4px),\n    linear-gradient(145deg, rgba(255, 255, 255, .48), transparent 48%),\n    linear-gradient(180deg, #fff4cf, #efe5f3);\n  box-shadow:\n    0 4px 0 #71482f,\n    0 8px 13px rgba(20, 10, 31, .20),\n    inset 0 0 0 2px rgba(255, 255, 255, .38);\n  transition:\n    transform .12s ease,\n    border-color .16s ease,\n    box-shadow .16s ease,\n    background .16s ease;\n}\n\n#mochilight-routecraft .mrc-tile::after {\n  content: \"\";\n  position: absolute;\n  inset: 7px;\n  border: 1px dashed rgba(111, 86, 142, .22);\n  border-radius: 9px;\n  pointer-events: none;\n}\n\n#mochilight-routecraft .mrc-tile:hover:not(.mrc-fixed):not(.mrc-blank) {\n  transform: translateY(-2px);\n  border-color: var(--mrc-violet-700);\n  box-shadow:\n    0 6px 0 var(--mrc-violet-800),\n    0 12px 18px rgba(20, 10, 31, .25),\n    0 0 20px rgba(184, 167, 214, .38),\n    inset 0 0 0 2px rgba(255, 255, 255, .40);\n}\n\n#mochilight-routecraft .mrc-tile:focus-visible {\n  box-shadow: 0 0 0 4px rgba(244, 200, 90, .84), 0 4px 0 #71482f;\n}\n\n#mochilight-routecraft .mrc-tile.mrc-connected {\n  border-color: var(--mrc-violet-700);\n  background:\n    radial-gradient(circle at 12px 11px, rgba(255, 255, 255, .92) 0 2px, transparent 4px),\n    linear-gradient(145deg, rgba(255, 255, 255, .62), transparent 47%),\n    linear-gradient(180deg, #fff4cf, #e9e1f5);\n  box-shadow:\n    0 4px 0 var(--mrc-violet-700),\n    0 0 23px rgba(244, 200, 90, .62),\n    inset 0 0 0 2px rgba(184, 167, 214, .32);\n}\n\n#mochilight-routecraft .mrc-turn {\n  position: absolute;\n  inset: 0;\n  transform: rotate(var(--mrc-rotation, 0deg));\n  transition: transform .17s cubic-bezier(.3, .82, .3, 1);\n  pointer-events: none;\n}\n\n#mochilight-routecraft .mrc-trail-arm {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 16px;\n  height: 54%;\n  margin-left: -8px;\n  transform-origin: 50% 0;\n  border: 2px solid rgba(119, 69, 34, .72);\n  border-bottom: 0;\n  border-radius: 8px 8px 2px 2px;\n  background:\n    repeating-linear-gradient(0deg, rgba(255, 250, 240, .20) 0 5px, transparent 5px 13px),\n    linear-gradient(90deg, var(--mrc-wood-dark), var(--mrc-moon-gold) 38%, var(--mrc-warm-wood) 64%, var(--mrc-wood-dark));\n  box-shadow:\n    inset 3px 0 3px rgba(255, 255, 255, .13),\n    0 2px 4px rgba(20, 10, 31, .21);\n}\n\n#mochilight-routecraft .mrc-trail-t { transform: rotate(180deg); }\n#mochilight-routecraft .mrc-trail-r { transform: rotate(-90deg); }\n#mochilight-routecraft .mrc-trail-b { transform: rotate(0deg); }\n#mochilight-routecraft .mrc-trail-l { transform: rotate(90deg); }\n\n#mochilight-routecraft .mrc-connected .mrc-trail-arm {\n  border-color: var(--mrc-moon-gold);\n  background:\n    radial-gradient(circle at 50% 12%, #fff4cf 0 2.4px, transparent 3.4px) 0 0 \/ 100% 14px repeat-y,\n    linear-gradient(90deg, var(--mrc-violet-700), var(--mrc-warm-wood) 42%, #fff4cf 72%, var(--mrc-violet-700));\n  box-shadow:\n    0 0 17px rgba(244, 200, 90, .90),\n    inset 2px 0 3px rgba(255, 255, 255, .45);\n}\n\n#mochilight-routecraft .mrc-hub {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 31px;\n  height: 31px;\n  transform: translate(-50%, -50%);\n  border: 3px solid var(--mrc-wood-dark);\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 35% 28%, #fff4cf 0 3px, transparent 5px),\n    radial-gradient(circle, var(--mrc-warm-wood) 0 20%, var(--mrc-violet-700) 21% 53%, var(--mrc-night-900) 54% 100%);\n  box-shadow:\n    inset -3px -4px 6px rgba(20, 10, 31, .21),\n    0 3px 5px rgba(20, 10, 31, .23);\n}\n\n#mochilight-routecraft .mrc-connected .mrc-hub {\n  border-color: var(--mrc-violet-700);\n  background:\n    radial-gradient(circle at 35% 28%, #fff4cf 0 4px, transparent 5px),\n    radial-gradient(circle, #fff4cf 0 20%, var(--mrc-warm-wood) 21% 49%, var(--mrc-violet-700) 50% 100%);\n  box-shadow:\n    0 0 18px rgba(244, 200, 90, .94),\n    inset -3px -4px 6px rgba(48, 55, 38, .08);\n}\n\n#mochilight-routecraft .mrc-bridge-h,\n#mochilight-routecraft .mrc-bridge-v {\n  position: absolute;\n  border: 2px solid rgba(119, 69, 34, .72);\n  border-radius: 7px;\n  background:\n    repeating-linear-gradient(90deg, rgba(255, 250, 240, .20) 0 5px, transparent 5px 13px),\n    linear-gradient(90deg, var(--mrc-wood-dark), var(--mrc-moon-gold), var(--mrc-wood-dark));\n  box-shadow: 0 2px 4px rgba(20, 10, 31, .19);\n}\n\n#mochilight-routecraft .mrc-bridge-h {\n  left: 0;\n  right: 0;\n  top: 50%;\n  z-index: 2;\n  height: 15px;\n  margin-top: -7.5px;\n}\n\n#mochilight-routecraft .mrc-bridge-v {\n  top: 0;\n  bottom: 0;\n  left: 50%;\n  z-index: 1;\n  width: 15px;\n  margin-left: -7.5px;\n}\n\n#mochilight-routecraft .mrc-connected .mrc-bridge-h,\n#mochilight-routecraft .mrc-connected .mrc-bridge-v {\n  border-color: var(--mrc-moon-gold);\n  background:\n    radial-gradient(circle at 10px 50%, #fff4cf 0 2.4px, transparent 3.4px) 0 0 \/ 18px 100% repeat-x,\n    linear-gradient(90deg, var(--mrc-violet-700), var(--mrc-warm-wood) 50%, var(--mrc-violet-700));\n  box-shadow: 0 0 17px rgba(244, 200, 90, .90);\n}\n\n#mochilight-routecraft .mrc-moon-source {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  z-index: 6;\n  width: 60px;\n  height: 58px;\n  transform: translate(-50%, -50%);\n  border: 4px solid var(--mrc-wood-dark);\n  border-radius: 18px 18px 24px 24px;\n  background:\n    radial-gradient(circle at 50% 55%, #fff9df 0 10px, var(--mrc-moon-gold) 11px 23px, var(--mrc-violet-800) 24px 100%);\n  box-shadow:\n    0 4px 9px rgba(20, 10, 31, .26),\n    0 0 28px rgba(244, 200, 90, .72),\n    inset 0 0 0 2px rgba(255, 255, 255, .16);\n}\n\n#mochilight-routecraft .mrc-moon-source::before {\n  content: \"\";\n  position: absolute;\n  left: 14px;\n  right: 14px;\n  top: -11px;\n  height: 13px;\n  border: 4px solid var(--mrc-wood-dark);\n  border-bottom: 0;\n  border-radius: 12px 12px 0 0;\n}\n\n#mochilight-routecraft .mrc-moon-source::after {\n  content: \"\";\n  position: absolute;\n  left: 17px;\n  top: 17px;\n  width: 22px;\n  height: 22px;\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 44% 48%, #fff4cf 0 8px, transparent 9px),\n    radial-gradient(circle at 59% 40%, var(--mrc-violet-800) 0 8px, transparent 9px);\n}\n\n#mochilight-routecraft .mrc-parcel-target {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  z-index: 7;\n  width: 64px;\n  height: 50px;\n  transform: translate(-50%, -50%) scale(.88);\n  transition:\n    transform .20s ease,\n    filter .20s ease,\n    box-shadow .20s ease;\n  border: 5px solid var(--mrc-wood-dark);\n  border-radius: 14px 14px 21px 21px;\n  background:\n    linear-gradient(90deg, rgba(113, 72, 47, .18) 0 4px, transparent 4px 11px),\n    linear-gradient(180deg, #c18b65, #704a36);\n  filter: saturate(.84) brightness(.96);\n}\n\n#mochilight-routecraft .mrc-parcel-target::before {\n  content: \"\";\n  position: absolute;\n  left: 17px;\n  top: 9px;\n  width: 22px;\n  height: 22px;\n  border-radius: 48% 48% 42% 42%;\n  background:\n    radial-gradient(circle at 38% 52%, #2a1d36 0 1.7px, transparent 2.7px),\n    radial-gradient(circle at 62% 52%, #2a1d36 0 1.7px, transparent 2.7px),\n    radial-gradient(ellipse at 50% 72%, #d9899a 0 2px, transparent 3px),\n    var(--mrc-moon-cream);\n  box-shadow: inset 0 -4px 0 rgba(217, 137, 154, .22);\n}\n\n#mochilight-routecraft .mrc-parcel-target::after {\n  content: \"\";\n  position: absolute;\n  left: 13px;\n  right: 13px;\n  top: -14px;\n  height: 18px;\n  border: 4px solid var(--mrc-wood-dark);\n  border-bottom: 0;\n  border-radius: 18px 18px 0 0;\n}\n\n#mochilight-routecraft .mrc-parcel-lit .mrc-parcel-target {\n  transform: translate(-50%, -50%) scale(1.07) rotate(2deg);\n  filter: saturate(1.08) brightness(1.10);\n  background:\n    linear-gradient(90deg, rgba(113, 72, 47, .13) 0 4px, transparent 4px 11px),\n    linear-gradient(180deg, var(--mrc-moon-gold), var(--mrc-violet-700));\n  box-shadow:\n    0 0 22px rgba(255, 255, 255, .62),\n    0 0 36px rgba(244, 200, 90, .88);\n}\n\n#mochilight-routecraft .mrc-mallet-lock {\n  position: absolute;\n  right: 5px;\n  top: 6px;\n  z-index: 8;\n  width: 34px;\n  height: 24px;\n  border: 2px solid var(--mrc-night-900);\n  border-radius: 9px;\n  background:\n    linear-gradient(90deg, transparent 0 8px, var(--mrc-wood-dark) 8px 24px, transparent 24px),\n    linear-gradient(0deg, transparent 0 8px, var(--mrc-warm-wood) 8px 16px, transparent 16px),\n    var(--mrc-moon-cream);\n  box-shadow: 0 2px 5px rgba(20, 10, 31, .22);\n}\n\n#mochilight-routecraft .mrc-mallet-lock::before {\n  content: \"\";\n  position: absolute;\n  left: 3px;\n  top: 7px;\n  width: 13px;\n  height: 8px;\n  border-radius: 4px;\n  background: var(--mrc-warm-wood);\n  transform: rotate(-25deg);\n}\n\n#mochilight-routecraft .mrc-mallet-lock::after {\n  content: \"\";\n  position: absolute;\n  right: 4px;\n  top: 4px;\n  width: 5px;\n  height: 16px;\n  border-radius: 4px;\n  background: var(--mrc-wood-dark);\n  transform: rotate(28deg);\n}\n\n#mochilight-routecraft .mrc-empty-mark {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 58px;\n  height: 44px;\n  transform: translate(-50%, -50%);\n  opacity: .42;\n  border: 2px dashed rgba(111, 86, 142, .42);\n  border-radius: 10px;\n  background:\n    linear-gradient(90deg, rgba(184, 167, 214, .40) 0 50%, rgba(255, 250, 240, .54) 50%) 0 0 \/ 20px 20px,\n    linear-gradient(0deg, rgba(255, 250, 240, .20) 0 50%, rgba(244, 200, 90, .14) 50%) 0 0 \/ 20px 20px;\n}\n\n\/* Buttons and overlays *\/\n#mochilight-routecraft .mrc-side-controls {\n  grid-column: 3;\n  grid-row: 2;\n  flex-direction: column;\n  justify-content: center;\n  gap: 13px;\n}\n\n#mochilight-routecraft .mrc-bottom-controls {\n  grid-column: 3;\n  grid-row: 3;\n  justify-content: center;\n}\n\n#mochilight-routecraft .mrc-icon-btn,\n#mochilight-routecraft .mrc-action-btn,\n#mochilight-routecraft .mrc-menu-btn,\n#mochilight-routecraft .mrc-level-btn {\n  position: relative;\n  border: 2px solid var(--mrc-wood-dark);\n  color: #2a1d36;\n  background:\n    radial-gradient(circle at 28% 22%, rgba(255, 255, 255, .34), transparent 34%),\n    linear-gradient(180deg, #fff4cf, #eadff0);\n  box-shadow:\n    0 4px 0 #71482f,\n    0 9px 15px rgba(20, 10, 31, .24),\n    inset 0 1px 0 rgba(255, 255, 255, .58);\n  cursor: pointer;\n  outline: none;\n  appearance: none;\n  -webkit-appearance: none;\n  font-family: Arial, sans-serif;\n  transition:\n    transform .11s ease,\n    filter .15s ease,\n    box-shadow .11s ease;\n  touch-action: manipulation;\n}\n\n#mochilight-routecraft .mrc-icon-btn:hover,\n#mochilight-routecraft .mrc-action-btn:hover,\n#mochilight-routecraft .mrc-menu-btn:hover,\n#mochilight-routecraft .mrc-level-btn:hover {\n  filter: brightness(1.05);\n  box-shadow:\n    0 4px 0 var(--mrc-violet-800),\n    0 10px 16px rgba(20, 10, 31, .26),\n    0 0 19px rgba(184, 167, 214, .30),\n    inset 0 1px 0 rgba(255, 255, 255, .64);\n}\n\n#mochilight-routecraft .mrc-icon-btn:active,\n#mochilight-routecraft .mrc-action-btn:active,\n#mochilight-routecraft .mrc-menu-btn:active,\n#mochilight-routecraft .mrc-level-btn:active {\n  transform: translateY(3px);\n  box-shadow:\n    0 1px 0 var(--mrc-wood-dark),\n    0 4px 7px rgba(20, 10, 31, .21);\n}\n\n#mochilight-routecraft .mrc-icon-btn:focus-visible,\n#mochilight-routecraft .mrc-action-btn:focus-visible,\n#mochilight-routecraft .mrc-menu-btn:focus-visible,\n#mochilight-routecraft .mrc-level-btn:focus-visible {\n  box-shadow:\n    0 0 0 4px rgba(244, 200, 90, .78),\n    0 4px 0 #71482f;\n}\n\n#mochilight-routecraft .mrc-icon-btn {\n  width: 50px;\n  height: 46px;\n  padding: 0;\n  display: grid;\n  place-items: center;\n  border-radius: 14px;\n}\n\n#mochilight-routecraft .mrc-icon-btn svg {\n  width: 25px;\n  height: 25px;\n  overflow: visible;\n  stroke: var(--mrc-night-900);\n  stroke-width: 2.8;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n  fill: none;\n}\n\n#mochilight-routecraft .mrc-mute-slash {\n  display: none;\n  stroke: #c53e43;\n  stroke-width: 3.3;\n}\n\n#mochilight-routecraft.mrc-muted .mrc-mute-slash {\n  display: block;\n}\n\n#mochilight-routecraft .mrc-action-btn {\n  width: 156px;\n  min-height: 50px;\n  padding: 10px 13px;\n  border-radius: 15px;\n  font-size: 15px;\n  font-weight: 900;\n}\n\n#mochilight-routecraft .mrc-action-btn:nth-child(1) {\n  color: #fff4cf;\n  border-color: var(--mrc-moon-950);\n  background: linear-gradient(180deg, var(--mrc-violet-700), var(--mrc-night-900));\n}\n\n#mochilight-routecraft .mrc-action-btn:nth-child(2) {\n  background: linear-gradient(180deg, #fffaf0, #c9b5d8);\n}\n\n#mochilight-routecraft .mrc-action-btn:nth-child(3) {\n  color: #fff4cf;\n  border-color: var(--mrc-wood-dark);\n  background: linear-gradient(180deg, var(--mrc-moon-gold), var(--mrc-wood-dark));\n}\n\n#mochilight-routecraft .mrc-action-btn[disabled],\n#mochilight-routecraft .mrc-menu-btn[disabled] {\n  cursor: default;\n  opacity: .42;\n  transform: none;\n  box-shadow: 0 3px 0 rgba(119, 69, 34, .52);\n}\n\n#mochilight-routecraft .mrc-floating-fullscreen {\n  position: absolute;\n  z-index: 85;\n  top: 20px;\n  right: 24px;\n}\n\n#mochilight-routecraft .mrc-toast {\n  position: absolute;\n  z-index: 78;\n  left: 50%;\n  bottom: 22px;\n  max-width: 580px;\n  width: max-content;\n  padding: 10px 19px;\n  border: 2px solid rgba(244, 200, 90, .78);\n  border-radius: 999px;\n  color: #fff4cf;\n  background: rgba(25, 54, 40, .96);\n  box-shadow: 0 10px 25px rgba(20, 10, 31, .34);\n  font-size: 15px;\n  font-weight: 800;\n  text-align: center;\n  transform: translate(-50%, 14px);\n  opacity: 0;\n  pointer-events: none;\n  transition:\n    opacity .20s ease,\n    transform .20s ease;\n}\n\n#mochilight-routecraft .mrc-toast-show {\n  opacity: 1;\n  transform: translate(-50%, 0);\n}\n\n#mochilight-routecraft .mrc-overlay {\n  position: absolute;\n  inset: 0;\n  z-index: 50;\n  display: grid;\n  place-items: center;\n  padding: 24px;\n  overflow: hidden;\n  border-radius: inherit;\n  background:\n    radial-gradient(circle at 17% 24%, rgba(217, 155, 92, .11) 0 5px, transparent 7px),\n    radial-gradient(circle at 82% 69%, rgba(183, 197, 170, .12) 0 8px, transparent 10px),\n    rgba(27, 43, 31, .60);\n  backdrop-filter: blur(7px);\n  -webkit-backdrop-filter: blur(7px);\n}\n\nhtml.is-dark #mochilight-routecraft .mrc-overlay,\nbody.is-dark #mochilight-routecraft .mrc-overlay {\n  background:\n    radial-gradient(circle at 17% 24%, rgba(217, 155, 92, .10) 0 5px, transparent 7px),\n    rgba(7, 14, 10, .70);\n}\n\n#mochilight-routecraft .mrc-overlay[hidden],\n#mochilight-routecraft .mrc-win-layer[hidden] {\n  display: none;\n}\n\n#mochilight-routecraft .mrc-dialog {\n  position: relative;\n  width: min(580px, 88%);\n  max-height: 650px;\n  padding: 36px 35px 29px;\n  overflow: hidden;\n  border: 4px solid var(--mrc-night-900);\n  border-radius: 24px;\n  color: #2a1d36;\n  background:\n    radial-gradient(circle at 84% 17%, rgba(157, 75, 66, .09) 0 7px, transparent 9px),\n    repeating-linear-gradient(0deg, transparent 0 15px, rgba(111, 86, 142, .055) 15px 16px),\n    linear-gradient(145deg, rgba(255, 255, 255, .55), transparent 45%),\n    linear-gradient(180deg, #fff4cf, #eadff0);\n  box-shadow:\n    0 0 0 5px var(--mrc-moon-gold),\n    0 0 0 9px rgba(184, 167, 214, .82),\n    0 30px 72px rgba(16, 7, 24, .46);\n  text-align: center;\n  animation: mrc-dialog-in .22s ease-out;\n}\n\n#mochilight-routecraft .mrc-dialog::before,\n#mochilight-routecraft .mrc-dialog::after {\n  content: \"\";\n  position: absolute;\n  top: 21px;\n  width: 40px;\n  height: 40px;\n  border: 3px solid var(--mrc-wood-dark);\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 43% 48%, var(--mrc-moon-cream) 0 12px, transparent 13px),\n    radial-gradient(circle at 58% 40%, var(--mrc-violet-800) 0 12px, transparent 13px),\n    var(--mrc-moon-gold);\n  filter: drop-shadow(0 4px 6px rgba(20, 10, 31, .18));\n}\n\n#mochilight-routecraft .mrc-dialog::before {\n  left: 22px;\n  transform: rotate(-8deg);\n}\n\n#mochilight-routecraft .mrc-dialog::after {\n  right: 22px;\n  transform: rotate(8deg);\n}\n\n#mochilight-routecraft .mrc-dialog h2 {\n  margin: 0 44px 10px;\n  color: var(--mrc-night-900);\n  font: 900 29px\/1.08 Georgia, serif;\n}\n\n#mochilight-routecraft .mrc-dialog p {\n  max-width: 470px;\n  margin: 0 auto 18px;\n  color: #5d506b;\n  font-size: 15px;\n  font-weight: 700;\n  line-height: 1.5;\n}\n\n#mochilight-routecraft .mrc-menu-grid {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 12px;\n  margin-top: 15px;\n}\n\n#mochilight-routecraft .mrc-menu-grid.mrc-single {\n  grid-template-columns: minmax(0, 260px);\n  justify-content: center;\n}\n\n#mochilight-routecraft .mrc-menu-btn {\n  min-height: 50px;\n  padding: 10px 14px;\n  border-radius: 15px;\n  font-size: 15px;\n  font-weight: 900;\n}\n\n#mochilight-routecraft .mrc-primary {\n  color: #fff4cf;\n  border-color: var(--mrc-moon-950);\n  background: linear-gradient(180deg, var(--mrc-violet-700), var(--mrc-night-900));\n}\n\n#mochilight-routecraft .mrc-secondary {\n  color: #fff4cf;\n  border-color: var(--mrc-wood-dark);\n  background: linear-gradient(180deg, var(--mrc-moon-gold), var(--mrc-wood-dark));\n}\n\n#mochilight-routecraft .mrc-level-dialog {\n  width: min(850px, 95%);\n  max-height: 672px;\n  padding: 27px 30px 25px;\n}\n\n#mochilight-routecraft .mrc-level-grid {\n  display: grid;\n  grid-template-columns: repeat(5, minmax(0, 1fr));\n  gap: 10px;\n  margin: 15px 0 17px;\n}\n\n#mochilight-routecraft .mrc-level-btn {\n  min-height: 76px;\n  padding: 8px 5px;\n  border-radius: 13px;\n  font-weight: 900;\n}\n\n#mochilight-routecraft .mrc-level-btn span {\n  display: block;\n  color: var(--mrc-violet-800);\n  font-size: 18px;\n}\n\n#mochilight-routecraft .mrc-level-btn small {\n  display: block;\n  min-height: 14px;\n  margin-top: 5px;\n  color: rgba(32, 49, 38, .70);\n  font-size: 10px;\n}\n\n#mochilight-routecraft .mrc-level-btn.mrc-level-locked {\n  cursor: default;\n  opacity: .42;\n}\n\n#mochilight-routecraft .mrc-mini-stars {\n  display: flex;\n  justify-content: center;\n  gap: 5px;\n  margin-top: 6px;\n}\n\n#mochilight-routecraft .mrc-mini-star,\n#mochilight-routecraft .mrc-rating-star {\n  position: relative;\n  width: 42px;\n  height: 30px;\n  filter: grayscale(1);\n  opacity: .25;\n}\n\n#mochilight-routecraft .mrc-mini-star::before,\n#mochilight-routecraft .mrc-rating-star::before {\n  content: \"\";\n  position: absolute;\n  left: 50%;\n  top: 2px;\n  width: 27px;\n  height: 27px;\n  transform: translateX(-50%);\n  border: 3px solid var(--mrc-wood-dark);\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 42% 47%, var(--mrc-moon-cream) 0 8px, transparent 9px),\n    radial-gradient(circle at 59% 39%, var(--mrc-violet-800) 0 8px, transparent 9px),\n    var(--mrc-moon-gold);\n}\n\n#mochilight-routecraft .mrc-mini-star-earned {\n  filter: drop-shadow(0 0 7px rgba(244, 200, 90, .88));\n  opacity: 1;\n}\n\n#mochilight-routecraft .mrc-page-nav {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: 12px;\n  max-width: 700px;\n  margin: 0 auto;\n}\n\n#mochilight-routecraft .mrc-rating-row {\n  display: flex;\n  justify-content: center;\n  gap: 22px;\n  margin: 18px 0 20px;\n}\n\n#mochilight-routecraft .mrc-rating-star {\n  width: 42px;\n  height: 42px;\n}\n\n#mochilight-routecraft .mrc-rating-star-earned {\n  filter: drop-shadow(0 0 13px rgba(244, 200, 90, .92));\n  opacity: 1;\n  animation: mrc-star-pop .35s ease both;\n}\n\n#mochilight-routecraft .mrc-result-line {\n  display: flex;\n  justify-content: center;\n  gap: 26px;\n  margin: 8px 0 17px;\n  color: #5d506b;\n  font-size: 15px;\n}\n\n#mochilight-routecraft .mrc-win-layer {\n  position: absolute;\n  inset: 0;\n  z-index: 45;\n  overflow: hidden;\n  pointer-events: none;\n}\n\n#mochilight-routecraft .mrc-win-mochi {\n  position: absolute;\n  left: 50%;\n  top: 49%;\n  width: 112px;\n  height: 82px;\n  border: 7px solid var(--mrc-wood-dark);\n  border-radius: 54% 54% 42% 42%;\n  background:\n    radial-gradient(circle at 38% 48%, #2a1d36 0 3px, transparent 4px),\n    radial-gradient(circle at 62% 48%, #2a1d36 0 3px, transparent 4px),\n    radial-gradient(ellipse at 50% 67%, #d9899a 0 4px, transparent 5px),\n    linear-gradient(180deg, #fff9df, #f4d9d1);\n  filter: drop-shadow(0 0 34px rgba(244, 200, 90, .94));\n  animation: mrc-mochi-flight 1s ease both;\n}\n\n#mochilight-routecraft .mrc-moon-spark {\n  position: absolute;\n  width: 11px;\n  height: 11px;\n  border-radius: 50%;\n  background: var(--mrc-moon-gold);\n  box-shadow: 0 0 10px rgba(244, 200, 90, .94);\n  animation: mrc-moon-fall 1.15s ease-out both;\n}\n\n#mochilight-routecraft .mrc-hinting {\n  z-index: 9;\n  animation: mrc-hint .72s ease-in-out 3;\n}\n\n#mochilight-routecraft .mrc-bump {\n  animation: mrc-bump .22s ease;\n}\n\n@keyframes mrc-cloud-sway {\n  from { transform: translateY(0); opacity: .55; }\n  to { transform: translateY(-7px); opacity: .88; }\n}\n\n@keyframes mrc-forge-pulse {\n  from {\n    transform: translateX(-50%) scale(.92);\n    filter: drop-shadow(0 0 9px rgba(217, 155, 92, .42));\n  }\n  to {\n    transform: translateX(-50%) scale(1.07);\n    filter: drop-shadow(0 0 22px rgba(244, 200, 90, .82));\n  }\n}\n\n@keyframes mrc-lantern-rise {\n  0%, 100% { transform: translateY(4px) scale(.86); opacity: .27; }\n  50% { transform: translateY(-8px) scale(1.05); opacity: .75; }\n}\n\n@keyframes mrc-hint {\n  0%, 100% {\n    transform: translateY(0);\n    box-shadow: 0 4px 0 #71482f, 0 8px 13px rgba(20, 10, 31, .20);\n  }\n  50% {\n    transform: translateY(-5px) scale(1.035);\n    box-shadow: 0 8px 0 var(--mrc-violet-800), 0 0 29px rgba(244, 200, 90, .76);\n  }\n}\n\n@keyframes mrc-bump {\n  0%, 100% { transform: translateX(0); }\n  35% { transform: translateX(-5px); }\n  70% { transform: translateX(5px); }\n}\n\n@keyframes mrc-dialog-in {\n  from { opacity: 0; transform: translateY(14px) scale(.96); }\n  to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n@keyframes mrc-star-pop {\n  from { transform: scale(.35) rotate(-24deg); }\n  to { transform: scale(1) rotate(0); }\n}\n\n@keyframes mrc-mochi-flight {\n  0% { transform: translate(-50%, -50%) scale(.25) rotate(-20deg); opacity: 0; }\n  40% { opacity: 1; }\n  100% { transform: translate(-50%, -50%) scale(1.18) rotate(18deg); opacity: 0; }\n}\n\n@keyframes mrc-moon-fall {\n  0% { transform: translate(0, 0) scale(.4); opacity: 0; }\n  20% { opacity: 1; }\n  100% { transform: translate(var(--mrc-dx), var(--mrc-dy)) rotate(220deg) scale(1); opacity: 0; }\n}\n\n@media (max-width: 760px), (max-height: 520px) {\n  #mochilight-routecraft .mrc-overlay {\n    backdrop-filter: none;\n    -webkit-backdrop-filter: none;\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  #mochilight-routecraft *,\n  #mochilight-routecraft *::before,\n  #mochilight-routecraft *::after {\n    animation-duration: .01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: .01ms !important;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  function initializeMochilightRoutecraft() {\n  var root = document.getElementById(\"mochilight-routecraft\");\n  if (!root || root.dataset.mrcReady === \"1\") return;\n  root.dataset.mrcReady = \"1\";\n\n  var BASE_W = 1280;\n  var BASE_H = 720;\n  var STORAGE_KEY = \"repedia_mochilight_routecraft_progress_v1\";\n  var DIRS = [1, 2, 4, 8];\n  var DR = [-1, 0, 1, 0];\n  var DC = [0, 1, 0, -1];\n  var OPP = [4, 8, 1, 2];\n\n\n  var levelNames = [\"First Moonthread Route\", \"Mochi Corner\", \"Crescent Window Bend\", \"Moonbeam Path\", \"Quiet Toolway\", \"Golden Mallet Turn\", \"Folded Cloud Lane\", \"Workshop Crossing\", \"Lantern Glow Curve\", \"Creamy Moon Weave\", \"Rabbit Charm Trail\", \"Twine Parcel Fold\", \"Small Courier Way\", \"Cloud Ribbon Thread\", \"Round Moon Route\", \"Four-Way Cloudloom Knot\", \"Second Moonforge Hub\", \"Low Tool Rack Bend\", \"Mallet Pin Route\", \"Hanging Lantern Circuit\", \"Golden Crescent Loop\", \"Tiny Mochi Turn\", \"Workshop Table Map\", \"Moon Shelf Channel\", \"Cream Parcel Route\", \"Craft Table Weave\", \"Twin Charm Parcels\", \"Cross-Mooncloth Fold\", \"Deep Workshop Corridor\", \"Measured Moonway\", \"Twin Moonforge Hubs\", \"Second Mochi Parcel\", \"Lunar Route Blueprint\", \"Lantern Glass Cipher\", \"Double Moonforge Signal\", \"Seven Mochi Parcels\", \"Stardust Route\", \"Hidden Lunar Atlas\", \"Midnight Workshop Channel\", \"Cloudlit Mochi Weave\", \"Grand Mooncraft Table\", \"Rolling Mooncloth Route\", \"Quiet Mallet Corner\", \"Luminous Crescent Crossing\", \"Round Moon Window Way\", \"Fifty Lunar Parcels\", \"The Last Moon Lantern\", \"Brightest Moonway\", \"The Master Rabbit's Route\", \"Final Moonthread Weave\"];\n\n  root.innerHTML = [\n    '<div class=\"mrc-stage\" id=\"mrcStage\">',\n      '<div class=\"mrc-scene\" aria-hidden=\"true\">',\n        '<div class=\"mrc-workshop-sky\"><\/div>',\n        '<div class=\"mrc-lantern-line\"><\/div>',\n        '<div class=\"mrc-moon-window mrc-moon-window-left\"><span><\/span><\/div>',\n        '<div class=\"mrc-moon-window mrc-moon-window-right\"><span><\/span><\/div>',\n        '<div class=\"mrc-charm-line\"><\/div>',\n        '<div class=\"mrc-tool-rack\"><span class=\"mrc-forge-glow\"><\/span><\/div>',\n        '<div class=\"mrc-mochi-shelf\"><\/div>',\n        '<div class=\"mrc-mallet-table\"><span class=\"mrc-moon-lantern\"><\/span><\/div>',\n        '<div class=\"mrc-mochi-tray\"><\/div>',\n        '<div class=\"mrc-workshop-floor\"><\/div>',\n      '<\/div>',\n      '<div class=\"mrc-gameplay\">',\n        '<div class=\"mrc-top-left\">',\n          '<button class=\"mrc-icon-btn\" type=\"button\" data-mrc-action=\"pause\" aria-label=\"Pause\">',\n            '<svg viewBox=\"0 0 28 28\" aria-hidden=\"true\"><path d=\"M9 6v16\"><\/path><path d=\"M19 6v16\"><\/path><\/svg>',\n          '<\/button>',\n          '<button class=\"mrc-icon-btn\" type=\"button\" data-mrc-action=\"sound\" aria-label=\"Sound\">',\n            '<svg viewBox=\"0 0 28 28\" aria-hidden=\"true\"><path d=\"M4 11h5l5-4v14l-5-4H4z\"><\/path><path d=\"M18 10c2 2 2 6 0 8\"><\/path><path d=\"M21 7c4 4 4 10 0 14\"><\/path><path d=\"M1 24L25 4\" class=\"mrc-mute-slash\"><\/path><\/svg>',\n          '<\/button>',\n        '<\/div>',\n        '<div class=\"mrc-hud\" aria-live=\"polite\">',\n          '<div class=\"mrc-hud-card\"><span class=\"mrc-hud-label\">Level<\/span><strong class=\"mrc-hud-value\" id=\"mrcLevelValue\">1 \/ 50<\/strong><\/div>',\n          '<div class=\"mrc-hud-card\"><span class=\"mrc-hud-label\">Turns<\/span><strong class=\"mrc-hud-value\" id=\"mrcMovesValue\">0<\/strong><\/div>',\n          '<div class=\"mrc-hud-card\"><span class=\"mrc-hud-label\">Parcels Lit<\/span><strong class=\"mrc-hud-value\" id=\"mrcTargetsValue\">0 \/ 0<\/strong><\/div>',\n        '<\/div>',\n        '<div class=\"mrc-board-wrap\">',\n          '<div class=\"mrc-board-frame\">',\n            '<span class=\"mrc-frame-moon mrc-moon-a\"><\/span>',\n            '<span class=\"mrc-frame-moon mrc-moon-b\"><\/span>',\n            '<span class=\"mrc-frame-moon mrc-moon-c\"><\/span>',\n            '<span class=\"mrc-frame-moon mrc-moon-d\"><\/span>',\n            '<div class=\"mrc-board-title\" id=\"mrcBoardTitle\">First Moonthread Route<\/div>',\n            '<div class=\"mrc-board\" id=\"mrcBoard\"><\/div>',\n          '<\/div>',\n        '<\/div>',\n        '<div class=\"mrc-side-controls\">',\n          '<button class=\"mrc-action-btn\" type=\"button\" data-mrc-action=\"restart\">Restart Route<\/button>',\n          '<button class=\"mrc-action-btn\" type=\"button\" data-mrc-action=\"undo\">Undo<\/button>',\n          '<button class=\"mrc-action-btn\" type=\"button\" data-mrc-action=\"hint\">Rabbit\\u0027s Hint<\/button>',\n        '<\/div>',\n        '<div class=\"mrc-bottom-controls\">',\n          '<button class=\"mrc-action-btn\" type=\"button\" data-mrc-action=\"levels\">Workshop Map<\/button>',\n        '<\/div>',\n      '<\/div>',\n      '<button class=\"mrc-icon-btn mrc-floating-fullscreen\" type=\"button\" data-mrc-action=\"fullscreen\" aria-label=\"Fullscreen\">',\n        '<svg viewBox=\"0 0 28 28\" aria-hidden=\"true\"><path d=\"M10 4H4v6\"><\/path><path d=\"M18 4h6v6\"><\/path><path d=\"M4 18v6h6\"><\/path><path d=\"M24 18v6h-6\"><\/path><\/svg>',\n      '<\/button>',\n      '<div class=\"mrc-toast\" id=\"mrcToast\" role=\"status\" aria-live=\"polite\"><\/div>',\n      '<div class=\"mrc-win-layer\" id=\"mrcWinLayer\" hidden><\/div>',\n      '<div class=\"mrc-overlay\" id=\"mrcOverlay\">',\n        '<div class=\"mrc-dialog\" id=\"mrcDialog\" role=\"dialog\" aria-modal=\"true\"><\/div>',\n      '<\/div>',\n    '<\/div>'\n  ].join(\"\");\n\n  var stage = root.querySelector(\"#mrcStage\");\n  var boardEl = root.querySelector(\"#mrcBoard\");\n  var overlay = root.querySelector(\"#mrcOverlay\");\n  var dialog = root.querySelector(\"#mrcDialog\");\n  var toast = root.querySelector(\"#mrcToast\");\n  var winLayer = root.querySelector(\"#mrcWinLayer\");\n  var levelValue = root.querySelector(\"#mrcLevelValue\");\n  var movesValue = root.querySelector(\"#mrcMovesValue\");\n  var targetsValue = root.querySelector(\"#mrcTargetsValue\");\n  var boardTitle = root.querySelector(\"#mrcBoardTitle\");\n\n  var progress = loadProgress();\n  var levels = [];\n  var state = {\n    levelIndex: 0,\n    level: null,\n    rotations: [],\n    initialRotations: [],\n    moves: 0,\n    history: [],\n    connectedCells: new Set(),\n    completedTargets: new Set(),\n    paused: true,\n    modal: \"start\",\n    page: 0,\n    toastTimer: 0,\n    winTimer: 0,\n    winning: false\n  };\n\n  var audio = createAudio();\n  var fallbackFullscreen = false;\n\n  function defaultProgress() {\n    return {\n      unlocked: 1,\n      completed: {},\n      last: 1,\n      sound: true,\n      tutorialSeen: {}\n    };\n  }\n\n  function loadProgress() {\n    try {\n      var raw = localStorage.getItem(STORAGE_KEY);\n      if (!raw) return defaultProgress();\n      var parsed = JSON.parse(raw);\n      var base = defaultProgress();\n      if (!parsed || typeof parsed !== \"object\") return base;\n      base.unlocked = clamp(Number(parsed.unlocked) || 1, 1, 50);\n      base.completed = parsed.completed ? (typeof parsed.completed === \"object\" ? parsed.completed : {}) : {};\n      base.last = clamp(Number(parsed.last) || 1, 1, 50);\n      base.sound = parsed.sound !== false;\n      base.tutorialSeen = parsed.tutorialSeen ? (typeof parsed.tutorialSeen === \"object\" ? parsed.tutorialSeen : {}) : {};\n      return base;\n    } catch (error) {\n      return defaultProgress();\n    }\n  }\n\n  function saveProgress() {\n    try {\n      localStorage.setItem(STORAGE_KEY, JSON.stringify(progress));\n    } catch (error) {\n      return;\n    }\n  }\n\n  function clamp(value, minimum, maximum) {\n    return Math.max(minimum, Math.min(maximum, value));\n  }\n\n  function seededRandom(seed) {\n    var value = seed >>> 0;\n    return function () {\n      value += 0x6D2B79F5;\n      var t = value;\n      t = Math.imul(t ^ (t >>> 15), t | 1);\n      t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n      return ((t ^ (t >>> 14)) >>> 0) \/ 4294967296;\n    };\n  }\n\n  function shuffle(list, random) {\n    for (var i = list.length - 1; i > 0; i -= 1) {\n      var j = Math.floor(random() * (i + 1));\n      var temp = list[i];\n      list[i] = list[j];\n      list[j] = temp;\n    }\n    return list;\n  }\n\n  function rotateMask(mask, turns) {\n    var rotated = mask;\n    for (var i = 0; i < turns; i += 1) {\n      rotated = (rotated * 2) % 16 + (rotated >= 8 ? 1 : 0);\n    }\n    return rotated;\n  }\n\n  function bitCount(mask) {\n    var count = 0;\n    for (var i = 0; i < 4; i += 1) if (Math.floor(mask \/ DIRS[i]) % 2 !== 0) count += 1;\n    return count;\n  }\n\n  function indexOf(row, col, cols) {\n    return row * cols + col;\n  }\n\n  function makeLevel(number) {\n    var rows = number <= 10 ? 4 : number <= 24 ? 5 : number <= 40 ? 6 : 7;\n    var cols = rows;\n    var random = seededRandom(93117 + number * 10939);\n    var total = rows * cols;\n    var sourceIndex = indexOf(rows - 1, Math.floor(cols \/ 2), cols);\n    var visited = new Array(total).fill(false);\n    var masks = new Array(total).fill(0);\n    var stack = [sourceIndex];\n    var visitOrder = [sourceIndex];\n    visited[sourceIndex] = true;\n\n    while (stack.length) {\n      var current = stack[stack.length - 1];\n      var cr = Math.floor(current \/ cols);\n      var cc = current % cols;\n      var options = [];\n\n      for (var d = 0; d < 4; d += 1) {\n        var nr = cr + DR[d];\n        var nc = cc + DC[d];\n        if (nr < 0 || nr >= rows || nc < 0 || nc >= cols) continue;\n        var next = indexOf(nr, nc, cols);\n        if (!visited[next]) options.push({ index: next, dir: d });\n      }\n\n      if (!options.length) {\n        stack.pop();\n        continue;\n      }\n\n      shuffle(options, random);\n      var chosen = options[0];\n      visited[chosen.index] = true;\n      masks[current] |= DIRS[chosen.dir];\n      masks[chosen.index] |= OPP[chosen.dir];\n      stack.push(chosen.index);\n      visitOrder.push(chosen.index);\n    }\n\n    var fixedJunctions = [];\n    if (number >= 16) {\n      var interior = [];\n      for (var jr = 1; jr < rows - 1; jr += 1) {\n        for (var jc = 1; jc < cols - 1; jc += 1) {\n          var junctionIndex = indexOf(jr, jc, cols);\n          if (junctionIndex !== sourceIndex) interior.push(junctionIndex);\n        }\n      }\n      shuffle(interior, random);\n      var junctionCount = clamp(Math.floor((number - 12) \/ 14), 1, 3);\n      for (var ji = 0; ji < Math.min(junctionCount, interior.length); ji += 1) {\n        var cell = interior[ji];\n        var cellRow = Math.floor(cell \/ cols);\n        var cellCol = cell % cols;\n        masks[cell] = 15;\n        for (var jd = 0; jd < 4; jd += 1) {\n          var neighbor = indexOf(cellRow + DR[jd], cellCol + DC[jd], cols);\n          masks[neighbor] |= OPP[jd];\n        }\n        fixedJunctions.push(cell);\n      }\n    }\n\n    var targetCount = clamp(2 + Math.floor((number - 1) \/ 8), 2, 7);\n    var leaves = [];\n    for (var i = 0; i < total; i += 1) {\n      if (i !== sourceIndex ? bitCount(masks[i]) === 1 : false) leaves.push(i);\n    }\n\n    leaves.sort(function (a, b) {\n      var ar = Math.floor(a \/ cols);\n      var ac = a % cols;\n      var br = Math.floor(b \/ cols);\n      var bc = b % cols;\n      var ad = Math.abs(ar - (rows - 1)) + Math.abs(ac - Math.floor(cols \/ 2));\n      var bd = Math.abs(br - (rows - 1)) + Math.abs(bc - Math.floor(cols \/ 2));\n      return bd - ad;\n    });\n\n    var targets = leaves.slice(0, targetCount);\n    while (targets.length < targetCount) {\n      var candidate = visitOrder[Math.max(1, visitOrder.length - 1 - targets.length)];\n      if (targets.indexOf(candidate) === -1 ? candidate !== sourceIndex : false) targets.push(candidate);\n      else break;\n    }\n\n    var sources = [sourceIndex];\n    if (number >= 31) {\n      var sourceCandidates = [\n        indexOf(rows - 1, 0, cols),\n        indexOf(rows - 1, cols - 1, cols),\n        indexOf(0, 0, cols),\n        indexOf(0, cols - 1, cols)\n      ];\n      for (var sc = 0; sc < sourceCandidates.length; sc += 1) {\n        var secondSource = sourceCandidates[sc];\n        if (secondSource !== sourceIndex ? (targets.indexOf(secondSource) === -1 ? fixedJunctions.indexOf(secondSource) === -1 : false) : false) {\n          sources.push(secondSource);\n          break;\n        }\n      }\n    }\n\n    var junctionSet = new Set(fixedJunctions);\n    var lockedSet = new Set();\n    if (number >= 7) {\n      var lockCandidates = [];\n      for (var li = 0; li < total; li += 1) {\n        if (sources.indexOf(li) === -1 ? (targets.indexOf(li) === -1 ? !junctionSet.has(li) : false) : false) lockCandidates.push(li);\n      }\n      shuffle(lockCandidates, random);\n      var lockCount = clamp(Math.floor(number \/ 9), 1, 5);\n      for (var lk = 0; lk < Math.min(lockCount, lockCandidates.length); lk += 1) {\n        lockedSet.add(lockCandidates[lk]);\n      }\n    }\n\n    var rotations = new Array(total).fill(0);\n    var targetMoves = 0;\n    for (var ri = 0; ri < total; ri += 1) {\n      if (lockedSet.has(ri) || junctionSet.has(ri) || sources.indexOf(ri) !== -1) {\n        rotations[ri] = 0;\n        continue;\n      }\n      var shouldScramble = random() < (number <= 4 ? .62 : .84);\n      var turn = shouldScramble ? 1 + Math.floor(random() * 3) : 0;\n      rotations[ri] = turn;\n      targetMoves += (4 - turn) % 4;\n    }\n\n    if (targetMoves < 4) {\n      for (var force = 0; force < total ? targetMoves < 4 : false; force += 1) {\n        if (lockedSet.has(force) || junctionSet.has(force) || sources.indexOf(force) !== -1) continue;\n        if (rotations[force] === 0) {\n          rotations[force] = 2;\n          targetMoves += 2;\n        }\n      }\n    }\n\n    return {\n      number: number,\n      rows: rows,\n      cols: cols,\n      name: levelNames[number - 1],\n      masks: masks,\n      solutionRotations: new Array(total).fill(0),\n      initialRotations: rotations,\n      targetMoves: targetMoves,\n      targets: targets,\n      sources: sources,\n      locked: lockedSet,\n      junctions: junctionSet,\n      tutorial: number === 1 ? \"Tap a route tile to rotate its moonthread channels. Carry creamy moonlight from every Moonforge Hub to each Mochi Parcel.\" :\n        number === 7 ? \"Tiles secured with a wooden mallet pin are already aligned and cannot be turned.\" :\n        number === 16 ? \"Four-way Cloudloom Junctions carry moonlight in every direction and remain fixed.\" :\n        number === 31 ? \"Two Moonforge Hubs are active now. A Mochi Parcel may be reached from either source.\" : \"\"\n    };\n  }\n\n  for (var levelNumber = 1; levelNumber <= 50; levelNumber += 1) {\n    levels.push(makeLevel(levelNumber));\n  }\n\n  function createAudio() {\n    var context = null;\n\n    function ensure() {\n      if (!progress.sound) return null;\n      try {\n        if (!context) context = new (window.AudioContext || window.webkitAudioContext)();\n        if (context.state === \"suspended\") context.resume();\n        return context;\n      } catch (error) {\n        return null;\n      }\n    }\n\n    function tone(frequency, duration, type, gain, delay) {\n      var ctx = ensure();\n      if (!ctx) return;\n      var oscillator = ctx.createOscillator();\n      var volume = ctx.createGain();\n      var start = ctx.currentTime + (delay || 0);\n      oscillator.type = type || \"sine\";\n      oscillator.frequency.setValueAtTime(frequency, start);\n      volume.gain.setValueAtTime(0.0001, start);\n      volume.gain.exponentialRampToValueAtTime(gain || .045, start + .012);\n      volume.gain.exponentialRampToValueAtTime(0.0001, start + duration);\n      oscillator.connect(volume);\n      volume.connect(ctx.destination);\n      oscillator.start(start);\n      oscillator.stop(start + duration + .03);\n    }\n\n    return {\n      play: function (name) {\n        if (!progress.sound) return;\n        if (name === \"turn\") {\n          tone(290, .055, \"triangle\", .025, 0);\n          tone(560, .08, \"sine\", .025, .035);\n        } else if (name === \"button\") {\n          tone(430, .08, \"triangle\", .032, 0);\n        } else if (name === \"locked\") {\n          tone(135, .10, \"square\", .018, 0);\n        } else if (name === \"undo\") {\n          tone(420, .09, \"triangle\", .03, 0);\n          tone(300, .10, \"triangle\", .025, .05);\n        } else if (name === \"hint\") {\n          tone(650, .12, \"sine\", .035, 0);\n          tone(810, .16, \"sine\", .025, .08);\n        } else if (name === \"win\") {\n          tone(440, .16, \"triangle\", .045, 0);\n          tone(554, .18, \"triangle\", .045, .11);\n          tone(659, .23, \"sine\", .05, .22);\n          tone(988, .32, \"sine\", .04, .34);\n        }\n      }\n    };\n  }\n\n  function updateSoundButtons() {\n    root.classList.toggle(\"mrc-muted\", !progress.sound);\n    root.querySelectorAll('[data-mrc-action=\"sound\"]').forEach(function (button) {\n      button.setAttribute(\"aria-label\", progress.sound ? \"Sound on\" : \"Sound muted\");\n      button.setAttribute(\"aria-pressed\", progress.sound ? \"false\" : \"true\");\n    });\n  }\n\n  function modalShell(title, text, buttons, levelMode) {\n    dialog.className = \"mrc-dialog\" + (levelMode ? \" mrc-level-dialog\" : \"\");\n    dialog.innerHTML = \"<h2>\" + title + \"<\/h2><p>\" + text + \"<\/p>\" + buttons;\n    overlay.hidden = false;\n    state.paused = true;\n  }\n\n  function closeModal() {\n    overlay.hidden = true;\n    state.modal = \"\";\n    state.paused = false;\n  }\n\n  function showStart() {\n    var hasProgress = progress.unlocked > 1 || Object.keys(progress.completed).length > 0;\n    var buttons = '<div class=\"mrc-menu-grid\">' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-primary\" data-mrc-action=\"' + (hasProgress ? \"continue\" : \"new-game\") + '\">' + (hasProgress ? \"Return to the Workshop\" : \"Open the First Moonthread\") + '<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"levels\">Workshop Map<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"new-game\">Begin a New Moonthread<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-secondary\" data-mrc-action=\"how\">How to Play<\/button>' +\n    '<\/div>';\n    modalShell(\"Mochilight Routecraft\", \"Rotate the moonthread tiles until creamy lunar light from every Moonforge Hub reaches each Mochi Parcel. Fifty workshop routes, ratings, and unlocked stages are saved on this device.\", buttons, false);\n    state.modal = \"start\";\n  }\n\n  function showHow() {\n    var buttons = '<div class=\"mrc-menu-grid mrc-single\"><button type=\"button\" class=\"mrc-menu-btn mrc-primary\" data-mrc-action=\"main-menu\">Back to the Moon Rabbit Workshop<\/button><\/div>';\n    modalShell(\"Guide the Moonthreads\", \"Tap a movable route tile to rotate it clockwise. Connect every Mochi Parcel to a Moonforge Hub. Mallet-pinned tiles stay fixed, four-way Cloudloom Junctions carry moonlight in every direction, Undo restores one turn, and Rabbit\\u0027s Hint reveals a tile that still needs alignment.\", buttons, false);\n    state.modal = \"how\";\n  }\n\n  function showPause() {\n    if (state.winning || !state.level) return;\n    var buttons = '<div class=\"mrc-menu-grid\">' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-primary\" data-mrc-action=\"resume\">Resume the Route<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"restart\">Restart Route<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"levels\">Workshop Map<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-secondary\" data-mrc-action=\"main-menu\">Workshop Route Menu<\/button>' +\n    '<\/div>';\n    modalShell(\"The Moon Forges Are Resting\", \"The Moonforge Hubs will hold their creamy glow while the workshop rests. Resume whenever you are ready to continue weaving moonlight across the crafting board.\", buttons, false);\n    state.modal = \"pause\";\n  }\n\n  function showRestartConfirm() {\n    if (!state.level) return;\n    var buttons = '<div class=\"mrc-menu-grid\">' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"cancel\">Keep Playing<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-primary\" data-mrc-action=\"restart-now\">Restart Route<\/button>' +\n    '<\/div>';\n    modalShell(\"Reset this moonthread route?\", \"Every moonthread tile will return to its opening rotation and the turn counter will begin again.\", buttons, false);\n    state.modal = \"restart\";\n  }\n\n  function showNewConfirm() {\n    if (Object.keys(progress.completed).length === 0 ? progress.unlocked === 1 : false) {\n      progress = defaultProgress();\n      saveProgress();\n      loadLevel(0, true);\n      return;\n    }\n    var buttons = '<div class=\"mrc-menu-grid\">' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"main-menu\">Cancel<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-primary\" data-mrc-action=\"new-now\">Begin New Moonthread<\/button>' +\n    '<\/div>';\n    modalShell(\"Begin a new workshop route?\", \"This clears unlocked routes and ratings before opening Level 1.\", buttons, false);\n    state.modal = \"new\";\n  }\n\n  function showTutorial(level) {\n    if (!level.tutorial || progress.tutorialSeen[String(level.number)]) return;\n    var buttons = '<div class=\"mrc-menu-grid mrc-single\"><button type=\"button\" class=\"mrc-menu-btn mrc-primary\" data-mrc-action=\"tutorial-close\">Light the First Moonthread<\/button><\/div>';\n    modalShell(level.name, level.tutorial, buttons, false);\n    state.modal = \"tutorial\";\n  }\n\n  function showLevels(page) {\n    state.page = clamp(typeof page === \"number\" ? page : Math.floor((progress.last - 1) \/ 10), 0, 4);\n    var start = state.page * 10;\n    var cells = \"\";\n\n    for (var i = start; i < start + 10; i += 1) {\n      var unlocked = i + 1 <= progress.unlocked;\n      var rating = Number(progress.completed[String(i + 1)] || 0);\n      var stars = '<span class=\"mrc-mini-stars\">';\n      for (var a = 1; a <= 3; a += 1) {\n        stars += '<i class=\"mrc-mini-star' + (a <= rating ? \" mrc-mini-star-earned\" : \"\") + '\"><\/i>';\n      }\n      stars += \"<\/span>\";\n      cells += '<button type=\"button\" class=\"mrc-level-btn' + (unlocked ? \"\" : \" mrc-level-locked\") + '\" data-mrc-action=\"choose-level\" data-mrc-level=\"' + (i + 1) + '\"' + (unlocked ? \"\" : \" disabled\") + '><span>' + (i + 1) + '<\/span><small>' + (unlocked ? levels[i].name : \"Path Locked\") + '<\/small>' + stars + '<\/button>';\n    }\n\n    var nav = '<div class=\"mrc-page-nav\">' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"level-prev\"' + (state.page === 0 ? \" disabled\" : \"\") + '>Previous<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-secondary\" data-mrc-action=\"main-menu\">Workshop Route Menu<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"level-next\"' + (state.page === 4 ? \" disabled\" : \"\") + '>Next<\/button>' +\n    '<\/div>';\n\n    modalShell(\"Moon Rabbit Workshop Map \" + (start + 1) + \"-\" + (start + 10), \"Choose any moonthread route that has already been unlocked on the workshop board.\", '<div class=\"mrc-level-grid\">' + cells + '<\/div>' + nav, true);\n    state.modal = \"levels\";\n  }\n\n  function showWin(rating) {\n    var isLast = state.levelIndex === levels.length - 1;\n    var stars = '<div class=\"mrc-rating-row\">';\n    for (var i = 1; i <= 3; i += 1) {\n      stars += '<span class=\"mrc-rating-star' + (i <= rating ? \" mrc-rating-star-earned\" : \"\") + '\" style=\"animation-delay:' + (i * .08) + 's\"><\/span>';\n    }\n    stars += \"<\/div>\";\n\n    var results = '<div class=\"mrc-result-line\"><span>Turns <strong>' + state.moves + '<\/strong><\/span><span>Par <strong>' + state.level.targetMoves + '<\/strong><\/span><\/div>';\n    var buttons = '<div class=\"mrc-menu-grid\">' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"replay\">Weave It Again<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-primary\" data-mrc-action=\"' + (isLast ? \"main-menu\" : \"next\") + '\">' + (isLast ? \"Close the Workshop\" : \"Next Moonthread Route\") + '<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn mrc-secondary\" data-mrc-action=\"levels\">Workshop Map<\/button>' +\n      '<button type=\"button\" class=\"mrc-menu-btn\" data-mrc-action=\"main-menu\">Workshop Route Menu<\/button>' +\n    '<\/div>';\n\n    modalShell(isLast ? \"Every Moonthread Is Glowing\" : \"Moonthread Route Complete\", isLast ? \"All fifty routes now carry creamy moonlight across the Moon Rabbit Workshop.\" : \"The final Mochi Parcel received its moonlight, and another moonthread route opened among the clouds.\", stars + results + buttons, false);\n    state.modal = \"win\";\n  }\n\n  function showToast(message) {\n    clearTimeout(state.toastTimer);\n    toast.textContent = message;\n    toast.classList.add(\"mrc-toast-show\");\n    state.toastTimer = setTimeout(function () {\n      toast.classList.remove(\"mrc-toast-show\");\n    }, 2100);\n  }\n\n  function loadLevel(index, forceClose) {\n    index = clamp(index, 0, levels.length - 1);\n    state.levelIndex = index;\n    state.level = levels[index];\n    state.rotations = state.level.initialRotations.slice();\n    state.initialRotations = state.rotations.slice();\n    state.moves = 0;\n    state.history = [];\n    state.winning = false;\n    progress.last = index + 1;\n    saveProgress();\n    if (forceClose) closeModal();\n    renderBoard();\n    evaluateConnections();\n    updateHud();\n    showTutorial(state.level);\n  }\n\n  function restartLevel() {\n    if (!state.level) return;\n    state.rotations = state.initialRotations.slice();\n    state.moves = 0;\n    state.history = [];\n    state.winning = false;\n    closeModal();\n    renderBoard();\n    evaluateConnections();\n    updateHud();\n    showToast(\"The moonthread routes returned to their opening positions.\");\n  }\n\n  function renderBoard() {\n    var level = state.level;\n    if (!level) return;\n    boardEl.innerHTML = \"\";\n    boardEl.style.gridTemplateColumns = \"repeat(\" + level.cols + \", minmax(0, 1fr))\";\n    boardEl.style.gridTemplateRows = \"repeat(\" + level.rows + \", minmax(0, 1fr))\";\n    boardEl.style.setProperty(\"--mrc-gap\", level.rows >= 7 ? \"5px\" : level.rows >= 6 ? \"6px\" : \"7px\");\n    boardTitle.textContent = level.name;\n\n    for (var i = 0; i < level.masks.length; i += 1) {\n      var button = document.createElement(\"button\");\n      var mask = level.masks[i];\n      var isJunction = level.junctions.has(i);\n      var isSource = level.sources.indexOf(i) !== -1;\n      var isTarget = level.targets.indexOf(i) !== -1;\n      var isFixed = level.locked.has(i) || isJunction || isSource;\n      button.type = \"button\";\n      button.className = \"mrc-tile\" + (mask === 0 ? \" mrc-blank\" : \"\") + (isFixed ? \" mrc-fixed\" : \"\");\n      button.dataset.mrcTile = String(i);\n      button.setAttribute(\"aria-label\", isFixed ? \"Fixed moonthread route tile\" : \"Rotate moonthread route tile\");\n      if (isFixed) button.setAttribute(\"aria-disabled\", \"true\");\n\n      var turn = document.createElement(\"span\");\n      turn.className = \"mrc-turn\";\n      turn.style.setProperty(\"--mrc-rotation\", (state.rotations[i] * 90) + \"deg\");\n\n      if (isJunction) {\n        turn.innerHTML = '<span class=\"mrc-bridge-v\"><\/span><span class=\"mrc-bridge-h\"><\/span>';\n      } else if (mask === 0) {\n        turn.innerHTML = '<span class=\"mrc-empty-mark\"><\/span>';\n      } else {\n        var html = \"\";\n        if (mask % 2 !== 0) html += '<span class=\"mrc-trail-arm mrc-trail-t\"><\/span>';\n        if (Math.floor(mask \/ 2) % 2 !== 0) html += '<span class=\"mrc-trail-arm mrc-trail-r\"><\/span>';\n        if (Math.floor(mask \/ 4) % 2 !== 0) html += '<span class=\"mrc-trail-arm mrc-trail-b\"><\/span>';\n        if (Math.floor(mask \/ 8) % 2 !== 0) html += '<span class=\"mrc-trail-arm mrc-trail-l\"><\/span>';\n        html += '<span class=\"mrc-hub\"><\/span>';\n        turn.innerHTML = html;\n      }\n\n      button.appendChild(turn);\n\n      if (isSource) {\n        var moonCore = document.createElement(\"span\");\n        moonCore.className = \"mrc-moon-source\";\n        button.appendChild(moonCore);\n      }\n\n      if (isTarget) {\n        var orderMark = document.createElement(\"span\");\n        orderMark.className = \"mrc-parcel-target\";\n        button.appendChild(orderMark);\n      }\n\n      if (level.locked.has(i)) {\n        var lock = document.createElement(\"span\");\n        lock.className = \"mrc-mallet-lock\";\n        button.appendChild(lock);\n      }\n\n      boardEl.appendChild(button);\n    }\n  }\n\n  function currentMaskAt(index) {\n    return rotateMask(state.level.masks[index], state.rotations[index]);\n  }\n\n  function evaluateConnections() {\n    var level = state.level;\n    var queue = level.sources.slice();\n    var connected = new Set();\n\n    while (queue.length) {\n      var current = queue.shift();\n      if (connected.has(current)) continue;\n      connected.add(current);\n\n      var row = Math.floor(current \/ level.cols);\n      var col = current % level.cols;\n      var mask = currentMaskAt(current);\n\n      for (var direction = 0; direction < 4; direction += 1) {\n        if (Math.floor(mask \/ DIRS[direction]) % 2 === 0) continue;\n        var nextRow = row + DR[direction];\n        var nextCol = col + DC[direction];\n        if (nextRow < 0 || nextRow >= level.rows || nextCol < 0 || nextCol >= level.cols) continue;\n        var nextIndex = indexOf(nextRow, nextCol, level.cols);\n        var nextMask = currentMaskAt(nextIndex);\n        if (Math.floor(nextMask \/ OPP[direction]) % 2 !== 0) queue.push(nextIndex);\n      }\n    }\n\n    state.connectedCells = connected;\n    state.completedTargets = new Set(level.targets.filter(function (target) {\n      return connected.has(target);\n    }));\n\n    updateBoardClasses();\n    updateHud();\n\n    if (state.completedTargets.size === level.targets.length ? (!state.winning ? !state.paused : false) : false) {\n      state.winning = true;\n      clearTimeout(state.winTimer);\n      state.winTimer = setTimeout(completeLevel, 280);\n    }\n  }\n\n  function updateBoardClasses() {\n    boardEl.querySelectorAll(\".mrc-tile\").forEach(function (tile, index) {\n      tile.classList.toggle(\"mrc-connected\", state.connectedCells.has(index));\n      tile.classList.toggle(\"mrc-parcel-lit\", state.completedTargets.has(index));\n    });\n  }\n\n  function updateHud() {\n    if (!state.level) return;\n    levelValue.textContent = (state.levelIndex + 1) + \" \/ 50\";\n    movesValue.textContent = String(state.moves);\n    targetsValue.textContent = state.completedTargets.size + \" \/ \" + state.level.targets.length;\n    var undoButton = root.querySelector('[data-mrc-action=\"undo\"]');\n    if (undoButton) undoButton.disabled = state.history.length === 0 || state.paused || state.winning;\n  }\n\n  function rotateTile(index) {\n    if (state.paused || state.winning || !state.level) return;\n    if (state.level.locked.has(index) || state.level.junctions.has(index) || state.level.sources.indexOf(index) !== -1) {\n      var fixedTile = boardEl.querySelector('[data-mrc-tile=\"' + index + '\"]');\n      if (fixedTile) {\n        fixedTile.classList.remove(\"mrc-bump\");\n        void fixedTile.offsetWidth;\n        fixedTile.classList.add(\"mrc-bump\");\n      }\n      audio.play(\"locked\");\n      showToast(\"That route is secured by a wooden mallet pin.\");\n      return;\n    }\n\n    state.history.push({ index: index, rotation: state.rotations[index] });\n    state.rotations[index] = (state.rotations[index] + 1) % 4;\n    state.moves += 1;\n    var tile = boardEl.querySelector('[data-mrc-tile=\"' + index + '\"]');\n    if (tile) {\n      var turn = tile.querySelector(\".mrc-turn\");\n      if (turn) turn.style.setProperty(\"--mrc-rotation\", (state.rotations[index] * 90) + \"deg\");\n    }\n    audio.play(\"turn\");\n    evaluateConnections();\n  }\n\n  function undoMove() {\n    if (state.paused || state.winning || !state.history.length) {\n      if (!state.history.length) showToast(\"There is no route turn to undo yet.\");\n      return;\n    }\n    var last = state.history.pop();\n    state.rotations[last.index] = last.rotation;\n    state.moves = Math.max(0, state.moves - 1);\n    var tile = boardEl.querySelector('[data-mrc-tile=\"' + last.index + '\"]');\n    if (tile) {\n      var turn = tile.querySelector(\".mrc-turn\");\n      if (turn) turn.style.setProperty(\"--mrc-rotation\", (state.rotations[last.index] * 90) + \"deg\");\n    }\n    audio.play(\"undo\");\n    evaluateConnections();\n  }\n\n  function showHint() {\n    if (state.paused || state.winning || !state.level) return;\n    var candidates = [];\n    for (var i = 0; i < state.rotations.length; i += 1) {\n      if (state.level.locked.has(i) || state.level.junctions.has(i) || state.level.sources.indexOf(i) !== -1) continue;\n      if (state.rotations[i] !== state.level.solutionRotations[i]) candidates.push(i);\n    }\n\n    if (!candidates.length) {\n      showToast(\"The moonthreads are aligned. Follow the remaining lunar glow carefully.\");\n      return;\n    }\n\n    candidates.sort(function (a, b) {\n      var aConnected = state.connectedCells.has(a) ? 0 : 1;\n      var bConnected = state.connectedCells.has(b) ? 0 : 1;\n      return aConnected - bConnected;\n    });\n\n    var index = candidates[0];\n    var tile = boardEl.querySelector('[data-mrc-tile=\"' + index + '\"]');\n    if (tile) {\n      tile.classList.remove(\"mrc-hinting\");\n      void tile.offsetWidth;\n      tile.classList.add(\"mrc-hinting\");\n      setTimeout(function () {\n        tile.classList.remove(\"mrc-hinting\");\n      }, 2250);\n    }\n\n    var turnsNeeded = (4 - state.rotations[index]) % 4;\n    audio.play(\"hint\");\n    showToast(\"This route tile needs \" + turnsNeeded + (turnsNeeded === 1 ? \" clockwise turn.\" : \" clockwise turns.\"));\n  }\n\n  function ratingForMoves(moves, target) {\n    if (moves <= target) return 3;\n    if (moves <= target + Math.ceil(target * .28)) return 2;\n    return 1;\n  }\n\n  function completeLevel() {\n    if (!state.winning || !state.level) return;\n    var rating = ratingForMoves(state.moves, state.level.targetMoves);\n    var key = String(state.levelIndex + 1);\n    progress.completed[key] = Math.max(Number(progress.completed[key] || 0), rating);\n    progress.unlocked = Math.max(progress.unlocked, Math.min(50, state.levelIndex + 2));\n    progress.last = Math.min(50, state.levelIndex + 2);\n    saveProgress();\n    audio.play(\"win\");\n    createWinEffect();\n    setTimeout(function () {\n      showWin(rating);\n    }, 780);\n  }\n\n  function createWinEffect() {\n    winLayer.innerHTML = '<span class=\"mrc-win-mochi\"><\/span>';\n    for (var i = 0; i < 26; i += 1) {\n      var spark = document.createElement(\"span\");\n      spark.className = \"mrc-moon-spark\";\n      spark.style.left = (46 + Math.random() * 8) + \"%\";\n      spark.style.top = (44 + Math.random() * 9) + \"%\";\n      spark.style.setProperty(\"--mrc-dx\", ((Math.random() - .5) * 520) + \"px\");\n      spark.style.setProperty(\"--mrc-dy\", ((Math.random() - .35) * 360) + \"px\");\n      spark.style.animationDelay = (Math.random() * .22) + \"s\";\n      spark.style.background = [\"#B84753\", \"#FFD98A\", \"#FFF9EA\", \"#9A88C8\", \"#82A36F\"][i % 5];\n      winLayer.appendChild(spark);\n    }\n    winLayer.hidden = false;\n    setTimeout(function () {\n      winLayer.hidden = true;\n      winLayer.innerHTML = \"\";\n    }, 1450);\n  }\n\n  function resumeGame() {\n    closeModal();\n    evaluateConnections();\n  }\n\n  function handleAction(action, element) {\n    if (!action) return;\n    if (action !== \"fullscreen\") audio.play(\"button\");\n\n    if (action === \"fullscreen\") {\n      toggleFullscreen();\n    } else if (action === \"sound\") {\n      progress.sound = !progress.sound;\n      saveProgress();\n      updateSoundButtons();\n      if (progress.sound) audio.play(\"button\");\n    } else if (action === \"pause\") {\n      showPause();\n    } else if (action === \"resume\" || action === \"cancel\") {\n      resumeGame();\n    } else if (action === \"restart\") {\n      showRestartConfirm();\n    } else if (action === \"restart-now\" || action === \"replay\") {\n      restartLevel();\n    } else if (action === \"undo\") {\n      undoMove();\n    } else if (action === \"hint\") {\n      showHint();\n    } else if (action === \"levels\") {\n      showLevels();\n    } else if (action === \"level-prev\") {\n      showLevels(state.page - 1);\n    } else if (action === \"level-next\") {\n      showLevels(state.page + 1);\n    } else if (action === \"main-menu\") {\n      showStart();\n    } else if (action === \"continue\") {\n      loadLevel(progress.last - 1, true);\n    } else if (action === \"new-game\") {\n      showNewConfirm();\n    } else if (action === \"new-now\") {\n      progress = defaultProgress();\n      saveProgress();\n      updateSoundButtons();\n      loadLevel(0, true);\n    } else if (action === \"how\") {\n      showHow();\n    } else if (action === \"tutorial-close\") {\n      progress.tutorialSeen[String(state.levelIndex + 1)] = true;\n      saveProgress();\n      resumeGame();\n    } else if (action === \"next\") {\n      loadLevel(Math.min(levels.length - 1, state.levelIndex + 1), true);\n    } else if (action === \"choose-level\") {\n      var chosen = Number(element.getAttribute(\"data-mrc-level\"));\n      if (chosen <= progress.unlocked) loadLevel(chosen - 1, true);\n      else showToast(\"That moonthread route is still locked.\");\n    }\n  }\n\n  function fullscreenElement() {\n    return document.fullscreenElement || document.webkitFullscreenElement || null;\n  }\n\n  function enterFallbackFullscreen() {\n    fallbackFullscreen = true;\n    root.classList.add(\"mrc-fullscreen\");\n    document.documentElement.classList.add(\"mrc-page-lock\");\n    if (document.body) document.body.classList.add(\"mrc-page-lock\");\n    scheduleResize();\n  }\n\n  function exitFallbackFullscreen() {\n    fallbackFullscreen = false;\n    root.classList.remove(\"mrc-fullscreen\");\n    document.documentElement.classList.remove(\"mrc-page-lock\");\n    if (document.body) document.body.classList.remove(\"mrc-page-lock\");\n    scheduleResize();\n  }\n\n  function toggleFullscreen() {\n    var active = fullscreenElement();\n    if (active) {\n      var exit = document.exitFullscreen || document.webkitExitFullscreen;\n      if (exit) {\n        try {\n          var exitResult = exit.call(document);\n          if (exitResult ? typeof exitResult.catch === \"function\" : false) exitResult.catch(function () {});\n        } catch (error) {}\n      }\n      return;\n    }\n\n    if (fallbackFullscreen) {\n      exitFallbackFullscreen();\n      return;\n    }\n\n    var request = root.requestFullscreen || root.webkitRequestFullscreen;\n    if (!request) {\n      enterFallbackFullscreen();\n      return;\n    }\n\n    try {\n      var result = request.call(root);\n      if (result ? typeof result.catch === \"function\" : false) {\n        result.catch(function () {\n          enterFallbackFullscreen();\n        });\n      } else {\n        scheduleResize();\n      }\n    } catch (error) {\n      enterFallbackFullscreen();\n    }\n  }\n\n  function resizeGame() {\n    var isFullscreen = fullscreenElement() === root || fallbackFullscreen;\n    root.classList.toggle(\"mrc-fullscreen\", isFullscreen);\n\n    var rect = root.getBoundingClientRect();\n    var width = Math.max(1, root.clientWidth || rect.width || BASE_W);\n    var height = Math.max(1, root.clientHeight || rect.height || BASE_H);\n\n    if (isFullscreen) {\n      width = Math.max(width, document.documentElement.clientWidth || 0, window.innerWidth || 0);\n      height = Math.max(height, document.documentElement.clientHeight || 0, window.innerHeight || 0);\n    }\n\n    var scale = Math.min(width \/ BASE_W, height \/ BASE_H);\n\n    stage.style.left = \"50%\";\n    stage.style.top = \"50%\";\n    stage.style.width = BASE_W + \"px\";\n    stage.style.height = BASE_H + \"px\";\n    stage.style.transform = \"translate3d(-50%, -50%, 0) scale(\" + scale + \")\";\n  }\n\n  function scheduleResize() {\n    [0, 80, 220, 420].forEach(function (delay) {\n      setTimeout(resizeGame, delay);\n    });\n  }\n\n  boardEl.addEventListener(\"click\", function (event) {\n    var tile = event.target.closest(\"[data-mrc-tile]\");\n    if (!tile || !boardEl.contains(tile)) return;\n    rotateTile(Number(tile.dataset.mrcTile));\n  });\n\n  root.addEventListener(\"click\", function (event) {\n    var element = event.target.closest(\"[data-mrc-action]\");\n    if (!element || !root.contains(element) || element.disabled) return;\n    handleAction(element.dataset.mrcAction, element);\n  });\n\n  root.addEventListener(\"keydown\", function (event) {\n    if (event.key === \"Escape\" ? (!overlay.hidden ? state.modal !== \"start\" : false) : false) {\n      event.preventDefault();\n      if (state.level) resumeGame();\n      else showStart();\n    }\n    if ((event.key === \"z\" || event.key === \"Z\") ? (event.ctrlKey || event.metaKey) : false) {\n      event.preventDefault();\n      undoMove();\n    }\n  });\n\n  document.addEventListener(\"fullscreenchange\", function () {\n    if (fullscreenElement() === root) {\n      fallbackFullscreen = false;\n      document.documentElement.classList.remove(\"mrc-page-lock\");\n      if (document.body) document.body.classList.remove(\"mrc-page-lock\");\n    }\n    scheduleResize();\n  });\n  document.addEventListener(\"webkitfullscreenchange\", function () {\n    if (fullscreenElement() === root) {\n      fallbackFullscreen = false;\n      document.documentElement.classList.remove(\"mrc-page-lock\");\n      if (document.body) document.body.classList.remove(\"mrc-page-lock\");\n    }\n    scheduleResize();\n  });\n  document.addEventListener(\"keydown\", function (event) {\n    if (event.key === \"Escape\" ? fallbackFullscreen : false) exitFallbackFullscreen();\n  });\n\n  window.addEventListener(\"resize\", resizeGame, { passive: true });\n  window.addEventListener(\"orientationchange\", scheduleResize, { passive: true });\n\n  if (window.visualViewport) {\n    window.visualViewport.addEventListener(\"resize\", resizeGame, { passive: true });\n  }\n\n  if (window.ResizeObserver) {\n    new ResizeObserver(resizeGame).observe(root);\n  }\n\n  updateSoundButtons();\n  loadLevel(Math.min(progress.last, progress.unlocked) - 1, false);\n  showStart();\n  resizeGame();\n  requestAnimationFrame(resizeGame);\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initializeMochilightRoutecraft, { once: true });\n  } else {\n    initializeMochilightRoutecraft();\n  }\n})();\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\">How the Route-Rotation Puzzle Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each level presents a square board filled with route tiles. Every tile contains one or more Moonthread channels. These channels may form straight paths, corners, branches, or multi-directional crossings. Tapping a movable tile rotates it ninety degrees clockwise.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The goal is to connect every Mochi Parcel to at least one active Moonforge Hub. Moonlight can travel only when two neighboring tiles have openings that face one another. A route pointing toward a neighboring tile is not enough if that neighboring tile does not provide a matching entrance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Connected tiles begin to glow, allowing players to see how far the moonlight currently travels. This visual feedback is an important part of solving each puzzle. A glowing route confirms that the connection is valid, while an unlit section indicates that something remains misaligned or disconnected from the main network.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The puzzle is complete when every required Mochi Parcel receives moonlight. Players do not need to rotate every tile into a visually perfect pattern if all required destinations are connected, but efficient solutions generally follow the hidden intended structure of the level.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Moonforge Hubs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Moonforge Hubs are the sources of energy within each puzzle. They contain concentrated creamy moonlight produced by the workshop\u2019s celestial forge. A hub begins active and cannot be rotated, ensuring that players always have a stable point from which to study the route.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Early levels contain one Moonforge Hub. These puzzles teach players how light spreads through simple corners, straight channels, and branching paths. Later stages may introduce more than one hub, creating networks that can be powered from different locations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When multiple Moonforge Hubs appear, a Mochi Parcel may receive energy from either source. This opens more possible solutions, but it can also make the board harder to read. Players must determine which hub provides the most efficient route and whether separate branches should eventually connect.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mochi Parcels Waiting for Moonlight<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mochi Parcels are the destinations that must be powered to complete a level. Each parcel contains carefully prepared rice cakes, small workshop supplies, or pieces of moonlight equipment intended for distant parts of the night sky.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A parcel that has not received energy appears quiet and dim. Once connected to a Moonforge Hub, it becomes brighter and more lively, confirming that the delivery is ready. The HUD displays how many parcels are currently connected and how many are required.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Within the story, restoring these parcels is more than a technical task. Some contain lantern cores for sleeping villages. Others carry replacement threads for damaged constellations. A few hold warm mochi for moon rabbits stationed at remote cloud towers. Every successful connection therefore represents another promise the workshop can keep.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wooden Mallet Pins<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As the levels become more difficult, players encounter tiles secured by Wooden Mallet Pins. These pieces are already fixed in place and cannot be rotated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Locked tiles may initially appear restrictive, but they also provide valuable information. Because their orientation is permanent, they reveal part of the intended network. Players can study the directions of these fixed channels and use them as anchors while arranging nearby movable tiles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Attempting to rotate a pinned tile produces a small visual response and a gentle locked sound. The game clearly communicates that the piece is fixed, preventing players from wasting time wondering whether the control failed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Wooden Mallet Pin represents the workshop\u2019s commitment to reliable craftsmanship. Once a route section has been tested and secured by the senior rabbits, it remains stable even when cloud winds shake the surrounding board.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cloudloom Junctions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cloudloom Junctions appear in more advanced levels. These permanent four-way connections carry moonlight in every direction and cannot be rotated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A Cloudloom Junction can become the center of a large network. When connected to a Moonforge Hub, it may distribute energy upward, downward, left, and right at the same time. This makes it powerful, but it also increases the number of route branches players must manage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because the junction remains fixed, the challenge lies in correctly aligning the surrounding tiles. One incorrect neighboring piece may leave an entire section of the board dark, even when the rest of the central network appears complete.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the workshop\u2019s lore, these junctions are woven from condensed clouds and silver thread. They are used wherever several crafting rooms depend on the same energy channel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fifty Routes with Growing Complexity<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mochilight Routecraft contains fifty levels. The earliest routes use compact four-by-four boards that introduce the basic rotation mechanic without overwhelming the player. These stages can often be solved by following the glow from the Moonforge Hub one tile at a time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Later groups expand to five-by-five, six-by-six, and seven-by-seven boards. Larger boards contain more possible orientations, longer branches, additional Mochi Parcels, and a greater number of tiles that can appear correct while still belonging to the wrong route.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">New mechanics are introduced gradually. Wooden Mallet Pins appear after players understand ordinary rotation. Cloudloom Junctions arrive once players are comfortable managing branching paths. Advanced levels add multiple Moonforge Hubs and several destinations spread across distant corners of the board.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This progression keeps the game approachable while allowing the final routes to become genuinely challenging. The rules remain consistent, but solving the board requires increasingly careful reasoning.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Turns, Par, and Moon Ratings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every clockwise tile rotation counts as one turn. The game records the number of turns used to solve the current puzzle and compares it with the intended par value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Completing a level at or below par earns the highest rating. Using a few additional turns may still receive a strong result, while a less efficient solution earns a basic completion rating. This system rewards planning without preventing players from experimenting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A player can solve a route through trial and error, learn from the finished network, and replay the level to find a more efficient sequence. Because progress and ratings are stored in the browser, every improved solution becomes part of the player\u2019s growing workshop record.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The rating system does not impose a time limit. Players can study the board for as long as necessary. The challenge comes from understanding the route rather than reacting quickly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Undo and Rabbit\u2019s Hint<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Undo button reverses the most recent rotation and reduces the turn counter accordingly. This is helpful when a tile was turned accidentally or when a planned route creates an unexpected dead end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Undo can also be used as a learning tool. Players can test a possible orientation, observe how the connected glow changes, and return to the previous state when the result is not useful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rabbit\u2019s Hint highlights a movable tile that is not yet aligned with its intended solution. The game also explains how many clockwise turns the highlighted piece needs. This provides meaningful guidance without completing the entire puzzle automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A hint may identify one incorrect tile, but players must still understand how that piece connects to the wider network. On large boards, correcting a single route section can reveal several new possibilities.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Workshop Map and Saved Progress<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Workshop Map displays all fifty levels in groups of ten. Completed stages show their earned ratings, while future routes remain locked until the required earlier puzzles have been solved.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The game saves unlocked levels, ratings, sound preferences, tutorial progress, and the most recently visited route in the browser. Players can leave the page and later continue from their previous position without creating an account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beginning a completely new route journey resets the saved progression and returns the workshop to Level 1. A confirmation screen helps prevent accidental loss of progress.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Calm Puzzle without Time Pressure<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mochilight Routecraft is designed as a thoughtful puzzle rather than a fast competition. There is no countdown timer forcing players to rotate tiles quickly. The workshop waits quietly while the player examines every channel and plans the next move.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The lack of time pressure makes the game suitable for short relaxing breaks as well as longer puzzle sessions. A player may solve one route in a few minutes or spend more time studying a difficult seven-by-seven network.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gentle sound effects accompany rotations, locked pieces, undo actions, hints, menu selections, and completed puzzles. The sounds are short and soft, reflecting wooden tools, small chimes, and the warmth of the Moon Rabbit Workshop. Sound can be muted at any time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Visual Design of the Moon Rabbit Workshop<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The visual world uses deep plum skies, dusty lavender clouds, creamy moonlight, warm wood, ivory panels, and moon-gold highlights. The puzzle board resembles a carefully built route-planning table inside the celestial workshop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Round windows reveal the night clouds outside. Small lanterns, shelves, tools, mochi trays, cloth banners, and moon-shaped decorations surround the board without covering the important puzzle elements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Disconnected Moonthreads appear calm and subdued. Once powered, they glow with warm lunar energy, making the path easy to follow. Moonforge Hubs shine strongly, while completed Mochi Parcels become visibly illuminated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The environment is decorative but remains readable. Route shapes, fixed pieces, targets, and connected paths use distinct forms so players do not need to rely only on color.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Responsive Play on Desktop and Mobile<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mochilight Routecraft supports desktop computers, tablets, and smartphones. Players can rotate tiles using a mouse or touchscreen, while the interface scales according to the available screen width and height.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The game uses a landscape layout so the board, HUD, and side controls remain visible together. On smaller portrait screens, the complete landscape stage is scaled and centered instead of being cropped.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pause and sound controls are positioned in the upper-left corner. Fullscreen remains available in the upper-right corner, including while menus or popup screens are open.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fullscreen mode calculates the available width and height before scaling the game. This keeps the stage centered on desktop and mobile devices, even when the browser cannot lock the screen orientation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Restoring the Path Before Dawn<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">At its heart, Mochilight Routecraft is a game about seeing relationships between small pieces. One tile may appear insignificant, yet its orientation can determine whether an entire section of the workshop receives light.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The moon rabbits cannot repair the network through strength alone. Their tools may build the channels, but restoring the route requires someone who can see how every corner, branch, and junction belongs to a larger pattern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each solved level relights another section of the workshop. Lanterns glow again, Mochi Parcels are sealed, cloud bridges regain their markers, and the rabbits return to their work. The journey from the first simple route to the final complex weave represents the player\u2019s growth from a new apprentice into the workshop\u2019s master routekeeper.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rotate the Moonthreads, connect every Mochi Parcel, guide creamy light from the Moonforge Hubs, and rebuild all fifty celestial routes before the final stars disappear into morning.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mochilight Routecraft is a cozy route-rotation puzzle game set inside the Moon Rabbit Workshop, a hidden celestial workshop floating above the night clouds. Players must rotate handcrafted route tiles to guide streams of creamy moonlight from glowing Moonforge Hubs toward waiting Mochi Parcels. Every completed connection restores another part of the workshop, delivers precious lunar &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-93","post","type-post","status-publish","format-standard","hentry","category-puzzle"],"_links":{"self":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/93","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=93"}],"version-history":[{"count":0,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/93\/revisions"}],"wp:attachment":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=93"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=93"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=93"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}