Marketing landing page for scanair.ca. A business soon-to-be located in Guelph, Ontario.
npm install
npm run devnpm run buildThe site is a Vite build served by a Cloudflare Worker so /api/contact can send contact form messages securely.
The contact form posts to /api/contact. The Worker sends the message through Brevo's transactional email API and sets replyTo to the website visitor, so replies from the ScanAir inbox go back to the person who submitted the form.
Before deploying, create a Brevo API key and add it as a Cloudflare secret:
npx wrangler secret put BREVO_API_KEYCONTACT_TO_EMAIL, CONTACT_FROM_EMAIL, and CONTACT_FROM_NAME are configured in wrangler.jsonc. The CONTACT_FROM_EMAIL address must be a verified Brevo sender or a sender on a verified Brevo domain.
For local Worker testing, create .dev.vars:
BREVO_API_KEY=your-brevo-api-keydocker build -t scanair-website .
docker run --rm -p 8080:80 scanair-websiteThen open http://localhost:8080.
The homepage Samples section is ready for SuperSplat embeds. Add a shared SuperSplat viewer URL to a sample card's data-supersplat-src value in index.html; the page lazy-loads the iframe when the section nears the viewport.
The real estate listing pages are driven by src/data/listings.ts.
To add or update a listing:
- Add a listing object with a unique
slug. - Set
splatSrcto the SuperSplat iframe URL, such ashttps://superspl.at/s?id=.... - Add a matching fallback screenshot in
public/assets/samples/and setfallbackSrc.
The category page lives at /listings, and each listing is generated at /listings/<slug> from the shared listing.html template. Vite creates the pretty URL folders during npm run build, so future listing pages should not need copied HTML.
- Oxblood red:
#5B0F14 - Graphite charcoal:
#1F2328 - Warm concrete:
#B7B4AD - Scan blue:
#2C6A8F - Cloud white:
#F3F2EF - Natural cedar:
#A98263