{"id":68,"date":"2026-10-19T00:23:08","date_gmt":"2026-10-19T00:23:08","guid":{"rendered":"https:\/\/apk.produsenpagarbrc.com\/?p=68"},"modified":"2026-10-19T00:23:08","modified_gmt":"2026-10-19T00:23:08","slug":"honey-library-solitaire","status":"publish","type":"post","link":"https:\/\/play.produsenpagarbrc.com\/?p=68","title":{"rendered":"Honey Library Solitaire"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Honey Library Solitaire<\/strong> is a warm, storybook-inspired card game that brings the familiar comfort of solitaire into a quiet golden library filled with honey tones, soft shadows, and charming hand-crafted card symbols. Instead of feeling cold or mechanical, every move feels like arranging old cards on a wooden reading table while the room glows gently around you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The game keeps the heart of classic solitaire alive: build each foundation from Ace to King, arrange tableau cards in descending order with alternating colors, draw from the stock, and uncover hidden cards one careful move at a time. But this version adds its own cozy personality through soft visual design, library-inspired suits, relaxing sound effects, and a polished interface made for both desktop and mobile play.<\/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\/Honey-Library-Solitaire-1024x768.png\" alt=\"\" class=\"wp-image-69\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How to Play<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your goal is to move all cards into the foundation piles. Each foundation starts with an Ace and continues upward in the same suit until King. On the tableau, cards can be stacked in descending order while alternating colors. Empty tableau spaces can accept any movable card or valid stack, giving you more freedom to reorganize the board and open new possibilities.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tap or drag cards to move them. On desktop, you can play comfortably with a mouse. On mobile, the controls are designed for touch, with large buttons and a landscape-friendly layout. Double tap a card that is ready for the foundation to send it home quickly.<\/p>\n\n\n\n<style>\n#hls-solitaire{\n  --hls-card-w:96px;\n  --hls-card-h:132px;\n  width:min(100%,1120px);\n  aspect-ratio:16\/9;\n  margin:18px auto;\n  position:relative;\n  overflow:hidden;\n  border-radius:24px;\n  background:\n    radial-gradient(circle at 72% 12%, rgba(244,197,66,.34), transparent 26%),\n    radial-gradient(circle at 18% 18%, rgba(255,241,201,.16), transparent 22%),\n    radial-gradient(circle at 12% 86%, rgba(104,120,79,.18), transparent 40%),\n    linear-gradient(155deg,#2b160e 0%,#3f2418 38%,#5a321f 70%,#7a421f 100%);\n  box-shadow:0 24px 70px rgba(63,36,24,.38);\n  user-select:none;\n  -webkit-user-select:none;\n  touch-action:none;\n  overscroll-behavior:none;\n  font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;\n  color:#fff1c9;\n}\n#hls-solitaire,#hls-solitaire *{box-sizing:border-box}\n#hls-solitaire:fullscreen,#hls-solitaire.hls-is-fullscreen{\n  width:100vw!important;\n  height:100vh!important;\n  max-width:none!important;\n  margin:0!important;\n  border-radius:0!important;\n  background:#3f2418;\n}\n#hls-solitaire .hls-fit{\n  position:absolute;\n  left:0;\n  top:0;\n  width:1280px;\n  height:720px;\n  transform-origin:0 0;\n  overflow:hidden;\n  border-radius:24px;\n  background:\n    radial-gradient(circle at 72% 13%, rgba(244,197,66,.28), transparent 26%),\n    radial-gradient(circle at 17% 19%, rgba(255,241,201,.14), transparent 22%),\n    radial-gradient(circle at 86% 82%, rgba(104,120,79,.14), transparent 32%),\n    linear-gradient(155deg,#2b160e 0%,#3f2418 40%,#5a321f 72%,#7a421f 100%);\n}\n#hls-solitaire.hls-is-fullscreen .hls-fit{border-radius:0}\n#hls-solitaire .hls-fit:before{\n  content:\"\";\n  position:absolute;\n  inset:-90px;\n  background:\n    linear-gradient(90deg,transparent 0 6%,rgba(255,241,201,.05) 6.2% 6.45%,transparent 6.7% 13%,rgba(233,200,117,.05) 13.3% 13.55%,transparent 13.8% 100%),\n    linear-gradient(0deg,transparent 0 18%,rgba(255,241,201,.04) 18.3% 18.55%,transparent 18.8% 100%),\n    radial-gradient(circle at 10% 28%,rgba(255,241,201,.12) 0 2px,transparent 3px),\n    radial-gradient(circle at 22% 66%,rgba(244,197,66,.12) 0 2px,transparent 3px),\n    radial-gradient(circle at 43% 26%,rgba(255,248,223,.10) 0 2px,transparent 3px),\n    radial-gradient(circle at 70% 34%,rgba(244,197,66,.13) 0 2px,transparent 3px),\n    radial-gradient(circle at 88% 68%,rgba(233,200,117,.13) 0 3px,transparent 4px),\n    radial-gradient(ellipse at 76% 18%,rgba(244,197,66,.20),transparent 30%);\n  opacity:.9;\n  pointer-events:none;\n}\n#hls-solitaire .hls-fit:after{\n  content:\"\";\n  position:absolute;\n  inset:0;\n  background:\n    radial-gradient(circle at 50% 54%,transparent 0 58%,rgba(43,22,14,.28) 100%),\n    linear-gradient(180deg,rgba(255,241,201,.05),transparent 28%);\n  pointer-events:none;\n}\n#hls-solitaire .hls-playfield{\n  position:absolute;\n  left:154px;\n  top:84px;\n  width:972px;\n  height:554px;\n  z-index:5;\n  pointer-events:none;\n  border-radius:34px;\n  background:\n    radial-gradient(circle at 72% 18%,rgba(244,197,66,.13),transparent 34%),\n    radial-gradient(circle at 22% 32%,rgba(255,241,201,.075),transparent 38%),\n    linear-gradient(135deg,rgba(63,36,24,.42),rgba(90,50,31,.20));\n  border:1.35px solid rgba(244,197,66,.42);\n  box-shadow:\n    inset 0 0 0 1px rgba(255,241,201,.055),\n    inset 0 0 48px rgba(255,241,201,.035),\n    inset 0 -28px 56px rgba(43,22,14,.22),\n    0 20px 54px rgba(43,22,14,.20);\n}\n#hls-solitaire .hls-playfield:before{\n  content:\"\";\n  position:absolute;\n  inset:14px;\n  border-radius:26px;\n  border:1.25px solid rgba(244,197,66,.22);\n  background:\n    linear-gradient(112deg,rgba(255,241,201,.045),transparent 32%),\n    radial-gradient(circle at 52% 42%,rgba(184,115,51,.08),transparent 46%);\n}\n#hls-solitaire .hls-ornament{\n  position:absolute;\n  pointer-events:none;\n  opacity:.14;\n}\n#hls-solitaire .hls-ornament.left{\n  left:26px;\n  bottom:70px;\n  width:140px;\n  height:210px;\n  border-left:2px solid rgba(244,197,66,.28);\n  border-bottom:2px solid rgba(244,197,66,.12);\n  border-radius:0 0 0 88px;\n  transform:rotate(-8deg);\n}\n#hls-solitaire .hls-ornament.right{\n  right:28px;\n  bottom:64px;\n  width:140px;\n  height:210px;\n  border-right:2px solid rgba(244,197,66,.28);\n  border-bottom:2px solid rgba(244,197,66,.12);\n  border-radius:0 0 88px 0;\n  transform:rotate(8deg);\n}\n#hls-solitaire .hls-ornament:before,#hls-solitaire .hls-ornament:after{\n  content:\"\";\n  position:absolute;\n  width:56px;\n  height:16px;\n  border-radius:999px 999px 999px 20px;\n  background:rgba(233,200,117,.08);\n  border:1px solid rgba(255,241,201,.08);\n}\n#hls-solitaire .hls-ornament.left:before{left:16px;top:40px;transform:rotate(32deg)}\n#hls-solitaire .hls-ornament.left:after{left:-4px;top:108px;transform:rotate(-26deg)}\n#hls-solitaire .hls-ornament.right:before{right:18px;top:48px;transform:rotate(-34deg)}\n#hls-solitaire .hls-ornament.right:after{right:-2px;top:118px;transform:rotate(24deg)}\n#hls-solitaire button{\n  font:inherit;\n  -webkit-tap-highlight-color:transparent;\n}\n#hls-solitaire .hls-icon{\n  position:absolute;\n  z-index:280;\n  top:18px;\n  width:48px;\n  height:48px;\n  border:1.45px solid rgba(244,197,66,.50);\n  border-radius:17px;\n  background:\n    radial-gradient(circle at 34% 24%,rgba(255,241,201,.20),transparent 33%),\n    linear-gradient(180deg,rgba(90,50,31,.78),rgba(43,22,14,.66));\n  color:#fff1c9;\n  box-shadow:0 11px 24px rgba(43,22,14,.28),inset 0 1px 0 rgba(255,241,201,.13);\n  cursor:pointer;\n  display:grid;\n  place-items:center;\n  transition:transform .12s ease,background .12s ease,border-color .12s ease,opacity .14s ease,visibility .14s ease;\n}\n#hls-solitaire .hls-icon:hover{\n  transform:translateY(-1px);\n  background:\n    radial-gradient(circle at 34% 24%,rgba(255,241,201,.26),transparent 33%),\n    linear-gradient(180deg,rgba(122,66,31,.84),rgba(90,50,31,.72));\n  border-color:rgba(255,241,201,.45);\n}\n#hls-solitaire .hls-icon:active{transform:scale(.94)}\n#hls-solitaire .hls-pause{left:22px;display:none}\n#hls-solitaire .hls-mute{left:78px;display:none}\n#hls-solitaire.hls-game-active .hls-pause,#hls-solitaire.hls-game-active .hls-mute{display:grid}\n#hls-solitaire.hls-paused .hls-pause,#hls-solitaire.hls-paused .hls-mute{\n  opacity:0;\n  visibility:hidden;\n  pointer-events:none;\n}\n#hls-solitaire .hls-fullscreen{right:22px;display:grid}\n#hls-solitaire .hls-pause-symbol{\n  position:relative;\n  width:22px;\n  height:22px;\n  display:block;\n}\n#hls-solitaire .hls-pause-symbol:before,#hls-solitaire .hls-pause-symbol:after{\n  content:\"\";\n  position:absolute;\n  top:3px;\n  width:6px;\n  height:16px;\n  border-radius:3px;\n  background:currentColor;\n}\n#hls-solitaire .hls-pause-symbol:before{left:4px}\n#hls-solitaire .hls-pause-symbol:after{right:4px}\n#hls-solitaire .hls-sound-symbol{\n  position:relative;\n  width:31px;\n  height:28px;\n  display:block;\n  color:currentColor;\n  transform:scale(.86) translateX(-1px);\n}\n#hls-solitaire .hls-sound-box{\n  position:absolute;\n  left:1px;\n  top:10px;\n  width:8px;\n  height:9px;\n  border-radius:3px 0 0 3px;\n  background:currentColor;\n}\n#hls-solitaire .hls-sound-box:after{\n  content:\"\";\n  position:absolute;\n  left:7px;\n  top:-8px;\n  width:18px;\n  height:25px;\n  background:currentColor;\n  clip-path:polygon(0 35%,100% 0,100% 100%,0 65%);\n  border-radius:3px;\n}\n#hls-solitaire .hls-sound-wave{\n  position:absolute;\n  display:block;\n  background:transparent;\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  opacity:1;\n  transition:opacity .14s ease;\n}\n#hls-solitaire .hls-sound-wave.w1{left:19px;top:10px;width:6px;height:9px;border-width:3px}\n#hls-solitaire .hls-sound-wave.w2{left:22px;top:6px;width:11px;height:17px;border-width:3px}\n#hls-solitaire .hls-sound-wave.w3{left:25px;top:2px;width:16px;height:25px;border-width:3px;opacity:.92}\n#hls-solitaire.hls-muted .hls-sound-wave{opacity:0}\n#hls-solitaire .hls-sound-slash{\n  position:absolute;\n  left:2px;\n  top:13px;\n  width:32px;\n  height:3.5px;\n  border-radius:999px;\n  background:#c85d4f;\n  transform:rotate(45deg) scaleX(0);\n  transform-origin:center;\n  box-shadow:0 0 8px rgba(200,93,79,.32);\n  transition:transform .14s ease;\n}\n#hls-solitaire.hls-muted .hls-sound-slash{transform:rotate(45deg) scaleX(1)}\n#hls-solitaire .hls-full-symbol{\n  position:relative;\n  width:30px;\n  height:30px;\n  display:block;\n}\n#hls-solitaire .hls-full-symbol:before{\n  content:\"\";\n  position:absolute;\n  inset:2px;\n  background:\n    linear-gradient(currentColor,currentColor) left top\/12px 4px no-repeat,\n    linear-gradient(currentColor,currentColor) left top\/4px 12px no-repeat,\n    linear-gradient(currentColor,currentColor) right top\/12px 4px no-repeat,\n    linear-gradient(currentColor,currentColor) right top\/4px 12px no-repeat,\n    linear-gradient(currentColor,currentColor) left bottom\/12px 4px no-repeat,\n    linear-gradient(currentColor,currentColor) left bottom\/4px 12px no-repeat,\n    linear-gradient(currentColor,currentColor) right bottom\/12px 4px no-repeat,\n    linear-gradient(currentColor,currentColor) right bottom\/4px 12px no-repeat;\n}\n#hls-solitaire .hls-stats{\n  position:absolute;\n  top:24px;\n  left:50%;\n  transform:translateX(-50%);\n  z-index:84;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  gap:10px;\n}\n#hls-solitaire .hls-stat{\n  min-width:132px;\n  height:38px;\n  padding:0 16px;\n  border-radius:999px;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  gap:9px;\n  color:rgba(255,241,201,.84);\n  font-size:14px;\n  font-weight:850;\n  letter-spacing:.01em;\n  text-shadow:0 2px 8px rgba(43,22,14,.45);\n  background:\n    radial-gradient(circle at 30% 18%,rgba(255,241,201,.18),transparent 36%),\n    linear-gradient(180deg,rgba(90,50,31,.82),rgba(43,22,14,.60));\n  border:1.2px solid rgba(244,197,66,.38);\n  box-shadow:0 10px 22px rgba(43,22,14,.22),inset 0 1px 0 rgba(255,241,201,.12);\n}\n#hls-solitaire .hls-stat b{\n  color:#fff8df;\n  font-size:16px;\n  font-weight:950;\n  min-width:28px;\n  text-align:right;\n}\n#hls-solitaire .hls-slots,#hls-solitaire .hls-tableau-zones,#hls-solitaire .hls-card-layer,#hls-solitaire .hls-ghost-layer{\n  position:absolute;\n  inset:0;\n  z-index:14;\n  pointer-events:none;\n}\n#hls-solitaire .hls-tableau-zones{pointer-events:auto}\n#hls-solitaire .hls-card-layer{\n  z-index:24;\n  pointer-events:auto;\n  touch-action:none;\n}\n#hls-solitaire .hls-ghost-layer{z-index:160}\n#hls-solitaire .hls-slot,#hls-solitaire .hls-tableau-zone{\n  position:absolute;\n  width:calc(var(--hls-card-w) + 12px);\n  height:var(--hls-card-h);\n  transform:translateX(-6px);\n  border-radius:18px;\n  pointer-events:auto;\n  touch-action:none;\n  background:\n    radial-gradient(circle at 50% 18%,rgba(255,241,201,.09),transparent 32%),\n    linear-gradient(180deg,rgba(107,74,39,.55),rgba(63,36,24,.40));\n  border:1.4px solid rgba(244,197,66,.38);\n  box-shadow:inset 0 1px 0 rgba(255,241,201,.10),0 6px 14px rgba(43,22,14,.10);\n}\n#hls-solitaire .hls-slot:before,#hls-solitaire .hls-tableau-zone:before{\n  content:\"\";\n  position:absolute;\n  inset:12px;\n  border-radius:14px;\n  border:1px dashed rgba(255,241,201,.14);\n}\n#hls-solitaire .hls-slot.stock-slot{cursor:pointer}\n#hls-solitaire .hls-tableau-zone{\n  height:300px;\n  background:\n    radial-gradient(circle at 50% 10%,rgba(255,241,201,.04),transparent 24%),\n    linear-gradient(180deg,rgba(255,241,201,.025),rgba(43,22,14,.04));\n  border-color:rgba(244,197,66,.22);\n}\n#hls-solitaire .hls-slot.hls-valid,#hls-solitaire .hls-tableau-zone.hls-valid{\n  border-color:rgba(244,197,66,.86);\n  background:\n    radial-gradient(circle at 50% 22%,rgba(255,248,223,.18),transparent 42%),\n    linear-gradient(180deg,rgba(184,115,51,.72),rgba(104,120,79,.58));\n  box-shadow:0 0 0 3px rgba(244,197,66,.12),0 0 24px rgba(244,197,66,.26);\n}\n#hls-solitaire .hls-slot.hls-hint-target,#hls-solitaire .hls-tableau-zone.hls-hint-target{\n  box-shadow:0 0 0 4px rgba(255,241,201,.15),0 0 30px rgba(244,197,66,.34);\n}\n#hls-solitaire .hls-card{\n  position:absolute;\n  width:var(--hls-card-w);\n  height:var(--hls-card-h);\n  border-radius:16px;\n  background:\n    radial-gradient(circle at 50% 0%,rgba(255,255,255,.85),transparent 56%),\n    linear-gradient(155deg,#fffdf0 0%,#fff8df 48%,#e8d2a7 100%);\n  border:1px solid rgba(90,50,31,.40);\n  box-shadow:0 14px 24px rgba(43,22,14,.30),inset 0 0 0 1px rgba(255,255,255,.52);\n  color:#3f2418;\n  overflow:hidden;\n  pointer-events:auto;\n  cursor:grab;\n  touch-action:none;\n  transition:box-shadow .10s ease,transform .10s ease,opacity .10s ease;\n}\n#hls-solitaire .hls-card:before{\n  content:\"\";\n  position:absolute;\n  inset:5px;\n  border-radius:13px;\n  border:1px solid rgba(184,115,51,.22);\n}\n#hls-solitaire .hls-card:after{\n  content:\"\";\n  position:absolute;\n  left:13px;\n  right:13px;\n  top:51%;\n  height:1px;\n  transform:translateY(-50%);\n  background:linear-gradient(90deg,transparent,rgba(90,50,31,.11),transparent);\n}\n#hls-solitaire .hls-card.hls-back{\n  cursor:default;\n  background:\n    radial-gradient(circle at 50% 44%,rgba(255,208,88,.34) 0 17px,transparent 18px),\n    radial-gradient(circle at 50% 44%,#ffd35f 0 19px,#9d5b22 20px 29px,transparent 30px),\n    linear-gradient(30deg,transparent 0 23%,rgba(244,197,66,.18) 23.4% 24.2%,transparent 24.6% 49%,rgba(255,241,201,.12) 49.4% 50.2%,transparent 50.6% 74%,rgba(244,197,66,.18) 74.4% 75.2%,transparent 75.6%),\n    linear-gradient(150deg,transparent 0 23%,rgba(244,197,66,.18) 23.4% 24.2%,transparent 24.6% 49%,rgba(255,241,201,.12) 49.4% 50.2%,transparent 50.6% 74%,rgba(244,197,66,.18) 74.4% 75.2%,transparent 75.6%),\n    linear-gradient(155deg,#6c3519 0%,#4b2415 54%,#2f160f 100%);\n  background-size:auto,auto,34px 34px,34px 34px,auto;\n  border-color:rgba(244,197,66,.60);\n  box-shadow:0 14px 24px rgba(43,22,14,.32),inset 0 0 0 1px rgba(255,241,201,.18),inset 0 0 24px rgba(244,197,66,.10);\n}\n#hls-solitaire .hls-card.hls-back:before{border-color:rgba(244,197,66,.30)}\n#hls-solitaire .hls-card.hls-back:after{display:none}\n#hls-solitaire .hls-card.suit-H{color:#b87333}\n#hls-solitaire .hls-card.suit-D{color:#d99a2b}\n#hls-solitaire .hls-card.suit-C{color:#68784f}\n#hls-solitaire .hls-card.suit-S{color:#3f2418}\n#hls-solitaire .hls-card.hls-selected{\n  box-shadow:0 0 0 3px rgba(244,197,66,.55),0 17px 28px rgba(43,22,14,.28),0 0 22px rgba(244,197,66,.28);\n  transform:translateY(-3px);\n}\n#hls-solitaire .hls-card.hls-dimmed{\n  opacity:.62;\n  filter:saturate(.9) brightness(.92);\n}\n#hls-solitaire .hls-card.hls-hint-source{\n  box-shadow:0 0 0 4px rgba(244,197,66,.28),0 18px 30px rgba(43,22,14,.24);\n}\n#hls-solitaire .hls-card.hls-not-playable{\n  pointer-events:none;\n  cursor:default;\n}\n#hls-solitaire .hls-corner{\n  position:absolute;\n  left:5px;\n  top:7px;\n  width:32px;\n  text-align:center;\n  font-weight:950;\n  line-height:.88;\n  font-size:18px;\n  letter-spacing:-.045em;\n  display:flex;\n  flex-direction:column;\n  align-items:center;\n  gap:2px;\n}\n#hls-solitaire .hls-corner .hls-suit-small{\n  width:20px;\n  height:20px;\n  display:grid;\n  place-items:center;\n  font-size:0;\n}\n#hls-solitaire .hls-corner.bottom{\n  left:auto;\n  top:auto;\n  right:5px;\n  bottom:7px;\n  transform:rotate(180deg);\n}\n#hls-solitaire .hls-center-suit{\n  position:absolute;\n  inset:0;\n  display:grid;\n  place-items:center;\n  font-size:0;\n  opacity:.92;\n  filter:drop-shadow(0 1px 0 rgba(255,255,255,.38));\n}\n#hls-solitaire .hls-suit-shape{\n  position:relative;\n  display:block;\n  color:currentColor;\n  width:50px;\n  height:50px;\n}\n#hls-solitaire .hls-suit-shape.small{width:18px;height:18px}\n#hls-solitaire .hls-suit-bee{\n  border-radius:50%;\n  background:radial-gradient(circle at 50% 50%,currentColor 0 42%,transparent 43%);\n  box-shadow:inset 0 0 0 5px rgba(255,248,223,.22),0 0 14px rgba(244,197,66,.16);\n}\n#hls-solitaire .hls-suit-bee:before{\n  content:\"\";\n  position:absolute;\n  left:50%;\n  top:50%;\n  width:23px;\n  height:15px;\n  transform:translate(-50%,-50%);\n  border-radius:999px;\n  background:linear-gradient(90deg,rgba(255,248,223,.86) 0 22%,currentColor 23% 42%,rgba(255,248,223,.86) 43% 62%,currentColor 63% 82%,rgba(255,248,223,.86) 83% 100%);\n}\n#hls-solitaire .hls-suit-bee:after{\n  content:\"\";\n  position:absolute;\n  left:50%;\n  top:50%;\n  width:34px;\n  height:19px;\n  transform:translate(-50%,-50%);\n  background:radial-gradient(ellipse at 24% 50%,rgba(255,248,223,.68) 0 32%,transparent 34%),radial-gradient(ellipse at 76% 50%,rgba(255,248,223,.68) 0 32%,transparent 34%);\n}\n#hls-solitaire .hls-suit-bee.small{box-shadow:inset 0 0 0 2px rgba(255,248,223,.22)}\n#hls-solitaire .hls-suit-bee.small:before{width:8px;height:5px}\n#hls-solitaire .hls-suit-bee.small:after{width:13px;height:8px}\n#hls-solitaire .hls-suit-drop{\n  width:42px;\n  height:44px;\n  background:currentColor;\n  border-radius:56% 56% 58% 18%;\n  transform:rotate(-45deg);\n  box-shadow:inset 5px 5px 0 rgba(255,248,223,.24),inset -4px -5px 0 rgba(63,36,24,.10);\n}\n#hls-solitaire .hls-suit-drop:before{\n  content:\"\";\n  position:absolute;\n  left:23%;\n  top:20%;\n  width:26%;\n  height:26%;\n  border-radius:50%;\n  background:rgba(255,248,223,.60);\n}\n#hls-solitaire .hls-suit-drop.small{width:16px;height:17px}\n#hls-solitaire .hls-suit-leaf{width:46px;height:46px}\n#hls-solitaire .hls-suit-leaf:before{\n  content:\"\";\n  position:absolute;\n  left:7px;\n  top:4px;\n  width:30px;\n  height:36px;\n  border-radius:26px 4px 26px 4px;\n  background:currentColor;\n  transform:rotate(34deg);\n}\n#hls-solitaire .hls-suit-leaf:after{\n  content:\"\";\n  position:absolute;\n  left:23px;\n  top:10px;\n  width:2px;\n  height:27px;\n  border-radius:999px;\n  background:rgba(255,248,223,.42);\n  transform:rotate(34deg);\n}\n#hls-solitaire .hls-suit-leaf.small:before{\n  left:3px;\n  top:2px;\n  width:12px;\n  height:14px;\n  border-radius:10px 2px 10px 2px;\n}\n#hls-solitaire .hls-suit-leaf.small:after{\n  left:8px;\n  top:4px;\n  height:10px;\n  width:1px;\n}\n#hls-solitaire .hls-suit-bookmark{\n  width:31px;\n  height:45px;\n  left:9px;\n  background:currentColor;\n  border-radius:6px 6px 3px 3px;\n  clip-path:polygon(0 0,100% 0,100% 100%,50% 76%,0 100%);\n}\n#hls-solitaire .hls-suit-bookmark:before{\n  content:\"\";\n  position:absolute;\n  left:7px;\n  right:7px;\n  top:7px;\n  height:17px;\n  border-radius:999px 999px 4px 4px;\n  border:2px solid rgba(255,248,223,.46);\n  border-bottom:0;\n}\n#hls-solitaire .hls-suit-bookmark.small{\n  left:3px;\n  width:12px;\n  height:17px;\n  border-radius:3px;\n}\n#hls-solitaire .hls-suit-bookmark.small:before{\n  left:3px;\n  right:3px;\n  top:3px;\n  height:6px;\n  border-width:1px;\n}\n#hls-solitaire .hls-status{\n  position:absolute;\n  left:50%;\n  bottom:90px;\n  transform:translateX(-50%);\n  min-width:360px;\n  max-width:720px;\n  height:34px;\n  z-index:86;\n  padding:0 18px;\n  border-radius:999px;\n  background:\n    radial-gradient(circle at 34% 10%,rgba(255,241,201,.18),transparent 38%),\n    linear-gradient(180deg,#7a421f 0%,#5a321f 100%);\n  border:1.35px solid rgba(244,197,66,.48);\n  color:#fff1c9;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  font-size:13px;\n  letter-spacing:.01em;\n  box-shadow:inset 0 1px 0 rgba(255,241,201,.13),0 8px 18px rgba(43,22,14,.20);\n  pointer-events:none;\n  text-align:center;\n}\n#hls-solitaire .hls-bottom-area{\n  position:absolute;\n  left:50%;\n  bottom:24px;\n  transform:translateX(-50%);\n  z-index:90;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n}\n#hls-solitaire .hls-bottom-controls{\n  display:flex;\n  gap:10px;\n  align-items:center;\n  justify-content:center;\n}\n#hls-solitaire .hls-pill{\n  height:40px;\n  min-width:104px;\n  padding:0 18px;\n  border-radius:999px;\n  border:1px solid rgba(255,241,201,.60);\n  color:#fff8df;\n  font-size:14px;\n  font-weight:850;\n  letter-spacing:.01em;\n  text-shadow:0 1px 0 rgba(63,36,24,.22);\n  box-shadow:inset 0 1px 0 rgba(255,255,255,.30),inset 0 -8px 14px rgba(63,36,24,.12),0 9px 18px rgba(43,22,14,.24);\n  cursor:pointer;\n  transition:transform .12s ease,box-shadow .12s ease,opacity .12s ease;\n}\n#hls-solitaire .hls-pill:hover{\n  transform:translateY(-1px);\n  box-shadow:inset 0 1px 0 rgba(255,255,255,.36),inset 0 -8px 14px rgba(63,36,24,.12),0 12px 22px rgba(43,22,14,.28),0 0 0 3px rgba(244,197,66,.08);\n}\n#hls-solitaire .hls-pill:active{transform:translateY(1px) scale(.985)}\n#hls-solitaire .hls-pill:disabled{\n  opacity:.48;\n  cursor:default;\n  transform:none;\n}\n#hls-solitaire #hlsNewGame{background:linear-gradient(180deg,#f4c542 0%,#b87333 100%)}\n#hls-solitaire #hlsRestart{background:linear-gradient(180deg,#b8735a 0%,#7a421f 100%)}\n#hls-solitaire #hlsUndo{background:linear-gradient(180deg,#68784f 0%,#4d593b 100%)}\n#hls-solitaire #hlsHint{\n  background:linear-gradient(180deg,#fff8df 0%,#e9c875 100%);\n  color:#3f2418;\n  text-shadow:none;\n  border-color:rgba(255,255,255,.78);\n}\n#hls-solitaire .hls-overlay{\n  position:absolute;\n  inset:0;\n  z-index:180;\n  display:none;\n  align-items:center;\n  justify-content:center;\n  background:rgba(43,22,14,.58);\n  backdrop-filter:blur(7px);\n  overflow:hidden;\n}\n#hls-solitaire .hls-overlay.active{display:flex}\n#hls-solitaire .hls-fireworks{\n  position:absolute;\n  inset:0;\n  width:100%;\n  height:100%;\n  z-index:1;\n  pointer-events:none;\n  opacity:0;\n  transition:opacity .25s ease;\n}\n#hls-solitaire .hls-fireworks.active{opacity:1}\n#hls-solitaire .hls-popup{\n  width:438px;\n  max-width:calc(100% - 48px);\n  min-height:276px;\n  position:relative;\n  z-index:2;\n  border-radius:28px;\n  padding:34px 34px 28px;\n  background:\n    radial-gradient(circle at 80% 0%,rgba(244,197,66,.26),transparent 38%),\n    radial-gradient(circle at 18% 20%,rgba(255,241,201,.32),transparent 34%),\n    linear-gradient(145deg,rgba(255,248,223,.98),rgba(233,200,117,.92));\n  border:1px solid rgba(255,255,255,.60);\n  box-shadow:0 32px 82px rgba(43,22,14,.40),inset 0 0 0 1px rgba(255,255,255,.18);\n  text-align:center;\n  overflow:hidden;\n}\n#hls-solitaire .hls-popup-main{\n  position:relative;\n  z-index:2;\n  min-height:210px;\n  display:flex;\n  flex-direction:column;\n  align-items:center;\n  justify-content:center;\n  gap:13px;\n}\n#hls-solitaire .hls-mark{\n  position:relative;\n  width:60px;\n  height:60px;\n  margin:0 auto -2px;\n  border-radius:50%;\n  background:radial-gradient(circle at 50% 50%,#fff8df 0 12px,#f4c542 13px 23px,#b87333 24px 100%);\n  border:2px solid rgba(63,36,24,.25);\n  box-shadow:0 0 28px rgba(244,197,66,.38),0 10px 24px rgba(63,36,24,.18),inset 0 0 0 1px rgba(255,241,201,.20);\n}\n#hls-solitaire .hls-mark:before{\n  content:\"\";\n  position:absolute;\n  left:50%;\n  top:50%;\n  width:26px;\n  height:15px;\n  transform:translate(-50%,-50%);\n  border-radius:999px;\n  background:linear-gradient(90deg,#3f2418 0 20%,#fff8df 21% 40%,#3f2418 41% 60%,#fff8df 61% 80%,#3f2418 81% 100%);\n}\n#hls-solitaire .hls-mark:after{\n  content:\"\";\n  position:absolute;\n  left:50%;\n  top:50%;\n  width:38px;\n  height:22px;\n  transform:translate(-50%,-50%);\n  background:radial-gradient(ellipse at 24% 50%,rgba(255,248,223,.74) 0 31%,transparent 33%),radial-gradient(ellipse at 76% 50%,rgba(255,248,223,.74) 0 31%,transparent 33%);\n}\n#hls-solitaire .hls-popup-title{\n  margin:0;\n  color:#3f2418;\n  font-size:26px;\n  line-height:1.1;\n  font-weight:950;\n  letter-spacing:-.03em;\n}\n#hls-solitaire .hls-popup-copy{\n  width:100%;\n  max-width:348px;\n  margin:0 auto;\n  color:rgba(63,36,24,.76);\n  line-height:1.45;\n  font-size:13px;\n  text-align:center;\n}\n#hls-solitaire .hls-start-btn,#hls-solitaire .hls-popup-btn{\n  width:210px;\n  height:52px;\n  border:1px solid rgba(255,255,255,.55);\n  border-radius:999px;\n  color:#3f2418;\n  background:linear-gradient(180deg,#fff8df,#f4c542);\n  font-weight:950;\n  font-size:16px;\n  cursor:pointer;\n  box-shadow:0 16px 34px rgba(63,36,24,.22);\n  transition:transform .12s ease,filter .12s ease;\n}\n#hls-solitaire .hls-start-btn:hover,#hls-solitaire .hls-popup-btn:hover{\n  transform:translateY(-2px);\n  filter:brightness(1.04);\n}\n#hls-solitaire .hls-popup-btn.secondary{\n  height:44px;\n  background:rgba(255,255,255,.34);\n  font-size:14px;\n  box-shadow:0 10px 22px rgba(63,36,24,.14);\n}\n#hls-solitaire .hls-mode-row{\n  display:flex;\n  gap:9px;\n  justify-content:center;\n  align-items:center;\n}\n#hls-solitaire .hls-mode-btn{\n  min-width:94px;\n  height:38px;\n  border-radius:999px;\n  border:1px solid rgba(63,36,24,.16);\n  background:rgba(255,255,255,.38);\n  color:rgba(63,36,24,.74);\n  font-size:13px;\n  font-weight:850;\n  cursor:pointer;\n  transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,transform .12s ease;\n}\n#hls-solitaire .hls-mode-btn:hover{\n  transform:translateY(-1px);\n  border-color:rgba(63,36,24,.28);\n  background:rgba(255,248,223,.58);\n}\n#hls-solitaire .hls-mode-btn.active{\n  color:#3f2418;\n  background:linear-gradient(180deg,#fff8df,#f4c542);\n  border-color:rgba(255,255,255,.55);\n  box-shadow:0 0 0 3px rgba(244,197,66,.16),0 0 18px rgba(244,197,66,.18);\n}\n#hls-solitaire .hls-win-grid{\n  display:grid;\n  grid-template-columns:repeat(2,1fr);\n  gap:10px;\n  margin:6px auto 10px;\n  width:100%;\n  max-width:340px;\n}\n#hls-solitaire .hls-win-box{\n  border-radius:18px;\n  padding:12px 8px;\n  background:rgba(255,255,255,.38);\n  border:1px solid rgba(63,36,24,.11);\n}\n#hls-solitaire .hls-win-box span{\n  display:block;\n  color:rgba(63,36,24,.58);\n  font-size:10px;\n  text-transform:uppercase;\n  letter-spacing:.08em;\n}\n#hls-solitaire .hls-win-box b{\n  color:#3f2418;\n  font-size:18px;\n}\n#hls-solitaire .hls-rotate-note{\n  position:absolute;\n  inset:0;\n  z-index:250;\n  display:none;\n  place-items:center;\n  padding:24px;\n  background:rgba(43,22,14,.72);\n  color:#fff8df;\n  text-align:center;\n  backdrop-filter:blur(7px);\n}\n#hls-solitaire.hls-portrait-fullscreen .hls-rotate-note{display:grid}\n#hls-solitaire .hls-rotate-card{\n  width:min(320px,84vw);\n  padding:22px 20px;\n  border-radius:24px;\n  background:rgba(63,36,24,.88);\n  border:1px solid rgba(255,241,201,.24);\n  box-shadow:0 24px 62px rgba(43,22,14,.40);\n}\n#hls-solitaire .hls-rotate-card b{\n  display:block;\n  font-size:18px;\n  margin-bottom:7px;\n}\n#hls-solitaire .hls-rotate-card span{\n  display:block;\n  font-size:13px;\n  line-height:1.45;\n  opacity:.82;\n}\n@media (max-width:720px){\n  #hls-solitaire{\n    width:100%;\n    border-radius:18px;\n  }\n}\n<\/style>\n\n<div id=\"hls-solitaire\">\n  <div class=\"hls-fit\" id=\"hlsFit\">\n    <div class=\"hls-ornament left\"><\/div>\n    <div class=\"hls-ornament right\"><\/div>\n    <div class=\"hls-playfield\"><\/div>\n\n    <button class=\"hls-icon hls-pause\" id=\"hlsPause\" type=\"button\" aria-label=\"Pause\">\n      <span class=\"hls-pause-symbol\" aria-hidden=\"true\"><\/span>\n    <\/button>\n\n    <button class=\"hls-icon hls-mute\" id=\"hlsMute\" type=\"button\" aria-label=\"Sound\">\n      <span class=\"hls-sound-symbol\" aria-hidden=\"true\">\n        <span class=\"hls-sound-box\"><\/span>\n        <span class=\"hls-sound-wave w1\"><\/span>\n        <span class=\"hls-sound-wave w2\"><\/span>\n        <span class=\"hls-sound-wave w3\"><\/span>\n        <span class=\"hls-sound-slash\"><\/span>\n      <\/span>\n    <\/button>\n\n    <div class=\"hls-stats\" aria-live=\"polite\">\n      <span class=\"hls-stat\">Score <b id=\"hlsScore\">0<\/b><\/span>\n      <span class=\"hls-stat\">Time <b id=\"hlsTime\">00:00<\/b><\/span>\n      <span class=\"hls-stat\">Moves <b id=\"hlsMoves\">0<\/b><\/span>\n      <span class=\"hls-stat\">Best <b id=\"hlsBest\">0<\/b><\/span>\n    <\/div>\n\n    <button class=\"hls-icon hls-fullscreen\" id=\"hlsFullscreen\" type=\"button\" aria-label=\"Fullscreen\">\n      <span class=\"hls-full-symbol\" aria-hidden=\"true\"><\/span>\n    <\/button>\n\n    <div class=\"hls-slots\" id=\"hlsSlots\"><\/div>\n    <div class=\"hls-tableau-zones\" id=\"hlsTableauZones\"><\/div>\n    <div class=\"hls-card-layer\" id=\"hlsCards\"><\/div>\n    <div class=\"hls-ghost-layer\" id=\"hlsGhost\"><\/div>\n\n    <div class=\"hls-status\" id=\"hlsStatus\">Choose a mode, then begin a fresh deal.<\/div>\n\n    <div class=\"hls-bottom-area\">\n      <div class=\"hls-bottom-controls\">\n        <button class=\"hls-pill\" id=\"hlsNewGame\" type=\"button\">New Game<\/button>\n        <button class=\"hls-pill\" id=\"hlsRestart\" type=\"button\">Restart<\/button>\n        <button class=\"hls-pill\" id=\"hlsUndo\" type=\"button\">Undo<\/button>\n        <button class=\"hls-pill\" id=\"hlsHint\" type=\"button\">Hint<\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"hls-overlay active\" id=\"hlsStartOverlay\">\n      <div class=\"hls-popup\">\n        <div class=\"hls-popup-main\">\n          <div class=\"hls-mark\" aria-hidden=\"true\"><\/div>\n          <button class=\"hls-start-btn\" id=\"hlsContinueBtn\" type=\"button\" style=\"display:none;\">Continue Game<\/button>\n          <button class=\"hls-start-btn\" id=\"hlsStartBtn\" type=\"button\">Start Game<\/button>\n          <div class=\"hls-mode-row\" aria-label=\"Mode\">\n            <button class=\"hls-mode-btn active\" type=\"button\" data-mode=\"Relaxed\">Relaxed<\/button>\n            <button class=\"hls-mode-btn\" type=\"button\" data-mode=\"Classic\">Classic<\/button>\n          <\/div>\n          <p class=\"hls-popup-copy\">Build cards to the foundation from Ace to King. Empty tableau columns can accept any card.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"hls-overlay\" id=\"hlsPauseOverlay\">\n      <div class=\"hls-popup\">\n        <div class=\"hls-popup-main\">\n          <div class=\"hls-mark\" aria-hidden=\"true\"><\/div>\n          <h3 class=\"hls-popup-title\">Reading Break<\/h3>\n          <button class=\"hls-popup-btn\" id=\"hlsResumeBtn\" type=\"button\">Resume Game<\/button>\n          <button class=\"hls-popup-btn secondary\" id=\"hlsSaveBtn\" type=\"button\">Save Game<\/button>\n          <button class=\"hls-popup-btn secondary\" id=\"hlsPauseNewBtn\" type=\"button\">New Game<\/button>\n          <p class=\"hls-popup-copy\">The cards will wait quietly on the warm table.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"hls-overlay\" id=\"hlsWinOverlay\">\n      <canvas class=\"hls-fireworks\" id=\"hlsFireworks\"><\/canvas>\n      <div class=\"hls-popup\">\n        <div class=\"hls-popup-main\">\n          <div class=\"hls-mark\" aria-hidden=\"true\"><\/div>\n          <h3 class=\"hls-popup-title\">Archive Complete<\/h3>\n          <div class=\"hls-win-grid\">\n            <div class=\"hls-win-box\"><span>Score<\/span><b id=\"hlsWinScore\">0<\/b><\/div>\n            <div class=\"hls-win-box\"><span>Moves<\/span><b id=\"hlsWinMoves\">0<\/b><\/div>\n            <div class=\"hls-win-box\"><span>Best<\/span><b id=\"hlsWinBest\">0<\/b><\/div>\n            <div class=\"hls-win-box\"><span>Best Moves<\/span><b id=\"hlsWinBestMoves\">&#8212;<\/b><\/div>\n          <\/div>\n          <button class=\"hls-popup-btn\" id=\"hlsPlayAgain\" type=\"button\">Play Again<\/button>\n          <p class=\"hls-popup-copy\" id=\"hlsWinNote\">A quiet golden finish.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"hls-rotate-note\">\n    <div class=\"hls-rotate-card\">\n      <b>Rotate Your Phone<\/b>\n      <span>Landscape mode gives the card table more room and keeps every move easy to read.<\/span>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  function initializeHoneyLibrarySolitaire(){\n  \"use strict\";\n  const __hlsRoot = document.getElementById(\"hls-solitaire\");\n  if (!__hlsRoot || __hlsRoot.dataset.hlsWpReady === \"1\") return;\n  __hlsRoot.dataset.hlsWpReady = \"1\";\n\n  \/\/ Read-only hosting \/ private browsing may block localStorage.\n  function hlsStorageGet(key){try{return window.localStorage.getItem(key);}catch(err){return null;}}\n  function hlsStorageSet(key,value){try{window.localStorage.setItem(key,value);}catch(err){}}\n  function hlsStorageRemove(key){try{window.localStorage.removeItem(key);}catch(err){}}\n\n\n  const root=document.getElementById(\"hls-solitaire\");\n  const fit=document.getElementById(\"hlsFit\");\n  const slotsEl=document.getElementById(\"hlsSlots\");\n  const zonesEl=document.getElementById(\"hlsTableauZones\");\n  const cardsEl=document.getElementById(\"hlsCards\");\n  const ghostEl=document.getElementById(\"hlsGhost\");\n  const statusEl=document.getElementById(\"hlsStatus\");\n  const fireworksCanvas=document.getElementById(\"hlsFireworks\");\n  const fireworksCtx=fireworksCanvas.getContext(\"2d\");\n\n  const startOverlay=document.getElementById(\"hlsStartOverlay\");\n  const pauseOverlay=document.getElementById(\"hlsPauseOverlay\");\n  const winOverlay=document.getElementById(\"hlsWinOverlay\");\n\n  const pauseBtn=document.getElementById(\"hlsPause\");\n  const muteBtn=document.getElementById(\"hlsMute\");\n  const fullscreenBtn=document.getElementById(\"hlsFullscreen\");\n\n  const scoreEl=document.getElementById(\"hlsScore\");\n  const timeEl=document.getElementById(\"hlsTime\");\n  const movesEl=document.getElementById(\"hlsMoves\");\n  const bestEl=document.getElementById(\"hlsBest\");\n\n  const continueBtn=document.getElementById(\"hlsContinueBtn\");\n  const startBtn=document.getElementById(\"hlsStartBtn\");\n  const resumeBtn=document.getElementById(\"hlsResumeBtn\");\n  const saveBtn=document.getElementById(\"hlsSaveBtn\");\n  const pauseNewBtn=document.getElementById(\"hlsPauseNewBtn\");\n  const playAgainBtn=document.getElementById(\"hlsPlayAgain\");\n\n  const newGameBtn=document.getElementById(\"hlsNewGame\");\n  const restartBtn=document.getElementById(\"hlsRestart\");\n  const undoBtn=document.getElementById(\"hlsUndo\");\n  const hintBtn=document.getElementById(\"hlsHint\");\n\n  const winScoreEl=document.getElementById(\"hlsWinScore\");\n  const winMovesEl=document.getElementById(\"hlsWinMoves\");\n  const winBestEl=document.getElementById(\"hlsWinBest\");\n  const winBestMovesEl=document.getElementById(\"hlsWinBestMoves\");\n  const winNoteEl=document.getElementById(\"hlsWinNote\");\n\n  const BASE_W=1280;\n  const BASE_H=720;\n  const CARD_W=96;\n  const CARD_H=132;\n  const TOP_Y=112;\n  const TABLEAU_Y=282;\n  const MAX_CARD_BOTTOM=584;\n  const TABLEAU_GAP=34;\n  const FOUNDATION_GAP=112;\n\n  const SAVE_KEY=\"hlsHoneyLibrarySolitaireSaveV6\";\n  const BEST_KEY=\"hlsHoneyLibrarySolitaireBestV6\";\n  const MUTE_KEY=\"hlsHoneyLibrarySolitaireMutedV6\";\n\n  const SUITS=[\n    {key:\"H\",name:\"Bee Seals\",shape:\"bee\",color:\"red\"},\n    {key:\"D\",name:\"Honey Drops\",shape:\"drop\",color:\"red\"},\n    {key:\"C\",name:\"Library Leaves\",shape:\"leaf\",color:\"black\"},\n    {key:\"S\",name:\"Bookmarks\",shape:\"bookmark\",color:\"black\"}\n  ];\n\n  const MODE={\n    Relaxed:{draw:1,recycleLimit:Infinity},\n    Classic:{draw:3,recycleLimit:3}\n  };\n\n  const tableauStartX=Math.round((BASE_W-(7*CARD_W+6*TABLEAU_GAP))\/2);\n  const tableauRight=tableauStartX+(7*CARD_W+6*TABLEAU_GAP);\n  const foundationStartX=tableauRight-(CARD_W+3*FOUNDATION_GAP);\n\n  const POS={\n    stock:{x:tableauStartX,y:TOP_Y,w:CARD_W,h:CARD_H},\n    waste:{x:tableauStartX+120,y:TOP_Y,w:CARD_W+64,h:CARD_H},\n    foundations:[],\n    tableau:[]\n  };\n\n  for(let i=0;i<4;i++){\n    POS.foundations.push({x:foundationStartX+i*FOUNDATION_GAP,y:TOP_Y,w:CARD_W,h:CARD_H,index:i});\n  }\n\n  for(let i=0;i<7;i++){\n    POS.tableau.push({x:tableauStartX+i*(CARD_W+TABLEAU_GAP),y:TABLEAU_Y,w:CARD_W,h:300,col:i});\n  }\n\n  const state={\n    started:false,\n    paused:false,\n    won:false,\n    mode:\"Relaxed\",\n    stock:[],\n    waste:[],\n    foundations:[[],[],[],[]],\n    tableau:Array.from({length:7},()=>[]),\n    initialSnapshot:null,\n    selected:null,\n    hintMark:null,\n    moves:0,\n    foundationBonus:0,\n    flipBonus:0,\n    undoCount:0,\n    hintCount:0,\n    recycleUsed:0,\n    recyclePenalty:0,\n    startTime:0,\n    pausedAt:0,\n    finalElapsed:0,\n    undoStack:[],\n    muted:hlsStorageGet(MUTE_KEY)===\"1\",\n    audioCtx:null\n  };\n\n  let interaction=null;\n  let lastTap={id:\"\",time:0};\n  let statusTimer=null;\n  let hintTimer=null;\n\n  let fireworksRunning=false;\n  let fireworksFrame=0;\n  let fireworkRockets=[];\n  let fireworkParticles=[];\n  let fireworksDpr=1;\n\n  function cloneCard(card){\n    return card ? {id:card.id,suit:card.suit,rank:card.rank,color:card.color,faceUp:!!card.faceUp} : null;\n  }\n  function cloneCards(arr){return arr.map(cloneCard)}\n  function cloneFoundations(f){return f.map(cloneCards)}\n  function rankLabel(rank){\n    if(rank===1) return \"A\";\n    if(rank===11) return \"J\";\n    if(rank===12) return \"Q\";\n    if(rank===13) return \"K\";\n    return String(rank);\n  }\n  function rankName(rank){\n    if(rank===1) return \"Ace\";\n    if(rank===11) return \"Jack\";\n    if(rank===12) return \"Queen\";\n    if(rank===13) return \"King\";\n    return String(rank);\n  }\n  function suitInfo(key){return SUITS.find(s=>s.key===key)}\n  function cardName(card){return rankName(card.rank)+\" of \"+suitInfo(card.suit).name}\n  function cardColor(card){return suitInfo(card.suit).color}\n  function formatTime(seconds){\n    seconds=Math.max(0,Math.floor(seconds));\n    const m=String(Math.floor(seconds\/60)).padStart(2,\"0\");\n    const s=String(seconds%60).padStart(2,\"0\");\n    return m+\":\"+s;\n  }\n  function rand(min,max){return min+Math.random()*(max-min)}\n  function resizeFireworksCanvas(){\n    fireworksDpr=Math.min(window.devicePixelRatio || 1,2);\n    fireworksCanvas.width=BASE_W*fireworksDpr;\n    fireworksCanvas.height=BASE_H*fireworksDpr;\n    fireworksCanvas.style.width=BASE_W+\"px\";\n    fireworksCanvas.style.height=BASE_H+\"px\";\n    fireworksCtx.setTransform(fireworksDpr,0,0,fireworksDpr,0,0);\n  }\n  function spawnRocket(){\n    fireworkRockets.push({\n      x:rand(170,1110),\n      y:720,\n      tx:rand(210,1070),\n      ty:rand(90,285),\n      speed:rand(4.6,6.6),\n      hue:rand(28,58)+rand(0,1)*160,\n      trail:[]\n    });\n  }\n  function explodeRocket(x,y,hue){\n    const count=28+Math.floor(Math.random()*14);\n    const life=42+Math.floor(Math.random()*16);\n    for(let i=0;i<count;i++){\n      const angle=(Math.PI*2\/count)*i+rand(-.08,.08);\n      const speed=rand(1.8,4.8);\n      fireworkParticles.push({\n        x:x,\n        y:y,\n        vx:Math.cos(angle)*speed,\n        vy:Math.sin(angle)*speed,\n        life:life,\n        maxLife:life,\n        size:rand(2,4.6),\n        hue:(hue+rand(-24,24)+360)%360\n      });\n    }\n  }\n  function startFireworks(){\n    stopFireworks();\n    resizeFireworksCanvas();\n    fireworksRunning=true;\n    fireworksCanvas.classList.add(\"active\");\n    for(let i=0;i<4;i++){\n      setTimeout(function(){\n        if(fireworksRunning) spawnRocket();\n      },i*170);\n    }\n    animateFireworks();\n  }\n  function stopFireworks(){\n    fireworksRunning=false;\n    cancelAnimationFrame(fireworksFrame);\n    fireworkRockets.length=0;\n    fireworkParticles.length=0;\n    fireworksCanvas.classList.remove(\"active\");\n    fireworksCtx.clearRect(0,0,BASE_W,BASE_H);\n  }\n  function animateFireworks(){\n    fireworksCtx.clearRect(0,0,BASE_W,BASE_H);\n\n    if(Math.random()<.055) spawnRocket();\n\n    for(let i=fireworkRockets.length-1;i>=0;i--){\n      const r=fireworkRockets[i];\n      const dx=r.tx-r.x;\n      const dy=r.ty-r.y;\n      const dist=Math.hypot(dx,dy) || 1;\n\n      r.trail.push({x:r.x,y:r.y});\n      if(r.trail.length>8) r.trail.shift();\n\n      r.x+=(dx\/dist)*r.speed;\n      r.y+=(dy\/dist)*r.speed;\n\n      for(let t=0;t<r.trail.length;t++){\n        const p=r.trail[t];\n        const alpha=(t+1)\/r.trail.length*.34;\n        fireworksCtx.beginPath();\n        fireworksCtx.fillStyle=\"hsla(\"+r.hue+\",95%,70%,\"+alpha+\")\";\n        fireworksCtx.arc(p.x,p.y,2.4,0,Math.PI*2);\n        fireworksCtx.fill();\n      }\n\n      fireworksCtx.beginPath();\n      fireworksCtx.fillStyle=\"hsla(\"+r.hue+\",100%,74%,1)\";\n      fireworksCtx.arc(r.x,r.y,3.2,0,Math.PI*2);\n      fireworksCtx.fill();\n\n      if(dist<8){\n        explodeRocket(r.tx,r.ty,r.hue);\n        fireworkRockets.splice(i,1);\n      }\n    }\n\n    for(let i=fireworkParticles.length-1;i>=0;i--){\n      const p=fireworkParticles[i];\n      p.x+=p.vx;\n      p.y+=p.vy;\n      p.vy+=.045;\n      p.vx*=.992;\n      p.life-=1;\n\n      const alpha=Math.max(0,p.life\/p.maxLife);\n      fireworksCtx.beginPath();\n      fireworksCtx.fillStyle=\"hsla(\"+p.hue+\",96%,72%,\"+alpha+\")\";\n      fireworksCtx.arc(p.x,p.y,p.size,0,Math.PI*2);\n      fireworksCtx.fill();\n\n      if(p.life<=0) fireworkParticles.splice(i,1);\n    }\n\n    if(fireworksRunning){\n      fireworksFrame=requestAnimationFrame(animateFireworks);\n    }\n  }\n  function nowElapsed(){\n    if(!state.started) return 0;\n    if(state.won) return state.finalElapsed;\n    if(state.paused) return Math.floor((state.pausedAt-state.startTime)\/1000);\n    return Math.floor((Date.now()-state.startTime)\/1000);\n  }\n  function loadBest(){\n    try{\n      const raw=hlsStorageGet(BEST_KEY);\n      if(!raw) return {bestScore:0,bestTime:null,bestMoves:null};\n      const data=JSON.parse(raw);\n      return {\n        bestScore:Number(data.bestScore)||0,\n        bestTime:data.bestTime==null?null:Number(data.bestTime),\n        bestMoves:data.bestMoves==null?null:Number(data.bestMoves)\n      };\n    }catch(err){\n      return {bestScore:0,bestTime:null,bestMoves:null};\n    }\n  }\n  function saveBest(best){hlsStorageSet(BEST_KEY,JSON.stringify(best))}\n  function foundationTotal(){return state.foundations.reduce((sum,pile)=>sum+pile.length,0)}\n  function calcScore(){\n    const elapsed=nowElapsed();\n    const score=5000+state.foundationBonus+state.flipBonus-state.moves-Math.floor(elapsed\/5)-state.undoCount*10-state.hintCount*25-state.recyclePenalty;\n    return Math.max(0,Math.floor(score));\n  }\n  function setStatus(text,temporary){\n    statusEl.textContent=text;\n    if(statusTimer) clearTimeout(statusTimer);\n    if(temporary){\n      statusTimer=setTimeout(function(){\n        if(!state.started) statusEl.textContent=\"Choose a mode, then begin a fresh deal.\";\n        else if(state.paused) statusEl.textContent=\"The warm table is paused.\";\n        else if(state.won) statusEl.textContent=\"Every card has reached its foundation.\";\n        else statusEl.textContent=\"Tap or drag cards. Double tap a ready card to send it home.\";\n      },temporary);\n    }\n  }\n  function updateStats(){\n    const best=loadBest();\n    scoreEl.textContent=String(calcScore());\n    timeEl.textContent=formatTime(nowElapsed());\n    movesEl.textContent=String(state.moves);\n    bestEl.textContent=String(best.bestScore||0);\n    undoBtn.disabled=!state.started || state.paused || state.won || state.undoStack.length===0;\n    hintBtn.disabled=!state.started || state.paused || state.won;\n    restartBtn.disabled=!state.started;\n  }\n  function initAudio(){\n    if(state.audioCtx) return;\n    const AC=window.AudioContext || window.webkitAudioContext;\n    if(!AC) return;\n    state.audioCtx=new AC();\n  }\n  function playSound(type){\n    if(state.muted) return;\n    initAudio();\n    const ctx=state.audioCtx;\n    if(!ctx) return;\n    if(((__hls_wp_v) => (__hls_wp_v ? (ctx.resume) : __hls_wp_v))(ctx.state===\"suspended\")) ctx.resume().catch(function(){});\n    function tone(freq,duration,volume,wave,delay,endRatio){\n      const t=ctx.currentTime+(delay||0);\n      const gain=ctx.createGain();\n      const osc=ctx.createOscillator();\n      osc.type=wave||\"triangle\";\n      osc.frequency.setValueAtTime(freq,t);\n      osc.frequency.exponentialRampToValueAtTime(Math.max(70,freq*(endRatio||.82)),t+duration);\n      gain.gain.setValueAtTime(.0001,t);\n      gain.gain.exponentialRampToValueAtTime(volume,t+.012);\n      gain.gain.exponentialRampToValueAtTime(.0001,t+duration);\n      osc.connect(gain);\n      gain.connect(ctx.destination);\n      osc.start(t);\n      osc.stop(t+duration+.025);\n    }\n    if(type===\"draw\"){tone(260,.08,.026,\"triangle\",0,.78);tone(335,.08,.016,\"sine\",.04,.86)}\n    else if(type===\"move\"){tone(315,.07,.026,\"triangle\",0,.72);tone(415,.055,.014,\"sine\",.018,.84)}\n    else if(type===\"flip\"){tone(480,.08,.022,\"triangle\",0,.92)}\n    else if(type===\"foundation\"){tone(520,.105,.026,\"triangle\",0,.92);tone(690,.115,.020,\"sine\",.055,.94)}\n    else if(type===\"invalid\"){tone(145,.115,.024,\"triangle\",0,.64)}\n    else if(type===\"undo\"){tone(240,.09,.022,\"sine\",0,.75);tone(180,.09,.014,\"triangle\",.04,.80)}\n    else if(type===\"hint\"){tone(620,.115,.024,\"triangle\",0,.94);tone(820,.120,.018,\"sine\",.052,.96)}\n    else if(type===\"save\"){tone(390,.08,.022,\"sine\",0,.90);tone(520,.08,.014,\"triangle\",.04,.92)}\n    else if(type===\"pause\"){tone(220,.105,.020,\"sine\",0,.70)}\n    else if(type===\"resume\"){tone(360,.075,.022,\"triangle\",0,.88);tone(470,.075,.014,\"sine\",.035,.92)}\n    else if(type===\"win\"){[392,493.88,587.33,783.99].forEach(function(freq,i){tone(freq,.45,.022,i%2?\"sine\":\"triangle\",i*.075,.95)})}\n  }\n  function createDeck(){\n    const deck=[];\n    SUITS.forEach(function(s){\n      for(let r=1;r<=13;r++) deck.push({id:s.key+\"-\"+r,suit:s.key,rank:r,color:s.color,faceUp:false});\n    });\n    return deck;\n  }\n  function shuffle(deck){\n    const arr=deck.slice();\n    for(let i=arr.length-1;i>0;i--){\n      const j=Math.floor(Math.random()*(i+1));\n      const temp=arr[i];\n      arr[i]=arr[j];\n      arr[j]=temp;\n    }\n    return arr;\n  }\n  function snapshot(){\n    return {\n      mode:state.mode,\n      stock:cloneCards(state.stock),\n      waste:cloneCards(state.waste),\n      foundations:cloneFoundations(state.foundations),\n      tableau:state.tableau.map(cloneCards),\n      moves:state.moves,\n      foundationBonus:state.foundationBonus,\n      flipBonus:state.flipBonus,\n      undoCount:state.undoCount,\n      hintCount:state.hintCount,\n      recycleUsed:state.recycleUsed,\n      recyclePenalty:state.recyclePenalty,\n      elapsed:nowElapsed()\n    };\n  }\n  function restoreSnapshot(snap,keepUndoPenalty){\n    state.mode=snap.mode||\"Relaxed\";\n    state.stock=cloneCards(snap.stock||[]);\n    state.waste=cloneCards(snap.waste||[]);\n    state.foundations=cloneFoundations(snap.foundations||[[],[],[],[]]);\n    while(state.foundations.length<4) state.foundations.push([]);\n    state.tableau=(snap.tableau||Array.from({length:7},function(){return []})).map(cloneCards);\n    while(state.tableau.length<7) state.tableau.push([]);\n    state.moves=Number(snap.moves)||0;\n    state.foundationBonus=Number(snap.foundationBonus)||0;\n    state.flipBonus=Number(snap.flipBonus)||0;\n    state.undoCount=keepUndoPenalty ? (Number(snap.undoCount)||0)+1 : (Number(snap.undoCount)||0);\n    state.hintCount=Number(snap.hintCount)||0;\n    state.recycleUsed=Number(snap.recycleUsed)||0;\n    state.recyclePenalty=Number(snap.recyclePenalty)||0;\n    state.startTime=Date.now()-(Number(snap.elapsed)||0)*1000;\n    state.finalElapsed=0;\n    state.selected=null;\n    state.hintMark=null;\n    interaction=null;\n    clearGhost();\n    updateModeButtons();\n  }\n  function pushUndo(){\n    state.undoStack.push(snapshot());\n    if(state.undoStack.length>80) state.undoStack.shift();\n  }\n  function hasSave(){\n    try{\n      const raw=hlsStorageGet(SAVE_KEY);\n      if(!raw) return false;\n      const data=JSON.parse(raw);\n      return ((__hls_wp_v) => (__hls_wp_v ? (!data.won) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (data.started) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (data.version===1) : __hls_wp_v))(data)));\n    }catch(err){return false}\n  }\n  function saveGame(){\n    if(!state.started || state.won) return;\n    const data=snapshot();\n    data.version=1;\n    data.started=true;\n    data.won=false;\n    data.savedAt=Date.now();\n    hlsStorageSet(SAVE_KEY,JSON.stringify(data));\n    updateContinueButton();\n  }\n  function clearSave(){\n    hlsStorageRemove(SAVE_KEY);\n    updateContinueButton();\n  }\n  function updateContinueButton(){continueBtn.style.display=hasSave() ? \"block\" : \"none\"}\n  function continueGame(){\n    stopFireworks();\n    try{\n      const raw=hlsStorageGet(SAVE_KEY);\n      if(!raw) return;\n      const data=JSON.parse(raw);\n      if(!data || data.version!==1) return;\n      state.started=true;\n      state.paused=false;\n      state.won=false;\n      state.undoStack=[];\n      restoreSnapshot(data,false);\n      startOverlay.classList.remove(\"active\");\n      pauseOverlay.classList.remove(\"active\");\n      winOverlay.classList.remove(\"active\");\n      root.classList.add(\"hls-game-active\");\n      root.classList.remove(\"hls-paused\");\n      setStatus(\"Saved game restored.\",1200);\n      playSound(\"resume\");\n      render();\n    }catch(err){clearSave()}\n  }\n  function startNewGame(mode){\n    stopFireworks();\n    initAudio();\n    state.started=true;\n    state.paused=false;\n    state.won=false;\n    state.mode=mode||state.mode;\n    state.stock=[];\n    state.waste=[];\n    state.foundations=[[],[],[],[]];\n    state.tableau=Array.from({length:7},function(){return []});\n    state.selected=null;\n    state.hintMark=null;\n    state.moves=0;\n    state.foundationBonus=0;\n    state.flipBonus=0;\n    state.undoCount=0;\n    state.hintCount=0;\n    state.recycleUsed=0;\n    state.recyclePenalty=0;\n    state.undoStack=[];\n    state.startTime=Date.now();\n    state.pausedAt=0;\n    state.finalElapsed=0;\n    const deck=shuffle(createDeck());\n    for(let col=0;col<7;col++){\n      for(let row=0;row<=col;row++){\n        const card=deck.pop();\n        card.faceUp=row===col;\n        state.tableau[col].push(card);\n      }\n    }\n    state.stock=deck.map(function(card){\n      card.faceUp=false;\n      return card;\n    });\n    state.initialSnapshot=snapshot();\n    root.classList.add(\"hls-game-active\");\n    root.classList.remove(\"hls-paused\");\n    startOverlay.classList.remove(\"active\");\n    pauseOverlay.classList.remove(\"active\");\n    winOverlay.classList.remove(\"active\");\n    clearSave();\n    saveGame();\n    setStatus(state.mode===\"Classic\" ? \"Classic mode: draw three cards and recycle carefully.\" : \"Relaxed mode: draw one card and play gently.\",1500);\n    playSound(\"draw\");\n    render();\n  }\n  function restartGame(){\n    stopFireworks();\n    if(!state.initialSnapshot) return;\n    state.started=true;\n    state.paused=false;\n    state.won=false;\n    state.undoStack=[];\n    restoreSnapshot(state.initialSnapshot,false);\n    state.startTime=Date.now();\n    root.classList.add(\"hls-game-active\");\n    root.classList.remove(\"hls-paused\");\n    startOverlay.classList.remove(\"active\");\n    pauseOverlay.classList.remove(\"active\");\n    winOverlay.classList.remove(\"active\");\n    setStatus(\"The same deal begins again.\",1200);\n    playSound(\"draw\");\n    saveGame();\n    render();\n  }\n  function suitHTML(suit,small){\n    const info=suitInfo(suit);\n    return '<span class=\"hls-suit-shape hls-suit-'+info.shape+(small?' small':'')+'\" aria-hidden=\"true\"><\/span>';\n  }\n  function createCardEl(card,x,y,loc,z){\n    const el=document.createElement(\"div\");\n    el.className=\"hls-card\";\n    el.dataset.cardId=card.id;\n    el.dataset.loc=loc.type;\n    el.style.left=x+\"px\";\n    el.style.top=y+\"px\";\n    el.style.zIndex=String(z);\n    if(loc.type===\"tableau\"){\n      el.dataset.col=String(loc.col);\n      el.dataset.index=String(loc.index);\n    }else if(loc.type===\"waste\"){\n      el.dataset.index=String(loc.index);\n    }else if(loc.type===\"foundation\"){\n      el.dataset.foundation=String(loc.foundation);\n    }else if(loc.type===\"stock\"){\n      el.dataset.stock=\"1\";\n    }\n    if(!card.faceUp){\n      el.classList.add(\"hls-back\");\n      return el;\n    }\n    el.classList.add(\"suit-\"+card.suit);\n    const label=rankLabel(card.rank);\n    el.innerHTML=\n      '<div class=\"hls-corner\"><div>'+label+'<\/div><div class=\"hls-suit-small\">'+suitHTML(card.suit,true)+'<\/div><\/div>'+\n      '<div class=\"hls-center-suit\">'+suitHTML(card.suit,false)+'<\/div>'+\n      '<div class=\"hls-corner bottom\"><div>'+label+'<\/div><div class=\"hls-suit-small\">'+suitHTML(card.suit,true)+'<\/div><\/div>';\n    if(((__hls_wp_v) => (__hls_wp_v ? (loc.index!==state.waste.length-1) : __hls_wp_v))(loc.type===\"waste\")) el.classList.add(\"hls-not-playable\");\n    if(((__hls_wp_v) => (__hls_wp_v ? (state.selected.stack.some(function(c){return c.id===card.id})) : __hls_wp_v))(state.selected)){\n      el.classList.add(\"hls-selected\");\n      if(((__hls_wp_v) => (__hls_wp_v ? (interaction.drag) : __hls_wp_v))(interaction)) el.classList.add(\"hls-dimmed\");\n    }\n    if(((__hls_wp_v) => (__hls_wp_v ? (state.hintMark.sourceIds.includes(card.id)) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (state.hintMark.sourceIds) : __hls_wp_v))(state.hintMark))){\n      el.classList.add(\"hls-hint-source\");\n    }\n    return el;\n  }\n  function createDropZones(){\n    slotsEl.innerHTML=\"\";\n    zonesEl.innerHTML=\"\";\n    const stock=document.createElement(\"div\");\n    stock.className=\"hls-slot stock-slot hls-drop\";\n    stock.dataset.target=\"stock\";\n    stock.style.left=POS.stock.x+\"px\";\n    stock.style.top=POS.stock.y+\"px\";\n    slotsEl.appendChild(stock);\n\n    const waste=document.createElement(\"div\");\n    waste.className=\"hls-slot hls-drop\";\n    waste.dataset.target=\"waste\";\n    waste.style.left=POS.waste.x+\"px\";\n    waste.style.top=POS.waste.y+\"px\";\n    slotsEl.appendChild(waste);\n\n    POS.foundations.forEach(function(p){\n      const slot=document.createElement(\"div\");\n      slot.className=\"hls-slot hls-drop\";\n      slot.dataset.target=\"foundation\";\n      slot.dataset.index=String(p.index);\n      slot.style.left=p.x+\"px\";\n      slot.style.top=p.y+\"px\";\n      slotsEl.appendChild(slot);\n    });\n\n    POS.tableau.forEach(function(p){\n      const zone=document.createElement(\"div\");\n      zone.className=\"hls-tableau-zone hls-drop\";\n      zone.dataset.target=\"tableau\";\n      zone.dataset.col=String(p.col);\n      zone.style.left=p.x+\"px\";\n      zone.style.top=(p.y-6)+\"px\";\n      zonesEl.appendChild(zone);\n    });\n  }\n  function getFanGap(){\n    const maxLen=Math.max(1,...state.tableau.map(function(col){return col.length}));\n    if(maxLen<=1) return 19;\n    const gap=(MAX_CARD_BOTTOM-TABLEAU_Y-CARD_H)\/(maxLen-1);\n    return Math.max(8,Math.min(19,gap));\n  }\n  function clearGhost(){\n    ghostEl.innerHTML=\"\";\n    ghostEl.style.transform=\"\";\n  }\n  function render(){\n    cardsEl.innerHTML=\"\";\n    clearDropHighlights();\n    if(state.stock.length){\n      const card=cloneCard(state.stock[state.stock.length-1]);\n      card.faceUp=false;\n      cardsEl.appendChild(createCardEl(card,POS.stock.x,POS.stock.y,{type:\"stock\"},40));\n    }\n    const drawCount=MODE[state.mode].draw;\n    const visibleWaste=state.waste.slice(-drawCount);\n    visibleWaste.forEach(function(card,i){\n      const realIndex=state.waste.length-visibleWaste.length+i;\n      const offset=drawCount===3 ? i*28 : 0;\n      cardsEl.appendChild(createCardEl(card,POS.waste.x+offset,POS.waste.y,{type:\"waste\",index:realIndex},60+i));\n    });\n    POS.foundations.forEach(function(p,i){\n      const pile=state.foundations[i];\n      if(pile.length){\n        const card=pile[pile.length-1];\n        cardsEl.appendChild(createCardEl(card,p.x,p.y,{type:\"foundation\",foundation:i},80+i));\n      }\n    });\n    const fan=getFanGap();\n    state.tableau.forEach(function(col,colIndex){\n      const p=POS.tableau[colIndex];\n      col.forEach(function(card,index){\n        const y=TABLEAU_Y+index*fan;\n        cardsEl.appendChild(createCardEl(card,p.x,y,{type:\"tableau\",col:colIndex,index:index},120+colIndex*80+index));\n      });\n    });\n    updateDropHighlights();\n    updateStats();\n  }\n  function clearDropHighlights(){\n    root.querySelectorAll(\".hls-drop\").forEach(function(el){el.classList.remove(\"hls-valid\",\"hls-hint-target\")});\n  }\n  function dropElementForTarget(target){\n    if(!target) return null;\n    if(target.type===\"tableau\") return root.querySelector('.hls-drop[data-target=\"tableau\"][data-col=\"'+target.col+'\"]');\n    if(target.type===\"foundation\") return root.querySelector('.hls-drop[data-target=\"foundation\"][data-index=\"'+target.index+'\"]');\n    return null;\n  }\n  function updateDropHighlights(){\n    clearDropHighlights();\n    if(((__hls_wp_v) => (__hls_wp_v ? (!state.paused) : __hls_wp_v))(state.selected)){\n      getValidTargets(state.selected).forEach(function(target){\n        const el=dropElementForTarget(target);\n        if(el) el.classList.add(\"hls-valid\");\n      });\n    }\n    if(((__hls_wp_v) => (__hls_wp_v ? (!state.paused) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (state.hintMark.target) : __hls_wp_v))(state.hintMark))){\n      const el=dropElementForTarget(state.hintMark.target);\n      if(el) el.classList.add(\"hls-hint-target\");\n    }\n  }\n  function isValidTableauStack(stack){\n    if(!stack || !stack.length) return false;\n    for(let i=0;i<stack.length;i++){\n      if(!stack[i].faceUp) return false;\n    }\n    for(let i=0;i<stack.length-1;i++){\n      const upper=stack[i];\n      const lower=stack[i+1];\n      if(upper.rank!==lower.rank+1) return false;\n      if(cardColor(upper)===cardColor(lower)) return false;\n    }\n    return true;\n  }\n  function sourceFromElement(el){\n    if(!el || !el.classList.contains(\"hls-card\")) return null;\n    const loc=el.dataset.loc;\n    if(loc===\"waste\"){\n      const index=Number(el.dataset.index);\n      if(index!==state.waste.length-1) return null;\n      const card=state.waste[index];\n      if(!card || !card.faceUp) return null;\n      return {source:{type:\"waste\"},stack:[card],index:index};\n    }\n    if(loc===\"tableau\"){\n      const col=Number(el.dataset.col);\n      const index=Number(el.dataset.index);\n      const column=state.tableau[col];\n      const card=column[index];\n      if(!card || !card.faceUp) return null;\n      const stack=column.slice(index);\n      if(!isValidTableauStack(stack)){\n        playSound(\"invalid\");\n        setStatus(\"Only open descending stacks with alternating colors can move.\",1400);\n        return null;\n      }\n      return {source:{type:\"tableau\",col:col},stack:stack,index:index};\n    }\n    if(loc===\"foundation\"){\n      const foundation=Number(el.dataset.foundation);\n      const pile=state.foundations[foundation];\n      if(!pile.length) return null;\n      const card=pile[pile.length-1];\n      return {source:{type:\"foundation\",foundation:foundation},stack:[card],index:pile.length-1};\n    }\n    return null;\n  }\n  function targetFromElement(el){\n    if(!el) return null;\n    const slot=el.closest(\".hls-drop\");\n    if(slot){\n      const target=slot.dataset.target;\n      if(target===\"tableau\") return {type:\"tableau\",col:Number(slot.dataset.col)};\n      if(target===\"foundation\") return {type:\"foundation\",index:Number(slot.dataset.index)};\n      if(target===\"stock\") return {type:\"stock\"};\n      return null;\n    }\n    const card=el.closest(\".hls-card\");\n    if(!card) return null;\n    const loc=card.dataset.loc;\n    if(loc===\"tableau\") return {type:\"tableau\",col:Number(card.dataset.col)};\n    if(loc===\"foundation\") return {type:\"foundation\",index:Number(card.dataset.foundation)};\n    return null;\n  }\n  function canPlaceOnFoundation(card,index){\n    if(!card) return false;\n    const pile=state.foundations[index];\n    if(!pile.length) return card.rank===1;\n    const top=pile[pile.length-1];\n    return ((__hls_wp_v) => (__hls_wp_v ? (card.rank===top.rank+1) : __hls_wp_v))(top.suit===card.suit);\n  }\n  function canPlaceOnTableau(stack,colIndex){\n    if(!stack || !stack.length) return false;\n    const moving=stack[0];\n    const dest=state.tableau[colIndex];\n    if(!dest.length) return true;\n    const top=dest[dest.length-1];\n    if(!top.faceUp) return false;\n    return ((__hls_wp_v) => (__hls_wp_v ? (cardColor(top)!==cardColor(moving)) : __hls_wp_v))(top.rank===moving.rank+1);\n  }\n  function sameSourceTarget(sel,target){\n    if(!sel || !target) return false;\n    if(((__hls_wp_v) => (__hls_wp_v ? (sel.source.col===target.col) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (target.type===\"tableau\") : __hls_wp_v))(sel.source.type===\"tableau\"))) return true;\n    if(((__hls_wp_v) => (__hls_wp_v ? (sel.source.foundation===target.index) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (target.type===\"foundation\") : __hls_wp_v))(sel.source.type===\"foundation\"))) return true;\n    return false;\n  }\n  function canMove(sel,target){\n    if(!sel || !target || !sel.stack.length || state.paused || state.won) return false;\n    if(sameSourceTarget(sel,target)) return false;\n    if(target.type===\"foundation\"){\n      return ((__hls_wp_v) => (__hls_wp_v ? (canPlaceOnFoundation(sel.stack[0],target.index)) : __hls_wp_v))(sel.stack.length===1);\n    }\n    if(target.type===\"tableau\"){\n      return canPlaceOnTableau(sel.stack,target.col);\n    }\n    return false;\n  }\n  function getValidTargets(sel){\n    const targets=[];\n    for(let i=0;i<4;i++){\n      const target={type:\"foundation\",index:i};\n      if(canMove(sel,target)) targets.push(target);\n    }\n    for(let i=0;i<7;i++){\n      const target={type:\"tableau\",col:i};\n      if(canMove(sel,target)) targets.push(target);\n    }\n    return targets;\n  }\n  function removeFromSource(sel){\n    if(sel.source.type===\"waste\"){\n      state.waste.pop();\n      return;\n    }\n    if(sel.source.type===\"foundation\"){\n      state.foundations[sel.source.foundation].pop();\n      return;\n    }\n    if(sel.source.type===\"tableau\"){\n      state.tableau[sel.source.col].splice(sel.index);\n    }\n  }\n  function placeToTarget(sel,target){\n    const stack=sel.stack.map(function(card){\n      card.faceUp=true;\n      return card;\n    });\n    if(target.type===\"foundation\"){\n      state.foundations[target.index].push(stack[0]);\n      state.foundationBonus+=10;\n      return;\n    }\n    if(target.type===\"tableau\"){\n      state.tableau[target.col].push(...stack);\n    }\n  }\n  function revealAfterMove(sel){\n    if(sel.source.type!==\"tableau\") return false;\n    const col=state.tableau[sel.source.col];\n    if(!col.length) return false;\n    const top=col[col.length-1];\n    if(!top.faceUp){\n      top.faceUp=true;\n      state.flipBonus+=5;\n      return true;\n    }\n    return false;\n  }\n  function tryMove(sel,target,quiet){\n    if(!canMove(sel,target)){\n      if(!quiet){\n        playSound(\"invalid\");\n        setStatus(\"That card cannot move there.\",1200);\n      }\n      return false;\n    }\n    pushUndo();\n    removeFromSource(sel);\n    placeToTarget(sel,target);\n    const flipped=revealAfterMove(sel);\n    state.moves++;\n    state.selected=null;\n    state.hintMark=null;\n    interaction=null;\n    clearGhost();\n    if(target.type===\"foundation\") playSound(\"foundation\");\n    else playSound(\"move\");\n    if(flipped) setTimeout(function(){playSound(\"flip\")},90);\n    setStatus(target.type===\"foundation\" ? cardName(sel.stack[0])+\" reached a foundation.\" : cardName(sel.stack[0])+\" found a new place.\",1200);\n    saveGame();\n    render();\n    checkWin();\n    return true;\n  }\n  function drawStock(){\n    if(!state.started || state.paused || state.won) return;\n    if(state.stock.length){\n      pushUndo();\n      const count=Math.min(MODE[state.mode].draw,state.stock.length);\n      for(let i=0;i<count;i++){\n        const card=state.stock.pop();\n        card.faceUp=true;\n        state.waste.push(card);\n      }\n      state.moves++;\n      state.selected=null;\n      state.hintMark=null;\n      playSound(\"draw\");\n      setStatus(count===1 ? \"One card turned from the stock.\" : \"Three cards turned from the stock.\",900);\n      saveGame();\n      render();\n      return;\n    }\n    if(!state.waste.length){\n      playSound(\"invalid\");\n      setStatus(\"No stock cards remain.\",1000);\n      return;\n    }\n    const limit=MODE[state.mode].recycleLimit;\n    if(state.recycleUsed>=limit){\n      playSound(\"invalid\");\n      setStatus(\"No more stock recycles in Classic mode.\",1400);\n      return;\n    }\n    pushUndo();\n    state.recycleUsed++;\n    if(state.mode===\"Classic\") state.recyclePenalty+=50;\n    state.stock=state.waste.reverse().map(function(card){\n      card.faceUp=false;\n      return card;\n    });\n    state.waste=[];\n    state.moves++;\n    state.selected=null;\n    state.hintMark=null;\n    playSound(\"draw\");\n    setStatus(state.mode===\"Classic\" ? \"Waste recycled. Classic recycle penalty applied.\" : \"Waste returned gently to the stock.\",1300);\n    saveGame();\n    render();\n  }\n  function gamePoint(clientX,clientY){\n    const rect=fit.getBoundingClientRect();\n    const scale=rect.width\/BASE_W;\n    return {x:(clientX-rect.left)\/scale,y:(clientY-rect.top)\/scale};\n  }\n  function pointInRect(p,r){return ((__hls_wp_v) => (__hls_wp_v ? (p.y<=r.y+r.h) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (p.y>=r.y) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (p.x<=r.x+r.w) : __hls_wp_v))(p.x>=r.x)))}\n  function targetFromPoint(clientX,clientY){\n    const p=gamePoint(clientX,clientY);\n    for(let i=0;i<POS.foundations.length;i++){\n      if(pointInRect(p,POS.foundations[i])) return {type:\"foundation\",index:i};\n    }\n    for(let i=0;i<POS.tableau.length;i++){\n      const r=POS.tableau[i];\n      const hit={x:r.x-24,y:r.y-34,w:r.w+48,h:326};\n      if(pointInRect(p,hit)) return {type:\"tableau\",col:i};\n    }\n    if(pointInRect(p,POS.stock)) return {type:\"stock\"};\n    return null;\n  }\n  function buildGhost(sel,point){\n    ghostEl.innerHTML=\"\";\n    const fan=Math.min(16,getFanGap());\n    sel.stack.forEach(function(card,i){\n      const el=createCardEl(card,0,i*fan,{type:\"ghost\"},220+i);\n      el.style.left=\"0px\";\n      el.style.top=(i*fan)+\"px\";\n      el.style.pointerEvents=\"none\";\n      ghostEl.appendChild(el);\n    });\n    moveGhost(point);\n  }\n  function moveGhost(point){\n    if(!interaction) return;\n    const fan=Math.min(16,getFanGap());\n    const totalHeight=CARD_H+Math.max(0,interaction.selection.stack.length-1)*fan;\n    const x=point.x-CARD_W\/2;\n    const y=point.y-Math.min(40,totalHeight\/3);\n    ghostEl.style.transform=\"translate(\"+x+\"px, \"+y+\"px)\";\n  }\n  function clearSelection(){\n    state.selected=null;\n    state.hintMark=null;\n    interaction=null;\n    clearGhost();\n    render();\n  }\n  function autoMoveToFoundation(sel){\n    if(!sel || sel.stack.length!==1) return false;\n    for(let i=0;i<4;i++){\n      const target={type:\"foundation\",index:i};\n      if(canMove(sel,target)) return tryMove(sel,target);\n    }\n    playSound(\"invalid\");\n    setStatus(\"That card is not ready for a foundation yet.\",1200);\n    return false;\n  }\n  function handleTapSelection(sel,cardId){\n    const now=Date.now();\n    const isDouble=((__hls_wp_v) => (__hls_wp_v ? (now-lastTap.time<340) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (lastTap.id===cardId) : __hls_wp_v))(sel.stack.length===1));\n    if(isDouble){\n      lastTap={id:\"\",time:0};\n      state.selected=null;\n      autoMoveToFoundation(sel);\n      return;\n    }\n    lastTap={id:cardId,time:now};\n    state.selected=sel;\n    state.hintMark=null;\n    playSound(\"move\");\n    setStatus(\"Tap a valid place, or drag the selected card.\",1200);\n    render();\n  }\n  function onPointerDown(e){\n    if(e.target.closest(\"button\")) return;\n    if(!state.started || state.paused || state.won) return;\n    e.preventDefault();\n    const targetAtStart=targetFromElement(e.target);\n    if(((__hls_wp_v) => (__hls_wp_v ? (targetAtStart.type===\"stock\") : __hls_wp_v))(targetAtStart)){\n      drawStock();\n      return;\n    }\n    if(((__hls_wp_v) => (__hls_wp_v ? (e.pointerId!==undefined) : __hls_wp_v))(cardsEl.setPointerCapture)){\n      try{cardsEl.setPointerCapture(e.pointerId)}catch(err){}\n    }\n    const cardEl=e.target.closest(\".hls-card\");\n    if(!cardEl || !cardsEl.contains(cardEl)){\n      const pointTarget=targetFromPoint(e.clientX,e.clientY);\n      if(((__hls_wp_v) => (__hls_wp_v ? (pointTarget.type===\"stock\") : __hls_wp_v))(pointTarget)){\n        drawStock();\n        return;\n      }\n      if(state.selected){\n        if(((__hls_wp_v) => (__hls_wp_v ? (tryMove(state.selected,pointTarget)) : __hls_wp_v))(pointTarget)) return;\n        clearSelection();\n      }\n      return;\n    }\n    if(cardEl.dataset.loc===\"stock\"){\n      drawStock();\n      return;\n    }\n    if(state.selected){\n      const target=targetFromElement(cardEl);\n      if(((__hls_wp_v) => (__hls_wp_v ? (tryMove(state.selected,target,true)) : __hls_wp_v))(target)) return;\n    }\n    const sel=sourceFromElement(cardEl);\n    if(!sel) return;\n    interaction={\n      selection:sel,\n      startX:e.clientX,\n      startY:e.clientY,\n      cardId:sel.stack[sel.stack.length-1].id,\n      drag:false\n    };\n    window.addEventListener(\"pointermove\",onPointerMove,{passive:false});\n    window.addEventListener(\"pointerup\",onPointerUp,{passive:false,once:true});\n    window.addEventListener(\"pointercancel\",onPointerCancel,{passive:false,once:true});\n  }\n  function onPointerMove(e){\n    if(!interaction || state.paused) return;\n    e.preventDefault();\n    const dx=e.clientX-interaction.startX;\n    const dy=e.clientY-interaction.startY;\n    const dist=Math.sqrt(dx*dx+dy*dy);\n    if(((__hls_wp_v) => (__hls_wp_v ? (dist>7) : __hls_wp_v))(!interaction.drag)){\n      interaction.drag=true;\n      state.selected=interaction.selection;\n      state.hintMark=null;\n      buildGhost(interaction.selection,gamePoint(e.clientX,e.clientY));\n      render();\n    }\n    if(interaction.drag) moveGhost(gamePoint(e.clientX,e.clientY));\n  }\n  function onPointerUp(e){\n    if(!interaction) return;\n    e.preventDefault();\n    window.removeEventListener(\"pointermove\",onPointerMove);\n    window.removeEventListener(\"pointercancel\",onPointerCancel);\n    const wasDrag=interaction.drag;\n    const sel=interaction.selection;\n    const cardId=interaction.cardId;\n    if(wasDrag){\n      const target=targetFromPoint(e.clientX,e.clientY);\n      clearGhost();\n      if(((__hls_wp_v) => (__hls_wp_v ? (tryMove(sel,target)) : __hls_wp_v))(target)){\n        interaction=null;\n        return;\n      }\n      playSound(\"invalid\");\n      setStatus(\"The card slides back to the table.\",900);\n      state.selected=null;\n      interaction=null;\n      render();\n    }else{\n      interaction=null;\n      handleTapSelection(sel,cardId);\n    }\n  }\n  function onPointerCancel(){\n    if(!interaction) return;\n    window.removeEventListener(\"pointermove\",onPointerMove);\n    clearGhost();\n    interaction=null;\n    state.selected=null;\n    render();\n  }\n  function findHint(){\n    const hints=[];\n    function add(sel,target,score,msg){\n      if(canMove(sel,target)) hints.push({sel:sel,target:target,score:score,msg:msg});\n    }\n    const wasteTop=state.waste[state.waste.length-1];\n    if(wasteTop){\n      const sel={source:{type:\"waste\"},stack:[wasteTop],index:state.waste.length-1};\n      for(let i=0;i<4;i++) add(sel,{type:\"foundation\",index:i},130,\"Send \"+cardName(wasteTop)+\" to a foundation.\");\n    }\n    state.tableau.forEach(function(col,c){\n      if(!col.length) return;\n      for(let i=0;i<col.length;i++){\n        const card=col[i];\n        if(!card.faceUp) continue;\n        const stack=col.slice(i);\n        if(!isValidTableauStack(stack)) continue;\n        const sel={source:{type:\"tableau\",col:c},stack:stack,index:i};\n        if(stack.length===1){\n          for(let f=0;f<4;f++) add(sel,{type:\"foundation\",index:f},150,\"Send \"+cardName(card)+\" to a foundation.\");\n        }\n        for(let t=0;t<7;t++){\n          if(t===c) continue;\n          const opensHidden=((__hls_wp_v) => (__hls_wp_v ? (!col[i-1].faceUp) : __hls_wp_v))(i>0);\n          const score=(opensHidden?120:0)+(stack.length>1?18:0)+48;\n          add(sel,{type:\"tableau\",col:t},score,opensHidden ? \"Move this stack to uncover a hidden card.\" : \"Move this stack to improve the tableau.\");\n        }\n      }\n    });\n    if(wasteTop){\n      const sel={source:{type:\"waste\"},stack:[wasteTop],index:state.waste.length-1};\n      for(let t=0;t<7;t++) add(sel,{type:\"tableau\",col:t},62,\"Move \"+cardName(wasteTop)+\" to the tableau.\");\n    }\n    for(let f=0;f<4;f++){\n      const pile=state.foundations[f];\n      if(!pile.length) continue;\n      const card=pile[pile.length-1];\n      const sel={source:{type:\"foundation\",foundation:f},stack:[card],index:pile.length-1};\n      for(let t=0;t<7;t++) add(sel,{type:\"tableau\",col:t},25,\"A foundation card can return to the tableau.\");\n    }\n    if(!hints.length){\n      if(state.stock.length) return {action:\"draw\",msg:\"Draw from the stock.\"};\n      if(((__hls_wp_v) => (__hls_wp_v ? (state.recycleUsed<MODE[state.mode].recycleLimit) : __hls_wp_v))(state.waste.length)) return {action:\"recycle\",msg:\"Recycle the waste pile.\"};\n      return null;\n    }\n    hints.sort(function(a,b){return b.score-a.score});\n    return hints[0];\n  }\n  function useHint(){\n    if(!state.started || state.paused || state.won) return;\n    state.hintCount++;\n    const hint=findHint();\n    if(!hint){\n      playSound(\"invalid\");\n      setStatus(\"No useful move is visible right now.\",1300);\n      updateStats();\n      saveGame();\n      return;\n    }\n    if(hint.action===\"draw\" || hint.action===\"recycle\"){\n      state.hintMark={sourceIds:[],target:null};\n      playSound(\"hint\");\n      setStatus(hint.msg,1500);\n      saveGame();\n      render();\n      return;\n    }\n    state.selected=null;\n    state.hintMark={\n      sourceIds:hint.sel.stack.map(function(c){return c.id}),\n      target:hint.target\n    };\n    playSound(\"hint\");\n    setStatus(hint.msg,1700);\n    saveGame();\n    render();\n    if(hintTimer) clearTimeout(hintTimer);\n    hintTimer=setTimeout(function(){\n      state.hintMark=null;\n      render();\n    },2000);\n  }\n  function undo(){\n    if(!state.undoStack.length || state.paused || state.won) return;\n    const snap=state.undoStack.pop();\n    restoreSnapshot(snap,true);\n    state.started=true;\n    state.paused=false;\n    state.won=false;\n    root.classList.add(\"hls-game-active\");\n    root.classList.remove(\"hls-paused\");\n    playSound(\"undo\");\n    setStatus(\"One step returned to the table.\",1000);\n    saveGame();\n    render();\n  }\n  function checkWin(){\n    if(foundationTotal()!==52) return;\n\n    const finishElapsed=nowElapsed();\n\n    state.won=true;\n    state.paused=false;\n    state.finalElapsed=finishElapsed;\n    state.selected=null;\n    state.hintMark=null;\n    interaction=null;\n    clearGhost();\n\n    const score=calcScore();\n    let best=loadBest();\n    let note=\"A quiet golden finish.\";\n\n    if(score>best.bestScore){\n      best.bestScore=score;\n      note=\"New best score.\";\n    }\n    if(best.bestTime==null || state.finalElapsed<best.bestTime){\n      best.bestTime=state.finalElapsed;\n    }\n    if(best.bestMoves==null || state.moves<best.bestMoves){\n      best.bestMoves=state.moves;\n      note=note===\"A quiet golden finish.\" ? \"New best moves.\" : note+\" New best moves.\";\n    }\n\n    saveBest(best);\n    clearSave();\n\n    winScoreEl.textContent=String(score);\n    winMovesEl.textContent=String(state.moves);\n    winBestEl.textContent=String(best.bestScore||0);\n    winBestMovesEl.textContent=best.bestMoves==null ? \"--\" : String(best.bestMoves);\n    winNoteEl.textContent=note;\n\n    pauseOverlay.classList.remove(\"active\");\n    winOverlay.classList.add(\"active\");\n    root.classList.remove(\"hls-paused\");\n    setStatus(\"Every card has reached its foundation.\");\n    playSound(\"win\");\n    startFireworks();\n    render();\n  }\n  function togglePause(){\n    if(!state.started || state.won) return;\n    if(!state.paused){\n      state.paused=true;\n      state.pausedAt=Date.now();\n      state.selected=null;\n      state.hintMark=null;\n      interaction=null;\n      clearGhost();\n      pauseOverlay.classList.add(\"active\");\n      root.classList.add(\"hls-paused\");\n      setStatus(\"The warm table is paused.\");\n      playSound(\"pause\");\n      saveGame();\n    }else{\n      const duration=Date.now()-state.pausedAt;\n      state.startTime+=duration;\n      state.paused=false;\n      state.pausedAt=0;\n      pauseOverlay.classList.remove(\"active\");\n      root.classList.remove(\"hls-paused\");\n      setStatus(\"The cards are moving again.\",900);\n      playSound(\"resume\");\n    }\n    render();\n  }\n  function saveAndReturnStart(){\n    if(!state.started) return;\n    saveGame();\n    state.paused=true;\n    state.pausedAt=Date.now();\n    startOverlay.classList.add(\"active\");\n    pauseOverlay.classList.remove(\"active\");\n    root.classList.add(\"hls-paused\");\n    updateContinueButton();\n    playSound(\"save\");\n    setStatus(\"Game saved. Continue will be available from the start panel.\",1500);\n    render();\n  }\n  function setMode(mode){\n    state.mode=mode;\n    updateModeButtons();\n    setStatus(mode===\"Classic\" ? \"Classic selected: draw three, limited recycle.\" : \"Relaxed selected: draw one, unlimited recycle.\",1000);\n    playSound(\"move\");\n  }\n  function updateModeButtons(){\n    root.querySelectorAll(\".hls-mode-btn\").forEach(function(btn){\n      const active=btn.dataset.mode===state.mode;\n      btn.classList.toggle(\"active\",active);\n      btn.setAttribute(\"aria-pressed\",active?\"true\":\"false\");\n    });\n  }\n  async function toggleFullscreen(){\n    try{\n      if(!document.fullscreenElement){\n        await root.requestFullscreen();\n        if(((__hls_wp_v) => (__hls_wp_v ? (screen.orientation.lock) : __hls_wp_v))(screen.orientation)){\n          try{await screen.orientation.lock(\"landscape\")}catch(err){}\n        }\n      }else{\n        if(((__hls_wp_v) => (__hls_wp_v ? (screen.orientation.unlock) : __hls_wp_v))(screen.orientation)){\n          try{screen.orientation.unlock()}catch(err){}\n        }\n        await document.exitFullscreen();\n      }\n    }catch(err){\n      setStatus(\"Fullscreen is not available in this browser.\",1500);\n    }\n    resizeGame();\n  }\n  function resizeGame(){\n    const w=root.clientWidth;\n    const h=root.clientHeight;\n    const scale=Math.min(w\/BASE_W,h\/BASE_H);\n    const left=(w-BASE_W*scale)\/2;\n    const top=(h-BASE_H*scale)\/2;\n    fit.style.left=left+\"px\";\n    fit.style.top=top+\"px\";\n    fit.style.transform=\"scale(\"+scale+\")\";\n    const isFs=document.fullscreenElement===root;\n    root.classList.toggle(\"hls-is-fullscreen\",isFs);\n    root.classList.toggle(\"hls-portrait-fullscreen\",((__hls_wp_v) => (__hls_wp_v ? (window.innerHeight>window.innerWidth) : __hls_wp_v))(isFs));\n  }\n  function updateMuteButton(){\n    muteBtn.setAttribute(\"aria-label\",state.muted?\"Muted\":\"Sound\");\n    root.classList.toggle(\"hls-muted\",state.muted);\n  }\n  function bindEvents(){\n    cardsEl.addEventListener(\"pointerdown\",onPointerDown,{passive:false});\n    cardsEl.addEventListener(\"touchstart\",function(e){e.preventDefault()},{passive:false});\n    slotsEl.addEventListener(\"pointerdown\",function(e){\n      if(!state.started || state.paused || state.won) return;\n      const target=targetFromElement(e.target);\n      if(((__hls_wp_v) => (__hls_wp_v ? (target.type===\"stock\") : __hls_wp_v))(target)){\n        e.preventDefault();\n        drawStock();\n        return;\n      }\n      if(((__hls_wp_v) => (__hls_wp_v ? (target.type===\"foundation\" || target.type===\"tableau\") : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (target) : __hls_wp_v))(state.selected))){\n        e.preventDefault();\n        tryMove(state.selected,target);\n      }\n    },{passive:false});\n    zonesEl.addEventListener(\"pointerdown\",function(e){\n      if(!state.started || state.paused || state.won || !state.selected) return;\n      const target=targetFromElement(e.target);\n      if(((__hls_wp_v) => (__hls_wp_v ? (target.type===\"tableau\") : __hls_wp_v))(target)){\n        e.preventDefault();\n        tryMove(state.selected,target);\n      }\n    },{passive:false});\n    root.querySelectorAll(\".hls-mode-btn\").forEach(function(btn){\n      btn.addEventListener(\"click\",function(){setMode(btn.dataset.mode)});\n    });\n    startBtn.addEventListener(\"click\",function(){startNewGame(state.mode)});\n    continueBtn.addEventListener(\"click\",continueGame);\n    resumeBtn.addEventListener(\"click\",togglePause);\n    saveBtn.addEventListener(\"click\",saveAndReturnStart);\n    pauseNewBtn.addEventListener(\"click\",function(){startNewGame(state.mode)});\n    playAgainBtn.addEventListener(\"click\",function(){startNewGame(state.mode)});\n    newGameBtn.addEventListener(\"click\",function(){startNewGame(state.mode)});\n    restartBtn.addEventListener(\"click\",restartGame);\n    undoBtn.addEventListener(\"click\",undo);\n    hintBtn.addEventListener(\"click\",useHint);\n    pauseBtn.addEventListener(\"click\",togglePause);\n    fullscreenBtn.addEventListener(\"click\",toggleFullscreen);\n    muteBtn.addEventListener(\"click\",function(){\n      state.muted=!state.muted;\n      hlsStorageSet(MUTE_KEY,state.muted?\"1\":\"0\");\n      updateMuteButton();\n      if(!state.muted) playSound(\"move\");\n    });\n    document.addEventListener(\"fullscreenchange\",function(){\n      resizeGame();\n      resizeFireworksCanvas();\n    });\n    window.addEventListener(\"resize\",function(){\n      resizeGame();\n      resizeFireworksCanvas();\n    });\n    window.addEventListener(\"orientationchange\",function(){\n      setTimeout(function(){\n        resizeGame();\n        resizeFireworksCanvas();\n      },220);\n    });\n    window.addEventListener(\"beforeunload\",function(){\n      if(((__hls_wp_v) => (__hls_wp_v ? (!state.won) : __hls_wp_v))(state.started)) saveGame();\n    });\n    document.addEventListener(\"visibilitychange\",function(){\n      if(((__hls_wp_v) => (__hls_wp_v ? (!state.won) : __hls_wp_v))(((__hls_wp_v) => (__hls_wp_v ? (state.started) : __hls_wp_v))(document.hidden))) saveGame();\n    });\n    setInterval(updateStats,500);\n  }\n  function initEmpty(){\n    stopFireworks();\n    state.stock=[];\n    state.waste=[];\n    state.foundations=[[],[],[],[]];\n    state.tableau=Array.from({length:7},function(){return []});\n    render();\n  }\n\n  createDropZones();\n  bindEvents();\n  updateMuteButton();\n  updateModeButtons();\n  updateContinueButton();\n  initEmpty();\n  resizeGame();\n  resizeFireworksCanvas();\n  updateStats();\n\n  }\n  if(document.readyState === \"loading\"){\n    document.addEventListener(\"DOMContentLoaded\", initializeHoneyLibrarySolitaire, {once:true});\n  }else{\n    initializeHoneyLibrarySolitaire();\n  }\n})();\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\">Why This Game Feels Special<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Honey Library Solitaire is made for players who enjoy calm strategy rather than rushing. The game invites you to slow down, read the board, notice small opportunities, and enjoy the satisfaction of clearing the table one card at a time. The golden-brown palette, soft card backs, honey-like glow, and quiet library atmosphere make it feel cozy without becoming sleepy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is easy to understand, but still thoughtful enough to keep every round interesting. Some deals open smoothly, while others ask you to plan ahead, use undo wisely, and decide when to draw from the stock. That little balance between comfort and challenge is what gives the game its charm.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best For<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This game is perfect for casual players, solitaire lovers, puzzle fans, and anyone who wants a relaxing card game that can be played in short breaks. Whether you are taking a quiet pause between tasks or spending a slower evening with a cozy browser game, Honey Library Solitaire offers a gentle little table where every card has a place to return to.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Honey Library Solitaire is a warm, storybook-inspired card game that brings the familiar comfort of solitaire into a quiet golden library filled with honey tones, soft shadows, and charming hand-crafted card symbols. Instead of feeling cold or mechanical, every move feels like arranging old cards on a wooden reading table while the room glows gently &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-68","post","type-post","status-publish","format-standard","hentry","category-card"],"_links":{"self":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/68","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=68"}],"version-history":[{"count":0,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/68\/revisions"}],"wp:attachment":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=68"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=68"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=68"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}