Я хотел бы реализовать виджет списка, используя текущие спецификации веб-компонентов. Более того, результирующий список должен соответствовать стандарту ARIA. Создание экземпляра виджета списка должно быть таким же простым, как:
<x-listbox>
<x-option>Option 1</x-option>
<x-option>Option 2</x-option>
</x-listbox>
В целях чистоты и инкапсуляции все остальное должно отображаться в теневом доме. Для реализации этого виджета регистрируются два пользовательских элемента, <x-listbox>
и <x-option>
. Элемент верхнего уровня теневого дома <x-listbox>
— это <div>
, который содержит атрибуты role=listbox
и aria-activedescendent
для доступности (мне не нужны эти атрибуты в элементе <x-listbox>
, потому что они являются деталями реализации).
Чтобы aria-activedescendent
работал, нужны идентификаторы элементов option. Помещение id непосредственно в элементы <x-option>
не сработает по двум причинам: во-первых, это загрязнит пространство имен id документа, в котором используется виджет списка. Во-вторых, что еще более важно, идентификаторы не работают через теневые границы (что является одной из целей теневого дома), поэтому идентификаторы опций должны жить в том же теневом доме, что и <div>
с атрибутом aria-activedescendent
.
Решением для этого было бы окружить каждый <x-option>
, отображаемый как контент внутри теневого дома <x-listbox>
, другим <div>
(принадлежащим этому теневому дому), на который можно поместить идентификатор.
Мой вопрос: правильный ли это путь и как это реализовать с помощью пользовательского элемента и веб-API теневого дома?