{"id":51,"date":"2026-10-23T23:50:11","date_gmt":"2026-10-23T23:50:11","guid":{"rendered":"https:\/\/apk.produsenpagarbrc.com\/?p=51"},"modified":"2026-10-23T23:50:11","modified_gmt":"2026-10-23T23:50:11","slug":"honeybound-stacks","status":"publish","type":"post","link":"https:\/\/play.produsenpagarbrc.com\/?p=51","title":{"rendered":"Honeybound Stacks"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Honeybound Stacks<\/strong> is a cozy falling-block puzzle game set inside a warm little honey library, where glowing books, amber shelves, golden bookmarks, teacups, reading lamps, and honey jars become the pieces of a quiet stacking challenge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your goal is simple: move, rotate, and drop each falling piece into the best position, complete full rows, clear space from the shelf, and keep the library from overflowing. Every cleared line feels like restoring order to a magical reading room touched by soft honeylight.<\/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\/Honeybound-Stacks-1024x768.png\" alt=\"\" class=\"wp-image-53\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">A Cozy Library Puzzle With Golden Charm<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In <strong>Honeybound Stacks<\/strong>, every block feels like a tiny piece of a story. Instead of cold shapes and plain colors, the board is filled with warm library objects inspired by books, bookmarks, honeycomb patterns, tea, lamps, and soft amber light. The game is designed to feel calm, readable, and comfortable on both desktop and mobile screens.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As the pieces fall, you need to think quickly but gently. Slide them left or right, rotate them into place, use soft drop when you need control, or hard drop when you already see the perfect landing spot. The more lines you clear, the higher your score grows, and the faster the game becomes.<\/p>\n\n\n\n<style>\n  #honeyLibraryBlocks,\n  #honeyLibraryBlocks * {\n    box-sizing: border-box;\n    user-select: none;\n    -webkit-tap-highlight-color: transparent;\n  }\n\n  #honeyLibraryBlocks {\n    width: 100%;\n    padding: 10px 0;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    overflow: visible;\n    font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n  }\n\n  #honeyLibraryBlocks .hlb-stage {\n    position: relative;\n    width: min(96vw, 430px);\n    aspect-ratio: 9 \/ 16;\n    overflow: hidden;\n    border-radius: 28px;\n    background:\n      radial-gradient(circle at 80% 10%, rgba(255, 241, 201, .72), transparent 22%),\n      radial-gradient(circle at 18% 18%, rgba(244, 197, 66, .24), transparent 30%),\n      radial-gradient(circle at 70% 86%, rgba(155, 100, 38, .28), transparent 30%),\n      linear-gradient(180deg, #3A2117 0%, #6F4128 34%, #B87333 66%, #FFF1C9 100%);\n    box-shadow:\n      0 22px 58px rgba(90, 50, 31, .26),\n      inset 0 0 0 1px rgba(255, 255, 255, .52);\n  }\n\n  #honeyLibraryBlocks canvas {\n    width: 100%;\n    height: 100%;\n    display: block;\n    touch-action: none;\n  }\n\n  #honeyLibraryBlocks .hlb-topbar {\n    position: absolute;\n    top: calc(14px + env(safe-area-inset-top));\n    left: calc(14px + env(safe-area-inset-left));\n    right: calc(14px + env(safe-area-inset-right));\n    z-index: 45;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    pointer-events: none;\n  }\n\n  #honeyLibraryBlocks .hlb-top-left,\n  #honeyLibraryBlocks .hlb-top-right {\n    display: flex;\n    gap: 9px;\n    pointer-events: auto;\n  }\n\n  #honeyLibraryBlocks .hlb-icon-btn,\n  #honeyLibraryBlocks .hlb-control-btn {\n    border: 1px solid rgba(139, 103, 74, .28);\n    color: #5f4a3c;\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    cursor: pointer;\n    padding: 0;\n    backdrop-filter: blur(10px);\n    -webkit-backdrop-filter: blur(10px);\n    transition: transform .12s ease, opacity .14s ease, visibility .14s ease, background .14s ease;\n  }\n\n  #honeyLibraryBlocks .hlb-icon-btn {\n    width: 38px;\n    height: 38px;\n    border-radius: 15px;\n    background:\n      radial-gradient(circle at 32% 22%, rgba(255, 255, 255, .62), transparent 34%),\n      linear-gradient(180deg, rgba(255, 248, 223, .92), rgba(255, 241, 201, .86));\n    box-shadow:\n      0 9px 21px rgba(90, 50, 31, .18),\n      0 0 16px rgba(244, 197, 66, .22),\n      inset 0 1px 0 rgba(255, 255, 255, .68),\n      inset 0 -3px 6px rgba(90, 50, 31, .10);\n  }\n  #honeyLibraryBlocks .hlb-pause { color: #5A321F; }\n  #honeyLibraryBlocks .hlb-sound { color: #9B6426; }\n  #honeyLibraryBlocks .hlb-fullscreen { color: #7A421F; }\n\n  #honeyLibraryBlocks .hlb-icon-btn:active,\n  #honeyLibraryBlocks .hlb-control-btn:active { transform: scale(.94); }\n\n  #honeyLibraryBlocks .hlb-css-icon {\n    position: relative;\n    width: 26px;\n    height: 26px;\n    display: block;\n  }\n\n  #honeyLibraryBlocks .hlb-pause-icon { width: 24px; height: 24px; }\n  #honeyLibraryBlocks .hlb-pause-icon::before,\n  #honeyLibraryBlocks .hlb-pause-icon::after {\n    content: \"\";\n    position: absolute;\n    top: 5px;\n    width: 4px;\n    height: 14px;\n    border-radius: 999px;\n    background: currentColor;\n  }\n  #honeyLibraryBlocks .hlb-pause-icon::before { left: 7px; }\n  #honeyLibraryBlocks .hlb-pause-icon::after { right: 7px; }\n\n  #honeyLibraryBlocks .hlb-pause.is-paused .hlb-pause-icon::before {\n    top: 5px;\n    left: 8px;\n    width: 0;\n    height: 0;\n    border-top: 7px solid transparent;\n    border-bottom: 7px solid transparent;\n    border-left: 11px solid currentColor;\n    border-radius: 0;\n    background: transparent;\n  }\n  #honeyLibraryBlocks .hlb-pause.is-paused .hlb-pause-icon::after { display: none; }\n\n  #honeyLibraryBlocks .hlb-sound-icon { width: 22px; height: 22px; transform: translateX(-1px); }\n  #honeyLibraryBlocks .hlb-speaker-back {\n    position: absolute;\n    left: 0;\n    top: 7px;\n    width: 5px;\n    height: 9px;\n    background: currentColor;\n    border-radius: 3px 0 0 3px;\n  }\n  #honeyLibraryBlocks .hlb-speaker-cone {\n    position: absolute;\n    left: 4px;\n    top: 3px;\n    width: 10px;\n    height: 17px;\n    background: currentColor;\n    clip-path: polygon(0 36%, 100% 0, 100% 100%, 0 64%);\n    border-radius: 2px;\n  }\n  #honeyLibraryBlocks .hlb-wave {\n    position: absolute;\n    border-style: solid;\n    border-color: currentColor;\n    border-left-color: transparent;\n    border-top-color: transparent;\n    border-bottom-color: transparent;\n    border-radius: 0 999px 999px 0;\n    transition: opacity .14s ease;\n  }\n  #honeyLibraryBlocks .hlb-wave-one { right: 5px; top: 8px; width: 4px; height: 7px; border-width: 2px; }\n  #honeyLibraryBlocks .hlb-wave-two { right: 1px; top: 6px; width: 8px; height: 11px; border-width: 2px; }\n  #honeyLibraryBlocks .hlb-wave-three { right: -3px; top: 3px; width: 12px; height: 17px; border-width: 2px; }\n  #honeyLibraryBlocks .hlb-mute-slash {\n    position: absolute;\n    left: 1px;\n    top: 10px;\n    width: 21px;\n    height: 3px;\n    border-radius: 999px;\n    background: #C2412D;\n    transform: rotate(-42deg) scaleX(0);\n    transform-origin: center;\n    transition: transform .14s ease;\n  }\n  #honeyLibraryBlocks .hlb-sound.is-muted .hlb-wave { opacity: 0; }\n  #honeyLibraryBlocks .hlb-sound.is-muted .hlb-mute-slash { transform: rotate(-42deg) scaleX(1); }\n\n  #honeyLibraryBlocks .hlb-full-icon { width: 24px; height: 24px; }\n  #honeyLibraryBlocks .hlb-full-icon::before {\n    content: \"\";\n    position: absolute;\n    inset: 2px;\n    background:\n      linear-gradient(currentColor, currentColor) left top \/ 10px 3px no-repeat,\n      linear-gradient(currentColor, currentColor) left top \/ 3px 10px no-repeat,\n      linear-gradient(currentColor, currentColor) right top \/ 10px 3px no-repeat,\n      linear-gradient(currentColor, currentColor) right top \/ 3px 10px no-repeat,\n      linear-gradient(currentColor, currentColor) left bottom \/ 10px 3px no-repeat,\n      linear-gradient(currentColor, currentColor) left bottom \/ 3px 10px no-repeat,\n      linear-gradient(currentColor, currentColor) right bottom \/ 10px 3px no-repeat,\n      linear-gradient(currentColor, currentColor) right bottom \/ 3px 10px no-repeat;\n  }\n\n  #honeyLibraryBlocks .hlb-controls {\n    position: absolute;\n    left: calc(14px + env(safe-area-inset-left));\n    right: calc(14px + env(safe-area-inset-right));\n    bottom: calc(14px + env(safe-area-inset-bottom));\n    z-index: 35;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: 10px;\n    padding: 8px 10px;\n    border-radius: 24px;\n    background: rgba(255, 248, 223, .56);\n    border: 1px solid rgba(90, 50, 31, .22);\n    backdrop-filter: blur(10px);\n    -webkit-backdrop-filter: blur(10px);\n    box-shadow:\n      0 12px 28px rgba(90, 50, 31, .20),\n      inset 0 1px 0 rgba(255,248,223,.56);\n    transition: opacity .14s ease, visibility .14s ease;\n  }\n\n  #honeyLibraryBlocks .hlb-control-btn {\n    width: 58px;\n    height: 58px;\n    flex: 0 0 58px;\n    border-radius: 18px;\n    color: #FFF8DF;\n    background:\n      radial-gradient(circle at 30% 24%, rgba(255,248,223,.44), transparent 32%),\n      linear-gradient(180deg, #B87333, #5A321F);\n    box-shadow:\n      0 10px 22px rgba(90, 50, 31, .24),\n      inset 0 1px 0 rgba(255,248,223,.42),\n      inset 0 -3px 6px rgba(63, 36, 24, .18);\n  }\n  #honeyLibraryBlocks .hlb-control-btn.hlb-rotate {\n    background:\n      radial-gradient(circle at 30% 24%, rgba(255,248,223,.42), transparent 32%),\n      linear-gradient(180deg, #F6D77D, #9B6426);\n  }\n  #honeyLibraryBlocks .hlb-control-btn.hlb-down {\n    background:\n      radial-gradient(circle at 30% 24%, rgba(255,248,223,.40), transparent 32%),\n      linear-gradient(180deg, #E9C875, #8F6431);\n  }\n  #honeyLibraryBlocks .hlb-control-btn.hlb-hard {\n    background:\n      radial-gradient(circle at 30% 24%, rgba(255,248,223,.44), transparent 32%),\n      linear-gradient(180deg, #C77432, #A74A30);\n  }\n\n  #honeyLibraryBlocks .hlb-arrow-left::before,\n  #honeyLibraryBlocks .hlb-arrow-right::before,\n  #honeyLibraryBlocks .hlb-arrow-down::before {\n    content: \"\";\n    position: absolute;\n    left: 3px;\n    top: 3px;\n    width: 20px;\n    height: 20px;\n    background: currentColor;\n    clip-path: polygon(28% 0, 72% 0, 72% 42%, 100% 42%, 50% 100%, 0 42%, 28% 42%);\n    transform-origin: center;\n  }\n  #honeyLibraryBlocks .hlb-arrow-left::before { transform: rotate(90deg); }\n  #honeyLibraryBlocks .hlb-arrow-right::before { transform: rotate(-90deg); }\n  #honeyLibraryBlocks .hlb-arrow-down::before { transform: rotate(0deg); }\n\n  #honeyLibraryBlocks .hlb-hard-icon::before,\n  #honeyLibraryBlocks .hlb-hard-icon::after {\n    content: \"\";\n    position: absolute;\n    left: 3px;\n    width: 20px;\n    height: 10px;\n    background: currentColor;\n    clip-path: polygon(0 0, 24% 0, 50% 58%, 76% 0, 100% 0, 50% 100%);\n  }\n  #honeyLibraryBlocks .hlb-hard-icon::before { top: 3px; }\n  #honeyLibraryBlocks .hlb-hard-icon::after { top: 12px; }\n\n  #honeyLibraryBlocks .hlb-rotate-icon { width: 24px; height: 24px; }\n  #honeyLibraryBlocks .hlb-rotate-icon .hlb-rot-arc {\n    position: absolute;\n    width: 15px;\n    height: 15px;\n    border: 4px solid currentColor;\n    border-radius: 50%;\n  }\n  #honeyLibraryBlocks .hlb-rotate-icon .hlb-rot-arc.a { left: 0; top: 0; border-right-color: transparent; border-bottom-color: transparent; transform: rotate(16deg); }\n  #honeyLibraryBlocks .hlb-rotate-icon .hlb-rot-arc.b { right: 0; bottom: 0; border-left-color: transparent; border-top-color: transparent; transform: rotate(16deg); }\n  #honeyLibraryBlocks .hlb-rotate-icon .hlb-rot-head { position: absolute; width: 0; height: 0; }\n  #honeyLibraryBlocks .hlb-rotate-icon .hlb-rot-head.a { right: 0; top: 1px; border-left: 8px solid currentColor; border-top: 5px solid transparent; border-bottom: 5px solid transparent; transform: rotate(-8deg); }\n  #honeyLibraryBlocks .hlb-rotate-icon .hlb-rot-head.b { left: 0; bottom: 1px; border-right: 8px solid currentColor; border-top: 5px solid transparent; border-bottom: 5px solid transparent; transform: rotate(-8deg); }\n\n  #honeyLibraryBlocks .hlb-overlay {\n    position: absolute;\n    inset: 0;\n    z-index: 40;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    padding: 26px;\n    background:\n      radial-gradient(circle at 50% 24%, rgba(255, 248, 223, .42), transparent 34%),\n      radial-gradient(circle at 58% 64%, rgba(244, 197, 66, .24), transparent 34%),\n      rgba(90, 50, 31, .20);\n    backdrop-filter: blur(9px);\n    -webkit-backdrop-filter: blur(9px);\n    opacity: 1;\n    pointer-events: auto;\n    transition: opacity .18s ease;\n  }\n  #honeyLibraryBlocks .hlb-overlay.hlb-hidden { opacity: 0; pointer-events: none; }\n\n  #honeyLibraryBlocks .hlb-card {\n    width: min(100%, 315px);\n    padding: 23px 19px 19px;\n    border-radius: 28px;\n    text-align: center;\n    background:\n      radial-gradient(circle at 30% 16%, rgba(255,248,223,.70), transparent 28%),\n      linear-gradient(145deg, rgba(255, 248, 223, .97), rgba(255, 241, 201, .92));\n    border: 1px solid rgba(255,248,223,.78);\n    box-shadow:\n      0 24px 62px rgba(90, 50, 31, .28),\n      0 0 28px rgba(244, 197, 66, .28),\n      inset 0 0 0 1px rgba(255,248,223,.30);\n  }\n\n  #honeyLibraryBlocks .hlb-mark {\n    width: 58px;\n    height: 58px;\n    margin: 0 auto 12px;\n    border-radius: 21px;\n    background:\n      radial-gradient(circle at 34% 22%, rgba(255,248,223,.72), transparent 18%),\n      linear-gradient(145deg, #FFF8DF 0%, #F4C542 48%, #9B6426 100%);\n    box-shadow:\n      0 0 22px rgba(244, 197, 66, .36),\n      0 12px 24px rgba(79, 42, 24, .22);\n    position: relative;\n  }\n  #honeyLibraryBlocks .hlb-mark::before {\n    content: \"\";\n    position: absolute;\n    left: 13px;\n    right: 13px;\n    bottom: 13px;\n    height: 28px;\n    border-radius: 7px 7px 10px 10px;\n    background: rgba(255,241,201,.90);\n    box-shadow: inset 0 -3px 0 rgba(90,50,31,.18), inset 9px 0 0 rgba(213,142,51,.26);\n  }\n  #honeyLibraryBlocks .hlb-mark::after {\n    content: \"\";\n    position: absolute;\n    width: 13px;\n    height: 24px;\n    right: 18px;\n    top: 12px;\n    background: #B87333;\n    clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 72%, 0 100%);\n    filter: drop-shadow(0 2px 2px rgba(63,36,24,.22));\n  }\n\n  #honeyLibraryBlocks .hlb-title {\n    margin: 0 0 8px;\n    color: #3F2418;\n    font-weight: 950;\n    font-size: 24px;\n    line-height: 1.14;\n    letter-spacing: -.02em;\n  }\n  #honeyLibraryBlocks .hlb-text {\n    margin: 0 0 16px;\n    color: rgba(63, 36, 24, .76);\n    font-weight: 750;\n    font-size: 13px;\n    line-height: 1.45;\n  }\n\n  #honeyLibraryBlocks .hlb-main-btn,\n  #honeyLibraryBlocks .hlb-sub-btn {\n    width: 100%;\n    border: 0;\n    border-radius: 18px;\n    padding: 13px 16px;\n    cursor: pointer;\n    transition: transform .12s ease;\n    font-family: inherit;\n  }\n  #honeyLibraryBlocks .hlb-main-btn {\n    background: linear-gradient(135deg, #5A321F, #C69032 55%, #D9953F);\n    color: #FFF8DF;\n    font-size: 15px;\n    font-weight: 950;\n    box-shadow: 0 12px 28px rgba(90, 50, 31, .28);\n  }\n  #honeyLibraryBlocks .hlb-sub-btn {\n    margin-top: 10px;\n    background: rgba(255, 248, 223, .64);\n    color: #5A321F;\n    border: 1px solid rgba(90, 50, 31, .18);\n    font-size: 14px;\n    font-weight: 850;\n  }\n  #honeyLibraryBlocks .hlb-main-btn:active,\n  #honeyLibraryBlocks .hlb-sub-btn:active { transform: scale(.97); }\n  #honeyLibraryBlocks .hlb-hidden { display: none; }\n\n  #honeyLibraryBlocks.hlb-minimal-ui .hlb-controls,\n  #honeyLibraryBlocks.hlb-minimal-ui .hlb-pause,\n  #honeyLibraryBlocks.hlb-minimal-ui .hlb-sound {\n    opacity: 0;\n    visibility: hidden;\n    pointer-events: none;\n  }\n  #honeyLibraryBlocks.hlb-minimal-ui .hlb-fullscreen {\n    opacity: 1;\n    visibility: visible;\n    pointer-events: auto;\n  }\n\n  #honeyLibraryBlocks:fullscreen,\n  #honeyLibraryBlocks:-webkit-full-screen {\n    width: 100vw;\n    height: 100vh;\n    padding: 0;\n    background: #F4C542;\n  }\n  #honeyLibraryBlocks:fullscreen .hlb-stage,\n  #honeyLibraryBlocks:-webkit-full-screen .hlb-stage { border-radius: 0; }\n\n  @supports (height: 100dvh) {\n    #honeyLibraryBlocks:fullscreen,\n    #honeyLibraryBlocks:-webkit-full-screen {\n      width: 100dvw;\n      height: 100dvh;\n    }\n  }\n\n  @media (max-width: 390px) {\n    #honeyLibraryBlocks .hlb-controls {\n      left: calc(10px + env(safe-area-inset-left));\n      right: calc(10px + env(safe-area-inset-right));\n      bottom: calc(12px + env(safe-area-inset-bottom));\n      gap: 7px;\n      padding: 7px 8px;\n      border-radius: 22px;\n    }\n    #honeyLibraryBlocks .hlb-control-btn {\n      width: 52px;\n      height: 52px;\n      flex-basis: 52px;\n      border-radius: 17px;\n    }\n    #honeyLibraryBlocks .hlb-arrow-left::before,\n    #honeyLibraryBlocks .hlb-arrow-right::before,\n    #honeyLibraryBlocks .hlb-arrow-down::before {\n      left: 4px;\n      top: 4px;\n      width: 18px;\n      height: 18px;\n    }\n    #honeyLibraryBlocks .hlb-hard-icon::before,\n    #honeyLibraryBlocks .hlb-hard-icon::after { left: 4px; width: 18px; }\n  }\n\n  @media (max-width: 350px) {\n    #honeyLibraryBlocks .hlb-controls { gap: 6px; padding-left: 7px; padding-right: 7px; }\n    #honeyLibraryBlocks .hlb-control-btn { width: 48px; height: 48px; flex-basis: 48px; }\n  }\n\n  \/* WordPress embedded-game focus: avoid browser focus ring on the whole widget. *\/\n  #honeyLibraryBlocks:focus { outline: none; }\n  #honeyLibraryBlocks button:focus-visible { outline: 2px solid #FFF8DF; outline-offset: 2px; }\n<\/style>\n<div id=\"honeyLibraryBlocks\">\n  <div class=\"hlb-stage\">\n    <canvas class=\"hlb-canvas\" aria-label=\"Honey Library Blocks falling block puzzle\"><\/canvas>\n\n    <div class=\"hlb-topbar\">\n      <div class=\"hlb-top-left\">\n        <button class=\"hlb-icon-btn hlb-pause\" type=\"button\" aria-label=\"Pause\">\n          <span class=\"hlb-css-icon hlb-pause-icon\" aria-hidden=\"true\"><\/span>\n        <\/button>\n\n        <button class=\"hlb-icon-btn hlb-sound\" type=\"button\" aria-label=\"Sound\">\n          <span class=\"hlb-css-icon hlb-sound-icon\" aria-hidden=\"true\">\n            <span class=\"hlb-speaker-back\"><\/span>\n            <span class=\"hlb-speaker-cone\"><\/span>\n            <span class=\"hlb-wave hlb-wave-one\"><\/span>\n            <span class=\"hlb-wave hlb-wave-two\"><\/span>\n            <span class=\"hlb-wave hlb-wave-three\"><\/span>\n            <span class=\"hlb-mute-slash\"><\/span>\n          <\/span>\n        <\/button>\n      <\/div>\n\n      <div class=\"hlb-top-right\">\n        <button class=\"hlb-icon-btn hlb-fullscreen\" type=\"button\" aria-label=\"Fullscreen\">\n          <span class=\"hlb-css-icon hlb-full-icon\" aria-hidden=\"true\"><\/span>\n        <\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"hlb-controls\">\n      <button class=\"hlb-control-btn hlb-left\" type=\"button\" aria-label=\"Move left\">\n        <span class=\"hlb-css-icon hlb-arrow-left\" aria-hidden=\"true\"><\/span>\n      <\/button>\n      <button class=\"hlb-control-btn hlb-right\" type=\"button\" aria-label=\"Move right\">\n        <span class=\"hlb-css-icon hlb-arrow-right\" aria-hidden=\"true\"><\/span>\n      <\/button>\n      <button class=\"hlb-control-btn hlb-rotate\" type=\"button\" aria-label=\"Rotate\">\n        <span class=\"hlb-css-icon hlb-rotate-icon\" aria-hidden=\"true\">\n          <span class=\"hlb-rot-arc a\"><\/span>\n          <span class=\"hlb-rot-arc b\"><\/span>\n          <span class=\"hlb-rot-head a\"><\/span>\n          <span class=\"hlb-rot-head b\"><\/span>\n        <\/span>\n      <\/button>\n      <button class=\"hlb-control-btn hlb-down\" type=\"button\" aria-label=\"Soft drop\">\n        <span class=\"hlb-css-icon hlb-arrow-down\" aria-hidden=\"true\"><\/span>\n      <\/button>\n      <button class=\"hlb-control-btn hlb-hard\" type=\"button\" aria-label=\"Hard drop\">\n        <span class=\"hlb-css-icon hlb-hard-icon\" aria-hidden=\"true\"><\/span>\n      <\/button>\n    <\/div>\n\n    <div class=\"hlb-overlay\">\n      <div class=\"hlb-card\">\n        <div class=\"hlb-mark\" aria-hidden=\"true\"><\/div>\n        <p class=\"hlb-title\">Honey Library Blocks<\/p>\n        <p class=\"hlb-text\">Stack warm library pieces, clear golden rows, and keep the honey shelf glowing with quiet reading magic.<\/p>\n        <button class=\"hlb-main-btn\" type=\"button\">Open the Shelf<\/button>\n        <button class=\"hlb-sub-btn hlb-hidden\" type=\"button\">Reset the Shelf<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function () {\n  \"use strict\";\n\n  function initializeHoneyboundStacks() {\n  var root = document.getElementById(\"honeyLibraryBlocks\");\n  if (!root) return;\n  if (root.dataset.hlbReady === \"1\") return;\n  var stage = root.querySelector(\".hlb-stage\");\n  var canvas = root.querySelector(\".hlb-canvas\");\n  var ctx = canvas.getContext(\"2d\");\n  if (!ctx) return;\n  root.dataset.hlbReady = \"1\";\n\n  var overlay = root.querySelector(\".hlb-overlay\");\n  var overlayTitle = root.querySelector(\".hlb-title\");\n  var overlayText = root.querySelector(\".hlb-text\");\n  var mainBtn = root.querySelector(\".hlb-main-btn\");\n  var subBtn = root.querySelector(\".hlb-sub-btn\");\n\n  var pauseBtn = root.querySelector(\".hlb-pause\");\n  var soundBtn = root.querySelector(\".hlb-sound\");\n  var fullscreenBtn = root.querySelector(\".hlb-fullscreen\");\n  var leftBtn = root.querySelector(\".hlb-left\");\n  var rightBtn = root.querySelector(\".hlb-right\");\n  var rotateBtn = root.querySelector(\".hlb-rotate\");\n  var downBtn = root.querySelector(\".hlb-down\");\n  var hardBtn = root.querySelector(\".hlb-hard\");\n\n  var W = 360;\n  var H = 640;\n  var COLS = 10;\n  var ROWS = 18;\n  var CELL = 25;\n  var BOARD_W = COLS * CELL;\n  var BOARD_H = ROWS * CELL;\n  var BOARD_X = Math.round((W - BOARD_W) \/ 2);\n  var BOARD_Y = 104;\n\n  var STORAGE_BEST = \"honey_library_blocks_best_v1\";\n  var STORAGE_MUTE = \"honey_library_blocks_mute_v1\";\n  var SFX_VOLUME = 1.18;\n\n  var board = [];\n  var current = null;\n  var nextPreview = null;\n  var bag = [];\n  var particles = [];\n  var ambientDust = [];\n  var clearWaves = [];\n  var impactGlows = [];\n  var score = 0;\n  var lines = 0;\n  var level = 1;\n  var best = safeNumber(storageGet(STORAGE_BEST), 0);\n  var started = false;\n  var paused = false;\n  var gameOver = false;\n  var overlayMode = \"start\";\n  var dropTimer = 0;\n  var lastTime = 0;\n  var muted = storageGet(STORAGE_MUTE) === \"1\";\n  var audioCtx = null;\n  var pointerStart = null;\n  var holds = {};\n\n  var pieces = [\n    { matrix: [[1,1],[1,1]], color: \"#C6813E\", edge: \"#784326\", icon: \"book\" },\n    { matrix: [[1,1,1,1]], color: \"#FFF1C9\", edge: \"#9B6B2F\", icon: \"bookmark\" },\n    { matrix: [[0,1,0],[1,1,1]], color: \"#F4C542\", edge: \"#AA7317\", icon: \"lamp\" },\n    { matrix: [[1,0,0],[1,1,1]], color: \"#B06A38\", edge: \"#6F3D23\", icon: \"teacup\" },\n    { matrix: [[0,0,1],[1,1,1]], color: \"#A67C52\", edge: \"#63452C\", icon: \"glasses\" },\n    { matrix: [[0,1,1],[1,1,0]], color: \"#E7A933\", edge: \"#9C6228\", icon: \"honeyjar\" },\n    { matrix: [[1,1,0],[0,1,1]], color: \"#FFE08A\", edge: \"#BD8C2C\", icon: \"honeycomb\" }\n  ];\n\n  function storageGet(key) {\n    try { return localStorage.getItem(key); } catch (e) { return null; }\n  }\n\n  function storageSet(key, value) {\n    try { localStorage.setItem(key, value); } catch (e) {}\n  }\n\n  function safeNumber(value, fallback) {\n    var n = Number(value);\n    return Number.isFinite(n) ? n : fallback;\n  }\n\n  function syncUiMode() {\n    var minimal = paused || gameOver || overlayMode === \"start\" || overlayMode === \"restart\";\n    root.classList.toggle(\"hlb-minimal-ui\", minimal);\n  }\n\n  function fitStage() {\n    var isFull = document.fullscreenElement === root || document.webkitFullscreenElement === root;\n    var rootRect = root.getBoundingClientRect();\n    var availableW = isFull ? window.innerWidth : Math.max(280, rootRect.width || window.innerWidth);\n    var availableH = isFull ? window.innerHeight : Math.min(window.innerHeight - 20, 760);\n\n    if (availableH < 360) availableH = Math.max(320, window.innerHeight - 12);\n\n    var maxW = isFull ? window.innerWidth : Math.min(availableW, 430);\n    var targetW = Math.min(maxW, availableH * 9 \/ 16);\n    var targetH = targetW * 16 \/ 9;\n\n    if (targetH > availableH) {\n      targetH = availableH;\n      targetW = targetH * 9 \/ 16;\n    }\n\n    stage.style.width = Math.floor(targetW) + \"px\";\n    stage.style.height = Math.floor(targetH) + \"px\";\n    resizeCanvas();\n  }\n\n  function resizeCanvas() {\n    var rect = canvas.getBoundingClientRect();\n    var dpr = Math.min(window.devicePixelRatio || 1, 2);\n    canvas.width = Math.max(1, Math.round(rect.width * dpr));\n    canvas.height = Math.max(1, Math.round(rect.height * dpr));\n    ctx.setTransform(canvas.width \/ W, 0, 0, canvas.height \/ H, 0, 0);\n    draw();\n  }\n\n  function createBoard() {\n    var rows = [];\n    for (var y = 0; y < ROWS; y++) rows.push(Array(COLS).fill(null));\n    return rows;\n  }\n\n  function clonePiece(piece) {\n    return {\n      matrix: piece.matrix.map(function (row) { return row.slice(); }),\n      color: piece.color,\n      edge: piece.edge,\n      icon: piece.icon,\n      x: 0,\n      y: 0\n    };\n  }\n\n  function shuffle(arr) {\n    for (var i = arr.length - 1; i > 0; i--) {\n      var j = Math.floor(Math.random() * (i + 1));\n      var temp = arr[i];\n      arr[i] = arr[j];\n      arr[j] = temp;\n    }\n    return arr;\n  }\n\n  function refillBag() { bag = shuffle(pieces.map(clonePiece)); }\n  function nextPiece() { if (!bag.length) refillBag(); return bag.pop(); }\n\n  function createAmbientDust() {\n    ambientDust = [];\n    for (var i = 0; i < 38; i++) {\n      var kindRand = Math.random();\n      var type = kindRand > .70 ? \"page\" : (kindRand > .36 ? \"glint\" : \"dust\");\n      var palette = type === \"page\"\n        ? [\"#FFF1C9\", \"#E9C875\", \"#D9953F\"]\n        : type === \"glint\"\n          ? [\"#FFF8DF\", \"#F4C542\", \"#FFE08A\"]\n          : [\"#FFF1C9\", \"#C69032\", \"#F4C542\"];\n      ambientDust.push({\n        type: type,\n        x: Math.random() * W,\n        y: Math.random() * H,\n        r: type === \"page\" ? 2.8 + Math.random() * 4.4 : .7 + Math.random() * 2.2,\n        speed: type === \"page\" ? .030 + Math.random() * .10 : .025 + Math.random() * .085,\n        alpha: type === \"page\" ? .10 + Math.random() * .18 : .07 + Math.random() * .18,\n        twinkle: Math.random() * Math.PI * 2,\n        drift: Math.random() * Math.PI * 2,\n        rot: Math.random() * Math.PI * 2,\n        spin: (Math.random() - .5) * .016,\n        color: palette[Math.floor(Math.random() * palette.length)]\n      });\n    }\n  }\n\n  function resetGame() {\n    board = createBoard();\n    particles = [];\n    clearWaves = [];\n    impactGlows = [];\n    score = 0;\n    lines = 0;\n    level = 1;\n    dropTimer = 0;\n    bag = [];\n    nextPreview = nextPiece();\n    started = true;\n    paused = false;\n    gameOver = false;\n    overlayMode = \"play\";\n    pauseBtn.classList.remove(\"is-paused\");\n    syncUiMode();\n    spawnPiece();\n    hideOverlay();\n  }\n\n  function spawnPiece() {\n    current = nextPreview || nextPiece();\n    nextPreview = nextPiece();\n    current.x = Math.floor((COLS - current.matrix[0].length) \/ 2);\n    current.y = -1;\n    if (collides(current.matrix, current.x, current.y)) endGame();\n  }\n\n  function endGame() {\n    gameOver = true;\n    started = false;\n    paused = false;\n    pauseBtn.classList.remove(\"is-paused\");\n\n    if (score > best) {\n      best = score;\n      storageSet(STORAGE_BEST, String(best));\n    }\n\n    showOverlay(\n      \"The Shelf Is Full\",\n      \"No more quiet space on the honey shelf today. Score \" + score + \" - Best \" + best + \".\",\n      \"Shelve Again\",\n      false,\n      \"restart\"\n    );\n\n    sound(\"over\");\n  }\n\n  function showOverlay(title, text, mainLabel, showSub, mode) {\n    overlayMode = mode || \"start\";\n    overlayTitle.textContent = title;\n    overlayText.textContent = text;\n    mainBtn.textContent = mainLabel;\n    subBtn.classList.toggle(\"hlb-hidden\", !showSub);\n    overlay.classList.remove(\"hlb-hidden\");\n    syncUiMode();\n  }\n\n  function hideOverlay() {\n    overlay.classList.add(\"hlb-hidden\");\n    if (!paused ? !gameOver : false) overlayMode = \"play\";\n    syncUiMode();\n  }\n\n  function togglePause() {\n    if (!started || gameOver) return;\n    paused = !paused;\n    pauseBtn.classList.toggle(\"is-paused\", paused);\n\n    if (paused) {\n      showOverlay(\n        \"Reading Break\",\n        \"The honey shelf is waiting softly. Take a breath, then return to the warm little stack.\",\n        \"Resume Reading\",\n        true,\n        \"resume\"\n      );\n      subBtn.textContent = \"Reset the Shelf\";\n      sound(\"pause\");\n    } else {\n      hideOverlay();\n      sound(\"resume\");\n    }\n  }\n\n  function canPlay() { return started ? (!paused ? (!gameOver ? current : false) : false) : false; }\n  function fallDelay() { return Math.max(108, 780 - (level - 1) * 52); }\n\n  function collides(matrix, px, py) {\n    for (var y = 0; y < matrix.length; y++) {\n      for (var x = 0; x < matrix[y].length; x++) {\n        if (!matrix[y][x]) continue;\n        var nx = px + x;\n        var ny = py + y;\n        if (nx < 0 || nx >= COLS || ny >= ROWS) return true;\n        if (ny >= 0 ? board[ny][nx] : false) return true;\n      }\n    }\n    return false;\n  }\n\n  function move(dx) {\n    if (!canPlay()) return false;\n    if (!collides(current.matrix, current.x + dx, current.y)) {\n      current.x += dx;\n      sound(\"move\");\n      return true;\n    }\n    return false;\n  }\n\n  function stepDown() {\n    if (!canPlay()) return;\n    if (!collides(current.matrix, current.x, current.y + 1)) current.y++;\n    else mergePiece();\n  }\n\n  function softDrop(steps) {\n    if (!canPlay()) return;\n    var amount = Math.max(1, steps || 1);\n    for (var i = 0; i < amount; i++) {\n      if (!collides(current.matrix, current.x, current.y + 1)) {\n        current.y++;\n        score += 1;\n      } else {\n        mergePiece();\n        break;\n      }\n    }\n    saveBestIfNeeded();\n    dropTimer = 0;\n    sound(\"soft\");\n  }\n\n  function hardDrop() {\n    if (!canPlay()) return;\n    var distance = 0;\n    while (!collides(current.matrix, current.x, current.y + 1)) {\n      current.y++;\n      distance++;\n    }\n    score += distance * 2;\n    saveBestIfNeeded();\n    impactGlows.push({\n      x: BOARD_X + (current.x + current.matrix[0].length \/ 2) * CELL,\n      y: BOARD_Y + (current.y + current.matrix.length) * CELL,\n      age: 0,\n      life: 18,\n      color: current.color\n    });\n    sound(\"drop\");\n    mergePiece();\n    dropTimer = 0;\n  }\n\n  function saveBestIfNeeded() {\n    if (score > best) {\n      best = score;\n      storageSet(STORAGE_BEST, String(best));\n    }\n  }\n\n  function rotateMatrix(matrix) {\n    var h = matrix.length;\n    var w = matrix[0].length;\n    var result = [];\n    for (var y = 0; y < w; y++) result.push(Array(h).fill(0));\n    for (var yy = 0; yy < h; yy++) {\n      for (var xx = 0; xx < w; xx++) result[xx][h - 1 - yy] = matrix[yy][xx];\n    }\n    return trimMatrix(result);\n  }\n\n  function trimMatrix(matrix) {\n    var top = 0;\n    var bottom = matrix.length - 1;\n    var left = 0;\n    var right = matrix[0].length - 1;\n    while (top <= bottom ? matrix[top].every(function (v) { return !v; }) : false) top++;\n    while (bottom >= top ? matrix[bottom].every(function (v) { return !v; }) : false) bottom--;\n    while (left <= right ? matrix.every(function (row) { return !row[left]; }) : false) left++;\n    while (right >= left ? matrix.every(function (row) { return !row[right]; }) : false) right--;\n    var trimmed = [];\n    for (var y = top; y <= bottom; y++) trimmed.push(matrix[y].slice(left, right + 1));\n    return trimmed.length ? trimmed : [[1]];\n  }\n\n  function rotatePiece() {\n    if (!canPlay()) return false;\n    var rotated = rotateMatrix(current.matrix);\n    var kicks = [0, -1, 1, -2, 2];\n    for (var i = 0; i < kicks.length; i++) {\n      var nx = current.x + kicks[i];\n      if (!collides(rotated, nx, current.y)) {\n        current.matrix = rotated;\n        current.x = nx;\n        sound(\"rotate\");\n        return true;\n      }\n    }\n    return false;\n  }\n\n  function mergePiece() {\n    current.matrix.forEach(function (row, y) {\n      row.forEach(function (value, x) {\n        if (!value) return;\n        var by = current.y + y;\n        var bx = current.x + x;\n        if (by >= 0 ? (by < ROWS ? (bx >= 0 ? bx < COLS : false) : false) : false) {\n          board[by][bx] = { color: current.color, edge: current.edge, icon: current.icon };\n        }\n      });\n    });\n    sound(\"lock\");\n    clearLines();\n    spawnPiece();\n  }\n\n  function clearLines() {\n    var cleared = [];\n    for (var y = 0; y < ROWS; y++) {\n      var full = true;\n      for (var x = 0; x < COLS; x++) {\n        if (!board[y][x]) { full = false; break; }\n      }\n      if (full) cleared.push(y);\n    }\n    if (!cleared.length) return;\n\n    cleared.forEach(function (rowIndex) {\n      clearWaves.push({ y: BOARD_Y + rowIndex * CELL + CELL \/ 2, age: 0, life: 44 });\n      for (var x = 0; x < COLS; x++) {\n        var cell = board[rowIndex][x];\n        var cx = BOARD_X + x * CELL + CELL \/ 2;\n        var cy = BOARD_Y + rowIndex * CELL + CELL \/ 2;\n        burstTeaSpark(cx, cy, cell.color, cell.edge);\n      }\n    });\n\n    board = board.filter(function (row) { return !row.every(Boolean); });\n    while (board.length < ROWS) board.unshift(Array(COLS).fill(null));\n\n    var count = cleared.length;\n    var scores = [0, 100, 280, 520, 860];\n    score += (scores[count] || count * 250) * level;\n    lines += count;\n    level = 1 + Math.floor(lines \/ 7);\n    saveBestIfNeeded();\n    sound(count >= 3 ? \"bigClear\" : \"clear\");\n  }\n\n  function ghostY() {\n    if (!current) return 0;\n    var gy = current.y;\n    while (!collides(current.matrix, current.x, gy + 1)) gy++;\n    return gy;\n  }\n\n  function burstTeaSpark(x, y, color, edge) {\n    for (var i = 0; i < 5; i++) {\n      var angle = Math.PI * 2 * i \/ 5 + (Math.random() - .5) * .72;\n      var speed = .30 + Math.random() * .62;\n      particles.push({\n        type: \"spark\",\n        x: x + Math.cos(angle) * 2,\n        y: y + Math.sin(angle) * 2,\n        vx: Math.cos(angle) * speed,\n        vy: Math.sin(angle) * speed * .32 - .26,\n        age: 0,\n        life: 42 + Math.random() * 18,\n        r: 2.5 + Math.random() * 3.2,\n        rot: angle,\n        spin: (Math.random() - .5) * .06,\n        color: Math.random() > .42 ? \"#FFF8DF\" : color\n      });\n    }\n\n    for (var g = 0; g < 3; g++) {\n      var glintAngle = Math.random() * Math.PI * 2;\n      var glintSpeed = .24 + Math.random() * .58;\n      particles.push({\n        type: \"spark\",\n        x: x + (Math.random() - .5) * 8,\n        y: y + (Math.random() - .5) * 8,\n        vx: Math.cos(glintAngle) * glintSpeed,\n        vy: Math.sin(glintAngle) * glintSpeed * .42 - .38,\n        age: 0,\n        life: 28 + Math.random() * 18,\n        r: 2.8 + Math.random() * 2.2,\n        rot: glintAngle,\n        spin: (Math.random() - .5) * .12,\n        color: Math.random() > .35 ? \"#FFF1C9\" : \"#F4C542\"\n      });\n    }\n\n    if (Math.random() > .32) {\n      particles.push({\n        type: \"mist\",\n        x: x + (Math.random() - .5) * 8,\n        y: y + (Math.random() - .5) * 5,\n        vx: (Math.random() - .5) * .18,\n        vy: -.34 - Math.random() * .28,\n        age: 0,\n        life: 48 + Math.random() * 18,\n        r: 4.2 + Math.random() * 2.2,\n        rot: Math.random() * Math.PI,\n        spin: (Math.random() - .5) * .020,\n        color: Math.random() > .5 ? \"#FFF8DF\" : \"#FFE08A\"\n      });\n    }\n  }\n\n  function updateParticles() {\n    for (var i = particles.length - 1; i >= 0; i--) {\n      var p = particles[i];\n      p.age++;\n      p.x += p.vx;\n      p.y += p.vy;\n      p.vx *= .992;\n\n      if (p.type === \"mist\") {\n        p.vx += Math.sin((p.age + p.rot) * .09) * .006;\n        p.vy -= .002;\n      } else if (p.type === \"spark\") {\n        p.vy += .010;\n      } else if (p.type === \"bubble\") {\n        p.vx += Math.sin((p.age + p.rot) * .055) * .006;\n        p.vy -= .004;\n      } else {\n        p.vy += .018;\n      }\n\n      p.rot += p.spin || 0;\n      if (p.age >= p.life) particles.splice(i, 1);\n    }\n\n    for (var w = clearWaves.length - 1; w >= 0; w--) {\n      clearWaves[w].age++;\n      if (clearWaves[w].age >= clearWaves[w].life) clearWaves.splice(w, 1);\n    }\n\n    for (var g = impactGlows.length - 1; g >= 0; g--) {\n      impactGlows[g].age++;\n      if (impactGlows[g].age >= impactGlows[g].life) impactGlows.splice(g, 1);\n    }\n\n    for (var a = 0; a < ambientDust.length; a++) {\n      var dust = ambientDust[a];\n      dust.y += dust.speed;\n      dust.x += Math.sin(Date.now() * .001 + dust.drift) * (dust.type === \"bubble\" ? .10 : .04);\n      dust.rot += dust.spin || 0;\n      dust.twinkle += .018;\n      if (dust.y > H + 12) {\n        dust.y = -14;\n        dust.x = Math.random() * W;\n      }\n    }\n  }\n\n  function unlockAudio() {\n    if (muted) return;\n    if (!audioCtx) {\n      try { audioCtx = new (window.AudioContext || window.webkitAudioContext)(); } catch (e) { audioCtx = null; }\n    }\n    if (audioCtx ? audioCtx.state === \"suspended\" : false) audioCtx.resume();\n  }\n\n  function tone(freq, dur, type, vol, delay, slide) {\n    if (muted || !audioCtx) return;\n    var now = audioCtx.currentTime + (delay || 0);\n    var osc = audioCtx.createOscillator();\n    var gain = audioCtx.createGain();\n    var finalVol = Math.max(.0002, (vol || .04) * SFX_VOLUME);\n\n    osc.type = type || \"sine\";\n    osc.frequency.setValueAtTime(freq, now);\n    if (slide) osc.frequency.exponentialRampToValueAtTime(Math.max(40, freq * slide), now + dur);\n    gain.gain.setValueAtTime(.0001, now);\n    gain.gain.exponentialRampToValueAtTime(finalVol, now + .012);\n    gain.gain.exponentialRampToValueAtTime(.0001, now + dur);\n    osc.connect(gain);\n    gain.connect(audioCtx.destination);\n    osc.start(now);\n    osc.stop(now + dur + .025);\n  }\n\n  function sound(name) {\n    if (muted) return;\n    unlockAudio();\n    if (!audioCtx) return;\n\n    if (name === \"move\") {\n      tone(480, .026, \"triangle\", .010, 0, 1.03);\n    } else if (name === \"rotate\") {\n      tone(620, .045, \"sine\", .014, 0, 1.12);\n      tone(820, .055, \"triangle\", .012, .032, 1.08);\n    } else if (name === \"soft\") {\n      tone(360, .030, \"triangle\", .010, 0, .96);\n    } else if (name === \"drop\") {\n      tone(190, .070, \"triangle\", .022, 0, .74);\n      tone(120, .105, \"sine\", .014, .035, .86);\n    } else if (name === \"lock\") {\n      tone(420, .040, \"triangle\", .014, 0, .94);\n    } else if (name === \"clear\") {\n      tone(680, .070, \"sine\", .028, 0, 1.12);\n      tone(920, .085, \"triangle\", .022, .050, 1.08);\n      tone(1180, .075, \"sine\", .014, .105, 1.04);\n    } else if (name === \"bigClear\") {\n      tone(560, .080, \"triangle\", .034, 0, 1.14);\n      tone(760, .088, \"sine\", .028, .048, 1.12);\n      tone(1040, .130, \"triangle\", .024, .108, 1.08);\n      tone(1320, .105, \"sine\", .018, .172, 1.04);\n    } else if (name === \"pause\") {\n      tone(360, .080, \"sine\", .016, 0, .84);\n    } else if (name === \"resume\" || name === \"start\") {\n      tone(540, .052, \"triangle\", .018, 0, 1.10);\n      tone(780, .070, \"sine\", .017, .050, 1.08);\n    } else if (name === \"over\") {\n      tone(230, .135, \"triangle\", .022, 0, .76);\n      tone(150, .180, \"sine\", .017, .115, .84);\n    }\n  }\n\n  function draw() {\n    ctx.clearRect(0, 0, W, H);\n    drawBackground();\n    drawPanels();\n    drawBoardFrame();\n    drawBoard();\n    drawGhost();\n    drawPiece();\n    drawImpactGlows();\n    drawClearWaves();\n    drawParticles();\n  }\n\n  function drawBackground() {\n    var bg = ctx.createLinearGradient(0, 0, 0, H);\n    bg.addColorStop(0, \"#2B1710\");\n    bg.addColorStop(.30, \"#5A321F\");\n    bg.addColorStop(.66, \"#A7652C\");\n    bg.addColorStop(1, \"#FFF1C9\");\n    ctx.fillStyle = bg;\n    ctx.fillRect(0, 0, W, H);\n\n    ctx.save();\n\n    var lampGlow = ctx.createRadialGradient(284, 74, 2, 284, 74, 150);\n    lampGlow.addColorStop(0, \"rgba(255,241,201,.86)\");\n    lampGlow.addColorStop(.36, \"rgba(244,197,66,.32)\");\n    lampGlow.addColorStop(1, \"rgba(255,241,201,0)\");\n    ctx.fillStyle = lampGlow;\n    ctx.beginPath();\n    ctx.arc(284, 74, 150, 0, Math.PI * 2);\n    ctx.fill();\n\n    function drawBookSpine(x, y, w, h, color, lean) {\n      ctx.save();\n      ctx.translate(x + w \/ 2, y + h \/ 2);\n      ctx.rotate(lean || 0);\n      roundedRect(-w \/ 2, -h \/ 2, w, h, 3, color, \"rgba(255,241,201,.20)\", .8);\n      ctx.globalAlpha = .42;\n      ctx.strokeStyle = \"#FFF1C9\";\n      ctx.lineWidth = .9;\n      ctx.beginPath();\n      ctx.moveTo(-w * .20, -h * .36);\n      ctx.lineTo(-w * .20, h * .34);\n      ctx.moveTo(w * .22, -h * .28);\n      ctx.lineTo(w * .22, h * .26);\n      ctx.stroke();\n      ctx.restore();\n    }\n\n    function drawShelfBand(y) {\n      ctx.save();\n      ctx.globalAlpha = .38;\n      roundedRect(16, y, 328, 9, 3, \"rgba(63,36,24,.68)\", \"rgba(255,241,201,.13)\", 1);\n      ctx.restore();\n    }\n\n    var shelfColors = [\"#6F4128\", \"#8E4E24\", \"#B87333\", \"#C6813E\", \"#5A321F\", \"#D2A24A\"];\n    for (var row = 0; row < 3; row++) {\n      var sy = 96 + row * 76;\n      drawShelfBand(sy + 44);\n      for (var b = 0; b < 15; b++) {\n        var bw = 9 + (b % 4) * 2;\n        var bh = 30 + ((b + row) % 5) * 4;\n        var bx = 18 + b * 22 + (row % 2) * 6;\n        if (bx > 342) continue;\n        drawBookSpine(bx, sy + 43 - bh, bw, bh, shelfColors[(b + row) % shelfColors.length], (Math.random() - .5) * .04);\n      }\n    }\n\n    drawHangingLamp(292, 0);\n    drawWindowArch(22, 76, 78, 116);\n\n    ctx.globalAlpha = .20;\n    ctx.fillStyle = \"#FFF8DF\";\n    roundedRect(248, 394, 90, 112, 22, \"rgba(255,248,223,.34)\", \"rgba(90,50,31,.35)\", 1.4);\n    roundedRect(270, 360, 45, 42, 12, \"rgba(244,197,66,.28)\", \"rgba(90,50,31,.28)\", 1);\n    ctx.globalAlpha = 1;\n\n    for (var i = 0; i < ambientDust.length; i++) {\n      var d = ambientDust[i];\n      var tw = .70 + Math.sin(d.twinkle) * .30;\n      ctx.globalAlpha = d.alpha * tw;\n      if (d.type === \"page\") {\n        ctx.save();\n        ctx.translate(d.x, d.y);\n        ctx.rotate(d.rot);\n        roundedRect(-d.r, -d.r * .62, d.r * 2.0, d.r * 1.24, 1.8, d.color, \"rgba(90,50,31,.20)\", .5);\n        ctx.restore();\n      } else if (d.type === \"glint\") {\n        drawFoamStar(d.x, d.y, d.r * 1.5, d.color, d.rot);\n      } else {\n        ctx.fillStyle = d.color;\n        ctx.beginPath();\n        ctx.arc(d.x, d.y, d.r, 0, Math.PI * 2);\n        ctx.fill();\n      }\n    }\n\n    var desk = ctx.createLinearGradient(0, 516, 0, H);\n    desk.addColorStop(0, \"rgba(111,65,40,.86)\");\n    desk.addColorStop(.45, \"rgba(90,50,31,.94)\");\n    desk.addColorStop(1, \"rgba(63,36,24,1)\");\n    ctx.globalAlpha = 1;\n    ctx.fillStyle = desk;\n    ctx.beginPath();\n    ctx.moveTo(0, 544);\n    ctx.bezierCurveTo(42, 524, 90, 550, 130, 532);\n    ctx.bezierCurveTo(188, 506, 232, 548, 292, 526);\n    ctx.bezierCurveTo(326, 514, 342, 529, W, 520);\n    ctx.lineTo(W, H);\n    ctx.lineTo(0, H);\n    ctx.closePath();\n    ctx.fill();\n\n    ctx.globalAlpha = .18;\n    ctx.strokeStyle = \"#FFF1C9\";\n    ctx.lineWidth = 1;\n    for (var k = 0; k < 5; k++) {\n      ctx.beginPath();\n      ctx.moveTo(18, 565 + k * 13);\n      ctx.quadraticCurveTo(164, 552 + k * 7, 342, 565 + k * 13);\n      ctx.stroke();\n    }\n\n    ctx.restore();\n  }\n\n\n\n  function drawCloud(x, y, scale, fill) {\n    ctx.save();\n    ctx.translate(x, y);\n    ctx.scale(scale, scale);\n    ctx.fillStyle = fill || \"rgba(255,248,223,.34)\";\n    ctx.beginPath();\n    ctx.arc(-34, 8, 24, 0, Math.PI * 2);\n    ctx.arc(-10, -6, 31, 0, Math.PI * 2);\n    ctx.arc(24, 3, 27, 0, Math.PI * 2);\n    ctx.arc(48, 13, 19, 0, Math.PI * 2);\n    ctx.closePath();\n    ctx.fill();\n    ctx.restore();\n  }\n\n  function drawBubble(x, y, r, color) {\n    ctx.save();\n    ctx.strokeStyle = color || \"#FFF8DF\";\n    ctx.lineWidth = Math.max(.8, r * .16);\n    ctx.globalAlpha *= .86;\n    ctx.beginPath();\n    ctx.arc(x, y, r, 0, Math.PI * 2);\n    ctx.stroke();\n    ctx.globalAlpha *= .70;\n    ctx.fillStyle = \"rgba(255,248,223,.18)\";\n    ctx.beginPath();\n    ctx.arc(x - r * .28, y - r * .30, Math.max(1, r * .20), 0, Math.PI * 2);\n    ctx.fill();\n    ctx.restore();\n  }\n\n  function drawFoamStar(x, y, r, color, rot) {\n    ctx.save();\n    ctx.translate(x, y);\n    ctx.rotate(rot || 0);\n    ctx.strokeStyle = color || \"#FFF8DF\";\n    ctx.lineWidth = 1.05;\n    ctx.lineCap = \"round\";\n    ctx.beginPath();\n    ctx.moveTo(-r, 0);\n    ctx.lineTo(r, 0);\n    ctx.moveTo(0, -r);\n    ctx.lineTo(0, r);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  function drawClothesline(x1, y1, x2, sag) {\n    ctx.save();\n    ctx.globalAlpha = .28;\n    ctx.strokeStyle = \"#5A321F\";\n    ctx.lineWidth = 1.5;\n    ctx.beginPath();\n    ctx.moveTo(x1, y1);\n    ctx.quadraticCurveTo((x1 + x2) \/ 2, y1 + sag, x2, y1 + 10);\n    ctx.stroke();\n    drawMiniLaundry(76, 115, \"shirt\", \"#F4C542\");\n    drawMiniLaundry(128, 124, \"towel\", \"#D9953F\");\n    drawMiniLaundry(212, 122, \"sock\", \"#D2A24A\");\n    drawMiniLaundry(276, 114, \"towel\", \"#C69032\");\n    ctx.restore();\n  }\n\n  function drawMiniLaundry(x, y, kind, color) {\n    ctx.save();\n    ctx.fillStyle = color;\n    ctx.strokeStyle = \"rgba(90,50,31,.42)\";\n    ctx.lineWidth = 1;\n    ctx.fillRect(x - 3, y - 8, 6, 4);\n    if (kind === \"shirt\") {\n      ctx.beginPath();\n      ctx.moveTo(x - 12, y - 2);\n      ctx.lineTo(x - 5, y - 8);\n      ctx.lineTo(x + 5, y - 8);\n      ctx.lineTo(x + 12, y - 2);\n      ctx.lineTo(x + 7, y + 3);\n      ctx.lineTo(x + 6, y + 16);\n      ctx.lineTo(x - 6, y + 16);\n      ctx.lineTo(x - 7, y + 3);\n      ctx.closePath();\n      ctx.fill(); ctx.stroke();\n    } else if (kind === \"sock\") {\n      ctx.beginPath();\n      ctx.moveTo(x - 5, y - 7);\n      ctx.lineTo(x + 5, y - 7);\n      ctx.lineTo(x + 4, y + 9);\n      ctx.quadraticCurveTo(x + 11, y + 11, x + 10, y + 17);\n      ctx.quadraticCurveTo(x + 2, y + 20, x - 6, y + 14);\n      ctx.closePath();\n      ctx.fill(); ctx.stroke();\n    } else {\n      roundedRect(x - 11, y - 6, 22, 24, 4, color, \"rgba(90,50,31,.34)\", 1);\n      ctx.strokeStyle = \"rgba(255,248,223,.62)\";\n      ctx.beginPath();\n      ctx.moveTo(x - 8, y + 3);\n      ctx.lineTo(x + 8, y + 3);\n      ctx.moveTo(x - 8, y + 10);\n      ctx.lineTo(x + 8, y + 10);\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  function drawLaundryBottleSilhouette(x, y, scale) {\n    ctx.save();\n    ctx.translate(x, y);\n    ctx.scale(scale, scale);\n    ctx.globalAlpha = .23;\n    roundedRect(-38, -34, 54, 68, 14, \"rgba(255,248,223,.66)\", \"rgba(90,50,31,.38)\", 1.4);\n    roundedRect(-26, -50, 24, 18, 6, \"rgba(244,197,66,.54)\", \"rgba(90,50,31,.26)\", 1);\n    ctx.fillStyle = \"rgba(244,197,66,.46)\";\n    ctx.beginPath();\n    ctx.arc(-11, 3, 15, 0, Math.PI * 2);\n    ctx.fill();\n    ctx.restore();\n  }\n  function drawWindowArch(x, y, w, h) {\n    ctx.save();\n    ctx.globalAlpha = .22;\n    ctx.strokeStyle = \"#8B674A\";\n    ctx.fillStyle = \"rgba(255,248,234,.22)\";\n    ctx.lineWidth = 2;\n    roundedRect(x, y + 8, w, h, 22, \"rgba(255,248,234,.14)\", \"rgba(111,65,40,.32)\", 1.4);\n    ctx.beginPath();\n    ctx.moveTo(x + w \/ 2, y + 12);\n    ctx.lineTo(x + w \/ 2, y + h + 4);\n    ctx.moveTo(x + 10, y + 72);\n    ctx.lineTo(x + w - 10, y + 72);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  function drawShelf(x, y, w, h) {\n    ctx.save();\n    ctx.globalAlpha = .26;\n    roundedRect(x, y, w, h, 4, \"rgba(111,65,40,.55)\", \"rgba(255,248,234,.32)\", 1);\n    ctx.fillStyle = \"rgba(95,109,78,.36)\";\n    ctx.strokeStyle = \"rgba(255,248,234,.28)\";\n    ctx.lineWidth = 1;\n    for (var i = 0; i < 4; i++) {\n      var cx = x + 12 + i * 20;\n      roundedRect(cx - 4, y - 16 - (i % 2) * 3, 8, 16 + (i % 2) * 3, 4, \"rgba(255,248,234,.36)\", \"rgba(111,65,40,.18)\", .8);\n      ctx.beginPath();\n      ctx.arc(cx, y - 18 - (i % 2) * 3, 5, 0, Math.PI * 2);\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  function drawHangingLamp(x, y) {\n    ctx.save();\n    ctx.globalAlpha = .26;\n    ctx.strokeStyle = \"#8B674A\";\n    ctx.lineWidth = 1;\n    ctx.beginPath();\n    ctx.moveTo(x, y);\n    ctx.lineTo(x, y + 50);\n    ctx.stroke();\n    var lamp = ctx.createRadialGradient(x, y + 60, 2, x, y + 60, 38);\n    lamp.addColorStop(0, \"rgba(255,248,234,.58)\");\n    lamp.addColorStop(1, \"rgba(255,248,234,0)\");\n    ctx.fillStyle = lamp;\n    ctx.beginPath();\n    ctx.arc(x, y + 60, 38, 0, Math.PI * 2);\n    ctx.fill();\n    ctx.fillStyle = \"rgba(232,183,200,.45)\";\n    ctx.beginPath();\n    ctx.ellipse(x, y + 55, 16, 9, 0, 0, Math.PI * 2);\n    ctx.fill();\n    ctx.restore();\n  }\n\n  function drawTeapotSilhouette(x, y, scale) {\n    ctx.save();\n    ctx.translate(x, y);\n    ctx.scale(scale, scale);\n    ctx.globalAlpha = .20;\n    ctx.fillStyle = \"#FFF8EA\";\n    roundedRect(-42, -18, 84, 38, 11, \"rgba(255,248,234,.42)\", \"rgba(111,65,40,.26)\", 1);\n    ctx.fillStyle = \"rgba(154,90,116,.34)\";\n    roundedRect(-34, -10, 22, 20, 6, \"rgba(154,90,116,.34)\", \"transparent\", 0);\n    roundedRect(-8, -10, 22, 20, 6, \"rgba(143,175,122,.34)\", \"transparent\", 0);\n    roundedRect(18, -10, 22, 20, 6, \"rgba(227,188,98,.36)\", \"transparent\", 0);\n    ctx.strokeStyle = \"rgba(90,50,31,.38)\";\n    ctx.lineWidth = 4;\n    ctx.beginPath();\n    ctx.moveTo(-46, -24);\n    ctx.lineTo(42, -24);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  function drawSoftBubblePetal(x, y, r, rot, color) {\n    ctx.save();\n    ctx.translate(x, y);\n    ctx.rotate(rot || 0);\n    ctx.fillStyle = color || \"#E8B7C8\";\n    ctx.beginPath();\n    ctx.moveTo(0, -r);\n    ctx.bezierCurveTo(r * .78, -r * .38, r * .62, r * .72, 0, r);\n    ctx.bezierCurveTo(-r * .62, r * .72, -r * .78, -r * .38, 0, -r);\n    ctx.fill();\n    ctx.restore();\n  }\n\n  function drawPanels() {\n    var labels = [[\"Score\", score], [\"Best\", best], [\"Level\", level], [\"Lines\", lines]];\n    var panelW = 64;\n    var gap = 6;\n    var startX = 8;\n    var y = 44;\n\n    for (var i = 0; i < labels.length; i++) {\n      var x = startX + i * (panelW + gap);\n      drawPanelBox(x, y, panelW, 34);\n      ctx.fillStyle = \"rgba(90,50,31,.72)\";\n      ctx.font = \"800 8px system-ui, -apple-system, Segoe UI, sans-serif\";\n      ctx.textAlign = \"center\";\n      ctx.textBaseline = \"middle\";\n      ctx.fillText(labels[i][0], x + panelW \/ 2, y + 10);\n      ctx.fillStyle = \"#3F2418\";\n      ctx.font = \"950 13px system-ui, -apple-system, Segoe UI, sans-serif\";\n      ctx.fillText(shortNumber(labels[i][1]), x + panelW \/ 2, y + 24);\n    }\n\n    var nextX = startX + 4 * (panelW + gap);\n    drawPanelBox(nextX, y, panelW, 34);\n    ctx.fillStyle = \"rgba(90,50,31,.72)\";\n    ctx.font = \"800 8px system-ui, -apple-system, Segoe UI, sans-serif\";\n    ctx.textAlign = \"center\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillText(\"Next\", nextX + panelW \/ 2, y + 9);\n    drawNextMini(nextX + panelW \/ 2, y + 23, nextPreview);\n  }\n\n  function drawPanelBox(x, y, w, h) {\n    roundedRect(x, y, w, h, 13, \"rgba(255,248,223,.76)\", \"rgba(90,50,31,.26)\", 1);\n    ctx.save();\n    ctx.globalAlpha = .48;\n    roundedRect(x + 2, y + 2, w - 4, 8, 6, \"rgba(255,248,223,.52)\", \"transparent\", 0);\n    ctx.globalAlpha = .16;\n    ctx.strokeStyle = \"#C69032\";\n    ctx.lineWidth = 1;\n    ctx.beginPath();\n    ctx.moveTo(x + 8, y + h - 6);\n    ctx.quadraticCurveTo(x + w \/ 2, y + h - 2, x + w - 8, y + h - 6);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  function drawNextMini(cx, cy, piece) {\n    if (!piece) return;\n    var matrix = piece.matrix;\n    var mini = 5.4;\n    var mw = matrix[0].length * mini;\n    var mh = matrix.length * mini;\n    var ox = cx - mw \/ 2;\n    var oy = cy - mh \/ 2 + 1;\n\n    ctx.save();\n    ctx.shadowColor = piece.color;\n    ctx.shadowBlur = 4;\n    for (var y = 0; y < matrix.length; y++) {\n      for (var x = 0; x < matrix[y].length; x++) {\n        if (!matrix[y][x]) continue;\n        roundedRect(ox + x * mini, oy + y * mini, mini - .8, mini - .8, 1.8, piece.color, piece.edge, .8);\n      }\n    }\n    ctx.restore();\n  }\n\n  function shortNumber(n) {\n    if (n >= 1000000) return Math.floor(n \/ 100000) \/ 10 + \"m\";\n    if (n >= 10000) return Math.floor(n \/ 1000) + \"k\";\n    return String(n);\n  }\n\n  function drawBoardFrame() {\n    ctx.save();\n\n    var shelfShadow = ctx.createRadialGradient(BOARD_X + BOARD_W \/ 2, BOARD_Y + BOARD_H + 18, 8, BOARD_X + BOARD_W \/ 2, BOARD_Y + BOARD_H + 18, 172);\n    shelfShadow.addColorStop(0, \"rgba(63,36,24,.34)\");\n    shelfShadow.addColorStop(.46, \"rgba(244,197,66,.15)\");\n    shelfShadow.addColorStop(1, \"rgba(255,241,201,0)\");\n    ctx.fillStyle = shelfShadow;\n    ctx.beginPath();\n    ctx.ellipse(BOARD_X + BOARD_W \/ 2, BOARD_Y + BOARD_H + 18, BOARD_W * .62, 34, 0, 0, Math.PI * 2);\n    ctx.fill();\n\n    ctx.shadowColor = \"rgba(63,36,24,.42)\";\n    ctx.shadowBlur = 18;\n    ctx.shadowOffsetY = 8;\n    roundedRect(BOARD_X - 12, BOARD_Y - 12, BOARD_W + 24, BOARD_H + 24, 23, \"rgba(90,50,31,.62)\", \"rgba(255,241,201,.54)\", 1.4);\n\n    ctx.shadowBlur = 0;\n    ctx.shadowOffsetY = 0;\n    var inner = ctx.createLinearGradient(BOARD_X, BOARD_Y - 7, BOARD_X, BOARD_Y + BOARD_H + 7);\n    inner.addColorStop(0, \"rgba(255,241,201,.30)\");\n    inner.addColorStop(.52, \"rgba(184,115,51,.18)\");\n    inner.addColorStop(1, \"rgba(63,36,24,.28)\");\n    roundedRect(BOARD_X - 7, BOARD_Y - 7, BOARD_W + 14, BOARD_H + 14, 18, inner, \"rgba(244,197,66,.38)\", 1.5);\n\n    ctx.globalAlpha = .44;\n    roundedRect(BOARD_X - 4, BOARD_Y - 4, BOARD_W + 8, 12, 12, \"rgba(255,241,201,.28)\", \"transparent\", 0);\n\n    ctx.globalAlpha = .38;\n    ctx.strokeStyle = \"rgba(244,197,66,.78)\";\n    ctx.lineWidth = 1;\n    ctx.beginPath();\n    ctx.moveTo(BOARD_X + 12, BOARD_Y - 2);\n    ctx.quadraticCurveTo(BOARD_X + BOARD_W \/ 2, BOARD_Y + 7, BOARD_X + BOARD_W - 12, BOARD_Y - 2);\n    ctx.stroke();\n\n    ctx.restore();\n  }\n\n  function drawBoard() {\n    ctx.save();\n    roundedRect(BOARD_X, BOARD_Y, BOARD_W, BOARD_H, 16, \"rgba(63,36,24,.42)\", \"rgba(255,248,223,.28)\", 1);\n    ctx.clip();\n\n    for (var y = 0; y < ROWS; y++) {\n      for (var x = 0; x < COLS; x++) {\n        var px = BOARD_X + x * CELL;\n        var py = BOARD_Y + y * CELL;\n        ctx.fillStyle = ((x + y) % 2 === 0) ? \"rgba(255,248,223,.090)\" : \"rgba(244,197,66,.050)\";\n        ctx.fillRect(px, py, CELL, CELL);\n        ctx.strokeStyle = \"rgba(255,248,223,.105)\";\n        ctx.lineWidth = 1;\n        ctx.strokeRect(px + .5, py + .5, CELL - 1, CELL - 1);\n        if (board[y][x]) drawBlock(px + 2, py + 2, CELL - 4, board[y][x], 1);\n      }\n    }\n    ctx.restore();\n  }\n\n  function drawGhost() {\n    if (!canPlay()) return;\n    var gy = ghostY();\n    if (gy === current.y) return;\n\n    ctx.save();\n    ctx.globalAlpha = .38;\n    ctx.setLineDash([4, 4]);\n    current.matrix.forEach(function (row, y) {\n      row.forEach(function (value, x) {\n        if (!value) return;\n        var bx = current.x + x;\n        var by = gy + y;\n        if (by < 0) return;\n        var px = BOARD_X + bx * CELL + 4;\n        var py = BOARD_Y + by * CELL + 4;\n        roundedRect(px, py, CELL - 8, CELL - 8, 6, \"rgba(255,248,234,.045)\", \"rgba(255,248,234,.54)\", 1.5);\n      });\n    });\n    ctx.setLineDash([]);\n    ctx.restore();\n  }\n\n  function drawPiece() {\n    if (!current) return;\n    current.matrix.forEach(function (row, y) {\n      row.forEach(function (value, x) {\n        if (!value) return;\n        var bx = current.x + x;\n        var by = current.y + y;\n        if (by < 0) return;\n        drawBlock(BOARD_X + bx * CELL + 2, BOARD_Y + by * CELL + 2, CELL - 4, current, 1);\n      });\n    });\n  }\n\n  function drawBlock(x, y, size, block, alpha) {\n    ctx.save();\n    ctx.globalAlpha = alpha == null ? 1 : alpha;\n    var g = ctx.createLinearGradient(x, y, x, y + size);\n    g.addColorStop(0, lighten(block.color, .32));\n    g.addColorStop(.45, block.color);\n    g.addColorStop(1, darken(block.color, .12));\n    ctx.shadowColor = block.color;\n    ctx.shadowBlur = 5;\n    roundedRect(x, y, size, size, 7, g, block.edge, 1.15);\n\n    ctx.shadowBlur = 0;\n    ctx.save();\n    ctx.globalAlpha = .40;\n    ctx.beginPath();\n    ctx.moveTo(x + size * .16, y + size * .18);\n    ctx.bezierCurveTo(x + size * .34, y + size * .06, x + size * .62, y + size * .08, x + size * .78, y + size * .16);\n    ctx.lineTo(x + size * .56, y + size * .31);\n    ctx.bezierCurveTo(x + size * .42, y + size * .22, x + size * .26, y + size * .25, x + size * .16, y + size * .18);\n    ctx.closePath();\n    ctx.fillStyle = \"#ffffff\";\n    ctx.fill();\n    ctx.restore();\n\n    ctx.save();\n    ctx.globalAlpha = .18;\n    ctx.strokeStyle = \"#ffffff\";\n    ctx.lineWidth = 1;\n    ctx.beginPath();\n    ctx.moveTo(x + size * .18, y + size * .76);\n    ctx.quadraticCurveTo(x + size * .50, y + size * .34, x + size * .82, y + size * .76);\n    ctx.stroke();\n    ctx.restore();\n\n    drawBlockIcon(x + size \/ 2, y + size \/ 2, size, block.icon);\n    ctx.restore();\n  }\n\n  function drawBlockIcon(cx, cy, size, icon) {\n    ctx.save();\n    ctx.strokeStyle = \"rgba(255,248,223,.86)\";\n    ctx.fillStyle = \"rgba(255,248,223,.62)\";\n    ctx.lineWidth = 1.35;\n    ctx.lineCap = \"round\";\n    ctx.lineJoin = \"round\";\n\n    if (icon === \"book\") {\n      roundedRect(cx - size * .17, cy - size * .20, size * .34, size * .40, 4, \"rgba(255,241,201,.50)\", \"rgba(255,248,223,.78)\", 1.2);\n      ctx.beginPath();\n      ctx.moveTo(cx - size * .05, cy - size * .17);\n      ctx.lineTo(cx - size * .05, cy + size * .17);\n      ctx.moveTo(cx - size * .11, cy - size * .05);\n      ctx.lineTo(cx + size * .10, cy - size * .05);\n      ctx.moveTo(cx - size * .11, cy + size * .06);\n      ctx.lineTo(cx + size * .10, cy + size * .06);\n      ctx.stroke();\n    } else if (icon === \"bookmark\") {\n      ctx.beginPath();\n      ctx.moveTo(cx - size * .12, cy - size * .21);\n      ctx.lineTo(cx + size * .12, cy - size * .21);\n      ctx.lineTo(cx + size * .12, cy + size * .22);\n      ctx.lineTo(cx, cy + size * .10);\n      ctx.lineTo(cx - size * .12, cy + size * .22);\n      ctx.closePath();\n      ctx.fill();\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.moveTo(cx - size * .06, cy - size * .07);\n      ctx.lineTo(cx + size * .06, cy - size * .07);\n      ctx.stroke();\n    } else if (icon === \"lamp\") {\n      ctx.beginPath();\n      ctx.moveTo(cx - size * .18, cy - size * .02);\n      ctx.lineTo(cx + size * .18, cy - size * .02);\n      ctx.lineTo(cx + size * .11, cy + size * .11);\n      ctx.lineTo(cx - size * .11, cy + size * .11);\n      ctx.closePath();\n      ctx.fill();\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.moveTo(cx, cy + size * .11);\n      ctx.lineTo(cx, cy + size * .23);\n      ctx.moveTo(cx - size * .12, cy + size * .23);\n      ctx.lineTo(cx + size * .12, cy + size * .23);\n      ctx.stroke();\n    } else if (icon === \"teacup\") {\n      ctx.beginPath();\n      ctx.moveTo(cx - size * .18, cy - size * .04);\n      ctx.quadraticCurveTo(cx - size * .15, cy + size * .16, cx + size * .12, cy + size * .14);\n      ctx.quadraticCurveTo(cx + size * .18, cy + size * .07, cx + size * .18, cy - size * .04);\n      ctx.closePath();\n      ctx.fill();\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.arc(cx + size * .19, cy + size * .03, size * .07, -Math.PI \/ 2, Math.PI \/ 2);\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.moveTo(cx - size * .10, cy - size * .16);\n      ctx.quadraticCurveTo(cx - size * .03, cy - size * .25, cx + size * .02, cy - size * .15);\n      ctx.moveTo(cx + size * .06, cy - size * .16);\n      ctx.quadraticCurveTo(cx + size * .13, cy - size * .25, cx + size * .17, cy - size * .15);\n      ctx.stroke();\n    } else if (icon === \"glasses\") {\n      ctx.beginPath();\n      ctx.arc(cx - size * .10, cy + size * .02, size * .085, 0, Math.PI * 2);\n      ctx.arc(cx + size * .10, cy + size * .02, size * .085, 0, Math.PI * 2);\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.moveTo(cx - size * .015, cy + size * .02);\n      ctx.lineTo(cx + size * .015, cy + size * .02);\n      ctx.moveTo(cx - size * .18, cy - size * .01);\n      ctx.lineTo(cx - size * .25, cy - size * .08);\n      ctx.moveTo(cx + size * .18, cy - size * .01);\n      ctx.lineTo(cx + size * .25, cy - size * .08);\n      ctx.stroke();\n    } else if (icon === \"honeyjar\") {\n      roundedRect(cx - size * .14, cy - size * .13, size * .28, size * .30, 5, \"rgba(255,248,223,.48)\", \"rgba(255,248,223,.78)\", 1.1);\n      roundedRect(cx - size * .09, cy - size * .21, size * .18, size * .07, 2, \"rgba(90,50,31,.40)\", \"rgba(255,248,223,.54)\", .8);\n      ctx.fillStyle = \"rgba(244,197,66,.60)\";\n      roundedRect(cx - size * .10, cy - size * .02, size * .20, size * .12, 4, \"rgba(244,197,66,.60)\", \"transparent\", 0);\n      ctx.beginPath();\n      ctx.arc(cx - size * .04, cy - size * .05, size * .015, 0, Math.PI * 2);\n      ctx.arc(cx + size * .05, cy + size * .08, size * .015, 0, Math.PI * 2);\n      ctx.fillStyle = \"rgba(255,248,223,.55)\";\n      ctx.fill();\n    } else if (icon === \"honeycomb\") {\n      function hex(cx2, cy2, r) {\n        ctx.beginPath();\n        for (var i = 0; i < 6; i++) {\n          var a = Math.PI \/ 6 + i * Math.PI \/ 3;\n          var x = cx2 + Math.cos(a) * r;\n          var y = cy2 + Math.sin(a) * r;\n          if (i === 0) ctx.moveTo(x, y); else ctx.lineTo(x, y);\n        }\n        ctx.closePath();\n        ctx.stroke();\n      }\n      hex(cx, cy, size * .10);\n      hex(cx - size * .12, cy, size * .09);\n      hex(cx + size * .12, cy, size * .09);\n      hex(cx - size * .06, cy - size * .11, size * .085);\n      hex(cx + size * .06, cy + size * .11, size * .085);\n    }\n    ctx.restore();\n  }\n\n  function drawImpactGlows() {\n    ctx.save();\n    for (var i = 0; i < impactGlows.length; i++) {\n      var g = impactGlows[i];\n      var t = g.age \/ g.life;\n      var alpha = 1 - t;\n      ctx.globalAlpha = alpha * .42;\n      var grad = ctx.createRadialGradient(g.x, g.y, 2, g.x, g.y, 44 + t * 26);\n      grad.addColorStop(0, \"rgba(255,248,223,.72)\");\n      grad.addColorStop(.38, g.color);\n      grad.addColorStop(1, \"rgba(255,248,223,0)\");\n      ctx.fillStyle = grad;\n      ctx.beginPath();\n      ctx.ellipse(g.x, g.y, 35 + t * 26, 8 + t * 9, 0, 0, Math.PI * 2);\n      ctx.fill();\n    }\n    ctx.restore();\n  }\n\n  function drawClearWaves() {\n    ctx.save();\n    for (var i = 0; i < clearWaves.length; i++) {\n      var w = clearWaves[i];\n      var t = w.age \/ w.life;\n      var alpha = 1 - t;\n      var width = BOARD_W * (.42 + t * .76);\n      var x = BOARD_X + BOARD_W \/ 2 - width \/ 2;\n      var y = w.y;\n      var grad = ctx.createLinearGradient(x, y, x + width, y);\n      grad.addColorStop(0, \"rgba(255,248,223,0)\");\n      grad.addColorStop(.25, \"rgba(244,197,66,\" + (.34 * alpha) + \")\");\n      grad.addColorStop(.50, \"rgba(255,248,223,\" + (.74 * alpha) + \")\");\n      grad.addColorStop(.72, \"rgba(244,197,66,\" + (.34 * alpha) + \")\");\n      grad.addColorStop(1, \"rgba(255,248,223,0)\");\n\n      ctx.globalAlpha = alpha;\n      ctx.strokeStyle = grad;\n      ctx.lineWidth = 4 + t * 4;\n      ctx.lineCap = \"round\";\n      ctx.beginPath();\n      ctx.moveTo(x, y);\n      ctx.quadraticCurveTo(BOARD_X + BOARD_W \/ 2, y - 4 * Math.sin(t * Math.PI), x + width, y);\n      ctx.stroke();\n\n      ctx.globalAlpha = alpha * .78;\n      for (var d = 0; d < 6; d++) {\n        var px = x + width * (d + .5) \/ 6;\n        var pulse = Math.sin((t + d * .08) * Math.PI);\n        var s = 2.4 + pulse * 2.4;\n        drawBubble(px, y + Math.sin(d) * 2, s, d % 2 ? \"#FFF8DF\" : \"#C69032\");\n      }\n    }\n    ctx.restore();\n  }\n\n  function drawParticles() {\n    ctx.save();\n    for (var i = 0; i < particles.length; i++) {\n      var p = particles[i];\n      var t = p.age \/ p.life;\n      var lifeLeft = 1 - t;\n      ctx.globalAlpha = Math.max(0, lifeLeft);\n\n      if (p.type === \"bubble\") {\n        drawBubble(p.x, p.y, p.r * (.75 + t * .42), p.color);\n      } else if (p.type === \"spark\") {\n        var starSize = p.r * (.55 + lifeLeft * .80);\n        ctx.save();\n        ctx.translate(p.x, p.y);\n        ctx.rotate((p.rot || 0) + t * 1.2);\n        ctx.strokeStyle = p.color;\n        ctx.lineWidth = 1.20;\n        ctx.lineCap = \"round\";\n        ctx.beginPath();\n        ctx.moveTo(-starSize, 0);\n        ctx.lineTo(starSize, 0);\n        ctx.moveTo(0, -starSize);\n        ctx.lineTo(0, starSize);\n        ctx.stroke();\n        ctx.restore();\n      } else if (p.type === \"mist\") {\n        var mistSize = p.r * (.65 + t * 1.25);\n        ctx.save();\n        ctx.translate(p.x, p.y);\n        ctx.rotate(Math.sin(t * Math.PI * 2 + p.rot) * .18);\n        ctx.strokeStyle = p.color;\n        ctx.lineWidth = 1.05;\n        ctx.beginPath();\n        ctx.moveTo(0, mistSize * .65);\n        ctx.quadraticCurveTo(-mistSize * .65, 0, 0, -mistSize * .65);\n        ctx.quadraticCurveTo(mistSize * .52, -mistSize, mistSize * .18, -mistSize * 1.28);\n        ctx.stroke();\n        ctx.restore();\n      } else {\n        ctx.fillStyle = p.color;\n        ctx.beginPath();\n        ctx.arc(p.x, p.y, p.r * lifeLeft, 0, Math.PI * 2);\n        ctx.fill();\n      }\n    }\n    ctx.restore();\n  }\n\n  function roundedRect(x, y, w, h, r, fill, stroke, lineWidth) {\n    ctx.beginPath();\n    ctx.moveTo(x + r, y);\n    ctx.lineTo(x + w - r, y);\n    ctx.quadraticCurveTo(x + w, y, x + w, y + r);\n    ctx.lineTo(x + w, y + h - r);\n    ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n    ctx.lineTo(x + r, y + h);\n    ctx.quadraticCurveTo(x, y + h, x, y + h - r);\n    ctx.lineTo(x, y + r);\n    ctx.quadraticCurveTo(x, y, x + r, y);\n    ctx.closePath();\n    if (fill ? fill !== \"transparent\" : false) { ctx.fillStyle = fill; ctx.fill(); }\n    if (stroke ? (stroke !== \"transparent\" ? lineWidth : false) : false) {\n      ctx.strokeStyle = stroke;\n      ctx.lineWidth = lineWidth;\n      ctx.stroke();\n    }\n  }\n\n  function hexToRgb(hex) {\n    var clean = hex.replace(\"#\", \"\");\n    if (clean.length === 3) clean = clean.split(\"\").map(function (c) { return c + c; }).join(\"\");\n    var num = parseInt(clean, 16);\n    return { r: (num >> 16) % 256, g: (num >> 8) % 256, b: num % 256 };\n  }\n\n  function rgbToHex(r, g, b) {\n    function h(n) { var s = Math.max(0, Math.min(255, Math.round(n))).toString(16); return s.length === 1 ? \"0\" + s : s; }\n    return \"#\" + h(r) + h(g) + h(b);\n  }\n\n  function lighten(hex, amount) {\n    var c = hexToRgb(hex);\n    return rgbToHex(c.r + (255 - c.r) * amount, c.g + (255 - c.g) * amount, c.b + (255 - c.b) * amount);\n  }\n\n  function darken(hex, amount) {\n    var c = hexToRgb(hex);\n    return rgbToHex(c.r * (1 - amount), c.g * (1 - amount), c.b * (1 - amount));\n  }\n\n  function bindTap(btn, fn) {\n    btn.addEventListener(\"pointerdown\", function (e) {\n      e.preventDefault();\n      unlockAudio();\n      fn();\n    }, { passive: false });\n  }\n\n  function bindHold(btn, key, fn, firstDelay, repeatDelay) {\n    function clear() {\n      if (!holds[key]) return;\n      clearTimeout(holds[key].timeout);\n      clearInterval(holds[key].interval);\n      holds[key] = null;\n    }\n\n    btn.addEventListener(\"pointerdown\", function (e) {\n      e.preventDefault();\n      unlockAudio();\n      clear();\n      fn();\n      holds[key] = {\n        timeout: setTimeout(function () {\n          holds[key].interval = setInterval(fn, repeatDelay);\n        }, firstDelay),\n        interval: null\n      };\n      try { btn.setPointerCapture(e.pointerId); } catch (err) {}\n    }, { passive: false });\n\n    btn.addEventListener(\"pointerup\", clear);\n    btn.addEventListener(\"pointerleave\", clear);\n    btn.addEventListener(\"pointercancel\", clear);\n  }\n\n  var gameVisible = true;\n  if (\"IntersectionObserver\" in window) {\n    var gameObserver = new IntersectionObserver(function (entries) {\n      gameVisible = entries[0] ? entries[0].isIntersecting : true;\n    }, { threshold: 0.01 });\n    gameObserver.observe(root);\n  }\n\n  function loop(time) {\n    var dt = Math.min(42, time - (lastTime || time));\n    lastTime = time;\n    if (document.hidden || !gameVisible) {\n      requestAnimationFrame(loop);\n      return;\n    }\n\n    if (canPlay()) {\n      dropTimer += dt;\n      if (dropTimer >= fallDelay()) {\n        stepDown();\n        dropTimer = 0;\n      }\n    }\n\n    updateParticles();\n    draw();\n    requestAnimationFrame(loop);\n  }\n\n  canvas.addEventListener(\"pointerdown\", function (e) {\n    if (!canPlay()) return;\n    unlockAudio();\n    e.preventDefault();\n    pointerStart = { x: e.clientX, y: e.clientY, id: e.pointerId };\n    try { canvas.setPointerCapture(e.pointerId); } catch (err) {}\n  }, { passive: false });\n\n  canvas.addEventListener(\"pointerup\", function (e) {\n    if (!pointerStart || !canPlay()) return;\n    e.preventDefault();\n    var dx = e.clientX - pointerStart.x;\n    var dy = e.clientY - pointerStart.y;\n    var adx = Math.abs(dx);\n    var ady = Math.abs(dy);\n    pointerStart = null;\n\n    if (adx < 12 ? ady < 12 : false) {\n      rotatePiece();\n      return;\n    }\n\n    if (adx > ady ? adx > 20 : false) {\n      var steps = Math.min(4, Math.max(1, Math.round(adx \/ 34)));\n      var dir = dx > 0 ? 1 : -1;\n      for (var i = 0; i < steps; i++) if (!move(dir)) break;\n      return;\n    }\n\n    if (ady > adx ? ady > 22 : false) {\n      if (dy > 0) softDrop(Math.min(6, Math.max(1, Math.round(ady \/ 32))));\n      else hardDrop();\n    }\n  }, { passive: false });\n\n  canvas.addEventListener(\"pointercancel\", function () { pointerStart = null; });\n\n  root.tabIndex = 0;\n  root.addEventListener(\"pointerdown\", function () {\n    var active = document.activeElement;\n    if (active === root) return;\n    if (active ? root.contains(active) : false) return;\n    try { root.focus({ preventScroll: true }); } catch (error) { root.focus(); }\n  });\n  document.addEventListener(\"pointerdown\", function (event) {\n    if (root.contains(event.target)) return;\n    var active = document.activeElement;\n    if (active ? root.contains(active) : false) {\n      try { active.blur(); } catch (error) {}\n    }\n  });\n\n  document.addEventListener(\"keydown\", function (e) {\n    var active = document.activeElement;\n    if (active !== root ? !(active ? root.contains(active) : false) : false) return;\n    var tag = ((e.target ? e.target.tagName : \"\") || \"\").toLowerCase();\n    if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return;\n\n    if (e.key === \"p\" || e.key === \"P\") {\n      e.preventDefault();\n      togglePause();\n      return;\n    }\n\n    if (!canPlay()) return;\n    if (e.key === \"ArrowLeft\") {\n      e.preventDefault();\n      move(-1);\n    } else if (e.key === \"ArrowRight\") {\n      e.preventDefault();\n      move(1);\n    } else if (e.key === \"ArrowUp\") {\n      e.preventDefault();\n      rotatePiece();\n    } else if (e.key === \"ArrowDown\") {\n      e.preventDefault();\n      softDrop(1);\n    } else if (e.key === \" \") {\n      e.preventDefault();\n      hardDrop();\n    }\n  });\n\n  function runMainButtonAction() {\n    unlockAudio();\n    if (overlayMode === \"resume\") {\n      paused = false;\n      pauseBtn.classList.remove(\"is-paused\");\n      hideOverlay();\n      sound(\"resume\");\n    } else {\n      resetGame();\n      sound(\"start\");\n    }\n  }\n\n  function runSubButtonAction() {\n    unlockAudio();\n    resetGame();\n    sound(\"start\");\n  }\n\n  function bindUiButton(btn, fn) {\n    var lastRun = 0;\n    function run(e) {\n      if (e ? e.cancelable : false) e.preventDefault();\n      var now = Date.now();\n      if (now - lastRun < 160) return;\n      lastRun = now;\n      fn();\n    }\n    btn.addEventListener(\"pointerdown\", run, { passive: false });\n    btn.addEventListener(\"click\", run);\n  }\n\n  bindUiButton(mainBtn, runMainButtonAction);\n  bindUiButton(subBtn, runSubButtonAction);\n\n  bindUiButton(pauseBtn, function () {\n    unlockAudio();\n    togglePause();\n  });\n\n  bindUiButton(soundBtn, function () {\n    muted = !muted;\n    soundBtn.classList.toggle(\"is-muted\", muted);\n    storageSet(STORAGE_MUTE, muted ? \"1\" : \"0\");\n    if (!muted) {\n      unlockAudio();\n      sound(\"resume\");\n    }\n  });\n\n  bindUiButton(fullscreenBtn, function () {\n    unlockAudio();\n    var fs = document.fullscreenElement || document.webkitFullscreenElement;\n    if (!fs) {\n      if (root.requestFullscreen) {\n        var requestResult = root.requestFullscreen();\n        if (requestResult ? typeof requestResult.catch === \"function\" : false) {\n          requestResult.catch(function () {});\n        }\n      } else if (root.webkitRequestFullscreen) root.webkitRequestFullscreen();\n    } else {\n      if (document.exitFullscreen) document.exitFullscreen();\n      else if (document.webkitExitFullscreen) document.webkitExitFullscreen();\n    }\n    setTimeout(fitStage, 120);\n  });\n\n  bindHold(leftBtn, \"left\", function () { move(-1); }, 180, 95);\n  bindHold(rightBtn, \"right\", function () { move(1); }, 180, 95);\n  bindTap(rotateBtn, function () { if (canPlay()) rotatePiece(); });\n  bindHold(downBtn, \"down\", function () { softDrop(1); }, 160, 65);\n  bindTap(hardBtn, function () { if (canPlay()) hardDrop(); });\n\n  window.addEventListener(\"resize\", function () { setTimeout(fitStage, 60); });\n  window.addEventListener(\"orientationchange\", function () { setTimeout(fitStage, 160); });\n  document.addEventListener(\"fullscreenchange\", function () { setTimeout(fitStage, 100); });\n  document.addEventListener(\"webkitfullscreenchange\", function () { setTimeout(fitStage, 100); });\n\n  board = createBoard();\n  createAmbientDust();\n  soundBtn.classList.toggle(\"is-muted\", muted);\n  fitStage();\n\n  showOverlay(\n    \"Honey Library Blocks\",\n    \"Stack warm library pieces, clear golden rows, and keep the honey shelf glowing with quiet reading magic.\",\n    \"Open the Shelf\",\n    false,\n    \"start\"\n  );\n\n  requestAnimationFrame(loop);\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initializeHoneyboundStacks, { once: true });\n  } else {\n    initializeHoneyboundStacks();\n  }\n})();\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\">Stack, Rotate, Clear, and Keep the Shelf Alive<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The gameplay is easy to understand but satisfying to master. Each falling piece must fit into the shelf without leaving too many gaps. When a row becomes completely filled, it clears away and gives you more room to continue. Clearing multiple rows brings bigger rewards and makes every smart move feel meaningful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The game also includes a next-piece preview, score tracking, best score saving, level progression, pause control, sound toggle, fullscreen mode, keyboard controls for desktop, and touch-friendly buttons for mobile. It is made for quick relaxing sessions, but it can also become surprisingly intense as the shelf fills higher and the falling speed increases.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why You Will Love Honeybound Stacks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Honeybound Stacks<\/strong> is perfect for players who enjoy classic block puzzles but want a softer, warmer, and more charming atmosphere. The honey-gold palette, library-inspired visuals, gentle sound effects, and polished controls create a peaceful puzzle experience that still keeps your mind active.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step into the honeylit reading room, follow the falling pieces, and see how long you can keep the golden shelf beautifully arranged.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Honeybound Stacks is a cozy falling-block puzzle game set inside a warm little honey library, where glowing books, amber shelves, golden bookmarks, teacups, reading lamps, and honey jars become the pieces of a quiet stacking challenge. Your goal is simple: move, rotate, and drop each falling piece into the best position, complete full rows, clear &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-51","post","type-post","status-publish","format-standard","hentry","category-casual"],"_links":{"self":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/51","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=51"}],"version-history":[{"count":0,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/51\/revisions"}],"wp:attachment":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=51"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=51"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=51"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}