website

source code for the ttmaths.uk website
Log | Files | Refs | README

commit 0485bf60b04e95f9083d83d3dc9a9b730569f9d7
parent 31c64e39be70821e4b89cfc3a2f4244503a7161e
Author: hrryt <harry@mayesfield.uk>
Date:   Mon, 26 Oct 2026 18:49:12 +0000

Overhaul style, add svg titles, fix points on chrome

Diffstat:
MTODO.md | 4+---
Msrc/components/QuestionCard.jsx | 2+-
Msrc/components/plotting/Plot.jsx | 3++-
Msrc/components/plotting/Point.jsx | 2+-
Msrc/index.jsx | 2+-
Msrc/pages/LatexRenderer.jsx | 2+-
Msrc/styles/main.css | 163++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
7 files changed, 136 insertions(+), 42 deletions(-)

diff --git a/TODO.md b/TODO.md @@ -8,10 +8,8 @@ - Transformations of shapes and graphs (curves) - tricky parallel lines / internal angles etc questions - Solve and represent inequalities + - Intervals on number lines # Other stuff - minesweeper / youtube video. -- crosswords - blog -- unique style -- mobile layout diff --git a/src/components/QuestionCard.jsx b/src/components/QuestionCard.jsx @@ -86,7 +86,7 @@ export default function QuestionCard({ data }) { {showAnswers ? "Show questions" : "Show answers"} </button> </fieldset> - <div class="field-border"> + <div class="print"> <ol class="master-question-list"> {questions} </ol> diff --git a/src/components/plotting/Plot.jsx b/src/components/plotting/Plot.jsx @@ -79,8 +79,9 @@ export default function Plot({ children, mode="graph", viewBox, width="300", hei return ( <svg width={width} height={height} viewBox={viewBox.join(' ')} - xmlns="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" role="img" > + <title>Plot</title> <defs> <g> <marker diff --git a/src/components/plotting/Point.jsx b/src/components/plotting/Point.jsx @@ -4,7 +4,7 @@ import { getColourClass } from '../../scripts/graphUtils.js'; export default function Point({ point, label=null, colour="auto", position="top" }) { return ( <g> - <path marker-start="url(#cross)" d={`M ${point}`} class={getColourClass(colour)}/> + <path marker-start="url(#cross)" d={`M ${point} Z`} class={getColourClass(colour)}/> {label && <Label point={point} position={position} spacing={5} colour={colour}>{label}</Label>} </g> ); diff --git a/src/index.jsx b/src/index.jsx @@ -78,7 +78,7 @@ function Sidebar() { </Route> </SidebarLink> <SidebarLink href="/renderer" title="LaTeX Renderer" /> - <li><a href="https://git.ttmaths.uk">Source Code</a></li> + <li><a href="https://git.ttmaths.uk" target="_blank">Source Code</a></li> </ul> </nav> ); diff --git a/src/pages/LatexRenderer.jsx b/src/pages/LatexRenderer.jsx @@ -24,7 +24,7 @@ export default function LatexRenderer() { onChange={e => updateText(e)} spellcheck={false} /> - <div class="field-border"> + <div class="print"> <Equation equation={text} /> </div> </Card> diff --git a/src/styles/main.css b/src/styles/main.css @@ -1,11 +1,40 @@ :root { - --highlight: #d7834f; - --background: #2a2a2a; - --main-bg: #333333; - --main-border: #5e5e5a; - --font-color: #b3b1b1; - --light-font-color: #bdbbb0; - --nav-link-color: #979594; + + /* https://ethanschoonover.com/solarized/ */ + --base03: #002b4f; /* #002b36 */ + --base02: #001020; /* #072632 */ + --base01: #586e75; + --base00: #657b83; + --base0: #839496; + --base1: #93a1a1; + --base2: #d0d0d3; /* #eee8d5 */ + --base3: #e7ddf0; /* #fdf6e3 */ + --yellow: #b58900; + --orange: #cb4b16; + --red: #dc322f; + --magenta: #d33682; + --violet: #3c3174; /* #6c71c4 */ + --blue: #268bd2; + --cyan: #2aa198; + --green: #859900; + + --light-accent: var(--violet); + --dark-accent: var(--base03); + --light-bg: var(--base3); + --dark-bg: var(--base2); + --dark-border: var(--base01); + --light-border: var(--base0); + --text: var(--base02); + + --body-bg: var(--light-bg); + --main-bg: var(--dark-bg); + --main-border: var(--dark-border); + --inner-border: var(--light-border); + + --textarea-bg: var(--body-bg); + --print-border: var(--dark-accent); + --link: var(--text); + --button-bg: var(--dark-accent); --graph-1: #008080; --graph-2: #43509E; @@ -14,23 +43,69 @@ --graph-5: #FFB000; } -body { - background-color: var(--background); - color: var(--font-color); +@media (min-width: 960px) { + div#sidebar-and-main { + display: flex; + } + main { + width: 670px; + } + #app { + width: 940px; + } +} + +@media (max-width: 959px) { + nav#sidebar > ul { + display: flex; + gap: 1.5em; + } + nav#sidebar > ul > li > ul { + display: none; + } +} + +@media print { + body:has(.print) { + visibility: hidden; + } + .print { + visibility: visible; + position: absolute; + left: 0; + top: 0; + border: none !important; + } +} + +html { + background-color: var(--body-bg); + color: var(--text); font-family: Adelle,Roboto Slab,DejaVu Serif,Georgia,Times New Roman,sans-serif; - width: 940px; - margin: 0 auto; + accent-color: var(--dark-accent); } -div#sidebar-and-main { - display: flex; +body { + background-image: + radial-gradient(at top left, var(--light-accent) 0, rgb(0 0 0 / 0) 50%), + radial-gradient(at top right, var(--dark-accent) 0, rgb(0 0 0 / 0) 50%); + margin: 0; + height: 50em; + max-height: 100vh; +} + +#app { + margin: 0 auto; + padding: 0 1em 1em 1em; } main { background-color: var(--main-bg); - border: solid 1px var(--main-border); padding: 22px; - width: 670px; + padding-top: 5px; + border: solid 1px var(--main-border); + min-width: min-content; + max-width: 670px; } nav#sidebar { @@ -48,8 +123,12 @@ ul { } a { + color: var(--link); text-decoration: none; - color: var(--highlight); +} + +a[href^="http"]::after { + content: " ⎘"; } nav#sidebar > ul { @@ -62,18 +141,21 @@ nav#sidebar details { } nav#sidebar a { - transition-duration: .3s; - transition-property: color; - background-color: initial; - color: var(--nav-link-color); + color: inherit; } -nav#sidebar :is(a.active,a:hover) { - color: var(--highlight); +nav#sidebar a:hover { + color: var(--link); + text-decoration: dotted underline; } +nav#sidebar a.active { + color: var(--link); + text-decoration: underline; +} + + header { - padding: 1rem 0; display: grid; grid-template-areas: "logo tagline"; grid-template-columns: auto 1fr; @@ -82,18 +164,18 @@ header { header #logo { grid-area: logo; + color: inherit; } header #tagline { grid-area: tagline; margin-left: .8em; - font-size: clamp(.8rem,2vw,1.3rem); - color: var(--light-font-color); + font-size: 1.3rem; } fieldset { margin-bottom: 0.5em; - border: solid 1px var(--main-border); + border: solid 1px var(--inner-border); } .variables { @@ -105,26 +187,39 @@ fieldset { } button { - background-color: var(--background); - border: solid 1px var(--main-border); - color: var(--font-color); + background-color: var(--button-bg); margin-right: 9px; + font-weight: 700; + color: white; + border-color: var(--button-bg); +} + +button:hover { + filter: brightness(95%); +} + +button,input { + border-radius: 3px; +} + +button,input,input + label { + cursor: pointer; } textarea { - background-color: var(--background); + background-color: var(--textarea-bg); border: solid 1px var(--main-border); - color: var(--font-color); + color: inherit; width: 100%; } -.field-border { +.print { font-size: large; padding: 20px; margin-top: 20px; background-color: white; color: black; - border: solid 8px var(--highlight); + border: 3px double var(--print-border); line-height: 1.8em; }