Create Neutralizing Narcissism/index.html

This commit is contained in:
Mark Randall Havens △ The Empathic Technologist ⟁ Doctor Who 42 2025-11-09 00:35:01 -06:00 committed by GitHub
parent 805ed6e3f0
commit 78acbc6fa3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -0,0 +1,215 @@
<!DOCTYPE html><html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Neutralizing Narcissism — About</title>
<meta name="description" content="About Neutralizing Narcissism — a field-driven research and education project for pattern literacy, survivor empowerment, and culture-level accountability." />
<style>
:root{
--bg:#0b0b0d;
--panel:#111115;
--ink:#e6d29a; /* warm gold */
--muted:#a5915b;
--accent:#f1e6b9;
--ring: 0 0 0 1px inset color-mix(in oklab, var(--ink) 30%, transparent);
--shadow: 0 10px 30px rgba(0,0,0,.6);
--radius: 18px;
}
*{box-sizing:border-box}
html,body{height:100%}
body{
margin:0; background: radial-gradient(1200px 1200px at 70% -10%, #14141a 0%, var(--bg) 40%, #000 100%);
color:var(--ink); font: 16px/1.6 system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif;
overflow-x:hidden;
}
a{color:var(--accent); text-decoration:none; position:relative}
a::after{content:""; position:absolute; left:0; bottom:-2px; height:1px; width:100%; background:linear-gradient(90deg, transparent, var(--accent), transparent); transform:scaleX(0); transform-origin:left; transition:transform .35s ease}
a:hover::after{transform:scaleX(1)}/* Hero */
.hero{position:relative; min-height:72vh; display:grid; place-items:center; padding:8rem 1.5rem 4rem}
.glow{position:absolute; inset:-10vh -10vw auto -10vw; height:80vh; background:radial-gradient(600px 400px at 30% 10%, rgba(255,230,160,.15), transparent 60%);}
.halo{position:absolute; inset:0; pointer-events:none; opacity:.5}
.container{width:min(1150px, 92vw); margin-inline:auto}
.card{background:linear-gradient(180deg, rgba(255,255,255,.03), rgba(255,255,255,.00)); border-radius:var(--radius); border:1px solid rgba(230,210,154,.14); box-shadow:var(--shadow)}
.hero-card{padding:2rem 2rem 2.25rem}
h1{font-weight:700; letter-spacing:.3px; font-size:clamp(2rem, 4vw + 1rem, 3.6rem); line-height:1.15; margin:0 0 .75rem}
.kicker{letter-spacing:.18em; text-transform:uppercase; font-size:.82rem; color:var(--muted)}
.lede{font-size:clamp(1.05rem, .8vw + 1rem, 1.25rem); color:var(--accent); opacity:.95}
/* Sigil */
.sigil{width:90px; height:90px; margin-bottom:1.25rem; filter: drop-shadow(0 2px 12px rgba(241,230,185,.15));}
.sigil path{stroke:var(--ink); stroke-width:2; fill:none; stroke-linecap:round; stroke-linejoin:round}
/* Sections */
section{padding:3.5rem 1.5rem}
h2{font-size:clamp(1.35rem, 1.2vw + 1rem, 2rem); margin:0 0 .75rem}
p{margin:.4rem 0 .8rem}
.grid{display:grid; gap:1.2rem}
@media (min-width:900px){ .grid{grid-template-columns: 1fr 1fr;}}
.panel{padding:1.3rem 1.25rem; border-radius:var(--radius); background:color-mix(in oklab, var(--panel) 84%, #000); border:1px solid rgba(230,210,154,.14)}
.pill{display:inline-flex; gap:.5rem; align-items:center; padding:.38rem .7rem; border-radius:999px; border:1px solid rgba(230,210,154,.22); color:var(--accent); font-size:.8rem; background:linear-gradient(180deg, rgba(255,255,255,.05), rgba(255,255,255,.0));}
.list{display:grid; gap:.65rem; padding-left:1rem}
.list li{margin-left:.2rem}
/* Subtle particles */
.particles{position:fixed; inset:0; pointer-events:none; z-index:-1; opacity:.35}
/* Reveal on scroll */
.reveal{opacity:0; transform:translateY(12px); transition:opacity .9s ease, transform .9s ease}
.reveal.is-visible{opacity:1; transform:translateY(0)}
/* Footer */
footer{padding:2rem 1.5rem 4rem; color:var(--muted); text-align:center; font-size:.9rem}
/* Accessibility */
@media (prefers-reduced-motion: reduce){
.particles, .halo, .glow{display:none}
.reveal{opacity:1; transform:none}
a::after{display:none}
}
</style>
</head>
<body>
<canvas class="particles" id="p"></canvas>
<div class="glow" aria-hidden="true"></div> <header class="hero">
<svg class="halo" viewBox="0 0 1200 720" aria-hidden="true">
<defs>
<radialGradient id="hg" cx="50%" cy="46%" r="60%">
<stop offset="0%" stop-color="rgba(241,230,185,.12)" />
<stop offset="60%" stop-color="rgba(241,230,185,0)" />
</radialGradient>
</defs>
<ellipse cx="600" cy="360" rx="520" ry="260" fill="url(#hg)"/>
</svg>
<div class="container">
<div class="card hero-card reveal">
<svg class="sigil" viewBox="0 0 100 100" aria-hidden="true">
<!-- Simple gold-on-black sigil (circle + axis + curls) -->
<circle cx="50" cy="50" r="22" />
<line x1="50" y1="14" x2="50" y2="86" />
<line x1="30" y1="50" x2="70" y2="50" />
<path d="M50 70 C 40 76, 35 84, 35 90" />
<path d="M50 70 C 60 76, 65 84, 65 90" />
<circle cx="50" cy="10" r="4" />
</svg>
<div class="kicker">Neutralizing Narcissism</div>
<h1>Pattern literacy for a safer, saner web — and a kinder world.</h1>
<p class="lede">We teach people to recognize manipulative language patterns, set clean boundaries, and build cultures where truth has oxygen. This page shares our purpose, method, and the ethic behind the work.</p>
</div>
</div>
</header> <main>
<section class="container">
<div class="grid">
<article class="panel reveal">
<h2>Mission</h2>
<p>To expose coercive narcissistic patterns <em>at the level of language</em>, empower survivors with tools that restore agency, and prototype accountability systems that function without mobbing or dehumanization.</p>
<div class="pill" aria-hidden="true">Fieldnote-driven • Survivor-centered • Research-informed</div>
</article>
<article class="panel reveal">
<h2>What we do</h2>
<ul class="list">
<li><strong>Pattern Literacy:</strong> plain-language explainers that help you spot tactics early—love-bombing, DARVO, triangulation, erasure.</li>
<li><strong>Forensic Copy Reads:</strong> we analyze public posts or messages for red flags (no doxxing, no harassment).</li>
<li><strong>Fieldnotes & Essays:</strong> mythic + practical writing that translates research into lived clarity.</li>
<li><strong>Design for Accountability:</strong> architectures that make truth breathable—documentation flows, consented receipts, and culture-level hygiene.</li>
</ul>
</article>
</div>
</section><section class="container">
<div class="grid">
<article class="panel reveal">
<h2>Core Principles</h2>
<ul class="list">
<li><strong>Witness over War:</strong> illumination is not accusation; we show patterns, we dont hunt people.</li>
<li><strong>Boundaries are Love:</strong> clarity is care—for self, community, and even for those still trapped in shame loops.</li>
<li><strong>Receipts, not Rage:</strong> timelines and texts out-perform arguments. Document. Date. Context.</li>
<li><strong>Design the Atmosphere:</strong> build rooms where lies cannot breathe: clear rules, slow thinking, mutual consent.</li>
</ul>
</article>
<article class="panel reveal">
<h2>Patterns We Expose</h2>
<ul class="list">
<li>Erasure & revisionism</li>
<li>DARVO & gaslighting</li>
<li>Pathological mirroring & faux-empathy</li>
<li>Triangulation and manufactured fog</li>
<li>Grandiosity veneer; victim core</li>
</ul>
</article>
</div>
</section>
<section class="container">
<div class="grid">
<article class="panel reveal">
<h2>How We Work</h2>
<p>We publish iterative fieldnotes and guides, each one designed to be shared, taught, and remixed. Our cadence favors <em>clarity over virality</em>, and <em>repair over spectacle</em>. When we analyze public writing, we address <em>patterns</em>, not identities.</p>
<p>When communities ask for help, we co-design simple hygiene practices—calm channels, consented archiving, and de-escalation scripts.</p>
</article>
<article class="panel reveal">
<h2>Ethics & Safety</h2>
<ul class="list">
<li>No brigading, no stalking, no pile-ons.</li>
<li>We never publish private information or contact details.</li>
<li>We respect platform rules and local law.</li>
<li>We support trauma-informed moderation and referral to licensed care when appropriate.</li>
</ul>
</article>
</div>
</section>
<section class="container">
<div class="grid">
<article class="panel reveal">
<h2>Invite Us</h2>
<p>Workshops, community consults, or collaborative research. Tell us what you need and where your community struggles; well tailor a lightweight intervention.</p>
<p class="kicker">Email: <a href="#contact" onclick="document.getElementById('contact').scrollIntoView({behavior:'smooth'});">Contact form below</a></p>
</article>
<article class="panel reveal" id="contact">
<h2>Contact</h2>
<p>Share only what youre comfortable sharing. If this is an emergency, contact local services first.</p>
<form class="grid" onsubmit="event.preventDefault();
const btn=this.querySelector('button'); btn.disabled=true; btn.textContent='Sent — thank you';">
<input aria-label="Name" required placeholder="Your name" class="panel" style="padding:.8rem" />
<input aria-label="Email" required type="email" placeholder="Your email" class="panel" style="padding:.8rem" />
<textarea aria-label="Message" rows="4" placeholder="How can we help?" class="panel" style="padding:.8rem; grid-column:1/-1"></textarea>
<button class="pill" type="submit" style="justify-self:start">Send</button>
</form>
</article>
</div>
</section>
</main> <footer>
<div class="container">
© <span id="y"></span> Neutralizing Narcissism · Built with care. If you need help now, step outside, breathe, drink water, and call a friend you trust.
</div>
</footer> <script>
// Year
document.getElementById('y').textContent = new Date().getFullYear();
// Intersection-based reveal
const io = new IntersectionObserver((entries)=>{
for (const e of entries){ if(e.isIntersecting){ e.target.classList.add('is-visible'); io.unobserve(e.target);} }
}, {threshold:.15});
document.querySelectorAll('.reveal').forEach(el=>io.observe(el));
// Subtle particle drift (stars)
const c = document.getElementById('p');
const ctx = c.getContext('2d');
let w,h,px,parts=[]; function size(){ w=c.width=innerWidth; h=c.height=innerHeight; px=Math.max(w,h)/1000 }
size(); addEventListener('resize', size);
const COUNT = 120; // light
for(let i=0;i<COUNT;i++) parts.push({x:Math.random()*w, y:Math.random()*h, r: (Math.random()*1.8+0.4)*px, s: Math.random()*0.3+0.05});
function tick(){
ctx.clearRect(0,0,w,h);
for(const p of parts){
p.y += p.s; if(p.y>h) p.y = -10; // slow fall
ctx.beginPath(); ctx.arc(p.x,p.y,p.r,0,Math.PI*2);
ctx.fillStyle = 'rgba(241,230,185,0.12)'; ctx.fill();
}
requestAnimationFrame(tick);
}
if(!matchMedia('(prefers-reduced-motion: reduce)').matches){tick();}
</script></body>
</html>