{"id":31,"date":"2026-10-27T23:17:10","date_gmt":"2026-10-27T23:17:10","guid":{"rendered":"https:\/\/apk.produsenpagarbrc.com\/?p=31"},"modified":"2026-10-27T23:17:10","modified_gmt":"2026-10-27T23:17:10","slug":"goldenquill-solitaire","status":"publish","type":"post","link":"https:\/\/play.produsenpagarbrc.com\/?p=31","title":{"rendered":"Goldenquill Solitaire"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Goldenquill Solitaire<\/strong> is a warm and thoughtfully designed Klondike solitaire game set inside the oldest card room of the Honey Library. Across a walnut table illuminated by amber lamps, players arrange parchment cards, uncover hidden archive records, and guide four enchanted suits toward their proper foundations. Every move feels like part of a quiet restoration ritual, where patience, observation, and careful planning are needed to return an ancient collection to order.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The game preserves the familiar rules of classic Klondike solitaire while surrounding them with a cozy Honey Library atmosphere. Seven tableau columns form the heart of the game, while a stock pile, waste pile, and four foundation spaces provide the structure needed to organize the entire deck. Cards must be arranged in descending order with alternating colors on the tableau, while each foundation must be built upward from Ace to King using cards of the same suit.<\/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\/Goldenquill-Solitaire-1024x768.png\" alt=\"\" class=\"wp-image-32\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">The Forgotten Goldenquill Catalogue<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Long ago, the Honey Library maintained a special catalogue known as the Goldenquill Register. It recorded every book, letter, recipe, map, and field journal stored within the library\u2019s endless shelves. The register was not written as a normal list. Instead, its records were preserved inside a magical deck of fifty-two archive cards.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each suit represented one part of the library. Bee Seals protected official records and royal correspondence. Honey Drops marked recipes, apothecary notes, and culinary journals. Library Leaves represented botanical studies, woodland maps, and natural histories. Golden Bookmarks guarded stories, poems, and unfinished manuscripts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For generations, the deck remained safely arranged inside the Goldenquill card room. Then, during a long winter evening, a strong draft entered through an old reading-room window. The cards scattered across the archive table, several were turned face down, and the carefully ordered foundations collapsed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without the completed register, librarians could no longer find the books connected to each card. Some titles vanished from shelf labels. Several stories lost their final chapters. Even the library\u2019s warm amber lamps began to dim.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The player takes the role of the new Goldenquill Keeper, entrusted with restoring the deck. Every card moved into place repairs another part of the catalogue. Every hidden card revealed uncovers a forgotten record. Completing all four foundations restores the library\u2019s memory and allows the lost books to return to their shelves.<\/p>\n\n\n\n<div id=\"goldenquill-solitaire\" aria-label=\"Goldenquill Solitaire, a Honey Library card game\">\n<style>\nhtml.gqs-page-lock,\nbody.gqs-page-lock {\n  overflow: hidden !important;\n  overscroll-behavior: none;\n}\n\n#goldenquill-solitaire,\n#goldenquill-solitaire * {\n  box-sizing: border-box;\n}\n\n#goldenquill-solitaire {\n  --gqs-card-w: 96px;\n  --gqs-card-h: 132px;\n  --gqs-ink: #2f1c13;\n  --gqs-cocoa: #3f2418;\n  --gqs-walnut: #5a321f;\n  --gqs-amber: #b87333;\n  --gqs-honey: #f4c542;\n  --gqs-soft-gold: #e6c773;\n  --gqs-cream: #fff1c9;\n  --gqs-paper: #fff8df;\n  --gqs-olive: #68784f;\n  --gqs-copper: #a45f43;\n  --gqs-error: #b85f4f;\n  position: relative;\n  width: min(100%, 1120px);\n  aspect-ratio: 16 \/ 9;\n  margin: 18px auto;\n  overflow: hidden;\n  border: 1px solid rgba(244, 197, 66, .44);\n  border-radius: 20px;\n  color: var(--gqs-cream);\n  background: linear-gradient(180deg, #26140d, #4a291a 57%, #1f110c);\n  box-shadow: 0 24px 62px rgba(43, 22, 12, .36), inset 0 1px 0 rgba(255, 241, 201, .12);\n  font-family: Arial, Helvetica, sans-serif;\n  line-height: 1.25;\n  isolation: isolate;\n  user-select: none;\n  -webkit-user-select: none;\n  -webkit-tap-highlight-color: transparent;\n  touch-action: none;\n  overscroll-behavior: none;\n}\n\n#goldenquill-solitaire button {\n  margin: 0;\n  appearance: none;\n  -webkit-appearance: none;\n  border: 0;\n  font: inherit;\n}\n\n#goldenquill-solitaire button,\n#goldenquill-solitaire [role=\"button\"],\n#goldenquill-solitaire .gqs-card,\n#goldenquill-solitaire .gqs-slot,\n#goldenquill-solitaire .gqs-tableau-zone {\n  outline: none;\n}\n\n#goldenquill-solitaire button:focus-visible,\n#goldenquill-solitaire .gqs-card:focus-visible,\n#goldenquill-solitaire .gqs-slot:focus-visible,\n#goldenquill-solitaire .gqs-tableau-zone:focus-visible {\n  box-shadow: 0 0 0 3px var(--gqs-paper), 0 0 0 6px rgba(244, 197, 66, .56), 0 14px 28px rgba(45, 23, 12, .35);\n}\n\n#goldenquill-solitaire:fullscreen,\n#goldenquill-solitaire:-webkit-full-screen,\n#goldenquill-solitaire.gqs-is-fullscreen,\n#goldenquill-solitaire.gqs-fallback-fullscreen {\n  width: 100vw;\n  width: 100dvw;\n  max-width: none;\n  height: 100vh;\n  height: 100dvh;\n  margin: 0;\n  border: 0;\n  border-radius: 0;\n  background:\n    radial-gradient(circle at 50% 14%, rgba(244, 197, 66, .12), transparent 34%),\n    linear-gradient(160deg, #1c0f0a, #402317 58%, #20110b);\n}\n\n#goldenquill-solitaire.gqs-fallback-fullscreen {\n  position: fixed;\n  inset: 0;\n  z-index: 2147483647;\n}\n\n#goldenquill-solitaire .gqs-fit {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1280px;\n  height: 720px;\n  overflow: hidden;\n  border-radius: 20px;\n  transform-origin: 0 0;\n  background: linear-gradient(180deg, #2d180f 0%, #53301f 56%, #21120c 100%);\n}\n\n#goldenquill-solitaire.gqs-is-fullscreen .gqs-fit,\n#goldenquill-solitaire.gqs-fallback-fullscreen .gqs-fit {\n  border-radius: 0;\n}\n\n\/* Honey Library room *\/\n#goldenquill-solitaire .gqs-library-scene {\n  position: absolute;\n  inset: 0;\n  z-index: 0;\n  overflow: hidden;\n  pointer-events: none;\n  background:\n    radial-gradient(circle at 50% -4%, rgba(255, 241, 201, .22), transparent 31%),\n    radial-gradient(circle at 13% 28%, rgba(244, 197, 66, .14), transparent 24%),\n    radial-gradient(circle at 87% 28%, rgba(184, 115, 51, .14), transparent 23%),\n    linear-gradient(180deg, #2b170f 0%, #51301f 58%, #21120c 100%);\n}\n\n#goldenquill-solitaire .gqs-library-scene::before {\n  content: \"\";\n  position: absolute;\n  left: 250px;\n  right: 250px;\n  top: 24px;\n  height: 135px;\n  border: 7px solid rgba(230, 199, 115, .52);\n  border-radius: 34px 34px 18px 18px;\n  background:\n    linear-gradient(90deg, rgba(255,255,255,.07), transparent 24%, rgba(255,255,255,.06) 48%, transparent 70%),\n    repeating-linear-gradient(90deg, #49301f 0 82px, #2f1e15 82px 88px),\n    repeating-linear-gradient(0deg, rgba(255,241,201,.07) 0 3px, transparent 3px 34px),\n    linear-gradient(180deg, #5c3b25, #3a2418);\n  box-shadow: inset 0 0 0 3px rgba(255, 241, 201, .11), 0 14px 30px rgba(30, 14, 8, .30);\n}\n\n#goldenquill-solitaire .gqs-library-scene::after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  height: 150px;\n  border-top: 5px solid rgba(104, 58, 34, .96);\n  background:\n    repeating-linear-gradient(90deg, rgba(255,255,255,.025) 0 2px, transparent 2px 114px),\n    linear-gradient(180deg, #5a3521, #25140d);\n  box-shadow: inset 0 18px 34px rgba(31, 15, 8, .30), 0 -14px 30px rgba(244,197,66,.06);\n}\n\n#goldenquill-solitaire .gqs-amber-window {\n  position: absolute;\n  right: 78px;\n  top: 42px;\n  width: 126px;\n  height: 126px;\n  border: 7px solid rgba(230, 199, 115, .52);\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 50% 42%, #fff8df 0 25px, #f4c542 26px 39px, transparent 40px),\n    linear-gradient(90deg, transparent 47%, rgba(76,43,25,.55) 48% 52%, transparent 53%),\n    linear-gradient(0deg, transparent 47%, rgba(76,43,25,.55) 48% 52%, transparent 53%),\n    linear-gradient(180deg, #b56d2c, #6e4023);\n  box-shadow: inset 0 0 0 3px rgba(255,241,201,.15), 0 13px 26px rgba(31,15,8,.30), 0 0 28px rgba(244,197,66,.15);\n}\n\n#goldenquill-solitaire .gqs-hanging-bookmarks {\n  position: absolute;\n  left: 52px;\n  right: 52px;\n  top: 18px;\n  height: 88px;\n  border-top: 2px solid rgba(230,199,115,.46);\n  border-radius: 50%;\n  opacity: .9;\n}\n\n#goldenquill-solitaire .gqs-hanging-bookmarks::before {\n  content: \"\";\n  position: absolute;\n  inset: -3px 0 0;\n  background:\n    linear-gradient(#d5a42d,#d5a42d) 8% 12px \/ 4px 44px no-repeat,\n    linear-gradient(#d5a42d,#d5a42d) 24% 8px \/ 4px 53px no-repeat,\n    linear-gradient(#d5a42d,#d5a42d) 40% 14px \/ 4px 46px no-repeat,\n    linear-gradient(#d5a42d,#d5a42d) 58% 9px \/ 4px 52px no-repeat,\n    linear-gradient(#d5a42d,#d5a42d) 74% 14px \/ 4px 44px no-repeat,\n    linear-gradient(#d5a42d,#d5a42d) 90% 10px \/ 4px 50px no-repeat,\n    radial-gradient(ellipse at 8% 66%, #f4c542 0 8px, transparent 9px),\n    radial-gradient(ellipse at 24% 72%, #e9bd44 0 8px, transparent 9px),\n    radial-gradient(ellipse at 40% 66%, #f4c542 0 8px, transparent 9px),\n    radial-gradient(ellipse at 58% 72%, #e9bd44 0 8px, transparent 9px),\n    radial-gradient(ellipse at 74% 66%, #f4c542 0 8px, transparent 9px),\n    radial-gradient(ellipse at 90% 72%, #e9bd44 0 8px, transparent 9px);\n  filter: drop-shadow(0 5px 8px rgba(103,59,28,.28));\n}\n\n#goldenquill-solitaire .gqs-golden-dust {\n  position: absolute;\n  inset: 116px 0 0;\n  opacity: .7;\n  background:\n    radial-gradient(circle at 5% 30%, #fff1c9 0 2px, transparent 4px),\n    radial-gradient(circle at 16% 72%, #f4c542 0 2px, transparent 4px),\n    radial-gradient(circle at 29% 44%, #fff1c9 0 2px, transparent 4px),\n    radial-gradient(circle at 43% 82%, #e6c773 0 2px, transparent 4px),\n    radial-gradient(circle at 57% 37%, #fff8df 0 2px, transparent 4px),\n    radial-gradient(circle at 69% 69%, #f4c542 0 2px, transparent 4px),\n    radial-gradient(circle at 82% 41%, #fff1c9 0 2px, transparent 4px),\n    radial-gradient(circle at 94% 74%, #e6c773 0 2px, transparent 4px);\n  animation: gqsDustDrift 3.8s ease-in-out infinite alternate;\n}\n\n@keyframes gqsDustDrift {\n  from { opacity: .34; transform: translateY(0); }\n  to { opacity: .82; transform: translateY(-7px); filter: drop-shadow(0 0 7px rgba(244,197,66,.42)); }\n}\n\n#goldenquill-solitaire .gqs-book-shelf,\n#goldenquill-solitaire .gqs-book-stack,\n#goldenquill-solitaire .gqs-reading-desk,\n#goldenquill-solitaire .gqs-honey-jar {\n  position: absolute;\n  z-index: 1;\n}\n\n#goldenquill-solitaire .gqs-book-shelf {\n  bottom: 38px;\n  width: 158px;\n  height: 118px;\n  border: 5px solid #301a11;\n  border-radius: 14px 14px 22px 22px;\n  background:\n    repeating-linear-gradient(0deg, rgba(34,17,9,.25) 0 5px, transparent 5px 17px),\n    linear-gradient(135deg, #754827, #3d2417);\n  box-shadow: 0 15px 24px rgba(27,13,7,.34), inset 0 5px 0 rgba(255,241,201,.06);\n}\n\n#goldenquill-solitaire .gqs-book-shelf::before {\n  content: \"\";\n  position: absolute;\n  inset: 15px 12px 18px;\n  background:\n    linear-gradient(90deg,\n      #6c774f 0 18px, transparent 18px 24px,\n      #a45f43 24px 44px, transparent 44px 50px,\n      #d39e2d 50px 67px, transparent 67px 73px,\n      #4f643c 73px 92px, transparent 92px 98px,\n      #8b4d33 98px 120px);\n  border-bottom: 8px solid rgba(46,26,17,.8);\n  box-shadow: inset 0 0 0 2px rgba(255,241,201,.08);\n}\n\n#goldenquill-solitaire .gqs-book-shelf.left { left: 22px; }\n#goldenquill-solitaire .gqs-book-shelf.right { right: 24px; transform: scale(.94); }\n\n#goldenquill-solitaire .gqs-reading-desk {\n  left: 188px;\n  bottom: 42px;\n  width: 184px;\n  height: 48px;\n  border: 4px solid #351d13;\n  border-radius: 16px;\n  background: linear-gradient(180deg, #8a5530, #4a2a1b);\n  box-shadow: 0 10px 19px rgba(25,12,7,.32);\n}\n\n#goldenquill-solitaire .gqs-reading-desk::before {\n  content: \"\";\n  position: absolute;\n  left: 34px;\n  bottom: 18px;\n  width: 112px;\n  height: 68px;\n  border: 4px solid rgba(230,199,115,.52);\n  border-radius: 10px 10px 22px 22px;\n  background:\n    linear-gradient(90deg, transparent 48%, rgba(90,50,31,.22) 49% 51%, transparent 52%),\n    repeating-linear-gradient(0deg, transparent 0 11px, rgba(90,50,31,.10) 11px 12px),\n    linear-gradient(180deg, #fff8df, #f0dba6);\n  box-shadow: 0 0 20px rgba(244,197,66,.16);\n}\n\n#goldenquill-solitaire .gqs-honey-jar {\n  right: 208px;\n  bottom: 43px;\n  width: 112px;\n  height: 66px;\n  border: 4px solid #3b2115;\n  border-radius: 15px 15px 30px 30px;\n  background:\n    radial-gradient(circle at 34% 24%, rgba(255,255,255,.58) 0 7px, transparent 8px),\n    linear-gradient(180deg, #fff1c9 0 12%, #f4c542 13% 60%, #b87333 61% 100%);\n  box-shadow: 0 10px 18px rgba(26,12,7,.30), inset 0 0 0 3px rgba(255,241,201,.20);\n}\n\n#goldenquill-solitaire .gqs-book-stack {\n  right: 342px;\n  bottom: 44px;\n  width: 76px;\n  height: 82px;\n  filter: drop-shadow(0 8px 14px rgba(43,22,12,.38));\n}\n\n#goldenquill-solitaire .gqs-book-stack::before,\n#goldenquill-solitaire .gqs-book-stack::after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  right: 0;\n  border: 3px solid #3b2115;\n  border-radius: 8px;\n}\n\n#goldenquill-solitaire .gqs-book-stack::before {\n  bottom: 0;\n  height: 34px;\n  background: linear-gradient(180deg, #7a4a2a, #4d2c1c);\n  box-shadow: 6px -30px 0 -2px #68784f, -4px -57px 0 -4px #a45f43;\n}\n\n#goldenquill-solitaire .gqs-book-stack::after {\n  bottom: 16px;\n  height: 7px;\n  border-width: 0;\n  background: #e6c773;\n  box-shadow: 7px -29px 0 #fff1c9, -3px -56px 0 #e6c773;\n}\n\n#goldenquill-solitaire .gqs-playfield {\n  position: absolute;\n  left: 66px;\n  top: 74px;\n  width: 1148px;\n  height: 570px;\n  border: 3px solid rgba(230,199,115,.56);\n  border-radius: 24px;\n  background:\n    radial-gradient(circle at 24px 24px, rgba(244,197,66,.10) 0 4px, transparent 5px) 0 0 \/ 96px 96px,\n    repeating-linear-gradient(90deg, rgba(255,241,201,.038) 0 1px, transparent 1px 92px),\n    repeating-linear-gradient(0deg, rgba(255,241,201,.028) 0 1px, transparent 1px 72px),\n    linear-gradient(145deg, rgba(91,51,30,.93), rgba(61,34,22,.95) 58%, rgba(35,18,12,.94));\n  box-shadow:\n    0 0 0 5px rgba(255,241,201,.08),\n    0 0 0 9px rgba(105,60,34,.34),\n    0 26px 48px rgba(24,11,6,.38),\n    inset 0 1px 0 rgba(255,241,201,.08);\n  backdrop-filter: blur(3px);\n}\n\n#goldenquill-solitaire .gqs-playfield::before {\n  content: \"\";\n  position: absolute;\n  inset: 15px;\n  border: 1px solid rgba(230,199,115,.25);\n  border-radius: 18px;\n  pointer-events: none;\n}\n\n#goldenquill-solitaire .gqs-playfield::after {\n  content: \"\";\n  position: absolute;\n  left: 50%;\n  bottom: 8px;\n  width: 250px;\n  height: 7px;\n  transform: translateX(-50%);\n  border-radius: 999px;\n  background: linear-gradient(90deg, transparent, #a45f43, #f4c542, #fff1c9, #f4c542, #a45f43, transparent);\n  opacity: .5;\n}\n\n#goldenquill-solitaire .gqs-icon {\n  position: absolute;\n  top: 18px;\n  z-index: 280;\n  display: grid;\n  width: 48px;\n  height: 48px;\n  place-items: center;\n  border: 1px solid rgba(255,241,201,.72);\n  border-radius: 14px;\n  color: var(--gqs-cream);\n  background:\n    radial-gradient(circle at 28% 20%, rgba(255,255,255,.14), transparent 34%),\n    linear-gradient(180deg, #8d582f, #4d2b1c);\n  box-shadow: 0 7px 0 #2f190f, 0 13px 24px rgba(24,11,6,.34), inset 0 1px 0 rgba(255,241,201,.14);\n  cursor: pointer;\n  transition: transform .12s ease, filter .12s ease, box-shadow .12s ease, opacity .14s ease, visibility .14s ease;\n}\n\n#goldenquill-solitaire .gqs-icon:hover,\n#goldenquill-solitaire .gqs-icon:focus-visible {\n  transform: translateY(-2px);\n  filter: brightness(1.08);\n  box-shadow: 0 9px 0 #2f190f, 0 17px 28px rgba(24,11,6,.38), 0 0 0 3px rgba(244,197,66,.20);\n}\n#goldenquill-solitaire .gqs-icon:active { transform: translateY(3px); box-shadow: 0 3px 0 #2f190f, 0 7px 14px rgba(24,11,6,.28); }\n\n#goldenquill-solitaire .gqs-pause { left: 22px; display: none; }\n#goldenquill-solitaire .gqs-mute { left: 78px; display: none; }\n#goldenquill-solitaire.gqs-game-active .gqs-pause,\n#goldenquill-solitaire.gqs-game-active .gqs-mute { display: grid; }\n#goldenquill-solitaire.gqs-paused .gqs-pause,\n#goldenquill-solitaire.gqs-paused .gqs-mute { opacity: 0; visibility: hidden; pointer-events: none; }\n#goldenquill-solitaire .gqs-fullscreen { right: 22px; display: grid; z-index: 1001; }\n\n#goldenquill-solitaire .gqs-pause-symbol { position: relative; display: block; width: 22px; height: 22px; }\n#goldenquill-solitaire .gqs-pause-symbol::before,\n#goldenquill-solitaire .gqs-pause-symbol::after { content: \"\"; position: absolute; top: 3px; width: 6px; height: 16px; border-radius: 3px; background: currentColor; }\n#goldenquill-solitaire .gqs-pause-symbol::before { left: 4px; }\n#goldenquill-solitaire .gqs-pause-symbol::after { right: 4px; }\n\n#goldenquill-solitaire .gqs-sound-symbol { position: relative; display: block; width: 31px; height: 28px; color: currentColor; transform: scale(.86) translateX(-1px); }\n#goldenquill-solitaire .gqs-sound-box { position: absolute; left: 1px; top: 10px; width: 8px; height: 9px; border-radius: 3px 0 0 3px; background: currentColor; }\n#goldenquill-solitaire .gqs-sound-box::after { content: \"\"; position: absolute; left: 7px; top: -8px; width: 18px; height: 25px; border-radius: 3px; background: currentColor; clip-path: polygon(0 35%,100% 0,100% 100%,0 65%); }\n#goldenquill-solitaire .gqs-sound-wave { position: absolute; display: block; border-style: solid; border-color: currentColor; border-left-color: transparent; border-top-color: transparent; border-bottom-color: transparent; border-radius: 0 999px 999px 0; background: transparent; transition: opacity .14s ease; }\n#goldenquill-solitaire .gqs-sound-wave.w1 { left: 19px; top: 10px; width: 6px; height: 9px; border-width: 3px; }\n#goldenquill-solitaire .gqs-sound-wave.w2 { left: 22px; top: 6px; width: 11px; height: 17px; border-width: 3px; }\n#goldenquill-solitaire .gqs-sound-wave.w3 { left: 25px; top: 2px; width: 16px; height: 25px; border-width: 3px; opacity: .92; }\n#goldenquill-solitaire.gqs-muted .gqs-sound-wave { opacity: 0; }\n#goldenquill-solitaire .gqs-sound-slash { position: absolute; left: -1px; top: 13px; width: 34px; height: 3.5px; border-radius: 999px; background: var(--gqs-error); transform: rotate(45deg) scaleX(0); transform-origin: center; box-shadow: 0 0 8px rgba(184,95,79,.42); transition: transform .14s ease; }\n#goldenquill-solitaire.gqs-muted .gqs-sound-slash { transform: rotate(45deg) scaleX(1); }\n\n#goldenquill-solitaire .gqs-full-symbol { position: relative; display: block; width: 30px; height: 30px; }\n#goldenquill-solitaire .gqs-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\n#goldenquill-solitaire .gqs-stats {\n  position: absolute;\n  left: 50%;\n  top: 22px;\n  z-index: 84;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  transform: translateX(-50%);\n}\n\n#goldenquill-solitaire .gqs-stat {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-width: 126px;\n  height: 39px;\n  padding: 0 14px;\n  gap: 8px;\n  border: 1px solid rgba(120,68,37,.38);\n  border-radius: 12px;\n  color: #412619;\n  background: linear-gradient(180deg, #fff8df, #ecd59d);\n  box-shadow: 0 6px 0 #9c682f, 0 11px 19px rgba(28,13,7,.26), inset 0 1px 0 rgba(255,255,255,.58);\n  font-size: 13px;\n  font-weight: 850;\n}\n\n#goldenquill-solitaire .gqs-stat::before,\n#goldenquill-solitaire .gqs-stat::after { content: \"\"; position: absolute; top: 50%; width: 8px; height: 18px; border-radius: 50%; background: rgba(130,79,39,.22); transform: translateY(-50%); }\n#goldenquill-solitaire .gqs-stat::before { left: -5px; }\n#goldenquill-solitaire .gqs-stat::after { right: -5px; }\n#goldenquill-solitaire .gqs-stat b { min-width: 30px; color: #2f1c13; font-size: 16px; font-weight: 950; text-align: right; }\n\n#goldenquill-solitaire .gqs-slots,\n#goldenquill-solitaire .gqs-tableau-zones,\n#goldenquill-solitaire .gqs-card-layer,\n#goldenquill-solitaire .gqs-ghost-layer { position: absolute; inset: 0; z-index: 14; pointer-events: none; }\n#goldenquill-solitaire .gqs-tableau-zones { pointer-events: auto; }\n#goldenquill-solitaire .gqs-card-layer { z-index: 24; pointer-events: auto; touch-action: none; }\n#goldenquill-solitaire .gqs-ghost-layer { z-index: 160; }\n\n#goldenquill-solitaire .gqs-slot,\n#goldenquill-solitaire .gqs-tableau-zone {\n  position: absolute;\n  width: calc(var(--gqs-card-w) + 12px);\n  height: var(--gqs-card-h);\n  transform: translateX(-6px);\n  border: 1px solid rgba(230,199,115,.46);\n  border-radius: 15px;\n  background:\n    repeating-linear-gradient(45deg, rgba(255,241,201,.025) 0 4px, transparent 4px 10px),\n    linear-gradient(180deg, rgba(244,197,66,.10), rgba(38,19,12,.16));\n  box-shadow: inset 0 1px 0 rgba(255,241,201,.06), 0 6px 14px rgba(28,13,7,.17);\n  pointer-events: auto;\n  touch-action: none;\n}\n\n#goldenquill-solitaire .gqs-slot::before,\n#goldenquill-solitaire .gqs-tableau-zone::before { content: \"\"; position: absolute; inset: 10px; border: 1px dashed rgba(230,199,115,.34); border-radius: 11px; }\n\n#goldenquill-solitaire .gqs-slot::after {\n  content: \"\";\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 44px;\n  height: 52px;\n  transform: translate(-50%,-50%);\n  border: 2px solid rgba(244,197,66,.20);\n  border-radius: 8px 8px 14px 14px;\n  background:\n    linear-gradient(90deg, transparent 47%, rgba(244,197,66,.18) 48% 52%, transparent 53%),\n    linear-gradient(180deg, rgba(255,241,201,.04), rgba(244,197,66,.07));\n}\n\n#goldenquill-solitaire .gqs-slot.stock-slot { cursor: pointer; }\n#goldenquill-solitaire .gqs-tableau-zone { height: 300px; border-color: rgba(230,199,115,.12); background: linear-gradient(180deg, rgba(255,241,201,.01), rgba(27,13,7,.08)); }\n#goldenquill-solitaire .gqs-tableau-zone::after { display: none; }\n#goldenquill-solitaire .gqs-slot.gqs-valid,\n#goldenquill-solitaire .gqs-tableau-zone.gqs-valid {\n  border-color: rgba(255,241,201,.96);\n  background: linear-gradient(180deg, rgba(244,197,66,.25), rgba(104,120,79,.14));\n  box-shadow: 0 0 0 3px rgba(255,241,201,.12), 0 0 28px rgba(244,197,66,.30);\n}\n#goldenquill-solitaire .gqs-slot.gqs-hint-target,\n#goldenquill-solitaire .gqs-tableau-zone.gqs-hint-target { box-shadow: 0 0 0 4px rgba(255,241,201,.26), 0 0 34px rgba(244,197,66,.50); }\n\n#goldenquill-solitaire .gqs-card {\n  position: absolute;\n  width: var(--gqs-card-w);\n  height: var(--gqs-card-h);\n  overflow: hidden;\n  border: 2px solid rgba(126,77,38,.54);\n  border-radius: 13px;\n  color: var(--gqs-ink);\n  background:\n    radial-gradient(circle at 50% -12%, rgba(255,255,255,.88), transparent 49%),\n    repeating-linear-gradient(0deg, transparent 0 23px, rgba(90,50,31,.035) 23px 24px),\n    linear-gradient(155deg, #fffdf4 0%, #fff1c9 66%, #ead198 100%);\n  box-shadow: 0 12px 23px rgba(26,12,7,.34), inset 0 0 0 1px rgba(255,255,255,.70);\n  cursor: grab;\n  pointer-events: auto;\n  touch-action: none;\n  transition: box-shadow .10s ease, transform .10s ease, opacity .10s ease, filter .10s ease;\n}\n\n#goldenquill-solitaire .gqs-card::before {\n  content: \"\";\n  position: absolute;\n  inset: 5px;\n  border: 1px solid rgba(126,77,38,.18);\n  border-radius: 9px;\n  pointer-events: none;\n}\n\n#goldenquill-solitaire .gqs-card::after {\n  content: \"\";\n  position: absolute;\n  left: -5px;\n  right: -5px;\n  top: 50%;\n  height: 12px;\n  transform: translateY(-50%);\n  background: radial-gradient(circle at 0 50%, #d4a82c 0 5px, transparent 6px), radial-gradient(circle at 100% 50%, #d4a82c 0 5px, transparent 6px);\n  pointer-events: none;\n}\n\n#goldenquill-solitaire .gqs-card.gqs-back {\n  border-color: rgba(226,190,90,.68);\n  background:\n    radial-gradient(circle at 50% 50%, #fff1c9 0 6px, transparent 7px),\n    radial-gradient(circle at 43% 43%, #f4c542 0 7px, transparent 8px),\n    radial-gradient(circle at 57% 43%, #68784f 0 7px, transparent 8px),\n    radial-gradient(circle at 43% 57%, #a45f43 0 7px, transparent 8px),\n    radial-gradient(circle at 57% 57%, #f4c542 0 7px, transparent 8px),\n    repeating-linear-gradient(135deg, rgba(255,241,201,.08) 0 3px, transparent 3px 11px),\n    linear-gradient(145deg, #7b4a2a, #3d2317);\n}\n\n#goldenquill-solitaire .gqs-card.gqs-back::before {\n  inset: 10px;\n  border: 2px solid rgba(255,241,201,.52);\n  background:\n    radial-gradient(circle at 50% 50%, transparent 0 19px, rgba(255,241,201,.15) 20px 22px, transparent 23px),\n    repeating-linear-gradient(45deg, rgba(255,241,201,.06) 0 2px, transparent 2px 9px);\n}\n#goldenquill-solitaire .gqs-card.gqs-back::after { display: none; }\n\n#goldenquill-solitaire .gqs-card.suit-H { color: #a45f43; }\n#goldenquill-solitaire .gqs-card.suit-D { color: #c27b24; }\n#goldenquill-solitaire .gqs-card.suit-C { color: #68784f; }\n#goldenquill-solitaire .gqs-card.suit-S { color: #4b3324; }\n\n#goldenquill-solitaire .gqs-card.gqs-selected { transform: translateY(-3px); box-shadow: 0 0 0 3px rgba(255,241,201,.96), 0 17px 28px rgba(25,12,7,.35), 0 0 24px rgba(244,197,66,.42); }\n#goldenquill-solitaire .gqs-card.gqs-dimmed { opacity: .60; filter: saturate(.88) brightness(.94); }\n#goldenquill-solitaire .gqs-card.gqs-hint-source { box-shadow: 0 0 0 4px rgba(244,197,66,.64), 0 18px 30px rgba(25,12,7,.35); }\n#goldenquill-solitaire .gqs-card.gqs-not-playable { pointer-events: none; cursor: default; }\n\n#goldenquill-solitaire .gqs-corner {\n  position: absolute;\n  left: 5px;\n  top: 7px;\n  z-index: 2;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  width: 32px;\n  gap: 2px;\n  font-family: Georgia, \"Times New Roman\", serif;\n  font-size: 18px;\n  font-weight: 900;\n  letter-spacing: -.045em;\n  line-height: .88;\n  text-align: center;\n}\n#goldenquill-solitaire .gqs-corner .gqs-suit-small { display: grid; width: 20px; height: 20px; place-items: center; font-size: 0; }\n#goldenquill-solitaire .gqs-corner.bottom { left: auto; right: 5px; top: auto; bottom: 7px; transform: rotate(180deg); }\n#goldenquill-solitaire .gqs-center-suit { position: absolute; inset: 0; z-index: 2; display: grid; place-items: center; font-size: 0; opacity: .98; filter: drop-shadow(0 1px 0 rgba(255,255,255,.60)); }\n#goldenquill-solitaire .gqs-suit-shape { position: relative; display: block; width: 52px; height: 52px; color: currentColor; }\n#goldenquill-solitaire .gqs-suit-shape.small { width: 18px; height: 18px; }\n\n\/* Bee seal *\/\n#goldenquill-solitaire .gqs-suit-bee::before {\n  content: \"\";\n  position: absolute;\n  left: 24%;\n  top: 30%;\n  width: 52%;\n  height: 42%;\n  border: 4px solid currentColor;\n  border-radius: 50%;\n  background:\n    linear-gradient(90deg, transparent 0 26%, currentColor 27% 36%, transparent 37% 56%, currentColor 57% 66%, transparent 67%),\n    #f4c542;\n}\n#goldenquill-solitaire .gqs-suit-bee::after {\n  content: \"\";\n  position: absolute;\n  left: 16%;\n  top: 13%;\n  width: 68%;\n  height: 68%;\n  background:\n    radial-gradient(ellipse at 24% 38%, rgba(255,241,201,.92) 0 9px, currentColor 10px 12px, transparent 13px),\n    radial-gradient(ellipse at 76% 38%, rgba(255,241,201,.92) 0 9px, currentColor 10px 12px, transparent 13px),\n    radial-gradient(circle at 50% 27%, currentColor 0 7px, transparent 8px);\n}\n\n\/* Honey drop *\/\n#goldenquill-solitaire .gqs-suit-drop::before {\n  content: \"\";\n  position: absolute;\n  left: 19%;\n  top: 4%;\n  width: 62%;\n  height: 86%;\n  border: 5px solid currentColor;\n  border-radius: 52% 52% 58% 58% \/ 42% 42% 64% 64%;\n  background:\n    radial-gradient(circle at 38% 35%, rgba(255,255,255,.70) 0 5px, transparent 6px),\n    linear-gradient(150deg, #fff1c9, #f4c542 45%, #b87333 100%);\n  transform: rotate(45deg) scale(.72);\n}\n#goldenquill-solitaire .gqs-suit-drop::after {\n  content: \"\";\n  position: absolute;\n  left: 38%;\n  top: 31%;\n  width: 12%;\n  height: 32%;\n  border-radius: 999px;\n  background: rgba(255,255,255,.55);\n  transform: rotate(28deg);\n}\n\n\/* Library leaf *\/\n#goldenquill-solitaire .gqs-suit-leaf::before {\n  content: \"\";\n  position: absolute;\n  left: 13%;\n  top: 9%;\n  width: 72%;\n  height: 77%;\n  border: 4px solid currentColor;\n  border-radius: 75% 8% 75% 8%;\n  background: linear-gradient(135deg, #a4b77f, #68784f 62%, #3f5131);\n  transform: rotate(-12deg);\n}\n#goldenquill-solitaire .gqs-suit-leaf::after {\n  content: \"\";\n  position: absolute;\n  left: 48%;\n  top: 14%;\n  width: 5%;\n  height: 74%;\n  border-radius: 999px;\n  background: currentColor;\n  transform: rotate(32deg);\n  box-shadow: -10px 14px 0 -2px currentColor, 10px 24px 0 -2px currentColor;\n}\n\n\/* Golden bookmark *\/\n#goldenquill-solitaire .gqs-suit-bookmark::before {\n  content: \"\";\n  position: absolute;\n  left: 27%;\n  top: 8%;\n  width: 46%;\n  height: 82%;\n  border: 5px solid currentColor;\n  border-radius: 5px 5px 2px 2px;\n  background: linear-gradient(180deg, #fff1c9 0 15%, #e6c773 16% 100%);\n  clip-path: polygon(0 0,100% 0,100% 100%,50% 78%,0 100%);\n}\n#goldenquill-solitaire .gqs-suit-bookmark::after {\n  content: \"\";\n  position: absolute;\n  left: 42%;\n  top: 24%;\n  width: 16%;\n  height: 32%;\n  border-radius: 50% 50% 46% 46%;\n  background: currentColor;\n  box-shadow: -8px -4px 0 -4px currentColor, 8px -4px 0 -4px currentColor;\n}\n\n#goldenquill-solitaire .gqs-suit-bee.small,\n#goldenquill-solitaire .gqs-suit-drop.small,\n#goldenquill-solitaire .gqs-suit-leaf.small,\n#goldenquill-solitaire .gqs-suit-bookmark.small { transform: scale(.88); }\n\n#goldenquill-solitaire .gqs-status {\n  position: absolute;\n  left: 50%;\n  bottom: 90px;\n  z-index: 86;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: max-content;\n  max-width: min(720px, calc(100% - 96px));\n  min-height: 34px;\n  padding: 8px 20px;\n  transform: translateX(-50%);\n  border: 1px solid rgba(139,84,43,.46);\n  border-radius: 999px;\n  color: #3f2418;\n  background: linear-gradient(180deg, rgba(255,248,223,.98), rgba(236,213,157,.97));\n  box-shadow: 0 6px 0 rgba(148,96,44,.74), 0 12px 18px rgba(26,12,7,.22);\n  font-size: 13px;\n  font-weight: 780;\n  line-height: 1.25;\n  opacity: 1;\n  pointer-events: none;\n  text-align: center;\n  transition: opacity .28s ease, transform .28s ease, visibility .28s ease;\n  visibility: visible;\n  white-space: nowrap;\n}\n#goldenquill-solitaire .gqs-status.gqs-hidden { visibility: hidden; opacity: 0; transform: translateX(-50%) translateY(8px); }\n\n#goldenquill-solitaire .gqs-bottom-area { position: absolute; left: 50%; bottom: 46px; z-index: 90; display: flex; align-items: center; justify-content: center; transform: translateX(-50%); }\n#goldenquill-solitaire .gqs-bottom-controls { display: flex; align-items: center; justify-content: center; gap: 10px; }\n#goldenquill-solitaire .gqs-pill {\n  min-width: 108px;\n  height: 40px;\n  padding: 0 18px;\n  border: 1px solid rgba(255,241,201,.60);\n  border-radius: 12px;\n  color: #fff1c9;\n  background: linear-gradient(180deg, #8e582f, #4d2b1c);\n  box-shadow: 0 6px 0 #2f190f, 0 10px 18px rgba(25,12,7,.28), inset 0 1px 0 rgba(255,241,201,.13);\n  cursor: pointer;\n  font-size: 14px;\n  font-weight: 850;\n  transition: transform .12s ease, box-shadow .12s ease, opacity .12s ease, border-color .12s ease, filter .12s ease;\n}\n#goldenquill-solitaire .gqs-pill:hover,\n#goldenquill-solitaire .gqs-pill:focus-visible { transform: translateY(-2px); filter: brightness(1.08); border-color: rgba(255,241,201,.92); box-shadow: 0 8px 0 #2f190f, 0 14px 22px rgba(25,12,7,.32), 0 0 0 3px rgba(244,197,66,.16); }\n#goldenquill-solitaire .gqs-pill:active { transform: translateY(3px); box-shadow: 0 3px 0 #2f190f, 0 6px 12px rgba(25,12,7,.24); }\n#goldenquill-solitaire .gqs-pill:disabled { opacity: .44; cursor: default; transform: none; }\n#goldenquill-solitaire #gqsNewGame { background: linear-gradient(180deg, #6f7f4f, #445334); box-shadow: 0 6px 0 #2d3824, 0 10px 18px rgba(25,12,7,.27); }\n#goldenquill-solitaire #gqsRestart { color: #3f2418; background: linear-gradient(180deg, #fff8df, #e6c773); box-shadow: 0 6px 0 #b18431, 0 10px 18px rgba(25,12,7,.27); }\n#goldenquill-solitaire #gqsUndo { background: linear-gradient(180deg, #a45f43, #6e3d2c); box-shadow: 0 6px 0 #47251b, 0 10px 18px rgba(25,12,7,.27); }\n#goldenquill-solitaire #gqsLibraryHint { color: #3f2418; background: linear-gradient(180deg, #fff8df, #f4c542); box-shadow: 0 6px 0 #b98423, 0 10px 18px rgba(25,12,7,.27); }\n\n#goldenquill-solitaire .gqs-overlay {\n  position: absolute;\n  inset: 0;\n  z-index: 180;\n  display: none;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  padding: 20px;\n  background: radial-gradient(circle at 50% 46%, rgba(244,197,66,.13), transparent 35%), rgba(24,11,6,.74);\n  backdrop-filter: blur(8px) saturate(.92);\n  -webkit-backdrop-filter: blur(8px) saturate(.92);\n}\n#goldenquill-solitaire .gqs-overlay.active { display: flex; }\n#goldenquill-solitaire .gqs-fireworks { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; opacity: 0; pointer-events: none; transition: opacity .25s ease; }\n#goldenquill-solitaire .gqs-fireworks.active { opacity: 1; }\n\n#goldenquill-solitaire .gqs-popup {\n  position: relative;\n  z-index: 2;\n  width: 440px;\n  max-width: calc(100% - 48px);\n  min-height: 274px;\n  overflow: hidden;\n  padding: 32px 34px 27px;\n  border: 2px solid rgba(135,80,40,.72);\n  border-radius: 22px;\n  background:\n    radial-gradient(circle at 88% 10%, rgba(244,197,66,.18), transparent 31%),\n    repeating-linear-gradient(0deg, transparent 0 22px, rgba(96,55,31,.035) 22px 23px),\n    linear-gradient(145deg, #fffdf4, #f0dca8);\n  box-shadow: 0 0 0 5px rgba(255,255,255,.42), 0 0 0 9px rgba(165,101,45,.36), 0 30px 72px rgba(24,11,6,.50), inset 0 0 0 2px rgba(255,255,255,.60);\n  text-align: center;\n}\n\n#goldenquill-solitaire .gqs-popup::before,\n#goldenquill-solitaire .gqs-popup::after { content: \"\"; position: absolute; top: 50%; width: 30px; height: 30px; border-radius: 50%; background: #a45f43; transform: translateY(-50%); }\n#goldenquill-solitaire .gqs-popup::before { left: -18px; }\n#goldenquill-solitaire .gqs-popup::after { right: -18px; }\n#goldenquill-solitaire .gqs-popup-main { position: relative; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 208px; gap: 13px; }\n\n#goldenquill-solitaire .gqs-mark {\n  position: relative;\n  width: 72px;\n  height: 72px;\n  margin: 0 auto -2px;\n  border: 3px solid #7c4a2a;\n  border-radius: 50%;\n  background:\n    radial-gradient(circle at 50% 50%, #f4c542 0 13px, transparent 14px),\n    radial-gradient(ellipse at 32% 43%, #fff1c9 0 13px, #7c4a2a 14px 16px, transparent 17px),\n    radial-gradient(ellipse at 68% 43%, #fff1c9 0 13px, #7c4a2a 14px 16px, transparent 17px),\n    linear-gradient(145deg, #fff8df, #e6c773);\n  box-shadow: 0 0 28px rgba(244,197,66,.36), 0 10px 22px rgba(28,13,7,.22);\n}\n#goldenquill-solitaire .gqs-mark::before {\n  content: \"\";\n  position: absolute;\n  left: 31px;\n  top: 20px;\n  width: 10px;\n  height: 34px;\n  border-radius: 50%;\n  background: #4d2b1c;\n  box-shadow: 0 8px 0 -2px #f4c542, 0 16px 0 -2px #4d2b1c;\n}\n\n#goldenquill-solitaire .gqs-popup-title { margin: 0; color: #3f2418; font-family: Georgia, \"Times New Roman\", serif; font-size: 28px; font-weight: 900; letter-spacing: -.02em; line-height: 1.08; }\n#goldenquill-solitaire .gqs-popup-copy { width: 100%; max-width: 356px; margin: 0 auto; color: rgba(63,36,24,.80); font-size: 13px; font-weight: 680; line-height: 1.48; text-align: center; }\n\n#goldenquill-solitaire .gqs-start-btn,\n#goldenquill-solitaire .gqs-popup-btn {\n  width: 220px;\n  height: 51px;\n  border: 1px solid rgba(255,241,201,.70);\n  border-radius: 13px;\n  color: #fff1c9;\n  background: linear-gradient(180deg, #8e582f, #4d2b1c);\n  box-shadow: 0 7px 0 #2f190f, 0 14px 28px rgba(25,12,7,.30);\n  cursor: pointer;\n  font-size: 16px;\n  font-weight: 950;\n  transition: transform .12s ease, filter .12s ease, box-shadow .12s ease;\n}\n#goldenquill-solitaire .gqs-start-btn:hover,\n#goldenquill-solitaire .gqs-popup-btn:hover,\n#goldenquill-solitaire .gqs-start-btn:focus-visible,\n#goldenquill-solitaire .gqs-popup-btn:focus-visible { transform: translateY(-2px); filter: brightness(1.06); box-shadow: 0 9px 0 #2f190f, 0 18px 32px rgba(25,12,7,.34), 0 0 0 3px rgba(244,197,66,.20); }\n\n#goldenquill-solitaire .gqs-popup-btn.secondary {\n  height: 44px;\n  border-color: rgba(105,61,33,.24);\n  color: #4d2b1c;\n  background: rgba(255,248,223,.94);\n  box-shadow: 0 6px 0 rgba(158,105,48,.46), 0 10px 16px rgba(25,12,7,.17);\n  font-size: 14px;\n}\n\n#goldenquill-solitaire .gqs-mode-row { display: flex; align-items: center; justify-content: center; gap: 9px; }\n#goldenquill-solitaire .gqs-mode-btn { min-width: 94px; height: 38px; border: 1px solid rgba(105,61,33,.24); border-radius: 999px; color: rgba(63,36,24,.84); background: rgba(255,248,223,.90); cursor: pointer; font-size: 13px; font-weight: 850; transition: background .12s ease, color .12s ease, border-color .12s ease, box-shadow .12s ease, transform .12s ease; }\n#goldenquill-solitaire .gqs-mode-btn:hover,\n#goldenquill-solitaire .gqs-mode-btn:focus-visible { transform: translateY(-1px); border-color: rgba(151,91,42,.50); background: #fffdf4; }\n#goldenquill-solitaire .gqs-mode-btn.active { border-color: rgba(255,241,201,.78); color: #fff1c9; background: linear-gradient(180deg, #8e582f, #4d2b1c); box-shadow: 0 0 0 3px rgba(244,197,66,.18), 0 0 18px rgba(244,197,66,.16); }\n\n#goldenquill-solitaire .gqs-win-grid { display: grid; grid-template-columns: repeat(2,1fr); width: 100%; max-width: 340px; margin: 6px auto 10px; gap: 10px; }\n#goldenquill-solitaire .gqs-win-box { padding: 12px 8px; border: 1px solid rgba(105,61,33,.18); border-radius: 12px; background: rgba(255,255,255,.46); }\n#goldenquill-solitaire .gqs-win-box span { display: block; color: rgba(63,36,24,.62); font-size: 10px; letter-spacing: .08em; text-transform: uppercase; }\n#goldenquill-solitaire .gqs-win-box b { color: #3f2418; font-size: 18px; }\n\n@media (max-width: 720px) {\n  #goldenquill-solitaire { width: 100%; margin: 10px auto; border-radius: 14px; }\n  #goldenquill-solitaire .gqs-status { max-width: calc(100% - 32px); white-space: normal; }\n}\n\n@media (max-width: 760px), (max-height: 520px) {\n  #goldenquill-solitaire .gqs-overlay { backdrop-filter: none; -webkit-backdrop-filter: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  #goldenquill-solitaire .gqs-golden-dust { animation: none; }\n  #goldenquill-solitaire *,\n  #goldenquill-solitaire *::before,\n  #goldenquill-solitaire *::after { transition-duration: .01ms !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; }\n}\n<\/style>\n<div class=\"gqs-fit\" id=\"gqsFit\">\n  <div class=\"gqs-library-scene\" aria-hidden=\"true\">\n    <span class=\"gqs-amber-window\"><\/span>\n    <span class=\"gqs-hanging-bookmarks\"><\/span>\n    <span class=\"gqs-golden-dust\"><\/span>\n    <span class=\"gqs-book-shelf left\"><\/span>\n    <span class=\"gqs-book-shelf right\"><\/span>\n    <span class=\"gqs-reading-desk\"><\/span>\n    <span class=\"gqs-honey-jar\"><\/span>\n    <span class=\"gqs-book-stack\"><\/span>\n  <\/div>\n\n  <div class=\"gqs-playfield\"><\/div>\n\n  <button class=\"gqs-icon gqs-pause\" id=\"gqsPause\" type=\"button\" aria-label=\"Pause\">\n    <span class=\"gqs-pause-symbol\" aria-hidden=\"true\"><\/span>\n  <\/button>\n\n  <button class=\"gqs-icon gqs-mute\" id=\"gqsMute\" type=\"button\" aria-label=\"Sound\">\n    <span class=\"gqs-sound-symbol\" aria-hidden=\"true\">\n      <span class=\"gqs-sound-box\"><\/span>\n      <span class=\"gqs-sound-wave w1\"><\/span>\n      <span class=\"gqs-sound-wave w2\"><\/span>\n      <span class=\"gqs-sound-wave w3\"><\/span>\n      <span class=\"gqs-sound-slash\"><\/span>\n    <\/span>\n  <\/button>\n\n  <div class=\"gqs-stats\" aria-live=\"polite\">\n    <span class=\"gqs-stat\">Score <b id=\"gqsScore\">0<\/b><\/span>\n    <span class=\"gqs-stat\">Time <b id=\"gqsTime\">00:00<\/b><\/span>\n    <span class=\"gqs-stat\">Moves <b id=\"gqsMoves\">0<\/b><\/span>\n    <span class=\"gqs-stat\">Best <b id=\"gqsBest\">0<\/b><\/span>\n  <\/div>\n\n  <button class=\"gqs-icon gqs-fullscreen\" id=\"gqsFullscreen\" type=\"button\" aria-label=\"Fullscreen\">\n    <span class=\"gqs-full-symbol\" aria-hidden=\"true\"><\/span>\n  <\/button>\n\n  <div class=\"gqs-slots\" id=\"gqsSlots\"><\/div>\n  <div class=\"gqs-tableau-zones\" id=\"gqsTableauZones\"><\/div>\n  <div class=\"gqs-card-layer\" id=\"gqsCards\"><\/div>\n  <div class=\"gqs-ghost-layer\" id=\"gqsGhost\"><\/div>\n\n  <div class=\"gqs-status\" id=\"gqsStatus\">Choose a mode, then build four Golden Shelves from Ace to King.<\/div>\n\n  <div class=\"gqs-bottom-area\">\n    <div class=\"gqs-bottom-controls\">\n      <button class=\"gqs-pill\" id=\"gqsNewGame\" type=\"button\">New Game<\/button>\n      <button class=\"gqs-pill\" id=\"gqsRestart\" type=\"button\">Restart<\/button>\n      <button class=\"gqs-pill\" id=\"gqsUndo\" type=\"button\">Undo<\/button>\n      <button class=\"gqs-pill\" id=\"gqsLibraryHint\" type=\"button\">Library Hint<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"gqs-overlay active\" id=\"gqsStartOverlay\">\n    <div class=\"gqs-popup\">\n      <div class=\"gqs-popup-main\">\n        <div class=\"gqs-mark\" aria-hidden=\"true\"><\/div>\n        <h3 class=\"gqs-popup-title\">Goldenquill Solitaire<\/h3>\n        <button class=\"gqs-start-btn\" id=\"gqsContinueBtn\" type=\"button\" style=\"display:none;\">Continue the Saved Chapter<\/button>\n        <button class=\"gqs-start-btn\" id=\"gqsStartBtn\" type=\"button\">Open the Golden Deck<\/button>\n        <div class=\"gqs-mode-row\" aria-label=\"Mode\">\n          <button class=\"gqs-mode-btn active\" type=\"button\" data-mode=\"Relaxed\">Relaxed<\/button>\n          <button class=\"gqs-mode-btn\" type=\"button\" data-mode=\"Classic\">Classic<\/button>\n        <\/div>\n        <p class=\"gqs-popup-copy\">Build each archive suit from Ace to King across four Golden Shelves. Empty columns welcome any card or a valid alternating stack.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"gqs-overlay\" id=\"gqsPauseOverlay\">\n    <div class=\"gqs-popup\">\n      <div class=\"gqs-popup-main\">\n        <div class=\"gqs-mark\" aria-hidden=\"true\"><\/div>\n        <h3 class=\"gqs-popup-title\">The Reading Room Is Resting<\/h3>\n        <button class=\"gqs-popup-btn\" id=\"gqsResumeBtn\" type=\"button\">Return to the Card Table<\/button>\n        <button class=\"gqs-popup-btn secondary\" id=\"gqsSaveBtn\" type=\"button\">Save This Chapter<\/button>\n        <button class=\"gqs-popup-btn secondary\" id=\"gqsPauseNewBtn\" type=\"button\">Deal a New Archive Deck<\/button>\n        <p class=\"gqs-popup-copy\">The cards wait safely while the honeylit reading room grows quiet.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"gqs-overlay\" id=\"gqsWinOverlay\">\n    <canvas class=\"gqs-fireworks\" id=\"gqsFireworks\"><\/canvas>\n    <div class=\"gqs-popup\">\n      <div class=\"gqs-popup-main\">\n        <div class=\"gqs-mark\" aria-hidden=\"true\"><\/div>\n        <h3 class=\"gqs-popup-title\">Every Golden Shelf Is Complete<\/h3>\n        <div class=\"gqs-win-grid\">\n          <div class=\"gqs-win-box\"><span>Score<\/span><b id=\"gqsWinScore\">0<\/b><\/div>\n          <div class=\"gqs-win-box\"><span>Moves<\/span><b id=\"gqsWinMoves\">0<\/b><\/div>\n          <div class=\"gqs-win-box\"><span>Best<\/span><b id=\"gqsWinBest\">0<\/b><\/div>\n          <div class=\"gqs-win-box\"><span>Best Moves<\/span><b id=\"gqsWinBestMoves\">&#8212;<\/b><\/div>\n        <\/div>\n        <button class=\"gqs-popup-btn\" id=\"gqsPlayAgain\" type=\"button\">Deal Another Golden Chapter<\/button>\n        <p class=\"gqs-popup-copy\" id=\"gqsWinNote\">Every archive suit has reached its Golden Shelf.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n<script>\n\/* Goldenquill Solitaire - WordPress direct-paste safe JS, ampersand-free. *\/\n(function () {\n    \"use strict\";\n    const root = document.getElementById(\"goldenquill-solitaire\");\n    const fit = document.getElementById(\"gqsFit\");\n    const slotsEl = document.getElementById(\"gqsSlots\");\n    const zonesEl = document.getElementById(\"gqsTableauZones\");\n    const cardsEl = document.getElementById(\"gqsCards\");\n    const ghostEl = document.getElementById(\"gqsGhost\");\n    const statusEl = document.getElementById(\"gqsStatus\");\n    const fireworksCanvas = document.getElementById(\"gqsFireworks\");\n    const fireworksCtx = fireworksCanvas.getContext(\"2d\");\n    const startOverlay = document.getElementById(\"gqsStartOverlay\");\n    const pauseOverlay = document.getElementById(\"gqsPauseOverlay\");\n    const winOverlay = document.getElementById(\"gqsWinOverlay\");\n    const pauseBtn = document.getElementById(\"gqsPause\");\n    const muteBtn = document.getElementById(\"gqsMute\");\n    const fullscreenBtn = document.getElementById(\"gqsFullscreen\");\n    const scoreEl = document.getElementById(\"gqsScore\");\n    const timeEl = document.getElementById(\"gqsTime\");\n    const movesEl = document.getElementById(\"gqsMoves\");\n    const bestEl = document.getElementById(\"gqsBest\");\n    const continueBtn = document.getElementById(\"gqsContinueBtn\");\n    const startBtn = document.getElementById(\"gqsStartBtn\");\n    const resumeBtn = document.getElementById(\"gqsResumeBtn\");\n    const saveBtn = document.getElementById(\"gqsSaveBtn\");\n    const pauseNewBtn = document.getElementById(\"gqsPauseNewBtn\");\n    const playAgainBtn = document.getElementById(\"gqsPlayAgain\");\n    const newGameBtn = document.getElementById(\"gqsNewGame\");\n    const restartBtn = document.getElementById(\"gqsRestart\");\n    const undoBtn = document.getElementById(\"gqsUndo\");\n    const hintBtn = document.getElementById(\"gqsLibraryHint\");\n    const winScoreEl = document.getElementById(\"gqsWinScore\");\n    const winMovesEl = document.getElementById(\"gqsWinMoves\");\n    const winBestEl = document.getElementById(\"gqsWinBest\");\n    const winBestMovesEl = document.getElementById(\"gqsWinBestMoves\");\n    const winNoteEl = document.getElementById(\"gqsWinNote\");\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 = 576;\n    const TABLEAU_GAP = 34;\n    const FOUNDATION_GAP = 112;\n    const SAVE_KEY = \"goldenquill_solitaire_save_v1\";\n    const BEST_KEY = \"goldenquill_solitaire_best_v1\";\n    const MUTE_KEY = \"goldenquill_solitaire_muted_v1\";\n    function readStore(key) { try {\n        return window.localStorage.getItem(key);\n    }\n    catch (err) {\n        return null;\n    } }\n    function writeStore(key, value) { try {\n        window.localStorage.setItem(key, value);\n    }\n    catch (err) { } }\n    function removeStore(key) { try {\n        window.localStorage.removeItem(key);\n    }\n    catch (err) { } }\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: \"Golden Bookmarks\", shape: \"bookmark\", color: \"black\" }\n    ];\n    const MODE = {\n        Relaxed: { draw: 1, recycleLimit: Infinity },\n        Classic: { draw: 3, recycleLimit: 3 }\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    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    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    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: 312, col: i });\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: readStore(MUTE_KEY) === \"1\",\n        audioCtx: null\n    };\n    let interaction = null;\n    let lastTap = { id: \"\", time: 0 };\n    let statusTimer = null;\n    let hintTimer = null;\n    let fireworksRunning = false;\n    let fireworksFrame = 0;\n    let fireworkRockets = [];\n    let fireworkParticles = [];\n    let fireworksDpr = 1;\n    let fallbackFullscreen = false;\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)\n            return \"A\";\n        if (rank === 11)\n            return \"J\";\n        if (rank === 12)\n            return \"Q\";\n        if (rank === 13)\n            return \"K\";\n        return String(rank);\n    }\n    function rankName(rank) {\n        if (rank === 1)\n            return \"Ace\";\n        if (rank === 11)\n            return \"Jack\";\n        if (rank === 12)\n            return \"Queen\";\n        if (rank === 13)\n            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: Math.random() < .58 ? rand(44, 58) : rand(166, 188),\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)\n                    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        if (Math.random() < .055)\n            spawnRocket();\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            r.trail.push({ x: r.x, y: r.y });\n            if (r.trail.length > 8)\n                r.trail.shift();\n            r.x += (dx \/ dist) * r.speed;\n            r.y += (dy \/ dist) * r.speed;\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            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            if (dist < 8) {\n                explodeRocket(r.tx, r.ty, r.hue);\n                fireworkRockets.splice(i, 1);\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            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            if (p.life <= 0)\n                fireworkParticles.splice(i, 1);\n        }\n        if (fireworksRunning) {\n            fireworksFrame = requestAnimationFrame(animateFireworks);\n        }\n    }\n    function nowElapsed() {\n        if (!state.started)\n            return 0;\n        if (state.won)\n            return state.finalElapsed;\n        if (state.paused)\n            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 = readStore(BEST_KEY);\n            if (!raw)\n                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        }\n        catch (err) {\n            return { bestScore: 0, bestTime: null, bestMoves: null };\n        }\n    }\n    function saveBest(best) { writeStore(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        statusEl.classList.remove(\"gqs-hidden\");\n        if (statusTimer)\n            clearTimeout(statusTimer);\n        const hideAfter = Number(temporary) || 2600;\n        if (hideAfter > 0) {\n            statusTimer = setTimeout(function () {\n                statusEl.classList.add(\"gqs-hidden\");\n            }, hideAfter);\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)\n            return;\n        const AC = window.AudioContext || window.webkitAudioContext;\n        if (!AC)\n            return;\n        state.audioCtx = new AC();\n    }\n    function playSound(type) {\n        if (state.muted)\n            return;\n        initAudio();\n        const ctx = state.audioCtx;\n        if (!ctx)\n            return;\n        if ((_gqsGate_1 => _gqsGate_1 ? ctx.resume : _gqsGate_1)(ctx.state === \"suspended\"))\n            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\") {\n            tone(260, .08, .026, \"triangle\", 0, .78);\n            tone(335, .08, .016, \"sine\", .04, .86);\n        }\n        else if (type === \"move\") {\n            tone(315, .07, .026, \"triangle\", 0, .72);\n            tone(415, .055, .014, \"sine\", .018, .84);\n        }\n        else if (type === \"flip\") {\n            tone(480, .08, .022, \"triangle\", 0, .92);\n        }\n        else if (type === \"foundation\") {\n            tone(520, .105, .026, \"triangle\", 0, .92);\n            tone(690, .115, .020, \"sine\", .055, .94);\n        }\n        else if (type === \"invalid\") {\n            tone(145, .115, .024, \"triangle\", 0, .64);\n        }\n        else if (type === \"undo\") {\n            tone(240, .09, .022, \"sine\", 0, .75);\n            tone(180, .09, .014, \"triangle\", .04, .80);\n        }\n        else if (type === \"hint\") {\n            tone(620, .115, .024, \"triangle\", 0, .94);\n            tone(820, .120, .018, \"sine\", .052, .96);\n        }\n        else if (type === \"save\") {\n            tone(390, .08, .022, \"sine\", 0, .90);\n            tone(520, .08, .014, \"triangle\", .04, .92);\n        }\n        else if (type === \"pause\") {\n            tone(220, .105, .020, \"sine\", 0, .70);\n        }\n        else if (type === \"resume\") {\n            tone(360, .075, .022, \"triangle\", 0, .88);\n            tone(470, .075, .014, \"sine\", .035, .92);\n        }\n        else if (type === \"win\") {\n            [392, 493.88, 587.33, 783.99].forEach(function (freq, i) { tone(freq, .45, .022, i % 2 ? \"sine\" : \"triangle\", i * .075, .95); });\n        }\n    }\n    function createDeck() {\n        const deck = [];\n        SUITS.forEach(function (s) {\n            for (let r = 1; r <= 13; r++)\n                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)\n            state.foundations.push([]);\n        state.tableau = (snap.tableau || Array.from({ length: 7 }, function () { return []; })).map(cloneCards);\n        while (state.tableau.length < 7)\n            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)\n            state.undoStack.shift();\n    }\n    function hasSave() {\n        try {\n            const raw = readStore(SAVE_KEY);\n            if (!raw)\n                return false;\n            const data = JSON.parse(raw);\n            return (_gqsGate_2 => _gqsGate_2 ? !data.won : _gqsGate_2)((_gqsGate_3 => _gqsGate_3 ? data.started : _gqsGate_3)((_gqsGate_4 => _gqsGate_4 ? data.version === 1 : _gqsGate_4)(data)));\n        }\n        catch (err) {\n            return false;\n        }\n    }\n    function saveGame() {\n        if (!state.started || state.won)\n            return;\n        const data = snapshot();\n        data.version = 1;\n        data.started = true;\n        data.won = false;\n        data.savedAt = Date.now();\n        writeStore(SAVE_KEY, JSON.stringify(data));\n        updateContinueButton();\n    }\n    function clearSave() {\n        removeStore(SAVE_KEY);\n        updateContinueButton();\n    }\n    function updateContinueButton() { continueBtn.style.display = hasSave() ? \"block\" : \"none\"; }\n    function continueGame() {\n        stopFireworks();\n        try {\n            const raw = readStore(SAVE_KEY);\n            if (!raw)\n                return;\n            const data = JSON.parse(raw);\n            if (!data || data.version !== 1)\n                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(\"gqs-game-active\");\n            root.classList.remove(\"gqs-paused\");\n            setStatus(\"Saved archive arrangement restored.\", 1200);\n            playSound(\"resume\");\n            render();\n        }\n        catch (err) {\n            clearSave();\n        }\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(\"gqs-game-active\");\n        root.classList.remove(\"gqs-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 with only three redeals.\" : \"Relaxed mode: draw one card with unlimited redeals.\", 1500);\n        playSound(\"draw\");\n        render();\n    }\n    function restartGame() {\n        stopFireworks();\n        if (!state.initialSnapshot)\n            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(\"gqs-game-active\");\n        root.classList.remove(\"gqs-paused\");\n        startOverlay.classList.remove(\"active\");\n        pauseOverlay.classList.remove(\"active\");\n        winOverlay.classList.remove(\"active\");\n        setStatus(\"The same golden 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=\"gqs-suit-shape gqs-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 = \"gqs-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        }\n        else if (loc.type === \"waste\") {\n            el.dataset.index = String(loc.index);\n        }\n        else if (loc.type === \"foundation\") {\n            el.dataset.foundation = String(loc.foundation);\n        }\n        else if (loc.type === \"stock\") {\n            el.dataset.stock = \"1\";\n        }\n        if (!card.faceUp) {\n            el.classList.add(\"gqs-back\");\n            return el;\n        }\n        el.classList.add(\"suit-\" + card.suit);\n        const label = rankLabel(card.rank);\n        el.innerHTML =\n            '<div class=\"gqs-corner\"><div>' + label + '<\/div><div class=\"gqs-suit-small\">' + suitHTML(card.suit, true) + '<\/div><\/div>' +\n                '<div class=\"gqs-center-suit\">' + suitHTML(card.suit, false) + '<\/div>' +\n                '<div class=\"gqs-corner bottom\"><div>' + label + '<\/div><div class=\"gqs-suit-small\">' + suitHTML(card.suit, true) + '<\/div><\/div>';\n        if ((_gqsGate_5 => _gqsGate_5 ? loc.index !== state.waste.length - 1 : _gqsGate_5)(loc.type === \"waste\"))\n            el.classList.add(\"gqs-not-playable\");\n        if ((_gqsGate_6 => _gqsGate_6 ? state.selected.stack.some(function (c) { return c.id === card.id; }) : _gqsGate_6)(state.selected)) {\n            el.classList.add(\"gqs-selected\");\n            if ((_gqsGate_7 => _gqsGate_7 ? interaction.drag : _gqsGate_7)(interaction))\n                el.classList.add(\"gqs-dimmed\");\n        }\n        if ((_gqsGate_8 => _gqsGate_8 ? state.hintMark.sourceIds.includes(card.id) : _gqsGate_8)((_gqsGate_9 => _gqsGate_9 ? state.hintMark.sourceIds : _gqsGate_9)(state.hintMark))) {\n            el.classList.add(\"gqs-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 = \"gqs-slot stock-slot gqs-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        const waste = document.createElement(\"div\");\n        waste.className = \"gqs-slot gqs-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        POS.foundations.forEach(function (p) {\n            const slot = document.createElement(\"div\");\n            slot.className = \"gqs-slot gqs-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        POS.tableau.forEach(function (p) {\n            const zone = document.createElement(\"div\");\n            zone.className = \"gqs-tableau-zone gqs-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)\n            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(\".gqs-drop\").forEach(function (el) { el.classList.remove(\"gqs-valid\", \"gqs-hint-target\"); });\n    }\n    function dropElementForTarget(target) {\n        if (!target)\n            return null;\n        if (target.type === \"tableau\")\n            return root.querySelector('.gqs-drop[data-target=\"tableau\"][data-col=\"' + target.col + '\"]');\n        if (target.type === \"foundation\")\n            return root.querySelector('.gqs-drop[data-target=\"foundation\"][data-index=\"' + target.index + '\"]');\n        return null;\n    }\n    function updateDropHighlights() {\n        clearDropHighlights();\n        if ((_gqsGate_10 => _gqsGate_10 ? !state.paused : _gqsGate_10)(state.selected)) {\n            getValidTargets(state.selected).forEach(function (target) {\n                const el = dropElementForTarget(target);\n                if (el)\n                    el.classList.add(\"gqs-valid\");\n            });\n        }\n        if ((_gqsGate_11 => _gqsGate_11 ? !state.paused : _gqsGate_11)((_gqsGate_12 => _gqsGate_12 ? state.hintMark.target : _gqsGate_12)(state.hintMark))) {\n            const el = dropElementForTarget(state.hintMark.target);\n            if (el)\n                el.classList.add(\"gqs-hint-target\");\n        }\n    }\n    function isValidTableauStack(stack) {\n        if (!stack || !stack.length)\n            return false;\n        for (let i = 0; i < stack.length; i++) {\n            if (!stack[i].faceUp)\n                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)\n                return false;\n            if (cardColor(upper) === cardColor(lower))\n                return false;\n        }\n        return true;\n    }\n    function sourceFromElement(el) {\n        if (!el || !el.classList.contains(\"gqs-card\"))\n            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)\n                return null;\n            const card = state.waste[index];\n            if (!card || !card.faceUp)\n                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)\n                return null;\n            const stack = column.slice(index);\n            if (!isValidTableauStack(stack)) {\n                playSound(\"invalid\");\n                setStatus(\"Only face-up descending stacks with alternating archive 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)\n                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)\n            return null;\n        const slot = el.closest(\".gqs-drop\");\n        if (slot) {\n            const target = slot.dataset.target;\n            if (target === \"tableau\")\n                return { type: \"tableau\", col: Number(slot.dataset.col) };\n            if (target === \"foundation\")\n                return { type: \"foundation\", index: Number(slot.dataset.index) };\n            if (target === \"stock\")\n                return { type: \"stock\" };\n            return null;\n        }\n        const card = el.closest(\".gqs-card\");\n        if (!card)\n            return null;\n        const loc = card.dataset.loc;\n        if (loc === \"tableau\")\n            return { type: \"tableau\", col: Number(card.dataset.col) };\n        if (loc === \"foundation\")\n            return { type: \"foundation\", index: Number(card.dataset.foundation) };\n        return null;\n    }\n    function canPlaceOnFoundation(card, index) {\n        if (!card)\n            return false;\n        const pile = state.foundations[index];\n        if (!pile.length)\n            return card.rank === 1;\n        const top = pile[pile.length - 1];\n        return (_gqsGate_13 => _gqsGate_13 ? card.rank === top.rank + 1 : _gqsGate_13)(top.suit === card.suit);\n    }\n    function canPlaceOnTableau(stack, colIndex) {\n        if (!stack || !stack.length)\n            return false;\n        const moving = stack[0];\n        const dest = state.tableau[colIndex];\n        if (!dest.length)\n            return true;\n        const top = dest[dest.length - 1];\n        if (!top.faceUp)\n            return false;\n        return (_gqsGate_14 => _gqsGate_14 ? cardColor(top) !== cardColor(moving) : _gqsGate_14)(top.rank === moving.rank + 1);\n    }\n    function sameSourceTarget(sel, target) {\n        if (!sel || !target)\n            return false;\n        if ((_gqsGate_15 => _gqsGate_15 ? sel.source.col === target.col : _gqsGate_15)((_gqsGate_16 => _gqsGate_16 ? target.type === \"tableau\" : _gqsGate_16)(sel.source.type === \"tableau\")))\n            return true;\n        if ((_gqsGate_17 => _gqsGate_17 ? sel.source.foundation === target.index : _gqsGate_17)((_gqsGate_18 => _gqsGate_18 ? target.type === \"foundation\" : _gqsGate_18)(sel.source.type === \"foundation\")))\n            return true;\n        return false;\n    }\n    function canMove(sel, target) {\n        if (!sel || !target || !sel.stack.length || state.paused || state.won)\n            return false;\n        if (sameSourceTarget(sel, target))\n            return false;\n        if (target.type === \"foundation\") {\n            return (_gqsGate_19 => _gqsGate_19 ? canPlaceOnFoundation(sel.stack[0], target.index) : _gqsGate_19)(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))\n                targets.push(target);\n        }\n        for (let i = 0; i < 7; i++) {\n            const target = { type: \"tableau\", col: i };\n            if (canMove(sel, target))\n                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\")\n            return false;\n        const col = state.tableau[sel.source.col];\n        if (!col.length)\n            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 settle 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\")\n            playSound(\"foundation\");\n        else\n            playSound(\"move\");\n        if (flipped)\n            setTimeout(function () { playSound(\"flip\"); }, 90);\n        setStatus(target.type === \"foundation\" ? cardName(sel.stack[0]) + \" reached a Golden Shelf.\" : cardName(sel.stack[0]) + \" found a new archive column.\", 1200);\n        saveGame();\n        render();\n        checkWin();\n        return true;\n    }\n    function drawStock() {\n        if (!state.started || state.paused || state.won)\n            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 was drawn from the golden deck.\" : \"Three cards were drawn from the golden deck.\", 900);\n            saveGame();\n            render();\n            return;\n        }\n        if (!state.waste.length) {\n            playSound(\"invalid\");\n            setStatus(\"No cards remain in the golden deck.\", 1000);\n            return;\n        }\n        const limit = MODE[state.mode].recycleLimit;\n        if (state.recycleUsed >= limit) {\n            playSound(\"invalid\");\n            setStatus(\"No more redeals remain in Classic mode.\", 1400);\n            return;\n        }\n        pushUndo();\n        state.recycleUsed++;\n        if (state.mode === \"Classic\")\n            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\" ? \"The golden deck was renewed. The Classic mode penalty was applied.\" : \"The golden deck is ready again.\", 1300);\n        saveGame();\n        render();\n    }\n    function shouldRotateFullscreen() {\n        const coarse = (_gqsGate_20 => _gqsGate_20 ? window.matchMedia(\"(pointer: coarse)\").matches : _gqsGate_20)(window.matchMedia);\n        const maxSide = Math.max(window.innerWidth || 0, window.innerHeight || 0);\n        return (_gqsGate_21 => _gqsGate_21 ? maxSide < 1180 : _gqsGate_21)(!!coarse);\n    }\n    function gamePoint(clientX, clientY) {\n        const isFs = isFullscreenActive();\n        const portraitFs = (_gqsGate_22 => _gqsGate_22 ? window.innerHeight > window.innerWidth : _gqsGate_22)(isFs);\n        const rotateFs = (_gqsGate_23 => _gqsGate_23 ? shouldRotateFullscreen() : _gqsGate_23)(portraitFs);\n        if (rotateFs) {\n            const rootRect = root.getBoundingClientRect();\n            const screenW = window.innerWidth || root.clientWidth || BASE_H;\n            const screenH = window.innerHeight || root.clientHeight || BASE_W;\n            const scaleX = screenH \/ BASE_W || 1;\n            const scaleY = screenW \/ BASE_H || 1;\n            return {\n                x: (clientY - rootRect.top) \/ scaleX,\n                y: (screenW - (clientX - rootRect.left)) \/ scaleY\n            };\n        }\n        const rect = fit.getBoundingClientRect();\n        const transform = window.getComputedStyle(fit).transform;\n        const scaleX = rect.width \/ BASE_W || 1;\n        const scaleY = ((_gqsGate_24 => _gqsGate_24 ? transform.startsWith(\"matrix(\") : _gqsGate_24)(transform)) ? scaleX : (rect.height \/ BASE_H || scaleX);\n        return {\n            x: (clientX - rect.left) \/ scaleX,\n            y: (clientY - rect.top) \/ scaleY\n        };\n    }\n    function pointInRect(p, r) { return (_gqsGate_25 => _gqsGate_25 ? p.y <= r.y + r.h : _gqsGate_25)((_gqsGate_26 => _gqsGate_26 ? p.y >= r.y : _gqsGate_26)((_gqsGate_27 => _gqsGate_27 ? p.x <= r.x + r.w : _gqsGate_27)(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]))\n                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))\n                return { type: \"tableau\", col: i };\n        }\n        if (pointInRect(p, POS.stock))\n            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)\n            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)\n            return false;\n        for (let i = 0; i < 4; i++) {\n            const target = { type: \"foundation\", index: i };\n            if (canMove(sel, target))\n                return tryMove(sel, target);\n        }\n        playSound(\"invalid\");\n        setStatus(\"That card is not ready for a Golden Shelf yet.\", 1200);\n        return false;\n    }\n    function handleTapSelection(sel, cardId) {\n        const now = Date.now();\n        const isDouble = (_gqsGate_28 => _gqsGate_28 ? now - lastTap.time < 340 : _gqsGate_28)((_gqsGate_29 => _gqsGate_29 ? lastTap.id === cardId : _gqsGate_29)(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 archive column, or drag the selected card.\", 1200);\n        render();\n    }\n    function onPointerDown(e) {\n        if (e.target.closest(\"button\"))\n            return;\n        if (!state.started || state.paused || state.won)\n            return;\n        e.preventDefault();\n        const targetAtStart = targetFromElement(e.target);\n        if ((_gqsGate_30 => _gqsGate_30 ? targetAtStart.type === \"stock\" : _gqsGate_30)(targetAtStart)) {\n            drawStock();\n            return;\n        }\n        if ((_gqsGate_31 => _gqsGate_31 ? e.pointerId !== undefined : _gqsGate_31)(cardsEl.setPointerCapture)) {\n            try {\n                cardsEl.setPointerCapture(e.pointerId);\n            }\n            catch (err) { }\n        }\n        const cardEl = e.target.closest(\".gqs-card\");\n        if (!cardEl || !cardsEl.contains(cardEl)) {\n            const pointTarget = targetFromPoint(e.clientX, e.clientY);\n            if ((_gqsGate_32 => _gqsGate_32 ? pointTarget.type === \"stock\" : _gqsGate_32)(pointTarget)) {\n                drawStock();\n                return;\n            }\n            if (state.selected) {\n                if ((_gqsGate_33 => _gqsGate_33 ? tryMove(state.selected, pointTarget) : _gqsGate_33)(pointTarget))\n                    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 ((_gqsGate_34 => _gqsGate_34 ? tryMove(state.selected, target, true) : _gqsGate_34)(target))\n                return;\n        }\n        const sel = sourceFromElement(cardEl);\n        if (!sel)\n            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)\n            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 ((_gqsGate_35 => _gqsGate_35 ? dist > 7 : _gqsGate_35)(!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)\n            moveGhost(gamePoint(e.clientX, e.clientY));\n    }\n    function onPointerUp(e) {\n        if (!interaction)\n            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 ((_gqsGate_36 => _gqsGate_36 ? tryMove(sel, target) : _gqsGate_36)(target)) {\n                interaction = null;\n                return;\n            }\n            playSound(\"invalid\");\n            setStatus(\"The card settles back onto the reading table.\", 900);\n            state.selected = null;\n            interaction = null;\n            render();\n        }\n        else {\n            interaction = null;\n            handleTapSelection(sel, cardId);\n        }\n    }\n    function onPointerCancel() {\n        if (!interaction)\n            return;\n        window.removeEventListener(\"pointermove\", onPointerMove);\n        clearGhost();\n        interaction = null;\n        state.selected = null;\n        render();\n    }\n    function findLibraryHint() {\n        const hints = [];\n        function add(sel, target, score, msg) {\n            if (canMove(sel, target))\n                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++)\n                add(sel, { type: \"foundation\", index: i }, 130, \"Move \" + cardName(wasteTop) + \" to a Golden Shelf.\");\n        }\n        state.tableau.forEach(function (col, c) {\n            if (!col.length)\n                return;\n            for (let i = 0; i < col.length; i++) {\n                const card = col[i];\n                if (!card.faceUp)\n                    continue;\n                const stack = col.slice(i);\n                if (!isValidTableauStack(stack))\n                    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++)\n                        add(sel, { type: \"foundation\", index: f }, 150, \"Move \" + cardName(card) + \" to a Golden Shelf.\");\n                }\n                for (let t = 0; t < 7; t++) {\n                    if (t === c)\n                        continue;\n                    const opensHidden = (_gqsGate_37 => _gqsGate_37 ? !col[i - 1].faceUp : _gqsGate_37)(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 hidden archive cards.\" : \"Move this stack to open the archive table.\");\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++)\n                add(sel, { type: \"tableau\", col: t }, 62, \"Move \" + cardName(wasteTop) + \" to the archive table.\");\n        }\n        for (let f = 0; f < 4; f++) {\n            const pile = state.foundations[f];\n            if (!pile.length)\n                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++)\n                add(sel, { type: \"tableau\", col: t }, 25, \"A Golden Shelf card can return to the tableau if the archive arrangement needs it.\");\n        }\n        if (!hints.length) {\n            if (state.stock.length)\n                return { action: \"draw\", msg: \"Draw from the golden deck.\" };\n            if ((_gqsGate_38 => _gqsGate_38 ? state.recycleUsed < MODE[state.mode].recycleLimit : _gqsGate_38)(state.waste.length))\n                return { action: \"recycle\", msg: \"Renew 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 useLibraryHint() {\n        if (!state.started || state.paused || state.won)\n            return;\n        state.hintCount++;\n        const hint = findLibraryHint();\n        if (!hint) {\n            playSound(\"invalid\");\n            setStatus(\"No helpful archive 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)\n            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)\n            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(\"gqs-game-active\");\n        root.classList.remove(\"gqs-paused\");\n        playSound(\"undo\");\n        setStatus(\"One step returned to the reading table.\", 1000);\n        saveGame();\n        render();\n    }\n    function checkWin() {\n        if (foundationTotal() !== 52)\n            return;\n        const finishElapsed = nowElapsed();\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        const score = calcScore();\n        let best = loadBest();\n        let note = \"The golden archive is complete.\";\n        if (score > best.bestScore) {\n            best.bestScore = score;\n            note = \"New Goldenquill Solitaire 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 === \"The golden archive is complete.\" ? \"New best moves.\" : note + \" New best moves.\";\n        }\n        saveBest(best);\n        clearSave();\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        pauseOverlay.classList.remove(\"active\");\n        winOverlay.classList.add(\"active\");\n        root.classList.remove(\"gqs-paused\");\n        setStatus(\"Every card has reached its Golden Shelf.\");\n        playSound(\"win\");\n        startFireworks();\n        render();\n    }\n    function togglePause() {\n        if (!state.started || state.won)\n            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(\"gqs-paused\");\n            setStatus(\"The reading table is paused.\");\n            playSound(\"pause\");\n            saveGame();\n        }\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(\"gqs-paused\");\n            setStatus(\"The honeylit room is moving again.\", 900);\n            playSound(\"resume\");\n        }\n        render();\n    }\n    function saveAndReturnStart() {\n        if (!state.started)\n            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(\"gqs-paused\");\n        updateContinueButton();\n        playSound(\"save\");\n        setStatus(\"Game saved. Continue is available from the Goldenquill Solitaire 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 redeals.\" : \"Relaxed selected: draw one, unlimited redeals.\", 1000);\n        playSound(\"move\");\n    }\n    function updateModeButtons() {\n        root.querySelectorAll(\".gqs-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    function fullscreenNode() {\n        return document.fullscreenElement || document.webkitFullscreenElement || null;\n    }\n    function isFullscreenActive() {\n        return fullscreenNode() === root || fallbackFullscreen;\n    }\n    function setPageLock(active) {\n        document.documentElement.classList.toggle(\"gqs-page-lock\", active);\n        if (document.body)\n            document.body.classList.toggle(\"gqs-page-lock\", active);\n    }\n    function enterFallbackFullscreen() {\n        fallbackFullscreen = true;\n        root.classList.add(\"gqs-fallback-fullscreen\");\n        setPageLock(true);\n        resizeGame();\n    }\n    function exitFallbackFullscreen() {\n        fallbackFullscreen = false;\n        root.classList.remove(\"gqs-fallback-fullscreen\");\n        setPageLock(false);\n        resizeGame();\n    }\n    async function toggleFullscreen() {\n        const active = fullscreenNode();\n        if (active) {\n            try {\n                if ((_gqsGate_39 => _gqsGate_39 ? screen.orientation.unlock : _gqsGate_39)(screen.orientation)) {\n                    try {\n                        screen.orientation.unlock();\n                    }\n                    catch (err) { }\n                }\n                const exit = document.exitFullscreen || document.webkitExitFullscreen;\n                if (exit)\n                    await exit.call(document);\n            }\n            catch (err) { }\n            resizeGame();\n            return;\n        }\n        if (fallbackFullscreen) {\n            exitFallbackFullscreen();\n            return;\n        }\n        const request = root.requestFullscreen || root.webkitRequestFullscreen;\n        if (!request) {\n            enterFallbackFullscreen();\n            return;\n        }\n        try {\n            await request.call(root);\n            if ((_gqsGate_40 => _gqsGate_40 ? screen.orientation.lock : _gqsGate_40)((_gqsGate_41 => _gqsGate_41 ? screen.orientation : _gqsGate_41)(shouldRotateFullscreen()))) {\n                try {\n                    await screen.orientation.lock(\"landscape\");\n                }\n                catch (err) { }\n            }\n        }\n        catch (err) {\n            enterFallbackFullscreen();\n        }\n        resizeGame();\n    }\n    function resizeGame() {\n        const isFs = isFullscreenActive();\n        const w = (isFs ? window.innerWidth : root.clientWidth) || root.clientWidth || BASE_W;\n        const h = (isFs ? window.innerHeight : root.clientHeight) || root.clientHeight || BASE_H;\n        const portraitFs = (_gqsGate_42 => _gqsGate_42 ? h > w : _gqsGate_42)(isFs);\n        const rotateFs = (_gqsGate_43 => _gqsGate_43 ? shouldRotateFullscreen() : _gqsGate_43)(portraitFs);\n        root.classList.toggle(\"gqs-is-fullscreen\", isFs);\n        fit.style.transformOrigin = \"0 0\";\n        if ((_gqsGate_44 => _gqsGate_44 ? rotateFs : _gqsGate_44)(isFs)) {\n            const scaleX = h \/ BASE_W;\n            const scaleY = w \/ BASE_H;\n            fit.style.left = \"0px\";\n            fit.style.top = \"0px\";\n            fit.style.transform = \"matrix(0,\" + scaleX + \",\" + (-scaleY) + \",0,\" + w + \",0)\";\n            return;\n        }\n        if ((_gqsGate_45 => _gqsGate_45 ? portraitFs : _gqsGate_45)(isFs)) {\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            return;\n        }\n        if (isFs) {\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            return;\n        }\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    }\n    function updateMuteButton() {\n        muteBtn.setAttribute(\"aria-label\", state.muted ? \"Muted\" : \"Sound\");\n        root.classList.toggle(\"gqs-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)\n                return;\n            const target = targetFromElement(e.target);\n            if ((_gqsGate_46 => _gqsGate_46 ? target.type === \"stock\" : _gqsGate_46)(target)) {\n                e.preventDefault();\n                drawStock();\n                return;\n            }\n            if ((_gqsGate_47 => _gqsGate_47 ? (target.type === \"foundation\" || target.type === \"tableau\") : _gqsGate_47)((_gqsGate_48 => _gqsGate_48 ? target : _gqsGate_48)(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)\n                return;\n            const target = targetFromElement(e.target);\n            if ((_gqsGate_49 => _gqsGate_49 ? target.type === \"tableau\" : _gqsGate_49)(target)) {\n                e.preventDefault();\n                tryMove(state.selected, target);\n            }\n        }, { passive: false });\n        root.querySelectorAll(\".gqs-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\", useLibraryHint);\n        pauseBtn.addEventListener(\"click\", togglePause);\n        fullscreenBtn.addEventListener(\"click\", toggleFullscreen);\n        muteBtn.addEventListener(\"click\", function () {\n            state.muted = !state.muted;\n            writeStore(MUTE_KEY, state.muted ? \"1\" : \"0\");\n            updateMuteButton();\n            if (!state.muted)\n                playSound(\"move\");\n        });\n        function handleFullscreenChange() {\n            if (fullscreenNode() === root) {\n                fallbackFullscreen = false;\n                root.classList.remove(\"gqs-fallback-fullscreen\");\n                setPageLock(false);\n            }\n            resizeGame();\n            resizeFireworksCanvas();\n            setTimeout(resizeGame, 100);\n            setTimeout(resizeGame, 260);\n        }\n        document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n        document.addEventListener(\"webkitfullscreenchange\", handleFullscreenChange);\n        document.addEventListener(\"keydown\", function (e) {\n            if ((_gqsGate_50 => _gqsGate_50 ? fallbackFullscreen : _gqsGate_50)(e.key === \"Escape\"))\n                exitFallbackFullscreen();\n        });\n        window.addEventListener(\"resize\", function () {\n            resizeGame();\n            resizeFireworksCanvas();\n        }, { passive: true });\n        window.addEventListener(\"orientationchange\", function () {\n            setTimeout(function () {\n                resizeGame();\n                resizeFireworksCanvas();\n            }, 220);\n        }, { passive: true });\n        if (window.visualViewport) {\n            window.visualViewport.addEventListener(\"resize\", resizeGame, { passive: true });\n        }\n        if (window.ResizeObserver) {\n            new ResizeObserver(resizeGame).observe(root);\n        }\n        window.addEventListener(\"beforeunload\", function () {\n            if ((_gqsGate_51 => _gqsGate_51 ? !state.won : _gqsGate_51)(state.started))\n                saveGame();\n        });\n        document.addEventListener(\"visibilitychange\", function () {\n            if ((_gqsGate_52 => _gqsGate_52 ? !state.won : _gqsGate_52)((_gqsGate_53 => _gqsGate_53 ? state.started : _gqsGate_53)(document.hidden)))\n                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    createDropZones();\n    bindEvents();\n    updateMuteButton();\n    updateModeButtons();\n    updateContinueButton();\n    initEmpty();\n    resizeGame();\n    resizeFireworksCanvas();\n    updateStats();\n    setStatus(statusEl.textContent, 2200);\n})();\n\n<\/script>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Classic Klondike Solitaire Gameplay<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The main objective in <strong>Goldenquill Solitaire<\/strong> is to move all fifty-two cards into the four foundation piles. Each foundation begins with an Ace and continues upward through 2, 3, 4, and the remaining ranks until reaching the King. Cards placed in a foundation must belong to the same suit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The tableau contains seven columns. At the beginning of a new game, each column holds one more card than the column before it. Only the uppermost card in each column begins face up, while the cards beneath it remain hidden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On the tableau, cards must be placed in descending rank order while alternating between the two suit-color groups. A suitable Queen may be placed beneath a King, a Jack beneath a Queen, and so on. Moving cards correctly opens new routes through the layout and may expose hidden cards.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Face-up sequences that already follow the descending alternating-color rule can be moved together. This makes it possible to reorganize several cards with one action and create useful empty spaces. An empty tableau column may accept any card or valid stack, giving players more flexibility than versions of solitaire that restrict empty columns to Kings.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Relaxed and Classic Modes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Goldenquill Solitaire<\/strong> includes two gameplay modes so players can choose the experience that best matches their mood.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Relaxed Mode<\/strong> draws one card at a time from the stock pile. The waste pile can be returned to the stock without a fixed limit. This mode provides easier access to individual cards and creates a calm, forgiving solitaire experience. It is ideal for learning the board, planning long sequences, or enjoying the Honey Library without strong pressure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Classic Mode<\/strong> draws three cards at a time. Only the upper available card may be played, so the order of the waste pile becomes much more important. Classic Mode also limits the number of times the waste pile can be recycled. Reusing the deck applies a score penalty, encouraging players to study every available move before requesting another pass.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both modes use the same fundamental Klondike rules, but they produce noticeably different rhythms. Relaxed Mode feels like slowly restoring a quiet collection, while Classic Mode turns the Goldenquill Register into a demanding archive challenge.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Reveal the Hidden Archive Cards<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Many cards begin face down beneath the tableau. These hidden cards represent records that have been covered by years of dust, misplaced notes, and collapsed shelf labels.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whenever a face-up card or stack is moved away and exposes the uppermost hidden card, that card automatically turns face up. Revealing cards is one of the most valuable actions in the game because it creates new possibilities and provides a score bonus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A strong strategy usually prioritizes moves that uncover hidden cards. Moving a card directly to a foundation may look useful, but opening a facedown card can sometimes create more opportunities. Players must decide whether to build foundations immediately or keep certain cards available for tableau movement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Use the Stock and Waste Piles Carefully<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The stock pile provides cards that are not initially placed in the tableau. Selecting the stock moves one or more cards into the waste pile according to the chosen mode.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In Relaxed Mode, one card is revealed with each draw. In Classic Mode, up to three cards are revealed together. Because only the top playable card in the waste pile can be moved, the drawing order becomes an important part of the puzzle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Repeatedly drawing cards without a plan may cause useful cards to remain trapped beneath others. Skilled players remember the sequence of the waste pile and use each cycle to prepare moves that will expose important Aces, low-ranking cards, or cards needed to clear the tableau.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Helpful Controls for Strategic Play<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The game supports both tap-based and drag-based controls. Select a playable card or valid tableau sequence, then choose a highlighted destination. Cards can also be dragged directly to a legal tableau column or foundation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Double-tapping a single card attempts to move it automatically to a compatible foundation. This is useful when an obvious foundation move is available and allows the player to keep the game moving smoothly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Undo<\/strong> button restores the previous position. Undo carries a score penalty, so it is best used to recover from a genuine mistake rather than test every possible move without consequence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Hint<\/strong> button searches the current arrangement for a helpful action. It may highlight a tableau move, recommend moving a card to a foundation, or suggest drawing from the stock. Hints also reduce the score, preserving the value of solving difficult situations independently.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Restart<\/strong> button returns the current deal to its original arrangement, while <strong>New Game<\/strong> shuffles and deals a completely different Goldenquill deck.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Save and Continue Your Restoration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A full solitaire game sometimes requires more time than a short break allows. Goldenquill Solitaire includes a browser-based save system so an unfinished game can be continued later.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When the game is paused, the player can save the current arrangement and return to the opening panel. The stock, waste, foundations, tableau, selected mode, score-related progress, moves, and elapsed time are preserved in the browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When returning, the Continue option restores the saved card room. Because the save data is stored locally, it may be removed if browser storage is cleared, private browsing is used, or the game is opened on another device.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Score, Time, Moves, and Personal Records<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The scoring system begins with a base value and rewards useful progress. Moving cards to the foundations and revealing hidden tableau cards adds value to the restoration. Time, moves, hints, undo actions, and certain Classic Mode redeals reduce the final score.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This creates several ways to improve. One player may try to finish as quickly as possible. Another may focus on using fewer moves. A careful strategist may aim for a high score by avoiding hints, unnecessary undo actions, and repeated deck cycles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The game records the best score and also tracks strong completion results such as best moves. These records turn each finished deal into a reason to return and attempt a cleaner restoration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Honey Library Card Suits<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The familiar internal structure of a standard card deck remains intact, but every suit has been reimagined for the world of the Honey Library.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Bee Seals<\/strong> represent official archive permissions, protected letters, and the mark of the library keepers. <strong>Honey Drops<\/strong> belong to recipe books, tea journals, and handwritten kitchen records. <strong>Library Leaves<\/strong> preserve botanical knowledge, woodland studies, and notes gathered beyond the library walls. <strong>Golden Bookmarks<\/strong> guide readers through stories, legends, poetry, and unfinished chapters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The cards use cream parchment surfaces, honey-gold borders, clear ranks, and large central symbols. Although the suits have a new visual identity, their color groups remain easy to recognize so alternating tableau sequences can be understood at a glance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Warm and Responsive Solitaire Experience<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Goldenquill Solitaire<\/strong> is designed to play directly in a modern web browser on desktop computers, laptops, tablets, and smartphones. The table scales to fit the available screen while preserving the card layout and interaction coordinates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fullscreen mode expands the archive table for a more focused experience. On supported mobile devices, the game attempts to use landscape orientation so the seven tableau columns remain easy to read. If orientation locking is unavailable, the layout still scales to remain playable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pause, sound, and fullscreen controls stay available throughout the experience. Sound effects use gentle page movements, wooden taps, archive chimes, and warm completion tones without requiring external audio files.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Complete the Goldenquill Register<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Winning requires more than placing cards wherever they fit. Players must observe the tableau, remember the waste sequence, protect useful movement options, and decide when a card is truly ready for its foundation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every revealed card restores a missing entry. Every completed foundation repairs one section of the catalogue. When all four suits reach their Kings, the Goldenquill Register becomes whole again. The reading lamps brighten, shelf labels return, and the forgotten books regain their names.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enter the Honey Library card room, open the scattered parchment deck, and begin the patient work of restoring every story. Whether you choose the gentle rhythm of Relaxed Mode or the tighter planning of Classic Mode, <strong>Goldenquill Solitaire<\/strong> offers a cozy solitaire journey built around strategy, atmosphere, and the quiet satisfaction of bringing order back to a magical archive.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Goldenquill Solitaire is a warm and thoughtfully designed Klondike solitaire game set inside the oldest card room of the Honey Library. Across a walnut table illuminated by amber lamps, players arrange parchment cards, uncover hidden archive records, and guide four enchanted suits toward their proper foundations. Every move feels like part of a quiet restoration &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-31","post","type-post","status-publish","format-standard","hentry","category-card"],"_links":{"self":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/31","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=31"}],"version-history":[{"count":0,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=\/wp\/v2\/posts\/31\/revisions"}],"wp:attachment":[{"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=31"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=31"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/play.produsenpagarbrc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=31"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}