Anyone implemented a nice three-state dark mode toggle?
Love to hear your tips, ideas and even links to examples/code are welcome.
This feature is more involved that first look as this HN post unpacks..
https://news.ycombinator.com/item?id=23197966
My current wishlist:
- Three states (system/light/dark)
- Preference stored for next time
- Two icons light/dark
(click selected icon a second time to 'turn it off' and return to system)
- Vanilla JS/CSS/HTML
- Leans into CSS
This implementation comes pretty close.
https://www.bram.us/2020/04/26/the-quest-for-the-perfect-dark-mode-using-vanilla-javascript
This post points to a bunch of great three-state dark mode articles in its references.
https://www.brycewray.com/posts/2024/01/its-tri-state-switch-time
Sidenote: I found some discussion towards a w3c web preferences API to make this easier but this is far from ready or resolved.
https://github.com/WICG/web-preferences-api
https://front-end.social/@kizu/113160248251763608
1. Many code examples just handled light/dark and once clicked you cant easily get back to the system setting.
2. Seems folks going about this many different ways.
3. The Flash of Unstyled Content issue.
4. Im a big tailwind fan, but I think a clean implementation should exist just with the most vanilla CSS/HTML and very light use of JS as necessary.
5. Storing the preference once set
6. Discussions on adding this "simple" (seeming) feature bought out a wall of comments when someone suggested adding it right here on HN, and as of today, HN itself still doesnt have this "simple" feature.