{"title":"DigiProduct Planning Tool","description":"\u003cbody\u003e\n\n\n\u003cmeta charset=\"UTF-8\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n\u003ctitle\u003eDigiProduct Planning Tool – Virtuous Delights Studio\u003c\/title\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:wght@700;900\u0026amp;family=Inter:wght@400;500;600;700\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n*{box-sizing:border-box;margin:0;padding:0;}\nbody{font-family:'Inter',sans-serif;background:#f8f8f8;color:#1a1a1a;}\n.accent-bar{height:4px;background:linear-gradient(90deg,#e91e8c,#00bcd4,#e91e8c);background-size:200%;animation:slide 3s linear infinite;}\n@keyframes slide{0%{background-position:0%}100%{background-position:200%}}\n.header{background:#1a1a1a;padding:2rem 1rem 1.75rem;text-align:center;position:relative;overflow:hidden;}\n.header::before{content:'';position:absolute;top:-40px;left:-40px;width:200px;height:200px;background:#e91e8c;border-radius:50%;opacity:0.15;}\n.header::after{content:'';position:absolute;bottom:-50px;right:-30px;width:180px;height:180px;background:#00bcd4;border-radius:50%;opacity:0.15;}\n.header-logo{font-family:'Playfair Display',serif;font-size:11px;letter-spacing:0.18em;text-transform:uppercase;color:#e91e8c;margin-bottom:6px;position:relative;}\n.header h1{font-family:'Playfair Display',serif;font-size:28px;font-weight:900;color:#fff;margin-bottom:6px;position:relative;}\n.header h1 span{color:#00bcd4;}\n.header p{font-size:13px;color:rgba(255,255,255,0.7);position:relative;letter-spacing:0.04em;}\n.container{max-width:900px;margin:0 auto;padding:1.5rem 1rem 4rem;}\n.card{background:#fff;border-radius:16px;padding:1.5rem;margin-bottom:1.5rem;border:1.5px solid #f0f0f0;box-shadow:0 2px 12px rgba(0,0,0,0.04);}\n.step-tag{display:inline-flex;align-items:center;gap:6px;background:#1a1a1a;color:#fff;font-size:11px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;padding:4px 12px;border-radius:20px;margin-bottom:10px;}\n.step-tag .dot{width:6px;height:6px;border-radius:50%;background:#e91e8c;}\n.step-title{font-family:'Playfair Display',serif;font-size:20px;font-weight:700;margin-bottom:1.25rem;color:#1a1a1a;}\n.date-row{display:flex;align-items:flex-start;gap:2rem;}\n.date-col{flex:1;}\n.date-col label{font-size:12px;font-weight:700;letter-spacing:0.07em;text-transform:uppercase;color:#888;margin-bottom:6px;display:block;}\n.date-col input[type=date]{width:100%;padding:11px 14px;border:2px solid #f0f0f0;border-radius:10px;font-size:15px;font-family:'Inter',sans-serif;outline:none;background:#fff;color:#1a1a1a;}\n.date-col input[type=date]:focus{border-color:#e91e8c;}\n.note-box{background:#e0f7fa;border-left:4px solid #00bcd4;border-radius:0 10px 10px 0;padding:10px 14px;font-size:13px;color:#006064;margin-top:1rem;line-height:1.6;}\n.year-section{margin-bottom:1.75rem;}\n.year-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem;padding-bottom:10px;border-bottom:3px solid #e91e8c;}\n.year-header.teal{border-bottom-color:#00bcd4;}\n.year-label{font-family:'Playfair Display',serif;font-size:17px;font-weight:700;color:#1a1a1a;display:flex;align-items:center;gap:8px;}\n.btn-gen-year{background:#1a1a1a;color:#fff;border:none;border-radius:8px;padding:9px 18px;font-size:12px;font-weight:700;cursor:pointer;display:flex;align-items:center;gap:6px;letter-spacing:0.04em;transition:background 0.2s;}\n.btn-gen-year:hover{background:#e91e8c;}\n.btn-gen-year.teal:hover{background:#00bcd4;}\n.events-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;}\n@media(max-width:600px){.events-grid{grid-template-columns:repeat(2,1fr);}.date-row{flex-direction:column;gap:1rem;}}\n.event-card{border:1.5px solid #f0f0f0;border-radius:10px;padding:10px 12px;display:flex;align-items:flex-start;gap:10px;cursor:pointer;transition:all 0.15s;background:#fff;}\n.event-card:hover{border-color:#e91e8c;background:#fff5fb;}\n.event-card.checked{border-color:#e91e8c;background:#fff0f8;}\n.event-checkbox{width:18px;height:18px;border:2px solid #ddd;border-radius:4px;flex-shrink:0;display:flex;align-items:center;justify-content:center;transition:all 0.15s;margin-top:2px;}\n.event-card.checked .event-checkbox{background:#e91e8c;border-color:#e91e8c;}\n.chk{display:none;color:#fff;font-size:11px;font-weight:900;}\n.event-card.checked .chk{display:block;}\n.event-emoji{font-size:20px;flex-shrink:0;}\n.event-name{font-size:12.5px;font-weight:600;color:#1a1a1a;line-height:1.35;}\n.event-date{font-size:11.5px;color:#999;margin-top:2px;}\n.selected-pill{display:inline-flex;align-items:center;gap:6px;background:#e91e8c;color:#fff;font-size:12px;font-weight:700;padding:5px 14px;border-radius:20px;margin-bottom:1rem;}\n.generate-btn{display:block;width:100%;max-width:380px;margin:2rem auto 1rem;background:#1a1a1a;color:#fff;border:none;border-radius:14px;padding:16px 24px;font-size:15px;font-weight:700;cursor:pointer;text-align:center;letter-spacing:0.04em;transition:background 0.2s;}\n.generate-btn:hover{background:#e91e8c;}\n.output-section{display:none;}\n.output-section.visible{display:block;}\n.output-card{background:#fff;border-radius:16px;border:1.5px solid #f0f0f0;overflow:hidden;margin-bottom:1.5rem;}\n.output-header{background:#1a1a1a;padding:1rem 1.5rem;display:flex;align-items:center;gap:10px;}\n.output-header h3{font-family:'Playfair Display',serif;font-size:18px;color:#fff;font-weight:700;}\n.output-header .badge{background:#e91e8c;color:#fff;font-size:11px;font-weight:700;padding:3px 10px;border-radius:20px;letter-spacing:0.06em;}\n.output-body{padding:1.5rem;}\n.month-block{margin-bottom:1.5rem;}\n.month-title{font-family:'Playfair Display',serif;font-size:15px;font-weight:700;color:#1a1a1a;padding:6px 14px;background:#f8f8f8;border-left:4px solid #00bcd4;border-radius:0 8px 8px 0;margin-bottom:10px;}\n.plan-item{background:#fff;border:1.5px solid #f0f0f0;border-radius:10px;padding:12px 14px;margin-bottom:8px;}\n.plan-item-header{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap;}\n.plan-item-header .emoji{font-size:18px;}\n.plan-item-header .event-title{font-size:14px;font-weight:700;color:#1a1a1a;}\n.plan-item-header .event-dt{font-size:12px;color:#999;margin-left:auto;}\n.plan-meta{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:8px;}\n.meta-box{background:#f8f8f8;border-radius:8px;padding:8px 10px;}\n.meta-label{font-size:10px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;color:#888;margin-bottom:3px;}\n.meta-value{font-size:12.5px;color:#1a1a1a;font-weight:500;}\n.keywords{display:flex;flex-wrap:wrap;gap:5px;margin-top:6px;}\n.kw{background:#e0f7fa;color:#006064;font-size:11px;font-weight:600;padding:3px 10px;border-radius:20px;}\n.checklist-items{margin-top:8px;display:flex;flex-direction:column;gap:5px;}\n.cl-item{display:flex;align-items:center;gap:8px;font-size:12.5px;color:#444;cursor:pointer;padding:4px 0;}\n.cl-box{width:16px;height:16px;border:2px solid #e91e8c;border-radius:4px;flex-shrink:0;display:flex;align-items:center;justify-content:center;transition:all 0.15s;}\n.cl-item.done .cl-box{background:#e91e8c;}\n.cl-item.done .cl-chk{display:block;}\n.cl-item.done .cl-text{text-decoration:line-through;color:#bbb;}\n.cl-chk{display:none;color:#fff;font-size:10px;font-weight:900;}\n.spinner{width:16px;height:16px;border:2.5px solid rgba(255,255,255,0.3);border-top-color:#fff;border-radius:50%;animation:spin 0.7s linear infinite;display:inline-block;vertical-align:-3px;margin-right:6px;}\n@keyframes spin{to{transform:rotate(360deg);}}\n.loading-msg{font-size:14px;color:#888;font-style:italic;padding:1rem 0;}\n.api-key-section{background:#fff8e1;border:1.5px solid #ffe082;border-radius:12px;padding:1.25rem;margin-bottom:1.5rem;}\n.api-key-section label{font-size:12px;font-weight:700;letter-spacing:0.07em;text-transform:uppercase;color:#888;display:block;margin-bottom:6px;}\n.api-key-section input{width:100%;padding:10px 14px;border:1.5px solid #ffe082;border-radius:8px;font-size:14px;font-family:'Inter',sans-serif;outline:none;background:#fff;}\n.api-key-section input:focus{border-color:#e91e8c;}\n.api-note{font-size:12px;color:#888;margin-top:6px;line-height:1.5;}\n.footer{text-align:center;padding:2rem 1rem;color:#bbb;font-size:12px;letter-spacing:0.04em;}\n.footer strong{color:#e91e8c;}\n\u003c\/style\u003e\n\n\n\n\u003cdiv class=\"accent-bar\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"header\"\u003e\n  \u003cdiv class=\"header-logo\"\u003e✦ Virtuous Delights Studio ✦\u003c\/div\u003e\n  \u003ch1\u003eDigiProduct \u003cspan\u003ePlanning Tool\u003c\/span\u003e\n\u003c\/h1\u003e\n  \u003cp\u003ePlan ahead · Create smarter · List faster · Sell better on Etsy\u003c\/p\u003e\n\u003c\/div\u003e\n\n\u003cdiv class=\"container\"\u003e\n\n  \u003cdiv class=\"api-key-section\"\u003e\n    \u003clabel\u003e🔑 Anthropic API Key (required for AI plan generation)\u003c\/label\u003e\n    \u003cinput type=\"password\" id=\"api-key\" placeholder=\"sk-ant-...\"\u003e\n    \u003cp class=\"api-note\"\u003eYour key is used only in your browser and never stored or sent anywhere else. Get yours at \u003ca href=\"https:\/\/console.anthropic.com\" target=\"_blank\"\u003econsole.anthropic.com\u003c\/a\u003e\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"card\"\u003e\n    \u003cdiv class=\"step-tag\"\u003e\n\u003cspan class=\"dot\"\u003e\u003c\/span\u003eStep 1\u003c\/div\u003e\n    \u003cdiv class=\"step-title\"\u003eChoose Your Planning Start Date\u003c\/div\u003e\n    \u003cdiv class=\"date-row\"\u003e\n      \u003cdiv class=\"date-col\"\u003e\n        \u003clabel\u003ePlanning Start Date\u003c\/label\u003e\n        \u003cinput type=\"date\" id=\"start-date\"\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"flex:1;display:flex;align-items:center;gap:10px;padding-top:1.5rem;\"\u003e\n        \u003cspan style=\"font-size:32px;\"\u003e🚀\u003c\/span\u003e\n        \u003cspan style=\"font-size:13px;color:#666;line-height:1.6;\"\u003eChoose today's date or when you want to start planning!\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"note-box\"\u003e📍 \u003cstrong\u003eNote:\u003c\/strong\u003e Holiday dates may vary by country and region. We've included both UK and USA dates where they differ. Please verify local dates for your target market.\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"card\"\u003e\n    \u003cdiv class=\"step-tag\"\u003e\n\u003cspan class=\"dot\"\u003e\u003c\/span\u003eStep 2\u003c\/div\u003e\n    \u003cdiv class=\"step-title\"\u003eSelect Upcoming Events \u0026amp; Themes\u003c\/div\u003e\n    \u003cdiv class=\"selected-pill\" id=\"sel-pill\"\u003e0 events selected\u003c\/div\u003e\n\n    \u003cdiv class=\"year-section\"\u003e\n      \u003cdiv class=\"year-header\"\u003e\n        \u003cdiv class=\"year-label\"\u003e📅 2026 Events\u003c\/div\u003e\n        \u003cbutton class=\"btn-gen-year\" onclick=\"generateYearPlan(2026)\"\u003e🚀 Generate 2026 Plan\u003c\/button\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"events-grid\" id=\"grid-2026\"\u003e\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"year-section\" style=\"margin-top:2rem;\"\u003e\n      \u003cdiv class=\"year-header teal\"\u003e\n        \u003cdiv class=\"year-label\"\u003e🌐 2027 Events (Projected Planning)\u003c\/div\u003e\n        \u003cbutton class=\"btn-gen-year teal\" onclick=\"generateYearPlan(2027)\"\u003e🚀 Generate 2027 Plan\u003c\/button\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"events-grid\" id=\"grid-2027\"\u003e\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cbutton class=\"generate-btn\" id=\"main-gen-btn\" onclick=\"generateSmartPlan()\"\u003e🧠 Generate My Smart Plan\u003c\/button\u003e\n\n  \u003cdiv class=\"output-section\" id=\"output-section\"\u003e\n    \u003cdiv class=\"output-card\"\u003e\n      \u003cdiv class=\"output-header\"\u003e\n        \u003ch3 id=\"output-title\"\u003eYour Smart Product Plan\u003c\/h3\u003e\n        \u003cspan class=\"badge\"\u003eVIRTUOUS DELIGHTS\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"output-body\" id=\"output-body\"\u003e\n        \u003cdiv class=\"loading-msg\"\u003eGenerating your plan…\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cdiv class=\"footer\"\u003eMade with 💖 for \u003cstrong\u003eVirtuous Delights Studio\u003c\/strong\u003e · virtuousdelights.com\u003c\/div\u003e\n\n\u003cscript\u003e\n\/\/ Set today's date as default\nconst today = new Date().toISOString().split('T')[0];\ndocument.getElementById('start-date').value = today;\n\nconst events2026=[\n  {name:\"Martin Luther King Jr. Day\",date:\"January 19\",emoji:\"✊\"},\n  {name:\"Int'l Day of Education\",date:\"January 24\",emoji:\"📚\"},\n  {name:\"Black History Month\",date:\"February 1\",emoji:\"✊🏿\"},\n  {name:\"Valentine's Day\",date:\"February 14\",emoji:\"💝\"},\n  {name:\"Ramadan\",date:\"February 17\",emoji:\"🌙\"},\n  {name:\"World Book Day UK\",date:\"March 5\",emoji:\"📖\"},\n  {name:\"Mother's Day UK\",date:\"March 15\",emoji:\"🌷\"},\n  {name:\"St. Patrick's Day\",date:\"March 17\",emoji:\"🍀\"},\n  {name:\"Eid al-Fitr\",date:\"March 18\",emoji:\"🌙\"},\n  {name:\"Spring\",date:\"March 20\",emoji:\"🌸\"},\n  {name:\"Int'l Day Against Racial Discrimination\",date:\"March 21\",emoji:\"✊\"},\n  {name:\"Trans Day of Visibility\",date:\"March 31\",emoji:\"🏳️‍⚧️\"},\n  {name:\"Passover\",date:\"April 1\",emoji:\"🍷\"},\n  {name:\"World Autism Awareness Day\",date:\"April 2\",emoji:\"🧩\"},\n  {name:\"Easter\",date:\"April 5\",emoji:\"🐣\"},\n  {name:\"Earth Day\",date:\"April 22\",emoji:\"🌍\"},\n  {name:\"World Book Day Global\",date:\"April 23\",emoji:\"📚\"},\n  {name:\"Mental Health Awareness Month\",date:\"May 1\",emoji:\"🧠\"},\n  {name:\"Teacher Appreciation Week\",date:\"May 6\",emoji:\"🍎\"},\n  {name:\"Mother's Day USA\",date:\"May 10\",emoji:\"👩\"},\n  {name:\"Malcolm X Day\",date:\"May 15\",emoji:\"✊🏿\"},\n  {name:\"African Liberation Day\",date:\"May 25\",emoji:\"🌍\"},\n  {name:\"Eid al-Adha\",date:\"May 26\",emoji:\"🐑\"},\n  {name:\"Pride Month\",date:\"June 1\",emoji:\"🏳️‍🌈\"},\n  {name:\"Juneteenth\",date:\"June 19\",emoji:\"✊🏿\"},\n  {name:\"Father's Day UK\",date:\"June 21\",emoji:\"👨\"},\n  {name:\"Father's Day USA\",date:\"June 21\",emoji:\"👨\"},\n  {name:\"Summer\",date:\"June 21\",emoji:\"☀️\"},\n  {name:\"Back to School USA\",date:\"August 15\",emoji:\"🎒\"},\n  {name:\"Back to School UK\",date:\"September 1\",emoji:\"🎒\"},\n  {name:\"International Literacy Day\",date:\"September 8\",emoji:\"📝\"},\n  {name:\"Hispanic Heritage Month\",date:\"September 15\",emoji:\"🇲🇽\"},\n  {name:\"Fall\",date:\"September 22\",emoji:\"🍂\"},\n  {name:\"Coming Out Day\",date:\"October 11\",emoji:\"🏳️‍🌈\"},\n  {name:\"Indigenous Peoples' Day\",date:\"October 12\",emoji:\"🪶\"},\n  {name:\"Halloween\",date:\"October 31\",emoji:\"🎃\"},\n  {name:\"Native American Heritage Month\",date:\"November 1\",emoji:\"🪶\"},\n  {name:\"Day of the Dead\",date:\"November 2\",emoji:\"💀\"},\n  {name:\"Diwali\",date:\"November 8\",emoji:\"🪔\"},\n  {name:\"Anti-Bullying Week UK\",date:\"November 16\",emoji:\"💛\"},\n  {name:\"Thanksgiving\",date:\"November 26\",emoji:\"🦃\"},\n  {name:\"World AIDS Day\",date:\"December 1\",emoji:\"🎗️\"},\n  {name:\"Hanukkah\",date:\"December 4\",emoji:\"🕎\"},\n  {name:\"Christmas\",date:\"December 25\",emoji:\"🎄\"},\n  {name:\"Kwanzaa\",date:\"December 26\",emoji:\"🕯️\"},\n];\n\nconst events2027=[\n  {name:\"Martin Luther King Jr. Day\",date:\"January 19\",emoji:\"✊\"},\n  {name:\"Int'l Day of Education\",date:\"January 24\",emoji:\"📚\"},\n  {name:\"Black History Month\",date:\"February 1\",emoji:\"✊🏿\"},\n  {name:\"Valentine's Day\",date:\"February 14\",emoji:\"💝\"},\n  {name:\"Ramadan\",date:\"February 17\",emoji:\"🌙\"},\n  {name:\"World Book Day UK\",date:\"March 4\",emoji:\"📖\"},\n  {name:\"Mother's Day UK\",date:\"March 14\",emoji:\"🌷\"},\n  {name:\"St. Patrick's Day\",date:\"March 17\",emoji:\"🍀\"},\n  {name:\"Spring\",date:\"March 20\",emoji:\"🌸\"},\n  {name:\"Easter\",date:\"March 28\",emoji:\"🐣\"},\n  {name:\"Earth Day\",date:\"April 22\",emoji:\"🌍\"},\n  {name:\"Mental Health Awareness Month\",date:\"May 1\",emoji:\"🧠\"},\n  {name:\"Teacher Appreciation Week\",date:\"May 5\",emoji:\"🍎\"},\n  {name:\"Mother's Day USA\",date:\"May 9\",emoji:\"👩\"},\n  {name:\"Malcolm X Day\",date:\"May 15\",emoji:\"✊🏿\"},\n  {name:\"African Liberation Day\",date:\"May 25\",emoji:\"🌍\"},\n  {name:\"Pride Month\",date:\"June 1\",emoji:\"🏳️‍🌈\"},\n  {name:\"Juneteenth\",date:\"June 19\",emoji:\"✊🏿\"},\n  {name:\"Father's Day UK\",date:\"June 20\",emoji:\"👨\"},\n  {name:\"Father's Day USA\",date:\"June 20\",emoji:\"👨\"},\n  {name:\"Summer\",date:\"June 21\",emoji:\"☀️\"},\n  {name:\"Back to School USA\",date:\"August 15\",emoji:\"🎒\"},\n  {name:\"Back to School UK\",date:\"September 1\",emoji:\"🎒\"},\n  {name:\"International Literacy Day\",date:\"September 8\",emoji:\"📝\"},\n  {name:\"Hispanic Heritage Month\",date:\"September 15\",emoji:\"🇲🇽\"},\n  {name:\"Fall\",date:\"September 22\",emoji:\"🍂\"},\n  {name:\"Coming Out Day\",date:\"October 11\",emoji:\"🏳️‍🌈\"},\n  {name:\"Indigenous Peoples' Day\",date:\"October 12\",emoji:\"🪶\"},\n  {name:\"Diwali\",date:\"October 27\",emoji:\"🪔\"},\n  {name:\"Halloween\",date:\"October 31\",emoji:\"🎃\"},\n  {name:\"Native American Heritage Month\",date:\"November 1\",emoji:\"🪶\"},\n  {name:\"Day of the Dead\",date:\"November 2\",emoji:\"💀\"},\n  {name:\"Anti-Bullying Week UK\",date:\"November 15\",emoji:\"💛\"},\n  {name:\"Thanksgiving\",date:\"November 25\",emoji:\"🦃\"},\n  {name:\"World AIDS Day\",date:\"December 1\",emoji:\"🎗️\"},\n  {name:\"Hanukkah\",date:\"December 24\",emoji:\"🕎\"},\n  {name:\"Christmas\",date:\"December 25\",emoji:\"🎄\"},\n  {name:\"Kwanzaa\",date:\"December 26\",emoji:\"🕯️\"},\n];\n\nconst checked = new Set();\n\nfunction renderGrid(events, year) {\n  const grid = document.getElementById('grid-' + year);\n  grid.innerHTML = '';\n  events.forEach((ev, i) =\u003e {\n    const key = year + '-' + i;\n    const card = document.createElement('div');\n    card.className = 'event-card' + (checked.has(key) ? ' checked' : '');\n    card.innerHTML = `\u003cdiv class=\"event-checkbox\"\u003e\u003cspan class=\"chk\"\u003e✓\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"event-emoji\"\u003e${ev.emoji}\u003c\/div\u003e\u003cdiv class=\"event-info\"\u003e\u003cdiv class=\"event-name\"\u003e${ev.name} ${year}\u003c\/div\u003e\u003cdiv class=\"event-date\"\u003e${ev.date}\u003c\/div\u003e\u003c\/div\u003e`;\n    card.addEventListener('click', () =\u003e {\n      if (checked.has(key)) checked.delete(key); else checked.add(key);\n      card.classList.toggle('checked');\n      updateCount();\n    });\n    grid.appendChild(card);\n  });\n}\n\nfunction updateCount() {\n  const n = checked.size;\n  document.getElementById('sel-pill').textContent = n + ' event' + (n === 1 ? '' : 's') + ' selected';\n}\n\nfunction getSelected(year) {\n  const list = year === 2026 ? events2026 : events2027;\n  return Array.from(checked).filter(k =\u003e k.startsWith(year + '-')).map(k =\u003e {\n    const i = parseInt(k.split('-')[1]);\n    return { ...list[i], year };\n  });\n}\n\nfunction getApiKey() {\n  return document.getElementById('api-key').value.trim();\n}\n\nfunction buildPrompt(events, startDate) {\n  const eventList = events.map(e =\u003e `- ${e.name} ${e.year} (${e.date})`).join('\\n');\n  return `You are a digital product strategist for Virtuous Delights Studio, helping them plan their Etsy clip art, SVG, and printable product calendar.\n\nPlanning start date: ${startDate}\nSelected events:\n${eventList}\n\nReturn a JSON array. Each item = one event. Format EXACTLY like this (valid JSON only, no markdown):\n[\n  {\n    \"event\": \"Valentine's Day 2026\",\n    \"date\": \"February 14\",\n    \"emoji\": \"💝\",\n    \"product\": \"Specific digital product idea (e.g. Romantic Floral Heart SVG \u0026 PNG Bundle)\",\n    \"startCreate\": \"Start creating: [date ~6 weeks before]\",\n    \"listBy\": \"List by: [date ~4 weeks before]\",\n    \"keywords\": [\"keyword1\",\"keyword2\",\"keyword3\"],\n    \"checklist\": [\"Design product files (PNG\/SVG\/PDF)\",\"Write SEO-optimized title \u0026 description\",\"Create 5-10 mockup images\",\"Upload \u0026 schedule listing\",\"Share on Facebook, Instagram \u0026 Pinterest\"]\n  }\n]\nReturn ONLY the JSON array. No other text.`;\n}\n\nfunction renderPlan(items) {\n  const body = document.getElementById('output-body');\n  if (!Array.isArray(items) || items.length === 0) {\n    body.innerHTML = '\u003cdiv style=\"font-size:14px;color:#888;padding:1rem 0;\"\u003eCould not parse plan. Please try again.\u003c\/div\u003e';\n    return;\n  }\n  const byMonth = {};\n  items.forEach(item =\u003e {\n    const month = item.date ? item.date.split(' ')[0] : 'Other';\n    if (!byMonth[month]) byMonth[month] = [];\n    byMonth[month].push(item);\n  });\n  let html = '';\n  Object.entries(byMonth).forEach(([month, evts]) =\u003e {\n    html += `\u003cdiv class=\"month-block\"\u003e\u003cdiv class=\"month-title\"\u003e📅 ${month}\u003c\/div\u003e`;\n    evts.forEach(item =\u003e {\n      const kws = (item.keywords || []).map(k =\u003e `\u003cspan class=\"kw\"\u003e${k}\u003c\/span\u003e`).join('');\n      const checks = (item.checklist || []).map(c =\u003e `\u003cdiv class=\"cl-item\" onclick=\"this.classList.toggle('done')\"\u003e\u003cdiv class=\"cl-box\"\u003e\u003cspan class=\"cl-chk\"\u003e✓\u003c\/span\u003e\u003c\/div\u003e\u003cspan class=\"cl-text\"\u003e${c}\u003c\/span\u003e\u003c\/div\u003e`).join('');\n      html += `\u003cdiv class=\"plan-item\"\u003e\n        \u003cdiv class=\"plan-item-header\"\u003e\n          \u003cspan class=\"emoji\"\u003e${item.emoji || '📌'}\u003c\/span\u003e\n          \u003cspan class=\"event-title\"\u003e${item.event}\u003c\/span\u003e\n          \u003cspan class=\"event-dt\"\u003e${item.date}\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003cdiv style=\"font-size:13px;font-weight:600;color:#e91e8c;margin-bottom:8px;\"\u003e💡 ${item.product}\u003c\/div\u003e\n        \u003cdiv class=\"plan-meta\"\u003e\n          \u003cdiv class=\"meta-box\"\u003e\u003cdiv class=\"meta-label\"\u003e🎨 Create\u003c\/div\u003e\u003cdiv class=\"meta-value\"\u003e${item.startCreate}\u003c\/div\u003e\u003c\/div\u003e\n          \u003cdiv class=\"meta-box\"\u003e\u003cdiv class=\"meta-label\"\u003e🚀 List\u003c\/div\u003e\u003cdiv class=\"meta-value\"\u003e${item.listBy}\u003c\/div\u003e\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv\u003e\u003cdiv style=\"font-size:11px;font-weight:700;letter-spacing:0.07em;text-transform:uppercase;color:#888;margin-bottom:5px;\"\u003eEtsy Keywords\u003c\/div\u003e\u003cdiv class=\"keywords\"\u003e${kws}\u003c\/div\u003e\u003c\/div\u003e\n        \u003cdiv style=\"margin-top:10px;\"\u003e\u003cdiv style=\"font-size:11px;font-weight:700;letter-spacing:0.07em;text-transform:uppercase;color:#888;margin-bottom:6px;\"\u003eLaunch Checklist\u003c\/div\u003e\u003cdiv class=\"checklist-items\"\u003e${checks}\u003c\/div\u003e\u003c\/div\u003e\n      \u003c\/div\u003e`;\n    });\n    html += '\u003c\/div\u003e';\n  });\n  body.innerHTML = html;\n}\n\nasync function callAI(events) {\n  const apiKey = getApiKey();\n  if (!apiKey) {\n    alert('Please enter your Anthropic API key at the top of the page to generate a plan.');\n    return null;\n  }\n  const startDate = document.getElementById('start-date').value;\n  const prompt = buildPrompt(events, startDate);\n  const res = await fetch('https:\/\/api.anthropic.com\/v1\/messages', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application\/json',\n      'x-api-key': apiKey,\n      'anthropic-version': '2023-06-01',\n      'anthropic-dangerous-direct-browser-access': 'true'\n    },\n    body: JSON.stringify({\n      model: 'claude-sonnet-4-20250514',\n      max_tokens: 1000,\n      messages: [{ role: 'user', content: prompt }]\n    })\n  });\n  const data = await res.json();\n  if (data.error) { alert('API error: ' + data.error.message); return null; }\n  const text = data.content?.map(b =\u003e b.text || '').join('') || '[]';\n  try {\n    return JSON.parse(text.replace(\/```json|```\/g, '').trim());\n  } catch (e) { return null; }\n}\n\nasync function generateYearPlan(year) {\n  const sel = getSelected(year);\n  if (sel.length === 0) { alert('Please select at least one ' + year + ' event first!'); return; }\n  const btn = year === 2026\n    ? document.querySelectorAll('.btn-gen-year')[0]\n    : document.querySelectorAll('.btn-gen-year')[1];\n  const orig = btn.innerHTML;\n  btn.innerHTML = '\u003cspan class=\"spinner\"\u003e\u003c\/span\u003e Generating…';\n  btn.disabled = true;\n  const out = document.getElementById('output-section');\n  const body = document.getElementById('output-body');\n  document.getElementById('output-title').textContent = 'Your ' + year + ' Product Plan';\n  out.classList.add('visible');\n  body.innerHTML = '\u003cdiv class=\"loading-msg\"\u003eBuilding your ' + year + ' product plan…\u003c\/div\u003e';\n  out.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  try {\n    const items = await callAI(sel);\n    if (items) renderPlan(items);\n    else if (items !== null) body.innerHTML = '\u003cdiv class=\"loading-msg\"\u003eSomething went wrong. Please try again.\u003c\/div\u003e';\n  } catch (e) {\n    body.innerHTML = '\u003cdiv class=\"loading-msg\"\u003eCould not connect. Please check your API key and try again.\u003c\/div\u003e';\n  }\n  btn.innerHTML = orig; btn.disabled = false;\n}\n\nasync function generateSmartPlan() {\n  const all = [...getSelected(2026), ...getSelected(2027)];\n  if (all.length === 0) { alert('Please select at least one event first!'); return; }\n  const btn = document.getElementById('main-gen-btn');\n  btn.innerHTML = '\u003cspan class=\"spinner\"\u003e\u003c\/span\u003e Generating your smart plan…';\n  btn.disabled = true;\n  const out = document.getElementById('output-section');\n  const body = document.getElementById('output-body');\n  document.getElementById('output-title').textContent = 'Your Smart Product Plan';\n  out.classList.add('visible');\n  body.innerHTML = '\u003cdiv class=\"loading-msg\"\u003eBuilding your full smart plan…\u003c\/div\u003e';\n  out.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  try {\n    const items = await callAI(all);\n    if (items) renderPlan(items);\n    else if (items !== null) body.innerHTML = '\u003cdiv class=\"loading-msg\"\u003eSomething went wrong. Please try again.\u003c\/div\u003e';\n  } catch (e) {\n    body.innerHTML = '\u003cdiv class=\"loading-msg\"\u003eCould not connect. Please check your API key and try again.\u003c\/div\u003e';\n  }\n  btn.innerHTML = '🧠 Generate My Smart Plan'; btn.disabled = false;\n}\n\nrenderGrid(events2026, 2026);\nrenderGrid(events2027, 2027);\n\u003c\/script\u003e\n\n\u003c\/body\u003e","products":[],"url":"https:\/\/www.virtuousdelights.com\/collections\/digiproduct-planning-tool.oembed","provider":"Virtuous Delights Studio","version":"1.0","type":"link"}