CTA
04 - Newsletter sign-up
A sign-up section with an email field. Input validation can be tried, but no data is submitted or registered.
en.astro
---
import DemoLayout from '@/layouts/DemoLayout.astro';
import { Cluster, Container, Heading, Inline, Lism, Stack, Text } from 'lism-css/astro';
---
<DemoLayout title="04 - Newsletter sign-up">
<Container as="section" isWrapper="s" isContainer hasGutter bgc="base-2" py="50">
<Stack g="40" bd-bs bdc="text" pbs="40" pbe="10">
<Stack g="20">
<Inline fz="s" c="text-2">Weekly newsletter</Inline>
<Heading level="2" class="u--trim" fz="2xl" fw="light">Ideas for life and work,<br />every Friday.</Heading>
</Stack>
<Stack as="form" g="10" data-newsletter-form>
<Inline as="label" for="newsletter-email" fz="s" fw="bold">Email address</Inline>
<Cluster g="15">
<Lism
as="input"
id="newsletter-email"
type="email"
name="email"
placeholder="hello@example.com"
autocomplete="email"
required
fx="1"
min-w={['100%', null, 'auto']}
bgc="base"
bd
bdrs="10"
px="20"
py="15"
/>
<Lism
as="button"
type="submit"
set="plain"
ta="center"
w={['100%', null, 'fit-content']}
bgc="text"
c="base"
bdrs="10"
px="30"
py="15"
fw="bold"
hov="-o"
>
Subscribe
</Lism>
</Cluster>
<Text fz="xs" c="text-2">It’s free to subscribe. Unsubscribe anytime.</Text>
<Text data-newsletter-status role="status" aria-live="polite" fz="s" fw="bold" />
</Stack>
</Stack>
</Container>
</DemoLayout>
<script>
const form = document.querySelector('[data-newsletter-form]');
const status = form?.querySelector('[data-newsletter-status]');
form?.addEventListener('submit', (event) => {
event.preventDefault();
if (!(form instanceof HTMLFormElement) || !form.reportValidity()) return;
if (status) status.textContent = 'This is a demo. No subscription has been created.';
});
</script>