/* 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; }