From 632eef6424d8dc8d40c2906177892697679e7b85 Mon Sep 17 00:00:00 2001 From: Joris Date: Sat, 19 Apr 2025 12:36:38 +0200 Subject: Add ZIG server --- frontend/styles/colors.sass | 7 + frontend/styles/form.sass | 123 ++++++++ frontend/styles/leaflet.css | 656 +++++++++++++++++++++++++++++++++++++++ frontend/styles/lib/icons.sass | 15 + frontend/styles/main.sass | 71 +++++ frontend/styles/pages/login.sass | 12 + frontend/styles/pages/map.sass | 84 +++++ frontend/styles/pages/maps.sass | 2 + frontend/styles/ui/layout.sass | 25 ++ frontend/styles/ui/modal.sass | 57 ++++ 10 files changed, 1052 insertions(+) create mode 100644 frontend/styles/colors.sass create mode 100644 frontend/styles/form.sass create mode 100644 frontend/styles/leaflet.css create mode 100644 frontend/styles/lib/icons.sass create mode 100644 frontend/styles/main.sass create mode 100644 frontend/styles/pages/login.sass create mode 100644 frontend/styles/pages/map.sass create mode 100644 frontend/styles/pages/maps.sass create mode 100644 frontend/styles/ui/layout.sass create mode 100644 frontend/styles/ui/modal.sass (limited to 'frontend/styles') diff --git a/frontend/styles/colors.sass b/frontend/styles/colors.sass new file mode 100644 index 0000000..5aef1c4 --- /dev/null +++ b/frontend/styles/colors.sass @@ -0,0 +1,7 @@ +$black: #333 +$red: #cf5c56 +$brown: #a04642 +$green: #9fd2a5 +$blue: #6ca2a4 +$gray-dark: #bbb +$gray: #eee diff --git a/frontend/styles/form.sass b/frontend/styles/form.sass new file mode 100644 index 0000000..fc25019 --- /dev/null +++ b/frontend/styles/form.sass @@ -0,0 +1,123 @@ +@use 'colors' +@use 'sass:color'; + +$input-height: 2.5rem +$input-border-radius: 0.125rem +$input-border-color: colors.$gray-dark +$input-color-height: 0.7 * $input-height + +.g-Label + display: flex + flex-direction: column + margin-bottom: 1rem + font-size: 0.9rem + + & > :first-child + margin-top: 0.25rem + +.g-Input + display: flex + height: $input-height + border: 1px solid $input-border-color + border-radius: $input-border-radius + padding: 0 0.5rem + font-size: inherit + font-family: inherit + + &[type="color"] + padding: 0 + border: none + width: 100px + height: $input-color-height + +.g-Textarea + padding: 0.5rem + resize: vertical + font-size: inherit + font-family: inherit + height: $input-height + min-height: $input-height + +.g-Select + display: flex + height: $input-height + border: 1px solid $input-border-color + border-radius: $input-border-radius + padding: 0 0.5rem + font-size: inherit + +.g-Button + display: flex + align-items: center + justify-content: center + padding: 0.5rem + height: $input-height + cursor: pointer + border: none + border-radius: $input-border-radius + color: black + font-size: 1rem + + &:disabled + background-color: colors.$gray + cursor: default + + &--Primary + background-color: colors.$green + color: white + &:not(:disabled):hover + background-color: color.scale(colors.$green, $lightness: 10%) + + &--Danger + background-color: colors.$red + color: white + &:not(:disabled):hover + background-color: color.scale(colors.$red, $lightness: 10%) + + &--FullWidth + width: 100% + +.g-ColorLine + display: flex + gap: 2rem + align-items: center + +.g-ColorButtons + display: flex + gap: 1rem + +.g-ColorButton + border-radius: 50% + width: $input-color-height + height: $input-color-height + border: none + margin-top: 0.25rem + cursor: pointer + +.g-FormError + color: colors.$red + margin-bottom: 2rem + text-align: center + +.g-Form__SubmitParent + position: relative + + .g-Button--Primary + .g-Form__SubmitSpinner + background-color: colors.$green + + .g-Button--Danger + .g-Form__SubmitSpinner + background-color: colors.$red + + & > .g-Form__SubmitSpinner + position: absolute + top: 0 + bottom: 0 + left: 0 + right: 0 + display: flex + align-items: center + justify-content: center + + svg + height: $input-height * 0.6 + fill: white diff --git a/frontend/styles/leaflet.css b/frontend/styles/leaflet.css new file mode 100644 index 0000000..981874b --- /dev/null +++ b/frontend/styles/leaflet.css @@ -0,0 +1,656 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Prevents IE11 from highlighting tiles in blue */ +.leaflet-tile::selection { + background: transparent; +} +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg { + max-width: none !important; + max-height: none !important; + } +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + width: auto; + padding: 0; + } + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +svg.leaflet-zoom-animated { + will-change: transform; +} + +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive, +svg.leaflet-image-layer.leaflet-interactive path { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline-offset: 1px; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + font-size: 12px; + font-size: 0.75rem; + line-height: 1.5; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover, +.leaflet-bar a:focus { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(images/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + font-size: 13px; + font-size: 1.08333em; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */ + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.8); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + line-height: 1.4; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover, +.leaflet-control-attribution a:focus { + text-decoration: underline; + } +.leaflet-attribution-flag { + display: inline !important; + vertical-align: baseline !important; + width: 1em; + height: 0.6669em; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + white-space: nowrap; + -moz-box-sizing: border-box; + box-sizing: border-box; + background: rgba(255, 255, 255, 0.8); + text-shadow: 1px 1px #fff; + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 24px 13px 20px; + line-height: 1.3; + font-size: 13px; + font-size: 1.08333em; + min-height: 1px; + } +.leaflet-popup-content p { + margin: 17px 0; + margin: 1.3em 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-top: -1px; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + pointer-events: auto; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + border: none; + text-align: center; + width: 24px; + height: 24px; + font: 16px/24px Tahoma, Verdana, sans-serif; + color: #757575; + text-decoration: none; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover, +.leaflet-container a.leaflet-popup-close-button:focus { + color: #585858; + } +.leaflet-popup-scrolled { + overflow: auto; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + -ms-zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-interactive { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } + +/* Printing */ + +@media print { + /* Prevent printers from removing background-images of controls. */ + .leaflet-control { + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + } + } diff --git a/frontend/styles/lib/icons.sass b/frontend/styles/lib/icons.sass new file mode 100644 index 0000000..d3fb2ef --- /dev/null +++ b/frontend/styles/lib/icons.sass @@ -0,0 +1,15 @@ +.g-Icon + &--Spin + animation: g-Icon--Spin 2s ease-in-out infinite, g-Icon--Appear 1s ease-in; + +@keyframes g-Icon--Spin + 0% + transform: rotate(0deg) + 100% + transform: rotate(360deg) + +@keyframes g-Icon--Appear + 0% + opacity: 0 + 100% + opacity: 1 diff --git a/frontend/styles/main.sass b/frontend/styles/main.sass new file mode 100644 index 0000000..7fa6963 --- /dev/null +++ b/frontend/styles/main.sass @@ -0,0 +1,71 @@ +@use 'colors' +@use 'form' +@use 'leaflet' + +// libs +@use 'lib/icons' + +// UI +@use 'ui/modal' +@use 'ui/layout' + +// Pages +@use 'pages/login' +@use 'pages/map' +@use 'pages/maps' + +/* General */ + +html + box-sizing: border-box + height: 100% + +*, *:before, *:after + box-sizing: inherit + +body + margin: 0 + font-family: sans-serif + font-size: 1.05rem + height: 100% + display: flex + flex-flow: column + +main + flex-grow: 1 + min-height: 0 + +header + display: flex + justify-content: space-between + width: 100% + background-color: colors.$brown + color: white + line-height: 3rem + + & > a + color: inherit + padding: 0 1rem + +.g-Logout__Button + border: none + background: transparent + font-size: inherit + color: white + cursor: pointer + padding: 0 1rem + height: 100% + + &:hover + text-decoration: underline + +a + color: colors.$blue + text-decoration: none + + &:hover + text-decoration: underline + +p + margin: 0 0 1rem + line-height: 1.4rem diff --git a/frontend/styles/pages/login.sass b/frontend/styles/pages/login.sass new file mode 100644 index 0000000..0f840ee --- /dev/null +++ b/frontend/styles/pages/login.sass @@ -0,0 +1,12 @@ +@use '../colors' + +.g-Login + max-width: 400px + margin: 7rem auto + + &__Title + text-align: center + margin: 0 0 2rem + color: colors.$red + font-weight: normal + font-size: 2rem diff --git a/frontend/styles/pages/map.sass b/frontend/styles/pages/map.sass new file mode 100644 index 0000000..ddfefcb --- /dev/null +++ b/frontend/styles/pages/map.sass @@ -0,0 +1,84 @@ +@use '../colors' + +// Leaflet cursor over the map +.leaflet-container + cursor: crosshair !important + &.leaflet-drag-target + cursor: grab !important + +.g-Map + display: flex + flex-flow: column + height: 100% + + .leaflet-container + flex-grow: 1 + min-height: 0 + + &__Footer + display: flex + align-items: center + justify-content: space-between + line-height: 3rem + background-color: colors.$black + color: white + padding: 0 1rem + + &__FooterButtons + display: flex + gap: 1rem + +.g-ContextMenu + z-index: 1000 + position: absolute + background-color: white + border-radius: var(--context-menu-border-radius) + border: 1px solid #333333 + $border-radius: 2px; + + &__Entry:first-child + border-top-left-radius: $border-radius + border-top-right-radius: $border-radius + + &__Entry:last-child + border-bottom-left-radius: $border-radius + border-bottom-right-radius: $border-radius + + &__Entry + padding: 0.5rem 1rem + + &:hover + background-color: #DDDDDD + cursor: pointer + +/* Marker icon */ + +.g-Marker + position: relative + width: 100% + height: 100% + + &__Base + position: absolute + width: 25px + bottom: calc(50%) + left: 50% + transform: translateX(-50%) + + &__Icon + position: absolute + bottom: 25px + display: flex + width: 12px + height: 12px + + &__Title + position: absolute + bottom: 47px + line-height: 0.8rem + left: 50% + transform: translateX(-50%) + color: black + font-weight: bold + text-align: center + width: 100px diff --git a/frontend/styles/pages/maps.sass b/frontend/styles/pages/maps.sass new file mode 100644 index 0000000..ad8ba24 --- /dev/null +++ b/frontend/styles/pages/maps.sass @@ -0,0 +1,2 @@ +.g-Maps + margin: 1rem diff --git a/frontend/styles/ui/layout.sass b/frontend/styles/ui/layout.sass new file mode 100644 index 0000000..93f5a69 --- /dev/null +++ b/frontend/styles/ui/layout.sass @@ -0,0 +1,25 @@ +@use '../colors' + +.g-Columns + display: flex + gap: 1rem + + & > * + flex-basis: 50% + flex-grow: 1 + +.g-Loading + display: flex + align-items: center + justify-content: center + height: 100% + + & > svg + width: 20px + +.g-Error + display: flex + align-items: center + justify-content: center + height: 100% + color: colors.$red diff --git a/frontend/styles/ui/modal.sass b/frontend/styles/ui/modal.sass new file mode 100644 index 0000000..81e91d6 --- /dev/null +++ b/frontend/styles/ui/modal.sass @@ -0,0 +1,57 @@ +@use '../colors' + +$transition-duration: 0.15s + +.g-Modal + width: 100vw + height: 100vh + position: fixed + top: 0 + left: 0 + display: flex + justify-content: center + align-items: center + z-index: 1000 // To be over leaflet + color: black + background-color: rgba(0, 0, 0, 0.5) + + &--Danger + .g-Modal__Content + border-left: 5px solid colors.$red + + &__Content + position: relative + background-color: white + width: 50% + min-width: 400px; + max-width: 600px; + border-radius: 0.2rem + line-height: normal + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.8) + + &__Header + display: flex + justify-content: space-between + align-items: center + padding: 1rem 2rem + border-bottom: 1px solid #EEE + font-weight: bold + + &__Body + padding: 2rem + max-height: 50vh + overflow-y: scroll + + &__Close + cursor: pointer + font-weight: bold + border-radius: 50% + border: 1px solid #EEE + background-color: transparent + width: 3rem + height: 3rem + font-size: 1.7rem + flex-shrink: 0 + + &__Close:hover, &__Close:focus + background-color: #EEE -- cgit v1.2.3