CI Pipeline / backend-test (pull_request) Successful in 4m20s
CI Pipeline / frontend-test (pull_request) Successful in 27s
CI Pipeline / frontend-build (pull_request) Failing after 29s
CI Pipeline / backend-lint (pull_request) Successful in 8s
CI Pipeline / quality-gate (push) Successful in 2s
CI Pipeline / backend-test (push) Successful in 4m22s
CI Pipeline / frontend-test (push) Successful in 26s
CI Pipeline / frontend-build (push) Failing after 28s
CI Pipeline / backend-lint (push) Successful in 8s
CI Pipeline / quality-gate (pull_request) Successful in 1s
- Add public/robots.txt (allow all, disallow /admin and /login, reference sitemap) - Add public/sitemap.xml (5 public routes with change frequencies and priorities) - Fix heading hierarchy: h2 -> h1 on about, schedule, events, contact pages - Remove dead footer href="#" links: - Volunteer/Corporate Giving/Planned Giving -> routerLink to /contact with subject query param - Social media links -> conditional on config().social_* fields (hidden when empty) - Fix logo ARIA: add aria-hidden="true" to decorative logo in about page divider - Add social_facebook, social_twitter, social_instagram, social_youtube to: - StationConfig DB model + startup migration - StationConfigResponse and StationConfigUpdate schemas - Frontend StationConfig TypeScript interface - Fix events "Learn More" dead link -> routerLink to /contact
65 lines
2.7 KiB
HTML
65 lines
2.7 KiB
HTML
<section class="contact">
|
||
<div class="container">
|
||
<div class="contact-header">
|
||
<img src="svg/small-flower.svg" alt="" class="contact-flower" aria-hidden="true">
|
||
<h1>Get in <span class="text-accent">Touch</span></h1>
|
||
<p class="section-intro">
|
||
Have a song request, want to volunteer, or just want to say hello?
|
||
We'd love to hear from you.
|
||
</p>
|
||
</div>
|
||
|
||
<div class="contact-grid">
|
||
<!-- Contact form -->
|
||
<div class="contact-form-wrapper">
|
||
<form class="contact-form" (ngSubmit)="onSubmit()" #contactForm="ngForm">
|
||
<div class="form-group">
|
||
<label for="name">Your Name</label>
|
||
<input id="name" type="text" ngModel name="name" required placeholder="Jane Doe">
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="email">Email Address</label>
|
||
<input id="email" type="email" ngModel name="email" required placeholder="jane@example.com">
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="subject">Subject</label>
|
||
<select id="subject" ngModel name="subject" required>
|
||
<option value="" disabled selected>Choose a topic</option>
|
||
<option value="general">General Inquiry</option>
|
||
<option value="volunteer">Volunteer</option>
|
||
<option value="advertising">Community Announcement</option>
|
||
<option value="song">Song Request</option>
|
||
<option value="technical">Technical Support</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="message">Message</label>
|
||
<textarea id="message" rows="5" ngModel name="message" required placeholder="Your message..."></textarea>
|
||
</div>
|
||
<button type="submit" class="btn btn-form">Send Message</button>
|
||
</form>
|
||
</div>
|
||
|
||
<!-- Station info -->
|
||
<div class="contact-info">
|
||
<div class="info-card">
|
||
<h4><span aria-hidden="true">📍</span> Studio Location</h4>
|
||
<p [innerHTML]="config().address"></p>
|
||
</div>
|
||
<div class="info-card">
|
||
<h4><span aria-hidden="true">📞</span> Phone</h4>
|
||
<p>{{ config().phone }}<br>Mon–Fri 8 AM – 6 MT</p>
|
||
</div>
|
||
<div class="info-card">
|
||
<h4><span aria-hidden="true">✉️</span> Email</h4>
|
||
<p><a [href]="'mailto:' + config().email">{{ config().email }}</a></p>
|
||
</div>
|
||
<div class="info-card">
|
||
<h4><span aria-hidden="true">📡</span> Frequencies</h4>
|
||
<p>{{ config().frequency }} — Mountain Region<br>Stream: {{ config().website }}/live</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|