WIP checkpoint
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
---
|
||||
|
||||
<BaseLayout title="Drones" description="Drone operating guidance and coordination process for Swansea Airport.">
|
||||
<section class="container prose">
|
||||
<p class="eyebrow">About</p>
|
||||
<h1 class="section-title">Drones</h1>
|
||||
|
||||
<p>
|
||||
Firstly, please be assured that Swansea Airport likes to help our drone flying colleagues
|
||||
where we possibly can.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
You are likely aware of the map adjacent: the purple rectangles show the Runway Protection
|
||||
Zones, the purple circle is the Flight Restriction Zone (FRZ), and the red circle is the
|
||||
Parachuting Protection Zone.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
We ask all drone operators operating in the vicinity of the aerodrome to let us know with as
|
||||
much notice as possible via email, with the following information:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Date of flight</li>
|
||||
<li>Estimated take-off time</li>
|
||||
<li>Estimated completion time</li>
|
||||
<li>Location</li>
|
||||
<li>Maximum elevation (feet above mean sea level)</li>
|
||||
<li>Details of the Operator and Flyer ID</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
We will then reply with any operational considerations and, if required, approve or decline a
|
||||
flight if it is within the FRZ or RPZs. We are not in the habit of declining, so please email
|
||||
us.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
After this, all we ask is that on the day, you call us in tower on
|
||||
<a href="tel:01792687042">01792 687042</a> twenty minutes prior to launch, so we can give
|
||||
you any operational updates and also broadcast a warning on our frequency to any aircraft.
|
||||
</p>
|
||||
|
||||
<h2>Parachuting</h2>
|
||||
<p>
|
||||
Parachuting tends to take place Friday to Sunday from Spring to Winter. This can involve free
|
||||
fall descents from 15,000' AMSL. We recommend avoiding these times due to the requirement to
|
||||
ensure the safety of descending skydivers.
|
||||
</p>
|
||||
</section>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
---
|
||||
|
||||
<BaseLayout title="About" description="Background and community information for Swansea Airport.">
|
||||
<section class="container prose">
|
||||
<p class="eyebrow">About</p>
|
||||
<h1 class="section-title">About</h1>
|
||||
<p>
|
||||
This section provides information for local communities and visitors. Choose a topic
|
||||
below to view placeholder content that will be replaced with final approved copy.
|
||||
</p>
|
||||
|
||||
<div class="cards-grid">
|
||||
<article class="card">
|
||||
<h3><a href="/about/drones/">Drones</a></h3>
|
||||
<p>Guidance and local operating expectations for drone use near the airport.</p>
|
||||
</article>
|
||||
<article class="card">
|
||||
<h3><a href="/about/noise/">Noise</a></h3>
|
||||
<p>Information about noise awareness, reporting, and community engagement.</p>
|
||||
</article>
|
||||
<article class="card">
|
||||
<h3><a href="/about/volunteering/">Volunteering</a></h3>
|
||||
<p>How people can contribute time and support airport activity and events.</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
---
|
||||
|
||||
<BaseLayout title="Noise" description="Noise information, complaints process, and legal context for Swansea Airport.">
|
||||
<section class="container prose">
|
||||
<p class="eyebrow">About</p>
|
||||
<h1 class="section-title">Noise</h1>
|
||||
|
||||
<p>
|
||||
Swansea Airport, and its proprietors Swansea Airport Stakeholders Alliance, always look to
|
||||
operate in a way to minimise any negative impact on its neighbours and the local environment
|
||||
as much as we possibly can, whilst of course ensuring we can carry out our operations as an
|
||||
aerodrome as effectively as possible.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The impact of noise will always be a consideration in any operational planning that takes
|
||||
place. The aerodrome is also putting a register of noise complaints into place, so that we
|
||||
can monitor noise matters in certain areas to ensure we have the maximum knowledge available
|
||||
when making decisions.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The aerodrome authority will always monitor the situation, and attempt to advise based pilots
|
||||
of any sensitive areas.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
With the above said, it should be noted that we are not an Air Traffic Control authority, and
|
||||
that the conduct of any flight is solely under the authority of the commander of the aircraft.
|
||||
Neither Swansea Airport, nor Swansea Airport Stakeholders Alliance, has authority to direct,
|
||||
control, restrict, or otherwise interfere with the chosen legal actions or decisions of the
|
||||
aircraft commander.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
It is also worth noting that s.79(6) of the Environmental Protection Act 1990 specifically
|
||||
exempts aircraft noise from the general noise nuisance controls which exist under that
|
||||
legislation, and s.76 of the Civil Aviation Act 1982 exempts an aircraft that was being flown
|
||||
in accordance with the regulations governing aircraft flight from prosecution for trespass or
|
||||
nuisance.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If you believe that a flight was conducted contrary to those regulations, then a complaint can
|
||||
be filed online with the Civil Aviation Authority, who has the power to investigate (search
|
||||
for CAA Form FCS1520).
|
||||
</p>
|
||||
|
||||
<h2>Contact and complaints</h2>
|
||||
<p>
|
||||
If you would like to discuss noise at Swansea Airport with us, please feel free to email
|
||||
<a href="mailto:tower@swansea-airport.wales">tower@swansea-airport.wales</a>. Please also
|
||||
use this email address if you would like to log a noise complaint.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Please be advised we cannot discuss noise issues or complaints over the telephone initially,
|
||||
and all such matters have to be raised by email initially.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
When sending an email, please set the subject to <strong>NOISE COMPLAINT</strong> and try to
|
||||
include the following:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>The date of the event</li>
|
||||
<li>The time of the event</li>
|
||||
<li>The location affected</li>
|
||||
<li>If possible, the aircraft registration (often found on the underside of the wing)</li>
|
||||
<li>
|
||||
If registration is not possible, a description of the aircraft (visible colours, high wing
|
||||
or low wing aircraft, number of engines, etc.)
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,67 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
---
|
||||
|
||||
<BaseLayout title="Volunteering" description="Volunteering vacancies and opportunities at Swansea Airport.">
|
||||
<section class="container prose">
|
||||
<p class="eyebrow">About</p>
|
||||
<h1 class="section-title">Volunteering Vacancies at Swansea Airport</h1>
|
||||
|
||||
<p>
|
||||
Swansea Airport is manned and run by a mix of volunteers and staff. Volunteering can be
|
||||
incredibly beneficial in many ways. Here are several key reasons why volunteering at Swansea
|
||||
Airport can have a positive impact.
|
||||
</p>
|
||||
|
||||
<h2>Skill Development</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Transferable skills:</strong> Volunteering allows you to develop skills that are
|
||||
valuable in the workplace, such as communication, teamwork, leadership, time management,
|
||||
problem solving, and organisation.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Industry-specific experience:</strong> Many of our volunteer roles can provide
|
||||
hands-on experience in the aviation field, which can be hard to get initially.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>Networking Opportunities</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Building connections:</strong> Volunteering can expose you to a diverse collection
|
||||
of people, including professionals, enthusiasts, and community leaders. These connections
|
||||
can lead to job opportunities, mentorship, and highly valuable professional connections.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Expanding your circle:</strong> Networking with others in your field can give you
|
||||
leading insights into job openings and industry trends, potentially giving you a
|
||||
competitive edge in your future employment searches.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>CV Enhancement</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Demonstrates commitment and initiative:</strong> Employers value candidates who
|
||||
show commitment to helping others and contributing to society.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Adds diversity to your experience:</strong> Volunteering can fill gaps in your CV,
|
||||
especially if you are just starting out or transitioning to a new field.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
Those are just a few reasons. If you are interested in expanding your horizons and
|
||||
volunteering at Swansea Airport, please pop up and ask to speak to somebody, or register your
|
||||
interest on our dedicated volunteering portal.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="https://webcollect.org.uk/sav" target="_blank" rel="noopener noreferrer">
|
||||
https://webcollect.org.uk/sav
|
||||
</a>
|
||||
</p>
|
||||
</section>
|
||||
</BaseLayout>
|
||||
@@ -2,6 +2,7 @@
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import { getEvents } from '../../lib/directus';
|
||||
import { formatDateTime } from '../../lib/format';
|
||||
import { normalizeSlug } from '../../lib/slug';
|
||||
|
||||
type EventItem = Awaited<ReturnType<typeof getEvents>>[number];
|
||||
|
||||
@@ -32,7 +33,15 @@ function resolveEventImageSource(realimage: EventItem['realimage']): string | nu
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const events = await getEvents();
|
||||
return events.map((item) => ({ params: { slug: item.slug }, props: { item } }));
|
||||
const paths = new Map<string, { params: { slug: string }; props: { item: EventItem } }>();
|
||||
|
||||
for (const item of events) {
|
||||
const slug = normalizeSlug(item.slug);
|
||||
if (!slug || paths.has(slug)) continue;
|
||||
paths.set(slug, { params: { slug }, props: { item } });
|
||||
}
|
||||
|
||||
return Array.from(paths.values());
|
||||
}
|
||||
|
||||
const { item } = Astro.props as { item: EventItem };
|
||||
@@ -45,7 +54,7 @@ const imageAlt = item.title;
|
||||
<p class="meta">{formatDateTime(item.start_datetime)}</p>
|
||||
<h1 class="section-title">{item.title}</h1>
|
||||
{imageSrc && <p><img src={imageSrc} alt={imageAlt} loading="lazy" /></p>}
|
||||
<p>{item.description}</p>
|
||||
{item.description && <p class="text-multiline">{item.description}</p>}
|
||||
{item.location_text && <p><strong>Location:</strong> {item.location_text}</p>}
|
||||
{item.registration_link && <p><a class="button primary" href={item.registration_link}>Register</a></p>}
|
||||
</article>
|
||||
|
||||
@@ -8,6 +8,6 @@ const events = (await getEvents()).sort((left, right) => new Date(left.start_dat
|
||||
|
||||
<BaseLayout title="Events" description="Airport events and flying opportunities.">
|
||||
<div class="container">
|
||||
<EventsList events={events} title="Events listing" description="Scannable listings for public and operational events." />
|
||||
<EventsList events={events} title="Upcoming Events" description="What's coming up at the airport" />
|
||||
</div>
|
||||
</BaseLayout>
|
||||
|
||||
@@ -50,10 +50,13 @@ const businessPromos = [
|
||||
---
|
||||
|
||||
<BaseLayout title="Home" description="Fast, clear airfield information for pilots and visitors.">
|
||||
<div class="banner-image">
|
||||
<img src="/images/banner.png" alt="Swansea Airport banner" loading="eager" />
|
||||
</div>
|
||||
|
||||
<section class="hero">
|
||||
<div class="container hero-stack">
|
||||
<div class="hero-panel">
|
||||
<img class="hero-logo" src="/images/swansea.webp" alt="Swansea Airport logo" loading="eager" />
|
||||
<p class="eyebrow">Operational website</p>
|
||||
<h1 class="hero-title">Welcome to Swansea Airport - Fairwood Common</h1>
|
||||
<p class="hero-copy">
|
||||
@@ -63,7 +66,7 @@ const businessPromos = [
|
||||
There are a whole host of aviation activities at Swansea Airport. If you're looking to learn to fly, or charter an aircraft, Swansea is more convenient and more cost effective than other Welsh and West of England airports. No queues and no expensive handling fees.
|
||||
</p>
|
||||
<div class="cta-row">
|
||||
<a class="button primary" href="/visiting-pilots/">Visiting pilots</a>
|
||||
<a class="button primary" href="/pilot-info/">Pilot Info</a>
|
||||
<a class="button secondary" href="/procedures-safety-noise-abatement/">Procedures and safety</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
---
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import FuelPricesWidget from '../components/FuelPricesWidget.astro';
|
||||
import { getFuelPrices } from '../lib/directus';
|
||||
import { site } from '../lib/site';
|
||||
|
||||
const runwayPattern = /^Runway\s+(\d+)\s+-\s+([^\s]+)\s+LDA\s+\(([^)]+)\)\s+Code\s+(\d+)\s+\(([^)]+)\)$/;
|
||||
|
||||
const runwayRows = site.runwayFacts
|
||||
.map((fact) => {
|
||||
const match = fact.match(runwayPattern);
|
||||
|
||||
if (!match) return null;
|
||||
|
||||
const [, runway, lda, surface, code, circuits] = match;
|
||||
return { runway, lda, surface, code, circuits };
|
||||
})
|
||||
.filter((row): row is { runway: string; lda: string; surface: string; code: string; circuits: string } => row !== null);
|
||||
|
||||
const otherFacts = site.runwayFacts.filter((fact) => !fact.match(runwayPattern));
|
||||
const fuelPrices = await getFuelPrices();
|
||||
---
|
||||
|
||||
<BaseLayout title="Pilot Info" description="Essential information for pilots planning a visit to Swansea Airport.">
|
||||
<div class="container prose">
|
||||
<p class="eyebrow">Pilot info</p>
|
||||
<h1 class="section-title">Communications</h1>
|
||||
<p>
|
||||
Swansea Airport operates a Air / Ground Communication Service, callsign Swansea Radio on 119.705. This service is staffed by volunteers and may not be operational at all times.
|
||||
</p>
|
||||
<p>
|
||||
When the Tower is unavailable, this will be NOTAMed and blind calls to Swansea Traffic shall be made on the Air / Ground frequency
|
||||
</p>
|
||||
|
||||
<h2>Runway Information</h2>
|
||||
<div class="runway-table-wrap">
|
||||
<table class="runway-facts-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Runway</th>
|
||||
<th scope="col">LDA</th>
|
||||
<th scope="col">Surface</th>
|
||||
<th scope="col">Code</th>
|
||||
<th scope="col">Circuits</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{runwayRows.map((runway) => (
|
||||
<tr>
|
||||
<td>{runway.runway}</td>
|
||||
<td>{runway.lda}</td>
|
||||
<td>{runway.surface}</td>
|
||||
<td>{runway.code}</td>
|
||||
<td>{runway.circuits}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{otherFacts.length > 0 && (
|
||||
<ul>
|
||||
{otherFacts.map((fact) => <li>{fact}</li>)}
|
||||
</ul>
|
||||
)}
|
||||
|
||||
<p>Circuits at 1000ft agl. Overhead joins and/or dead-side flying not permitted when Parachuting is active.
|
||||
|
||||
|
||||
|
||||
</p>
|
||||
|
||||
<FuelPricesWidget fuelPrices={fuelPrices} />
|
||||
|
||||
<h2>Arrival essentials</h2>
|
||||
<div class="cards-grid">
|
||||
<article class="card">
|
||||
<h3>PPR</h3>
|
||||
<p>Pre-landing fogging is presented prominently here and can be linked to the relevant Directus content or booking workflow.</p>
|
||||
</article>
|
||||
<article class="card">
|
||||
<h3>Book out</h3>
|
||||
<p>Departure procedures and any required outbound reporting remain in the same controlled page structure.</p>
|
||||
</article>
|
||||
<article class="card">
|
||||
<h3>Fuel and services</h3>
|
||||
<p>Fuel prices are shown on the homepage and can be reused here with the same data source.</p>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</BaseLayout>
|
||||
@@ -1,20 +1,71 @@
|
||||
---
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import { site } from '../lib/site';
|
||||
|
||||
const runwayPattern = /^Runway\s+(\d+)\s+-\s+([^\s]+)\s+LDA\s+\(([^)]+)\)\s+Code\s+(\d+)\s+\(([^)]+)\)$/;
|
||||
|
||||
const runwayRows = site.runwayFacts
|
||||
.map((fact) => {
|
||||
const match = fact.match(runwayPattern);
|
||||
|
||||
if (!match) return null;
|
||||
|
||||
const [, runway, lda, surface, code, circuits] = match;
|
||||
return { runway, lda, surface, code, circuits };
|
||||
})
|
||||
.filter((row): row is { runway: string; lda: string; surface: string; code: string; circuits: string } => row !== null);
|
||||
|
||||
const otherFacts = site.runwayFacts.filter((fact) => !fact.match(runwayPattern));
|
||||
---
|
||||
|
||||
<BaseLayout title="Visiting Pilots" description="Essential information for pilots planning a visit to Swansea Airport.">
|
||||
<BaseLayout title="Pilot Info" description="Essential information for pilots planning a visit to Swansea Airport.">
|
||||
<div class="container prose">
|
||||
<p class="eyebrow">Visiting pilots</p>
|
||||
<h1 class="section-title">Essential information for arriving aircraft</h1>
|
||||
<p class="eyebrow">Pilot info</p>
|
||||
<h1 class="section-title">Communications</h1>
|
||||
<p>
|
||||
This page is structured for quick pre-flight checks. It keeps operational details in fixed Astro components and leaves content updates to Directus.
|
||||
Swansea Airport operates a Air / Ground Communication Service, callsign Swansea Radio on 119.705. This service is staffed by volunteers and may not be operational at all times.
|
||||
</p>
|
||||
<p>
|
||||
When the Tower is unavailable, this will be NOTAMed and blind calls to Swansea Traffic shall be made on the Air / Ground frequency
|
||||
</p>
|
||||
|
||||
<h2>Airport facts</h2>
|
||||
<ul>
|
||||
{site.runwayFacts.map((fact) => <li>{fact}</li>)}
|
||||
</ul>
|
||||
<h2>Runway Information</h2>
|
||||
<div class="runway-table-wrap">
|
||||
<table class="runway-facts-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Runway</th>
|
||||
<th scope="col">LDA</th>
|
||||
<th scope="col">Surface</th>
|
||||
<th scope="col">Code</th>
|
||||
<th scope="col">Circuits</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{runwayRows.map((runway) => (
|
||||
<tr>
|
||||
<td>{runway.runway}</td>
|
||||
<td>{runway.lda}</td>
|
||||
<td>{runway.surface}</td>
|
||||
<td>{runway.code}</td>
|
||||
<td>{runway.circuits}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{otherFacts.length > 0 && (
|
||||
<ul>
|
||||
{otherFacts.map((fact) => <li>{fact}</li>)}
|
||||
</ul>
|
||||
)}
|
||||
|
||||
<p>Circuits at 1000ft agl. Overhead joins not permitted when Parachuting is active.
|
||||
|
||||
|
||||
|
||||
</p>
|
||||
|
||||
<h2>Arrival essentials</h2>
|
||||
<div class="cards-grid">
|
||||
|
||||
Reference in New Issue
Block a user