Mentioned on an earlier thread, but this is part of the reason I started my book "Visualisation with D3.js"[1]... it's early access and I'm trying to find more time to work on it. It's entirely separate from Observable, and it's my way of formalising my D3.js learning journey whilst producing something I can refer to in future.
[1] https://datacrayon.com/shop/product/visualisation-with-d3/