A minimal top bar with the brand and a button, plus a column of section dots fixed at the right edge whose labels slide out on hover or focus; an IntersectionObserver moves the active dot as each section crosses the middle of the screen. On a phone the dots sit in a bottom row with the current section name, which opens a numbered section list above it. The list stays in the markup and is toggled with CSS.