diff --git a/README.md b/README.md index d2c4d774d..28032838e 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,4 @@ SimPaths is an open-source framework for modelling individual and household life SimPaths models currently exist for the UK, Greece, Hungary, Italy, and Poland. This page refers to the UK model; the other European models are available at the corresponding [SimPathsEU](https://github.com/simpaths/SimPathsEU) page. -The entire SimPaths documentation is available on its [website](https://simpaths.github.io/SimPaths/), which includes: a detailed description of its building blocks; instructions on how to set up and run the model; information about contributing to the model's development. \ No newline at end of file +The entire SimPaths documentation is available on its [website](https://simpaths.org/), which includes: a detailed description of its building blocks; instructions on how to set up and run the model; information about contributing to the model's development. \ No newline at end of file diff --git a/documentation/wiki/CNAME b/documentation/wiki/CNAME new file mode 100644 index 000000000..6079d30f0 --- /dev/null +++ b/documentation/wiki/CNAME @@ -0,0 +1 @@ +simpaths.org diff --git a/documentation/wiki/assets/css/extra.css b/documentation/wiki/assets/css/extra.css index 57d1dfbcb..b684ab7fc 100644 --- a/documentation/wiki/assets/css/extra.css +++ b/documentation/wiki/assets/css/extra.css @@ -1,9 +1,9 @@ /* ═══════════════════════════════════════════════ - SimPaths Documentation — Custom Theme - Refined academic aesthetic + SimPaths Documentation — Manuscript Theme + Scholarly palette · Newsreader headings · Inter body ═══════════════════════════════════════════════ */ -/* ── Self-hosted fonts (zero external requests) ── */ +/* ── Self-hosted fonts ── */ @font-face { font-family: "Inter"; src: url("../fonts/Inter.woff2") format("woff2"); @@ -11,6 +11,21 @@ font-display: swap; } +@font-face { + font-family: "Newsreader"; + src: url("../fonts/Newsreader.woff2") format("woff2"); + font-weight: 200 800; + font-display: swap; +} + +@font-face { + font-family: "Newsreader"; + src: url("../fonts/Newsreader-Italic.woff2") format("woff2"); + font-weight: 200 800; + font-style: italic; + font-display: swap; +} + @font-face { font-family: "JetBrains Mono"; src: url("../fonts/JetBrainsMono.woff2") format("woff2"); @@ -21,18 +36,24 @@ :root { --md-text-font: "Inter"; --md-code-font: "JetBrains Mono"; + --sp-heading-font: "Newsreader", Georgia, "Times New Roman", serif; } -/* ── CSS Variables ── */ +/* ── Manuscript Palette ── */ :root { - --sp-primary: #1e3050; - --sp-accent: #2478b5; - --sp-accent-light: #3b9ede; - --sp-accent-bright: #4fb3f0; - --sp-gradient: linear-gradient(135deg, #162540 0%, #1e3358 55%, #1a3550 100%); - --sp-hero-gradient: linear-gradient(135deg, #0f1c34 0%, #1e3358 50%, #163050 100%); - --sp-card-shadow: 0 4px 20px rgba(20,40,70,0.10); - --sp-transition: all 0.2s ease; + --sp-midnight: #2A3848; + --sp-midnight-deep: #1e2c3a; + --sp-crimson: #750003; + --sp-paper: #FAF9F5; + --sp-ghost: #C3C6D5; + --sp-accent: #2478b5; + --sp-accent-light: #3b9ede; + --sp-accent-bright: #4fb3f0; + --sp-gradient: linear-gradient(135deg, #1e2c3a 0%, #2A3848 55%, #243444 100%); + --sp-hero-gradient: linear-gradient(135deg, #1a2636 0%, #2A3848 50%, #243444 100%); + --sp-hairline: linear-gradient(to right, #C3C6D5 0%, #C3C6D5 40%, transparent 100%); + --sp-card-shadow: 0 2px 12px rgba(42,56,72,0.08); + --sp-transition: all 0.2s ease; } /* ═══════════════════════════════════════════════ @@ -40,18 +61,26 @@ ═══════════════════════════════════════════════ */ [data-md-color-primary="custom"] { - --md-primary-fg-color: #1e3050; - --md-primary-fg-color--light: #2a4570; - --md-primary-fg-color--dark: #12203a; - --md-primary-bg-color: #ffffff; - --md-primary-bg-color--light: rgba(255,255,255,0.7); + --md-primary-fg-color: #2A3848; + --md-primary-fg-color--light: #3a4e62; + --md-primary-fg-color--dark: #1e2c3a; + --md-primary-bg-color: var(--sp-paper); + --md-primary-bg-color--light: rgba(250,249,245,0.7); } [data-md-color-accent="custom"] { - --md-accent-fg-color: #2478b5; - --md-accent-fg-color--transparent: rgba(36,120,181,0.1); - --md-accent-bg-color: #ffffff; - --md-accent-bg-color--light: rgba(255,255,255,0.7); + --md-accent-fg-color: var(--sp-crimson); + --md-accent-fg-color--transparent: rgba(117,0,3,0.1); + --md-accent-bg-color: var(--sp-paper); + --md-accent-bg-color--light: rgba(250,249,245,0.7); +} + +/* Paper-white background for the whole page */ +[data-md-color-scheme="default"] { + --md-default-bg-color: var(--sp-paper); + --md-default-bg-color--light: #f4f3ef; + --md-default-bg-color--lighter: #eeeee8; + --md-default-bg-color--lightest:#e6e5e0; } /* ═══════════════════════════════════════════════ @@ -59,15 +88,15 @@ ═══════════════════════════════════════════════ */ [data-md-color-scheme="slate"] { - --md-default-bg-color: #111c2e; - --md-default-bg-color--light: #1a2940; - --md-default-bg-color--lighter: #223450; - --md-default-bg-color--lightest:#2c3f5c; - --md-code-bg-color: #1a2940; - --md-default-fg-color: rgba(255,255,255,0.92); - --md-default-fg-color--light: rgba(255,255,255,0.72); - --md-default-fg-color--lighter: rgba(255,255,255,0.48); - --md-default-fg-color--lightest:rgba(255,255,255,0.14); + --md-default-bg-color: #141e2a; + --md-default-bg-color--light: #1a2836; + --md-default-bg-color--lighter: #223444; + --md-default-bg-color--lightest:#2c3f54; + --md-code-bg-color: #1a2836; + --md-default-fg-color: rgba(250,249,245,0.92); + --md-default-fg-color--light: rgba(250,249,245,0.72); + --md-default-fg-color--lighter: rgba(250,249,245,0.48); + --md-default-fg-color--lightest:rgba(250,249,245,0.14); } [data-md-color-scheme="slate"] .md-typeset a { @@ -88,24 +117,20 @@ } [data-md-color-scheme="slate"] .md-typeset .feature-card { - background: #1a2940; - border-color: rgba(255,255,255,0.06); + background: #1a2836; + border-color: rgba(250,249,245,0.06); } [data-md-color-scheme="slate"] .md-typeset .feature-card a { color: #5cb8f0 !important; } -[data-md-color-scheme="slate"] .md-typeset .hero { - background: linear-gradient(135deg, #0c1624 0%, #162845 50%, #103048 100%); -} - [data-md-color-scheme="slate"] .md-typeset .country-tag { - background: rgba(255,255,255,0.08); - color: rgba(255,255,255,0.78); + background: rgba(250,249,245,0.08); + color: rgba(250,249,245,0.78); } [data-md-color-scheme="slate"] .md-typeset table:not([class]) th { - background: #1e3050; + background: #2A3848; } [data-md-color-scheme="slate"] .md-typeset .highlight { @@ -113,7 +138,7 @@ } [data-md-color-scheme="slate"] .md-typeset blockquote { - background: rgba(36,120,181,0.08); + background: rgba(42,56,72,0.2); } /* ═══════════════════════════════════════════════ @@ -128,8 +153,8 @@ } .md-typeset a:not(.md-button):not(.headerlink):not(.md-nav__link):not(.card-link):hover { - color: var(--sp-primary); - border-bottom-color: var(--sp-primary); + color: var(--sp-crimson); + border-bottom-color: var(--sp-crimson); } [data-md-color-scheme="slate"] .md-typeset a:not(.md-button):not(.headerlink):not(.md-nav__link):not(.card-link):hover { @@ -143,38 +168,28 @@ .md-header { background: var(--sp-gradient) !important; - box-shadow: 0 1px 0 rgba(255,255,255,0.06), 0 4px 20px rgba(10,20,40,0.4); + box-shadow: 0 1px 0 rgba(250,249,245,0.06), 0 4px 20px rgba(10,20,40,0.4); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); height: 3rem; } -/* ── Logo ── */ +/* ── Logo — hidden for clean typographic header ── */ .md-header__button.md-logo { - padding: 0.3rem 0.4rem; - margin-right: 0.1rem; + display: none !important; } -.md-header__button.md-logo img { - width: 26px; - height: 26px; - filter: drop-shadow(0 0 6px rgba(126,206,244,0.55)) drop-shadow(0 0 14px rgba(79,179,240,0.25)); - transition: filter 0.3s ease; -} - -.md-header__button.md-logo:hover img { - filter: drop-shadow(0 0 9px rgba(126,206,244,0.8)) drop-shadow(0 0 22px rgba(79,179,240,0.4)); -} - -/* ── Header title ── */ +/* ── Header title — Newsreader ── */ .md-header__title { - font-size: 0.88rem !important; - font-weight: 600 !important; - letter-spacing: -0.01em; + font-family: var(--sp-heading-font) !important; + font-size: 0.92rem !important; + font-weight: 400 !important; + letter-spacing: 0.01em; } .md-header__title .md-header__topic { align-items: center; + font-weight: 400 !important; } /* ── Tab bar ── */ @@ -182,8 +197,8 @@ background: rgba(8,16,32,0.45) !important; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); - border-top: 1px solid rgba(255,255,255,0.06); - border-bottom: 1px solid rgba(255,255,255,0.04); + border-top: 1px solid rgba(250,249,245,0.06); + border-bottom: 1px solid rgba(250,249,245,0.04); } .md-tabs__link { @@ -198,7 +213,7 @@ opacity: 0.95; } -/* ── Tab underline via the parent item (::after on .md-tabs__item) ── */ +/* ── Tab underline ── */ .md-tabs .md-tabs__list .md-tabs__item { position: relative !important; } @@ -209,9 +224,9 @@ bottom: 0; left: 50%; width: 0; - height: 3px; + height: 2px; background: var(--sp-accent-bright, #4fb3f0); - border-radius: 3px; + border-radius: 2px; transition: width 0.25s cubic-bezier(0.22,1,0.36,1), left 0.25s cubic-bezier(0.22,1,0.36,1); } @@ -236,17 +251,18 @@ ═══════════════════════════════════════════════ */ .md-nav__title { + font-family: var(--sp-heading-font) !important; font-weight: 600; - font-size: 0.68rem; + font-size: 0.7rem; letter-spacing: 0.06em; text-transform: uppercase; - color: var(--sp-accent) !important; + color: var(--sp-midnight) !important; padding-bottom: 0.25rem; } .md-nav__item--active > .md-nav__link { font-weight: 600; - color: var(--sp-accent) !important; + color: var(--sp-crimson) !important; } .md-nav__link { @@ -260,44 +276,69 @@ .md-typeset { font-size: 0.82rem; - line-height: 1.6; + line-height: 1.65; } +/* ── Headings — Newsreader ── */ .md-typeset h1 { - font-weight: 600; - font-size: 1.45rem; - letter-spacing: -0.015em; - color: var(--sp-primary); - border-bottom: 2px solid transparent; - border-image: var(--sp-gradient) 1; + font-family: var(--sp-heading-font) !important; + font-weight: 500; + font-size: 1.55rem; + letter-spacing: -0.01em; + color: var(--sp-midnight); + border-bottom: none; padding-bottom: 0.3rem; margin-bottom: 0.8rem; + position: relative; +} + +/* Hairline under h1 — the gradient fade */ +.md-typeset h1::after { + content: ''; + display: block; + height: 0.5px; + margin-top: 0.4rem; + background: var(--sp-hairline); } .md-typeset h2 { - font-weight: 600; - font-size: 1.25rem; - letter-spacing: -0.01em; - margin-top: 1.4rem; - margin-bottom: 0.45rem; - color: var(--sp-primary); + font-family: var(--sp-heading-font) !important; + font-weight: 500; + font-size: 1.3rem; + letter-spacing: -0.005em; + margin-top: 1.6rem; + margin-bottom: 0.5rem; + color: var(--sp-midnight); } .md-typeset h3 { - font-weight: 600; + font-family: var(--sp-heading-font) !important; + font-weight: 500; font-size: 1.1rem; - margin-top: 1rem; + margin-top: 1.1rem; margin-bottom: 0.3rem; - color: var(--sp-primary); + color: var(--sp-midnight); +} + +.md-typeset h4 { + font-family: var(--sp-heading-font) !important; + font-weight: 600; + font-size: 0.95rem; + color: var(--sp-midnight); } [data-md-color-scheme="slate"] .md-typeset h1, [data-md-color-scheme="slate"] .md-typeset h2, -[data-md-color-scheme="slate"] .md-typeset h3 { - color: #a8c8e8; +[data-md-color-scheme="slate"] .md-typeset h3, +[data-md-color-scheme="slate"] .md-typeset h4 { + color: #c8d8e8; +} + +[data-md-color-scheme="slate"] .md-typeset h1::after { + background: linear-gradient(to right, rgba(195,198,213,0.3) 0%, rgba(195,198,213,0.3) 40%, transparent 100%); } -/* Paragraph justification */ +/* Paragraph */ .md-typeset p { margin-top: 0; margin-bottom: 0.75em; @@ -306,7 +347,7 @@ -webkit-hyphens: auto; } -/* Tighter list spacing */ +/* Lists */ .md-typeset ul, .md-typeset ol { margin-top: 0.3em; @@ -321,27 +362,43 @@ margin-bottom: 0; } -/* Blockquote */ +/* Blockquote — Newsreader italic */ .md-typeset blockquote { - border-left: 3px solid var(--sp-accent); - background: rgba(36,120,181,0.05); - border-radius: 0 6px 6px 0; + font-family: var(--sp-heading-font) !important; + border-left: 2px solid var(--sp-ghost); + background: rgba(195,198,213,0.08); + border-radius: 0 4px 4px 0; padding: 0.7rem 1.1rem; margin: 1rem 0; font-style: italic; color: var(--md-default-fg-color--light); } +/* ═══════════════════════════════════════════════ + HAIRLINE DIVIDERS — replace all
+═══════════════════════════════════════════════ */ + +.md-typeset hr { + border: none; + height: 0.5px; + background: var(--sp-hairline); + margin: 1.8rem 0; +} + +[data-md-color-scheme="slate"] .md-typeset hr { + background: linear-gradient(to right, rgba(195,198,213,0.25) 0%, rgba(195,198,213,0.25) 40%, transparent 100%); +} + /* ═══════════════════════════════════════════════ CODE BLOCKS ═══════════════════════════════════════════════ */ .md-typeset code { - border-radius: 4px; + border-radius: 3px; font-size: 0.78em; padding: 0.1em 0.35em; - background: rgba(36,120,181,0.07); - color: #1a5a8a; + background: rgba(42,56,72,0.06); + color: #3a4e62; } [data-md-color-scheme="slate"] .md-typeset code { @@ -358,9 +415,9 @@ } .md-typeset .highlight { - border-radius: 8px !important; + border-radius: 6px !important; overflow: hidden; - box-shadow: 0 1px 10px rgba(0,0,0,0.07); + box-shadow: 0 1px 8px rgba(42,56,72,0.06); margin: 1em 0; } @@ -370,16 +427,40 @@ .md-typeset .admonition, .md-typeset details { - border-radius: 8px !important; - border-left-width: 4px; - box-shadow: 0 1px 8px rgba(0,0,0,0.05); + border-radius: 6px !important; + border-left-width: 3px; + border-left-color: var(--sp-midnight) !important; + box-shadow: 0 1px 6px rgba(42,56,72,0.05); font-size: 0.81rem; } .md-typeset .admonition-title, .md-typeset summary { + font-family: var(--sp-heading-font) !important; font-weight: 600; - font-size: 0.81rem; + font-size: 0.84rem; + background-color: rgba(42,56,72,0.05) !important; +} + +/* Override icon colour for all admonition types */ +.md-typeset .admonition-title::before, +.md-typeset summary::before { + background-color: var(--sp-midnight) !important; +} + +[data-md-color-scheme="slate"] .md-typeset .admonition, +[data-md-color-scheme="slate"] .md-typeset details { + border-left-color: var(--sp-ghost) !important; +} + +[data-md-color-scheme="slate"] .md-typeset .admonition-title, +[data-md-color-scheme="slate"] .md-typeset summary { + background-color: rgba(195,198,213,0.08) !important; +} + +[data-md-color-scheme="slate"] .md-typeset .admonition-title::before, +[data-md-color-scheme="slate"] .md-typeset summary::before { + background-color: var(--sp-ghost) !important; } /* ═══════════════════════════════════════════════ @@ -387,9 +468,9 @@ ═══════════════════════════════════════════════ */ .md-typeset table:not([class]) { - border-radius: 8px; + border-radius: 6px; overflow: hidden; - box-shadow: 0 1px 8px rgba(0,0,0,0.06); + box-shadow: 0 1px 6px rgba(42,56,72,0.05); font-size: 0.84em; width: 100%; border-collapse: separate; @@ -397,16 +478,17 @@ } .md-typeset table:not([class]) th { - background: var(--sp-gradient); - color: #fff; - font-weight: 600; + background: var(--sp-midnight); + color: var(--sp-paper); + font-family: var(--sp-heading-font) !important; + font-weight: 500; letter-spacing: 0.01em; padding: 0.6rem 1rem; } .md-typeset table:not([class]) td { padding: 0.5rem 1rem; - border-bottom: 1px solid var(--md-default-fg-color--lightest); + border-bottom: 0.5px solid var(--sp-ghost); } .md-typeset table:not([class]) tr:last-child td { @@ -414,12 +496,11 @@ } .md-typeset table:not([class]) tr:hover td { - background: rgba(36,120,181,0.04); + background: rgba(42,56,72,0.03); } /* ═══════════════════════════════════════════════ HOMEPAGE WIDTH CONSTRAINT - (nav + toc hidden on index → content goes full-width; cap it) ═══════════════════════════════════════════════ */ .md-content[data-md-component="content"] .md-typeset .hero, @@ -430,81 +511,68 @@ } /* ═══════════════════════════════════════════════ - HERO SECTION (homepage) + HIDE HEADER EXTRAS (GitHub widget, dark mode toggle) ═══════════════════════════════════════════════ */ -.md-typeset .hero { - background: var(--sp-hero-gradient); - border-radius: 14px; - padding: 2.2rem 2.2rem; - margin: 1rem 0 1.5rem; - color: #fff; - position: relative; - overflow: hidden; +/* Hide the GitHub repo source link in header */ +.md-header__source { + display: none !important; } -.md-typeset .hero::before { - content: ''; - position: absolute; - top: -50px; right: -50px; - width: 280px; height: 280px; - background: rgba(255,255,255,0.03); - border-radius: 50%; - pointer-events: none; +/* Hide the dark mode toggle from header — follows system preference */ +.md-header [data-md-component="palette"] { + display: none !important; } -.md-typeset .hero::after { - content: ''; - position: absolute; - bottom: -70px; left: -30px; - width: 220px; height: 220px; - background: rgba(36,120,181,0.08); - border-radius: 50%; - pointer-events: none; +/* ═══════════════════════════════════════════════ + HERO SECTION — Typographic (homepage) + No dark box. Journal cover page aesthetic. +═══════════════════════════════════════════════ */ + +.md-typeset .hero { + background: none; + border-radius: 0; + padding: 2.8rem 0 1.2rem; + margin: 0.5rem 0 0; + color: var(--sp-midnight); + position: relative; + overflow: visible; } -.md-typeset .hero h1 { - color: #fff !important; - font-size: 1.95rem; - font-weight: 600; - margin-bottom: 0.45rem; - line-height: 1.2; +/* ── Hero title — large Newsreader, the centrepiece ── */ +.md-typeset .hero .hero-title { + font-family: var(--sp-heading-font) !important; + color: var(--sp-midnight) !important; + font-size: 3.4rem; + font-weight: 450; + letter-spacing: 0.06em; + margin-bottom: 0.15rem; + line-height: 1.1; border: none; - letter-spacing: -0.02em; } -.md-typeset .hero .tagline { - font-size: 0.88rem; - color: rgba(255,255,255,0.8); - margin-bottom: 1.4rem; - font-weight: 400; - max-width: 100%; - line-height: 1.6; - text-align: left; - hyphens: none; - -webkit-hyphens: none; +/* Remove MkDocs' automatic heading permalink glyphs site-wide */ +.md-typeset .headerlink { + display: none !important; } -/* ── Hero badges ── */ -.md-typeset .hero-badges { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; - margin-bottom: 1.5rem; +/* ── Hairline under hero title ── */ +.md-typeset .hero .hero-title::after { + content: ''; + display: block; + height: 0.5px; + margin-top: 0.6rem; + margin-bottom: 1.2rem; + background: var(--sp-hairline); } -.md-typeset .hero-badge { - background: rgba(255,255,255,0.10); - border: 1px solid rgba(255,255,255,0.18); - border-radius: 999px; - padding: 0.2rem 0.65rem; - font-size: 0.7rem; - color: rgba(255,255,255,0.88); - font-weight: 500; - letter-spacing: 0.01em; +/* ── Hero body text ── */ + +/* ── Hero CTA buttons — on paper background ── */ +.md-typeset .hero .hero-cta { + margin-top: 1.4rem; } -/* ── Hero CTA buttons ── */ .md-typeset .hero-cta { display: flex; gap: 0.7rem; @@ -515,52 +583,88 @@ display: inline-flex; align-items: center; gap: 0.3rem; - border-radius: 7px; - padding: 0.45rem 1rem; + border-radius: 4px; + padding: 0.5rem 1.1rem; font-size: 0.78rem; font-weight: 600; text-decoration: none !important; border-bottom: none !important; transition: var(--sp-transition); - position: relative; - z-index: 1; } .md-typeset .hero-cta .btn-primary { - background: #fff; - color: var(--sp-primary) !important; - box-shadow: 0 2px 10px rgba(0,0,0,0.15); + background: var(--sp-midnight); + color: var(--sp-paper) !important; + box-shadow: 0 2px 8px rgba(42,56,72,0.15); } .md-typeset .hero-cta .btn-primary:hover { - background: #eef4fa; + background: var(--sp-midnight-deep); transform: translateY(-1px); - box-shadow: 0 4px 16px rgba(0,0,0,0.2); + box-shadow: 0 4px 14px rgba(42,56,72,0.25); } -.md-typeset .hero-cta .btn-outline { +.md-typeset .hero-cta .btn-secondary { background: transparent; - color: #fff !important; - border: 1.5px solid rgba(255,255,255,0.4) !important; + color: var(--sp-midnight) !important; + border: 1px solid var(--sp-ghost) !important; } -.md-typeset .hero-cta .btn-outline:hover { - background: rgba(255,255,255,0.1); - border-color: rgba(255,255,255,0.8) !important; +.md-typeset .hero-cta .btn-secondary:hover { + background: rgba(42,56,72,0.04); + border-color: var(--sp-midnight) !important; transform: translateY(-1px); } +/* ── Dark-mode hero ── */ +[data-md-color-scheme="slate"] .md-typeset .hero { + background: none; + color: rgba(250,249,245,0.92); +} + +[data-md-color-scheme="slate"] .md-typeset .hero .hero-title { + color: #c8d8e8 !important; +} + +[data-md-color-scheme="slate"] .md-typeset .hero .hero-title::after { + background: linear-gradient(to right, rgba(195,198,213,0.25) 0%, rgba(195,198,213,0.25) 40%, transparent 100%); +} + +[data-md-color-scheme="slate"] .md-typeset .hero-cta .btn-primary { + background: #c8d8e8; + color: #141e2a !important; +} + +[data-md-color-scheme="slate"] .md-typeset .hero-cta .btn-secondary { + color: #c8d8e8 !important; + border-color: rgba(195,198,213,0.25) !important; +} +[data-md-color-scheme="slate"] .md-typeset .hero-cta .btn-secondary:hover { + background: rgba(195,198,213,0.08); + border-color: rgba(195,198,213,0.5) !important; +} + /* ═══════════════════════════════════════════════ - SECTION HEADING + SECTION HEADINGS (homepage) ═══════════════════════════════════════════════ */ .md-typeset .section-heading { - font-size: 1.25rem; - font-weight: 600; - color: var(--sp-primary); + font-family: var(--sp-heading-font) !important; + font-size: 1.3rem; + font-weight: 500; + color: var(--sp-midnight); margin-bottom: 1.2rem; } +[data-md-color-scheme="slate"] .md-typeset .section-intro, +.md-typeset .section-intro { + max-width: 46rem; + margin: -0.55rem 0 1rem; + color: var(--md-default-fg-color--light); + text-align: left; + hyphens: none; +} + [data-md-color-scheme="slate"] .md-typeset .section-heading { - color: #a8c8e8; + color: #c8d8e8; } /* ═══════════════════════════════════════════════ @@ -574,11 +678,21 @@ margin: 1.2rem 0; } +.md-typeset .card-grid--primary { + grid-template-columns: repeat(2, 1fr); + margin-bottom: 0.85rem; +} + +.md-typeset .card-grid--secondary { + margin-top: 0; +} + .md-typeset a.feature-card { - display: block; + display: flex; + flex-direction: column; background: var(--md-default-bg-color); - border: 1px solid var(--md-default-fg-color--lightest); - border-radius: 12px; + border: 0.5px solid var(--sp-ghost); + border-radius: 8px; padding: 1.4rem 1.4rem 1.2rem; transition: transform 0.25s cubic-bezier(0.22,1,0.36,1), box-shadow 0.25s cubic-bezier(0.22,1,0.36,1), @@ -591,21 +705,26 @@ cursor: pointer; } -/* Gradient top-border reveal on hover */ +.md-typeset a.feature-card.feature-card--primary { + padding: 1.6rem 1.6rem 1.4rem; + min-height: 13.2rem; +} + +/* Crimson top-border reveal on hover */ .md-typeset a.feature-card::before { content: ''; position: absolute; top: 0; left: 0; - width: 100%; height: 3px; - background: var(--sp-gradient); + width: 100%; height: 2px; + background: var(--sp-crimson); opacity: 0; transition: opacity 0.25s ease; } .md-typeset a.feature-card:hover { - transform: translateY(-4px); - box-shadow: 0 8px 30px rgba(20,40,70,0.12), 0 2px 8px rgba(36,120,181,0.08); - border-color: rgba(36,120,181,0.2); + transform: translateY(-3px); + box-shadow: 0 8px 24px rgba(42,56,72,0.10), 0 2px 6px rgba(42,56,72,0.05); + border-color: rgba(42,56,72,0.2); } .md-typeset a.feature-card:hover::before { @@ -614,9 +733,9 @@ /* ── Icon containers ── */ .md-typeset .card-icon-wrap { - width: 42px; - height: 42px; - border-radius: 10px; + width: 40px; + height: 40px; + border-radius: 8px; display: flex; align-items: center; justify-content: center; @@ -625,7 +744,7 @@ } .md-typeset a.feature-card:hover .card-icon-wrap { - transform: scale(1.08); + transform: scale(1.06); } .md-typeset .card-icon-wrap svg { @@ -633,24 +752,32 @@ height: 20px; } -/* Per-card icon colours */ -.card-icon--overview { background: rgba(36,120,181,0.10); color: #2478b5; } -.card-icon--start { background: rgba(16,163,100,0.10); color: #10a364; } -.card-icon--user { background: rgba(139,92,214,0.10); color: #8b5cd6; } -.card-icon--dev { background: rgba(220,120,30,0.10); color: #dc781e; } -.card-icon--ref { background: rgba(36,120,181,0.10); color: #1e6ca8; } -.card-icon--research { background: rgba(200,60,80,0.10); color: #c83c50; } +/* Per-card icon colours — muted, scholarly tones */ +.card-icon--overview { background: rgba(42,56,72,0.08); color: #2A3848; } +.card-icon--docs { background: rgba(42,86,72,0.08); color: #2a5648; } +.card-icon--start { background: rgba(74,98,103,0.08); color: #4a6267; } +.card-icon--user { background: rgba(95,86,104,0.08); color: #5f5668; } +.card-icon--dev { background: rgba(112,95,74,0.08); color: #705f4a; } +.card-icon--ref { background: rgba(42,56,72,0.08); color: #2A3848; } +.card-icon--research { background: rgba(117,0,3,0.07); color: var(--sp-crimson); } +.card-icon--funding { background: rgba(122,95,32,0.08); color: #7a5f20; } /* ── Card text ── */ .md-typeset a.feature-card h3 { - font-size: 0.88rem !important; - font-weight: 600; + font-family: var(--sp-heading-font) !important; + font-size: 0.92rem !important; + font-weight: 500; margin: 0 0 0.3rem !important; padding: 0 !important; color: var(--md-default-fg-color) !important; border: none !important; } +.md-typeset a.feature-card.feature-card--primary h3 { + font-size: 1.1rem !important; + margin-bottom: 0.35rem !important; +} + .md-typeset a.feature-card p { font-size: 0.73rem; color: var(--md-default-fg-color--light); @@ -659,50 +786,276 @@ text-align: left; } +.md-typeset a.feature-card.feature-card--primary p { + font-size: 0.78rem; + line-height: 1.6; +} + .md-typeset a.feature-card .card-link { font-size: 0.72rem; font-weight: 600; - color: var(--sp-accent); + color: var(--sp-crimson); display: inline-flex; align-items: center; gap: 0.15rem; transition: gap 0.2s ease, color 0.15s ease; + margin-top: auto; } .md-typeset a.feature-card:hover .card-link { gap: 0.3rem; - color: var(--sp-accent-light); + color: var(--sp-midnight); +} + +/* ═══════════════════════════════════════════════ + DOCUMENTATION LANDING PAGE +═══════════════════════════════════════════════ */ + +.md-typeset .doc-pathways { + display: grid; + gap: 1rem; + margin: 1.1rem 0 1.8rem; +} + +.md-typeset .doc-pathway-lead { + margin: 0 0 1rem; + max-width: 56rem; +} + +.md-typeset .doc-pathway-lead p { + margin: 0; + font-size: 0.79rem; + line-height: 1.65; + text-align: left; + hyphens: none; +} + +.md-typeset .doc-pathway-lead p + p { + margin-top: 0.22rem; +} + +.md-typeset .doc-pathway { + --doc-pathway-accent: var(--sp-crimson); + position: relative; + background: rgba(255,255,255,0.62); + border: 0.5px solid rgba(42,56,72,0.12); + border-radius: 14px; + padding: 1.1rem 1.2rem 1rem; + box-shadow: 0 3px 16px rgba(42,56,72,0.06); + overflow: hidden; +} + +.md-typeset .doc-pathway::before { + content: ""; + position: absolute; + inset: 0 auto 0 0; + width: 5px; + background: var(--doc-pathway-accent); + pointer-events: none; +} + +.md-typeset .doc-pathway::after { + content: none; +} + +.md-typeset .doc-pathway--setup { + --doc-pathway-accent: #4a6267; +} + +.md-typeset .doc-pathway--user { + --doc-pathway-accent: #5f5668; +} + +.md-typeset .doc-pathway--dev { + --doc-pathway-accent: #705f4a; +} + +.md-typeset .doc-pathway-intro { + display: grid; + grid-template-columns: auto 1fr; + gap: 0.9rem; + align-items: start; + margin-bottom: 0.95rem; +} + +.md-typeset .doc-pathway-kicker { + margin: 0 0 0.2rem; + font-size: 0.66rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--doc-pathway-accent); +} + +.md-typeset .doc-pathway h2 { + margin: 0 0 0.25rem; + font-size: 1.12rem; +} + +.md-typeset .doc-pathway-intro p:last-child { + margin: 0; + font-size: 0.76rem; + line-height: 1.62; + color: var(--md-default-fg-color--light); + text-align: left; + hyphens: none; +} + +.md-typeset .doc-pathway .card-icon-wrap { + width: 44px; + height: 44px; + margin-bottom: 0; + border-radius: 12px; +} + +.md-typeset .doc-pathway-steps { + counter-reset: pathway-step; + list-style: none; + display: flex; + flex-wrap: wrap; + gap: 0.8rem; + align-items: center; + margin: 0 0 0.85rem; + padding: 0; +} + +.md-typeset .doc-pathway-steps li { + counter-increment: pathway-step; + display: flex; + align-items: center; +} + +.md-typeset .doc-pathway-steps li:not(:last-child)::after { + content: none; +} + +.md-typeset .doc-pathway-steps li + li::before { + content: "→"; + margin-right: 0.8rem; + color: rgba(42,56,72,0.42); + font-weight: 700; +} + +.md-typeset .doc-pathway-steps a { + display: inline-flex; + align-items: center; + gap: 0.55rem; + padding: 0.48rem 0.82rem; + border-radius: 999px; + border: 1px solid rgba(42,56,72,0.1); + background: rgba(250,249,245,0.9); + color: var(--sp-midnight); + font-size: 0.75rem; + font-weight: 600; + line-height: 1.25; + text-decoration: none; + box-shadow: 0 1px 8px rgba(42,56,72,0.04); + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.md-typeset .doc-pathway-steps a::before { + content: counter(pathway-step); + display: inline-grid; + place-items: center; + width: 1.4rem; + height: 1.4rem; + border-radius: 999px; + background: rgba(42,56,72,0.08); + color: var(--sp-midnight); + font-size: 0.66rem; + font-weight: 700; + flex: 0 0 auto; +} + +.md-typeset .doc-pathway-steps a:hover { + transform: translateY(-1px); + border-color: rgba(42,56,72,0.18); + box-shadow: 0 4px 14px rgba(42,56,72,0.08); +} + +.md-typeset .doc-pathway-link { + display: inline-flex; + align-items: center; + gap: 0.25rem; + font-size: 0.74rem; + font-weight: 700; + color: var(--doc-pathway-accent); + text-decoration: none; +} + +.md-typeset .doc-pathway-link:hover { + gap: 0.38rem; +} + +[data-md-color-scheme="slate"] .md-typeset .doc-pathway { + background: rgba(26,40,54,0.9); + border-color: rgba(250,249,245,0.08); + box-shadow: 0 2px 16px rgba(0,0,0,0.2); +} + +[data-md-color-scheme="slate"] .md-typeset .doc-pathway-steps li + li::before { + color: rgba(195,198,213,0.45); +} + +[data-md-color-scheme="slate"] .md-typeset .doc-pathway-steps a { + background: rgba(20,30,42,0.88); + border-color: rgba(195,198,213,0.09); + color: #d7e3ef; +} + +[data-md-color-scheme="slate"] .md-typeset .doc-pathway-steps a::before { + background: rgba(195,198,213,0.09); + color: #d7e3ef; } /* ── Dark-mode card overrides ── */ [data-md-color-scheme="slate"] .md-typeset a.feature-card { - background: #1a2940; - border-color: rgba(255,255,255,0.06); + background: #1a2836; + border-color: rgba(195,198,213,0.1); } [data-md-color-scheme="slate"] .md-typeset a.feature-card:hover { - border-color: rgba(92,184,240,0.2); - box-shadow: 0 8px 30px rgba(0,0,0,0.25), 0 0 15px rgba(36,120,181,0.08); + border-color: rgba(195,198,213,0.2); + box-shadow: 0 8px 24px rgba(0,0,0,0.25), 0 0 12px rgba(42,56,72,0.08); } [data-md-color-scheme="slate"] .md-typeset a.feature-card .card-link { color: #5cb8f0; } -[data-md-color-scheme="slate"] .card-icon--overview { background: rgba(36,120,181,0.15); color: #5cb8f0; } -[data-md-color-scheme="slate"] .card-icon--start { background: rgba(16,163,100,0.15); color: #34d399; } -[data-md-color-scheme="slate"] .card-icon--user { background: rgba(139,92,214,0.15); color: #a78bfa; } -[data-md-color-scheme="slate"] .card-icon--dev { background: rgba(220,120,30,0.15); color: #f0a050; } -[data-md-color-scheme="slate"] .card-icon--ref { background: rgba(36,120,181,0.15); color: #7cc4f0; } -[data-md-color-scheme="slate"] .card-icon--research { background: rgba(200,60,80,0.15); color: #f06080; } +[data-md-color-scheme="slate"] .card-icon--overview { background: rgba(195,198,213,0.1); color: #a0b0c4; } +[data-md-color-scheme="slate"] .card-icon--docs { background: rgba(16,163,100,0.12); color: #34d399; } +[data-md-color-scheme="slate"] .card-icon--start { background: rgba(146,172,177,0.12); color: #a8c0c4; } +[data-md-color-scheme="slate"] .card-icon--user { background: rgba(164,154,177,0.12); color: #b7adc7; } +[data-md-color-scheme="slate"] .card-icon--dev { background: rgba(182,164,140,0.12); color: #c4b194; } +[data-md-color-scheme="slate"] .card-icon--ref { background: rgba(195,198,213,0.1); color: #a0b0c4; } +[data-md-color-scheme="slate"] .card-icon--research { background: rgba(200,60,80,0.12); color: #f06080; } +[data-md-color-scheme="slate"] .card-icon--funding { background: rgba(242,193,92,0.12); color: #f2c15c; } /* ── Responsive ── */ @media (max-width: 700px) { + .md-typeset .card-grid--primary, .md-typeset .card-grid { grid-template-columns: repeat(2, 1fr); } + + .md-typeset .doc-pathway-intro { + grid-template-columns: 1fr; + gap: 0.7rem; + } + + .md-typeset .doc-pathway-steps { + flex-direction: column; + align-items: stretch; + gap: 0.55rem; + } + + .md-typeset .doc-pathway-steps li + li::before { + content: none; + } } @media (max-width: 420px) { + .md-typeset .card-grid--primary, .md-typeset .card-grid { grid-template-columns: 1fr; } @@ -720,50 +1073,223 @@ } .md-typeset .country-tag { - background: #eef4fa; - color: #1e3050; - border-radius: 6px; + background: rgba(42,56,72,0.05); + color: var(--sp-midnight); + border: 0.5px solid var(--sp-ghost); + border-radius: 4px; padding: 0.2rem 0.6rem; font-size: 0.73rem; font-weight: 500; } /* ═══════════════════════════════════════════════ - FOOTER + FOOTER — Stitch-inspired editorial footer ═══════════════════════════════════════════════ */ .md-footer { - background: #12203a; + background: var(--sp-paper); + color: var(--sp-midnight); + border-top: 0.5px solid var(--sp-ghost); } .md-footer-meta { - background: rgba(0,0,0,0.18); + background: transparent; + padding-top: 0.55rem; + padding-bottom: 0.75rem; +} + +.md-footer-meta__inner { + display: flex !important; + flex-wrap: nowrap !important; + justify-content: space-between; + align-items: center; +} + +/* ── Copyright block — brand + line ── */ +.md-copyright { + color: var(--sp-midnight); + max-width: none; + width: auto; + /* Hide bare "Made with" text node + link via visibility trick */ + visibility: hidden; + overflow: hidden; +} + +/* Hide "Made with Material for MkDocs" link */ +.md-copyright > a { + display: none !important; +} + +/* Show the actual copyright content */ +.md-copyright__highlight { + visibility: visible; + display: block; + font-size: 0.6rem; + font-weight: 500; + letter-spacing: 0.125em; + text-transform: uppercase; + line-height: 1.35; + color: var(--sp-midnight) !important; +} + +/* SimPaths brand name in footer */ +.md-copyright .footer-brand { + font-family: var(--sp-heading-font) !important; + font-size: 1.1rem; + font-weight: 500; + font-style: italic; + letter-spacing: 0.02em; + text-transform: none; + color: var(--sp-midnight) !important; + display: block; + line-height: 1.1; + margin-bottom: 0.05rem; + visibility: visible; +} + +/* ── Social links — text labels instead of icons ── */ +.md-social { + display: flex !important; + gap: 2.5rem; + align-items: center; + padding: 0 !important; +} + +.md-social__link { + display: inline-flex !important; + align-items: center; + width: auto !important; + height: auto !important; + white-space: nowrap; +} + +/* Hide the SVG icons */ +.md-social__link svg { + display: none !important; +} + +/* Show link name as text */ +.md-social__link::after { + content: attr(title); + font-family: "Inter", var(--md-text-font) !important; + font-size: 0.6rem; + font-weight: 600; + letter-spacing: 0.15em; + color: var(--sp-ghost); + transition: color 0.15s ease; + white-space: nowrap; +} + +.md-social__link:hover::after { + color: var(--sp-midnight); +} + +/* ── Prev/Next navigation links ── */ +.md-footer__inner { + background: var(--sp-paper); + border-top: 0.5px solid var(--sp-ghost); + padding-top: 0.3rem !important; + padding-bottom: 0.3rem !important; + min-height: 0 !important; } .md-footer__link { - opacity: 0.75; - transition: opacity 0.12s ease; + color: var(--sp-midnight) !important; + transition: all 0.2s ease; + padding: 0.5rem 1rem !important; + min-height: 0 !important; } + .md-footer__link:hover { + background: rgba(42,56,72,0.03); +} + +.md-footer__link .md-footer__direction { + font-family: "Inter", var(--md-text-font) !important; + font-size: 0.55rem; + font-weight: 700; + letter-spacing: 0.15em; + text-transform: uppercase; + color: var(--sp-crimson); opacity: 1; } +.md-footer__link .md-ellipsis { + font-family: var(--sp-heading-font) !important; + font-size: 1rem; + font-weight: 500; + color: var(--sp-midnight); +} + +.md-footer__link:hover .md-ellipsis { + color: var(--sp-crimson); +} + +.md-footer__link .md-footer__button { + color: var(--sp-midnight); +} + +.md-footer__link:hover .md-footer__button { + color: var(--sp-crimson); +} + +/* ── Dark mode prev/next ── */ +[data-md-color-scheme="slate"] .md-footer__inner { + background: #141e2a; + border-top-color: rgba(195,198,213,0.1); +} + +[data-md-color-scheme="slate"] .md-footer__link .md-ellipsis { + color: #c8d8e8; +} + +[data-md-color-scheme="slate"] .md-footer__link:hover .md-ellipsis, +[data-md-color-scheme="slate"] .md-footer__link:hover .md-footer__button { + color: #5cb8f0; +} + +[data-md-color-scheme="slate"] .md-footer__link .md-footer__button { + color: #c8d8e8; +} + +/* ── Dark mode footer ── */ +[data-md-color-scheme="slate"] .md-footer { + background: #141e2a; + border-top-color: rgba(195,198,213,0.1); +} + +[data-md-color-scheme="slate"] .md-copyright { + color: rgba(195,198,213,0.5); +} + +[data-md-color-scheme="slate"] .md-copyright .footer-brand { + color: #c8d8e8; +} + +[data-md-color-scheme="slate"] .md-social__link::after { + color: rgba(195,198,213,0.3); +} + +[data-md-color-scheme="slate"] .md-social__link:hover::after { + color: #c8d8e8; +} + /* ═══════════════════════════════════════════════ SEARCH ═══════════════════════════════════════════════ */ .md-search__form { border-radius: 20px; - background: rgba(255,255,255,0.08) !important; - border: 1px solid rgba(255,255,255,0.08); + background: rgba(250,249,245,0.08) !important; + border: 1px solid rgba(250,249,245,0.08); transition: background 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease; } .md-search__form:hover { - background: rgba(255,255,255,0.12) !important; - border-color: rgba(255,255,255,0.12); + background: rgba(250,249,245,0.12) !important; + border-color: rgba(250,249,245,0.12); } .md-search__form:focus-within { - background: rgba(255,255,255,0.16) !important; + background: rgba(250,249,245,0.16) !important; border-color: rgba(79,179,240,0.3); box-shadow: 0 0 0 3px rgba(79,179,240,0.08); } @@ -773,7 +1299,7 @@ ═══════════════════════════════════════════════ */ .md-typeset .md-button { - border-radius: 7px; + border-radius: 5px; font-weight: 600; font-size: 0.84rem; transition: var(--sp-transition); @@ -782,7 +1308,7 @@ transform: translateY(-1px); } .md-typeset .md-button--primary { - background: var(--sp-gradient); + background: var(--sp-midnight); border-color: transparent; } @@ -792,9 +1318,289 @@ @media (max-width: 768px) { .md-typeset .hero { - padding: 1.8rem 1.3rem; + padding: 1.8rem 0 1rem; + } + .md-typeset .hero .hero-title { + font-size: 2.4rem; + } + .md-typeset .hero .hero-subtitle { + font-size: 1.05rem; } - .md-typeset .hero h1 { - font-size: 1.6rem; +} + +/* ═══════════════════════════════════════════════ + LATEST RESEARCH — editorial listing (homepage) +═══════════════════════════════════════════════ */ + +.md-typeset .research-section { + max-width: 61rem; +} + +.md-typeset .research-header { + display: flex; + justify-content: space-between; + align-items: baseline; + margin-bottom: 0.6rem; +} + +.md-typeset .research-header .section-heading { + margin-bottom: 0; +} + +.md-typeset .research-intro { + max-width: 46rem; + margin: 0 0 0.85rem; + color: var(--md-default-fg-color--light); + text-align: left; + hyphens: none; +} + +/* ═══════════════════════════════════════════════ + FUNDING PAGE +═══════════════════════════════════════════════ */ + +.md-typeset .funding-page h1::after { + display: none; +} + +.md-typeset .funding-lead { + max-width: 52rem; + margin: -0.2rem 0 1.5rem; + color: var(--md-default-fg-color--light); +} + +.md-typeset .funding-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1.25rem; + margin-top: 1.25rem; +} + +.md-typeset .funding-panel { + background: rgba(255,255,255,0.58); + border: 0.5px solid rgba(42,56,72,0.12); + border-radius: 10px; + padding: 1.1rem 1.2rem 0.4rem; + box-shadow: 0 2px 12px rgba(42,56,72,0.05); +} + +.md-typeset .funding-panel h2 { + margin-top: 0.15rem; + margin-bottom: 0.8rem; +} + +.md-typeset .funding-panel ul { + list-style: none; + margin: 0; + padding: 0; +} + +.md-typeset .funding-list { + list-style: none; + margin: 0; + padding: 0; +} + +.md-typeset .funding-panel li { + margin: 0; + padding: 0.8rem 0; + border-top: 0.5px solid rgba(195,198,213,0.8); +} + +.md-typeset .funding-panel li:first-child { + border-top: none; + padding-top: 0; +} + +.md-typeset .funding-funder { + display: inline-block; + margin-top: 0.28rem; + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--sp-midnight); +} + +.md-typeset .funding-years { + font-family: "Inter", var(--md-text-font) !important; + font-size: 0.68rem; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--sp-crimson); + margin-bottom: 0.24rem; +} + +.md-typeset .funding-title { + font-family: var(--sp-heading-font) !important; + font-size: 1rem; + line-height: 1.38; + color: var(--sp-midnight); +} + +.md-typeset .funding-link { + margin-top: 0.35rem; + font-size: 0.74rem; +} + +[data-md-color-scheme="slate"] .md-typeset .funding-panel { + background: rgba(26,40,54,0.86); + border-color: rgba(250,249,245,0.08); + box-shadow: 0 2px 16px rgba(0,0,0,0.18); +} + +[data-md-color-scheme="slate"] .md-typeset .funding-funder { + color: #d9e3ec; +} + +[data-md-color-scheme="slate"] .md-typeset .funding-title { + color: #eef3f7; +} + +[data-md-color-scheme="slate"] .md-typeset .funding-years { + color: #f2c15c; +} + +@media screen and (max-width: 76.1875em) { + .md-typeset .funding-grid { + grid-template-columns: 1fr; } } + +.md-typeset .archive-link { + font-family: "Inter", var(--md-text-font) !important; + font-size: 0.6rem; + font-weight: 700; + letter-spacing: 0.15em; + color: var(--sp-midnight) !important; + text-decoration: none !important; + border-bottom: none !important; + opacity: 0.4; + transition: opacity 0.2s ease; +} + +.md-typeset .archive-link:hover { + opacity: 1; + color: var(--sp-crimson) !important; +} + +/* ── Research list ── */ +.md-typeset .research-list { + margin: 0; +} + +.md-typeset a.research-entry { + display: grid; + grid-template-columns: 1fr auto; + grid-template-rows: auto auto; + gap: 0 2rem; + padding: 1.2rem 0; + border-bottom: 0.5px solid var(--sp-ghost); + text-decoration: none !important; + color: inherit !important; + transition: padding-left 0.2s ease; +} + +.md-typeset a.research-entry:first-child { + border-top: 0.5px solid var(--sp-ghost); +} + +.md-typeset a.research-entry:hover { + padding-left: 0.5rem; +} + +/* Meta row: label + journal */ +.md-typeset .research-entry__meta { + grid-column: 1 / -1; + display: flex; + align-items: baseline; + gap: 1rem; + margin-bottom: 0.3rem; +} + +.md-typeset .research-label { + font-family: "Inter", var(--md-text-font) !important; + font-size: 0.55rem; + font-weight: 700; + letter-spacing: 0.18em; + color: var(--sp-crimson); +} + +.md-typeset .research-journal { + font-size: 0.6rem; + font-style: italic; + color: var(--sp-ghost); +} + +/* Title */ +.md-typeset a.research-entry h3 { + font-family: var(--sp-heading-font) !important; + font-size: 1rem; + font-weight: 500; + font-style: italic; + color: var(--sp-midnight) !important; + margin: 0 !important; + padding: 0 !important; + border: none !important; + line-height: 1.35; + grid-column: 1; +} + +/* Arrow */ +.md-typeset .research-arrow { + grid-column: 2; + grid-row: 2 / 4; + align-self: center; + font-size: 1.1rem; + color: var(--sp-ghost); + transition: color 0.2s ease, transform 0.2s ease; +} + +.md-typeset a.research-entry:hover .research-arrow { + color: var(--sp-crimson); + transform: translateX(3px); +} + +/* Authors */ +.md-typeset .research-authors { + font-size: 0.7rem; + color: var(--md-default-fg-color--light); + margin: 0.2rem 0 0 !important; + text-align: left; + grid-column: 1; +} + +.md-typeset .research-summary { + font-size: 0.75rem; + color: var(--md-default-fg-color--light); + margin: 0.35rem 0 0 !important; + text-align: left; + line-height: 1.55; + grid-column: 1; +} + +/* ── Dark mode research ── */ +[data-md-color-scheme="slate"] .md-typeset a.research-entry { + border-color: rgba(195,198,213,0.1); +} + +[data-md-color-scheme="slate"] .md-typeset a.research-entry h3 { + color: #c8d8e8 !important; +} + +[data-md-color-scheme="slate"] .md-typeset .archive-link { + color: #c8d8e8 !important; +} + +[data-md-color-scheme="slate"] .md-typeset .archive-link:hover { + color: #5cb8f0 !important; +} + +[data-md-color-scheme="slate"] .md-typeset .research-arrow { + color: rgba(195,198,213,0.3); +} + +[data-md-color-scheme="slate"] .md-typeset a.research-entry:hover .research-arrow { + color: #5cb8f0; +} diff --git a/documentation/wiki/assets/fonts/Newsreader-Italic.woff2 b/documentation/wiki/assets/fonts/Newsreader-Italic.woff2 new file mode 100644 index 000000000..6d558e106 Binary files /dev/null and b/documentation/wiki/assets/fonts/Newsreader-Italic.woff2 differ diff --git a/documentation/wiki/assets/fonts/Newsreader.woff2 b/documentation/wiki/assets/fonts/Newsreader.woff2 new file mode 100644 index 000000000..c45664873 Binary files /dev/null and b/documentation/wiki/assets/fonts/Newsreader.woff2 differ diff --git a/documentation/wiki/developer-guide/internals/api.md b/documentation/wiki/developer-guide/internals/api.md index b6f4cb9c0..7dfe55e24 100644 --- a/documentation/wiki/developer-guide/internals/api.md +++ b/documentation/wiki/developer-guide/internals/api.md @@ -1,6 +1,6 @@ # SimPaths API -SimPaths APIs are published [here](https://simpaths.github.io/SimPaths/javadoc/). +SimPaths APIs are published [here](https://simpaths.org/javadoc/). # 1. Introduction diff --git a/documentation/wiki/developer-guide/internals/simpaths-model.md b/documentation/wiki/developer-guide/internals/simpaths-model.md index 17335d7a1..7cc0a8b87 100644 --- a/documentation/wiki/developer-guide/internals/simpaths-model.md +++ b/documentation/wiki/developer-guide/internals/simpaths-model.md @@ -1,8 +1,6 @@ # The SimPathsModel Class -``_Under Construction_`` - -This page complements [4.05 - The Model and the Schedule] by explaining how SimPaths instantiates the generic JAS-mine scheduling framework in practice. It documents current SimPaths practice, not theory or design justification. It is not a complete specification of the model's behaviour, and should be read together with the codebase and validation documentation. +This page complements **[4.05 - The Model and the Schedule]** by explaining how SimPaths instantiates the generic JAS-mine scheduling framework in practice. It documents current SimPaths practice, not theory or design justification. It is not a complete specification of the model's behaviour, and should be read together with the codebase and validation documentation. ## 1. The SimPaths model manager @@ -10,17 +8,20 @@ The core simulation logic in SimPaths is implemented in a model manager class th The SimPaths model class functions primarily as a coordinator of simulation structure. Its primary responsibilities are to initialise the population and global data structures, define the temporal structure of the simulation via schedules, and respond to aggregate-level events. -### **Model construction**: +### Model construction The **buildObjects()** method defines the initial simulation state before any time evolution takes place. + In SimPaths, this phase typically includes: -* Initialising random number generators, including the creation of separate random streams for different modules (e.g. matching, alignment, initialisation), to reduce unintended coupling between processes. -* Loading global parameters and projections for the simulation horizon. -* Preparing auxiliary infrastructures, such as indices for tax-benefit donor data. -* Creating the initial population by loading or constructing Person, BenefitUnit, and Household objects, including any required population expansion or preprocessing. -* Initialising internal state variables (e.g. the simulation year counter). -### Simulation execution schedule +- Initialising random number generators, including the creation of separate random streams for different modules (e.g. matching, alignment, initialisation), to reduce unintended coupling between processes. +- Loading global parameters and projections for the simulation horizon. +- Preparing auxiliary infrastructures, such as indices for tax-benefit donor data. +- Creating the initial population by loading or constructing `Person`, `BenefitUnit`, and `Household` objects, including any required population expansion or preprocessing. +- Initialising internal state variables, such as the simulation year counter. + + +### Simulation execution schedule: The temporal structure of the simulation is defined in the **buildSchedule()** method. This method specifies the sequence of events that govern the evolution of the simulated population and determines how processes are executed over time. All model dynamics are implemented as events managed by the JAS-mine discrete-event simulation engine. diff --git a/documentation/wiki/documentation/index.md b/documentation/wiki/documentation/index.md new file mode 100644 index 000000000..855990aa5 --- /dev/null +++ b/documentation/wiki/documentation/index.md @@ -0,0 +1,72 @@ +--- +hide: + - toc +--- + +# Documentation + +
+

SimPaths is built in Java using the JAS-mine simulation libraries.

+

Choose the pathway that matches what you need to do next: get the model running, work with simulations in practice, or move into the codebase.

+
+ +
+ +
+
+
+ +
+
+

New to SimPaths

+

Set up and complete a first run

+

Use this route if you are installing SimPaths, checking the required inputs, or trying to get to a first successful run as quickly as possible.

+
+
+
    +
  1. Environment Setup
  2. +
  3. Input Data
  4. +
  5. Running Your First Simulation
  6. +
+ Open Getting Started → +
+ +
+
+
+ +
+
+

Using the model

+

Run, inspect, and adjust simulations

+

Follow this route once the model is already set up and you want to work with single runs, batch runs, or policy-related settings in practice.

+
+
+
    +
  1. Single Runs
  2. +
  3. Multiple Runs
  4. +
  5. Graphical User Interface
  6. +
+ Open User Guide → +
+ +
+
+
+ +
+
+

Working on the codebase

+

Understand architecture and development flow

+

Use this path if you intend to implement code changes, trace execution, or understand how SimPaths is structured on top of JAS-mine.

+
+
+
    +
  1. Repository Guide
  2. +
  3. Start Class Implementation
  4. +
  5. MultiRun Implementation
  6. +
+ Open Developer Guide → +
+ +
diff --git a/documentation/wiki/figures/modules/union_matching_module.png b/documentation/wiki/figures/modules/union_matching_module.png index c5a70675c..397e61cea 100644 Binary files a/documentation/wiki/figures/modules/union_matching_module.png and b/documentation/wiki/figures/modules/union_matching_module.png differ diff --git a/documentation/wiki/funding/index.md b/documentation/wiki/funding/index.md new file mode 100644 index 000000000..2d192c9a2 --- /dev/null +++ b/documentation/wiki/funding/index.md @@ -0,0 +1,88 @@ +--- +hide: + - navigation + - toc +--- + +
+ +

Funding

+ +

+ SimPaths has been developed through a sequence of research and policy grants across partner institutions. + This page brings together the confirmed past and present funding that has supported the model and its applications. +

+ +
+ +
+

Current Funding

+
    +
  • +
    2021-2026
    +
    Evaluation of the health impacts of Universal Credit: a mixed methods study
    +
    NIHR
    +
  • +
  • +
    2022-2027
    +
    Greater Essex Health Determinants Research Collaboration
    +
    NIHR
    +
  • +
  • +
    2023-2027
    +
    Sustainable Welfare: Rethinking the roles of Family, Market and State (SUSTAINWELL)
    +
    Horizon Europe
    +
  • +
  • +
    2024-2028
    +
    Policy Modelling for Health
    +
    UKRI PHI
    +
  • +
  • +
    2025-2028
    +
    WELLSIM: A life course microsimulation perspective on multi-dimensional well-being for five European countries
    +
    CHANSE/NORFACE
    +
  • +
  • +
    2025-2028
    +
    Evaluating the impact of major income support policies on health inequalities across the life course: a micro-macro linked modelling study (MicMac)
    +
    NIHR
    + +
  • +
+
+ +
+

Past Funding

+
    +
  • +
    2019-2021
    +
    Investigating Economic Insecurity: A Microsimulation Approach
    +
    INAPP
    +
  • +
  • +
    2021-2022
    +
    Understanding the impacts of income and welfare policy responses to COVID-19 on inequalities in mental health: A microsimulation model
    +
    Health Foundation
    +
  • +
  • +
    2021-2024
    +
    Caring Over the Lifecycle: the Roles of Families and Welfare States Today and Into the Future
    +
    JPI
    +
  • +
  • +
    2021-2025
    +
    Health Equity of Economic Determinants (HEED): A Pan-European Microsimulation model for Health impacts of Income and Social Security Policies
    +
    ERC
    +
  • +
  • +
    2023-2025
    +
    Overlapping crises: (Re)shaping the future of regional labour markets (OVERLAP)
    +
    ESPON
    +
  • +
+
+ +
+ +
diff --git a/documentation/wiki/getting-started/environment-setup.md b/documentation/wiki/getting-started/environment-setup.md index 99be75070..0a7bcdb51 100644 --- a/documentation/wiki/getting-started/environment-setup.md +++ b/documentation/wiki/getting-started/environment-setup.md @@ -1,28 +1,110 @@ # Environment Setup -!!! warning "In progress" - This page is under development. Contributions welcome — - see the [Getting Started](index.md) overview. +This page covers the local software requirements, repository setup, and the first-time build and database steps needed before SimPaths is ready to run. -## Requirements +## 1. Local requirements -- Java Development Kit (JDK) 19 (the project targets Java 19 — earlier versions will not compile) +- Java Development Kit (JDK) 19 - Apache Maven 3.8 or later - Git -## Cloning the repository +The project is compiled for Java 19 in `pom.xml`, so earlier Java versions will not build the code correctly. + +It is worth checking the toolchain before going further: + +```bash +java -version +mvn -version +git --version +``` + +## 2. Clone the repository + +Clone SimPaths and move into the repository root: ```bash git clone https://github.com/simpaths/SimPaths.git cd SimPaths ``` -## Building the project +## 3. Build the executables + +SimPaths uses the Maven Shade plugin to build two runnable jars: + +- `singlerun.jar` for single simulations via `simpaths.experiment.SimPathsStart` +- `multirun.jar` for repeated runs via `simpaths.experiment.SimPathsMultiRun` + +Build them from the repository root: ```bash mvn clean package ``` -This produces `singlerun.jar` and `multirun.jar` at the repository root. +After a successful package step, both jars are written to the repository root. + +If this step fails, fix the Java or Maven setup first. There is no point debugging the model before the jars build cleanly. + +## 4. Check the required input layout + +Before a real run, SimPaths expects the `input/` directory to contain: + +- `InitialPopulations/` for starting population CSV files +- `EUROMODoutput/` for donor tax-benefit input files +- Excel workbooks such as `EUROMODpolicySchedule.xlsx`, `DatabaseCountryYear.xlsx`, and the `align_*.xlsx`, `reg_*.xlsx`, `scenario_*.xlsx`, and `projections_*.xlsx` parameter files + +The key point here is that SimPaths does **not** run directly from the raw CSV and EUROMOD files. During setup, the code rebuilds the local H2 database `input/input.mv.db` from those sources by calling `Parameters.databaseSetup()`. + +## 5. Understand first-time setup + +The first-time setup step is what turns the repository from "compiled" into "runnable". + +Setup does four important things: + +1. writes or refreshes `DatabaseCountryYear.xlsx` +2. validates or rebuilds `EUROMODpolicySchedule.xlsx` +3. rebuilds the starting-population database under `input/input.mv.db` +4. rebuilds the donor tax-benefit database from `input/EUROMODoutput/` + +For a clean first headless setup, the most explicit route is: + +```bash +java -jar singlerun.jar -Setup -c UK -s 2019 -g false --rewrite-policy-schedule +``` + +Once that succeeds, a run-only check is straightforward: + +```bash +java -jar singlerun.jar -Run -c UK -s 2019 -g false +``` + +If you prefer the repeated-run path, the equivalent setup command is: + +```bash +java -jar multirun.jar -DBSetup -config config/default.yml +``` + +## 6. Training data fallback + +If no top-level CSV files are found in `input/InitialPopulations/`, SimPaths automatically switches to the bundled training data under `input/InitialPopulations/training/` and the associated training donor files. This is useful for documentation, testing, and development, but not for substantive research analysis. + +The fallback is helpful for getting the code running locally, but it is not a substitute for the full research inputs. + +## 7. Policy schedule file + +Single-run setup expects `input/EUROMODpolicySchedule.xlsx` to exist. If you need to rebuild that file from the EUROMOD output filenames, use the `--rewrite-policy-schedule` flag when running `singlerun.jar`. + +## 8. Common setup problems + +The usual setup failures are: + +- **wrong Java version**: the build or runtime fails before the model even starts +- **missing initial population files**: setup falls back to training data, or database creation fails +- **missing donor files**: the tax-benefit database cannot be rebuilt +- **stale policy schedule**: the EUROMOD output files and `EUROMODpolicySchedule.xlsx` do not line up +- **database needs rebuilding**: donor files or schedule changed, but the old `input/input.mv.db` is still being reused + +If donor inputs, donor years, or the policy schedule change, rebuild the database before trying to interpret any results. + +## Next step -Refer to the [Working in GitHub](../developer-guide/working-in-github.md) guide for the full development workflow. +Once the project is built and the input data are in place, continue to [Running Your First Simulation](first-simulation.md). diff --git a/documentation/wiki/getting-started/first-simulation.md b/documentation/wiki/getting-started/first-simulation.md index 1c79c9b09..2cafff871 100644 --- a/documentation/wiki/getting-started/first-simulation.md +++ b/documentation/wiki/getting-started/first-simulation.md @@ -1,5 +1,107 @@ # Running Your First Simulation -!!! warning "In progress" - This page is under development. Contributions welcome — - see [Single Runs](../user-guide/single-runs.md) in the User Guide for current guidance. +This page covers the quickest reliable path to a first successful SimPaths run using `singlerun.jar`. + +## Before you run + +Make sure you have already completed: + +- [Environment Setup](environment-setup.md) +- [Input Data](data/index.md) + +In practice, that means: + +- the project builds successfully with Maven +- `singlerun.jar` exists in the repository root +- the required input files are present under `input/` + +## Recommended first run: headless and explicit + +For a first run, the clearest route is to separate setup from execution. + +### 1. Build the project + +```bash +mvn clean package +``` + +### 2. Run setup only + +```bash +java -jar singlerun.jar -Setup -c UK -s 2019 -g false --rewrite-policy-schedule +``` + +This setup phase does not run the simulation itself. It prepares the model by: + +- writing or refreshing the policy schedule +- saving the selected country and start year +- loading uprating and alignment inputs +- rebuilding `input/input.mv.db` + +If `input/EUROMODpolicySchedule.xlsx` already exists and matches your donor files, you can omit `--rewrite-policy-schedule`. + +### 3. Run the simulation only + +```bash +java -jar singlerun.jar -Run -c UK -s 2019 -g false +``` + +This starts the JAS-mine engine with: + +- `SimPathsModel` +- `SimPathsCollector` +- `SimPathsObserver` only when the GUI is enabled + +In headless mode, the process runs to completion and then exits. + +## What the main flags do + +The most useful `singlerun.jar` options are: + +- `-c `: country code such as `UK` or `IT` +- `-s `: simulation start year +- `-Setup`: perform setup only, then exit +- `-Run`: skip setup and run the simulation directly +- `-g true|false`: enable or disable the GUI +- `--rewrite-policy-schedule`: rebuild `EUROMODpolicySchedule.xlsx` from detected donor policy files + +`-Setup` and `-Run` are mutually exclusive. If neither is provided, `SimPathsStart` does both. + +## If you want to use the GUI + +After the initial setup has succeeded, you can launch the single-run interface with: + +```bash +java -jar singlerun.jar +``` + +In GUI mode, SimPaths opens the start-up dialog and then launches the JAS-mine shell. This is useful for interactive exploration, but it is less explicit than the headless route for a first installation check. + +## What success looks like + +A successful first run should leave you with: + +- a rebuilt input database at `input/input.mv.db` +- no setup error about missing donor files or missing policy schedule +- a completed simulation run, either in the GUI or in headless mode + +If the run fails before the simulation starts, the problem is usually in setup rather than in the model itself. + +## Common first-run problems + +- `Policy Schedule file ... doesn't exist` + - create `input/EUROMODpolicySchedule.xlsx` first, or rerun setup with `--rewrite-policy-schedule` +- donor or initial-population files are missing + - check the contents of `input/InitialPopulations/` and `input/EUROMODoutput/` +- wrong Java version + - SimPaths targets Java 19 +- setup succeeds but the run uses unexpected inputs + - rebuild the database after changing donor files or the policy schedule + +## Where to go next + +Once the first run works, the next useful pages are: + +- [Single Runs](../user-guide/single-runs.md) +- [Multiple Runs](../user-guide/multiple-runs.md) +- [Modifying Tax-Benefit Parameters](../user-guide/tax-benefit-parameters.md) diff --git a/documentation/wiki/index.md b/documentation/wiki/index.md index 3f1e0b464..760b6532a 100644 --- a/documentation/wiki/index.md +++ b/documentation/wiki/index.md @@ -6,30 +6,11 @@ hide:
-# SimPaths +

SimPaths

-

Open-source dynamic microsimulation for life course modelling — projecting careers, families, health, and finances across populations.

+SimPaths is a family of open-source models for individual and household life course events, all sharing common components. The framework is designed to project life histories through time, building up a detailed picture of career paths, family (inter)relations, health, and financial circumstances. -
- ✓ Open Source - 🌍 5 Countries - ☕ Java / JAS-mine - 🔬 UKRI HealthMod -
- - - -
- ---- - -## About SimPaths - -SimPaths builds upon **JAS-mine**, an open-source Java platform designed for discrete-event simulations. Models currently exist for the **UK, Greece, Hungary, Italy, and Poland**. +The broader SimPaths family spans **the UK and other European countries**.
🇬🇧 United Kingdom @@ -39,53 +20,47 @@ SimPaths builds upon **JAS-mine**, an open-source Java platform designed for dis 🇵🇱 Poland
+ + + + --- -

Explore the Documentation

+

Explore SimPaths

-
+
- +
-

Overview

-

What SimPaths models and why — architecture, modules, and parameterisation.

-Explore → +

Model

+

Understand what SimPaths models, how it is parameterised, and which modules it includes.

+Explore the model →
- -
- + +
+
-

Getting Started

-

Set up your environment, load input data, and run your first simulation.

-Get Started → +

Documentation

+

Find the paths for getting started, running simulations in practice, and navigating the developer-facing internals of SimPaths.

+Open documentation →
- -
-
-

User Guide

-

Single and multi-run simulations, GUI, parameter editing, and uncertainty analysis.

-View Guide → -
- -
- -
-

Developer Guide

-

JAS-mine architecture, SimPaths internals, and how-to guides for extending the model.

-Developer Guide → -
+ --- -!!! tip "New to SimPaths?" - Start with the [Overview](overview/) to understand what the model does, then follow the [Getting Started](getting-started/) guide to run your first simulation. + diff --git a/documentation/wiki/overview/country-variants.md b/documentation/wiki/overview/country-variants.md deleted file mode 100644 index af49f2a19..000000000 --- a/documentation/wiki/overview/country-variants.md +++ /dev/null @@ -1,5 +0,0 @@ -# Country Variants - -!!! warning "In progress" - This page is under development. Contributions welcome — - see the [Developer Guide](../developer-guide/index.md) for how to contribute. diff --git a/documentation/wiki/overview/index.md b/documentation/wiki/overview/index.md index 09e43725b..3b521079f 100644 --- a/documentation/wiki/overview/index.md +++ b/documentation/wiki/overview/index.md @@ -1,4 +1,4 @@ -# Overview +# Model SimPaths is a family of models for individual and household life course events, all sharing common components. The framework is designed to project life histories through time, building up a detailed picture of career paths, family (inter)relations, health, and financial circumstances. It builds upon standardised assumptions and data sources, which facilitates adaptation to alternative countries. @@ -11,5 +11,4 @@ The modular nature of the SimPaths framework is designed to facilitate analysis - [Model Description](model-description.md) — what SimPaths models and why - [Simulated Modules](simulated-modules.md) — the behavioural modules - [Model Parameterisation](parameterisation.md) — how parameters are specified -- [Country Variants](country-variants.md) — adapting SimPaths to other countries - [How to Cite](how-to-cite.md) — citation guidance and published research diff --git a/documentation/wiki/user-guide/gui.md b/documentation/wiki/user-guide/gui.md index f18e1b7b6..2f5a70a26 100644 --- a/documentation/wiki/user-guide/gui.md +++ b/documentation/wiki/user-guide/gui.md @@ -3,7 +3,7 @@ # 1. Introduction In this section, we discuss the different components that make up the JAS-mine Graphical User Interface (GUI). -![SimPaths GUI Screenshot](https://raw.githubusercontent.com/simpaths/SimPaths/develop/docs/figures/SimPaths%20GUI.png) +![SimPaths GUI Screenshot](../figures/GUI/SimPaths%20GUI.png) JAS-mine supports three different types of execution mode:- [interactive mode](https://www.microsimulation.ac.uk/jas-mine/resources/cookbook/start/), [batch mode](https://www.microsimulation.ac.uk/jas-mine/resources/cookbook/start/) and [multi-run mode](https://www.microsimulation.ac.uk/jas-mine/resources/tutorials/run-a-simulation-many-times/). The most common mode for prototyping a JAS-mine project, developing an intuition about how it works and demonstrating it to an audience is the interactive mode. This features a graphical user interface, where model parameters can be set and updated during a simulation run, and pre-determined graphical objects can be displayed to allow for real-time inspection of a number of the model's output quantities. @@ -37,7 +37,7 @@ There are three menu tabs at the top of the JAS-mine: ## 1.2 Simulation Control Pane -![JAS-mine Buttons](https://raw.githubusercontent.com/simpaths/SimPaths/develop/docs/figures/SimPaths-Buttons.png) +![JAS-mine Buttons](../figures/GUI/SimPaths-Buttons.png) Below the Menu tabs are the simulation control buttons. The user can easily discover the meaning of each of the buttons by hovering the mouse pointer over each button. We describe the actions associated with each button below, ordered from left to right: @@ -56,7 +56,7 @@ The sliding scale on the right labelled **'Simulation speed'** adjusts the real- A JAS-mine model's *[GUI parameters](https://www.microsimulation.ac.uk/jas-mine/resources/cookbook/gui-parameters/)* appear in the parameter boxes below the Simulation Control Pane. One parameter box for each of the '[Model-Collector-Observer](https://www.microsimulation.ac.uk/jas-mine/resources/focus/model-collector-observer/)' manager classes is displayed, as long as there are any variables in each of the manager classes that have the `@GUIparameter` annotation. -![JAS-mine GUI Parameters](https://raw.githubusercontent.com/simpaths/SimPaths/develop/docs/figures/SimPaths%20parameters.png) +![JAS-mine GUI Parameters](../figures/GUI/SimPaths%20parameters.png) The description of a GUI parameter can be observed by hovering the mouse pointer over the value, upon which a yellow box containing the description appears if it has been defined as an attribute in the `@GUIparameter` annotation where the variable is declared, e.g.: ```java @@ -76,11 +76,11 @@ The graphics do not immediately appear in the GUI when the JAS-mine project's St The settings of a graphical widget can be adjusted by right clicking on it with the mouse pointer, and selecting the appropriate controls that are available for the type of widget. For example, the labels, line-type, colour and appearance of time series plots can be altered while running the simulation as shown below: -![JAS-mine Chart Properties](https://raw.githubusercontent.com/simpaths/SimPaths/develop/docs/figures/Chart%20Properties.png) +![JAS-mine Chart Properties](../figures/GUI/Chart%20Properties.png) In addition, for a time series plot, it is possible to zoom in to areas of data points by left-clicking and dragging the mouse pointer diagonally downwards and to right in order to select a rectangle of area to enlarge. The left hand side of the figure below shows the rectangle created by dragging the mouse pointer (the mouse pointer is not shown), and the right hand side is the resulting enlarged chart. The user can zoom out again either by dragging the mouse pointer upwards or leftwards, or by right clicking and selecting 'Auto Range -> Both Axes' from the list of options. -![JAS-mine Chart Zoom](https://raw.githubusercontent.com/simpaths/SimPaths/develop/docs/figures/SimPaths-Chart-Zoom.png) +![JAS-mine Chart Zoom](../figures/GUI/SimPaths-Chart-Zoom.png) Finally, the time series plots can be saved as a PNG file, printed or copied by right clicking on the chart and selecting the relevant option. @@ -88,4 +88,4 @@ Finally, the time series plots can be saved as a PNG file, printed or copied by The output stream is the white coloured window at the bottom of the GUI. It contains the system and debugger out-stream data that would be printed out to the Command Prompt (in Windows), the Terminal (Linux), or in Eclipse if running in batch mode without the GUI. Such output includes any data produced by `System.out.println()` or `System.err.println()` commands in Java, and also information about the creation of database tables when building the project. The stack trace of any exceptions thrown will be printed out. The buttons on top of the output stream window include an option to save the text to file. -![JAS-mine Output Stream](https://raw.githubusercontent.com/simpaths/SimPaths/develop/docs/figures/Output%20stream.png) \ No newline at end of file +![JAS-mine Output Stream](../figures/GUI/Output%20stream.png) \ No newline at end of file diff --git a/documentation/wiki/user-guide/index.md b/documentation/wiki/user-guide/index.md index 2b0ea4b7d..cecb7404d 100644 --- a/documentation/wiki/user-guide/index.md +++ b/documentation/wiki/user-guide/index.md @@ -1,3 +1,11 @@ # User Guide -The guide below describes how SimPaths can be used to run simulations from the GUI (Graphical User Interface) and create scenarios by changing the GUI parameters, the input data, or the tax-benefit parameters. \ No newline at end of file +The user guide explains how SimPaths can be used to run simulations from the GUI (Graphical User Interface), set up multiple runs, and create scenarios by changing GUI parameters, input data, or tax-benefit settings. + +## Sections + +- [Single Runs](single-runs.md) — run an individual simulation and inspect outputs +- [Multiple Runs](multiple-runs.md) — manage repeated simulations and persistence choices +- [Graphical User Interface](gui.md) — work through the main controls and displays +- [Modifying Tax-Benefit Settings](tax-benefit-parameters.md) — adjust policy-related inputs +- [Uncertainty Analysis](uncertainty-analysis.md) — explore stochastic variation and sensitivity diff --git a/documentation/wiki/user-guide/multiple-runs.md b/documentation/wiki/user-guide/multiple-runs.md index 4a4726d69..626353ced 100644 --- a/documentation/wiki/user-guide/multiple-runs.md +++ b/documentation/wiki/user-guide/multiple-runs.md @@ -1,3 +1,122 @@ # Multiple Runs -To run the model multiple times with different parameters, follow the instructions in the Developers guide. \ No newline at end of file +`multirun.jar` runs a sequence of simulations using `simpaths.experiment.SimPathsMultiRun`. It is the main route for repeated runs, sensitivity work, and batch execution on a server or in CI. + +## Before you start + +Make sure the project builds and the input database has been created at least once: + +```bash +mvn clean package +java -jar multirun.jar -DBSetup -config config/default.yml +``` + +The setup step rebuilds `input/input.mv.db` from the initial-population files and the EUROMOD / UKMOD donor outputs. If you have already completed setup and none of those inputs have changed, you do not need to repeat it before every run. + +## Basic command + +For a standard headless batch run: + +```bash +java -jar multirun.jar -config config/default.yml -g false --persist=root +``` + +The configuration file is loaded first, and any command-line flags then override it. + +## What the configuration file controls + +The main configuration file is `config/default.yml`. The most useful top-level settings for multi-run work are: + +- `maxNumberOfRuns`: number of sequential runs to perform +- `randomSeed`: seed used for the first run +- `startYear` and `endYear`: simulation horizon +- `popSize`: simulated population size +- `executeWithGui`: whether to launch the JAS-mine multi-run frame + +The same file also exposes: + +- `model_args`: settings passed into `SimPathsModel` +- `innovation_args`: rules for varying parameters across runs +- `collector_args`: output and persistence settings +- `parameter_args`: input-directory and donor-data settings + +## Useful command-line options + +The most important command-line flags are: + +- `-config `: use a different YAML file under `config/` +- `-n `: override the number of runs +- `-r `: override the first random seed +- `-s ` and `-e `: override the run horizon +- `-p `: override population size +- `-g true|false`: run with or without the GUI +- `-DBSetup`: rebuild the input database and exit without running simulations +- `-f`: write console output and log output to `output/logs/` +- `--persist=root|run|none`: control where processed population data are reused + +## Persistence options + +`SimPathsMultiRun` supports three persistence modes: + +- `root`: reuse processed population data from the root `input/` folder +- `run`: keep processed population data in the run-specific output folder +- `none`: do not persist processed population data between runs + +`root` is the default and is usually the right choice for repeated runs over the same starting database. Use `run` when you want each batch to remain self-contained. Use `none` when you want to avoid writing processed population data at all. + +## Innovations across runs + +Repeated runs do not have to be identical. In `innovation_args` you can enable changes between run 1, run 2, run 3, and so on. + +The main options are: + +- `randomSeedInnov`: increment the seed for each successive run +- `intertemporalElasticityInnov`: apply interest-rate innovations across runs +- `labourSupplyElasticityInnov`: apply disposable-income innovations across runs + +These are intended for uncertainty and sensitivity work. If you only want repeated stochastic runs, leaving `randomSeedInnov: true` is normally enough. + +## Output collection + +Output writing is controlled through `collector_args` in `config/default.yml`. + +The main switches are: + +- `exportToCSV`: write CSV outputs +- `exportToDatabase`: write outputs to the H2 database +- `persistStatistics`, `persistStatistics2`, `persistStatistics3`: write the main summary outputs +- `persistPersons`, `persistBenefitUnits`, `persistHouseholds`: write record-level panels + +Record-level outputs can become very large, so they should only be enabled when needed. + +## A practical example + +This example runs three headless simulations from 2019 to 2022, starting from seed `606`, and keeps processed population data in the root folder: + +```bash +java -jar multirun.jar \ + -config config/default.yml \ + -n 3 \ + -r 606 \ + -s 2019 \ + -e 2022 \ + -g false \ + --persist=root +``` + +## When to rebuild the database + +Run `-DBSetup` again before your batch if you have changed any of the following: + +- files in `input/InitialPopulations/` +- files in `input/EUROMODoutput/` +- `input/EUROMODpolicySchedule.xlsx` +- input paths in `parameter_args` + +If those inputs have not changed, a normal multi-run can start directly from the existing database. + +## Related pages + +- [Environment Setup](../getting-started/environment-setup.md) +- [Single Runs](single-runs.md) +- [Uncertainty Analysis](uncertainty-analysis.md) diff --git a/documentation/wiki/user-guide/tax-benefit-parameters.md b/documentation/wiki/user-guide/tax-benefit-parameters.md index 8ae5817c0..33e44358d 100644 --- a/documentation/wiki/user-guide/tax-benefit-parameters.md +++ b/documentation/wiki/user-guide/tax-benefit-parameters.md @@ -1,5 +1,105 @@ # Modifying Tax-Benefit Parameters -!!! warning "In progress" - This page is under development. Contributions welcome — - see the [User Guide](index.md) for other resources. +SimPaths does not hard-code a full tax-benefit system inside Java. Instead, tax and benefit outcomes are mainly read from donor data generated outside the model and then matched back onto simulated benefit units during a run. + +In practice, changing tax-benefit settings usually means changing one of three things: + +1. the EUROMOD / UKMOD output files stored in `input/EUROMODoutput/` +2. the policy schedule in `input/EUROMODpolicySchedule.xlsx` +3. the runtime settings that control how donor information is used + +## 1. Donor policy files + +The donor database is built from policy output files such as: + +- `input/EUROMODoutput/*.txt` + +During setup, `TaxDonorDataParser.constructAggregateTaxDonorPopulationCSVfile()` reads those text files, extracts the required policy-dependent and policy-invariant variables, and writes an aggregate donor CSV that is then loaded into the H2 input database. + +Two important assumptions in this process are: + +- all policy files for a given country must be based on the same donor input population +- the files must have consistent row counts across policy systems + +If that consistency breaks, database setup fails. + +## 2. Policy schedule + +`input/EUROMODpolicySchedule.xlsx` tells SimPaths which donor policy should apply from which simulation year onward. + +The relevant columns are: + +- `Filename` +- `Policy_Start_Year` +- `Policy_System_Year` +- `Description` + +In code, this file is loaded by `Parameters.calculateEUROMODpolicySchedule()`, which builds the map from simulation years to policy names. + +The most important rules are: + +- each policy start year must be unique +- the policy system year must match the system year used when the donor file was produced +- policies with no start year are ignored +- at least one policy file must exist for the model's base price year, currently `2015` + +If no policy begins exactly in the simulation start year, SimPaths uses the earliest available policy as the prevailing regime. + +## 3. Runtime settings that affect tax-benefit use + +Some settings in `config/default.yml` change how donor-based tax-benefit outcomes are used inside the simulation. + +The most relevant ones are: + +- `donorPoolAveraging` in `model_args` + - if `true`, SimPaths averages over nearest-neighbour donors rather than using a single closest donor +- `projectFormalChildcare` + - whether formal childcare costs are simulated +- `projectSocialCare` + - whether the social-care module is active +- `flagSuppressChildcareCosts` and `flagSuppressSocialCareCosts` + - scenario-style switches that suppress those cost components + +These are model settings rather than replacements for a new policy schedule. If you want a different tax-benefit regime, the donor files and policy schedule still need to reflect it. + +## Typical workflow for updating policy inputs + +If you want to introduce a new policy system or adjust an existing one, the usual sequence is: + +1. generate the required EUROMOD / UKMOD output `.txt` files +2. copy them into `input/EUROMODoutput/` +3. update `input/EUROMODpolicySchedule.xlsx` +4. rebuild the donor database +5. rerun the simulation + +For a headless rebuild, the clearest commands are: + +```bash +java -jar singlerun.jar -Setup -c UK -s 2019 -g false --rewrite-policy-schedule +``` + +or: + +```bash +java -jar multirun.jar -DBSetup -config config/default.yml +``` + +## When you must rebuild the database + +You should rebuild `input/input.mv.db` whenever you change: + +- any donor `.txt` file in `input/EUROMODoutput/` +- `input/EUROMODpolicySchedule.xlsx` +- donor-data paths in `parameter_args` + +Changing only higher-level run controls such as `startYear`, `endYear`, or output settings does not by itself require a rebuild. + +## What this page does not cover + +This page is about how SimPaths consumes tax-benefit inputs. It does not document the full external policy-modelling workflow inside EUROMOD / UKMOD itself. For donor-data preparation, see [Input Data](../getting-started/data/index.md). + +## Related pages + +- [Input Data](../getting-started/data/index.md) +- [Environment Setup](../getting-started/environment-setup.md) +- [Multiple Runs](multiple-runs.md) diff --git a/mkdocs.yml b/mkdocs.yml index a7b421023..a5ecddc2c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,36 +1,28 @@ -site_name: SimPaths Documentation +site_name: "SimPaths: life course microsimulation" site_description: >- An open-source microsimulation framework for modelling individual and household life course events across the UK and Europe. -site_url: https://simpaths.github.io/SimPaths/ -repo_url: https://github.com/simpaths/SimPaths -repo_name: simpaths/SimPaths +site_url: https://simpaths.org/ docs_dir: documentation/wiki copyright: >- - Copyright © Matteo Richiardi, Patryk Bronka, Justin van de Ven — - Centre for Microsimulation and Policy Analysis + SimPaths
+ An open-source microsimulation initiative. theme: name: material palette: - - scheme: default + - media: "(prefers-color-scheme: light)" + scheme: default primary: custom accent: custom - toggle: - icon: material/weather-night - name: Switch to dark mode - - scheme: slate + - media: "(prefers-color-scheme: dark)" + scheme: slate primary: custom accent: custom - toggle: - icon: material/weather-sunny - name: Switch to light mode font: false logo: assets/images/logo.svg - icon: - repo: fontawesome/brands/github features: - navigation.instant - navigation.instant.prefetch @@ -83,76 +75,81 @@ extra: social: - icon: fontawesome/brands/github link: https://github.com/simpaths/SimPaths - name: GitHub + name: GITHUB - icon: fontawesome/solid/globe link: https://www.microsimulation.ac.uk/ - name: Centre for Microsimulation and Policy Analysis + name: CeMPA + - icon: fontawesome/solid/scale-balanced + link: https://github.com/simpaths/SimPaths/blob/main/LICENSE + name: LICENSE nav: - Home: index.md - - Overview: + - Model: - overview/index.md - Model Description: overview/model-description.md - Simulated Modules: overview/simulated-modules.md - Model Parameterisation: overview/parameterisation.md - - Country Variants: overview/country-variants.md - How to Cite: overview/how-to-cite.md - - Getting Started: - - getting-started/index.md - - Environment Setup: getting-started/environment-setup.md - - Input Data: - - getting-started/data/index.md - - Initial Population (UK): getting-started/data/initial-population-uk.md - - Tax-Benefit Donors (UK): getting-started/data/tax-benefit-donors-uk.md - - Running Your First Simulation: getting-started/first-simulation.md - - Video Tutorials: getting-started/video-tutorials.md + - Documentation: + - documentation/index.md + - Getting Started: + - getting-started/index.md + - Environment Setup: getting-started/environment-setup.md + - Input Data: + - getting-started/data/index.md + - Initial Population (UK): getting-started/data/initial-population-uk.md + - Tax-Benefit Donors (UK): getting-started/data/tax-benefit-donors-uk.md + - Running Your First Simulation: getting-started/first-simulation.md + - Video Tutorials: getting-started/video-tutorials.md + - User Guide: + - user-guide/index.md + - Single Runs: user-guide/single-runs.md + - Multiple Runs: user-guide/multiple-runs.md + - Graphical User Interface: user-guide/gui.md + - Modifying Tax-Benefit Settings: user-guide/tax-benefit-parameters.md + - Uncertainty Analysis: user-guide/uncertainty-analysis.md + - Developer Guide: + - developer-guide/index.md + - Working in GitHub: developer-guide/working-in-github.md + - Repository Guide: developer-guide/repository-guide.md + - JAS-mine Architecture: + - developer-guide/jasmine/index.md + - Project Structure: developer-guide/jasmine/project-structure.md + - The Model and the Schedule: developer-guide/jasmine/model-and-schedule.md + - The Start Class: developer-guide/jasmine/start-class.md + - The MultiRun Class: developer-guide/jasmine/multirun-class.md + - Updating JAS-mine: developer-guide/jasmine/updating-jasmine.md + - SimPaths Internals: + - developer-guide/internals/index.md + - SimPaths API: developer-guide/internals/api.md + - The SimPathsModel Class: developer-guide/internals/simpaths-model.md + - Start Class Implementation: developer-guide/internals/start-class-implementation.md + - MultiRun Implementation: developer-guide/internals/multirun-implementation.md + - How-To Guides: + - developer-guide/how-to/index.md + - Introduce a New Variable: developer-guide/how-to/new-variable.md + - Add Parameters to the GUI: developer-guide/how-to/add-gui-parameters.md + - Perform MultiRun Simulations: developer-guide/how-to/multirun-simulations.md + - JAS-mine Reference: + - jasmine-reference/index.md + - Statistical Package: jasmine-reference/statistical-package.md + - Collection Filters: jasmine-reference/collection-filters.md + - Alignment Library: jasmine-reference/alignment-library.md + - Matching Library: jasmine-reference/matching-library.md + - Regression Library: jasmine-reference/regression-library.md + - Saving Outputs: jasmine-reference/saving-outputs.md + - Querying the Database: jasmine-reference/querying-database.md + - Links and Resources: jasmine-reference/links.md + - Enums: jasmine-reference/enums.md - - User Guide: - - user-guide/index.md - - Single Runs: user-guide/single-runs.md - - Multiple Runs: user-guide/multiple-runs.md - - Graphical User Interface: user-guide/gui.md - - Modifying Tax-Benefit Settings: user-guide/tax-benefit-parameters.md - - Uncertainty Analysis: user-guide/uncertainty-analysis.md - - - Developer Guide: - - developer-guide/index.md - - Working in GitHub: developer-guide/working-in-github.md - - Repository Guide: developer-guide/repository-guide.md - - JAS-mine Architecture: - - developer-guide/jasmine/index.md - - Project Structure: developer-guide/jasmine/project-structure.md - - The Model and the Schedule: developer-guide/jasmine/model-and-schedule.md - - The Start Class: developer-guide/jasmine/start-class.md - - The MultiRun Class: developer-guide/jasmine/multirun-class.md - - Updating JAS-mine: developer-guide/jasmine/updating-jasmine.md - - SimPaths Internals: - - developer-guide/internals/index.md - - SimPaths API: developer-guide/internals/api.md - - The SimPathsModel Class: developer-guide/internals/simpaths-model.md - - Start Class Implementation: developer-guide/internals/start-class-implementation.md - - MultiRun Implementation: developer-guide/internals/multirun-implementation.md - - How-To Guides: - - developer-guide/how-to/index.md - - Introduce a New Variable: developer-guide/how-to/new-variable.md - - Add Parameters to the GUI: developer-guide/how-to/add-gui-parameters.md - - Perform MultiRun Simulations: developer-guide/how-to/multirun-simulations.md - - JAS-mine Reference: - - jasmine-reference/index.md - - Statistical Package: jasmine-reference/statistical-package.md - - Collection Filters: jasmine-reference/collection-filters.md - - Alignment Library: jasmine-reference/alignment-library.md - - Matching Library: jasmine-reference/matching-library.md - - Regression Library: jasmine-reference/regression-library.md - - Saving Outputs: jasmine-reference/saving-outputs.md - - Querying the Database: jasmine-reference/querying-database.md - - Links and Resources: jasmine-reference/links.md - - Enums: jasmine-reference/enums.md - - - Model Validation: + - Validation: - validation/index.md - Research: - research/index.md + + - Funding: + - funding/index.md