← back to Designer Line
public/advocacy.html
84 lines
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>advocacy · designerline</title>
<style>
:root { --ink:#0e0e0c; --ink-mute:#6e6e68; --paper:#faf8f2; --line:#d9d4c5; --accent:#7a1b1b; }
* { box-sizing:border-box; }
body { margin:0; background:var(--paper); color:var(--ink); font-family: ui-serif, Georgia, serif; }
header {
display:flex; justify-content:space-between; align-items:center;
padding:20px 28px; border-bottom:1px solid var(--line);
}
header .mark { font-family:ui-sans-serif,system-ui,sans-serif; font-size:13px; letter-spacing:.22em; text-transform:uppercase; font-weight:600; }
header nav a { color:var(--ink-mute); text-decoration:none; font-family:ui-sans-serif,system-ui,sans-serif; font-size:11px; letter-spacing:.18em; text-transform:uppercase; margin-left:24px; }
header nav a:hover { color:var(--ink); }
main { max-width:760px; margin:48px auto 96px; padding:0 28px; }
h1 { font-weight:500; font-size:36px; letter-spacing:-0.01em; margin:0 0 10px; }
.lede { color:var(--ink-mute); font-size:16px; line-height:1.5; margin-bottom:48px; }
.pet { border-top:1px solid var(--line); padding:28px 0; }
.pet h2 { font-weight:500; font-size:22px; margin:0 0 8px; }
.pet p { color:var(--ink-mute); font-size:14px; line-height:1.55; margin:0 0 16px; }
.row { display:flex; align-items:center; gap:18px; flex-wrap:wrap; }
.row button {
background:var(--ink); color:var(--paper); border:0; padding:9px 18px;
font-family:ui-sans-serif,system-ui,sans-serif; font-size:11px; letter-spacing:.18em; text-transform:uppercase; cursor:pointer;
}
.row button:disabled { opacity:.5; cursor:not-allowed; }
.row .count { color:var(--ink-mute); font-family:ui-sans-serif,system-ui,sans-serif; font-size:12px; letter-spacing:.08em; }
footer { padding:32px 28px 48px; color:var(--ink-mute); font-size:11px; font-family:ui-sans-serif,system-ui,sans-serif; letter-spacing:.12em; text-transform:uppercase; text-align:center; border-top:1px solid var(--line); margin-top:48px; }
</style>
</head>
<body>
<header>
<a href="/" style="text-decoration:none;color:var(--ink);"><span class="mark">designerline</span></a>
<nav>
<a href="/commerce.html">commerce</a>
<a href="/advocacy.html" style="color:var(--ink);">advocacy</a>
<a href="/community.html">community</a>
</nav>
</header>
<main>
<h1>Petitions backed by 60,000 working designers.</h1>
<p class="lede">Your signature is verified against your trade credentials in dw_unified. No bots. No retail customers. Only working designers carrying real client portfolios.</p>
<div id="list"></div>
</main>
<footer>advocacy · designerline v0.1 · supports counted server-side (scaffold)</footer>
<script>
async function load() {
const data = await (await fetch('/api/advocacy/petitions')).json();
const local = JSON.parse(localStorage.getItem('dl.advocacy.signed') || '{}');
document.getElementById('list').innerHTML = (data.petitions||[]).map(p => `
<article class="pet">
<h2>${escapeHTML(p.title)}</h2>
<p>${escapeHTML(p.desc)}</p>
<div class="row">
<button data-id="${p.id}" ${local[p.id]?'disabled':''}>${local[p.id]?'Signed':'Sign this petition'}</button>
<span class="count" id="c-${p.id}">${(p.supports||0) + (local[p.id]?1:0)} supporter${(p.supports||0)+(local[p.id]?1:0)===1?'':'s'}</span>
</div>
</article>
`).join('');
document.querySelectorAll('.pet button').forEach(b => {
b.addEventListener('click', () => {
const id = b.dataset.id;
const signed = JSON.parse(localStorage.getItem('dl.advocacy.signed') || '{}');
signed[id] = true;
localStorage.setItem('dl.advocacy.signed', JSON.stringify(signed));
b.disabled = true; b.textContent = 'Signed';
const c = document.getElementById('c-'+id);
const n = parseInt(c.textContent) + 1;
c.textContent = n + ' supporter' + (n===1?'':'s');
});
});
}
function escapeHTML(s){return String(s).replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));}
load();
</script>
</body>
</html>