some major improvements

- filter by station type
- sort by distance (WIP)
- detect old data structure and clear localStorage if not compatible
- add substitue coordinates for stations without valid osm node
- improve responsive styles
This commit is contained in:
kritzl 2024-06-06 11:27:16 +02:00
parent af50e0f04d
commit 14a514e3e4
5 changed files with 726 additions and 128 deletions

209
style.css
View file

@ -10,6 +10,18 @@
--color-gray-800: hsl(12, 6%, 15%);
--color-gray-900: hsl(24, 10%, 10%);
--color-gray-950: hsl(20, 14%, 4%);
--color-red: #971616;
--color-orange: #cc6300;
--color-green: #19942e;
--bg-type-u: #006ab3;
--bg-type-s: #1a962b;
--bg-type-a: #f39100;
--bg-type-r: #000000;
--bg-type-u-disabled: #c3cfd7;
--bg-type-s-disabled: #c6d4c8;
--bg-type-a-disabled: #dfd8cf;
--bg-type-r-disabled: #b3b3b3;
--color-type-disabled: var(--color-gray-400);
--bg: var(--color-gray-50);
--text: var(--color-gray-950);
--text-secondary: var(--color-gray-700);
@ -52,23 +64,64 @@
--station-border: var(--color-gray-600);
--station-border-hover: var(--color-gray-400);
--elevator-bg: var(--color-gray-900);
--bg-type-u-disabled: #627f93;
--bg-type-s-disabled: #688b6d;
--bg-type-a-disabled: #aa987f;
--bg-type-r-disabled: #333333;
--color-type-disabled: var(--color-gray-200);
}
}
body.has-dialog {
overflow: hidden;
}
.dialogs {
display: none;
position: fixed;
overflow-y: auto;
max-width: 100vw;
padding: 1em;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba(0, 0, 0, 0.3);
}
.dialogs.active {
display: block;
}
[role=dialog] {
box-sizing: border-box;
max-width: 800px;
margin: 0 auto;
padding: 15px;
border-radius: 1rem;
background-color: var(--background);
color: var(--color);
position: relative;
}
[role=dialog] button.close-modal {
position: absolute;
top: 0;
right: 0;
}
.hidden {
display: none !important;
}
.text-red {
color: #971616;
color: var(--color-red);
}
.text-orange {
color: #cc6300;
color: var(--color-orange);
}
.text-green {
color: #19942e;
color: var(--color-green);
}
body {
@ -125,6 +178,8 @@ main {
}
footer {
display: flex;
justify-content: center;
margin: 1em auto;
max-width: 960px;
}
@ -147,6 +202,9 @@ button:hover {
background-color: var(--station-bg-hover);
border-color: var(--station-border-hover);
}
button[aria-pressed=true] {
background-color: var(--nav-bg-visited);
}
button.size-s {
font-size: 0.8rem;
padding: var(--space-s) var(--space-m);
@ -168,12 +226,23 @@ div#updateInfo {
div#filters {
display: flex;
flex-wrap: wrap;
gap: var(--space-m);
justify-items: stretch;
justify-content: stretch;
}
div#filters button, div#filters input {
font-size: 1.5rem;
}
div#filters > * {
width: 100%;
justify-content: center;
text-align: center;
}
@media screen and (min-width: 576px) {
div#filters > * {
width: auto;
}
}
button#initialLoad {
font-size: 1.5rem;
@ -183,6 +252,14 @@ button.loadOSM {
width: fit-content;
}
div#errorMessage {
border: solid 2px var(--color-red);
border-radius: var(--item-radius);
padding: var(--space-xl) var(--space-xl);
margin-top: var(--space-l);
font-size: 1.5rem;
}
ul#stationList {
padding: 0;
list-style: none;
@ -202,9 +279,20 @@ ul#stationList > li.station > div.stationSummary {
display: flex;
gap: var(--space-m);
}
ul#stationList > li.station > div.stationSummary div.typeList {
ul#stationList > li.station > div.stationSummary div.symbol {
position: relative;
}
ul#stationList > li.station > div.stationSummary div.symbol div.typeList {
flex-shrink: 0;
}
ul#stationList > li.station > div.stationSummary div.symbol div.distance {
position: absolute;
width: 100%;
bottom: -2lh;
text-align: center;
color: var(--text-secondary);
font-size: 0.9em;
}
ul#stationList > li.station > div.stationSummary div.stationTitle {
align-self: stretch;
flex-grow: 1;
@ -286,19 +374,26 @@ ul#stationList > li.station > details > ul > li.elevator {
display: flex;
align-items: start;
flex-wrap: nowrap;
padding: var(--space-m);
gap: var(--space-m);
position: relative;
margin: 0 1rem 1rem;
padding-right: var(--space-2xl);
margin: 0 var(--space-s) var(--space-s);
padding: var(--space-s);
}
@media screen and (min-width: 576px) {
ul#stationList > li.station > details > ul > li.elevator {
margin: 0 var(--space-2xl) 1rem;
padding: var(--space-m);
padding-right: var(--space-2xl);
}
}
ul#stationList > li.station > details > ul > li.elevator > span {
ul#stationList > li.station > details > ul > li.elevator > .stateIcon {
flex-shrink: 0;
display: none;
}
@media screen and (min-width: 576px) {
ul#stationList > li.station > details > ul > li.elevator > .stateIcon {
display: inline;
}
}
ul#stationList > li.station > details > ul > li.elevator:not(:first-child):before {
content: "";
@ -326,11 +421,25 @@ ul#stationList > li.station > details > ul > li.elevator > div.elevatorData .ele
font-weight: bold;
grid-column: 1/-1;
}
ul#stationList > li.station > details > ul > li.elevator > div.elevatorData .lineList {
ul#stationList > li.station > details > ul > li.elevator > div.elevatorData div.firstRow {
grid-column: 1/-1;
display: flex;
gap: var(--space-m);
}
@media screen and (min-width: 576px) {
ul#stationList > li.station > details > ul > li.elevator > div.elevatorData div.firstRow.hiddenOnDesktop {
display: none;
}
}
@media screen and (min-width: 576px) {
ul#stationList > li.station > details > ul > li.elevator > div.elevatorData div.firstRow .stateIcon {
display: none;
}
}
ul#stationList > li.station > details > ul > li.elevator > div.elevatorData div.firstRow .lineList {
display: flex;
gap: var(--space-m);
align-items: center;
grid-column: 1/-1;
min-height: var(--space-2xl);
}
ul#stationList > li.station > details > ul > li.elevator > div.elevatorData hr {
@ -350,6 +459,7 @@ ul#stationList > li.station > details > ul > li.elevator > div.elevatorData .osm
ul#stationList > li.station > details > ul > li.elevator > div.elevatorData .osm .osmHeading {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--space-l);
margin-bottom: var(--space-l);
}
@ -414,7 +524,7 @@ ul#stationList > li.station > details > ul > li.elevator > div.elevatorData dl d
font-weight: bold;
min-width: 15ch;
}
@media (max-width: 576px) {
@media (max-width: 400px) {
ul#stationList > li.station > details > ul > li.elevator > div.elevatorData dl div dt {
width: 100%;
}
@ -430,66 +540,101 @@ ul#stationList > li.station > details > ul > li.elevator > div.elevatorData dl d
}
}
span.lineChip, span.typeChip {
span.lineChip, span.typeChip, button.typeChip {
font-weight: bold;
font-size: 0.8em;
text-align: center;
box-sizing: border-box;
}
span.lineChip[data-type=U], span.typeChip[data-type=U] {
background-color: #006ab3;
span.lineChip[data-type=U], span.typeChip[data-type=U], button.typeChip[data-type=U] {
background-color: var(--bg-type-u);
color: #ffffff;
}
span.lineChip[data-type=U][data-line=U1], span.typeChip[data-type=U][data-line=U1] {
span.lineChip[data-type=U][data-line=U1], span.typeChip[data-type=U][data-line=U1], button.typeChip[data-type=U][data-line=U1] {
background-color: #006ab3;
}
span.lineChip[data-type=U][data-line=U2], span.typeChip[data-type=U][data-line=U2] {
span.lineChip[data-type=U][data-line=U2], span.typeChip[data-type=U][data-line=U2], button.typeChip[data-type=U][data-line=U2] {
background-color: #e2001a;
}
span.lineChip[data-type=U][data-line=U3], span.typeChip[data-type=U][data-line=U3] {
span.lineChip[data-type=U][data-line=U3], span.typeChip[data-type=U][data-line=U3], button.typeChip[data-type=U][data-line=U3] {
background-color: #ffdd00;
color: #000000;
}
span.lineChip[data-type=U][data-line=U4], span.typeChip[data-type=U][data-line=U4] {
span.lineChip[data-type=U][data-line=U4], span.typeChip[data-type=U][data-line=U4], button.typeChip[data-type=U][data-line=U4] {
background-color: #0098a1;
}
span.lineChip[data-type=S], span.typeChip[data-type=S] {
background-color: #1a962b;
span.lineChip[data-type=S], span.typeChip[data-type=S], button.typeChip[data-type=S] {
background-color: var(--bg-type-s);
color: #ffffff;
}
span.lineChip[data-type=S][data-line=S1], span.typeChip[data-type=S][data-line=S1] {
span.lineChip[data-type=S][data-line=S1], span.typeChip[data-type=S][data-line=S1], button.typeChip[data-type=S][data-line=S1] {
background-color: #1a962b;
}
span.lineChip[data-type=S][data-line=S2], span.typeChip[data-type=S][data-line=S2] {
span.lineChip[data-type=S][data-line=S2], span.typeChip[data-type=S][data-line=S2], button.typeChip[data-type=S][data-line=S2] {
background-color: #b51143;
}
span.lineChip[data-type=S][data-line=S3], span.typeChip[data-type=S][data-line=S3] {
span.lineChip[data-type=S][data-line=S3], span.typeChip[data-type=S][data-line=S3], button.typeChip[data-type=S][data-line=S3] {
background-color: #622181;
}
span.lineChip[data-type=S][data-line=S4], span.typeChip[data-type=S][data-line=S4] {
span.lineChip[data-type=S][data-line=S4], span.typeChip[data-type=S][data-line=S4], button.typeChip[data-type=S][data-line=S4] {
background-color: #be148e;
}
span.lineChip[data-type=S][data-line=S5], span.typeChip[data-type=S][data-line=S5] {
span.lineChip[data-type=S][data-line=S5], span.typeChip[data-type=S][data-line=S5], button.typeChip[data-type=S][data-line=S5] {
background-color: #0089bb;
}
span.lineChip[data-type=S][data-line=S6], span.typeChip[data-type=S][data-line=S6] {
span.lineChip[data-type=S][data-line=S6], span.typeChip[data-type=S][data-line=S6], button.typeChip[data-type=S][data-line=S6] {
background-color: #d3da00;
color: #000000;
}
span.lineChip[data-type=A], span.typeChip[data-type=A] {
background-color: #f39100;
span.lineChip[data-type=A], span.typeChip[data-type=A], button.typeChip[data-type=A] {
background-color: var(--bg-type-a);
color: #ffffff;
}
span.lineChip[data-type=R], span.typeChip[data-type=R] {
background-color: #000000;
span.lineChip[data-type=R], span.typeChip[data-type=R], button.typeChip[data-type=R] {
background-color: var(--bg-type-r);
color: #ffffff;
}
@media (prefers-color-scheme: dark) {
span.lineChip[data-type=R], span.typeChip[data-type=R] {
span.lineChip[data-type=R], span.typeChip[data-type=R], button.typeChip[data-type=R] {
border: solid 2px #ffffff;
}
}
div#typeFilter {
display: flex;
flex-grow: 1;
flex-wrap: nowrap;
flex-shrink: 0;
min-height: var(--space-2xl);
gap: var(--space-m);
}
div#typeFilter button.typeChip {
padding: 0;
height: 100%;
aspect-ratio: 1/1;
justify-content: center;
align-items: center;
}
div#typeFilter button.typeChip[data-type=U], div#typeFilter button.typeChip[data-type=S], div#typeFilter button.typeChip[data-type=A], div#typeFilter button.typeChip[data-type=R] {
border: solid 2px var(--station-border);
}
div#typeFilter button.typeChip[data-type=U][aria-pressed=false], div#typeFilter button.typeChip[data-type=S][aria-pressed=false], div#typeFilter button.typeChip[data-type=A][aria-pressed=false], div#typeFilter button.typeChip[data-type=R][aria-pressed=false] {
background-color: var(--color-gray-500);
color: var(--color-type-disabled);
}
div#typeFilter button.typeChip[data-type=U][aria-pressed=false][data-type=U], div#typeFilter button.typeChip[data-type=S][aria-pressed=false][data-type=U], div#typeFilter button.typeChip[data-type=A][aria-pressed=false][data-type=U], div#typeFilter button.typeChip[data-type=R][aria-pressed=false][data-type=U] {
background-color: var(--bg-type-u-disabled);
}
div#typeFilter button.typeChip[data-type=U][aria-pressed=false][data-type=S], div#typeFilter button.typeChip[data-type=S][aria-pressed=false][data-type=S], div#typeFilter button.typeChip[data-type=A][aria-pressed=false][data-type=S], div#typeFilter button.typeChip[data-type=R][aria-pressed=false][data-type=S] {
background-color: var(--bg-type-s-disabled);
}
div#typeFilter button.typeChip[data-type=U][aria-pressed=false][data-type=A], div#typeFilter button.typeChip[data-type=S][aria-pressed=false][data-type=A], div#typeFilter button.typeChip[data-type=A][aria-pressed=false][data-type=A], div#typeFilter button.typeChip[data-type=R][aria-pressed=false][data-type=A] {
background-color: var(--bg-type-a-disabled);
}
div#typeFilter button.typeChip[data-type=U][aria-pressed=false][data-type=R], div#typeFilter button.typeChip[data-type=S][aria-pressed=false][data-type=R], div#typeFilter button.typeChip[data-type=A][aria-pressed=false][data-type=R], div#typeFilter button.typeChip[data-type=R][aria-pressed=false][data-type=R] {
background-color: var(--bg-type-r-disabled);
}
span.lineChip {
padding: 0.3em 0.6em;
min-width: 4ch;