{"product_id":"vip-2024-year-package","title":"VIP 2026 Year Package","description":"\u003c!--\n==========================================================\n  JOLEE PICKS — 2026 YEAR PACKAGE PRODUCT PAGE ($400)\n  v2 — Paste this into Shopify Product Description (HTML mode)\n\n  CHANGES FROM v1:\n  - Price changed from $715 → $400\n  - Savings line updated ($500 saved vs $185, ~$52\/mo vs ~$60\/mo)\n  - \"Save over $785\" comparison card updated to reflect $400\n  - Dashboard data fetch: same bug as the results dashboard.\n    Apps Script returns the pick text as `bet` (not `matchup`),\n    and dates as ISO timestamps. Fixed both in loadData().\n==========================================================\n--\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003c!-- Google Fonts --\u003e\n\u003cp\u003e\u003clink href=\"https:\/\/fonts.googleapis.com\" rel=\"preconnect\"\u003e \u003clink crossorigin=\"\" href=\"https:\/\/fonts.gstatic.com\" rel=\"preconnect\"\u003e \u003clink rel=\"stylesheet\" 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\"\u003e\u003c\/p\u003e\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    border: 2px solid #D4A574;\n    position: relative;\n    overflow: hidden;\n  }\n  .jp-product-hero::before {\n    content: '';\n    position: absolute;\n    top: -50%;\n    left: -50%;\n    width: 200%;\n    height: 200%;\n    background: radial-gradient(circle at 30% 30%, rgba(212,165,116,0.08) 0%, transparent 50%);\n    pointer-events: none;\n  }\n  .jp-product-hero-badge {\n    display: inline-block;\n    background: linear-gradient(135deg, #D4A574 0%, #E8C9A0 100%);\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    position: relative;\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    position: relative;\n  }\n  .jp-product-hero p {\n    font-size: 1rem;\n    color: #b0b0b0;\n    margin: 0 auto;\n    max-width: 540px;\n    position: relative;\n  }\n  .jp-product-hero .jp-highlight { color: #E8C9A0; font-weight: 700; }\n  .jp-product-hero .jp-price-line {\n    margin-top: 18px;\n    font-family: 'Montserrat', sans-serif;\n    position: relative;\n  }\n  .jp-product-hero .jp-price-old {\n    font-size: 1.1rem;\n    color: #777;\n    text-decoration: line-through;\n    margin-right: 10px;\n  }\n  .jp-product-hero .jp-price-new {\n    font-size: 1.6rem;\n    font-weight: 900;\n    color: #E8C9A0;\n  }\n  .jp-product-hero .jp-price-savings {\n    display: block;\n    font-size: 0.8rem;\n    color: #28a745;\n    margin-top: 5px;\n    font-weight: 600;\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-item.jp-premium {\n    border: 2px solid #D4A574;\n    background: #fdf9f5;\n  }\n  .jp-include-icon { font-size: 1.5rem; margin-bottom: 8px; }\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 { font-size: 0.85rem; color: #777; margin-top: 4px; }\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 { color: #1a1a1a; }\n  .jp-savings-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n    gap: 12px;\n    margin-bottom: 25px;\n  }\n  .jp-savings-card {\n    background: #f8f7f5;\n    border: 1px solid #e5e5e5;\n    border-radius: 10px;\n    padding: 15px;\n    text-align: center;\n  }\n  .jp-savings-card.jp-active-plan {\n    background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);\n    border: 2px solid #D4A574;\n    color: white;\n  }\n  .jp-savings-card .jp-sav-plan {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.65rem;\n    text-transform: uppercase;\n    letter-spacing: 1.5px;\n    font-weight: 700;\n    color: #777;\n    margin-bottom: 4px;\n  }\n  .jp-savings-card.jp-active-plan .jp-sav-plan { color: #D4A574; }\n  .jp-savings-card .jp-sav-price {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 1.3rem;\n    font-weight: 800;\n    color: #1a1a1a;\n  }\n  .jp-savings-card.jp-active-plan .jp-sav-price { color: #E8C9A0; }\n  .jp-savings-card .jp-sav-per {\n    font-size: 0.75rem;\n    color: #999;\n  }\n  .jp-savings-card.jp-active-plan .jp-sav-per { color: #28a745; }\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 { max-width: 800px; margin: 0 auto; }\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 { text-align: center; position: relative; z-index: 1; }\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 { color: #D4A574; font-weight: 600; }\n  .jp-hiw-guarantee {\n    text-align: center;\n    margin-top: 35px;\n    font-size: 0.85rem;\n    color: #888;\n  }\n\n  \/* ===== DASHBOARD — YEAR PACKAGE ===== *\/\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 { text-align: center; margin-bottom: 25px; }\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 { font-size: 0.9rem; color: #777; margin: 0; }\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 { width: 16px; height: 16px; color: #28a745; }\n\n  \/* All-Time Headline *\/\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 { font-size: 0.9rem; opacity: 0.9; }\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  \/* Last 30 Days Card *\/\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    margin-bottom: 25px;\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 { font-size: 0.8rem; color: #888; font-weight: 400; }\n  .jp-dash-period-record { font-size: 0.9rem; color: #555; }\n  .jp-dash-period-record .jp-hl { color: #D4A574; font-weight: 700; }\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 { color: #D4A574; font-weight: 700; }\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  \/* Yearly Results Section *\/\n  .jp-yearly-section {\n    background: #fff;\n    border: 1px solid #e5e5e5;\n    border-radius: 12px;\n    overflow: hidden;\n    margin-bottom: 25px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n  }\n  .jp-yearly-header {\n    padding: 18px 22px;\n    border-bottom: 1px solid #e5e5e5;\n  }\n  .jp-yearly-title {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.9rem;\n    font-weight: 800;\n    color: #1a1a1a;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n  }\n  .jp-yearly-subtitle {\n    font-size: 0.8rem;\n    color: #777;\n    margin-top: 3px;\n  }\n  .jp-yearly-body { padding: 22px; }\n  .jp-yearly-row {\n    display: grid;\n    grid-template-columns: 70px 1fr 80px 80px;\n    align-items: center;\n    gap: 12px;\n    padding: 14px 0;\n    border-bottom: 1px solid #f0f0f0;\n  }\n  .jp-yearly-row:last-child { border-bottom: none; }\n  .jp-yearly-row.jp-year-current {\n    background: #fdf9f5;\n    margin: 0 -22px;\n    padding: 14px 22px;\n    border-radius: 8px;\n    border: 1px solid #D4A574;\n    border-bottom: 1px solid #D4A574;\n  }\n  .jp-yearly-year {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 1rem;\n    font-weight: 800;\n    color: #1a1a1a;\n  }\n  .jp-yearly-row.jp-year-current .jp-yearly-year { color: #D4A574; }\n  .jp-yearly-bar-container { position: relative; }\n  .jp-yearly-bar-track {\n    height: 24px;\n    background: #f0f0f0;\n    border-radius: 4px;\n    overflow: hidden;\n    position: relative;\n  }\n  .jp-yearly-bar-fill {\n    height: 100%;\n    border-radius: 4px;\n    min-width: 2px;\n    display: flex;\n    align-items: center;\n    padding-left: 8px;\n  }\n  .jp-yearly-bar-fill.jp-green { background: linear-gradient(to right, #1e7e34, #28a745); }\n  .jp-yearly-bar-fill.jp-red { background: linear-gradient(to right, #a71d2a, #dc3545); }\n  .jp-yearly-bar-fill.jp-gold { background: linear-gradient(to right, #8B7355, #D4A574); }\n  .jp-yearly-bar-inner-label {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.65rem;\n    font-weight: 700;\n    color: white;\n    white-space: nowrap;\n  }\n  .jp-yearly-record {\n    font-size: 0.8rem;\n    color: #555;\n    text-align: center;\n    font-weight: 600;\n  }\n  .jp-yearly-profit {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.95rem;\n    font-weight: 800;\n    text-align: right;\n  }\n  .jp-yearly-profit.jp-positive { color: #28a745; }\n  .jp-yearly-profit.jp-negative { color: #dc3545; }\n  .jp-yearly-profit.jp-gold-text { color: #D4A574; }\n  .jp-yearly-total {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding: 18px 22px;\n    background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);\n    color: white;\n  }\n  .jp-yearly-total-label {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 0.75rem;\n    text-transform: uppercase;\n    letter-spacing: 2px;\n    font-weight: 700;\n    color: #b0b0b0;\n  }\n  .jp-yearly-total-value {\n    font-family: 'Montserrat', sans-serif;\n    font-size: 1.4rem;\n    font-weight: 900;\n    color: #E8C9A0;\n  }\n\n  \/* Profit 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-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-savings-grid { 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-period-profit { font-size: 1.4rem; }\n    .jp-yearly-row { grid-template-columns: 50px 1fr 60px 65px; gap: 8px; }\n    .jp-yearly-year { font-size: 0.85rem; }\n    .jp-yearly-record { font-size: 0.7rem; }\n    .jp-yearly-profit { font-size: 0.85rem; }\n    .jp-yearly-bar-track { height: 20px; }\n    .jp-dash-chart-stats { gap: 15px; }\n  }\n\u003c\/style\u003e\n\u003c!-- ===== SECTION 1: PRODUCT DESCRIPTION ===== --\u003e\n\u003cdiv class=\"jp-product\"\u003e\n\u003cdiv class=\"jp-product-hero\"\u003e\n\u003cdiv class=\"jp-product-hero-badge\"\u003e🏆 All-Access 2026\u003c\/div\u003e\n\u003ch2\u003eThe Rest of 2026 — Every Pick, Every Day\u003c\/h2\u003e\n\u003cp\u003eLock in \u003cspan class=\"jp-highlight\"\u003eevery pick we make for the rest of 2026\u003c\/span\u003e — whale plays, strong plays, standard plays, every sport, every day. The ultimate package for serious bettors.\u003c\/p\u003e\n\u003cdiv class=\"jp-price-line\"\u003e\n\u003cspan class=\"jp-price-old\"\u003e$900\u003c\/span\u003e \u003cspan class=\"jp-price-new\"\u003e$400\u003c\/span\u003e \u003cspan class=\"jp-price-savings\"\u003eSave $500 — that's about $52\/month\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-product-includes\"\u003e\n\u003cdiv class=\"jp-include-item jp-premium\"\u003e\n\u003cdiv class=\"jp-include-icon\"\u003e🏆\u003c\/div\u003e\n\u003cdiv class=\"jp-include-title\"\u003eAll of 2026\u003c\/div\u003e\n\u003cdiv class=\"jp-include-desc\"\u003eEvery remaining day this year\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\"\u003eEvery Max Bet\u003c\/div\u003e\n\u003cdiv class=\"jp-include-desc\"\u003e59% win rate on 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 simulations per game\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\"\u003eTracked on Action Network\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-savings-grid\"\u003e\n\u003cdiv class=\"jp-savings-card\"\u003e\n\u003cdiv class=\"jp-sav-plan\"\u003eMonthly\u003c\/div\u003e\n\u003cdiv class=\"jp-sav-price\"\u003e$125\/mo\u003c\/div\u003e\n\u003cdiv class=\"jp-sav-per\"\u003e$1,500\/year\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-savings-card\"\u003e\n\u003cdiv class=\"jp-sav-plan\"\u003eWeekly\u003c\/div\u003e\n\u003cdiv class=\"jp-sav-price\"\u003e$50\/wk\u003c\/div\u003e\n\u003cdiv class=\"jp-sav-per\"\u003e$2,600\/year\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-savings-card jp-active-plan\"\u003e\n\u003cdiv class=\"jp-sav-plan\"\u003e2026 Package\u003c\/div\u003e\n\u003cdiv class=\"jp-sav-price\"\u003e$400\u003c\/div\u003e\n\u003cdiv class=\"jp-sav-per\"\u003eSave over $1,100 vs monthly\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-product-note\"\u003e\n\u003cstrong\u003e🏆 Why the full year?\u003c\/strong\u003e Five profitable years running. No more worrying about renewals, no more missing picks. Lock it in once and get every single play we make — NFL, NBA, NCAAB, MLB, NHL, and more. This is how our most successful subscribers roll.\u003c\/div\u003e\n\u003cdiv class=\"jp-email-note\"\u003e\n\u003cstrong\u003e📬 Important — Read Before Purchasing\u003c\/strong\u003e 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 style=\"color: #d4a574;\" href=\"https:\/\/www.instagram.com\/jolee.picks\/\"\u003e@jolee.picks\u003c\/a\u003e for release notifications.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ===== SECTION 2: HOW IT WORKS ===== --\u003e\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\u003cdiv class=\"jp-steps-container\"\u003e\n\u003cdiv class=\"jp-step\"\u003e\n\u003cdiv class=\"jp-step-number\"\u003e1\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\"\u003eLock in the \u003cspan class=\"jp-step-highlight\"\u003e2026 package\u003c\/span\u003e and get instant all-access to every pick we make for the rest of the year.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-step\"\u003e\n\u003cdiv class=\"jp-step-number\"\u003e2\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\"\u003eReceive daily picks \u003cspan class=\"jp-step-highlight\"\u003estraight to your inbox\u003c\/span\u003e. Whale plays, strong plays, every sport — all year long.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-step\"\u003e\n\u003cdiv class=\"jp-step-number\"\u003e3\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\"\u003ePlace your bets on \u003cspan class=\"jp-step-highlight\"\u003eDraftKings, FanDuel, BetMGM\u003c\/span\u003e or your favorite sportsbook. Track results in real-time.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp class=\"jp-hiw-guarantee\"\u003e✅ 5 profitable years running • 59% max bet win rate • Verified on Action Network\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ===== SECTION 3: LIVE DASHBOARD — YEAR PACKAGE ===== --\u003e\n\u003cdiv id=\"jp-year-dashboard\" class=\"jp-dash\"\u003e\n\u003cdiv class=\"jp-dash-header\"\u003e\n\u003ch2\u003e📊 Live Performance Dashboard\u003c\/h2\u003e\n\u003cp\u003eFive years of verified, profitable results\u003c\/p\u003e\n\u003cdiv class=\"jp-dash-verified\"\u003e\n\u003csvg stroke-width=\"2.5\" stroke=\"currentColor\" fill=\"none\" viewbox=\"0 0 24 24\"\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 Tracked on Action Network\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- All-Time Headline --\u003e\n\u003cdiv class=\"jp-dash-headline\"\u003e\n\u003cdiv class=\"jp-main-record\"\u003eAll Time: \u003cspan id=\"jpYearAllTime\" class=\"jp-hl\"\u003eLoading...\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"jpYearAllTimeProfit\" class=\"jp-sub\"\u003eLoading profit data...\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- Quick Stats Grid --\u003e\n\u003cdiv id=\"jpYearStatsGrid\" class=\"jp-dash-grid\"\u003e\u003c\/div\u003e\n\u003c!-- Last 30 Days --\u003e\n\u003cdiv id=\"jpYear30Day\" class=\"jp-dash-period\"\u003e\u003c\/div\u003e\n\u003c!-- Yearly Results --\u003e\n\u003cdiv class=\"jp-yearly-section\"\u003e\n\u003cdiv class=\"jp-yearly-header\"\u003e\n\u003cdiv class=\"jp-yearly-title\"\u003e📅 Year-by-Year Results\u003c\/div\u003e\n\u003cdiv class=\"jp-yearly-subtitle\"\u003eEvery year since we started — all verified on Action Network\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"jpYearlyBody\" class=\"jp-yearly-body\"\u003e\n\u003cdiv style=\"text-align: center; padding: 30px; color: #999;\"\u003eLoading yearly data...\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-yearly-total\"\u003e\n\u003cdiv class=\"jp-yearly-total-label\"\u003eAll-Time Total\u003c\/div\u003e\n\u003cdiv id=\"jpYearlyTotal\" class=\"jp-yearly-total-value\"\u003eLoading...\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- Profit Chart (Last 30 days) --\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📈 Last 30 Days — Profit Over Time\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jp-dash-chart-container\"\u003e\u003ccanvas id=\"jpYearChart\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\n\u003cdiv id=\"jpYearChartStats\" class=\"jp-dash-chart-stats\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ===== NO REFUND NOTICE ===== --\u003e\n\u003cdiv style=\"background: #f5f0f0; border-left: 4px solid #dc3545;\" class=\"jp-product-note\"\u003e\n\u003cstrong\u003e⚠️ No Refunds — All Sales Final\u003c\/strong\u003e By completing your purchase, you acknowledge and agree that all sales are final and non-refundable. Jolee Picks delivers digital sports information services that are consumed immediately upon delivery and cannot be returned. No refunds, credits, or chargebacks will be issued for any reason, including dissatisfaction with picks, gambling losses, unused subscription time, or early cancellation. Initiating a chargeback or payment dispute constitutes a breach of our \u003ca style=\"color: #dc3545; font-weight: 600;\" href=\"https:\/\/www.joleepicks.com\/pages\/terms-and-conditions\"\u003eTerms and Conditions\u003c\/a\u003e and may result in immediate termination of your subscription and pursuit of all fees and costs incurred. By purchasing, you confirm you have read and agree to our full Terms and Conditions.\u003c\/div\u003e\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=\"jpYearUpdated\"\u003eLoading...\u003c\/span\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- Chart.js --\u003e\n\u003cp\u003e\u003cscript src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"\u003e\u003c\/script\u003e \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) return new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, parseInt(parts[2]));\n    return new Date(dateStr);\n  }\n\n  function formatDateShort(dateStr) {\n    const parts = dateStr.split('-');\n    if (parts.length === 3) return `${parseInt(parts[1])}\/${parseInt(parts[2])}`;\n    return 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 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    const sorted = [...filtered].sort((a, b) =\u003e parseDate(a.date) - parseDate(b.date));\n    const weeks = [];\n    let currentWeek = {};\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      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    return weeks;\n  }\n\n  function getYearlyResults(data) {\n    const settled = data.filter(p =\u003e ['win', 'loss', 'push'].includes(p.result));\n    const years = {};\n    settled.forEach(p =\u003e {\n      const year = p.date.split('-')[0];\n      if (!years[year]) years[year] = { wins: 0, losses: 0, pushes: 0, profit: 0 };\n      if (p.result === 'win') years[year].wins++;\n      else if (p.result === 'loss') years[year].losses++;\n      else years[year].pushes++;\n      years[year].profit += p.profit;\n    });\n    return Object.entries(years)\n      .sort((a, b) =\u003e parseInt(b[0]) - parseInt(a[0]))\n      .slice(0, 5)\n      .map(([year, stats]) =\u003e ({\n        year,\n        wins: stats.wins,\n        losses: stats.losses,\n        pushes: stats.pushes,\n        record: `${stats.wins}-${stats.losses}${stats.pushes \u003e 0 ? `-${stats.pushes}` : ''}`,\n        winPct: ((stats.wins \/ (stats.wins + stats.losses)) * 100).toFixed(1),\n        profit: stats.profit\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    const currentYear = new Date().getFullYear().toString();\n\n    \/\/ All-time stats\n    const stats = calculateStats(allData);\n    document.getElementById('jpYearAllTime').textContent = `${stats.record} (${stats.winRate}%)`;\n    const profitSign = parseFloat(stats.totalProfit) \u003e= 0 ? '+' : '';\n    const roiSign = parseFloat(stats.roi) \u003e= 0 ? '+' : '';\n    document.getElementById('jpYearAllTimeProfit').textContent = `${profitSign}${formatNumber(parseFloat(stats.totalProfit).toFixed(2))} units | ${roiSign}${stats.roi}% ROI`;\n\n    \/\/ Max bet stats\n    const maxBets = allData.filter(p =\u003e p.units \u003e= 3 \u0026\u0026 ['win', 'loss', 'push'].includes(p.result));\n    const mbWins = maxBets.filter(p =\u003e p.result === 'win').length;\n    const mbLosses = maxBets.filter(p =\u003e p.result === 'loss').length;\n    const mbWinPct = (mbWins + mbLosses) \u003e 0 ? ((mbWins \/ (mbWins + mbLosses)) * 100).toFixed(1) : '0';\n    const mbProfit = maxBets.reduce((sum, p) =\u003e sum + p.profit, 0);\n\n    \/\/ Stats grid\n    const profitClass = parseFloat(stats.totalProfit) \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    const mbProfitClass = mbProfit \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    const mbProfitSign = mbProfit \u003e= 0 ? '+' : '';\n\n    document.getElementById('jpYearStatsGrid').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\"\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      \u003cdiv class=\"jp-dash-card\"\u003e\n        \u003cdiv class=\"jp-label\"\u003eMax Bets\u003c\/div\u003e\n        \u003cdiv class=\"jp-val\"\u003e${mbWinPct}%\u003c\/div\u003e\n        \u003cdiv class=\"jp-sub\"\u003e${mbProfitSign}${mbProfit.toFixed(0)}u profit\u003c\/div\u003e\n      \u003c\/div\u003e\n    `;\n\n    \/\/ Last 30 days with weekly bars\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    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    const profitVal30 = parseFloat(stats30.profit);\n    const profitClass30 = profitVal30 \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    const profitSign30 = profitVal30 \u003e= 0 ? '+' : '';\n    const maxWeekVal = Math.max(...weeklyBars.map(b =\u003e Math.abs(b.profit)), 1);\n\n    document.getElementById('jpYear30Day').innerHTML = `\n      \u003cdiv class=\"jp-dash-period-header\"\u003e\n        \u003cdiv class=\"jp-dash-period-title\"\u003eLast 30 Days\u003c\/div\u003e\n        \u003cdiv class=\"jp-dash-period-dates\"\u003e${dateRange30}\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-period-stats\"\u003e\n        \u003cdiv class=\"jp-dash-period-profit ${profitClass30}\"\u003e${profitSign30}${stats30.profit} \u003cspan class=\"jp-unit-label\"\u003eunits\u003c\/span\u003e\u003c\/div\u003e\n        \u003cdiv class=\"jp-dash-period-record\"\u003e${stats30.record} (\u003cspan class=\"jp-hl\"\u003e${stats30.winPct}%\u003c\/span\u003e)\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"jp-dash-period-bar-label\"\u003eWEEKLY BREAKDOWN\u003c\/div\u003e\n      ${weeklyBars.map((b, idx) =\u003e {\n        const isLast = idx === weeklyBars.length - 1;\n        const barPct = Math.max((Math.abs(b.profit) \/ maxWeekVal) * 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        return `\n          \u003cdiv class=\"jp-dash-bar-row\"\u003e\n            \u003cdiv class=\"${labelClass}\"\u003e${b.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\n    \/\/ Yearly results\n    const yearlyResults = getYearlyResults(allData);\n    const maxYearProfit = Math.max(...yearlyResults.map(y =\u003e Math.abs(y.profit)), 1);\n    const allTimeYearlyProfit = yearlyResults.reduce((sum, y) =\u003e sum + y.profit, 0);\n    const atSign = allTimeYearlyProfit \u003e= 0 ? '+' : '';\n\n    document.getElementById('jpYearlyBody').innerHTML = yearlyResults.map(y =\u003e {\n      const isCurrent = y.year === currentYear;\n      const barPct = Math.max((Math.abs(y.profit) \/ maxYearProfit) * 100, 3);\n      const barClass = y.profit \u003e= 0 ? (isCurrent ? 'jp-gold' : 'jp-green') : 'jp-red';\n      const profitColorClass = y.profit \u003e= 0 ? (isCurrent ? 'jp-gold-text' : 'jp-positive') : 'jp-negative';\n      const ySign = y.profit \u003e= 0 ? '+' : '';\n      const rowClass = isCurrent ? 'jp-yearly-row jp-year-current' : 'jp-yearly-row';\n      const innerLabel = barPct \u003e 20 ? `${y.winPct}%` : '';\n      return `\n        \u003cdiv class=\"${rowClass}\"\u003e\n          \u003cdiv class=\"jp-yearly-year\"\u003e${y.year}${isCurrent ? '*' : ''}\u003c\/div\u003e\n          \u003cdiv class=\"jp-yearly-bar-container\"\u003e\n            \u003cdiv class=\"jp-yearly-bar-track\"\u003e\n              \u003cdiv class=\"jp-yearly-bar-fill ${barClass}\" style=\"width: ${barPct}%;\"\u003e\n                \u003cspan class=\"jp-yearly-bar-inner-label\"\u003e${innerLabel}\u003c\/span\u003e\n              \u003c\/div\u003e\n            \u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"jp-yearly-record\"\u003e${y.record}\u003c\/div\u003e\n          \u003cdiv class=\"jp-yearly-profit ${profitColorClass}\"\u003e${ySign}${y.profit.toFixed(1)}u\u003c\/div\u003e\n        \u003c\/div\u003e\n      `;\n    }).join('');\n\n    document.getElementById('jpYearlyTotal').textContent = `${atSign}${formatNumber(allTimeYearlyProfit.toFixed(2))} units`;\n\n    \/\/ 30-day profit chart\n    const cutoff30 = new Date();\n    cutoff30.setDate(cutoff30.getDate() - 30);\n    const settled30 = allData.filter(p =\u003e p.result !== 'pending').slice().reverse();\n    const filtered30 = settled30.filter(p =\u003e parseDate(p.date) \u003e= cutoff30);\n\n    const ctx = document.getElementById('jpYearChart').getContext('2d');\n    let cumulative = 0;\n    const chartData = [];\n    const labels = [];\n    filtered30.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    \/\/ Chart stats\n    const roiSign30 = parseFloat(stats30.roi) \u003e= 0 ? '+' : '';\n    const roiClass30 = parseFloat(stats30.roi) \u003e= 0 ? 'jp-positive' : 'jp-negative';\n    document.getElementById('jpYearChartStats').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${stats30.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${stats30.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 ${profitClass30}\"\u003e${profitSign30}${stats30.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 ${roiClass30}\"\u003e${roiSign30}${stats30.roi}%\u003c\/div\u003e\n      \u003c\/div\u003e\n    `;\n\n    \/\/ Updated timestamp\n    document.getElementById('jpYearUpdated').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\u003c\/p\u003e","brand":"Jolee Picks","offers":[{"title":"Default Title","offer_id":42765670351043,"sku":"","price":400.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0013\/1946\/9101\/files\/SEASON_1.png?v=1767215395","url":"https:\/\/www.joleepicks.com\/products\/vip-2024-year-package","provider":"Jolee Picks","version":"1.0","type":"link"}