Not every style, configuration option, or piece of functionality requires an individual widget. For example, it may look like a necessity to have several form widgets, one for signing up, one for registering for an event, and another one for subscribing to a newsletter. They probably differ slightly in the data they request from the visitor, and trigger different actions on submission. However, they can still be combined into one widget by letting the editor choose the form’s purpose via a corresponding switch in the widget’s properties and having the form appear and work accordingly. Sometimes, widgets could even determine the CSS to use, etc., from their context: Am I on a landing page?
With the requirement in mind that widgets should not be overloaded or too complicated to use, it’s a good idea to use
enum attributes for letting editors switch between mutually exclusive styles, formats, functions, etc., and
multienum attributes for combining several of the available options with each other.