Home / Snippets / Footers / Publication footer
Try the design Preview widthFit panel Mobile · 390 px Tablet · 768 px Desktop · 1280 px Open demo ↗
Preview links stay in the example. Copy the source to use your own destinations. Form previews never send information.
Copy the source HTML CSS JavaScript Astro
Copy HTML <footer class="fct-publication-footer s-footer s-publication" data-snippet="publication-footer"><div class="s-wrap"><div class="s-publication"><div><p class="s-kicker">The Fieldnote</p><h2>Keep a little<br>curiosity.</h2><p>Stories and observations, occasionally.</p><form data-demo-form action="#" method="post" aria-label="Newsletter signup"><fieldset disabled><legend class="s-visually-hidden">Newsletter signup details</legend><label for="fct-publication-footer-email">Email (required)</label><input id="fct-publication-footer-email" name="email" type="email" required autocomplete="email" maxlength="254"><button type="submit" class="s-button">Request updates</button></fieldset><p class="s-demo-note" role="status">Demonstration only. Connect your backend before collecting information.</p></form></div><div class="s-columns"><div><h3>Explore</h3><a href="about.html">About</a><a href="work.html">Our work</a><a href="contact.html">Contact</a></div><div><h3>Useful details</h3><a href="services.html">Services</a><a href="faq.html">Questions</a><a href="visit.html">Visit us</a></div><div><h3>Contribute</h3><a href="contribute.html">Pitch a story</a><a href="team.html">Editorial team</a></div></div></div><div class="s-bottom"><span>© 2026 North & Field · Example business</span><div class="s-links"><a href="privacy.html">Privacy</a><a href="terms.html">Terms</a></div></div></div></footer>
Copy CSS .fct-publication-footer{--s-bg:#f5ede2;--s-ink:#50291e;--s-accent:#8b3e28;font:16px/1.65 system-ui,sans-serif;color:var(--s-ink);background:var(--s-bg)}.fct-publication-footer,.fct-publication-footer *{box-sizing:border-box}.fct-publication-footer :is(h2,h3,p,ul,figure){margin:0}.fct-publication-footer h2,.fct-publication-footer h3{line-height:1.2;letter-spacing:-.035em}.fct-publication-footer h2{font-size:clamp(1.8rem,4vw,3.5rem)}.fct-publication-footer a{color:inherit;text-underline-offset:5px;overflow-wrap:anywhere}.fct-publication-footer :is(a,button,input,textarea,select,summary):focus-visible{outline:3px solid var(--s-accent);outline-offset:4px}.fct-publication-footer button,.fct-publication-footer input,.fct-publication-footer textarea,.fct-publication-footer select{font:inherit}.fct-publication-footer a,.fct-publication-footer button{touch-action:manipulation}.fct-publication-footer .s-wrap{max-width:1200px;margin-inline:auto;padding:40px 28px}.fct-publication-footer .s-kicker{font-size:.8125rem;letter-spacing:.13em;text-transform:uppercase;margin-bottom:18px}.fct-publication-footer .s-button{display:inline-flex;align-items:center;justify-content:center;min-height:46px;padding:11px 21px;border:1px solid currentColor;text-decoration:none;background:transparent;color:inherit;cursor:pointer;border-radius:2px;font-weight:600}.fct-publication-footer .s-muted{opacity:.82}.fct-publication-footer .s-links{display:flex;gap:8px 26px;flex-wrap:wrap}.fct-publication-footer .s-links a{display:inline-flex;align-items:center;min-height:44px}.fct-publication-footer .s-rule{border-top:1px solid currentColor;padding-top:20px;margin-top:30px}.fct-publication-footer .s-grid{display:grid;gap:28px;grid-template-columns:repeat(3,minmax(0,1fr))}.fct-publication-footer img{max-width:100%;height:auto;display:block}.fct-publication-footer .s-brand{font-size:1.3rem;font-weight:700;letter-spacing:-.05em;text-decoration:none}@media(max-width:640px){.fct-publication-footer .s-wrap{padding:30px 20px}.fct-publication-footer .s-grid{grid-template-columns:1fr}}
.fct-publication-footer form{min-width:0}.fct-publication-footer fieldset{border:0;margin:0;padding:0;min-width:0;display:grid;gap:10px}.fct-publication-footer label{font-size:.9375rem;font-weight:600}.fct-publication-footer :is(input,textarea,select){width:100%;min-height:46px;border:1px solid currentColor;border-radius:2px;background:var(--s-bg);color:var(--s-ink);padding:11px 12px}.fct-publication-footer textarea{resize:vertical}.fct-publication-footer form .s-button{justify-self:start;margin-top:10px}.fct-publication-footer .s-demo-note{font-size:.875rem;margin-top:18px}.fct-publication-footer .s-visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.fct-publication-footer .s-inline,.fct-publication-footer .s-bottom{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap}.fct-publication-footer .s-inline{padding-block:10px}.fct-publication-footer .s-bottom{border-top:1px solid currentColor;margin-top:44px;padding-top:20px;font-size:.875rem}.fct-publication-footer .s-columns{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,180px),1fr));gap:34px}.fct-publication-footer .s-columns h3{font-size:1rem;margin-bottom:15px}.fct-publication-footer .s-columns a{display:block;min-height:44px;padding-block:8px}.fct-publication-footer .s-columns p{margin:14px 0;line-height:1.8}.fct-publication-footer .s-invite{padding:20px 0 65px}.fct-publication-footer .s-email{font-size:clamp(1.5rem,4vw,3rem);display:inline-block;margin-top:28px}.fct-publication-footer dl{margin:0}.fct-publication-footer dd{margin:0 0 18px}.fct-publication-footer .s-publication{display:grid;grid-template-columns:1fr 1.2fr;gap:60px}.fct-publication-footer .s-publication h2{font-family:Georgia,serif;font-weight:400;margin-bottom:20px}.fct-publication-footer .s-publication form{max-width:420px;margin-top:25px}@media(max-width:760px){.fct-publication-footer .s-publication{grid-template-columns:1fr;gap:40px}}Copy JavaScript (()=>{for(const root of document.querySelectorAll('[data-snippet="publication-footer"]')){if(root.dataset.initialized)continue;root.dataset.initialized='true';for(const form of root.querySelectorAll('[data-demo-form]')){form.querySelector('fieldset').disabled=false;form.addEventListener('submit',e=>{e.preventDefault();form.querySelector('[role=status]').textContent='Demo only: no information was sent. Connect and test your own backend for real delivery.';});}}})();
Copy Astro ---
// Generated, escaped static markup. Use a distinct prefix for each instance.
const markup = "\u003cfooter class=\"fct-publication-footer s-footer s-publication\" data-snippet=\"publication-footer\"\u003e\u003cdiv class=\"s-wrap\"\u003e\u003cdiv class=\"s-publication\"\u003e\u003cdiv\u003e\u003cp class=\"s-kicker\"\u003eThe Fieldnote\u003c/p\u003e\u003ch2\u003eKeep a little\u003cbr\u003ecuriosity.\u003c/h2\u003e\u003cp\u003eStories and observations, occasionally.\u003c/p\u003e\u003cform data-demo-form action=\"#\" method=\"post\" aria-label=\"Newsletter signup\"\u003e\u003cfieldset disabled\u003e\u003clegend class=\"s-visually-hidden\"\u003eNewsletter signup details\u003c/legend\u003e\u003clabel for=\"fct-publication-footer-email\"\u003eEmail (required)\u003c/label\u003e\u003cinput id=\"fct-publication-footer-email\" name=\"email\" type=\"email\" required autocomplete=\"email\" maxlength=\"254\"\u003e\u003cbutton type=\"submit\" class=\"s-button\"\u003eRequest updates\u003c/button\u003e\u003c/fieldset\u003e\u003cp class=\"s-demo-note\" role=\"status\"\u003eDemonstration only. Connect your backend before collecting information.\u003c/p\u003e\u003c/form\u003e\u003c/div\u003e\u003cdiv class=\"s-columns\"\u003e\u003cdiv\u003e\u003ch3\u003eExplore\u003c/h3\u003e\u003ca href=\"about.html\"\u003eAbout\u003c/a\u003e\u003ca href=\"work.html\"\u003eOur work\u003c/a\u003e\u003ca href=\"contact.html\"\u003eContact\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003eUseful details\u003c/h3\u003e\u003ca href=\"services.html\"\u003eServices\u003c/a\u003e\u003ca href=\"faq.html\"\u003eQuestions\u003c/a\u003e\u003ca href=\"visit.html\"\u003eVisit us\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003eContribute\u003c/h3\u003e\u003ca href=\"contribute.html\"\u003ePitch a story\u003c/a\u003e\u003ca href=\"team.html\"\u003eEditorial team\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"s-bottom\"\u003e\u003cspan\u003e© 2026 North \u0026 Field · Example business\u003c/span\u003e\u003cdiv class=\"s-links\"\u003e\u003ca href=\"privacy.html\"\u003ePrivacy\u003c/a\u003e\u003ca href=\"terms.html\"\u003eTerms\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/footer\u003e";
---
<Fragment set:html={markup} />
<style is:global>
.fct-publication-footer{--s-bg:#f5ede2;--s-ink:#50291e;--s-accent:#8b3e28;font:16px/1.65 system-ui,sans-serif;color:var(--s-ink);background:var(--s-bg)}.fct-publication-footer,.fct-publication-footer *{box-sizing:border-box}.fct-publication-footer :is(h2,h3,p,ul,figure){margin:0}.fct-publication-footer h2,.fct-publication-footer h3{line-height:1.2;letter-spacing:-.035em}.fct-publication-footer h2{font-size:clamp(1.8rem,4vw,3.5rem)}.fct-publication-footer a{color:inherit;text-underline-offset:5px;overflow-wrap:anywhere}.fct-publication-footer :is(a,button,input,textarea,select,summary):focus-visible{outline:3px solid var(--s-accent);outline-offset:4px}.fct-publication-footer button,.fct-publication-footer input,.fct-publication-footer textarea,.fct-publication-footer select{font:inherit}.fct-publication-footer a,.fct-publication-footer button{touch-action:manipulation}.fct-publication-footer .s-wrap{max-width:1200px;margin-inline:auto;padding:40px 28px}.fct-publication-footer .s-kicker{font-size:.8125rem;letter-spacing:.13em;text-transform:uppercase;margin-bottom:18px}.fct-publication-footer .s-button{display:inline-flex;align-items:center;justify-content:center;min-height:46px;padding:11px 21px;border:1px solid currentColor;text-decoration:none;background:transparent;color:inherit;cursor:pointer;border-radius:2px;font-weight:600}.fct-publication-footer .s-muted{opacity:.82}.fct-publication-footer .s-links{display:flex;gap:8px 26px;flex-wrap:wrap}.fct-publication-footer .s-links a{display:inline-flex;align-items:center;min-height:44px}.fct-publication-footer .s-rule{border-top:1px solid currentColor;padding-top:20px;margin-top:30px}.fct-publication-footer .s-grid{display:grid;gap:28px;grid-template-columns:repeat(3,minmax(0,1fr))}.fct-publication-footer img{max-width:100%;height:auto;display:block}.fct-publication-footer .s-brand{font-size:1.3rem;font-weight:700;letter-spacing:-.05em;text-decoration:none}@media(max-width:640px){.fct-publication-footer .s-wrap{padding:30px 20px}.fct-publication-footer .s-grid{grid-template-columns:1fr}}
.fct-publication-footer form{min-width:0}.fct-publication-footer fieldset{border:0;margin:0;padding:0;min-width:0;display:grid;gap:10px}.fct-publication-footer label{font-size:.9375rem;font-weight:600}.fct-publication-footer :is(input,textarea,select){width:100%;min-height:46px;border:1px solid currentColor;border-radius:2px;background:var(--s-bg);color:var(--s-ink);padding:11px 12px}.fct-publication-footer textarea{resize:vertical}.fct-publication-footer form .s-button{justify-self:start;margin-top:10px}.fct-publication-footer .s-demo-note{font-size:.875rem;margin-top:18px}.fct-publication-footer .s-visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.fct-publication-footer .s-inline,.fct-publication-footer .s-bottom{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap}.fct-publication-footer .s-inline{padding-block:10px}.fct-publication-footer .s-bottom{border-top:1px solid currentColor;margin-top:44px;padding-top:20px;font-size:.875rem}.fct-publication-footer .s-columns{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,180px),1fr));gap:34px}.fct-publication-footer .s-columns h3{font-size:1rem;margin-bottom:15px}.fct-publication-footer .s-columns a{display:block;min-height:44px;padding-block:8px}.fct-publication-footer .s-columns p{margin:14px 0;line-height:1.8}.fct-publication-footer .s-invite{padding:20px 0 65px}.fct-publication-footer .s-email{font-size:clamp(1.5rem,4vw,3rem);display:inline-block;margin-top:28px}.fct-publication-footer dl{margin:0}.fct-publication-footer dd{margin:0 0 18px}.fct-publication-footer .s-publication{display:grid;grid-template-columns:1fr 1.2fr;gap:60px}.fct-publication-footer .s-publication h2{font-family:Georgia,serif;font-weight:400;margin-bottom:20px}.fct-publication-footer .s-publication form{max-width:420px;margin-top:25px}@media(max-width:760px){.fct-publication-footer .s-publication{grid-template-columns:1fr;gap:40px}}
</style>
<script is:inline>
(()=>{for(const root of document.querySelectorAll('[data-snippet="publication-footer"]')){if(root.dataset.initialized)continue;root.dataset.initialized='true';for(const form of root.querySelectorAll('[data-demo-form]')){form.querySelector('fieldset').disabled=false;form.addEventListener('submit',e=>{e.preventDefault();form.querySelector('[role=status]').textContent='Demo only: no information was sent. Connect and test your own backend for real delivery.';});}}})();
</script>
Code tabs need JavaScript. All source formats are included in the open downloads.
Where this design fits The subscription invitation gets a distinct panel beside the section directory. It is form markup only; no email service or contributor system is included.
Subscription panel Publication sections Contributor links What is included The HTML ZIP includes a standalone demo, reusable markup, scoped CSS, its small JavaScript runtime, a license and setup notes. The Astro ZIP includes Snippet.astro. It can be imported into an existing Astro page or layout.
Connect a real form backend These forms demonstrate layout and native browser validation. No messages are sent. Configure the form action, remove the demo interception and disabled fieldset, then implement delivery, server validation and spam handling on your backend. Test actual success and error responses before publishing. An appointment request does not confirm availability.
Add it to an HTML website Copy snippet.html into the relevant page section. Load snippet.css after your existing site stylesheet. The class prefix identifies this design. Load snippet.js once with defer. Keep the included keyboard behavior when adapting interactions. Replace example content and check mobile widths, zoom, links and keyboard focus in your actual website. Use it in Astro Copy Snippet.astro into src/components/, import it into your page or shared layout, and insert the component where the section belongs. Keep each generated prefix unique if you duplicate a component on one page.
Keep the section maintainable Start with the variables at the top of the CSS for background, text and accent colors. Preserve semantic labels and focus styles. Existing site selectors can still affect imported markup, so test the combined result. Read the complete setup notes .