Navigation & layout - Replace per-page hardcoded nav/footer with shared nav.js (client-side injection) - Add nginx reverse proxy back to docker-compose for clean localhost routing - Rename /color-picker/ to /color/ across nav, directory, and references eStore admin - Add variation hiding controls (mirrors existing modifier hiding) - Add delivery rate editor (base fee + per-mile per tier, persisted to data/) - Fix all missing BASE prefix on fetch calls (admin PATCH/DELETE, availability, slots, colors) - Mount estore/data/ as a Docker volume so admin config survives rebuilds Booking & calendar - Set pickup calendar events to TRANSPARENT (free) so they don't block delivery slots - Skip CANCELLED events in busy-time calculation - Re-check slot availability at checkout before charging (409 on conflict) Phone & email validation - Auto-format phone as (XXX) XXX-XXXX as user types - Require exactly 10 digits; tighten email regex Confirmation emails (store alert + customer) - Full item detail per line: name, price, add-ons, colors, note - Charges breakdown: subtotal, delivery fee, tax, total - Delivery window: simplified M/D/YY h:mm – h:mm AM/PM format - .ics calendar attachment on customer confirmation Delivery rates - Extract configurable rates to delivery-rates.ts (server-only, no fs in client bundle) - calcDelivery() accepts optional rates param; delivery-quote route passes configured rates Content - Change all "40+ latex colors" references to "70+" Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
export default function Footer() {
|
|
return (
|
|
<footer className="footer has-background-primary-light">
|
|
<div className="content has-text-centered">
|
|
<div>
|
|
<a
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
href="https://mastodon.social/@beachpartyballoons@mastodon.social"
|
|
>
|
|
<i className="fa-brands fa-mastodon is-size-2" />
|
|
</a>
|
|
{' '}
|
|
<a
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
href="https://www.facebook.com/beachpartyballoons"
|
|
>
|
|
<i className="fa-brands fa-facebook-f is-size-2" />
|
|
</a>
|
|
{' '}
|
|
<a
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
href="https://www.instagram.com/beachpartyballoons/"
|
|
>
|
|
<i className="fa-brands fa-instagram is-size-2" />
|
|
</a>
|
|
{' '}
|
|
<a
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
href="https://bsky.app/profile/beachpartyballoons.bsky.social"
|
|
>
|
|
<i className="fa-brands fa-bluesky is-size-2" />
|
|
</a>
|
|
</div>
|
|
|
|
<p>
|
|
Copyright © {new Date().getFullYear()} Beach Party Balloons
|
|
</p>
|
|
<p>
|
|
All images & content are property of Beach Party Balloons.
|
|
Use of images without written permission is prohibited.
|
|
</p>
|
|
<p style={{ fontSize: '0.8rem', marginTop: '0.5rem' }}>
|
|
<a href="/shop/privacy">Privacy Policy</a>
|
|
{' · '}
|
|
<a href="/shop/terms">Terms of Service</a>
|
|
{' · '}
|
|
<a href="/shop/refund">Refund & Cancellation Policy</a>
|
|
</p>
|
|
</div>
|
|
</footer>
|
|
)
|
|
}
|