Refactored primitives & content.css

This commit is contained in:
2026-03-03 13:58:20 +01:00
parent b8544011d4
commit ea0f471fd3
26 changed files with 1357 additions and 1310 deletions

View File

@@ -1,6 +1,12 @@
import { defineMarkdocConfig, component } from '@astrojs/markdoc/config'; import { defineMarkdocConfig, component, nodes } from '@astrojs/markdoc/config';
export default defineMarkdocConfig({ export default defineMarkdocConfig({
nodes: {
table: {
...nodes.table,
render: component('./src/components/markdoc/Table.astro'),
},
},
tags: { tags: {
ElementSymbol: { ElementSymbol: {
render: component('./src/components/content/ElementSymbol.astro'), render: component('./src/components/content/ElementSymbol.astro'),

View File

@@ -58,6 +58,8 @@ const symbol = entry?.data.symbol as Symbol | undefined;
display: inline-block; display: inline-block;
line-height: 1; line-height: 1;
vertical-align: middle; vertical-align: middle;
text-align: center;
width: 100%;
} }
.svg { .svg {
display: inline-flex; display: inline-flex;

View File

@@ -1,89 +1,86 @@
.trigger { .trigger {
@mixin ml auto; @mixin ml auto;
@mixin typo_body;
cursor: pointer; cursor: pointer;
display: flex; display: flex;
gap:var(--ui-spacing-comfortable); gap: var(--size-4);
align-items: center; align-items: center;
padding: var(--ui-spacing-snug) var(--ui-spacing-spacious); padding: var(--size-1) var(--size-3);
border: var(--size-px) solid var(--color-border-normal); border: var(--size-px) solid var(--color-border-normal);
font-family: var(--font-mono); font-family: var(--font-mono);
font-size: var(--ui-typo-size-md); color: var(--color-text-disabled);
color: var(--text-color-disabled);
background: var(--color-palette-charcoal-gray); background: var(--color-surface-elevated-2);
transition: border-color 0.15s, color 0.15s; transition: border-color 0.15s, color 0.15s;
&:hover { &:hover {
border-color: var(--color-text-inverse); border-color: var(--color-border-strong);
color: var(--color-text-inverse); color: var(--color-text-primary);
} }
& .kbd { & .kbd {
padding: var(--ui-spacing-hairline) var( --ui-spacing-cozy); @mixin typo_code;
border: var(--size-px) solid var(--color-border-normal);
border-radius: var(--size-05);
font-family: var(--font-mono); padding: var(--size-px) var(--size-1);
font-size: var(--ui-typo-size-xs); border: var(--size-px) solid var(--color-border-strong);
border-radius: var(--size-1);
background: var(--color-surface-inverse);
} }
} }
.backdrop { .backdrop {
position: fixed; position: fixed;
z-index: 99; z-index: var(--z-modal);
inset: 0; inset: 0;
background: var(--color-overlay-heavy); background: var(--color-overlay-heavy);
} }
.palette { .palette {
position: fixed; position: fixed;
z-index: 100; z-index: calc(var(--z-modal) + 1);
top: 20%; top: 20%;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
width: min(var(--size-128), 90vw); width: min(36rem, 90vw);
padding: var(--ui-spacing-tight); padding: var(--size-1);
border: var(--size-05) solid var(--color-primary); border: var(--size-1) solid var(--color-primary);
background: var(--color-surface-inverse); background: var(--color-surface-base);
box-shadow: box-shadow:
0 0 0 var(--size-px) var(--color-border-strong), 0 0 0 var(--size-px) var(--color-surface-base),
var(--size-1) var(--size-1) 0 var(--color-surface-inverse); var(--size-4) var(--size-4) 0 var(--color-surface-base);
} }
.header { .header {
@mixin px var(--ui-spacing-generous); @mixin px var(--size-7);
@mixin border-b var(--size-px), solid, var(--color-border-strong);
display: flex; display: flex;
gap: var(--ui-spacing-comfortable); gap: var(--size-4);
align-items: center; align-items: center;
border-bottom: var(--size-px) solid var(--color-border-strong);
& .icon { & .icon {
font-family: var(--font-mono); font-family: var(--font-mono);
font-size: var(--ui-typo-size-lg); font-size: var(--type-1);
font-weight: 900; font-weight: 900;
color: var(--color-text-disabled); color: var(--color-primary);
} }
& .input { & .input {
@mixin py var(--ui-spacing-generous); @mixin py var(--size-5);
flex: 1; flex: 1;
border: none; border: none;
font-family: var(--font-mono); font-family: var(--font-mono);
font-size: var(--ui-typo-size-lg); font-size: var(--type-1);
color: var(--color-text-inverse); color: var(--color-text-primary);
background: transparent; background: transparent;
outline: none; outline: none;
@@ -94,51 +91,54 @@
} }
& .esc { & .esc {
@mixin px var(--size-2);
font-family: var(--font-mono); font-family: var(--font-mono);
font-size: var(--typo-size-xs); font-size: var(--type--2);
color: var(--color-text-disabled); color: var(--color-text-disabled);
} }
} }
.results { .results {
overflow-y: auto; overflow-y: auto;
max-height: var(--size-96); max-height: 22.5rem;
& .groupLabel { & .groupLabel {
padding: var(--ui-spacing-relaxed) var(--ui-spacing-generous) var(--ui-spacing-snug); padding: var(--size-5) var(--size-7) var(--size-2);
font-size: var(--ui-typo-size-2xs); font-family: var(--font-mono);
font-size: var(--type--3);
font-weight: 700; font-weight: 700;
color: var(--color-text-disabled); color: var(--color-text-disabled);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: var(--spacing-loosest); letter-spacing: 0.2em;
} }
& .result { & .result {
cursor: pointer; cursor: pointer;
display: flex; display: flex;
gap: var(--ui-spacing-relaxed); gap: var(--size-5);
align-items: center; align-items: center;
padding: var(--ui-spacing-comfortable) var(--ui-spacing-generous); padding: var(--size-4) var(--size-7);
font-family: var(--font-mono); font-family: var(--font-mono);
font-size: var(--ui-typo-size-md); font-size: var(--type-0);
color: var(--color-text-inverse); color: var(--color-text-primary);
text-decoration: none; text-decoration: none;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: var(--typo-spacing-relaxed); letter-spacing: 0.025em;
transition: background 0.8s; transition: background 0.08s;
& .type { & .type {
min-width: var(--size-16); min-width: 4rem;
font-size: var(--ui-typo-size-2xs); font-size: var(--type--3);
color: var(--color-text-disabled); color: var(--color-text-disabled);
text-align: right; text-align: right;
letter-spacing: var(--typo-spacing-looser); letter-spacing: 0.125em;
} }
& .label { & .label {
@@ -146,14 +146,14 @@
} }
& .path { & .path {
font-size: var(--ui-typo-size-2xs); font-size: var(--type--3);
color: var(--color-text-disabled); color: var(--color-text-disabled);
text-transform: none; text-transform: none;
letter-spacing: 0; letter-spacing: 0;
} }
& .arrow { & .arrow {
font-size: var(--ui-typo-size-xs); font-size: var(--type--2);
color: var(--color-text-disabled); color: var(--color-text-disabled);
opacity: 0; opacity: 0;
transition: opacity 0.1s; transition: opacity 0.1s;
@@ -161,7 +161,7 @@
&:hover, &:hover,
&.selected { &.selected {
background: var(--color-border-strong); background: var(--color-surface-elevated-3);
& .arrow { & .arrow {
opacity: 1; opacity: 1;
@@ -171,41 +171,41 @@
} }
.empty { .empty {
padding: var(--ui-spacing-luxurious) var(--ui-spacing-generous); padding: var(--size-8) var(--size-7);
font-size: var(--ui-typo-size-sm); font-family: var(--font-mono);
font-size: var(--type--2);
color: var(--color-text-disabled); color: var(--color-text-disabled);
text-align: center; text-align: center;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: var(--typo-spacing-comfortable); letter-spacing: 0.125em;
} }
.footer { .footer {
@mixin border-t var(--size-px), solid, var(--color-border-strong);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: var(--ui-spacing-comfortable) var(--ui-spacing-generous); padding: var(--size-4) var(--size-7);
border-top: var(--size-px) solid var(--color-border-strong);
font-size: var(--ui-typo-size-xs); font-family: var(--font-mono);
font-size: var(--type--3);
color: var(--color-text-disabled); color: var(--color-text-disabled);
& .group { & .group {
display: flex; display: flex;
gap: var(--ui-spacing-relaxed); gap: var(--size-5);
align-items: center; align-items: center;
} }
& kbd { & kbd {
@mixin mx var(--ui-spacing-tight); margin: 0 var(--size-1);
padding: var(--size-1) var(--size-2);
padding: var(--ui-spacing-tight) var(--ui-spacing-snug);
border: var(--size-px) solid var(--color-border-normal); border: var(--size-px) solid var(--color-border-normal);
border-radius: var(--size-05); border-radius: var(--size-1);
font-family: var(--font-mono); font-family: var(--font-mono);
font-size: var(--ui-typo-size-2xs); font-size: var(--type--3);
} }
} }

View File

@@ -2,7 +2,7 @@
import CommandPalette from "./CMDPalette" import CommandPalette from "./CMDPalette"
--- ---
<header class="site-header"> <header class="site-header ui dark">
<div class="inner"> <div class="inner">
<a href="/" class="link"> <a href="/" class="link">
<span class="site-logo">◬</span> <span class="site-logo">◬</span>
@@ -19,7 +19,7 @@ import CommandPalette from "./CMDPalette"
<style> <style>
.site-header { .site-header {
@mixin py var(--ui-masthead-paddingY); @mixin py var(--size-5);
position: sticky; position: sticky;
z-index: 9; z-index: 9;
@@ -27,9 +27,9 @@ import CommandPalette from "./CMDPalette"
width: 100%; width: 100%;
color: var(--color-text-inverse); color: var(--color-text-primary);
background-color: var(--color-surface-inverse); background-color: var(--color-surface-base);
} }
.inner { .inner {
@@ -37,15 +37,17 @@ import CommandPalette from "./CMDPalette"
display: flex; display: flex;
flex-direction: row; flex-direction: row;
gap: var(--ui-spacing-cozy); gap: var(--layout-gutter);
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
font-size: var(--ui-masthead-font-size); font-size: var(--type-1);
line-height: var(--ui-masthead-line-height); line-height: var(--leading-1);
} }
.site-logo { .site-logo {
@mixin typo_body-alt;
display: inline-block; display: inline-block;
font-family: var(--font-mono); font-family: var(--font-mono);
animation: animation:

View File

@@ -7,7 +7,7 @@ interface Props {
const { tags, updateDate } = Astro.props; const { tags, updateDate } = Astro.props;
--- ---
<div class="meta"> <div class="meta ui">
<div class="section"> <div class="section">
<span class="label"> Author </span> <span class="label"> Author </span>
<span class="author item">Dave Damage</span> <span class="author item">Dave Damage</span>
@@ -36,43 +36,47 @@ const { tags, updateDate } = Astro.props;
<style> <style>
.meta { .meta {
@mixin layout-wrapper; @mixin layout-wrapper;
flex-wrap: wrap;
display: flex; display: flex;
flex-wrap: wrap;
gap: var(--size-8);
align-items: baseline; align-items: baseline;
gap: var(--spacing-relaxed);
} }
.section { .section {
min-width: 12ch; @mixin py var(--size-4);
@mixin py var(--spacing-snug);
flex: 1 0 auto; flex: 1 0 auto;
min-width: 12ch;
} }
.label { .label {
@mixin mb var(--spacing-tight); @mixin mb var(--size-2);
@mixin pb var(--spacing-tight); @mixin pb var(--size-2);
@mixin border-b 2px, solid, var(--color-border-strong); @mixin border-b 2px, solid, var(--color-border-strong);
@mixin typo_meta-label;
display: block; display: block;
font-size: var(--typo-size-xs);
text-transform: uppercase;
letter-spacing: var(--typo-spacing-comfortable);
} }
.item { .item {
font-family: var(--font-mono); @mixin typo_meta-data;
font-size: var(--font-size-sm);
font-weight: 700;
color: var(--color-text-secondary);
text-transform: uppercase; text-transform: uppercase;
} }
.taglist { .taglist {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: var(--spacing-tight); gap: var(--size-2);
} }
.tag { .tag {
@mixin py var(--spacing-tight); @mixin py var(--size-1);
@mixin px var(--spacing-snug); @mixin px var(--size-3);
border: 4px solid var(--color-palette-charcoal-gray);
letter-spacing: var(--typo-spacing-relaxed); border: 4px solid var(--color-surface-inverse);
background: var(--color-palette-charcoal-gray); color: var(--color-text-inverse);
color: var(--color-palette-off-white); background: var(--color-surface-inverse);
} }
</style> </style>

View File

@@ -9,7 +9,7 @@ interface Props {
const { breadcrumbs, publicationDate } = Astro.props; const { breadcrumbs, publicationDate } = Astro.props;
--- ---
<div class="overline"> <div class="overline ui dark">
<div class="wrapper"> <div class="wrapper">
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumbs"> <ol class="breadcrumbs">
@@ -36,33 +36,34 @@ const { breadcrumbs, publicationDate } = Astro.props;
<style> <style>
.overline { .overline {
background-color: var(--color-surface-inverse); @mixin typo_code;
color: var(--color-text-secondary);
background-color: var(--color-surface-elevated-2);
} }
.wrapper { .wrapper {
@mixin layout-wrapper; @mixin layout-wrapper;
padding-block: var(--spacing-snug); @mixin py var(--size-4);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
font-size: var(--typo-size-responsive);
} }
.breadcrumbs { .breadcrumbs {
display: flex; display: flex;
font-family: var(--font-mono);
font-size: var(--typo-size-sm);
color: var(--color-text-inverse);
} }
.link { .link {
color: var(--color-text-inverse);
transition: color 0.5s ease-in-out; transition: color 0.5s ease-in-out;
&:hover { &:hover {
color: var(--color-tertiary); color: var(--color-primary);
} }
} }
.publicationdate { .publicationdate {
font-family: var(--font-mono); font-weight: 700;
font-size: var(--typo-size-xs);
font-weight: var(--typo-weight-bold);
color: var(--color-text-inverse);
} }
</style> </style>

View File

@@ -9,7 +9,7 @@ const { title, subtitle } = Astro.props;
console.log(subtitle); console.log(subtitle);
--- ---
<div class="wrapper"> <div class="wrapper content">
<h1 class="title">{title}</h1> <h1 class="title">{title}</h1>
{subtitle && <p class="subtitle">{subtitle}</p>} {subtitle && <p class="subtitle">{subtitle}</p>}
</div> </div>
@@ -17,21 +17,19 @@ console.log(subtitle);
<style> <style>
.wrapper { .wrapper {
@mixin layout-wrapper; @mixin layout-wrapper;
@mixin py var(--spacing-relaxed); @mixin py var(--space-7);
} }
.title { .title {
@mixin heading-1; @mixin typo_display-1;
@mixin my var(--space-2);
} }
.subtitle { .subtitle {
@mixin mt var(--spacing-snug); @mixin mt var(--size-4);
@mixin typo_subtitle;
font-family: var(--font-header); color: var(--color-text-tertiary);
font-size: var(--typo-size-lg);
font-weight: 300;
text-transform: uppercase;
letter-spacing: 0.075em;
} }
</style> </style>

View File

@@ -0,0 +1,16 @@
---
---
<div class="table-wrap">
<table>
<slot />
</table>
</div>
<style>
.table-wrap {
scrollbar-color: var(--color-border-normal) transparent;
scrollbar-width: thin;
overflow-x: auto;
}
</style>

View File

@@ -50,10 +50,7 @@ seo:
- Failure - Failure
--- ---
- [Body](/the-crucible/references/elements/body) - [Body](/the-crucible/references/elements/body)
- {% ElementSymbol - {% ElementSymbol element="body" size="var(--type-3)" color="inherit" /%}
element="body"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Salt - Salt
- Structure; the form - Structure; the form
- »It endures« - »It endures«
@@ -61,10 +58,7 @@ seo:
- Calcifies everything - Calcifies everything
--- ---
- [Soul](/the-crucible/references/elements/soul) - [Soul](/the-crucible/references/elements/soul)
- {% ElementSymbol - {% ElementSymbol element="soul" size="var(--type-3)" color="inherit" /%}
element="soul"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Sulfur - Sulfur
- Agency; the Spark - Agency; the Spark
- »I burn« - »I burn«
@@ -72,10 +66,7 @@ seo:
- Consumes everything - Consumes everything
--- ---
- [Spirit](/the-crucible/references/elements/spirit) - [Spirit](/the-crucible/references/elements/spirit)
- {% ElementSymbol - {% ElementSymbol element="spirit" size="var(--type-3)" color="inherit" /%}
element="spirit"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Mercury - Mercury
- Transformation; the flux - Transformation; the flux
- »Nothing stays« - »Nothing stays«
@@ -100,43 +91,31 @@ seo:
- Image - Image
--- ---
- [Aether](/the-crucible/references/elements/aether) - [Aether](/the-crucible/references/elements/aether)
- {% ElementSymbol - {% ElementSymbol element="aether" size="var(--type-3)" color="inherit" /%}
element="aether"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Quintessence - Quintessence
- Transcendent, ordered, numinous - Transcendent, ordered, numinous
- The Stars - The Stars
--- ---
- [Air](/the-crucible/references/elements/air) - [Air](/the-crucible/references/elements/air)
- {% ElementSymbol element="air" size="var(--typo-size-2xl)" color="inherit" /%} - {% ElementSymbol element="air" size="var(--type-3)" color="inherit" /%}
- Hot & Wet - Hot & Wet
- Invisible, expansive, permeating - Invisible, expansive, permeating
- The Storm - The Storm
--- ---
- [Earth](/the-crucible/references/elements/earth) - [Earth](/the-crucible/references/elements/earth)
- {% ElementSymbol - {% ElementSymbol element="earth" size="var(--type-3)" color="inherit" /%}
element="earth"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Cold & Dry - Cold & Dry
- Heavy, material, foundational - Heavy, material, foundational
- The Mountain - The Mountain
--- ---
- [Fire](/the-crucible/references/elements/fire) - [Fire](/the-crucible/references/elements/fire)
- {% ElementSymbol - {% ElementSymbol element="fire" size="var(--type-3)" color="inherit" /%}
element="fire"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Hot & Dry - Hot & Dry
- Bright, consuming, refining - Bright, consuming, refining
- The Volcano - The Volcano
--- ---
- [Water](/the-crucible/references/elements/water) - [Water](/the-crucible/references/elements/water)
- {% ElementSymbol - {% ElementSymbol element="water" size="var(--type-3)" color="inherit" /%}
element="water"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Cold & Wet - Cold & Wet
- Flowing, deep, dissolving - Flowing, deep, dissolving
- The River - The River
@@ -231,6 +210,8 @@ seo:
- No the product is neither ingredient - No the product is neither ingredient
{% /table %} {% /table %}
---
## The Seven Aspects ## The Seven Aspects
- Provide additional specificity - Provide additional specificity
@@ -245,61 +226,43 @@ seo:
- Association - Association
--- ---
- *Entities* - *Entities*
- {% ElementSymbol - {% ElementSymbol element="entities" size="var(--type-3)" color="inherit" /%}
element="entities"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Silver - Silver
- Moon - Moon
- Living beings; flesh, beasts, plants, spirits - Living beings; flesh, beasts, plants, spirits
--- ---
- *Matter* - *Matter*
- {% ElementSymbol - {% ElementSymbol element="matter" size="var(--type-3)" color="inherit" /%}
element="matter"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Lead - Lead
- Saturn - Saturn
- Physical substances; materials, terrain, stone, foundations - Physical substances; materials, terrain, stone, foundations
--- ---
- *Mind* - *Mind*
- {% ElementSymbol - {% ElementSymbol element="mind" size="var(--type-3)" color="inherit" /%}
element="mind"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Quicksilver - Quicksilver
- Mercury - Mercury
- Thought, consciousness; intellect, emotion, skills - Thought, consciousness; intellect, emotion, skills
--- ---
- *Society* - *Society*
- {% ElementSymbol - {% ElementSymbol element="society" size="var(--type-3)" color="inherit" /%}
element="society"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Tin - Tin
- Jupiter - Jupiter
- Collective organisation; governance, law, institutions - Collective organisation; governance, law, institutions
--- ---
- *Art* - *Art*
- {% ElementSymbol element="art" size="var(--typo-size-2xl)" color="inherit" /%} - {% ElementSymbol element="art" size="var(--type-3)" color="inherit" /%}
- Copper - Copper
- Venus - Venus
- Creation, expression; artistry, rituals, craft - Creation, expression; artistry, rituals, craft
--- ---
- *Mysteries* - *Mysteries*
- {% ElementSymbol - {% ElementSymbol element="mysteries" size="var(--type-3)" color="inherit" /%}
element="mysteries"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Gold - Gold
- Sun - Sun
- Hidden, occult; magic, destiny, secrets, *residua* - Hidden, occult; magic, destiny, secrets, *residua*
--- ---
- *Forces* - *Forces*
- {% ElementSymbol - {% ElementSymbol element="forces" size="var(--type-3)" color="inherit" /%}
element="forces"
size="var(--typo-size-2xl)"
color="inherit" /%}
- Iron - Iron
- Mars - Mars
- Energies, natural laws; power, conflict, dynamics - Energies, natural laws; power, conflict, dynamics

View File

@@ -13,21 +13,20 @@ const elementCompontent = {
}), }),
size: fields.select({ size: fields.select({
label: 'Size', label: 'Size',
defaultValue: 'var(--typo-size-md)', defaultValue: 'var(--type-0)',
options: [ options: [
{ label: '2XS', value: 'var(--typo-size-2xs)' }, { label: '2XS', value: 'var(--type--3)' },
{ label: 'XS', value: 'var(--typo-size-xs)' }, { label: 'XS', value: 'var(--type--2)' },
{ label: 'SM', value: 'var(--typo-size-sm)' }, { label: 'SM', value: 'var(--type--1)' },
{ label: 'MD', value: 'var(--typo-size-md)' }, { label: 'MD', value: 'var(--type-0)' },
{ label: 'LG', value: 'var(--typo-size-lg)' }, { label: 'LG', value: 'var(--type-1)' },
{ label: 'XL', value: 'var(--typo-size-xl)' }, { label: 'XL', value: 'var(--type-2)' },
{ label: '2XL', value: 'var(--typo-size-2xl)' }, { label: '2XL', value: 'var(--type-3)' },
{ label: '3XL', value: 'var(--typo-size-3xl)' }, { label: '3XL', value: 'var(--type-4)' },
{ label: '4XL', value: 'var(--typo-size-4xl)' }, { label: '4XL', value: 'var(--type-5)' },
{ label: '5XL', value: 'var(--typo-size-5xl)' }, { label: '5XL', value: 'var(--type-6)' },
{ label: '6XL', value: 'var(--typo-size-6xl)' }, { label: '6XL', value: 'var(--type-7)' },
{ label: '7XL', value: 'var(--typo-size-7xl)' }, { label: '7XL', value: 'var(--type-8)' },
{ label: '8XL', value: 'var(--typo-size-8xl)' },
], ],
}), }),
color: fields.select({ color: fields.select({

View File

@@ -50,7 +50,7 @@ const headerCover =
subtitle={subtitle} subtitle={subtitle}
/> />
<div class="frame"> <div class="frame">
<div class="body content"> <div class="body content prose">
<slot name="before-content" /> <slot name="before-content" />
<Content /> <Content />
<slot name="after-content" /> <slot name="after-content" />
@@ -69,12 +69,11 @@ const headerCover =
.frame { .frame {
@mixin layout-wrapper; @mixin layout-wrapper;
font-size: var(--typo-size-responsive);
@media (--bp-desktop) { @media (--bp-desktop) {
position: relative; position: relative;
display: grid; display: grid;
grid-template-columns: var(--ui-content-width) var(--ui-margin-width); grid-template-columns: var(--layout-content-width) var(--layout-margin-width);
gap: var(--layout-gutter);
} }
} }

View File

@@ -1,6 +1,4 @@
:root { :root {
/* === Palette === */
/* == Neutrals == */ /* == Neutrals == */
--color-palette-black-ink: oklch(21.9% 0.006 285.911deg); --color-palette-black-ink: oklch(21.9% 0.006 285.911deg);
--color-palette-charcoal: oklch(26.6% 0.008 240.166deg); --color-palette-charcoal: oklch(26.6% 0.008 240.166deg);
@@ -25,27 +23,12 @@
--color-palette-royal-blue: oklch(46.1% 0.07 245.64deg); --color-palette-royal-blue: oklch(46.1% 0.07 245.64deg);
--color-palette-electric-blue: oklch(90.8% 0.128 188.419deg); --color-palette-electric-blue: oklch(90.8% 0.128 188.419deg);
/* == System Accents (reserve) == */
--color-palette-warhammer: oklch(
43.2% 0.169 7.14deg
); /* Crimson — Empire blood red */
--color-palette-mordheim: oklch(
82.7% 0.047 76.752deg
); /* Tan — ruined city stone */
--color-palette-unknown-armies: oklch(
49.6% 0.181 351.176deg
); /* Fuchsia — occult magick */
--color-palette-sla-industries: oklch(
90.8% 0.128 188.419deg
); /* Electric blue — corporate neon */
/* === Semantic Colors === */ /* === Semantic Colors === */
/* == Primary / Secondary / Tertiary == */ /* == Primary / Secondary / Tertiary == */
--color-primary: var(--color-palette-lava); --color-primary: var(--color-palette-lava);
--color-primary-surface: oklch(from var(--color-primary) calc(l + 0.1) c h); --color-primary-surface: oklch(from var(--color-primary) calc(l + 0.1) c h);
--color-primary-emphasis: oklch(from var(--color-primary) calc(l - 0.15) c h); --color-primary-emphasis: oklch(from var(--color-primary) calc(l - 0.15) c h);
--color-secondary: var(--color-palette-lime-green); --color-secondary: var(--color-palette-lime-green);
--color-secondary-surface: oklch( --color-secondary-surface: oklch(
from var(--color-secondary) calc(l + 0.1) c h from var(--color-secondary) calc(l + 0.1) c h
@@ -53,7 +36,6 @@
--color-secondary-emphasis: oklch( --color-secondary-emphasis: oklch(
from var(--color-secondary) calc(l - 0.15) c h from var(--color-secondary) calc(l - 0.15) c h
); );
--color-tertiary: var(--color-palette-bright-canary); --color-tertiary: var(--color-palette-bright-canary);
--color-tertiary-surface: oklch(from var(--color-tertiary) calc(l + 0.1) c h); --color-tertiary-surface: oklch(from var(--color-tertiary) calc(l + 0.1) c h);
--color-tertiary-emphasis: oklch( --color-tertiary-emphasis: oklch(
@@ -110,3 +92,21 @@
--color-skeleton-base: var(--color-surface-elevated-2); --color-skeleton-base: var(--color-surface-elevated-2);
--color-skeleton-shimmer: var(--color-surface-elevated-1); --color-skeleton-shimmer: var(--color-surface-elevated-1);
} }
.dark {
--color-text-primary: var(--color-palette-ice-blue);
--color-text-secondary: var(--color-palette-pale-gray);
--color-text-tertiary: var(--color-palette-light-silver);
--color-text-quarternary: var(--color-palette-silver);
--color-text-inverse: var(--color-palette-black-ink);
--color-text-disabled: var(--color-palette-cloud-gray);
--color-surface-base: var(--color-palette-black-ink);
--color-surface-elevated-1: var(--color-palette-charcoal);
--color-surface-elevated-2: var(--color-palette-charcoal-gray);
--color-surface-elevated-3: var(--color-palette-carbon);
--color-surface-elevated-4: var(--color-palette-cloud-gray);
--color-surface-inverse: var(--color-palette-ice-blue);
--color-border-subtle: var(--color-palette-charcoal-gray);
--color-border-normal: var(--color-palette-carbon);
--color-border-strong: var(--color-palette-silver);
}

View File

@@ -1,651 +0,0 @@
.content {
@mixin responsive-wrapper;
font-family: var(--font-body);
/* === Headings === */
& h1 {
margin-block: var(--el-h1-vspace-top) var(--el-h1-vspace-bottom);
padding-bottom: var(--spacing-snug);
border-bottom: var(--size-4) solid var(--el-h1-color);
font-family: var(--el-h1-font-family), serif;
font-size: var(--el-h1-font-size);
font-weight: 400;
line-height: var(--typo-leading-tight);
color: var(--el-h1-color);
text-transform: uppercase;
letter-spacing: -0.0137em;
& + p,
& + ul,
& + ol,
& + blockquote {
margin-block: calc(1em * var(--typo-leading-normal) * var(--vspace-tight))
calc(1em * var(--typo-leading-normal) * var(--vspace-snug));
}
& + h2 {
margin-block: calc(1em * 1.125 * var(--vspace-snug))
calc(1em * 1.125 * var(--vspace-normal));
}
}
& h2 {
margin-block: var(--el-h2-vspace-top) var(--el-h2-vspace-bottom);
padding-left: var(--spacing-snug);
border-left: var(--size-4) solid var(--el-h2-color);
font-family: var(--el-h2-font-family), serif;
font-size: var(--el-h2-font-size);
font-weight: 900;
line-height: 1.1765;
color: var(--el-h2-color);
text-transform: uppercase;
letter-spacing: -0.0096em;
& + p,
& + ul,
& + ol,
& + blockquote {
margin-block: calc(1em * var(--typo-leading-normal) * var(--vspace-tight))
calc(1em * var(--typo-leading-normal) * var(--vspace-snug));
}
& + h3 {
margin-block: calc(1em * 1.125 * var(--vspace-compressed))
calc(1em * 1.125 * var(--vspace-snug));
}
}
& h3 {
margin-block: var(--el-h3-vspace-top) var(--el-h3-vspace-bottom);
padding: var(--spacing-tight) var(--spacing-snug);
font-family: var(--el-h3-font-family), serif;
font-size: var(--el-h3-font-size);
font-weight: 800;
line-height: 1.2;
color: var(--color-surface-base);
text-transform: uppercase;
letter-spacing: -0.004em;
background: var(--el-h3-color);
}
& h4 {
margin-block: var(--el-h4-vspace-top) var(--el-h4-vspace-bottom);
padding: var(--spacing-tight) var(--spacing-snug);
border-top: var(--size-3) solid var(--el-h4-color);
border-bottom: var(--size-3) solid var(--el-h4-color);
font-family: var(--el-h4-font-family), serif;
font-size: var(--el-h4-font-size);
font-weight: 800;
line-height: 1.125;
text-transform: uppercase;
letter-spacing: 0.0025em;
}
& h5 {
margin-block: var(--el-h5-vspace-top) var(--el-h5-vspace-bottom);
padding: var(--spacing-tight) var(--spacing-snug);
font-family: var(--el-h5-font-family), serif;
font-size: var(--el-h5-font-size);
font-weight: 800;
line-height: 1.28;
color: var(--el-h5-color);
text-transform: uppercase;
letter-spacing: 0.05em;
&::before,
&::after {
content: '';
padding-right: var(--spacing-tight);
line-height: 1;
}
&::before {
content: '⭑';
}
&::after {
content: '';
}
}
& h6 {
margin-block: var(--el-h6-vspace-top) var(--el-h6-vspace-bottom);
font-family: var(--el-h6-font-family), serif;
font-size: var(--el-h6-font-size);
font-weight: 900;
line-height: 1.4;
color: var(--el-h6-color);
text-transform: uppercase;
letter-spacing: 0.035em;
}
& h3,
& h4,
& h5,
& h6 {
& + p,
& + ul,
& + ol,
& + blockquote {
margin-block: calc(
1em * var(--typo-leading-normal) * var(--vspace-compressed)
)
calc(1em * var(--typo-leading-normal) * var(--vspace-snug));
}
}
/* === Body Text === */
& p {
margin-block: var(--el-p-vspace-top) var(--el-p-vspace-bottom);
font-family: var(--el-p-font-family), sans-serif;
font-size: var(--el-p-font-size);
font-weight: 400;
line-height: var(--typo-leading-normal);
color: var(--el-p-color);
text-align: justify;
}
& blockquote {
margin-block: var(--el-p-vspace-top) var(--el-p-vspace-bottom);
padding: var(--spacing-snug) 0 var(--spacing-snug)
var(--spacing-comfortable);
border-left: var(--size-4) solid var(--color-text-tertiary);
font-family: var(--el-blockquote-font-family), serif;
font-size: var(--el-blockquote-font-size);
font-weight: 500;
font-style: normal;
line-height: var(--typo-leading-comfortable);
color: var(--el-blockquote-color);
}
/* === Code === */
pre {
margin-block: var(--el-pre-vspace-top) var(--el-pre-vspace-bottom);
padding: var(--spacing-comfortable);
font-family: var(--el-pre-font-family), monospace;
font-size: var(--el-pre-font-size);
line-height: 1.5385;
color: var(--el-pre-color);
background: var(--el-pre-background);
}
code {
padding: 0.1em 0.3em;
font-family: var(--font-mono), monospace;
font-size: var(--typo-size-sm);
color: var(--color-text-inverse);
background: var(--color-surface-inverse);
}
kbd {
padding: 0.1em 0.3em;
border: 1px solid var(--color-text-primary);
border-radius: 2px;
font-family: var(--font-mono), monospace;
font-size: var(--typo-size-xs);
color: var(--color-text-inverse);
text-transform: uppercase;
background: var(--color-surface-inverse);
}
samp {
padding: 0.1em 0.3em;
border-left: var(--size-1) solid var(--color-text-tertiary);
font-family: var(--font-mono), monospace;
font-size: var(--typo-size-sm);
color: var(--color-text-primary);
background: var(--color-surface-elevated-2);
}
var {
font-family: var(--font-mono), monospace;
font-weight: 600;
font-style: normal;
color: var(--color-text-secondary);
}
/* === Lists === */
ul,
ol {
margin-block: var(--el-list-vspace-top) var(--el-list-vspace-bottom);
font-size: var(--el-list-font-size);
line-height: var(--typo-leading-normal);
color: var(--el-list-color);
}
ul ul,
ul ol,
ol ul,
ol ol {
margin-block: var(--el-list-nested-vspace-top)
var(--el-list-nested-vspace-bottom);
}
li {
margin-block: var(--el-li-vspace-top) var(--el-li-vspace-bottom);
li {
margin-block: var(--el-li-nested-vspace-top)
var(--el-li-nested-vspace-bottom);
}
}
ul {
padding-left: var(--spacing-cozy);
list-style: none;
li {
padding-left: var(--spacing-cozy);
&::marker {
content: '⎊';
color: var(--color-text-primary);
}
}
ul,
ol {
padding-left: var(--spacing-cozy);
}
ul li::marker {
content: '⋊';
color: var(--color-text-primary);
}
ul ul,
ul ol,
ol ul,
ol ol {
padding-left: var(--spacing-cozy);
}
ul ul li::marker,
ol ul li::marker {
content: '◆';
color: var(--color-text-primary);
}
ul ul ul,
ul ul ol,
ul ol ul,
ul ol ol,
ol ul ul,
ol ul ol,
ol ol ul,
ol ol ol {
padding-left: var(--spacing-cozy);
}
ul ul ul li::marker,
ul ol ul li::marker,
ol ul ul li::marker,
ol ol ul li::marker {
content: '⯀';
color: var(--color-text-primary);
}
}
ol {
counter-reset: ol-l1;
contain: style;
padding-left: var(--spacing-cozy);
list-style: none;
& > li {
counter-increment: ol-l1;
margin-left: 1.5em;
padding-left: var(--spacing-cozy);
&::marker {
content: counter(ol-l1, decimal-leading-zero) '.)';
color: var(--color-text-primary);
}
}
}
ol > li > ol {
counter-reset: ol-l2;
padding-left: var(--spacing-cozy);
& > li {
counter-increment: ol-l2;
margin-left: 0.825em;
&::marker {
content: counter(ol-l2, lower-alpha) '.)';
color: var(--color-text-primary);
}
}
}
ol > li > ul {
padding-left: var(--spacing-cozy);
}
ol > li > ol > li > ol,
ol > li > ul > li > ol {
counter-reset: ol-l3;
margin-left: 0;
padding-left: var(--spacing-cozy);
& > li {
counter-increment: ol-l3;
&::marker {
content: counter(ol-l3, upper-roman) '.)';
color: var(--color-text-primary);
}
}
}
ol > li > ol > li > ul,
ol > li > ul > li > ul {
padding-left: var(--spacing-cozy);
}
ol > li > ol > li > ol > li > ol,
ol > li > ol > li > ul > li > ol,
ol > li > ul > li > ol > li > ol,
ol > li > ul > li > ul > li > ol {
counter-reset: ol-l4;
margin-left: 0;
padding-left: var(--spacing-cozy);
& > li {
counter-increment: ol-l4;
&::marker {
content: counter(ol-l4, lower-greek) '.)';
color: var(--color-text-primary);
}
}
}
ol > li > ol > li > ol > li > ul,
ol > li > ol > li > ul > li > ul,
ol > li > ul > li > ol > li > ul,
ol > li > ul > li > ul > li > ul {
padding-left: var(--spacing-cozy);
}
ol li,
ul li {
list-style-position: outside;
}
.list-inside ol li,
.list-inside ul li {
list-style-position: inside;
}
/* === Tables === */
table {
border-collapse: collapse;
width: 100%;
margin-block: var(--spacing-tight) var(--spacing-tight);
border: var(--size-2) solid var(--color-text-primary);
font-size: var(--typo-size-md);
line-height: 1.2;
& thead th,
& th {
padding: 0 var(--spacing-snug) var(--spacing-snug);
font-family: var(--el-th-font-family), serif;
font-size: var(--typo-size-sm);
font-weight: 900;
line-height: 1.2;
color: var(--el-th-color);
text-transform: uppercase;
background: var(--el-th-background);
}
& tbody td,
& td {
padding: var(--spacing-snug);
border: var(--size-1) solid var(--color-text-secondary);
font-family: var(--el-td-font-family), monospace;
font-size: var(--typo-size-sm);
line-height: 1.2;
color: var(--el-td-color);
text-align: center;
}
}
/* === DL / DT / DD === */
dl {
margin-block: calc(1em * var(--typo-leading-normal) * var(--vspace-snug))
calc(1em * var(--typo-leading-normal) * var(--vspace-compressed));
font-size: var(--typo-size-md);
line-height: var(--typo-leading-normal);
}
dt {
margin-block: calc(1em * 1.4 * var(--vspace-snug))
calc(1em * 1.4 * var(--vspace-compressed));
padding: var(--spacing-snug);
font-family: var(--el-dt-font-family), serif;
font-size: var(--typo-size-lg);
font-weight: 700;
line-height: 1.4;
color: var(--el-dt-color);
text-transform: uppercase;
letter-spacing: 0.035em;
background: var(--el-dt-background);
}
dd {
margin-block: calc(
1em * var(--typo-leading-normal) * var(--vspace-compressed)
)
calc(1em * var(--typo-leading-normal) * var(--vspace-tight));
padding: 0 var(--spacing-comfortable);
font-family: var(--el-dd-font-family), sans-serif;
font-size: var(--typo-size-md);
line-height: var(--typo-leading-normal);
color: var(--el-dd-color);
}
/* === HR === */
hr {
position: relative;
overflow: visible;
height: var(--size-3);
margin-block: var(--spacing-relaxed) 0;
border: none;
background: var(--hr-color);
&::after {
content: '▼';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 0 0.25em;
font-size: var(--typo-size-4xl);
line-height: var(--typo-leading-compressed);
color: var(--hr-symbol-color);
background: var(--hr-symbol-background);
}
}
/* === Inline Elements === */
em,
i {
font-style: italic;
letter-spacing: 0.025em;
}
strong,
b {
font-weight: 900;
letter-spacing: 0.025em;
}
a {
position: relative;
padding: 0.1em 0.2em;
font-weight: 600;
color: var(--color-text-primary);
text-decoration: underline;
text-decoration-thickness: var(--size-1);
text-underline-offset: 2px;
transition:
color 0.5s ease-in-out,
background 0.5s ease-in-out;
&:hover {
cursor: pointer;
color: var(--color-surface-base);
text-decoration: none;
background: var(--color-text-primary);
}
&:visited,
&:active {
color: var(--color-primary-emphasis);
}
}
small {
font-size: var(--typo-size-xs);
color: var(--color-text-tertiary);
}
sub,
sup {
font-size: 0.5625em;
font-weight: 600;
color: var(--color-text-secondary);
}
del,
s {
color: var(--color-text-tertiary);
text-decoration: line-through;
text-decoration-thickness: var(--size-1);
}
ins {
font-weight: 600;
color: var(--color-text-primary);
text-decoration: underline;
text-decoration-color: var(--color-primary);
text-decoration-thickness: var(--size-1);
background: transparent;
}
abbr {
cursor: help;
text-decoration: underline dotted;
text-underline-offset: var(--size-1);
}
dfn {
font-weight: 700;
font-style: normal;
color: var(--color-text-primary);
}
cite {
font-weight: 600;
font-style: normal;
color: var(--color-text-secondary);
}
q {
font-style: normal;
&::before {
content: '»';
}
&::after {
content: '«';
}
}
time {
font-family: var(--font-mono), monospace;
font-size: var(--typo-size-sm);
color: var(--color-text-secondary);
}
/* === Article Lead Paragraph === */
& article {
& > p:first-of-type {
font-size: var(--typo-size-xl);
font-weight: 700;
line-height: 1.4;
letter-spacing: 0.022em;
&::first-letter {
float: left;
margin: 0.1em 0.1em 0 0;
padding: 0;
font-family: var(--font-display), serif;
font-size: 4em;
font-weight: bold;
line-height: 1;
color: var(--color-primary);
@supports (initial-letter: 4) {
float: none;
margin: 0;
padding-right: var(--spacing-snug);
font-size: inherit;
line-height: inherit;
initial-letter: 3;
}
}
}
}
}

View File

@@ -1,68 +1,577 @@
.content { .content {
font-family: var(--font-body); font-family: var(--font-body);
font-size: var(--typo-size-responsive); font-size: clamp(1rem, 2.5vw, 1.25rem);
}
.prose {
@mixin py var(--space-8);
@mixin typo_body;
font-size: clamp(1rem, 2.5vw, 1.25rem);
& ::selection {
color: var(--color-palette-ice-blue);
background: var(--color-primary)
}
& > :first-child,
& > article > :first-child {
@mixin mt var(--size-0);
}
& > :last-child,
& > article > :last-child {
@mixin mb var(--size-0);
}
/* === HEADINGS === */
& h2 { & h2 {
@mixin heading-2; @mixin typo_heading-1;
@mixin pl var(--spacing-snug); @mixin mt var(--space-11);
@mixin border-l var(--size-4), solid, var(--el-h2-color); @mixin mb var(--space-6);
@mixin pl var(--space-4);
& + p, @mixin border-l var(--size-8), solid, var(--color-text-primary);
& + ul,
& + ol,
& + blockquote {
margin-block: calc(1em * var(--typo-leading-normal) * var(--vspace-tight))
calc(1em * var(--typo-leading-normal) * var(--vspace-snug));
}
& + h3 {
margin-block: calc(1em * 1.125 * var(--vspace-compressed))
calc(1em * 1.125 * var(--vspace-snug));
}
} }
& h3 { & h3 {
@mixin heading-3; @mixin typo_heading-3;
@mixin py var(--spacing-tight); @mixin mt var(--space-10);
@mixin px var(--spacing-snug); @mixin mb var(--space-6);
@mixin py var(--space-2);
@mixin px var(--space-4);
color: var(--color-text-inverse); color: var(--color-text-inverse);
background: var(--color-surface-inverse); background: var(--color-surface-inverse);
} }
& h4 { & h4 {
@mixin heading-4; @mixin typo_heading-4;
@mixin py var(--spacing-tight); @mixin mt var(--space-9);
@mixin px var(--spacing-snug); @mixin mb var(--space-4);
@mixin border-t var(--size-3), solid, var(--el-h4-color); @mixin py var(--space-2);
@mixin border-b var(--size-3), solid, var(--el-h4-color); @mixin px var(--space-4);
@mixin border-y var(--size-6), solid, var(--color-text-secondary);
color: var(--el-h4-color); color: var(--color-text-secondary);
} }
& h5 { & h5 {
@mixin heading-5; @mixin typo_heading-5;
@mixin py var(--spacing-tight); @mixin mt var(--space-9);
@mixin px var(--spacing-snug); @mixin mb var(--space-4);
color: var(--el-h5-color); color: var(--color-text-secondary);
&::before,
&::after {
@mixin pr var(--spacing-tight);
content: "";
line-height: var(--typo-leading-compressed);
}
&::before { &::before {
content: '▼'; @mixin pr var(--space-2);
content: "▼";
} }
} }
& h6 { & h6 {
@mixin heading-6; @mixin typo_heading-6;
@mixin mt var(--space-8);
@mixin mb var(--space-2);
color: var(--el-h6-color); color: var(--color-text-tertiary);
}
/* === BODY TEXT === */
& p {
@mixin my var(--space-6);
hyphens: auto;
text-align: justify;
}
& blockquote {
@mixin my var(--space-8);
@mixin py var(--space-4);
@mixin pl var(--space-6);
@mixin border-l var(--size-8), solid, var(--color-text-tertiary);
font-style: italic;
color: var(--color-text-tertiary);
& p {
@mixin ma var(--size-0);
hyphens: none;
text-align: left;
}
& p + p {
@mixin mt var(--space-4);
}
}
/* === CODE === */
& pre {
@mixin typo_code;
@mixin my var(--space-8);
@mixin pa var(--space-6);
scrollbar-color: var(--color-border-normal) transparent;
scrollbar-width: thin;
overflow-x: auto;
color: var(--color-tertiary);
background: var(--color-surface-inverse);
& code {
padding: 0;
font-size: inherit;
color: inherit;
background: transparent;
}
}
& :not(pre) > code {
@mixin py var(--size-1);
@mixin px var(--space-2);
font-family: var(--font-mono);
font-size: var(--type--1);
color: var(--color-tertiary);
background: var(--color-surface-inverse);
}
& kbd {
@mixin py var(--size-1);
@mixin px var(--space-2);
border: var(--size-1) solid var(--color-border-normal);
border-bottom-width: var(--size-2);
font-family: var(--font-mono);
font-size: var(--type--3);
color: var(--color-text-inverse);
text-transform: uppercase;
background: var(--color-surface-inverse);
}
& samp {
@mixin py var(--size-1);
@mixin px var(--space-2);
@mixin border-l var(--size-2), solid, var(--color-text-tertiary);
font-family: var(--font-mono);
font-size: var(--type--1);
color: var(--color-text-primary);
background: var(--color-surface-elevated-2);
}
& var {
font-family: var(--font-mono);
font-weight: 600;
font-style: normal;
color: var(--color-text-secondary);
}
/* === LISTS === */
& ul,
& ol {
@mixin my var(--space-6);
}
& ul ul,
& ul ol,
& ol ol,
& ol ul {
@mixin my var(--space-2);
@mixin pl var(--space-4);
}
& li {
@mixin my var(--space-2);
list-style-position: outside;
}
/* == UNORDERED == */
& ul {
@mixin pl var(--space-5);
list-style: none;
& > li {
@mixin pl var(--space-4);
@mixin ml var(--space-2);
}
}
& ul > li::marker {
content: "⎊";
}
& ul ul > li::marker {
content: '⋊';
}
& ul ul ul > li::marker {
content: "⸪";
}
& ul ul ul ul > li::marker {
content: "⸭";
}
/* == ORDERED == */
& ol {
@mixin pl var(--space-8);
counter-reset: ol-l1;
contain: style;
list-style: none;
& li {
@mixin ml var(--space-6);
@mixin pl var(--space-4);
counter-increment: ol-l1;
&::marker {
content: counter(ol-l1, decimal-leading-zero) '.)';
}
}
}
& ol ol {
counter-reset: ol-l2;
& > li {
@mixin ml var(--space-7);
counter-increment: ol-l2;
&::marker {
content: counter(ol-l2, lower-alpha) '.)';
}
}
}
& ol ol ol {
counter-reset: ol-l3;
& > li {
@mixin ml var(--space-7);
counter-increment: ol-l3;
&::marker {
content: counter(ol-l3, upper-roman) '.)';
}
}
}
& ol ol ol ol {
counter-reset: ol-l4;
& > li {
@mixin ml var(--size-9);
counter-increment: ol-l4;
&::marker {
content: counter(ol-l4, lower-greek) '.)';
}
}
}
/* === TABLES === */
& table {
@mixin my var(--space-9);
border-collapse: collapse;
width: 100%;
border: var(--size-4) solid var(--color-text-primary);
& th {
@mixin typo_table-header;
@mixin py var(--space-2);
@mixin px var(--space-4);
border: var(--size-1) solid var(--color-border-strong);
color: var(--color-text-inverse);
text-align: left;
background: var(--color-surface-inverse);
}
& td {
@mixin typo_table-data;
@mixin pa var(--space-4);
border: var(--size-1) solid var(--color-border-subtle);
}
}
/* === DEFINTION LISTS === */
& dl {
@mixin my var(--space-3);
}
& dt {
@mixin typo_definition-header;
@mixin mt var(--space-6);
@mixin pa var(--space-4);
color: var(--color-text-inverse);
background: var(--color-surface-inverse);
}
& dd {
@mixin typo_definition-data;
@mixin mt var(--space-2);
@mixin mb var(--space-4);
@mixin px var(--space-4);
}
/* === DETAILS / SUMMARY === */
& details {
@mixin mr var(--space-8);
@mixin border-l var(--size-4), solod, var(--color-border-normal);
&[open] {
@mixin pb var(--space-4);
& > summary {
@mixin mb var(--space-4);
@mixin border-b var(--size-1), solid, var(--color-border-subtle);
}
}
}
& summary {
@mixin typo_label;
@mixin py var(--space-2);
@mixin px var(--space-4);
cursor: pointer;
color: var(--color-text-secondary);
text-transform: uppercase;
list-style: none;
&::before {
@mixin pr var(--space-2);
content: "▶";
}
details[open] > &::before {
content: "▼";
}
&:hover {
color: var(--color-text-primary);
}
}
& details > *:not(summary) {
@mixin px var(--space-6);
}
& hr {
@mixin my var(--space-10);
position: relative;
overflow: visible;
height: var(--size-6);
border: none;
background: var(--color-text-tertiary);
&::after {
@mixin px var(--space-4);
content: '▼';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: var(--type-3);
line-height: 1;
color: var(--color-text-tertiary);
background: var(--color-surface-base);
}
}
/* === FIGURES === */
& figure {
@mixin my var(--space-10);
& img {
width: 100%;
}
& figcaption {
@mixin typo_fine;
@mixin mt var(--space-2);
@mixin py var(--space-2);
@mixin border-b var(--size-1), solid, var(--color-border-subtle);
color: var(--color-text-tertiary);
}
}
/* === INLINE ELEMENTS === */
& em,
& i {
font-style: italic;
}
& b,
& strong {
font-weight: 900;
}
& a {
position: relative;
font-weight: 700;
color: var(--text-color-tertiary);
text-decoration: underline;
text-decoration-thickness: var(--space-2);
text-decoration-skip-ink: auto;
text-underline-offset: var(--space-2);
transition:
color var(--motion-normal) var(--ease-out),
background var(--motion-normal) var(--ease-out);
&:hover {
color: var(--color-text-inverse);
text-decoration: none;
background: var(--color-primary);
}
}
&:visited {
color: var(--color-text-disabled);
}
&:focus-visible {
@mixin focus-ring;
}
& mark {
@mixin px var(--size-1);
color: var(--color-text-primary);
background: var(--color-tertiary);
}
& small {
@mixin typo_fine;
color: var(--color-text-teriary);
}
& sub,
& sup {
font-size: var(--type--3);
font-weight: 700;
color: var(--color-text-secondary);
}
& del,
& s {
color: var(--color-text-tertiary);
text-decoration: line-through;
text-decoration-thickness: var(--space-2);
}
& ins {
font-weight: 700;
text-decoration: underline;
text-decoration-color: var(--color-primary);
text-decoration-thickness: var(--space-2);
background: transparent;
}
& abbr[title] {
cursor: help;
text-decoration: underline dotted;
text-decoration-thickness: var(--size-1);
text-underline-offset: var(--size-2);
}
& dfn {
font-weight: 700;
font-style: normal;
}
& cite {
font-weight: 600;
font-style: normal;
color: var(--color-text-secondary);
}
& q {
font-style: normal;
&::before {
content: '»';
}
&::after {
content: '«';
}
}
& time {
@mixin typo_label;
color: var(--color-text-tertiary);
}
/** LEAD PARAGRAPH */
& > article {
& > p:first-of-type {
font-size: var(--type-1);
font-weight: 700;
line-height: var(--leading-1);
letter-spacing: var(--tracking-1);
&::first-letter {
@mixin mr var(--space-2);
float:left;
font-family: var(--font-display);
font-size: var(--type-9);
line-height: 0.8;
color: var(--color-primary);
@supports (initial-letter: 3) {
@mixin pr var(--space-2);
float: none;
margin: 0;
font-size: inherit;
line-height: inherit;
initial-letter: 3;
}
}
}
} }
} }

View File

@@ -1,95 +0,0 @@
@layer tokens {
:root {
/* === DIMENSIONS === */
/* == Base Size Units == */
--size-0: 0;
--size-px: 1px;
--size-05: 0.125rem;
--size-1: 0.25rem;
--size-2: 0.5rem;
--size-3: 0.75rem;
--size-4: 1rem;
--size-5: 1.25rem;
--size-6: 1.5rem;
--size-8: 2rem;
--size-10: 2.5rem;
--size-12: 3rem;
--size-16: 4rem;
--size-20: 5rem;
--size-24: 6rem;
--size-32: 8rem;
--size-40: 10rem;
--size-48: 12rem;
--size-64: 16rem;
--size-80: 20rem;
--size-96: 24rem;
--size-128: 32rem;
--size-160: 40rem;
--size-192: 48rem;
--size-256: 64rem;
--size-320: 80rem;
--size-360: 90rem;
--size-384: 96rem;
--size-400: 100rem;
--size-480: 120rem;
/* == Flexible Dimensions == */
--dim-full: 100%;
--dim-1-2: 50%;
--dim-1-3: 33.3333%;
--dim-2-3: 66.6667%;
--dim-1-4: 25%;
--dim-2-4: var(--dim-1-2);
--dim-3-4: 75%;
--dim-1-5: 20%;
--dim-2-5: 40%;
--dim-3-5: 60%;
--dim-4-5: 80%;
--dim-1-6: 16.6667%;
--dim-2-6: var(--dim-1-3);
--dim-3-6: var(--dim-1-2);
--dim-4-6: var(--dim-2-3);
--dim-5-6: 83.3333%;
--dim-1-8: 12.5%;
--dim-2-8: var(--dim-1-4);
--dim-3-8: 37.5%;
--dim-4-8: var(--dim-1-2);
--dim-5-8: 62.5%;
--dim-6-8: var(--dim-3-4);
--dim-7-8: 87.5%;
--dim-1-10: 10%;
--dim-2-10: var(--dim-1-5);
--dim-3-10: 30%;
--dim-4-10: var(--dim-2-5);
--dim-5-10: var(--dim-1-2);
--dim-6-10: var(--dim-3-5);
--dim-7-10: 70%;
--dim-8-10: var(--dim-4-5);
--dim-9-10: 90%;
--dim-1-12: 8.3333%;
--dim-2-12: var(--dim-1-6);
--dim-3-12: var(--dim-1-4);
--dim-4-12: var(--dim-1-3);
--dim-5-12: 41.6667%;
--dim-6-12: var(--dim-1-2);
--dim-7-12: 58.3333%;
--dim-8-12: var(--dim-2-3);
--dim-9-12: var(--dim-3-4);
--dim-10-12: 83.3333%;
--dim-11-12: 91.6667%;
/* == Semantic Spacing == */
--spacing-none: var(--size-0);
--spacing-hairline: var(--size-px);
--spacing-tight: var(--size-1);
--spacing-snug: var(--size-2);
--spacing-cozy: var(--size-4);
--spacing-comfortable: var(--size-6);
--spacing-relaxed: var(--size-8);
--spacing-spacious: var(--size-12);
--spacing-generous: var(--size-16);
--spacing-luxurious: var(--size-24);
--spacing-expansive: var(--size-32);
}
}

View File

@@ -1,127 +0,0 @@
:root {
/* === Heading Colors & Font Sizes === */
--el-h1-color: var(--color-text-primary);
--el-h1-font-family: var(--font-display);
--el-h1-font-size: var(--typo-size-7xl);
--el-h1-leading: 1.125;
--el-h2-color: var(--color-text-primary);
--el-h2-font-family: var(--font-header);
--el-h2-font-size: var(--typo-size-5xl);
--el-h2-leading: 1.1765;
--el-h3-color: var(--color-text-secondary);
--el-h3-font-family: var(--font-header);
--el-h3-font-size: var(--typo-size-4xl);
--el-h3-leading: 1.2;
--el-h4-color: var(--color-text-secondary);
--el-h4-font-family: var(--font-header);
--el-h4-font-size: var(--typo-size-3xl);
--el-h4-leading: 1.125;
--el-h5-color: var(--color-text-secondary);
--el-h5-font-family: var(--font-header);
--el-h5-font-size: var(--typo-size-2xl);
--el-h5-leading: 1.28;
--el-h6-color: var(--color-text-secondary);
--el-h6-font-family: var(--font-header);
--el-h6-font-size: var(--typo-size-xl);
--el-h6-leading: 1.4;
/* === Heading Vertical Spacing === */
--el-h1-vspace-base: calc(1em * var(--el-h1-leading));
--el-h1-vspace-top: calc(var(--el-h1-vspace-base) * var(--vspace-snug));
--el-h1-vspace-bottom: calc(
var(--el-h1-vspace-base) * var(--vspace-compressed)
);
--el-h2-vspace-base: calc(1em * var(--el-h2-leading));
--el-h2-vspace-top: calc(var(--el-h2-vspace-base) * var(--vspace-snug));
--el-h2-vspace-bottom: calc(
var(--el-h2-vspace-base) * var(--vspace-compressed)
);
--el-h3-vspace-base: calc(1em * var(--el-h3-leading));
--el-h3-vspace-top: calc(var(--el-h3-vspace-base) * var(--vspace-cozy));
--el-h3-vspace-bottom: calc(var(--el-h3-vspace-base) * var(--vspace-snug));
--el-h4-vspace-base: calc(1em * var(--el-h4-leading));
--el-h4-vspace-top: calc(var(--el-h4-vspace-base) * var(--vspace-normal));
--el-h4-vspace-bottom: calc(var(--el-h4-vspace-base) * var(--vspace-tight));
--el-h5-vspace-base: calc(1em * var(--el-h5-leading));
--el-h5-vspace-top: calc(var(--el-h5-vspace-base) * var(--vspace-cozy));
--el-h5-vspace-bottom: calc(var(--el-h5-vspace-base) * var(--vspace-tight));
--el-h6-vspace-base: calc(1em * var(--el-h6-leading));
--el-h6-vspace-top: calc(var(--el-h6-vspace-base) * var(--vspace-snug));
--el-h6-vspace-bottom: calc(
var(--el-h6-vspace-base) * var(--vspace-compressed)
);
/* === Body Text === */
--el-p-color: var(--color-text-primary);
--el-p-font-family: var(--font-body);
--el-p-font-size: var(--typo-size-md);
--el-p-vspace-base: calc(1em * var(--typo-leading-normal));
--el-p-vspace-top: calc(var(--el-p-vspace-base) * var(--vspace-snug));
--el-p-vspace-bottom: calc(var(--el-p-vspace-base) * var(--vspace-snug));
/* === Blockquote === */
--el-blockquote-color: var(--color-text-tertiary);
--el-blockquote-font-family: var(--font-body);
--el-blockquote-font-size: var(--typo-size-md);
--el-blockquote-vspace-base: calc(1em * var(--typo-leading-comfortable));
--el-blockquote-vspace-top: calc(
var(--el-blockquote-vspace-base) * var(--vspace-snug)
);
--el-blockquote-vspace-bottom: calc(
var(--el-blockquote-vspace-base) * var(--vspace-snug)
);
/* === Pre / Code === */
--el-pre-color: var(--color-text-inverse);
--el-pre-background: var(--color-surface-inverse);
--el-pre-font-family: var(--font-mono);
--el-pre-font-size: var(--typo-size-sm);
--el-pre-vspace-base: calc(1em * 1.5385);
--el-pre-vspace-top: calc(var(--el-pre-vspace-base) * var(--vspace-normal));
--el-pre-vspace-bottom: calc(
var(--el-pre-vspace-base) * var(--vspace-normal)
);
/* === Lists === */
--el-list-color: var(--color-text-primary);
--el-list-font-size: var(--typo-size-md);
--el-list-vspace-base: calc(1em * var(--typo-leading-normal));
--el-list-vspace-top: calc(var(--el-list-vspace-base) * var(--vspace-snug));
--el-list-vspace-bottom: calc(
var(--el-list-vspace-base) * var(--vspace-snug)
);
--el-list-nested-vspace-top: calc(
var(--el-list-vspace-base) * var(--vspace-snug)
);
--el-list-nested-vspace-bottom: calc(
var(--el-list-vspace-base) * var(--vspace-snug)
);
--el-li-vspace-top: calc(var(--el-list-vspace-base) * var(--vspace-snug));
--el-li-vspace-bottom: calc(var(--el-list-vspace-base) * var(--vspace-snug));
--el-li-nested-vspace-top: calc(
var(--el-list-vspace-base) * var(--vspace-tight)
);
--el-li-nested-vspace-bottom: calc(
var(--el-list-vspace-base) * var(--vspace-tight)
);
/* === Table === */
--el-th-color: var(--color-text-inverse);
--el-th-background: var(--color-surface-inverse);
--el-th-font-family: var(--font-header);
--el-td-color: var(--color-text-primary);
--el-td-font-family: var(--font-mono);
/* === DL/DT/DD === */
--el-dt-color: var(--color-text-inverse);
--el-dt-background: var(--color-surface-inverse);
--el-dt-font-family: var(--font-header);
--el-dd-color: var(--color-text-primary);
--el-dd-font-family: var(--font-body);
/* === HR === */
--hr-color: var(--color-text-tertiary);
--hr-symbol-color: var(--color-text-tertiary);
--hr-symbol-background: var(--color-surface-base);
}

View File

@@ -1,19 +1,31 @@
@import '@fontsource/blaka'; @import url('@fontsource/blaka');
@import '@fontsource-variable/geist-mono'; @import url('@fontsource-variable/geist-mono');
@import '@fontsource-variable/geist'; @import url('@fontsource-variable/geist');
@font-face { @font-face {
font-family: 'Unigrim Dee'; font-family: 'Unigrim Dee';
font-style: normal;
font-weight: 400; font-weight: 400;
font-style: normal;
font-display: swap; font-display: swap;
src: url('/src/fonts/UnigrimDee-Regular.woff2') format('woff2'); src: url('/src/fonts/UnigrimDee-Regular.woff2') format('woff2');
} }
@font-face { @font-face {
font-family: 'Iosevka Slab'; font-family: 'Iosevka Slab';
font-weight: 300;
font-style: normal; font-style: normal;
font-display: swap;
src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Light.woff2')
format('woff2');
}
@font-face {
font-family: 'Iosevka Slab';
font-weight: 400; font-weight: 400;
font-style: normal;
font-display: swap; font-display: swap;
src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Regular.woff2') src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Regular.woff2')
format('woff2'); format('woff2');
@@ -21,25 +33,37 @@
@font-face { @font-face {
font-family: 'Iosevka Slab'; font-family: 'Iosevka Slab';
font-style: normal;
font-weight: 700; font-weight: 700;
font-style: normal;
font-display: swap; font-display: swap;
src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Bold.woff2') format('woff2'); src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Bold.woff2') format('woff2');
} }
@font-face { @font-face {
font-family: 'Iosevka Slab'; font-family: 'Iosevka Slab';
font-style: normal;
font-weight: 900; font-weight: 900;
font-style: normal;
font-display: swap; font-display: swap;
font-variant-ligatures: normal;
src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Heavy.woff2') format('woff2'); src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Heavy.woff2') format('woff2');
} }
@font-face { @font-face {
font-family: 'Iosevka Slab'; font-family: 'Iosevka Slab';
font-weight: 300;
font-style: italic; font-style: italic;
font-display: swap;
src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-LightItalic.woff2')
format('woff2');
}
@font-face {
font-family: 'Iosevka Slab';
font-weight: 400; font-weight: 400;
font-style: italic;
font-display: swap; font-display: swap;
src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Italic.woff2') src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-Italic.woff2')
format('woff2'); format('woff2');
@@ -47,8 +71,9 @@
@font-face { @font-face {
font-family: 'Iosevka Slab'; font-family: 'Iosevka Slab';
font-weight: 700;
font-style: italic; font-style: italic;
srcfont-weight: 700;
font-display: swap; font-display: swap;
src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-BoldItalic.woff2') src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-BoldItalic.woff2')
format('woff2'); format('woff2');
@@ -56,8 +81,9 @@
@font-face { @font-face {
font-family: 'Iosevka Slab'; font-family: 'Iosevka Slab';
font-weight: 900;
font-style: italic; font-style: italic;
srcfont-weight: 900;
font-display: swap; font-display: swap;
src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-HeavyItalic.woff2') src: url('/src/fonts/IosevkaSlabQp/IosevkaSlabQp-HeavyItalic.woff2')
format('woff2'); format('woff2');
@@ -65,9 +91,60 @@
@font-face { @font-face {
font-family: 'Iosevka Mono'; font-family: 'Iosevka Mono';
font-weight: 400;
font-style: normal; font-style: normal;
srcfont-weight: 400;
font-display: swap; font-display: swap;
src: url('/src/fonts/IosevkaSansMono/IosevkaSansMono-Regular.woff2') src: url('/src/fonts/IosevkaSansMono/IosevkaSansMono-Regular.woff2')
format('woff2'); format('woff2');
} }
@font-face {
font-family: 'Iosevka Mono';
font-weight: 700;
font-style: normal;
font-display: swap;
src: url('/src/fonts/IosevkaSansMono/IosevkaSansMono-Bold.woff2')
format('woff2');
}
@font-face {
font-family: 'Iosevka Mono';
font-weight: 900;
font-style: normal;
font-display: swap;
src: url('/src/fonts/IosevkaSansMono/IosevkaSansMono-ExtraBold.woff2')
format('woff2');
}
@font-face {
font-family: 'Iosevka Mono';
font-weight: 400;
font-style: italic;
font-display: swap;
src: url('/src/fonts/IosevkaSansMono/IosevkaSansMono-Italic.woff2')
format('woff2');
}
@font-face {
font-family: 'Iosevka Mono';
font-weight: 700;
font-style: italic;
font-display: swap;
src: url('/src/fonts/IosevkaSansMono/IosevkaSansMono-BoldItalic.woff2')
format('woff2');
}
@font-face {
font-family: 'Iosevka Mono';
font-weight: 900;
font-style: italic;
font-display: swap;
src: url('/src/fonts/IosevkaSansMono/IosevkaSansMono-ExtraBoldItalic.woff2')
format('woff2');
}

View File

@@ -0,0 +1,213 @@
.ui {
/* === TYPE SCALE === */
/*
* Major Second (1.12), 14px base, 20px line height
* Step Size (rem) Leading Tracking
* ------------------------------------------------------------------
* 10 2.75 1.1818 -0.0205em
* 9 2.5 1.2 -0.0195em
* 8 2.1875 1.1429 -0.018em
* 7 1.9375 1.1613 -0.0165em
* 6 1.75 1.2857 -0.015em
* 5 1.5625 1.28 -0.0132em
* 4 1.375 1.2727 -0.0109em
* 3 1.25 1.4 -0.009em
* 2 1.125 1.3333 -0.0067em
* 1 1 1.5 -0.0037em
* 0 0.875 1.4286 0em ← base
* -1 0.75 1.6667 0.005em
* -2 0.6875 1.4545 0.0082em
* -3 0.625 1.6 0.012em
*/
/* == Font Sizes == */
--type--3: 0.625rem;
--type--2: 0.6875rem;
--type--1: 0.75rem;
--type-0: 0.875rem;
--type-1: 1rem;
--type-2: 1.125rem;
--type-3: 1.25rem;
--type-4: 1.375rem;
--type-5: 1.5625rem;
--type-6: 1.75rem;
--type-7: 1.9375rem;
--type-8: 2.1875rem;
--type-9: 2.5rem;
--type-10: 2.75rem;
/* == Line Heights == */
--leading--3: 1.6;
--leading--2: 1.4545;
--leading--1: 1.6667;
--leading-0: 1.4286;
--leading-1: 1.5;
--leading-2: 1.3333;
--leading-3: 1.4;
--leading-4: 1.2727;
--leading-5: 1.28;
--leading-6: 1.2857;
--leading-7: 1.1613;
--leading-8: 1.1429;
--leading-9: 1.2;
--leading-10: 1.1818;
/* == Letter Spacing == */
--tracking--3: 0.012em;
--tracking--2: 0.0082em;
--tracking--1: 0.005em;
--tracking-0: 0em;
--tracking-1: -0.0037em;
--tracking-2: -0.0067em;
--tracking-3: -0.009em;
--tracking-4: -0.0109em;
--tracking-5: -0.0132em;
--tracking-6: -0.015em;
--tracking-7: -0.0165em;
--tracking-8: -0.018em;
--tracking-9: -0.0195em;
--tracking-10: -0.0205em;
}
.content {
/* === TYPE SCALE === */
/*
* Minor Third (1.19), 16px base, 24px line height
* Step Size (em) Leading Tracking
* ------------------------------------------------------------------
* 10 5.6875 1.0989 -0.0247em
* 9 4.75 1.1053 -0.0237em
* 8 4 1.125 -0.0225em
* 7 3.375 1.1852 -0.0211em
* 6 2.8125 1.1556 -0.0193em
* 5 2.375 1.2632 -0.0174em
* 4 2 1.25 -0.015em
* 3 1.6875 1.3333 -0.0122em
* 2 1.4375 1.3913 -0.0091em
* 1 1.1875 1.4737 -0.0047em
* 0 1 1.5 0em ← base
* -1 0.8125 1.5385 0.0069em
* -2 0.6875 1.8182 0.0136em
* -3 0.625 2 0.018em
*/
/* == Font Sizes == */
--type--3: 0.625em;
--type--2: 0.6875em;
--type--1: 0.8125em;
--type-0: 1em;
--type-1: 1.1875em;
--type-2: 1.4375em;
--type-3: 1.6875em;
--type-4: 2em;
--type-5: 2.375em;
--type-6: 2.8125em;
--type-7: 3.375em;
--type-8: 4em;
--type-9: 4.75em;
--type-10: 5.6875em;
/* == Line Heights == */
--leading--3: 2;
--leading--2: 1.8182;
--leading--1: 1.5385;
--leading-0: 1.5;
--leading-1: 1.4737;
--leading-2: 1.3912;
--leading-3: 1.3333;
--leading-4: 1.25;
--leading-5: 1.2632;
--leading-6: 1.1556;
--leading-7: 1.1852;
--leading-8: 1.125;
--leading-9: 1.1053;
--leading-10: 1.0989;
/* == Letter Spacing == */
--tracking--3: 0.018em;
--tracking--2: 0.0136em;
--tracking--1: 0.0069em;
--tracking-0: 0em;
--tracking-1: -0.0047em;
--tracking-2: -0.0091em;
--tracking-3: -0.0122em;
--tracking-4: -0.015em;
--tracking-5: -0.0174em;
--tracking-6: -0.0193em;
--tracking-7: -0.0211em;
--tracking-8: -0.0225em;
--tracking-9: -0.0237em;
--tracking-10: -0.0247em;
}
:root {
/* === FONT FAMILIES === */
--font-header: 'Geist Variable', sans;
--font-display: 'Blaka',serif;
--font-body: 'Iosevka Slab', sans;
--font-mono: 'Iosevka Mono', monospace;
--font-symbols: 'Unigrim Dee', fantasy;
/* === SIZE (REM-based) === */
--size-0: 0;
--size-px: 0.0625rem;
--size-1: 0.125rem;
--size-2: 0.25rem;
--size-3: 0.375rem;
--size-4: 0.5rem;
--size-5: 0.625rem;
--size-6: 0.75rem;
--size-7: 0.875rem;
--size-8: 1rem;
--size-9: 1.25rem;
--size-10: 1.5rem;
--size-11: 2rem;
--size-12: 2.5rem;
--size-13: 3rem;
--size-14: 4rem;
--size-15: 5rem;
--size-16: 6rem;
/* === SPACING (EM-based) === */
--space-0: 0;
--space-px: 0.0625em;
--space-1: 0.125em;
--space-2: 0.25em;
--space-3: 0.375rem;
--space-4: 0.5em;
--space-5: 0.625em;
--space-6: 0.75em;
--space-7: 0.875em;
--space-8: 1em;
--space-9: 1.25em;
--space-10: 1.5em;
--space-11: 2em;
--space-12: 2.5em;
--space-13: 3em;
--space-14: 4em;
--space-15: 5em;
--space-16: 6em;
/* === Z-INDEX === */
--z-base: 1;
--z-sticky: 10;
--z-overlay: 20;
--z-modal: 30;
--z-toast: 40;
/* === MOTION === */
--motion-fast: 150ms;
--motion-normal: 300ms;
--motion-slow: 500ms;
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
/* === LAYOUT === */
--layout-content-width: minmax(0, 72ch);
--layout-margin-width: minmax(18ch, 1fr);
--layout-gutter: var(--space-6);
--layout-page-margin: var(--space-8);
--layout-max-width: 90rem;
}

View File

@@ -1,58 +0,0 @@
:root {
/* === Font Families === */
--font-header: 'Geist Variable', sans;
--font-display: 'Blaka',serif;
--font-body: 'Iosevka Slab', sans;
--font-mono: 'Iosevka Mono', monospace;
--font-symbols: 'Unigrim Dee', fantasy;
/* === Type Scale === */
--typo-size-responsive: clamp(1rem, 2.5vw, 1.25rem);
--typo-size-base: 16px;
--typo-size-8xl: 8em;
--typo-size-7xl: 6.375em;
--typo-size-6xl: 5.0625em;
--typo-size-5xl: 4em;
--typo-size-4xl: 3.1875em;
--typo-size-3xl: 2.5em;
--typo-size-2xl: 2em;
--typo-size-xl: 1.5625em;
--typo-size-lg: 1.25em;
--typo-size-md: 1em;
--typo-size-sm: 0.8125em;
--typo-size-xs: 0.625em;
--typo-size-2xs: 0.5em;
/* == Letter Spacing == */
--typo-spacing-tightest: -0.05em;
--typo-spacing-tighter: -0.025em;
--typo-spacing-tight: -0.0125em;
--typo-spacing-normal: 0em;
--typo-spacing-relaxed: 0.025em;
--typo-spacing-comfortable: 0.05em;
--typo-spacing-loose: 0.1em;
--typo-spacing-looser: 0.15em;
--typo-spacing-loosest: 0.2em;
/* === Line Height === */
--typo-leading-compressed: 1;
--typo-leading-tight: 1.125;
--typo-leading-snug: 1.25;
--typo-leading-cozy: 1.375;
--typo-leading-normal: 1.5;
--typo-leading-relaxed: 1.625;
--typo-leading-comfortable: 1.75;
--typo-leading-loose: 1.875;
--typo-leading-spacious: 2;
/* === Vertical Spacing Multipliers === */
--vspace-compressed: 0.25;
--vspace-tight: 0.5;
--vspace-snug: 0.75;
--vspace-cozy: 1;
--vspace-normal: 1.25;
--vspace-relaxed: 1.5;
--vspace-comfortable: 1.75;
--vspace-loose: 2;
--vspace-spacious: 2.5;
}

View File

@@ -1,40 +0,0 @@
/* UI Specific Variables */
:root {
/* Spacing */
--ui-spacing-hairline: 0.0625rem;
--ui-spacing-tight: 0.125rem;
--ui-spacing-snug: 0.25rem;
--ui-spacing-cozy: 0.375rem;
--ui-spacing-comfortable:0.5rem;
--ui-spacing-relaxed: 0.625rem;
--ui-spacing-spacious: 0.75rem;
--ui-spacing-generous: 0.875rem;
--ui-spacing-luxurious: 1rem;
--ui-spacing-expansive: 1.25rem;
/* Font Size */
--ui-typo-size-2xs: 0.5625rem;
--ui-typo-size-xs: 0.625rem;
--ui-typo-size-sm: 0.6875rem;
--ui-typo-size-md: 0.8125rem;
--ui-typo-size-lg: 0.875rem;
--ui-typo-size-xl: 1rem;
--ui-typo-size-2xl: 1.25rem;
--ui-typo-size-3xl: 1.5rem;
--ui-typo-size-4xl: 1.75rem;
--ui-typo-size-5xl: 2rem;
/* === MastHead === */
--ui-masthead-font-size: var(--ui-font-size-xl);
--ui-masthead-line-height: var(--typo-leading-snug);
--ui-masthead-paddingY: var(--ui-spacing-relaxed);
--ui-masthead-height: calc(
(var(--ui-masthead-font-size) * var(--ui-masthead-line-height)) +
(var(--ui-masthead-paddingY) * 2)
);
/* === Content/Marginalia === */
--ui-content-width: minmax(0, 72ch);
--ui-margin-width: minmax(18ch, 1fr);
--ui-layout-width: 90rem;
}

View File

@@ -1,12 +1,9 @@
@import url('./base/fonts.css'); @import url("base/custom-media.css");
@import url('./base/foundation.css'); @import url("base/fonts.css");
@import url('./base/colors.css'); @import url("base/foundation.css");
@import url('./base/dimensions.css'); @import url("base/colors.css");
@import url('./base/typography.css'); @import url("base/primitives.css");
@import url('./base/elements.css'); @import url("base/content.css");
@import url('./base/custom-media.css');
@import url('./base/content.css');
@import url('./base/ui.css');
body { body {
font-variant-ligatures: discretionary-ligatures; font-variant-ligatures: discretionary-ligatures;

View File

@@ -53,3 +53,8 @@
@define-mixin circle { @define-mixin circle {
border-radius: 50%; border-radius: 50%;
} }
@define-mixin focus-ring $width: 2px, $color: var(--color-focus-ring), $offset: 2px {
outline: $width solid $color;
outline-offset: $offset;
}

View File

@@ -0,0 +1,112 @@
:root {
/* == Neutrals == */
--color-palette-black-ink: oklch(21.9% 0.006 285.911deg);
--color-palette-charcoal: oklch(26.6% 0.008 240.166deg);
--color-palette-charcoal-gray: oklch(33.7% 0.026 266.801deg);
--color-palette-carbon: oklch(39.8% 0 89.876deg);
--color-palette-cloud-gray: oklch(53.6% 0.005 236.565deg);
--color-palette-stone: oklch(64.3% 0.005 91.471deg);
--color-palette-silver: oklch(72.9% 0.001 17.185deg);
--color-palette-light-silver: oklch(82.6% 0.002 247.844deg);
--color-palette-pale-gray: oklch(91.3% 0.004 91.449deg);
--color-palette-very-pale-gray: oklch(94.3% 0 89.876deg);
--color-palette-off-white: oklch(98.1% 0.003 247.858deg);
--color-palette-ice-blue: oklch(99.9% 0.001 197.139deg);
/* == Accents == */
--color-palette-lava: oklch(63.6% 0.193 17.075deg);
--color-palette-cerise: oklch(60.7% 0.23 18.554deg);
--color-palette-persimmon: oklch(68.6% 0.179 40.01deg);
--color-palette-fuchsia: oklch(49.6% 0.181 351.176deg);
--color-palette-bright-canary: oklch(89% 0.157 97.726deg);
--color-palette-lime-green: oklch(74.6% 0.18 129.939deg);
--color-palette-royal-blue: oklch(46.1% 0.07 245.64deg);
--color-palette-electric-blue: oklch(90.8% 0.128 188.419deg);
/* === Semantic Colors === */
/* == Primary / Secondary / Tertiary == */
--color-primary: var(--color-palette-lava);
--color-primary-surface: oklch(from var(--color-primary) calc(l + 0.1) c h);
--color-primary-emphasis: oklch(from var(--color-primary) calc(l - 0.15) c h);
--color-secondary: var(--color-palette-lime-green);
--color-secondary-surface: oklch(
from var(--color-secondary) calc(l + 0.1) c h
);
--color-secondary-emphasis: oklch(
from var(--color-secondary) calc(l - 0.15) c h
);
--color-tertiary: var(--color-palette-bright-canary);
--color-tertiary-surface: oklch(from var(--color-tertiary) calc(l + 0.1) c h);
--color-tertiary-emphasis: oklch(
from var(--color-tertiary) calc(l - 0.15) c h
);
/* == Text == */
--color-text-primary: var(--color-palette-black-ink);
--color-text-secondary: var(--color-palette-charcoal);
--color-text-tertiary: var(--color-palette-charcoal-gray);
--color-text-quarternary: var(--color-palette-carbon);
--color-text-inverse: var(--color-palette-ice-blue);
--color-text-disabled: var(--color-palette-cloud-gray);
/* == Surfaces == */
--color-surface-base: var(--color-palette-ice-blue);
--color-surface-elevated-1: var(--color-palette-off-white);
--color-surface-elevated-2: var(--color-palette-very-pale-gray);
--color-surface-elevated-3: var(--color-palette-pale-gray);
--color-surface-elevated-4: var(--color-palette-light-silver);
--color-surface-inverse: var(--color-palette-black-ink);
/* == Borders == */
--color-border-subtle: var(--color-palette-silver);
--color-border-normal: var(--color-palette-stone);
--color-border-strong: var(--color-palette-charcoal-gray);
/* == States == */
--color-state-error: var(--color-palette-cerise);
--color-state-warning: var(--color-palette-persimmon);
--color-state-success: var(--color-palette-lime-green);
--color-state-info: var(--color-palette-royal-blue);
/* == Links == */
--color-text-link: var(--color-text-tertiary);
--color-text-link-hover: var(--color-secondary);
--color-text-link-visited: var(--color-palette-fuchsia);
/* == Focus == */
--color-focus-ring: var(--color-primary);
/* == Overlays == */
--color-overlay-light: oklch(0% 0 0deg / 10%);
--color-overlay-medium: oklch(0% 0 0deg / 30%);
--color-overlay-heavy: oklch(0% 0 0deg / 60%);
/* == Shadows == */
--color-shadow: oklch(0% 0 0deg / 10%);
--color-shadow-strong: oklch(0% 0 0deg / 25%);
/* == Utility == */
--color-highlight: var(--color-tertiary-surface);
--color-highlight-strong: var(--color-tertiary);
--color-skeleton-base: var(--color-surface-elevated-2);
--color-skeleton-shimmer: var(--color-surface-elevated-1);
}
.dark {
--color-text-primary: var(--color-palette-ice-blue);
--color-text-secondary: var(--color-palette-pale-gray);
--color-text-tertiary: var(--color-palette-light-silver);
--color-text-quarternary: var(--color-palette-silver);
--color-text-inverse: var(--color-palette-black-ink);
--color-text-disabled: var(--color-palette-cloud-gray);
--color-surface-base: var(--color-palette-black-ink);
--color-surface-elevated-1: var(--color-palette-charcoal);
--color-surface-elevated-2: var(--color-palette-charcoal-gray);
--color-surface-elevated-3: var(--color-palette-carbon);
--color-surface-elevated-4: var(--color-palette-cloud-gray);
--color-surface-inverse: var(--color-palette-ice-blue);
--color-border-subtle: var(--color-palette-charcoal-gray);
--color-border-normal: var(--color-palette-carbon);
--color-border-strong: var(--color-palette-silver);
}

View File

@@ -1,26 +0,0 @@
@define-mixin responsive-wrapper $vspacing: 0, $hspacing: var(--spacing-cozy),
$fontSize: var(--typo-size-responsive) {
@mixin mx auto;
max-width: clamp(60ch, 90vw, 90ch);
padding: $vspacing $hspacing;
font-family: var(--font-body);
font-size: $fontSize;
}
@define-mixin layout-wrapper {
@mixin mx auto;
@mixin px var(--spacing-comfortable);
width: 100%;
max-width: var(--ui-layout-width);
@media screen and (--max-layout) {
@mixin px var(--spacing-comfortable);
}
}
@define-mixin position $position: absolute, $inset-values {
position: $position;
inset: $inset-values;
}

View File

@@ -0,0 +1,16 @@
@define-mixin layout-wrapper {
@mixin mx auto;
@mixin px var(--layout-page-margin);
width: 100%;
max-width: var(--layout-max-width);
@media screen and (--bp-desktop) {
@mixin px var(--scape-0);
}
}
@define-mixin position $position: absolute, $inset-values {
position: $position;
inset: $inset-values;
}

View File

@@ -1,73 +1,198 @@
@define-mixin heading-1 { @define-mixin typo_display-1 {
@mixin mt var(--el-h1-vspace-top); font-family: var(--font-display);
@mixin mb var(--el-h1-vspace-bottom); font-size: var(--type-10);
@mixin pb var(--spacing-snug);
font-family: var(--el-h1-font-family);
font-size: var(--el-h1-font-size);
font-weight: 400; font-weight: 400;
line-height: var(--el-h1-leading); line-height: var(--leading-10);
color: var(--el-h1-color); text-transform: none;
text-transform: uppercase; letter-spacing: var(--tracking-10);
letter-spacing: -0.0137em;
} }
@define-mixin heading-2 { @define-mixin typo_display-2 {
@mixin mt var(--el-h2-vspace-top); font-family: var(--font-display);
@mixin mb var(--el-h2-vspace-bottom); font-size: var(--type-9);
font-weight: 400;
line-height: var(--leading-9);
text-transform: none;
letter-spacing: var(--tracking-9);
}
font-family: var(--el-h2-font-family); @define-mixin typo_heading-1 {
font-size: var(--el-h2-font-size); font-family: var(--font-header);
font-size: var(--type-8);
font-weight: 900; font-weight: 900;
line-height: var(--el-h2-leading); line-height: var(--leading-8);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: -0.0096em; letter-spacing: var(--tracking-8);
} }
@define-mixin heading-3 { @define-mixin typo_heading-2 {
@mixin mt var(--el-h3-vspace-top); font-family: var(--font-header);
@mixin mb var(--el-h3-vspace-bottom); font-size: var(--type-7);
font-family: var(--el-h3-font-family);
font-size: var(--el-h3-font-size);
font-weight: 800; font-weight: 800;
line-height: var(--el-h3-leading); line-height: var(--leading-7);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: -0.004em; letter-spacing: var(--tracking-7);
} }
@define-mixin heading-4 { @define-mixin typo_heading-3 {
@mixin mt var(--el-h4-vspace-top); font-family: var(--font-header);
@mixin mb var(--el-h4-vspace-bottom); font-size: var(--type-6);
font-family: var(--el-h4-font-family);
font-size: var(--el-h4-font-size);
font-weight: 800; font-weight: 800;
line-height: var(--el-h4-leading); line-height: var(--leading-6);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.0025em; letter-spacing: var(--tracking-6);
} }
@define-mixin heading-5 { @define-mixin typo_heading-4 {
@mixin mt var(--el-h5-vspace-top); font-family: var(--font-header);
@mixin mb var(--el-h5-vspace-bottom); font-size: var(--type-5);
font-family: var(--el-h5-font-family);
font-size: var(--el-h5-font-size);
font-weight: 800; font-weight: 800;
line-height: var(--el-h5-leading); line-height: var(--leading-5);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.05em; letter-spacing: var(--tracking-5);
} }
@define-mixin heading-6 { @define-mixin typo_heading-5 {
@mixin mt var(--el-h6-vspace-top); font-family: var(--font-header);
@mixin mb var(--el-h6-vspace-bottom); font-size: var(--type-4);
font-weight: 700;
font-family: var(--el-h6-font-family); line-height: var(--leading-4);
font-size: var(--el-h6-font-size);
font-weight: 900;
line-height: var(--el-h6-leading);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.035em; letter-spacing: var(--tracking-4);
}
@define-mixin typo_heading-6 {
font-family: var(--font-header);
font-size: var(--type-3);
font-weight: 700;
line-height: var(--leading-3);
text-transform: uppercase;
letter-spacing: var(--tracking-3);
}
@define-mixin typo_body-large {
font-family: var(--font-body);
font-size: var(--type-2);
font-weight: 400;
line-height: var(--leading-2);
text-transform: none;
letter-spacing: var(--tracking-2);
}
@define-mixin typo_body-alt {
font-family: var(--font-body);
font-size: var(--type-1);
font-weight: 400;
line-height: var(--leading-1);
text-transform: none;
letter-spacing: var(--tracking-1);
}
@define-mixin typo_body {
font-family: var(--font-body);
font-size: var(--type-0);
font-weight: 400;
line-height: var(--leading-0);
text-transform: none;
letter-spacing: var(--tracking-0);
}
@define-mixin typo_body-small {
font-family: var(--font-body);
font-size: var(--type--1);
font-weight: 400;
line-height: var(--leading--1);
text-transform: none;
letter-spacing: var(--tracking--1);
}
@define-mixin typo_label {
font-family: var(--font-header);
font-size: var(--type--2);
font-weight: 700;
line-height: var(--leading--2);
text-transform: none;
letter-spacing: var(--tracking--2);
}
@define-mixin typo_fine {
font-family: var(--font-body);
font-size: var(--type--3);
font-weight: 400;
line-height: var(--leading--3);
text-transform: none;
letter-spacing: var(--tracking--3);
}
@define-mixin typo_code {
font-family: var(--font-mono);
font-size: var(--type--1);
font-weight: 400;
line-height: var(--leading--1);
text-transform: none;
letter-spacing: var(--tracking-0);
}
@define-mixin typo_table-header {
font-family: var(--font-header);
font-size: var(--type--1);
font-weight: 700;
line-height: var(--leading-0);
text-transform: uppercase;
letter-spacing: var(--tracking-0);
}
@define-mixin typo_table-data {
font-family: var(--font-mono);
font-size: var(--type--1);
font-weight: 400;
line-height: var(--leading--1);
text-transform: none;
letter-spacing: var(--tracking-0);
}
@define-mixin typo_definition-header {
font-family: var(--font-header);
font-size: var(--type--0);
font-weight: 700;
line-height: var(--leading-0);
text-transform: uppercase;
letter-spacing: var(--tracking-0);
}
@define-mixin typo_definition-data {
font-family: var(--font-mono);
font-size: var(--type--1);
font-weight: 400;
line-height: var(--leading--1);
text-transform: none;
letter-spacing: var(--tracking-0);
}
@define-mixin typo_subtitle {
font-family: var(--font-header);
font-size: var(--type-0);
font-weight: 300;
line-height: var(--leading-0);
text-transform: uppercase;
letter-spacing: 0.0875em;
}
@define-mixin typo_meta-label {
font-family: var(--font-header);
font-size: var(--type--2);
font-weight: 500;
text-transform: uppercase;
letter-spacing: var(--size-1);
leading: var(--leading--3);
}
@define-mixin typo_meta-data {
font-family: var(--font-mono);
font-size: var(--type-0);
text-transform: uppercase;
letter-spacing: var(--size--3);
leading: var(--leading-0);
} }