#lld-app{
–bg:#0b0f14;
–card:#111827;
–muted:#9ca3af;
–text:#e5e7eb;
–accent:#60a5fa;
–danger:#f87171;
–ok:#34d399;
–warn:#fbbf24;
–border:rgba(255,255,255,.10);
–shadow: 0 10px 30px rgba(0,0,0,.35);
–radius:16px;
–max: 980px;
–mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, “Liberation Mono”, “Courier New”, monospace;
–sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, “Apple Color Emoji”,”Segoe UI Emoji”;
color:var(–text);
font-family:var(–sans);
}
#lld-app *{ box-sizing:border-box; }
#lld-app .wrap{ max-width:var(–max); margin:0 auto; padding:18px; }
#lld-app .hero{
padding:18px 18px 10px;
border:1px solid var(–border);
border-radius:var(–radius);
background:linear-gradient(180deg,#05070a 0%, #0b0f14 60%, #070a0e 100%);
box-shadow:var(–shadow);
}
#lld-app .badge{
font-family:var(–mono);
font-size:12px;
padding:6px 10px;
border:1px solid var(–border);
border-radius:999px;
color:var(–muted);
display:inline-block;
margin-bottom:10px;
}
#lld-app h1{ margin:0; font-size:26px; }
#lld-app .sub{ color:var(–muted); margin:10px 0 0; line-height:1.5; }
#lld-app .grid{ display:grid; gap:14px; grid-template-columns:1fr; margin-top:14px; }
@media (min-width: 900px){ #lld-app .grid{ grid-template-columns: 1.4fr .6fr; } }
#lld-app .card{
background:rgba(17,24,39,.85);
border:1px solid var(–border);
border-radius:var(–radius);
box-shadow:var(–shadow);
overflow:hidden;
}
#lld-app .hd{
padding:16px;
border-bottom:1px solid var(–border);
display:flex; justify-content:space-between; gap:10px; align-items:center;
}
#lld-app .hd h2{ margin:0; font-size:16px; }
#lld-app .bd{ padding:16px; }
#lld-app .small{ color:var(–muted); font-size:13px; line-height:1.45; }
#lld-app .controls{ display:flex; gap:10px; flex-wrap:wrap; align-items:center; }
#lld-app button{
appearance:none; border:1px solid var(–border);
background:#0b1220;
color:var(–text);
border-radius:12px;
padding:10px 12px;
cursor:pointer;
font-weight:600;
}
#lld-app button:hover{ border-color:rgba(255,255,255,.22); }
#lld-app button.primary{
background:linear-gradient(180deg, #1d4ed8 0%, #2563eb 100%);
border-color:rgba(255,255,255,.18);
}
#lld-app button.ghost{ background:transparent; }
#lld-app .progress{ font-family:var(–mono); font-size:12px; color:var(–muted); }
#lld-app .bar{
height:10px; border-radius:999px; background:rgba(255,255,255,.07);
overflow:hidden; border:1px solid var(–border); margin-bottom:16px;
}
#lld-app .bar > div{
height:100%; width:0%;
background:linear-gradient(90deg, var(–accent), #93c5fd);
transition:width .2s ease;
}
#lld-app .q{ padding:14px 0; border-top:1px solid rgba(255,255,255,.08); }
#lld-app .q:first-child{ border-top:0; padding-top:0; }
#lld-app .qtitle{ display:flex; gap:10px; align-items:flex-start; line-height:1.4; }
#lld-app .qnum{
font-family:var(–mono); color:var(–muted); width:28px; flex:0 0 28px; text-align:right;
}
#lld-app .scale{ margin-top:10px; display:grid; grid-template-columns: repeat(5, minmax(0,1fr)); gap:8px; }
#lld-app .opt{
border:1px solid var(–border);
border-radius:12px;
padding:10px 8px;
background:rgba(0,0,0,.15);
text-align:center;
cursor:pointer;
user-select:none;
font-size:12px;
color:var(–muted);
}
#lld-app .opt strong{ display:block; color:var(–text); font-size:14px; }
#lld-app .opt.sel{
background:rgba(96,165,250,.18);
border-color:rgba(96,165,250,.55);
color:#dbeafe;
}
#lld-app .pill{
display:inline-flex; align-items:center; gap:8px;
padding:8px 10px;
border-radius:999px;
border:1px solid var(–border);
background:rgba(0,0,0,.12);
color:var(–muted);
font-family:var(–mono);
font-size:12px;
white-space:nowrap;
}
#lld-app .pill .dot{ width:8px; height:8px; border-radius:999px; background:var(–muted); }
#lld-app .pill.ok .dot{ background:var(–ok); }
#lld-app .pill.warn .dot{ background:var(–warn); }
#lld-app .pill.bad .dot{ background:var(–danger); }
#lld-app .results h3{ margin:0 0 8px; font-size:18px; }
#lld-app .results h4{ margin:16px 0 8px; font-size:14px; color:#dbeafe; }
#lld-app .results p, #lld-app .results li{ line-height:1.55; }
#lld-app .results ul{ margin:8px 0 0 18px; padding:0; }
#lld-app .kpi{ display:grid; gap:10px; grid-template-columns: repeat(2, minmax(0,1fr)); }
@media (min-width: 900px){ #lld-app .kpi{ grid-template-columns: repeat(2, minmax(0,1fr)); } }
#lld-app .k{ border:1px solid var(–border); border-radius:14px; padding:12px; background:rgba(0,0,0,.12); }
#lld-app .k .lab{ color:var(–muted); font-size:12px; font-family:var(–mono); }
#lld-app .k .val{ font-size:18px; font-weight:800; margin-top:6px; }
#lld-app textarea{
width:100%; min-height:120px; border-radius:14px;
background:rgba(0,0,0,.18); border:1px solid var(–border);
color:var(–text); padding:12px; font-family:var(–mono); font-size:12px; line-height:1.5;
resize:vertical;
}
#lld-app .hidden{ display:none !important; }
Love Life Debugger — Personality Quiz
Answer 25 statements (1–5). You’ll get a pattern diagnosis and a practical improvement plan. This is self-reflection, not a diagnosis.
Quiz
(function(){
const QUESTIONS = [
{n:1,section:”Attachment”,text:”I worry someone I like will lose interest in me.”},
{n:2,section:”Attachment”,text:”When someone pulls back, I feel a strong urge to “fix it” right away.”},
{n:3,section:”Attachment”,text:”I need frequent reassurance that we’re okay.”},
{n:4,section:”Attachment”,text:”I overthink texts, tone, and timing more than I want to.”},
{n:5,section:”Attachment”,text:”I feel suffocated if someone wants too much closeness.”},
{n:6,section:”Attachment”,text:”When things get serious, I suddenly want more space.”},
{n:7,section:”Attachment”,text:”I prefer solving problems alone rather than leaning on a partner.”},
{n:8,section:”Attachment”,text:”I get uncomfortable with emotional conversations that feel “heavy.””},
{n:9,section:”Conflict”,text:”I bring up issues as character flaws (“you always… you never…”).”},
{n:10,section:”Conflict”,text:”I use sarcasm, eye-roll energy, or put-downs when upset.”},
{n:11,section:”Conflict”,text:”I defend myself fast instead of hearing the point.”},
{n:12,section:”Conflict”,text:”I shut down, go quiet, or “leave the conversation” mentally/physically.”},
{n:13,section:”Conflict”,text:”I can start conflict gently (complaint + need) instead of attacking.”,reverse:true},
{n:14,section:”Conflict”,text:”I can accept repair attempts (softening, pause, reset) mid-argument.”,reverse:true},
{n:15,section:”Conflict”,text:”I escalate once I feel misunderstood.”},
{n:16,section:”Conflict”,text:”After conflict, I struggle to reconnect warmly.”},
{n:17,section:”Patterns”,text:”I ignore red flags because the chemistry is strong.”},
{n:18,section:”Patterns”,text:”I stay longer than I should hoping potential becomes reality.”},
{n:19,section:”Patterns”,text:”I confuse intensity with compatibility.”},
{n:20,section:”Patterns”,text:”I’m drawn to emotionally unavailable people.”},
{n:21,section:”Patterns”,text:”I feel responsible for other people’s feelings.”},
{n:22,section:”Patterns”,text:”I struggle to ask directly for what I want.”},
{n:23,section:”Patterns”,text:”I tolerate “almost” treatment (almost commitment, almost consistency).”},
{n:24,section:”Patterns”,text:”I test people instead of stating needs (withdraw, jealousy bait, silent treatment, etc.).”},
{n:25,section:”Patterns”,text:”I pick partners who fit a fantasy rather than my real life needs.”},
];
const SCALE = [
{v:1,label:”Strongly disagree”},
{v:2,label:”Disagree”},
{v:3,label:”Sometimes”},
{v:4,label:”Agree”},
{v:5,label:”Strongly agree”},
];
const els = {
quiz: document.getElementById(“lld-quiz”),
progressText: document.getElementById(“lld-progressText”),
barFill: document.getElementById(“lld-barFill”),
btnScore: document.getElementById(“lld-btnScore”),
btnReset: document.getElementById(“lld-btnReset”),
btnBack: document.getElementById(“lld-btnBack”),
btnCopy: document.getElementById(“lld-btnCopy”),
instructions: document.getElementById(“lld-instructions”),
results: document.getElementById(“lld-results”),
statusPill: document.getElementById(“lld-statusPill”),
statusText: document.getElementById(“lld-statusText”),
typePill: document.getElementById(“lld-typePill”),
typeText: document.getElementById(“lld-typeText”),
axVal: document.getElementById(“lld-axVal”),
avVal: document.getElementById(“lld-avVal”),
crVal: document.getElementById(“lld-crVal”),
psVal: document.getElementById(“lld-psVal”),
axTag: document.getElementById(“lld-axTag”),
avTag: document.getElementById(“lld-avTag”),
crTag: document.getElementById(“lld-crTag”),
psTag: document.getElementById(“lld-psTag”),
what: document.getElementById(“lld-what”),
steps: document.getElementById(“lld-steps”),
script: document.getElementById(“lld-script”),
shareBox: document.getElementById(“lld-shareBox”),
resultTitle: document.getElementById(“lld-resultTitle”),
};
const state = { answers: Array(25).fill(null), scored:false };
function tagAttachment(score){ if (score>=14) return “High”; if (score>=10) return “Moderate”; return “Low”; }
function tagCR(score){ if (score>=28) return “High”; if (score>=18) return “Moderate”; return “Low”; }
function tagPS(score){ if (score>=33) return “High”; if (score>=21) return “Moderate”; return “Low”; }
function attachmentStyle(ax,av){
const AX_H = ax>=14, AV_H = av>=14;
if (AX_H && !AV_H) return “Anxious-leaning”;
if (!AX_H && AV_H) return “Avoidant-leaning”;
if (AX_H && AV_H) return “Fearful-avoidant (push–pull)”;
return “More secure-leaning”;
}
function computeScores(a){
const ax = a[0]+a[1]+a[2]+a[3];
const av = a[4]+a[5]+a[6]+a[7];
const q13r = 6 – a[12];
const q14r = 6 – a[13];
const cr = a[8]+a[9]+a[10]+a[11]+q13r+q14r+a[14]+a[15];
const ps = a.slice(16,25).reduce((s,x)=>s+x,0);
return {ax,av,cr,ps};
}
function buildBlocks(primary, volcano, picker, attach, scores){
const base = {
“The Chaser”: {
what: “You bond fast and chase clarity when connection feels uncertain. That urgency can pressure the relationship, especially if the other person is inconsistent or emotionally limited.”,
steps: [
“Use a 24-hour rule when activated: pause before big texts or decisions.”,
“Replace reassurance-seeking with one clear ask for connection and clarity.”,
“Date for consistency, not intensity: track follow-through and effort.”
],
script: ““I’m activated. I want clarity, not a fight. Let’s talk when we’re calm.””
},
“The Escape Artist”: {
what: “When things get real, you default to distance. Partners feel shut out, and tough conversations become ‘too much,’ so connection erodes quietly.”,
steps: [
“Practice micro-vulnerability: one honest sentence instead of disappearing.”,
“Pause and return: “I’m flooded. I care. I need 30 minutes and I’m coming back.””,
“Turn toward bids for connection: small responses build safety.”
],
script: ““I’m overwhelmed. I care. I’m taking 30 minutes, then I’ll repair.””
},
“The Push–Pull Magnet”: {
what: “You want closeness and fear it at the same time. You can bond fast, then doubt, then test, then detach—creating instability even when feelings are real.”,
steps: [
“Slow the runway: no major commitments for 6–8 weeks—consistency first.”,
“Replace tests with direct needs: state the need instead of provoking.”,
“Use gentle start-ups and accept repair attempts early.”
],
script: ““I want closeness, and I’m getting scared. I’m going to be direct.””
},
“Secure Builder”: {
what: “You’re relatively secure. If things go wrong, it’s usually selection, timing, or skill mismatch—not your capacity to love.”,
steps: [
“State your needs early and watch behavior—not promises.”,
“Keep standards: consistency and repair matter more than chemistry.”,
“If conflict repeats, install a repair ritual or exit cleanly.”
],
script: ““I’m open to working on this—if we repair and change the pattern.””
}
};
let out = {…base[primary]};
if (picker){
out.what += ” You also tend to override standards when chemistry is strong, then stay too long hoping potential becomes reality.”;
out.steps.unshift(“Write 5 non-negotiables and enforce them. Potential doesn’t count.”);
out.steps.push(“Use an evidence log: same red flag twice = exit.”);
}
if (volcano){
out.what += ” Conflict is the multiplier: escalation + missed repair = disconnection.”;
out.steps.unshift(“Ban contempt/criticism/defensiveness/stonewalling. Use ‘behavior + feeling + need.’”);
out.steps.push(“Use a repair protocol: pause, return, name feeling, make one request, agree one change.”);
out.script = ““I’m activated. I’m pausing so I don’t say something I can’t take back. I will come back to repair.””;
}
out.steps = out.steps.slice(0,6);
return out;
}
function resultEngine(scores){
const attach = attachmentStyle(scores.ax, scores.av);
let primary = “Secure Builder”;
if (attach.startsWith(“Anxious”)) primary = “The Chaser”;
else if (attach.startsWith(“Avoidant”)) primary = “The Escape Artist”;
else if (attach.startsWith(“Fearful”)) primary = “The Push–Pull Magnet”;
const volcano = scores.cr >= 28;
const picker = scores.ps >= 33;
const mods = [];
if (picker) mods.push(“Pattern Picker”);
if (volcano) mods.push(“Volcano”);
let label = primary;
if (mods.length) label += ” + ” + mods.join(” + “);
const blocks = buildBlocks(primary, volcano, picker, attach, scores);
return {label, primary, mods, attach, volcano, picker, …blocks};
}
function answeredCount(){ return state.answers.filter(v => v!==null).length; }
function updateUI(){
const count = answeredCount();
els.progressText.textContent = `${count} / 25 answered`;
els.btnScore.disabled = count !== 25;
els.barFill.style.width = `${Math.round((count/25)*100)}%`;
els.statusPill.classList.remove(“ok”,”warn”,”bad”);
if (!state.scored){
els.statusText.textContent = count===25 ? “Ready to score” : “Not scored”;
els.statusPill.classList.add(count===25 ? “warn” : “ok”);
} else {
els.statusText.textContent = “Scored”;
els.statusPill.classList.add(“ok”);
}
}
function renderQuiz(){
els.quiz.innerHTML = “”;
let currentSection = “”;
QUESTIONS.forEach((q, idx) => {
if (q.section !== currentSection){
currentSection = q.section;
const s = document.createElement(“div”);
s.className = “q”;
s.innerHTML = `
`;
els.quiz.appendChild(s);
}
const wrap = document.createElement(“div”);
wrap.className = “q”;
wrap.innerHTML = `
`;
const scale = document.createElement(“div”);
scale.className = “scale”;
SCALE.forEach(opt => {
const b = document.createElement(“div”);
b.className = “opt” + (state.answers[idx]===opt.v ? ” sel” : “”);
b.innerHTML = `${opt.v}${opt.label}`;
b.addEventListener(“click”, () => { state.answers[idx]=opt.v; state.scored=false; renderQuiz(); });
scale.appendChild(b);
});
wrap.appendChild(scale);
els.quiz.appendChild(wrap);
});
updateUI();
}
function showResults(){
if (state.answers.some(v=>v===null)) return;
const scores = computeScores(state.answers);
const res = resultEngine(scores);
state.scored = true;
const axL = tagAttachment(scores.ax);
const avL = tagAttachment(scores.av);
const crL = tagCR(scores.cr);
const psL = tagPS(scores.ps);
els.axVal.textContent = `${scores.ax} / 20`;
els.avVal.textContent = `${scores.av} / 20`;
els.crVal.textContent = `${scores.cr} / 40`;
els.psVal.textContent = `${scores.ps} / 45`;
els.axTag.textContent = axL;
els.avTag.textContent = avL;
els.crTag.textContent = crL;
els.psTag.textContent = psL;
els.typePill.classList.remove(“ok”,”warn”,”bad”);
const severity = (res.volcano && res.picker) ? “bad” : ((res.volcano || res.picker) ? “warn” : “ok”);
els.typePill.classList.add(severity);
els.typeText.textContent = res.label;
els.resultTitle.textContent = `Your Result: ${res.label}`;
els.what.textContent = res.what;
els.steps.innerHTML = “”;
res.steps.forEach(s => {
const li = document.createElement(“li”);
li.textContent = s;
els.steps.appendChild(li);
});
els.script.textContent = res.script;
const share = [];
share.push(“LOVE LIFE DEBUGGER — RESULTS”);
share.push(`Type: ${res.label}`);
share.push(`Attachment: ${res.attach}`);
share.push(`AX: ${scores.ax}/20 (${axL}) | AV: ${scores.av}/20 (${avL})`);
share.push(`CR: ${scores.cr}/40 (${crL}) | PS: ${scores.ps}/45 (${psL})`);
share.push(“”);
share.push(“What tends to go wrong:”);
share.push(res.what);
share.push(“”);
share.push(“How to improve:”);
res.steps.forEach((s,i)=>share.push(`${i+1}. ${s}`));
share.push(“”);
share.push(“Reset script:”);
share.push(res.script);
els.shareBox.value = share.join(“\n”);
els.instructions.classList.add(“hidden”);
els.results.classList.remove(“hidden”);
updateUI();
}
function back(){
els.instructions.classList.remove(“hidden”);
els.results.classList.add(“hidden”);
updateUI();
}
function reset(){
state.answers = Array(25).fill(null);
state.scored = false;
back();
renderQuiz();
}
async function copy(){
try{
await navigator.clipboard.writeText(els.shareBox.value);
els.btnCopy.textContent = “Copied!”;
setTimeout(()=>els.btnCopy.textContent=”Copy”, 900);
}catch(e){
alert(“Copy failed. Select and copy manually.”);
}
}
els.btnScore.addEventListener(“click”, showResults);
els.btnReset.addEventListener(“click”, reset);
els.btnBack.addEventListener(“click”, back);
els.btnCopy.addEventListener(“click”, copy);
renderQuiz();
})();
