Celebrating Our Connections · Weekend of July 18–19, 2026
Send payment to:
Wayne Mallory
Zelle Email: waynemallory@gmail.com
Zelle Phone: 410-336-9583
Amount:
$15 × number of attendees per event
(e.g., 2 people for both events = $60 total)
super-embed:
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>a
<title>Mallory Connections – Reunion 2026 RSVP</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Segoe UI',Arial,sans-serif;background:#0d1117;color:#e6edf3;min-height:100vh}
/* ── Header ── */
header{background:#161b22;border-bottom:3px solid #2ea043;text-align:center;padding:28px 16px 22px}
.mc-logo{font-size:1.05rem;letter-spacing:3px;color:#7ee787;text-transform:uppercase;margin-bottom:6px}
header h1{font-size:2rem;font-weight:800;color:#fff;line-height:1.2}
header p.tagline{color:#8b949e;margin-top:8px;font-size:.95rem}
/* ── Banner ── */
.banner{background:linear-gradient(135deg,#1a3a1a 0%,#0d2818 100%);border:1px solid #2ea043;
margin:24px auto;max-width:860px;border-radius:10px;padding:18px 24px;text-align:center}
.banner h2{color:#7ee787;font-size:1.4rem}
.banner p{color:#c9d1d9;margin-top:6px;font-size:.95rem}
/* ── Event cards ── */
.events{display:flex;flex-wrap:wrap;gap:24px;max-width:900px;margin:0 auto;padding:0 16px 32px}
.event-card{flex:1;min-width:280px;background:#161b22;border:1px solid #30363d;border-radius:12px;overflow:hidden}
.event-header{background:#1f6feb;padding:16px 20px}
.event-header.picnic{background:#2ea043}
.event-header h3{font-size:1.2rem;font-weight:700;color:#fff}
.event-header .date{color:rgba(255,255,255,.82);font-size:.88rem;margin-top:4px}
.event-body{padding:20px}
.event-meta{font-size:.88rem;color:#8b949e;margin-bottom:14px;line-height:1.7}
.event-meta strong{color:#c9d1d9}
.price-badge{display:inline-block;background:#2ea043;color:#fff;font-weight:700;
border-radius:20px;padding:4px 14px;font-size:.9rem;margin-bottom:16px}
/* QR */
.qr-wrap{text-align:center;margin-bottom:18px}
.qr-label{font-size:.78rem;color:#7ee787;letter-spacing:1px;text-transform:uppercase;margin-bottom:8px}
.qr-box{display:inline-block;background:#fff;padding:10px;border-radius:8px}
.qr-note{font-size:.75rem;color:#8b949e;margin-top:6px}
/* RSVP Form */
.rsvp-form{background:#0d1117;border:1px solid #21262d;border-radius:8px;padding:18px}
.rsvp-form h4{color:#7ee787;font-size:.95rem;margin-bottom:14px;font-weight:600}
.form-row{margin-bottom:12px}
.form-row label{display:block;font-size:.8rem;color:#8b949e;margin-bottom:4px}
.form-row input{width:100%;background:#161b22;border:1px solid #30363d;border-radius:6px;
padding:8px 10px;color:#e6edf3;font-size:.9rem;outline:none;transition:border .2s}
.form-row input:focus{border-color:#2ea043}
.form-row input.required-field{border-left:3px solid #f85149}
.optional-block{background:#161b22;border:1px dashed #30363d;border-radius:6px;padding:12px;margin-top:10px}
.optional-block h5{font-size:.78rem;color:#8b949e;margin-bottom:10px;text-transform:uppercase;letter-spacing:.5px}
.add-btn{background:none;border:1px solid #30363d;color:#7ee787;border-radius:6px;
padding:6px 12px;font-size:.8rem;cursor:pointer;margin-bottom:8px;display:block;transition:all .2s}
.add-btn:hover{background:#21262d}
.submit-btn{width:100%;margin-top:14px;background:#2ea043;color:#fff;border:none;
border-radius:8px;padding:11px;font-size:1rem;font-weight:700;cursor:pointer;transition:background .2s}
.submit-btn:hover{background:#3fb950}
/* ── Payment section ── */
.payment{max-width:860px;margin:0 auto 32px;padding:0 16px}
.payment-card{background:#161b22;border:2px solid #2ea043;border-radius:12px;padding:24px}
.payment-card h3{color:#7ee787;font-size:1.15rem;margin-bottom:14px}
.payment-grid{display:flex;flex-wrap:wrap;gap:16px}
.pay-info{flex:1;min-width:200px}
.pay-info p{font-size:.9rem;color:#c9d1d9;line-height:1.8}
.pay-info strong{color:#7ee787}
.honor-note{background:#1a3a1a;border-left:4px solid #2ea043;border-radius:4px;
padding:12px 16px;margin-top:14px;font-size:.85rem;color:#c9d1d9;line-height:1.6}
/* ── Confirmation modal ── */
.modal-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.7);z-index:100;
align-items:center;justify-content:center}
.modal-overlay.active{display:flex}
.modal{background:#161b22;border:2px solid #2ea043;border-radius:12px;padding:28px;
max-width:420px;width:90%;text-align:center}
.modal h3{color:#7ee787;margin-bottom:10px}
.modal p{color:#c9d1d9;font-size:.9rem;line-height:1.6}
.modal button{margin-top:18px;background:#2ea043;color:#fff;border:none;border-radius:8px;
padding:10px 28px;font-weight:700;cursor:pointer}
footer{text-align:center;padding:20px;color:#484f58;font-size:.8rem;border-top:1px solid #21262d}
footer a{color:#7ee787;text-decoration:none}
@media(max-width:600px){header h1{font-size:1.5rem}.events{flex-direction:column}}
</style>
</head>
<body>
<!-- Header -->
<header>
<div class="mc-logo">✦ Mallory Connections ✦</div>
<h1>Family Reunion 2026</h1>
<p class="tagline">Celebrating Our Connections · Weekend of July 18–19, 2026</p>
</header>
<!-- Banner -->
<div class="banner" style="margin-top:28px">
<h2>🎉 Two Events. One Unforgettable Weekend.</h2>
<p>RSVP below for the Saturday Indoor Celebration, the Sunday Picnic, or both!<br/>
<span style="color:#7ee787;font-weight:600">$15 per person · per event</span> | Payment via Zelle · Honor Code</p>
</div>
<!-- Event Cards -->
<div class="events">
<!-- EVENT 1: Saturday Indoor -->
<div class="event-card">
<div class="event-header">
<h3>🎊 Saturday Indoor Celebration</h3>
<div class="date">Saturday · July 18, 2026</div>
</div>
<div class="event-body">
<div class="event-meta">
<strong>Location:</strong> TBD – Details via Email<br/>
<strong>Time:</strong> TBD<br/>
<strong>Cost:</strong> $15 per person
</div>
<span class="price-badge">$15 / person</span>
<div class="qr-wrap">
<div class="qr-label">Scan to RSVP</div>
<div class="qr-box" id="qr-saturday"></div>
<div class="qr-note">Or fill out the form below</div>
</div>
<div class="rsvp-form">
<h4>RSVP – Saturday Event</h4>
<div class="form-row">
<label>First Name <span style="color:#f85149">*</span></label>
<input type="text" id="sat-fn" class="required-field" placeholder="First name"/>
</div>
<div class="form-row">
<label>Last Name <span style="color:#f85149">*</span></label>
<input type="text" id="sat-ln" class="required-field" placeholder="Last name"/>
</div>
<div class="form-row">
<label>Email Address <span style="color:#f85149">*</span></label>
<input type="email" id="sat-em" class="required-field" placeholder="your@email.com"/>
</div>
<!-- Additional attendees -->
<div id="sat-extras"></div>
<button class="add-btn" onclick="addGuest('sat')">+ Add Additional Attendee</button>
<button class="submit-btn" onclick="submitRSVP('Saturday Indoor Celebration','sat')">Submit RSVP</button>
</div>
</div>
</div>
<!-- EVENT 2: Sunday Picnic -->
<div class="event-card">
<div class="event-header picnic">
<h3>🧺 Sunday Family Picnic</h3>
<div class="date">Sunday · July 19, 2026</div>
</div>
<div class="event-body">
<div class="event-meta">
<strong>Location:</strong> TBD – Same Location as Before<br/>
<strong>Time:</strong> TBD<br/>
<strong>Cost:</strong> $15 per person
</div>
<span class="price-badge">$15 / person</span>
<div class="qr-wrap">
<div class="qr-label">Scan to RSVP</div>
<div class="qr-box" id="qr-sunday"></div>
<div class="qr-note">Or fill out the form below</div>
</div>
<div class="rsvp-form">
<h4>RSVP – Sunday Picnic</h4>
<div class="form-row">
<label>First Name <span style="color:#f85149">*</span></label>
<input type="text" id="sun-fn" class="required-field" placeholder="First name"/>
</div>
<div class="form-row">
<label>Last Name <span style="color:#f85149">*</span></label>
<input type="text" id="sun-ln" class="required-field" placeholder="Last name"/>
</div>
<div class="form-row">
<label>Email Address <span style="color:#f85149">*</span></label>
<input type="email" id="sun-em" class="required-field" placeholder="your@email.com"/>
</div>
<div id="sun-extras"></div>
<button class="add-btn" onclick="addGuest('sun')">+ Add Additional Attendee</button>
<button class="submit-btn" onclick="submitRSVP('Sunday Family Picnic','sun')">Submit RSVP</button>
</div>
</div>
</div>
</div>
<!-- Payment Section -->
<div class="payment">
<div class="payment-card">
<h3>💸 Payment Instructions – Zelle</h3>
<div class="payment-grid">
<div class="pay-info">
<p>
<strong>Send payment to:</strong><br/>
Wayne Mallory<br/>
<strong>Zelle Email:</strong> waynemallory@gmail.com<br/>
<strong>Zelle Phone:</strong> 410-336-9583
</p>
</div>
<div class="pay-info">
<p>
<strong>Amount:</strong><br/>
$15 × number of attendees per event<br/>
(e.g., 2 people for both events = <strong>$60 total</strong>)
</p>
</div>
</div>
<div class="honor-note">
🤝 <strong>Honor Code System:</strong> Payment confirmation will be sent via email by
<strong>July 15, 2026</strong>. Please include your name and the event(s) in your Zelle memo so we can match your payment to your RSVP. Thank you for your integrity and family spirit!
</div>
</div>
</div>
<!-- Confirmation Modal -->
<div class="modal-overlay" id="modal">
<div class="modal">
<h3>🎉 RSVP Received!</h3>
<p id="modal-msg"></p>
<button onclick="document.getElementById('modal').classList.remove('active')">Close</button>
</div>
</div>
<footer>
<p>© 2026 <a href="https://malloryconnections.org" target="_blank">Mallory Connections</a> · Powered by KinTech Digital · <a href="mailto:waynemallory@gmail.com">waynemallory@gmail.com</a></p>
</footer>
<script>
// ── QR Codes ──
const pageURL = window.location.href;
new QRCode(document.getElementById("qr-saturday"), {
text: pageURL + "#saturday-rsvp",
width: 120, height: 120,
colorDark:"#000000", colorLight:"#ffffff",
correctLevel: QRCode.CorrectLevel.M
});
new QRCode(document.getElementById("qr-sunday"), {
text: pageURL + "#sunday-rsvp",
width: 120, height: 120,
colorDark:"#000000", colorLight:"#ffffff",
correctLevel: QRCode.CorrectLevel.M
});
// ── Guest counter ──
const guestCounts = {sat:0, sun:0};
function addGuest(prefix){
guestCounts[prefix]++;
const n = guestCounts[prefix];
const container = document.getElementById(prefix+'-extras');
const block = document.createElement('div');
block.className = 'optional-block';
block.id = prefix+'-guest-'+n;
block.innerHTML = `
<h5>Additional Attendee ${n}</h5>
<div class="form-row"><label>First Name</label>
<input type="text" id="${prefix}-g${n}-fn" placeholder="First name"/></div>
<div class="form-row"><label>Last Name</label>
<input type="text" id="${prefix}-g${n}-ln" placeholder="Last name"/></div>
<div class="form-row"><label>Email Address</label>
<input type="email" id="${prefix}-g${n}-em" placeholder="your@email.com"/></div>
<button class="add-btn" style="color:#f85149;border-color:#f85149"
onclick="removeGuest('${prefix}',${n})">✕ Remove</button>`;
container.appendChild(block);
}
function removeGuest(prefix, n){
const el = document.getElementById(prefix+'-guest-'+n);
if(el) el.remove();
}
function val(id){ const el = document.getElementById(id); return el ? el.value.trim() : ''; }
function submitRSVP(eventName, prefix){
const fn = val(prefix+'-fn');
const ln = val(prefix+'-ln');
const em = val(prefix+'-em');
if(!fn || !ln || !em){
alert('Please fill in all required fields (First Name, Last Name, Email) before submitting.');
return;
}
if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(em)){
alert('Please enter a valid email address.');
return;
}
// Count total attendees for this event
let total = 1;
for(let i=1; i<=guestCounts[prefix]; i++){
const gBlock = document.getElementById(prefix+'-guest-'+i);
if(gBlock) total++;
}
const cost = total * 15;
const msg = `Thank you, <strong>${fn} ${ln}</strong>!<br/><br/>
Your RSVP for the <strong>${eventName}</strong> has been recorded for <strong>${total} attendee(s)</strong>.<br/><br/>
💸 Please Zelle <strong>$${cost}</strong> to <strong>waynemallory@gmail.com</strong> or <strong>410-336-9583</strong>.<br/><br/>
✅ Payment confirmation will be sent to <strong>${em}</strong> by <strong>July 15, 2026</strong>.`;
document.getElementById('modal-msg').innerHTML = msg;
document.getElementById('modal').classList.add('active');
}
</script>
</body>
</html>