I agree with both of these quotes! In this case, the Big | Small constructors exist only to serve the public API; I wouldn’t call them implementation details. The big trade-off here is whether you want to get a compile error if you introduce a new type of button. You might want that, or you might not!
Let’s say you have a style guide which renders all your reusable widgets (buttons, dropdowns, etc.) so developers can browse them, check for visual regressions, etc. (We have one of these style guides at NoRedInk.) If the style guide pattern matches on ButtonSize, then when you introduce a new size, you’ll get a compile error on the style guide, which could remind you to incorporate the new size into it.
On the other hand, choosing not to expose it means that introducing a new size won’t result in errors. That could be desirable if you expect to be reusing it in lots of places and want to minimize upgrade friction when adding things to the module.
So it depends on which of those considerations you value more. I could see myself choosing one approach in one code base, and the other approach in another code base!