{"id":119,"date":"2026-10-09T00:28:36","date_gmt":"2026-10-09T00:28:36","guid":{"rendered":"https:\/\/apk.produsenpagarbrc.com\/?p=119"},"modified":"2026-10-09T00:28:36","modified_gmt":"2026-10-09T00:28:36","slug":"mochi-mooncell","status":"publish","type":"post","link":"https:\/\/play.produsenpagarbrc.com\/?p=119","title":{"rendered":"Mochi Mooncell"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Mochi Mooncell<\/strong> is a cozy FreeCell card game set inside a dreamy moon rabbit workshop above the night clouds. Under soft creamy moonlight, magical cards are arranged on a warm wooden table, decorated with moon rabbits, mochi cakes, night clouds, and tiny wooden mallets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your goal is to move every card into the foundations from Ace to King by suit. Use the free cells wisely, arrange tableau cards in descending order with alternating colors, and plan each move carefully so the whole moonlit table can slowly open.<\/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\/Mochi-Mooncell-1024x768.png\" alt=\"\" class=\"wp-image-120\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">A Cozy FreeCell Game With Moon Rabbit Charm<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mochi Mooncell<\/strong> keeps the classic FreeCell strategy you already know, but wraps it in a gentle fantasy atmosphere. Instead of ordinary suits, the cards carry soft workshop symbols inspired by the moon rabbits&#8217; little world: glowing rabbits, sweet mochi, drifting clouds, and handmade wooden tools.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every card movement feels like organizing a quiet lunar craft table. Some moves are simple, some need patience, and some require you to think several steps ahead. The free cells can help you escape tight situations, but using them carelessly can make the board harder to solve.<\/p>\n\n\n\n<style>\n\/* Mochi Mooncell - Moon Rabbit Workshop visual skin\n   Mechanics remain FreeCell: tableau, free cells, foundations, drag\/tap, undo, hint, pause, sound, fullscreen. Relaxed empty-tableau movement is enabled: any valid ordered stack can move into an empty tableau column. *\/\n#vrf-freecell{\n  --vrf-card-w:86px;\n  --vrf-card-h:116px;\n  --moon-ink:#2f203d;\n  --moon-deep:#23142f;\n  --moon-plum:#3d254f;\n  --moon-violet:#5a3f78;\n  --moon-lav:#8b78b8;\n  --moon-cloud:#cfd1ff;\n  --moon-cream:#fff1c9;\n  --moon-paper:#fff8e7;\n  --moon-gold:#f4c542;\n  --moon-wood:#7b5236;\n  --moon-rose:#e58e96;\n  --moon-mochi:#d9a95b;\n  --moon-outline:rgba(244,197,66,.45);\n  width:min(100%,1100px);\n  aspect-ratio:16\/9;\n  margin:18px auto;\n  position:relative;\n  overflow:hidden;\n  border-radius:24px;\n  background:\n    radial-gradient(circle at 78% 9%, rgba(255,241,201,.52), transparent 18%),\n    radial-gradient(circle at 18% 16%, rgba(207,209,255,.20), transparent 24%),\n    radial-gradient(circle at 14% 88%, rgba(123,82,54,.28), transparent 38%),\n    linear-gradient(155deg,#23142f 0%,#39244d 38%,#57406e 70%,#2b1838 100%);\n  box-shadow:0 24px 70px rgba(31,18,42,.42);\n  user-select:none;\n  -webkit-user-select:none;\n  touch-action:none;\n  overscroll-behavior:none;\n  font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;\n  color:var(--moon-cream);\n}\n#vrf-freecell,\n#vrf-freecell *{box-sizing:border-box}\n#vrf-freecell:fullscreen,\n#vrf-freecell.vrf-is-fullscreen{\n  width:100vw !important;\n  height:100vh !important;\n  max-width:none !important;\n  margin:0 !important;\n  border-radius:0 !important;\n  background:#23142f;\n}\n#vrf-freecell .vrf-fit{\n  position:absolute;\n  width:1280px;\n  height:720px;\n  left:0;\n  top:0;\n  transform-origin:0 0;\n  overflow:hidden;\n  border-radius:24px;\n  background:\n    radial-gradient(circle at 78% 10%, rgba(255,241,201,.50), transparent 18%),\n    radial-gradient(circle at 16% 18%, rgba(207,209,255,.18), transparent 22%),\n    radial-gradient(circle at 86% 84%, rgba(123,82,54,.22), transparent 31%),\n    linear-gradient(155deg,#23142f 0%,#39244d 38%,#57406e 72%,#2b1838 100%);\n}\n#vrf-freecell.vrf-is-fullscreen .vrf-fit{border-radius:0}\n#vrf-freecell .vrf-fit::before{\n  content:\"\";\n  position:absolute;\n  inset:-80px;\n  pointer-events:none;\n  opacity:.92;\n  background:\n    radial-gradient(circle at 11% 28%, rgba(255,241,201,.15) 0 2px, transparent 3px),\n    radial-gradient(circle at 22% 65%, rgba(207,209,255,.13) 0 2px, transparent 3px),\n    radial-gradient(circle at 43% 26%, rgba(255,248,231,.10) 0 2px, transparent 3px),\n    radial-gradient(circle at 70% 34%, rgba(244,197,66,.14) 0 2px, transparent 3px),\n    radial-gradient(circle at 88% 68%, rgba(207,209,255,.12) 0 3px, transparent 4px),\n    radial-gradient(ellipse at 80% 14%, rgba(255,241,201,.24), transparent 30%),\n    radial-gradient(ellipse at 16% 82%, rgba(123,82,54,.18), transparent 34%),\n    linear-gradient(104deg, rgba(255,241,201,.10), transparent 26%),\n    linear-gradient(75deg, rgba(207,209,255,.07), transparent 38%);\n}\n#vrf-freecell .vrf-fit::after{\n  content:\"\";\n  position:absolute;\n  inset:0;\n  pointer-events:none;\n  background:\n    radial-gradient(circle at 50% 54%, transparent 0 58%, rgba(24,12,36,.34) 100%),\n    linear-gradient(180deg, rgba(255,241,201,.045), transparent 28%);\n}\n#vrf-freecell .vrf-table-glow{\n  position:absolute;\n  left:166px;\n  top:72px;\n  width:948px;\n  height:568px;\n  border-radius:36px;\n  background:\n    radial-gradient(circle at 30% 16%, rgba(255,241,201,.095), transparent 31%),\n    radial-gradient(circle at 76% 84%, rgba(244,197,66,.10), transparent 31%),\n    linear-gradient(135deg, rgba(48,31,65,.72), rgba(123,82,54,.20));\n  border:1.45px solid rgba(244,197,66,.45);\n  box-shadow:\n    inset 0 0 0 1px rgba(255,241,201,.045),\n    inset 0 0 56px rgba(255,241,201,.035),\n    inset 0 -32px 62px rgba(25,13,34,.24),\n    0 28px 76px rgba(22,12,32,.31);\n  pointer-events:none;\n}\n#vrf-freecell .vrf-table-glow::before{\n  content:\"\";\n  position:absolute;\n  inset:16px;\n  border-radius:28px;\n  border:1.35px solid rgba(244,197,66,.24);\n  background:\n    linear-gradient(112deg, rgba(255,241,201,.060), transparent 30%),\n    radial-gradient(circle at 52% 42%, rgba(139,120,184,.10), transparent 46%);\n}\n#vrf-freecell .vrf-table-glow::after{\n  content:\"\";\n  position:absolute;\n  inset:30px 38px;\n  border-radius:22px;\n  opacity:.23;\n  pointer-events:none;\n  background:\n    radial-gradient(circle at 8px 8px, rgba(255,241,201,.15) 0 2px, transparent 3px),\n    linear-gradient(30deg, transparent 0 24%, rgba(207,209,255,.075) 24.4% 25%, transparent 25.4% 49%, rgba(244,197,66,.065) 49.4% 50%, transparent 50.4% 74%, rgba(207,209,255,.075) 74.4% 75%, transparent 75.4%),\n    linear-gradient(150deg, transparent 0 24%, rgba(207,209,255,.070) 24.4% 25%, transparent 25.4% 49%, rgba(244,197,66,.060) 49.4% 50%, transparent 50.4% 74%, rgba(207,209,255,.070) 74.4% 75%, transparent 75.4%);\n  background-size:54px 54px;\n}\n#vrf-freecell .vrf-ornament{\n  position:absolute;\n  pointer-events:none;\n  opacity:.20;\n}\n#vrf-freecell .vrf-ornament.left{\n  left:42px;\n  bottom:62px;\n  width:160px;\n  height:236px;\n  border-left:2px solid rgba(244,197,66,.30);\n  border-bottom:2px solid rgba(244,197,66,.14);\n  border-radius:0 0 0 94px;\n  transform:rotate(-8deg);\n}\n#vrf-freecell .vrf-ornament.right{\n  right:46px;\n  bottom:58px;\n  width:160px;\n  height:236px;\n  border-right:2px solid rgba(244,197,66,.28);\n  border-bottom:2px solid rgba(244,197,66,.14);\n  border-radius:0 0 94px 0;\n  transform:rotate(8deg);\n}\n#vrf-freecell .vrf-ornament.left::before,\n#vrf-freecell .vrf-ornament.left::after,\n#vrf-freecell .vrf-ornament.right::before,\n#vrf-freecell .vrf-ornament.right::after{\n  content:\"\";\n  position:absolute;\n  width:56px;\n  height:17px;\n  border-radius:999px 999px 999px 20px;\n  background:rgba(207,209,255,.10);\n  border:1px solid rgba(255,241,201,.09);\n}\n#vrf-freecell .vrf-ornament.left::before{left:18px;top:44px;transform:rotate(32deg)}\n#vrf-freecell .vrf-ornament.left::after{left:-8px;top:116px;transform:rotate(-26deg)}\n#vrf-freecell .vrf-ornament.right::before{right:20px;top:50px;transform:rotate(-34deg)}\n#vrf-freecell .vrf-ornament.right::after{right:-8px;top:126px;transform:rotate(24deg)}\n#vrf-freecell button{font:inherit;-webkit-tap-highlight-color:transparent}\n#vrf-freecell .vrf-icon{\n  position:absolute;\n  z-index:280;\n  top:18px;\n  width:48px;\n  height:48px;\n  border:1.45px solid rgba(244,197,66,.48);\n  border-radius:17px;\n  background:\n    radial-gradient(circle at 34% 24%, rgba(255,241,201,.20), transparent 33%),\n    linear-gradient(180deg, rgba(72,45,90,.78), rgba(35,20,47,.66));\n  color:var(--moon-cream);\n  box-shadow:0 11px 24px rgba(26,13,38,.28), inset 0 1px 0 rgba(255,241,201,.13);\n  cursor:pointer;\n  display:grid;\n  place-items:center;\n  transition:transform .12s ease, background .12s ease, border-color .12s ease, opacity .14s ease, visibility .14s ease;\n}\n#vrf-freecell .vrf-icon:hover{\n  transform:translateY(-1px);\n  background:\n    radial-gradient(circle at 34% 24%, rgba(255,241,201,.26), transparent 33%),\n    linear-gradient(180deg, rgba(91,63,120,.84), rgba(60,37,80,.72));\n  border-color:rgba(255,241,201,.45);\n  box-shadow:0 0 0 3px rgba(244,197,66,.10),0 12px 26px rgba(26,13,38,.31),inset 0 1px 0 rgba(255,241,201,.14);\n}\n#vrf-freecell .vrf-icon:active{transform:scale(.94)}\n#vrf-freecell .vrf-mute{left:78px;display:none}\n#vrf-freecell .vrf-pause{left:22px;display:none}\n#vrf-freecell.vrf-game-active .vrf-mute,\n#vrf-freecell.vrf-game-active .vrf-pause{display:grid}\n#vrf-freecell.vrf-paused .vrf-mute,\n#vrf-freecell.vrf-paused .vrf-pause{opacity:0;visibility:hidden;pointer-events:none}\n#vrf-freecell .vrf-fullscreen{right:22px;display:grid}\n#vrf-freecell .vrf-sound-symbol{position:relative;width:31px;height:28px;display:block;transform:scale(.86) translateX(-1px);transform-origin:center;color:currentColor}\n#vrf-freecell .vrf-sound-box{position:absolute;left:1px;top:10px;width:8px;height:9px;border-radius:3px 0 0 3px;background:currentColor}\n#vrf-freecell .vrf-sound-box::after{content:\"\";position:absolute;left:7px;top:-8px;width:18px;height:25px;background:currentColor;clip-path:polygon(0 35%,100% 0,100% 100%,0 65%);border-radius:3px}\n#vrf-freecell .vrf-sound-wave{position:absolute;display:block;background:transparent;border-style:solid;border-color:currentColor;border-left-color:transparent;border-top-color:transparent;border-bottom-color:transparent;border-radius:0 999px 999px 0;opacity:1;transition:opacity .14s ease}\n#vrf-freecell .vrf-sound-wave.w1{left:19px;top:10px;width:6px;height:9px;border-width:3px}\n#vrf-freecell .vrf-sound-wave.w2{left:22px;top:6px;width:11px;height:17px;border-width:3px}\n#vrf-freecell .vrf-sound-wave.w3{left:25px;top:2px;width:16px;height:25px;border-width:3px;opacity:.92}\n#vrf-freecell.vrf-muted .vrf-sound-wave{opacity:0}\n#vrf-freecell .vrf-sound-slash{position:absolute;left:2px;top:13px;width:32px;height:3.5px;border-radius:999px;background:#d96f6f;transform:rotate(45deg) scaleX(0);transform-origin:center;box-shadow:0 1px 0 rgba(33,19,46,.18),0 0 8px rgba(217,111,111,.32);transition:transform .14s ease}\n#vrf-freecell.vrf-muted .vrf-sound-slash{transform:rotate(45deg) scaleX(1)}\n#vrf-freecell .vrf-pause-symbol{position:relative;width:22px;height:22px;display:block}\n#vrf-freecell .vrf-pause-symbol::before,\n#vrf-freecell .vrf-pause-symbol::after{content:\"\";position:absolute;top:3px;width:6px;height:16px;border-radius:3px;background:currentColor;box-shadow:0 1px 0 rgba(0,0,0,.16)}\n#vrf-freecell .vrf-pause-symbol::before{left:4px}\n#vrf-freecell .vrf-pause-symbol::after{right:4px}\n#vrf-freecell.vrf-paused .vrf-pause-symbol::before{left:6px;top:3px;width:0;height:0;border-top:8px solid transparent;border-bottom:8px solid transparent;border-left:13px solid var(--moon-violet);border-radius:0;background:transparent;box-shadow:none}\n#vrf-freecell.vrf-paused .vrf-pause-symbol::after{display:none}\n#vrf-freecell .vrf-full-symbol{position:relative;width:30px;height:30px;display:block}\n#vrf-freecell .vrf-full-symbol::before{content:\"\";position:absolute;inset:2px;background:linear-gradient(currentColor,currentColor) left top \/ 12px 4px no-repeat,linear-gradient(currentColor,currentColor) left top \/ 4px 12px no-repeat,linear-gradient(currentColor,currentColor) right top \/ 12px 4px no-repeat,linear-gradient(currentColor,currentColor) right top \/ 4px 12px no-repeat,linear-gradient(currentColor,currentColor) left bottom \/ 12px 4px no-repeat,linear-gradient(currentColor,currentColor) left bottom \/ 4px 12px no-repeat,linear-gradient(currentColor,currentColor) right bottom \/ 12px 4px no-repeat,linear-gradient(currentColor,currentColor) right bottom \/ 4px 12px no-repeat}\n#vrf-freecell .vrf-stats{\n  position:absolute;\n  top:18px;\n  left:50%;\n  transform:translateX(-50%);\n  z-index:82;\n  height:48px;\n  min-width:392px;\n  padding:6px 12px;\n  border-radius:999px;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  gap:8px;\n  background:\n    radial-gradient(circle at 24% 20%, rgba(255,241,201,.16), transparent 34%),\n    linear-gradient(180deg, rgba(77,48,98,.76), rgba(34,20,46,.62)),\n    linear-gradient(90deg, rgba(244,197,66,.16), rgba(207,209,255,.08));\n  border:1.45px solid rgba(244,197,66,.44);\n  box-shadow:0 15px 32px rgba(25,12,36,.24), inset 0 1px 0 rgba(255,241,201,.12), inset 0 -10px 18px rgba(24,13,34,.20);\n}\n#vrf-freecell .vrf-stat{\n  min-width:106px;\n  height:32px;\n  padding:0 12px;\n  border-radius:999px;\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  gap:6px;\n  background:linear-gradient(180deg, rgba(255,241,201,.14), rgba(77,48,98,.14));\n  border:1px solid rgba(255,241,201,.12);\n  color:rgba(255,241,201,.78);\n  font-size:13px;\n  font-weight:850;\n  letter-spacing:.02em;\n}\n#vrf-freecell .vrf-stat b{color:#fff8df;font-size:15px;font-weight:950;min-width:22px;text-align:right}\n#vrf-freecell .vrf-label{\n  position:absolute;\n  z-index:8;\n  top:78px;\n  height:24px;\n  line-height:24px;\n  padding:0 14px;\n  min-width:128px;\n  border-radius:999px;\n  text-align:center;\n  color:var(--moon-cream);\n  background:\n    radial-gradient(circle at 30% 12%, rgba(255,241,201,.16), transparent 32%),\n    linear-gradient(180deg,#5c3e76 0%,#3d254f 100%);\n  border:1.35px solid rgba(244,197,66,.52);\n  box-shadow:inset 0 1px 0 rgba(255,241,201,.13),0 8px 18px rgba(25,13,34,.20);\n  font-size:12px;\n  font-weight:900;\n  letter-spacing:.09em;\n  text-transform:uppercase;\n}\n#vrf-freecell .vrf-label.free{left:436px;transform:translateX(-50%)}\n#vrf-freecell .vrf-label.foundation{left:844px;transform:translateX(-50%)}\n#vrf-freecell .vrf-label .vrf-label-text{display:inline-block;transform:translateY(-1.5px)}\n#vrf-freecell .vrf-layer{position:absolute;inset:0;z-index:20;pointer-events:auto;touch-action:none}\n#vrf-freecell .vrf-slots,\n#vrf-freecell .vrf-columns{position:absolute;inset:0;z-index:14;pointer-events:none}\n#vrf-freecell .vrf-slot,\n#vrf-freecell .vrf-column-zone{position:absolute;border-radius:16px;pointer-events:none;touch-action:none}\n#vrf-freecell .vrf-slot{\n  width:calc(var(--vrf-card-w) + 10px);\n  height:var(--vrf-card-h);\n  transform:translateX(-5px);\n  border:1.35px solid rgba(244,197,66,.42);\n  background:\n    radial-gradient(circle at 50% 22%, rgba(255,241,201,.10), transparent 36%),\n    linear-gradient(180deg,#5d4c78 0%,#4b3a65 50%,#31223f 100%);\n  box-shadow:inset 0 1px 0 rgba(255,241,201,.12), inset 0 -12px 22px rgba(24,13,34,.17), 0 8px 18px rgba(24,13,34,.13);\n}\n#vrf-freecell .vrf-slot::before{content:\"\";position:absolute;inset:10px;border-radius:13px;border:1px dashed rgba(255,241,201,.16);background:linear-gradient(180deg,rgba(255,241,201,.040),rgba(255,241,201,0))}\n#vrf-freecell .vrf-column-zone{\n  width:calc(var(--vrf-card-w) + 10px);\n  height:372px;\n  transform:translateX(-5px);\n  border:1.35px solid rgba(244,197,66,.20);\n  background:linear-gradient(180deg, rgba(255,241,201,.024), rgba(24,13,34,.045));\n  box-shadow:inset 0 0 0 1px rgba(255,241,201,.012);\n}\n#vrf-freecell .vrf-slot.vrf-valid,\n#vrf-freecell .vrf-column-zone.vrf-valid{\n  border:1.35px solid rgba(244,197,66,.82);\n  background:\n    radial-gradient(circle at 50% 22%, rgba(255,248,223,.18), transparent 42%),\n    linear-gradient(180deg, rgba(139,120,184,.82), rgba(123,82,54,.54));\n  box-shadow:0 0 0 3px rgba(244,197,66,.12),0 0 25px rgba(244,197,66,.28);\n}\n#vrf-freecell .vrf-slot.vrf-hint-target,\n#vrf-freecell .vrf-column-zone.vrf-hint-target{box-shadow:0 0 0 4px rgba(255,241,201,.15),0 0 32px rgba(244,197,66,.36)}\n#vrf-freecell .vrf-card{\n  position:absolute;\n  width:var(--vrf-card-w);\n  height:var(--vrf-card-h);\n  border-radius:15px;\n  background:\n    radial-gradient(circle at 50% 0%, rgba(255,255,255,.82), transparent 56%),\n    linear-gradient(155deg,#fffdf0 0%,#fff8df 48%,#e7d4b4 100%);\n  border:1px solid rgba(70,45,89,.32);\n  box-shadow:0 12px 22px rgba(24,13,34,.26), inset 0 0 0 1px rgba(255,255,255,.50);\n  color:var(--moon-ink);\n  overflow:hidden;\n  pointer-events:auto;\n  cursor:grab;\n  touch-action:none;\n  transition:box-shadow .10s ease, transform .10s ease;\n}\n#vrf-freecell .vrf-card::before{content:\"\";position:absolute;inset:5px;border-radius:12px;border:1px solid rgba(139,120,184,.22);pointer-events:none}\n#vrf-freecell .vrf-card::after{content:\"\";position:absolute;left:13px;right:13px;top:51%;height:1px;transform:translateY(-50%);background:linear-gradient(90deg,transparent,rgba(70,45,89,.11),transparent);pointer-events:none}\n#vrf-freecell .vrf-card.red,\n#vrf-freecell .vrf-card.black{color:var(--moon-ink)}\n#vrf-freecell .vrf-card.suit-H{color:var(--moon-rose)}\n#vrf-freecell .vrf-card.suit-D{color:var(--moon-mochi)}\n#vrf-freecell .vrf-card.suit-C{color:#7d78c7}\n#vrf-freecell .vrf-card.suit-S{color:var(--moon-wood)}\n#vrf-freecell .vrf-card.vrf-selected{box-shadow:0 0 0 3px rgba(244,197,66,.55),0 17px 28px rgba(24,13,34,.28),0 0 22px rgba(244,197,66,.28);transform:translateY(-3px)}\n#vrf-freecell .vrf-card.vrf-dimmed{visibility:hidden}\n#vrf-freecell .vrf-card.vrf-hint-source{box-shadow:0 0 0 4px rgba(244,197,66,.28),0 18px 30px rgba(24,13,34,.24)}\n#vrf-freecell .vrf-card.foundation-card{cursor:default}\n#vrf-freecell .vrf-corner{position:absolute;left:4px;top:6px;width:30px;text-align:center;font-weight:950;line-height:.88;font-size:17px;letter-spacing:-.045em;display:flex;flex-direction:column;align-items:center;gap:2px;color:currentColor}\n#vrf-freecell .vrf-corner.bottom{left:auto;top:auto;right:4px;bottom:6px;transform:rotate(180deg)}\n#vrf-freecell .vrf-corner .suit-small{width:19px;height:19px;display:grid;place-items:center;margin-top:0;font-size:0;line-height:1}\n#vrf-freecell .vrf-center-suit{position:absolute;inset:0;display:grid;place-items:center;font-size:0;opacity:.92;filter:drop-shadow(0 1px 0 rgba(255,255,255,.38))}\n#vrf-freecell .vrf-suit-shape{position:relative;display:block;color:currentColor;width:46px;height:46px}\n#vrf-freecell .vrf-suit-shape.small{width:17px;height:17px}\n#vrf-freecell .vrf-suit-moon-rabbit{border-radius:50%;background:currentColor;box-shadow:inset -5px -6px 0 rgba(68,39,86,.10),0 0 14px rgba(229,142,150,.15)}\n#vrf-freecell .vrf-suit-moon-rabbit::before{content:\"\";position:absolute;left:9px;top:-17px;width:10px;height:26px;border-radius:999px;background:currentColor;box-shadow:18px 0 0 currentColor;transform:rotate(-4deg)}\n#vrf-freecell .vrf-suit-moon-rabbit::after{content:\"\";position:absolute;left:13px;top:19px;width:5px;height:5px;border-radius:50%;background:rgba(255,248,223,.76);box-shadow:14px 0 0 rgba(255,248,223,.76),7px 10px 0 -1px rgba(255,248,223,.55)}\n#vrf-freecell .vrf-suit-moon-rabbit.small::before{left:3px;top:-6px;width:4px;height:10px;box-shadow:7px 0 0 currentColor}\n#vrf-freecell .vrf-suit-moon-rabbit.small::after{left:5px;top:7px;width:2px;height:2px;box-shadow:5px 0 0 rgba(255,248,223,.76)}\n#vrf-freecell .vrf-suit-mochi-cake{width:42px;height:34px;margin-top:6px;border-radius:50% 50% 44% 44%;background:currentColor;box-shadow:inset 6px 6px 0 rgba(255,248,223,.24),inset -4px -5px 0 rgba(47,32,61,.10),0 0 14px rgba(244,197,66,.18)}\n#vrf-freecell .vrf-suit-mochi-cake::before{content:\"\";position:absolute;left:9px;top:8px;width:9px;height:9px;border-radius:50%;background:rgba(255,248,223,.68)}\n#vrf-freecell .vrf-suit-mochi-cake::after{content:\"\";position:absolute;right:-3px;bottom:-4px;width:18px;height:10px;border-radius:999px 999px 0 999px;background:#7e8c5b;transform:rotate(-18deg)}\n#vrf-freecell .vrf-suit-mochi-cake.small{width:16px;height:13px;margin-top:2px}\n#vrf-freecell .vrf-suit-mochi-cake.small::before{left:3px;top:3px;width:3px;height:3px}\n#vrf-freecell .vrf-suit-mochi-cake.small::after{right:-2px;bottom:-2px;width:7px;height:4px}\n#vrf-freecell .vrf-suit-night-cloud{background:radial-gradient(circle at 33% 58%,currentColor 0 26%,transparent 27%),radial-gradient(circle at 52% 38%,currentColor 0 33%,transparent 34%),radial-gradient(circle at 72% 60%,currentColor 0 28%,transparent 29%),linear-gradient(currentColor,currentColor) 20% 58% \/ 64% 32% no-repeat;border-radius:40%}\n#vrf-freecell .vrf-suit-night-cloud::before{content:\"\";position:absolute;right:5px;top:6px;width:13px;height:13px;border-radius:50%;box-shadow:-4px 0 0 0 rgba(255,248,223,.72);background:transparent}\n#vrf-freecell .vrf-suit-night-cloud::after{content:\"\";position:absolute;left:14px;bottom:7px;width:5px;height:5px;border-radius:50%;background:rgba(255,248,223,.55);box-shadow:12px -2px 0 -1px rgba(255,248,223,.50)}\n#vrf-freecell .vrf-suit-night-cloud.small::before{right:2px;top:2px;width:5px;height:5px;box-shadow:-2px 0 0 0 rgba(255,248,223,.72)}\n#vrf-freecell .vrf-suit-night-cloud.small::after{display:none}\n#vrf-freecell .vrf-suit-wooden-mallet{width:46px;height:46px;background:none}\n#vrf-freecell .vrf-suit-wooden-mallet::before{content:\"\";position:absolute;left:5px;top:8px;width:28px;height:16px;border-radius:6px;background:currentColor;transform:rotate(-34deg);box-shadow:inset -4px -4px 0 rgba(47,32,61,.12),0 0 13px rgba(123,82,54,.18)}\n#vrf-freecell .vrf-suit-wooden-mallet::after{content:\"\";position:absolute;left:23px;top:19px;width:9px;height:28px;border-radius:999px;background:currentColor;transform:rotate(-34deg);box-shadow:inset -3px -3px 0 rgba(47,32,61,.12)}\n#vrf-freecell .vrf-suit-wooden-mallet.small::before{left:2px;top:3px;width:11px;height:6px;border-radius:3px}\n#vrf-freecell .vrf-suit-wooden-mallet.small::after{left:9px;top:8px;width:4px;height:11px}\n#vrf-freecell .vrf-ghost{position:absolute;inset:0;z-index:120;pointer-events:none}\n#vrf-freecell .vrf-ghost .vrf-card{pointer-events:none;visibility:visible;box-shadow:0 22px 38px rgba(24,13,34,.35),0 0 0 2px rgba(244,197,66,.36)}\n#vrf-freecell .vrf-status{\n  position:absolute;\n  left:50%;\n  bottom:82px;\n  transform:translateX(-50%);\n  min-width:360px;\n  max-width:700px;\n  height:34px;\n  z-index:86;\n  padding:0 18px;\n  border-radius:999px;\n  background:\n    radial-gradient(circle at 34% 10%, rgba(255,241,201,.18), transparent 38%),\n    linear-gradient(180deg,#5c3e76 0%,#3d254f 100%);\n  border:1.35px solid rgba(244,197,66,.46);\n  color:var(--moon-cream);\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  font-size:13px;\n  letter-spacing:.01em;\n  box-shadow:inset 0 1px 0 rgba(255,241,201,.13),0 8px 18px rgba(24,13,34,.20);\n  pointer-events:none;\n  text-align:center;\n}\n#vrf-freecell .vrf-bottom-controls{position:absolute;left:50%;bottom:24px;transform:translateX(-50%);z-index:90;display:flex;gap:10px;align-items:center;justify-content:center}\n#vrf-freecell .vrf-pill{height:40px;min-width:104px;padding:0 18px;border-radius:999px;border:1px solid rgba(255,241,201,.60);color:#fff8df;font-size:14px;font-weight:800;letter-spacing:.01em;text-shadow:0 1px 0 rgba(47,32,61,.22);box-shadow:inset 0 1px 0 rgba(255,255,255,.30),inset 0 -8px 14px rgba(47,32,61,.12),0 9px 18px rgba(24,13,34,.24);cursor:pointer;transition:transform .12s ease,box-shadow .12s ease,opacity .12s ease}\n#vrf-freecell .vrf-pill:hover{transform:translateY(-1px);box-shadow:inset 0 1px 0 rgba(255,255,255,.36),inset 0 -8px 14px rgba(47,32,61,.12),0 12px 22px rgba(24,13,34,.28),0 0 0 3px rgba(244,197,66,.08)}\n#vrf-freecell .vrf-pill:active{transform:translateY(1px) scale(.985)}\n#vrf-freecell .vrf-pill:disabled{opacity:.48;cursor:default;transform:none;box-shadow:inset 0 1px 0 rgba(255,255,255,.22),0 7px 14px rgba(24,13,34,.16)}\n#vrf-freecell #vrfNewDeal{background:linear-gradient(180deg,#f4c542 0%,#c28a34 100%);color:#fff8df}\n#vrf-freecell #vrfRestart{background:linear-gradient(180deg,#8b78b8 0%,#5b467b 100%);color:#fff8df}\n#vrf-freecell #vrfUndo{background:linear-gradient(180deg,#7b5236 0%,#5c3827 100%);color:#fff8df}\n#vrf-freecell #vrfHint{background:linear-gradient(180deg,#fff8df 0%,#e8d2a7 100%);border-color:rgba(255,255,255,.78);color:#39244d;text-shadow:none}\n#vrf-freecell .vrf-overlay{position:absolute;inset:0;z-index:180;display:none;align-items:center;justify-content:center;background:rgba(24,13,34,.58);backdrop-filter:blur(7px)}\n#vrf-freecell .vrf-overlay.active{display:flex}\n#vrf-freecell .vrf-popup{width:430px;max-width:calc(100% - 48px);min-height:276px;position:relative;border-radius:28px;padding:34px 34px 28px;background:radial-gradient(circle at 80% 0%, rgba(244,197,66,.24), transparent 38%),radial-gradient(circle at 18% 20%, rgba(255,241,201,.32), transparent 34%),linear-gradient(145deg, rgba(255,248,223,.98), rgba(224,211,245,.92));border:1px solid rgba(255,255,255,.60);box-shadow:0 32px 82px rgba(24,13,34,.40), inset 0 0 0 1px rgba(255,255,255,.18);text-align:center;overflow:hidden}\n#vrf-freecell .vrf-popup::before,\n#vrf-freecell .vrf-popup::after{content:\"\";position:absolute;width:156px;height:156px;border-radius:50%;border:1px solid rgba(47,32,61,.10);pointer-events:none}\n#vrf-freecell .vrf-popup::before{left:-86px;top:-86px}\n#vrf-freecell .vrf-popup::after{right:-74px;bottom:-92px}\n#vrf-freecell .vrf-start-main,\n#vrf-freecell .vrf-win-main{position:relative;z-index:2}\n#vrf-freecell #vrfStartOverlay .vrf-start-main,\n#vrf-freecell #vrfPauseOverlay .vrf-start-main{min-height:210px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px}\n#vrf-freecell .vrf-lantern-mark{position:relative;width:60px;height:60px;margin:0 auto -2px;border-radius:50%;background:radial-gradient(circle at 50% 50%, #fff8df 0 12px, #f4c542 13px 23px, #8b78b8 24px 100%);border:2px solid rgba(47,32,61,.23);box-shadow:0 0 28px rgba(244,197,66,.38),0 10px 24px rgba(47,32,61,.18),inset 0 0 0 1px rgba(255,241,201,.20)}\n#vrf-freecell .vrf-lantern-mark::before{content:\"\";position:absolute;left:16px;top:18px;width:10px;height:20px;border-radius:999px;background:#e58e96;box-shadow:18px 0 0 #e58e96;transform:rotate(-4deg)}\n#vrf-freecell .vrf-lantern-mark::after{content:\"\";position:absolute;left:17px;top:30px;width:26px;height:18px;border-radius:50%;background:#fff8df;box-shadow:inset -3px -4px 0 rgba(47,32,61,.08)}\n#vrf-freecell .vrf-start-title{margin:0;color:#39244d;font-size:27px;line-height:1.1;font-weight:950;letter-spacing:-.03em}\n#vrf-freecell .vrf-start-btn,\n#vrf-freecell .vrf-win-btn{width:210px;height:52px;border:1px solid rgba(255,255,255,.55);border-radius:999px;color:#39244d;background:linear-gradient(180deg,#fff8df,#f4c542);font-weight:950;font-size:16px;cursor:pointer;box-shadow:0 16px 34px rgba(47,32,61,.22);transition:transform .12s ease, filter .12s ease;text-shadow:none}\n#vrf-freecell .vrf-start-btn:hover,\n#vrf-freecell .vrf-win-btn:hover{transform:translateY(-2px);filter:brightness(1.04)}\n#vrf-freecell .vrf-difficulty{display:flex;gap:9px;justify-content:center;align-items:center}\n#vrf-freecell .vrf-diff-btn{min-width:86px;height:38px;border-radius:999px;border:1px solid rgba(47,32,61,.16);background:rgba(255,255,255,.38);color:rgba(47,32,61,.74);font-size:13px;font-weight:850;cursor:pointer;transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,transform .12s ease}\n#vrf-freecell .vrf-diff-btn:hover{transform:translateY(-1px);border-color:rgba(47,32,61,.28);background:rgba(255,248,223,.58)}\n#vrf-freecell .vrf-diff-btn.active{color:#39244d;background:linear-gradient(180deg,#fff8df,#f4c542);border-color:rgba(255,255,255,.55);box-shadow:0 0 0 3px rgba(244,197,66,.16),0 0 18px rgba(244,197,66,.18)}\n#vrf-freecell .vrf-help{color:rgba(47,32,61,.76);line-height:1.48;font-size:13px;text-align:center;margin:0;max-width:335px}\n#vrf-freecell .vrf-win-title{margin:0 0 8px;color:#39244d;font-size:25px;letter-spacing:-.02em}\n#vrf-freecell .vrf-win-text{margin:0 0 18px;color:rgba(47,32,61,.76);font-size:14px}\n#vrf-freecell .vrf-win-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:9px;margin:18px 0 22px}\n#vrf-freecell .vrf-win-box{border-radius:18px;padding:11px 8px;background:rgba(255,255,255,.38);border:1px solid rgba(47,32,61,.11)}\n#vrf-freecell .vrf-win-box span{display:block;color:rgba(47,32,61,.58);font-size:11px;text-transform:uppercase;letter-spacing:.08em}\n#vrf-freecell .vrf-win-box b{color:#39244d;font-size:18px}\n#vrf-freecell .vrf-rotate-note{position:absolute;inset:0;z-index:250;display:none;place-items:center;padding:24px;background:rgba(24,13,34,.72);color:#fff8df;text-align:center;backdrop-filter:blur(7px)}\n#vrf-freecell.vrf-portrait-fullscreen .vrf-rotate-note{display:grid}\n#vrf-freecell .vrf-rotate-card{width:min(320px,84vw);padding:22px 20px;border-radius:24px;background:rgba(61,37,79,.88);border:1px solid rgba(255,241,201,.24);box-shadow:0 24px 62px rgba(24,13,34,.40)}\n#vrf-freecell .vrf-rotate-card b{display:block;font-size:18px;margin-bottom:7px}\n#vrf-freecell .vrf-rotate-card span{display:block;font-size:13px;line-height:1.45;opacity:.78}\n@media (max-width:720px){\n  #vrf-freecell{width:100%;border-radius:18px}\n  #vrf-freecell .vrf-status{min-width:320px}\n}\n@media (max-height:520px){\n  #vrf-freecell .vrf-sound-symbol{transform:scale(.80) translateX(-1px)}\n}\n\n\/* WordPress compatibility: native fullscreen and fallback, including iOS. *\/\n#vrf-freecell.vrf-fallback-fullscreen{\n  position:fixed !important;\n  inset:0 !important;\n  width:100vw !important;\n  height:100vh !important;\n  height:100dvh !important;\n  max-width:none !important;\n  margin:0 !important;\n  z-index:2147483000 !important;\n  border-radius:0 !important;\n  background:#23142f !important;\n}\n#vrf-freecell .vrf-exit-fullscreen{\n  display:inline-block;\n  margin-top:14px;\n  padding:11px 18px;\n  border-radius:12px;\n  border:1px solid rgba(255,241,201,.65);\n  background:#f4c542;\n  color:#23142f;\n  font:700 14px system-ui,sans-serif;\n  cursor:pointer;\n}\n<\/style>\n\n<div id=\"vrf-freecell\">\n  <div class=\"vrf-fit\" id=\"vrfFit\">\n    <div class=\"vrf-table-glow\"><\/div>\n    <div class=\"vrf-ornament left\"><\/div>\n    <div class=\"vrf-ornament right\"><\/div>\n\n    <button aria-label=\"Sound\" class=\"vrf-icon vrf-mute\" id=\"vrfMute\" type=\"button\">\n      <span aria-hidden=\"true\" class=\"vrf-sound-symbol\">\n        <span class=\"vrf-sound-box\"><\/span>\n        <span class=\"vrf-sound-wave w1\"><\/span>\n        <span class=\"vrf-sound-wave w2\"><\/span>\n        <span class=\"vrf-sound-wave w3\"><\/span>\n        <span class=\"vrf-sound-slash\"><\/span>\n      <\/span>\n    <\/button>\n\n    <button aria-label=\"Pause\" class=\"vrf-icon vrf-pause\" id=\"vrfPause\" type=\"button\">\n      <span aria-hidden=\"true\" class=\"vrf-pause-symbol\"><\/span>\n    <\/button>\n\n    <div aria-live=\"polite\" class=\"vrf-stats\">\n      <span class=\"vrf-stat\">Score <b id=\"vrfScore\">0<\/b><\/span>\n      <span class=\"vrf-stat\">Time <b id=\"vrfTime\">00:00<\/b><\/span>\n      <span class=\"vrf-stat\">Moves <b id=\"vrfMoves\">0<\/b><\/span>\n    <\/div>\n\n    <button aria-label=\"Fullscreen\" class=\"vrf-icon vrf-fullscreen\" id=\"vrfFullscreen\" type=\"button\">\n      <span aria-hidden=\"true\" class=\"vrf-full-symbol\"><\/span>\n    <\/button>\n\n    <div class=\"vrf-label free\"><span class=\"vrf-label-text\">Free Cells<\/span><\/div>\n    <div class=\"vrf-label foundation\"><span class=\"vrf-label-text\">Foundations<\/span><\/div>\n\n    <div class=\"vrf-slots\" id=\"vrfFreeSlots\"><\/div>\n    <div class=\"vrf-slots\" id=\"vrfFoundationSlots\"><\/div>\n    <div class=\"vrf-columns\" id=\"vrfColumnZones\"><\/div>\n    <div class=\"vrf-layer\" id=\"vrfCards\"><\/div>\n    <div class=\"vrf-ghost\" id=\"vrfGhost\"><\/div>\n\n    <div class=\"vrf-status\" id=\"vrfStatus\">Choose a difficulty, then open the moonlit workshop table.<\/div>\n\n    <div class=\"vrf-bottom-controls\">\n      <button class=\"vrf-pill\" id=\"vrfNewDeal\" type=\"button\">New Deal<\/button>\n      <button class=\"vrf-pill\" id=\"vrfRestart\" type=\"button\">Restart<\/button>\n      <button class=\"vrf-pill\" id=\"vrfUndo\" type=\"button\">Undo<\/button>\n      <button class=\"vrf-pill\" id=\"vrfHint\" type=\"button\">Hint<\/button>\n    <\/div>\n\n    <div class=\"vrf-overlay active\" id=\"vrfStartOverlay\">\n      <div class=\"vrf-popup\">\n        <div class=\"vrf-start-main\">\n          <div aria-hidden=\"true\" class=\"vrf-lantern-mark\"><\/div>\n          <h3 class=\"vrf-start-title\">Mochi Mooncell<\/h3>\n          <button class=\"vrf-start-btn\" id=\"vrfStartBtn\" type=\"button\">Begin Mooncraft<\/button>\n          <div aria-label=\"Difficulty\" class=\"vrf-difficulty\">\n            <button class=\"vrf-diff-btn\" data-diff=\"Easy\" type=\"button\">Easy<\/button>\n            <button class=\"vrf-diff-btn active\" data-diff=\"Normal\" type=\"button\">Normal<\/button>\n            <button class=\"vrf-diff-btn\" data-diff=\"Hard\" type=\"button\">Hard<\/button>\n          <\/div>\n          <p class=\"vrf-help\">Build each foundation from Ace to King by suit. Arrange tableau cards in descending order with alternating colors. Empty tableau columns can accept any card or any valid ordered stack under creamy moonlight.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"vrf-overlay\" id=\"vrfPauseOverlay\">\n      <div class=\"vrf-popup\">\n        <div class=\"vrf-start-main\">\n          <div aria-hidden=\"true\" class=\"vrf-lantern-mark\"><\/div>\n          <h3 class=\"vrf-start-title\">Moonlight Pause<\/h3>\n          <button class=\"vrf-start-btn\" id=\"vrfResumeBtn\" type=\"button\">Return to the Workshop<\/button>\n          <p class=\"vrf-help vrf-pause-copy\">The moonlit cards will wait quietly on the workshop table. Take a breath, then return when you are ready.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"vrf-overlay\" id=\"vrfWinOverlay\">\n      <div class=\"vrf-popup\">\n        <div class=\"vrf-win-main\">\n          <div aria-hidden=\"true\" class=\"vrf-lantern-mark\"><\/div>\n          <h3 class=\"vrf-win-title\">The Mooncell Is Complete<\/h3>\n          <p class=\"vrf-win-text\">Every suit has found its moonlit foundation, and the rabbits finish their quiet night craft.<\/p>\n          <div class=\"vrf-win-grid\">\n            <div class=\"vrf-win-box\"><span>Score<\/span><b id=\"vrfWinScore\">0<\/b><\/div>\n            <div class=\"vrf-win-box\"><span>Time<\/span><b id=\"vrfWinTime\">00:00<\/b><\/div>\n            <div class=\"vrf-win-box\"><span>Moves<\/span><b id=\"vrfWinMoves\">0<\/b><\/div>\n          <\/div>\n          <button class=\"vrf-win-btn\" id=\"vrfPlayAgain\" type=\"button\">Play Again<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"vrf-rotate-note\">\n    <div class=\"vrf-rotate-card\">\n      <b>Rotate Your Phone<\/b>\n      <span>Landscape mode gives the Moon Rabbit Workshop table more room and keeps every card easy to read.<\/span>\n      <button class=\"vrf-exit-fullscreen\" type=\"button\">Exit Fullscreen<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  \"use strict\";\n\n  function mooncellAnd(left,right){const value=left();return value?right():value}\n\n  function initializeMochiMooncell(){\n  const root=document.getElementById(\"vrf-freecell\");\n  if(!root || !root.querySelector(\"#vrfCards\")) return false;\n  if(root.dataset.mooncellWpReady===\"1\") return true;\n  root.dataset.mooncellWpReady=\"1\";\n  const fit=document.getElementById(\"vrfFit\");\n  const freeSlotsEl=document.getElementById(\"vrfFreeSlots\");\n  const foundationSlotsEl=document.getElementById(\"vrfFoundationSlots\");\n  const columnZonesEl=document.getElementById(\"vrfColumnZones\");\n  const cardsEl=document.getElementById(\"vrfCards\");\n  const ghostEl=document.getElementById(\"vrfGhost\");\n  const statusEl=document.getElementById(\"vrfStatus\");\n  const startOverlay=document.getElementById(\"vrfStartOverlay\");\n  const pauseOverlay=document.getElementById(\"vrfPauseOverlay\");\n  const winOverlay=document.getElementById(\"vrfWinOverlay\");\n  const scoreEl=document.getElementById(\"vrfScore\");\n  const timeEl=document.getElementById(\"vrfTime\");\n  const movesEl=document.getElementById(\"vrfMoves\");\n  const muteBtn=document.getElementById(\"vrfMute\");\n  const pauseBtn=document.getElementById(\"vrfPause\");\n  const fullscreenBtn=document.getElementById(\"vrfFullscreen\");\n  const startBtn=document.getElementById(\"vrfStartBtn\");\n  const resumeBtn=document.getElementById(\"vrfResumeBtn\");\n  const newDealBtn=document.getElementById(\"vrfNewDeal\");\n  const restartBtn=document.getElementById(\"vrfRestart\");\n  const undoBtn=document.getElementById(\"vrfUndo\");\n  const hintBtn=document.getElementById(\"vrfHint\");\n  const playAgainBtn=document.getElementById(\"vrfPlayAgain\");\n  const winScoreEl=document.getElementById(\"vrfWinScore\");\n  const winTimeEl=document.getElementById(\"vrfWinTime\");\n  const winMovesEl=document.getElementById(\"vrfWinMoves\");\n\n  const BASE_W=1280;\n  const BASE_H=720;\n  const CARD_W=86;\n  const CARD_H=116;\n  const CELL_Y=106;\n  const TABLEAU_Y=246;\n  const MAX_CARD_BOTTOM=626;\n  const SLOT_GAP=18;\n  const COL_GAP=17;\n  const COL_LEFT=Math.round((BASE_W-(8*CARD_W+7*COL_GAP))\/2);\n\n  const SUITS=[\n    {key:\"H\",icon:\"moon-rabbit\",color:\"red\",name:\"Moon Rabbits\"},\n    {key:\"D\",icon:\"mochi-cake\",color:\"red\",name:\"Mochi Cakes\"},\n    {key:\"C\",icon:\"night-cloud\",color:\"black\",name:\"Night Clouds\"},\n    {key:\"S\",icon:\"wooden-mallet\",color:\"black\",name:\"Wooden Mallets\"}\n  ];\n\n  const DIFFICULTY={\n    Easy:{base:7000,timePenalty:1,movePenalty:3,hintPenalty:50,candidates:10,pick:\"easy\"},\n    Normal:{base:10000,timePenalty:2,movePenalty:5,hintPenalty:100,candidates:8,pick:\"normal\"},\n    Hard:{base:13000,timePenalty:3,movePenalty:8,hintPenalty:200,candidates:12,pick:\"hard\"}\n  };\n\n  function mooncellStorageGet(key){\n    try{return window.localStorage.getItem(key)}catch(err){return null}\n  }\n  function mooncellStorageSet(key,value){\n    try{window.localStorage.setItem(key,value)}catch(err){}\n  }\n\n  const state={\n    started:false,\n    won:false,\n    paused:false,\n    pausedAt:0,\n    difficulty:\"Normal\",\n    deckMap:new Map(),\n    tableau:Array.from({length:8},()=>[]),\n    free:[null,null,null,null],\n    foundations:[],\n    moves:0,\n    hints:0,\n    undoStack:[],\n    selected:null,\n    hintMark:null,\n    initialSnapshot:null,\n    startTime:0,\n    finalElapsed:0,\n    muted:mooncellStorageGet(\"mochiMooncellMuted_v1\")===\"1\",\n    audioCtx:null\n  };\n\n  let interaction=null;\n  let lastTap={id:\"\",time:0};\n  let statusTimer=null;\n  let hintTimer=null;\n  const positions={free:[],foundation:[],columns:[]};\n\n  function rankLabel(rank){\n    if(rank===1) return \"A\";\n    if(rank===11) return \"J\";\n    if(rank===12) return \"Q\";\n    if(rank===13) return \"K\";\n    return String(rank);\n  }\n  function rankStatusName(rank){\n    if(rank===1) return \"Ace\";\n    if(rank===11) return \"Jack\";\n    if(rank===12) return \"Queen\";\n    if(rank===13) return \"King\";\n    return String(rank);\n  }\n  function suitByKey(key){return SUITS.find(s=>s.key===key)}\n  function cardColor(card){return suitByKey(card.suit).color}\n  function cardStatusName(card){return rankStatusName(card.rank)+\" of \"+suitByKey(card.suit).name}\n\n  function formatTime(seconds){\n    seconds=Math.max(0,Math.floor(seconds));\n    const m=String(Math.floor(seconds\/60)).padStart(2,\"0\");\n    const s=String(seconds%60).padStart(2,\"0\");\n    return m+\":\"+s;\n  }\n\n  function nowElapsed(){\n    if(!state.started) return 0;\n    if(state.won) return state.finalElapsed;\n    if(state.paused) return Math.floor((state.pausedAt-state.startTime)\/1000);\n    return Math.floor((Date.now()-state.startTime)\/1000);\n  }\n\n  function resetFoundations(){\n    state.foundations=[\n      {suit:null,rank:0},\n      {suit:null,rank:0},\n      {suit:null,rank:0},\n      {suit:null,rank:0}\n    ];\n  }\n\n  function foundationCount(){\n    return state.foundations.reduce((sum,pile)=>sum+pile.rank,0);\n  }\n\n  function calcScore(){\n    const cfg=DIFFICULTY[state.difficulty];\n    const score=cfg.base+foundationCount()*25-nowElapsed()*cfg.timePenalty-state.moves*cfg.movePenalty-state.hints*cfg.hintPenalty;\n    return Math.max(0,Math.floor(score));\n  }\n\n  function updateStats(){\n    scoreEl.textContent=String(calcScore());\n    timeEl.textContent=formatTime(nowElapsed());\n    movesEl.textContent=String(state.moves);\n    undoBtn.disabled=state.undoStack.length===0 || !state.started || state.won || state.paused;\n    hintBtn.disabled=!state.started || state.won || state.paused;\n    restartBtn.disabled=!state.started;\n  }\n\n  function setStatus(text,temporary){\n    statusEl.textContent=text;\n    if(statusTimer) clearTimeout(statusTimer);\n    if(temporary){\n      statusTimer=setTimeout(()=>{\n        if(!state.started) statusEl.textContent=\"Choose a difficulty, then open the moonlit workshop table.\";\n        else if(state.paused) statusEl.textContent=\"The moonlit workshop table rests quietly.\";\n        else if(state.won) statusEl.textContent=\"Every suit now rests in a moonlit foundation.\";\n        else statusEl.textContent=\"Tap a card, then guide it to a moonlit place. You can also drag it across the workshop table.\";\n      },temporary);\n    }\n  }\n\n  function initAudio(){\n    if(state.audioCtx) return;\n    const AC=window.AudioContext || window.webkitAudioContext;\n    if(!AC) return;\n    try{state.audioCtx=new AC()}catch(err){state.audioCtx=null}\n  }\n\n  function playChord(freqs,duration,volume){\n    const ctx=state.audioCtx;\n    if(!ctx) return;\n    freqs.forEach((freq,i)=>{\n      const t=ctx.currentTime+i*.075;\n      const gain=ctx.createGain();\n      const osc=ctx.createOscillator();\n      osc.type=i%2?\"sine\":\"triangle\";\n      osc.frequency.setValueAtTime(freq,t);\n      gain.gain.setValueAtTime(.0001,t);\n      gain.gain.exponentialRampToValueAtTime(volume,t+.025);\n      gain.gain.exponentialRampToValueAtTime(.0001,t+duration);\n      osc.connect(gain);\n      gain.connect(ctx.destination);\n      osc.start(t);\n      osc.stop(t+duration+.04);\n    });\n  }\n\n  function playSound(type){\n    if(state.muted) return;\n    initAudio();\n    const ctx=state.audioCtx;\n    if(!ctx) return;\n    if(ctx.state===\"suspended\"){\n      if(typeof ctx.resume===\"function\"){\n        try{Promise.resolve(ctx.resume()).catch(()=>{})}catch(err){}\n      }\n    }\n\n    function tone(freq,duration,volume,wave,delay,endRatio){\n      const t=ctx.currentTime+(delay||0);\n      const gain=ctx.createGain();\n      const osc=ctx.createOscillator();\n      osc.type=wave||\"triangle\";\n      osc.frequency.setValueAtTime(freq,t);\n      osc.frequency.exponentialRampToValueAtTime(Math.max(70,freq*(endRatio||.82)),t+duration);\n      gain.gain.setValueAtTime(.0001,t);\n      gain.gain.exponentialRampToValueAtTime(volume,t+.012);\n      gain.gain.exponentialRampToValueAtTime(.0001,t+duration);\n      osc.connect(gain);\n      gain.connect(ctx.destination);\n      osc.start(t);\n      osc.stop(t+duration+.025);\n    }\n\n    if(type===\"move\"){\n      tone(315,.070,.026,\"triangle\",0,.72);\n      tone(415,.055,.014,\"sine\",.018,.84);\n    }else if(type===\"foundation\"){\n      tone(520,.105,.026,\"triangle\",0,.92);\n      tone(690,.115,.020,\"sine\",.055,.94);\n    }else if(type===\"select\"){\n      tone(285,.050,.020,\"sine\",0,.76);\n    }else if(type===\"invalid\"){\n      tone(145,.115,.024,\"triangle\",0,.64);\n    }else if(type===\"hint\"){\n      tone(620,.115,.024,\"triangle\",0,.94);\n      tone(820,.120,.018,\"sine\",.052,.96);\n    }else if(type===\"deal\"){\n      tone(260,.080,.024,\"triangle\",0,.78);\n      tone(335,.085,.016,\"sine\",.045,.86);\n    }else if(type===\"pause\"){\n      tone(220,.105,.020,\"sine\",0,.70);\n    }else if(type===\"resume\"){\n      tone(360,.075,.022,\"triangle\",0,.88);\n      tone(470,.075,.014,\"sine\",.035,.92);\n    }else if(type===\"win\"){\n      playChord([392,493.88,587.33,783.99],.48,.025);\n    }\n  }\n\n  function createDeck(){\n    const deck=[];\n    SUITS.forEach(suit=>{\n      for(let r=1;r<=13;r++) deck.push({id:suit.key+\"-\"+r,suit:suit.key,rank:r});\n    });\n    return deck;\n  }\n\n  function mulberry32(seed){\n    return function(){\n      let t=seed+=0x6D2B79F5;\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(deck,seed){\n    const rand=mulberry32(seed);\n    const arr=deck.slice();\n    for(let i=arr.length-1;i>0;i--){\n      const j=Math.floor(rand()*(i+1));\n      const tmp=arr[i];\n      arr[i]=arr[j];\n      arr[j]=tmp;\n    }\n    return arr;\n  }\n\n  function dealFromDeck(deck){\n    const tableau=Array.from({length:8},()=>[]);\n    deck.forEach((card,index)=>tableau[index%8].push(card));\n    return tableau;\n  }\n\n  function estimateDealDifficulty(tableau){\n    let score=0;\n    tableau.forEach(col=>{\n      col.forEach((card,index)=>{\n        const depth=col.length-1-index;\n        if(card.rank<=4) score+=depth*9+(5-card.rank)*3;\n      });\n      const top=col[col.length-1];\n      if(top){\n        if(top.rank<=3) score-=18;\n        if(top.rank===1) score-=16;\n      }\n      let chain=1;\n      for(let i=col.length-1;i>0;i--){\n        const upper=col[i];\n        const below=col[i-1];\n        if(mooncellAnd(()=>(below.rank===upper.rank+1),()=>(cardColor(below)!==cardColor(upper)))) chain++;\n        else break;\n      }\n      score-=chain*5;\n    });\n    return score;\n  }\n\n  function chooseDeal(difficulty){\n    const cfg=DIFFICULTY[difficulty];\n    const base=createDeck();\n    const candidates=[];\n    for(let i=0;i<cfg.candidates;i++){\n      const seed=((Date.now()+Math.floor(Math.random()*9999999)+i*7919)>>>0);\n      const deck=shuffle(base,seed);\n      const tableau=dealFromDeck(deck);\n      candidates.push({deck,tableau,difficulty:estimateDealDifficulty(tableau)});\n    }\n    candidates.sort((a,b)=>a.difficulty-b.difficulty);\n    if(cfg.pick===\"easy\") return candidates[0];\n    if(cfg.pick===\"hard\") return candidates[candidates.length-1];\n    return candidates[Math.floor(candidates.length\/2)];\n  }\n\n  function snapshot(){\n    return {\n      tableau:state.tableau.map(col=>col.map(c=>c.id)),\n      free:state.free.map(c=>c?c.id:null),\n      foundations:state.foundations.map(pile=>({suit:pile.suit,rank:pile.rank})),\n      moves:state.moves,\n      hints:state.hints\n    };\n  }\n\n  function clearGhost(){\n    ghostEl.innerHTML=\"\";\n    ghostEl.style.transform=\"\";\n  }\n\n  function updatePauseButton(){\n    pauseBtn.setAttribute(\"aria-label\",state.paused?\"Resume\":\"Pause\");\n    root.classList.toggle(\"vrf-paused\",state.paused);\n    pauseOverlay.classList.toggle(\"active\",state.paused);\n  }\n\n  function restoreSnapshot(snap){\n    state.tableau=snap.tableau.map(col=>col.map(id=>state.deckMap.get(id)));\n    state.free=snap.free.map(id=>id?state.deckMap.get(id):null);\n    state.foundations=snap.foundations.map(pile=>({suit:pile.suit,rank:pile.rank}));\n    state.moves=snap.moves;\n    state.hints=snap.hints;\n    state.selected=null;\n    state.hintMark=null;\n    state.won=false;\n    state.paused=false;\n    state.pausedAt=0;\n    interaction=null;\n    clearGhost();\n    pauseOverlay.classList.remove(\"active\");\n    winOverlay.classList.remove(\"active\");\n    updatePauseButton();\n    render();\n    updateStats();\n  }\n\n  function pushUndo(){\n    state.undoStack.push(snapshot());\n    if(state.undoStack.length>80) state.undoStack.shift();\n  }\n\n  function setupPositions(){\n    positions.free=[];\n    positions.foundation=[];\n    positions.columns=[];\n\n    const freeX=COL_LEFT;\n    const foundationX=freeX+4*(CARD_W+SLOT_GAP);\n\n    for(let i=0;i<4;i++){\n      positions.free.push({x:freeX+i*(CARD_W+SLOT_GAP),y:CELL_Y,w:CARD_W,h:CARD_H});\n      positions.foundation.push({x:foundationX+i*(CARD_W+SLOT_GAP),y:CELL_Y,w:CARD_W,h:CARD_H,index:i});\n    }\n    for(let i=0;i<8;i++){\n      positions.columns.push({x:COL_LEFT+i*(CARD_W+COL_GAP),y:TABLEAU_Y,w:CARD_W,h:430,col:i});\n    }\n  }\n\n  function createDropZones(){\n    freeSlotsEl.innerHTML=\"\";\n    foundationSlotsEl.innerHTML=\"\";\n    columnZonesEl.innerHTML=\"\";\n\n    positions.free.forEach((p,i)=>{\n      const slot=document.createElement(\"div\");\n      slot.className=\"vrf-slot vrf-drop\";\n      slot.dataset.target=\"free\";\n      slot.dataset.index=String(i);\n      slot.style.left=p.x+\"px\";\n      slot.style.top=p.y+\"px\";\n      freeSlotsEl.appendChild(slot);\n    });\n\n    positions.foundation.forEach((p,i)=>{\n      const slot=document.createElement(\"div\");\n      slot.className=\"vrf-slot vrf-drop\";\n      slot.dataset.target=\"foundation\";\n      slot.dataset.index=String(i);\n      slot.style.left=p.x+\"px\";\n      slot.style.top=p.y+\"px\";\n      foundationSlotsEl.appendChild(slot);\n    });\n\n    positions.columns.forEach((p,i)=>{\n      const zone=document.createElement(\"div\");\n      zone.className=\"vrf-column-zone vrf-drop\";\n      zone.dataset.target=\"tableau\";\n      zone.dataset.col=String(i);\n      zone.style.left=p.x+\"px\";\n      zone.style.top=(p.y-8)+\"px\";\n      zone.style.height=\"392px\";\n      columnZonesEl.appendChild(zone);\n    });\n  }\n\n  function getFanGap(){\n    const maxLen=Math.max(1,...state.tableau.map(col=>col.length));\n    if(maxLen<=1) return 31;\n    const fitGap=(MAX_CARD_BOTTOM-CARD_H-TABLEAU_Y)\/(maxLen-1);\n    return Math.max(7,Math.min(31,fitGap));\n  }\n\n  function suitIconHTML(suit,small){\n    return '\\x3Cspan class=\"vrf-suit-shape vrf-suit-'+suit.icon+(small?' small':' center')+'\" aria-hidden=\"true\">\\x3C\/span>';\n  }\n\n  function createCardEl(card,x,y,loc,zIndex){\n    const suit=suitByKey(card.suit);\n    const el=document.createElement(\"div\");\n    el.className=\"vrf-card \"+suit.color+\" suit-\"+suit.key;\n    el.dataset.cardId=card.id;\n    el.dataset.loc=loc.type;\n\n    if(loc.type===\"tableau\"){\n      el.dataset.col=String(loc.col);\n      el.dataset.index=String(loc.index);\n    }else if(loc.type===\"free\"){\n      el.dataset.index=String(loc.index);\n    }else if(loc.type===\"foundation\"){\n      el.dataset.index=String(loc.index);\n      el.classList.add(\"foundation-card\");\n    }\n\n    el.style.left=x+\"px\";\n    el.style.top=y+\"px\";\n    el.style.zIndex=String(zIndex);\n\n    const label=rankLabel(card.rank);\n    el.innerHTML=\n      '\\x3Cdiv class=\"vrf-corner\">\\x3Cdiv>'+label+'\\x3C\/div>\\x3Cdiv class=\"suit-small\">'+suitIconHTML(suit,true)+'\\x3C\/div>\\x3C\/div>'+\n      '\\x3Cdiv class=\"vrf-center-suit\">'+suitIconHTML(suit,false)+'\\x3C\/div>'+\n      '\\x3Cdiv class=\"vrf-corner bottom\">\\x3Cdiv>'+label+'\\x3C\/div>\\x3Cdiv class=\"suit-small\">'+suitIconHTML(suit,true)+'\\x3C\/div>\\x3C\/div>';\n\n    if(mooncellAnd(()=>(state.selected),()=>(state.selected.stack.some(c=>c.id===card.id)))){\n      el.classList.add(\"vrf-selected\");\n      if(mooncellAnd(()=>(interaction),()=>(interaction.drag))) el.classList.add(\"vrf-dimmed\");\n    }\n    if(mooncellAnd(()=>(state.hintMark),()=>(state.hintMark.sourceIds.includes(card.id)))){\n      el.classList.add(\"vrf-hint-source\");\n    }\n    return el;\n  }\n\n  function renderFoundationCard(index,x,y,zIndex){\n    const pile=state.foundations[index];\n    if(!pile || !pile.suit || pile.rank<=0) return null;\n    return createCardEl({id:\"F-\"+index+\"-\"+pile.rank,suit:pile.suit,rank:pile.rank},x,y,{type:\"foundation\",index},zIndex);\n  }\n\n  function clearDropHighlights(){\n    root.querySelectorAll(\".vrf-drop\").forEach(el=>el.classList.remove(\"vrf-valid\",\"vrf-hint-target\"));\n  }\n\n  function dropElementForTarget(target){\n    if(!target) return null;\n    if(target.type===\"free\") return root.querySelector('.vrf-drop[data-target=\"free\"][data-index=\"'+target.index+'\"]');\n    if(target.type===\"foundation\") return root.querySelector('.vrf-drop[data-target=\"foundation\"][data-index=\"'+target.index+'\"]');\n    if(target.type===\"tableau\") return root.querySelector('.vrf-drop[data-target=\"tableau\"][data-col=\"'+target.col+'\"]');\n    return null;\n  }\n\n  function updateDropHighlights(){\n    clearDropHighlights();\n    if(mooncellAnd(()=>(state.selected),()=>(!state.paused))){\n      getValidTargets(state.selected).forEach(target=>{\n        const el=dropElementForTarget(target);\n        if(el) el.classList.add(\"vrf-valid\");\n      });\n    }\n    if(mooncellAnd(()=>(mooncellAnd(()=>(state.hintMark),()=>(state.hintMark.target))),()=>(!state.paused))){\n      const el=dropElementForTarget(state.hintMark.target);\n      if(el) el.classList.add(\"vrf-hint-target\");\n    }\n  }\n\n  function render(){\n    cardsEl.innerHTML=\"\";\n    const fan=getFanGap();\n\n    state.free.forEach((card,i)=>{\n      if(!card) return;\n      const p=positions.free[i];\n      cardsEl.appendChild(createCardEl(card,p.x,p.y,{type:\"free\",index:i},50+i));\n    });\n\n    positions.foundation.forEach((p,i)=>{\n      const cardEl=renderFoundationCard(i,p.x,p.y,50+i);\n      if(cardEl) cardsEl.appendChild(cardEl);\n    });\n\n    state.tableau.forEach((col,colIndex)=>{\n      const p=positions.columns[colIndex];\n      col.forEach((card,index)=>{\n        const y=TABLEAU_Y+index*fan;\n        cardsEl.appendChild(createCardEl(card,p.x,y,{type:\"tableau\",col:colIndex,index},100+colIndex*70+index));\n      });\n    });\n\n    updateDropHighlights();\n    updateStats();\n  }\n\n  function isOrderedStack(stack){\n    if(!stack || stack.length<=1) return true;\n    for(let i=0;i<stack.length-1;i++){\n      const lower=stack[i];\n      const upper=stack[i+1];\n      if(lower.rank!==upper.rank+1) return false;\n      if(cardColor(lower)===cardColor(upper)) return false;\n    }\n    return true;\n  }\n\n  function selectionFromElement(el){\n    const loc=el.dataset.loc;\n    if(loc===\"free\"){\n      const index=Number(el.dataset.index);\n      const card=state.free[index];\n      if(!card) return null;\n      return {source:{type:\"free\",index},stack:[card],index:0};\n    }\n    if(loc===\"tableau\"){\n      const col=Number(el.dataset.col);\n      const index=Number(el.dataset.index);\n      const column=state.tableau[col];\n      const stack=column.slice(index);\n      if(!stack.length) return null;\n      if(!isOrderedStack(stack)){\n        playSound(\"invalid\");\n        setStatus(\"Only descending stacks with alternating colors can move.\",1400);\n        return null;\n      }\n      return {source:{type:\"tableau\",col},stack,index};\n    }\n    return null;\n  }\n\n  function targetFromCardElement(el){\n    const loc=el.dataset.loc;\n    if(loc===\"tableau\") return {type:\"tableau\",col:Number(el.dataset.col)};\n    if(loc===\"foundation\") return {type:\"foundation\",index:Number(el.dataset.index)};\n    if(loc===\"free\") return {type:\"free\",index:Number(el.dataset.index)};\n    return null;\n  }\n\n  function sameSourceAndTarget(sel,target){\n    if(!sel || !target) return false;\n    if(mooncellAnd(()=>(mooncellAnd(()=>(sel.source.type===\"tableau\"),()=>(target.type===\"tableau\"))),()=>(sel.source.col===target.col))) return true;\n    if(mooncellAnd(()=>(mooncellAnd(()=>(sel.source.type===\"free\"),()=>(target.type===\"free\"))),()=>(sel.source.index===target.index))) return true;\n    return false;\n  }\n\n  function emptyFreeCount(){return state.free.filter(c=>!c).length}\n  function emptyTableauCount(sourceCol,targetCol){\n    return state.tableau.filter((col,i)=>{\n      if(i===sourceCol || i===targetCol) return false;\n      return col.length===0;\n    }).length;\n  }\n  function moveCapacity(sel,target){\n    if(sel.source.type!==\"tableau\") return 1;\n    const sourceCol=sel.source.col;\n    const targetCol=mooncellAnd(()=>(target),()=>(target.type===\"tableau\")) ? target.col : -1;\n    const emptyCols=emptyTableauCount(sourceCol,targetCol);\n    return (emptyFreeCount()+1)*Math.pow(2,emptyCols);\n  }\n\n  function canPlaceOnTableau(stack,colIndex){\n    const dest=state.tableau[colIndex];\n    const bottomMoving=stack[0];\n    if(!dest.length) return true;\n    const destTop=dest[dest.length-1];\n    return mooncellAnd(()=>(destTop.rank===bottomMoving.rank+1),()=>(cardColor(destTop)!==cardColor(bottomMoving)));\n  }\n\n  function canPlaceOnFoundation(card,index){\n    const pile=state.foundations[index];\n    if(!pile.suit || pile.rank===0) return card.rank===1;\n    return mooncellAnd(()=>(pile.suit===card.suit),()=>(card.rank===pile.rank+1));\n  }\n\n  function canMove(sel,target){\n    if(!sel || !target || !sel.stack.length || state.paused) return false;\n    if(sameSourceAndTarget(sel,target)) return false;\n\n    const stack=sel.stack;\n\n    if(target.type===\"free\") return mooncellAnd(()=>(stack.length===1),()=>(!state.free[target.index]));\n    if(target.type===\"foundation\"){\n      if(stack.length!==1) return false;\n      return canPlaceOnFoundation(stack[0],target.index);\n    }\n    if(target.type===\"tableau\"){\n      if(!canPlaceOnTableau(stack,target.col)) return false;\n\n      \/* Relaxed FreeCell v2:\n         Any valid descending alternating stack can move onto any valid tableau target.\n         This includes empty columns and non-empty columns, such as Q-black\/J-red\/10-black\/9-red\n         moving onto K-red. The move-capacity limit is intentionally disabled for smoother casual play. *\/\n      return true;\n    }\n    return false;\n  }\n\n  function getValidTargets(sel){\n    const targets=[];\n    for(let i=0;i<4;i++){\n      const target={type:\"free\",index:i};\n      if(canMove(sel,target)) targets.push(target);\n    }\n    for(let i=0;i<4;i++){\n      const target={type:\"foundation\",index:i};\n      if(canMove(sel,target)) targets.push(target);\n    }\n    for(let i=0;i<8;i++){\n      const target={type:\"tableau\",col:i};\n      if(canMove(sel,target)) targets.push(target);\n    }\n    return targets;\n  }\n\n  function removeSelectionFromSource(sel){\n    if(sel.source.type===\"free\"){\n      state.free[sel.source.index]=null;\n      return;\n    }\n    if(sel.source.type===\"tableau\") state.tableau[sel.source.col].splice(sel.index);\n  }\n\n  function placeStack(sel,target){\n    const stack=sel.stack;\n    if(target.type===\"free\"){\n      state.free[target.index]=stack[0];\n      return;\n    }\n    if(target.type===\"foundation\"){\n      const card=stack[0];\n      state.foundations[target.index].suit=card.suit;\n      state.foundations[target.index].rank=card.rank;\n      return;\n    }\n    if(target.type===\"tableau\") state.tableau[target.col].push(...stack);\n  }\n\n  function messageForMove(sel,target){\n    const label=cardStatusName(sel.stack[0]);\n    if(target.type===\"foundation\") return label+\" settled into a moonlit foundation.\";\n    if(target.type===\"free\") return label+\" rests inside a quiet free cell.\";\n    return label+\" found a new place on the moonlit tableau.\";\n  }\n\n  function tryMove(sel,target,quiet){\n    if(!state.started || state.won || state.paused) return false;\n    if(!canMove(sel,target)){\n      if(!quiet){\n        playSound(\"invalid\");\n        setStatus(\"That card cannot follow the current mooncell order.\",1200);\n      }\n      return false;\n    }\n\n    pushUndo();\n    removeSelectionFromSource(sel);\n    placeStack(sel,target);\n    state.moves++;\n    state.selected=null;\n    state.hintMark=null;\n    interaction=null;\n    clearGhost();\n\n    playSound(target.type===\"foundation\" ? \"foundation\" : \"move\");\n    setStatus(messageForMove(sel,target),1100);\n    render();\n    checkWin();\n    return true;\n  }\n\n  function autoMoveSelection(sel){\n    if(!sel || sel.stack.length!==1 || state.paused) return false;\n    for(let i=0;i<4;i++){\n      const target={type:\"foundation\",index:i};\n      if(canMove(sel,target)){\n        tryMove(sel,target);\n        return true;\n      }\n    }\n    playSound(\"invalid\");\n    setStatus(\"That moonlit stack is not ready for this card yet.\",1400);\n    return false;\n  }\n\n  function gamePoint(clientX,clientY){\n    const rect=fit.getBoundingClientRect();\n    const scale=rect.width\/BASE_W;\n    return {x:(clientX-rect.left)\/scale,y:(clientY-rect.top)\/scale};\n  }\n\n  function pointInRect(p,r){\n    return mooncellAnd(()=>(mooncellAnd(()=>(mooncellAnd(()=>(p.x>=r.x),()=>(p.x<=r.x+r.w))),()=>(p.y>=r.y))),()=>(p.y<=r.y+r.h));\n  }\n\n  function targetFromPoint(clientX,clientY){\n    const p=gamePoint(clientX,clientY);\n\n    for(let i=0;i<positions.free.length;i++){\n      if(pointInRect(p,positions.free[i])) return {type:\"free\",index:i};\n    }\n    for(let i=0;i<positions.foundation.length;i++){\n      if(pointInRect(p,positions.foundation[i])) return {type:\"foundation\",index:i};\n    }\n    for(let i=0;i<positions.columns.length;i++){\n      const r=positions.columns[i];\n      const hit={x:r.x-COL_GAP\/2,y:r.y-34,w:r.w+COL_GAP,h:470};\n      if(pointInRect(p,hit)) return {type:\"tableau\",col:i};\n    }\n    return null;\n  }\n\n  function buildGhost(sel,point){\n    ghostEl.innerHTML=\"\";\n    const fan=Math.min(25,getFanGap());\n    sel.stack.forEach((card,i)=>{\n      const el=createCardEl(card,0,i*fan,{type:\"ghost\"},200+i);\n      el.style.left=\"0px\";\n      el.style.top=(i*fan)+\"px\";\n      ghostEl.appendChild(el);\n    });\n    moveGhost(point);\n  }\n\n  function moveGhost(point){\n    if(!interaction) return;\n    const fan=Math.min(25,getFanGap());\n    const totalHeight=CARD_H+Math.max(0,interaction.selection.stack.length-1)*fan;\n    const x=point.x-CARD_W\/2;\n    const y=point.y-Math.min(34,totalHeight\/3);\n    ghostEl.style.transform=\"translate(\"+x+\"px, \"+y+\"px)\";\n  }\n\n  function clearSelection(){\n    state.selected=null;\n    state.hintMark=null;\n    interaction=null;\n    clearGhost();\n    render();\n  }\n\n  function handleTapSelection(sel,cardId){\n    const now=Date.now();\n    const isDoubleTap=mooncellAnd(()=>(mooncellAnd(()=>(sel.stack.length===1),()=>(lastTap.id===cardId))),()=>(now-lastTap.time<340));\n    if(isDoubleTap){\n      lastTap={id:\"\",time:0};\n      state.selected=null;\n      autoMoveSelection(sel);\n      render();\n      return;\n    }\n    lastTap={id:cardId,time:now};\n    state.selected=sel;\n    state.hintMark=null;\n    playSound(\"select\");\n    setStatus(\"Tap a moonlit place, or drag the selected card.\",1400);\n    render();\n  }\n\n  function onBoardPointerDown(e){\n    if(!state.started || state.won || state.paused) return;\n    if(e.target.closest(\"button\")) return;\n    e.preventDefault();\n\n    if(mooncellAnd(()=>(cardsEl.setPointerCapture),()=>(e.pointerId!==undefined))){\n      try{cardsEl.setPointerCapture(e.pointerId)}catch(err){}\n    }\n\n    const cardEl=e.target.closest(\".vrf-card\");\n\n    if(!cardEl || !cardsEl.contains(cardEl)){\n      if(state.selected){\n        const target=targetFromPoint(e.clientX,e.clientY);\n        if(mooncellAnd(()=>(target),()=>(tryMove(state.selected,target)))) return;\n        clearSelection();\n      }\n      return;\n    }\n\n    if(state.selected){\n      const target=targetFromCardElement(cardEl);\n      if(mooncellAnd(()=>(target),()=>(tryMove(state.selected,target,true)))) return;\n    }\n\n    if(cardEl.dataset.loc===\"foundation\"){\n      if(state.selected){\n        const target={type:\"foundation\",index:Number(cardEl.dataset.index)};\n        tryMove(state.selected,target);\n      }\n      return;\n    }\n\n    const sel=selectionFromElement(cardEl);\n    if(!sel) return;\n\n    interaction={\n      selection:sel,\n      startX:e.clientX,\n      startY:e.clientY,\n      cardId:sel.stack[sel.stack.length-1].id,\n      drag:false\n    };\n\n    window.addEventListener(\"pointermove\",onPointerMove,{passive:false});\n    window.addEventListener(\"pointerup\",onPointerUp,{passive:false,once:true});\n    window.addEventListener(\"pointercancel\",onPointerCancel,{passive:false,once:true});\n  }\n\n  function onPointerMove(e){\n    if(!interaction || state.paused) return;\n    e.preventDefault();\n\n    const dx=e.clientX-interaction.startX;\n    const dy=e.clientY-interaction.startY;\n    const dist=Math.sqrt(dx*dx+dy*dy);\n\n    if(mooncellAnd(()=>(!interaction.drag),()=>(dist>7))){\n      interaction.drag=true;\n      state.selected=interaction.selection;\n      state.hintMark=null;\n      buildGhost(interaction.selection,gamePoint(e.clientX,e.clientY));\n      render();\n    }\n\n    if(interaction.drag) moveGhost(gamePoint(e.clientX,e.clientY));\n  }\n\n  function onPointerUp(e){\n    if(!interaction) return;\n    e.preventDefault();\n\n    const wasDrag=interaction.drag;\n    const sel=interaction.selection;\n    const cardId=interaction.cardId;\n\n    window.removeEventListener(\"pointermove\",onPointerMove);\n    window.removeEventListener(\"pointercancel\",onPointerCancel);\n\n    if(state.paused){\n      clearSelection();\n      return;\n    }\n\n    if(wasDrag){\n      const target=targetFromPoint(e.clientX,e.clientY);\n      clearGhost();\n\n      if(mooncellAnd(()=>(target),()=>(tryMove(sel,target)))){\n        interaction=null;\n        return;\n      }\n\n      playSound(\"invalid\");\n      setStatus(\"The card slides gently back to the workshop table.\",900);\n      state.selected=null;\n      interaction=null;\n      render();\n    }else{\n      interaction=null;\n      handleTapSelection(sel,cardId);\n    }\n  }\n\n  function onPointerCancel(){\n    if(!interaction) return;\n    window.removeEventListener(\"pointermove\",onPointerMove);\n    clearGhost();\n    interaction=null;\n    state.selected=null;\n    render();\n  }\n\n  function findHint(){\n    const hints=[];\n    function addHint(sel,target,score){\n      if(canMove(sel,target)) hints.push({sel,target,score});\n    }\n\n    state.free.forEach((card,i)=>{\n      if(!card) return;\n      const sel={source:{type:\"free\",index:i},stack:[card],index:0};\n      for(let f=0;f<4;f++) addHint(sel,{type:\"foundation\",index:f},120);\n      for(let c=0;c<8;c++) addHint(sel,{type:\"tableau\",col:c},48);\n    });\n\n    state.tableau.forEach((col,colIndex)=>{\n      if(!col.length) return;\n\n      const topIndex=col.length-1;\n      const topSel={source:{type:\"tableau\",col:colIndex},stack:[col[topIndex]],index:topIndex};\n\n      for(let f=0;f<4;f++) addHint(topSel,{type:\"foundation\",index:f},140);\n      for(let free=0;free<4;free++) addHint(topSel,{type:\"free\",index:free},12);\n\n      for(let index=0;index<col.length;index++){\n        const stack=col.slice(index);\n        if(!isOrderedStack(stack)) continue;\n        const sel={source:{type:\"tableau\",col:colIndex},stack,index};\n\n        for(let c=0;c<8;c++){\n          const opensColumn=index>0 ? 9 : 0;\n          const stackBonus=stack.length>1 ? stack.length*8 : 0;\n          addHint(sel,{type:\"tableau\",col:c},40+opensColumn+stackBonus);\n        }\n      }\n    });\n\n    if(!hints.length) return null;\n    hints.sort((a,b)=>b.score-a.score);\n\n    if(mooncellAnd(()=>(state.difficulty===\"Hard\"),()=>(hints.length>2))){\n      return hints[Math.min(hints.length-1,Math.floor(hints.length*.38))];\n    }\n    return hints[0];\n  }\n\n  function useHint(){\n    if(!state.started || state.won || state.paused) return;\n\n    const hint=findHint();\n    state.hints++;\n\n    if(!hint){\n      playSound(\"invalid\");\n      setStatus(\"No moonlit hint is visible in the workshop glow right now.\",1400);\n      updateStats();\n      return;\n    }\n\n    state.selected=null;\n    state.hintMark={sourceIds:hint.sel.stack.map(c=>c.id),target:hint.target};\n    playSound(\"hint\");\n\n    if(state.difficulty===\"Easy\"){\n      setStatus(\"Hint: move \"+cardStatusName(hint.sel.stack[0])+\" to the moonlit place.\",1800);\n    }else if(state.difficulty===\"Hard\"){\n      setStatus(\"The workshop offers only a quiet clue.\",1600);\n    }else{\n      setStatus(\"A creamy moon path is glowing.\",1500);\n    }\n\n    render();\n\n    if(hintTimer) clearTimeout(hintTimer);\n    hintTimer=setTimeout(()=>{\n      state.hintMark=null;\n      render();\n    },1900);\n  }\n\n  function checkWin(){\n    if(foundationCount()!==52) return;\n\n    state.finalElapsed=nowElapsed();\n    state.won=true;\n    state.selected=null;\n    state.hintMark=null;\n    state.paused=false;\n    state.pausedAt=0;\n    pauseOverlay.classList.remove(\"active\");\n    updatePauseButton();\n    winScoreEl.textContent=String(calcScore());\n    winTimeEl.textContent=formatTime(state.finalElapsed);\n    winMovesEl.textContent=String(state.moves);\n    statusEl.textContent=\"Every suit now rests in a moonlit foundation.\";\n    winOverlay.classList.add(\"active\");\n    playSound(\"win\");\n    render();\n  }\n\n  function togglePause(){\n    if(!state.started || state.won) return;\n\n    if(!state.paused){\n      state.paused=true;\n      state.pausedAt=Date.now();\n      state.selected=null;\n      state.hintMark=null;\n      interaction=null;\n      clearGhost();\n      setStatus(\"The moonlit workshop table rests quietly.\");\n      playSound(\"pause\");\n    }else{\n      const pausedDuration=Date.now()-state.pausedAt;\n      state.startTime+=pausedDuration;\n      state.paused=false;\n      state.pausedAt=0;\n      setStatus(\"The creamy moonlight is moving again.\",900);\n      playSound(\"resume\");\n    }\n\n    updatePauseButton();\n    render();\n  }\n\n  function startNewDeal(difficulty){\n    root.classList.add(\"vrf-game-active\");\n    initAudio();\n\n    state.started=true;\n    state.won=false;\n    state.paused=false;\n    state.pausedAt=0;\n    state.difficulty=difficulty || state.difficulty;\n    state.moves=0;\n    state.hints=0;\n    state.undoStack=[];\n    state.selected=null;\n    state.hintMark=null;\n    state.free=[null,null,null,null];\n    resetFoundations();\n    state.startTime=Date.now();\n    state.finalElapsed=0;\n\n    const deal=chooseDeal(state.difficulty);\n    state.deckMap=new Map();\n    deal.deck.forEach(card=>state.deckMap.set(card.id,card));\n    state.tableau=deal.tableau;\n    state.initialSnapshot=snapshot();\n\n    startOverlay.classList.remove(\"active\");\n    pauseOverlay.classList.remove(\"active\");\n    winOverlay.classList.remove(\"active\");\n    updatePauseButton();\n\n    setStatus(\"Tap a card, then guide it to a moonlit place. You can also drag it across the workshop table.\",1500);\n    playSound(\"deal\");\n    render();\n  }\n\n  function restartDeal(){\n    if(!state.initialSnapshot) return;\n\n    state.started=true;\n    state.won=false;\n    state.paused=false;\n    state.pausedAt=0;\n    state.startTime=Date.now();\n    state.finalElapsed=0;\n    state.undoStack=[];\n\n    restoreSnapshot({\n      tableau:state.initialSnapshot.tableau.map(col=>col.slice()),\n      free:[null,null,null,null],\n      foundations:[\n        {suit:null,rank:0},\n        {suit:null,rank:0},\n        {suit:null,rank:0},\n        {suit:null,rank:0}\n      ],\n      moves:0,\n      hints:0\n    });\n\n    setStatus(\"The moonlit workshop table has been reset.\",1100);\n    playSound(\"deal\");\n  }\n\n  function undo(){\n    if(!state.undoStack.length || state.won || state.paused) return;\n    const snap=state.undoStack.pop();\n    restoreSnapshot(snap);\n    setStatus(\"One card returns to its earlier place.\",900);\n    playSound(\"select\");\n  }\n\n  let mooncellFallback=false;\n  let mooncellPreviousOverflow=\"\";\n\n  function enterMooncellFallback(){\n    if(mooncellFallback) return;\n    mooncellPreviousOverflow=document.body.style.overflow;\n    document.body.style.overflow=\"hidden\";\n    mooncellFallback=true;\n    root.classList.add(\"vrf-fallback-fullscreen\");\n    resizeGame();\n  }\n  function exitMooncellFallback(){\n    if(!mooncellFallback) return;\n    mooncellFallback=false;\n    root.classList.remove(\"vrf-fallback-fullscreen\");\n    document.body.style.overflow=mooncellPreviousOverflow;\n    resizeGame();\n  }\n  async function toggleFullscreen(){\n    if(mooncellFallback){exitMooncellFallback();return}\n    if(document.fullscreenElement===root){\n      try{\n        if(mooncellAnd(()=>(screen.orientation),()=>(typeof screen.orientation.unlock===\"function\"))) screen.orientation.unlock();\n        await document.exitFullscreen();\n      }catch(err){exitMooncellFallback()}\n      resizeGame();\n      return;\n    }\n    if(document.fullscreenElement){return}\n    try{\n      if(typeof root.requestFullscreen!==\"function\") throw new Error(\"No native fullscreen\");\n      await root.requestFullscreen();\n      try{\n        if(mooncellAnd(()=>(screen.orientation),()=>(typeof screen.orientation.lock===\"function\"))) await screen.orientation.lock(\"landscape\");\n      }catch(err){}\n    }catch(err){\n      enterMooncellFallback();\n    }\n    resizeGame();\n  }\n\n  function resizeGame(){\n    const w=Math.max(1,root.clientWidth);\n    const h=Math.max(1,root.clientHeight);\n    const scale=Math.min(w\/BASE_W,h\/BASE_H);\n    const left=(w-BASE_W*scale)\/2;\n    const top=(h-BASE_H*scale)\/2;\n    fit.style.left=left+\"px\";\n    fit.style.top=top+\"px\";\n    fit.style.transform=\"scale(\"+scale+\")\";\n    const isFs=document.fullscreenElement===root || mooncellFallback;\n    root.classList.toggle(\"vrf-is-fullscreen\",isFs);\n    root.classList.toggle(\"vrf-portrait-fullscreen\",mooncellAnd(()=>(isFs),()=>(window.innerHeight>window.innerWidth)));\n  }\n\n  function updateMuteButton(){\n    muteBtn.setAttribute(\"aria-label\",state.muted?\"Muted\":\"Sound\");\n    root.classList.toggle(\"vrf-muted\",state.muted);\n  }\n\n  function setDifficulty(diff){\n    state.difficulty=diff;\n    root.querySelectorAll(\".vrf-diff-btn\").forEach(btn=>{\n      const active=btn.dataset.diff===diff;\n      btn.classList.toggle(\"active\",active);\n      btn.setAttribute(\"aria-pressed\",active?\"true\":\"false\");\n    });\n    setStatus(diff+\" difficulty selected.\",900);\n    playSound(\"select\");\n  }\n\n  function bindEvents(){\n    root.querySelectorAll(\".vrf-diff-btn\").forEach(btn=>{\n      btn.addEventListener(\"click\",()=>setDifficulty(btn.dataset.diff));\n    });\n\n    startBtn.addEventListener(\"click\",()=>startNewDeal(state.difficulty));\n    resumeBtn.addEventListener(\"click\",togglePause);\n    playAgainBtn.addEventListener(\"click\",()=>startNewDeal(state.difficulty));\n    newDealBtn.addEventListener(\"click\",()=>startNewDeal(state.difficulty));\n    restartBtn.addEventListener(\"click\",restartDeal);\n    undoBtn.addEventListener(\"click\",undo);\n    hintBtn.addEventListener(\"click\",useHint);\n    fullscreenBtn.addEventListener(\"click\",toggleFullscreen);\n    const exitFullButton=root.querySelector(\".vrf-exit-fullscreen\");\n    if(exitFullButton) exitFullButton.addEventListener(\"click\",toggleFullscreen);\n    document.addEventListener(\"keydown\",e=>{\n      if(mooncellAnd(()=>(e.key===\"Escape\"),()=>(mooncellFallback))) exitMooncellFallback();\n    });\n    pauseBtn.addEventListener(\"click\",togglePause);\n\n    muteBtn.addEventListener(\"click\",()=>{\n      state.muted=!state.muted;\n      mooncellStorageSet(\"mochiMooncellMuted_v1\",state.muted?\"1\":\"0\");\n      updateMuteButton();\n      if(!state.muted) playSound(\"select\");\n    });\n\n    cardsEl.addEventListener(\"pointerdown\",onBoardPointerDown,{passive:false});\n    cardsEl.addEventListener(\"touchstart\",function(e){e.preventDefault()},{passive:false});\n\n    document.addEventListener(\"visibilitychange\",()=>{\n      if(mooncellAnd(()=>(mooncellAnd(()=>(mooncellAnd(()=>(document.hidden),()=>(state.started))),()=>(!state.paused))),()=>(!state.won))) togglePause();\n    });\n    if(typeof IntersectionObserver===\"function\"){\n      const observer=new IntersectionObserver(entries=>{\n        const entry=entries[0];\n        if(mooncellAnd(()=>(mooncellAnd(()=>(mooncellAnd(()=>(mooncellAnd(()=>(entry),()=>(!entry.isIntersecting))),()=>(state.started))),()=>(!state.paused))),()=>(!state.won))){\n          togglePause();\n        }\n      },{threshold:0.015});\n      observer.observe(root);\n    }\n    document.addEventListener(\"fullscreenchange\",resizeGame);\n    window.addEventListener(\"resize\",resizeGame);\n    window.addEventListener(\"orientationchange\",()=>setTimeout(resizeGame,220));\n\n    setInterval(updateStats,500);\n  }\n\n  function initEmptyBoard(){\n    const base=createDeck();\n    state.deckMap=new Map();\n    base.forEach(card=>state.deckMap.set(card.id,card));\n    state.tableau=Array.from({length:8},()=>[]);\n    state.free=[null,null,null,null];\n    resetFoundations();\n    render();\n  }\n\n  setupPositions();\n  createDropZones();\n  bindEvents();\n  updateMuteButton();\n  updatePauseButton();\n  initEmptyBoard();\n  resizeGame();\n  updateStats();\n  return true;\n  }\n  let attempts=0;\n  function whenMooncellReady(){\n    if(initializeMochiMooncell()) return;\n    if(++attempts<80) setTimeout(whenMooncellReady,100);\n  }\n  whenMooncellReady();\n})();\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\">Plan, Move, and Build the Moonlit Foundations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The game gives you a relaxing but thoughtful challenge. You can drag or tap cards, use hints when you need guidance, undo your last move, restart the deal, choose a new deal, and play in fullscreen mode for a smoother experience on desktop or mobile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As you build each foundation, the table begins to feel lighter, like the moon rabbits are slowly finishing their night work. The creamy glow, purple night atmosphere, warm buttons, and handmade card suits create a soft puzzle experience that is calm, cute, and still mentally engaging.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why You Will Love Mochi Mooncell<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mochi Mooncell<\/strong> is perfect for players who enjoy solitaire card games with strategy, cozy visuals, and a magical theme. It is easy to start, satisfying to master, and ideal for short breaks or quiet evening play.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With FreeCell rules, difficulty options, score tracking, timer, move counter, hint, undo, pause, sound control, fullscreen support, and a warm Moon Rabbit Workshop theme, this game turns a familiar card puzzle into a small peaceful escape above the clouds.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mochi Mooncell is a cozy FreeCell card game set inside a dreamy moon rabbit workshop above the night clouds. Under soft creamy moonlight, magical cards are arranged on a warm wooden table, decorated with moon rabbits, mochi cakes, night clouds, and tiny wooden mallets. Your goal is to move every card into the foundations from &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-119","post","type-post","status-publish","format-standard","hentry","category-card"],"_links":{"self":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/119","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=119"}],"version-history":[{"count":0,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/119\/revisions"}],"wp:attachment":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}