many changes
This commit is contained in:
parent
4777f46a38
commit
be177af6cd
25 changed files with 2059 additions and 47 deletions
13
api/templates/index.html
Normal file
13
api/templates/index.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
<h1>SEPTASTIC!</h1>
|
||||
<p><i>A fantastic way to ride SEPTA</i></p>
|
||||
|
||||
<p style="margin-top: 25px;">
|
||||
SEPTASTIC is a website and (a soon to be) mobile app. Its purpose is to provide
|
||||
information about how to ride SEPTA (and connecting transit authorities) in a
|
||||
quick and information-rich manner.
|
||||
</p>
|
||||
|
||||
<p style="margin-top: 25px; margin-bottom: 25px;">
|
||||
Currently, all this website has is <a href="/routes">timetables for every
|
||||
SEPTA route</a>. More to come soon!
|
||||
</p>
|
58
api/templates/layout.html
Normal file
58
api/templates/layout.html
Normal file
|
@ -0,0 +1,58 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
|
||||
{% if let Some(title) = page_title %}
|
||||
<title>{{ title }}</title>
|
||||
{% else %}
|
||||
<title>SEPTASTIC</title>
|
||||
{% endif %}
|
||||
|
||||
{% if let Some(desc) = page_desc %}
|
||||
<meta name="{{ desc }}" />
|
||||
{% else %}
|
||||
<meta name="SEPTASTIC" />
|
||||
{% endif %}
|
||||
|
||||
<link rel="stylesheet" href="/assets/style.css">
|
||||
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<style>
|
||||
.silverliner-svg {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 200px; /* Fixed height matching the viewBox */
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="body">
|
||||
<nav>
|
||||
<div style="display: flex; justify-content: space-between;">
|
||||
<div>
|
||||
<a class="nav-link" href="/">[ Home ]</a>
|
||||
<a class="nav-link" href="/routes">[ Routes ]</a>
|
||||
</div>
|
||||
<div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<hr/>
|
||||
|
||||
{{ content|safe }}
|
||||
|
||||
<footer>
|
||||
<hr />
|
||||
<div style="display: flex; justify-content: space-between;">
|
||||
<div>
|
||||
<p style="margin-bottom: 0px; margin-top:0px;"><b>SEPTASTIC!</b></p>
|
||||
<p style="margin-bottom: 0px;margin-top: 0px;">
|
||||
<small>Copyright © <a href="https://nickorlow.com">Nicholas Orlowsky</a> 2025</small>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
111
api/templates/route.html
Normal file
111
api/templates/route.html
Normal file
|
@ -0,0 +1,111 @@
|
|||
{%- import "route_symbol.html" as scope -%}
|
||||
<style>
|
||||
.train-direction-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-family: sans-serif;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.train-direction-table th,
|
||||
.train-direction-table td {
|
||||
border: 1px solid #000;
|
||||
padding: 4px 8px;
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.train-direction-table th {
|
||||
background-color: #f0f0f0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.highlight-row td,
|
||||
.highlight-row th {
|
||||
background-color: #d0ebff !important;
|
||||
}
|
||||
|
||||
.highlight-col {
|
||||
background-color: #d0ebff !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
document.querySelectorAll(".train-direction-table").forEach((table) => {
|
||||
table.addEventListener("click", (e) => {
|
||||
const cell = e.target.closest("td, th");
|
||||
if (!cell) return;
|
||||
|
||||
// Clear previous highlights
|
||||
table.querySelectorAll("tr").forEach(row => row.classList.remove("highlight-row"));
|
||||
table.querySelectorAll("td, th").forEach(c => c.classList.remove("highlight-col"));
|
||||
|
||||
const row = cell.parentNode;
|
||||
const colIndex = Array.from(cell.parentNode.children).indexOf(cell);
|
||||
|
||||
// If it's the first column (row header)
|
||||
if (cell.cellIndex === 0 && cell.tagName === "TD") {
|
||||
row.classList.add("highlight-row");
|
||||
}
|
||||
// If it's a column header
|
||||
else if (row.parentNode.tagName === "THEAD") {
|
||||
table.querySelectorAll("tr").forEach(r => {
|
||||
const cell = r.children[colIndex];
|
||||
if (cell) cell.classList.add("highlight-col");
|
||||
});
|
||||
}
|
||||
// If it's a center cell
|
||||
else {
|
||||
row.classList.add("highlight-row");
|
||||
table.querySelectorAll("tr").forEach(r => {
|
||||
const cell = r.children[colIndex];
|
||||
if (cell) cell.classList.add("highlight-col");
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<div style="background-color: #ff0000; color: #ffffff; padding: 15px; margin-bottom: 15px; margin-top: 15px;">
|
||||
This website is not run by SEPTA. As such, schedules may not be
|
||||
completely accurate.
|
||||
</div>
|
||||
|
||||
<div style="display: flex; align-items: center;">
|
||||
{% call scope::route_symbol(route) %}
|
||||
<h1 style="margin-left: 15px;">{{ route.name }}</h1>
|
||||
</div>
|
||||
|
||||
{% for timetable in timetables %}
|
||||
<h2>{{ timetable.direction.direction | capitalize }} to {{ timetable.direction.direction_destination }}</h2>
|
||||
<div class="tscroll">
|
||||
<table class="train-direction-table" style="margin-top: 5px;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Stop</th>
|
||||
{% for trip_id in timetable.trip_ids %}
|
||||
<th>{{ trip_id }}</th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in timetable.rows %}
|
||||
<tr>
|
||||
<td>{{ row.stop_name }}</td>
|
||||
{% for time in row.times %}
|
||||
<td>
|
||||
{% if let Some(t) = time %}
|
||||
{{ t | format_time }}
|
||||
{% else %}
|
||||
--
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endfor %}
|
19
api/templates/route_symbol.html
Normal file
19
api/templates/route_symbol.html
Normal file
|
@ -0,0 +1,19 @@
|
|||
{% macro route_symbol(route) %}
|
||||
{% match route.route_type %}
|
||||
{% when libseptastic::route::RouteType::Trolley | libseptastic::route::RouteType::SubwayElevated %}
|
||||
<div class="metro-container bg-{{ route.id }}">
|
||||
{{ route.id }}
|
||||
</div>
|
||||
{% endwhen %}
|
||||
{% when libseptastic::route::RouteType::RegionalRail %}
|
||||
<div class="rr-container">
|
||||
{{ route.id }}
|
||||
</div>
|
||||
{% endwhen %}
|
||||
{% when libseptastic::route::RouteType::Bus | libseptastic::route::RouteType::TracklessTrolley %}
|
||||
<div class="bus-container">
|
||||
{{ route.id }}
|
||||
</div>
|
||||
{% endwhen %}
|
||||
{% endmatch %}
|
||||
{% endmacro %}
|
83
api/templates/routes.html
Normal file
83
api/templates/routes.html
Normal file
|
@ -0,0 +1,83 @@
|
|||
<h1>Routes</h1>
|
||||
|
||||
<p>Click on a route to see details and a schedule. Schedules in prevailing local time.</p>
|
||||
|
||||
<fieldset>
|
||||
<legend><h2>Regional Rail</h2></legend>
|
||||
<p style="margin-top: 10px; margin-bottom: 10px;">For infrequent rail service to suburban locations</p>
|
||||
<!--<h3 class="line-link">[ Pennsy ]</h3>-->
|
||||
<p class="line-link"><a href="/route/TRE">[ <b>TRE:</b> Trenton (NJT to New York) ]</a></p>
|
||||
<p class="line-link"><a href="/route/PAO">[ <b>PAO:</b> Paoli/Thorndale ]</a></p>
|
||||
<p class="line-link"><a href="/route/CYN">[ <b>CYN:</b> Cynwyd ]</a></p>
|
||||
<p class="line-link"><a href="/route/AIR">[ <b>AIR:</b> Airport ]</a></p>
|
||||
<p class="line-link"><a href="/route/WIL">[ <b>WIL:</b> Wilmington/Newark ]</a></p>
|
||||
<p class="line-link"><a href="/route/CHW">[ <b>CHW:</b> Chestnut Hill West ]</a></p>
|
||||
<p class="line-link"><a href="/route/WAW">[ <b>WAW:</b> Media/Wawa ]</a></p>
|
||||
|
||||
<!--<h3 class="line-link">[ Reading ]</h3>-->
|
||||
<p class="line-link"><a href="/route/LAN">[ <b>LAN:</b> Lansdale/Doylestown ]</a></p>
|
||||
<p class="line-link"><a href="/route/NOR">[ <b>NOR:</b> Manayunk/Norristown ]</a></p>
|
||||
<p class="line-link"><a href="/route/CHE">[ <b>CHE:</b> Chestnut Hill East ]</a></p>
|
||||
<p class="line-link"><a href="/route/FOX">[ <b>FOX:</b> Fox Chase ]</a></p>
|
||||
<p class="line-link"><a href="/route/WTF">[ <b>WTR:</b> West Trenton ]</a></p>
|
||||
<p class="line-link"><a href="/route/WAR">[ <b>WAR:</b> Warminster ]</a></p>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend><h2>Metro</h2></legend>
|
||||
<p style="margin-top: 10px; margin-bottom: 10px;">For frequent rail service within Philadelphia and suburban locations</p>
|
||||
<p class="lines-label" style="font-weight: bold;">[ Subway/Elevated ]</p>
|
||||
<p class="line-link"><a href="/route/B1">[ <b>B1:</b> Broad Street Line Local ]</a></p>
|
||||
<p class="line-link"><a href="/route/B2">[ <b>B2:</b> Broad Street Line Express ]</a></p>
|
||||
<p class="line-link"><a href="/route/B3">[ <b>B3:</b> Broad Ridge Spur ]</a></p>
|
||||
<p class="line-link"><a href="/route/L1">[ <b>L1:</b> Market-Frankford Line ]</a></p>
|
||||
<p class="line-link"><a href="/route/S1">[ <b>S1:</b> Norristown-Airport Line ]</a></p>
|
||||
<p class="line-link"><a href="/route/S2">[ <b>S2:</b> Media-Chestnut Hill Line ]</a></p>
|
||||
<p class="line-link"><a href="/route/S3">[ <b>S3:</b> Paoli-Fox Chase Line ]</a></p>
|
||||
<p class="lines-label" style="font-weight: bold;">[ Urban Trolley ]</p>
|
||||
<p class="line-link"><a href="/route/T1">[ <b>T1:</b> Lancaster Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/T2">[ <b>T2:</b> Baltimore Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/T3">[ <b>T3:</b> Chester Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/T4">[ <b>T4:</b> Woodland Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/T5">[ <b>T5:</b> Elmwood Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/G1">[ <b>G1:</b> Girard Avenue Trolley ]</a></p>
|
||||
<p class="lines-label" style="font-weight: bold;">[ Suburban Trolley ]</p>
|
||||
<p class="line-link"><a href="/route/D1">[ <b>D1:</b> Media Line ]</a></p>
|
||||
<p class="line-link"><a href="/route/D2">[ <b>D2:</b> Sharon Hill Line ]</a></p>
|
||||
<p class="line-link"><a href="/route/M1">[ <b>M1:</b> Norristown High Speed Line ]</a></p>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend><h2>Bus</h2></legend>
|
||||
<p style="margin-top: 10px; margin-bottom: 10px;">For service of varying frequency within SEPTA's entire service area</p>
|
||||
<p class="lines-label" style="font-weight: bold;">[ Subway/Elevated ]</p>
|
||||
<p class="line-link"><a href="/route/B1">[ <b>B1:</b> Broad Street Line Local ]</a></p>
|
||||
<p class="line-link"><a href="/route/B2">[ <b>B2:</b> Broad Street Line Express ]</a></p>
|
||||
<p class="line-link"><a href="/route/B3">[ <b>B3:</b> Broad Ridge Spur ]</a></p>
|
||||
<p class="line-link"><a href="/route/L1">[ <b>L1:</b> Market-Frankford Line ]</a></p>
|
||||
<p class="lines-label" style="font-weight: bold;">[ Urban Trolley ]</p>
|
||||
<p class="line-link"><a href="/route/T1">[ <b>T1:</b> Lancaster Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/T2">[ <b>T2:</b> Baltimore Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/T3">[ <b>T3:</b> Chester Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/T4">[ <b>T4:</b> Woodland Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/T5">[ <b>T5:</b> Elmwood Avenue Trolley ]</a></p>
|
||||
<p class="line-link"><a href="/route/G1">[ <b>G1:</b> Girard Avenue Trolley ]</a></p>
|
||||
<p class="lines-label" style="font-weight: bold;">[ Suburban Trolley ]</p>
|
||||
<p class="line-link"><a href="/route/D1">[ <b>D1:</b> Media Line ]</a></p>
|
||||
<p class="line-link"><a href="/route/D2">[ <b>D2:</b> Sharon Hill Line ]</a></p>
|
||||
<p class="line-link"><a href="/route/M1">[ <b>M1:</b> Norristown High Speed Line ]</a></p>
|
||||
</fieldset>
|
||||
|
||||
<style>
|
||||
.line-link, .lines-label {
|
||||
white-space: pre;
|
||||
margin-top: 3px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.lines-label {
|
||||
color: #ffffff;
|
||||
background-color: #000000;
|
||||
width: max-content;
|
||||
}
|
||||
</style>
|
Loading…
Add table
Add a link
Reference in a new issue