[ ] A force-layout PositionedGraph (web-renderer and collection.webInfo in card-web do it and can be copied)
[x] nodeRadius should be nodeRoundness
[ ] Some kind of PositionedGraph.make() that generates a web where each node has some number of target children, down to some depth, and links between siblings and weak links are generated with some probability (the different types of links should be encoded differently)
[ ] Add options for each of the constants in the _recalcLayout
[x] Get the actual layout of the graph working
[x] Position the different radius levels out with accelerating radius length
[x] allow setting random values on nodes wtih a function option that takes rnd and returns a value
[x] agetns should be able to be sized separately (not just the last node ID height/width), but an override point where they can size themselves
[x] Add a nextID that just gives a random ID that hasn't been used
[x] generateAgents should have an option to not actually place agents in nodes
[x] Renderer override points should pass in frame for all callbacks (actually you don't need it, they all have this.frame)
[x] Make an easier "pick a random emoji" pattern, it's surprisingly finicky to wire in
[x] graph.nodes should take a filterfunc (since it's doing a fromEntries anyway)
[x] A way in config files to leave a blank simOptions which gets the user-visible behavior of if the use had switched sim (that is, visible in ui defaults)
[x] Allow charting multiple data lines (a multi-select) (new issue)
[x] Figuore out a way to not have to include all of d3 for everything that uses graph (the challenge is inflateGraph doesn't know how to fetch dependencies and has to be able to exapnd all of them... but also, we can assume that the dependencies are all loaded by some other code anyway. so maybe just have each graph type call Graph.registerGraphType when it loads?)
[x] nodesSameSize implementation doesn't work (it just fetches width/height directly from the nodes, not via calculatePosition)
[x] Just get rid of nodesSameSize
[x] A quick override point for a positionExtractor that calculateNodePositiion uses (that doesn't require subclassing). Separately/in addition, a RandomLayout that positions nodes (maybe with a seed, which can be scrambled)
[x] Renderer should have overflow:clip
[ ] Right now we only layout the force layout graph the very first time that it's requested. But theoretically we should recompute if new edge or new nodes are added. (Generic callbacks inside of Graph for _prepareForNewNode(id) and _prepareForNewEdge(from, to) that can be overriden to note something is happening)
[x] Better height / width of nodes
[x] Why is the chart laying out off the edge of the available space?
[x] Why are edges not rendering?
[ ] PostionedNodes has a position properties that are passed to the node. Only those values can be read on the node or graph. So then we know if those values haven’t change we don’t need to recalculate the layout
[x] Returna a default width Which is a positioned graph property in the default calculate position(currently you DO need to return width and height) and have it be a resonable constant like 10
211496315d60d81d40b8f0f65e14d7255c3615c8, 405a31a53a03c313816fac2d897b908a876f088b, 8b31d69c9f1d23d969bcef6de2c2c2be7ecc7953 were all related to this (but before we separated this issue out)
Useful for #46 and others. Originally captured in #30