I would like to be able to either customize this or replace it altogether with a new component due to some requirements where we need to do some fairly custom things on the front end just for this specific form
I was looking at component shadowing but wasn't sure what component I would even need to shadow.
Notice that getWidgetByFieldId is the first one tried, which means that you can easily register a config.widgets.id.sponsoring_level = SponsoringLevelWidget.
Do you happen to know if there is any documentation around how a custom Widget like this needs to be build so Plone gets all the information that it's expecting?
I don't know, what's the internal data model for that field? You can send anything to the Plone backend as the value of that field, it's up to Plone's Dexterity to accept that.
I think the Textarea Widget is one of the simplest examples. Basically, the widget "protocol" is just to call back the onChange prop with anything it desires as a value. If you're just starting with React, I can give you one general rule when writing widgets: most of the times they don't need to have an internal state for their value. Just "pass it up" with onChange and get it back as value.
Indeed, you can base it off Select. If it's only a matter of having the proper choices in that Select field, I think you can pass a vocabulary url to the Select widget and it will fetch the options through a @vocabulary endpoint.
Here's some code that can convince Volto to read the select values from a vocabulary URL.