{"id":39437,"date":"2026-02-01T14:29:49","date_gmt":"2026-02-01T12:29:49","guid":{"rendered":"https:\/\/therelationshipguy.com\/?page_id=39437"},"modified":"2026-07-23T08:52:23","modified_gmt":"2026-07-23T06:52:23","slug":"tnp-06746069491068412681656431","status":"publish","type":"page","link":"https:\/\/therelationshipguy.com\/af\/tnp-06746069491068412681656431\/","title":{"rendered":"The Needs Profile (TNP)"},"content":{"rendered":"<!-- ===== TNP \u2014 The Needs Profile \u2014 paste into WPCode HTML snippet ===== -->\r\n<div id=\"tnp-root\">\r\n<style>\r\n#tnp-root{\r\n  --cream:#faf6f1; --cream-2:#f3ece2; --paper:#fffdfa;\r\n  --terra:#c2562a; --terra-deep:#9a4220;\r\n  --ink:#2d2620; --ink-soft:#5a4f44; --ink-faint:#8a7d6e;\r\n  --line:#e4d9c9; --line-soft:#eee5d8;\r\n  --good:#5f7355; --warn:#b06a3a;\r\n  --shadow:0 1px 3px rgba(45,38,32,.06),0 8px 28px rgba(45,38,32,.07);\r\n  max-width:760px;margin:0 auto;font-family:Arial,Helvetica,sans-serif;font-size:18px;line-height:1.58;color:var(--ink)\r\n}\r\n#tnp-root *{box-sizing:border-box;margin:0;padding:0}\r\n#tnp-root .wrap{max-width:740px;margin:0 auto;padding:10px 22px 40px}\r\n#tnp-root h1,#tnp-root h2,#tnp-root h3{font-family:Arial,Helvetica,sans-serif;font-weight:500;line-height:1.22;color:var(--ink)}\r\n#tnp-root h1{font-size:clamp(2rem,4.8vw,2.7rem);letter-spacing:-.01em}\r\n#tnp-root h2{font-size:clamp(1.5rem,3.4vw,1.85rem);margin-bottom:.2em}\r\n#tnp-root h3{font-size:1.25rem;font-weight:600}\r\n#tnp-root p{margin:0 0 1.8em}\r\n#tnp-root .muted{color:var(--ink-soft)}\r\n#tnp-root .faint{color:var(--ink-faint)}\r\n#tnp-root strong{font-weight:600}\r\n#tnp-root .screen{display:none;animation:tnpfade .4s ease both}\r\n#tnp-root .screen.active{display:block}\r\n@keyframes tnpfade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}\r\n#tnp-root .card{background:var(--paper);border:1px solid var(--line);border-radius:14px;padding:30px 28px;box-shadow:var(--shadow)}\r\n#tnp-root .card+.card{margin-top:18px}\r\n#tnp-root .kicker{font-weight:600;text-transform:uppercase;letter-spacing:.16em;font-size:.72rem;color:var(--terra);margin-bottom:14px}\r\n#tnp-root .land{font-style:italic;font-size:1.2rem;line-height:1.5;color:var(--terra-deep);border-left:3px solid var(--terra);padding:.1em 0 .1em 18px;margin:1.2em 0}\r\n#tnp-root .btn{display:inline-flex;align-items:center;gap:.5em;background:var(--terra);color:#fff;border:none;border-radius:10px;padding:13px 26px;font-family:inherit;font-weight:600;font-size:1rem;cursor:pointer;transition:background .2s}\r\n#tnp-root .btn:hover{background:var(--terra-deep)}\r\n#tnp-root .btn:disabled{background:var(--line);color:var(--ink-faint);cursor:not-allowed}\r\n#tnp-root .btn-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:8px}\r\n#tnp-root .btn-back{background:none;border:none;color:var(--ink-faint);font-family:inherit;font-weight:500;font-size:.95rem;cursor:pointer;padding:8px 4px}\r\n#tnp-root .field{margin:14px 0}\r\n#tnp-root .field label{display:block;font-weight:600;font-size:.95rem;margin-bottom:6px}\r\n#tnp-root .field input[type=text]{width:100%;padding:12px 14px;border:1px solid var(--line);border-radius:9px;font-family:inherit;font-size:1.02rem;background:var(--cream);color:var(--ink)}\r\n#tnp-root .field input[type=text]:focus{outline:none;border-color:var(--terra);background:#fff}\r\n#tnp-root .opts{display:flex;flex-direction:column;gap:9px;margin-top:6px}\r\n#tnp-root .opt{display:flex;align-items:center;gap:12px;padding:13px 15px;border:1.5px solid var(--line);background:var(--paper);border-radius:10px;cursor:pointer;font-size:1.01rem;text-align:left;font-family:inherit;color:var(--ink)}\r\n#tnp-root .opt:hover{border-color:var(--terra)}\r\n#tnp-root .opt.sel{border-color:var(--terra);background:rgba(194,86,42,.06)}\r\n#tnp-root .opt .tick{width:20px;height:20px;border-radius:6px;border:1.6px solid var(--line);flex:0 0 auto;display:flex;align-items:center;justify-content:center;color:#fff;font-size:.8rem}\r\n#tnp-root .opt.sel .tick{background:var(--terra);border-color:var(--terra)}\r\n#tnp-root .qcard{background:var(--paper);border:1px solid var(--line);border-radius:14px;padding:28px 26px 24px;box-shadow:var(--shadow)}\r\n#tnp-root .qtext{font-size:1.3rem;line-height:1.4;margin-bottom:22px}\r\n#tnp-root .scale{display:flex;flex-direction:column;gap:8px}\r\n#tnp-root .scale button{display:flex;align-items:center;gap:12px;width:100%;padding:12px 15px;border:1.5px solid var(--line);background:var(--cream);border-radius:10px;font-family:inherit;font-size:1rem;color:var(--ink-soft);cursor:pointer;text-align:left}\r\n#tnp-root .scale button:hover{border-color:var(--terra);color:var(--ink);background:#fff}\r\n#tnp-root .scale button .dot{width:14px;height:14px;border-radius:50%;border:1.6px solid var(--line-soft);flex:0 0 auto}\r\n#tnp-root .prog{position:sticky;top:0;z-index:5;background:linear-gradient(var(--cream),var(--cream) 70%,rgba(250,246,241,0));padding:8px 0 6px}\r\n#tnp-root .prog-bar{height:5px;background:var(--line-soft);border-radius:99px;overflow:hidden}\r\n#tnp-root .prog-fill{height:100%;background:var(--terra);border-radius:99px;width:0;transition:width .35s ease}\r\n#tnp-root .divider{height:1px;background:var(--line);margin:22px 0}\r\n#tnp-root .note{font-size:.88rem;color:var(--ink-faint);line-height:1.5}\r\n#tnp-root .pill{display:inline-block;background:var(--cream-2);border-radius:99px;padding:4px 12px;font-size:.8rem;font-weight:600;color:var(--ink-soft);margin-bottom:14px}\r\n#tnp-root .consent-list{margin:14px 0 4px;padding-left:20px}\r\n#tnp-root .consent-list li{margin:14px 0;line-height:1.5}\r\n#tnp-root .consent-check{display:flex;align-items:flex-start;gap:12px;margin:18px 0 6px;padding:14px 16px;border:1.5px solid var(--line);border-radius:10px;cursor:pointer;background:var(--paper)}\r\n#tnp-root .consent-check.on{border-color:var(--terra);background:rgba(194,86,42,.06)}\r\n#tnp-root .consent-check .cbox-tick{flex:0 0 auto;width:22px;height:22px;border-radius:6px;border:1.7px solid var(--line);display:flex;align-items:center;justify-content:center;color:#fff;font-size:.85rem;margin-top:1px}\r\n#tnp-root .consent-check.on .cbox-tick{background:var(--terra);border-color:var(--terra)}\r\n#tnp-root .report .card{margin-bottom:18px}\r\n#tnp-root .frame{background:linear-gradient(160deg,var(--paper),var(--cream-2))}\r\n#tnp-root .chart{margin:18px 0 22px;background:var(--cream);border:1px solid var(--line-soft);border-radius:12px;padding:16px 14px 12px}\r\n#tnp-root .chart-cap{font-size:.85rem;color:var(--ink-faint);line-height:1.5;margin:8px 0 0;text-align:center}\r\n#tnp-root .keynote{border-left:3px solid var(--terra);background:var(--cream-2);padding:13px 17px;border-radius:0 10px 10px 0;font-weight:500;margin:1.3em 0}\r\n#tnp-root .growth{border:1px solid var(--line);border-radius:12px;padding:18px 20px;margin:16px 0;background:var(--paper)}\r\n#tnp-root .growth-h{display:flex;align-items:center;gap:12px;margin-bottom:8px}\r\n#tnp-root .growth-n{flex:0 0 auto;width:30px;height:30px;border-radius:50%;background:var(--terra);color:#fff;font-weight:700;display:flex;align-items:center;justify-content:center;font-size:1rem}\r\n#tnp-root .suffstrip{display:flex;flex-wrap:wrap;gap:7px;margin:14px 0 6px}\r\n#tnp-root .suffchip{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:99px;font-size:.82rem;font-weight:600;border:1px solid}\r\n#tnp-root .suffchip.hi{background:rgba(194,86,42,.09);border-color:var(--terra);color:var(--terra-deep)}\r\n#tnp-root .suffchip.ok{background:rgba(95,115,85,.09);border-color:var(--good);color:var(--good)}\r\n#tnp-root .suffchip.lo{background:rgba(176,106,58,.08);border-color:var(--warn);color:var(--warn)}\r\n#tnp-root .quietline{border:1px solid var(--line);border-left:3px solid var(--line);border-radius:0 10px 10px 0;padding:12px 16px;margin:10px 0;background:var(--cream)}\r\n#tnp-root .quietline b{color:var(--ink)}\r\n#tnp-root .nudge{background:linear-gradient(160deg,#f6ede4,#f1e3d6);border:1px solid var(--terra)}\r\n@media(max-width:520px){#tnp-root .wrap{padding:20px 16px 80px}#tnp-root .card,#tnp-root .qcard{padding:24px 19px}#tnp-root .qtext{font-size:1.18rem}}\r\n@media print{#tnp-root .btn,#tnp-root .btn-back{display:none!important}#tnp-root .card,#tnp-root .qcard{box-shadow:none;border:1px solid #ddd;break-inside:avoid}}\r\n<\/style>\r\n<div id=\"tnp-app\" class=\"wrap\"><\/div>\r\n<script>\r\n(function(){\r\n\"use strict\";\r\n\/* ============================================================\r\n   THE NEEDS PROFILE (TNP)\r\n   Free short-form companion to the Complete Needs Assessment.\r\n   8 needs, 4 items each, tie-breakers, medium-weight report.\r\n   ============================================================ *\/\r\n\r\nconst AGREE=[\"Strongly disagree\",\"Disagree\",\"Slightly disagree\",\"Slightly agree\",\"Agree\",\"Strongly agree\"];\r\n\r\nconst NEED_KEYS=[\"certainty\",\"autonomy\",\"variety\",\"significance\",\"competence\",\"connection\",\"growth\",\"purpose\"];\r\nconst NEED_LABEL={certainty:\"Certainty\",autonomy:\"Autonomy\",variety:\"Variety\",significance:\"Significance\",competence:\"Competence\",connection:\"Connection\",growth:\"Growth\",purpose:\"Purpose\"};\r\n\r\n\/* Four items per need, drawn from the CNA bank so scores stay comparable.\r\n   Last item in each block is reverse-scored, to control acquiescence. *\/\r\nconst NEEDS={\r\n  certainty:[[\"c2\",\"I like to have as much stability in my life as possible.\",0],\r\n    [\"c4\",\"I feel uneasy when I don't know what to expect.\",0],\r\n    [\"c7\",\"Feeling safe and secure is one of the things I need most.\",0],\r\n    [\"c9\",\"I'm comfortable with a fair amount of uncertainty in my life.\",1]],\r\n  autonomy:[[\"a1\",\"I need to feel that the choices in my life are genuinely my own, not decided for me.\",0],\r\n    [\"a3\",\"I value having real say over how I spend my time and energy.\",0],\r\n    [\"a4\",\"I feel most myself when I'm acting on my own judgement, not just following what's expected of me.\",0],\r\n    [\"a6\",\"I'm comfortable letting others take the lead and make decisions on my behalf.\",1]],\r\n  variety:[[\"v3\",\"I get restless when life feels too predictable.\",0],\r\n    [\"v4\",\"I'm always looking for new experiences.\",0],\r\n    [\"v8\",\"I look for ways to keep my life feeling fresh and alive, not routine.\",0],\r\n    [\"v9\",\"I'd rather stick with what I know than try something new.\",1]],\r\n  significance:[[\"s4\",\"Being recognised for what I do matters to me.\",0],\r\n    [\"s5\",\"I want to feel like I matter and that I stand out in some way.\",0],\r\n    [\"s8\",\"I need to feel respected.\",0],\r\n    [\"s10\",\"I'm comfortable being in the background.\",1]],\r\n  competence:[[\"cp1\",\"Feeling genuinely skilled at something matters to me, regardless of whether anyone else notices.\",0],\r\n    [\"cp2\",\"I want real evidence, to myself, that I'm good at the things I spend my time and effort on.\",0],\r\n    [\"cp4\",\"There's a quiet satisfaction in doing something well, even if no one else ever sees it.\",0],\r\n    [\"cp6\",\"I'm genuinely comfortable being average at most of what I do.\",1]],\r\n  connection:[[\"n3\",\"I long for real emotional closeness, not just companionship.\",0],\r\n    [\"n4\",\"Feeling deeply connected to someone is one of the most important things in my life.\",0],\r\n    [\"n5\",\"I feel most alive when I'm close to the people I love.\",0],\r\n    [\"n8\",\"I'm fine going long stretches without deep emotional contact with anyone.\",1]],\r\n  growth:[[\"g1\",\"I'm always working on becoming a better version of myself.\",0],\r\n    [\"g4\",\"I feel stuck and frustrated when I'm not developing in some way.\",0],\r\n    [\"g7\",\"I'm drawn to challenges that stretch me, even when they're uncomfortable.\",0],\r\n    [\"g8\",\"I'm content with where I am and don't feel a strong pull to keep developing.\",1]],\r\n  purpose:[[\"p2\",\"Being part of something bigger than myself matters to me.\",0],\r\n    [\"p5\",\"I feel pulled toward something larger than my day-to-day life, a cause, an idea, or a piece of work I want to see through.\",0],\r\n    [\"p10\",\"I have a sense of mission, something my life is for.\",0],\r\n    [\"p11\",\"I'm content for my life to be mostly about my own day-to-day comfort, without needing to be part of anything bigger.\",1]]\r\n};\r\n\r\nconst PASSION=[\r\n  [\"pp1\",\"I feel most fulfilled, or most like myself, when...\",[\r\n    [\"a\",\"Someone really listens to me, without rushing to fix it.\",[\"connection\"]],\r\n    [\"b\",\"I get to spend unhurried time with people I care about.\",[\"connection\"]],\r\n    [\"c\",\"I complete something practical that takes a real load off me or someone else.\",[\"certainty\",\"connection\"]],\r\n    [\"d\",\"Someone tells me they're proud of me, or notices what I've done.\",[\"significance\"]],\r\n    [\"e\",\"I try something new, or do something adventurous.\",[\"variety\"]],\r\n    [\"f\",\"Someone backs what matters to me, even the parts that have nothing to do with them.\",[\"purpose\",\"growth\"]],\r\n    [\"g\",\"I feel safe, steady, like I have solid ground under me.\",[\"certainty\"]],\r\n    [\"h\",\"I'm given room to do things my own way, without being managed or hovered over.\",[\"autonomy\"]],\r\n    [\"i\",\"I'm trusted to handle something I'm actually good at, without someone stepping in.\",[\"competence\"]]]],\r\n  [\"pp2\",\"I feel most drained, or least like myself, when...\",[\r\n    [\"a\",\"I'm around people but feel completely alone in my own head.\",[\"connection\"]],\r\n    [\"b\",\"My efforts go unnoticed or unacknowledged.\",[\"significance\"]],\r\n    [\"c\",\"Someone tries to manage or control how I do things.\",[\"certainty\"]],\r\n    [\"d\",\"Everything feels flat and routine, like I'm just going through the motions.\",[\"variety\"]],\r\n    [\"e\",\"No one seems interested in what gives my life meaning.\",[\"purpose\"]],\r\n    [\"f\",\"I don't feel truly seen or valued.\",[\"connection\",\"significance\"]],\r\n    [\"g\",\"Someone manages or takes over something I'd rather handle myself.\",[\"autonomy\"]],\r\n    [\"h\",\"Someone jumps in to fix or take over something before I've had a chance to work it out myself.\",[\"competence\"]],\r\n    [\"i\",\"I feel stuck, with nothing in my life currently developing.\",[\"growth\"]]]]\r\n];\r\n\r\nconst PORTRAIT={\r\n  certainty:{core:\"being driven by Certainty means you need the ground under your life to hold still. You tend to feel most yourself when things are stable, predictable, and known, when you can see what is coming and trust that it will hold. Safety is not a small thing for you; it is the floor everything else stands on.\",\r\n    daily:\"In daily life, you often need to know where you stand, to have a plan you can rely on, and to feel that the important things, the money, the home, the routine, the commitments, are secure. Surprises tend to cost you more than they cost most people, even good ones, because your system reads uncertainty as a kind of threat.\",\r\n    rel:\"This shows up across the relationships in your life, not just a romantic one. At home, with a partner, with your children, or with close friends, you need to feel sure of where you stand and sure you won't be blindsided. Consistency reassures you far more than grand gestures do.\",\r\n    strength:\"This is a real strength. You are often the steady one, the one who keeps promises and builds something solid that others can lean on. People feel safe with you.\",\r\n    strain:\"But under strain, the need for safety can tighten its grip, and that is when it starts to cost you and the people around you.\",\r\n    emotional:\"Emotionally, this can show up as over-thinking, bracing for what might go wrong, or a hard time relaxing when things are unresolved.\",\r\n    relational:\"Relationally, it often turns into control, needing things done your way, struggling to trust other people's choices, or seeking reassurance so often that the people close to you feel tested rather than trusted.\",\r\n    close:\"When this need drives a person, it tends to mean they think carefully, commit deeply, and value loyalty, while under pressure leaning toward caution, control, and worry. Knowing that about yourself is most of the work.\"},\r\n  autonomy:{core:\"being driven by Autonomy means you need your choices to genuinely be your own. You tend to feel most yourself when you're acting from your own judgement, and most frustrated when you feel controlled, managed, or steered by someone else's agenda, even a well-meaning one.\",\r\n    daily:\"In daily life, you often need real say over how you spend your time, how you do your work, and how you run your own affairs. Being told exactly how to do something, even something small, can bother you more than it probably should. You'd rather find your own way to a good result than follow someone else's instructions to the letter.\",\r\n    rel:\"This also shows up across your relationships, at home, with a partner, with your children as they grow, with friends, and at work. You need the people close to you to trust your judgement rather than manage it.\",\r\n    strength:\"This is a real strength. You take ownership, you follow through on decisions because they're genuinely yours, and you tend to build real competence in the things you choose for yourself.\",\r\n    strain:\"But under strain, the need for self-direction can tip into resisting help or structure that would actually serve you.\",\r\n    emotional:\"Emotionally, this can show up as irritation at being managed, restlessness under close oversight, or a hard time accepting guidance even when part of you knows it's useful.\",\r\n    relational:\"Relationally, it often turns into pushing back against reasonable input on principle, insisting on doing things your own way even when it costs the people around you, or pulling away entirely rather than letting anyone have a say.\",\r\n    close:\"When this need drives a person, it tends to mean they're self-possessed, decisive, and genuinely their own person, while under pressure leaning toward reflexive resistance and going it alone. Knowing that helps you tell the difference between guidance worth accepting and control worth resisting.\"},\r\n  variety:{core:\"being driven by Variety means you need life to keep moving. You tend to feel most alive when there is novelty, stimulation, and something to look forward to, and most drained when things settle into sameness. You are wired to seek the new.\",\r\n    daily:\"In daily life, you often need change, challenge, and room to follow your curiosity. Routine that comforts others can feel like a slow flattening to you. You tend to keep several things on the go, and you light up at possibility.\",\r\n    rel:\"This shows up across all your relationships and commitments. You need play, freshness, and a sense that things, and people, are still evolving rather than fixed. You can feel trapped by too much routine, and you need the people close to you not to mistake your need for air for a lack of commitment.\",\r\n    strength:\"This is a real strength. You are often the spark, the one who keeps things from going stale, who brings energy and a sense that life is still an adventure.\",\r\n    strain:\"But under strain, the need for aliveness can pull you away from the very things that need your steadiness.\",\r\n    emotional:\"Emotionally, it can show up as restlessness, difficulty sitting with hard or boring stretches, or a tendency to chase the next thing rather than feel what is in front of you.\",\r\n    relational:\"Relationally, it often turns into avoidance of the routine work that any close relationship needs, half-finished projects, or looking for the spark elsewhere when things start to feel flat.\",\r\n    close:\"When this need drives a person, it tends to mean they are energising, adaptable, and fun, while under pressure leaning toward distraction, restlessness, and a pull toward the exit. Naming that pull is how you stay ahead of it.\"},\r\n  significance:{core:\"being driven by Significance means you need to feel that you matter. You tend to feel most yourself when you are respected, recognised, and seen as someone who counts, and most wounded when you feel dismissed, overlooked, or made small.\",\r\n    daily:\"In daily life, you often need your efforts acknowledged, your competence recognised, and a sense that you are good at something that matters. You hold yourself to high standards, and you feel it sharply when you fall short of them or when others fail to notice when you do not.\",\r\n    rel:\"This shows up across your relationships and your work. You need to feel admired and respected by the people whose opinion matters to you, not just cared about. Feeling taken for granted lands hard, whether that's at home, with friends, or at work.\",\r\n    strength:\"This is a real strength. You are often driven, capable, and willing to work hard to be worth respecting. You bring standards and ambition, and you can lift the people around you to meet them.\",\r\n    strain:\"But under strain, the need to matter can come out sideways, and start to push away the very respect and closeness you are reaching for.\",\r\n    emotional:\"Emotionally, it can show up as touchiness about criticism, comparison with others, or a restless sense that you are only as good as your last achievement.\",\r\n    relational:\"Relationally, it often turns into criticism of the people around you, competing with colleagues, friends, or family, defensiveness when questioned, or needing to be right and to be the one who matters most in the room.\",\r\n    close:\"When this need drives a person, it tends to mean they are ambitious, principled, and high-achieving, while under pressure leaning toward comparison, criticism, and a hunger for recognition. Seeing it lets you choose connection over winning.\"},\r\n  competence:{core:\"being driven by Competence means you need to feel genuinely capable at the things you do, regardless of who's watching. You tend to feel most yourself when you're skilled at something and know it, and most unsettled when you're doing something poorly, even something that doesn't much matter to anyone else.\",\r\n    daily:\"In daily life, you often want real evidence, to yourself, that you're good at what you spend your time and effort on. There's a quiet satisfaction in doing something well that has nothing to do with anyone noticing. Being merely average at something you care about can nag at you longer than it probably should.\",\r\n    rel:\"This shows up in how you approach parenting, your work, your hobbies, and the things you take on for the people close to you. You want to actually be good at the roles you hold, not just show up for them.\",\r\n    strength:\"This is a real strength. You build genuine skill through practice and effort, and you take real, private satisfaction in mastery. You tend to be someone others can rely on precisely because your competence isn't performed for an audience.\",\r\n    strain:\"But under strain, the need to feel capable can tip into avoiding anything you're not already good at.\",\r\n    emotional:\"Emotionally, this can show up as harsh self-judgement after a mistake, a reluctance to attempt things you might not excel at right away, or letting your sense of your own worth ride on how well you performed that day.\",\r\n    relational:\"Relationally, it often turns into being hard on yourself in ways the people around you can feel, quitting things that don't come easily rather than staying with the discomfort of being a beginner, or struggling to take feedback even from people who care about you.\",\r\n    close:\"When this need drives a person, it tends to mean they're capable, self-reliant, and genuinely skilled, while under pressure leaning toward perfectionism and a sense of worth tied to performance. Knowing that is what lets mastery stay satisfying rather than becoming another way to measure whether you're enough.\"},\r\n  connection:{core:\"being driven by Connection means closeness is oxygen to you. You tend to feel most yourself when you are deeply joined to the people you love, known, wanted, and on the same side, and most unsettled when you feel distant, shut out, or alone even in a room full of people.\",\r\n    daily:\"In daily life, you often need real contact, conversation that goes somewhere, warmth, affection, the sense of being truly known. Surface-level coexistence is not enough for you; you feel the difference between living alongside someone and being close to them.\",\r\n    rel:\"This shows up across your closest relationships, not just a romantic one. Closeness is the whole point for you, not a bonus. You give generously, you pick up on the moods of the people you love, and you feel distance long before most people would notice it.\",\r\n    strength:\"This is a real strength. You are often the warmth and the glue, the one who keeps the emotional thread alive, who reaches, repairs, and refuses to let closeness go cold.\",\r\n    strain:\"But under strain, the need for closeness can turn into the very thing that pushes closeness away.\",\r\n    emotional:\"Emotionally, this can show up as a persistent worry about where you stand with the people close to you, a fear of being left or shut out, or losing track of your own needs in your focus on the other person.\",\r\n    relational:\"Relationally, it often turns into pressure, pursuing someone when they pull back, giving in order to be loved and then keeping score, or using guilt and withdrawal to try to draw people back in.\",\r\n    close:\"When this need drives a person, it tends to mean they are warm, attuned, and devoted, while under pressure leaning toward pursuit, over-giving, and reaching for reassurance more than the moment calls for. Understanding it helps you ask for closeness in ways that actually bring it.\"},\r\n  growth:{core:\"being driven by Growth means you need to be becoming. You tend to feel most yourself when you are learning, stretching, and moving forward, and most uneasy when you feel stuck, stagnant, or stalled. Standing still reads to you almost like going backwards.\",\r\n    daily:\"In daily life, you often need challenge, progress, and the sense that you are developing, in skill, understanding, character, or all three. You are drawn to the version of yourself just out of reach, and you measure a good stretch of time by how much you grew in it.\",\r\n    rel:\"This shows up across your closest relationships and commitments. You need the people and pursuits in your life to keep developing, not plateau, and you can feel restless around people, or in situations, that feel static, even comfortable ones.\",\r\n    strength:\"This is a real strength. You bring momentum, curiosity, and a refusal to let things, including your relationships, go stale or unexamined.\",\r\n    strain:\"But under strain, the drive to grow can pull you inward and away from the people around you.\",\r\n    emotional:\"Emotionally, it can show up as frustration, self-criticism, or a hard-to-satisfy sense that you and your life should be further along than they are.\",\r\n    relational:\"Relationally, it often turns into growing in a direction that quietly leaves the people close to you behind, retreating into your own projects and becoming hard to reach, or blaming your circumstances when the real restlessness is inside you.\",\r\n    close:\"When this need drives a person, it tends to mean they are curious, self-aware, and evolving, while under pressure leaning toward detachment and restlessness. Knowing it lets you grow in a way that includes the people you love.\"},\r\n  purpose:{core:\"being driven by Purpose means you need your life to mean something beyond itself. You tend to feel most yourself when you are contributing to something larger, a cause, a calling, a difference made, and most hollow when life feels like it is only about getting through the days.\",\r\n    daily:\"In daily life, you often need to feel that what you do matters, that you are giving, building, or serving something worthwhile. Comfort alone does not satisfy you; you need a sense of mission, a reason that organises the effort.\",\r\n    rel:\"This shows up across your closest relationships. You want the people close to you to share, or at least support, your sense of what your life is for, and you want those relationships to be part of something meaningful rather than a retreat from it.\",\r\n    strength:\"This is a real strength. You bring depth, direction, and a horizon larger than the day-to-day. You are often the one who reminds the people around you why any of it matters.\",\r\n    strain:\"But under strain, the mission can swallow the very people it was meant to be in service of.\",\r\n    emotional:\"Emotionally, it can show up as a heaviness, a sense of never doing enough, or guilt when you rest, as though your worth depends on what you give.\",\r\n    relational:\"Relationally, it often turns into the cause crowding out the people closest to you, giving so much to others that there is little left for home, or finding your meaning so far outside your everyday relationships that they start to feel small by comparison.\",\r\n    close:\"Seeing it lets you bring the people you love inside the meaning, rather than leaving them outside it.\"}\r\n};\r\n\r\nconst NEED_SHORT={certainty:\"steadiness and safety\",autonomy:\"self-direction and freedom\",variety:\"aliveness and room to move\",significance:\"mattering and being respected\",competence:\"mastery and being capable\",connection:\"closeness and belonging\",growth:\"the pull to keep becoming\",purpose:\"meaning beyond the self\"};\r\nconst NEED_GIFT={certainty:\"steadiness and follow-through\",autonomy:\"decisiveness and self-possession\",variety:\"energy, play, and freshness\",significance:\"drive, standards, and ambition\",competence:\"real skill and reliability\",connection:\"warmth and attunement\",growth:\"momentum and curiosity\",purpose:\"depth and direction\"};\r\nconst NEED_BEHAVIOUR={certainty:\"having things settled and predictable\",autonomy:\"doing it your own way, on your own terms\",variety:\"something new and stimulating\",significance:\"being recognised and thought well of\",competence:\"being genuinely good at it\",connection:\"being close to the people who matter\",growth:\"stretching and getting better\",purpose:\"contributing to something that matters\"};\r\n\r\n\/* ---- interaction layer: what specific pairs of strong needs produce ---- *\/\r\nfunction pairKey(a,b){return [a,b].sort().join(\"|\");}\r\nconst INTERACTIONS={\r\n  \"autonomy|connection\":{title:\"Closeness and separateness, both at once\",\r\n    body:`You carry two needs that pull in genuinely different directions: a deep need for Connection, to be close and joined to the people you love, and a strong need for Autonomy, to remain your own person, self-directed and free. Most people lean clearly one way. You need both, strongly, and that's its own particular way to be built.\\n\\nAt your best, this makes you someone who can be deeply committed without disappearing into a relationship, present and close, yet still unmistakably yourself.\\n\\nThe cost shows up under strain. When you feel crowded, your Autonomy pulls you to withdraw and reclaim space, exactly when your Connection need most wants contact. So you can end up pushing away the very closeness you're aching for, then feeling the distance you just created.`},\r\n  \"significance|competence\":{title:\"Mattering, and mastery\",\r\n    body:`Two of your strongest needs are close cousins often mistaken for one thing: Competence, the private satisfaction of being genuinely good at something, and Significance, being seen and respected for it. You need both, to actually be capable, and for it to land with other people.\\n\\nWhen these run together well, they reinforce each other: real skill earns real regard, and that regard frees you to keep building skill.\\n\\nThe watch-point is when the two come apart. If your sense of being good enough starts riding entirely on how your last effort was received, mastery stops being satisfying in itself. The antidote is the part of Competence that needs no audience.`},\r\n  \"certainty|variety\":{title:\"Steadiness and aliveness, pulling against each other\",\r\n    body:`You carry a real need for Certainty, stability and ground that holds still, alongside a real need for Variety, novelty and room to move. These two genuinely pull against each other, and holding both strongly means part of you is often reaching for the opposite of what another part just reached for.\\n\\nHandled well, this is a rare kind of balance: you can build something stable and keep it from going stale.\\n\\nThe strain is internal as much as external. You can settle into a secure stretch of life and feel it flatten into something airless, or chase enough novelty that you undermine the very stability you also need. The work isn't to resolve the tension, it can't be, but to notice which one is starving and feed it deliberately.`},\r\n  \"growth|purpose\":{title:\"Becoming, and meaning\",\r\n    body:`Two of your strongest pulls point past the day-to-day: Growth, the drive to keep developing, and Purpose, the need for your life to mean something beyond itself. Together they make you a reacher, someone rarely content with things simply as they are.\\n\\nAt best, this gives your life real momentum and direction at once, growth in service of something that matters.\\n\\nThe risk is subtle. Both needs point outward and forward, which can quietly leave the present, and the people in it, feeling like a waystation on the road to something better. The discipline for someone built like you is learning to let some things be enough as they are.`},\r\n  \"significance|connection\":{title:\"Being respected, and being close\",\r\n    body:`Two of your strongest needs are Significance, to be recognised and respected, and Connection, to be close and known. Both are about other people, but they ask for different things: one wants to be admired, the other wants to be held.\\n\\nWhen both are met, you get relationships where you feel both respected and loved, seen for what you do and cherished for who you are.\\n\\nThe tension shows when they compete. You might reach for recognition when what you actually needed was closeness, and come away from the same interaction feeling subtly unmet, unsure which need went hungry.`},\r\n  \"autonomy|certainty\":{title:\"Freedom, and firm ground\",\r\n    body:`You need Autonomy, real self-direction, and Certainty, stability and predictable ground, both strongly. These aren't opposites exactly, but they pull differently: one wants freedom to choose, the other wants the reassurance of the known.\\n\\nAt your best, you build a life that is both self-authored and secure.\\n\\nThe friction comes when security seems to require handing over control, or when freedom seems to threaten stability. The resolution is usually about authored stability: structures you chose, rather than ones imposed on you. The same routine feels completely different depending on whether it was your decision.`},\r\n  \"certainty|connection\":{title:\"Safe ground, and closeness\",\r\n    body:`You carry a strong need for Certainty and a strong need for Connection. For someone built this way, closeness and safety are deeply linked: you tend to open most fully when the ground feels solid, and you can find yourself holding back when it doesn't.\\n\\nAt your best, this makes you a genuinely dependable presence in people's lives, warm and steady at once, the sort of person others trust with the things that matter.\\n\\nThe strain shows when uncertainty creeps in. Rather than reaching for closeness, you can start managing it, seeking reassurance, or bracing. The work is learning to keep loving while the ground is still unsteady, because waiting for full certainty before fully connecting means a lot of love never gets expressed.`},\r\n  \"competence|growth\":{title:\"Mastery, and momentum\",\r\n    body:`Two of your strongest needs are Competence, being genuinely good at things, and Growth, the pull to keep developing. These are cousins, but they want different things: one wants depth and mastery, the other wants movement and the next stretch.\\n\\nWhen they work together you get something formidable, real skill that keeps compounding rather than plateauing.\\n\\nThe tension is between going deep and going wide. Growth pulls you toward the next new thing before Competence has finished mastering the current one, and Competence can keep you polishing something long after Growth has lost interest. Noticing which one is talking is the useful skill here.`},\r\n  \"connection|purpose\":{title:\"The people close to you, and the cause\",\r\n    body:`Two of your strongest needs are Connection, closeness with the people who matter, and Purpose, contributing to something larger than yourself. Both are outward-facing, but they pull on the same finite supply of you.\\n\\nAt your best, this makes you someone whose care extends well beyond their own circle, and whose sense of mission is grounded in real relationships rather than abstraction.\\n\\nThe strain comes when the cause and the people compete. Purpose is often easier to serve, because it says thank you and has boundaries, where closeness is slower, repetitive, and rarely acknowledged. The question worth returning to is whether the people closest to you are part of the purpose or the cost of it.`}\r\n};\r\nfunction genericInteraction(a,b){\r\n  return {title:`Where ${NEED_LABEL[a]} meets ${NEED_LABEL[b]}`,\r\n    body:`Two of your strongest needs are ${NEED_LABEL[a]} (${NEED_SHORT[a]}) and ${NEED_LABEL[b]} (${NEED_SHORT[b]}). Carrying both this strongly shapes a lot of how you move through life.\\n\\nWhen they work together, each lends the other something: ${NEED_GIFT[a]} alongside ${NEED_GIFT[b]}.\\n\\nWhen you're under strain, though, the two can compete for the same energy and attention, and you can end up feeling that meeting one has cost you the other. Noticing which of the two is driving in any given moment is the quiet skill worth building here.`};\r\n}\r\nfunction getInteraction(a,b){return INTERACTIONS[pairKey(a,b)]||genericInteraction(a,b);}\r\n\r\n\/* ---- tie-breakers, trimmed to two pairs ---- *\/\r\nconst TIEBREAKERS={\r\n  \"autonomy|certainty\":[\r\n    {setup:\"You're offered two versions of the same job. One is secure and clearly defined: you'll always know what's expected and where you stand. The other pays the same but lets you set your own approach and hours, with far less structure around you. Which pulls you more?\",\r\n     a:\"The self-directed one. Room to do it my way matters more.\",b:\"The secure, clearly defined one. Knowing where I stand matters more.\"}],\r\n  \"autonomy|connection\":[\r\n    {setup:\"After a hard week, part of you wants your own space to reset, no demands, no one to answer to. Another part wants to be close to the people you love. When you can only have one that evening, which do you reach for?\",\r\n     a:\"My own space to reset.\",b:\"Closeness with the people I love.\"}],\r\n  \"competence|significance\":[\r\n    {setup:\"You can either be widely praised for work that you privately know was only okay, or do something to a standard you're genuinely proud of that almost no one notices. Which would you choose?\",\r\n     a:\"The private mastery, even if no one notices.\",b:\"The recognition, even if the work was only okay.\"}],\r\n  \"certainty|variety\":[\r\n    {setup:\"Your ideal ordinary week: one is calm, familiar, and predictable. The other is full of new things, less predictable, more stimulating but less settled. Which is closer to what you'd choose?\",\r\n     a:\"The calm, predictable week.\",b:\"The stimulating, less predictable one.\"}],\r\n  \"growth|purpose\":[\r\n    {setup:\"You have time for one meaningful pursuit. One would stretch and develop you, making you sharper and more capable, but mostly benefits you. The other contributes to a cause or people beyond you, but wouldn't develop you much. Which do you choose?\",\r\n     a:\"The one that develops me.\",b:\"The one that contributes beyond me.\"}],\r\n  \"connection|significance\":[\r\n    {setup:\"At a gathering, you could either have one deep, warm conversation with someone you feel close to, or be the person others clearly admire and look up to across the room. Which would leave you more satisfied?\",\r\n     a:\"The one deep, close conversation.\",b:\"Being the one others admire.\"}],\r\n  \"connection|purpose\":[\r\n    {setup:\"Your cause or calling asks for a lot of your time this season, time that would otherwise go to the people closest to you. Which pull is stronger?\",\r\n     a:\"The people closest to me come first.\",b:\"The cause needs me right now.\"}],\r\n  \"growth|variety\":[\r\n    {setup:\"You're drawn to something new. One version is exciting but shallow, a fresh experience for its own sake. The other is a demanding challenge that would genuinely develop you but isn't as immediately fun. Which do you reach for?\",\r\n     a:\"The demanding, developing challenge.\",b:\"The fresh, exciting experience.\"}],\r\n  \"competence|growth\":[\r\n    {setup:\"Would you rather deepen a skill you're already good at until it's truly excellent, or keep starting new things and developing broadly, staying a learner?\",\r\n     a:\"Deepen what I'm already good at, toward excellence.\",b:\"Keep starting new things and developing broadly.\"}],\r\n  \"certainty|connection\":[\r\n    {setup:\"Which would unsettle you more: a stretch where everything is close and warm with people but nothing is predictable, or a stretch where everything is stable and settled but a bit emotionally distant?\",\r\n     a:\"The unpredictable stretch would unsettle me more.\",b:\"The emotionally distant stretch would unsettle me more.\"}],\r\n  \"certainty|competence\":[\r\n    {setup:\"You can stick with what you already do reliably well, or take on something you'd have to struggle at for a while before getting good. Which appeals more?\",\r\n     a:\"Stick with what I reliably do well.\",b:\"Take on the harder thing and master it.\"}],\r\n  \"certainty|significance\":[\r\n    {setup:\"You can have a steady, secure situation where you quietly get on with things, or a higher-profile one that earns you real recognition but comes with more uncertainty. Which pulls you more?\",\r\n     a:\"The steady, secure one.\",b:\"The recognised, higher-profile one.\"}],\r\n  \"certainty|growth\":[\r\n    {setup:\"You can stay somewhere comfortable and known, or move into something that would stretch and develop you but means giving up the settled ground you have. Which do you choose?\",\r\n     a:\"Stay on settled ground.\",b:\"Move into the stretch.\"}],\r\n  \"certainty|purpose\":[\r\n    {setup:\"You could keep things secure and manageable, or throw yourself into a cause that matters deeply but would upend your stability for a while. Which pull is stronger?\",\r\n     a:\"Keep things secure and manageable.\",b:\"Throw myself into the cause.\"}],\r\n  \"autonomy|variety\":[\r\n    {setup:\"Which matters more to you: doing things entirely your own way even if that means a fairly repetitive routine, or a life full of variety even if it means fitting in with other people's plans and pace?\",\r\n     a:\"My own way, even if repetitive.\",b:\"Plenty of variety, even on others' terms.\"}],\r\n  \"autonomy|competence\":[\r\n    {setup:\"You could do something your own way but never quite excellently, or reach real mastery by following someone else's proven method to the letter. Which do you pick?\",\r\n     a:\"My own way, even if never quite excellent.\",b:\"Real mastery, even by someone else's method.\"}],\r\n  \"autonomy|growth\":[\r\n    {setup:\"You can develop fastest under a demanding mentor or programme that dictates the path, or grow more slowly but entirely on your own terms. Which do you choose?\",\r\n     a:\"Grow on my own terms, even if slower.\",b:\"Grow fastest, even under someone else's direction.\"}],\r\n  \"autonomy|significance\":[\r\n    {setup:\"Which would bother you more: doing something impressive but having to do it exactly how someone else dictates, or doing something entirely your own way that no one particularly notices?\",\r\n     a:\"Being dictated to would bother me more.\",b:\"Going unnoticed would bother me more.\"}],\r\n  \"autonomy|purpose\":[\r\n    {setup:\"You could pursue a cause that matters deeply to you but would tie you to other people's timelines and demands, or keep full freedom over your days at the cost of that bigger sense of mission. Which pulls you more?\",\r\n     a:\"Keep full freedom over my days.\",b:\"Pursue the cause, timelines and all.\"}],\r\n  \"significance|variety\":[\r\n    {setup:\"Which would you find harder to give up: constant novelty and new experiences, or being genuinely respected and looked up to?\",\r\n     a:\"I'd find giving up respect harder.\",b:\"I'd find giving up novelty harder.\"}],\r\n  \"competence|variety\":[\r\n    {setup:\"You could keep trying lots of new things without ever going deep, or go deep on one thing until you truly master it, at the cost of all that novelty. Which appeals more?\",\r\n     a:\"Go deep and master one.\",b:\"Keep trying lots of new things.\"}],\r\n  \"connection|variety\":[\r\n    {setup:\"An evening of something new and exciting, or easy familiar closeness with people you love. When you can only have one, which do you reach for?\",\r\n     a:\"Familiar closeness.\",b:\"Something new and exciting.\"}],\r\n  \"purpose|variety\":[\r\n    {setup:\"You could fill your time with varied, stimulating experiences, or pour it into one meaningful cause that leaves little room for novelty. Which pulls you more?\",\r\n     a:\"One meaningful cause.\",b:\"Varied, stimulating experiences.\"}],\r\n  \"growth|significance\":[\r\n    {setup:\"You could be recognised now for what you can already do, or spend that same time getting quietly better with no recognition yet. Which do you choose?\",\r\n     a:\"Quietly getting better, recognition later or never.\",b:\"Recognition now for what I can already do.\"}],\r\n  \"purpose|significance\":[\r\n    {setup:\"Which would matter more to you: being personally respected and thought well of, or knowing your work genuinely helped something bigger than you, even anonymously?\",\r\n     a:\"Knowing my work helped, even anonymously.\",b:\"Being personally respected.\"}],\r\n  \"competence|connection\":[\r\n    {setup:\"Which would leave you emptier: being highly skilled but a little disconnected from people, or deeply connected but never quite mastering the things you care about?\",\r\n     a:\"Being disconnected would leave me emptier.\",b:\"Never mastering things would leave me emptier.\"}],\r\n  \"competence|purpose\":[\r\n    {setup:\"Which would matter more: being genuinely masterful at what you do, or knowing what you do serves something bigger, even if you're not the best at it?\",\r\n     a:\"Being genuinely masterful.\",b:\"Serving something bigger.\"}],\r\n  \"connection|growth\":[\r\n    {setup:\"Which would you find harder: a season of deep closeness where you don't develop much, or a season of rapid growth where you're a bit isolated?\",\r\n     a:\"The isolation would be harder than slow growth.\",b:\"Not growing would be harder than isolation.\"}]\r\n};\r\nfunction cap(s){return s.charAt(0).toUpperCase()+s.slice(1);}\r\nfunction genericTiebreak(a,b){\r\n  return [{setup:`You've got time or energy for one, not both: ${NEED_BEHAVIOUR[a]}, or ${NEED_BEHAVIOUR[b]}. Which do you protect?`,\r\n    a:cap(NEED_BEHAVIOUR[a])+\".\",b:cap(NEED_BEHAVIOUR[b])+\".\"}];\r\n}\r\nfunction tiebreakFor(a,b){const s=[a,b].sort();return TIEBREAKERS[s.join(\"|\")]||genericTiebreak(s[0],s[1]);}\r\n\r\nconst TH={needStrong:3.5,coPriority:0.4,sufficiency:2.5,tieBand:0.5,tieNudge:0.35};\r\n\r\n\/* ---------- state ---------- *\/\r\nconst STATE={name:\"\",codeName:\"\",data:{needs:{},passion:{}},consent:null,tieNudge:{},tieResult:{}};\r\n\r\nlet app=document.getElementById(\"tnp-app\");\r\nif(!app){app=document.createElement(\"div\");app.id=\"tnp-app\";app.className=\"wrap\";\r\n  const sc=document.getElementsByTagName(\"script\");\r\n  ((sc.length?sc[sc.length-1].parentNode:null)||document.body).appendChild(app);}\r\n\r\nfunction makeCode(){const ch=\"ACDEFGHJKMNPQRTUVWXY2346789\";let c=\"\";for(let i=0;i<4;i++)c+=ch[Math.floor(Math.random()*ch.length)];return \"TNP-\"+c;}\r\nfunction deDash(s){return s.replace(\/\\s*[\u2014\u2013]\\s*\/g,\", \").replace(\/,\\s*,\/g,\",\").replace(\/,\\s*\\.\/g,\".\").replace(\/ ,\/g,\",\");}\r\nfunction el(html){const d=document.createElement(\"div\");d.innerHTML=deDash(html.trim());return d.firstChild;}\r\nfunction show(node){app.innerHTML=\"\";const s=document.createElement(\"div\");s.className=\"screen active\";s.appendChild(node);app.appendChild(s);window.scrollTo(0,0);}\r\nfunction nm(){return STATE.name||\"there\";}\r\nfunction shuffle(a){for(let i=a.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));[a[i],a[j]]=[a[j],a[i]];}return a;}\r\nfunction mean(arr){const a=arr.filter(x=>typeof x===\"number\");return a.length?a.reduce((s,x)=>s+x,0)\/a.length:0;}\r\nfunction round1(x){return Math.round(x*10)\/10;}\r\nfunction paras(t){return t.split(\/\\n\\n\/).map(p=>`<p>${p}<\/p>`).join(\"\");}\r\n\r\n\/* ---------- screens ---------- *\/\r\nfunction startWelcome(){\r\n  show(el(`<div class=\"card\">\r\n    <div class=\"kicker\">The Needs Profile<\/div>\r\n    <h1>What's actually driving how you live?<\/h1>\r\n    <p class=\"muted\" style=\"margin-top:14px\">What you see on the surface, the friction, the boredom, the distance, the dissatisfaction, is rarely the real story. Underneath is usually a need being met, or unmet, and until you can see that, you keep solving the wrong problem.<\/p>\r\n    <p>We're all driven by eight core needs. You have all eight. What differs from person to person is the order in which they drive behaviour, and that order shapes more of life than most people realise.<\/p>\r\n    <p>Here's the harder part. We tend to repeat behaviour that meets these needs, even when the behaviour is costing us, because somewhere underneath it's still delivering. That's why patterns don't shift through willpower. They shift when you can see what they were trying to give you.<\/p>\r\n    <div class=\"land\">The point is not the result. The point is what the result lets you see.<\/div>\r\n    <p>This takes about seven minutes. Thirty-two statements, a few either\/or choices at the end, and a detailed profile written for you.<\/p>\r\n    <p class=\"muted\">Answer honestly, not how you'd like to be. The result is only as useful as the truth you bring to it.<\/p>\r\n    <div class=\"btn-row\"><button class=\"btn\" id=\"tnpStart\">Begin<\/button><\/div>\r\n  <\/div>`));\r\n  document.getElementById(\"tnpStart\").onclick=startSetup;\r\n}\r\nfunction startSetup(){\r\n  const node=el(`<div class=\"card\">\r\n    <div class=\"kicker\">First, a name<\/div>\r\n    <h2>What should we call you?<\/h2>\r\n    <p class=\"muted\" style=\"margin-top:8px\">Just so the profile can speak to you directly. Your name stays on this device and is never sent anywhere.<\/p>\r\n    <div class=\"field\" style=\"margin-top:16px\"><label>First name<\/label><input type=\"text\" id=\"tnpNm\" maxlength=\"24\" placeholder=\"e.g. Jordan\"><\/div>\r\n    <div class=\"btn-row\"><button class=\"btn\" id=\"tnpGo\" disabled>Continue<\/button><\/div>\r\n  <\/div>`);\r\n  show(node);\r\n  const inp=node.querySelector(\"#tnpNm\"),btn=node.querySelector(\"#tnpGo\");\r\n  inp.oninput=()=>{STATE.name=inp.value.trim();btn.disabled=!STATE.name;};\r\n  btn.onclick=consentScreen;\r\n}\r\nconst CONSENT_TERMS=[\r\n  \"This is a tool for reflection. It is not a diagnosis, not a psychological assessment, and not a substitute for professional support.\",\r\n  \"It is not a psychometric test. Its results are insights to consider, not measurements or verdicts.\",\r\n  \"Taking part is voluntary. You may stop at any time.\",\r\n  \"Your name stays on this device and is never sent anywhere. Only an anonymous record that a profile was completed, along with the scores themselves, is kept.\",\r\n  \"For the best experience, use a laptop, tablet, or larger screen if you can. The results are detailed and read more easily that way.\"\r\n];\r\nfunction consentScreen(){\r\n  const node=el(`<div class=\"card\">\r\n    <div class=\"kicker\">Before you begin, ${nm()}<\/div>\r\n    <h2>A few things to agree to.<\/h2>\r\n    <ul class=\"consent-list\">${CONSENT_TERMS.map(t=>`<li>${t}<\/li>`).join(\"\")}<\/ul>\r\n    <label class=\"consent-check\" id=\"tnpCbox\"><span class=\"cbox-tick\" id=\"tnpCtick\"><\/span><span>I have read and understood the above, and I agree to continue.<\/span><\/label>\r\n    <div class=\"btn-row\"><button class=\"btn\" id=\"tnpConsent\" disabled>I agree, begin<\/button><\/div>\r\n  <\/div>`);\r\n  show(node);\r\n  let checked=false;\r\n  const box=node.querySelector(\"#tnpCbox\"),tick=node.querySelector(\"#tnpCtick\"),btn=node.querySelector(\"#tnpConsent\");\r\n  box.onclick=()=>{checked=!checked;box.classList.toggle(\"on\",checked);tick.innerHTML=checked?\"&#10003;\":\"\";btn.disabled=!checked;\r\n    if(checked&&!STATE.codeName){STATE.codeName=makeCode();STATE.consent={code:STATE.codeName,when:new Date().toISOString()};}};\r\n  btn.onclick=beginPass;\r\n}\r\n\r\n\/* ---------- question queue ---------- *\/\r\nlet QUEUE=[],QPOS=0;\r\nfunction buildQueue(){\r\n  const q=[];\r\n  let items=[];\r\n  NEED_KEYS.forEach(k=>NEEDS[k].forEach(it=>items.push({type:\"agree\",section:\"needs\",need:k,id:it[0],text:it[1],rev:it[2]})));\r\n  shuffle(items);\r\n  q.push({banner:\"Part 1 of 2 &middot; About you\"});\r\n  q.push(...items);\r\n  q.push({banner:\"Part 2 of 2 &middot; In your own words\"});\r\n  PASSION.forEach(p=>q.push({type:\"multi\",section:\"passion\",id:p[0],text:p[1],options:p[2]}));\r\n  return q;\r\n}\r\nfunction beginPass(){QUEUE=buildQueue();QPOS=0;renderStep();}\r\nfunction renderStep(){\r\n  if(QPOS>=QUEUE.length){startTiebreakers();return;}\r\n  const s=QUEUE[QPOS];\r\n  if(s.banner!==undefined)return renderBanner(s);\r\n  if(s.type===\"agree\")return renderScale(s);\r\n  if(s.type===\"multi\")return renderMulti(s);\r\n  QPOS++;renderStep();\r\n}\r\nfunction progressHeader(){\r\n  const items=QUEUE.filter(s=>s.type);\r\n  const done=QUEUE.slice(0,QPOS).filter(s=>s.type).length;\r\n  const pct=items.length?Math.round(done\/items.length*100):0;\r\n  return `<div class=\"prog\"><div class=\"prog-bar\"><div class=\"prog-fill\" style=\"width:${pct}%\"><\/div><\/div><\/div>`;\r\n}\r\nfunction renderBanner(step){\r\n  const n=el(`<div>${progressHeader()}<div class=\"card\" style=\"margin-top:14px;text-align:center\"><div class=\"pill\">${nm()}<\/div><h2>${step.banner}<\/h2><div class=\"btn-row\" style=\"justify-content:center\"><button class=\"btn\" id=\"tnpNext\">Continue<\/button><\/div><\/div><\/div>`);\r\n  show(n);n.querySelector(\"#tnpNext\").onclick=nextStep;\r\n}\r\nfunction renderScale(step){\r\n  const cur=STATE.data[step.section][step.id];\r\n  const node=el(`<div>${progressHeader()}<div class=\"qcard\" style=\"margin-top:10px\"><div class=\"qtext\">${step.text}<\/div><div class=\"scale\" id=\"tnpScale\"><\/div><div class=\"btn-row\" style=\"margin-top:18px\">${QPOS>0?'<button class=\"btn-back\" id=\"tnpBack\">Back<\/button>':''}<\/div><\/div><\/div>`);\r\n  show(node);\r\n  const wrap=node.querySelector(\"#tnpScale\");\r\n  AGREE.forEach((lab,i)=>{\r\n    const b=el(`<button><span class=\"dot\" style=\"${cur===i?'background:var(--terra);border-color:var(--terra)':''}\"><\/span><span>${lab}<\/span><\/button>`);\r\n    b.onclick=()=>{STATE.data[step.section][step.id]=i;nextStep();};\r\n    wrap.appendChild(b);\r\n  });\r\n  const bk=node.querySelector(\"#tnpBack\");if(bk)bk.onclick=prevStep;\r\n}\r\nfunction renderMulti(step){\r\n  if(!STATE.data.passion[step.id])STATE.data.passion[step.id]={picks:[]};\r\n  const store=STATE.data.passion[step.id];\r\n  const node=el(`<div>${progressHeader()}<div class=\"qcard\" style=\"margin-top:10px\"><div class=\"qtext\">${step.text}<\/div><p class=\"note\" style=\"margin:-8px 0 14px\">Choose as many as feel true.<\/p><div class=\"opts\" id=\"tnpOpts\"><\/div><div class=\"btn-row\" style=\"margin-top:16px\"><button class=\"btn\" id=\"tnpNext\">${QPOS>=QUEUE.length-1?'Finish':'Next'}<\/button>${QPOS>0?'<button class=\"btn-back\" id=\"tnpBack\">Back<\/button>':''}<\/div><\/div><\/div>`);\r\n  show(node);\r\n  const wrap=node.querySelector(\"#tnpOpts\");\r\n  step.options.forEach(o=>{\r\n    const sel=store.picks.includes(o[0]);\r\n    const b=el(`<button class=\"opt ${sel?'sel':''}\"><span class=\"tick\">${sel?'&#10003;':''}<\/span><span>${o[1]}<\/span><\/button>`);\r\n    b.onclick=()=>{\r\n      const i=store.picks.indexOf(o[0]);const now=i<0;\r\n      if(i>=0)store.picks.splice(i,1);else store.picks.push(o[0]);\r\n      b.classList.toggle(\"sel\",now);b.querySelector(\".tick\").innerHTML=now?\"&#10003;\":\"\";\r\n    };\r\n    wrap.appendChild(b);\r\n  });\r\n  node.querySelector(\"#tnpNext\").onclick=nextStep;\r\n  const bk=node.querySelector(\"#tnpBack\");if(bk)bk.onclick=prevStep;\r\n}\r\nfunction nextStep(){QPOS++;renderStep();}\r\nfunction prevStep(){if(QPOS>0){QPOS--;while(QPOS>0&&QUEUE[QPOS].type===undefined)QPOS--;}renderStep();}\r\n\r\n\/* ---------- tie-breakers ---------- *\/\r\nlet TIE_QUEUE=[],TIE_POS=0;\r\nfunction rawNeedScores(){\r\n  const need={};\r\n  NEED_KEYS.forEach(k=>{\r\n    const vals=NEEDS[k].map(it=>{const v=STATE.data.needs[it[0]];if(typeof v!==\"number\")return undefined;return it[2]?5-v:v;});\r\n    need[k]=round1(mean(vals));\r\n  });\r\n  return need;\r\n}\r\nfunction detectTies(need){\r\n  const meaningful=NEED_KEYS.filter(k=>need[k]>=2.5).sort((a,b)=>need[b]-need[a]);\r\n  const pairs=[];\r\n  for(let i=0;i<meaningful.length;i++)for(let j=i+1;j<meaningful.length;j++){\r\n    if(Math.abs(need[meaningful[i]]-need[meaningful[j]])<=TH.tieBand)pairs.push([meaningful[i],meaningful[j]]);\r\n  }\r\n  pairs.sort((p,q)=>Math.abs(need[p[0]]-need[p[1]])-Math.abs(need[q[0]]-need[q[1]]));\r\n  return pairs.slice(0,2);\r\n}\r\nfunction startTiebreakers(){\r\n  const ties=detectTies(rawNeedScores());\r\n  if(!ties.length){renderReport();return;}\r\n  TIE_QUEUE=[];\r\n  ties.forEach(pair=>{\r\n    const sorted=[...pair].sort();\r\n    tiebreakFor(sorted[0],sorted[1]).forEach(s=>TIE_QUEUE.push({pair:sorted,scenario:s}));\r\n  });\r\n  TIE_POS=0;\r\n  const n=el(`<div><div class=\"card\" style=\"text-align:center\">\r\n    <div class=\"pill\">${nm()}<\/div><h2>Nearly there.<\/h2>\r\n    <p style=\"margin-top:12px\">A few of your needs came out very close to each other, too close for the questions so far to tell which really leads.<\/p>\r\n    <p class=\"muted\">Here are a couple of either\/or choices to sort that out. There are no right answers, just go with your gut.<\/p>\r\n    <div class=\"btn-row\" style=\"justify-content:center\"><button class=\"btn\" id=\"tnpTie\">Continue<\/button><\/div><\/div><\/div>`);\r\n  show(n);n.querySelector(\"#tnpTie\").onclick=renderTie;\r\n}\r\nfunction renderTie(){\r\n  if(TIE_POS>=TIE_QUEUE.length){finishTiebreakers();return;}\r\n  const item=TIE_QUEUE[TIE_POS],s=item.scenario,total=TIE_QUEUE.length;\r\n  const node=el(`<div><div class=\"prog\"><div class=\"prog-bar\"><div class=\"prog-fill\" style=\"width:${Math.round(TIE_POS\/total*100)}%\"><\/div><\/div><\/div>\r\n    <div class=\"qcard\" style=\"margin-top:10px\"><p class=\"note\" style=\"margin-bottom:10px\">A quick either\/or<\/p>\r\n    <div class=\"qtext\">${s.setup}<\/div><div class=\"scale\" id=\"tnpTieOpts\"><\/div><\/div><\/div>`);\r\n  show(node);\r\n  const wrap=node.querySelector(\"#tnpTieOpts\");\r\n  [[s.a,item.pair[0]],[s.b,item.pair[1]]].forEach(([label,winner])=>{\r\n    const b=el(`<button style=\"align-items:flex-start\"><span class=\"dot\" style=\"margin-top:6px\"><\/span><span>${label}<\/span><\/button>`);\r\n    b.onclick=()=>{\r\n      STATE.tieNudge[winner]=(STATE.tieNudge[winner]||0)+TH.tieNudge;\r\n      const key=item.pair.join(\"|\");\r\n      if(!STATE.tieResult[key])STATE.tieResult[key]={votes:{}};\r\n      STATE.tieResult[key].votes[winner]=(STATE.tieResult[key].votes[winner]||0)+1;\r\n      TIE_POS++;renderTie();\r\n    };\r\n    wrap.appendChild(b);\r\n  });\r\n}\r\nfunction finishTiebreakers(){\r\n  Object.keys(STATE.tieResult).forEach(key=>{\r\n    const v=STATE.tieResult[key].votes,n=key.split(\"|\");\r\n    const v0=v[n[0]]||0,v1=v[n[1]]||0;\r\n    STATE.tieResult[key].winner=v0===v1?null:(v0>v1?n[0]:n[1]);\r\n    STATE.tieResult[key].split=(v0===v1);\r\n  });\r\n  renderReport();\r\n}\r\n\r\n\/* ---------- scoring ---------- *\/\r\nfunction analyse(){\r\n  const need={},suff={},eff={};\r\n  NEED_KEYS.forEach(k=>{\r\n    const vals=NEEDS[k].map(it=>{const v=STATE.data.needs[it[0]];if(typeof v!==\"number\")return undefined;return it[2]?5-v:v;});\r\n    need[k]=round1(mean(vals));\r\n    suff[k]=need[k]>=TH.sufficiency;\r\n    eff[k]=need[k]+Math.min(STATE.tieNudge[k]||0,TH.tieBand*0.9);\r\n  });\r\n  const ranked=NEED_KEYS.map(k=>({need:k,score:need[k],eff:eff[k]})).sort((a,b)=>b.eff-a.eff);\r\n  const co=(ranked[0].score-ranked[1].score)<=TH.coPriority;\r\n  const top=co?[ranked[0].need,ranked[1].need]:[ranked[0].need];\r\n  const passionNeed={};NEED_KEYS.forEach(k=>passionNeed[k]=0);\r\n  PASSION.forEach(pr=>{\r\n    const st=STATE.data.passion[pr[0]];if(!st)return;\r\n    (st.picks||[]).forEach(pk=>{const o=pr[2].find(x=>x[0]===pk);if(!o)return;\r\n      o[2].forEach(t=>{if(passionNeed[t]!==undefined)passionNeed[t]++;});});\r\n  });\r\n  const spread=round1(ranked[0].score-ranked[ranked.length-1].score);\r\n  return {need,suff,ranked,top,co,passionNeed,spread,tieInfo:STATE.tieResult};\r\n}\r\nfunction needBand(s){if(s>=4.0)return \"driving\";if(s>=3.3)return \"strong\";if(s>=2.5)return \"present\";if(s>=1.7)return \"quiet\";return \"background\";}\r\n\r\n\/* ============================================================\r\n   GRAPHICS \u2014 four, each doing real work\r\n   ============================================================ *\/\r\nfunction svgBars(R){\r\n  const W=680,H=340,padL=40,padR=16,padT=18,padB=56;\r\n  const plotW=W-padL-padR,plotH=H-padT-padB,gW=plotW\/NEED_KEYS.length,barW=gW*0.5;\r\n  const y=v=>padT+plotH-(v\/5)*plotH;\r\n  let grid=\"\";\r\n  for(let v=0;v<=5;v++){const yy=y(v);\r\n    grid+=`<line x1=\"${padL}\" y1=\"${yy}\" x2=\"${W-padR}\" y2=\"${yy}\" stroke=\"var(--line-soft)\"\/>`;\r\n    grid+=`<text x=\"${padL-8}\" y=\"${yy+3}\" text-anchor=\"end\" font-size=\"10\" fill=\"var(--ink-faint)\">${v}<\/text>`;}\r\n  const base=y(TH.sufficiency);\r\n  grid+=`<line x1=\"${padL}\" y1=\"${base}\" x2=\"${W-padR}\" y2=\"${base}\" stroke=\"var(--warn)\" stroke-width=\"1.2\" stroke-dasharray=\"5 4\"\/>`;\r\n  grid+=`<text x=\"${W-padR}\" y=\"${base-6}\" text-anchor=\"end\" font-size=\"10\" fill=\"var(--warn)\">baseline<\/text>`;\r\n  let bars=\"\";\r\n  NEED_KEYS.forEach((k,i)=>{\r\n    const gx=padL+i*gW+gW\/2,v=R.need[k];\r\n    const col=R.top.includes(k)?\"var(--terra)\":\"var(--good)\";\r\n    bars+=`<rect x=\"${gx-barW\/2}\" y=\"${y(v)}\" width=\"${barW}\" height=\"${plotH+padT-y(v)}\" rx=\"3\" fill=\"${col}\" opacity=\"${R.suff[k]?1:0.45}\"\/>`;\r\n    bars+=`<text x=\"${gx}\" y=\"${y(v)-6}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"var(--ink-soft)\">${v.toFixed(1)}<\/text>`;\r\n    bars+=`<text x=\"${gx}\" y=\"${H-padB+16}\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"var(--ink-soft)\">${NEED_LABEL[k]}<\/text>`;\r\n  });\r\n  return `<div class=\"chart\"><svg viewBox=\"0 0 ${W} ${H}\" width=\"100%\" font-family=\"Arial,Helvetica,sans-serif\" role=\"img\" aria-label=\"Your eight needs, scored\">${grid}${bars}<\/svg>\r\n    <p class=\"chart-cap\">Each need scored from 0 to 5. Terracotta marks your leading need or needs. Faded bars sit below the baseline that tends to keep a person feeling balanced.<\/p><\/div>`;\r\n}\r\nfunction svgRadar(R){\r\n  const W=560,H=520,cx=280,cy=255,rad=145,labelR=rad+40;\r\n  const n=NEED_KEYS.length,step=360\/n;\r\n  const ang=i=>(-90+i*step)*Math.PI\/180;\r\n  const pt=(i,v)=>{const r=(v\/5)*rad;return [cx+r*Math.cos(ang(i)),cy+r*Math.sin(ang(i))];};\r\n  let grid=\"\";\r\n  for(let lvl=1;lvl<=5;lvl++){\r\n    const pts=NEED_KEYS.map((k,i)=>pt(i,lvl).join(\",\")).join(\" \");\r\n    grid+=`<polygon points=\"${pts}\" fill=\"none\" stroke=\"var(--line)\" stroke-width=\"${lvl===Math.round(TH.sufficiency)?1.4:1}\" ${lvl===3?'stroke-dasharray=\"4 4\"':''}\/>`;\r\n  }\r\n  let spokes=\"\";NEED_KEYS.forEach((k,i)=>{const p=pt(i,5);spokes+=`<line x1=\"${cx}\" y1=\"${cy}\" x2=\"${p[0]}\" y2=\"${p[1]}\" stroke=\"var(--line)\"\/>`;});\r\n  const poly=NEED_KEYS.map((k,i)=>pt(i,R.need[k]).join(\",\")).join(\" \");\r\n  const dots=NEED_KEYS.map((k,i)=>{const p=pt(i,R.need[k]);\r\n    return `<circle cx=\"${p[0]}\" cy=\"${p[1]}\" r=\"4.5\" fill=\"${R.top.includes(k)?'var(--terra-deep)':'var(--terra)'}\"\/>`;}).join(\"\");\r\n  let labels=\"\";\r\n  NEED_KEYS.forEach((k,i)=>{\r\n    const a=ang(i),lx=cx+labelR*Math.cos(a),ly=cy+labelR*Math.sin(a),c=Math.cos(a);\r\n    const anchor=Math.abs(c)<0.3?\"middle\":(c>0?\"start\":\"end\");\r\n    const w=R.top.includes(k)?\"700\":\"600\";\r\n    labels+=`<text x=\"${lx}\" y=\"${ly+4}\" text-anchor=\"${anchor}\" font-size=\"13\" font-weight=\"${w}\" fill=\"${R.top.includes(k)?'var(--terra-deep)':'var(--ink-soft)'}\">${NEED_LABEL[k]}<\/text>`;\r\n  });\r\n  return `<div class=\"chart\"><svg viewBox=\"0 0 ${W} ${H}\" width=\"100%\" font-family=\"Arial,Helvetica,sans-serif\" role=\"img\" aria-label=\"The shape of your needs profile\">\r\n    ${grid}${spokes}<polygon points=\"${poly}\" fill=\"var(--terra)\" fill-opacity=\"0.13\" stroke=\"var(--terra)\" stroke-width=\"2.5\"\/>${dots}${labels}<\/svg>\r\n    <p class=\"chart-cap\">The same scores as a shape. A wide, even shape means your needs are broadly balanced. A shape that spikes hard in one or two directions means those needs are doing most of the driving.<\/p><\/div>`;\r\n}\r\nfunction svgSpread(R){\r\n  const W=680,H=110,padL=28,padR=28,y=52;\r\n  const lo=0,hi=5,x=v=>padL+((v-lo)\/(hi-lo))*(W-padL-padR);\r\n  let s=`<line x1=\"${padL}\" y1=\"${y}\" x2=\"${W-padR}\" y2=\"${y}\" stroke=\"var(--line)\" stroke-width=\"2\"\/>`;\r\n  for(let v=0;v<=5;v++){s+=`<line x1=\"${x(v)}\" y1=\"${y-6}\" x2=\"${x(v)}\" y2=\"${y+6}\" stroke=\"var(--line)\"\/>`;\r\n    s+=`<text x=\"${x(v)}\" y=\"${y+24}\" text-anchor=\"middle\" font-size=\"10\" fill=\"var(--ink-faint)\">${v}<\/text>`;}\r\n  s+=`<line x1=\"${x(TH.sufficiency)}\" y1=\"${y-18}\" x2=\"${x(TH.sufficiency)}\" y2=\"${y+14}\" stroke=\"var(--warn)\" stroke-dasharray=\"4 3\"\/>`;\r\n  const hiS=R.ranked[0].score,loS=R.ranked[R.ranked.length-1].score;\r\n  s+=`<line x1=\"${x(loS)}\" y1=\"${y}\" x2=\"${x(hiS)}\" y2=\"${y}\" stroke=\"var(--terra)\" stroke-width=\"4\" stroke-linecap=\"round\" opacity=\"0.35\"\/>`;\r\n  const seen={};\r\n  R.ranked.forEach(r=>{\r\n    const px=x(r.score);\r\n    const key=Math.round(px);\r\n    seen[key]=(seen[key]||0)+1;\r\n    const off=(seen[key]-1)*9;\r\n    const top=R.top.includes(r.need);\r\n    s+=`<circle cx=\"${px}\" cy=\"${y-off}\" r=\"${top?7:5.5}\" fill=\"${top?'var(--terra-deep)':'var(--terra)'}\" opacity=\"${top?1:0.65}\"\/>`;\r\n  });\r\n  s+=`<text x=\"${x(loS)}\" y=\"${y-30}\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"var(--ink-faint)\">lowest ${loS.toFixed(1)}<\/text>`;\r\n  s+=`<text x=\"${x(hiS)}\" y=\"${y-30}\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"var(--terra-deep)\" font-weight=\"700\">highest ${hiS.toFixed(1)}<\/text>`;\r\n  return `<div class=\"chart\"><svg viewBox=\"0 0 ${W} ${H}\" width=\"100%\" font-family=\"Arial,Helvetica,sans-serif\" role=\"img\" aria-label=\"How spread out your needs are\">${s}<\/svg>\r\n    <p class=\"chart-cap\">Every need placed on one line. A tight cluster means many needs pulling with similar force. A wide spread means a few clear drivers and others running quiet.<\/p><\/div>`;\r\n}\r\nfunction svgTension(R,a,b){\r\n  const W=680,H=150,cy=72,r=44;\r\n  const cxA=180,cxB=W-180;\r\n  const sa=R.need[a],sb=R.need[b];\r\n  const ra=r*(0.55+0.45*(sa\/5)),rb=r*(0.55+0.45*(sb\/5));\r\n  let s=`<line x1=\"${cxA+ra}\" y1=\"${cy}\" x2=\"${cxB-rb}\" y2=\"${cy}\" stroke=\"var(--terra)\" stroke-width=\"2\" stroke-dasharray=\"6 5\"\/>`;\r\n  s+=`<text x=\"${W\/2}\" y=\"${cy-14}\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"var(--ink-faint)\">both, strongly, at once<\/text>`;\r\n  s+=`<circle cx=\"${cxA}\" cy=\"${cy}\" r=\"${ra}\" fill=\"var(--terra)\" fill-opacity=\"0.16\" stroke=\"var(--terra)\" stroke-width=\"2.5\"\/>`;\r\n  s+=`<circle cx=\"${cxB}\" cy=\"${cy}\" r=\"${rb}\" fill=\"var(--good)\" fill-opacity=\"0.16\" stroke=\"var(--good)\" stroke-width=\"2.5\"\/>`;\r\n  s+=`<text x=\"${cxA}\" y=\"${cy+5}\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"700\" fill=\"var(--terra-deep)\">${sa.toFixed(1)}<\/text>`;\r\n  s+=`<text x=\"${cxB}\" y=\"${cy+5}\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"700\" fill=\"var(--good)\">${sb.toFixed(1)}<\/text>`;\r\n  s+=`<text x=\"${cxA}\" y=\"${cy+r+30}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"700\" fill=\"var(--ink-soft)\">${NEED_LABEL[a]}<\/text>`;\r\n  s+=`<text x=\"${cxB}\" y=\"${cy+r+30}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"700\" fill=\"var(--ink-soft)\">${NEED_LABEL[b]}<\/text>`;\r\n  s+=`<text x=\"${cxA}\" y=\"${cy+r+46}\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"var(--ink-faint)\">${NEED_SHORT[a]}<\/text>`;\r\n  s+=`<text x=\"${cxB}\" y=\"${cy+r+46}\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"var(--ink-faint)\">${NEED_SHORT[b]}<\/text>`;\r\n  return `<div class=\"chart\"><svg viewBox=\"0 0 ${W} ${H+40}\" width=\"100%\" font-family=\"Arial,Helvetica,sans-serif\" role=\"img\" aria-label=\"Your two strongest needs\">${s}<\/svg>\r\n    <p class=\"chart-cap\">Your two strongest needs, sized by how strongly each runs. The line between them is where most of the interesting work lives.<\/p><\/div>`;\r\n}\r\nfunction suffStrip(R){\r\n  const chips=R.ranked.map(r=>{\r\n    const cls=R.top.includes(r.need)?\"hi\":(R.suff[r.need]?\"ok\":\"lo\");\r\n    return `<span class=\"suffchip ${cls}\">${NEED_LABEL[r.need]} ${r.score.toFixed(1)}<\/span>`;\r\n  }).join(\"\");\r\n  return `<div class=\"suffstrip\">${chips}<\/div>\r\n    <p class=\"note\">Ordered from strongest to quietest. Terracotta is your leading need, green is running healthily, amber is below the baseline that tends to keep a person feeling balanced.<\/p>`;\r\n}\r\n\r\n\/* ---------- narrative helpers ---------- *\/\r\nfunction tieBetween(R,a,b){const k=[a,b].sort().join(\"|\");return R.tieInfo&&R.tieInfo[k]?R.tieInfo[k]:null;}\r\nfunction flowOpener(k,band,name,idx,prevNeed,R){\r\n  const L=NEED_LABEL[k];\r\n  if(idx===0){\r\n    if(band===\"driving\")return `${name}, the clearest thing your answers show is how much <strong>${L}<\/strong> drives you. It runs strong enough to shape a great deal of what you reach for, and how you feel when you can't reach it.`;\r\n    return `${name}, the need that comes through most clearly is <strong>${L}<\/strong>. It isn't the whole story, but it's a real and steady pull, so it's the natural place to begin.`;\r\n  }\r\n  const prevL=NEED_LABEL[prevNeed];\r\n  const tie=tieBetween(R,k,prevNeed);\r\n  let tieClause=\"\";\r\n  if(tie){\r\n    if(tie.split)tieClause=` In fact, ${prevL} and ${L} came out so level that when you were asked to choose between them, you split evenly. They're genuinely equal in you.`;\r\n    else if(tie.winner===prevNeed)tieClause=` These two ran almost level, and when you had to choose, you leaned toward ${prevL}, which is why it comes first.`;\r\n    else if(tie.winner===k)tieClause=` These two ran almost level, and when you had to choose, you actually leaned toward ${L}.`;\r\n  }\r\n  if(idx===1)return `Sitting close alongside it is <strong>${L}<\/strong>.${tieClause} It's worth holding these two together, because a person shaped by both ${prevL} and ${L} is a particular thing.`;\r\n  if(idx===2)return `There's a third strong thread here as well: <strong>${L}<\/strong>.${tieClause} Three needs this close together give your inner life real texture.`;\r\n  return `<strong>${L}<\/strong> is also part of your picture, running a little softer than the needs above but still real.`;\r\n}\r\nfunction portraitDepth(band){\r\n  if(band===\"driving\"||band===\"strong\")return [\"core\",\"daily\",\"rel\",\"strength\",\"strain\",\"emotional\",\"relational\",\"close\"];\r\n  if(band===\"present\")return [\"core\",\"daily\",\"strength\",\"strain\",\"relational\",\"close\"];\r\n  return [\"core\",\"strength\",\"close\"];\r\n}\r\nfunction emphasise(f,t){\r\n  if(![\"emotional\",\"relational\",\"strength\"].includes(f))return t;\r\n  const m=t.match(\/^([A-Z][a-z]+ly,)\/);\r\n  if(m)return t.replace(m[1],`<strong>${m[1]}<\/strong>`);\r\n  return t.replace(\/^This is a real strength\\.\/,'<strong>This is a real strength.<\/strong>');\r\n}\r\n\r\n\/* ---------- report ---------- *\/\r\nfunction renderReport(){\r\n  const R=analyse();\r\n  const name=nm();\r\n  const low=NEED_KEYS.filter(k=>!R.suff[k]);\r\n  let html=`<div class=\"card frame\"><div class=\"kicker\">Your profile<\/div><h1>${name}<\/h1>\r\n    <p style=\"margin-top:14px\">This isn't a scorecard and it isn't a verdict. It's a map of what you most need, which needs are doing the driving, and a few places worth your attention.<\/p>\r\n    <p class=\"muted\">Read it slowly. Some of it will feel good to read and some will be harder. That's normal, and it isn't a sign anything is wrong. It's simply an honest picture.<\/p><\/div>`;\r\n\r\n  \/\/ PART 1\r\n  html+=`<div class=\"card\"><div class=\"kicker\">Part 1 &middot; Your needs<\/div><h2>The shape of you<\/h2>\r\n    <p class=\"muted\">Everyone carries all eight of these needs, in different amounts. What makes you <em>you<\/em> is the particular mix: which ones drive you, which run quiet, and how they sit together.<\/p>\r\n    ${svgBars(R)}\r\n    ${svgRadar(R)}\r\n    ${suffStrip(R)}\r\n    ${svgSpread(R)}\r\n    <p class=\"muted\">${R.spread>=2.2?`Your profile is fairly spread out. A few needs are doing most of the driving while others run genuinely quiet, which usually means your priorities are clear and strongly felt.`:R.spread<=1.2?`Your needs sit unusually close together. No single one dominates, which often means you feel pulled several ways at once rather than driven by one clear thing.`:`Your needs are moderately spread. There are clear leaders, but several others carry real weight too.`}<\/p><\/div>`;\r\n\r\n  const flowing=R.ranked.filter(r=>[\"driving\",\"strong\",\"present\"].includes(needBand(r.score)));\r\n  const quiet=R.ranked.filter(r=>[\"quiet\",\"background\"].includes(needBand(r.score)));\r\n\r\n  flowing.slice(0,3).forEach((r,idx)=>{\r\n    const k=r.need,band=needBand(r.score),fields=portraitDepth(band),t=PORTRAIT[k];\r\n    const prev=idx>0?flowing[idx-1].need:null;\r\n    let body=`<p>${flowOpener(k,band,name,idx,prev,R)}<\/p>`;\r\n    fields.forEach(f=>{\r\n      let txt=t[f];if(!txt)return;\r\n      if(f===\"core\")txt=cap(txt);\r\n      txt=emphasise(f,txt);\r\n      if(f===\"strain\"){body+=`<div class=\"keynote\">${txt}<\/div>`;return;}\r\n      body+=paras(txt);\r\n    });\r\n    html+=`<div class=\"card\"><h3>${NEED_LABEL[k]} <span class=\"note\" style=\"font-weight:400\">&middot; ${r.score.toFixed(1)}<\/span><\/h3>${body}<\/div>`;\r\n  });\r\n\r\n  \/\/ remaining flowing needs, brief\r\n  const rest=flowing.slice(3);\r\n  if(rest.length){\r\n    let h=`<div class=\"card\"><h3>Also in the mix<\/h3><p class=\"muted\">These needs carry real weight for you too, just below the leaders.<\/p>`;\r\n    rest.forEach(r=>{h+=`<div class=\"quietline\"><b>${NEED_LABEL[r.need]} &middot; ${r.score.toFixed(1)}.<\/b> ${cap(PORTRAIT[r.need].core)}<\/div>`;});\r\n    h+=`<\/div>`;html+=h;\r\n  }\r\n\r\n  \/\/ quiet needs\r\n  if(quiet.length){\r\n    const labels=quiet.map(r=>NEED_LABEL[r.need]);\r\n    const lowQ=quiet.filter(r=>!R.suff[r.need]).map(r=>NEED_LABEL[r.need]);\r\n    let h=`<div class=\"card\"><h3>The quieter needs<\/h3>\r\n      <p>${labels.length===1?\"One need runs\":`${labels.length} needs run`} noticeably quieter in you right now: ${labels.length===1?labels[0]:labels.slice(0,-1).join(\", \")+\" and \"+labels.slice(-1)}. You may barely recognise yourself in ${labels.length===1?\"it\":\"them\"}, and that's useful information in itself.<\/p>`;\r\n    quiet.forEach(r=>{h+=`<div class=\"quietline\"><b>${NEED_LABEL[r.need]} &middot; ${r.score.toFixed(1)}.<\/b> ${cap(PORTRAIT[r.need].core)}<\/div>`;});\r\n    if(lowQ.length)h+=`<p class=\"muted\" style=\"margin-top:16px\">A gentle note: ${lowQ.length===1?lowQ[0]+\" is\":lowQ.join(\" and \")+\" are\"} running below the baseline that tends to keep a person feeling balanced. Not a problem to fix, just worth knowing, because a quiet need is easy to undertend until it starts to ache, and quiet needs can grow loud when a season of life changes.<\/p>`;\r\n    h+=`<\/div>`;html+=h;\r\n  }\r\n\r\n  \/\/ PART 2 \u2014 interaction\r\n  const pair=R.top.length>=2?R.top.slice(0,2):[R.ranked[0].need,R.ranked[1].need];\r\n  const it=getInteraction(pair[0],pair[1]);\r\n  html+=`<div class=\"card\"><div class=\"kicker\">Part 2 &middot; How your needs interact<\/div><h2>Where your strongest needs meet<\/h2>\r\n    <p class=\"muted\">Your needs don't operate one at a time. The most revealing thing about anyone's profile is usually not any single need, but how the strongest ones combine, because that's where the particular texture of a person actually lives.<\/p>\r\n    ${svgTension(R,pair[0],pair[1])}\r\n    <h3>${it.title}<\/h3>${paras(it.body)}<\/div>`;\r\n\r\n  \/\/ PART 3 \u2014 own words\r\n  const feltTop=Object.keys(R.passionNeed).sort((a,b)=>R.passionNeed[b]-R.passionNeed[a]).filter(k=>R.passionNeed[k]>0).slice(0,2);\r\n  html+=`<div class=\"card\"><div class=\"kicker\">Part 3 &middot; In your own words<\/div><h2>What you told us directly<\/h2>`;\r\n  if(feltTop.length){\r\n    const match=feltTop.some(k=>R.top.includes(k));\r\n    html+=`<p>When you described the moments you feel most fulfilled and least like yourself, what came through most was ${feltTop.map(k=>NEED_LABEL[k].toLowerCase()).join(\" and \")}. ${match?\"That lines up with your strongest measured needs, which is a good sign this whole picture is really yours.\":\"That's a slightly different emphasis from your top measured needs, which is worth sitting with. Sometimes the needs we <em>feel<\/em> most in the moment aren't quite the ones running deepest, and the gap between them is often where a good conversation starts.\"}<\/p>`;\r\n  } else {\r\n    html+=`<p class=\"muted\">You didn't select any of the fulfilment or drain options, so there's nothing to compare here. If you take this again, those questions are worth answering, they often confirm or complicate the rest of the picture in useful ways.<\/p>`;\r\n  }\r\n  html+=`<\/div>`;\r\n\r\n  \/\/ PART 4 \u2014 agenda\r\n  const agenda=[];\r\n  agenda.push({title:`Living well with ${NEED_LABEL[R.ranked[0].need]}`,\r\n    body:`Your strongest need is ${NEED_LABEL[R.ranked[0].need]}, ${NEED_SHORT[R.ranked[0].need]}. The question isn't whether you should need it, you do, and that's fine. The question is how you go about getting it, because the same need can be pursued in ways that serve you or ways that quietly cost you. When did you last reach for it in a way you weren't proud of, and what was going on for you underneath?`});\r\n  agenda.push({title:\"The tension between your two strongest needs\",\r\n    body:`Much of the interesting work for you lives where ${NEED_LABEL[pair[0]]} and ${NEED_LABEL[pair[1]]} meet, as Part 2 described. When you next feel pulled two ways at once, see if you can name which of these two needs each part of you is reaching for. That naming is where the choice starts.`});\r\n  if(low.length)agenda.push({title:`Bringing ${NEED_LABEL[low[0]]} back into balance`,\r\n    body:`${NEED_LABEL[low[0]]} is running quieter than your other needs right now. It isn't your main driver, but a baseline of it still matters for feeling whole. What's one small way you could invite a little more of it in this week?`});\r\n  agenda.push({title:\"Deepening what already works\",\r\n    body:`There's real strength in your profile worth protecting on purpose, not just leaving to luck. What's working in your life right now that you've never actually named out loud, and what would it look like to do a little more of it, deliberately?`});\r\n  html+=`<div class=\"card\"><div class=\"kicker\">Part 4 &middot; Where you might begin<\/div><h2>A few places to start<\/h2>\r\n    <p class=\"muted\">Not instructions, and not fixes. A short handful of the things most worth your attention, each with a question to sit with, on your own or with someone you trust.<\/p>`;\r\n  agenda.slice(0,4).forEach((a,i)=>{html+=`<div class=\"growth\"><div class=\"growth-h\"><span class=\"growth-n\">${i+1}<\/span><h3>${a.title}<\/h3><\/div><p>${a.body}<\/p><\/div>`;});\r\n  html+=`<\/div>`;\r\n\r\n  \/\/ closing + honest nudge\r\n  html+=`<div class=\"card frame\" style=\"text-align:center\">\r\n    <p class=\"land\" style=\"border:none;text-align:center\">Knowing what you need, and how you tend to reach for it, is most of the work. The rest is practice, and the occasional honest conversation.<\/p>\r\n    <p class=\"muted\">Read this more than once. It tends to say slightly different things at different times.<\/p>\r\n    <div class=\"btn-row\" style=\"justify-content:center\"><button class=\"btn\" onclick=\"window.print()\">Save or print your profile<\/button><\/div><\/div>`;\r\n\r\n  html+=`<div class=\"card nudge\">\r\n    <div class=\"kicker\">Going further<\/div>\r\n    <h3>The Complete Needs Assessment<\/h3>\r\n    <p>This profile measured your eight needs from four questions each. The Complete Needs Assessment goes considerably further: more questions per need, so the picture is sharper, plus a whole layer this one doesn't touch, how you actually go about meeting each need, and where those habits serve you or cost you.<\/p>\r\n    <p>It also has a version for couples, where both of you complete it separately and receive a joint report on the two of you together.<\/p>\r\n    <p class=\"muted\">Because it asks more, the scores it produces may refine what you've read here. That's expected, and it's the point of going deeper.<\/p>\r\n  <\/div>`;\r\n\r\n  html+=`<div class=\"card\" style=\"text-align:center;border:2px solid var(--terra)\">\r\n    <div class=\"kicker\">Your reference code<\/div>\r\n    <p style=\"font-size:2.2rem;color:var(--terra-deep);letter-spacing:.06em;margin:6px 0 10px\">${STATE.codeName}<\/p>\r\n    <p class=\"muted\">If you'd like to discuss this profile with a counsellor, this code is how they'll find your results. Your name was never sent. Jot it down or take a screenshot before you close this page.<\/p>\r\n  <\/div>`;\r\n\r\n  app.innerHTML=\"\";\r\n  const s=document.createElement(\"div\");s.className=\"screen active report\";s.innerHTML=deDash(html);\r\n  app.appendChild(s);window.scrollTo(0,0);\r\n  submitResult(R);\r\n}\r\n\r\n\/* ---------- submission: anonymous, no name ---------- *\/\r\nconst FLUENT_CONFIG={\r\n  enabled:true,\r\n  fieldMap:{\r\n    code:\"tnp_code\",\r\n    completed_at:\"tnp_completed_at\",\r\n    consent_at:\"tnp_consent_at\",\r\n    scores:\"tnp_scores\",\r\n    ranked:\"tnp_ranked\",\r\n    top_needs:\"tnp_top\",\r\n    below_baseline:\"tnp_below\",\r\n    spread:\"tnp_spread\"\r\n  }\r\n};\r\nfunction buildPayload(R){\r\n  return {\r\n    code:STATE.codeName,\r\n    completed_at:new Date().toISOString(),\r\n    consent_at:STATE.consent?STATE.consent.when:\"\",\r\n    scores:NEED_KEYS.reduce((o,k)=>{o[k]=R.need[k];return o;},{}),\r\n    ranked:R.ranked.map(r=>r.need).join(\", \"),\r\n    top_needs:R.top.join(\", \"),\r\n    below_baseline:NEED_KEYS.filter(k=>!R.suff[k]).join(\", \"),\r\n    spread:R.spread\r\n  };\r\n}\r\nfunction submitResult(R){\r\n  const payload=buildPayload(R);\r\n  if(!FLUENT_CONFIG.enabled){console.log(\"[TNP] submission disabled. Payload:\",payload);return;}\r\n  try{\r\n    const probe=document.querySelector(`[name=\"${FLUENT_CONFIG.fieldMap.code}\"]`);\r\n    if(!probe){console.log(\"[TNP] Fluent form not found on page. Payload:\",payload);return;}\r\n    const form=probe.closest(\"form\");\r\n    if(!form){console.log(\"[TNP] field found but no parent form. Payload:\",payload);return;}\r\n    Object.keys(FLUENT_CONFIG.fieldMap).forEach(key=>{\r\n      const e=form.querySelector(`[name=\"${FLUENT_CONFIG.fieldMap[key]}\"]`);\r\n      if(!e)return;\r\n      let v=payload[key];\r\n      if(v&&typeof v===\"object\")v=JSON.stringify(v);\r\n      e.value=(v==null?\"\":v);\r\n      e.dispatchEvent(new Event(\"input\",{bubbles:true}));\r\n      e.dispatchEvent(new Event(\"change\",{bubbles:true}));\r\n    });\r\n    const btn=form.querySelector('[type=\"submit\"], .ff-btn-submit, button.ff_btn_style');\r\n    if(btn){btn.click();console.log(\"[TNP] submitted.\");}\r\n    else{form.requestSubmit?form.requestSubmit():form.submit();}\r\n  }catch(e){console.log(\"[TNP] submission error:\",e);}\r\n}\r\n\r\n\/* ---------- iframe fit ---------- *\/\r\nfunction fitFrame(){try{if(window.frameElement){const h=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);if(h>0)window.frameElement.style.height=h+\"px\";}}catch(e){}}\r\nfunction fitSoon(){try{requestAnimationFrame(fitFrame);}catch(e){fitFrame();}setTimeout(fitFrame,60);setTimeout(fitFrame,250);setTimeout(fitFrame,800);}\r\ntry{\r\n  if(app&&window.MutationObserver)new MutationObserver(fitSoon).observe(app,{childList:true,subtree:true,characterData:true});\r\n  window.addEventListener(\"resize\",fitFrame);\r\n  window.addEventListener(\"load\",fitSoon);\r\n  if(document.fonts&&document.fonts.ready&&document.fonts.ready.then)document.fonts.ready.then(fitSoon);\r\n}catch(e){}\r\n\r\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",startWelcome);\r\nelse startWelcome();\r\n})();\r\n<\/script>\r\n<\/div>\r\n<!-- ===== end TNP ===== -->\n\n\n<div style=\"position:absolute;left:-9999px;height:0;overflow:hidden\" aria-hidden=\"true\">\r\n  [fluentform id=\"3\"]\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":"","tve_updated_post":"","tve_custom_css":"","tve_user_custom_css":"","tve_globals":{},"tcb2_ready":1,"tcb_editor_enabled":0,"tve_landing_page":"","_tve_header":"","_tve_footer":""},"class_list":["post-39437","page","type-page","status-publish","hentry","post-wrapper","thrv_wrapper"],"_links":{"self":[{"href":"https:\/\/therelationshipguy.com\/af\/wp-json\/wp\/v2\/pages\/39437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/therelationshipguy.com\/af\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/therelationshipguy.com\/af\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/therelationshipguy.com\/af\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/therelationshipguy.com\/af\/wp-json\/wp\/v2\/comments?post=39437"}],"version-history":[{"count":5,"href":"https:\/\/therelationshipguy.com\/af\/wp-json\/wp\/v2\/pages\/39437\/revisions"}],"predecessor-version":[{"id":41556,"href":"https:\/\/therelationshipguy.com\/af\/wp-json\/wp\/v2\/pages\/39437\/revisions\/41556"}],"wp:attachment":[{"href":"https:\/\/therelationshipguy.com\/af\/wp-json\/wp\/v2\/media?parent=39437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}