Yes, remember we tried that on the old elm-discuss list at least a year ago? I was able to write a web component in Elm, and consume it in Elm too.
It got a bit hairy in places, because I ended up having to duplicate some state on the JS side that was also on the Elm side, but that was largely down to not having some mechanism whereby it could be more neatly integrated into Elm.
Thinking about what is a web component, or the input tag example: you can set such a thing up with properties and attributes (init), it has an internal state (Model), it may have internal events (Msg), some of those events can be tagged with your own message type to capture them using onX functions (onX : someProp -> msg -> Attribute msg), and of course you have a function to render the thing (view).
I proposed that Elm add a new Program type that can wrap all of this up and just let the consumer see the init, view and onX functions. This is really option 2 from my message above, where bigger programs are structured as smaller programs communicating through messages.
I now think that what works better, is to only use the primitive events that the Elm platform gives us, and use the model instead to communicate between parts of the program. So for a data picker UI component, the model could be like:
type Model =
NoDatePickedYet InternalModel
| PickedADate Date InternalModel
The consumer of this can see enough of the model to know when a date has been picked, and what it is. There is no need for the consumer to model that state itself, which there would be if the output of the date picker were an event in the form of a message. Accidental state can be kept hidden in an opaque internal model.
As a beginner I was excited by the idea of web components. Now I am not interested in them any more and think they are a nasty idea.