@charset "UTF-8"; /* might be needed when you have non-ASCII characters * in a "content" rule * MUST be the very first thing in a stylesheet */ /*! YAMB CSS v1.0.0 | BOML License | github.com/runxel/yamb-css */ /* load your custom fonts like this * WOFF2 is enough (except you have to support IE11? Have fun with that shipwreck!) * Also please selfhost them and DO NOT use Google Fonts directly * https://www.tunetheweb.com/blog/should-you-self-host-google-fonts/ */ @font-face { font-family: 'My Font'; font-style: normal; font-weight: 400; src: local('My Font'), local('MyFont-Regular'), url('../fonts/myfont.woff2') format('woff2'); } /* obligatory element reset * if you look for a more in-depth, proper approach: * http://necolas.github.io/normalize.css/ or * https://github.com/hankchizljaw/modern-css-reset */ *, ::before, ::after { box-sizing: inherit; margin: 0; padding: 0; } html { font-size: 16px; /* this will be one REM */ box-sizing: border-box; } /* I use :root to store all my global variables */ :root { --text-color: #242424; --text-header-color: var(--text-color); --text-muted-color: #585858; --text-placheolder-color: #686868; --link-color: #32b6b6; --code-color: #3b444e; --background-color: hsl(40, 10%, 95%); --background-dark-color: hsl(48, 5%, 80%); --background-code-color: hsl(50, 5%, 90%); --background-alt-color: hsl(40, 10%, 90%); --background-alt-bright-color: #f7f7f7; --thumb-color: #c5c5c5; /* scrollbar thumb */ --accent-color: #14da6d; --highlight: #ffee00c2; --selection-color: hsla(162, 75%, 51%, 0.5); --focus-color: #24c278; --border-color: #c6cbd1; --border-alt-color: #959da5; --button-color: hsl(150, 70%, 60%); --button-hover-color: hsl(150, 60%, 75%); --warning: #eb6363b2; --accepted: #75ee6a8c; --animation-duration: 0.2s; --base-font: Clear Sans Light, Clear Sans, PT Sans, Inter, Segoe UI, Roboto, Trebuchet MS, Helvetica Neue, Arial, sans-serif; --text-font: 'Libre Franklin', sans-serif; --h-font: var(--text-font); /* Header font h1-h6 */ --mono-font: Consolas, 'Fira Code', 'Ubuntu Mono', monospace; --content-width: 70ch; --text-fat: 700; /* change for different weight */ --select-arrow: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23161f27'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 0 0-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E"); scrollbar-color: var(--thumb-color) var(--background-color); } /* visual sugar */ ::selection { color: var(--text-color); background-color: var(--selection-color); text-shadow: none; } /* use 'body' for all the basic declarations * most commonly fonts + bg-color */ body { font-family: var(--text-font); /* you could also set it to "optimizeSpeed", * but I think legibility is more important and old problems are gone meanwhile */ text-rendering: optimizeLegibility; font-variant-ligatures: common-ligatures; font-kerning: normal; line-height: 1.6; color: var(--text-color); background-color: var(--background-color); } /* LINKS */ a, a:visited { text-decoration: underline; color: var(--link-color); white-space: break-word; /* not nowrap! */ } a:hover { text-decoration: underline; text-decoration-thickness: 2px; } a:focus { color: var(--focus-color); } /* ELEMENTS */ img { max-width: 100%; height: auto; } header { margin-bottom: 1rem; } section { margin: 1.5em 0; } article { margin: 0.7em 0; } article > footer { margin-bottom: 1.3em; } hr { border: none; border-top: 1px solid var(--border-color); margin: 0.3em 0; } ul, ol { list-style-position: inside; padding-left: 1em; } :not(fieldset) > ul:not(.no-marker) li::marker { color: currentColor; content: '๐Ÿž„ '; } ul.no-marker { list-style-type: none; } /* TABLES */ table { border-collapse: collapse; margin-bottom: 10px; width: 100%; } table > caption { margin-bottom: 5px; } td, th { padding: 6px; text-align: left; } thead { border-bottom: 1px solid var(--border-color); } tfoot { border-top: 1px solid var(--border-color); } tbody tr:nth-child(even) { background-color: var(--background-alt-color); } /* Details */ details { display: flex; flex-direction: column; align-items: flex-start; background-color: var(--background-alt-color); margin: 1em 0; padding: 10px 10px 0; border-radius: 6px; overflow: hidden; } details[open] { padding: 10px; } details > :last-child { margin-bottom: 0; } details[open] summary { margin-bottom: 10px; } summary { display: list-item; background-color: var(--background-dark-color); margin: -10px -10px 0; padding: 10px; } details > :not(summary) { margin-top: 0; } summary::-webkit-details-marker { color: var(--text-main); } footer { padding-top: 10px; font-size: 0.8em; color: var(--text-muted-color); } main + footer { text-align: center; border-top: 1px solid var(--background-dark-color); } /* TYPOGRAPHY */ h1 { font-size: 2.2em; margin-top: 0; } h1, h2, h3, h4, h5, h6 { margin: 5px 0 calc(0.4rem + 0.2em); color: var(--text-header-color); } h1, h2, h3, h4, h5, h6, b, strong, th { font-weight: var(--text-fat); } h2 { letter-spacing: 0.02em; } h3 { letter-spacing: 0.03em; } h4 { letter-spacing: 0.04em; } h5 { letter-spacing: 0.06em; } h6 { letter-spacing: 0.08em; } small { letter-spacing: 0.025em; } q { font-style: italic; } q::before { content: "ยซ"; } q::after { content: "ยป" } blockquote { border-left: 3px solid var(--text-muted-color); margin: 1.5em 0em; padding: 0.5em 1em; font-style: normal; } blockquote { border-radius: 4px; } blockquote p:last-of-type { margin-bottom: 1em; } blockquote cite, blockquote > footer { font-style: italic; border: 0; } blockquote cite::before { content: 'โœฒ '; } address { font-style: normal; } address a { text-decoration: none; } a[href^='mailto\:']::before { content: '๐Ÿ“ง '; filter: saturate(0); } a[href^='tel\:']::before { content: '๐Ÿ“ž '; filter: saturate(0); } a[href^='sms\:']::before { content: '๐Ÿ’ฌ '; filter: saturate(0); } mark { background-color: var(--highlight); border-radius: 2px; padding: 0px 2px 0px 2px; } /* CODE */ pre, code, samp, time, var, kbd { font-family: var(--mono-font); } code, samp, time { background: var(--background-code-color); color: var(--code-color); padding: 2.5px 5px; border-radius: calc(1em * 0.2); font-size: 1em; } pre > code { padding: 10px; display: block; overflow-x: auto; } var { color: var(--code-color); font-style: normal; } kbd { background: var(--background-alt-bright-color); border: 1px solid var(--border-color); border-bottom-color: var(--border-alt-color); box-shadow: inset 0 -1px 0 var(--border-alt-color); border-radius: calc(1em * 0.4); color: var(--text-main); font-size: 80%; padding: 2px 5px; display: inline-block; position: relative; bottom: 3px; vertical-align: middle; } abbr, acronym { cursor:help; } sup, sub { vertical-align: baseline; position: relative; top: -0.5em; font-size: 0.7em; } sub { top: 0.3em; } del { background-color: var(--warning); } ins { background-color: var(--accepted); } iframe { border: none; } /* FORMS */ ::placeholder { color: var(--form-placeholder); } button, select, input[type='submit'], input[type='button'], input[type='checkbox'], input[type='range'], input[type='radio'] { cursor: pointer; } input:not([type='checkbox']):not([type='radio']), select { display: block; } input, button, textarea, select { color: var(--text-placeholder-color); background-color: var(--background-alt-color); font-family: inherit; font-size: inherit; margin-right: 6px; margin-bottom: 6px; padding: 10px; border: none; border-radius: 6px; outline: none; } input, select, button, textarea { -webkit-appearance: none; } textarea { min-height: 4rem; margin-right: 0; width: 100%; box-sizing: border-box; resize: vertical; scrollbar-width: thin; scrollbar-color: var(--thumb-color) var(--background-color); } select { background: var(--background-alt-color) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; padding-right: 35px; } select::-ms-expand { display: none; } select[multiple] { padding-right: 10px; background-image: none; overflow-y: auto; } select > optgroup { background-color: var(--background-alt-color); color: var(--text-color); } optgroup > option { background-color: var(--background-color); } button, input[type='submit'], input[type='button'] { background-color: var(--button-color); padding-right: 30px; padding-left: 30px; } button:not(:disabled):hover, input[type='submit']:not(:disabled):hover, input[type='button']:not(:disabled):hover { background-color: var(--button-hover-color); } /* STATES */ /* -- FOCUS */ input:focus, select:focus, button:focus, textarea:focus { box-shadow: 0 0 0 2px var(--focus-color); background-color: var(--background-alt-bright-color); } /* -- DISABLED */ input:disabled, select:disabled, button:disabled, textarea:disabled { cursor: not-allowed; opacity: 0.5; } /* -- INVALID / ERROR */ input:invalid, input.is-error, input.error { box-shadow: 0 0 0 2px var(--warning); } /* -- VALID */ /* input:valid, -> would style *evertyhing*, even empty */ input.is-valid, input.valid { box-shadow: 0 0 0 2px var(--accepted); } input[type='checkbox'], input[type='radio'] { position: relative; width: 14px; height: 14px; display: inline-block; vertical-align: middle; margin: 0; margin-right: 2px; } input[type='radio'] { border-radius: 50%; } input[type='checkbox']:checked, input[type='radio']:checked { background: var(--button-hover); } input[type='checkbox']:checked::before, input[type='radio']:checked::before { content: '๐Ÿž‡'; display: block; position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%); } input[type='checkbox']:checked::before { content: 'โœ”'; transform: translateY(-50%) translateX(-6px); } input[type='checkbox']:active, input[type='radio']:active, input[type='submit']:active, input[type='button']:active, input[type='range']:active, button:active { transform: translateY(2px); } input:read-only { user-select: all; } fieldset { border: 1px var(--border-color) solid; border-radius: 6px; margin: 0; margin-bottom: 6px; padding: 10px; } legend { font-size: 0.9em; font-weight: var(--text-fat); } input[type='color'] { min-height: 1.8em; padding: 2px; border-radius: 0; } /* RANGE */ input[type='range'] { margin: 10px 0; padding: 10px 0; background: transparent; } input[type='range']:focus { outline: none; } input[type='range']::-webkit-slider-runnable-track, input[type='range']::-moz-range-track { width: 100%; height: 9.5px; transition: 0.2s; background: var(--background-dark-color); border-radius: 3px; } input[type='range']:focus::-webkit-slider-runnable-track, input[type='range']:focus::-moz-range-track { background: var(--background-alt-color); } input[type='range']::-webkit-slider-thumb, input[type='range']::-moz-range-thumb { box-shadow: 0px 1px 1px var(--border-alt-color), 0px 0px 1px var(--border-alt-color); height: 20px; width: 20px; border-radius: 50%; background: var(--background-alt-bright-color); margin-top: -7px; -webkit-appearance: none; } /* SEARCH input */ /* mitigations against Chrome's uglyness */ input[type="search"] { -webkit-appearance: textfield; } input::-webkit-search-decoration, input::-webkit-search-cancel-button { /* get rid of non-standard weirdness */ display: none; } /* EXPLICIT */ /* a wrapper for all elements on the page */ div.page { max-width: var(--content-width); margin: 20px auto; } @media screen and (max-width: 720px) { div.page { padding: 2vh 3.5vw; } } nav ul { list-style: none; } nav ul li::marker { content: none; } /* DARK THEME */ /* Media queries are really powerful. * Here we'd like to know, if the user prefers to have a dark color scheme */ @media ( prefers-color-scheme: dark) { /* if you use CSS variables (and you definitely should!) this is extremely easy to accomplish */ :root { --text-color: #dbdbdb; --text-header-color: var(--text-color); --text-muted-color: #585858; --text-placheolder-color: #686868; --code-color: hsl(210, 10%, 85%); --background-color: hsl(0, 0%, 20%); --background-dark-color: hsl(0, 0%, 12%); --background-code-color: hsl(50, 2%, 30%); --background-alt-color: hsl(40, 1%, 26%); --background-alt-bright-color: hsl(0, 0%, 40%); --thumb-color: #585858; /* scrollbar thumb */ --accent-color: #14da6d; --focus-color: #24c278; --border-color: #75787c; --border-alt-color: #535557; --button-color: hsl(150, 36%, 52%); --button-hover-color: hsl(150, 39%, 66%); --warning: #ec4444d3; --accepted: #7eff73bd; --select-arrow: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23dbdbdb'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 0 0-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E"); } ins { color: var(--background-color); } button, input[type='submit'], input[type='button'] { color: var(--background-color); } /* let's style images, because they are too harsh when having a dark theme enabled */ img { /* filter are a nice feature you can have Photoshop-esque stylings */ filter: opacity(90%) /* why not the 'opacity' property of CSS? -> `filter` has hardware acceleration in most browsers! = FAST */ brightness(0.9) contrast(90%); } /* If you have graphics with white background (like charts) this will help */ img.graphic { filter: /* invert will help with the white background */ invert(100%) /* to get the original colors back, you rotate the hue back */ hue-rotate(180deg); } /* our friend, the filter again! * desaturate things that are to colorful * nicest thing: it even works on emojis! ๐Ÿ‘‹๐Ÿป */ .desaturate { filter: saturate(0); } } /* --------------- */ /* targeting PRINT */ /* (yes, this is a thing) */ @media print { @page { size: A4; /* 'legal' if you're in the US * you set page orientation by either 'portrait' or 'landscape' */ margin: 15mm; } body { background: transparent !important; /* we don't want any color here */ color: black !important; font-size: 12pt; max-width: 100%; box-decoration-break: clone; /* boxes should be treated per page */ box-shadow: none !important; text-shadow: none !important; } img, pre, code, blockquote, table, figure, ul, ol, li, tr, hr { page-break-before: auto; page-break-after: auto; page-break-inside: avoid; break-before: auto; break-after: auto; break-inside: avoid; } pre { white-space: pre-wrap !important; word-wrap: break-word; } /* prevent single lines at page end/start */ p, a { orphans: 4; widows: 3; } /* always cause a page break before an h1 header */ h1 { break-before: page; } /* avoid paragraphs being detached from preceding header */ h1, h2, h3 { page-break-after: avoid; break-after: avoid-page; } h1, h2, h3, h4, h5, h6 { page-break-inside: avoid; break-inside: avoid; } /* display expansions of abbreviations */ abbr[title]::after, acronym[title]::after { content: " (" attr(title) ")"; } /* SHOW targets of external links * "a:not(:local-link):after" if we ever got to CSS4 */ a[href^="http"]:not([href*="example.com"])::after { content: " (" attr(href) ")"; } /* if you have a map on your site consider to display a static image * older browsers and Safari aren't able to print maps */ #map iframe { display: none; /* don't show the default interactive map*/ } #map { width: 400px; height: 300px; background-image: url('https://maps.googleapis.com/maps/api/staticmap?center=Wien+Floridsdorf&zoom=13&scale=false&size=400x300&maptype=roadmap&format=png&visual_refresh=true'); /* force printing of the image */ -webkit-print-color-adjust: exact; print-color-adjust: exact; } /* IF you use white, alpha-masked images on a dark background * you should invert them */ header img { -webkit-filter: invert(100%); filter: invert(100%); } nav, aside { display: none; } /* KIND of a catch all, just slam this class on everything you don't want to print */ .no-print { display: none; } /* IF the space reserved for the element should stay, just without content */ .no-show { visibility: hidden; } }