diff --git a/docs/Community/CODE_OF_CONDUCT.md b/docs/Community/CODE_OF_CONDUCT.md
index fed50819..500fddb5 100644
--- a/docs/Community/CODE_OF_CONDUCT.md
+++ b/docs/Community/CODE_OF_CONDUCT.md
@@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
-contact@formingworlds.space.
+dev@proteus-framework.org.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
diff --git a/docs/Community/contact.md b/docs/Community/contact.md
index 0b09d534..85def315 100644
--- a/docs/Community/contact.md
+++ b/docs/Community/contact.md
@@ -4,6 +4,6 @@ We encourage you to reach out! Choose the most appropriate channel below.
| Channel | Use for |
|---------|---------|
-| [Forming Worlds Discussions](https://github.com/orgs/FormingWorlds/discussions) | Questions, installation help, feature suggestions |
+| [GitHub Discussions](https://github.com/orgs/FormingWorlds/discussions) | Questions, installation help, feature suggestions |
| [GitHub Issues](https://github.com/FormingWorlds/SPIDER/issues) | Bug reports, specific feature requests |
-| [proteus_dev@formingworlds.space](mailto:proteus_dev@formingworlds.space) | General enquiries |
+| [dev@proteus-framework.org](mailto:dev@proteus-framework.org) | General enquiries |
diff --git a/docs/assets/PROTEUS_black_on_white_logo_only.png b/docs/assets/PROTEUS_black_on_white_logo_only.png
deleted file mode 100644
index fe490485..00000000
Binary files a/docs/assets/PROTEUS_black_on_white_logo_only.png and /dev/null differ
diff --git a/docs/assets/PROTEUS_white_on_black.png b/docs/assets/PROTEUS_white_on_black.png
deleted file mode 100644
index 14e5d75f..00000000
Binary files a/docs/assets/PROTEUS_white_on_black.png and /dev/null differ
diff --git a/docs/assets/PROTEUS_white_on_black_logo_only.png b/docs/assets/PROTEUS_white_on_black_logo_only.png
deleted file mode 100644
index fbd6d489..00000000
Binary files a/docs/assets/PROTEUS_white_on_black_logo_only.png and /dev/null differ
diff --git a/docs/assets/favicon-light.png b/docs/assets/favicon-light.png
new file mode 100644
index 00000000..6db0ca63
Binary files /dev/null and b/docs/assets/favicon-light.png differ
diff --git a/docs/assets/favicon.png b/docs/assets/favicon.png
new file mode 100644
index 00000000..e1872976
Binary files /dev/null and b/docs/assets/favicon.png differ
diff --git a/docs/assets/favicon.svg b/docs/assets/favicon.svg
new file mode 100644
index 00000000..d61ea98d
--- /dev/null
+++ b/docs/assets/favicon.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docs/assets/glyph_phase_dark.png b/docs/assets/glyph_phase_dark.png
new file mode 100644
index 00000000..f42b5356
Binary files /dev/null and b/docs/assets/glyph_phase_dark.png differ
diff --git a/docs/index.md b/docs/index.md
index 50948372..d8643c5a 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,21 +1,17 @@
# SPIDER
-
-
-
+[](https://www.gnu.org/licenses/gpl-3.0)
+[](https://proteus-framework.org/SPIDER/)
+[](https://app.codecov.io/gh/FormingWorlds/SPIDER)
+[](https://github.com/FormingWorlds/SPIDER/actions/workflows/ci.yml)
+[](https://github.com/FormingWorlds/SPIDER/actions/workflows/nightly.yml)
+
+**SPIDER** is the interior dynamics module of the [PROTEUS](https://proteus-framework.org/PROTEUS) coupled atmosphere-interior evolution framework, simulating planetary interior dynamics with extreme rheology. It is a 1-D parameterised interior dynamics code for rocky planets with molten and/or solid interiors, with support for volatile cycling, redox reactions, and radiative transfer in the atmosphere.
-
-
-
-
-
+
-**Simulating Planetary Interior Dynamics with Extreme Rheology**
-
-SPIDER is a 1-D parameterised interior dynamics code for rocky planets with molten and/or solid interiors and support for volatile cycling, redox reactions, and radiative transfer in the atmosphere.
-
!!! note
This documentation describes the version of SPIDER as part of the [PROTEUS Framework](https://proteus-framework.org/PROTEUS). For the original SPIDER code, see [djbower/SPIDER](https://github.com/djbower/spider).
diff --git a/docs/javascripts/header-links.js b/docs/javascripts/header-links.js
index 7f1f768b..9d976cf1 100644
--- a/docs/javascripts/header-links.js
+++ b/docs/javascripts/header-links.js
@@ -1,22 +1,21 @@
-console.log("header-links.js loaded");
-
function wire() {
const homepage = "https://proteus-framework.org/";
const logo = document.querySelector(".md-header__button.md-logo");
- if (logo) logo.href = homepage;
+ let docsHome = location.origin + "/";
+ if (logo) {
+ // The theme points the logo at this site's own home page. Remember that
+ // before repointing the logo at the framework home, so the title can use
+ // it and no page has to know its own name.
+ if (!logo.dataset.docsHome) logo.dataset.docsHome = logo.href;
+ docsHome = logo.dataset.docsHome;
+ logo.href = homepage;
+ }
const title = document.querySelector(".md-header__title[data-md-component='header-title']");
- if (title && !title.dataset.spiderWired) {
- title.dataset.spiderWired = "1";
+ if (title && !title.dataset.titleWired) {
+ title.dataset.titleWired = "1";
title.style.cursor = "pointer";
-
- // always go to /SPIDER/ when hosted there, else "/" (mkdocs serve)
- const href = location.href;
- const docsHome = href.includes("/SPIDER/")
- ? href.split("/SPIDER/")[0] + "/SPIDER/"
- : location.origin + "/";
-
title.addEventListener("click", (e) => {
if (e.target.closest("a, button, input, label")) return;
window.location.assign(docsHome);
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
index be8f24d8..62674901 100644
--- a/docs/overrides/main.html
+++ b/docs/overrides/main.html
@@ -5,11 +5,11 @@
+
+
{% endblock %}
diff --git a/docs/overrides/partials/extrahead.html b/docs/overrides/partials/extrahead.html
deleted file mode 100644
index 31c41706..00000000
--- a/docs/overrides/partials/extrahead.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/proteus_framework.md b/docs/proteus_framework.md
index 4290fada..bcec799f 100644
--- a/docs/proteus_framework.md
+++ b/docs/proteus_framework.md
@@ -1,8 +1,8 @@
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index af97b0d7..49cdb28f 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -1,20 +1,225 @@
-.mod-diagram {
- width: 100%;
- height: auto;
- aspect-ratio: 12.1 / 9; /* specific aspect ratio for the module diagram */
- display: none;
-}
-/* Light mode: show light diagram */
-[data-md-color-scheme="default"] .mod-diagram--light {
- display: block;
+/* ============================================================
+ PROTEUS — Thermocline theme for zensical / Material for MkDocs
+ Drop-in: docs/stylesheets/extra.css
+ ------------------------------------------------------------
+ mkdocs.yml:
+ theme:
+ name: zensical # or material
+ palette:
+ - media: "(prefers-color-scheme: dark)"
+ scheme: slate # dark-first
+ toggle: { icon: material/brightness-7, name: Light mode }
+ - media: "(prefers-color-scheme: light)"
+ scheme: default
+ toggle: { icon: material/brightness-4, name: Dark mode }
+ font: false # fonts loaded below
+ logo: assets/glyph_phase_dark.png
+ favicon: assets/favicon.svg
+ extra_css:
+ - stylesheets/extra.css
+ Copy logo/glyph/glyph_phase_dark.png (+ _light) and
+ logo/favicon/favicon.svg into docs/assets/,
+ and from this repo's fonts/ folder copy fonts.css, OFL.txt, and the
+ three family folders into docs/stylesheets/fonts/ (the import below
+ loads them; no third-party font requests). Leave fonts/README.md
+ behind so mkdocs does not render it as a page.
+ ============================================================ */
+
+@import url("fonts/fonts.css");
+
+:root {
+ /* brand */
+ --pt-magma: #E23D28;
+ --pt-mantle: #8E1F12;
+ --pt-crimson: #C2362B;
+ --pt-ocean: #1B6FA8;
+ --pt-abyss: #14406B;
+ --pt-azure: #4FA3D9;
+ --pt-ice: #A8D4E8;
+ --pt-void: #05070B;
+ --pt-basalt: #0E131B;
+ --pt-line-d: #1A2230;
+
+ /* accents: sporadic highlight and extra data-series range. Solar is the
+ bright tone for dark surfaces; the light block below swaps in the deep
+ one, which is also available by name for a mark that must stay deep. */
+ --pt-solar: #E0A32E;
+ --pt-solar-deep: #C8860F;
+ --pt-verdant: #57A05C;
+
+ /* module domains: one hue per physical domain, identical in every artifact
+ of the ecosystem, so a reader who learns the mapping on one page carries
+ it to the next. A module takes the colour of the domain it acts on. */
+ --pt-dom-interior: #E23D28; /* SPIDER, Aragog, Zalmoxis */
+ --pt-dom-outgassing: #A03123; /* CALLIOPE, Atmodeller */
+ --pt-dom-tidal: #593E74; /* LovePy, Obliqua */
+ --pt-dom-chem: #1B6FA8; /* VULCAN, ZEPHYRUS */
+ --pt-dom-atmos: #4FA3D9; /* AGNI, JANUS */
+ --pt-dom-stellar: #E0A32E; /* MORS; deepens on light, see the light block */
+ --pt-dom-accretion: #A38F7A; /* Morrigan */
+
+ /* phase ramp, magma through void to ocean, for data running molten to
+ frozen. Ordered, so an index maps to a position along the ramp. */
+ --pt-p1: #E23D28;
+ --pt-p2: #8E1F12;
+ --pt-p3: #3A120C;
+ --pt-p4: #05070B;
+ --pt-p5: #0E2A45;
+ --pt-p6: #14406B;
+ --pt-p7: #1B6FA8;
+ --pt-p8: #4FA3D9;
+ --pt-p9: #A8D4E8;
+
+ /* status, held apart from the domain hues so a red module and a failure
+ never have to be told apart by colour alone */
+ --pt-positive: #2E8B57;
+ --pt-warning: #C77726;
+ --pt-danger: #C2362B;
+ --pt-info: #1B6FA8;
+
+ --md-text-font: "Instrument Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ --md-code-font: "Spline Sans Mono", ui-monospace, "SF Mono", Menlo, monospace;
+}
+
+/* ---------- DARK (scheme: slate) — the primary mode ---------- */
+[data-md-color-scheme="slate"] {
+ --md-default-bg-color: var(--pt-void);
+ --md-default-fg-color: #E9EEF2;
+ --md-default-fg-color--light: #9FB0BE;
+ --md-default-fg-color--lighter: #5A6B7A;
+ --md-default-fg-color--lightest: #1A2230;
+
+ --md-primary-fg-color: var(--pt-void);
+ --md-primary-bg-color: #E9EEF2;
+ --md-accent-fg-color: var(--pt-ice);
+
+ --md-typeset-color: #C6D0D9;
+ --md-typeset-a-color: var(--pt-azure);
+
+ --md-code-bg-color: #04060A;
+ --md-code-fg-color: #B8C6D2;
+ --md-code-hl-keyword-color: var(--pt-magma);
+ --md-code-hl-string-color: var(--pt-azure);
+ --md-code-hl-number-color: var(--pt-ice);
+ --md-code-hl-comment-color: #5A6B7A;
+ --md-code-hl-function-color: var(--pt-ice);
+ --md-code-hl-name-color: #C6D0D9;
+
+ --md-admonition-bg-color: var(--pt-basalt);
+ --md-footer-bg-color: var(--pt-basalt);
+ --md-footer-bg-color--dark: var(--pt-void);
+}
+
+/* ---------- LIGHT (scheme: default) — the mirror ---------- */
+[data-md-color-scheme="default"] {
+ --md-default-bg-color: #F2F5F7;
+ --md-default-fg-color: #10151B;
+ --md-default-fg-color--light: #3E4A55;
+ --md-default-fg-color--lighter: #7A8894;
+ --md-default-fg-color--lightest: #D2DAE1;
+
+ --md-primary-fg-color: #10151B; /* header bar stays ink on light */
+ --md-primary-bg-color: #F2F5F7;
+ --md-accent-fg-color: var(--pt-abyss);
+
+ --md-typeset-color: #2A343D;
+ --md-typeset-a-color: var(--pt-ocean);
+
+ --md-code-bg-color: #E9EEF3;
+ --md-code-fg-color: #22303B;
+ --md-code-hl-keyword-color: var(--pt-crimson);
+ --md-code-hl-string-color: var(--pt-abyss);
+ --md-code-hl-number-color: var(--pt-ocean);
+ --md-code-hl-comment-color: #7A8894;
+
+ /* the one domain colour that differs by scheme: the bright tone reaches
+ only 2.0:1 on Paper, and deepening lifts it to 2.8:1 */
+ --pt-solar: #C8860F;
+ --pt-dom-stellar: #C8860F;
+}
+
+/* ---------- typography ---------- */
+.md-typeset h1, .md-typeset h2, .md-typeset h3 {
+ font-family: "Sora", var(--md-text-font);
+ font-weight: 700;
+ letter-spacing: -0.02em;
+}
+.md-typeset h1 { font-weight: 800; }
+.md-header__topic, .md-header__title {
+ font-family: "Sora", var(--md-text-font);
+ font-weight: 800;
+ letter-spacing: 0.02em;
+}
+
+/* tracked mono labels for nav sections */
+.md-nav__title, .md-nav--secondary .md-nav__title {
+ font-family: var(--md-code-font);
+ font-size: 0.62rem;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+}
+
+/* ---------- structure: hairlines, active ticks ---------- */
+.md-header { border-bottom: 1px solid var(--pt-line-d); }
+[data-md-color-scheme="default"] .md-header { border-bottom-color: #D2DAE1; }
+
+.md-nav__item .md-nav__link--active {
+ color: var(--pt-azure);
+ border-left: 2px solid var(--pt-magma);
+ padding-left: 0.5rem;
+ margin-left: -0.6rem;
+ background: linear-gradient(90deg, rgba(226,61,40,0.06), transparent);
+}
+[data-md-color-scheme="default"] .md-nav__item .md-nav__link--active {
+ color: var(--pt-ocean);
+ border-left-color: var(--pt-crimson);
+}
+
+.md-typeset h2 { border-top: 1px solid var(--pt-line-d); padding-top: 0.8em; }
+[data-md-color-scheme="default"] .md-typeset h2 { border-top-color: #D2DAE1; }
+
+/* code blocks: magma spine */
+.md-typeset pre > code { border-radius: 4px; }
+.md-typeset pre { border-left: 3px solid var(--pt-magma); border-radius: 4px; }
+
+/* tabs: active = magma underline */
+.md-tabs__link--active { border-bottom: 2px solid var(--pt-magma); }
+
+/* admonitions: flat, mono titles */
+.md-typeset .admonition, .md-typeset details {
+ border-width: 1px;
+ border-radius: 4px;
+ box-shadow: none;
+}
+.md-typeset .admonition-title, .md-typeset summary {
+ font-family: var(--md-code-font);
+ font-size: 0.62rem;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+}
+.md-typeset .admonition.note, .md-typeset .admonition.info {
+ border-color: rgba(27,111,168,0.4);
+}
+.md-typeset .admonition.warning, .md-typeset .admonition.danger {
+ border-color: rgba(226,61,40,0.4);
+}
+
+/* tables */
+.md-typeset table:not([class]) th {
+ font-family: var(--md-code-font);
+ font-size: 0.62rem;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
}
-/* Dark mode: show dark diagram (Material's default dark scheme is "slate") */
-[data-md-color-scheme="slate"] .mod-diagram--dark {
+/* footer phase band */
+.md-footer-meta { position: relative; }
+.md-footer-meta::before {
+ content: "";
display: block;
+ height: 5px;
+ background: linear-gradient(90deg, #E23D28, #8E1F12 25%, #05070B 50%, #14406B 75%, #4FA3D9 92%, #A8D4E8);
}
-/* Remove underline from links that contain only an image */
-.md-typeset p a:has(> img) {
- text-decoration: none;
-}
\ No newline at end of file
+/* focus */
+:focus-visible { outline: 2px solid var(--pt-magma); outline-offset: 2px; }
diff --git a/docs/stylesheets/fonts/OFL.txt b/docs/stylesheets/fonts/OFL.txt
new file mode 100644
index 00000000..a270166a
--- /dev/null
+++ b/docs/stylesheets/fonts/OFL.txt
@@ -0,0 +1,95 @@
+Copyright 2019 The Sora Project Authors (https://github.com/sora-xor/sora-font)
+Copyright 2022 The Instrument Sans Project Authors (https://github.com/Instrument/instrument-sans)
+Copyright 2022 The Spline Sans Mono Project Authors (https://github.com/SorkinType/SplineSansMono)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/stylesheets/fonts/fonts.css b/docs/stylesheets/fonts/fonts.css
new file mode 100644
index 00000000..ee64b9de
--- /dev/null
+++ b/docs/stylesheets/fonts/fonts.css
@@ -0,0 +1,68 @@
+/* ============================================================
+ PROTEUS FRAMEWORK — THERMOCLINE SELF-HOSTED FONTS
+ Sora (display) · Instrument Sans (body/UI) · Spline Sans Mono
+ All faces are SIL OFL 1.1; see OFL.txt in this folder.
+ Family names match the stacks in ../tokens/tokens.css.
+ ============================================================ */
+
+/* ——— Sora — display ——— */
+@font-face {
+ font-family: "Sora";
+ src: url("sora/Sora-SemiBold.woff2") format("woff2"), url("sora/Sora-SemiBold.ttf") format("truetype");
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+@font-face {
+ font-family: "Sora";
+ src: url("sora/Sora-Bold.woff2") format("woff2"), url("sora/Sora-Bold.ttf") format("truetype");
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+@font-face {
+ font-family: "Sora";
+ src: url("sora/Sora-ExtraBold.woff2") format("woff2"), url("sora/Sora-ExtraBold.ttf") format("truetype");
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+/* ——— Instrument Sans — body / UI ——— */
+@font-face {
+ font-family: "Instrument Sans";
+ src: url("instrument-sans/InstrumentSans-Regular.woff2") format("woff2"), url("instrument-sans/InstrumentSans-Regular.ttf") format("truetype");
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+@font-face {
+ font-family: "Instrument Sans";
+ src: url("instrument-sans/InstrumentSans-Medium.woff2") format("woff2"), url("instrument-sans/InstrumentSans-Medium.ttf") format("truetype");
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+@font-face {
+ font-family: "Instrument Sans";
+ src: url("instrument-sans/InstrumentSans-SemiBold.woff2") format("woff2"), url("instrument-sans/InstrumentSans-SemiBold.ttf") format("truetype");
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+/* ——— Spline Sans Mono — code, labels, metadata ——— */
+@font-face {
+ font-family: "Spline Sans Mono";
+ src: url("spline-sans-mono/SplineSansMono-Regular.woff2") format("woff2"), url("spline-sans-mono/SplineSansMono-Regular.ttf") format("truetype");
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+@font-face {
+ font-family: "Spline Sans Mono";
+ src: url("spline-sans-mono/SplineSansMono-Medium.woff2") format("woff2"), url("spline-sans-mono/SplineSansMono-Medium.ttf") format("truetype");
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Medium.ttf b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Medium.ttf
new file mode 100644
index 00000000..7454de37
Binary files /dev/null and b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Medium.ttf differ
diff --git a/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Medium.woff2 b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Medium.woff2
new file mode 100644
index 00000000..cfe7c813
Binary files /dev/null and b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Medium.woff2 differ
diff --git a/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Regular.ttf b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Regular.ttf
new file mode 100644
index 00000000..538b6bf2
Binary files /dev/null and b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Regular.ttf differ
diff --git a/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Regular.woff2 b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Regular.woff2
new file mode 100644
index 00000000..7acf92b7
Binary files /dev/null and b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-Regular.woff2 differ
diff --git a/docs/stylesheets/fonts/instrument-sans/InstrumentSans-SemiBold.ttf b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-SemiBold.ttf
new file mode 100644
index 00000000..525fdb23
Binary files /dev/null and b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-SemiBold.ttf differ
diff --git a/docs/stylesheets/fonts/instrument-sans/InstrumentSans-SemiBold.woff2 b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-SemiBold.woff2
new file mode 100644
index 00000000..dfaa2ea2
Binary files /dev/null and b/docs/stylesheets/fonts/instrument-sans/InstrumentSans-SemiBold.woff2 differ
diff --git a/docs/stylesheets/fonts/sora/Sora-Bold.ttf b/docs/stylesheets/fonts/sora/Sora-Bold.ttf
new file mode 100644
index 00000000..ffd347bf
Binary files /dev/null and b/docs/stylesheets/fonts/sora/Sora-Bold.ttf differ
diff --git a/docs/stylesheets/fonts/sora/Sora-Bold.woff2 b/docs/stylesheets/fonts/sora/Sora-Bold.woff2
new file mode 100644
index 00000000..d398e91d
Binary files /dev/null and b/docs/stylesheets/fonts/sora/Sora-Bold.woff2 differ
diff --git a/docs/stylesheets/fonts/sora/Sora-ExtraBold.ttf b/docs/stylesheets/fonts/sora/Sora-ExtraBold.ttf
new file mode 100644
index 00000000..c4a3f7f8
Binary files /dev/null and b/docs/stylesheets/fonts/sora/Sora-ExtraBold.ttf differ
diff --git a/docs/stylesheets/fonts/sora/Sora-ExtraBold.woff2 b/docs/stylesheets/fonts/sora/Sora-ExtraBold.woff2
new file mode 100644
index 00000000..bd1f2068
Binary files /dev/null and b/docs/stylesheets/fonts/sora/Sora-ExtraBold.woff2 differ
diff --git a/docs/stylesheets/fonts/sora/Sora-SemiBold.ttf b/docs/stylesheets/fonts/sora/Sora-SemiBold.ttf
new file mode 100644
index 00000000..98984f67
Binary files /dev/null and b/docs/stylesheets/fonts/sora/Sora-SemiBold.ttf differ
diff --git a/docs/stylesheets/fonts/sora/Sora-SemiBold.woff2 b/docs/stylesheets/fonts/sora/Sora-SemiBold.woff2
new file mode 100644
index 00000000..fccedb13
Binary files /dev/null and b/docs/stylesheets/fonts/sora/Sora-SemiBold.woff2 differ
diff --git a/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Medium.ttf b/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Medium.ttf
new file mode 100644
index 00000000..198cfe00
Binary files /dev/null and b/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Medium.ttf differ
diff --git a/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Medium.woff2 b/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Medium.woff2
new file mode 100644
index 00000000..49535c12
Binary files /dev/null and b/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Medium.woff2 differ
diff --git a/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Regular.ttf b/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Regular.ttf
new file mode 100644
index 00000000..d24102d4
Binary files /dev/null and b/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Regular.ttf differ
diff --git a/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Regular.woff2 b/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Regular.woff2
new file mode 100644
index 00000000..4424ba75
Binary files /dev/null and b/docs/stylesheets/fonts/spline-sans-mono/SplineSansMono-Regular.woff2 differ
diff --git a/docs/stylesheets/layout.css b/docs/stylesheets/layout.css
new file mode 100644
index 00000000..08588ce6
--- /dev/null
+++ b/docs/stylesheets/layout.css
@@ -0,0 +1,172 @@
+/* Site-specific overrides. stylesheets/extra.css is a verbatim copy of the
+ shared theme and is never edited; everything a page needs on top of it
+ belongs here.
+
+ The first section is the correction set the module documentation sites
+ share, so it stays identical across them and a change to it applies
+ everywhere. Not every rule in it fires on every site, since the sites do not
+ all use the same page furniture; a rule that matches nothing here is still
+ carried so the section stays comparable. Rules that only this site uses go
+ in the second section. */
+
+/* =========================================================
+ Shared across the PROTEUS module documentation sites
+ ========================================================= */
+
+/* Remove underline from links that contain only an image */
+.md-typeset p a:has(> img) {
+ text-decoration: none;
+}
+
+/* Figure captions: justified, full width, slightly smaller */
+.md-typeset figcaption {
+ text-align: justify;
+ max-width: 100%;
+ font-size: 0.85em;
+ line-height: 1.5;
+}
+
+/* Paired light/dark images: show the one matching the active scheme */
+.logo-dark { display: none; }
+[data-md-color-scheme="slate"] .logo-light { display: none; }
+[data-md-color-scheme="slate"] .logo-dark { display: inline; }
+
+/* Modules diagram: size and show light/dark versions based on color scheme.
+ Every module site embeds the same schematic, and the aspect ratio matches
+ its source viewBox, so the box reserved while the SVG loads is the box it
+ ends up occupying. */
+.mod-diagram {
+ width: 100%;
+ height: auto;
+ aspect-ratio: 670 / 509;
+ display: none;
+}
+[data-md-color-scheme="default"] .mod-diagram--light {
+ display: block;
+}
+[data-md-color-scheme="slate"] .mod-diagram--dark {
+ display: block;
+}
+.mod-diagram:focus,
+.mod-diagram:focus-visible {
+ outline: none !important;
+}
+
+/* Grid cards: make the last paragraph in each card stick to the bottom of the card */
+.md-typeset .grid.cards > ul > li {
+ display: flex;
+ flex-direction: column;
+}
+
+.md-typeset .grid.cards > ul > li > p:last-child {
+ margin-top: auto;
+}
+
+/* Active top tab: magma underline (the theme targets a link class that
+ this template does not emit, so the marker is set on the item) */
+.md-tabs__item--active {
+ border-bottom-color: var(--pt-magma);
+}
+
+/* Headings that follow an explicit horizontal rule keep the rule as their
+ only separator instead of doubling it with the heading border */
+.md-typeset hr + h2 {
+ border-top: none;
+ padding-top: 0;
+}
+
+/* Admonitions: tint the box with its signal color (set directly, since the
+ theme hardcodes its own background on the admonition element) */
+.md-typeset .admonition.note,
+.md-typeset details.note,
+.md-typeset .admonition.info,
+.md-typeset details.info {
+ --md-admonition-bg-color: rgba(27, 111, 168, 0.10);
+ background-color: rgba(27, 111, 168, 0.10);
+}
+
+.md-typeset .note > .admonition-title::before,
+.md-typeset .note > summary::before,
+.md-typeset .info > .admonition-title::before,
+.md-typeset .info > summary::before {
+ background-color: #1B6FA8;
+}
+
+/* the fold chevron of collapsible admonitions draws in currentColor */
+.md-typeset .note > summary::after,
+.md-typeset .info > summary::after {
+ color: #1B6FA8;
+}
+
+.md-typeset .admonition.warning,
+.md-typeset details.warning,
+.md-typeset .admonition.danger,
+.md-typeset details.danger {
+ --md-admonition-bg-color: rgba(226, 61, 40, 0.10);
+ background-color: rgba(226, 61, 40, 0.10);
+}
+
+.md-typeset .warning > .admonition-title::before,
+.md-typeset .warning > summary::before,
+.md-typeset .danger > .admonition-title::before,
+.md-typeset .danger > summary::before {
+ background-color: #E23D28;
+}
+
+.md-typeset .warning > summary::after,
+.md-typeset .danger > summary::after {
+ color: #E23D28;
+}
+
+/* Table headers containing math keep normal typography: the tracked
+ uppercase mono header style would mangle symbols and units */
+.md-typeset table:not([class]) th:has(.arithmatex, mjx-container) {
+ font-family: inherit;
+ font-size: inherit;
+ letter-spacing: normal;
+ text-transform: none;
+}
+
+/* Primary buttons: the dark scheme reuses the primary color as the page
+ background, so the pill inverts to the light foreground tone there. */
+[data-md-color-scheme="slate"] .md-typeset .md-button--primary {
+ background-color: var(--md-primary-bg-color);
+ border-color: var(--md-primary-bg-color);
+ color: var(--pt-void);
+}
+[data-md-color-scheme="slate"] .md-typeset .md-button--primary:hover,
+[data-md-color-scheme="slate"] .md-typeset .md-button--primary:focus {
+ background-color: var(--pt-ice);
+ border-color: var(--pt-ice);
+ color: var(--pt-void);
+}
+
+/* Footer: no underline on copyright and meta links */
+.md-footer-copyright a,
+.md-footer-meta a {
+ text-decoration: none !important;
+}
+
+/* Front-page subtitle: the line under the module name, a size down and in the
+ muted foreground so it reads as a caption rather than a second heading */
+.md-typeset .subtitle {
+ font-size: 1.0rem;
+ color: var(--md-default-fg-color--light);
+ margin-top: -0.1rem;
+}
+
+/* Header title doubles as a home link (see javascripts/header-links.js) */
+.md-header__title[data-md-component="header-title"] {
+ cursor: pointer;
+ transition: opacity 0.15s ease;
+}
+
+.md-header__title[data-md-component="header-title"]:hover {
+ opacity: 0.7;
+}
+
+/* =========================================================
+ SPIDER
+ ========================================================= */
+
+/* Nothing here yet: this site needs no rules beyond the shared set above. */
diff --git a/docs/stylesheets/proteus_theme.css b/docs/stylesheets/proteus_theme.css
deleted file mode 100644
index 83c5b8f0..00000000
--- a/docs/stylesheets/proteus_theme.css
+++ /dev/null
@@ -1,250 +0,0 @@
-/* =========================================================
- PROTEUS theme variables
- ========================================================= */
-
-/* Be careful when changing these, as they affect multiple elements across the site. */
-
-[data-md-color-scheme="default"],
-[data-md-color-scheme="slate"] {
- --md-primary-fg-color: #1c2b4b;
- --md-primary-fg-color--light: #2a3d69;
- --md-primary-fg-color--dark: #14203a;
-
- --proteus-highlight-color: #ff6e40;
- --proteus-highlight-bg-soft: rgba(255, 109, 64, 0.093);
-
- --md-accent-fg-color: var(--proteus-highlight-color);
-
- --md-typeset-a-color: #3b6193;
-}
-
-/* Softer slate background + more muted link color */
-[data-md-color-scheme="slate"] {
- --md-default-bg-color: #0f172ad2;
- --md-default-bg-color--light: #1e293b;
- --md-default-bg-color--lighter: #334155;
- --md-default-bg-color--lightest: #475569;
-
- --md-typeset-a-color: #8fa8c9;
-}
-
-/* =========================================================
- Header + tabs
- ========================================================= */
-
-[data-md-color-scheme="default"] .md-header,
-[data-md-color-scheme="default"] .md-tabs,
-[data-md-color-scheme="slate"] .md-header,
-[data-md-color-scheme="slate"] .md-tabs {
- background-color: var(--md-primary-fg-color);
-}
-
-[data-md-color-scheme="default"] .md-header *,
-[data-md-color-scheme="default"] .md-tabs *,
-[data-md-color-scheme="slate"] .md-header *,
-[data-md-color-scheme="slate"] .md-tabs * {
- color: #fff !important;
- fill: #fff !important;
-}
-
-/* =========================================================
- Expanded search
- ========================================================= */
-
-[data-md-color-scheme="default"] .md-search__form,
-[data-md-color-scheme="slate"] .md-search__form {
- background-color: rgba(255, 255, 255, 0.12) !important;
- border-radius: 0.2rem !important;
- box-shadow: none !important;
-}
-
-[data-md-color-scheme="default"] .md-search__form:hover,
-[data-md-color-scheme="default"] .md-search__form:focus-within,
-[data-md-color-scheme="slate"] .md-search__form:hover,
-[data-md-color-scheme="slate"] .md-search__form:focus-within {
- background-color: rgba(255, 255, 255, 0.16) !important;
-}
-
-[data-md-color-scheme="default"] .md-search__input,
-[data-md-color-scheme="slate"] .md-search__input {
- color: #fff !important;
- -webkit-text-fill-color: #fff !important;
- caret-color: #fff !important;
- background: transparent !important;
- -webkit-appearance: none;
- appearance: none;
-}
-
-[data-md-color-scheme="default"] .md-search__input::placeholder,
-[data-md-color-scheme="slate"] .md-search__input::placeholder {
- color: rgba(255, 255, 255, 0.75) !important;
- -webkit-text-fill-color: rgba(255, 255, 255, 0.75) !important;
- opacity: 1 !important;
-}
-
-/* Hide browser-native search decorations */
-.md-search__input::-webkit-search-decoration,
-.md-search__input::-webkit-search-cancel-button,
-.md-search__input::-webkit-search-results-button,
-.md-search__input::-webkit-search-results-decoration {
- -webkit-appearance: none;
- appearance: none;
- display: none;
-}
-
-/* Expanded search icons */
-[data-md-color-scheme="default"] .md-search__icon,
-[data-md-color-scheme="default"] .md-search__icon svg,
-[data-md-color-scheme="default"] .md-search__icon svg *,
-[data-md-color-scheme="default"] .md-search__label,
-[data-md-color-scheme="default"] .md-search__label svg,
-[data-md-color-scheme="default"] .md-search__label svg *,
-[data-md-color-scheme="slate"] .md-search__icon,
-[data-md-color-scheme="slate"] .md-search__icon svg,
-[data-md-color-scheme="slate"] .md-search__icon svg *,
-[data-md-color-scheme="slate"] .md-search__label,
-[data-md-color-scheme="slate"] .md-search__label svg,
-[data-md-color-scheme="slate"] .md-search__label svg * {
- color: #fff !important;
- fill: #fff !important;
- stroke: #fff !important;
- opacity: 1 !important;
-}
-
-/* =========================================================
- Collapsed search trigger in header
- ========================================================= */
-
-[data-md-color-scheme="default"] .md-search__button,
-[data-md-color-scheme="slate"] .md-search__button {
- color: #fff !important;
- background-color: rgba(255, 255, 255, 0.12) !important;
- border-radius: 0.6rem !important;
-}
-
-[data-md-color-scheme="default"] .md-search__button:hover,
-[data-md-color-scheme="default"] .md-search__button:focus,
-[data-md-color-scheme="slate"] .md-search__button:hover,
-[data-md-color-scheme="slate"] .md-search__button:focus {
- background-color: rgba(255, 255, 255, 0.16) !important;
-}
-
-/* Collapsed magnifier */
-[data-md-color-scheme="default"] .md-search__button::before,
-[data-md-color-scheme="slate"] .md-search__button::before {
- color: #fff !important;
- -webkit-text-fill-color: #fff !important;
- filter: brightness(0) invert(1) !important;
- opacity: 1 !important;
-}
-
-/* If an inner SVG is used in some states */
-[data-md-color-scheme="default"] .md-search__button svg,
-[data-md-color-scheme="default"] .md-search__button svg *,
-[data-md-color-scheme="slate"] .md-search__button svg,
-[data-md-color-scheme="slate"] .md-search__button svg * {
- fill: #fff !important;
- stroke: #fff !important;
- color: #fff !important;
-}
-
-/* Shortcut badge */
-[data-md-color-scheme="default"] .md-search__button kbd,
-[data-md-color-scheme="default"] .md-search__button .md-search__kbd,
-[data-md-color-scheme="slate"] .md-search__button kbd,
-[data-md-color-scheme="slate"] .md-search__button .md-search__kbd {
- color: rgba(255, 255, 255, 0.9) !important;
- background-color: rgba(255, 255, 255, 0.18) !important;
- border: none !important;
- box-shadow: none !important;
-}
-
-/* Badge drawn as pseudo-element in some versions */
-[data-md-color-scheme="default"] .md-search__button::after,
-[data-md-color-scheme="slate"] .md-search__button::after {
- background-color: rgba(255, 255, 255, 0.12) !important;
- border: none !important;
- box-shadow: none !important;
- color: rgba(255, 255, 255, 0.9) !important;
-}
-
-/* =========================================================
- Top tabs
- ========================================================= */
-
-/* All tab labels white by default */
-[data-md-color-scheme="default"] .md-tabs__link,
-[data-md-color-scheme="slate"] .md-tabs__link {
- color: #fff !important;
- opacity: 0.9 !important;
- transition: color 0.15s ease, opacity 0.15s ease !important;
-}
-
-/* Hover state */
-[data-md-color-scheme="default"] .md-tabs__link:hover,
-[data-md-color-scheme="slate"] .md-tabs__link:hover {
- color: var(--proteus-highlight-color) !important;
- opacity: 0.8 !important;
-}
-
-/* Active tab text only, no underline */
-[data-md-color-scheme="default"] .md-tabs__item--active,
-[data-md-color-scheme="default"] .md-tabs__link--active,
-[data-md-color-scheme="default"] .md-tabs__item--active .md-tabs__link,
-[data-md-color-scheme="slate"] .md-tabs__item--active,
-[data-md-color-scheme="slate"] .md-tabs__link--active,
-[data-md-color-scheme="slate"] .md-tabs__item--active .md-tabs__link {
- color: var(--proteus-highlight-color) !important;
- box-shadow: none !important;
- border-bottom: none !important;
- text-decoration: none !important;
-}
-
-/* Remove any underline/pseudo-element indicator */
-[data-md-color-scheme="default"] .md-tabs__item--active::after,
-[data-md-color-scheme="default"] .md-tabs__link--active::after,
-[data-md-color-scheme="default"] .md-tabs__item--active .md-tabs__link::after,
-[data-md-color-scheme="slate"] .md-tabs__item--active::after,
-[data-md-color-scheme="slate"] .md-tabs__link--active::after,
-[data-md-color-scheme="slate"] .md-tabs__item--active .md-tabs__link::after {
- content: none !important;
- display: none !important;
- background: none !important;
-}
-
-/* =========================================================
- Sidebar navigation
- ========================================================= */
-
-/* Style only active leaf page links */
-[data-md-color-scheme="default"] .md-nav__item .md-nav__link--active:not(.md-nav__link--passed),
-[data-md-color-scheme="slate"] .md-nav__item .md-nav__link--active:not(.md-nav__link--passed) {
- background-color: var(--proteus-highlight-bg-soft) !important;
- border-radius: 1rem !important;
- color: var(--proteus-highlight-color) !important;
- padding-left: 1rem;
- padding-right: 1rem;
-}
-
-/* =========================================================
- Footer
- ========================================================= */
-
-/* Remove underline from footer copyright link */
-.md-footer-copyright a,
-.md-footer-meta a {
- text-decoration: none !important;
-}
-
-/* =========================================================
- Make header title look clickable and add hover effect
- ========================================================= */
-
-.md-header__title[data-md-component="header-title"] {
- cursor: pointer;
- transition: opacity 0.15s ease !important;
-}
-
-.md-header__title[data-md-component="header-title"]:hover {
- opacity: 0.7 !important;
-}
diff --git a/mkdocs.yml b/mkdocs.yml
index 45603edd..012ed85d 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -94,35 +94,34 @@ theme:
- content.code.copy
- content.tabs.link
- # Default assets (used unless overridden per palette below)
- favicon: assets/PROTEUS_black_on_white_logo_only.png
- logo: assets/PROTEUS_white_on_black.png
+ # Fonts are self-hosted via stylesheets/fonts/fonts.css
+ font: false
+ # Default assets (the header stays dark in both schemes, so one glyph serves both)
+ favicon: assets/favicon.svg
+ logo: assets/glyph_phase_dark.png
+
+ # The toggle icon shows the current mode, matching the project website
palette:
- # Auto: follow system preference (and show a toggle)
- - media: "(prefers-color-scheme: light)"
- scheme: default
+ - media: "(prefers-color-scheme: dark)"
+ scheme: slate
primary: custom
accent: custom
- favicon: assets/PROTEUS_black_on_white_logo_only.png
- logo: assets/PROTEUS_white_on_black.png
toggle:
icon: lucide/moon
- name: Switch to dark mode
+ name: Switch to light mode
- - media: "(prefers-color-scheme: dark)"
- scheme: slate
- primary: black
- accent: deep orange
- favicon: assets/PROTEUS_white_on_black_logo_only.png
- logo: assets/PROTEUS_white_on_black.png
+ - media: "(prefers-color-scheme: light)"
+ scheme: default
+ primary: custom
+ accent: custom
toggle:
icon: lucide/sun
- name: Switch to light mode
+ name: Switch to dark mode
extra_css:
- - stylesheets/proteus_theme.css
- stylesheets/extra.css
+ - stylesheets/layout.css
- stylesheets/footnotes.css
markdown_extensions:
@@ -155,7 +154,7 @@ extra:
link: https://proteus-framework.org/
name: PROTEUS website
- icon: material/email
- link: mailto:proteus_dev@formingworlds.space
+ link: mailto:dev@proteus-framework.org
name: Mail PROTEUS developers
- icon: fontawesome/brands/python
link: https://pypi.org/project/fwl-proteus/