{"product_id":"1-week-package-7-days","title":"VIP One Week Package","description":"\u003c!--\n==========================================================\n  JOLEE PICKS — WEEK PACKAGE PRODUCT PAGE ($50)\n  v2 — Paste this into Shopify Product Description (HTML mode)\n\n  CHANGES FROM v1:\n  - Dashboard data fetch: same bug as the other pages.\n    Apps Script returns the pick text as `bet` (not `matchup`)\n    and dates as ISO timestamps. Fixed both in loadData() +\n    added normalizeDate() helper.\n==========================================================\n--\u003e\n\n\u003c!-- Google Fonts --\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;500;600;700;800;900\u0026amp;family=Open+Sans:wght@400;500;600;700\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\n\u003cstyle\u003e\n  \/* ===== PRODUCT DESCRIPTION ===== *\/\n  .jp-product {\n    font-family: 'Open Sans', -apple-system, BlinkMacSystemFont, sans-serif;\n    color: #1a1a1a;\n    line-height: 1.7;\n    max-width: 800px;\n    margin: 0 auto;\n  }\n  .jp-product-hero {\n    background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);\n    color: white;\n    border-radius: 12px;\n    padding: 30px;\n    text-align: center;\n    margin-bottom: 25px;\n  }\n  .jp-product-hero-badge {\n    display: inline-block;\n    background: #D4A574;\n    color: #1a1a1a;\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.7rem;\n    font-weight: 800;\n    padding: 5px 14px;\n    border-radius: 20px;\n    letter-spacing: 1.5px;\n    text-transform: uppercase;\n    margin-bottom: 15px;\n  }\n  .jp-product-hero h2 {\n    font-family: 'Montserrat', sans-serif;\n    font-size: clamp(1.4rem, 4vw, 1.8rem);\n    font-weight: 900;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n    margin: 0 0 10px 0;\n    color: white;\n  }\n  .jp-product-hero p {\n    font-size: 1rem;\n    color: #b0b0b0;\n    margin: 0;\n    max-width: 500px;\n    margin: 0 auto;\n  }\n  .jp-product-hero .jp-highlight {\n    color: #E8C9A0;\n    font-weight: 700;\n  }\n  .jp-product-includes {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n    gap: 15px;\n    margin-bottom: 25px;\n  }\n  .jp-include-item {\n    background: #f8f7f5;\n    border: 1px solid #e5e5e5;\n    border-radius: 10px;\n    padding: 18px;\n    text-align: center;\n    transition: all 0.2s ease;\n  }\n  .jp-include-item:hover {\n    border-color: #D4A574;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n  }\n  .jp-include-icon {\n    font-size: 1.5rem;\n    margin-bottom: 8px;\n  }\n  .jp-include-title {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.8rem;\n    font-weight: 700;\n    color: #1a1a1a;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n  }\n  .jp-include-desc {\n    font-size: 0.85rem;\n    color: #777;\n    margin-top: 4px;\n  }\n  .jp-product-note {\n    background: #fff9f0;\n    border-left: 4px solid #D4A574;\n    padding: 15px 20px;\n    border-radius: 0 8px 8px 0;\n    margin-bottom: 25px;\n    font-size: 0.9rem;\n    color: #555;\n  }\n  .jp-product-note strong {\n    color: #1a1a1a;\n  }\n  .jp-email-note {\n    background: #f0f0f0;\n    border-radius: 8px;\n    padding: 15px 20px;\n    margin-top: 25px;\n    font-size: 0.8rem;\n    color: #666;\n    line-height: 1.8;\n  }\n  .jp-email-note strong {\n    color: #1a1a1a;\n    display: block;\n    margin-bottom: 5px;\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.75rem;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n  }\n\n  \/* ===== HOW IT WORKS ===== *\/\n  .jp-how-it-works {\n    font-family: 'Open Sans', -apple-system, BlinkMacSystemFont, sans-serif;\n    background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);\n    padding: 50px 20px;\n    color: white;\n    border-radius: 12px;\n    margin: 30px 0;\n  }\n  .jp-how-it-works-container {\n    max-width: 800px;\n    margin: 0 auto;\n  }\n  .jp-how-it-works-title {\n    text-align: center;\n    font-family: 'Montserrat', sans-serif;\n    font-size: clamp(1.5rem, 4vw, 2rem);\n    font-weight: 900;\n    text-transform: uppercase;\n    letter-spacing: 2px;\n    margin: 0 0 10px 0;\n    color: white;\n  }\n  .jp-how-it-works-subtitle {\n    text-align: center;\n    font-size: 1rem;\n    color: #D4A574;\n    margin: 0 0 40px 0;\n    font-weight: 500;\n  }\n  .jp-steps-container {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 25px;\n    position: relative;\n  }\n  .jp-steps-container::before {\n    content: '';\n    position: absolute;\n    top: 45px;\n    left: 15%;\n    right: 15%;\n    height: 3px;\n    background: linear-gradient(90deg, #D4A574 0%, #E8C9A0 50%, #D4A574 100%);\n    z-index: 0;\n  }\n  .jp-step {\n    text-align: center;\n    position: relative;\n    z-index: 1;\n  }\n  .jp-step-number {\n    width: 90px;\n    height: 90px;\n    margin: 0 auto 20px;\n    background: linear-gradient(135deg, #D4A574 0%, #E8C9A0 100%);\n    border-radius: 50%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-family: 'Montserrat', sans-serif;\n    font-size: 2.2rem;\n    font-weight: 900;\n    color: #1a1a1a;\n    box-shadow: 0 8px 25px rgba(212, 165, 116, 0.3);\n    position: relative;\n  }\n  .jp-step-icon {\n    position: absolute;\n    bottom: -5px;\n    right: -5px;\n    width: 35px;\n    height: 35px;\n    background: #1a1a1a;\n    border-radius: 50%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 1.1rem;\n    border: 3px solid #D4A574;\n  }\n  .jp-step-title {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 1.1rem;\n    font-weight: 800;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n    margin-bottom: 10px;\n    color: white;\n  }\n  .jp-step-description {\n    font-size: 0.9rem;\n    line-height: 1.6;\n    color: #b0b0b0;\n    max-width: 250px;\n    margin: 0 auto;\n  }\n  .jp-step-highlight {\n    color: #D4A574;\n    font-weight: 600;\n  }\n  .jp-hiw-guarantee {\n    text-align: center;\n    margin-top: 35px;\n    font-size: 0.85rem;\n    color: #888;\n  }\n\n  \/* ===== TRIMMED DASHBOARD ===== *\/\n  .jp-dash {\n    font-family: 'Open Sans', sans-serif;\n    color: #1a1a1a;\n    line-height: 1.6;\n    margin-top: 30px;\n  }\n  .jp-dash * { box-sizing: border-box; }\n  .jp-dash-header {\n    text-align: center;\n    margin-bottom: 25px;\n  }\n  .jp-dash-header h2 {\n    font-family: 'Montserrat', sans-serif;\n    font-size: clamp(1.3rem, 4vw, 1.8rem);\n    font-weight: 900;\n    color: #1a1a1a;\n    letter-spacing: 1px;\n    text-transform: uppercase;\n    margin: 0 0 8px 0;\n  }\n  .jp-dash-header p {\n    font-size: 0.9rem;\n    color: #777;\n    margin: 0;\n  }\n  .jp-dash-verified {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    background: #f8f7f5;\n    border: 2px solid #D4A574;\n    padding: 8px 20px;\n    border-radius: 50px;\n    margin-top: 15px;\n    font-size: 0.8rem;\n    color: #B8956A;\n    font-weight: 700;\n    letter-spacing: 1px;\n    text-transform: uppercase;\n  }\n  .jp-dash-verified svg {\n    width: 16px;\n    height: 16px;\n    color: #28a745;\n  }\n\n  \/* Headline Stats *\/\n  .jp-dash-headline {\n    background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);\n    color: white;\n    padding: 25px;\n    border-radius: 12px;\n    margin-bottom: 25px;\n    text-align: center;\n  }\n  .jp-dash-headline .jp-main-record {\n    font-family: 'Montserrat', sans-serif;\n    font-size: clamp(1.3rem, 3.5vw, 1.8rem);\n    font-weight: 800;\n    margin-bottom: 5px;\n  }\n  .jp-dash-headline .jp-hl { color: #E8C9A0; }\n  .jp-dash-headline .jp-sub {\n    font-size: 0.9rem;\n    opacity: 0.9;\n  }\n\n  \/* Stats Grid *\/\n  .jp-dash-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n    gap: 15px;\n    margin-bottom: 25px;\n  }\n  .jp-dash-card {\n    background: #fff;\n    border: 1px solid #e5e5e5;\n    border-radius: 10px;\n    padding: 20px;\n    text-align: center;\n    transition: all 0.3s ease;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n  }\n  .jp-dash-card:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n    border-color: #D4A574;\n  }\n  .jp-dash-card.jp-featured {\n    background: linear-gradient(135deg, #E8C9A0 0%, #D4A574 100%);\n    border: none;\n    color: #1a1a1a;\n  }\n  .jp-dash-card .jp-label {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.7rem;\n    color: #777;\n    text-transform: uppercase;\n    letter-spacing: 2px;\n    font-weight: 700;\n    margin-bottom: 8px;\n  }\n  .jp-dash-card.jp-featured .jp-label { color: #1a1a1a; opacity: 0.7; }\n  .jp-dash-card .jp-val {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 1.8rem;\n    font-weight: 800;\n    color: #1a1a1a;\n    line-height: 1;\n  }\n  .jp-dash-card .jp-val.jp-positive { color: #28a745; }\n  .jp-dash-card .jp-val.jp-negative { color: #dc3545; }\n  .jp-dash-card .jp-sub { font-size: 0.75rem; color: #999; margin-top: 6px; }\n  .jp-dash-card.jp-featured .jp-sub { color: #1a1a1a; opacity: 0.7; }\n\n  \/* Streak *\/\n  .jp-dash-streak {\n    background: #f8f7f5;\n    border-radius: 10px;\n    padding: 20px;\n    margin-bottom: 25px;\n    text-align: center;\n  }\n  .jp-dash-streak-label {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.7rem;\n    color: #777;\n    text-transform: uppercase;\n    letter-spacing: 2px;\n    font-weight: 700;\n    margin-bottom: 12px;\n  }\n  .jp-dash-streak-display {\n    display: flex;\n    justify-content: center;\n    gap: 5px;\n    flex-wrap: wrap;\n  }\n  .jp-dash-streak-item {\n    width: 32px;\n    height: 32px;\n    border-radius: 5px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-family: 'Montserrat', sans-serif;\n    font-weight: 800;\n    font-size: 0.7rem;\n  }\n  .jp-dash-streak-item.jp-win { background: #28a745; color: white; }\n  .jp-dash-streak-item.jp-loss { background: #dc3545; color: white; }\n  .jp-dash-streak-item.jp-push { background: #ffc107; color: #1a1a1a; }\n\n  \/* Period Cards *\/\n  .jp-dash-periods {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n    gap: 20px;\n    margin-bottom: 25px;\n  }\n  .jp-dash-period {\n    background: #fff;\n    border: 1px solid #e5e5e5;\n    border-radius: 12px;\n    padding: 22px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n  }\n  .jp-dash-period-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 15px;\n  }\n  .jp-dash-period-title {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.75rem;\n    color: #D4A574;\n    text-transform: uppercase;\n    letter-spacing: 2px;\n    font-weight: 700;\n  }\n  .jp-dash-period-dates {\n    font-size: 0.7rem;\n    color: #999;\n    letter-spacing: 1px;\n    text-transform: uppercase;\n  }\n  .jp-dash-period-stats {\n    display: flex;\n    justify-content: space-between;\n    align-items: baseline;\n    margin-bottom: 12px;\n  }\n  .jp-dash-period-profit {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 1.8rem;\n    font-weight: 800;\n  }\n  .jp-dash-period-profit.jp-positive { color: #28a745; }\n  .jp-dash-period-profit.jp-negative { color: #dc3545; }\n  .jp-dash-period-profit .jp-unit-label {\n    font-size: 0.8rem;\n    color: #888;\n    font-weight: 400;\n  }\n  .jp-dash-period-record {\n    font-size: 0.9rem;\n    color: #555;\n  }\n  .jp-dash-period-record .jp-hl {\n    color: #D4A574;\n    font-weight: 700;\n  }\n  .jp-dash-period-bar-label {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.65rem;\n    color: #999;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n    margin-bottom: 8px;\n  }\n  .jp-dash-bar-row {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    margin-bottom: 6px;\n  }\n  .jp-dash-bar-label {\n    font-size: 0.75rem;\n    color: #777;\n    min-width: 55px;\n    font-weight: 600;\n  }\n  .jp-dash-bar-label.jp-current {\n    color: #D4A574;\n    font-weight: 700;\n  }\n  .jp-dash-bar-track {\n    flex: 1;\n    height: 14px;\n    background: #f0f0f0;\n    border-radius: 3px;\n    overflow: hidden;\n  }\n  .jp-dash-bar-fill {\n    height: 100%;\n    border-radius: 3px;\n    min-width: 2px;\n  }\n  .jp-dash-bar-fill.jp-green { background: linear-gradient(to right, #1e7e34, #28a745); }\n  .jp-dash-bar-fill.jp-red { background: linear-gradient(to right, #a71d2a, #dc3545); }\n  .jp-dash-bar-fill.jp-gold { background: linear-gradient(to right, #8B7355, #D4A574); }\n  .jp-dash-bar-value {\n    font-size: 0.75rem;\n    font-weight: 700;\n    min-width: 50px;\n    text-align: right;\n  }\n  .jp-dash-bar-value.jp-positive { color: #28a745; }\n  .jp-dash-bar-value.jp-negative { color: #dc3545; }\n  .jp-dash-bar-value.jp-gold-text { color: #D4A574; }\n\n  \/* Chart *\/\n  .jp-dash-chart-section {\n    background: #fff;\n    border: 1px solid #e5e5e5;\n    border-radius: 12px;\n    padding: 22px;\n    margin-bottom: 25px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n  }\n  .jp-dash-chart-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 15px;\n    flex-wrap: wrap;\n    gap: 10px;\n  }\n  .jp-dash-chart-title {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 1rem;\n    font-weight: 800;\n    color: #1a1a1a;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n  }\n  .jp-dash-chart-filters {\n    display: flex;\n    gap: 6px;\n  }\n  .jp-dash-filter-btn {\n    background: #f8f7f5;\n    border: 1px solid #e5e5e5;\n    color: #4a4a4a;\n    padding: 6px 14px;\n    border-radius: 6px;\n    font-family: 'Open Sans', sans-serif;\n    font-size: 0.75rem;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.2s ease;\n  }\n  .jp-dash-filter-btn:hover { border-color: #D4A574; color: #B8956A; }\n  .jp-dash-filter-btn.jp-active { background: #D4A574; border-color: #D4A574; color: #1a1a1a; }\n  .jp-dash-chart-container { height: 240px; margin-top: 10px; }\n  .jp-dash-chart-stats {\n    display: flex;\n    justify-content: center;\n    gap: 25px;\n    margin-top: 12px;\n    padding-top: 12px;\n    border-top: 1px solid #e5e5e5;\n    flex-wrap: wrap;\n  }\n  .jp-dash-chart-stat { text-align: center; }\n  .jp-dash-chart-stat-label { font-size: 0.65rem; color: #777; text-transform: uppercase; letter-spacing: 1px; }\n  .jp-dash-chart-stat-value { font-family: 'Montserrat', sans-serif; font-size: 1rem; font-weight: 700; color: #1a1a1a; }\n  .jp-dash-chart-stat-value.jp-positive { color: #28a745; }\n  .jp-dash-chart-stat-value.jp-negative { color: #dc3545; }\n\n  \/* Footer *\/\n  .jp-dash-footer {\n    text-align: center;\n    padding: 20px;\n    color: #999;\n    font-size: 0.8rem;\n    border-top: 1px solid #e5e5e5;\n    margin-top: 10px;\n  }\n  .jp-dash-footer a { color: #B8956A; text-decoration: none; font-weight: 600; }\n  .jp-dash-footer a:hover { text-decoration: underline; }\n  .jp-dash-last-updated { font-size: 0.7rem; color: #bbb; margin-top: 5px; }\n\n  \/* ===== RESPONSIVE ===== *\/\n  @media (max-width: 768px) {\n    .jp-steps-container { grid-template-columns: 1fr; gap: 30px; }\n    .jp-steps-container::before { display: none; }\n    .jp-step-number { width: 70px; height: 70px; font-size: 1.8rem; }\n    .jp-step-icon { width: 30px; height: 30px; font-size: 0.9rem; }\n    .jp-product-includes { grid-template-columns: 1fr 1fr; }\n    .jp-dash-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; }\n    .jp-dash-card .jp-val { font-size: 1.4rem; }\n    .jp-dash-periods { grid-template-columns: 1fr; }\n    .jp-dash-chart-header { flex-direction: column; align-items: flex-start; }\n    .jp-dash-chart-filters { width: 100%; overflow-x: auto; }\n    .jp-dash-chart-stats { gap: 15px; }\n    .jp-dash-period-profit { font-size: 1.4rem; }\n  }\n\u003c\/style\u003e\n\n\n\u003c!-- ===== SECTION 1: PRODUCT DESCRIPTION ===== --\u003e\n\n\u003cdiv class=\"jp-product\"\u003e\n\n  \u003cdiv class=\"jp-product-hero\"\u003e\n    \u003cdiv class=\"jp-product-hero-badge\"\u003eMost Popular\u003c\/div\u003e\n    \u003ch2\u003e7 Days of VIP Picks\u003c\/h2\u003e\n    \u003cp\u003eGet \u003cspan class=\"jp-highlight\"\u003eevery pick we make for a full week\u003c\/span\u003e — including our whale plays, strong plays, and standard plays delivered straight to your inbox daily.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"jp-product-includes\"\u003e\n    \u003cdiv class=\"jp-include-item\"\u003e\n      \u003cdiv class=\"jp-include-icon\"\u003e🐋\u003c\/div\u003e\n      \u003cdiv class=\"jp-include-title\"\u003eMax Bets\u003c\/div\u003e\n      \u003cdiv class=\"jp-include-desc\"\u003eOur highest-conviction whale plays\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"jp-include-item\"\u003e\n      \u003cdiv class=\"jp-include-icon\"\u003e🤖\u003c\/div\u003e\n      \u003cdiv class=\"jp-include-title\"\u003eAI-Powered\u003c\/div\u003e\n      \u003cdiv class=\"jp-include-desc\"\u003e100,000 game simulations per pick\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"jp-include-item\"\u003e\n      \u003cdiv class=\"jp-include-icon\"\u003e📧\u003c\/div\u003e\n      \u003cdiv class=\"jp-include-title\"\u003eDaily Emails\u003c\/div\u003e\n      \u003cdiv class=\"jp-include-desc\"\u003ePicks sent 1+ hour before game time\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"jp-include-item\"\u003e\n      \u003cdiv class=\"jp-include-icon\"\u003e✅\u003c\/div\u003e\n      \u003cdiv class=\"jp-include-title\"\u003eVerified\u003c\/div\u003e\n      \u003cdiv class=\"jp-include-desc\"\u003eEvery pick tracked on Action Network\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"jp-product-note\"\u003e\n    \u003cstrong\u003e💡 Why one week?\u003c\/strong\u003e A week gives you a real taste of what we do — see the daily process, experience the max bets, and watch the results come in. We recommend the monthly package due to the natural variance of sports betting, but a week is a great way to get started.\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"jp-email-note\"\u003e\n    \u003cstrong\u003e📬 Important — Read Before Purchasing\u003c\/strong\u003e\n    Make sure the email you sign up with is the email you want picks sent to. Picks are emailed daily at least 1 hour before the first game. Check spam\/junk if you don't see them. Follow us on Instagram \u003ca href=\"https:\/\/www.instagram.com\/jolee.picks\/\" style=\"color:#D4A574;\"\u003e@jolee.picks\u003c\/a\u003e for release notifications.\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\n\u003c!-- ===== SECTION 2: HOW IT WORKS ===== --\u003e\n\n\u003cdiv class=\"jp-how-it-works\"\u003e\n  \u003cdiv class=\"jp-how-it-works-container\"\u003e\n    \u003ch2 class=\"jp-how-it-works-title\"\u003eHow It Works\u003c\/h2\u003e\n    \u003cp class=\"jp-how-it-works-subtitle\"\u003eStart winning in 3 simple steps\u003c\/p\u003e\n    \n    \u003cdiv class=\"jp-steps-container\"\u003e\n      \u003cdiv class=\"jp-step\"\u003e\n        \u003cdiv class=\"jp-step-number\"\u003e\n          1\n          \u003cdiv class=\"jp-step-icon\"\u003e📱\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003ch3 class=\"jp-step-title\"\u003eSubscribe\u003c\/h3\u003e\n        \u003cp class=\"jp-step-description\"\u003e\n          Choose a plan that fits your style — \u003cspan class=\"jp-step-highlight\"\u003eday pass, weekly, monthly, or yearly\u003c\/span\u003e. Get instant access to all our picks.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n      \n      \u003cdiv class=\"jp-step\"\u003e\n        \u003cdiv class=\"jp-step-number\"\u003e\n          2\n          \u003cdiv class=\"jp-step-icon\"\u003e🔔\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003ch3 class=\"jp-step-title\"\u003eGet Picks\u003c\/h3\u003e\n        \u003cp class=\"jp-step-description\"\u003e\n          Receive daily picks \u003cspan class=\"jp-step-highlight\"\u003estraight to your inbox\u003c\/span\u003e. We send alerts before games with our best bets and max plays.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n      \n      \u003cdiv class=\"jp-step\"\u003e\n        \u003cdiv class=\"jp-step-number\"\u003e\n          3\n          \u003cdiv class=\"jp-step-icon\"\u003e💰\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003ch3 class=\"jp-step-title\"\u003eWin\u003c\/h3\u003e\n        \u003cp class=\"jp-step-description\"\u003e\n          Place your bets on \u003cspan class=\"jp-step-highlight\"\u003eDraftKings, FanDuel, BetMGM\u003c\/span\u003e or your favorite sportsbook. Track results in real-time.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \n    \u003cp class=\"jp-hiw-guarantee\"\u003e\n      ✅ 59% max bet win rate • 4,900+ winning picks • Verified on Action Network\n    \u003c\/p\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ===== SECTION 3: LIVE DASHBOARD (Trimmed) ===== --\u003e\n\n\u003cdiv class=\"jp-dash\" id=\"jp-week-dashboard\"\u003e\n  \n  \u003cdiv class=\"jp-dash-header\"\u003e\n    \u003ch2\u003e📊 Live Performance Dashboard\u003c\/h2\u003e\n    \u003cp\u003eUpdated automatically from our verified track record\u003c\/p\u003e\n    \u003cdiv class=\"jp-dash-verified\"\u003e\n      \u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\u003e\n        \u003cpath d=\"M9 12l2 2 4-4\"\u003e\u003c\/path\u003e\n        \u003cpath d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z\"\u003e\u003c\/path\u003e\n      \u003c\/svg\u003e\n      Tracked on Action Network\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- All-Time Headline --\u003e\n  \u003cdiv class=\"jp-dash-headline\"\u003e\n    \u003cdiv class=\"jp-main-record\"\u003eAll Time: \u003cspan class=\"jp-hl\" id=\"jpWeekAllTime\"\u003eLoading...\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003cdiv class=\"jp-sub\" id=\"jpWeekAllTimeProfit\"\u003eLoading profit data...\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Quick Stats Grid --\u003e\n  \u003cdiv class=\"jp-dash-grid\" id=\"jpWeekStatsGrid\"\u003e\u003c\/div\u003e\n\n  \u003c!-- Last 20 Streak --\u003e\n  \u003cdiv class=\"jp-dash-streak\"\u003e\n    \u003cdiv class=\"jp-dash-streak-label\"\u003eLast 20 Picks\u003c\/div\u003e\n    \u003cdiv class=\"jp-dash-streak-display\" id=\"jpWeekStreak\"\u003e\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Last 30 Days + Last 7 Days Side by Side --\u003e\n  \u003cdiv class=\"jp-dash-periods\"\u003e\n    \u003cdiv class=\"jp-dash-period\" id=\"jpWeek30Day\"\u003e\u003c\/div\u003e\n    \u003cdiv class=\"jp-dash-period\" id=\"jpWeek7Day\"\u003e\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Profit Chart --\u003e\n  \u003cdiv class=\"jp-dash-chart-section\"\u003e\n    \u003cdiv class=\"jp-dash-chart-header\"\u003e\n      \u003cdiv class=\"jp-dash-chart-title\"\u003e📈 Profit Over Time\u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-chart-filters\"\u003e\n        \u003cbutton class=\"jp-dash-filter-btn jp-active\" data-filter=\"30\"\u003eLast 30 Days\u003c\/button\u003e\n        \u003cbutton class=\"jp-dash-filter-btn\" data-filter=\"7\"\u003eLast 7 Days\u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"jp-dash-chart-container\"\u003e\n      \u003ccanvas id=\"jpWeekChart\"\u003e\u003c\/canvas\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"jp-dash-chart-stats\" id=\"jpWeekChartStats\"\u003e\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Footer --\u003e\n  \u003cdiv class=\"jp-dash-footer\"\u003e\n    \u003cp\u003eAll picks independently tracked on \u003ca href=\"https:\/\/myaction.app\/qwerty123456\" target=\"_blank\"\u003eAction Network\u003c\/a\u003e\u003c\/p\u003e\n    \u003cp class=\"jp-dash-last-updated\"\u003eLast updated: \u003cspan id=\"jpWeekUpdated\"\u003eLoading...\u003c\/span\u003e\u003c\/p\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\n\u003c!-- Chart.js --\u003e\n\u003cscript src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"\u003e\u003c\/script\u003e\n\n\u003cscript\u003e\n(function() {\n  const GOOGLE_APPS_SCRIPT_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbwKPPdmwX_FkGiUFz-70D7k_dcV-_T99w1vC62jnnNicli4FM85vfmYya9PYXX05GCp\/exec';\n\n  let allData = [];\n  let profitChart = null;\n\n  function formatNumber(num) {\n    return num.toString().replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, \",\");\n  }\n\n  \/\/ PATCH: Apps Script returns dates as ISO timestamps like \"2026-05-09T00:00:00.000Z\".\n  \/\/ Strip down to YYYY-MM-DD so downstream split('-') logic stays correct.\n  function normalizeDate(d) {\n    if (d == null) return '';\n    const s = String(d).trim();\n    if (!s) return '';\n    if (\/^\\d{4}-\\d{2}-\\d{2}\/.test(s)) return s.slice(0, 10);\n    const dt = new Date(s);\n    if (isNaN(dt)) return s;\n    const y = dt.getUTCFullYear();\n    const m = String(dt.getUTCMonth() + 1).padStart(2, '0');\n    const day = String(dt.getUTCDate()).padStart(2, '0');\n    return `${y}-${m}-${day}`;\n  }\n\n  function parseDate(dateStr) {\n    const parts = dateStr.split('-');\n    if (parts.length === 3) {\n      return new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, parseInt(parts[2]));\n    }\n    return new Date(dateStr);\n  }\n\n  function calculateStats(data) {\n    const settled = data.filter(p =\u003e ['win', 'loss', 'push'].includes(p.result));\n    const wins = settled.filter(p =\u003e p.result === 'win').length;\n    const losses = settled.filter(p =\u003e p.result === 'loss').length;\n    const pushes = settled.filter(p =\u003e p.result === 'push').length;\n    const totalPicks = settled.length;\n    const totalWagered = settled.reduce((sum, p) =\u003e sum + Math.abs(p.units), 0);\n    const totalProfit = settled.reduce((sum, p) =\u003e sum + p.profit, 0);\n    const winPct = totalPicks \u003e 0 ? ((wins \/ (totalPicks - pushes)) * 100) : 0;\n    const roi = totalWagered \u003e 0 ? ((totalProfit \/ totalWagered) * 100) : 0;\n    return { wins, losses, pushes, record: `${formatNumber(wins)}-${formatNumber(losses)}${pushes \u003e 0 ? `-${pushes}` : ''}`, winRate: winPct.toFixed(1), totalProfit: totalProfit.toFixed(2), roi: roi.toFixed(2), totalPicks };\n  }\n\n  function calculatePeriodStats(data, days) {\n    const cutoff = new Date();\n    cutoff.setDate(cutoff.getDate() - days);\n    const filtered = data.filter(p =\u003e parseDate(p.date) \u003e= cutoff \u0026\u0026 ['win', 'loss', 'push'].includes(p.result));\n    const wins = filtered.filter(p =\u003e p.result === 'win').length;\n    const losses = filtered.filter(p =\u003e p.result === 'loss').length;\n    const pushes = filtered.filter(p =\u003e p.result === 'push').length;\n    const totalProfit = filtered.reduce((sum, p) =\u003e sum + p.profit, 0);\n    const totalWagered = filtered.reduce((sum, p) =\u003e sum + Math.abs(p.units), 0);\n    const winPct = (wins + losses) \u003e 0 ? ((wins \/ (wins + losses)) * 100) : 0;\n    const roi = totalWagered \u003e 0 ? ((totalProfit \/ totalWagered) * 100) : 0;\n    return { wins, losses, pushes, record: `${wins}-${losses}${pushes \u003e 0 ? `-${pushes}` : ''}`, winPct: winPct.toFixed(1), profit: totalProfit.toFixed(2), roi: roi.toFixed(1), filtered };\n  }\n\n  function getDailyBreakdown(data, days) {\n    const cutoff = new Date();\n    cutoff.setDate(cutoff.getDate() - days);\n    const filtered = data.filter(p =\u003e parseDate(p.date) \u003e= cutoff \u0026\u0026 ['win', 'loss', 'push'].includes(p.result));\n    \n    const daily = {};\n    filtered.forEach(p =\u003e {\n      if (!daily[p.date]) daily[p.date] = { profit: 0, date: p.date };\n      daily[p.date].profit += p.profit;\n    });\n    \n    return Object.values(daily).sort((a, b) =\u003e parseDate(a.date) - parseDate(b.date));\n  }\n\n  function getWeeklyBreakdown(data, days) {\n    const cutoff = new Date();\n    cutoff.setDate(cutoff.getDate() - days);\n    const filtered = data.filter(p =\u003e parseDate(p.date) \u003e= cutoff \u0026\u0026 ['win', 'loss', 'push'].includes(p.result));\n    \n    const weeks = [];\n    let currentWeek = { start: null, end: null, profit: 0 };\n    \n    const sorted = [...filtered].sort((a, b) =\u003e parseDate(a.date) - parseDate(b.date));\n    \n    sorted.forEach(p =\u003e {\n      const d = parseDate(p.date);\n      const weekStart = new Date(d);\n      weekStart.setDate(weekStart.getDate() - weekStart.getDay());\n      const weekKey = weekStart.toISOString().split('T')[0];\n      \n      if (!currentWeek.key) {\n        currentWeek = { key: weekKey, start: p.date, end: p.date, profit: p.profit };\n      } else if (currentWeek.key === weekKey) {\n        currentWeek.end = p.date;\n        currentWeek.profit += p.profit;\n      } else {\n        weeks.push({ ...currentWeek });\n        currentWeek = { key: weekKey, start: p.date, end: p.date, profit: p.profit };\n      }\n    });\n    if (currentWeek.key) weeks.push({ ...currentWeek });\n    \n    return weeks;\n  }\n\n  function formatDateShort(dateStr) {\n    const parts = dateStr.split('-');\n    if (parts.length === 3) {\n      return `${parseInt(parts[1])}\/${parseInt(parts[2])}`;\n    }\n    return dateStr;\n  }\n\n  function renderPeriodCard(el, title, dateRange, stats, breakdown, isCurrent) {\n    const profitVal = parseFloat(stats.profit);\n    const profitClass = profitVal \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    const profitSign = profitVal \u003e= 0 ? '+' : '';\n    \n    const maxVal = Math.max(...breakdown.map(b =\u003e Math.abs(b.profit)), 1);\n    \n    const barsHtml = breakdown.map((b, idx) =\u003e {\n      const isLast = idx === breakdown.length - 1 \u0026\u0026 isCurrent;\n      const barPct = Math.max((Math.abs(b.profit) \/ maxVal) * 100, 2);\n      const barClass = b.profit \u003e= 0 ? (isLast ? 'jp-gold' : 'jp-green') : 'jp-red';\n      const valClass = b.profit \u003e= 0 ? (isLast ? 'jp-gold-text' : 'jp-positive') : 'jp-negative';\n      const labelClass = isLast ? 'jp-dash-bar-label jp-current' : 'jp-dash-bar-label';\n      const sign = b.profit \u003e= 0 ? '+' : '';\n      const label = b.label || formatDateShort(b.start || b.date);\n      return `\n        \u003cdiv class=\"jp-dash-bar-row\"\u003e\n          \u003cdiv class=\"${labelClass}\"\u003e${label}\u003c\/div\u003e\n          \u003cdiv class=\"jp-dash-bar-track\"\u003e\n            \u003cdiv class=\"jp-dash-bar-fill ${barClass}\" style=\"width: ${barPct}%;\"\u003e\u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"jp-dash-bar-value ${valClass}\"\u003e${sign}${b.profit.toFixed(2)}u\u003c\/div\u003e\n        \u003c\/div\u003e\n      `;\n    }).join('');\n    \n    const barTypeLabel = breakdown.length \u003e 10 ? 'DAILY BREAKDOWN' : (breakdown[0] \u0026\u0026 breakdown[0].start ? 'WEEKLY BREAKDOWN' : 'DAILY BREAKDOWN');\n    \n    el.innerHTML = `\n      \u003cdiv class=\"jp-dash-period-header\"\u003e\n        \u003cdiv class=\"jp-dash-period-title\"\u003e${title}\u003c\/div\u003e\n        \u003cdiv class=\"jp-dash-period-dates\"\u003e${dateRange}\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-period-stats\"\u003e\n        \u003cdiv class=\"jp-dash-period-profit ${profitClass}\"\u003e${profitSign}${stats.profit} \u003cspan class=\"jp-unit-label\"\u003eunits\u003c\/span\u003e\u003c\/div\u003e\n        \u003cdiv class=\"jp-dash-period-record\"\u003e${stats.record} (\u003cspan class=\"jp-hl\"\u003e${stats.winPct}%\u003c\/span\u003e)\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-period-bar-label\"\u003e${barTypeLabel}\u003c\/div\u003e\n      ${barsHtml}\n    `;\n  }\n\n  function renderChart(data, filter) {\n    const days = parseInt(filter);\n    const cutoff = new Date();\n    cutoff.setDate(cutoff.getDate() - days);\n    const settled = data.filter(p =\u003e p.result !== 'pending').slice().reverse();\n    const filtered = settled.filter(p =\u003e parseDate(p.date) \u003e= cutoff);\n    \n    const ctx = document.getElementById('jpWeekChart').getContext('2d');\n    if (profitChart) profitChart.destroy();\n    \n    const periodStats = calculatePeriodStats(data, days);\n    const profitClass = parseFloat(periodStats.profit) \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    const roiClass = parseFloat(periodStats.roi) \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    const profitSign = parseFloat(periodStats.profit) \u003e= 0 ? '+' : '';\n    const roiSign = parseFloat(periodStats.roi) \u003e= 0 ? '+' : '';\n    \n    document.getElementById('jpWeekChartStats').innerHTML = `\n      \u003cdiv class=\"jp-dash-chart-stat\"\u003e\n        \u003cdiv class=\"jp-dash-chart-stat-label\"\u003eRecord\u003c\/div\u003e\n        \u003cdiv class=\"jp-dash-chart-stat-value\"\u003e${periodStats.record}\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-chart-stat\"\u003e\n        \u003cdiv class=\"jp-dash-chart-stat-label\"\u003eWin %\u003c\/div\u003e\n        \u003cdiv class=\"jp-dash-chart-stat-value\"\u003e${periodStats.winPct}%\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-chart-stat\"\u003e\n        \u003cdiv class=\"jp-dash-chart-stat-label\"\u003eUnits\u003c\/div\u003e\n        \u003cdiv class=\"jp-dash-chart-stat-value ${profitClass}\"\u003e${profitSign}${periodStats.profit}u\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-chart-stat\"\u003e\n        \u003cdiv class=\"jp-dash-chart-stat-label\"\u003eROI\u003c\/div\u003e\n        \u003cdiv class=\"jp-dash-chart-stat-value ${roiClass}\"\u003e${roiSign}${periodStats.roi}%\u003c\/div\u003e\n      \u003c\/div\u003e\n    `;\n    \n    let cumulative = 0;\n    const chartData = [];\n    const labels = [];\n    filtered.forEach(pick =\u003e {\n      cumulative += pick.profit;\n      labels.push(formatDateShort(pick.date));\n      chartData.push(parseFloat(cumulative.toFixed(2)));\n    });\n\n    const gradient = ctx.createLinearGradient(0, 0, 0, 240);\n    gradient.addColorStop(0, 'rgba(212, 165, 116, 0.4)');\n    gradient.addColorStop(1, 'rgba(212, 165, 116, 0.05)');\n    \n    profitChart = new Chart(ctx, {\n      type: 'line',\n      data: {\n        labels: labels,\n        datasets: [{\n          label: 'Cumulative Profit (Units)',\n          data: chartData,\n          borderColor: '#D4A574',\n          backgroundColor: gradient,\n          borderWidth: 3,\n          fill: true,\n          tension: 0,\n          pointRadius: 0,\n          pointHoverRadius: 6,\n          pointHoverBackgroundColor: '#D4A574',\n          pointHoverBorderColor: '#fff',\n          pointHoverBorderWidth: 2\n        }]\n      },\n      options: {\n        responsive: true,\n        maintainAspectRatio: false,\n        interaction: { intersect: false, mode: 'index' },\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            backgroundColor: '#1a1a1a',\n            titleColor: '#999',\n            bodyColor: '#fff',\n            bodyFont: { size: 14, weight: 'bold' },\n            padding: 12,\n            displayColors: false,\n            callbacks: {\n              label: function(context) {\n                const value = context.parsed.y;\n                return `${value \u003e= 0 ? '+' : ''}${formatNumber(value.toFixed(2))} units`;\n              }\n            }\n          }\n        },\n        scales: {\n          x: { grid: { color: 'rgba(0,0,0,0.05)', drawBorder: false }, ticks: { color: '#999', maxTicksLimit: 8, font: { size: 11 } } },\n          y: { grid: { color: 'rgba(0,0,0,0.05)', drawBorder: false }, ticks: { color: '#999', font: { size: 11 }, callback: function(v) { return (v \u003e= 0 ? '+' : '') + v + 'u'; } } }\n        }\n      }\n    });\n  }\n\n  async function loadData() {\n    try {\n      const response = await fetch(GOOGLE_APPS_SCRIPT_URL);\n      if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\n      const jsonData = await response.json();\n      \/\/ PATCH: read row.bet (current schema) with fallback to row.matchup (old schema).\n      \/\/ Normalize the date so ISO timestamps work with split('-') downstream.\n      allData = jsonData.map(row =\u003e ({\n        date: normalizeDate(row.date),\n        sport: (row.sport || '').toUpperCase(),\n        matchup: row.bet || row.matchup || '',\n        type: row.type || '',\n        odds: parseFloat(row.odds) || 0,\n        units: parseFloat(row.units) || 1,\n        result: (row.result || 'pending').toString().toLowerCase(),\n        profit: parseFloat(row.profit) || 0\n      })).filter(row =\u003e row.date \u0026\u0026 row.matchup);\n      console.log(`Loaded ${allData.length} picks from Google Sheets`);\n    } catch (error) {\n      console.error('Error loading data:', error);\n      return;\n    }\n\n    allData.sort((a, b) =\u003e parseDate(b.date) - parseDate(a.date));\n\n    const stats = calculateStats(allData);\n    document.getElementById('jpWeekAllTime').textContent = `${stats.record} (${stats.winRate}%)`;\n    const profitSign = parseFloat(stats.totalProfit) \u003e= 0 ? '+' : '';\n    const roiSign = parseFloat(stats.roi) \u003e= 0 ? '+' : '';\n    document.getElementById('jpWeekAllTimeProfit').textContent = `${profitSign}${formatNumber(parseFloat(stats.totalProfit).toFixed(2))} units | ${roiSign}${stats.roi}% ROI`;\n\n    const profitClass = parseFloat(stats.totalProfit) \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    const roiClass = parseFloat(stats.roi) \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    document.getElementById('jpWeekStatsGrid').innerHTML = `\n      \u003cdiv class=\"jp-dash-card jp-featured\"\u003e\n        \u003cdiv class=\"jp-label\"\u003eRecord\u003c\/div\u003e\n        \u003cdiv class=\"jp-val\"\u003e${stats.record}\u003c\/div\u003e\n        \u003cdiv class=\"jp-sub\"\u003e${formatNumber(stats.totalPicks)} settled picks\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-card\"\u003e\n        \u003cdiv class=\"jp-label\"\u003eWin Rate\u003c\/div\u003e\n        \u003cdiv class=\"jp-val\"\u003e${stats.winRate}%\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-card\"\u003e\n        \u003cdiv class=\"jp-label\"\u003eROI\u003c\/div\u003e\n        \u003cdiv class=\"jp-val ${roiClass}\"\u003e${roiSign}${stats.roi}%\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-card\"\u003e\n        \u003cdiv class=\"jp-label\"\u003eTotal Profit\u003c\/div\u003e\n        \u003cdiv class=\"jp-val ${profitClass}\"\u003e${profitSign}${formatNumber(Math.round(parseFloat(stats.totalProfit)))}u\u003c\/div\u003e\n      \u003c\/div\u003e\n    `;\n\n    const last20 = allData.filter(p =\u003e p.result !== 'pending').slice(0, 20);\n    document.getElementById('jpWeekStreak').innerHTML = last20.map(pick =\u003e `\n      \u003cdiv class=\"jp-dash-streak-item jp-${pick.result}\" title=\"${pick.matchup} - ${pick.result.toUpperCase()}\"\u003e\n        ${pick.result === 'win' ? 'W' : pick.result === 'loss' ? 'L' : 'P'}\n      \u003c\/div\u003e\n    `).join('');\n\n    const stats30 = calculatePeriodStats(allData, 30);\n    const weekly30 = getWeeklyBreakdown(allData, 30);\n    const weeklyBars = weekly30.map(w =\u003e ({\n      label: `${formatDateShort(w.start)} – ${formatDateShort(w.end)}`,\n      profit: w.profit,\n      start: w.start\n    }));\n    \n    const now = new Date();\n    const thirtyAgo = new Date();\n    thirtyAgo.setDate(thirtyAgo.getDate() - 30);\n    const dateRange30 = `${thirtyAgo.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} – ${now.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}`;\n    \n    renderPeriodCard(\n      document.getElementById('jpWeek30Day'),\n      'Last 30 Days',\n      dateRange30,\n      stats30,\n      weeklyBars,\n      true\n    );\n\n    const stats7 = calculatePeriodStats(allData, 7);\n    const daily7 = getDailyBreakdown(allData, 7);\n    const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n    const dailyBars = daily7.map(d =\u003e ({\n      label: dayNames[parseDate(d.date).getDay()],\n      profit: d.profit,\n      date: d.date\n    }));\n    \n    const sevenAgo = new Date();\n    sevenAgo.setDate(sevenAgo.getDate() - 7);\n    const dateRange7 = `${sevenAgo.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} – ${now.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}`;\n    \n    renderPeriodCard(\n      document.getElementById('jpWeek7Day'),\n      'Last 7 Days',\n      dateRange7,\n      stats7,\n      dailyBars,\n      true\n    );\n\n    renderChart(allData, '30');\n\n    document.querySelectorAll('.jp-dash-filter-btn').forEach(btn =\u003e {\n      btn.addEventListener('click', function() {\n        document.querySelectorAll('.jp-dash-filter-btn').forEach(b =\u003e b.classList.remove('jp-active'));\n        this.classList.add('jp-active');\n        renderChart(allData, this.dataset.filter);\n      });\n    });\n\n    document.getElementById('jpWeekUpdated').textContent = new Date().toLocaleDateString('en-US', {\n      month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: '2-digit'\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', loadData);\n  } else {\n    loadData();\n  }\n})();\n\u003c\/script\u003e","brand":"Jolee Picks","offers":[{"title":"Default Title","offer_id":14008372920365,"sku":"","price":50.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0013\/1946\/9101\/files\/F40B0F29-32A8-4D82-9207-45C5E6FB9F61.png?v=1735585129","url":"https:\/\/www.joleepicks.com\/products\/1-week-package-7-days","provider":"Jolee Picks","version":"1.0","type":"link"}