Now that we have decided in #5998 to use CSS to opt into the stylable/interoperable mode for <select>, we should figure out what the DOM/box structure should be.
In the OpenUI design and chromium implementation, there is a closed UA shadowroot on <select> which gets rendered when appearance:base-select is set:
<select>
#shadow-root
<!-- There are additional proprietary elements here which are only
used for appearance:auto/none mode. They aren't included in the
layout tree when appearance:base-select is set, and likewise,
the below elements aren't included in the layout tree in
appearance:auto/none mode. -->
<slot id="select-button">
<button pseudo="select-fallback-button">
<span pseudo="select-fallback-button-text"></span>
<div pseudo="select-fallback-button-icon">
<svg viewBox="0 0 20 16" fill="none"><path d="M4 6 L10 12 L 16 6"></path></svg>
</div>
</button>
</slot>
<slot id="select-datalist">
<datalist pseudo="select-fallback-datalist">
<slot id="select-datalist-options"></slot>
</datalist>
</slot>
</select>
Here is a mapping of which children of <select> will be slotted into the <slot>s in the structure above:
<slot id="select-button">: The first <button> child of <select>. This represents the in-page button which opens the popup containing options. If the author doesn't provide a button, then <button pseudo="select-fallback-button"> gets rendered instead. Here is an example of author HTML which would use this slot:
<select>
<button>i am slotted into id=select-button!</button>
</select>
<slot id="select-datalist">: The first <datalist> child of <select>. This represents the popup containing options, which is implemented as a popover anchored to the button. If the author doesn't provide a datalist, then <datalist pseudo="select-fallback-datalist"> is rendered instead. Here is an example of author HTML which would use this slot:
<select>
<datalist>i am slotted into id=select-datalist!</datalist>
</select>
<slot id="select-datalist-options">: All other child elements of <select> which aren't assigned into the button or datalist slots. This slot is only rendered if the author doesn't provide a datalist element. Here is an example of author HTML which would use this slot:
<select>
<option>I am slotted into id=select-datalist-options!</option>
<optgroup>I am also slotted into id=select-datalist-options!</optgroup>
</select>
All of the elements here with the proprietary pseudo attribute are mapped to pseudo-elements so that they can be targeted by the author in CSS, but we can discuss that later as I'd like to scope this issue down to the general structure.
I believe that WebKit and Gecko don't currently have a ShadowRoot attached to <select>, but I'm not sure if this whole structure I've proposed is implementable without it. I am hoping that adding a ShadowRoot to <select> would not impact the existing behavior of appearance:auto/none <select> in WebKit/Gecko.
I would like to get a resolution that the above ShadowRoot structure and slotting algorithms for <select> should be used in order to support appearance:base-select.
Now that we have decided in #5998 to use CSS to opt into the stylable/interoperable mode for
<select>, we should figure out what the DOM/box structure should be.In the OpenUI design and chromium implementation, there is a closed UA shadowroot on
<select>which gets rendered when appearance:base-select is set:Here is a mapping of which children of
<select>will be slotted into the<slot>s in the structure above:<slot id="select-button">: The first<button>child of<select>. This represents the in-page button which opens the popup containing options. If the author doesn't provide a button, then<button pseudo="select-fallback-button">gets rendered instead. Here is an example of author HTML which would use this slot:<slot id="select-datalist">: The first<datalist>child of<select>. This represents the popup containing options, which is implemented as a popover anchored to the button. If the author doesn't provide a datalist, then<datalist pseudo="select-fallback-datalist">is rendered instead. Here is an example of author HTML which would use this slot:<slot id="select-datalist-options">: All other child elements of<select>which aren't assigned into the button or datalist slots. This slot is only rendered if the author doesn't provide a datalist element. Here is an example of author HTML which would use this slot:All of the elements here with the proprietary
pseudoattribute are mapped to pseudo-elements so that they can be targeted by the author in CSS, but we can discuss that later as I'd like to scope this issue down to the general structure.I believe that WebKit and Gecko don't currently have a ShadowRoot attached to
<select>, but I'm not sure if this whole structure I've proposed is implementable without it. I am hoping that adding a ShadowRoot to<select>would not impact the existing behavior of appearance:auto/none<select>in WebKit/Gecko.I would like to get a resolution that the above ShadowRoot structure and slotting algorithms for
<select>should be used in order to support appearance:base-select.