{"id":101,"date":"2026-10-13T00:00:22","date_gmt":"2026-10-13T00:00:22","guid":{"rendered":"https:\/\/apk.produsenpagarbrc.com\/?p=101"},"modified":"2026-10-13T00:00:22","modified_gmt":"2026-10-13T00:00:22","slug":"mochi-mooncraft","status":"publish","type":"post","link":"https:\/\/play.produsenpagarbrc.com\/?p=101","title":{"rendered":"Mochi Mooncraft"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Mochi Mooncraft<\/strong> is a cozy match-3 puzzle game set inside a tiny moonlit workshop above the clouds, where gentle moon rabbits craft soft rice cakes, polish little wooden tools, and keep the night glowing with creamy lunar light.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this dreamy puzzle adventure, every swap feels like helping a quiet team of rabbits finish their magical night work. The board is filled with handcrafted treasures: mochi, moon charms, wooden mallets, lanterns, soft clouds, tiny toolboxes, and other warm little pieces from the rabbits&#8217; floating workshop.<\/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-Mooncraft-1024x768.png\" alt=\"\" class=\"wp-image-102\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">A Cozy Match-3 Game Above the Clouds<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your goal is simple but satisfying: swap neighboring tiles to match three or more identical pieces. Each level gives you a target and a limited number of moves, so every decision matters. Some stages ask you to collect certain workshop items, while others challenge you to clear glowing moonlit pieces from the board.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As you progress, the puzzle becomes more thoughtful. Matching four or more tiles can create special pieces that clear rows, columns, or larger groups, turning the quiet workshop into a soft burst of moon magic.<\/p>\n\n\n\n<style>\n  #moon_rabbit_workshop_v1 {\n    --moon-cream: #fff1d6;\n    --moon-paper: #fff8e8;\n    --moon-soft: #f7dfa2;\n    --moon-gold: #f6d58a;\n    --moon-wood: #8b5c38;\n    --moon-wood-dark: #422c26;\n    --moon-plum: #2b2342;\n    --moon-violet: #5b4b83;\n    --moon-cloud: #cfc7f4;\n    --moon-blue: #9fb9e8;\n    --moon-red: #d9675f;\n    --line: rgba(255, 241, 214, .34);\n    width: min(100%, 1280px);\n    aspect-ratio: 16 \/ 9;\n    margin: 18px auto;\n    position: relative;\n    overflow: hidden;\n    border-radius: 26px;\n    background:\n      radial-gradient(circle at 18% 12%, rgba(255, 241, 214, .25), transparent 25%),\n      radial-gradient(circle at 82% 18%, rgba(159, 185, 232, .22), transparent 30%),\n      linear-gradient(135deg, #1c1832 0%, #33284f 48%, #6b4d70 100%);\n    box-shadow: 0 24px 60px rgba(28, 20, 48, .36);\n    touch-action: none;\n    user-select: none;\n    -webkit-user-select: none;\n    font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Arial, sans-serif;\n    color: var(--moon-cream);\n  }\n\n  #moon_rabbit_workshop_v1 * {\n    box-sizing: border-box;\n    -webkit-tap-highlight-color: transparent;\n  }\n\n  #moon_rabbit_workshop_v1.hlm-fullscreen {\n    width: 100vw;\n    height: 100vh;\n    max-width: none;\n    aspect-ratio: auto;\n    margin: 0;\n    border-radius: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    background: #17142c;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-game-frame {\n    position: absolute;\n    inset: 0;\n    overflow: hidden;\n    border-radius: inherit;\n    background:\n      radial-gradient(circle at 15% 16%, rgba(255, 241, 214, .34), transparent 25%),\n      radial-gradient(circle at 78% 18%, rgba(207, 199, 244, .22), transparent 30%),\n      radial-gradient(circle at 84% 78%, rgba(246, 213, 138, .18), transparent 32%),\n      linear-gradient(135deg, #1c1832 0%, #2f2549 44%, #5b4b83 100%);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-game-frame::before {\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    pointer-events: none;\n    background:\n      radial-gradient(circle at 84% 14%, rgba(255, 241, 214, .55) 0 7%, transparent 18%),\n      radial-gradient(ellipse at 18% 84%, rgba(255, 255, 255, .22) 0 9%, transparent 23%),\n      radial-gradient(ellipse at 48% 92%, rgba(255, 255, 255, .18) 0 8%, transparent 22%),\n      radial-gradient(ellipse at 78% 88%, rgba(255, 255, 255, .16) 0 9%, transparent 23%),\n      repeating-linear-gradient(112deg, rgba(255, 241, 214, .035) 0 1px, transparent 1px 34px);\n    opacity: .95;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-game-frame::after {\n    content: \"\";\n    position: absolute;\n    left: -5%;\n    right: -5%;\n    bottom: -8%;\n    height: 34%;\n    pointer-events: none;\n    background:\n      radial-gradient(ellipse at 12% 70%, rgba(255, 255, 255, .30), transparent 32%),\n      radial-gradient(ellipse at 36% 82%, rgba(207, 199, 244, .28), transparent 31%),\n      radial-gradient(ellipse at 64% 76%, rgba(255, 255, 255, .24), transparent 34%),\n      radial-gradient(ellipse at 86% 78%, rgba(159, 185, 232, .22), transparent 31%);\n    opacity: .92;\n  }\n\n  #moon_rabbit_workshop_v1.hlm-fullscreen .hlm-game-frame {\n    position: relative;\n    width: min(100vw, calc(100vh * 16 \/ 9));\n    height: min(100vh, calc(100vw * 9 \/ 16));\n    border-radius: 0;\n    flex: 0 0 auto;\n  }\n\n  #hlm_m3_canvas_v4 {\n    position: absolute;\n    inset: 0;\n    width: 100%;\n    height: 100%;\n    display: block;\n    touch-action: none;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-top-left,\n  #moon_rabbit_workshop_v1 .hlm-top-right,\n  #moon_rabbit_workshop_v1 .hlm-top-stats {\n    position: absolute;\n    z-index: 8;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-top-left {\n    top: 14px;\n    left: 16px;\n    display: flex;\n    gap: 10px;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-top-right {\n    top: 14px;\n    right: 16px;\n    z-index: 45;\n    pointer-events: auto;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-top-stats {\n    top: 12px;\n    left: 50%;\n    transform: translateX(-50%);\n    display: flex;\n    gap: 7px;\n    align-items: center;\n    justify-content: center;\n    max-width: calc(100% - 220px);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-chip {\n    min-width: 92px;\n    height: 36px;\n    padding: 5px 10px 4px;\n    border-radius: 14px;\n    border: 1px solid rgba(255, 241, 214, .34);\n    background: linear-gradient(180deg, rgba(255, 248, 232, .84), rgba(247, 223, 162, .28));\n    box-shadow:\n      inset 0 1px 0 rgba(255, 255, 255, .62),\n      0 10px 20px rgba(23, 20, 44, .20);\n    color: #3d2b35;\n    text-align: center;\n    line-height: 1;\n    backdrop-filter: blur(8px);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-chip span {\n    display: block;\n    font-size: 8px;\n    letter-spacing: .13em;\n    color: rgba(61, 43, 53, .68);\n    font-weight: 900;\n    margin-bottom: 3px;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-chip b {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    min-height: 14px;\n    font-size: 14px;\n    color: #3d2b35;\n    font-weight: 950;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-target-row {\n    display: inline-flex;\n    align-items: center;\n    gap: 5px;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-target-icon {\n    width: 15px;\n    height: 15px;\n    display: inline-block;\n    box-shadow: inset 0 2px 4px rgba(255, 255, 255, .35), 0 2px 7px rgba(35, 24, 52, .20);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-target-icon.t0 { background: radial-gradient(circle at 50% 42%, #fff8e8 0 42%, #f6d58a 44% 100%); border-radius: 50% 50% 44% 44%; }\n  #moon_rabbit_workshop_v1 .hlm-target-icon.t1 { background: #8b5c38; border-radius: 6px; transform: rotate(-18deg); }\n  #moon_rabbit_workshop_v1 .hlm-target-icon.t2 { background: radial-gradient(circle at 34% 30%, #fff8e8, #f7dfa2 64%, #9f7a49); border-radius: 50%; }\n  #moon_rabbit_workshop_v1 .hlm-target-icon.t3 { background:#f6d58a; clip-path: polygon(50% 0%, 62% 34%, 98% 36%, 69% 56%, 79% 92%, 50% 70%, 21% 92%, 31% 56%, 2% 36%, 38% 34%); }\n  #moon_rabbit_workshop_v1 .hlm-target-icon.t4 { background:#cfc7f4; border-radius: 70% 70% 70% 18%; transform: rotate(45deg); }\n  #moon_rabbit_workshop_v1 .hlm-target-icon.t5 { background:#9fb9e8; border-radius: 6px 6px 9px 9px; }\n  #moon_rabbit_workshop_v1 .hlm-target-icon.t6 { background:#d6a96c; clip-path: polygon(18% 0, 82% 0, 82% 100%, 50% 82%, 18% 100%); }\n  #moon_rabbit_workshop_v1 .hlm-target-icon.moonDust { background: radial-gradient(circle at 35% 30%, #fff8e8, #cfc7f4 66%, #7f6fb2); border-radius: 55% 55% 70% 22%; transform: rotate(30deg); }\n\n  #moon_rabbit_workshop_v1 .hlm-progress {\n    position: absolute;\n    z-index: 7;\n    top: 55px;\n    left: 50%;\n    transform: translateX(-50%);\n    width: min(430px, 44%);\n    height: 5px;\n    border-radius: 99px;\n    border: 1px solid rgba(255, 241, 214, .30);\n    background: rgba(31, 25, 55, .40);\n    overflow: hidden;\n    box-shadow: inset 0 2px 6px rgba(17, 13, 31, .30);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-progress > i {\n    display: block;\n    width: 0%;\n    height: 100%;\n    border-radius: inherit;\n    background: linear-gradient(90deg, #9fb9e8, #f6d58a, #fff8e8);\n    box-shadow: 0 0 14px rgba(246, 213, 138, .55);\n    transition: width .28s ease;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-icon-btn {\n    width: 46px;\n    height: 46px;\n    border-radius: 16px;\n    border: 1px solid rgba(255, 241, 214, .34);\n    background: linear-gradient(180deg, rgba(255, 248, 232, .84), rgba(91, 75, 131, .32));\n    color: var(--moon-cream);\n    display: grid;\n    place-items: center;\n    cursor: pointer;\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, .28), 0 12px 24px rgba(18, 14, 34, .24);\n    backdrop-filter: blur(8px);\n    transition: transform .15s ease, background .15s ease, border-color .15s ease, color .15s ease;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-icon-btn:active {\n    transform: translateY(1px) scale(.96);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-icon-btn:hover {\n    border-color: rgba(246, 213, 138, .70);\n    background: linear-gradient(180deg, rgba(255, 248, 232, .94), rgba(246, 213, 138, .38));\n    color: #fff8e8;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-sound-icon {\n    width: 34px;\n    height: 28px;\n    position: relative;\n    display: block;\n    color: currentColor;\n    transform: scale(.82);\n    transform-origin: center;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-sound-box {\n    position: absolute;\n    left: 0;\n    top: 9px;\n    width: 7px;\n    height: 11px;\n    border-radius: 2px;\n    background: currentColor;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-sound-cone {\n    position: absolute;\n    left: 7px;\n    top: 2px;\n    width: 13px;\n    height: 25px;\n    background: currentColor;\n    clip-path: polygon(0 32%, 100% 0, 100% 100%, 0 68%);\n    border-radius: 2px;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-sound-wave {\n    position: absolute;\n    border: 3px solid currentColor;\n    border-left: 0;\n    border-top-color: transparent;\n    border-bottom-color: transparent;\n    border-radius: 0 999px 999px 0;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-sound-wave.w1 { left: 19px; top: 10px; width: 6px; height: 9px; opacity: .96; }\n  #moon_rabbit_workshop_v1 .hlm-sound-wave.w2 { left: 21px; top: 6px; width: 10px; height: 17px; opacity: .78; }\n  #moon_rabbit_workshop_v1 .hlm-sound-wave.w3 { left: 23px; top: 2px; width: 14px; height: 25px; opacity: .62; }\n\n  #moon_rabbit_workshop_v1 .hlm-mute-slash {\n    position: absolute;\n    left: 12px;\n    top: 1px;\n    width: 4px;\n    height: 28px;\n    border-radius: 99px;\n    background: var(--moon-red);\n    transform: rotate(-38deg);\n    opacity: 0;\n    box-shadow: 0 0 4px rgba(217, 103, 95, .38);\n  }\n\n  #moon_rabbit_workshop_v1 .is-muted .hlm-sound-wave { opacity: 0; }\n  #moon_rabbit_workshop_v1 .is-muted .hlm-mute-slash { opacity: 1; }\n\n  #moon_rabbit_workshop_v1 .hlm-pause-icon {\n    width: 20px;\n    height: 22px;\n    position: relative;\n    display: block;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-pause-icon:before,\n  #moon_rabbit_workshop_v1 .hlm-pause-icon:after {\n    content: \"\";\n    position: absolute;\n    top: 2px;\n    width: 6px;\n    height: 18px;\n    border-radius: 6px;\n    background: currentColor;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-pause-icon:before { left: 3px; }\n  #moon_rabbit_workshop_v1 .hlm-pause-icon:after { right: 3px; }\n\n  #moon_rabbit_workshop_v1 .hlm-fs-icon {\n    width: 23px;\n    height: 23px;\n    position: relative;\n    display: block;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-fs-icon i {\n    position: absolute;\n    width: 9px;\n    height: 9px;\n    border-color: currentColor;\n    border-style: solid;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-fs-icon i:nth-child(1) { left: 0; top: 0; border-width: 3px 0 0 3px; border-radius: 4px 0 0 0; }\n  #moon_rabbit_workshop_v1 .hlm-fs-icon i:nth-child(2) { right: 0; top: 0; border-width: 3px 3px 0 0; border-radius: 0 4px 0 0; }\n  #moon_rabbit_workshop_v1 .hlm-fs-icon i:nth-child(3) { left: 0; bottom: 0; border-width: 0 0 3px 3px; border-radius: 0 0 0 4px; }\n  #moon_rabbit_workshop_v1 .hlm-fs-icon i:nth-child(4) { right: 0; bottom: 0; border-width: 0 3px 3px 0; border-radius: 0 0 4px 0; }\n\n  #moon_rabbit_workshop_v1 .hlm-popup,\n  #moon_rabbit_workshop_v1 .hlm-rotate {\n    position: absolute;\n    inset: 0;\n    z-index: 30;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 22px;\n    background:\n      radial-gradient(circle at center, rgba(255, 241, 214, .16), transparent 38%),\n      rgba(24, 20, 45, .64);\n    backdrop-filter: blur(8px);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-popup.hlm-hidden { display: none; }\n\n  #moon_rabbit_workshop_v1 .hlm-card {\n    width: min(430px, 88%);\n    border-radius: 28px;\n    border: 1px solid rgba(255, 241, 214, .38);\n    background:\n      radial-gradient(circle at 28% 18%, rgba(255, 255, 255, .46), transparent 30%),\n      linear-gradient(180deg, rgba(255, 248, 232, .96), rgba(247, 223, 162, .88));\n    box-shadow: 0 26px 70px rgba(18, 14, 34, .42), inset 0 1px 0 rgba(255, 255, 255, .62);\n    padding: 28px 26px 24px;\n    color: #3d2b35;\n    text-align: center;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-card h3 {\n    margin: 0 0 10px;\n    font-size: 26px;\n    line-height: 1.1;\n    letter-spacing: .01em;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-card p {\n    margin: 0 auto 19px;\n    max-width: 330px;\n    font-size: 14px;\n    line-height: 1.55;\n    color: rgba(61, 43, 53, .78);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-actions {\n    display: flex;\n    flex-direction: column;\n    gap: 11px;\n    align-items: center;\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-main-btn,\n  #moon_rabbit_workshop_v1 .hlm-sub-btn {\n    width: min(255px, 100%);\n    min-height: 46px;\n    border-radius: 999px;\n    border: 1px solid rgba(255, 241, 214, .38);\n    cursor: pointer;\n    font-weight: 950;\n    letter-spacing: .02em;\n    color: #3d2b35;\n    background: linear-gradient(180deg, #fff8e8, #f6d58a);\n    box-shadow: 0 12px 24px rgba(38, 29, 54, .22), inset 0 1px 0 rgba(255, 255, 255, .58);\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-sub-btn {\n    color: #fff8e8;\n    background: linear-gradient(180deg, rgba(91, 75, 131, .62), rgba(43, 35, 66, .72));\n  }\n\n  #moon_rabbit_workshop_v1 .hlm-rotate {\n    display: none;\n    z-index: 40;\n  }\n\n  #moon_rabbit_workshop_v1.hlm-portrait .hlm-rotate { display: flex; }\n\n  @media (max-width: 760px) {\n    #moon_rabbit_workshop_v1 { border-radius: 18px; }\n    #moon_rabbit_workshop_v1 .hlm-icon-btn { width: 41px; height: 41px; border-radius: 14px; }\n    #moon_rabbit_workshop_v1 .hlm-top-left { top: 10px; left: 10px; gap: 7px; }\n    #moon_rabbit_workshop_v1 .hlm-top-right { top: 10px; right: 10px; }\n    #moon_rabbit_workshop_v1 .hlm-top-stats { top: 8px; gap: 4px; max-width: calc(100% - 150px); }\n    #moon_rabbit_workshop_v1 .hlm-chip { min-width: 64px; height: 31px; padding: 4px 5px 3px; border-radius: 11px; }\n    #moon_rabbit_workshop_v1 .hlm-chip span { font-size: 6.6px; letter-spacing: .10em; margin-bottom: 2px; }\n    #moon_rabbit_workshop_v1 .hlm-chip b { min-height: 12px; font-size: 11px; }\n    #moon_rabbit_workshop_v1 .hlm-target-icon { width: 11px; height: 11px; }\n    #moon_rabbit_workshop_v1 .hlm-progress { top: 45px; width: min(320px, 40%); height: 4px; }\n    #moon_rabbit_workshop_v1 .hlm-chip,\n    #moon_rabbit_workshop_v1 .hlm-icon-btn,\n    #moon_rabbit_workshop_v1 .hlm-card {\n      backdrop-filter: none;\n      -webkit-backdrop-filter: none;\n    }\n    #moon_rabbit_workshop_v1 { box-shadow: 0 14px 34px rgba(23, 20, 44, .22); }\n  }\n<\/style>\n\n<div id=\"moon_rabbit_workshop_v1\">\n  <div class=\"hlm-game-frame\">\n    <canvas id=\"hlm_m3_canvas_v4\" aria-label=\"Moon Rabbit Workshop game\"><\/canvas>\n\n    <div class=\"hlm-top-left\">\n      <button class=\"hlm-icon-btn\" id=\"hlm_m3_pause_v4\" type=\"button\" aria-label=\"Pause\">\n        <span class=\"hlm-pause-icon\"><\/span>\n      <\/button>\n\n      <button class=\"hlm-icon-btn\" id=\"hlm_m3_sound_v4\" type=\"button\" aria-label=\"Sound\">\n        <span class=\"hlm-sound-icon\">\n          <span class=\"hlm-sound-box\"><\/span>\n          <span class=\"hlm-sound-cone\"><\/span>\n          <span class=\"hlm-sound-wave w1\"><\/span>\n          <span class=\"hlm-sound-wave w2\"><\/span>\n          <span class=\"hlm-sound-wave w3\"><\/span>\n          <span class=\"hlm-mute-slash\"><\/span>\n        <\/span>\n      <\/button>\n    <\/div>\n\n    <div class=\"hlm-top-stats\">\n      <div class=\"hlm-chip\"><span>LEVEL<\/span><b id=\"hlm_m3_level_v4\">1<\/b><\/div>\n      <div class=\"hlm-chip\"><span>SCORE<\/span><b id=\"hlm_m3_score_v4\">0<\/b><\/div>\n      <div class=\"hlm-chip\"><span>MOVES<\/span><b id=\"hlm_m3_moves_v4\">0<\/b><\/div>\n      <div class=\"hlm-chip\">\n        <span>TARGET<\/span>\n        <b class=\"hlm-target-row\">\n          <i id=\"hlm_m3_target_icon_v4\" class=\"hlm-target-icon t0\"><\/i>\n          <em id=\"hlm_m3_target_v4\" style=\"font-style:normal;\">0\/0<\/em>\n        <\/b>\n      <\/div>\n    <\/div>\n\n    <div class=\"hlm-progress\"><i id=\"hlm_m3_progress_v4\"><\/i><\/div>\n\n    <div class=\"hlm-top-right\">\n      <button class=\"hlm-icon-btn\" id=\"hlm_m3_fullscreen_v4\" type=\"button\" aria-label=\"Fullscreen\">\n        <span class=\"hlm-fs-icon\"><i><\/i><i><\/i><i><\/i><i><\/i><\/span>\n      <\/button>\n    <\/div>\n\n    <div class=\"hlm-popup\" id=\"hlm_m3_popup_v4\">\n      <div class=\"hlm-card\">\n        <h3 id=\"hlm_m3_popup_title_v4\">Moon Rabbit Workshop<\/h3>\n        <p id=\"hlm_m3_popup_text_v4\">Swap moonlit workshop charms, collect the target, and keep the creamy moonlight glowing before your moves run out.<\/p>\n        <div class=\"hlm-actions\" id=\"hlm_m3_popup_actions_v4\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"hlm-rotate\" id=\"hlm_m3_rotate_v4\">\n      <div class=\"hlm-card\">\n        <h3>Turn the Workshop Sideways<\/h3>\n        <p>Moon Rabbit Workshop is designed sideways so the board, buttons, and target panel stay clear, cozy, and comfortable on your screen.<\/p>\n        <div class=\"hlm-actions\">\n          <button class=\"hlm-main-btn\" id=\"hlm_m3_rotate_full_v4\" type=\"button\">Fullscreen<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>(function () {\n  \"use strict\";\n\n  function initializeMochiMooncraft() {\n  const root = document.getElementById(\"moon_rabbit_workshop_v1\");\n  if (!root || root.dataset.mochiMooncraftReady === \"1\") return;\n  const canvas = root.querySelector(\"#hlm_m3_canvas_v4\");\n  if (!canvas || typeof canvas.getContext !== \"function\") return;\n  const ctx = canvas.getContext(\"2d\");\n  if (!ctx) return;\n  root.dataset.mochiMooncraftReady = \"1\";\n\n  \/\/ Preserve JavaScript short-circuit behavior without an ampersand operator.\n  function __mochiMooncraftAnd(left, right) {\n    return left ? right() : left;\n  }\n\n  function safeGetItem(key) {\n    try { return window.localStorage.getItem(key); } catch (error) { return null; }\n  }\n  function safeSetItem(key, value) {\n    try { window.localStorage.setItem(key, String(value)); } catch (error) {}\n  }\n\n  const soundBtn = document.getElementById(\"hlm_m3_sound_v4\");\n  const pauseBtn = document.getElementById(\"hlm_m3_pause_v4\");\n  const fsBtn = document.getElementById(\"hlm_m3_fullscreen_v4\");\n  const rotateFullBtn = document.getElementById(\"hlm_m3_rotate_full_v4\");\n\n  const levelEl = document.getElementById(\"hlm_m3_level_v4\");\n  const scoreEl = document.getElementById(\"hlm_m3_score_v4\");\n  const movesEl = document.getElementById(\"hlm_m3_moves_v4\");\n  const targetEl = document.getElementById(\"hlm_m3_target_v4\");\n  const targetIcon = document.getElementById(\"hlm_m3_target_icon_v4\");\n  const progressEl = document.getElementById(\"hlm_m3_progress_v4\");\n\n  const popup = document.getElementById(\"hlm_m3_popup_v4\");\n  const popupTitle = document.getElementById(\"hlm_m3_popup_title_v4\");\n  const popupText = document.getElementById(\"hlm_m3_popup_text_v4\");\n  const popupActions = document.getElementById(\"hlm_m3_popup_actions_v4\");\n\n  const BASE_W = 1280;\n  const BASE_H = 720;\n  const COLS = 10;\n  const ROWS = 6;\n  const BOARD_GAP = 7;\n  const BOARD_SIDE_SAFE = 86;\n  const BOARD_TOP_SAFE = 92;\n  const BOARD_BOTTOM_SAFE = 35;\n\n  const MOBILE_BOARD_GAP = 6;\n  const MOBILE_BOARD_SIDE_SAFE = 170;\n  const MOBILE_BOARD_TOP_SAFE = 165;\n  const MOBILE_BOARD_BOTTOM_SAFE = 35;\n\n  let cachedLayout = null;\n  let cachedLayoutKey = \"\";\n\n  const STORE = \"moon_rabbit_workshop_match3_v1_\";\n  const K_LEVEL = STORE + \"level\";\n  const K_BEST = STORE + \"best\";\n  const K_MUTED = STORE + \"muted\";\n\n  const TILE_COLORS = [\n    { base: \"#FFF1D6\", light: \"#FFFFFF\", dark: \"#D8B978\" },\n    { base: \"#8B5C38\", light: \"#D6A96C\", dark: \"#4F3328\" },\n    { base: \"#F6D58A\", light: \"#FFF8E8\", dark: \"#B98A43\" },\n    { base: \"#E8A95C\", light: \"#FFE1A8\", dark: \"#9A6437\" },\n    { base: \"#CFC7F4\", light: \"#F0ECFF\", dark: \"#7F6FB2\" },\n    { base: \"#9FB9E8\", light: \"#E6F0FF\", dark: \"#566DAB\" },\n    { base: \"#D6A96C\", light: \"#FFE7BA\", dark: \"#7D4F34\" }\n  ];\n\n  let scaleX = 1;\n  let scaleY = 1;\n  let audioCtx = null;\n\n  const state = {\n    board: [],\n    level: 1,\n    unlocked: Math.max(1, parseInt(safeGetItem(K_LEVEL) || \"1\", 10) || 1),\n    score: 0,\n    best: Math.max(0, parseInt(safeGetItem(K_BEST) || \"0\", 10) || 0),\n    levelStartScore: 0,\n    moves: 0,\n    config: null,\n    progress: 0,\n    mode: \"start\",\n    selected: null,\n    pointer: null,\n    muted: safeGetItem(K_MUTED) === \"1\",\n    particles: [],\n    texts: [],\n    lastNow: 0,\n    idCounter: 1\n  };\n\n  function clamp(n, a, b) {\n    return Math.max(a, Math.min(b, n));\n  }\n\n  function rand(min, max) {\n    return min + Math.random() * (max - min);\n  }\n\n  function sleep(ms) {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  }\n\n  function easeOutCubic(t) {\n    return 1 - Math.pow(1 - t, 3);\n  }\n\n  function key(r, c) {\n    return r + \",\" + c;\n  }\n\n  function parseKey(k) {\n    const p = k.split(\",\");\n    return { r: +p[0], c: +p[1] };\n  }\n\n  function resizeCanvas() {\n    const rect = canvas.getBoundingClientRect();\n    const smallScreen = rect.width < 780 || rect.height < 520;\n    const dprLimit = smallScreen ? 1.25 : 1.6;\n    const dpr = Math.min(window.devicePixelRatio || 1, dprLimit);\n    const w = Math.max(2, Math.floor(rect.width * dpr));\n    const h = Math.max(2, Math.floor(rect.height * dpr));\n\n    if (canvas.width !== w || canvas.height !== h) {\n      canvas.width = w;\n      canvas.height = h;\n      cachedLayout = null;\n      cachedLayoutKey = \"\";\n    }\n\n    scaleX = canvas.width \/ BASE_W;\n    scaleY = canvas.height \/ BASE_H;\n    setPortraitClass();\n  }\n\n  function setPortraitClass() {\n    const portrait = window.matchMedia(\"(orientation: portrait) and (max-width: 900px)\").matches;\n    root.classList.toggle(\"hlm-portrait\", portrait);\n  }\n\n  function layout() {\n    const rect = canvas.getBoundingClientRect();\n    const compactScreen = rect.width < 900 || rect.height < 520;\n    const layoutKey = Math.round(rect.width) + \"x\" + Math.round(rect.height) + \":\" + (compactScreen ? \"compact\" : \"desktop\");\n\n    if (__mochiMooncraftAnd((cachedLayout), () => (cachedLayoutKey === layoutKey))) return cachedLayout;\n\n    const gap = compactScreen ? MOBILE_BOARD_GAP : BOARD_GAP;\n    const sideSafe = compactScreen ? MOBILE_BOARD_SIDE_SAFE : BOARD_SIDE_SAFE;\n    const topSafe = compactScreen ? MOBILE_BOARD_TOP_SAFE : BOARD_TOP_SAFE;\n    const bottomSafe = compactScreen ? MOBILE_BOARD_BOTTOM_SAFE : BOARD_BOTTOM_SAFE;\n\n    const usableW = BASE_W - sideSafe * 2;\n    const usableH = BASE_H - topSafe - bottomSafe;\n    const tile = Math.floor(Math.min(\n      (usableW - (COLS - 1) * gap) \/ COLS,\n      (usableH - (ROWS - 1) * gap) \/ ROWS\n    ));\n\n    const step = tile + gap;\n    const boardW = COLS * tile + (COLS - 1) * gap;\n    const boardH = ROWS * tile + (ROWS - 1) * gap;\n\n    cachedLayout = {\n      compact: compactScreen,\n      tile,\n      gap,\n      step,\n      boardW,\n      boardH,\n      x: Math.round((BASE_W - boardW) \/ 2),\n      y: Math.round(topSafe + (usableH - boardH) \/ 2)\n    };\n\n    cachedLayoutKey = layoutKey;\n    return cachedLayout;\n  }\n\n  function cellPos(r, c) {\n    const l = layout();\n    return {\n      x: l.x + c * l.step,\n      y: l.y + r * l.step\n    };\n  }\n\n  function cellCenter(r, c) {\n    const p = cellPos(r, c);\n    const l = layout();\n    return {\n      x: p.x + l.tile \/ 2,\n      y: p.y + l.tile \/ 2\n    };\n  }\n\n  function makeTile(type) {\n    return {\n      id: state.idCounter++,\n      type,\n      special: \"none\",\n      moonDust: 0,\n      clearing: false,\n      clearStart: 0,\n      born: performance.now(),\n      vx: null,\n      vy: null,\n      fromX: null,\n      fromY: null,\n      toX: null,\n      toY: null,\n      animStart: 0,\n      animDur: 0\n    };\n  }\n\n  function visualPos(tile, r, c, now) {\n    const p = cellPos(r, c);\n\n    if (tile.vx === null || tile.vy === null || !tile.animDur) {\n      return p;\n    }\n\n    const t = clamp((now - tile.animStart) \/ tile.animDur, 0, 1);\n    const e = easeOutCubic(t);\n\n    return {\n      x: tile.fromX + (tile.toX - tile.fromX) * e,\n      y: tile.fromY + (tile.toY - tile.fromY) * e\n    };\n  }\n\n  function resetTileVisual(tile) {\n    tile.vx = null;\n    tile.vy = null;\n    tile.fromX = null;\n    tile.fromY = null;\n    tile.toX = null;\n    tile.toY = null;\n    tile.animStart = 0;\n    tile.animDur = 0;\n  }\n\n  function randomType() {\n    return Math.floor(Math.random() * state.config.activeTypes);\n  }\n\n  function makeLevelConfig(level) {\n    const activeTypes = Math.min(7, 5 + Math.floor((level - 1) \/ 6));\n    const moonDustLevel = __mochiMooncraftAnd((level >= 5), () => (level % 3 === 0));\n    const hardTier = Math.floor(level \/ 5);\n    const moves = Math.max(16, 28 - hardTier);\n    const shuffleChaos = Math.min(44, 8 + level * 2);\n\n    if (moonDustLevel) {\n      return {\n        level,\n        activeTypes,\n        kind: \"moonDust\",\n        targetType: null,\n        targetNeed: Math.min(38, 10 + Math.floor(level * 1.55)),\n        moves,\n        shuffleChaos\n      };\n    }\n\n    return {\n      level,\n      activeTypes,\n      kind: \"collect\",\n      targetType: (level * 2 + 1) % activeTypes,\n      targetNeed: Math.min(58, 14 + Math.floor(level * 2.6)),\n      moves,\n      shuffleChaos\n    };\n  }\n\n  function addMoonDust(count) {\n    const spots = [];\n\n    for (let r = 0; r < ROWS; r++) {\n      for (let c = 0; c < COLS; c++) {\n        spots.push({ r, c });\n      }\n    }\n\n    for (let i = spots.length - 1; i > 0; i--) {\n      const j = Math.floor(Math.random() * (i + 1));\n      const t = spots[i];\n      spots[i] = spots[j];\n      spots[j] = t;\n    }\n\n    for (let i = 0; i < Math.min(count, spots.length); i++) {\n      const p = spots[i];\n      state.board[p.r][p.c].moonDust = 1;\n    }\n  }\n\n  function buildBoard(moonDustCount) {\n    let attempts = 0;\n\n    while (attempts++ < 120) {\n      const b = Array.from({ length: ROWS }, () => Array(COLS).fill(null));\n\n      for (let r = 0; r < ROWS; r++) {\n        for (let c = 0; c < COLS; c++) {\n          let type = randomType();\n          let guard = 0;\n\n          while (guard++ < 40) {\n            const leftMatch = __mochiMooncraftAnd((__mochiMooncraftAnd((__mochiMooncraftAnd((__mochiMooncraftAnd((c >= 2), () => (b[r][c - 1]))), () => (b[r][c - 2]))), () => (b[r][c - 1].type === type))), () => (b[r][c - 2].type === type));\n            const upMatch = __mochiMooncraftAnd((__mochiMooncraftAnd((__mochiMooncraftAnd((__mochiMooncraftAnd((r >= 2), () => (b[r - 1][c]))), () => (b[r - 2][c]))), () => (b[r - 1][c].type === type))), () => (b[r - 2][c].type === type));\n\n            if (__mochiMooncraftAnd((!leftMatch), () => (!upMatch))) break;\n            type = randomType();\n          }\n\n          b[r][c] = makeTile(type);\n        }\n      }\n\n      state.board = b;\n\n      if (state.config.kind === \"moonDust\") {\n        addMoonDust(clamp(moonDustCount, 0, COLS * ROWS));\n      }\n\n      if (hasPossibleMoves()) {\n        return b;\n      }\n    }\n\n    return state.board;\n  }\n\n  function addDifficultyShuffle() {\n    if (!state.config || !state.config.shuffleChaos) return;\n\n    const tries = state.config.shuffleChaos;\n\n    for (let i = 0; i < tries; i++) {\n      const a = {\n        r: Math.floor(Math.random() * ROWS),\n        c: Math.floor(Math.random() * COLS)\n      };\n\n      const b = {\n        r: Math.floor(Math.random() * ROWS),\n        c: Math.floor(Math.random() * COLS)\n      };\n\n      if (__mochiMooncraftAnd((a.r === b.r), () => (a.c === b.c))) continue;\n\n      swapCells(a, b);\n\n      const hasStartMatch = findMatches().length > 0;\n      const playable = hasPossibleMoves();\n\n      if (hasStartMatch || !playable) {\n        swapCells(a, b);\n      }\n    }\n  }\n\n  function startLevel(level, resetScore) {\n    state.level = level;\n    state.config = makeLevelConfig(level);\n    state.moves = state.config.moves;\n    state.progress = 0;\n    state.selected = null;\n    state.mode = \"idle\";\n\n    if (resetScore) {\n      state.score = 0;\n    }\n\n    state.levelStartScore = state.score;\n    state.board = buildBoard(state.config.kind === \"moonDust\" ? state.config.targetNeed : 0);\n    addDifficultyShuffle();\n\n    hidePopup();\n    updateUI();\n    sfx(\"start\");\n  }\n\n  function showStartPopup() {\n    const buttons = [\n      { text: \"Open the Workshop\", type: \"main\", fn: () => startLevel(1, true) }\n    ];\n\n    if (state.unlocked > 1) {\n      buttons.push({\n        text: \"Continue Night \" + state.unlocked,\n        type: \"sub\",\n        fn: () => startLevel(state.unlocked, true)\n      });\n    }\n\n    showPopup(\"Moon Rabbit Workshop\", \"Swap moonlit workshop charms, collect the target, and keep the creamy moonlight glowing before your moves run out.\", buttons);\n  }\n\n  function showPopup(title, text, buttons) {\n    popupTitle.textContent = title;\n    popupText.textContent = text;\n    popupActions.innerHTML = \"\";\n\n    (buttons || []).forEach(item => {\n      const btn = document.createElement(\"button\");\n      btn.type = \"button\";\n      btn.className = item.type === \"sub\" ? \"hlm-sub-btn\" : \"hlm-main-btn\";\n      btn.textContent = item.text;\n      btn.addEventListener(\"click\", () => {\n        unlockAudio();\n        sfx(\"button\");\n        item.fn();\n      });\n      popupActions.appendChild(btn);\n    });\n\n    popup.classList.remove(\"hlm-hidden\");\n  }\n\n  function hidePopup() {\n    popup.classList.add(\"hlm-hidden\");\n  }\n\n  async function showTempPopup(title, text, ms) {\n    showPopup(title, text, []);\n    await sleep(ms);\n    hidePopup();\n  }\n\n  function updateUI() {\n    levelEl.textContent = state.level;\n    scoreEl.textContent = state.score;\n    movesEl.textContent = state.moves;\n\n    const need = state.config ? state.config.targetNeed : 0;\n    const progress = clamp(state.progress, 0, need);\n\n    targetEl.textContent = progress + \"\/\" + need;\n    progressEl.style.width = need ? clamp((progress \/ need) * 100, 0, 100) + \"%\" : \"0%\";\n\n    if (__mochiMooncraftAnd((state.config), () => (state.config.kind === \"moonDust\"))) {\n      targetIcon.className = \"hlm-target-icon moonDust\";\n    } else if (state.config) {\n      targetIcon.className = \"hlm-target-icon t\" + state.config.targetType;\n    }\n\n    if (state.score > state.best) {\n      state.best = state.score;\n      safeSetItem(K_BEST, String(state.best));\n    }\n  }\n\n  function isTargetComplete() {\n    return __mochiMooncraftAnd((state.config), () => (state.progress >= state.config.targetNeed));\n  }\n\n  function levelComplete() {\n    state.mode = \"complete\";\n    const bonus = state.moves * 80;\n\n    state.score += bonus;\n    updateUI();\n\n    const next = state.level + 1;\n    state.unlocked = Math.max(state.unlocked, next);\n    safeSetItem(K_LEVEL, String(state.unlocked));\n\n    sfx(\"win\");\n    addFloatingText(BASE_W \/ 2, 100, \"Mooncraft Restored!\", \"#fff1d6\", 28);\n\n    showPopup(\"Mooncraft Restored!\", \"Moves bonus +\" + bonus + \". A new moonlit workbench is waiting to be arranged.\", [\n      { text: \"Next Workbench\", type: \"main\", fn: () => startLevel(next, false) },\n      { text: \"Restart From Night 1\", type: \"sub\", fn: () => startLevel(1, true) }\n    ]);\n  }\n\n  function gameOver() {\n    state.mode = \"gameover\";\n    sfx(\"lose\");\n\n    showPopup(\"Moon Tools Scattered\", \"The target was close, but the little moon workshop needs one more gentle arrangement.\", [\n      {\n        text: \"Retry This Night\",\n        type: \"main\",\n        fn: () => {\n          state.score = state.levelStartScore;\n          startLevel(state.level, false);\n        }\n      },\n      { text: \"Start Over\", type: \"sub\", fn: () => startLevel(1, true) }\n    ]);\n  }\n\n  function pauseGame() {\n    if (state.mode !== \"idle\") return;\n\n    state.mode = \"paused\";\n    sfx(\"button\");\n\n    showPopup(\"Workshop Break\", \"The moon lanterns are glowing quietly. Take a breath, then return to the little cloud-lit board.\", [\n      {\n        text: \"Resume Crafting\",\n        type: \"main\",\n        fn: () => {\n          hidePopup();\n          state.mode = \"idle\";\n        }\n      },\n      {\n        text: \"Restart Night\",\n        type: \"sub\",\n        fn: () => {\n          state.score = state.levelStartScore;\n          startLevel(state.level, false);\n        }\n      }\n    ]);\n  }\n\n  function unlockAudio() {\n    if (audioCtx) return;\n\n    const AudioContext = window.AudioContext || window.webkitAudioContext;\n    if (!AudioContext) return;\n\n    audioCtx = new AudioContext();\n  }\n\n  function beep(freq, dur, gain, type, slide) {\n    if (state.muted || !audioCtx) return;\n\n    const t = audioCtx.currentTime;\n    const osc = audioCtx.createOscillator();\n    const vol = audioCtx.createGain();\n\n    osc.type = type || \"sine\";\n    osc.frequency.setValueAtTime(freq, t);\n\n    if (slide) {\n      osc.frequency.exponentialRampToValueAtTime(Math.max(40, freq + slide), t + dur);\n    }\n\n    vol.gain.setValueAtTime(0.0001, t);\n    vol.gain.exponentialRampToValueAtTime(gain, t + 0.015);\n    vol.gain.exponentialRampToValueAtTime(0.0001, t + dur);\n\n    osc.connect(vol);\n    vol.connect(audioCtx.destination);\n    osc.start(t);\n    osc.stop(t + dur + 0.03);\n  }\n\n  function sfx(name) {\n    if (state.muted) return;\n\n    if (name === \"select\") beep(540, .045, .020, \"sine\", 40);\n    if (name === \"button\") beep(390, .055, .022, \"triangle\", 35);\n    if (name === \"swap\") beep(420, .075, .023, \"sine\", 120);\n    if (name === \"bad\") beep(170, .12, .020, \"triangle\", -35);\n    if (name === \"match\") {\n      beep(650, .08, .026, \"triangle\", 120);\n      setTimeout(() => beep(890, .07, .017, \"sine\", 80), 45);\n    }\n    if (name === \"special\") {\n      beep(560, .08, .026, \"triangle\", 220);\n      setTimeout(() => beep(980, .11, .023, \"sine\", 160), 70);\n    }\n    if (name === \"start\") beep(560, .12, .024, \"sine\", 120);\n    if (name === \"win\") {\n      beep(540, .12, .028, \"sine\", 120);\n      setTimeout(() => beep(760, .12, .028, \"sine\", 160), 110);\n      setTimeout(() => beep(1040, .18, .022, \"triangle\", 140), 220);\n    }\n    if (name === \"lose\") {\n      beep(230, .18, .022, \"triangle\", -60);\n      setTimeout(() => beep(150, .22, .016, \"sine\", -40), 150);\n    }\n  }\n\n  function setMuted(value) {\n    state.muted = value;\n    soundBtn.classList.toggle(\"is-muted\", state.muted);\n    safeSetItem(K_MUTED, state.muted ? \"1\" : \"0\");\n  }\n\n  function swapCells(a, b) {\n    const t = state.board[a.r][a.c];\n    state.board[a.r][a.c] = state.board[b.r][b.c];\n    state.board[b.r][b.c] = t;\n  }\n\n  function areAdjacent(a, b) {\n    return Math.abs(a.r - b.r) + Math.abs(a.c - b.c) === 1;\n  }\n\n  function findMatches() {\n    const matches = [];\n\n    for (let r = 0; r < ROWS; r++) {\n      let c = 0;\n\n      while (c < COLS) {\n        const tile = state.board[r][c];\n\n        if (!tile) {\n          c++;\n          continue;\n        }\n\n        const type = tile.type;\n        let end = c + 1;\n\n        while (__mochiMooncraftAnd((__mochiMooncraftAnd((end < COLS), () => (state.board[r][end]))), () => (state.board[r][end].type === type))) {\n          end++;\n        }\n\n        if (end - c >= 3) {\n          const cells = [];\n          for (let x = c; x < end; x++) cells.push({ r, c: x });\n          matches.push({ dir: \"h\", type, cells, len: cells.length });\n        }\n\n        c = end;\n      }\n    }\n\n    for (let c = 0; c < COLS; c++) {\n      let r = 0;\n\n      while (r < ROWS) {\n        const tile = state.board[r][c];\n\n        if (!tile) {\n          r++;\n          continue;\n        }\n\n        const type = tile.type;\n        let end = r + 1;\n\n        while (__mochiMooncraftAnd((__mochiMooncraftAnd((end < ROWS), () => (state.board[end][c]))), () => (state.board[end][c].type === type))) {\n          end++;\n        }\n\n        if (end - r >= 3) {\n          const cells = [];\n          for (let y = r; y < end; y++) cells.push({ r: y, c });\n          matches.push({ dir: \"v\", type, cells, len: cells.length });\n        }\n\n        r = end;\n      }\n    }\n\n    return matches;\n  }\n\n  function chooseSpecialCell(match, swappedCells) {\n    for (const s of swappedCells || []) {\n      if (match.cells.some(p => __mochiMooncraftAnd((p.r === s.r), () => (p.c === s.c)))) {\n        return { r: s.r, c: s.c };\n      }\n    }\n\n    return match.cells[Math.floor(match.cells.length \/ 2)];\n  }\n\n  function expandClearSet(clearSet) {\n    const result = new Set(clearSet);\n    const processed = new Set();\n    const queue = Array.from(clearSet);\n\n    while (queue.length) {\n      const k = queue.shift();\n\n      if (processed.has(k)) continue;\n      processed.add(k);\n\n      const p = parseKey(k);\n      const tile = __mochiMooncraftAnd((state.board[p.r]), () => (state.board[p.r][p.c]));\n\n      if (!tile || tile.special === \"none\") continue;\n\n      if (tile.special === \"row\") {\n        for (let c = 0; c < COLS; c++) {\n          const nk = key(p.r, c);\n          if (!result.has(nk)) {\n            result.add(nk);\n            queue.push(nk);\n          }\n        }\n      }\n\n      if (tile.special === \"col\") {\n        for (let r = 0; r < ROWS; r++) {\n          const nk = key(r, p.c);\n          if (!result.has(nk)) {\n            result.add(nk);\n            queue.push(nk);\n          }\n        }\n      }\n\n      if (tile.special === \"glow\") {\n        for (let r = 0; r < ROWS; r++) {\n          for (let c = 0; c < COLS; c++) {\n            const other = state.board[r][c];\n            if (__mochiMooncraftAnd((other), () => (other.type === tile.type))) {\n              const nk = key(r, c);\n              if (!result.has(nk)) {\n                result.add(nk);\n                queue.push(nk);\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return result;\n  }\n\n  function animateSwap(a, b, duration) {\n    return new Promise(resolve => {\n      const tileA = state.board[a.r][a.c];\n      const tileB = state.board[b.r][b.c];\n      const posA = cellPos(a.r, a.c);\n      const posB = cellPos(b.r, b.c);\n      const start = performance.now();\n\n      tileA.fromX = posA.x;\n      tileA.fromY = posA.y;\n      tileA.toX = posB.x;\n      tileA.toY = posB.y;\n      tileA.animStart = start;\n      tileA.animDur = duration;\n\n      tileB.fromX = posB.x;\n      tileB.fromY = posB.y;\n      tileB.toX = posA.x;\n      tileB.toY = posA.y;\n      tileB.animStart = start;\n      tileB.animDur = duration;\n\n      function step(now) {\n        const t = clamp((now - start) \/ duration, 0, 1);\n        const e = easeOutCubic(t);\n\n        tileA.vx = tileA.fromX + (tileA.toX - tileA.fromX) * e;\n        tileA.vy = tileA.fromY + (tileA.toY - tileA.fromY) * e;\n\n        tileB.vx = tileB.fromX + (tileB.toX - tileB.fromX) * e;\n        tileB.vy = tileB.fromY + (tileB.toY - tileB.fromY) * e;\n\n        if (t < 1) {\n          requestAnimationFrame(step);\n        } else {\n          swapCells(a, b);\n          resetTileVisual(tileA);\n          resetTileVisual(tileB);\n          resolve();\n        }\n      }\n\n      requestAnimationFrame(step);\n    });\n  }\n\n  async function clearCells(clearSet, combo) {\n    if (!clearSet.size) return;\n\n    const now = performance.now();\n    let cleared = 0;\n    let specialHit = false;\n\n    clearSet.forEach(k => {\n      const p = parseKey(k);\n      const tile = __mochiMooncraftAnd((state.board[p.r]), () => (state.board[p.r][p.c]));\n\n      if (!tile) return;\n\n      tile.clearing = true;\n      tile.clearStart = now;\n      cleared++;\n\n      if (tile.special !== \"none\") specialHit = true;\n\n      if (__mochiMooncraftAnd((state.config.kind === \"collect\"), () => (tile.type === state.config.targetType))) {\n        state.progress = Math.min(state.config.targetNeed, state.progress + 1);\n      }\n\n      if (__mochiMooncraftAnd((state.config.kind === \"moonDust\"), () => (tile.moonDust > 0))) {\n        state.progress = Math.min(state.config.targetNeed, state.progress + 1);\n        tile.moonDust = 0;\n      }\n\n      const center = cellCenter(p.r, p.c);\n      burst(center.x, center.y, TILE_COLORS[tile.type].light, specialHit ? 14 : 9);\n    });\n\n    const multiplier = combo <= 1 ? 1 : combo === 2 ? 1.3 : combo === 3 ? 1.6 : 2;\n    state.score += Math.round(cleared * 65 * multiplier);\n\n    if (combo > 1) {\n      addFloatingText(BASE_W \/ 2, 104 + combo * 2, \"Combo x\" + combo, \"#fff1d6\", 20);\n    }\n\n    updateUI();\n    sfx(specialHit ? \"special\" : \"match\");\n\n    await sleep(185);\n\n    clearSet.forEach(k => {\n      const p = parseKey(k);\n      if (state.board[p.r]) {\n        state.board[p.r][p.c] = null;\n      }\n    });\n  }\n\n  async function collapseAndRefill() {\n    const l = layout();\n    const newBoard = Array.from({ length: ROWS }, () => Array(COLS).fill(null));\n    let moved = false;\n    const now = performance.now();\n\n    for (let c = 0; c < COLS; c++) {\n      let write = ROWS - 1;\n\n      for (let r = ROWS - 1; r >= 0; r--) {\n        const tile = state.board[r][c];\n        if (!tile) continue;\n\n        newBoard[write][c] = tile;\n\n        const current = visualPos(tile, r, c, now);\n        const target = cellPos(write, c);\n\n        tile.fromX = current.x;\n        tile.fromY = current.y;\n        tile.toX = target.x;\n        tile.toY = target.y;\n        tile.vx = current.x;\n        tile.vy = current.y;\n        tile.animStart = performance.now();\n        tile.animDur = 260;\n\n        if (Math.abs(current.y - target.y) > 1) moved = true;\n        write--;\n      }\n\n      let spawnIndex = 0;\n      for (let r = write; r >= 0; r--) {\n        const tile = makeTile(randomType());\n        const target = cellPos(r, c);\n        const startY = l.y - (spawnIndex + 1) * l.step - rand(0, 28);\n\n        newBoard[r][c] = tile;\n\n        tile.fromX = target.x;\n        tile.fromY = startY;\n        tile.toX = target.x;\n        tile.toY = target.y;\n        tile.vx = target.x;\n        tile.vy = startY;\n        tile.animStart = performance.now();\n        tile.animDur = 280;\n\n        spawnIndex++;\n        moved = true;\n      }\n    }\n\n    state.board = newBoard;\n\n    if (!moved) return;\n\n    await animateAllTiles(280);\n  }\n\n  function animateAllTiles(duration) {\n    return new Promise(resolve => {\n      const start = performance.now();\n\n      function step(now) {\n        let active = false;\n\n        for (let r = 0; r < ROWS; r++) {\n          for (let c = 0; c < COLS; c++) {\n            const tile = state.board[r][c];\n            if (!tile || !tile.animDur) continue;\n\n            const t = clamp((now - tile.animStart) \/ tile.animDur, 0, 1);\n            const e = easeOutCubic(t);\n\n            tile.vx = tile.fromX + (tile.toX - tile.fromX) * e;\n            tile.vy = tile.fromY + (tile.toY - tile.fromY) * e;\n\n            if (t < 1) active = true;\n          }\n        }\n\n        if (__mochiMooncraftAnd((active), () => (now - start < duration + 90))) {\n          requestAnimationFrame(step);\n        } else {\n          for (let r = 0; r < ROWS; r++) {\n            for (let c = 0; c < COLS; c++) {\n              const tile = state.board[r][c];\n              if (tile) resetTileVisual(tile);\n            }\n          }\n          resolve();\n        }\n      }\n\n      requestAnimationFrame(step);\n    });\n  }\n\n  async function resolveMatches(swappedCells) {\n    let combo = 0;\n\n    while (true) {\n      const matches = findMatches();\n      if (!matches.length) break;\n\n      combo++;\n\n      let clearSet = new Set();\n      const creates = new Map();\n\n      matches.forEach(match => {\n        match.cells.forEach(p => clearSet.add(key(p.r, p.c)));\n\n        if (match.len >= 4) {\n          const chosen = chooseSpecialCell(match, swappedCells);\n          const special = match.len >= 5 ? \"glow\" : (match.dir === \"h\" ? \"row\" : \"col\");\n\n          creates.set(key(chosen.r, chosen.c), {\n            r: chosen.r,\n            c: chosen.c,\n            special,\n            type: match.type\n          });\n        }\n      });\n\n      creates.forEach((value, k) => clearSet.delete(k));\n      clearSet = expandClearSet(clearSet);\n      creates.forEach((value, k) => clearSet.delete(k));\n\n      await clearCells(clearSet, combo);\n\n      creates.forEach(item => {\n        const tile = __mochiMooncraftAnd((state.board[item.r]), () => (state.board[item.r][item.c]));\n\n        if (tile) {\n          tile.type = item.type;\n          tile.special = item.special;\n          tile.clearing = false;\n          tile.clearStart = 0;\n\n          const center = cellCenter(item.r, item.c);\n          burst(center.x, center.y, \"#fff1d6\", 18);\n        }\n      });\n\n      await collapseAndRefill();\n    }\n  }\n\n  async function resolveSpecialActivation(positions) {\n    let clearSet = new Set();\n\n    positions.forEach(p => {\n      if (__mochiMooncraftAnd((state.board[p.r]), () => (state.board[p.r][p.c]))) {\n        clearSet.add(key(p.r, p.c));\n      }\n    });\n\n    clearSet = expandClearSet(clearSet);\n\n    await clearCells(clearSet, 1);\n    await collapseAndRefill();\n    await resolveMatches([]);\n  }\n\n  function hasAnySpecialAt(a, b) {\n    const ta = __mochiMooncraftAnd((state.board[a.r]), () => (state.board[a.r][a.c]));\n    const tb = __mochiMooncraftAnd((state.board[b.r]), () => (state.board[b.r][b.c]));\n\n    return (__mochiMooncraftAnd((ta), () => (ta.special !== \"none\"))) || (__mochiMooncraftAnd((tb), () => (tb.special !== \"none\")));\n  }\n\n  async function attemptSwap(a, b) {\n    if (state.mode !== \"idle\" || !areAdjacent(a, b)) return;\n\n    state.mode = \"busy\";\n    state.selected = null;\n\n    sfx(\"swap\");\n    await animateSwap(a, b, 170);\n\n    const matches = findMatches();\n    const specialMove = hasAnySpecialAt(a, b);\n\n    if (__mochiMooncraftAnd((!matches.length), () => (specialMove))) {\n      state.moves = Math.max(0, state.moves - 1);\n      updateUI();\n\n      await resolveSpecialActivation([a, b]);\n      await afterBoardStable();\n      return;\n    }\n\n    if (!matches.length) {\n      await animateSwap(a, b, 150);\n      sfx(\"bad\");\n      state.mode = \"idle\";\n      return;\n    }\n\n    state.moves = Math.max(0, state.moves - 1);\n    updateUI();\n\n    await resolveMatches([a, b]);\n    await afterBoardStable();\n  }\n\n  async function afterBoardStable() {\n    updateUI();\n\n    if (isTargetComplete()) {\n      levelComplete();\n      return;\n    }\n\n    if (state.moves <= 0) {\n      gameOver();\n      return;\n    }\n\n    if (!hasPossibleMoves()) {\n      await showTempPopup(\"No More Moves\", \"Rearranging the workbench without using a move.\", 850);\n      shuffleBoard();\n      updateUI();\n    }\n\n    state.mode = \"idle\";\n  }\n\n  function hasPossibleMoves() {\n    for (let r = 0; r < ROWS; r++) {\n      for (let c = 0; c < COLS; c++) {\n        const tile = __mochiMooncraftAnd((state.board[r]), () => (state.board[r][c]));\n\n        if (__mochiMooncraftAnd((tile), () => (tile.special !== \"none\"))) return true;\n      }\n    }\n\n    for (let r = 0; r < ROWS; r++) {\n      for (let c = 0; c < COLS; c++) {\n        const a = { r, c };\n\n        if (c + 1 < COLS) {\n          const b = { r, c: c + 1 };\n          swapCells(a, b);\n          const ok = findMatches().length > 0;\n          swapCells(a, b);\n          if (ok) return true;\n        }\n\n        if (r + 1 < ROWS) {\n          const b = { r: r + 1, c };\n          swapCells(a, b);\n          const ok = findMatches().length > 0;\n          swapCells(a, b);\n          if (ok) return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  function shuffleBoard() {\n    const remaining = state.config.kind === \"moonDust\"\n      ? Math.max(0, state.config.targetNeed - state.progress)\n      : 0;\n\n    state.selected = null;\n    state.board = buildBoard(remaining);\n    addDifficultyShuffle();\n\n    addFloatingText(BASE_W \/ 2, 105, \"Workbench Rearranged\", \"#fff1d6\", 21);\n    sfx(\"special\");\n  }\n\n  function pointerToCell(e) {\n    const rect = canvas.getBoundingClientRect();\n    const x = (e.clientX - rect.left) \/ rect.width * BASE_W;\n    const y = (e.clientY - rect.top) \/ rect.height * BASE_H;\n    const l = layout();\n\n    const c = Math.floor((x - l.x) \/ l.step);\n    const r = Math.floor((y - l.y) \/ l.step);\n\n    if (r < 0 || r >= ROWS || c < 0 || c >= COLS) return null;\n\n    const localX = x - (l.x + c * l.step);\n    const localY = y - (l.y + r * l.step);\n\n    if (localX < 0 || localY < 0 || localX > l.tile || localY > l.tile) return null;\n\n    return { r, c, x, y };\n  }\n\n  canvas.addEventListener(\"pointerdown\", e => {\n    if (state.mode !== \"idle\") return;\n\n    unlockAudio();\n\n    const cell = pointerToCell(e);\n    if (!cell) return;\n\n    if (canvas.setPointerCapture) {\n      canvas.setPointerCapture(e.pointerId);\n    }\n\n    state.pointer = {\n      id: e.pointerId,\n      startCell: { r: cell.r, c: cell.c },\n      x: cell.x,\n      y: cell.y\n    };\n  });\n\n  canvas.addEventListener(\"pointerup\", e => {\n    if (state.mode !== \"idle\" || !state.pointer) return;\n\n    const p = state.pointer;\n    state.pointer = null;\n\n    const rect = canvas.getBoundingClientRect();\n    const x = (e.clientX - rect.left) \/ rect.width * BASE_W;\n    const y = (e.clientY - rect.top) \/ rect.height * BASE_H;\n    const dx = x - p.x;\n    const dy = y - p.y;\n    const threshold = 24;\n\n    let target = null;\n\n    if (Math.hypot(dx, dy) > threshold) {\n      if (Math.abs(dx) > Math.abs(dy)) {\n        target = { r: p.startCell.r, c: p.startCell.c + (dx > 0 ? 1 : -1) };\n      } else {\n        target = { r: p.startCell.r + (dy > 0 ? 1 : -1), c: p.startCell.c };\n      }\n\n      if (__mochiMooncraftAnd((__mochiMooncraftAnd((__mochiMooncraftAnd((target.r >= 0), () => (target.r < ROWS))), () => (target.c >= 0))), () => (target.c < COLS))) {\n        attemptSwap(p.startCell, target);\n      }\n\n      return;\n    }\n\n    const endCell = pointerToCell(e);\n    if (!endCell) return;\n\n    const tapped = { r: endCell.r, c: endCell.c };\n\n    if (__mochiMooncraftAnd((__mochiMooncraftAnd((state.selected), () => (state.selected.r === tapped.r))), () => (state.selected.c === tapped.c))) {\n      state.selected = null;\n      return;\n    }\n\n    if (__mochiMooncraftAnd((state.selected), () => (areAdjacent(state.selected, tapped)))) {\n      attemptSwap(state.selected, tapped);\n      return;\n    }\n\n    state.selected = tapped;\n    sfx(\"select\");\n  });\n\n  canvas.addEventListener(\"pointercancel\", () => {\n    state.pointer = null;\n  });\n\n  soundBtn.addEventListener(\"click\", () => {\n    unlockAudio();\n    setMuted(!state.muted);\n    sfx(\"button\");\n  });\n\n  pauseBtn.addEventListener(\"click\", () => {\n    unlockAudio();\n    pauseGame();\n  });\n\n  async function toggleFullscreen() {\n    unlockAudio();\n    sfx(\"button\");\n    const nativeFull = document.fullscreenElement || document.webkitFullscreenElement;\n    if (nativeFull) {\n      try {\n        if (document.exitFullscreen) await document.exitFullscreen();\n        else if (document.webkitExitFullscreen) document.webkitExitFullscreen();\n      } catch (error) {}\n      root.classList.remove(\"hlm-fullscreen\");\n      resizeCanvas();\n      return;\n    }\n    if (root.classList.contains(\"hlm-fullscreen\")) {\n      root.classList.remove(\"hlm-fullscreen\");\n      document.documentElement.classList.remove(\"hlm-wp-page-lock\");\n      document.body.classList.remove(\"hlm-wp-page-lock\");\n      resizeCanvas();\n      return;\n    }\n    let enteredNative = false;\n    try {\n      if (root.requestFullscreen) {\n        await root.requestFullscreen();\n        enteredNative = true;\n      } else if (root.webkitRequestFullscreen) {\n        root.webkitRequestFullscreen();\n        enteredNative = true;\n      }\n    } catch (error) {}\n    root.classList.add(\"hlm-fullscreen\");\n    if (!enteredNative) {\n      document.documentElement.classList.add(\"hlm-wp-page-lock\");\n      document.body.classList.add(\"hlm-wp-page-lock\");\n    }\n    if (__mochiMooncraftAnd((__mochiMooncraftAnd((enteredNative), () => (screen.orientation))), () => (screen.orientation.lock))) {\n      try { await screen.orientation.lock(\"landscape\"); } catch (error) {}\n    }\n    setTimeout(resizeCanvas, 120);\n  }\n\n  fsBtn.addEventListener(\"click\", toggleFullscreen);\n  rotateFullBtn.addEventListener(\"click\", toggleFullscreen);\n\n  document.addEventListener(\"fullscreenchange\", () => {\n    root.classList.toggle(\"hlm-fullscreen\", !!document.fullscreenElement);\n    document.documentElement.classList.remove(\"hlm-wp-page-lock\");\n    document.body.classList.remove(\"hlm-wp-page-lock\");\n    setTimeout(resizeCanvas, 80);\n  });\n\n  document.addEventListener(\"webkitfullscreenchange\", () => {\n    root.classList.toggle(\"hlm-fullscreen\", !!document.webkitFullscreenElement);\n    document.documentElement.classList.remove(\"hlm-wp-page-lock\");\n    document.body.classList.remove(\"hlm-wp-page-lock\");\n    setTimeout(resizeCanvas, 80);\n  });\n\n  window.addEventListener(\"resize\", () => setTimeout(resizeCanvas, 60));\n  window.addEventListener(\"orientationchange\", () => setTimeout(resizeCanvas, 220));\n\n  function burst(x, y, color, amount) {\n    const smallScreen = window.innerWidth < 760 || window.innerHeight < 520;\n    const count = Math.min(amount, smallScreen ? 7 : 12);\n\n    for (let i = 0; i < count; i++) {\n      state.particles.push({\n        x,\n        y,\n        vx: rand(-2.4, 2.4),\n        vy: rand(-3.0, 1.0),\n        life: rand(340, 620),\n        age: 0,\n        size: rand(2.0, 4.4),\n        color\n      });\n    }\n  }\n\n  function addFloatingText(x, y, text, color, size) {\n    state.texts.push({\n      x,\n      y,\n      text,\n      color,\n      size,\n      age: 0,\n      life: 820\n    });\n  }\n\n  function roundedRect(x, y, w, h, r) {\n    ctx.beginPath();\n    ctx.moveTo(x + r, y);\n    ctx.arcTo(x + w, y, x + w, y + h, r);\n    ctx.arcTo(x + w, y + h, x, y + h, r);\n    ctx.arcTo(x, y + h, x, y, r);\n    ctx.arcTo(x, y, x + w, y, r);\n    ctx.closePath();\n  }\n\n  function drawStar(cx, cy, outer, inner) {\n    ctx.beginPath();\n\n    for (let i = 0; i < 10; i++) {\n      const a = -Math.PI \/ 2 + i * Math.PI \/ 5;\n      const r = i % 2 === 0 ? outer : inner;\n      const x = cx + Math.cos(a) * r;\n      const y = cy + Math.sin(a) * r;\n\n      if (i === 0) ctx.moveTo(x, y);\n      else ctx.lineTo(x, y);\n    }\n\n    ctx.closePath();\n  }\n\n  function drawTileIcon(type, x, y, s, colors) {\n    const cx = x + s \/ 2;\n    const cy = y + s \/ 2;\n\n    ctx.save();\n    ctx.lineCap = \"round\";\n    ctx.lineJoin = \"round\";\n    ctx.strokeStyle = \"rgba(61, 43, 53, .34)\";\n    ctx.lineWidth = Math.max(2, s * .034);\n\n    if (type === 0) {\n      \/\/ moon rabbit face\n      ctx.fillStyle = \"#FFF8E8\";\n      ctx.beginPath();\n      ctx.ellipse(cx - s * .13, cy - s * .27, s * .075, s * .19, -0.16, 0, Math.PI * 2);\n      ctx.ellipse(cx + s * .13, cy - s * .27, s * .075, s * .19, 0.16, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"#F4B7B0\";\n      ctx.beginPath();\n      ctx.ellipse(cx - s * .13, cy - s * .27, s * .035, s * .11, -0.16, 0, Math.PI * 2);\n      ctx.ellipse(cx + s * .13, cy - s * .27, s * .035, s * .11, 0.16, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.fillStyle = \"#FFF8E8\";\n      ctx.beginPath();\n      ctx.ellipse(cx, cy + s * .03, s * .27, s * .23, 0, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"#3D2B35\";\n      ctx.beginPath();\n      ctx.arc(cx - s * .09, cy, s * .025, 0, Math.PI * 2);\n      ctx.arc(cx + s * .09, cy, s * .025, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(61,43,53,.48)\";\n      ctx.lineWidth = Math.max(1.5, s * .018);\n      ctx.beginPath();\n      ctx.moveTo(cx, cy + s * .03);\n      ctx.quadraticCurveTo(cx - s * .035, cy + s * .065, cx - s * .065, cy + s * .045);\n      ctx.moveTo(cx, cy + s * .03);\n      ctx.quadraticCurveTo(cx + s * .035, cy + s * .065, cx + s * .065, cy + s * .045);\n      ctx.stroke();\n      ctx.fillStyle = \"rgba(217,103,95,.25)\";\n      ctx.beginPath();\n      ctx.arc(cx - s * .16, cy + s * .05, s * .04, 0, Math.PI * 2);\n      ctx.arc(cx + s * .16, cy + s * .05, s * .04, 0, Math.PI * 2);\n      ctx.fill();\n    }\n\n    if (type === 1) {\n      \/\/ wooden mallet\n      ctx.save();\n      ctx.translate(cx, cy);\n      ctx.rotate(-0.54);\n      ctx.fillStyle = \"#D6A96C\";\n      roundedRect(-s * .23, -s * .26, s * .46, s * .18, s * .055);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"rgba(255,248,232,.38)\";\n      roundedRect(-s * .16, -s * .235, s * .18, s * .045, s * .02);\n      ctx.fill();\n      ctx.fillStyle = \"#8B5C38\";\n      roundedRect(-s * .045, -s * .09, s * .09, s * .44, s * .04);\n      ctx.fill();\n      ctx.stroke();\n      ctx.restore();\n    }\n\n    if (type === 2) {\n      \/\/ rice cake on leaf\n      ctx.fillStyle = \"rgba(107, 132, 105, .78)\";\n      ctx.beginPath();\n      ctx.ellipse(cx, cy + s * .17, s * .28, s * .08, -0.06, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(61,43,53,.22)\";\n      ctx.stroke();\n      ctx.fillStyle = \"#FFF8E8\";\n      ctx.beginPath();\n      ctx.ellipse(cx, cy - s * .01, s * .27, s * .17, 0, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(61,43,53,.28)\";\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(214,169,108,.54)\";\n      ctx.lineWidth = Math.max(1.4, s * .018);\n      for (let i = 0; i < 6; i++) {\n        const a = i * Math.PI \/ 3;\n        ctx.beginPath();\n        ctx.moveTo(cx, cy - s * .01);\n        ctx.lineTo(cx + Math.cos(a) * s * .13, cy - s * .01 + Math.sin(a) * s * .08);\n        ctx.stroke();\n      }\n    }\n\n    if (type === 3) {\n      \/\/ moon lantern\n      ctx.fillStyle = \"rgba(255,241,214,.48)\";\n      ctx.beginPath();\n      ctx.arc(cx, cy, s * .30, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(61,43,53,.30)\";\n      ctx.stroke();\n      ctx.fillStyle = \"#F6D58A\";\n      roundedRect(cx - s * .23, cy - s * .28, s * .46, s * .52, s * .17);\n      ctx.fill();\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(61,43,53,.22)\";\n      ctx.lineWidth = Math.max(1.4, s * .018);\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .20, cy - s * .09);\n      ctx.lineTo(cx + s * .20, cy - s * .09);\n      ctx.moveTo(cx - s * .20, cy + s * .09);\n      ctx.lineTo(cx + s * .20, cy + s * .09);\n      ctx.stroke();\n      ctx.fillStyle = \"rgba(61,43,53,.36)\";\n      ctx.beginPath();\n      ctx.arc(cx + s * .045, cy - s * .02, s * .11, Math.PI * .42, Math.PI * 1.62);\n      ctx.arc(cx - s * .005, cy - s * .02, s * .11, Math.PI * 1.62, Math.PI * .42, true);\n      ctx.fill();\n      ctx.fillStyle = \"#8B5C38\";\n      roundedRect(cx - s * .12, cy - s * .37, s * .24, s * .07, s * .025);\n      ctx.fill();\n      roundedRect(cx - s * .12, cy + s * .25, s * .24, s * .07, s * .025);\n      ctx.fill();\n    }\n\n    if (type === 4) {\n      \/\/ night cloud curl\n      ctx.fillStyle = \"#F0ECFF\";\n      ctx.beginPath();\n      ctx.arc(cx - s * .14, cy + s * .05, s * .15, 0, Math.PI * 2);\n      ctx.arc(cx + s * .02, cy - s * .03, s * .20, 0, Math.PI * 2);\n      ctx.arc(cx + s * .18, cy + s * .07, s * .13, 0, Math.PI * 2);\n      ctx.rect(cx - s * .24, cy + s * .04, s * .50, s * .16);\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(91,75,131,.34)\";\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(91,75,131,.28)\";\n      ctx.lineWidth = Math.max(1.7, s * .022);\n      ctx.beginPath();\n      ctx.arc(cx + s * .02, cy - s * .02, s * .10, Math.PI * .2, Math.PI * 1.8);\n      ctx.stroke();\n    }\n\n    if (type === 5) {\n      \/\/ moon tool box\n      ctx.fillStyle = \"#9FB9E8\";\n      roundedRect(cx - s * .27, cy - s * .16, s * .54, s * .38, s * .07);\n      ctx.fill();\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(61,43,53,.36)\";\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .25, cy - s * .03);\n      ctx.lineTo(cx + s * .25, cy - s * .03);\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.arc(cx, cy - s * .17, s * .13, Math.PI, Math.PI * 2);\n      ctx.stroke();\n      ctx.fillStyle = \"#F6D58A\";\n      roundedRect(cx - s * .045, cy + s * .035, s * .09, s * .08, s * .025);\n      ctx.fill();\n      ctx.stroke();\n    }\n\n    if (type === 6) {\n      \/\/ hanging moon charm\n      ctx.strokeStyle = \"rgba(61,43,53,.38)\";\n      ctx.lineWidth = Math.max(2, s * .028);\n      ctx.beginPath();\n      ctx.moveTo(cx, cy - s * .34);\n      ctx.lineTo(cx, cy - s * .23);\n      ctx.stroke();\n      ctx.fillStyle = \"#D6A96C\";\n      ctx.beginPath();\n      ctx.arc(cx, cy - s * .02, s * .25, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"#2B2342\";\n      ctx.beginPath();\n      ctx.arc(cx + s * .06, cy - s * .04, s * .12, Math.PI * .44, Math.PI * 1.62);\n      ctx.arc(cx - s * .005, cy - s * .04, s * .12, Math.PI * 1.62, Math.PI * .44, true);\n      ctx.fill();\n      ctx.strokeStyle = \"#F6D58A\";\n      ctx.lineWidth = Math.max(1.5, s * .019);\n      drawStar(cx - s * .11, cy + s * .08, s * .055, s * .022);\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(61,43,53,.36)\";\n      ctx.beginPath();\n      ctx.moveTo(cx, cy + s * .23);\n      ctx.lineTo(cx, cy + s * .36);\n      ctx.moveTo(cx - s * .05, cy + s * .31);\n      ctx.lineTo(cx + s * .05, cy + s * .31);\n      ctx.stroke();\n    }\n\n    ctx.restore();\n  }\n\n  function drawTile(tile, r, c, now) {\n    const l = layout();\n    const s = l.tile;\n    const pos = visualPos(tile, r, c, now);\n    const x = pos.x;\n    const y = pos.y;\n    const colors = TILE_COLORS[tile.type];\n\n    let scale = 1;\n    let alpha = 1;\n\n    if (tile.clearing) {\n      const t = clamp((now - tile.clearStart) \/ 180, 0, 1);\n      scale = 1 - t * .55;\n      alpha = 1 - t;\n    } else {\n      const bornT = clamp((now - tile.born) \/ 260, 0, 1);\n      scale = .88 + easeOutCubic(bornT) * .12;\n    }\n\n    const cx = x + s \/ 2;\n    const cy = y + s \/ 2;\n\n    ctx.save();\n    ctx.globalAlpha = alpha;\n    ctx.translate(cx, cy);\n    ctx.scale(scale, scale);\n    ctx.translate(-cx, -cy);\n\n    ctx.shadowColor = \"rgba(23, 20, 44, .24)\";\n    ctx.shadowBlur = 8;\n    ctx.shadowOffsetY = 4;\n\n    const grad = ctx.createLinearGradient(x, y, x, y + s);\n    grad.addColorStop(0, colors.light);\n    grad.addColorStop(.48, colors.base);\n    grad.addColorStop(1, colors.dark);\n\n    roundedRect(x, y, s, s, 18);\n    ctx.fillStyle = grad;\n    ctx.fill();\n\n    ctx.shadowColor = \"transparent\";\n    ctx.strokeStyle = \"rgba(255,248,232,.46)\";\n    ctx.lineWidth = 2;\n    ctx.stroke();\n\n    drawTileIcon(tile.type, x, y, s, colors);\n\n    if (tile.special !== \"none\") {\n      ctx.save();\n      ctx.strokeStyle = \"rgba(255, 248, 223, .95)\";\n      ctx.fillStyle = \"rgba(246, 213, 138, .20)\";\n      ctx.lineCap = \"round\";\n\n      if (tile.special === \"row\") {\n        ctx.lineWidth = 7;\n        ctx.beginPath();\n        ctx.moveTo(x + s * .18, y + s * .50);\n        ctx.lineTo(x + s * .82, y + s * .50);\n        ctx.stroke();\n      }\n\n      if (tile.special === \"col\") {\n        ctx.lineWidth = 7;\n        ctx.beginPath();\n        ctx.moveTo(x + s * .50, y + s * .18);\n        ctx.lineTo(x + s * .50, y + s * .82);\n        ctx.stroke();\n      }\n\n      if (tile.special === \"glow\") {\n        ctx.lineWidth = 4;\n        ctx.beginPath();\n        ctx.arc(cx, cy, s * .39, 0, Math.PI * 2);\n        ctx.stroke();\n\n        ctx.beginPath();\n        ctx.arc(cx, cy, s * .25 + Math.sin(now \/ 120) * 2, 0, Math.PI * 2);\n        ctx.fill();\n      }\n\n      ctx.restore();\n    }\n\n    if (tile.moonDust > 0) {\n      ctx.save();\n\n      roundedRect(x + 4, y + 4, s - 8, s - 8, 16);\n      ctx.fillStyle = \"rgba(246, 213, 138, .27)\";\n      ctx.fill();\n\n      ctx.strokeStyle = \"rgba(255, 241, 214, .70)\";\n      ctx.lineWidth = 2;\n      ctx.stroke();\n\n      ctx.fillStyle = \"rgba(255,255,255,.44)\";\n      ctx.beginPath();\n      ctx.arc(x + s * .32, y + s * .31, s * .055, 0, Math.PI * 2);\n      ctx.arc(x + s * .62, y + s * .65, s * .04, 0, Math.PI * 2);\n      ctx.fill();\n\n      ctx.restore();\n    }\n\n    ctx.restore();\n  }\n\n  function drawBackground(now) {\n    const g = ctx.createLinearGradient(0, 0, BASE_W, BASE_H);\n    g.addColorStop(0, \"#17142C\");\n    g.addColorStop(.42, \"#2B2342\");\n    g.addColorStop(.74, \"#5B4B83\");\n    g.addColorStop(1, \"#9FB9E8\");\n\n    ctx.fillStyle = g;\n    ctx.fillRect(0, 0, BASE_W, BASE_H);\n\n    ctx.save();\n\n    \/\/ creamy moon glow\n    const moonGlow = ctx.createRadialGradient(1015, 110, 8, 1015, 110, 320);\n    moonGlow.addColorStop(0, \"rgba(255,248,232,.88)\");\n    moonGlow.addColorStop(.22, \"rgba(246,213,138,.44)\");\n    moonGlow.addColorStop(.60, \"rgba(207,199,244,.18)\");\n    moonGlow.addColorStop(1, \"rgba(246,213,138,0)\");\n    ctx.fillStyle = moonGlow;\n    ctx.beginPath();\n    ctx.arc(1015, 110, 320, 0, Math.PI * 2);\n    ctx.fill();\n\n    ctx.fillStyle = \"rgba(255,248,232,.72)\";\n    ctx.beginPath();\n    ctx.arc(1016, 110, 72, 0, Math.PI * 2);\n    ctx.fill();\n    ctx.fillStyle = \"rgba(213,185,130,.18)\";\n    ctx.beginPath();\n    ctx.arc(988, 91, 12, 0, Math.PI * 2);\n    ctx.arc(1039, 138, 18, 0, Math.PI * 2);\n    ctx.arc(1014, 119, 8, 0, Math.PI * 2);\n    ctx.fill();\n\n    \/\/ wooden moon workshop silhouettes\n    ctx.globalAlpha = .52;\n    for (let i = 0; i < 5; i++) {\n      const x = 82 + i * 240;\n      const y = 88 + (i % 2) * 18;\n      const w = 128;\n      const h = 438;\n      ctx.fillStyle = i % 2 ? \"rgba(66,44,38,.36)\" : \"rgba(43,35,66,.34)\";\n      roundedRect(x, y, w, h, 20);\n      ctx.fill();\n\n      ctx.fillStyle = \"rgba(255,241,214,.18)\";\n      for (let row = 0; row < 4; row++) {\n        roundedRect(x + 18, y + 50 + row * 84, w - 36, 12, 6);\n        ctx.fill();\n      }\n    }\n    ctx.globalAlpha = 1;\n\n    function plank(x, y, w, h, color, tilt) {\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.rotate(tilt || 0);\n      roundedRect(-w \/ 2, -h \/ 2, w, h, 7);\n      ctx.fillStyle = color;\n      ctx.globalAlpha = .38;\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(255,241,214,.14)\";\n      ctx.lineWidth = 1.5;\n      ctx.stroke();\n      ctx.restore();\n    }\n\n    plank(235, 166, 70, 26, \"#D6A96C\", -.14);\n    plank(392, 218, 82, 30, \"#8B5C38\", .08);\n    plank(720, 172, 74, 24, \"#F6D58A\", .10);\n    plank(940, 210, 86, 28, \"#CFC7F4\", -.08);\n    plank(1126, 295, 70, 26, \"#9FB9E8\", .09);\n\n    \/\/ workbench\/table base\n    const table = ctx.createLinearGradient(0, 525, 0, 720);\n    table.addColorStop(0, \"rgba(66,44,38,.28)\");\n    table.addColorStop(1, \"rgba(25,20,38,.52)\");\n    ctx.fillStyle = table;\n    roundedRect(42, 535, 1196, 210, 54);\n    ctx.fill();\n\n    \/\/ soft cloud pillows under the board\n    ctx.globalAlpha = .34;\n    ctx.fillStyle = \"#FFF8E8\";\n    for (let i = 0; i < 7; i++) {\n      const x = 160 + i * 150;\n      const y = 618 + Math.sin(i) * 18;\n      ctx.beginPath();\n      ctx.ellipse(x, y, 86, 28, 0, 0, Math.PI * 2);\n      ctx.ellipse(x + 52, y - 8, 74, 24, 0, 0, Math.PI * 2);\n      ctx.fill();\n    }\n    ctx.globalAlpha = 1;\n\n    \/\/ floating stars and moon dust\n    for (let i = 0; i < 38; i++) {\n      const x = (i * 151 + Math.sin(now \/ 1300 + i) * 22) % BASE_W;\n      const y = 78 + ((i * 67) % 560) + Math.cos(now \/ 1600 + i) * 10;\n      const r = 2.0 + (i % 5) * 1.35;\n\n      ctx.globalAlpha = .11 + (i % 4) * .035;\n      ctx.fillStyle = i % 3 ? \"#FFF8E8\" : \"#F6D58A\";\n      ctx.beginPath();\n      ctx.arc(x, y, r, 0, Math.PI * 2);\n      ctx.fill();\n\n      if (i % 7 === 0) {\n        ctx.globalAlpha = .18;\n        ctx.strokeStyle = \"#FFF8E8\";\n        ctx.lineWidth = 1.4;\n        drawStar(x, y, r * 2.3, r * .7);\n        ctx.stroke();\n      }\n    }\n\n    \/\/ gentle moonbeams\n    ctx.globalAlpha = .16;\n    ctx.strokeStyle = \"rgba(255,241,214,.44)\";\n    ctx.lineWidth = 1.5;\n    for (let i = 0; i < 4; i++) {\n      const x = 145 + i * 285;\n      ctx.beginPath();\n      ctx.moveTo(x, 0);\n      ctx.bezierCurveTo(x - 34, 190, x - 18, 430, x + 32, 720);\n      ctx.stroke();\n    }\n\n    ctx.restore();\n  }\n\n  function drawBoardFrame() {\n    const l = layout();\n    const outerPad = l.compact ? 18 : 26;\n    const innerPad = l.compact ? 12 : 18;\n    const basinPad = l.compact ? 5 : 7;\n    const basinRadius = l.compact ? 18 : 22;\n\n    ctx.save();\n\n    ctx.shadowColor = \"rgba(23, 20, 44, .30)\";\n    ctx.shadowBlur = l.compact ? 18 : 28;\n    ctx.shadowOffsetY = l.compact ? 10 : 14;\n\n    roundedRect(l.x - outerPad, l.y - outerPad, l.boardW + outerPad * 2, l.boardH + outerPad * 2, l.compact ? 26 : 34);\n    ctx.fillStyle = \"rgba(255,248,232,.22)\";\n    ctx.fill();\n\n    ctx.shadowColor = \"transparent\";\n\n    roundedRect(l.x - innerPad, l.y - innerPad, l.boardW + innerPad * 2, l.boardH + innerPad * 2, l.compact ? 22 : 28);\n    const frame = ctx.createLinearGradient(l.x, l.y - innerPad, l.x, l.y + l.boardH + innerPad);\n    frame.addColorStop(0, \"rgba(255,241,214,.54)\");\n    frame.addColorStop(.50, \"rgba(139,92,56,.38)\");\n    frame.addColorStop(1, \"rgba(66,44,38,.42)\");\n    ctx.fillStyle = frame;\n    ctx.fill();\n\n    ctx.strokeStyle = \"rgba(246,213,138,.40)\";\n    ctx.lineWidth = l.compact ? 1.5 : 2;\n    ctx.stroke();\n\n    roundedRect(l.x - basinPad, l.y - basinPad, l.boardW + basinPad * 2, l.boardH + basinPad * 2, basinRadius);\n    ctx.fillStyle = \"rgba(31,25,55,.22)\";\n    ctx.fill();\n\n    \/\/ soft wooden-grid texture behind tiles\n    ctx.save();\n    roundedRect(l.x - 2, l.y - 2, l.boardW + 4, l.boardH + 4, l.compact ? 16 : 20);\n    ctx.clip();\n    ctx.strokeStyle = \"rgba(255,241,214,.12)\";\n    ctx.lineWidth = 1;\n    const step = l.compact ? 36 : 42;\n    for (let yy = l.y - step; yy < l.y + l.boardH + step; yy += step) {\n      ctx.beginPath();\n      ctx.moveTo(l.x - 20, yy);\n      ctx.lineTo(l.x + l.boardW + 20, yy + Math.sin(yy * .05) * 8);\n      ctx.stroke();\n    }\n    for (let xx = l.x - step; xx < l.x + l.boardW + step; xx += step) {\n      ctx.beginPath();\n      ctx.moveTo(xx, l.y - 20);\n      ctx.lineTo(xx + Math.cos(xx * .05) * 7, l.y + l.boardH + 20);\n      ctx.stroke();\n    }\n    ctx.restore();\n\n    ctx.restore();\n  }\n\n  function drawSelection(now) {\n    if (!state.selected || state.mode !== \"idle\") return;\n\n    const l = layout();\n    const r = state.selected.r;\n    const c = state.selected.c;\n    const x = l.x + c * l.step;\n    const y = l.y + r * l.step;\n    const pulse = .58 + Math.sin(now \/ 140) * .20;\n\n    ctx.save();\n\n    ctx.strokeStyle = \"rgba(246, 213, 138, \" + pulse + \")\";\n    ctx.lineWidth = 5;\n    roundedRect(x - 4, y - 4, l.tile + 8, l.tile + 8, 22);\n    ctx.stroke();\n\n    ctx.strokeStyle = \"rgba(255,248,232,.55)\";\n    ctx.lineWidth = 2;\n    roundedRect(x + 3, y + 3, l.tile - 6, l.tile - 6, 16);\n    ctx.stroke();\n\n    ctx.restore();\n  }\n\n  function updateParticles(dt) {\n    state.particles = state.particles.filter(p => {\n      p.age += dt;\n      p.x += p.vx * dt \/ 16;\n      p.y += p.vy * dt \/ 16;\n      p.vy += .08 * dt \/ 16;\n      return p.age < p.life;\n    });\n  }\n\n  function drawParticles() {\n    ctx.save();\n\n    state.particles.forEach(p => {\n      const t = 1 - p.age \/ p.life;\n      ctx.globalAlpha = clamp(t, 0, 1);\n      ctx.fillStyle = p.color;\n      ctx.beginPath();\n      ctx.arc(p.x, p.y, p.size * t, 0, Math.PI * 2);\n      ctx.fill();\n    });\n\n    ctx.restore();\n  }\n\n  function updateTexts(dt) {\n    state.texts = state.texts.filter(t => {\n      t.age += dt;\n      t.y -= .45 * dt \/ 16;\n      return t.age < t.life;\n    });\n  }\n\n  function drawTexts() {\n    ctx.save();\n    ctx.textAlign = \"center\";\n    ctx.textBaseline = \"middle\";\n\n    state.texts.forEach(t => {\n      const alpha = 1 - t.age \/ t.life;\n\n      ctx.globalAlpha = clamp(alpha, 0, 1);\n      ctx.font = \"900 \" + t.size + \"px Arial, Helvetica, sans-serif\";\n      ctx.lineWidth = 5;\n      ctx.strokeStyle = \"rgba(61,43,53,.48)\";\n      ctx.fillStyle = t.color;\n      ctx.strokeText(t.text, t.x, t.y);\n      ctx.fillText(t.text, t.x, t.y);\n    });\n\n    ctx.restore();\n  }\n\n  function render(now) {\n    if (!state.lastNow) state.lastNow = now;\n\n    const dt = Math.min(40, now - state.lastNow);\n    state.lastNow = now;\n\n    ctx.setTransform(scaleX, 0, 0, scaleY, 0, 0);\n    ctx.clearRect(0, 0, BASE_W, BASE_H);\n\n    drawBackground(now);\n    drawBoardFrame();\n\n    for (let r = 0; r < ROWS; r++) {\n      for (let c = 0; c < COLS; c++) {\n        const tile = __mochiMooncraftAnd((state.board[r]), () => (state.board[r][c]));\n        if (tile) drawTile(tile, r, c, now);\n      }\n    }\n\n    drawSelection(now);\n    updateParticles(dt);\n    drawParticles();\n    updateTexts(dt);\n    drawTexts();\n\n    requestAnimationFrame(render);\n  }\n\n  setMuted(state.muted);\n  resizeCanvas();\n  showStartPopup();\n  requestAnimationFrame(render);\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initializeMochiMooncraft, { once: true });\n  } else {\n    initializeMochiMooncraft();\n  }\n})();\n<\/script>\n<style>\n\/* WordPress-safe fullscreen fallback, isolated to this game. *\/\nhtml.hlm-wp-page-lock, body.hlm-wp-page-lock { overflow: hidden !important; }\n#moon_rabbit_workshop_v1.hlm-fullscreen { position: fixed !important; inset: 0 !important; z-index: 2147483647 !important; }\n#moon_rabbit_workshop_v1 button { cursor: pointer; }\n#moon_rabbit_workshop_v1 button:focus-visible { outline: 3px solid #f6d58a; outline-offset: 2px; }\n<\/style>\n\n\n\n<h2 class=\"wp-block-heading\">Craft Mochi, Clear Tiles, and Follow the Moonlight<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mochi Mooncraft<\/strong> is made for players who love relaxing puzzle games with a cute and magical atmosphere. It is easy to understand, comfortable to play, and gentle on the eyes, but still gives enough challenge to keep each level interesting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The creamy moonlight, floating night clouds, tiny wooden tools, and adorable rabbit-inspired details create a peaceful world that feels warm without becoming too simple. Every match feels like placing one small handmade piece back into the rhythm of the night.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why You Will Love Mochi Mooncraft<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This game is perfect for short breaks, slow evenings, or quiet moments when you want something cute, calm, and lightly challenging. With smooth tile swapping, level progression, special tile effects, fullscreen support, sound controls, and a soft moon workshop theme, <strong>Mochi Mooncraft<\/strong> turns a classic match-3 puzzle into a small magical escape.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step into the workshop, follow the glow, and help the moon rabbits finish their mochi-making craft before the night sky fades.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mochi Mooncraft is a cozy match-3 puzzle game set inside a tiny moonlit workshop above the clouds, where gentle moon rabbits craft soft rice cakes, polish little wooden tools, and keep the night glowing with creamy lunar light. In this dreamy puzzle adventure, every swap feels like helping a quiet team of rabbits finish their &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-101","post","type-post","status-publish","format-standard","hentry","category-puzzle"],"_links":{"self":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/101","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=101"}],"version-history":[{"count":0,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/101\/revisions"}],"wp:attachment":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}