/* Color scheme. */ :root { /* naturally */ --liquidex-brand-blue: #058ef0; --text-color-light: #55423e; --link-color-light: #004ec8; --link-color-visited-light: #6c2380; --background-color: rgb(255, 253, 246); --background-color-tooltip: rgb(226, 223, 214); --text-color: #55423e; --link-color: #004ec8; --link-color-visited: #6c2380; --shaded-background: rgba(0, 0, 0, 5%); --border-1: rgba(0, 0, 0, 15%); --border-2: rgba(0, 0, 0, 30%); --hover: rgba(0, 0, 0, 15%); /* Hack to enable theme-matching scrollbars in
*/ --shaded-against-background: #f2f0ea; --shaded-against-background-twice: #e6e4de; } @media (prefers-color-scheme: dark) { :root { --background-color: rgb(30, 40, 53); --background-color-tooltip: rgb(23, 31, 41); --text-color: #d7cdbf; --link-color: #93cce8; --link-color-visited: #f7afde; --shaded-background: #f7e5df0c; --border-0: #f7e5df1a; --border-1: #f7e5df26; --border-1-and-a-half: #f7e5df3a; --border-2: #f7e5df4d; --shaded-against-background: #29313e; --shaded-against-background-twice: #333a46; } } /* Article-style layout. Center everything and give it a maximum width */ body { max-width: 1200px; margin-left: auto; margin-right: auto; display: flex; flex-direction: column; } main { padding: 0 16px; } @media screen and (max-width: 480px) { main { padding: 0 8px; } } /* Choose more pretty colors than vanilla HTML */ body { background-color: var(--background-color); color: var(--text-color); scrollbar-color: var(--background-color); scrollbar-width: auto; scrollbar-gutter: stable; } body::selection { /* Even though this color doesn't yield the most readable text, browsers */ background-color: var(--liquidex-brand-blue); } /* Set up typography */ @font-face { font-family: 'RecVar'; src: url('../font/Recursive_VF_1.085.woff2'); } @font-face { font-family: 'RecVarMono'; src: url('../font/Recursive_VF_1.085.woff2'); font-variation-settings: "MONO" 1.0; } body, pre, code, kbd { font-family: 'RecVar', sans-serif; font-size: 14px; line-height: 1.5; } :root { --recursive-mono: 0.0; --recursive-casl: 1.0; --recursive-wght: 400; --recursive-slnt: -2.0; --recursive-crsv: 0.5; --recursive-simplified-f: "ss03"; --recursive-simplified-g: "ss04"; --recursive-simplified-l: "ss05"; --recursive-simplified-r: "ss06"; --recursive-no-serif-L-Z: "ss08"; } *, *:before, *:after { font-variation-settings: "MONO" var(--recursive-mono), "CASL" var(--recursive-casl), "wght" var(--recursive-wght), "slnt" var(--recursive-slnt), "CRSV" var(--recursive-crsv); font-feature-settings: var(--recursive-simplified-f), var(--recursive-simplified-g), var(--recursive-simplified-l), var(--recursive-simplified-r), var(--recursive-no-serif-L-Z); } h1 { --recursive-slnt: 0.0; --recursive-casl: 0.0; --recursive-wght: 900; font-size: 3.5rem; font-feature-settings: var(--recursive-simplified-r) 0; } h2 { --recursive-slnt: 0.0; --recursive-casl: 0.5; --recursive-wght: 800; font-size: 2rem; } h3 { --recursive-slnt: 0.0; --recursive-casl: 0.5; --recursive-wght: 700; font-size: 1.5rem; } h4 { --recursive-slnt: 0.0; --recursive-casl: 0.5; --recursive-wght: 700; font-size: 1rem; } pre, code, kbd, th-literate-program { --recursive-mono: 1.0; --recursive-casl: 0.0; --recursive-slnt: 0.0; --recursive-wght: 450; } b, strong { --recursive-wght: 700; } i, em { --recursive-slnt: -16.0; font-style: normal; } /* Lay out elements a bit more compactly */ p, pre { margin: 0 0; } h1, h2, h3, h4, h5, h6 { margin: 4px 0; } /* Lay out elements a little less compactly (actually just have some blank space past the end) */ body { padding-bottom: 10rem; } /* Make code examples a little prettier by giving them visual separation from the rest of the page */ code, th-literate-program { padding: 3px 4px; background-color: var(--shaded-background); border-radius: 4px; } th-literate-program, th-literate-output { display: block; } kbd { padding: 3px 6px; border: 1px solid var(--border-1); border-radius: 6px; } pre, th-literate-program { padding: 8px 12px; margin: 12px 0; background-color: var(--shaded-against-background); border-radius: 8px; transition: background-color var(--transition-duration); } @media (prefers-color-scheme: light) { pre, th-literate-program { background-color: transparent; border: 1px solid var(--border-1); } } @media (prefers-color-scheme: dark) { .tree summary:hover { & pre, & th-literate-program { background-color: var(--shaded-against-background-twice); } } } pre>code, th-literate-program>code { padding: 0; background: none; border-radius: 0px; } th-literate-program { white-space: pre; } /* And don't let code examples fly off and overflow the window */ pre { min-width: 0; width: auto; overflow: auto; } /* Also don't let images get out of hand */ img { max-width: 100%; } /* Also regarding images - make them look a bit more pretty by default */ img.pic { border-radius: 6px; margin: 8px 0; } /* Image hints for tweaking rendering */ img { &[src*='+pixel'] { image-rendering: pixelated; border-radius: 0; } /* TODO: These could be autogenerated! */ &[src*='+width160'] { width: 160px; height: auto; } &[src*='+width640'] { width: 640px; height: auto; } &[src*='+width752'] { width: 752px; height: auto; } /* Resources for use in JavaScript. */ &.resource { display: none; } } /* Fix the default blue and ugly purple links normally have */ a { color: var(--link-color); } a:visited { color: var(--link-color-visited); } /* Make blockquotes a bit prettier */ blockquote { margin: 0; padding: 4px 12px; margin: 4px 0; border-left: 4px solid var(--border-1); } /* And tables. */ table { margin: 8px 0; } table, th, td { border: 1px solid var(--border-2); border-collapse: collapse; padding: 4px 10px; } th { background-color: var(--shaded-background); --recursive-wght: 700; --recursive-casl: 0.5; } /* Style the noscript box a little more prettily. */ .noscript { padding: 16px; background-color: #fde748; color: var(--text-color-light); border: 1px solid #6c581c; border-radius: 8px; width: fit-content; margin-left: auto; margin-right: auto; } .noscript p { margin-top: 0; margin-bottom: 16px; } .noscript p:last-child { margin-bottom: 0; } .noscript a { color: var(--link-color-light); } .noscript a:visited { color: var(--link-color-visited-light); } /* also, webkit. */ #webkit-makes-me-go-insane { display: none; } /* Style the navigation bar. */ nav { display: flex; align-items: center; } nav .nav-page { display: flex; flex-direction: column; } /* Give the logo on the top some nicer looks */ nav .logo { width: 48px; height: 48px; padding: 16px; display: block; opacity: 100%; color: var(--text-color); } /* Style page titles */ h1.page-title { --recursive-wght: 800; margin-top: 0; margin-bottom: 0; margin-left: 32px; font-size: 1.25rem; } /* Style the footer */ footer { margin-top: 4rem; text-align: right; opacity: 40%; & #footer-icon { color: var(--text-color); padding-right: 24px; } } /* Style emojis to be readable */ img[is="th-emoji"] { max-width: 1.5em; max-height: 1.5em; vertical-align: bottom; object-fit: contain; } /* And also style emoji tooltips. */ .emoji-wrapper { --transition-duration: 0.2s; position: relative; } .emoji-tooltip { display: flex; flex-direction: column; align-items: center; position: absolute; left: 50%; transform: translateX(-50%) translateY(-10%) scale(0.8); width: max-content; z-index: 100; background-color: var(--background-color-tooltip); padding: 8px; margin-top: 8px; border-radius: 6px; transition: opacity var(--transition-duration) cubic-bezier(0.22, 1, 0.36, 1), filter var(--transition-duration) cubic-bezier(0.22, 1, 0.36, 1), transform var(--transition-duration) cubic-bezier(0.22, 1, 0.36, 1); opacity: 0%; filter: blur(3px); pointer-events: none; } .emoji-wrapper:hover .emoji-tooltip { opacity: 100%; filter: blur(0px); transform: translateX(-50%) scale(1.0); } .emoji-tooltip img { display: block; max-width: 64px; max-height: 64px; } .emoji-tooltip p { --recursive-wght: 550; color: var(--text-color); font-size: 0.75em; margin: 0; padding-top: 4px; line-height: 1; } /* Funny joke */ @keyframes hello-there { 0% { opacity: 0%; } 70% { opacity: 0%; } 100% { opacity: 70%; } } .oops-you-seem-to-have-gotten-stuck { margin-top: 16px; display: none; position: absolute; opacity: 0%; } #index\:treehouse>details:not([open])>summary .oops-you-seem-to-have-gotten-stuck { display: inline; animation: 4s hello-there forwards; } /* Literate programming support */ th-literate-program[data-mode="input"] { /* Override the cursor with an I-beam, because the editor captures clicks and does not bubble them back up to the caller */ cursor: text; } th-literate-program[data-mode="output"] { position: relative; & code { display: block; } & code.error { color: #e39393; } &::after { content: 'Output'; padding: 8px; position: absolute; right: 0; top: 0; opacity: 50%; } } /* Syntax highlighting */ :root { --syntax-comment: #9b8580; --syntax-identifier: var(--text-color); --syntax-keyword1: #e15e2b; --syntax-keyword2: #199aca; --syntax-operator: #e3755b; --syntax-function: #d57b07; --syntax-literal: #a64fb3; --syntax-string: #79ac3b; --syntax-punct: #a28680; } @media (prefers-color-scheme: dark) { :root { --syntax-comment: #aca8a4; --syntax-identifier: var(--text-color); --syntax-keyword1: #ffb06a; --syntax-keyword2: #9acfe3; --syntax-operator: #ec9f8d; --syntax-function: #fbd283; --syntax-literal: #e9b9f0; --syntax-string: #b0dd7a; --syntax-punct: #9d9a96; } } .th-syntax-highlighting span { &.comment { --recursive-slnt: -16.0; color: var(--syntax-comment); } &.identifier { color: var(--syntax-identifier); } &.keyword1 { color: var(--syntax-keyword1); } &.keyword2 { color: var(--syntax-keyword2); } &.operator { color: var(--syntax-operator); } &.function { color: var(--syntax-function); } &.literal { color: var(--syntax-literal); } &.string { color: var(--syntax-string); } &.punct { color: var(--syntax-punct); } } .th-syntax-highlighting { & .export { text-decoration: underline dotted; cursor: help; text-decoration-color: transparent; transition: text-decoration-color var(--transition-duration); } &:hover, &:focus { & .export { text-decoration-color: var(--syntax-keyword1); } } }