@import "vars";
@import "normalise"; // normalise CSS across browsers
@import "nav"; //the side navbar
@import "header"; // the header
@import "footer"; // the footer
@import "article"; // individual blog articles
@import "projects"; //Styles for the projects page
@import "cv"; // the CV page
@import "blogroll"; // the summaries of the blogposts
@import "comments"; //the mastodon comments
@import "model_viewer"; //Styles for the 3D model viewer
@import "mastodon_timeline";
@import "night_mode_toggle";
// The syntax highlighting css
// generated with rougify style bw > code_style_bw.scss
// @import "code_style_bw";
@import "code_style_github";
@import "d2";
* {
box-sizing: border-box;
font-family: $font_stack;
text-rendering: geometricPrecision;
}
:root {
--theme-text-color: #222;
--theme-bg-color: #fcfcfc;
--theme-model-line-color: #222;
--theme-model-bg-color: #fcfcfc;
--theme-subtle-outline: oklch(90% 0 50);
--theme-highlight-color: hsl(338, 75%, 60%);
--theme-highlight-color-transparent: hsla(338, 75%, 60%, 33%);
// constrain width and center
--body-max-width: 900px;
--body-width: min(100vw, 900px);
--body-margin: calc((100vw - var(--body-width)) / 2);
--color-mode: "light";
--color-dark: #141414;
--color-dark-alpha: rgba(0, 0, 0, 0.1);
--color-light: #efefef;
--color-light-alpha: rgba(255, 255, 255, 0.9);
--icon-sun: url('data:image/svg+xml,\
');
--icon-sun-filter: invert(0.75);
--icon-moon: url('data:image/svg+xml,\
');
--icon-moon-filter: invert(0);
--background: #efefef;
--text-color: #141414;
--button-icon: var(--icon-moon);
--button-icon-filter: var(--icon-moon-filter);
--button-background: var(--color-dark);
--button-color: var(--color-light);
--border-color: var(--color-dark-alpha);
}
html {
width: 100vw;
scroll-behavior: smooth;
}
body {
background: var(--theme-bg-color);
color: var(--theme-text-color);
max-width: var(--body-max-width);
margin: auto;
}
// Padding to keep the keep the content to the right of the header
main {
container: main / inline-size;
--main-margin-left: 240px;
--main-padding-left: 30px;
--main-padding-right: 30px;
--main-max-width: 560px;
max-width: var(--main-max-width);
margin-left: var(--main-margin-left);
padding-left: var(--main-padding-left);
padding-right: var(--main-padding-right);
padding-top: 10vh;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
h1 {
font-size: 2em;
}
// img that are direct children of p are usually img tags in markdown
p > img {
margin-top: 2em;
margin-bottom: 1em;
width: 90%;
//hack to center images in p tags
display: block;
margin-left: auto;
margin-right: auto;
}
}
:is(h1, h2, h3, h4, .text-balance) {
text-wrap: balance;
}
p,
figcaption {
font-size: 1em;
line-height: 1.3em;
}
main :is(p, h1, h2, h3, h4, h5, h6) {
margin-block-end: 0.2em;
}
a {
text-decoration: underline;
text-underline-offset: 0.25em;
text-decoration-thickness: 0.5px;
color: var(--theme-text-color);
}
header a,
nav a {
text-decoration: none;
color: var(--theme-text-color);
}
div.highlight {
max-width: 100%;
overflow: auto;
}
p {
margin-top: 0.7em;
margin-bottom: 0.7em;
padding-right: 0;
vertical-align: baseline;
}
figure {
container: fig / inline-size;
width: 100%;
padding-bottom: 1em;
margin-left: auto;
margin-right: auto;
figcaption {
margin-top: 1em;
text-align: center;
}
}
figure > img,
figure > svg,
figure > canvas {
width: 100%;
margin-bottom: 1em;
border-radius: 10px;
}
figure.centered {
display: flex;
justify-content: center;
}
section.image-grid-4x4 {
aspect-ratio: 1 / 1;
display: grid;
grid-template-columns: auto auto;
grid-template-rows: auto auto;
gap: 2px;
margin-bottom: 1em;
place-items: stretch stretch;
* {
margin: 0;
padding: 0;
width: 100%;
aspect-ratio: auto;
}
}
section.note {
a {
color: purple;
}
p {
margin: 0;
}
padding: 1em;
margin-top: 1em;
margin-bottom: 1em;
background-color: var(--theme-highlight-color-transparent);
border-radius: 10px;
color: black;
}
section.center {
display: flex;
justify-content: center;
margin-top: 1em;
margin-bottom: 1em;
}
div.CodeRay,
.wide-outside-parent {
// width: 100vw;
position: relative;
width: calc(
100vw - var(--body-margin) - var(--main-margin-left) -
var(--main-padding-left) - var(--main-padding-right)
);
pre {
white-space: pre-wrap;
}
.line-numbers {
// display: none;
margin-right: 1em;
opacity: 0.3;
a {
text-decoration: none;
}
}
}
// If the browser doesn't support web components, hide anything with has-wc class
body.has-wc .no-wc {
display: none;
}
// If the browser does support web components, hide anything with no-wc class
body:not(.has-wc) .has-wc {
display: none;
}
@media only screen and (max-width: $horizontal_breakpoint),
only screen and (max-height: $vertical_breakpoint) {
main {
--main-margin-left: 0px;
--main-padding-left: 20px;
--main-padding-right: 20px;
padding-top: 10px;
margin: auto;
justify-content: flex-start;
}
article {
margin-left: 0px;
}
h1 {
font-size: 1.5em !important;
}
.MathJax {
font-size: 0.8em !important;
overflow-x: auto;
overflow-y: hidden;
}
// Make code a bit smaller so it doesn't wrap as much
div.CodeRay {
font-size: 0.8rem;
}
}
.visually-hidden {
display: block;
height: 1px;
width: 1px;
overflow: hidden;
clip: rect(1px 1px 1px 1px);
clip: rect(1px, 1px, 1px, 1px);
clip-path: inset(1px);
white-space: nowrap;
position: absolute;
}
// Add transitions for things that will be affected by night mode
body {
transition: background 500ms ease-in-out, color 200ms ease-in-out;
}
img {
transition: opacity 500ms ease-in-out;
}
svg.invertable,
img.invertable {
transition: filter 500ms ease-in-out;
}
@mixin night-mode {
--background: var(--color-dark);
--text-color: var(--color-light);
--button-icon: var(--icon-sun);
--button-icon-filter: var(--icon-sun-filter);
--button-background: var(--color-light);
--button-color: var(--color-dark);
--border-color: var(--color-light-alpha);
body {
--theme-text-color: #fcfcfc;
--theme-bg-color: #222;
--theme-subtle-outline: oklch(50% 0 50);
}
img:not(.invertable) {
opacity: 0.75;
}
svg.invertable,
img.invertable {
opacity: 1;
filter: invert(1);
}
}
@media (prefers-color-scheme: dark) {
:root {
--color-mode: "dark";
}
:root:not([data-user-color-scheme]) {
@include night-mode;
}
}
[data-user-color-scheme="dark"] {
@include night-mode;
}