conference_contacts.xlsx is now the single working file behind both the dash's Download button and the mail-merge tool -- populated with all 139 SPIE 2026 presenters (not just ones with emails already found), so Peter can fill in emails as he meets people at the conference. Also adds a second message template (reconnect_message) alongside the existing wavegate_focus one, and a search/scroll UI for the contacts list now that it's no longer a handful of rows.
90 lines
2.4 KiB
HTML
90 lines
2.4 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>{% block title %}TXproducts Mail Merge{% endblock %}</title>
|
|
<style>
|
|
* { box-sizing: border-box; }
|
|
html, body { margin: 0; }
|
|
body {
|
|
background: #f7f9fc;
|
|
font-family: -apple-system, "Source Sans Pro", "Segoe UI", Helvetica, Arial, sans-serif;
|
|
color: #1b2733;
|
|
padding: 28px 32px 60px;
|
|
}
|
|
h1 {
|
|
font-size: 1.5rem;
|
|
font-weight: 800;
|
|
color: #1b3a5c;
|
|
margin: 0 0 4px;
|
|
}
|
|
.sub { color: #5b6a78; margin: 0 0 24px; font-size: 0.95rem; }
|
|
.card {
|
|
background: #ffffff;
|
|
border: 1px solid #e0e7ef;
|
|
border-radius: 10px;
|
|
padding: 20px 22px;
|
|
margin-bottom: 20px;
|
|
max-width: 760px;
|
|
}
|
|
.card h2 {
|
|
font-size: 1.05rem;
|
|
color: #1b3a5c;
|
|
margin: 0 0 12px;
|
|
}
|
|
label { display: block; margin-bottom: 10px; }
|
|
.contact-row {
|
|
display: flex;
|
|
align-items: baseline;
|
|
gap: 8px;
|
|
padding: 6px 0;
|
|
border-bottom: 1px solid #f0f3f7;
|
|
}
|
|
.contact-row:last-child { border-bottom: none; }
|
|
.contact-row .meta { color: #5b6a78; font-size: 0.85rem; }
|
|
.contact-row.disabled { color: #b6bfc8; }
|
|
.contact-row.no-match { display: none; }
|
|
.contact-list-scroll { max-height: 420px; overflow-y: auto; padding-right: 4px; }
|
|
select, input[type=text] {
|
|
padding: 7px 9px;
|
|
border: 1px solid #d3dbe4;
|
|
border-radius: 6px;
|
|
font-size: 0.95rem;
|
|
width: 100%;
|
|
max-width: 360px;
|
|
}
|
|
button {
|
|
background: #2d6a9f;
|
|
color: white;
|
|
border: none;
|
|
border-radius: 6px;
|
|
padding: 9px 16px;
|
|
font-size: 0.95rem;
|
|
cursor: pointer;
|
|
margin-right: 8px;
|
|
}
|
|
button.secondary { background: #5b6a78; }
|
|
button:hover { opacity: 0.9; }
|
|
.warning {
|
|
background: #fff6e0;
|
|
border: 1px solid #f0d99a;
|
|
color: #8a6100;
|
|
border-radius: 6px;
|
|
padding: 10px 14px;
|
|
margin-bottom: 16px;
|
|
font-size: 0.9rem;
|
|
}
|
|
table { border-collapse: collapse; width: 100%; }
|
|
th, td { text-align: left; padding: 8px 10px; border-bottom: 1px solid #eef1f5; vertical-align: top; font-size: 0.9rem; }
|
|
th { color: #5b6a78; font-weight: 600; }
|
|
pre { white-space: pre-wrap; font-family: inherit; margin: 0; }
|
|
a { color: #2d6a9f; }
|
|
code { background: #f0f3f7; padding: 1px 5px; border-radius: 4px; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
{% block content %}{% endblock %}
|
|
</body>
|
|
</html>
|