618 lines
12 KiB
SCSS
618 lines
12 KiB
SCSS
|
@use 'sass:math';
|
||
|
@use 'colours' as *;
|
||
|
@use 'fonts' as *;
|
||
|
|
||
|
@import url(counters.css);
|
||
|
|
||
|
|
||
|
@layer colordefs {
|
||
|
@property --base-hue {
|
||
|
syntax: "<number>";
|
||
|
inherits: true;
|
||
|
initial-value: 336;
|
||
|
}
|
||
|
|
||
|
@include color-var(--fg, $darker, $light);
|
||
|
@include color-var(--bg, $light, $darker);
|
||
|
@include color-var(--counter-fg, $lighter, $lighter);
|
||
|
@include color-var(--counter-bg, $dark, $mid);
|
||
|
@include color-var(--accent, $dark-accent, $light-accent);
|
||
|
@include color-var(--counter-accent, $light-accent, $dark-accent);
|
||
|
@include color-var(--box-base, $light, $mid);
|
||
|
@include color-var(--box-fg, $darker, $lighter);
|
||
|
@include color-var(--box-shadow, halfalpha($mid));
|
||
|
|
||
|
:root {
|
||
|
--gradient: linear-gradient(
|
||
|
120deg in oklch,
|
||
|
oklch(93% 27.1% 96deg),
|
||
|
oklch(84.03% 22% 15deg),
|
||
|
oklch(80% 29.3% 303deg),
|
||
|
oklch(84% 23% 233deg),
|
||
|
oklch(89% 25% 161deg)
|
||
|
);
|
||
|
|
||
|
@media (prefers-color-scheme: dark) {
|
||
|
// todo oklch
|
||
|
--gradient:
|
||
|
linear-gradient(20deg in oklch,
|
||
|
hsl(300deg 30% 20%),
|
||
|
hsl(220deg 30% 20%),
|
||
|
hsl(150deg 30% 20%),
|
||
|
hsl(30deg 30% 20%),
|
||
|
hsl(350deg 30% 20%));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
@mixin boxy-margin { margin: 1rem 0; }
|
||
|
|
||
|
@mixin boxy-shadow($dst: 0.5rem) {
|
||
|
box-shadow: 0.5rem 0.5rem 0 var(--box-shadow);
|
||
|
}
|
||
|
|
||
|
@function border-style($fg: var(--fg)) { @return 3px solid $fg; }
|
||
|
|
||
|
@mixin boxy-unpadded($bg, $fg: var(--box-fg), $border: $fg, $dst: 0.5em)
|
||
|
{
|
||
|
color: $fg;
|
||
|
background: $bg;
|
||
|
border: border-style($border);
|
||
|
@include boxy-shadow;
|
||
|
}
|
||
|
|
||
|
@mixin boxy($bg, $clear: true, $args...) {
|
||
|
@include boxy-unpadded($bg, $args...);
|
||
|
@include boxy-margin;
|
||
|
padding: 0.5rem 0.8rem;
|
||
|
@if $clear {
|
||
|
clear: both;
|
||
|
} @else {
|
||
|
overflow: hidden; // makes the box dodge floats?????? idk why
|
||
|
}
|
||
|
:first-child { margin-top: 0; }
|
||
|
:last-child { margin-bottom: 0; }
|
||
|
}
|
||
|
|
||
|
@mixin fake-border {
|
||
|
border: none;
|
||
|
filter:
|
||
|
drop-shadow(1px 1px 0 currentcolor)
|
||
|
drop-shadow(1px -1px 0 currentcolor)
|
||
|
drop-shadow(-1px 1px 0 currentcolor)
|
||
|
drop-shadow(-1px -1px 0 currentcolor)
|
||
|
drop-shadow(1px 0 0 currentcolor)
|
||
|
drop-shadow(-1px 0 0 currentcolor)
|
||
|
drop-shadow(0 1px 0 currentcolor)
|
||
|
drop-shadow(0 -1px 0 currentcolor);
|
||
|
}
|
||
|
|
||
|
@mixin decorations($before, $after: $before, $size: null, $color: null) {
|
||
|
&::before, &::after {
|
||
|
@include symbol-font;
|
||
|
font-style: normal;
|
||
|
@if $size { font-size: $size; }
|
||
|
@if $color { color: $color; }
|
||
|
margin: 0 0.5rem;
|
||
|
}
|
||
|
&::before { content: $before; }
|
||
|
&::after { content: $after; }
|
||
|
}
|
||
|
|
||
|
|
||
|
@mixin inline-lists {
|
||
|
ul, menu, li { display: inline; }
|
||
|
ul, menu { padding-left: 0; }
|
||
|
li { list-style: none; }
|
||
|
li + li { margin-left: 0.75ex; }
|
||
|
}
|
||
|
|
||
|
@mixin center {
|
||
|
text-align: center;
|
||
|
text-wrap: balance;
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer outer {
|
||
|
* { box-sizing: border-box; }
|
||
|
|
||
|
:root {
|
||
|
background: var(--gradient) fixed;
|
||
|
color: var(--fg);
|
||
|
|
||
|
@include main-font;
|
||
|
font-size: $body-size;
|
||
|
line-height: 150%;
|
||
|
}
|
||
|
|
||
|
body {
|
||
|
@include boxy-unpadded(var(--bg));
|
||
|
margin: 2em auto;
|
||
|
|
||
|
$darkbg: oklch(from var(--bg) calc(l * 0.9) calc(c * 1.25) h);
|
||
|
background: linear-gradient(to bottom in oklch, var(--bg), $darkbg);
|
||
|
|
||
|
width: min(54rem, 85vw);
|
||
|
}
|
||
|
|
||
|
main {
|
||
|
margin: 0 2rem;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@layer header {
|
||
|
header {
|
||
|
@include inverted;
|
||
|
@include inline-lists;
|
||
|
|
||
|
text-align: center;
|
||
|
text-wrap: balance;
|
||
|
padding: 1em;
|
||
|
|
||
|
h1 {
|
||
|
@include decorations('✿', $size: 60%);
|
||
|
@include heading-size(0);
|
||
|
@include heading-font;
|
||
|
font-weight: $main-heading-weight;
|
||
|
font-style: italic;
|
||
|
letter-spacing: 0.1ch;
|
||
|
margin: { top: 0; bottom: 0.5rem; }
|
||
|
|
||
|
em { font-weight: $normal-weight; }
|
||
|
}
|
||
|
|
||
|
.meta {
|
||
|
@include small-font;
|
||
|
display: flex;
|
||
|
gap: 2em;
|
||
|
justify-content: center;
|
||
|
|
||
|
* { display: inline; }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@layer footer {
|
||
|
footer {
|
||
|
@include inverted(0.75rem);
|
||
|
@include small-font;
|
||
|
@include inline-lists;
|
||
|
|
||
|
clear: both;
|
||
|
margin: 2rem 0 0 0;
|
||
|
|
||
|
display: flex;
|
||
|
justify-content: center;
|
||
|
|
||
|
menu { @include decorations('➸', ''); }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@layer headings {
|
||
|
main {
|
||
|
h1, h2, h3, h4, h5, h6 { @include heading-font; }
|
||
|
|
||
|
h1 {
|
||
|
@include inverted;
|
||
|
@include boxy-margin;
|
||
|
@include boxy-shadow;
|
||
|
@include heading-size(1);
|
||
|
letter-spacing: 0.075ch;
|
||
|
clear: both;
|
||
|
}
|
||
|
|
||
|
h2 { @include heading-size(2); }
|
||
|
h3 { @include heading-size(3); }
|
||
|
h4, h5, h6 { font-size: 1rem; }
|
||
|
|
||
|
h2, h3, h4, h5, h6 {
|
||
|
padding: 0.25rem 0.75rem;
|
||
|
border-bottom: border-style();
|
||
|
margin-bottom: 1rem;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@layer links {
|
||
|
a {
|
||
|
color: inherit;
|
||
|
text-decoration: 2px solid underline var(--accent);
|
||
|
text-underline-offset: 0.175em;
|
||
|
&:hover { color: var(--accent); }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@layer banner {
|
||
|
.banner {
|
||
|
@include boxy(var(--accent), $fg: var(--banner-fg),
|
||
|
$border: var(--banner-border));
|
||
|
@include decorations('☛', '☚');
|
||
|
@include heading-size(2);
|
||
|
|
||
|
font-weight: $boldbold-weight;
|
||
|
width: fit-content;
|
||
|
margin: auto;
|
||
|
|
||
|
p { display: inline; }
|
||
|
|
||
|
&:has(a) {
|
||
|
background: var(--accent);
|
||
|
a { text-decoration: none; }
|
||
|
a:hover { color: var(--counter-accent); }
|
||
|
}
|
||
|
|
||
|
--banner-fg: #{$lighter};
|
||
|
--banner-border: #{$dark};
|
||
|
@media (prefers-color-scheme: dark) {
|
||
|
--banner-fg: #{$darker};
|
||
|
--banner-border: #{$lighter};
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer code {
|
||
|
pre {
|
||
|
@include code-font;
|
||
|
font-size: 1rem * $code-font-scale;
|
||
|
}
|
||
|
|
||
|
:where(:not(pre)) > code {
|
||
|
@include code-font;
|
||
|
white-space: nowrap;
|
||
|
}
|
||
|
|
||
|
/* syntax highlighting */
|
||
|
.kw { color: hsl(300deg, 60%, 30%); }
|
||
|
.pp { color: hsl(343deg, 100%, 40%); }
|
||
|
.dt { color: hsl(173deg, 100%, 24%); }
|
||
|
.fu, .at { color: hsl(34deg, 100%, 30%); }
|
||
|
.va { color: hsl(203deg, 100%, 30%); }
|
||
|
.cf { color: hsl(276deg, 75%, 35%); }
|
||
|
.op { color: hsl(220deg, 40%, 33%); }
|
||
|
.co { color: hsl(221deg, 10%, 39%); }
|
||
|
.bu { color: hsl(120deg, 85%, 25%); }
|
||
|
.st, .fl, .dv, .bn, .sc, .ss { color: hsl(143deg, 100%, 20%); }
|
||
|
.wa { color: hsl(350deg, 80%, 25%); text-decoration: wavy 1.5px underline; }
|
||
|
.al { color: hsl(350deg, 80%, 25%); }
|
||
|
.cn { color: hsl(343deg, 100%, 30%); }
|
||
|
|
||
|
@media (prefers-color-scheme: dark) {
|
||
|
.kw { color: hsl(300deg, 60%, 80%); }
|
||
|
.pp { color: hsl(343deg, 100%, 85%); }
|
||
|
.dt { color: hsl(193deg, 60%, 74%); }
|
||
|
.fu, .at { color: hsl(34deg, 100%, 70%); }
|
||
|
.va { color: hsl(203deg, 100%, 75%); }
|
||
|
.cf { color: hsl(276deg, 75%, 85%); }
|
||
|
.op { color: hsl(220deg, 40%, 70%); }
|
||
|
.co { color: hsl(221deg, 10%, 80%); }
|
||
|
.bu { color: hsl(120deg, 55%, 75%); }
|
||
|
.st, .fl, .dv, .bn, .sc, .ss { color: hsl(143deg, 70%, 80%); }
|
||
|
.wa { color: hsl(350deg, 80%, 77%); text-decoration: wavy 1.5px underline; }
|
||
|
.al { color: hsl(350deg, 80%, 77%); }
|
||
|
.cn { color: hsl(343deg, 80%, 70%); }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
@layer figures {
|
||
|
figure {
|
||
|
img { max-width: 100%; }
|
||
|
|
||
|
&:where(:not(.nobg, .hasborder)) {
|
||
|
a img { border: border-style(); }
|
||
|
a:hover img { border: border-style(var(--accent)); }
|
||
|
}
|
||
|
|
||
|
&.nobg a img { @include fake-border; }
|
||
|
&.lightbg img { background: var(--light); }
|
||
|
}
|
||
|
|
||
|
figcaption {
|
||
|
@include note-font;
|
||
|
@include center;
|
||
|
|
||
|
em { font-style: normal; }
|
||
|
}
|
||
|
|
||
|
:not(.floating) > figcaption { width: 75%; }
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer tables {
|
||
|
table {
|
||
|
margin: auto;
|
||
|
border-spacing: 0;
|
||
|
border: { top: border-style(); bottom: border-style(); }
|
||
|
}
|
||
|
|
||
|
th { font-weight: $bold-weight; }
|
||
|
|
||
|
thead th {
|
||
|
border-bottom: border-style(halfalpha(var(--fg)));
|
||
|
}
|
||
|
|
||
|
td, th {
|
||
|
padding: 0 0.5em;
|
||
|
vertical-align: text-bottom;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer boxes {
|
||
|
pre, aside, blockquote {
|
||
|
$hue: calc(h + var(--hue-nudge));
|
||
|
--box-bg: oklch(from var(--box-base) var(--luma) c #{$hue});
|
||
|
@include boxy(var(--box-bg), $clear: false);
|
||
|
|
||
|
--luma: calc(l * 1.05);
|
||
|
@media (prefers-color-scheme: dark) { --luma: calc(l / 1.05); }
|
||
|
}
|
||
|
|
||
|
:is(pre, .sourceCode, aside, blockquote) {
|
||
|
& + & { margin-top: 1.5em; }
|
||
|
}
|
||
|
|
||
|
pre {
|
||
|
--hue-nudge: 60;
|
||
|
}
|
||
|
|
||
|
aside {
|
||
|
@include note-font;
|
||
|
--hue-nudge: -80;
|
||
|
}
|
||
|
|
||
|
blockquote {
|
||
|
@include note-font;
|
||
|
--hue-nudge: 180;
|
||
|
}
|
||
|
|
||
|
.light {
|
||
|
@include apply-colors($fg: $darker, $bg: $lighter);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer conlangs {
|
||
|
.ipa { @include ipa-font; }
|
||
|
|
||
|
.lang, .ebnf-t {
|
||
|
@include ipa-font;
|
||
|
font-weight: 700;
|
||
|
font-variation-settings: "ENLA" 25;
|
||
|
/* ENLA (increased x-height) not defined for IPA characters */
|
||
|
}
|
||
|
|
||
|
.scr {
|
||
|
vertical-align: -40%;
|
||
|
height: 1.5em;
|
||
|
|
||
|
:is(.gloss, .bigscr) & { height: 2em; }
|
||
|
.hugescr & { height: 4em; }
|
||
|
}
|
||
|
|
||
|
.gloss {
|
||
|
border: none;
|
||
|
text-align: left;
|
||
|
& + & { margin-top: 2em; }
|
||
|
}
|
||
|
|
||
|
.gloss-split, .gloss-gloss { @include small-font; }
|
||
|
|
||
|
.glosses.left .gloss { margin-left: 0; }
|
||
|
|
||
|
.abbr-list {
|
||
|
dl {
|
||
|
display: grid;
|
||
|
grid-template-columns: 1fr 8fr 1fr 8fr;
|
||
|
}
|
||
|
dt { @extend .abbr; }
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer spans {
|
||
|
|
||
|
dfn, b, strong, dt { font-weight: $bold-weight; }
|
||
|
|
||
|
dfn { font-style: normal; }
|
||
|
|
||
|
abbr, .abbr { font-variant: all-small-caps; }
|
||
|
|
||
|
u u { text-decoration: double underline; }
|
||
|
|
||
|
.note { @include note-font; }
|
||
|
:is(h1, h2) .note { font-size: 75%; }
|
||
|
|
||
|
mark {
|
||
|
--mark-hue: calc(var(--hue) + 90)
|
||
|
padding: 0 0.35ch;
|
||
|
mix-blend-mode: multiply;
|
||
|
background: oklch(95% 40% var(--mark-hue) / 30%);
|
||
|
|
||
|
@media (prefers-color-scheme: dark) {
|
||
|
mix-blend-mode: screen;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
@layer lists {
|
||
|
:not(ol) > li {
|
||
|
list-style: '☀ ';
|
||
|
|
||
|
&::marker {
|
||
|
@include symbol-font;
|
||
|
font-size: 80%;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer dl {
|
||
|
|
||
|
dt {
|
||
|
font-weight: bold;
|
||
|
display: inline;
|
||
|
break-after: avoid;
|
||
|
}
|
||
|
|
||
|
dd {
|
||
|
margin-left: 1em;
|
||
|
display: inline;
|
||
|
break-before: avoid;
|
||
|
}
|
||
|
|
||
|
dd::after {
|
||
|
content: '';
|
||
|
display: block;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
@layer twocol {
|
||
|
.twocol {
|
||
|
columns: 2;
|
||
|
> :first-child { margin-top: 0; }
|
||
|
}
|
||
|
|
||
|
.twocol-grid {
|
||
|
display: grid;
|
||
|
grid-template-columns: 1fr 1fr;
|
||
|
gap: 1em;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@layer ebnf {
|
||
|
|
||
|
.ebnf {
|
||
|
border: none;
|
||
|
}
|
||
|
|
||
|
.ebnf td {
|
||
|
padding: 0 0.15em;
|
||
|
}
|
||
|
|
||
|
.ebnf-nt {
|
||
|
font-weight: bold;
|
||
|
color: hsl(155deg, 80%, 30%);
|
||
|
white-space: nowrap;
|
||
|
}
|
||
|
|
||
|
.ebnf-punc {
|
||
|
color: hsl(25deg, 40%, 30%);
|
||
|
}
|
||
|
|
||
|
.ebnf-sub, .ebnf-brack {
|
||
|
color: hsl(210deg, 80%, 35%);
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
|
||
|
.ebnf-brack {
|
||
|
padding: 0 0.05em;
|
||
|
}
|
||
|
|
||
|
.ebnf-s {
|
||
|
font-style: italic;
|
||
|
color: hsl(330deg, 80%, 30%);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer floats {
|
||
|
.floating {
|
||
|
max-width: 33%;
|
||
|
margin: 0.5em 1em;
|
||
|
|
||
|
&:not(.left) {
|
||
|
float: right;
|
||
|
margin-right: 0;
|
||
|
}
|
||
|
|
||
|
&.left {
|
||
|
float: left;
|
||
|
margin-left: 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.shaped { shape-margin: 1em; }
|
||
|
}
|
||
|
|
||
|
|
||
|
@layer images {
|
||
|
|
||
|
.pixel {
|
||
|
image-rendering: crisp-edges;
|
||
|
image-rendering: pixelated;
|
||
|
}
|
||
|
|
||
|
.emoji {
|
||
|
height: 1em;
|
||
|
width: 1em;
|
||
|
vertical-align: -0.1em;
|
||
|
}
|
||
|
|
||
|
.bigemoji {
|
||
|
height: 2em;
|
||
|
width: 2em;
|
||
|
vertical-align: -0.2em;
|
||
|
}
|
||
|
|
||
|
.emojiseq { white-space: nowrap; }
|
||
|
}
|
||
|
|
||
|
@layer citations {
|
||
|
|
||
|
.citation {
|
||
|
font-size: 90%;
|
||
|
}
|
||
|
|
||
|
#refs {
|
||
|
margin-top: 0.75em;
|
||
|
}
|
||
|
.csl-entry {
|
||
|
margin-left: 2em;
|
||
|
text-indent: -2em;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
@layer math {
|
||
|
|
||
|
math[display=block] {
|
||
|
border: 2px solid var(--fg);
|
||
|
|
||
|
padding: 1em 3em;
|
||
|
margin: auto;
|
||
|
width: min-content;
|
||
|
|
||
|
}
|
||
|
.rulebox math[display=block] {
|
||
|
border: none;
|
||
|
padding: 0;
|
||
|
}
|
||
|
|
||
|
.texdefs {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
.rulebox {
|
||
|
float: right;
|
||
|
border: 1px solid var(--fg);
|
||
|
background: #ffffff66;
|
||
|
padding: .4em 1.2em;
|
||
|
margin-left: 3em;
|
||
|
|
||
|
// "#asd" for specificity
|
||
|
:is(p, .math, mjx-container, #asd) {
|
||
|
margin: 0;
|
||
|
padding: 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|