Every tool the board knows, in the toolbar's own display order. This is the runtime
companion to WhiteboardTool: the clamp needs to tell a real tool from a typo, and a
union alone cannot do that once it has been erased.
It lives HERE rather than beside the toolbar because the roster is the only thing that has
to reason about tools as data. The toolbar imports the type back; it must not re-export it,
because public-api.tsexport *s both modules and two modules exporting one name that way
is a TS2308 ambiguity.
Every tool the board knows, in the toolbar's own display order. This is the runtime companion to WhiteboardTool: the clamp needs to tell a real tool from a typo, and a union alone cannot do that once it has been erased.
It lives HERE rather than beside the toolbar because the roster is the only thing that has to reason about tools as data. The toolbar imports the type back; it must not re-export it, because
public-api.tsexport *s both modules and two modules exporting one name that way is a TS2308 ambiguity.