forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			587 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			CSS
		
	
	
	
	
	
			
		
		
	
	
			587 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			CSS
		
	
	
	
	
	
| /*
 | ||
|     TailwindCSS JIT-Mode Input file.
 | ||
|     Use TailwindCSS functions and directives here – https://tailwindcss.com/docs/functions-and-directives
 | ||
|     About JIT-Mode: https://tailwindcss.com/docs/just-in-time-mode#styles-rebuild-in-an-infinite-loop
 | ||
| 
 | ||
|     TailwindCSS CLI generates the css/index-tailwind-output.css file based on this file.
 | ||
|     It is not used directly in the app.
 | ||
| */
 | ||
| 
 | ||
| @tailwind base;
 | ||
| @tailwind components;
 | ||
| @tailwind utilities;
 | ||
| 
 | ||
| :root {
 | ||
|     /* 
 | ||
|     * The main colour scheme of mapcomplete is configured here.
 | ||
|     * For a custom styling, set 'customCss' in your layoutConfig and overwrite some of these.
 | ||
|     */
 | ||
| 
 | ||
|     /* Main color of the application: the background and text colours */
 | ||
|     --background-color: white;
 | ||
|     /* Main text colour. Also styles some elements, such as the 'close popup'-button or 'back-arrow' (in mobile) */
 | ||
|     --foreground-color: black;
 | ||
| 
 | ||
|     /* A colour scheme to indicate an error or warning */
 | ||
|     --alert-color: #fee4d1;
 | ||
|     --alert-foreground-color: var(--foreground-color);
 | ||
| 
 | ||
|     --low-interaction-background: #eeeeee;
 | ||
|     --low-interaction-foreground: black;
 | ||
|     --low-interaction-contrast: #ff00ff;
 | ||
| 
 | ||
|     --interactive-background: #dddddd;
 | ||
|     --interactive-foreground: black;
 | ||
|     --interactive-contrast: #ff00ff;
 | ||
| 
 | ||
|     --button-background: black;
 | ||
|     --button-foreground: white;
 | ||
| 
 | ||
|     /**
 | ||
|      * Base colour of interactive elements, mainly the 'subtle button'
 | ||
|      * @deprecated
 | ||
|      */
 | ||
|     --subtle-detail-color: #dbeafe;
 | ||
|     --subtle-detail-color-contrast: black;
 | ||
|     --subtle-detail-color-light-contrast: lightgrey;
 | ||
| 
 | ||
| 
 | ||
|     --catch-detail-color: black; /*#3a3aeb;*/
 | ||
|     --catch-detail-foregroundcolor: white;
 | ||
|     --catch-detail-color-contrast: #fb3afb;
 | ||
| 
 | ||
| 
 | ||
|     --image-carousel-height: 350px;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| /***********************************************************************\
 | ||
| * Various tweaks and settings to make some behaviours more predictable *
 | ||
| \***********************************************************************/
 | ||
| html,
 | ||
| body {
 | ||
|     height: 100%;
 | ||
|     min-height: 100vh;
 | ||
|     min-height: -webkit-fill-available;
 | ||
|     margin: 0;
 | ||
|     padding: 0;
 | ||
|     background-color: var(--background-color);
 | ||
|     color: var(--foreground-color);
 | ||
|     font-family: "Helvetica Neue", Arial, sans-serif;
 | ||
| }
 | ||
| 
 | ||
| svg,
 | ||
| img {
 | ||
|     box-sizing: content-box;
 | ||
|     width: 100%;
 | ||
|     height: 100%;
 | ||
| }
 | ||
| 
 | ||
| li {
 | ||
|     margin-left: 0.5em;
 | ||
|     padding-left: 0.2em;
 | ||
|     margin-top: 0.1em;
 | ||
| }
 | ||
| 
 | ||
| li::marker {
 | ||
|     content: "•";
 | ||
| }
 | ||
| 
 | ||
| h1 {
 | ||
|     font-size: xx-large;
 | ||
|     margin-top: 0.6em;
 | ||
|     margin-bottom: 0.4em;
 | ||
|     font-weight: bold;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| h2 {
 | ||
|     font-size: x-large;
 | ||
|     margin-top: 0.5em;
 | ||
|     margin-bottom: 0.3em;
 | ||
|     font-weight: bold;
 | ||
| }
 | ||
| 
 | ||
| h3 {
 | ||
|     font-size: larger;
 | ||
|     margin-top: 0.6em;
 | ||
|     margin-bottom: 0;
 | ||
|     font-weight: bold;
 | ||
| }
 | ||
| 
 | ||
| p {
 | ||
|     padding-top: 0.1em;
 | ||
| }
 | ||
| 
 | ||
| input {
 | ||
|     color: var(--foreground-color);
 | ||
| }
 | ||
| 
 | ||
| input[type=text] {
 | ||
|     width: 100%;
 | ||
| }
 | ||
| 
 | ||
| /************************* BIG CATEGORIES ********************************/
 | ||
| 
 | ||
| /**
 | ||
|  * The main classes that dictate the structure of the entire app,
 | ||
|  * and some interactive elements
 | ||
|  */
 | ||
| 
 | ||
| 
 | ||
| .subtle-background {
 | ||
|     background: var(--subtle-detail-color);
 | ||
|     color: var(--subtle-detail-color-contrast);
 | ||
| }
 | ||
| 
 | ||
| .normal-background {
 | ||
|     background: var(--background-color);
 | ||
|     color: var(--foreground-color);
 | ||
| }
 | ||
| 
 | ||
| .low-interaction {
 | ||
|     background: var(--low-interaction-background);
 | ||
|     color: var(--low-interaction-foreground)
 | ||
| }
 | ||
| 
 | ||
| .interactive {
 | ||
|     background: var(--interactive-background);
 | ||
|     color: var(--interactive-foreground)
 | ||
| }
 | ||
| 
 | ||
| .border-interactive {
 | ||
|     border: 2px dashed var(--catch-detail-color-contrast);
 | ||
|     border-radius: 0.5rem;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /******************* Styling of input elements **********************/
 | ||
| 
 | ||
| /**
 | ||
|  * This very important section defines what the various input elements look like within the 'low-interaction' and 'interactive'-blocks
 | ||
|  */
 | ||
| 
 | ||
| 
 | ||
| button, .button {
 | ||
|     display: inline-flex;
 | ||
|     line-height: 1.25rem;
 | ||
|     margin: 0.2rem;
 | ||
|     padding: 0.4rem;
 | ||
|     padding-left: 0.6rem;
 | ||
|     padding-right: 0.6rem;
 | ||
|     font-size: large;
 | ||
|     font-weight: bold;
 | ||
|     /*-- invisible border: rendered on hover*/
 | ||
|     border: 2px solid var(--button-background);
 | ||
|     border-radius: 0.5rem;
 | ||
|     transition: all 250ms;
 | ||
|     --tw-text-opacity: 1;
 | ||
|     --tw-bg-opacity: 1;
 | ||
|     background: var(--low-interaction-background);
 | ||
|     color: var(--low-interaction-foreground);
 | ||
| }
 | ||
| 
 | ||
| .button-shadow {
 | ||
|     box-shadow: 0 5px 10px #88888888;
 | ||
| }
 | ||
| 
 | ||
| button.small, .button.small {
 | ||
|     line-height: 1rem;
 | ||
|     margin: 0;
 | ||
|     padding: 0.1rem;
 | ||
|     font-size: unset;
 | ||
|     /*-- invisible border: rendered on hover*/
 | ||
|     border: 2px solid var(--low-interaction-background);
 | ||
|     border-radius: 0.1rem;
 | ||
|     transition: all 250ms;
 | ||
|     --tw-text-opacity: 1;
 | ||
|     --tw-bg-opacity: 1;
 | ||
|     background: var(--low-interaction-background);
 | ||
|     color: var(--low-interaction-foreground);
 | ||
| }
 | ||
| 
 | ||
| button.selected, .button.selected {
 | ||
|     background-color: var(--catch-detail-color);
 | ||
|     border-color: var(--catch-detail-color);
 | ||
| 
 | ||
|     color: var(--catch-detail-foregroundcolor);
 | ||
| }
 | ||
| 
 | ||
| button.selected svg path, .button.selected svg path {
 | ||
|     fill: var(--catch-detail-foregroundcolor) !important;
 | ||
| }
 | ||
| 
 | ||
| button:not(.no-image-background) svg path, .button:not(.no-image-background) svg path {
 | ||
|     fill: var(--interactive-foreground) !important;;
 | ||
|     transition: all 250ms;
 | ||
| }
 | ||
| 
 | ||
| .interactive button, .interactive .button {
 | ||
|     background: var(--interactive-background);
 | ||
|     color: var(--interactive-foreground);
 | ||
| }
 | ||
| 
 | ||
| button:hover, .button:hover {
 | ||
|     background-color: var(--catch-detail-color);
 | ||
|     color: var(--catch-detail-foregroundcolor);
 | ||
|     border: 2px solid var(--catch-detail-color-contrast);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| button:hover:not(.no-image-background) img, .button:hover:not(.no-image-background) img {
 | ||
|     background: var(--low-interaction-background);
 | ||
|     border-radius: 100rem;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| button:hover:not(.no-image-background) svg path, .button:hover:not(.no-image-background) svg path {
 | ||
|     fill: var(--catch-detail-foregroundcolor) !important;;
 | ||
| }
 | ||
| 
 | ||
| button.disabled:hover:not(.no-image-background) svg path, .button.disabled:hover:not(.no-image-background) svg path {
 | ||
|     fill: var(--low-interaction-foreground) !important;;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| button.primary, .button.primary {
 | ||
|     color: var(--button-foreground);
 | ||
|     background: var(--button-background);
 | ||
| }
 | ||
| 
 | ||
| button.primary:not(.no-image-background) svg path, .button.primary:not(.no-image-background) svg path {
 | ||
|     fill: var(--button-foreground) !important;;
 | ||
|     transition: all 250ms;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| button.disabled, .button.disabled {
 | ||
|     cursor: default;
 | ||
|     border: 2px dashed var(--button-background);
 | ||
|     background: unset;
 | ||
|     color: unset;
 | ||
|     box-shadow: none;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| button.disabled:hover, .button.disabled:hover {
 | ||
|     cursor: default;
 | ||
|     border: 2px dashed var(--button-background);
 | ||
|     background: unset;
 | ||
|     color: unset;
 | ||
| }
 | ||
| 
 | ||
| .interactive button.disabled svg path, .interactive .button.disabled svg path {
 | ||
|     fill: var(--interactive-foreground) !important;;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| .low-interaction button.disabled svg path, .low-interaction .button.disabled svg path {
 | ||
|     fill: var(--low-interaction-foreground) !important;;
 | ||
| }
 | ||
| 
 | ||
| .normal-background button.disabled svg path, .normal-background .button.disabled svg path {
 | ||
|     fill: var(--foreground-color) !important;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| label {
 | ||
|     /**
 | ||
|      * Label should _contain_ the input element
 | ||
|      */
 | ||
|     border: 2px solid var(--interactive-background);
 | ||
|     padding: 0.25rem;
 | ||
|     padding-right: 0.5rem;
 | ||
|     padding-left: 0.5rem;
 | ||
|     border-radius: 0.5rem;
 | ||
|     background-color: var(--low-interaction-background);
 | ||
|     width: 100%;
 | ||
|     display: block;
 | ||
|     box-sizing: border-box;
 | ||
|     transition: all 250ms;
 | ||
| }
 | ||
| 
 | ||
| label:hover {
 | ||
|     background-color: var(--catch-detail-color);
 | ||
|     color: var(--catch-detail-foregroundcolor);
 | ||
|     border: 2px solid var(--interactive-contrast)
 | ||
| }
 | ||
| 
 | ||
| label:not(.no-image-background) img {
 | ||
|     padding: 0.25rem;
 | ||
|     border-radius: 0.25rem;
 | ||
|     background: var(--low-interaction-background);
 | ||
| }
 | ||
| 
 | ||
| label svg path {
 | ||
|     transition: all 250ms;
 | ||
| }
 | ||
| 
 | ||
| label:hover:not(.no-image-background) svg path {
 | ||
|     fill: var(--catch-detail-foregroundcolor) !important;
 | ||
| }
 | ||
| 
 | ||
| label.checked {
 | ||
|     border: 2px solid var(--foreground-color);
 | ||
| }
 | ||
| 
 | ||
| .links-w-full a:not(.weblate-link) {
 | ||
|     display: flex;
 | ||
|     column-gap: 0.25rem;
 | ||
|     padding-left: 0.5rem;
 | ||
|     padding-right: 0.5rem;
 | ||
|     width: 100%;
 | ||
| }
 | ||
| 
 | ||
| .links-as-button a {
 | ||
|     /*
 | ||
|     * Let a 'link' mimick a button, but not entirely
 | ||
|     */
 | ||
|     padding: 3px;
 | ||
|     margin: 0;
 | ||
|     background: var(--low-interaction-background);
 | ||
|     color: var(--low-interaction-foreground);
 | ||
|     border: 2px solid var(--interactive-background);
 | ||
|     border-radius: 0.5rem;
 | ||
| }
 | ||
| 
 | ||
| .links-as-button a:hover {
 | ||
|     background-color: var(--interactive-background);
 | ||
|     color: var(--catch-detail-foregroundcolor);
 | ||
|     border-color: var(--catch-detail-color-contrast);
 | ||
| }
 | ||
| 
 | ||
| .links-as-button a:hover svg path {
 | ||
|     fill: var(--catch-detail-foregroundcolor) !important;
 | ||
| }
 | ||
| 
 | ||
| select {
 | ||
|     border: 2px solid #00000000;
 | ||
| }
 | ||
| 
 | ||
| select:hover {
 | ||
|     border-color: var(--catch-detail-color-contrast);
 | ||
| }
 | ||
| 
 | ||
| /************************* OTHER CATEGORIES ********************************/
 | ||
| 
 | ||
| /**
 | ||
|  * Smaller categories which convey some semantic information but don't define bigger blocks.
 | ||
|  * As they are _semantic_ categories, they can be styled
 | ||
|  */
 | ||
| 
 | ||
| .thanks {
 | ||
|     /* The class to indicate 'operation successful' or 'thank you for contributing' */
 | ||
|     font-weight: bold;
 | ||
|     border-radius: 1em;
 | ||
|     margin: 0.25em;
 | ||
|     text-align: center;
 | ||
|     padding: 0.25rem;
 | ||
|     padding-left: 0.5rem;
 | ||
|     padding-right: 0.5rem;
 | ||
|     border: 3px dotted #58cd27;
 | ||
|     background-color: #58cd2722;
 | ||
| }
 | ||
| 
 | ||
| .alert {
 | ||
|     /* The class to convey important information, e.g. 'invalid', 'something went wrong', 'warning: testmode', ... */
 | ||
|     background-color: var(--alert-color);
 | ||
|     color: var(--alert-foreground-color);
 | ||
|     font-weight: bold;
 | ||
|     border-radius: 1em;
 | ||
|     margin: 0.25em;
 | ||
|     text-align: center;
 | ||
|     padding: 0.15em 0.3em;
 | ||
|     border: 2px dotted #ff9143;
 | ||
| }
 | ||
| 
 | ||
| .subtle {
 | ||
|     /* For all information that is not important for 99% of the users */
 | ||
|     color: #999;
 | ||
|     font-size: medium;
 | ||
|     font-weight: normal;
 | ||
| }
 | ||
| 
 | ||
| .link-underline .subtle a {
 | ||
|     text-decoration: underline 1px #7193bb88;
 | ||
|     color: #7193bb;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| .literal-code {
 | ||
|     /* A codeblock */
 | ||
|     display: inline-block;
 | ||
|     background-color: lightgray;
 | ||
|     padding: 0.1rem;
 | ||
|     padding-left: 0.35rem;
 | ||
|     padding-right: 0.35rem;
 | ||
|     word-break: break-word;
 | ||
|     color: black;
 | ||
|     box-sizing: border-box;
 | ||
|     font-family: monospace;
 | ||
| }
 | ||
| 
 | ||
| .interactive .literal-code {
 | ||
|     background-color: #b3b3b3;
 | ||
| }
 | ||
| 
 | ||
| /************************** UTILITY ************************/
 | ||
| 
 | ||
| /** 
 | ||
|  * Utility classes are there for a specific function to pin down browser behaviour (and cannot be changed)
 | ||
|  */
 | ||
| 
 | ||
| 
 | ||
| .text-white a {
 | ||
|     /* Used solely in 'imageAttribution'  and in many themes*/
 | ||
|     color: var(--background-color);
 | ||
| }
 | ||
| 
 | ||
| .bg-black-transparent {
 | ||
|     background-color: #00000088;
 | ||
| }
 | ||
| 
 | ||
| .block-ruby {
 | ||
|     display: block ruby;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| .rounded-left-full {
 | ||
|     border-bottom-left-radius: 999rem;
 | ||
|     border-top-left-radius: 999rem;
 | ||
| }
 | ||
| 
 | ||
| .rounded-right-full {
 | ||
|     border-bottom-right-radius: 999rem;
 | ||
|     border-top-right-radius: 999rem;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| .no-images img {
 | ||
|     /* Used solely in 'imageAttribution' and in many themes for the label*/
 | ||
|     display: none;
 | ||
| }
 | ||
| 
 | ||
| .weblate-link {
 | ||
|     display: inline-block;
 | ||
|     flex-shrink: 0;
 | ||
|     margin: 0;
 | ||
|     padding: 0.25rem;
 | ||
|     width: 1.2rem;
 | ||
|     height: 1.2rem;
 | ||
|     border: unset;
 | ||
|     border-radius: 5rem;
 | ||
|     backdrop-filter: var(--low-interaction-background);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| .no-weblate .weblate-link {
 | ||
|     display: none !important;
 | ||
| }
 | ||
| 
 | ||
| .link-underline a {
 | ||
|     text-decoration: underline 1px var(--foreground-color);
 | ||
| }
 | ||
| 
 | ||
| a.link-underline {
 | ||
|     text-decoration: underline 1px var(--foreground-color);
 | ||
| }
 | ||
| 
 | ||
| .link-no-underline a {
 | ||
|     text-decoration: none;
 | ||
| }
 | ||
| 
 | ||
| .disable-links a {
 | ||
|     pointer-events: none;
 | ||
|     text-decoration: none !important;
 | ||
|     color: var(--subtle-detail-color-contrast) !important;
 | ||
| }
 | ||
| 
 | ||
| .enable-links a {
 | ||
|     pointer-events: unset;
 | ||
|     text-decoration: underline !important;
 | ||
|     color: unset !important;
 | ||
| }
 | ||
| 
 | ||
| .disable-links a.must-link,
 | ||
| .disable-links .must-link a {
 | ||
|     /* Hide links if they are disabled */
 | ||
|     display: none;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| .zebra-table tr:nth-child(even) {
 | ||
|     background-color: #f2f2f2;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /************************* MISC ELEMENTS *************************/
 | ||
| 
 | ||
| .selected svg:not(.noselect *) path.selectable {
 | ||
|     /* A marker on the map gets the 'selected' class when it's properties are displayed
 | ||
|     */
 | ||
|     stroke: white !important;
 | ||
|     stroke-width: 20px !important;
 | ||
|     overflow: visible !important;
 | ||
|     -webkit-animation: glowing-drop-shadow 1s ease-in-out infinite alternate;
 | ||
|     -moz-animation: glowing-drop-shadow 1s ease-in-out infinite alternate;
 | ||
|     animation: glowing-drop-shadow 1s ease-in-out infinite alternate;
 | ||
| }
 | ||
| 
 | ||
| .selected svg {
 | ||
|     /* A marker on the map gets the 'selected' class when it's properties are displayed
 | ||
|     */
 | ||
|     overflow: visible !important;
 | ||
| }
 | ||
| 
 | ||
| @-webkit-keyframes glowing-drop-shadow {
 | ||
|     from {
 | ||
|         filter: drop-shadow(5px 5px 60px rgb(128 128 128 / 0.6));
 | ||
|     }
 | ||
|     to {
 | ||
|         filter: drop-shadow(5px 5px 80px rgb(0.5 0.5 0.5 / 0.8));
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| @keyframes slide {
 | ||
|     /* This is the animation on the marker to add a new point - it slides through all the possible presets */
 | ||
|     from {
 | ||
|         transform: translateX(0%);
 | ||
|     }
 | ||
| 
 | ||
|     to {
 | ||
|         transform: translateX(calc(-100% + 42px));
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| .glowing-shadow {
 | ||
|     -webkit-animation: glowing 1s ease-in-out infinite alternate;
 | ||
|     -moz-animation: glowing 1s ease-in-out infinite alternate;
 | ||
|     animation: glowing 1s ease-in-out infinite alternate;
 | ||
| }
 | ||
| 
 | ||
| @-webkit-keyframes glowing {
 | ||
|     from {
 | ||
|         box-shadow: 0 0 20px 10px #eaaf2588, inset 0 0 0px 1px #eaaf25;
 | ||
|     }
 | ||
|     to {
 | ||
|         box-shadow: 0 0 20px 20px #eaaf2588, inset 0 0 5px 1px #eaaf25;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /************************* LEGACY MARKER - CLEANUP BELOW ********************************/
 | ||
| 
 | ||
| 
 | ||
| .slideshow-item img {
 | ||
|     /* Legacy: should be replace when the image element is ported to Svelte*/
 | ||
|     height: var(--image-carousel-height);
 | ||
|     width: unset;
 | ||
| }
 | ||
| 
 | ||
| .animate-height {
 | ||
|     /* Legacy: should be replaced by headlessui disclosure in time */
 | ||
|     transition: max-height 0.5s ease-in-out;
 | ||
|     overflow-y: hidden;
 | ||
| }
 | ||
| 
 | ||
| 
 |