{"id":46,"date":"2026-10-24T23:41:59","date_gmt":"2026-10-24T23:41:59","guid":{"rendered":"https:\/\/apk.produsenpagarbrc.com\/?p=46"},"modified":"2026-10-24T23:41:59","modified_gmt":"2026-10-24T23:41:59","slug":"the-golden-shelf","status":"publish","type":"post","link":"https:\/\/play.produsenpagarbrc.com\/?p=46","title":{"rendered":"The Golden Shelf"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>The Golden Shelf<\/strong> is a cozy match-3 puzzle game set inside a warm little library filled with honeylight, old books, amber shelves, soft lamps, and quiet reading magic. Every tile feels like a tiny object from a peaceful reading room: books, honey jars, bookmarks, teacups, glasses, lamps, and golden library treasures waiting to be matched.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this game, your goal is simple but satisfying: swap nearby tiles, create matches of three or more, collect the target item, and complete each level before your moves run out. The more carefully you plan your swaps, the more chances you have to create powerful special tiles, clear rows, sweep columns, trigger glowing combos, and restore the shelf with a little burst of golden charm.<\/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\/The-Golden-Shelf-1024x768.png\" alt=\"\" class=\"wp-image-47\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">A Cozy Puzzle Hidden Between Bookshelves<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The Golden Shelf<\/strong> is designed for players who enjoy calm, charming, and visually gentle puzzle games. Instead of loud colors or stressful effects, the game brings a soft library atmosphere where every move feels warm and comfortable. The honey-gold palette, creamy backgrounds, wooden tones, and glowing particles create a peaceful space that is easy on the eyes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each level gives you a target to complete. Sometimes you need to collect a certain type of tile, and sometimes you need to clear special honey-dust pieces from the board. As the levels rise, the puzzle becomes more challenging, with fewer moves, more tile variety, and a board that asks you to think before swapping.<\/p>\n\n\n\n<style>\n  #honey_library_match_v1 {\n    --cream: #ffe8bd;\n    --cream-soft: #fff4dc;\n    --line: rgba(255, 232, 190, .32);\n    --gold: #e9bd70;\n    --red: #ec5963;\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: linear-gradient(135deg, #251827, #57354f 55%, #6b4351);\n    box-shadow: 0 24px 60px rgba(20, 10, 28, .36);\n    touch-action: none;\n    user-select: none;\n    -webkit-user-select: none;\n    font-family: Arial, Helvetica, sans-serif;\n  }\n\n  #honey_library_match_v1 * {\n    box-sizing: border-box;\n    -webkit-tap-highlight-color: transparent;\n  }\n\n  #honey_library_match_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: #17111d;\n  }\n\n  #honey_library_match_v1 .hlm-game-frame {\n    position: absolute;\n    inset: 0;\n    overflow: hidden;\n    border-radius: inherit;\n    background:\n      radial-gradient(circle at 18% 14%, rgba(255, 217, 154, .13), transparent 31%),\n      radial-gradient(circle at 84% 82%, rgba(126, 190, 153, .12), transparent 32%),\n      linear-gradient(135deg, #24182b, #57334f 55%, #714657);\n  }\n\n  #honey_library_match_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  #honey_library_match_v1 .hlm-top-left,\n  #honey_library_match_v1 .hlm-top-right,\n  #honey_library_match_v1 .hlm-top-stats {\n    position: absolute;\n    z-index: 8;\n  }\n\n  #honey_library_match_v1 .hlm-top-left {\n    top: 14px;\n    left: 16px;\n    display: flex;\n    gap: 10px;\n  }\n\n  #honey_library_match_v1 .hlm-top-right {\n    top: 14px;\n    right: 16px;\n    z-index: 45;\n    pointer-events: auto;\n  }\n\n  #honey_library_match_v1 .hlm-top-stats {\n    top: 14px;\n    left: 50%;\n    transform: translateX(-50%);\n    display: flex;\n    gap: 10px;\n    align-items: center;\n    justify-content: center;\n    max-width: calc(100% - 220px);\n  }\n\n  #honey_library_match_v1 .hlm-chip {\n    min-width: 112px;\n    height: 48px;\n    padding: 7px 13px 6px;\n    border-radius: 17px;\n    border: 1px solid var(--line);\n    background: linear-gradient(180deg, rgba(255, 238, 202, .16), rgba(43, 27, 48, .56));\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, .13), 0 10px 20px rgba(20, 10, 25, .18);\n    color: var(--cream-soft);\n    text-align: center;\n    line-height: 1;\n    backdrop-filter: blur(8px);\n  }\n\n  #honey_library_match_v1 .hlm-chip span {\n    display: block;\n    font-size: 10px;\n    letter-spacing: .15em;\n    color: rgba(255, 232, 190, .78);\n    font-weight: 800;\n    margin-bottom: 5px;\n  }\n\n  #honey_library_match_v1 .hlm-chip b {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    min-height: 18px;\n    font-size: 17px;\n    color: #fff3d2;\n    font-weight: 900;\n  }\n\n  #honey_library_match_v1 .hlm-target-row {\n    display: inline-flex;\n    align-items: center;\n    gap: 7px;\n  }\n\n  #honey_library_match_v1 .hlm-target-icon {\n    width: 18px;\n    height: 18px;\n    display: inline-block;\n    box-shadow: inset 0 2px 4px rgba(255, 255, 255, .32), 0 2px 7px rgba(0, 0, 0, .18);\n  }\n\n  #honey_library_match_v1 .hlm-target-icon.t0 { background: #d96f7c; border-radius: 50%; }\n  #honey_library_match_v1 .hlm-target-icon.t1 { background: #78b987; border-radius: 80% 15% 80% 18%; transform: rotate(34deg); }\n  #honey_library_match_v1 .hlm-target-icon.t2 { background: #c979ad; border-radius: 50%; }\n  #honey_library_match_v1 .hlm-target-icon.t3 { background: #e1b55f; clip-path: polygon(50% 0%, 62% 34%, 98% 36%, 69% 56%, 79% 92%, 50% 70%, 21% 92%, 31% 56%, 2% 36%, 38% 34%); }\n  #honey_library_match_v1 .hlm-target-icon.t4 { background: #72a9c8; border-radius: 70% 70% 70% 16%; transform: rotate(45deg); }\n  #honey_library_match_v1 .hlm-target-icon.t5 { background: #ccb072; border-radius: 50%; }\n  #honey_library_match_v1 .hlm-target-icon.t6 { background: #9980c5; clip-path: polygon(50% 0%, 90% 38%, 50% 100%, 10% 38%); }\n\n  #honey_library_match_v1 .hlm-target-icon.dew {\n    background: linear-gradient(145deg, #b8e1f4, #78aeca);\n    border-radius: 70% 70% 70% 18%;\n    transform: rotate(45deg);\n  }\n\n  #honey_library_match_v1 .hlm-progress {\n    position: absolute;\n    z-index: 7;\n    top: 72px;\n    left: 50%;\n    transform: translateX(-50%);\n    width: min(520px, 52%);\n    height: 8px;\n    border-radius: 99px;\n    border: 1px solid rgba(255, 231, 188, .24);\n    background: rgba(29, 18, 34, .42);\n    overflow: hidden;\n    box-shadow: inset 0 2px 6px rgba(0, 0, 0, .25);\n  }\n\n  #honey_library_match_v1 .hlm-progress > i {\n    display: block;\n    width: 0%;\n    height: 100%;\n    border-radius: inherit;\n    background: linear-gradient(90deg, #d98883, #e8bd6a);\n    box-shadow: 0 0 12px rgba(232, 189, 106, .42);\n    transition: width .28s ease;\n  }\n\n  #honey_library_match_v1 .hlm-icon-btn {\n    width: 46px;\n    height: 46px;\n    border-radius: 16px;\n    border: 1px solid var(--line);\n    background: linear-gradient(180deg, rgba(255, 240, 208, .14), rgba(34, 22, 39, .58));\n    color: var(--cream);\n    display: grid;\n    place-items: center;\n    cursor: pointer;\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, .16), 0 12px 24px rgba(18, 10, 24, .2);\n    backdrop-filter: blur(8px);\n    transition: transform .15s ease, background .15s ease, border-color .15s ease;\n  }\n\n  #honey_library_match_v1 .hlm-icon-btn:active {\n    transform: translateY(1px) scale(.96);\n  }\n\n  #honey_library_match_v1 .hlm-icon-btn:hover {\n    border-color: rgba(255, 231, 188, .55);\n    background: linear-gradient(180deg, rgba(255, 240, 208, .19), rgba(34, 22, 39, .64));\n  }\n\n  #honey_library_match_v1 .hlm-sound-icon {\n    width: 34px;\n    height: 28px;\n    position: relative;\n    display: block;\n    color: var(--cream);\n    transform: scale(.82);\n    transform-origin: center;\n  }\n\n  #honey_library_match_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  #honey_library_match_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  #honey_library_match_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  #honey_library_match_v1 .hlm-sound-wave.w1 {\n    left: 19px;\n    top: 10px;\n    width: 6px;\n    height: 9px;\n    opacity: .96;\n  }\n\n  #honey_library_match_v1 .hlm-sound-wave.w2 {\n    left: 21px;\n    top: 6px;\n    width: 10px;\n    height: 17px;\n    opacity: .78;\n  }\n\n  #honey_library_match_v1 .hlm-sound-wave.w3 {\n    left: 23px;\n    top: 2px;\n    width: 14px;\n    height: 25px;\n    opacity: .62;\n  }\n\n  #honey_library_match_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(--red);\n    transform: rotate(-38deg);\n    opacity: 0;\n    box-shadow: 0 0 4px rgba(236, 89, 99, .35);\n  }\n\n  #honey_library_match_v1 .is-muted .hlm-sound-wave {\n    opacity: 0;\n  }\n\n  #honey_library_match_v1 .is-muted .hlm-mute-slash {\n    opacity: 1;\n  }\n\n  #honey_library_match_v1 .hlm-pause-icon {\n    width: 20px;\n    height: 22px;\n    position: relative;\n    display: block;\n  }\n\n  #honey_library_match_v1 .hlm-pause-icon:before,\n  #honey_library_match_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  #honey_library_match_v1 .hlm-pause-icon:before { left: 3px; }\n  #honey_library_match_v1 .hlm-pause-icon:after { right: 3px; }\n\n  #honey_library_match_v1 .hlm-fs-icon {\n    width: 23px;\n    height: 23px;\n    position: relative;\n    display: block;\n  }\n\n  #honey_library_match_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  #honey_library_match_v1 .hlm-fs-icon i:nth-child(1) {\n    left: 0;\n    top: 0;\n    border-width: 3px 0 0 3px;\n    border-radius: 4px 0 0 0;\n  }\n\n  #honey_library_match_v1 .hlm-fs-icon i:nth-child(2) {\n    right: 0;\n    top: 0;\n    border-width: 3px 3px 0 0;\n    border-radius: 0 4px 0 0;\n  }\n\n  #honey_library_match_v1 .hlm-fs-icon i:nth-child(3) {\n    left: 0;\n    bottom: 0;\n    border-width: 0 0 3px 3px;\n    border-radius: 0 0 0 4px;\n  }\n\n  #honey_library_match_v1 .hlm-fs-icon i:nth-child(4) {\n    right: 0;\n    bottom: 0;\n    border-width: 0 3px 3px 0;\n    border-radius: 0 0 4px 0;\n  }\n\n  #honey_library_match_v1 .hlm-popup,\n  #honey_library_match_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, 230, 187, .10), transparent 38%),\n      rgba(20, 12, 25, .62);\n    backdrop-filter: blur(8px);\n  }\n\n  #honey_library_match_v1 .hlm-popup.hlm-hidden {\n    display: none;\n  }\n\n  #honey_library_match_v1 .hlm-card {\n    width: min(430px, 88%);\n    border-radius: 28px;\n    border: 1px solid rgba(255, 231, 188, .36);\n    background: linear-gradient(180deg, rgba(86, 51, 72, .94), rgba(38, 24, 45, .95));\n    box-shadow: 0 26px 70px rgba(11, 6, 18, .42), inset 0 1px 0 rgba(255, 255, 255, .15);\n    padding: 28px 26px 24px;\n    color: #fff2d3;\n    text-align: center;\n  }\n\n  #honey_library_match_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  #honey_library_match_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(255, 244, 220, .82);\n  }\n\n  #honey_library_match_v1 .hlm-actions {\n    display: flex;\n    flex-direction: column;\n    gap: 11px;\n    align-items: center;\n  }\n\n  #honey_library_match_v1 .hlm-main-btn,\n  #honey_library_match_v1 .hlm-sub-btn {\n    width: min(255px, 100%);\n    min-height: 46px;\n    border-radius: 999px;\n    border: 1px solid rgba(255, 232, 190, .34);\n    cursor: pointer;\n    font-weight: 900;\n    letter-spacing: .02em;\n    color: #352335;\n    background: linear-gradient(180deg, #ffe0a1, #e7ac62);\n    box-shadow: 0 12px 24px rgba(20, 10, 25, .22), inset 0 1px 0 rgba(255, 255, 255, .4);\n  }\n\n  #honey_library_match_v1 .hlm-sub-btn {\n    color: #ffeecb;\n    background: rgba(255, 240, 208, .10);\n  }\n\n  #honey_library_match_v1 .hlm-rotate {\n    display: none;\n    z-index: 40;\n  }\n\n  #honey_library_match_v1.hlm-portrait .hlm-rotate {\n    display: flex;\n  }\n\n  @media (max-width: 760px) {\n    #honey_library_match_v1 {\n      border-radius: 18px;\n    }\n\n    #honey_library_match_v1 .hlm-icon-btn {\n      width: 41px;\n      height: 41px;\n      border-radius: 14px;\n    }\n\n    #honey_library_match_v1 .hlm-top-left {\n      top: 10px;\n      left: 10px;\n      gap: 7px;\n    }\n\n    #honey_library_match_v1 .hlm-top-right {\n      top: 10px;\n      right: 10px;\n    }\n\n    #honey_library_match_v1 .hlm-top-stats {\n      top: 10px;\n      gap: 6px;\n      max-width: calc(100% - 165px);\n    }\n\n    #honey_library_match_v1 .hlm-chip {\n      min-width: 78px;\n      height: 41px;\n      padding: 6px 7px 5px;\n      border-radius: 14px;\n    }\n\n    #honey_library_match_v1 .hlm-chip span {\n      font-size: 8px;\n      margin-bottom: 4px;\n    }\n\n    #honey_library_match_v1 .hlm-chip b {\n      font-size: 13px;\n    }\n\n    #honey_library_match_v1 .hlm-target-icon {\n      width: 14px;\n      height: 14px;\n    }\n\n    #honey_library_match_v1 .hlm-progress {\n      top: 58px;\n      width: min(410px, 50%);\n      height: 6px;\n    }\n  }\n\n\n  \/* Honey Library visual skin *\/\n  #honey_library_match_v1 {\n    --cream: #fff1c9;\n    --cream-soft: #fff8df;\n    --line: rgba(116, 76, 38, .24);\n    --gold: #f4c542;\n    --red: #e56b62;\n    background:\n      radial-gradient(circle at 82% 12%, rgba(255,241,201,.68), transparent 25%),\n      radial-gradient(circle at 18% 88%, rgba(244,197,66,.18), transparent 28%),\n      linear-gradient(135deg, #5a351f 0%, #9d6a34 42%, #fff1c9 100%);\n    box-shadow: 0 24px 60px rgba(70, 38, 16, .30);\n  }\n\n  #honey_library_match_v1.hlm-fullscreen { background: #3b2417; }\n\n  #honey_library_match_v1 .hlm-game-frame {\n    background:\n      radial-gradient(circle at 82% 12%, rgba(255,241,201,.72), transparent 22%),\n      radial-gradient(circle at 16% 18%, rgba(244,197,66,.22), transparent 31%),\n      radial-gradient(circle at 82% 84%, rgba(142,101,48,.25), transparent 33%),\n      linear-gradient(135deg, #4a2b1b 0%, #8e5a2c 48%, #fff1c9 100%);\n  }\n\n  #honey_library_match_v1 .hlm-chip {\n    border-color: rgba(116,76,38,.25);\n    background: linear-gradient(180deg, rgba(255,248,223,.82), rgba(244,197,66,.28));\n    color: #4c2d1b;\n    box-shadow: inset 0 1px 0 rgba(255,255,255,.68), 0 10px 20px rgba(70,38,16,.17);\n  }\n\n  #honey_library_match_v1 .hlm-chip span { color: rgba(76,45,27,.70); }\n  #honey_library_match_v1 .hlm-chip b { color: #4c2d1b; }\n\n  #honey_library_match_v1 .hlm-progress {\n    border-color: rgba(116,76,38,.22);\n    background: rgba(255,248,223,.42);\n  }\n\n  #honey_library_match_v1 .hlm-progress > i {\n    background: linear-gradient(90deg, #a66a2d, #f4c542, #fff1c9);\n    box-shadow: 0 0 14px rgba(244,197,66,.50);\n  }\n\n  #honey_library_match_v1 .hlm-icon-btn {\n    border-color: rgba(116,76,38,.28);\n    background: linear-gradient(180deg, rgba(255,248,223,.86), rgba(244,197,66,.34));\n    color: #6a3e1f;\n    box-shadow: inset 0 1px 0 rgba(255,255,255,.72), 0 12px 24px rgba(70,38,16,.18);\n  }\n\n  #honey_library_match_v1 .hlm-icon-btn:hover {\n    border-color: rgba(244,197,66,.72);\n    background: linear-gradient(180deg, rgba(255,250,231,.96), rgba(244,197,66,.44));\n    color: #4c2d1b;\n  }\n\n  #honey_library_match_v1 .hlm-popup,\n  #honey_library_match_v1 .hlm-rotate {\n    background:\n      radial-gradient(circle at center, rgba(255,241,201,.22), transparent 38%),\n      rgba(60, 34, 18, .38);\n  }\n\n  #honey_library_match_v1 .hlm-card {\n    border-color: rgba(116,76,38,.25);\n    background:\n      radial-gradient(circle at 24% 18%, rgba(255,255,255,.44), transparent 30%),\n      linear-gradient(180deg, rgba(255,248,223,.97), rgba(229,189,118,.93));\n    color: #4c2d1b;\n    box-shadow: 0 26px 70px rgba(70,38,16,.28), inset 0 1px 0 rgba(255,255,255,.76);\n  }\n\n  #honey_library_match_v1 .hlm-card p { color: rgba(76,45,27,.76); }\n\n  #honey_library_match_v1 .hlm-main-btn {\n    color: #4c2d1b;\n    border-color: rgba(116,76,38,.24);\n    background: linear-gradient(180deg, #fff1c9, #f4c542);\n    box-shadow: 0 12px 24px rgba(70,38,16,.18), inset 0 1px 0 rgba(255,255,255,.58);\n  }\n\n  #honey_library_match_v1 .hlm-sub-btn {\n    color: #6a3e1f;\n    border-color: rgba(116,76,38,.24);\n    background: rgba(255,248,223,.58);\n  }\n\n  #honey_library_match_v1 .hlm-target-icon.t0 { background:#f4c542; border-radius: 7px; }\n  #honey_library_match_v1 .hlm-target-icon.t1 { background:#8f5d2f; border-radius: 5px; transform: none; }\n  #honey_library_match_v1 .hlm-target-icon.t2 { background: radial-gradient(circle at 35% 35%, #fff8df, #d69b40 72%); border-radius: 50%; }\n  #honey_library_match_v1 .hlm-target-icon.t3 { background:#c9793d; clip-path: polygon(18% 0, 82% 0, 82% 100%, 50% 82%, 18% 100%); }\n  #honey_library_match_v1 .hlm-target-icon.t4 { background:#7f7048; border-radius: 50% 50% 48% 48%; transform: rotate(0deg); }\n  #honey_library_match_v1 .hlm-target-icon.t5 { background:#fff8df; border-radius: 50%; }\n  #honey_library_match_v1 .hlm-target-icon.t6 { background:#d99736; clip-path: polygon(25% 5%, 75% 5%, 100% 50%, 75% 95%, 25% 95%, 0 50%); border-radius: 0; }\n  #honey_library_match_v1 .hlm-target-icon.dew {\n    background: radial-gradient(circle at 35% 30%, #fff8df, #f4c542 64%, #a66a2d);\n    border-radius: 50%;\n    transform: rotate(0deg);\n  }\n\n  \/* Compact top HUD patch *\/\n  #honey_library_match_v1 .hlm-top-stats {\n    top: 12px;\n    gap: 7px;\n    max-width: calc(100% - 220px);\n  }\n\n  #honey_library_match_v1 .hlm-chip {\n    min-width: 92px;\n    height: 36px;\n    padding: 5px 10px 4px;\n    border-radius: 14px;\n  }\n\n  #honey_library_match_v1 .hlm-chip span {\n    font-size: 8px;\n    letter-spacing: .13em;\n    margin-bottom: 3px;\n  }\n\n  #honey_library_match_v1 .hlm-chip b {\n    min-height: 14px;\n    font-size: 14px;\n  }\n\n  #honey_library_match_v1 .hlm-target-row {\n    gap: 5px;\n  }\n\n  #honey_library_match_v1 .hlm-target-icon {\n    width: 15px;\n    height: 15px;\n  }\n\n  #honey_library_match_v1 .hlm-progress {\n    top: 55px;\n    width: min(430px, 44%);\n    height: 5px;\n  }\n\n  @media (max-width: 760px) {\n    #honey_library_match_v1 .hlm-top-stats {\n      top: 8px;\n      gap: 4px;\n      max-width: calc(100% - 150px);\n    }\n\n    #honey_library_match_v1 .hlm-chip {\n      min-width: 64px;\n      height: 31px;\n      padding: 4px 5px 3px;\n      border-radius: 11px;\n    }\n\n    #honey_library_match_v1 .hlm-chip span {\n      font-size: 6.6px;\n      letter-spacing: .10em;\n      margin-bottom: 2px;\n    }\n\n    #honey_library_match_v1 .hlm-chip b {\n      min-height: 12px;\n      font-size: 11px;\n    }\n\n    #honey_library_match_v1 .hlm-target-icon {\n      width: 11px;\n      height: 11px;\n    }\n\n    #honey_library_match_v1 .hlm-progress {\n      top: 45px;\n      width: min(320px, 40%);\n      height: 4px;\n    }\n  }\n\n\n  \/* Lightweight responsive patch for mobile *\/\n  @media (max-width: 760px) {\n    #honey_library_match_v1 .hlm-chip,\n    #honey_library_match_v1 .hlm-icon-btn,\n    #honey_library_match_v1 .hlm-card {\n      backdrop-filter: none;\n      -webkit-backdrop-filter: none;\n    }\n\n    #honey_library_match_v1 {\n      box-shadow: 0 14px 34px rgba(92, 57, 25, .20);\n    }\n  }\n\n\n  \/* Keep the rotate-device prompt fully visible inside narrow WP post embeds. *\/\n  @media (orientation: portrait) and (max-width: 760px) {\n    #honey_library_match_v1 .hlm-rotate { padding: 5px; }\n    #honey_library_match_v1 .hlm-rotate .hlm-card {\n      width: min(94%, 360px);\n      padding: 10px 13px 9px;\n      border-radius: 14px;\n    }\n    #honey_library_match_v1 .hlm-rotate .hlm-card h3 {\n      margin-bottom: 4px;\n      font-size: 17px;\n      line-height: 1.05;\n    }\n    #honey_library_match_v1 .hlm-rotate .hlm-card p {\n      margin-bottom: 8px;\n      font-size: 10px;\n      line-height: 1.25;\n    }\n    #honey_library_match_v1 .hlm-rotate .hlm-main-btn {\n      min-height: 31px;\n      font-size: 11px;\n    }\n  }\n<\/style>\n\n<div id=\"honey_library_match_v1\">\n  <div class=\"hlm-game-frame\">\n    <canvas id=\"hlm_m3_canvas_v4\" aria-label=\"The Golden Shelf 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\">The Golden Shelf<\/h3>\n        <p id=\"hlm_m3_popup_text_v4\">Swap warm library tokens, collect the target, and keep the honey shelves 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 Page Sideways<\/h3>\n        <p>The Golden Shelf is designed sideways so the board, buttons, and target panel stay warm, clear, 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>\n(function () {\n  \"use strict\";\n\n  const root = document.getElementById(\"honey_library_match_v1\");\n  if (!root) return;\n  if (root.dataset.hlmReady === \"1\") return;\n  const canvas = root.querySelector(\"#hlm_m3_canvas_v4\");\n  if (!canvas) return;\n  root.dataset.hlmReady = \"1\";\n  const ctx = canvas.getContext(\"2d\");\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 = \"honey_library_match_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: \"#F4C542\", light: \"#FFF1C9\", dark: \"#B87822\" },\n    { base: \"#8F5D2F\", light: \"#C99555\", dark: \"#5B351E\" },\n    { base: \"#D69B40\", light: \"#FFE2A3\", dark: \"#9B6428\" },\n    { base: \"#C9793D\", light: \"#F0B170\", dark: \"#79411F\" },\n    { base: \"#7F7048\", light: \"#B7A46D\", dark: \"#4D412B\" },\n    { base: \"#FFF8DF\", light: \"#FFFFFF\", dark: \"#DDBB75\" },\n    { base: \"#D99736\", light: \"#FFD875\", dark: \"#9D5F21\" }\n  ];\n\n  let scaleX = 1;\n  let scaleY = 1;\n  let audioCtx = null;\n\n  function readSaved(key, fallback) {\n    try {\n      const value = window.localStorage.getItem(key);\n      return value === null ? fallback : value;\n    } catch (error) { return fallback; }\n  }\n\n  function writeSaved(key, value) {\n    try { window.localStorage.setItem(key, String(value)); } catch (error) {}\n  }\n\n  const state = {\n    board: [],\n    level: 1,\n    unlocked: Math.max(1, parseInt(readSaved(K_LEVEL, \"1\") || \"1\", 10) || 1),\n    score: 0,\n    best: Math.max(0, parseInt(readSaved(K_BEST, \"0\") || \"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: readSaved(K_MUTED, \"0\") === \"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 (cachedLayout ? cachedLayoutKey === layoutKey : false) 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      dew: 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 dewLevel = level >= 5 ? level % 3 === 0 : false;\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 (dewLevel) {\n      return {\n        level,\n        activeTypes,\n        kind: \"dew\",\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 addDew(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].dew = 1;\n    }\n  }\n\n  function buildBoard(dewCount) {\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 = c >= 2 ? (b[r][c - 1]?.type === type ? b[r][c - 2]?.type === type : false) : false;\n            const upMatch = r >= 2 ? (b[r - 1][c]?.type === type ? b[r - 2][c]?.type === type : false) : false;\n\n            if (!leftMatch ? !upMatch : false) 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 === \"dew\") {\n        addDew(clamp(dewCount, 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 (a.r === b.r ? a.c === b.c : false) 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 === \"dew\" ? 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 Library\", type: \"main\", fn: () => startLevel(1, true) }\n    ];\n\n    if (state.unlocked > 1) {\n      buttons.push({\n        text: \"Continue Shelf \" + state.unlocked,\n        type: \"sub\",\n        fn: () => startLevel(state.unlocked, true)\n      });\n    }\n\n    showPopup(\"Honey Library\", \"Swap honeyed library tokens, collect the target, and keep the reading room 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 (state.config?.kind === \"dew\") {\n      targetIcon.className = \"hlm-target-icon dew\";\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      writeSaved(K_BEST, state.best);\n    }\n  }\n\n  function isTargetComplete() {\n    return state.config ? state.progress >= state.config.targetNeed : false;\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    writeSaved(K_LEVEL, state.unlocked);\n\n    sfx(\"win\");\n    addFloatingText(BASE_W \/ 2, 100, \"Shelf Restored!\", \"#fff1c9\", 28);\n\n    showPopup(\"Shelf Restored!\", \"Moves bonus +\" + bonus + \". A new golden shelf is waiting to be arranged.\", [\n      { text: \"Next Shelf\", type: \"main\", fn: () => startLevel(next, false) },\n      { text: \"Restart From Shelf 1\", type: \"sub\", fn: () => startLevel(1, true) }\n    ]);\n  }\n\n  function gameOver() {\n    state.mode = \"gameover\";\n    sfx(\"lose\");\n\n    showPopup(\"Pages Scattered\", \"The target was close, but the library shelf needs one more gentle arrangement.\", [\n      {\n        text: \"Retry This Shelf\",\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(\"Reading Break\", \"The lamps are glowing quietly. Take a breath, then return to the little honey-lit board.\", [\n      {\n        text: \"Resume Reading\",\n        type: \"main\",\n        fn: () => {\n          hidePopup();\n          state.mode = \"idle\";\n        }\n      },\n      {\n        text: \"Restart Shelf\",\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    writeSaved(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 (end < COLS ? state.board[r][end]?.type === type : false) {\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 (end < ROWS ? state.board[end][c]?.type === type : false) {\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 => p.r === s.r ? p.c === s.c : false)) {\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 = 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 (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 = 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 (state.config.kind === \"collect\" ? tile.type === state.config.targetType : false) {\n        state.progress = Math.min(state.config.targetNeed, state.progress + 1);\n      }\n\n      if (state.config.kind === \"dew\" ? tile.dew > 0 : false) {\n        state.progress = Math.min(state.config.targetNeed, state.progress + 1);\n        tile.dew = 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, \"#fff1c9\", 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 (active ? now - start < duration + 90 : false) {\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 = 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, \"#fff1c9\", 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 (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 = state.board[a.r]?.[a.c];\n    const tb = state.board[b.r]?.[b.c];\n\n    return (ta?.special !== undefined ? ta.special !== \"none\" : false) || (tb?.special !== undefined ? tb.special !== \"none\" : false);\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 (!matches.length ? specialMove : false) {\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 shelves 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 = state.board[r]?.[c];\n\n        if (tile?.special !== undefined ? tile.special !== \"none\" : false) 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 === \"dew\"\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, \"Shelves Rearranged\", \"#fff1c9\", 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 ([target.r >= 0, target.r < ROWS, target.c >= 0, target.c < COLS].every(Boolean)) {\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 (state.selected?.r === tapped.r ? state.selected.c === tapped.c : false) {\n      state.selected = null;\n      return;\n    }\n\n    if (state.selected ? areAdjacent(state.selected, tapped) : false) {\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\n    try {\n      const isFull = document.fullscreenElement || document.webkitFullscreenElement;\n\n      if (isFull) {\n        if (document.exitFullscreen) await document.exitFullscreen();\n        else if (document.webkitExitFullscreen) await document.webkitExitFullscreen();\n\n        if (screen.orientation?.unlock) {\n          try { screen.orientation.unlock(); } catch (e) {}\n        }\n\n        return;\n      }\n\n      if (root.requestFullscreen) {\n        await root.requestFullscreen();\n      } else if (root.webkitRequestFullscreen) {\n        await root.webkitRequestFullscreen();\n      }\n\n      root.classList.add(\"hlm-fullscreen\");\n\n      if (screen.orientation?.lock) {\n        try {\n          await screen.orientation.lock(\"landscape\");\n        } catch (e) {}\n      }\n\n      setTimeout(resizeCanvas, 120);\n    } catch (e) {\n      setPortraitClass();\n      setTimeout(resizeCanvas, 120);\n    }\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    setTimeout(resizeCanvas, 80);\n  });\n\n  document.addEventListener(\"webkitfullscreenchange\", () => {\n    root.classList.toggle(\"hlm-fullscreen\", !!document.webkitFullscreenElement);\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(76, 45, 27, .34)\";\n    ctx.lineWidth = Math.max(2, s * .034);\n\n    if (type === 0) {\n      \/\/ honey jar\n      ctx.fillStyle = \"#FFF1C9\";\n      roundedRect(cx - s * .22, cy - s * .24, s * .44, s * .50, s * .11);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"#F4C542\";\n      roundedRect(cx - s * .18, cy - s * .06, s * .36, s * .24, s * .08);\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(76,45,27,.24)\";\n      ctx.stroke();\n      ctx.fillStyle = \"#8F5D2F\";\n      roundedRect(cx - s * .15, cy - s * .33, s * .30, s * .10, s * .035);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"rgba(255,255,255,.54)\";\n      ctx.beginPath();\n      ctx.ellipse(cx - s * .08, cy - s * .13, s * .07, s * .035, -0.35, 0, Math.PI * 2);\n      ctx.fill();\n    }\n\n    if (type === 1) {\n      \/\/ closed book\n      ctx.fillStyle = \"#C99555\";\n      roundedRect(cx - s * .28, cy - s * .24, s * .56, s * .48, s * .07);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"rgba(255,241,201,.42)\";\n      roundedRect(cx - s * .22, cy - s * .18, s * .38, s * .36, s * .04);\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(76,45,27,.28)\";\n      ctx.beginPath();\n      ctx.moveTo(cx + s * .18, cy - s * .20);\n      ctx.lineTo(cx + s * .18, cy + s * .20);\n      ctx.moveTo(cx - s * .12, cy - s * .08);\n      ctx.lineTo(cx + s * .08, cy - s * .08);\n      ctx.moveTo(cx - s * .12, cy + s * .04);\n      ctx.lineTo(cx + s * .06, cy + s * .04);\n      ctx.stroke();\n    }\n\n    if (type === 2) {\n      \/\/ reading lamp glow\n      ctx.fillStyle = \"rgba(255,248,223,.62)\";\n      ctx.beginPath();\n      ctx.arc(cx, cy - s * .06, s * .27, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(155,100,40,.40)\";\n      ctx.stroke();\n      ctx.fillStyle = \"#FFE2A3\";\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .22, cy - s * .08);\n      ctx.lineTo(cx + s * .22, cy - s * .08);\n      ctx.lineTo(cx + s * .12, cy + s * .10);\n      ctx.lineTo(cx - s * .12, cy + s * .10);\n      ctx.closePath();\n      ctx.fill();\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(76,45,27,.32)\";\n      ctx.beginPath();\n      ctx.moveTo(cx, cy + s * .10);\n      ctx.lineTo(cx, cy + s * .26);\n      ctx.moveTo(cx - s * .16, cy + s * .27);\n      ctx.lineTo(cx + s * .16, cy + s * .27);\n      ctx.stroke();\n    }\n\n    if (type === 3) {\n      \/\/ bookmark ribbon\n      ctx.fillStyle = \"#F0B170\";\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .18, cy - s * .30);\n      ctx.lineTo(cx + s * .18, cy - s * .30);\n      ctx.lineTo(cx + s * .18, cy + s * .30);\n      ctx.lineTo(cx, cy + s * .15);\n      ctx.lineTo(cx - s * .18, cy + s * .30);\n      ctx.closePath();\n      ctx.fill();\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(255,248,223,.55)\";\n      ctx.lineWidth = Math.max(1.5, s * .024);\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .07, cy - s * .20);\n      ctx.lineTo(cx + s * .07, cy - s * .20);\n      ctx.moveTo(cx - s * .06, cy - s * .08);\n      ctx.lineTo(cx + s * .06, cy - s * .08);\n      ctx.stroke();\n    }\n\n    if (type === 4) {\n      \/\/ teacup\n      ctx.fillStyle = \"#B7A46D\";\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .25, cy - s * .10);\n      ctx.quadraticCurveTo(cx - s * .23, cy + s * .20, cx, cy + s * .23);\n      ctx.quadraticCurveTo(cx + s * .23, cy + s * .20, cx + s * .25, cy - s * .10);\n      ctx.closePath();\n      ctx.fill();\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.arc(cx + s * .27, cy + s * .01, s * .095, -Math.PI * .55, Math.PI * .55);\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(76,45,27,.26)\";\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .18, cy + s * .29);\n      ctx.lineTo(cx + s * .18, cy + s * .29);\n      ctx.stroke();\n      ctx.strokeStyle = \"rgba(255,248,223,.54)\";\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .10, cy - s * .20);\n      ctx.quadraticCurveTo(cx - s * .03, cy - s * .28, cx - s * .08, cy - s * .34);\n      ctx.moveTo(cx + s * .06, cy - s * .20);\n      ctx.quadraticCurveTo(cx + s * .13, cy - s * .28, cx + s * .08, cy - s * .34);\n      ctx.stroke();\n    }\n\n    if (type === 5) {\n      \/\/ reading glasses\n      ctx.strokeStyle = \"rgba(76,45,27,.44)\";\n      ctx.lineWidth = Math.max(3, s * .04);\n      ctx.beginPath();\n      ctx.arc(cx - s * .16, cy + s * .02, s * .15, 0, Math.PI * 2);\n      ctx.arc(cx + s * .16, cy + s * .02, s * .15, 0, Math.PI * 2);\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.moveTo(cx - s * .01, cy + s * .02);\n      ctx.lineTo(cx + s * .01, cy + s * .02);\n      ctx.moveTo(cx - s * .31, cy - s * .01);\n      ctx.lineTo(cx - s * .39, cy - s * .08);\n      ctx.moveTo(cx + s * .31, cy - s * .01);\n      ctx.lineTo(cx + s * .39, cy - s * .08);\n      ctx.stroke();\n      ctx.fillStyle = \"rgba(255,255,255,.30)\";\n      ctx.beginPath();\n      ctx.arc(cx - s * .18, cy - s * .02, s * .045, 0, Math.PI * 2);\n      ctx.arc(cx + s * .14, cy - s * .03, s * .04, 0, Math.PI * 2);\n      ctx.fill();\n    }\n\n    if (type === 6) {\n      \/\/ honeycomb\n      ctx.fillStyle = \"#FFD875\";\n      const cells = [[0,0],[-.16,-.11],[.16,-.11],[-.16,.11],[.16,.11],[0,.22]];\n      cells.forEach(h => {\n        const hx = cx + h[0] * s;\n        const hy = cy + h[1] * s;\n        ctx.beginPath();\n        for (let i = 0; i < 6; i++) {\n          const a = Math.PI \/ 6 + i * Math.PI \/ 3;\n          const px = hx + Math.cos(a) * s * .105;\n          const py = hy + Math.sin(a) * s * .105;\n          if (i === 0) ctx.moveTo(px, py);\n          else ctx.lineTo(px, py);\n        }\n        ctx.closePath();\n        ctx.fill();\n        ctx.stroke();\n      });\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(70, 38, 16, .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,223,.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(244, 197, 66, .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.dew > 0) {\n      ctx.save();\n\n      roundedRect(x + 4, y + 4, s - 8, s - 8, 16);\n      ctx.fillStyle = \"rgba(244, 197, 66, .27)\";\n      ctx.fill();\n\n      ctx.strokeStyle = \"rgba(255, 241, 201, .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, \"#4A2B1B\");\n    g.addColorStop(.40, \"#8E5A2C\");\n    g.addColorStop(.76, \"#E5BD76\");\n    g.addColorStop(1, \"#FFF1C9\");\n\n    ctx.fillStyle = g;\n    ctx.fillRect(0, 0, BASE_W, BASE_H);\n\n    ctx.save();\n\n    \/\/ warm reading lamp glow\n    const lamp = ctx.createRadialGradient(1030, 92, 8, 1030, 92, 285);\n    lamp.addColorStop(0, \"rgba(255,248,223,.78)\");\n    lamp.addColorStop(.34, \"rgba(244,197,66,.34)\");\n    lamp.addColorStop(1, \"rgba(244,197,66,0)\");\n    ctx.fillStyle = lamp;\n    ctx.beginPath();\n    ctx.arc(1030, 92, 285, 0, Math.PI * 2);\n    ctx.fill();\n\n    \/\/ tall library shelves\n    ctx.globalAlpha = .48;\n    for (let i = 0; i < 6; i++) {\n      const x = 65 + i * 205;\n      ctx.fillStyle = i % 2 ? \"rgba(76,45,27,.28)\" : \"rgba(60,34,18,.26)\";\n      roundedRect(x, 86 + (i % 3) * 12, 104, 478, 18);\n      ctx.fill();\n\n      ctx.fillStyle = \"rgba(255,241,201,.20)\";\n      for (let row = 0; row < 5; row++) {\n        const yy = 130 + row * 78 + (i % 2) * 7;\n        roundedRect(x + 15, yy, 74, 9, 5);\n        ctx.fill();\n      }\n    }\n    ctx.globalAlpha = 1;\n\n    function book(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, 6);\n      ctx.fillStyle = color;\n      ctx.globalAlpha = .38;\n      ctx.fill();\n      ctx.strokeStyle = \"rgba(255,241,201,.16)\";\n      ctx.lineWidth = 1.5;\n      ctx.stroke();\n      ctx.restore();\n    }\n\n    book(230, 155, 38, 72, \"#F4C542\", -.06);\n    book(388, 205, 48, 64, \"#C9793D\", .04);\n    book(720, 172, 34, 78, \"#8F5D2F\", .09);\n    book(948, 196, 56, 58, \"#FFF1C9\", -.05);\n    book(1130, 286, 42, 76, \"#B7A46D\", .07);\n\n    \/\/ table silhouette\n    const table = ctx.createLinearGradient(0, 530, 0, 720);\n    table.addColorStop(0, \"rgba(76,45,27,.20)\");\n    table.addColorStop(1, \"rgba(60,34,18,.44)\");\n    ctx.fillStyle = table;\n    roundedRect(42, 535, 1196, 210, 54);\n    ctx.fill();\n\n    \/\/ open book shapes beneath the board\n    ctx.globalAlpha = .28;\n    ctx.fillStyle = \"#FFF8DF\";\n    ctx.beginPath();\n    ctx.moveTo(230, 604);\n    ctx.quadraticCurveTo(395, 555, 555, 602);\n    ctx.lineTo(550, 682);\n    ctx.quadraticCurveTo(395, 642, 238, 686);\n    ctx.closePath();\n    ctx.fill();\n    ctx.beginPath();\n    ctx.moveTo(725, 602);\n    ctx.quadraticCurveTo(888, 555, 1050, 604);\n    ctx.lineTo(1042, 686);\n    ctx.quadraticCurveTo(888, 642, 730, 682);\n    ctx.closePath();\n    ctx.fill();\n    ctx.globalAlpha = 1;\n\n    \/\/ honey dust motes\n    for (let i = 0; i < 34; 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.3 + (i % 5) * 1.5;\n\n      ctx.globalAlpha = .10 + (i % 4) * .035;\n      ctx.fillStyle = i % 3 ? \"#FFF1C9\" : \"#F4C542\";\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 = .14;\n        ctx.strokeStyle = \"#FFF8DF\";\n        ctx.lineWidth = 1.4;\n        drawStar(x, y, r * 2.3, r * .7);\n        ctx.stroke();\n      }\n    }\n\n    \/\/ soft vertical light streaks\n    ctx.globalAlpha = .14;\n    ctx.strokeStyle = \"rgba(255,241,201,.42)\";\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(72, 106, 134, .20)\";\n    ctx.shadowBlur = l.compact ? 18 : 26;\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,223,.32)\";\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,201,.48)\");\n    frame.addColorStop(.55, \"rgba(244,197,66,.20)\");\n    frame.addColorStop(1, \"rgba(76,45,27,.20)\");\n    ctx.fillStyle = frame;\n    ctx.fill();\n\n    ctx.strokeStyle = \"rgba(116,76,38,.26)\";\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(76,45,27,.14)\";\n    ctx.fill();\n\n    \/\/ subtle honeycomb paper 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,201,.13)\";\n    ctx.lineWidth = 1;\n    const hex = l.compact ? 42 : 48;\n    for (let yy = l.y - hex; yy < l.y + l.boardH + hex; yy += hex * .86) {\n      for (let xx = l.x - hex; xx < l.x + l.boardW + hex; xx += hex * 1.5) {\n        const ox = ((Math.floor((yy - l.y + hex) \/ (hex * .86)) % 2) ? hex * .75 : 0);\n        ctx.beginPath();\n        for (let i = 0; i < 6; i++) {\n          const a = Math.PI \/ 6 + i * Math.PI \/ 3;\n          const px = xx + ox + Math.cos(a) * hex * .36;\n          const py = yy + Math.sin(a) * hex * .36;\n          if (i === 0) ctx.moveTo(px, py);\n          else ctx.lineTo(px, py);\n        }\n        ctx.closePath();\n        ctx.stroke();\n      }\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(244, 197, 66, \" + 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,223,.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(76,45,27,.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 = 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  root.dataset.hlmActive = \"1\";\n  requestAnimationFrame(render);\n})();\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\">Match, Collect, and Restore the Shelf<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The gameplay is easy to learn. Tap or swipe to swap two adjacent tiles. When three or more matching tiles line up, they disappear and new pieces fall into place. Longer matches can create special effects, helping you clear more of the board and reach the target faster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every successful match feels like tidying a magical library shelf: a little sparkle, a soft sound, and a satisfying movement as the board refreshes. If there are no possible moves left, the board will shuffle automatically, giving you a fresh chance without wasting a move.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why You Will Love The Golden Shelf<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This game is perfect for short relaxing breaks, quiet evenings, or a gentle moment between daily routines. It is simple enough for casual players, but still offers increasing difficulty for anyone who loves thoughtful puzzle challenges.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With its warm library theme, smooth tile movement, responsive fullscreen mode, touch-friendly controls, and cozy visual style, <strong>The Golden Shelf<\/strong> brings a soft little world of books and honey to your screen. Step into the reading room, follow the golden glow, and see how many shelves you can restore.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Golden Shelf is a cozy match-3 puzzle game set inside a warm little library filled with honeylight, old books, amber shelves, soft lamps, and quiet reading magic. Every tile feels like a tiny object from a peaceful reading room: books, honey jars, bookmarks, teacups, glasses, lamps, and golden library treasures waiting to be matched. &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-46","post","type-post","status-publish","format-standard","hentry","category-puzzle"],"_links":{"self":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/46","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=46"}],"version-history":[{"count":0,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/46\/revisions"}],"wp:attachment":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=46"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=46"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=46"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}