/* SGP Quiz v13 */ (function() { if (window.__SGP_QUIZ_LOADED__) return; window.__SGP_QUIZ_LOADED__ = true; (function() { var s = document.createElement('style'); s.id = 'sgp-quiz-styles'; s.textContent = `/* ===== SGP QUIZ — INTERACTIVE REDESIGN ===== */ .sgp-app{ --orange:#E8522A; --dark-teal:#012c30; --mid-teal:#2D7D8A; --light-teal:#40bbc1; --light-bg:#E0F0F2; --cream:#F4F2EC; --bg:#F5EFE6; --white:#fff; --border:#D4E8EB; --text-2:#2D7D8A; --text-3:#7A8B8E; --font:'Bricolage Grotesque','Bricolage','Helvetica Neue',system-ui,-apple-system,sans-serif; background:var(--bg); font-family:var(--font); color:var(--dark-teal); min-height:100vh; padding:0; margin:0; } .sgp-app *{box-sizing:border-box} .sgp-app .screen{display:none;animation:sgFade .5s ease} .sgp-app .screen.active{display:block} @keyframes sgFade{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}} /* ===== INTRO ===== */ .sgp-app .intro{max-width:680px;margin:0 auto;padding:5rem 1.5rem 4rem;text-align:center} .sgp-app .intro-eyebrow{display:inline-flex;align-items:center;gap:.5rem;background:var(--light-bg);color:var(--mid-teal);border-radius:999px;padding:.4rem 1rem;font-size:.75rem;font-weight:700;margin-bottom:1.5rem;letter-spacing:.06em;text-transform:uppercase} .sgp-app .intro-eyebrow svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round} .sgp-app .intro h1{font-size:clamp(2.5rem,6vw,3.8rem);font-weight:800;color:var(--dark-teal);line-height:1.02;letter-spacing:-.03em;margin:0 0 1.25rem;font-family:var(--font)} .sgp-app .intro h1 em{font-style:italic;color:var(--mid-teal);font-weight:700} .sgp-app .intro p{font-size:1.125rem;color:var(--mid-teal);line-height:1.6;max-width:520px;margin:0 auto 2rem;font-weight:400} .sgp-app .intro-chips{display:flex;align-items:center;justify-content:center;gap:.6rem;flex-wrap:wrap;margin-bottom:2.5rem} .sgp-app .intro-chip{display:inline-flex;align-items:center;gap:.5rem;padding:.55rem 1rem;background:var(--white);border:1px solid var(--border);border-radius:999px;color:var(--mid-teal);font-size:.875rem;font-weight:600;white-space:nowrap;transition:transform .2s,box-shadow .2s} .sgp-app .intro-chip:hover{transform:translateY(-2px);box-shadow:0 6px 16px rgba(1,44,48,.08)} .sgp-app .intro-chip svg{width:16px;height:16px;flex-shrink:0;fill:none;stroke:var(--light-teal);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;color:var(--light-teal)} .sgp-app .btn-start{background:var(--orange);color:var(--white);border:none;border-radius:999px;padding:1rem 2.5rem;font-size:1.0625rem;font-weight:700;cursor:pointer;font-family:var(--font);transition:all .2s;display:inline-block;text-decoration:none;box-shadow:0 4px 16px rgba(232,82,42,.25)} .sgp-app .btn-start:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(232,82,42,.35)} .sgp-app .btn-start:active{transform:translateY(0)} .sgp-app .intro-sub{font-size:.8125rem;color:var(--text-3);margin-top:1rem;font-weight:400} /* ===== QUIZ ===== */ .sgp-app .quiz-wrap{max-width:720px;margin:0 auto;padding:2.5rem 1.5rem 4rem} .sgp-app .qz-progress-wrap{margin-bottom:2rem} .sgp-app .qz-progress-meta{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem} .sgp-app .qz-progress-section{display:inline-flex;align-items:center;gap:.5rem;font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--mid-teal)} .sgp-app .qz-progress-section svg{flex-shrink:0;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round} .sgp-app .qz-progress-count{font-size:.875rem;font-weight:700;color:var(--mid-teal);font-variant-numeric:tabular-nums} .sgp-app .qz-progress-track{height:6px;background:var(--border);border-radius:3px;overflow:hidden;position:relative} .sgp-app .qz-progress-fill{height:100%;background:linear-gradient(90deg,var(--orange),#FF7849);border-radius:3px;transition:width .6s cubic-bezier(.34,1.56,.64,1)} .sgp-app .qz-card{opacity:0;transform:translateY(20px);transition:opacity .35s ease,transform .35s ease} .sgp-app .qz-card.qz-enter{opacity:1;transform:none} .sgp-app .qz-card.qz-exit{opacity:0;transform:translateY(-12px);transition:opacity .22s ease,transform .22s ease} .sgp-app .qz-q-eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--mid-teal);margin-bottom:.625rem} .sgp-app .qz-q-text{font-size:clamp(1.5rem,3vw,2rem);font-weight:700;color:var(--dark-teal);line-height:1.2;letter-spacing:-.02em;margin:0 0 1.75rem;font-family:var(--font)} .sgp-app .qz-answers{display:flex;flex-direction:column;gap:.625rem;margin-bottom:1.5rem} .sgp-app .qz-answer{display:flex;align-items:center;gap:.875rem;width:100%;padding:1.125rem 1.25rem;background:var(--white);border:2px solid var(--border);border-radius:.875rem;font-family:var(--font);font-size:1rem;font-weight:500;color:var(--dark-teal);text-align:left;cursor:pointer;transition:all .18s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden} .sgp-app .qz-answer::before{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(232,82,42,0),rgba(232,82,42,.04));opacity:0;transition:opacity .2s} .sgp-app .qz-answer:hover{border-color:var(--light-teal);transform:translateX(4px);box-shadow:0 4px 12px rgba(1,44,48,.06)} .sgp-app .qz-answer:hover::before{opacity:1} .sgp-app .qz-radio{width:22px;height:22px;border-radius:50%;border:2px solid var(--border);background:var(--white);flex-shrink:0;transition:all .2s;position:relative} .sgp-app .qz-answer:hover .qz-radio{border-color:var(--light-teal)} .sgp-app .qz-answer-text{flex:1;position:relative;z-index:1} .sgp-app .qz-emoji{font-size:1.25rem;opacity:0;transform:scale(.5);transition:all .3s cubic-bezier(.34,1.56,.64,1);flex-shrink:0;width:0;overflow:hidden} .sgp-app .qz-emoji.qz-emoji-show{opacity:1;transform:scale(1);width:1.5rem} .sgp-app .qz-answer.qz-selected{border-color:var(--orange);background:#FEF5F0;box-shadow:0 0 0 4px rgba(232,82,42,.1)} .sgp-app .qz-answer.qz-selected .qz-radio{border-color:var(--orange);background:var(--orange);box-shadow:inset 0 0 0 4px var(--white)} .sgp-app .qz-answer.qz-pop{animation:qzPop .4s cubic-bezier(.34,1.56,.64,1)} @keyframes qzPop{ 0%{transform:translateX(4px) scale(1)} 40%{transform:translateX(4px) scale(1.02)} 100%{transform:translateX(4px) scale(1)} } .sgp-app .qz-nav{display:flex;justify-content:space-between;align-items:center;margin-top:.5rem} .sgp-app .qz-back{background:transparent;border:1.5px solid var(--border);border-radius:999px;padding:.625rem 1.25rem;font-size:.875rem;font-weight:600;color:var(--mid-teal);cursor:pointer;font-family:var(--font);transition:all .15s} .sgp-app .qz-back:hover{border-color:var(--mid-teal);background:var(--white)} .sgp-app .qz-hint{font-size:.8125rem;color:var(--text-3);font-style:italic} /* ===== RESULTS ===== */ .sgp-app .result-wrap{max-width:920px;margin:0 auto;padding:3rem 1.5rem 5rem;position:relative} /* Hero */ .sgp-app .rs-hero{text-align:center;margin-bottom:3rem} .sgp-app .rs-archetype-pill{display:inline-block;background:var(--light-bg);color:var(--mid-teal);border-radius:999px;padding:.5rem 1.25rem;font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;margin-bottom:1rem;animation:rsSlideIn .6s ease} .sgp-app .rs-headline{font-size:clamp(2rem,4vw,2.75rem);font-weight:800;color:var(--dark-teal);letter-spacing:-.02em;margin:0 0 2rem;line-height:1.1;font-family:var(--font);animation:rsSlideIn .6s .1s ease both} .sgp-app .rs-score-wrap{display:flex;align-items:center;gap:2.5rem;justify-content:center;flex-wrap:wrap;margin-bottom:1rem} .sgp-app .rs-score-circle{position:relative;width:200px;height:200px;flex-shrink:0;animation:rsScoreIn .8s .2s cubic-bezier(.34,1.56,.64,1) both} @keyframes rsScoreIn{from{opacity:0;transform:scale(.7)}to{opacity:1;transform:none}} .sgp-app .rs-score-svg{width:100%;height:100%;transform:rotate(-90deg)} .sgp-app .rs-score-bg{fill:none;stroke:var(--border);stroke-width:10} .sgp-app .rs-score-fg{fill:none;stroke:url(#rsGradient);stroke-width:10;stroke-linecap:round;transition:stroke-dashoffset 1.4s cubic-bezier(.34,1.06,.64,1)} .sgp-app .rs-score-num{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;font-family:var(--font)} .sgp-app .rs-score-num span:first-child{font-size:4rem;font-weight:800;color:var(--dark-teal);line-height:1;letter-spacing:-.04em;font-variant-numeric:tabular-nums} .sgp-app .rs-score-of{font-size:1rem;color:var(--text-3);font-weight:500;margin-top:.25rem} .sgp-app .rs-score-side{max-width:340px;text-align:left;animation:rsSlideIn .6s .4s ease both} .sgp-app .rs-percentile{font-size:1.125rem;color:var(--dark-teal);margin-bottom:.75rem;line-height:1.4} .sgp-app .rs-percentile strong{color:var(--orange);font-weight:700} .sgp-app .rs-archetype-desc{font-size:.9375rem;color:var(--mid-teal);line-height:1.6;margin:0} @keyframes rsSlideIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}} /* Inject SVG gradient via JS-friendly defs in the score circle */ .sgp-app .rs-score-svg::before{content:''} /* Comparison */ .sgp-app .rs-compare{background:var(--white);border-radius:1rem;padding:1.75rem;margin-bottom:2rem;border:1px solid var(--border);animation:rsSlideIn .6s .6s ease both} .sgp-app .rs-compare-title{font-size:.875rem;font-weight:700;color:var(--mid-teal);text-transform:uppercase;letter-spacing:.06em;margin-bottom:1.25rem} .sgp-app .rs-compare-rows{display:flex;flex-direction:column;gap:.875rem;margin-bottom:1rem} .sgp-app .rs-compare-row{display:flex;align-items:center;gap:1rem} .sgp-app .rs-compare-label{width:80px;font-size:.9375rem;font-weight:600;color:var(--dark-teal);flex-shrink:0} .sgp-app .rs-compare-bar{flex:1;height:32px;background:var(--cream);border-radius:999px;position:relative;overflow:hidden} .sgp-app .rs-compare-fill{height:100%;border-radius:999px;width:0;transition:width 1.4s cubic-bezier(.34,1.06,.64,1);display:flex;align-items:center;justify-content:flex-end;padding-right:.875rem;min-width:50px} .sgp-app .rs-compare-fill.rs-you{background:linear-gradient(90deg,#FF7849,var(--orange))} .sgp-app .rs-compare-fill.rs-top{background:linear-gradient(90deg,var(--light-teal),var(--mid-teal))} .sgp-app .rs-compare-val{color:var(--white);font-weight:700;font-size:.875rem;font-variant-numeric:tabular-nums} .sgp-app .rs-compare-delta{font-size:.9375rem;color:var(--mid-teal);text-align:center;padding-top:.5rem;border-top:1px dashed var(--border)} .sgp-app .rs-compare-delta strong{color:var(--orange);font-weight:700} /* Radar */ .sgp-app .rs-radar-section{background:var(--white);border-radius:1rem;padding:1.75rem;margin-bottom:2rem;border:1px solid var(--border);position:relative;animation:rsSlideIn .6s .8s ease both} .sgp-app .rs-radar-title{font-size:.875rem;font-weight:700;color:var(--mid-teal);text-transform:uppercase;letter-spacing:.06em;margin-bottom:1.25rem} .sgp-app .rs-radar-wrap{display:grid;grid-template-columns:1fr 1fr;gap:2rem;align-items:center} @media(max-width:680px){.sgp-app .rs-radar-wrap{grid-template-columns:1fr}} .sgp-app .rs-radar-svg{display:flex;justify-content:center;align-items:center} .sgp-app .rs-radar-svg-inner{width:100%;max-width:380px;height:auto;overflow:visible} .sgp-app .rs-radar-grid{fill:none;stroke:var(--border);stroke-width:1;opacity:.5} .sgp-app .rs-radar-axis{stroke:var(--border);stroke-width:1;opacity:.4} .sgp-app .rs-radar-bench{fill:rgba(64,187,193,.12);stroke:var(--light-teal);stroke-width:1;stroke-dasharray:3 3;opacity:.7} .sgp-app .rs-radar-user{fill:rgba(232,82,42,.18);stroke:var(--orange);stroke-width:2.5;animation:rsRadarDraw 1.4s .3s cubic-bezier(.4,0,.2,1) both;transform-origin:center;transform:scale(.4);opacity:0} @keyframes rsRadarDraw{from{transform:scale(.4);opacity:0}60%{transform:scale(1.08);opacity:1}to{transform:scale(1);opacity:1}} .sgp-app .rs-radar-dot{fill:var(--orange);stroke:var(--white);stroke-width:2.5;cursor:pointer;transition:all .2s;opacity:0;animation:rsDotIn .4s ease both;animation-delay:calc(.8s + var(--i,0) * .08s)} @keyframes rsDotIn{from{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}} .sgp-app .rs-radar-dot:hover{r:9;fill:#FF7849;filter:drop-shadow(0 0 8px rgba(232,82,42,.5))} .sgp-app .rs-radar-label{font-size:10px;font-weight:700;fill:var(--mid-teal);font-family:var(--font);text-transform:uppercase;letter-spacing:.03em} .sgp-app .rs-radar-legend{display:flex;flex-direction:column;gap:.875rem} .sgp-app .rs-legend-row{display:grid;grid-template-columns:140px 1fr 30px;gap:.75rem;align-items:center;cursor:pointer;transition:transform .2s;animation:rsSlideIn .5s var(--delay,0s) ease both;padding:.375rem;border-radius:.5rem;margin:-.375rem} .sgp-app .rs-legend-row:hover{background:var(--cream);transform:translateX(4px)} .sgp-app .rs-legend-label{font-size:.75rem;font-weight:700;color:var(--dark-teal);text-transform:uppercase;letter-spacing:.04em;line-height:1.2;word-break:normal} .sgp-app .rs-legend-bar{height:8px;background:var(--cream);border-radius:4px;overflow:hidden} .sgp-app .rs-legend-fill{height:100%;background:linear-gradient(90deg,var(--orange),#FF7849);border-radius:4px;width:0;transition:width 1.2s cubic-bezier(.34,1.06,.64,1)} .sgp-app .rs-legend-val{font-size:.9375rem;font-weight:800;color:var(--dark-teal);text-align:right;font-variant-numeric:tabular-nums} /* Tooltip */ .sgp-app .rs-tooltip{position:absolute;background:var(--dark-teal);color:var(--white);padding:.875rem 1rem;border-radius:.625rem;font-size:.8125rem;max-width:260px;pointer-events:none;opacity:0;transform:translate(-50%,calc(-100% - 8px)) scale(.9);transition:opacity .2s,transform .2s;z-index:10;box-shadow:0 12px 32px rgba(0,0,0,.25)} .sgp-app .rs-tooltip.rs-tt-show{opacity:1;transform:translate(-50%,calc(-100% - 8px)) scale(1)} .sgp-app .rs-tooltip::after{content:'';position:absolute;bottom:-6px;left:50%;transform:translateX(-50%);border:6px solid transparent;border-top-color:var(--dark-teal);border-bottom:0} .sgp-app .rs-tt-label{font-weight:700;text-transform:uppercase;letter-spacing:.05em;font-size:.6875rem;color:var(--light-teal);margin-bottom:.25rem} .sgp-app .rs-tt-val{font-weight:700;margin-bottom:.375rem;font-size:.875rem} .sgp-app .rs-tt-desc{opacity:.85;line-height:1.5;font-size:.75rem;font-weight:400} /* Insights */ .sgp-app .rs-insight-grid{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin-bottom:2rem;animation:rsSlideIn .6s 1s ease both} @media(max-width:680px){.sgp-app .rs-insight-grid{grid-template-columns:1fr}} .sgp-app .rs-insight-card{background:linear-gradient(135deg,var(--dark-teal),#02434A);color:var(--white);border-radius:1rem;padding:1.5rem;position:relative;overflow:hidden} .sgp-app .rs-insight-card::before{content:'';position:absolute;top:-30px;right:-30px;width:140px;height:140px;background:radial-gradient(circle,rgba(232,82,42,.2),transparent 70%);border-radius:50%} .sgp-app .rs-insight-icon{font-size:1.5rem;margin-bottom:.625rem;position:relative;z-index:1} .sgp-app .rs-insight-label{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--light-teal);margin-bottom:.625rem;position:relative;z-index:1} .sgp-app .rs-insight-card p{font-size:.9375rem;line-height:1.55;margin:0;position:relative;z-index:1;opacity:.95} /* Plays */ .sgp-app .rs-report{margin-bottom:2.5rem;background:var(--white);border:1px solid var(--border);border-radius:1.25rem;padding:2.25rem 2rem;animation:rsSlideIn .5s 1.2s ease both} .sgp-app .rs-report-head{text-align:center;max-width:640px;margin:0 auto 1.75rem} .sgp-app .rs-report-title{font-size:clamp(1.375rem,2.6vw,1.75rem);font-weight:800;color:var(--dark-teal);margin:0 0 .625rem;letter-spacing:-.02em} .sgp-app .rs-report-sub{font-size:1rem;color:var(--mid-teal);line-height:1.55;margin:0} .sgp-app .rs-report-boxes{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-bottom:1.75rem} .sgp-app .rs-report-box{background:var(--light-bg);border:1px solid var(--border);border-radius:1rem;padding:1.25rem;text-align:center} .sgp-app .rs-report-box-title{font-size:1rem;font-weight:700;color:var(--dark-teal);margin-bottom:.375rem;letter-spacing:-.01em} .sgp-app .rs-report-box-desc{font-size:.875rem;color:var(--mid-teal);line-height:1.45} .sgp-app .rs-report-form{display:flex;gap:.75rem;max-width:560px;margin:0 auto} .sgp-app .rs-report-input{flex:1;border:1px solid var(--border);border-radius:999px;padding:1rem 1.5rem;font-size:1rem;font-family:var(--font);color:var(--dark-teal);outline:none;transition:all .2s} .sgp-app .rs-report-input:focus{border-color:var(--orange);box-shadow:0 0 0 4px rgba(232,82,42,.1)} .sgp-app .rs-report-btn{background:var(--orange);color:var(--white);border:none;border-radius:999px;padding:1rem 2rem;font-size:1.0625rem;font-weight:700;cursor:pointer;font-family:var(--font);transition:all .2s;white-space:nowrap;box-shadow:0 4px 16px rgba(232,82,42,.25)} .sgp-app .rs-report-btn:hover{transform:translateY(-2px);box-shadow:0 8px 22px rgba(232,82,42,.35)} .sgp-app .rs-report-btn:disabled{opacity:.6;cursor:default;transform:none} .sgp-app .rs-report-error{display:none;text-align:center;color:var(--orange);font-size:.875rem;font-weight:600;margin-top:.875rem} .sgp-app .rs-report-success{display:none;text-align:center;color:var(--dark-teal);font-size:1rem;font-weight:700;margin-top:.5rem} /* CTA */ .sgp-app .rs-cta-card{background:linear-gradient(135deg,var(--orange),#FF7849);color:var(--white);border-radius:1.25rem;padding:2.5rem 2rem;text-align:center;position:relative;overflow:hidden;animation:rsSlideIn .6s 1.6s ease both} .sgp-app .rs-cta-pulse{position:absolute;top:50%;left:50%;width:300px;height:300px;background:radial-gradient(circle,rgba(255,255,255,.15),transparent 60%);border-radius:50%;transform:translate(-50%,-50%);animation:rsPulse 3s ease-in-out infinite} @keyframes rsPulse{0%,100%{transform:translate(-50%,-50%) scale(1);opacity:.5}50%{transform:translate(-50%,-50%) scale(1.2);opacity:.8}} .sgp-app .rs-cta-title{font-size:clamp(1.5rem,3vw,2rem);font-weight:800;margin:0 0 .625rem;letter-spacing:-.02em;position:relative;z-index:1} .sgp-app .rs-cta-sub{font-size:1rem;opacity:.95;margin:0 0 1.5rem;position:relative;z-index:1} .sgp-app .rs-cta-btn{display:inline-block;background:var(--white);color:var(--orange);padding:1rem 2.25rem;border-radius:999px;font-weight:700;font-size:1.0625rem;text-decoration:none;transition:all .2s;position:relative;z-index:1;box-shadow:0 4px 16px rgba(0,0,0,.15)} .sgp-app .rs-cta-btn:hover{transform:translateY(-3px);box-shadow:0 12px 28px rgba(0,0,0,.25)} .sgp-app .rs-retake{display:block;margin:1.25rem auto 0;background:transparent;border:none;color:var(--white);font-family:var(--font);font-size:.875rem;cursor:pointer;text-decoration:underline;opacity:.85;position:relative;z-index:1;font-weight:500} .sgp-app .rs-retake:hover{opacity:1} /* Confetti */ .sgp-app .rs-confetti{position:absolute;inset:0;pointer-events:none;overflow:hidden;z-index:50} .sgp-app .rs-confetti-piece{position:absolute;top:-20px;width:10px;height:10px;border-radius:2px;animation:rsConfetti 1.6s cubic-bezier(.4,0,.6,1) forwards} @keyframes rsConfetti{to{transform:translateY(100vh) rotate(720deg);opacity:0}} .sgp-app .rs-compare-subtitle{font-size:.8125rem;color:var(--text-3);margin-bottom:1.25rem;margin-top:-.5rem;font-weight:400} .sgp-app .qz-emoji{font-family:var(--font);color:var(--mid-teal)} /* ===== MOBILE OPTIMIZATIONS ===== */ @media (max-width: 768px) { .sgp-app .intro { padding: 3rem 1.25rem 2.5rem; } .sgp-app .intro h1 { font-size: 2.25rem; line-height: 1.05; } .sgp-app .intro p { font-size: 1rem; padding: 0 .5rem; } .sgp-app .intro-chip { font-size: .8125rem; padding: .5rem .875rem; } .sgp-app .btn-start { width: 100%; max-width: 320px; padding: 1rem 1.5rem; } .sgp-app .quiz-wrap { padding: 1.5rem 1rem 3rem; } .sgp-app .qz-q-text { font-size: 1.375rem; line-height: 1.25; margin-bottom: 1.25rem; } .sgp-app .qz-answer { padding: 1rem; font-size: .9375rem; gap: .75rem; min-height: 56px; } .sgp-app .qz-answer:hover { transform: none; } .sgp-app .qz-radio { width: 20px; height: 20px; } .sgp-app .qz-back { padding: .75rem 1.25rem; min-height: 44px; min-width: 88px; } .sgp-app .qz-hint { display: none; } .sgp-app .qz-progress-meta { gap: .5rem; } .sgp-app .qz-progress-section { font-size: .6875rem; } .sgp-app .result-wrap { padding: 2rem 1rem 4rem; } .sgp-app .rs-headline { font-size: 1.875rem; margin-bottom: 1.5rem; } .sgp-app .rs-score-wrap { flex-direction: column; gap: 1.5rem; } .sgp-app .rs-score-circle { width: 180px; height: 180px; } .sgp-app .rs-score-num span:first-child { font-size: 3.25rem; } .sgp-app .rs-score-side { text-align: center; max-width: 100%; } .sgp-app .rs-percentile { font-size: 1rem; } .sgp-app .rs-compare { padding: 1.25rem; } .sgp-app .rs-compare-label { width: 70px; font-size: .8125rem; } .sgp-app .rs-compare-bar { height: 28px; } .sgp-app .rs-compare-val { font-size: .8125rem; } .sgp-app .rs-compare-subtitle { font-size: .75rem; } .sgp-app .rs-radar-section { padding: 1.25rem; } .sgp-app .rs-radar-wrap { gap: 1.5rem; } .sgp-app .rs-radar-svg-inner { max-width: 100%; } .sgp-app .rs-radar-label { font-size: 9px; } .sgp-app .rs-legend-row { grid-template-columns: 110px 1fr 28px; gap: .5rem; padding: .5rem; min-height: 44px; } .sgp-app .rs-legend-label { font-size: .6875rem; } .sgp-app .rs-legend-val { font-size: .875rem; } .sgp-app .rs-legend-row:hover { transform: none; } .sgp-app .rs-tooltip { max-width: 240px; font-size: .75rem; padding: .75rem .875rem; } .sgp-app .rs-insight-card { padding: 1.25rem; } .sgp-app .rs-insight-card p { font-size: .875rem; } .sgp-app .rs-report { padding: 1.5rem 1.25rem; } .sgp-app .rs-report-boxes { grid-template-columns: 1fr; gap: .75rem; } .sgp-app .rs-report-form { flex-direction: column; } .sgp-app .rs-report-btn { width: 100%; } .sgp-app .rs-cta-card { padding: 2rem 1.25rem; } .sgp-app .rs-cta-title { font-size: 1.5rem; } .sgp-app .rs-cta-sub { font-size: .9375rem; } .sgp-app .rs-cta-btn { padding: .9rem 1.75rem; font-size: 1rem; width: 100%; max-width: 280px; } .sgp-app .rs-cta-btn:hover { transform: none; } } /* Tablets / small landscape */ @media (max-width: 540px) { .sgp-app .qz-progress-section span { display: none; } .sgp-app .qz-progress-section svg { width: 16px; height: 16px; } .sgp-app .rs-compare-label { width: 60px; font-size: .75rem; } } /* Touch device interaction tweaks */ @media (hover: none) { .sgp-app .qz-answer:hover { background: var(--white); border-color: var(--border); transform: none; box-shadow: none; } .sgp-app .qz-answer:hover::before { opacity: 0; } .sgp-app .intro-chip:hover { transform: none; box-shadow: none; } .sgp-app .btn-start:hover { transform: none; } .sgp-app .rs-legend-row:hover { background: transparent; } .sgp-app .rs-play:hover { border-color: var(--border); transform: none; box-shadow: none; } /* Use tap rather than hover for radar tooltips - showTooltip is invoked by both mouseenter and click via JS update */ } /* ===== SHARE CARD (1200x630 PNG export) ===== */ .sgp-app .rs-share-card{display:none;width:1200px;height:630px;padding:60px 70px;background:linear-gradient(135deg,#F5EFE6 0%,#FFF6E9 100%);font-family:var(--font);color:var(--dark-teal);box-sizing:border-box;position:relative;overflow:hidden;border-radius:24px} .sgp-app .rsc-bg-deco{position:absolute;top:-100px;right:-100px;width:500px;height:500px;background:radial-gradient(circle,rgba(232,82,42,0.12) 0%,transparent 70%);border-radius:50%} .sgp-app .rs-share-card::before{content:'';position:absolute;bottom:-150px;left:-150px;width:400px;height:400px;background:radial-gradient(circle,rgba(64,187,193,0.15) 0%,transparent 70%);border-radius:50%} .sgp-app .rsc-header{display:flex;justify-content:space-between;align-items:center;position:relative;z-index:2;margin-bottom:30px} .sgp-app .rsc-brand{font-size:14px;font-weight:700;color:var(--mid-teal);letter-spacing:0.12em;text-transform:uppercase} .sgp-app .rsc-url{font-size:13px;color:var(--text-3);font-weight:500} .sgp-app .rsc-main{display:grid;grid-template-columns:1fr 1fr;gap:60px;position:relative;z-index:2;align-items:center} .sgp-app .rsc-score-block{} .sgp-app .rsc-archetype{display:inline-block;background:var(--dark-teal);color:#fff;padding:8px 18px;border-radius:999px;font-size:13px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;margin-bottom:20px} .sgp-app .rsc-score-row{display:flex;align-items:baseline;gap:8px;margin-bottom:8px} .sgp-app .rsc-score-num{font-size:140px;font-weight:800;color:var(--orange);line-height:1;letter-spacing:-0.05em;font-variant-numeric:tabular-nums} .sgp-app .rsc-score-of{font-size:42px;color:var(--text-3);font-weight:500;letter-spacing:-0.02em} .sgp-app .rsc-score-label{font-size:16px;color:var(--mid-teal);font-weight:600;text-transform:uppercase;letter-spacing:0.08em;margin-bottom:16px} .sgp-app .rsc-tagline{font-size:18px;color:var(--dark-teal);line-height:1.4;font-weight:500;max-width:480px} .sgp-app .rsc-radar-block{background:rgba(255,255,255,0.6);border:1px solid rgba(64,187,193,0.2);border-radius:20px;padding:28px 30px;backdrop-filter:blur(10px)} .sgp-app .rsc-radar-title{font-size:13px;font-weight:700;color:var(--mid-teal);text-transform:uppercase;letter-spacing:0.08em;margin-bottom:18px} .sgp-app .rsc-dims{display:flex;flex-direction:column;gap:12px} .sgp-app .rsc-dim{display:grid;grid-template-columns:140px 1fr 32px;align-items:center;gap:12px} .sgp-app .rsc-dim-label{font-size:13px;font-weight:700;color:var(--dark-teal);text-transform:uppercase;letter-spacing:0.04em} .sgp-app .rsc-dim-bar{height:10px;background:rgba(212,232,235,0.6);border-radius:5px;overflow:hidden} .sgp-app .rsc-dim-fill{height:100%;background:linear-gradient(90deg,var(--orange),#FF7849);border-radius:5px} .sgp-app .rsc-dim-val{font-size:18px;font-weight:800;color:var(--dark-teal);text-align:right;font-variant-numeric:tabular-nums} .sgp-app .rs-share-card .rsc-footer{position:absolute;bottom:50px;left:70px;right:70px;display:flex;justify-content:flex-end;align-items:center;z-index:2} .sgp-app .rs-share-card .rsc-logo{height:48px;display:flex;align-items:center;justify-content:flex-end} .sgp-app .rs-share-card .rsc-logo svg{height:48px;width:auto;display:block} .sgp-app .rs-share-card .rsc-logo img{height:48px;width:auto;display:block} .sgp-app .rs-share-card .rsc-logo-fallback{font-size:28px;font-weight:800;color:var(--orange);letter-spacing:-0.02em} /* CTA action row with download button */ .sgp-app .rs-cta-actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;position:relative;z-index:1} .sgp-app .rs-share-btn{display:inline-block;background:rgba(255,255,255,0.15);color:#fff;padding:1rem 1.75rem;border:1.5px solid rgba(255,255,255,0.4);border-radius:999px;font-weight:600;font-size:1rem;cursor:pointer;font-family:var(--font);transition:all .2s;text-decoration:none} .sgp-app .rs-share-btn:hover{background:rgba(255,255,255,0.25);border-color:rgba(255,255,255,0.7);transform:translateY(-2px)} .sgp-app .rs-share-btn:disabled{opacity:0.7;cursor:wait;transform:none} @media (max-width:768px) { .sgp-app .rs-cta-actions{flex-direction:column;align-items:center} .sgp-app .rs-share-btn{width:100%;max-width:280px;padding:.875rem 1.5rem;font-size:.9375rem} .sgp-app .rs-share-btn:hover{transform:none} } `; document.head.appendChild(s); })(); (function() { var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('width', '0'); svg.setAttribute('height', '0'); svg.style.position = 'absolute'; svg.innerHTML = ''; document.body.appendChild(svg); })(); // === DATA === const SECTIONS=[ {label:'Your context',icon:'',sub:'2 questions'}, {label:'Current usage',icon:'',sub:'3 questions'}, {label:'Pipeline friction',icon:'',sub:'2 questions'}, {label:'Strategy',icon:'',sub:'3 questions'}, {label:'Readiness',icon:'',sub:'2 questions'}, ]; const QUESTIONS=[ {section:0,text:"What best describes your role?", answers:[ {text:"CRO, VP Sales, or Revenue Leader",score:{role:'sales_leader'},points:0}, {text:"CMO, VP Marketing, Demand Gen, or ABM",score:{role:'marketing_leader'},points:0}, {text:"SDR / BDR Manager or Sales Manager",score:{role:'sdrmgr'},points:0}, {text:"Customer Success, CX, or Retention",score:{role:'cs'},points:0}, {text:"HR, People Ops, or Employee Experience",score:{role:'hr'},points:0}, {text:"Founder, CEO, or PE / Operating Partner",score:{role:'exec'},points:0}, ]}, {section:0,text:"What's your company's revenue stage?", answers:[ {text:"Under $10M ARR",score:{stage:'seed'},points:0}, {text:"$10M – $50M ARR",score:{stage:'growth'},points:0}, {text:"$50M – $200M ARR",score:{stage:'scale'},points:0}, {text:"$200M+ ARR or PE-backed",score:{stage:'enterprise'},points:0}, ]}, {section:1,text:"How are you currently using direct mail or gifting?", answers:[ {text:"We're not using it at all",score:{usage:0},points:0,dim:{auto:0,attr:0,pers:0,life:0,exec:0}}, {text:"Ad hoc — holiday gifts, one-offs, no real strategy",score:{usage:1},points:5,dim:{auto:0,attr:0,pers:1,life:0,exec:0}}, {text:"SDR outbound support or ABM campaigns",score:{usage:2},points:15,dim:{auto:1,attr:1,pers:1,life:1,exec:1}}, {text:"Full funnel — SDR through expansion and renewal",score:{usage:3},points:30,dim:{auto:2,attr:2,pers:2,life:3,exec:2}}, ]}, {section:1,text:"How automated is your gifting motion?", answers:[ {text:"Manual — Amazon orders, spreadsheets, one by one",score:{auto:0},points:0,dim:{auto:0,attr:0,pers:0,life:0,exec:0}}, {text:"Some automation but still mostly manual coordination",score:{auto:1},points:5,dim:{auto:1,attr:0,pers:0,life:0,exec:0}}, {text:"CRM-triggered sends based on deal stage or lifecycle",score:{auto:2},points:15,dim:{auto:2,attr:2,pers:1,life:1,exec:1}}, {text:"Fully orchestrated with intent data and lifecycle triggers",score:{auto:3},points:25,dim:{auto:3,attr:2,pers:2,life:2,exec:2}}, ]}, {section:1,text:"When do you typically deploy gifting?", answers:[ {text:"We don't have a defined strategy for when to send",score:{timing:0},points:0,dim:{auto:0,attr:0,pers:0,life:0,exec:0}}, {text:"Top of funnel or post-demo only",score:{timing:1},points:8,dim:{auto:1,attr:0,pers:1,life:0,exec:0}}, {text:"Late stage to unblock deals or support renewals",score:{timing:2},points:15,dim:{auto:1,attr:1,pers:1,life:2,exec:1}}, {text:"Across the full lifecycle — acquisition through expansion",score:{timing:3},points:25,dim:{auto:2,attr:2,pers:2,life:3,exec:2}}, ]}, {section:2,text:"Where do deals or relationships most often stall?", answers:[ {text:"Getting the first conversation or meeting",score:{friction:'tofu'},points:0}, {text:"No-shows, demo ghosting, or post-demo silence",score:{friction:'mid'},points:0}, {text:"Late stage — procurement, buying committee, inertia",score:{friction:'late'},points:0}, {text:"Expansion and upsell after the initial deal closes",score:{friction:'expand'},points:0}, ]}, {section:2,text:"What's your biggest challenge with outreach or engagement right now?", answers:[ {text:"Low reply rates and breaking through the noise",score:{pain:'reply'},points:0}, {text:"Reaching senior decision-makers and executives",score:{pain:'exec'},points:0}, {text:"Lack of personalization at scale",score:{pain:'pers'},points:0}, {text:"Retention, churn risk, or driving product adoption",score:{pain:'retain'},points:0}, ]}, {section:3,text:"How do you personalize what you send?", answers:[ {text:"We don't — everyone gets the same thing",score:{pers:0},points:0,dim:{auto:0,attr:0,pers:0,life:0,exec:0}}, {text:"By persona or role",score:{pers:1},points:8,dim:{auto:0,attr:0,pers:1,life:0,exec:1}}, {text:"By account research or individual interests",score:{pers:2},points:18,dim:{auto:1,attr:1,pers:2,life:1,exec:1}}, {text:"By buying stage, intent signals, or behavioral triggers",score:{pers:3},points:28,dim:{auto:2,attr:2,pers:3,life:2,exec:2}}, ]}, {section:3,text:"Do you measure revenue impact from gifting?", answers:[ {text:"No — we don't track it at all",score:{attr:0},points:0,dim:{auto:0,attr:0,pers:0,life:0,exec:0}}, {text:"We track pipeline influenced loosely",score:{attr:1},points:8,dim:{auto:0,attr:1,pers:0,life:0,exec:0}}, {text:"Revenue influenced with CRM attribution",score:{attr:2},points:18,dim:{auto:1,attr:2,pers:1,life:1,exec:1}}, {text:"Multi-touch attribution fully integrated into reporting",score:{attr:3},points:28,dim:{auto:2,attr:3,pers:2,life:2,exec:2}}, ]}, {section:3,text:"How aligned are sales and marketing — or revenue and people teams — on gifting strategy?", answers:[ {text:"Not aligned — it's done independently, if at all",score:{align:0},points:0,dim:{auto:0,attr:0,pers:0,life:0,exec:0}}, {text:"Occasional shared campaigns but mostly siloed",score:{align:1},points:8,dim:{auto:0,attr:1,pers:0,life:1,exec:0}}, {text:"Shared budget and coordinated motions",score:{align:2},points:18,dim:{auto:1,attr:1,pers:1,life:2,exec:1}}, {text:"Fully integrated — gifting is part of the revenue or people OS",score:{align:3},points:28,dim:{auto:2,attr:2,pers:2,life:3,exec:2}}, ]}, {section:4,text:"What's your estimated annual budget for direct mail or gifting?", answers:[ {text:"$0 – $10K",score:{budget:'low'},points:0}, {text:"$10K – $50K",score:{budget:'mid'},points:5}, {text:"$50K – $150K",score:{budget:'high'},points:10}, {text:"$150K+",score:{budget:'enterprise'},points:15}, ]}, {section:4,text:"Are you exploring a gifting platform in the next 6 months?", answers:[ {text:"Just starting to research",score:{intent:'research'},points:5}, {text:"Actively evaluating options",score:{intent:'active'},points:15}, {text:"Looking to replace an existing tool",score:{intent:'replace'},points:20}, {text:"Not sure yet",score:{intent:'unsure'},points:0}, ]}, ]; const DIM_KEYS=['auto','attr','pers','life','exec']; const DIM_LABELS=['Automation','Attribution','Personalization','Lifecycle coverage','Exec access']; const LEVELS=[ { min:0,max:29, name:'The Spreadsheet Sender', archetypeKey:'Spreadsheet Sender', tagline:'You\'re earlier in your gifting journey than most — and that\'s actually an advantage. The teams who build this intentionally from the start win.', description:'Right now, gifting is either off the radar or happening in isolated, manual moments without a strategy behind it. The good news: this is the highest-leverage stage. Getting the foundation right — even a simple, repeatable motion — compounds faster than you\'d expect.', gaps:['No structured gifting motion','Little to no CRM integration or attribution','Personalization isn\'t happening at scale'], plays:[ {title:'The First Play',desc:'Pick one moment in your buyer or employee journey and build a single repeatable gifting touch around it. One trigger, one gift type, one follow-up action. Start there.'}, {title:'The Door Opener',desc:'A coffee eGift before a cold outreach sequence is the simplest gifting play in the book — and one of the highest-ROI. Get your first 20 sends out and measure reply rate vs your current baseline.'}, {title:'The Quick Win',desc:'Identify your top 10 stalled deals or at-risk accounts. Send one personalized gift to each. Track how many respond within 72 hours.'}, ], cta:{headline:'See what a real gifting motion looks like.',sub:'Book a 20-minute demo and we\'ll show you exactly where to start.',btn1:'Book a demo',btn2:''}, bench:'You\'re in the bottom 30% for gifting maturity at your stage — but most teams who move start exactly here.', }, { min:30,max:74, name:'The Campaign Marketer', archetypeKey:'Campaign Marketer', tagline:'You\'re using gifting, but it\'s mostly campaign-driven. The next level is making it part of the motion — not a moment inside one.', description:'You\'ve got the instinct right — gifting is in your playbook and you\'re seeing some results. But it\'s still operating in pockets: a campaign here, an SDR play there, without the attribution or automation to scale what\'s working or fix what isn\'t.', gaps:['Gifting isn\'t connected to your full funnel','Attribution is loose or manual','Automation gaps mean sends depend on individual effort'], plays:[ {title:'The Attribution Play',desc:'Connect your gifting data to Salesforce or your CRM. Even basic tracking — which sends were followed by meetings or pipeline — will immediately show you what\'s worth scaling.'}, {title:'The Reply Rate Lift',desc:'Add a coffee eGift as a pre-call send to your 3 highest-volume SDR sequences and compare show rates over 30 days. This is one of the fastest ways to see measurable gifting ROI.'}, {title:'The Multi-Touch Test',desc:'Run one account with a sequenced gifting motion — a send at outreach, one at demo, one at stall — and compare conversion rate against accounts with no gifting touch at the same stage.'}, ], cta:{headline:'Ready to see it in action?',sub:'Book a demo and we\'ll walk through what this looks like for your team specifically.',btn1:'Book a demo',btn2:''}, bench:'You\'re in the middle 40% for gifting maturity — above average on usage, with real room to grow on attribution and automation.', }, { min:75,max:134, name:'The Revenue Orchestrator', archetypeKey:'Revenue Orchestrator', tagline:'Gifting is genuinely part of how you run revenue. The gap now is making it more systematic and harder to replicate.', description:'You\'re ahead of most. Gifting is integrated, attributed, and showing real impact. The question at your level isn\'t whether to invest more — it\'s how to get more precise: tighter triggers, better personalization, and a motion that scales without breaking.', gaps:['Personalization could be more signal-driven','Some lifecycle stages are likely under-gifted','Automation may have gaps at the edges of the funnel'], plays:[ {title:'The Intent Signal Play',desc:'Layer 6sense or Bombora intent data onto your gifting triggers. Send when an account shows buying signals, not just when a rep decides to. This is where gifting becomes genuinely predictive.'}, {title:'The Expansion Motion',desc:'Map every customer milestone — 90-day mark, first renewal, product adoption threshold — and build a gifting touch at each one. Expansion revenue is the highest-margin growth motion available to you.'}, {title:'The Executive Access Play',desc:'Identify your top 20 target accounts where you haven\'t broken through to a senior decision-maker. A personalized, high-quality send tied to a real trigger is often what changes that.'}, ], cta:{headline:'Let\'s talk about what\'s next for your program.',sub:'Book a demo and we\'ll get into the specifics — no generic pitch.',btn1:'Book a demo',btn2:''}, bench:'You\'re in the top 30% for gifting maturity at your stage. The gap between you and the top tier is mostly automation and attribution depth.', }, { min:135,max:999, name:'The Pipeline Accelerator', archetypeKey:'Pipeline Accelerator', tagline:'You\'re operating at the top of the maturity curve. The opportunity now is optimization and defensibility — not uplift.', description:'Full-funnel orchestration, intent-triggered sends, multi-touch attribution, alignment across teams. You\'ve built what most are still trying to figure out. The question at this level is: how do you make it more precise, more predictive, and harder for competitors to replicate?', gaps:['Marginal gains in personalization and targeting','Attribution model could be more sophisticated','Opportunity to formalize a gifting OS others can\'t copy'], plays:[ {title:'The Precision Layer',desc:'Move from persona-level personalization to account and individual-level. Use LinkedIn, intent data, and CRM signals to source gifts that feel like they came from someone who did the homework — because they did.'}, {title:'The Defensibility Play',desc:'Build a gifting program that is structurally embedded in your revenue motion — not a tool your team uses, but a system your company runs. Document the playbook, train the team, and make it part of onboarding.'}, {title:'The Benchmark Play',desc:'Run a 90-day gifting experiment against a control group. Measure deal velocity, win rate, and expansion ARR for accounts with a structured gifting motion vs. those without. The data becomes your internal case study.'}, ], cta:{headline:'This is an executive conversation.',sub:'Book a demo and we\'ll skip the basics — straight to what moves the needle at your level.',btn1:'Book a demo',btn2:''}, bench:'You\'re in the top 10% for gifting maturity. You\'re not just using gifting — you\'re running it as a revenue system.', }, ]; function getFrictionInsight(friction,pain){ const fmap={ tofu:'Getting the first conversation is where gifting has the highest leverage — it\'s a physical pattern interrupt in a digital world. A well-timed send before an outreach sequence changes the response dynamic entirely.', mid:'Demo ghosting and post-demo silence are where gifting pays for itself fastest. A send tied to a specific moment — the morning of a scheduled call, or 24 hours after a demo — measurably moves show rates and follow-up response.', late:'Late-stage stalls are often about inertia, not fit. A high-quality physical send to a buying committee member who hasn\'t been engaged is one of the most reliable ways to restart momentum without another email.', expand:'Expansion is the highest-margin growth motion available — and it\'s where gifting is most underused. A structured gifting cadence tied to customer milestones directly influences NRR and upsell conversion.', }; const pmap={ reply:'Low reply rates are a signal problem — your outreach isn\'t breaking through. Gifting is one of the only channels that physically lands in someone\'s space and demands a reaction.', exec:'Getting to executives requires a different kind of credibility signal. A thoughtful, personalized physical send often gets more traction than a cold LinkedIn message or email chain.', pers:'Personalization at scale is exactly what a gifting platform is built to solve — but only if you\'re using it with actual account intelligence, not just gift selection.', retain:'Retention and adoption are relationship problems as much as product problems. Gifting at key moments in the customer lifecycle turns a transactional relationship into something that feels like a partnership.', }; return(fmap[friction]||'')+(fmap[friction]&&pmap[pain]?' And: ':'')+( pmap[pain]||'Your gifting motion has room to directly address the friction you\'re experiencing right now.'); } function getRoleInsight(role,level,friction,pain){ const map={ sales_leader:`As a revenue leader, your gifting maturity directly affects deal velocity and win rate. ${level.name==='The Spreadsheet Sender'?'Getting a structured gifting motion off the ground is likely worth more than another tool in the stack right now.':level.name==='The Campaign Marketer'?'The gap between you and the top tier is mostly automation and attribution — both of which have direct impact on the pipeline numbers you\'re accountable for.':'You\'re running gifting at a level most revenue orgs never reach. The opportunity now is making it harder for competitors to replicate.'}`, marketing_leader:`As a marketing leader, gifting is one of the highest-leverage levers you have for pipeline quality and speed. ${level.name==='The Spreadsheet Sender'?'Building even a basic gifting motion into your demand gen or ABM programs could dramatically shift MQL-to-opportunity conversion.':level.name==='The Campaign Marketer'?'You\'re using gifting but likely underattributing its impact. Tighter integration with your marketing automation stack will change how leadership sees the ROI.':'You\'re running a sophisticated program. The next frontier is making gifting work harder at the bottom of the funnel and across expansion.'}`, sdrmgr:`As an SDR or sales manager, gifting is a rep performance lever as much as a strategy. ${level.name==='The Spreadsheet Sender'?'A simple coffee eGift cadence added to your top sequences is one of the fastest, most measurable things you can test this quarter.':level.name==='The Campaign Marketer'?'You\'re using gifting in outbound but likely not measuring it tightly enough to know what\'s actually moving meetings vs. what\'s just noise.':'You\'re ahead of most SDR orgs. The focus now is consistency and scale — making sure the motion works regardless of who the rep is.'}`, cs:`As a CS or CX leader, gifting is one of your most powerful tools for retention and expansion. ${level.name==='The Spreadsheet Sender'?'Even a basic milestone-based gifting cadence — 90-day mark, renewal, product adoption — can shift churn risk and NPS meaningfully.':level.name==='The Campaign Marketer'?'You\'re using gifting but likely not across the full customer lifecycle. The expansion and upsell motion is where gifting delivers the most incremental revenue at your stage.':'You\'re running gifting across the customer lifecycle in a way that most CS orgs don\'t. The precision layer is next.'}`, hr:`As a people ops leader, gifting is your most tangible lever for culture, belonging, and retention. ${level.name==='The Spreadsheet Sender'?'Building a structured gifting program around onboarding, milestones, and recognition could have an outsized impact on how people experience the company from day one.':level.name==='The Campaign Marketer'?'You\'re doing some of this well — the opportunity is making it consistent and scalable, not dependent on individual effort or memory.':'You\'re running a people gifting program that most orgs only aspire to. The focus now is making it defensible and deeply embedded in your culture OS.'}`, exec:`As a founder, CEO, or operating partner, gifting maturity is a revenue and culture signal. ${level.name==='The Spreadsheet Sender'?'There\'s likely significant pipeline or retention value being left on the table. A structured program with even basic attribution would tell you quickly what it\'s worth.':level.name==='The Campaign Marketer'?'You have the foundation — the gap is systematizing it so results aren\'t dependent on individual initiative.':'You\'re in the top tier. The question at this level is whether gifting is embedded in the company\'s operating model or still a best practice that walks out the door when key people do.'}`, }; return map[role]||`Based on your responses, ${level.description}`; } // === UI === // ===== INTERACTIVE UI LAYER ===== const TOTAL = QUESTIONS.length; let answers = new Array(TOTAL).fill(null); let scores = {}; let dims = {auto:0,attr:0,pers:0,life:0,exec:0}; let dimCounts = {auto:0,attr:0,pers:0,life:0,exec:0}; let current = 0; let autoAdvanceTimer = null; function svgIcon(path, size) { size = size || 16; return '' + path + ''; } function showScreen(id) { document.querySelectorAll('.screen').forEach(function(s){ s.classList.remove('active'); }); document.getElementById(id).classList.add('active'); window.scrollTo({top: 0, behavior: 'smooth'}); } function startQuiz() { showScreen('screen-quiz'); renderQuestion(0); } // Subtle emoji micro-reactions based on answer points function getReactionEmoji(points, isScored) { if (!isScored) return ''; // Neutral progress glyphs (single-codepoint Unicode that renders on all platforms) if (points === 0) return '○'; if (points <= 5) return '◔'; if (points <= 15) return '◑'; if (points <= 25) return '◕'; return '●'; } function renderQuestion(idx) { current = idx; const q = QUESTIONS[idx]; const sec = SECTIONS[q.section]; const pct = Math.round(((idx + 1) / TOTAL) * 100); let wrap = document.getElementById('quiz-content'); if (!wrap) { const screen = document.getElementById('screen-quiz'); if (screen) { screen.innerHTML = '
'; wrap = document.getElementById('quiz-content'); } } // Build question HTML with all the polish let html = ''; // Progress meta bar at top html += '
'; html += '
'; html += '' + svgIcon(sec.icon, 14) + ' ' + sec.label + ''; html += '' + (idx + 1) + ' / ' + TOTAL + ''; html += '
'; html += '
'; html += '
'; // Question card with animation html += '
'; html += '
Question ' + (idx + 1) + ' of ' + TOTAL + '
'; html += '

' + q.text + '

'; // Answers - each with hover state and click animation html += '
'; q.answers.forEach(function(ans, i) { const selected = answers[idx] === i; html += ''; }); html += '
'; // Back button (no next — auto-advance handles forward) html += '
'; if (idx > 0) { html += ''; } else { html += ''; } html += 'Click an answer to continue'; html += '
'; html += '
'; // qz-card wrap.innerHTML = html; // Wire up handlers wrap.querySelectorAll('.qz-answer').forEach(function(btn) { btn.addEventListener('click', function() { handleAnswer(idx, parseInt(btn.dataset.idx, 10), btn); }); }); const backBtn = document.getElementById('qz-back-btn'); if (backBtn) backBtn.addEventListener('click', function() { if (autoAdvanceTimer) { clearTimeout(autoAdvanceTimer); autoAdvanceTimer = null; } renderQuestion(idx - 1); }); // Trigger entrance animation requestAnimationFrame(function() { const card = wrap.querySelector('.qz-card'); if (card) card.classList.add('qz-enter'); }); } function handleAnswer(qIdx, aIdx, btn) { if (autoAdvanceTimer) { clearTimeout(autoAdvanceTimer); autoAdvanceTimer = null; } answers[qIdx] = aIdx; const wrap = document.getElementById('quiz-content'); if (!wrap) return; // Visual: mark all unselected, then add selected with pop animation wrap.querySelectorAll('.qz-answer').forEach(function(b) { b.classList.remove('qz-selected', 'qz-pop'); }); btn.classList.add('qz-selected', 'qz-pop'); // Show emoji reaction const emoji = btn.querySelector('.qz-emoji'); if (emoji) emoji.classList.add('qz-emoji-show'); // Auto-advance autoAdvanceTimer = setTimeout(function() { autoAdvanceTimer = null; if (qIdx < TOTAL - 1) { const card = wrap.querySelector('.qz-card'); if (card) card.classList.add('qz-exit'); setTimeout(function() { renderQuestion(qIdx + 1); }, 220); } else { computeAndShow(); } }, 450); } function computeAndShow() { // Score computation - tally points and dimensions let totalPoints = 0; scores = {}; dims = {auto:0,attr:0,pers:0,life:0,exec:0}; dimCounts = {auto:0,attr:0,pers:0,life:0,exec:0}; answers.forEach(function(aIdx, qIdx) { if (aIdx === null) return; const q = QUESTIONS[qIdx]; const ans = q.answers[aIdx]; totalPoints += ans.points || 0; if (ans.score) { Object.keys(ans.score).forEach(function(k) { scores[k] = ans.score[k]; }); } if (ans.dim) { Object.keys(ans.dim).forEach(function(k) { dims[k] += ans.dim[k]; if (ans.dim[k] > 0 || (q.section >= 1 && q.section <= 4)) dimCounts[k]++; }); } }); // Normalize dims to 0-20 each (sum = 100 max) const normalizedDims = {}; DIM_KEYS.forEach(function(k) { const max = dimCounts[k] > 0 ? dimCounts[k] * 3 : 1; normalizedDims[k] = Math.round((dims[k] / max) * 20); }); // Total score = sum of dimension scores (internally consistent with radar) let totalScore = 0; DIM_KEYS.forEach(function(k) { totalScore += normalizedDims[k]; }); // Best-in-class reference: 5 dimensions x 20 = 100 const referenceMax = 100; renderResult(totalScore, normalizedDims, referenceMax); } function renderResult(score, normalizedDims, maxPossible) { showScreen('screen-result'); let wrap = document.getElementById('result-content'); if (!wrap) { const screen = document.getElementById('screen-result'); if (screen) { screen.innerHTML = '
'; wrap = document.getElementById('result-content'); } } // Determine archetype — LEVELS thresholds were calibrated on the legacy 0-199 raw-points scale. // Convert the new 0-100 score back to that scale for comparison: score * (199/100) const legacyEquiv = score * 1.99; let archetype = LEVELS[0]; for (let i = LEVELS.length - 1; i >= 0; i--) { if (legacyEquiv >= LEVELS[i].min) { archetype = LEVELS[i]; break; } } // Reference: theoretical maximum based on the assessment's own scoring rubric // (sum of best possible answer for every question) const referenceMax = maxPossible; const scorePct = Math.round((score / referenceMax) * 100); let html = ''; // HERO SECTION html += '
'; html += '
' + archetype.name + '
'; html += '

Your gifting maturity score

'; // Animated score reveal html += '
'; html += '
'; html += ''; html += ''; html += ''; html += ''; html += '
0/' + referenceMax + '
'; html += '
'; html += '
'; html += '
' + (archetype.bench || archetype.tagline || '') + '
'; html += '

' + archetype.description + '

'; html += '
'; html += '
'; html += '
'; // PROGRESS BAR — Your score against best-in-class reference (math-derived from rubric) html += '
'; html += '
How you stack up
'; html += '
Your score compared to a fully built-out program on this assessment
'; html += '
'; html += '
'; html += '
Your score
'; html += '
' + score + '
'; html += '
'; html += '
'; html += '
Best-in-class
'; html += '
' + referenceMax + '
'; html += '
'; html += '
'; const delta = referenceMax - score; if (delta > 0 && score > 0) { html += '
+' + delta + ' points of room to grow on this rubric
'; } html += '
'; // RADAR + LEGEND (interactive hover) html += '
'; html += '
Where you stand across five dimensions
'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; // FRICTION / ROLE insights const friction = scores.friction || ''; const pain = scores.pain || ''; const role = scores.role || ''; const frictionText = getFrictionInsight(friction, pain); const roleText = getRoleInsight(role, archetype, friction, pain); html += '
'; html += '
'; html += '
'; html += '
Your biggest friction point
'; html += '

' + frictionText + '

'; html += '
'; if (roleText) { html += '
'; html += '
🎯
'; html += '
What this means for you
'; html += '

' + roleText + '

'; html += '
'; } html += '
'; // LEAD CAPTURE — "Want to take this somewhere?" html += '
'; html += '
'; html += '

Want to take this somewhere?

'; html += '

Enter your email and we’ll send you a custom Gifting Gap Report built from your answers — including the specific plays most relevant to your stage, your top gaps explained, and the context your team needs to act on it.

'; html += '
'; html += '
'; html += '
'; html += '
Your top 3 gaps
'; html += '
Named and explained for your program
'; html += '
'; html += '
'; html += '
How to close them
'; html += '
Specific Sendoso context for your stage
'; html += '
'; html += '
'; html += '
Ready to share
'; html += '
Formatted to take to your leadership team
'; html += '
'; html += '
'; html += '
'; html += ''; html += ''; html += '
'; html += '
'; html += '
Done — check your inbox. Your Gifting Gap Report is on its way.
'; html += '
'; // CTA html += '
'; html += '
'; html += '

' + (archetype.cta && archetype.cta.headline ? archetype.cta.headline : "Ready to see it in action?") + '

'; html += '

' + (archetype.cta && archetype.cta.sub ? archetype.cta.sub : "Book a demo and we\'ll walk through what this looks like for your team specifically.") + '

'; html += ''; html += ''; html += '
'; // Hidden share card (rendered to PNG when user clicks Download) html += buildShareCard(score, normalizedDims, archetype, referenceMax); wrap.innerHTML = html; // Animations: count up score, draw radar, fire confetti requestAnimationFrame(function() { animateScore(score, referenceMax); drawRadar(normalizedDims); fireConfetti(); // Trigger bar fills setTimeout(function() { wrap.querySelectorAll('.rs-compare-fill').forEach(function(b) { b.style.width = b.style.getPropertyValue('--target-width'); }); }, 400); // Wire up download button const shareBtn = document.getElementById('rs-share-btn'); if (shareBtn) { shareBtn.addEventListener('click', function() { downloadShareCard(archetype); }); } // Wire up Gifting Gap Report email capture wireReportCapture(archetype, score); }); } // ===== MARKETO LEAD CAPTURE ===== // Submits email + archetype + score to Marketo Form 2206 so the follow-up // smart campaign sends the matching Gifting Gap Report PDF. var SGP_MKTO_POD = '//app-ab37.marketo.com'; var SGP_MUNCHKIN = '757-WXD-176'; var SGP_FORM_ID = 2206; function loadMktoForms(cb) { if (window.MktoForms2) { cb(window.MktoForms2); return; } var existing = document.getElementById('mktoforms2-lib'); if (existing) { existing.addEventListener('load', function(){ cb(window.MktoForms2); }); return; } var s = document.createElement('script'); s.id = 'mktoforms2-lib'; s.src = SGP_MKTO_POD + '/js/forms2/js/forms2.min.js'; s.onload = function(){ cb(window.MktoForms2); }; s.onerror = function(){ cb(null); }; document.head.appendChild(s); } function wireReportCapture(archetype, score) { var btn = document.getElementById('rs-report-submit'); var input = document.getElementById('rs-report-email'); var errEl = document.getElementById('rs-report-error'); var formWrap = document.getElementById('rs-report-form'); var successEl = document.getElementById('rs-report-success'); if (!btn || !input) return; function showError(msg) { if (errEl) { errEl.textContent = msg; errEl.style.display = 'block'; } } function clearError() { if (errEl) { errEl.textContent = ''; errEl.style.display = 'none'; } } function validEmail(v) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v); } function submit() { clearError(); var email = (input.value || '').trim(); if (!validEmail(email)) { showError('Please enter a valid work email.'); return; } btn.disabled = true; btn.textContent = 'Sending\u2026'; var archetypeKey = archetype.archetypeKey || (archetype.name || '').replace(/^The\s+/, ''); loadMktoForms(function(MktoForms2) { if (!MktoForms2) { btn.disabled = false; btn.textContent = 'Send me the report'; showError('Something went wrong. Please try again.'); return; } // Hidden off-screen container for the Marketo form element var holder = document.getElementById('sgp-mkto-holder'); if (!holder) { holder = document.createElement('div'); holder.id = 'sgp-mkto-holder'; holder.style.position = 'absolute'; holder.style.left = '-10000px'; holder.style.top = '0'; holder.innerHTML = '
'; document.body.appendChild(holder); } MktoForms2.loadForm(SGP_MKTO_POD, SGP_MUNCHKIN, SGP_FORM_ID, function(form) { form.addHiddenFields({ Email: email, giftingMaturityArchetype: archetypeKey, giftingMaturityScore: score }); form.setValues({ Email: email }); form.onSuccess(function() { if (formWrap) formWrap.style.display = 'none'; if (successEl) successEl.style.display = 'block'; return false; // prevent Marketo redirect }); form.submit(); }); }); } btn.addEventListener('click', submit); input.addEventListener('keydown', function(e) { if (e.key === 'Enter') { e.preventDefault(); submit(); } }); } function animateScore(target, max) { const el = document.getElementById('rs-score-val'); const ring = document.getElementById('rs-score-ring'); const pctEl = document.getElementById('rs-pct'); if (!el || !ring) return; const dur = 1400; const start = performance.now(); // Set ring target const circumference = 565; const offset = circumference - (circumference * target / max); setTimeout(function() { ring.style.strokeDashoffset = offset; }, 200); // (percentile text is set elsewhere from archetype.bench) if (pctEl) { /* archetype.bench used as percentile copy in renderResult */ } function tick(now) { const t = Math.min(1, (now - start) / dur); const eased = 1 - Math.pow(1 - t, 3); el.textContent = Math.round(eased * target); if (t < 1) requestAnimationFrame(tick); else el.textContent = target; } requestAnimationFrame(tick); } function drawRadar(normalizedDims) { const wrap = document.getElementById('rs-radar-svg'); const legendWrap = document.getElementById('rs-radar-legend'); const tooltip = document.getElementById('rs-tooltip'); if (!wrap) return; const size = 380, cx = size/2, cy = size/2, maxR = 110; const N = DIM_KEYS.length; // Calculate polygon points const points = DIM_KEYS.map(function(k, i) { const angle = (Math.PI * 2 * i / N) - Math.PI/2; const v = Math.max(0, Math.min(20, normalizedDims[k])); const r = (v / 20) * maxR; return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r, labelX: cx + Math.cos(angle) * (maxR + 28), labelY: cy + Math.sin(angle) * (maxR + 28), k: k, v: v, label: DIM_LABELS[DIM_KEYS.indexOf(k)], angle: angle }; }); // Benchmark (top 10%) polygon — assume ~15/20 on each dim const benchPoints = DIM_KEYS.map(function(k, i) { const angle = (Math.PI * 2 * i / N) - Math.PI/2; const r = (14 / 20) * maxR; return cx + Math.cos(angle) * r + ',' + (cy + Math.sin(angle) * r); }).join(' '); let svg = ''; // Grid rings [0.25, 0.5, 0.75, 1].forEach(function(r) { svg += ''; }); // Axis lines points.forEach(function(p) { svg += ''; }); // Benchmark polygon (top 10%) svg += ''; // User polygon const polyPoints = points.map(function(p){return p.x + ',' + p.y;}).join(' '); svg += ''; // Vertex dots (interactive) points.forEach(function(p, i) { svg += ''; }); // Labels points.forEach(function(p) { let anchor = 'middle'; if (p.labelX < cx - 10) anchor = 'end'; else if (p.labelX > cx + 10) anchor = 'start'; svg += '' + p.label + ''; }); svg += ''; wrap.innerHTML = svg; // Legend let legendHtml = ''; DIM_KEYS.forEach(function(k, i) { const v = normalizedDims[k]; legendHtml += '
'; legendHtml += '
' + DIM_LABELS[DIM_KEYS.indexOf(k)] + '
'; legendHtml += '
'; legendHtml += '
' + v + '
'; legendHtml += '
'; }); legendWrap.innerHTML = legendHtml; // Interactive tooltips const dimExplanations = { auto: 'How much of your gifting motion is automated vs manual. Top performers run CRM-triggered sends based on deal stage or lifecycle signals.', attr: 'How well you measure and attribute revenue impact from gifting. Top performers connect gifting data into Salesforce for multi-touch attribution.', pers: 'How tailored your sends are. Top performers personalize based on account research, intent signals, or persona-specific kits.', life: 'How widely you deploy gifting across the customer journey. Top performers gift at every stage — outbound, demo, close, expansion, retention.', exec: 'How effectively you reach senior decision-makers and executives. Top performers use thoughtful physical sends to break through the noise.' }; function showTooltip(dim, val, x, y) { const explanation = dimExplanations[dim] || ''; tooltip.innerHTML = '
' + DIM_LABELS[DIM_KEYS.indexOf(dim)] + '
' + val + '/20 · Top tier: 14/20
' + explanation + '
'; tooltip.style.left = x + 'px'; tooltip.style.top = y + 'px'; tooltip.classList.add('rs-tt-show'); } function hideTooltip() { tooltip.classList.remove('rs-tt-show'); } let activeTooltipKey = null; function toggleTooltip(key, dim, val, x, y) { if (activeTooltipKey === key) { hideTooltip(); activeTooltipKey = null; } else { showTooltip(dim, val, x, y); activeTooltipKey = key; } } // Dismiss tooltip when tapping outside document.addEventListener('click', function(e) { if (!e.target.closest('.rs-radar-dot') && !e.target.closest('.rs-legend-row')) { hideTooltip(); activeTooltipKey = null; } }); wrap.querySelectorAll('.rs-radar-dot').forEach(function(dot) { const showFn = function(e) { const rect = wrap.getBoundingClientRect(); const dotRect = dot.getBoundingClientRect(); showTooltip(dot.dataset.dim, dot.dataset.val, dotRect.left - rect.left + 12, dotRect.top - rect.top - 8); }; dot.addEventListener('mouseenter', showFn); dot.addEventListener('mouseleave', hideTooltip); dot.addEventListener('click', function(e) { e.stopPropagation(); const rect = wrap.getBoundingClientRect(); const dotRect = dot.getBoundingClientRect(); toggleTooltip('dot-' + dot.dataset.dim, dot.dataset.dim, dot.dataset.val, dotRect.left - rect.left + 12, dotRect.top - rect.top - 8); }); }); legendWrap.querySelectorAll('.rs-legend-row').forEach(function(row) { const showFn = function(e) { const v = normalizedDims[row.dataset.dim]; const rect = wrap.getBoundingClientRect(); const rowRect = row.getBoundingClientRect(); showTooltip(row.dataset.dim, v, rowRect.left - rect.left + (rowRect.width / 2), rowRect.top - rect.top - 8); }; row.addEventListener('mouseenter', showFn); row.addEventListener('mouseleave', hideTooltip); row.addEventListener('click', function(e) { e.stopPropagation(); const v = normalizedDims[row.dataset.dim]; const rect = wrap.getBoundingClientRect(); const rowRect = row.getBoundingClientRect(); toggleTooltip('row-' + row.dataset.dim, row.dataset.dim, v, rowRect.left - rect.left + (rowRect.width / 2), rowRect.top - rect.top - 8); }); }); // Trigger legend bar fills setTimeout(function() { legendWrap.querySelectorAll('.rs-legend-fill').forEach(function(b) { b.style.width = b.style.getPropertyValue('--w'); }); }, 600); } function fireConfetti() { const colors = ['#E8522A', '#40bbc1', '#012c30', '#dcd66c', '#72043e']; const container = document.createElement('div'); container.className = 'rs-confetti'; for (let i = 0; i < 40; i++) { const p = document.createElement('div'); p.className = 'rs-confetti-piece'; p.style.background = colors[i % colors.length]; p.style.left = (Math.random() * 100) + '%'; p.style.animationDelay = (Math.random() * 0.4) + 's'; p.style.animationDuration = (1.2 + Math.random() * 0.8) + 's'; p.style.transform = 'rotate(' + (Math.random() * 360) + 'deg)'; container.appendChild(p); } document.getElementById('result-content').appendChild(container); setTimeout(function(){ container.remove(); }, 2500); } function buildShareCard(score, dims, archetype, max) { // 1200x630 share-optimized card (Twitter/LinkedIn/OG standard) let h = ''; return h; } function loadHtml2Canvas(callback) { if (window.html2canvas) { callback(window.html2canvas); return; } const existing = document.getElementById('rs-h2c-script'); if (existing) { existing.addEventListener('load', function() { callback(window.html2canvas); }); return; } const s = document.createElement('script'); s.id = 'rs-h2c-script'; s.src = 'https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js'; s.onload = function() { callback(window.html2canvas); }; s.onerror = function() { callback(null); }; document.head.appendChild(s); } var SENDOSO_LOGO_URL = 'https://cdn.prod.website-files.com/651ad5ceeba626e1de2f2ce8/67100063c4dd72e625bf2c9b_sendoso%20logo.svg'; var cachedLogoSvg = null; function preloadLogoSvg(callback) { if (cachedLogoSvg !== null) { callback(cachedLogoSvg); return; } fetch(SENDOSO_LOGO_URL) .then(function(r) { return r.ok ? r.text() : null; }) .then(function(txt) { if (txt && txt.indexOf(']*\?>/g, '').replace(/]*>/gi, '').trim(); } else { cachedLogoSvg = ''; } callback(cachedLogoSvg); }) .catch(function() { cachedLogoSvg = ''; callback(''); }); } function downloadShareCard(archetype) { const card = document.getElementById('rs-share-card'); const btn = document.getElementById('rs-share-btn'); if (!card) return; const origBtnText = btn ? btn.textContent : ''; if (btn) { btn.textContent = ' Preparing image\u2026'; btn.disabled = true; } function restoreCard() { card.style.display = ''; card.style.position = ''; card.style.top = ''; card.style.left = ''; card.style.pointerEvents = ''; card.style.zIndex = ''; card.style.opacity = ''; } function failed(msg) { if (btn) { btn.textContent = msg || 'Download failed'; btn.disabled = false; } restoreCard(); } // Move the card off-screen but render it normally \u2014 html2canvas needs real pixels card.style.display = 'block'; card.style.position = 'fixed'; card.style.top = '0'; card.style.left = '-10000px'; card.style.pointerEvents = 'none'; card.style.zIndex = '999999'; // Preload the Sendoso SVG logo and inject inline, then rasterize preloadLogoSvg(function(svgMarkup) { var slot = document.getElementById('rsc-logo-slot'); if (slot && svgMarkup) { slot.innerHTML = svgMarkup; } setTimeout(function() { loadHtml2Canvas(function(h2c) { if (!h2c) { failed('Download failed \u2014 try again'); return; } h2c(card, { backgroundColor: '#F5EFE6', scale: 2, logging: false, useCORS: true, width: 1200, height: 630 }).then(function(canvas) { try { canvas.toBlob(function(blob) { if (!blob) { failed(); return; } const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; const filename = 'sendoso-gifting-score-' + (archetype.name || 'result').toLowerCase().replace(/[^a-z0-9]+/g,'-') + '.png'; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(function() { URL.revokeObjectURL(url); }, 1000); if (btn) { btn.textContent = '\u2713 Downloaded!'; setTimeout(function() { btn.textContent = origBtnText; btn.disabled = false; }, 2000); } restoreCard(); }, 'image/png'); } catch(e) { failed(); } }).catch(function(err) { failed(); }); }); }, 50); }); } function retake() { answers = new Array(TOTAL).fill(null); scores = {}; dims = {auto:0,attr:0,pers:0,life:0,exec:0}; dimCounts = {auto:0,attr:0,pers:0,life:0,exec:0}; showScreen('screen-intro'); } // Init wiring on DOM ready document.addEventListener('DOMContentLoaded', function() { // Start button on intro screen const startBtns = document.querySelectorAll('.btn-start'); startBtns.forEach(function(b) { b.addEventListener('click', function(e) { e.preventDefault(); startQuiz(); }); }); // Retake delegation document.addEventListener('click', function(e) { if (e.target && e.target.classList && e.target.classList.contains('btn-retake')) { e.preventDefault(); retake(); } }); }); })();