@import "colors"; $mobileBreakpoint: 576px; $smallBreakpoint: 400px; $mediumBreakpoint: 800px; :root { @include tailwindColors(); // LineType Colors $colorTypeU: #006ab3; $colorTypeS: #1a962b; $colorTypeA: #f39100; $colorTypeR: #000000; --bg-type-u: #{$colorTypeU}; --bg-type-s: #{$colorTypeS}; --bg-type-a: #{$colorTypeA}; --bg-type-r: #{$colorTypeR}; --bg-type-u-disabled: #{scale-color($colorTypeU, $saturation: -80%, $lightness: +70%)}; --bg-type-s-disabled: #{scale-color($colorTypeS, $saturation: -80%, $lightness: +70%)}; --bg-type-a-disabled: #{scale-color($colorTypeA, $saturation: -80%, $lightness: +70%)}; --bg-type-r-disabled: #{scale-color($colorTypeR, $saturation: -80%, $lightness: +70%)}; --color-type-disabled: var(--color-gray-400); // Line Colors --color-line-U1: #006ab3; --color-line-U2: #e2001a; --color-line-U3: #ffdd00; --color-line-U4: #0098a1; --color-line-S1: #1a962b; --color-line-S2: #b51143; --color-line-S3: #622181; --color-line-S4: #be148e; --color-line-S5: #0089bb; --color-line-S6: #d3da00; // Component Styles --bg: var(--color-gray-50); --text: var(--color-gray-950); --text-secondary: var(--color-gray-700); --nav-bg: var(--color-indigo-400); --nav-bg-hover: var(--color-indigo-200); --nav-bg-visited: var(--color-purple-400); --link: var(--color-indigo-600); --link-hover: var(--color-indigo-800); --link-visited: var(--color-purple-600); --station-bg: var(--color-gray-50); --station-bg-hover: var(--color-gray-400); --station-border: var(--color-gray-400); --station-border-hover: var(--color-gray-600); --elevator-bg: var(--color-gray-100); --backdrop: rgb(0 0 0 / 20%); @media (prefers-color-scheme: dark) { // LineType Colors --bg-type-u-disabled: #{scale-color($colorTypeU, $saturation: -80%, $lightness: +20%)}; --bg-type-s-disabled: #{scale-color($colorTypeS, $saturation: -80%, $lightness: +20%)}; --bg-type-a-disabled: #{scale-color($colorTypeA, $saturation: -80%, $lightness: +20%)}; --bg-type-r-disabled: #{scale-color($colorTypeR, $saturation: -80%, $lightness: +20%)}; --color-type-disabled: var(--color-gray-200); // Component Styles --bg: var(--color-gray-950); --text: var(--color-gray-50); --text-secondary: var(--color-gray-400); --nav-bg: var(--color-indigo-800); --nav-bg-hover: var(--color-indigo-950); --nav-bg-visited: var(--color-purple-800); --link: var(--color-indigo-400); --link-hover: var(--color-indigo-200); --link-visited: var(--color-purple-400); --station-bg: var(--color-gray-950); --station-bg-hover: var(--color-gray-600); --station-border: var(--color-gray-600); --station-border-hover: var(--color-gray-400); --elevator-bg: var(--color-gray-900); --backdrop: rgb(100% 100% 100% / 20%); } --elevator-list-gap: 3rem; --item-radius: 1.5rem; --btn-radius: 0.8rem; --type-icon-size: 3.2rem; --space-s: 0.25rem; --space-m: 0.5rem; --space-l: 1rem; --space-xl: 2rem; --space-2xl: 3rem; } 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; z-index: 99; background: var(--backdrop); &.active { display: block; } [role="dialog"] { box-sizing: border-box; max-width: 800px; margin: 0 auto; padding: var(--space-xl); padding-bottom: var(--space-2xl); background-color: var(--bg); color: var(--text); overflow: hidden; position: absolute; right: 0; bottom: 0; left: 0; border-radius: var(--item-radius) var(--item-radius) 0 0; @media screen and (min-width: $mobileBreakpoint) { position: relative; border-radius: var(--item-radius); } button { &.close-modal { position: absolute; top: 0; right: 0; border-radius: 0 0 0 var(--btn-radius); border: none; } } } } .hidden { display: none !important; } .text-red { color: var(--color-red-800); } .text-orange { color: var(--color-orange-500); } .text-green { color: var(--color-green-600); } body { font-family: system-ui, ui-sans-serif, sans-serif; font-size: 1.2rem; // colors background-color: var(--bg); color: var(--text); } h1 { text-align: center; } a { color: var(--link); text-decoration: none; &:hover, &:visited:hover { text-decoration: underline; color: var(--link-hover); } &:visited { color: var(--link-visited); } } nav { ul { padding: 0; list-style: none; display: flex; flex-direction: row; justify-content: center; gap: var(--space-m); li { a { font-weight: bold; color: var(--text); text-decoration: none; background-color: var(--nav-bg); padding: var(--space-m) var(--space-l); cursor: pointer; &:hover, &:visited:hover { text-decoration: underline; background-color: var(--nav-bg-hover); } &:visited { color: var(--text); background-color: var(--nav-bg-visited); } } } } } main { margin: 4em auto; max-width: 960px; } footer { display: flex; justify-content: center; margin: 1em auto; max-width: 960px; } button, input { background-color: var(--station-bg); color: var(--text); padding: var(--space-m) var(--space-l); border-radius: var(--item-radius); border: solid 2px var(--station-border); } button { cursor: pointer; display: inline-flex; align-items: center; gap: var(--space-m); &:hover { background-color: var(--station-bg-hover); border-color: var(--station-border-hover); } &[aria-pressed='true'] { background-color: var(--nav-bg-visited); } &.size-s { font-size: 0.8rem; padding: var(--space-s) var(--space-m); } &.size-m { padding: var(--space-m) var(--space-l); } &.size-l { font-size: 1.5rem; padding: var(--space-m) var(--space-l); } } div#updateInfo { display: flex; align-items: center; gap: var(--space-m); justify-content: end; flex-direction: column; margin-bottom: var(--space-l); @media screen and (min-width: $mobileBreakpoint) { flex-direction: row; } #oldDataWarning { color: var(--color-red-600); font-weight: bold; } } div#filters { display: flex; flex-wrap: wrap; gap: var(--space-m); justify-content: stretch; button, input { font-size: 1.5rem; } > * { width: 100%; justify-content: center; text-align: center; @media screen and (min-width: $mobileBreakpoint) { width: auto; } } } button#initialLoad { font-size: 1.5rem; } button.loadOSM { width: fit-content; } div#errorMessage { border: solid 2px var(--color-red-600); 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; display: flex; flex-direction: column; gap: var(--space-m); li#filterInfo { text-align: center; padding: var(--space-l) var(--space-xl); font-style: italic; } > li.station { background-color: var(--station-bg); border-radius: var(--item-radius); border: solid 0.2rem var(--station-border); overflow: hidden; position: relative; padding: var(--space-m); > div.stationSummary { display: flex; gap: var(--space-m); div.symbol { position: relative; div.typeList { flex-shrink: 0; } div.distance { position: absolute; width: 100%; bottom: -2lh; text-align: center; color: var(--text-secondary); font-size: 0.9em; } } div.stationTitle { align-self: stretch; flex-grow: 1; display: flex; flex-wrap: wrap; justify-content: space-between; > h3 { font-size: 1.5rem; line-height: var(--type-icon-size); margin: 0; width: 100%; @media screen and (min-width: $mobileBreakpoint) { width: auto; } } > div.elevator-preview { flex-shrink: 0; display: flex; flex-wrap: wrap; justify-content: start; width: 100%; @media screen and (min-width: $mobileBreakpoint) { max-width: calc(2rem * 5); justify-content: end; width: auto; } } } } > details { width: 100%; display: flex; flex-direction: column; summary { width: 100%; list-style: none; display: inline-flex; cursor: pointer; margin-left: calc(var(--space-m) + var(--type-icon-size)); > span { border: solid 2px var(--station-border); display: inline-flex; padding: var(--space-m) var(--space-l); border-radius: var(--btn-radius); } &:hover { > span { background-color: var(--station-bg-hover); border-color: var(--station-border-hover); } } &::after { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; pointer-events: auto; content: ""; background-color: rgba(0, 0, 0, 0); } @media (prefers-reduced-motion: no-preference) { transition: margin 150ms ease-out; } } &[open] summary { margin-bottom: 1rem; } > div.comment { position: relative; z-index: 20; display: inline-flex; margin-left: calc(var(--space-m) + var(--type-icon-size)); padding-bottom: var(--space-m); border-bottom: solid 2px var(--station-border); > p { display: block; border: solid 2px var(--nav-bg); border-radius: var(--btn-radius); padding: var(--space-l); } } > ul { padding: 0; list-style: none; display: flex; flex-direction: column; gap: var(--elevator-list-gap); overflow: hidden; position: relative; z-index: 20; > li.elevator { display: flex; align-items: start; flex-wrap: nowrap; gap: var(--space-m); position: relative; margin: 0 var(--space-s) var(--space-s); padding: var(--space-s); @media screen and (min-width: $mobileBreakpoint) { margin: 0 var(--space-2xl) 1rem; padding: var(--space-m); padding-right: var(--space-2xl); } // elevator icon > .stateIcon { flex-shrink: 0; display: none; @media screen and (min-width: $mobileBreakpoint) { display: inline; } } // space above first elevator &:first-child { padding-top: var(--space-l); } // divider between elevators &:not(:first-child):before { content: ""; position: absolute; left: 0; top: calc(var(--elevator-list-gap) / -2); height: 2px; width: 100%; background: var(--station-border); } > div.elevatorData { width: 100%; display: grid; flex-direction: column; gap: var(--space-l); align-items: start; grid-template-columns: 1fr; @media screen and (min-width: $mediumBreakpoint) { grid-template-columns: 1fr 1fr; } .elevatorInfo { font-weight: bold; grid-column: 1 / -1; } div.firstRow { grid-column: 1 / -1; display: flex; gap: var(--space-m); &.hiddenOnDesktop { @media screen and (min-width: $mobileBreakpoint) { display: none; } } .stateIcon { @media screen and (min-width: $mobileBreakpoint) { display: none; } } .lineList { display: flex; gap: var(--space-m); align-items: center; min-height: var(--space-2xl); } } hr { grid-column: 1 / -1; width: 100%; margin: 0; border: none; border-bottom: dashed 2px var(--station-border); } .osm { grid-column: 1 / -1; color: var(--text-secondary); border: dashed 2px var(--station-border); border-radius: var(--item-radius); padding: var(--space-l); .osmHeading { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-l); margin-bottom: var(--space-l); h4 { margin: 0; } } dl { div { dt { min-width: 18ch; } } } } ol.levelList { --dot-size: 0.8rem; --line-width: 0.3rem; --left-space: 1.4rem; list-style: none; padding-left: var(--left-space); > li { position: relative; //font-size: 1.8rem; line-height: 1.8em; &:before { background-color: currentColor; width: var(--line-width); content: ''; position: absolute; top: 0; bottom: 0; left: calc(var(--left-space) * -1 + var(--dot-size) / 2 - var(--line-width) / 2); } &:first-child { &:before { top: 0.5lh; } } &:last-child { &:before { bottom: calc(100% - 0.5lh); } } &:after { background-color: currentColor; width: var(--dot-size); height: var(--dot-size); border-radius: 100%; content: ''; position: absolute; top: calc(0.5lh - (var(--dot-size) / 2)); left: calc(var(--left-space) * -1); } } } dl { display: flex; flex-direction: column; width: 100%; gap: 0.2rem; div { display: flex; align-items: center; flex-wrap: wrap; dt { flex-shrink: 0; display: flex; gap: var(--space-m); align-items: center; font-weight: bold; min-width: 15ch; @media (max-width: $smallBreakpoint) { width: 100%; } } dd { width: 0; flex-grow: 1; margin-left: var(--space-2xl); @media screen and (min-width: $mobileBreakpoint) { margin-left: 1rem; } } } } } } } } } } span.lineChip, span.typeChip, button.typeChip { font-weight: bold; font-size: 0.8em; text-align: center; box-sizing: border-box; &[data-type="U"] { background-color: var(--bg-type-u); color: var(--color-white); &[data-line="U1"] { background-color: var(--color-line-U1); } &[data-line="U2"] { background-color: var(--color-line-U2); } &[data-line="U3"] { background-color: var(--color-line-U3); color: var(--color-black); } &[data-line="U4"] { background-color: var(--color-line-U4); } &[data-line="U5"] { background-color: var(--color-line-U5); } } &[data-type="S"] { background-color: var(--bg-type-s); color: var(--color-white); &[data-line="S1"] { background-color: var(--color-line-S1); } &[data-line="S2"] { background-color: var(--color-line-S2); } &[data-line="S3"] { background-color: var(--color-line-S3); } &[data-line="S4"] { background-color: var(--color-line-S4); } &[data-line="S5"] { background-color: var(--color-line-S5); } &[data-line="S6"] { background-color: var(--color-line-S6); color: var(--color-black); } } &[data-type="A"] { background-color: var(--bg-type-a); color: var(--color-white); } &[data-type="R"] { background-color: var(--bg-type-r); color: var(--color-white); @media (prefers-color-scheme: dark) { border: solid 2px var(--color-white); } } } div#typeFilter { display: flex; flex-grow: 1; flex-wrap: nowrap; flex-shrink: 0; min-height: var(--space-2xl); gap: var(--space-m); button.typeChip { padding: 0; height: 100%; aspect-ratio: 1/1; justify-content: center; align-items: center; position: relative; overflow: hidden; &[data-type="U"], &[data-type="S"], &[data-type="A"], &[data-type="R"] { border: solid 2px var(--station-border); &[data-pressed="false"] { background-color: var(--color-gray-500); color: var(--color-type-disabled); &[data-type="U"] { background-color: var(--bg-type-u-disabled); } &[data-type="S"] { background-color: var(--bg-type-s-disabled); } &[data-type="A"] { background-color: var(--bg-type-a-disabled); } &[data-type="R"] { background-color: var(--bg-type-r-disabled); } &::after { position: absolute; content: ''; width: 144%; height: 0.4rem; background-color: var(--color-gray-500); opacity: 80%; transform: rotate(-45deg); } } } } } span.lineChip { padding: 0.3em 0.6em; min-width: 4ch; &[data-type="U"] { padding: 0.3em 0.1em; } &[data-type="S"] { border-radius: 2em; min-width: 6ch; } &[data-type="A"] { padding: 0.3em 0.1em; border-radius: 2em; } } .typeList { width: var(--type-icon-size); height: var(--type-icon-size); display: flex; flex-wrap: wrap; gap: 0.2rem; align-items: center; justify-content: center; } span.typeChip { --chip-size: 1.5; &:only-child { --chip-size: 3; } width: calc(1rem * var(--chip-size)); min-width: calc(1rem * var(--chip-size)); height: calc(1rem * var(--chip-size)); font-size: calc(0.5rem * var(--chip-size)); display: inline-flex; align-items: center; justify-content: center; &[data-type="U"], &[data-type="A"], &[data-type="R"], &[data-type="S"] { border-radius: 100%; padding: 0; } } span[data-icon] { display: inline-block; vertical-align: top; width: 1em; height: 1em; mask-size: contain; mask-position: center; mask-repeat: no-repeat; background-color: currentColor; flex-shrink: 0; &.size-s { font-size: 1rem } &.size-m { font-size: 1.5rem } &.size-l { font-size: 2rem } &.size-xl { font-size: 3rem } &[data-icon="location"] { mask-image: url(/md_icons/location.svg); } &[data-icon="elevator"] { mask-image: url(/md_icons/elevator.svg); } &[data-icon="elevator-slash"] { mask-image: url(/md_icons/elevator-slash.svg); } &[data-icon="fit-width"] { mask-image: url(/md_icons/fit_width.svg); } &[data-icon="width"] { mask-image: url(/md_icons/width.svg); } &[data-icon="length"] { mask-image: url(/md_icons/height.svg); } &[data-icon="braille"] { mask-image: url(/md_icons/braille.svg); } &[data-icon="speaker"] { mask-image: url(/md_icons/speaker.svg); } &[data-icon="wheelchair"] { mask-image: url(/md_icons/wheelchair.svg); } &[data-icon="bicycle"] { mask-image: url(/md_icons/bicycle.svg); } &[data-icon="info"] { mask-image: url(/md_icons/info.svg); } &[data-icon="up-down"] { mask-image: url(/md_icons/up-down.svg); } &[data-icon="location-searching"] { mask-image: url(/md_icons/location-searching.svg); } &[data-icon="load"] { mask-image: url(/md_icons/load.svg); } &[data-icon="close"] { mask-image: url(/md_icons/close.svg); } &.spinner { animation-delay: 0s; animation-direction: normal; animation-duration: 1s; animation-fill-mode: none; animation-iteration-count: infinite; animation-name: spinner; animation-play-state: running; animation-timing-function: linear } } @keyframes spinner { to { transform: rotate(360deg); } }