{"title":"James Test","description":"\u003c!-- ============================================================\n     $3 DEALS FLASH SALE — self-contained HTML block for a Shopify Page\n     Paste the ENTIRE contents of this file into the page editor's HTML view\n     ( the \"\u003c\u003e\" button ) and save WITHOUT switching back to the visual editor,\n     which strips scripts. No Liquid, no theme files, no app required.\n     Page template: full-width-no-title.\n\n     HOW IT WORKS\n     - On the live site the page reads the collection named in CFG.collection\n       (\/collections\/\u003chandle\u003e\/products.json) and renders every product in the\n       collection's own order. Re-sort, add or remove products in the\n       collection and the page follows — no re-paste needed.\n     - Price and compare-at come live from the store, so the page always shows\n       what the cart will charge.\n     - The one-sentence description for each product lives in CFG.blurbs, keyed\n       by product handle. A product with no entry still renders, just without\n       the sentence (and logs a console warning so it's easy to spot).\n     - Products with more than one design \/ color get a button per option.\n       Sold-out designs and fully sold-out products are left off the page.\n     - CFG.snapshot is a copy of the collection taken when this file was built.\n       It's only used when the live read fails, or off-Shopify for previewing.\n\n     EDIT ONLY THE CONFIG BLOCK MARKED \"★ CONFIG ★\" BELOW.\n     ============================================================ --\u003e\n\n\u003cdiv id=\"td-root\" class=\"td-root\"\u003e\n\n  \u003cheader class=\"td-banner td-bleed\"\u003e\n    \u003cdiv class=\"td-banner-in\"\u003e\n      \u003ch1 class=\"td-sr\" id=\"td-heading\"\u003e\u003c\/h1\u003e\n      \u003cp class=\"td-eyebrow\" id=\"td-eyebrow\" aria-hidden=\"true\"\u003e\u003c\/p\u003e\n      \u003cdiv class=\"td-big\" id=\"td-big\" aria-hidden=\"true\"\u003e\u003c\/div\u003e\n      \u003cdiv class=\"td-word\" id=\"td-word\" aria-hidden=\"true\"\u003e\u003c\/div\u003e\n      \u003cp class=\"td-ribbon\" aria-hidden=\"true\"\u003e\u003cspan id=\"td-ribbon\"\u003e\u003c\/span\u003e\u003c\/p\u003e\n      \u003cp class=\"td-copy\" id=\"td-copy\"\u003e\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/header\u003e\n\n  \u003cdiv class=\"td-wrap\"\u003e\n    \u003cdiv class=\"td-grid\" id=\"td-grid\"\u003e\n      \u003cdiv class=\"td-sk\"\u003e\u003c\/div\u003e\n      \u003cdiv class=\"td-sk\"\u003e\u003c\/div\u003e\n      \u003cdiv class=\"td-sk\"\u003e\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cp class=\"td-empty\" id=\"td-empty\" hidden\u003e\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"td-toast\" id=\"td-toast\" role=\"status\" aria-live=\"polite\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n\u003clink rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Fredoka:wght@500;600;700\u0026amp;display=swap\"\u003e\n\n\u003cstyle\u003e\n\/* ---------- scoped reset ----------\n   :where() keeps these at zero specificity so they never beat component rules. *\/\n.td-root, .td-root *, .td-root *::before, .td-root *::after { box-sizing: border-box; }\n.td-root :where(h1,h2,h3,p) { margin: 0; }\n.td-root :where(img) { display: block; max-width: 100%; }\n.td-root :where(button) { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; text-transform: none; }\n.td-root :where(s) { text-decoration: line-through; }\n.td-root :where(a) { text-decoration: none; }\n.td-root [hidden] { display: none !important; }\n\n.td-root {\n  \/* Store palette (same as Flash Deals \/ Care-A-Thon) plus the ad's sale colours.\n     Never put cream or yellow text on white. *\/\n  --td-purple:      #6D0769;\n  --td-purple-deep: #4A0447;\n  --td-purple-dark: #55054F;\n  --td-magenta-ink: #A8146A;\n  --td-plum:        #5B0A4E;   \/* \"$3\" \/ \"DEALS\" fill *\/\n  --td-plum-deep:   #3A0533;   \/* letter depth *\/\n  --td-cream:       #FDEBD0;   \/* letter outline *\/\n  --td-yellow:      #FFF1A3;   \/* FLASH SALE ribbon, % off badge *\/\n  --td-ink:   #1A1019;\n  --td-ink-2: #4A3E48;\n  --td-ink-3: #6E5F6B;\n  --td-rule:  rgba(26,16,25,.55);\n  --td-line:  rgba(26,16,25,.14);\n  --td-page:  #faf6f9;\n  --td-bg-2:  #f3eef2;\n  --td-ok:    #1f6f5c;\n  --td-err:   #b3261e;\n  --td-radius: 8px;\n  --td-btn-radius: 5px;\n  --td-max: 1180px;\n  --td-display: Fredoka, \"Baloo 2\", \"Arial Rounded MT Bold\", \"Trebuchet MS\", sans-serif;\n\n  font-family: Assistant, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n  font-size: 16.9px;\n  color: var(--td-ink);\n  background: var(--td-page);\n  text-align: left;\n  -webkit-font-smoothing: antialiased;\n}\n.td-bleed { width: 100vw; margin-left: calc(50% - 50vw); margin-right: calc(50% - 50vw); }\n.td-wrap  { max-width: var(--td-max); margin: 0 auto; padding: 22px 16px 40px; }\n.td-sr { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n\n\/* ---------- banner: modelled on the $3 Deals ad ---------- *\/\n.td-banner {\n  position: relative; overflow: hidden; isolation: isolate; color: #fff;\n  background: radial-gradient(ellipse 120% 115% at 50% 38%, #E2295F 0%, #CF1F5C 38%, #B3154F 70%, #8E0C43 100%);\n}\n\/* stars + gold sparkles, two tiles at different sizes so the repeat never lines up *\/\n.td-banner::before {\n  content: \"\"; position: absolute; inset: 0; z-index: 0; pointer-events: none;\n  background-image:\n    url(\"data:image\/svg+xml,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='420' height='420' viewBox='0 0 420 420'\u003e\u003cg fill='%237A0A2E' opacity='0.55'\u003e\u003cpath transform='translate(30,40) rotate(-12) scale(1.3)' d='M10 0l2.9 6.6 7.1.6-5.4 4.7 1.7 7-6.3-3.8-6.3 3.8 1.7-7L0 7.2l7.1-.6z'\/\u003e\u003cpath transform='translate(330,70) rotate(18) scale(1)' d='M10 0l2.9 6.6 7.1.6-5.4 4.7 1.7 7-6.3-3.8-6.3 3.8 1.7-7L0 7.2l7.1-.6z'\/\u003e\u003cpath transform='translate(200,250) rotate(-24) scale(.8)' d='M10 0l2.9 6.6 7.1.6-5.4 4.7 1.7 7-6.3-3.8-6.3 3.8 1.7-7L0 7.2l7.1-.6z'\/\u003e\u003cpath transform='translate(60,330) rotate(10) scale(1.15)' d='M10 0l2.9 6.6 7.1.6-5.4 4.7 1.7 7-6.3-3.8-6.3 3.8 1.7-7L0 7.2l7.1-.6z'\/\u003e\u003cpath transform='translate(370,350) rotate(-6) scale(.9)' d='M10 0l2.9 6.6 7.1.6-5.4 4.7 1.7 7-6.3-3.8-6.3 3.8 1.7-7L0 7.2l7.1-.6z'\/\u003e\u003c\/g\u003e\u003c\/svg\u003e\"),\n    url(\"data:image\/svg+xml,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='360' height='360' viewBox='0 0 360 360'\u003e\u003cg fill='%23F6C94E'\u003e\u003ccircle cx='90' cy='30' r='3.2'\/\u003e\u003ccircle cx='250' cy='150' r='2.4'\/\u003e\u003ccircle cx='40' cy='200' r='2.8'\/\u003e\u003ccircle cx='320' cy='280' r='3'\/\u003e\u003ccircle cx='160' cy='330' r='2.2'\/\u003e\u003c\/g\u003e\u003cg fill='%23FFE7A0' opacity='0.9'\u003e\u003cpath transform='translate(300,40) scale(.45)' d='M0,-15 C2.1,-4.2 4.2,-2.1 15,0 C4.2,2.1 2.1,4.2 0,15 C-2.1,4.2 -4.2,2.1 -15,0 C-4.2,-2.1 -2.1,-4.2 0,-15 Z'\/\u003e\u003cpath transform='translate(130,120) scale(.32)' d='M0,-15 C2.1,-4.2 4.2,-2.1 15,0 C4.2,2.1 2.1,4.2 0,15 C-2.1,4.2 -4.2,2.1 -15,0 C-4.2,-2.1 -2.1,-4.2 0,-15 Z'\/\u003e\u003cpath transform='translate(210,290) scale(.4)' d='M0,-15 C2.1,-4.2 4.2,-2.1 15,0 C4.2,2.1 2.1,4.2 0,15 C-2.1,4.2 -4.2,2.1 -15,0 C-4.2,-2.1 -2.1,-4.2 0,-15 Z'\/\u003e\u003c\/g\u003e\u003c\/svg\u003e\");\n  background-size: 420px 420px, 360px 360px;\n  background-position: 0 0, 150px 80px;\n}\n.td-banner-in {\n  position: relative; z-index: 1; max-width: 900px; margin: 0 auto; padding: 14px 16px 16px;\n  display: grid; justify-items: center; text-align: center;\n  \/* side by side at every width: big \"$3\" left, DEALS + ribbon stacked right *\/\n  grid-template-columns: auto auto; column-gap: 14px; align-items: center; justify-content: center;\n  grid-template-areas: \"big eyebrow\" \"big word\" \"big ribbon\" \"big copy\";\n}\n.td-eyebrow { grid-area: eyebrow; font-family: var(--td-display); font-weight: 600;\n  font-size: clamp(16px, 4.2vw, 20px); line-height: 1.15; letter-spacing: .2px;\n  text-shadow: 0 2px 0 rgba(74,4,60,.45); }\n\n\/* \"$3\": plum fill, thick cream outline behind it, and a grid of marquee bulbs\n   clipped to the glyphs. The outline and bulbs are pseudo-elements fed from\n   data-text, so changing the config string updates all three layers. *\/\n.td-big, .td-word { position: relative; isolation: isolate; font-family: var(--td-display); font-weight: 700;\n  color: var(--td-plum); white-space: nowrap; }\n.td-big::before, .td-word::before {\n  content: attr(data-text); position: absolute; inset: 0; z-index: -1;\n  color: var(--td-cream); -webkit-text-fill-color: var(--td-cream);\n  -webkit-text-stroke: .11em var(--td-cream);\n  filter: drop-shadow(.025em .04em 0 var(--td-plum-deep)) drop-shadow(0 .05em .08em rgba(50,0,30,.4)); }\n.td-big { grid-area: big; margin-top: 0; font-size: clamp(66px, 21vw, 162px); line-height: .9; letter-spacing: -.01em; }\n.td-big::after {\n  content: attr(data-text); position: absolute; inset: 0; z-index: 1;\n  color: transparent; -webkit-text-fill-color: transparent;\n  background-image: radial-gradient(circle, #FFFDF2 0, #FFF6D2 .0154em, #F8D778 .0266em, rgba(248,215,120,0) .0392em);\n  background-size: .155em .155em; background-position: .01em .02em;\n  -webkit-background-clip: text; background-clip: text;\n  filter: drop-shadow(0 0 .025em rgba(255,236,160,.95)); }\n.td-word { grid-area: word; margin-top: 0; font-size: clamp(34px, 10vw, 76px); line-height: 1;\n  letter-spacing: .07em; text-transform: uppercase; padding-left: .07em; }\n.td-word::before { -webkit-text-stroke-width: .09em; }\n\n.td-ribbon { grid-area: ribbon; margin-top: clamp(4px, 1.2vw, 8px); filter: drop-shadow(0 4px 0 rgba(74,4,60,.35)); }\n.td-ribbon span { display: inline-block; padding: .2em 1.25em .16em; background: var(--td-yellow); color: var(--td-plum);\n  font-family: var(--td-display); font-weight: 700; font-size: clamp(14px, 3.8vw, 27px); line-height: 1.1;\n  letter-spacing: .07em; text-transform: uppercase;\n  clip-path: polygon(0 0, 100% 0, 95% 50%, 100% 100%, 0 100%, 5% 50%); }\n.td-copy { grid-area: copy; margin-top: 7px; font-family: var(--td-display); font-weight: 600;\n  font-size: clamp(14px, 3.6vw, 16px); line-height: 1.3; text-shadow: 0 2px 0 rgba(74,4,60,.4); }\n\n\/* side by side on wide screens so the first row of products sits higher *\/\n@media (min-width: 760px) {\n  .td-banner-in { padding: 19px 24px 21px; column-gap: 24px; align-items: center; justify-content: center;\n    grid-template-columns: auto auto;\n    grid-template-areas: \"big eyebrow\" \"big word\" \"big ribbon\" \"big copy\"; }\n  .td-big { margin-top: 0; }\n  .td-eyebrow { align-self: end; }\n  .td-copy { align-self: start; }\n}\n\n\/* ---------- grid: 1 \/ 2 \/ 3 up ---------- *\/\n.td-grid { display: grid; gap: 14px; grid-template-columns: 1fr; }\n@media (min-width: 560px) { .td-grid { grid-template-columns: repeat(2, 1fr); gap: 16px; } }\n@media (min-width: 940px) { .td-grid { grid-template-columns: repeat(3, 1fr); gap: 18px; } }\n\n.td-sk { height: 540px; border-radius: var(--td-radius);\n  background: linear-gradient(100deg,#ece6ea 30%,#f7f2f6 50%,#ece6ea 70%); background-size: 220% 100%; animation: td-sh 1.3s infinite; }\n@keyframes td-sh { to { background-position: -220% 0; } }\n.td-empty { padding: 30px 0; text-align: center; color: var(--td-ink-2); }\n\n\/* ---------- card ---------- *\/\n.td-card { position: relative; z-index: 0; display: flex; flex-direction: column; overflow: hidden; background: #fff;\n  border: 1px solid var(--td-line); border-radius: var(--td-radius); }\n.td-media { position: relative; display: block; aspect-ratio: 1 \/ 1; background: var(--td-bg-2); overflow: hidden; }\n.td-media img { width: 100%; height: 100%; object-fit: cover; transition: opacity .18s; }\n.td-media img.is-swap { opacity: .35; }\n.td-badge { position: absolute; top: 10px; left: 10px; z-index: 2; padding: 5px 10px; border-radius: 44px;\n  background: var(--td-yellow); color: var(--td-plum); font-size: 13px; font-weight: 800; letter-spacing: .6px;\n  text-transform: uppercase; line-height: 1; box-shadow: 0 1px 4px rgba(26,16,25,.18); }\n.td-badge--out { background: var(--td-ink-3); color: #fff; }\n\n.td-body { display: flex; flex-direction: column; gap: 9px; flex: 1 1 auto; padding: 13px 14px 15px; }\n.td-name { font-size: 17.2px; font-weight: 700; line-height: 1.3; letter-spacing: .1px; }\n.td-name a { color: inherit; }\n.td-name a:hover { text-decoration: underline; }\n.td-blurb { font-size: 15.4px; line-height: 1.46; color: var(--td-ink-2); }\n\n.td-price { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 9px; }\n.td-now { font-size: 25px; font-weight: 800; line-height: 1.1; color: var(--td-magenta-ink); font-variant-numeric: tabular-nums; }\n.td-was { font-size: 16px; color: var(--td-ink-3); text-decoration-thickness: 1.5px; font-variant-numeric: tabular-nums; }\n.td-save { font-size: 13.6px; font-weight: 800; letter-spacing: .3px; color: var(--td-magenta-ink); }\n\n\/* options + buy row sit at the bottom so every card's button lines up *\/\n.td-buy { margin-top: auto; padding-top: 4px; display: flex; flex-direction: column; gap: 10px; }\n.td-lbl { display: block; margin-bottom: 6px; font-size: 13.4px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; color: var(--td-ink-3); }\n.td-lbl b { font-weight: 600; letter-spacing: .2px; text-transform: none; color: var(--td-ink); }\n.td-opts { display: flex; flex-wrap: wrap; gap: 6px; }\n.td-opt { min-height: 34px; padding: 5px 11px; border: 1px solid var(--td-rule); border-radius: 7px; background: #fff;\n  color: var(--td-ink); font-size: 14.2px; font-weight: 500; line-height: 1.3; letter-spacing: .1px;\n  transition: background .12s, border-color .12s, color .12s; }\n.td-opt:hover:not([aria-pressed=\"true\"]):not([disabled]) { border-color: var(--td-purple); }\n.td-opt[aria-pressed=\"true\"] { background: var(--td-purple); border-color: var(--td-purple); color: #fff; }\n.td-opt[disabled] { color: var(--td-ink-3); border-color: var(--td-line); text-decoration: line-through; cursor: not-allowed; }\n\n.td-row { display: flex; gap: 8px; }\n.td-qty { display: inline-flex; align-items: center; flex: none; height: 46px; border: 1px solid var(--td-rule); border-radius: var(--td-btn-radius); background: #fff; }\n.td-qty button { width: 32px; height: 100%; font-size: 19px; line-height: 1; color: var(--td-ink); }\n.td-qty button:disabled { opacity: .3; cursor: default; }\n.td-qty input { width: 32px; height: 100%; border: 0; padding: 0; text-align: center; background: transparent; color: var(--td-ink);\n  font: inherit; font-size: 16.5px; font-weight: 600; font-variant-numeric: tabular-nums; -moz-appearance: textfield; }\n.td-qty input::-webkit-outer-spin-button, .td-qty input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }\n\n.td-atc { flex: 1 1 auto; min-height: 46px; border-radius: var(--td-btn-radius); background: var(--td-purple); color: #fff;\n  font-size: 17px; font-weight: 700; letter-spacing: .5px; display: flex; align-items: center; justify-content: center;\n  transition: background .14s, transform .06s; }\n.td-atc:hover:not(:disabled) { background: var(--td-purple-dark); }\n.td-atc:active:not(:disabled) { transform: scale(.99); }\n.td-atc:disabled { background: #e6e1e5; color: var(--td-ink-3); cursor: not-allowed; }\n.td-atc.is-busy { pointer-events: none; opacity: .75; }\n.td-atc.is-done { background: var(--td-ok); }\n.td-err { font-size: 14.5px; color: var(--td-err); }\n\n.td-card.is-out .td-media img { filter: grayscale(.5) opacity(.85); }\n\n\/* ---------- toast (used when there's no cart drawer) ---------- *\/\n.td-toast { position: fixed; left: 50%; bottom: 20px; transform: translate(-50%, 18px); z-index: 9999;\n  max-width: calc(100vw - 32px); padding: 11px 18px; border-radius: var(--td-btn-radius);\n  background: var(--td-purple-deep); color: #fff; font-size: 15.4px; text-align: center;\n  opacity: 0; pointer-events: none; transition: opacity .2s, transform .2s; box-shadow: 0 10px 34px -10px rgba(26,16,25,.55); }\n.td-toast.on { opacity: 1; transform: translate(-50%, 0); }\n\n@media (max-width: 559px) {\n  .td-banner-in { padding: 14px 14px 15px; }\n  .td-wrap { padding-top: 16px; }\n}\n@media (prefers-reduced-motion: reduce) {\n  .td-root *, .td-root *::before { animation: none !important; transition: none !important; }\n}\n\n\/* ---------- last-resort hardening against theme button \/ link \/ heading rules ----------\n   Theme rules scoped to an id (#MainContent, #shopify-section-…) out-specify plain\n   classes, so pin every state here. Keep these rules last. *\/\n#td-root .td-banner .td-eyebrow, #td-root .td-banner .td-copy { color: #fff !important; }\n#td-root .td-banner .td-big, #td-root .td-banner .td-word { color: var(--td-plum) !important; -webkit-text-fill-color: var(--td-plum); }\n#td-root .td-banner .td-big::after { -webkit-text-fill-color: transparent !important; }\n#td-root .td-banner .td-ribbon span { color: var(--td-plum) !important; }\n#td-root .td-name, #td-root .td-name a, #td-root .td-name a:visited, #td-root .td-name a:hover { color: var(--td-ink); }\n#td-root .td-now { color: var(--td-magenta-ink); }\n\n#td-root .td-opt, #td-root .td-opt:hover, #td-root .td-opt:focus { color: var(--td-ink); background: #fff; opacity: 1; width: auto; letter-spacing: .1px; }\n#td-root .td-opt[aria-pressed=\"true\"], #td-root .td-opt[aria-pressed=\"true\"]:hover, #td-root .td-opt[aria-pressed=\"true\"]:focus\n  { color: #fff; background: var(--td-purple); border-color: var(--td-purple); }\n#td-root .td-opt[disabled], #td-root .td-opt[disabled]:hover { color: var(--td-ink-3); background: #fff; }\n\n#td-root .td-qty button, #td-root .td-qty button:hover, #td-root .td-qty button:focus { color: var(--td-ink); background: transparent; width: 32px; opacity: 1; }\n#td-root .td-qty button:disabled { opacity: .3; }\n\n#td-root .td-atc, #td-root .td-atc:hover, #td-root .td-atc:focus, #td-root .td-atc:active\n  { color: #fff !important; opacity: 1; width: auto; text-decoration: none; }\n#td-root .td-atc:hover:not(:disabled), #td-root .td-atc:focus:not(:disabled) { background: var(--td-purple-dark) !important; }\n#td-root .td-atc.is-busy { opacity: .75 !important; }\n#td-root .td-atc.is-done, #td-root .td-atc.is-done:hover { background: var(--td-ok) !important; }\n#td-root .td-atc:disabled, #td-root .td-atc:disabled:hover { background: #e6e1e5 !important; color: var(--td-ink-3) !important; }\n\n#td-root .td-opt:focus-visible, #td-root .td-atc:focus-visible, #td-root .td-qty button:focus-visible,\n#td-root .td-name a:focus-visible, #td-root .td-media:focus-visible\n  { outline: 2px solid var(--td-purple); outline-offset: 2px; }\n#td-root .td-atc:focus-visible { outline-color: #D4A333; }\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n  \"use strict\";\n\n  var CDN = \"https:\/\/cdn.shopify.com\/s\/files\/1\/1185\/0798\/\";   \/\/ snapshot image prefix\n\n  \/* =========================================================================\n     ★ CONFIG ★  — the only part you need to edit.\n     ========================================================================= *\/\n  var CFG = {\n    \/\/ The collection this page is built from. Order on the page = the\n    \/\/ collection's own sort order in Shopify admin.\n    collection: \"263d-3-dollar-deals\",\n\n    banner: {\n      heading: \"$3 Deals Flash Sale!\",          \/\/ the real \u003ch1\u003e (screen readers, SEO)\n      eyebrow: \"\",                              \/\/ e.g. \"Little Prices, Big Variety.\" (empty = hidden)\n      big:     \"$3\",\n      word:    \"Deals\",\n      ribbon:  \"Flash Sale\",\n      copy:    \"\"                                 \/\/ e.g. \"Shop quick, before they\\u2019re gone!\" (empty = hidden)\n    },\n\n    \/\/ One sentence per product, keyed by product handle.\n    blurbs: {\n      \"319606-your-favorite-straw-cover\": \"Playful silicone straw toppers that keep spills and bugs out of your drink, reusable and available in nine fun designs.\",\n      \"92439-silicone-straw-set-with-brush\": \"A pair of reusable silicone straws and a cleaning brush, tucked into a turquoise case that\\u2019s easy to spot in any bag.\",\n      \"50460-wise-in-love-owl-keychain\": \"A flower-covered owl keychain with free-moving wings and a sweet message about love on the back.\",\n      \"96315-glitter-gnome-holiday-sign\": \"A glittery, gnome-topped holiday sign that reads \\u201cBelieve\\u201d or \\u201cWelcome\\u201d and comes ready to hang.\",\n      \"98368-under-the-sea-pewter-necklace\": \"A pewter ocean pendant on a silver-plated chain, from seahorses and dolphins to a lucky turtle.\",\n      \"94748-cat-dog-hair-ties-set-of-4\": \"A set of four hair ties topped with adorable cat or dog faces, cute for all ages.\",\n      \"90622-the-pawfather-door-mat\": \"A skid-resistant door mat with a soft felt top that announces \\u201cThe Pawfather Lives Here.\\u201d\",\n      \"67628-its-not-a-home-without-a-dog-sign\": \"A rustic, made-in-the-USA sign celebrating your favorite breed, with a rope hanger for easy display.\",\n      \"91954-pop-of-color-classic-bandana\": \"A 100% cotton paisley bandana with endless everyday uses, in white, navy, or khaki.\",\n      \"87654-promo-super-cozy-trade-peacock-inflatable-neck-pillow\": \"An inflatable travel neck pillow with a super-soft peacock-print fleece cover that deflates to pack away.\",\n      \"92345-jacquard-grip-yoga-socks\": \"Toeless yoga socks with grip dots along the soles for steady footing on the mat or floor.\",\n      \"88171-lustrous-leaf-jewelry\": \"A real leaf electroplated in shimmering metal, so every necklace is truly one of a kind.\",\n      \"95429-bamboo-serving-spoon-set-set-of-2\": \"Two eco-friendly bamboo serving spoons printed with paw prints or dragonflies.\",\n      \"33968-guatemalan-worry-no-more-doll\": \"Share your worries with these tiny handmade Guatemalan dolls, tuck them under your pillow, and let them carry your cares away.\",\n      \"63945-infinite-inspiration-bracelet\": \"A handwoven, beaded infinity bracelet made by artisans and perfect for stacking.\",\n      \"87814-wiggle-butt-pet-tag\": \"An enamel pet tag that tells the tail-wagging truth, with a blank back ready for engraving.\",\n      \"92213-northern-lights-bandana-scarf\": \"A hand-dyed cotton bandana scarf in bold, dazzling colors with soft rounded corners.\",\n      \"98366-music-lover-necklace\": \"A delicate pewter instrument or music-note pendant on an inspirational card, ready to gift.\",\n      \"82447-for-the-love-of-our-pets-necklace\": \"A handmade, fairly traded pewter paw pendant on a silver-plated chain.\",\n      \"77055-live-love-laugh-pewter-necklace\": \"Three pewter charms reading Live, Love, Laugh hang from a silver-tone chain.\",\n      \"82556-mindful-living-necklace\": \"A silver-tone tree necklace made in Thailand, a gentle everyday reminder to live more mindfully.\",\n      \"92578-mindfully-living-pewter-necklace\": \"A handmade pewter peace, lotus, or namaste pendant on a silver-plated chain.\",\n      \"52892-supporting-diabetes-awareness-low-profile-cap\": \"A lightweight, low-profile cap that shows your support for everyone touched by diabetes.\",\n      \"91088-always-with-me-paw-teardrop-necklace\": \"A shining teardrop pendant that honors a beloved pet who will always be with you.\",\n      \"92078-harvest-paws-table-linens\": \"A set of four white cloth napkins patterned with autumn-hued paw prints.\",\n      \"79180-family-tree-keychain\": \"A metal family tree keychain that reads \\u201cWhere life begins and love never dies.\\u201d\",\n      \"91599-handmade-felt-paw-print-oven-mitt\": \"A handmade New Zealand wool felt oven mitt covered in paw prints, in gray or blue.\",\n      \"93675-firefighter-mixed-metals-car-charm\": \"A handcrafted car charm with a firefighter\\u2019s helmet, a \\u201cThank You\\u201d on the back, and copper, silver, and brass hearts.\",\n      \"94674-hand-painted-ceramic-skull\": \"A ceramic skull hand-painted by artisans in Mexico, perfect for celebrating D\\u00eda de los Muertos.\",\n      \"67494-pink-ribbon-love-earbuds\": \"Pink-ribbon earbuds with interchangeable inserts for a custom fit and a zippered carrying pouch.\",\n      \"328337-bold-brilliant-necklaces\": \"A versatile chain for your favorite pendant, from gold-tone and steel ball chain to cord and organza.\",\n      \"87803-in-the-kitchen-necklace-collection\": \"A tiny pewter pie, rolling pin, or whisk pendant for anyone who loves to cook or bake.\",\n      \"52104-lifes-gifts-necklace\": \"A pewter word pendant with a tiny colored tassel, handmade and fairly traded by a women\\u2019s craft cooperative.\",\n      \"95310-new-perspective-eyeglass-necklace-holder\": \"An adjustable steel-and-cord eyeglass holder that reads \\u201cSometimes, all you need is a new perspective.\\u201d\",\n      \"94827-bangle-keychain\": \"A faux-leather bangle keychain wrapped in a colorful print and topped with a tassel.\",\n      \"64555-infinite-inspiration-charm-bracelet\": \"A charm bracelet hand-woven and beaded by women artisans in Guatemala, made for stacking.\",\n      \"45922-proud-mom-magnet\": \"A flag-backed military mom magnet whose center heart pops out to become a photo frame.\",\n      \"91786-hanging-out-sloth-enamel-pin\": \"A flower-crowned enamel sloth pin for anyone who loves life at a slower pace.\",\n      \"93735-best-grandma-mixed-metal-car-charm\": \"A handcrafted copper heart car charm with children\\u2019s handprints and a loving message for Grandma.\",\n      \"316673-purple-paw-dog-slow-feeder-licking-mat\": \"A suction-cup licking mat that slows down speedy eaters and helps ease stress at mealtime.\",\n      \"92420-my-guardian-angel-ceramic-charm\": \"A tiny hand-painted guardian angel from Guatemala, with a textile pouch for carrying or gifting.\",\n      \"89361-live-play-eat-necklace\": \"Three minimalist silver-tone pendants that read Live, Play, Eat.\",\n      \"97019-chanukah-chocolate-mold\": \"Chocolate molds shaped like dreidels and menorahs for sweet Chanukah treats.\",\n      \"90871-worry-no-more-doll-necklace\": \"A traditional worry doll charm set inside a brass-tone circle pendant.\",\n      \"332486-pretty-long-legs-flamingo-earrings\": \"Handcrafted copper flamingo earrings from Mexico with whimsical, hand-carved details.\",\n      \"95123-double-sided-table-tent-whiteboard\": \"A handmade iron tabletop whiteboard, double-sided for notes, menus, or reminders.\",\n      \"92415-ceramic-messenger-angel-figurine\": \"A hand-painted Guatemalan angel holding a tiny scroll for your own personal message.\"\n    },\n\n    \/\/ Option names shown above the buttons. Anything not listed shows as-is.\n    optionLabels: { \"Selection\": \"Design\" },\n\n    addText:     \"Add to cart\",\n    soldOutText: \"Sold out\",\n    showSaveBadge: true,      \/\/ \"66% off\" pill on the image\n    soldOut:     \"hide\",      \/\/ \"hide\" = sold-out products are left off the page | \"end\" = drop to the bottom | \"keep\"\n    maxQty:      10,\n    afterAdd:    \"drawer\",    \/\/ \"drawer\" | \"cart\" | \"toast\"\n\n    \/\/ Copy of the collection at build time (Oct 22, 2026). Fallback only — see header.\n    \/\/ { h:handle, t:title, i:image, c:compare-at cents, o:[option names],\n    \/\/   v:[[variant id, \"value|value\", available 1\/0, variant image]] }  price is $3 throughout.\n    snapshot: [\n      {h:\"319606-your-favorite-straw-cover\",t:\"Your Favorite Straw Cover\",i:\"files\/319606_Group02.jpg\",c:895,o:[\"Selection\"],v:[[40842851549259,\"Black Cat\",1,\"files\/319606_ALT12.jpg\"],[40842851582027,\"Cat Mom\",1,\"files\/319606_ALT6.jpg\"],[40842851614795,\"Dog Mom\",1,\"files\/319606_ALT15.jpg\"],[40842851647563,\"I Heart Cats\",1,\"files\/319606_ALT1.jpg\"],[40842851680331,\"Turtle\",1,\"files\/319606_ALT2.jpg\"],[40842851713099,\"Dogs Over People\",1,\"files\/319606_ALT10.jpg\"],[41152858259531,\"Stay Pawsitive\",1,\"files\/319606_LF_OP03.jpg\"],[41152858292299,\"Red Heart with Paws\",1,\"files\/319606_LF_OP05.jpg\"],[41152858325067,\"Cat With Pink Ears\",1,\"files\/319606_LF_OP01.jpg\"]]},\n      {h:\"92439-silicone-straw-set-with-brush\",t:\"Silicone Straw Set with Brush\",i:\"products\/0011_92439_LF_OP17.jpg\",c:1495,o:[\"Design\"],v:[[33004251086923,\"Dragonfly Vines\",1,\"\"]]},\n      {h:\"50460-wise-in-love-owl-keychain\",t:\"Wise in Love Owl Keychain\",i:\"products\/wise-in-love-owl-keychain-3.jpg\",c:895,o:[\"Color\"],v:[[30769815306,\"Green\",1,\"\"]]},\n      {h:\"96315-glitter-gnome-holiday-sign\",t:\"Glitter Gnome Holiday Sign\",i:\"products\/96315_MN.jpg\",c:1795,o:[\"Design\"],v:[[39892820492363,\"Believe\",1,\"products\/96315_VER2.jpg\"],[39892820525131,\"Welcome\",1,\"products\/96315_VER1.jpg\"]]},\n      {h:\"98368-under-the-sea-pewter-necklace\",t:\"Under the Sea Pewter Necklace\",i:\"files\/98368_VER3.jpg\",c:995,o:[\"Selection\"],v:[[32945061789771,\"Seahorse\",1,\"files\/98368_VER3.jpg\"],[32945061953611,\"Dolphin Twins\",1,\"files\/98368_VER10.jpg\"],[32945061920843,\"Fish\",1,\"files\/98368_VER11.jpg\"],[33024091488331,\"Stallion Seahorse\",1,\"files\/98368_VER7.jpg\"],[39807567921227,\"Starfish\",1,\"files\/98368_VER2.jpg\"],[32945061691467,\"Lucky Turtle\",1,\"files\/98368_VER12.jpg\"],[32945062051915,\"Whale\",1,\"files\/98368_VER9.jpg\"]]},\n      {h:\"94748-cat-dog-hair-ties-set-of-4\",t:\"Cat \u0026 Dog Hair Ties - Set of 4\",i:\"files\/94747_MN_1.jpg\",c:1295,o:[\"Design\"],v:[[40919670456395,\"Dog\",1,\"files\/94749_ALT1.jpg\"],[40919670489163,\"Cat Face\",1,\"files\/94747_MN.jpg\"]]},\n      {h:\"90622-the-pawfather-door-mat\",t:\"The Pawfather Door Mat\",i:\"products\/0000_90622_LF_OP1_c9f89e99-0698-450b-a965-116826b8f627.jpg\",c:2295,o:[\"Selection\"],v:[[31082148069451,\"Default Title\",1,\"\"]]},\n      {h:\"67628-its-not-a-home-without-a-dog-sign\",t:\"It's Not a Home Without a Dog Sign\",i:\"products\/it-s-not-a-home-without-a-dog-sign-1.gif\",c:1295,o:[\"Selection\"],v:[[12354481782848,\"Basenji\",1,\"products\/67628_VER79.jpg\"],[12354482044992,\"Border Terrier\",1,\"products\/67628_VER62.jpg\"],[12354482208832,\"Bull Terrier\",1,\"products\/67628_VER70.jpg\"],[12354482274368,\"Bullmastiff\",1,\"products\/67628_VER69.jpg\"],[12354482307136,\"Cairn Terrier\",1,\"products\/67628_VER71.jpg\"],[12354482372672,\"Chesapeake Bay Retriever\",1,\"products\/67628_VER74.jpg\"],[12354482536512,\"Collie\",1,\"products\/67628_VER50.jpg\"],[12354482831424,\"English Setter\",1,\"products\/67628_VER60.jpg\"],[12354483159104,\"Irish Setter\",1,\"products\/67628_VER44.jpg\"],[12354483421248,\"Lhasa Apso\",1,\"products\/67628_VER24.jpg\"]]},\n      {h:\"91954-pop-of-color-classic-bandana\",t:\"Pop of Color Classic Bandana\",i:\"products\/91954_VER14.jpg\",c:1295,o:[\"Color\"],v:[[32145422123083,\"White\",1,\"products\/91954_VER15.jpg\"],[32145422090315,\"Navy\",1,\"products\/91954_VER16.jpg\"],[32145422221387,\"Khaki\",1,\"products\/91954_VER14.jpg\"]]},\n      {h:\"87654-promo-super-cozy-trade-peacock-inflatable-neck-pillow\",t:\"Super Cozy\u0026trade; Peacock Inflatable Neck Pillow\",i:\"products\/promo-promo-super-cozy-trade-peacock-inflatable-neck-pillow-1.jpg\",c:1895,o:[\"Selection\"],v:[[12373689565248,\"Default Title\",1,\"\"]]},\n      {h:\"92345-jacquard-grip-yoga-socks\",t:\"Jacquard Grip Yoga Socks\",i:\"products\/0020_92345_LF_OP15.jpg\",c:1695,o:[\"Design\"],v:[[33060809080907,\"Dragonfly Vines\",1,\"products\/0020_92345_LF_OP15.jpg\"],[33060809113675,\"Rainbow Paws\",0,\"products\/0019_92345_LF_OP24.jpg\"]]},\n      {h:\"88171-lustrous-leaf-jewelry\",t:\"Lustrous Leaf Jewelry\",i:\"products\/88171_LF_OP1.jpg\",c:1695,o:[\"Color\",\"Selection\"],v:[[12452300226624,\"Black|Necklace\",1,\"products\/88171_VER9.jpg\"],[12452300619840,\"Green|Necklace\",1,\"products\/88171_VER12.jpg\"],[12452300324928,\"Blue|Necklace\",1,\"products\/88171_VER10.jpg\"],[12452300718144,\"Purple|Necklace\",1,\"products\/88171_VER13.jpg\"],[12452300521536,\"Copper-tone|Necklace\",1,\"products\/88171_VER17.jpg\"],[12452300423232,\"Champagne|Necklace\",0,\"products\/88171_VER11.jpg\"],[12452300914752,\"Rose Gold-tone|Necklace\",0,\"products\/88171_VER15.jpg\"]]},\n      {h:\"95429-bamboo-serving-spoon-set-set-of-2\",t:\"Bamboo Serving Spoon Set - Set of 2\",i:\"products\/95429_ALT1.jpg\",c:2495,o:[\"Design\"],v:[[39787736105035,\"Dragonfly Vines\",1,\"products\/95429_LF_OP02_Cropped.jpg\"],[39787736137803,\"Ombre Paws with Hearts\",1,\"products\/95429_LF_OP03_Cropped.jpg\"]]},\n      {h:\"33968-guatemalan-worry-no-more-doll\",t:\"Guatemalan Worry No More Doll\",i:\"products\/guatemalan-worry-no-more-doll-1.jpg\",c:695,o:[\"Selection\"],v:[[30769175370,\"Default Title\",1,\"\"]]},\n      {h:\"63945-infinite-inspiration-bracelet\",t:\"Infinite Inspiration Bracelet\",i:\"files\/Crop_63945_DT_OP07.jpg\",c:1995,o:[\"Color\"],v:[[2837130772490,\"Red\",1,\"files\/Crop_63945_ST_OP08.jpg\"],[2837130674186,\"Green\",1,\"files\/Crop_63945_ST_OP04.jpg\"],[2837130641418,\"Blue\",1,\"files\/Crop_63945_ST_OP06.jpg\"],[2837130706954,\"Pink\",1,\"files\/Crop_63945_ST_OP05.jpg\"],[2837130870794,\"Yellow\",1,\"files\/Crop_63945_ST_OP07.jpg\"],[2837130805258,\"Tan\",1,\"files\/Crop_63945_ST_OP03.jpg\"]]},\n      {h:\"87814-wiggle-butt-pet-tag\",t:\"Wiggle Butt Pet Tag\",i:\"products\/87814_LF_OP03_e75186c7-9bf9-46e8-bb6d-a63b5a533461.jpg\",c:995,o:[\"Color\"],v:[[13573906563147,\"Red\",1,\"\"]]},\n      {h:\"92213-northern-lights-bandana-scarf\",t:\"Northern Lights Bandana Scarf\",i:\"products\/92213_LF_OP02.jpg\",c:2995,o:[\"Selection\"],v:[[32684842909771,\"Default Title\",1,\"\"]]},\n      {h:\"98366-music-lover-necklace\",t:\"Music Lover Necklace\",i:\"files\/98366_MN.jpg\",c:1295,o:[\"Design\"],v:[[2772898709514,\"Live Love Dance Sing\",1,\"files\/98366_VER2.jpg\"],[2772899004426,\"Sing it Loud\",1,\"files\/98366_VER6.jpg\"],[32983438360651,\"Heart of Music\",1,\"files\/98366_VER5.jpg\"],[32779659935819,\"French Horn\",1,\"files\/98366_VER7.jpg\"],[32779660034123,\"Microphone\",1,\"files\/98366_VER4.jpg\"]]},\n      {h:\"82447-for-the-love-of-our-pets-necklace\",t:\"For the Love of Our Pets Necklace\",i:\"products\/NGG-105.jpg\",c:995,o:[\"Design\"],v:[[32768554139723,\"Paw Outline\",1,\"products\/NGG-105.jpg\"],[32768554205259,\"Stamped Paw\",1,\"products\/NGG-153.jpg\"]]},\n      {h:\"77055-live-love-laugh-pewter-necklace\",t:\"Live Love Laugh Pewter Necklace\",i:\"products\/0001_77055_LF_OP03_e89fb993-df8b-4410-a764-ddd766426821.jpg\",c:1295,o:[\"Selection\"],v:[[2835492601866,\"Default Title\",1,\"\"]]},\n      {h:\"82556-mindful-living-necklace\",t:\"Mindful Living Necklace\",i:\"files\/77052_ALT3_a661c54e-230f-4259-aff0-bc30685fac00.jpg\",c:2295,o:[\"Selection\"],v:[[42219472257099,\"Freestanding Tree Necklace\",1,\"files\/77052_ALT4_ba3b6e84-5670-4ea0-bc30-484503809840.jpg\"],[42219472289867,\"Stamped Necklace\",1,\"files\/77052_ALT3_a661c54e-230f-4259-aff0-bc30685fac00.jpg\"],[42219472322635,\"Tree with Leather Cord Necklace\",1,\"files\/77052_ALT5_099b0065-fc14-4425-bd4d-5bf093417f7b.jpg\"]]},\n      {h:\"92578-mindfully-living-pewter-necklace\",t:\"Mindfully Living Pewter Necklace\",i:\"files\/92578_MN.jpg\",c:995,o:[\"Design\"],v:[[32768533692491,\"Peace\",1,\"files\/92578_VER7.jpg\"],[32768533790795,\"Karma Spiral\",1,\"files\/92578_VER3.jpg\"],[32768533725259,\"Lotus Mandala\",1,\"files\/92578_VER6.jpg\"],[32768533626955,\"Namaste Lotus\",1,\"files\/92578_VER1.jpg\"],[32768533659723,\"Peaceful Dove\",1,\"files\/92578_VER2.jpg\"],[32768533823563,\"Peace Squared\",1,\"files\/92578_VER5.jpg\"]]},\n      {h:\"52892-supporting-diabetes-awareness-low-profile-cap\",t:\"Supporting Diabetes Awareness Low Profile Cap!\",i:\"files\/52892_LF_OP05.jpg\",c:995,o:[\"Selection\"],v:[[2608454369290,\"Default Title\",1,\"\"]]},\n      {h:\"91088-always-with-me-paw-teardrop-necklace\",t:\"Always With Me Paw Teardrop Necklace\",i:\"products\/91088_VER1_0d7ba46d-4582-44df-8ff3-43eb7d0c53ba.jpg\",c:1695,o:[\"Color\"],v:[[31748918181963,\"Gold-Tone\",1,\"products\/91088_VER1_0d7ba46d-4582-44df-8ff3-43eb7d0c53ba.jpg\"],[31748918214731,\"Silver-Tone\",1,\"products\/91088_VER2_e182c5b8-7059-4f84-8eaf-3c6d31948931.jpg\"]]},\n      {h:\"92078-harvest-paws-table-linens\",t:\"Harvest Paws Table Linens\",i:\"products\/92078_LF_OP04.jpg\",c:2095,o:[\"Selection\"],v:[[32937188294731,\"White Napkins - Set of 4\",1,\"\"]]},\n      {h:\"79180-family-tree-keychain\",t:\"Family Tree Keychain\",i:\"products\/family-tree-keychain-1.jpg\",c:795,o:[\"Selection\"],v:[[2835561611274,\"Default Title\",1,\"\"]]},\n      {h:\"91599-handmade-felt-paw-print-oven-mitt\",t:\"Handmade Felt Paw Print Oven Mitt\",i:\"products\/Untitled-1_0004_91599_LF_OP06.jpg\",c:1895,o:[\"Color\",\"Amount\"],v:[[32924488663115,\"Gray|Single\",1,\"products\/91599_VER1.jpg\"],[32924488728651,\"Blue|Single\",1,\"products\/Untitled-1_0003_91599_LF_OP02.jpg\"]]},\n      {h:\"93675-firefighter-mixed-metals-car-charm\",t:\"Firefighter Mixed Metals Car Charm\",i:\"products\/93675_LF_OP02.jpg\",c:1995,o:[\"Selection\"],v:[[32965725683787,\"Default Title\",1,\"\"]]},\n      {h:\"94674-hand-painted-ceramic-skull\",t:\"Hand Painted Ceramic Skull\",i:\"products\/94674_MN.jpg\",c:1995,o:[\"Color\"],v:[[39549638803531,\"Black\",1,\"products\/94674_VER3.jpg\"],[39549638770763,\"White\",1,\"products\/94674_VER1.jpg\"],[39549638836299,\"Blue\",1,\"products\/94674_VER2.jpg\"],[39549638869067,\"Purple\",1,\"products\/94674_VER4.jpg\"]]},\n      {h:\"67494-pink-ribbon-love-earbuds\",t:\"Pink Ribbon Love Earbuds\",i:\"products\/pink-ribbon-love-earbuds-1.jpg\",c:995,o:[\"Amount\"],v:[[2773272985610,\"Single\",1,\"\"]]},\n      {h:\"328337-bold-brilliant-necklaces\",t:\"Bold \u0026 Brilliant Necklaces\",i:\"files\/328337_LF_OP03.jpg\",c:1695,o:[\"Selection\"],v:[[41185419198539,\"Gold\",1,\"files\/328337_LF_OP04.jpg\"],[41185419067467,\"Black Rubber Necklace\",1,\"files\/Crop_328337_LF_OP25.jpg\"],[41268061995083,\"Stainless Steel Ball Chain\",1,\"files\/328337_LF_OP06.jpg\"],[41269138456651,\"Black Cord Necklace\",1,\"files\/Crop_328337_LF_OP24.jpg\"],[41510430244939,\"Double Strand Organza Necklace - Gold\",1,\"files\/328337_LF_OP01.jpg\"]]},\n      {h:\"87803-in-the-kitchen-necklace-collection\",t:\"In the Kitchen Necklace\",i:\"files\/87803_Group01.jpg\",c:1695,o:[\"Design\"],v:[[3137525940234,\"Pie\",1,\"products\/in-the-kitchen-necklace-collection-6.jpg\"],[3137525973002,\"Rolling Pin\",1,\"products\/in-the-kitchen-necklace-collection-7.jpg\"],[3137526005770,\"Whisk\",1,\"products\/85818_MN.jpg\"]]},\n      {h:\"52104-lifes-gifts-necklace\",t:\"Life's Gifts Necklace\",i:\"products\/52104_MN.jpg\",c:2495,o:[\"Selection\"],v:[[3143743471626,\"Love\",1,\"products\/52104_VER2.jpg\"],[3143743406090,\"Hope\",1,\"products\/52104_VER4.jpg\"],[3143743504394,\"Strength\",1,\"products\/52104_VER5.jpg\"],[3143743373322,\"Dream\",1,\"products\/52104_VER3.jpg\"],[3143743438858,\"Inspire\",1,\"products\/52104_VER1.jpg\"]]},\n      {h:\"95310-new-perspective-eyeglass-necklace-holder\",t:\"New Perspective Eyeglass Necklace Holder\",i:\"products\/95310_MN.jpg\",c:1495,o:[\"Selection\"],v:[[39761693311051,\"Default Title\",1,\"\"]]},\n      {h:\"94827-bangle-keychain\",t:\"Bangle Keychain\",i:\"products\/94827_MN.jpg\",c:995,o:[\"Design\"],v:[[39519309365323,\"Geometric\",1,\"products\/94827_VER4.jpg\"],[39519309430859,\"Watercolor Paws\",1,\"products\/94827_VER2.jpg\"],[39519309398091,\"Boho\",1,\"products\/94827_VER1.jpg\"],[39519309463627,\"Jewel Pattern\",1,\"products\/94827_VER3.jpg\"]]},\n      {h:\"64555-infinite-inspiration-charm-bracelet\",t:\"Infinite Inspiration Charm Bracelet\",i:\"products\/infinite-inspiration-charm-bracelet-1.jpg\",c:1995,o:[\"Design\"],v:[[3166766268426,\"Anchor\",1,\"products\/infinite-inspiration-charm-bracelet-4.jpg\"],[3166766399498,\"Peace\",1,\"products\/infinite-inspiration-charm-bracelet-8.jpg\"],[3166766301194,\"Arrow\",1,\"products\/infinite-inspiration-charm-bracelet-5.jpg\"],[3166766333962,\"Heart\",1,\"products\/infinite-inspiration-charm-bracelet-6.jpg\"],[3166766366730,\"Owl\",1,\"products\/infinite-inspiration-charm-bracelet-7.jpg\"],[3166766432266,\"Wishbone\",1,\"products\/infinite-inspiration-charm-bracelet-9.jpg\"]]},\n      {h:\"45922-proud-mom-magnet\",t:\"Proud Mom Magnet\",i:\"products\/proud-mom-magnet-1.jpg\",c:695,o:[\"Design\"],v:[[3165390831626,\"Army\",1,\"\"],[12203215618112,\"Marine\",1,\"\"]]},\n      {h:\"91786-hanging-out-sloth-enamel-pin\",t:\"Hanging Out Sloth Enamel Pin\",i:\"products\/91786_MN.jpg\",c:1495,o:[\"Selection\"],v:[[32415307432011,\"Default Title\",1,\"\"]]},\n      {h:\"93735-best-grandma-mixed-metal-car-charm\",t:\"Best Grandma Mixed Metal Car Charm\",i:\"products\/0000_93735_LF_OP01.jpg\",c:1995,o:[\"Selection\"],v:[[32981120090187,\"Default Title\",1,\"\"]]},\n      {h:\"316673-purple-paw-dog-slow-feeder-licking-mat\",t:\"Purple Paw Dog Slow Feeder Licking Mat\",i:\"files\/316673_MN.jpg\",c:1695,o:[\"Selection\"],v:[[40775356579915,\"Default Title\",1,\"\"]]},\n      {h:\"92420-my-guardian-angel-ceramic-charm\",t:\"My Guardian Angel Ceramic Charm\",i:\"products\/92420_MN.jpg\",c:795,o:[\"Color\"],v:[[32897111195723,\"Turquoise\",1,\"products\/92420_VER3.jpg\"],[32897111097419,\"Green\",1,\"products\/92420_VER4.jpg\"],[32897111130187,\"Blue\",1,\"products\/92420_VER5.jpg\"],[32897111064651,\"Orange\",1,\"products\/92420_VER1.jpg\"],[32897111162955,\"Light Blue\",1,\"products\/92420_VER2.jpg\"]]},\n      {h:\"89361-live-play-eat-necklace\",t:\"Live Play Eat Necklace\",i:\"files\/89361_MN.jpg\",c:1295,o:[\"Selection\"],v:[[13584276881483,\"Default Title\",1,\"\"]]},\n      {h:\"97019-chanukah-chocolate-mold\",t:\"Chanukah Chocolate Mold\",i:\"products\/97019_MN.jpg\",c:795,o:[\"Design\"],v:[[39866544422987,\"Lollypop Dreidel\",1,\"products\/97019_VER2.jpg\"],[39866544455755,\"Dreidel \u0026 Menorah\",1,\"products\/97019_VER1.jpg\"]]},\n      {h:\"90871-worry-no-more-doll-necklace\",t:\"Worry No More Doll Necklace\",i:\"products\/90871_VER1_16a5e05a-4309-4cdc-8a48-b8f599ff059b.jpg\",c:1995,o:[\"Color\"],v:[[30946470035531,\"Gray\",1,\"products\/90871_VER3_c5b63362-5361-4e1b-a46c-48383f3fb89d.jpg\"],[30946469969995,\"Purple\",1,\"products\/90871_VER2_9affc640-0dea-42fd-91a0-606fa44eca6c.jpg\"],[30946470002763,\"Teal\",1,\"products\/90871_VER1_16a5e05a-4309-4cdc-8a48-b8f599ff059b.jpg\"]]},\n      {h:\"332486-pretty-long-legs-flamingo-earrings\",t:\"Pretty Long Legs Flamingo Earrings\",i:\"files\/332486_LF_OP01_cropped.jpg\",c:1695,o:[\"Selection\"],v:[[41355865161803,\"Default Title\",1,\"\"]]},\n      {h:\"95123-double-sided-table-tent-whiteboard\",t:\"Double Sided Table Tent Whiteboard\",i:\"products\/95123_MN.jpg\",c:1995,o:[\"Selection\"],v:[[39756391481419,\"Default Title\",1,\"\"]]},\n      {h:\"92415-ceramic-messenger-angel-figurine\",t:\"Ceramic Messenger Angel Figurine\",i:\"products\/92415_MN.jpg\",c:1495,o:[\"Color\"],v:[[32910916681803,\"Turquoise\",1,\"products\/92415_VER3.jpg\"],[32910916583499,\"Red\",1,\"products\/92415_VER4.jpg\"],[32910916616267,\"Green\",1,\"products\/92415_VER1.jpg\"],[32910916649035,\"Blue\",1,\"products\/92415_VER2.jpg\"]]}\n    ]\n  };\n  \/* ================= END CONFIG — no need to edit past here ================= *\/\n\n  var root = document.getElementById(\"td-root\");\n  if (!root || root.dataset.tdInit) return;\n  root.dataset.tdInit = \"1\";\n\n  var onShopify = !!window.Shopify;\n  var ROOT_URL = (onShopify \u0026\u0026 window.Shopify.routes \u0026\u0026 window.Shopify.routes.root) ? window.Shopify.routes.root : \"\/\";\n  var BASE = ROOT_URL.replace(\/\\\/$\/, \"\");\n\n  \/* ---------- helpers ---------- *\/\n  function esc(s) { return String(s == null ? \"\" : s).replace(\/[\u0026\u003c\u003e\"]\/g, function (c) { return { \"\u0026\": \"\u0026amp;\", \"\u003c\": \"\u0026lt;\", \"\u003e\": \"\u0026gt;\", '\"': \"\u0026quot;\" }[c]; }); }\n  var decoder = document.createElement(\"textarea\");\n  function decode(s) { decoder.innerHTML = String(s == null ? \"\" : s); return decoder.value; }   \/\/ \"\u0026trade;\" -\u003e ™\n  function abs(url) { return (url \u0026\u0026 url.slice(0, 2) === \"\/\/\") ? \"https:\" + url : url; }\n  function sized(url, w) { url = abs(url); return url ? url + (url.indexOf(\"?\") \u003e -1 ? \"\u0026\" : \"?\") + \"width=\" + w : \"\"; }\n  function srcset(url) { return [320, 420, 560, 760].map(function (w) { return sized(url, w) + \" \" + w + \"w\"; }).join(\", \"); }\n  var SIZES = \"(min-width:1000px) 360px, (min-width:620px) 46vw, 92vw\";\n  function cents(x) { if (x == null || x === \"\") return 0; return typeof x === \"number\" ? x : Math.round(parseFloat(x) * 100); }\n  function money(c) {\n    var cur = (window.Shopify \u0026\u0026 window.Shopify.currency \u0026\u0026 window.Shopify.currency.active) || \"USD\";\n    try { return new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: cur, minimumFractionDigits: c % 100 ? 2 : 0, maximumFractionDigits: c % 100 ? 2 : 0 }).format(c \/ 100); }\n    catch (e) { return \"$\" + (c \/ 100).toFixed(c % 100 ? 2 : 0); }\n  }\n  function isDefault(name) { return \/^default title$\/i.test(String(name || \"\")); }\n\n  \/\/ products.json and the snapshot come back in different shapes; normalise both to\n  \/\/ { handle, title, image, options:[{name, values}], variants:[{id, opts, price, compare, available, image}] }\n  function normalise(p) {\n    if (p.h) {\n      var vs = p.v.map(function (r) {\n        return { id: r[0], opts: String(r[1]).split(\"|\"), price: p.p || 300, compare: p.c || 0, available: !!r[2], image: r[3] ? CDN + r[3] : \"\" };\n      });\n      return { handle: p.h, title: p.t, image: CDN + p.i, variants: vs,\n        options: (p.o || []).map(function (name, gi) {\n          var seen = [];\n          vs.forEach(function (v) { if (seen.indexOf(v.opts[gi]) \u003c 0) seen.push(v.opts[gi]); });\n          return { name: name, values: seen };\n        }) };\n    }\n    var options = (p.options || []).map(function (o) { return { name: o.name || o, values: (o.values || []).slice() }; });\n    var img = (p.images \u0026\u0026 p.images[0] \u0026\u0026 (p.images[0].src || p.images[0])) || p.image || \"\";\n    return {\n      handle: p.handle,\n      title: p.title,\n      image: abs(img),\n      options: options,\n      variants: (p.variants || []).map(function (v) {\n        return {\n          id: v.id,\n          opts: [v.option1, v.option2, v.option3].slice(0, Math.max(options.length, 1)),\n          price: cents(v.price),\n          compare: cents(v.compare_at_price),\n          available: v.available !== false,\n          image: abs(v.featured_image \u0026\u0026 v.featured_image.src) || \"\"\n        };\n      })\n    };\n  }\n\n  \/* ---------- banner ---------- *\/\n  var B = CFG.banner;\n  document.getElementById(\"td-heading\").textContent = B.heading || \"\";\n  function setText(id, txt, data) {\n    var el = document.getElementById(id);\n    if (!txt) { (el.closest(\".td-ribbon\") || el).remove(); return; }\n    el.textContent = txt;\n    if (data) el.setAttribute(\"data-text\", txt);\n  }\n  setText(\"td-eyebrow\", B.eyebrow);\n  setText(\"td-big\", B.big, true);\n  setText(\"td-word\", B.word, true);\n  setText(\"td-ribbon\", B.ribbon);\n  setText(\"td-copy\", B.copy);\n\n  \/* ---------- card ---------- *\/\n  var items = [];\n\n  function groupsFor(p) {\n    \/\/ only options with a real choice get buttons (\"Default Title\", one-value options don't)\n    \/\/ sold-out designs \/ colors are left off entirely\n    return p.options.map(function (o, gi) {\n        return { name: o.name, gi: gi, values: o.values.filter(function (val) { return !soldOutEverywhere(p, gi, val); }) };\n      })\n      .filter(function (g) { return g.values.length \u003e 1 \u0026\u0026 !isDefault(g.values[0]); });\n  }\n  function soldOutEverywhere(p, gi, val) {\n    return !p.variants.some(function (v) { return v.opts[gi] === val \u0026\u0026 v.available; });\n  }\n\n  function buildCard(p, i) {\n    var url = BASE + \"\/products\/\" + p.handle;\n    var title = decode(p.title);\n    var blurb = CFG.blurbs[p.handle];\n    if (!blurb \u0026\u0026 window.console) console.warn(\"[3-dollar-deals] no blurb for \" + p.handle);\n\n    p.groups = groupsFor(p);\n    p.inStock = p.variants.some(function (v) { return v.available; });\n    var start = 0;\n    p.variants.some(function (v, vi) { if (v.available) { start = vi; return true; } });\n\n    var el = document.createElement(\"article\");\n    el.className = \"td-card\" + (p.inStock ? \"\" : \" is-out\");\n    el.dataset.i = i;\n\n    el.innerHTML =\n      '\u003ca class=\"td-media\" href=\"' + esc(url) + '\" tabindex=\"-1\" aria-hidden=\"true\"\u003e' +\n        (p.image ? '\u003cimg src=\"' + sized(p.image, 560) + '\" srcset=\"' + srcset(p.image) + '\" sizes=\"' + SIZES +\n          '\" alt=\"\" width=\"560\" height=\"560\" decoding=\"async\"' + (i \u003c 3 ? ' fetchpriority=\"high\"' : ' loading=\"lazy\"') + '\u003e' : '') +\n        '\u003cspan class=\"td-badge\" hidden\u003e\u003c\/span\u003e' +\n      '\u003c\/a\u003e' +\n      '\u003cdiv class=\"td-body\"\u003e' +\n        '\u003ch3 class=\"td-name\"\u003e\u003ca href=\"' + esc(url) + '\"\u003e' + esc(title) + '\u003c\/a\u003e\u003c\/h3\u003e' +\n        (blurb ? '\u003cp class=\"td-blurb\"\u003e' + esc(blurb) + '\u003c\/p\u003e' : '') +\n        '\u003cdiv class=\"td-price\"\u003e\u003cspan class=\"td-now\"\u003e\u003c\/span\u003e\u003cs class=\"td-was\"\u003e\u003c\/s\u003e\u003cspan class=\"td-save\"\u003e\u003c\/span\u003e\u003c\/div\u003e' +\n        '\u003cdiv class=\"td-buy\"\u003e' +\n          p.groups.map(function (g) {\n            var label = CFG.optionLabels[g.name] || g.name;\n            return '\u003cdiv class=\"td-optblock\"\u003e' +\n              '\u003cspan class=\"td-lbl\"\u003e' + esc(label) + ': \u003cb data-cur=\"' + g.gi + '\"\u003e\u003c\/b\u003e\u003c\/span\u003e' +\n              '\u003cdiv class=\"td-opts\" role=\"group\" aria-label=\"' + esc(label) + '\"\u003e' +\n                g.values.map(function (val, k) {\n                  return '\u003cbutton type=\"button\" class=\"td-opt\" aria-pressed=\"false\" data-act=\"opt\" data-g=\"' + g.gi + '\" data-k=\"' + k + '\"\u003e' + esc(val) + '\u003c\/button\u003e';\n                }).join(\"\") +\n              '\u003c\/div\u003e\u003c\/div\u003e';\n          }).join(\"\") +\n          '\u003cdiv class=\"td-row\"\u003e' +\n            '\u003cdiv class=\"td-qty\"\u003e' +\n              '\u003cbutton type=\"button\" data-act=\"minus\" aria-label=\"Decrease quantity\"\u003e\\u2212\u003c\/button\u003e' +\n              '\u003cinput type=\"number\" inputmode=\"numeric\" min=\"1\" max=\"' + CFG.maxQty + '\" value=\"1\" aria-label=\"Quantity\" data-qty\u003e' +\n              '\u003cbutton type=\"button\" data-act=\"plus\" aria-label=\"Increase quantity\"\u003e+\u003c\/button\u003e' +\n            '\u003c\/div\u003e' +\n            '\u003cbutton type=\"button\" class=\"td-atc\" data-act=\"add\"\u003e' + esc(CFG.addText) + '\u003c\/button\u003e' +\n          '\u003c\/div\u003e' +\n          '\u003cp class=\"td-err\" role=\"alert\" hidden\u003e\u003c\/p\u003e' +\n        '\u003c\/div\u003e' +\n      '\u003c\/div\u003e';\n\n    p.title = title;\n    p.el = el;\n    p.q = {\n      img:   el.querySelector(\".td-media img\"),\n      badge: el.querySelector(\".td-badge\"),\n      now:   el.querySelector(\".td-now\"),\n      was:   el.querySelector(\".td-was\"),\n      save:  el.querySelector(\".td-save\"),\n      opts:  el.querySelectorAll(\".td-opt\"),\n      curs:  el.querySelectorAll(\"[data-cur]\"),\n      qty:   el.querySelector(\"[data-qty]\"),\n      minus: el.querySelector('[data-act=\"minus\"]'),\n      plus:  el.querySelector('[data-act=\"plus\"]'),\n      btn:   el.querySelector(\".td-atc\"),\n      err:   el.querySelector(\".td-err\")\n    };\n    p.shownImg = p.image;\n    select(p, start, true);\n    syncQty(p);\n    return el;\n  }\n\n  \/\/ choose a value in one option group; keep the other groups' choices where possible\n  function pick(p, gi, val) {\n    var cur = p.variants[p.sel].opts.slice(); cur[gi] = val;\n    var exact = -1, avail = -1, any = -1;\n    p.variants.forEach(function (v, vi) {\n      if (v.opts[gi] !== val) return;\n      if (any \u003c 0) any = vi;\n      if (avail \u003c 0 \u0026\u0026 v.available) avail = vi;\n      if (exact \u003c 0 \u0026\u0026 v.opts.join(\"|\") === cur.join(\"|\")) exact = vi;\n    });\n    var vi = (exact \u003e -1 \u0026\u0026 p.variants[exact].available) ? exact : (avail \u003e -1 ? avail : (exact \u003e -1 ? exact : any));\n    if (vi \u003e -1) select(p, vi);\n  }\n\n  function select(p, vi, first) {\n    p.sel = vi;\n    var v = p.variants[vi];\n\n    \/\/ option buttons\n    for (var k = 0; k \u003c p.q.opts.length; k++) {\n      var b = p.q.opts[k], gi = +b.dataset.g;\n      var g = p.groups.filter(function (x) { return x.gi === gi; })[0];\n      b.setAttribute(\"aria-pressed\", String(g.values[+b.dataset.k] === v.opts[gi]));\n    }\n    for (var c = 0; c \u003c p.q.curs.length; c++) p.q.curs[c].textContent = v.opts[+p.q.curs[c].dataset.cur] || \"\";\n\n    \/\/ price\n    p.q.now.textContent = money(v.price);\n    var off = v.compare \u003e v.price ? Math.round((v.compare - v.price) \/ v.compare * 100) : 0;\n    p.q.was.textContent = off ? money(v.compare) : \"\";\n    p.q.was.hidden = !off;\n    p.q.save.textContent = off ? \"Save \" + off + \"%\" : \"\";\n    p.q.save.hidden = !off;\n    if (!p.inStock) { p.q.badge.textContent = CFG.soldOutText; p.q.badge.className = \"td-badge td-badge--out\"; p.q.badge.hidden = false; }\n    else if (off \u0026\u0026 CFG.showSaveBadge) { p.q.badge.textContent = off + \"% off\"; p.q.badge.hidden = false; }\n    else p.q.badge.hidden = true;\n\n    \/\/ image follows the chosen design\n    var want = v.image || p.image;\n    if (!first \u0026\u0026 p.q.img \u0026\u0026 want \u0026\u0026 want !== p.shownImg) {\n      p.shownImg = want;\n      var img = p.q.img;\n      img.classList.add(\"is-swap\");\n      var pre = new Image();\n      pre.onload = pre.onerror = function () {\n        img.srcset = srcset(want); img.src = sized(want, 560);\n        img.classList.remove(\"is-swap\");\n      };\n      pre.src = sized(want, 560);\n    }\n\n    \/\/ button\n    p.q.btn.disabled = !v.available;\n    p.q.btn.textContent = v.available ? CFG.addText : CFG.soldOutText;\n    p.q.btn.setAttribute(\"aria-label\", (v.available ? CFG.addText : CFG.soldOutText) + \": \" + p.title +\n      (p.groups.length ? \" \\u2013 \" + p.groups.map(function (g) { return v.opts[g.gi]; }).join(\", \") : \"\"));\n    setErr(p, \"\");\n  }\n\n  function qtyOf(p) { var n = parseInt(p.q.qty.value, 10); return isNaN(n) ? 1 : Math.max(1, Math.min(CFG.maxQty, n)); }\n  function syncQty(p) {\n    var n = qtyOf(p);\n    p.q.qty.value = n;\n    p.q.minus.disabled = n \u003c= 1;\n    p.q.plus.disabled = n \u003e= CFG.maxQty;\n  }\n  function setErr(p, msg) { p.q.err.textContent = msg || \"\"; p.q.err.hidden = !msg; }\n\n  \/* ---------- cart (same approach as Flash Deals \/ Care-A-Thon) ----------\n     Add through \/cart\/add.js and ask for the drawer's sections in the same\n     request, then hand the response to the theme's own renderer so the drawer\n     opens already showing the item. *\/\n  function themeDrawer() { return document.querySelector(\"cart-drawer, cart-notification, #CartDrawer, .drawer--cart\"); }\n  function sectionsToRequest() {\n    var el = themeDrawer();\n    if (el \u0026\u0026 typeof el.getSectionsToRender === \"function\") {\n      try { return el.getSectionsToRender().map(function (x) { return x.id; }).filter(Boolean); } catch (e) {}\n    }\n    return [\"cart-drawer\", \"cart-icon-bubble\"];\n  }\n  function renderCart(json) {\n    var el = themeDrawer();\n    if (!json || !json.sections || !el || typeof el.renderContents !== \"function\") return false;\n    try {\n      el.classList.remove(\"is-empty\");\n      var inner = el.querySelector(\".drawer__inner\"); if (inner) inner.classList.remove(\"is-empty\");\n      el.renderContents(json);\n      return true;\n    } catch (e) { return false; }\n  }\n  function notifyTheme() {\n    try { if (typeof window.publish === \"function\") window.publish(\"cart-update\", { source: \"3-dollar-deals\" }); } catch (e) {}\n    [\"cart:refresh\", \"cart:updated\"].forEach(function (n) { document.documentElement.dispatchEvent(new CustomEvent(n, { bubbles: true })); });\n  }\n  var toastT;\n  function toast(msg) {\n    var t = document.getElementById(\"td-toast\");\n    t.textContent = msg; t.classList.add(\"on\");\n    clearTimeout(toastT); toastT = setTimeout(function () { t.classList.remove(\"on\"); }, 2600);\n  }\n\n  function add(p) {\n    var v = p.variants[p.sel];\n    if (!v || !v.available) return;\n    var qty = qtyOf(p);\n    var btn = p.q.btn, label = CFG.addText;\n    setErr(p, \"\");\n    btn.classList.add(\"is-busy\"); btn.textContent = \"Adding\\u2026\";\n\n    function done(ok, json, msg) {\n      btn.classList.remove(\"is-busy\");\n      if (!ok) { btn.textContent = label; setErr(p, msg || \"This item couldn't be added to the cart. Try again.\"); return; }\n      btn.classList.add(\"is-done\"); btn.textContent = \"Added!\";\n      setTimeout(function () { btn.classList.remove(\"is-done\"); btn.textContent = label; }, 1800);\n\n      if (CFG.afterAdd === \"cart\") { window.location.href = BASE + \"\/cart\"; return; }\n      var opened = CFG.afterAdd === \"drawer\" \u0026\u0026 renderCart(json);\n      notifyTheme();\n      if (!opened) {\n        if (CFG.afterAdd === \"drawer\" \u0026\u0026 !themeDrawer() \u0026\u0026 onShopify) { window.location.href = BASE + \"\/cart\"; return; }\n        toast(msg || ((qty \u003e 1 ? qty + \" \\u00d7 \" : \"\") + p.title + \" added to cart\"));\n      }\n    }\n\n    if (!onShopify) { setTimeout(function () { done(true, null, \"Preview only: \" + (qty \u003e 1 ? qty + \" \\u00d7 \" : \"\") + p.title + \" added\"); }, 400); return; }\n\n    var body = { items: [{ id: Number(v.id), quantity: qty }], sections: sectionsToRequest(), sections_url: window.location.pathname };\n    fetch(BASE + \"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\", Accept: \"application\/json\" },\n      body: JSON.stringify(body)\n    })\n      .then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })\n      .then(function (res) {\n        if (res.ok) done(true, res.j);\n        else done(false, null, (res.j \u0026\u0026 (res.j.description || res.j.message)) || \"This item couldn't be added to the cart.\");\n      })\n      .catch(function () { done(false); });\n  }\n\n  \/* ---------- one delegated listener for every card ---------- *\/\n  function itemFor(el) { var card = el.closest(\".td-card\"); return card ? items[+card.dataset.i] : null; }\n  root.addEventListener(\"click\", function (e) {\n    var b = e.target.closest(\"[data-act]\"); if (!b) return;\n    var p = itemFor(b); if (!p) return;\n    var act = b.dataset.act;\n    if (act === \"opt\") {\n      var g = p.groups.filter(function (x) { return x.gi === +b.dataset.g; })[0];\n      pick(p, g.gi, g.values[+b.dataset.k]);\n    } else if (act === \"minus\" || act === \"plus\") {\n      p.q.qty.value = qtyOf(p) + (act === \"plus\" ? 1 : -1);\n      syncQty(p);\n    } else if (act === \"add\") {\n      try { add(p); }\n      catch (err) {\n        p.q.btn.classList.remove(\"is-busy\"); p.q.btn.textContent = CFG.addText;\n        setErr(p, \"This item couldn't be added to the cart. Try again.\");\n        if (window.console) console.error(\"[3-dollar-deals] add failed\", err);\n      }\n    }\n  });\n  root.addEventListener(\"change\", function (e) {\n    if (!e.target.matches(\"[data-qty]\")) return;\n    var p = itemFor(e.target); if (p) syncQty(p);\n  });\n\n  \/* ---------- load: live collection first, snapshot as fallback ---------- *\/\n  function render(list) {\n    items = list.map(normalise);\n    items.forEach(function (p) { p.inStock = p.variants.some(function (v) { return v.available; }); });\n    if (CFG.soldOut === \"hide\") items = items.filter(function (p) { return p.inStock; });\n    if (CFG.soldOut === \"end\") items = items.filter(function (p) { return p.inStock; }).concat(items.filter(function (p) { return !p.inStock; }));\n\n    var grid = document.getElementById(\"td-grid\");\n    grid.innerHTML = \"\";\n    var frag = document.createDocumentFragment();\n    items.forEach(function (p, i) { frag.appendChild(buildCard(p, i)); });\n    grid.appendChild(frag);\n    if (!items.length) {\n      var empty = document.getElementById(\"td-empty\");\n      empty.textContent = \"These deals have all been snapped up. Check back soon!\";\n      empty.hidden = false;\n    }\n  }\n\n  function loadLive() {\n    \/\/ products.json returns the collection in its configured sort order.\n    var all = [];\n    function page(n) {\n      return fetch(BASE + \"\/collections\/\" + encodeURIComponent(CFG.collection) + \"\/products.json?limit=250\u0026page=\" + n, { headers: { Accept: \"application\/json\" } })\n        .then(function (r) { if (!r.ok) throw new Error(\"HTTP \" + r.status); return r.json(); })\n        .then(function (j) {\n          var got = (j \u0026\u0026 j.products) || [];\n          all = all.concat(got);\n          return got.length === 250 \u0026\u0026 n \u003c 4 ? page(n + 1) : all;\n        });\n    }\n    return page(1);\n  }\n\n  if (onShopify) {\n    loadLive()\n      .then(function (list) {\n        if (!list.length) throw new Error(\"collection returned no products\");\n        render(list);\n      })\n      .catch(function (err) {\n        if (window.console) console.warn(\"[3-dollar-deals] live collection read failed, using snapshot:\", err);\n        render(CFG.snapshot);\n      });\n  } else {\n    render(CFG.snapshot);\n  }\n})();\n\u003c\/script\u003e\n","products":[],"url":"https:\/\/greatergood.com\/collections\/james-test.oembed","provider":"GreaterGood","version":"1.0","type":"link"}