also called ::scroll-marker · CSS-only carousel dots · scroll-marker-group
The dots are generated by the list and track it for free — including keyboard traversal and focus order, which hand-built dot navigation almost never gets right. Chrome builds the navigation from the scroller itself: one marker per snap stop, a group to hold them, and buttons that page it. No script tracks which stop is showing; :target-current says so.
How it is built
.reel { scroll-snap-type: x mandatory; scroll-marker-group: after }
.stop::scroll-marker { content: attr(data-far); background: var(--thumb) }
.stop::scroll-marker:target-current { /* the stop on screen */ }
.reel::scroll-button(right) { content: '→' } /* and (left) */