@lion/ui 0.24.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) hide show
  1. package/README.md +25 -7
  2. package/accordion-test-suites.js +2 -0
  3. package/collapsible-test-suites.js +1 -0
  4. package/combobox-test-suites.js +2 -0
  5. package/components/accordion/test/lion-accordion.test.js +2 -565
  6. package/components/accordion/test-suites/lion-accordion.suite.js +596 -0
  7. package/components/button/test-suites/LionButton.suite.js +13 -11
  8. package/components/button/test-suites/LionButtonReset.suite.js +11 -3
  9. package/components/button/test-suites/LionButtonSubmit.suite.js +11 -3
  10. package/components/calendar/test/lion-calendar.test.js +1 -1570
  11. package/components/calendar/test-suites/LionCalendar.suite.js +1617 -5
  12. package/components/checkbox-group/test/lion-checkbox-group-integrations.test.js +5 -2
  13. package/components/checkbox-group/test/lion-checkbox-indeterminate-integrations.test.js +13 -4
  14. package/components/checkbox-group/test/lion-checkbox-integrations.test.js +4 -1
  15. package/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.js +54 -54
  16. package/components/collapsible/test/lion-collapsible.test.js +2 -126
  17. package/components/collapsible/test-suites/LionCollapsible.suite.js +147 -0
  18. package/components/combobox/test/lion-combobox-integrations.test.js +11 -4
  19. package/components/combobox/test/lion-combobox.test.js +2 -3622
  20. package/components/combobox/test-suites/lion-combobox.suite.js +3665 -0
  21. package/components/core/src/ScopedElementsMixin.js +16 -1
  22. package/components/core/test-helpers/isElementVisible.js +21 -0
  23. package/components/core/test-helpers/resolveSuiteTag.js +97 -0
  24. package/components/core/types/TestSuiteTypes.ts +43 -0
  25. package/components/dialog/test/lion-dialog.integration.test.js +9 -10
  26. package/components/dialog/test/lion-dialog.test.js +2 -399
  27. package/components/dialog/test-suites/lion-dialog.suite.js +412 -0
  28. package/components/drawer/test/lion-drawer.test.js +2 -84
  29. package/components/drawer/test-suites/LionDrawer.suite.js +108 -0
  30. package/components/fieldset/test/lion-fieldset.test.js +7 -2
  31. package/components/form/test/lion-form.test.js +2 -348
  32. package/components/form/test-suites/lion-form.suite.js +398 -0
  33. package/components/form-core/test/FormatMixin.test.js +4 -1
  34. package/components/form-core/test/choice-group/CustomChoiceGroupMixin.integrations.test.js +13 -0
  35. package/components/form-core/test-suites/FormRegistrationMixins.suite.js +21 -26
  36. package/components/form-core/test-suites/FormatMixin.suite.js +45 -43
  37. package/components/form-core/test-suites/InteractionStateMixin.suite.js +19 -15
  38. package/components/form-core/test-suites/NativeTextFieldMixin.suite.js +8 -9
  39. package/components/form-core/test-suites/ValidateMixin.suite.js +14 -10
  40. package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +15 -2
  41. package/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.js +55 -33
  42. package/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.js +7 -6
  43. package/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.js +19 -22
  44. package/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.js +14 -5
  45. package/components/form-core/test-suites/form-group/FormGroupMixin.suite.js +13 -4
  46. package/components/icon/test/lion-icon.test.js +2 -188
  47. package/components/icon/test-suites/lion-icon.suite.js +206 -0
  48. package/components/input/test/input-integrations.test.js +18 -15
  49. package/components/input/test/lion-input-integrations.test.js +7 -3
  50. package/components/input/test/lion-input.test.js +2 -198
  51. package/components/input/test-suites/lion-input.suite.js +214 -0
  52. package/components/input-amount/src/parsers.js +5 -1
  53. package/components/input-amount/test/lion-input-amount-integrations.test.js +7 -3
  54. package/components/input-amount/test/lion-input-amount.test.js +2 -421
  55. package/components/input-amount/test/parsers.test.js +12 -0
  56. package/components/input-amount/test-suites/lion-input-amount.suite.js +418 -0
  57. package/components/input-amount-dropdown/test/LionInputAmountDropdown.test.js +3 -2
  58. package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +4 -2
  59. package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +6 -4
  60. package/components/input-date/test/lion-input-date-integrations.test.js +7 -3
  61. package/components/input-date/test/lion-input-date.test.js +2 -177
  62. package/components/input-date/test-suites/lion-input-date.suite.js +195 -0
  63. package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +7 -3
  64. package/components/input-datepicker/test/lion-input-datepicker.test.js +1 -844
  65. package/components/input-datepicker/test-helpers/DatepickerInputObject.js +26 -0
  66. package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +899 -14
  67. package/components/input-email/test/lion-input-email-integrations.test.js +4 -2
  68. package/components/input-email/test/lion-input-email.test.js +2 -46
  69. package/components/input-email/test-suites/lion-input-email.suite.js +63 -0
  70. package/components/input-file/test/lion-input-file.test.js +2 -1274
  71. package/components/input-file/test-suites/lion-input-file.suite.js +1505 -0
  72. package/components/input-iban/test/lion-input-iban-integrations.test.js +4 -2
  73. package/components/input-iban/test/lion-input-iban.test.js +2 -73
  74. package/components/input-iban/test-suites/lion-input-iban.suite.js +88 -0
  75. package/components/input-range/test/lion-input-range.test.js +2 -176
  76. package/components/input-range/test-suites/lion-input-range.suite.js +195 -0
  77. package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +14 -3
  78. package/components/input-stepper/test-suites/lion-input-stepper.suite.js +14 -10
  79. package/components/input-tel/test/LionInputTel.test.js +3 -1
  80. package/components/input-tel/test/parsers.test.js +87 -0
  81. package/components/input-tel/test-helpers/mockPhoneUtilManager.js +14 -3
  82. package/components/input-tel/test-suites/LionInputTel.suite.js +9 -4
  83. package/components/input-tel-dropdown/test/LionInputTelDropdown.test.js +6 -4
  84. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.js +10 -13
  85. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +6 -5
  86. package/components/listbox/src/LionListbox.js +1 -1
  87. package/components/listbox/test-suites/ListboxMixin.suite.js +19 -19
  88. package/components/menu/test-suites/InteractiveListMixin.suite.js +6 -9
  89. package/components/menu/test-suites/LionMenu.suite.js +6 -10
  90. package/components/menu/test-suites/LionMenuInteractions.suite.js +13 -4
  91. package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +6 -9
  92. package/components/menu/test-suites/MultiLevelListMixin.suite.js +15 -11
  93. package/components/overlays/src/OverlayController.js +7 -2
  94. package/components/overlays/src/OverlayMixin.js +3 -6
  95. package/components/overlays/test/OverlayController.test.js +37 -1
  96. package/components/overlays/test/invoker-compatibility.test.js +37 -0
  97. package/components/overlays/test-suites/OverlayMixin.suite.js +3 -5
  98. package/components/pagination/test/lion-pagination.test.js +2 -176
  99. package/components/pagination/test-suites/LionPagination.suite.js +201 -0
  100. package/components/progress-indicator/test/lion-progress-indicator.test.js +2 -203
  101. package/components/progress-indicator/test-suites/lion-progress-indicator.suite.js +214 -0
  102. package/components/radio-group/test/lion-radio-group.test.js +2 -162
  103. package/components/radio-group/test/lion-radio.test.js +2 -54
  104. package/components/radio-group/test-suites/lion-radio-group.suite.js +173 -0
  105. package/components/radio-group/test-suites/lion-radio.suite.js +70 -0
  106. package/components/select/test/lion-select.test.js +2 -79
  107. package/components/select/test-suites/LionSelect.suite.js +94 -0
  108. package/components/select-rich/src/LionSelectRich.js +2 -1
  109. package/components/select-rich/test/lion-select-invoker.test.js +2 -86
  110. package/components/select-rich/test/lion-select-rich-interaction.test.js +2 -430
  111. package/components/select-rich/test/lion-select-rich.test.js +2 -1193
  112. package/components/select-rich/test-suites/lion-select-invoker.suite.js +98 -0
  113. package/components/select-rich/test-suites/lion-select-rich-interaction.suite.js +452 -0
  114. package/components/select-rich/test-suites/lion-select-rich.suite.js +1236 -0
  115. package/components/steps/test/lion-step.test.js +2 -97
  116. package/components/steps/test/lion-steps.test.js +2 -433
  117. package/components/steps/test-suites/lion-step.suite.js +113 -0
  118. package/components/steps/test-suites/lion-steps.suite.js +445 -0
  119. package/components/switch/test/lion-switch.test.js +2 -232
  120. package/components/switch/test-suites/lion-switch.suite.js +450 -0
  121. package/components/tabs/test/lion-tabs.test.js +2 -596
  122. package/components/tabs/test-suites/lion-tabs.suite.js +617 -0
  123. package/components/textarea/src/LionTextarea.js +5 -2
  124. package/components/textarea/test/lion-textarea.test.js +2 -159
  125. package/components/textarea/test-suites/lion-textarea.suite.js +192 -0
  126. package/components/tooltip/test/lion-tooltip.test.js +2 -393
  127. package/components/tooltip/test-suites/lion-tooltip.suite.js +409 -0
  128. package/custom-elements.json +14890 -10187
  129. package/dialog-test-suites.js +2 -0
  130. package/dist-types/components/accordion/test/lion-accordion.test.d.ts +1 -2
  131. package/dist-types/components/accordion/test/lion-accordion.test.d.ts.map +1 -1
  132. package/dist-types/components/accordion/test-suites/lion-accordion.suite.d.ts +18 -0
  133. package/dist-types/components/accordion/test-suites/lion-accordion.suite.d.ts.map +1 -0
  134. package/dist-types/components/button/test-suites/LionButton.suite.d.ts +10 -4
  135. package/dist-types/components/button/test-suites/LionButton.suite.d.ts.map +1 -1
  136. package/dist-types/components/button/test-suites/LionButtonReset.suite.d.ts +10 -4
  137. package/dist-types/components/button/test-suites/LionButtonReset.suite.d.ts.map +1 -1
  138. package/dist-types/components/button/test-suites/LionButtonSubmit.suite.d.ts +10 -4
  139. package/dist-types/components/button/test-suites/LionButtonSubmit.suite.d.ts.map +1 -1
  140. package/dist-types/components/calendar/test/lion-calendar.test.d.ts +1 -3
  141. package/dist-types/components/calendar/test/lion-calendar.test.d.ts.map +1 -1
  142. package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts +13 -4
  143. package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts.map +1 -1
  144. package/dist-types/components/checkbox-group/test/lion-checkbox-group-integrations.test.d.ts.map +1 -1
  145. package/dist-types/components/checkbox-group/test/lion-checkbox-integrations.test.d.ts.map +1 -1
  146. package/dist-types/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.d.ts +12 -9
  147. package/dist-types/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.d.ts.map +1 -1
  148. package/dist-types/components/collapsible/test/lion-collapsible.test.d.ts +1 -3
  149. package/dist-types/components/collapsible/test/lion-collapsible.test.d.ts.map +1 -1
  150. package/dist-types/components/collapsible/test-suites/LionCollapsible.suite.d.ts +18 -0
  151. package/dist-types/components/collapsible/test-suites/LionCollapsible.suite.d.ts.map +1 -0
  152. package/dist-types/components/combobox/test/lion-combobox.test.d.ts +1 -5
  153. package/dist-types/components/combobox/test/lion-combobox.test.d.ts.map +1 -1
  154. package/dist-types/components/combobox/test-suites/lion-combobox.suite.d.ts +17 -0
  155. package/dist-types/components/combobox/test-suites/lion-combobox.suite.d.ts.map +1 -0
  156. package/dist-types/components/core/src/ScopedElementsMixin.d.ts.map +1 -1
  157. package/dist-types/components/core/test-helpers/isElementVisible.d.ts +12 -0
  158. package/dist-types/components/core/test-helpers/isElementVisible.d.ts.map +1 -0
  159. package/dist-types/components/core/test-helpers/resolveSuiteTag.d.ts +29 -0
  160. package/dist-types/components/core/test-helpers/resolveSuiteTag.d.ts.map +1 -0
  161. package/dist-types/components/core/types/TestSuiteTypes.d.ts +40 -0
  162. package/dist-types/components/core/types/TestSuiteTypes.d.ts.map +1 -0
  163. package/dist-types/components/dialog/test/lion-dialog.integration.test.d.ts.map +1 -1
  164. package/dist-types/components/dialog/test/lion-dialog.test.d.ts +1 -5
  165. package/dist-types/components/dialog/test/lion-dialog.test.d.ts.map +1 -1
  166. package/dist-types/components/dialog/test-suites/lion-dialog.suite.d.ts +19 -0
  167. package/dist-types/components/dialog/test-suites/lion-dialog.suite.d.ts.map +1 -0
  168. package/dist-types/components/drawer/test/lion-drawer.test.d.ts +1 -3
  169. package/dist-types/components/drawer/test/lion-drawer.test.d.ts.map +1 -1
  170. package/dist-types/components/drawer/test-suites/LionDrawer.suite.d.ts +20 -0
  171. package/dist-types/components/drawer/test-suites/LionDrawer.suite.d.ts.map +1 -0
  172. package/dist-types/components/fieldset/test/lion-fieldset.test.d.ts.map +1 -1
  173. package/dist-types/components/form/test/lion-form.test.d.ts +1 -12
  174. package/dist-types/components/form/test/lion-form.test.d.ts.map +1 -1
  175. package/dist-types/components/form/test-suites/lion-form.suite.d.ts +39 -0
  176. package/dist-types/components/form/test-suites/lion-form.suite.d.ts.map +1 -0
  177. package/dist-types/components/form-core/test-suites/FormRegistrationMixins.suite.d.ts +14 -17
  178. package/dist-types/components/form-core/test-suites/FormRegistrationMixins.suite.d.ts.map +1 -1
  179. package/dist-types/components/form-core/test-suites/FormatMixin.suite.d.ts +22 -38
  180. package/dist-types/components/form-core/test-suites/FormatMixin.suite.d.ts.map +1 -1
  181. package/dist-types/components/form-core/test-suites/InteractionStateMixin.suite.d.ts +11 -5
  182. package/dist-types/components/form-core/test-suites/InteractionStateMixin.suite.d.ts.map +1 -1
  183. package/dist-types/components/form-core/test-suites/NativeTextFieldMixin.suite.d.ts +9 -4
  184. package/dist-types/components/form-core/test-suites/NativeTextFieldMixin.suite.d.ts.map +1 -1
  185. package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts +9 -4
  186. package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
  187. package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts +10 -1
  188. package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts.map +1 -1
  189. package/dist-types/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.d.ts +17 -6
  190. package/dist-types/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.d.ts.map +1 -1
  191. package/dist-types/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.d.ts +5 -2
  192. package/dist-types/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.d.ts.map +1 -1
  193. package/dist-types/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.d.ts +10 -5
  194. package/dist-types/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.d.ts.map +1 -1
  195. package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.d.ts +10 -5
  196. package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.d.ts.map +1 -1
  197. package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin.suite.d.ts +10 -5
  198. package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin.suite.d.ts.map +1 -1
  199. package/dist-types/components/icon/test/lion-icon.test.d.ts +1 -4
  200. package/dist-types/components/icon/test/lion-icon.test.d.ts.map +1 -1
  201. package/dist-types/components/icon/test-suites/lion-icon.suite.d.ts +16 -0
  202. package/dist-types/components/icon/test-suites/lion-icon.suite.d.ts.map +1 -0
  203. package/dist-types/components/input/test/lion-input-integrations.test.d.ts.map +1 -1
  204. package/dist-types/components/input/test/lion-input.test.d.ts +1 -2
  205. package/dist-types/components/input/test/lion-input.test.d.ts.map +1 -1
  206. package/dist-types/components/input/test-suites/lion-input.suite.d.ts +17 -0
  207. package/dist-types/components/input/test-suites/lion-input.suite.d.ts.map +1 -0
  208. package/dist-types/components/input-amount/src/parsers.d.ts.map +1 -1
  209. package/dist-types/components/input-amount/test/lion-input-amount-integrations.test.d.ts.map +1 -1
  210. package/dist-types/components/input-amount/test/lion-input-amount.test.d.ts +1 -2
  211. package/dist-types/components/input-amount/test/lion-input-amount.test.d.ts.map +1 -1
  212. package/dist-types/components/input-amount/test-suites/lion-input-amount.suite.d.ts +19 -0
  213. package/dist-types/components/input-amount/test-suites/lion-input-amount.suite.d.ts.map +1 -0
  214. package/dist-types/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.d.ts.map +1 -1
  215. package/dist-types/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.d.ts +7 -3
  216. package/dist-types/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.d.ts.map +1 -1
  217. package/dist-types/components/input-date/test/lion-input-date-integrations.test.d.ts.map +1 -1
  218. package/dist-types/components/input-date/test/lion-input-date.test.d.ts +1 -3
  219. package/dist-types/components/input-date/test/lion-input-date.test.d.ts.map +1 -1
  220. package/dist-types/components/input-date/test-suites/lion-input-date.suite.d.ts +15 -0
  221. package/dist-types/components/input-date/test-suites/lion-input-date.suite.d.ts.map +1 -0
  222. package/dist-types/components/input-datepicker/test/lion-input-datepicker-integrations.test.d.ts.map +1 -1
  223. package/dist-types/components/input-datepicker/test/lion-input-datepicker.test.d.ts +1 -2
  224. package/dist-types/components/input-datepicker/test/lion-input-datepicker.test.d.ts.map +1 -1
  225. package/dist-types/components/input-datepicker/test-helpers/DatepickerInputObject.d.ts +8 -0
  226. package/dist-types/components/input-datepicker/test-helpers/DatepickerInputObject.d.ts.map +1 -1
  227. package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts +15 -5
  228. package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts.map +1 -1
  229. package/dist-types/components/input-email/test/lion-input-email-integrations.test.d.ts.map +1 -1
  230. package/dist-types/components/input-email/test/lion-input-email.test.d.ts +1 -3
  231. package/dist-types/components/input-email/test/lion-input-email.test.d.ts.map +1 -1
  232. package/dist-types/components/input-email/test-suites/lion-input-email.suite.d.ts +15 -0
  233. package/dist-types/components/input-email/test-suites/lion-input-email.suite.d.ts.map +1 -0
  234. package/dist-types/components/input-file/test/lion-input-file.test.d.ts +1 -5
  235. package/dist-types/components/input-file/test/lion-input-file.test.d.ts.map +1 -1
  236. package/dist-types/components/input-file/test-suites/lion-input-file.suite.d.ts +19 -0
  237. package/dist-types/components/input-file/test-suites/lion-input-file.suite.d.ts.map +1 -0
  238. package/dist-types/components/input-iban/test/lion-input-iban-integrations.test.d.ts.map +1 -1
  239. package/dist-types/components/input-iban/test/lion-input-iban.test.d.ts +1 -3
  240. package/dist-types/components/input-iban/test/lion-input-iban.test.d.ts.map +1 -1
  241. package/dist-types/components/input-iban/test-suites/lion-input-iban.suite.d.ts +15 -0
  242. package/dist-types/components/input-iban/test-suites/lion-input-iban.suite.d.ts.map +1 -0
  243. package/dist-types/components/input-range/test/lion-input-range.test.d.ts +1 -3
  244. package/dist-types/components/input-range/test/lion-input-range.test.d.ts.map +1 -1
  245. package/dist-types/components/input-range/test-suites/lion-input-range.suite.d.ts +15 -0
  246. package/dist-types/components/input-range/test-suites/lion-input-range.suite.d.ts.map +1 -0
  247. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.integration.suite.d.ts +10 -2
  248. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.integration.suite.d.ts.map +1 -1
  249. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts +10 -2
  250. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts.map +1 -1
  251. package/dist-types/components/input-tel/test-helpers/mockPhoneUtilManager.d.ts +5 -0
  252. package/dist-types/components/input-tel/test-helpers/mockPhoneUtilManager.d.ts.map +1 -1
  253. package/dist-types/components/input-tel/test-suites/LionInputTel.suite.d.ts +6 -4
  254. package/dist-types/components/input-tel/test-suites/LionInputTel.suite.d.ts.map +1 -1
  255. package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.d.ts +7 -3
  256. package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.d.ts.map +1 -1
  257. package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.d.ts +7 -3
  258. package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.d.ts.map +1 -1
  259. package/dist-types/components/listbox/src/LionListbox.d.ts +2 -2
  260. package/dist-types/components/listbox/src/LionListbox.d.ts.map +1 -1
  261. package/dist-types/components/listbox/test-suites/ListboxMixin.suite.d.ts +3 -4
  262. package/dist-types/components/listbox/test-suites/ListboxMixin.suite.d.ts.map +1 -1
  263. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +6 -5
  264. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +1 -1
  265. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +6 -5
  266. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +1 -1
  267. package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts +10 -4
  268. package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts.map +1 -1
  269. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +6 -5
  270. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +1 -1
  271. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +7 -6
  272. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +1 -1
  273. package/dist-types/components/overlays/src/OverlayController.d.ts +3 -1
  274. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  275. package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
  276. package/dist-types/components/overlays/test/invoker-compatibility.test.d.ts +3 -0
  277. package/dist-types/components/overlays/test/invoker-compatibility.test.d.ts.map +1 -0
  278. package/dist-types/components/overlays/test-suites/OverlayMixin.suite.d.ts.map +1 -1
  279. package/dist-types/components/pagination/test/lion-pagination.test.d.ts +1 -3
  280. package/dist-types/components/pagination/test/lion-pagination.test.d.ts.map +1 -1
  281. package/dist-types/components/pagination/test-suites/LionPagination.suite.d.ts +18 -0
  282. package/dist-types/components/pagination/test-suites/LionPagination.suite.d.ts.map +1 -0
  283. package/dist-types/components/progress-indicator/test/lion-progress-indicator.test.d.ts +1 -3
  284. package/dist-types/components/progress-indicator/test/lion-progress-indicator.test.d.ts.map +1 -1
  285. package/dist-types/components/progress-indicator/test-suites/lion-progress-indicator.suite.d.ts +15 -0
  286. package/dist-types/components/progress-indicator/test-suites/lion-progress-indicator.suite.d.ts.map +1 -0
  287. package/dist-types/components/radio-group/test/lion-radio-group.test.d.ts +1 -5
  288. package/dist-types/components/radio-group/test/lion-radio-group.test.d.ts.map +1 -1
  289. package/dist-types/components/radio-group/test/lion-radio.test.d.ts +1 -2
  290. package/dist-types/components/radio-group/test/lion-radio.test.d.ts.map +1 -1
  291. package/dist-types/components/radio-group/test-suites/lion-radio-group.suite.d.ts +19 -0
  292. package/dist-types/components/radio-group/test-suites/lion-radio-group.suite.d.ts.map +1 -0
  293. package/dist-types/components/radio-group/test-suites/lion-radio.suite.d.ts +17 -0
  294. package/dist-types/components/radio-group/test-suites/lion-radio.suite.d.ts.map +1 -0
  295. package/dist-types/components/select/test/lion-select.test.d.ts +1 -2
  296. package/dist-types/components/select/test/lion-select.test.d.ts.map +1 -1
  297. package/dist-types/components/select/test-suites/LionSelect.suite.d.ts +16 -0
  298. package/dist-types/components/select/test-suites/LionSelect.suite.d.ts.map +1 -0
  299. package/dist-types/components/select-rich/src/LionSelectRich.d.ts +5 -4
  300. package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
  301. package/dist-types/components/select-rich/test/lion-select-invoker.test.d.ts +1 -2
  302. package/dist-types/components/select-rich/test/lion-select-invoker.test.d.ts.map +1 -1
  303. package/dist-types/components/select-rich/test/lion-select-rich-interaction.test.d.ts +1 -5
  304. package/dist-types/components/select-rich/test/lion-select-rich-interaction.test.d.ts.map +1 -1
  305. package/dist-types/components/select-rich/test/lion-select-rich.test.d.ts +1 -8
  306. package/dist-types/components/select-rich/test/lion-select-rich.test.d.ts.map +1 -1
  307. package/dist-types/components/select-rich/test-suites/lion-select-invoker.suite.d.ts +19 -0
  308. package/dist-types/components/select-rich/test-suites/lion-select-invoker.suite.d.ts.map +1 -0
  309. package/dist-types/components/select-rich/test-suites/lion-select-rich-interaction.suite.d.ts +19 -0
  310. package/dist-types/components/select-rich/test-suites/lion-select-rich-interaction.suite.d.ts.map +1 -0
  311. package/dist-types/components/select-rich/test-suites/lion-select-rich.suite.d.ts +21 -0
  312. package/dist-types/components/select-rich/test-suites/lion-select-rich.suite.d.ts.map +1 -0
  313. package/dist-types/components/steps/test/lion-step.test.d.ts +1 -2
  314. package/dist-types/components/steps/test/lion-step.test.d.ts.map +1 -1
  315. package/dist-types/components/steps/test/lion-steps.test.d.ts +1 -8
  316. package/dist-types/components/steps/test/lion-steps.test.d.ts.map +1 -1
  317. package/dist-types/components/steps/test-suites/lion-step.suite.d.ts +17 -0
  318. package/dist-types/components/steps/test-suites/lion-step.suite.d.ts.map +1 -0
  319. package/dist-types/components/steps/test-suites/lion-steps.suite.d.ts +22 -0
  320. package/dist-types/components/steps/test-suites/lion-steps.suite.d.ts.map +1 -0
  321. package/dist-types/components/switch/test/lion-switch.test.d.ts +1 -4
  322. package/dist-types/components/switch/test/lion-switch.test.d.ts.map +1 -1
  323. package/dist-types/components/switch/test-suites/lion-switch.suite.d.ts +17 -0
  324. package/dist-types/components/switch/test-suites/lion-switch.suite.d.ts.map +1 -0
  325. package/dist-types/components/tabs/test/lion-tabs.test.d.ts +1 -5
  326. package/dist-types/components/tabs/test/lion-tabs.test.d.ts.map +1 -1
  327. package/dist-types/components/tabs/test-suites/lion-tabs.suite.d.ts +17 -0
  328. package/dist-types/components/tabs/test-suites/lion-tabs.suite.d.ts.map +1 -0
  329. package/dist-types/components/textarea/src/LionTextarea.d.ts.map +1 -1
  330. package/dist-types/components/textarea/test/lion-textarea.test.d.ts +1 -3
  331. package/dist-types/components/textarea/test/lion-textarea.test.d.ts.map +1 -1
  332. package/dist-types/components/textarea/test-suites/lion-textarea.suite.d.ts +15 -0
  333. package/dist-types/components/textarea/test-suites/lion-textarea.suite.d.ts.map +1 -0
  334. package/dist-types/components/tooltip/test/lion-tooltip.test.d.ts +1 -3
  335. package/dist-types/components/tooltip/test/lion-tooltip.test.d.ts.map +1 -1
  336. package/dist-types/components/tooltip/test-suites/lion-tooltip.suite.d.ts +19 -0
  337. package/dist-types/components/tooltip/test-suites/lion-tooltip.suite.d.ts.map +1 -0
  338. package/dist-types/exports/accordion-test-suites.d.ts +2 -0
  339. package/dist-types/exports/accordion-test-suites.d.ts.map +1 -0
  340. package/dist-types/exports/collapsible-test-suites.d.ts +2 -0
  341. package/dist-types/exports/collapsible-test-suites.d.ts.map +1 -0
  342. package/dist-types/exports/combobox-test-suites.d.ts +2 -0
  343. package/dist-types/exports/combobox-test-suites.d.ts.map +1 -0
  344. package/dist-types/exports/dialog-test-suites.d.ts +2 -0
  345. package/dist-types/exports/dialog-test-suites.d.ts.map +1 -0
  346. package/dist-types/exports/drawer-test-suites.d.ts +2 -0
  347. package/dist-types/exports/drawer-test-suites.d.ts.map +1 -0
  348. package/dist-types/exports/form-test-suites.d.ts +2 -0
  349. package/dist-types/exports/form-test-suites.d.ts.map +1 -0
  350. package/dist-types/exports/icon-test-suites.d.ts +2 -0
  351. package/dist-types/exports/icon-test-suites.d.ts.map +1 -0
  352. package/dist-types/exports/input-amount-test-suites.d.ts +2 -0
  353. package/dist-types/exports/input-amount-test-suites.d.ts.map +1 -0
  354. package/dist-types/exports/input-date-test-suites.d.ts +2 -0
  355. package/dist-types/exports/input-date-test-suites.d.ts.map +1 -0
  356. package/dist-types/exports/input-email-test-suites.d.ts +2 -0
  357. package/dist-types/exports/input-email-test-suites.d.ts.map +1 -0
  358. package/dist-types/exports/input-file-test-suites.d.ts +2 -0
  359. package/dist-types/exports/input-file-test-suites.d.ts.map +1 -0
  360. package/dist-types/exports/input-iban-test-suites.d.ts +2 -0
  361. package/dist-types/exports/input-iban-test-suites.d.ts.map +1 -0
  362. package/dist-types/exports/input-range-test-suites.d.ts +2 -0
  363. package/dist-types/exports/input-range-test-suites.d.ts.map +1 -0
  364. package/dist-types/exports/input-stepper-suites.d.ts +7 -2
  365. package/dist-types/exports/input-stepper-suites.d.ts.map +1 -1
  366. package/dist-types/exports/input-test-suites.d.ts +2 -0
  367. package/dist-types/exports/input-test-suites.d.ts.map +1 -0
  368. package/dist-types/exports/menu-test-suites.d.ts.map +1 -1
  369. package/dist-types/exports/pagination-test-suites.d.ts +2 -0
  370. package/dist-types/exports/pagination-test-suites.d.ts.map +1 -0
  371. package/dist-types/exports/progress-indicator-test-suites.d.ts +2 -0
  372. package/dist-types/exports/progress-indicator-test-suites.d.ts.map +1 -0
  373. package/dist-types/exports/radio-group-test-suites.d.ts +3 -0
  374. package/dist-types/exports/radio-group-test-suites.d.ts.map +1 -0
  375. package/dist-types/exports/select-rich-test-suites.d.ts +4 -0
  376. package/dist-types/exports/select-rich-test-suites.d.ts.map +1 -0
  377. package/dist-types/exports/select-test-suites.d.ts +2 -0
  378. package/dist-types/exports/select-test-suites.d.ts.map +1 -0
  379. package/dist-types/exports/steps-test-suites.d.ts +3 -0
  380. package/dist-types/exports/steps-test-suites.d.ts.map +1 -0
  381. package/dist-types/exports/switch-test-suites.d.ts +2 -0
  382. package/dist-types/exports/switch-test-suites.d.ts.map +1 -0
  383. package/dist-types/exports/tabs-test-suites.d.ts +2 -0
  384. package/dist-types/exports/tabs-test-suites.d.ts.map +1 -0
  385. package/dist-types/exports/textarea-test-suites.d.ts +2 -0
  386. package/dist-types/exports/textarea-test-suites.d.ts.map +1 -0
  387. package/dist-types/exports/tooltip-test-suites.d.ts +2 -0
  388. package/dist-types/exports/tooltip-test-suites.d.ts.map +1 -0
  389. package/dist-types/exports/types/test-suites.d.ts +4 -0
  390. package/dist-types/exports/types/test-suites.d.ts.map +1 -0
  391. package/dist-types/tsconfig.tsbuildinfo +1 -1
  392. package/drawer-test-suites.js +1 -0
  393. package/exports/accordion-test-suites.js +2 -0
  394. package/exports/collapsible-test-suites.js +1 -0
  395. package/exports/combobox-test-suites.js +2 -0
  396. package/exports/dialog-test-suites.js +2 -0
  397. package/exports/drawer-test-suites.js +1 -0
  398. package/exports/form-test-suites.js +2 -0
  399. package/exports/icon-test-suites.js +2 -0
  400. package/exports/input-amount-test-suites.js +2 -0
  401. package/exports/input-date-test-suites.js +2 -0
  402. package/exports/input-email-test-suites.js +2 -0
  403. package/exports/input-file-test-suites.js +2 -0
  404. package/exports/input-iban-test-suites.js +2 -0
  405. package/exports/input-range-test-suites.js +2 -0
  406. package/exports/input-stepper-suites.js +18 -4
  407. package/exports/input-test-suites.js +2 -0
  408. package/exports/menu-test-suites.js +3 -0
  409. package/exports/pagination-test-suites.js +1 -0
  410. package/exports/progress-indicator-test-suites.js +2 -0
  411. package/exports/radio-group-test-suites.js +3 -0
  412. package/exports/select-rich-test-suites.js +4 -0
  413. package/exports/select-test-suites.js +1 -0
  414. package/exports/steps-test-suites.js +3 -0
  415. package/exports/switch-test-suites.js +2 -0
  416. package/exports/tabs-test-suites.js +2 -0
  417. package/exports/textarea-test-suites.js +2 -0
  418. package/exports/tooltip-test-suites.js +2 -0
  419. package/exports/types/test-suites.ts +3 -0
  420. package/form-test-suites.js +2 -0
  421. package/generated/awesome-phonenumber/provenance.json +1 -1
  422. package/icon-test-suites.js +2 -0
  423. package/input-amount-test-suites.js +2 -0
  424. package/input-date-test-suites.js +2 -0
  425. package/input-email-test-suites.js +2 -0
  426. package/input-file-test-suites.js +2 -0
  427. package/input-iban-test-suites.js +2 -0
  428. package/input-range-test-suites.js +2 -0
  429. package/input-stepper-suites.js +18 -4
  430. package/input-test-suites.js +2 -0
  431. package/menu-test-suites.js +3 -0
  432. package/package.json +11 -7
  433. package/pagination-test-suites.js +1 -0
  434. package/progress-indicator-test-suites.js +2 -0
  435. package/radio-group-test-suites.js +3 -0
  436. package/select-rich-test-suites.js +4 -0
  437. package/select-test-suites.js +1 -0
  438. package/steps-test-suites.js +3 -0
  439. package/switch-test-suites.js +2 -0
  440. package/tabs-test-suites.js +2 -0
  441. package/textarea-test-suites.js +2 -0
  442. package/tooltip-test-suites.js +2 -0
  443. package/vscode.html-custom-data.json +60 -5
  444. package/web-types.json +219 -1
  445. package/components/button/test/demos.screenshots-test.js +0 -100
  446. package/components/calendar/test/demos.screenshots-test.js +0 -118
  447. package/components/input-file/test/lion-selected-file-list.test.js +0 -199
  448. package/components/select-rich/test/demos.screenshots-test.js +0 -168
  449. package/components/switch/test/lion-switch-button.test.js +0 -204
  450. package/dist-types/components/button/test/demos.screenshots-test.d.ts +0 -2
  451. package/dist-types/components/button/test/demos.screenshots-test.d.ts.map +0 -1
  452. package/dist-types/components/calendar/test/demos.screenshots-test.d.ts +0 -2
  453. package/dist-types/components/calendar/test/demos.screenshots-test.d.ts.map +0 -1
  454. package/dist-types/components/input-file/test/lion-selected-file-list.test.d.ts +0 -5
  455. package/dist-types/components/input-file/test/lion-selected-file-list.test.d.ts.map +0 -1
  456. package/dist-types/components/select-rich/test/demos.screenshots-test.d.ts +0 -2
  457. package/dist-types/components/select-rich/test/demos.screenshots-test.d.ts.map +0 -1
  458. package/dist-types/components/switch/test/lion-switch-button.test.d.ts +0 -4
  459. package/dist-types/components/switch/test/lion-switch-button.test.d.ts.map +0 -1
  460. package/docs/components/accordion/api-table.md +0 -53
  461. package/docs/components/accordion/index.md +0 -13
  462. package/docs/components/accordion/overview.md +0 -141
  463. package/docs/components/accordion/reference.md +0 -59
  464. package/docs/components/accordion/use-cases.md +0 -303
  465. package/docs/components/button/api-table.md +0 -84
  466. package/docs/components/button/assets/bootstrap-button.js +0 -245
  467. package/docs/components/button/examples.md +0 -42
  468. package/docs/components/button/extensions.md +0 -42
  469. package/docs/components/button/index.md +0 -13
  470. package/docs/components/button/overview.md +0 -42
  471. package/docs/components/button/src/icon.svg.js +0 -5
  472. package/docs/components/button/use-cases.md +0 -121
  473. package/docs/components/calendar/api-table.md +0 -56
  474. package/docs/components/calendar/index.md +0 -13
  475. package/docs/components/calendar/overview.md +0 -61
  476. package/docs/components/calendar/use-cases.md +0 -243
  477. package/docs/components/checkbox-group/api-table.md +0 -117
  478. package/docs/components/checkbox-group/index.md +0 -13
  479. package/docs/components/checkbox-group/overview.md +0 -51
  480. package/docs/components/checkbox-group/use-cases.md +0 -192
  481. package/docs/components/collapsible/api-table.md +0 -55
  482. package/docs/components/collapsible/assets/CustomCollapsible.js +0 -117
  483. package/docs/components/collapsible/assets/applyDemoCollapsibleStyles.js +0 -41
  484. package/docs/components/collapsible/examples.md +0 -95
  485. package/docs/components/collapsible/index.md +0 -13
  486. package/docs/components/collapsible/overview.md +0 -51
  487. package/docs/components/collapsible/use-cases.md +0 -91
  488. package/docs/components/combobox/api-table.md +0 -122
  489. package/docs/components/combobox/extensions.md +0 -174
  490. package/docs/components/combobox/index.md +0 -13
  491. package/docs/components/combobox/overview.md +0 -74
  492. package/docs/components/combobox/src/LinkMixin.js +0 -60
  493. package/docs/components/combobox/src/demo-selection-display.js +0 -164
  494. package/docs/components/combobox/src/gh-combobox/gh-button.js +0 -71
  495. package/docs/components/combobox/src/gh-combobox/gh-combobox.js +0 -515
  496. package/docs/components/combobox/src/google-combobox/assets/google-clear-icon.js +0 -9
  497. package/docs/components/combobox/src/google-combobox/assets/google-search-icon.js +0 -9
  498. package/docs/components/combobox/src/google-combobox/assets/google-voice-search-icon.js +0 -19
  499. package/docs/components/combobox/src/google-combobox/google-combobox.js +0 -461
  500. package/docs/components/combobox/src/lazyRender.js +0 -29
  501. package/docs/components/combobox/src/levenshtein.js +0 -95
  502. package/docs/components/combobox/src/md-combobox/MdFieldMixin.js +0 -345
  503. package/docs/components/combobox/src/md-combobox/md-combobox.js +0 -91
  504. package/docs/components/combobox/src/md-combobox/md-input.js +0 -5
  505. package/docs/components/combobox/src/md-combobox/style/load-roboto.js +0 -6
  506. package/docs/components/combobox/src/md-combobox/style/md-ripple.js +0 -82
  507. package/docs/components/combobox/src/wa-combobox/wa-combobox.js +0 -375
  508. package/docs/components/combobox/use-cases.md +0 -561
  509. package/docs/components/dialog/api-table.md +0 -61
  510. package/docs/components/dialog/index.md +0 -13
  511. package/docs/components/dialog/overview.md +0 -71
  512. package/docs/components/dialog/src/demoStyle.js +0 -57
  513. package/docs/components/dialog/src/external-dialog.js +0 -32
  514. package/docs/components/dialog/src/slots-dialog-content.js +0 -32
  515. package/docs/components/dialog/src/styled-dialog-content.js +0 -38
  516. package/docs/components/dialog/use-cases.md +0 -199
  517. package/docs/components/drawer/api-table.md +0 -64
  518. package/docs/components/drawer/index.md +0 -13
  519. package/docs/components/drawer/overview.md +0 -80
  520. package/docs/components/drawer/src/demoStyle.js +0 -71
  521. package/docs/components/drawer/use-cases.md +0 -206
  522. package/docs/components/fieldset/api-table.md +0 -24
  523. package/docs/components/fieldset/index.md +0 -13
  524. package/docs/components/fieldset/overview.md +0 -61
  525. package/docs/components/fieldset/use-cases.md +0 -203
  526. package/docs/components/form/api-table.md +0 -12
  527. package/docs/components/form/index.md +0 -13
  528. package/docs/components/form/overview.md +0 -66
  529. package/docs/components/form/use-cases.md +0 -230
  530. package/docs/components/icon/api-table.md +0 -41
  531. package/docs/components/icon/assets/bugs/bug01.svg.js +0 -2
  532. package/docs/components/icon/assets/bugs/bug02.svg.js +0 -2
  533. package/docs/components/icon/assets/bugs/bug05.svg.js +0 -2
  534. package/docs/components/icon/assets/bugs/bug06.svg.js +0 -2
  535. package/docs/components/icon/assets/bugs/bug08.svg.js +0 -2
  536. package/docs/components/icon/assets/bugs/bug12.svg.js +0 -2
  537. package/docs/components/icon/assets/bugs/bug19.svg.js +0 -2
  538. package/docs/components/icon/assets/bugs/bug23.svg.js +0 -2
  539. package/docs/components/icon/assets/bugs/bug24.svg.js +0 -2
  540. package/docs/components/icon/assets/iconset-bugs.js +0 -11
  541. package/docs/components/icon/assets/iconset-misc.js +0 -3
  542. package/docs/components/icon/assets/iconset-space.js +0 -31
  543. package/docs/components/icon/assets/misc/arrowLeft.svg.js +0 -6
  544. package/docs/components/icon/assets/space/aliens-spaceship.svg.js +0 -2
  545. package/docs/components/icon/assets/space/meteor.svg.js +0 -2
  546. package/docs/components/icon/assets/space/moon-flag.svg.js +0 -2
  547. package/docs/components/icon/assets/space/moon.svg.js +0 -2
  548. package/docs/components/icon/assets/space/night.svg.js +0 -2
  549. package/docs/components/icon/assets/space/orbit.svg.js +0 -2
  550. package/docs/components/icon/assets/space/planet.svg.js +0 -2
  551. package/docs/components/icon/assets/space/robot.svg.js +0 -2
  552. package/docs/components/icon/assets/space/rocket.svg.js +0 -2
  553. package/docs/components/icon/assets/space/satellite.svg.js +0 -2
  554. package/docs/components/icon/assets/space/signal.svg.js +0 -2
  555. package/docs/components/icon/assets/space/space-helmet.svg.js +0 -2
  556. package/docs/components/icon/assets/space/sun.svg.js +0 -2
  557. package/docs/components/icon/assets/space/telescope.svg.js +0 -2
  558. package/docs/components/icon/index.md +0 -13
  559. package/docs/components/icon/overview.md +0 -52
  560. package/docs/components/icon/use-cases.md +0 -92
  561. package/docs/components/index.md +0 -17
  562. package/docs/components/input/api-table.md +0 -52
  563. package/docs/components/input/index.md +0 -13
  564. package/docs/components/input/overview.md +0 -48
  565. package/docs/components/input/use-cases.md +0 -90
  566. package/docs/components/input-amount/api-table.md +0 -66
  567. package/docs/components/input-amount/index.md +0 -13
  568. package/docs/components/input-amount/overview.md +0 -61
  569. package/docs/components/input-amount/use-cases.md +0 -147
  570. package/docs/components/input-amount-dropdown/api-table.md +0 -87
  571. package/docs/components/input-amount-dropdown/index.md +0 -13
  572. package/docs/components/input-amount-dropdown/use-cases.md +0 -103
  573. package/docs/components/input-date/api-table.md +0 -58
  574. package/docs/components/input-date/index.md +0 -13
  575. package/docs/components/input-date/overview.md +0 -51
  576. package/docs/components/input-date/use-cases.md +0 -96
  577. package/docs/components/input-datepicker/api-table.md +0 -99
  578. package/docs/components/input-datepicker/index.md +0 -13
  579. package/docs/components/input-datepicker/overview.md +0 -54
  580. package/docs/components/input-datepicker/use-cases.md +0 -117
  581. package/docs/components/input-email/api-table.md +0 -53
  582. package/docs/components/input-email/index.md +0 -13
  583. package/docs/components/input-email/overview.md +0 -44
  584. package/docs/components/input-email/use-cases.md +0 -60
  585. package/docs/components/input-file/api-table.md +0 -157
  586. package/docs/components/input-file/index.md +0 -13
  587. package/docs/components/input-file/overview.md +0 -44
  588. package/docs/components/input-file/use-cases.md +0 -454
  589. package/docs/components/input-iban/api-table.md +0 -54
  590. package/docs/components/input-iban/index.md +0 -13
  591. package/docs/components/input-iban/overview.md +0 -49
  592. package/docs/components/input-iban/use-cases.md +0 -114
  593. package/docs/components/input-range/api-table.md +0 -71
  594. package/docs/components/input-range/index.md +0 -13
  595. package/docs/components/input-range/overview.md +0 -44
  596. package/docs/components/input-range/use-cases.md +0 -126
  597. package/docs/components/input-stepper/api-table.md +0 -74
  598. package/docs/components/input-stepper/index.md +0 -13
  599. package/docs/components/input-stepper/overview.md +0 -48
  600. package/docs/components/input-stepper/use-cases.md +0 -155
  601. package/docs/components/input-tel/api-table.md +0 -77
  602. package/docs/components/input-tel/index.md +0 -13
  603. package/docs/components/input-tel/overview.md +0 -74
  604. package/docs/components/input-tel/src/h-region-code-table.js +0 -109
  605. package/docs/components/input-tel/use-cases.md +0 -319
  606. package/docs/components/input-tel-dropdown/api-table.md +0 -85
  607. package/docs/components/input-tel-dropdown/extensions.md +0 -44
  608. package/docs/components/input-tel-dropdown/index.md +0 -13
  609. package/docs/components/input-tel-dropdown/overview.md +0 -50
  610. package/docs/components/input-tel-dropdown/src/intl-input-tel-dropdown.js +0 -138
  611. package/docs/components/input-tel-dropdown/use-cases.md +0 -171
  612. package/docs/components/listbox/api-table.md +0 -65
  613. package/docs/components/listbox/index.md +0 -13
  614. package/docs/components/listbox/overview.md +0 -54
  615. package/docs/components/listbox/src/listboxData.js +0 -131
  616. package/docs/components/listbox/use-cases.md +0 -154
  617. package/docs/components/menu/api-table.md +0 -44
  618. package/docs/components/menu/applyMenuDemoStyles.js +0 -173
  619. package/docs/components/menu/extensions.md +0 -262
  620. package/docs/components/menu/index.md +0 -13
  621. package/docs/components/menu/migration.md +0 -129
  622. package/docs/components/menu/overview.md +0 -448
  623. package/docs/components/menu/src/DemoNavigationBar.js +0 -441
  624. package/docs/components/menu/src/DemoSpinButton.js +0 -215
  625. package/docs/components/menu/src/DemoToolbar.js +0 -101
  626. package/docs/components/menu/src/DemoTree.js +0 -55
  627. package/docs/components/menu/src/navigation-bar-types.js +0 -41
  628. package/docs/components/menu/use-cases.md +0 -74
  629. package/docs/components/pagination/api-table.md +0 -45
  630. package/docs/components/pagination/index.md +0 -13
  631. package/docs/components/pagination/overview.md +0 -41
  632. package/docs/components/pagination/use-cases.md +0 -113
  633. package/docs/components/progress-indicator/api-table.md +0 -48
  634. package/docs/components/progress-indicator/assets/my-determinate-progress-bar.js +0 -30
  635. package/docs/components/progress-indicator/assets/my-indeterminate-progress-spinner.js +0 -55
  636. package/docs/components/progress-indicator/examples.md +0 -137
  637. package/docs/components/progress-indicator/index.md +0 -13
  638. package/docs/components/progress-indicator/overview.md +0 -48
  639. package/docs/components/radio-group/api-table.md +0 -63
  640. package/docs/components/radio-group/index.md +0 -13
  641. package/docs/components/radio-group/overview.md +0 -58
  642. package/docs/components/radio-group/use-cases.md +0 -146
  643. package/docs/components/select/api-table.md +0 -51
  644. package/docs/components/select/index.md +0 -13
  645. package/docs/components/select/overview.md +0 -56
  646. package/docs/components/select/use-cases.md +0 -128
  647. package/docs/components/select-rich/api-table.md +0 -123
  648. package/docs/components/select-rich/examples.md +0 -43
  649. package/docs/components/select-rich/index.md +0 -13
  650. package/docs/components/select-rich/overview.md +0 -55
  651. package/docs/components/select-rich/src/flagStyles.js +0 -1250
  652. package/docs/components/select-rich/src/intl-select-rich.js +0 -194
  653. package/docs/components/select-rich/src/regionMetaList.js +0 -1717
  654. package/docs/components/select-rich/use-cases.md +0 -387
  655. package/docs/components/steps/api-table.md +0 -92
  656. package/docs/components/steps/index.md +0 -13
  657. package/docs/components/steps/overview.md +0 -77
  658. package/docs/components/steps/use-cases.md +0 -181
  659. package/docs/components/switch/api-table.md +0 -82
  660. package/docs/components/switch/index.md +0 -13
  661. package/docs/components/switch/overview.md +0 -87
  662. package/docs/components/switch/reference.md +0 -51
  663. package/docs/components/switch/use-cases.md +0 -88
  664. package/docs/components/tabs/api-table.md +0 -51
  665. package/docs/components/tabs/examples.md +0 -35
  666. package/docs/components/tabs/index.md +0 -13
  667. package/docs/components/tabs/overview.md +0 -60
  668. package/docs/components/tabs/src/lea-tab-panel.js +0 -26
  669. package/docs/components/tabs/src/lea-tab.js +0 -50
  670. package/docs/components/tabs/src/lea-tabs.js +0 -28
  671. package/docs/components/tabs/use-cases.md +0 -231
  672. package/docs/components/textarea/api-table.md +0 -57
  673. package/docs/components/textarea/index.md +0 -13
  674. package/docs/components/textarea/overview.md +0 -47
  675. package/docs/components/textarea/use-cases.md +0 -107
  676. package/docs/components/tooltip/api-table.md +0 -62
  677. package/docs/components/tooltip/examples.md +0 -51
  678. package/docs/components/tooltip/index.md +0 -13
  679. package/docs/components/tooltip/overview.md +0 -56
  680. package/docs/components/tooltip/use-cases.md +0 -275
  681. package/docs/fundamentals/index.md +0 -19
  682. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +0 -13
  683. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +0 -246
  684. package/docs/fundamentals/node-tools/index.md +0 -11
  685. package/docs/fundamentals/node-tools/providence-analytics/index.md +0 -13
  686. package/docs/fundamentals/node-tools/providence-analytics/overview.md +0 -108
  687. package/docs/fundamentals/node-tools/publish-docs/index.md +0 -13
  688. package/docs/fundamentals/node-tools/publish-docs/overview.md +0 -149
  689. package/docs/fundamentals/node-tools/remark-extend/index.md +0 -13
  690. package/docs/fundamentals/node-tools/remark-extend/overview.md +0 -287
  691. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +0 -13
  692. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +0 -298
  693. package/docs/fundamentals/rationales/TypeScript.md +0 -123
  694. package/docs/fundamentals/rationales/accessibility.md +0 -40
  695. package/docs/fundamentals/rationales/index.md +0 -11
  696. package/docs/fundamentals/rationales/side-effects.md +0 -215
  697. package/docs/fundamentals/rationales/versioning.md +0 -47
  698. package/docs/fundamentals/systems/core/SlotMixin.md +0 -168
  699. package/docs/fundamentals/systems/core/api-table.md +0 -43
  700. package/docs/fundamentals/systems/core/index.md +0 -15
  701. package/docs/fundamentals/systems/core/overview.md +0 -98
  702. package/docs/fundamentals/systems/form/api-table.md +0 -40
  703. package/docs/fundamentals/systems/form/assets/h-output.js +0 -156
  704. package/docs/fundamentals/systems/form/formatting-and-parsing.md +0 -258
  705. package/docs/fundamentals/systems/form/index.md +0 -15
  706. package/docs/fundamentals/systems/form/interaction-states.md +0 -195
  707. package/docs/fundamentals/systems/form/model-value.md +0 -57
  708. package/docs/fundamentals/systems/form/overview.md +0 -95
  709. package/docs/fundamentals/systems/form/styling.md +0 -92
  710. package/docs/fundamentals/systems/form/use-cases.md +0 -187
  711. package/docs/fundamentals/systems/form/validate.md +0 -985
  712. package/docs/fundamentals/systems/icon/index.md +0 -15
  713. package/docs/fundamentals/systems/icon/overview.md +0 -137
  714. package/docs/fundamentals/systems/index.md +0 -11
  715. package/docs/fundamentals/systems/localize/api-table.md +0 -72
  716. package/docs/fundamentals/systems/localize/assets/all-locales.js +0 -437
  717. package/docs/fundamentals/systems/localize/assets/en-AU.js +0 -6
  718. package/docs/fundamentals/systems/localize/assets/en-GB.js +0 -6
  719. package/docs/fundamentals/systems/localize/assets/en-US.js +0 -6
  720. package/docs/fundamentals/systems/localize/assets/en.js +0 -4
  721. package/docs/fundamentals/systems/localize/assets/nl-BE.js +0 -6
  722. package/docs/fundamentals/systems/localize/assets/nl-NL.js +0 -6
  723. package/docs/fundamentals/systems/localize/assets/nl.js +0 -4
  724. package/docs/fundamentals/systems/localize/dates.md +0 -208
  725. package/docs/fundamentals/systems/localize/index.md +0 -15
  726. package/docs/fundamentals/systems/localize/numbers.md +0 -230
  727. package/docs/fundamentals/systems/localize/overview.md +0 -61
  728. package/docs/fundamentals/systems/localize/rationale.md +0 -75
  729. package/docs/fundamentals/systems/localize/text.md +0 -139
  730. package/docs/fundamentals/systems/localize/use-cases.md +0 -334
  731. package/docs/fundamentals/systems/overlays/_configuration-positioning.md +0 -118
  732. package/docs/fundamentals/systems/overlays/_edge-cases.md +0 -149
  733. package/docs/fundamentals/systems/overlays/api-table.md +0 -174
  734. package/docs/fundamentals/systems/overlays/assets/applyDemoOverlayStyles.js +0 -23
  735. package/docs/fundamentals/systems/overlays/assets/demo-el-using-overlaymixin.js +0 -104
  736. package/docs/fundamentals/systems/overlays/assets/demo-overlay-backdrop.js +0 -47
  737. package/docs/fundamentals/systems/overlays/assets/demo-overlay-positioning.mjs +0 -537
  738. package/docs/fundamentals/systems/overlays/assets/umbrella-form.js +0 -140
  739. package/docs/fundamentals/systems/overlays/configuration.md +0 -516
  740. package/docs/fundamentals/systems/overlays/index.md +0 -15
  741. package/docs/fundamentals/systems/overlays/overview.md +0 -126
  742. package/docs/fundamentals/systems/overlays/rationale.md +0 -242
  743. package/docs/fundamentals/systems/overlays/use-cases.md +0 -717
  744. package/docs/fundamentals/tools/ajax/index.md +0 -15
  745. package/docs/fundamentals/tools/ajax/overview.md +0 -269
  746. package/docs/fundamentals/tools/ajax/use-cases.md +0 -469
  747. package/docs/fundamentals/tools/helpers/action-logger.md +0 -175
  748. package/docs/fundamentals/tools/helpers/index.md +0 -15
  749. package/docs/fundamentals/tools/helpers/overview.md +0 -43
  750. package/docs/fundamentals/tools/index.md +0 -11
  751. package/docs/fundamentals/tools/singleton-manager/example-complex/demo-app.js +0 -95
  752. package/docs/fundamentals/tools/singleton-manager/example-complex/index.md +0 -34
  753. package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/overlays/index.js +0 -30
  754. package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/overlays/instance.js +0 -4
  755. package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/page-a/page-a.js +0 -35
  756. package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/page-b/node_modules/overlays/index.js +0 -30
  757. package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/page-b/node_modules/overlays/instance.js +0 -4
  758. package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/page-b/page-b.js +0 -49
  759. package/docs/fundamentals/tools/singleton-manager/example-complex/overlayCompatibility.js +0 -69
  760. package/docs/fundamentals/tools/singleton-manager/example-fail/demo-app.js +0 -93
  761. package/docs/fundamentals/tools/singleton-manager/example-fail/index.md +0 -32
  762. package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/overlays/index.js +0 -30
  763. package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/overlays/instance.js +0 -3
  764. package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/page-c/page-c.js +0 -34
  765. package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/page-d/node_modules/overlays/index.js +0 -30
  766. package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/page-d/node_modules/overlays/instance.js +0 -3
  767. package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/page-d/page-d.js +0 -34
  768. package/docs/fundamentals/tools/singleton-manager/example-success/demo-app.js +0 -95
  769. package/docs/fundamentals/tools/singleton-manager/example-success/index.md +0 -31
  770. package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/overlays/index.js +0 -30
  771. package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/overlays/instance.js +0 -4
  772. package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/page-e/page-e.js +0 -33
  773. package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/page-f/node_modules/overlays/index.js +0 -30
  774. package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/page-f/node_modules/overlays/instance.js +0 -4
  775. package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/page-f/page-f.js +0 -34
  776. package/docs/fundamentals/tools/singleton-manager/example-success/overlayCompatibility.js +0 -23
  777. package/docs/fundamentals/tools/singleton-manager/index.md +0 -15
  778. package/docs/fundamentals/tools/singleton-manager/overview.md +0 -317
  779. package/docs/guides/how-to/create-a-custom-field.md +0 -212
  780. package/docs/guides/how-to/create-a-form.md +0 -101
  781. package/docs/guides/how-to/extend-a-native-input.md +0 -78
  782. package/docs/guides/how-to/get-started.md +0 -116
  783. package/docs/guides/how-to/index.md +0 -25
  784. package/docs/guides/index.md +0 -44
  785. package/docs/guides/principles/definitions-and-terms.md +0 -53
  786. package/docs/guides/principles/index.md +0 -36
  787. package/docs/guides/principles/scoped-elements.md +0 -119
  788. package/docs/guides/principles/styling.md +0 -43
  789. package/docs/guides/principles/subclasser-apis.md +0 -40
@@ -0,0 +1,1236 @@
1
+ import { html } from 'lit/static-html.js';
2
+ import { LionSelectInvoker, LionSelectRich } from '@lion/ui/select-rich.js';
3
+ import { getSelectRichMembers } from '@lion/ui/select-rich-test-helpers.js';
4
+ import { mimicClick } from '@lion/ui/overlays-test-helpers.js';
5
+ import { OverlayController } from '@lion/ui/overlays.js';
6
+ import { LionOption } from '@lion/ui/listbox.js';
7
+ import '@lion/ui/define/lion-select-rich.js';
8
+ import '@lion/ui/define/lion-listbox.js';
9
+ import '@lion/ui/define/lion-option.js';
10
+ import { LionTabs } from '@lion/ui/tabs.js';
11
+ import '@lion/ui/define/lion-tabs.js';
12
+ import { LitElement, nothing } from 'lit';
13
+ import sinon from 'sinon';
14
+ import {
15
+ fixture as _fixture,
16
+ unsafeStatic,
17
+ nextFrame,
18
+ aTimeout,
19
+ defineCE,
20
+ expect,
21
+ waitUntil,
22
+ } from '@open-wc/testing';
23
+ import { cache } from 'lit/directives/cache.js';
24
+ import { resolveSuiteTag } from '../../core/test-helpers/resolveSuiteTag.js';
25
+ import { isActiveElement } from '../../core/test-helpers/isActiveElement.js';
26
+ import { isElementVisible } from '../../core/test-helpers/isElementVisible.js';
27
+
28
+ /**
29
+ * @typedef {import('../../form-core/types/FormControlMixinTypes.js').FormControlHost} FormControlHost
30
+ * @typedef {import('../../listbox/types/ListboxMixinTypes.js').ListboxHost} ListboxHost
31
+ * @typedef {import('../../listbox/src/LionOptions.js').LionOptions} LionOptions
32
+ * @typedef {import('lit').TemplateResult} TemplateResult
33
+ */
34
+
35
+ const fixture = /** @type {(arg: TemplateResult) => Promise<LionSelectRich>} */ _fixture;
36
+
37
+ /**
38
+ * Runs the `lion-select-rich` behavioural suite. The caller hands the elements it should run against;
39
+ * anything left out keeps Lion's own element.
40
+ * @typedef {import('@lion/ui/types/test-suites.js').SuiteElement} SuiteElement
41
+ * @param {import('@lion/ui/types/test-suites.js').SuiteConfig<{host: SuiteElement; option: SuiteElement; tabs: SuiteElement}>} [customConfig]
42
+ */
43
+ export function runSelectRichSuite({
44
+ classes: {
45
+ host: hostEl = LionSelectRich,
46
+ option: optionEl = LionOption,
47
+ tabs: tabsEl = LionTabs,
48
+ } = {},
49
+ tagString: legacyTagString,
50
+ optionTagString: legacyOptionTagString,
51
+ tabsTagString: legacyTabsTagString,
52
+ } = {}) {
53
+ const hostTagString = resolveSuiteTag(hostEl, legacyTagString);
54
+ const hostTag = unsafeStatic(hostTagString);
55
+ const tagNameOption = resolveSuiteTag(optionEl, legacyOptionTagString);
56
+ const tagOption = unsafeStatic(tagNameOption);
57
+ const tagNameTabs = resolveSuiteTag(tabsEl, legacyTabsTagString);
58
+ const tagTabs = unsafeStatic(tagNameTabs);
59
+ describe('lion-select-rich', () => {
60
+ it('clicking the label should focus the invoker', async () => {
61
+ const el = await fixture(html` <${hostTag} label="foo"> </${hostTag}> `);
62
+ expect(isActiveElement(document.body)).to.be.true;
63
+ const { _labelNode, _invokerNode } = getSelectRichMembers(el);
64
+ _labelNode.click();
65
+ expect(isActiveElement(_invokerNode)).to.be.true;
66
+ });
67
+ it('has an attribute focused when focused', async () => {
68
+ const el = await fixture(html` <${hostTag} label="foo"> </${hostTag}> `);
69
+ el.focus();
70
+ await el.updateComplete;
71
+ expect(el.hasAttribute('focused')).to.be.true;
72
+ el.blur();
73
+ await el.updateComplete;
74
+ expect(el.hasAttribute('focused')).to.be.false;
75
+ });
76
+ it('checks the first enabled option', async () => {
77
+ const el = await fixture(html`
78
+ <${hostTag}>
79
+ <${tagOption} .choiceValue=${'Red'}></${tagOption}>
80
+ <${tagOption} .choiceValue=${'Hotpink'}></${tagOption}>
81
+ <${tagOption} .choiceValue=${'Blue'}></${tagOption}>
82
+ </${hostTag}>
83
+ `);
84
+ expect(el.activeIndex).to.equal(0);
85
+ expect(el.checkedIndex).to.equal(0);
86
+ });
87
+ it('still has a checked value while disabled', async () => {
88
+ const el = await fixture(html`
89
+ <${hostTag} disabled>
90
+ <${tagOption} .choiceValue=${'Red'}>Red</${tagOption}>
91
+ <${tagOption} .choiceValue=${'Hotpink'}>Hotpink</${tagOption}>
92
+ <${tagOption} .choiceValue=${'Blue'}>Blue</${tagOption}>
93
+ </${hostTag}>
94
+ `);
95
+ expect(el.modelValue).to.equal('Red');
96
+ });
97
+ it('supports having no default selection initially', async () => {
98
+ const el = await fixture(html`
99
+ <${hostTag} id="color" name="color" label="Favorite color" has-no-default-selected>
100
+ <${tagOption} .choiceValue=${'red'}>Red</${tagOption}>
101
+ <${tagOption} .choiceValue=${'hotpink'}>Hotpink</${tagOption}>
102
+ <${tagOption} .choiceValue=${'teal'}>Teal</${tagOption}>
103
+ </${hostTag}>
104
+ `);
105
+ const { _invokerNode } = getSelectRichMembers(el);
106
+ expect(_invokerNode.selectedElement).to.be.undefined;
107
+ expect(el.modelValue).to.equal('');
108
+ });
109
+ describe('Invoker', () => {
110
+ it('generates an lion-select-invoker if no invoker is provided', async () => {
111
+ const el = await fixture(html` <${hostTag}> </${hostTag}> `);
112
+ const { _invokerNode } = getSelectRichMembers(el);
113
+ expect(_invokerNode).to.exist;
114
+ expect(_invokerNode).to.be.instanceOf(LionSelectInvoker);
115
+ });
116
+ it('sets the first option as the selectedElement if no option is checked', async () => {
117
+ const el = await fixture(html`
118
+ <${hostTag} name="foo">
119
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
120
+ <${tagOption} .choiceValue=${20}>Item 2</${tagOption}>
121
+ </${hostTag}>
122
+ `);
123
+ const { _invokerNode } = getSelectRichMembers(el);
124
+ const options = el.formElements;
125
+ expect(_invokerNode.selectedElement).dom.to.equal(options[0]);
126
+ });
127
+ it('syncs the selected element to the invoker', async () => {
128
+ const el = await fixture(html`
129
+ <${hostTag} name="foo">
130
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
131
+ <${tagOption} .choiceValue=${20} checked>Item 2</${tagOption}>
132
+ </${hostTag}>
133
+ `);
134
+ const { _invokerNode } = getSelectRichMembers(el);
135
+ const options = el.querySelectorAll(tagNameOption);
136
+ expect(_invokerNode.selectedElement).dom.to.equal(options[1]);
137
+ el.checkedIndex = 0;
138
+ await el.updateComplete;
139
+ expect(_invokerNode.selectedElement).dom.to.equal(options[0]);
140
+ });
141
+ it('delegates readonly to the invoker', async () => {
142
+ const el = await fixture(html`
143
+ <${hostTag} readonly>
144
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
145
+ <${tagOption} .choiceValue=${20}>Item 2</${tagOption}>
146
+ </${hostTag}>
147
+ `);
148
+ const { _invokerNode } = getSelectRichMembers(el);
149
+ expect(el.hasAttribute('readonly')).to.be.true;
150
+ expect(_invokerNode.hasAttribute('readonly')).to.be.true;
151
+ });
152
+ it('delegates singleOption to the invoker', async () => {
153
+ const el = await fixture(html`
154
+ <${hostTag}>
155
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
156
+ </${hostTag}>
157
+ `);
158
+ const { _invokerNode } = getSelectRichMembers(el);
159
+ expect(el.singleOption).to.be.true;
160
+ expect(_invokerNode.hasAttribute('single-option')).to.be.true;
161
+ });
162
+ it('sets and removes the button role and aria attributes on change of singleOption', async () => {
163
+ const el = await fixture(html`
164
+ <${hostTag}>
165
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
166
+ <${tagOption} .choiceValue=${20}>Item 2</${tagOption}>
167
+ </${hostTag}>
168
+ `);
169
+ const { _invokerNode } = getSelectRichMembers(el);
170
+ expect(_invokerNode.hasAttribute('role')).to.be.true;
171
+ expect(_invokerNode.hasAttribute('aria-haspopup')).to.be.true;
172
+ expect(_invokerNode.hasAttribute('aria-expanded')).to.be.true;
173
+ el.singleOption = true;
174
+ await el.updateComplete;
175
+ expect(_invokerNode.hasAttribute('role')).to.be.false;
176
+ expect(_invokerNode.hasAttribute('aria-haspopup')).to.be.false;
177
+ expect(_invokerNode.hasAttribute('aria-expanded')).to.be.false;
178
+ el.singleOption = false;
179
+ await el.updateComplete;
180
+ expect(_invokerNode.hasAttribute('role')).to.be.true;
181
+ expect(_invokerNode.hasAttribute('aria-haspopup')).to.be.true;
182
+ expect(_invokerNode.hasAttribute('aria-expanded')).to.be.true;
183
+ });
184
+ it('updates the invoker when the selected element is the same but the modelValue was updated asynchronously', async () => {
185
+ const tagString = defineCE(
186
+ class LionCustomOption extends LionOption {
187
+ render() {
188
+ return html`${this.modelValue.value}`;
189
+ }
190
+ createRenderRoot() {
191
+ return this;
192
+ }
193
+ },
194
+ );
195
+ const tag = unsafeStatic(tagString);
196
+ const firstOption =
197
+ /** @type {LionOption} */
198
+ await _fixture(html`<${tag} checked .choiceValue=${10}></${tag}>`);
199
+ const el = await fixture(html`
200
+ <${hostTag}>
201
+ ${firstOption}
202
+ <${tag} .choiceValue=${20}></${tag}>
203
+ </${hostTag}>
204
+ `);
205
+ const { _invokerNode } = getSelectRichMembers(el);
206
+ const firstChild =
207
+ /** @type {HTMLElement} */
208
+ /** @type {ShadowRoot} */ _invokerNode.shadowRoot.firstElementChild;
209
+ expect(firstChild.textContent).to.equal('10');
210
+ firstOption.modelValue = {
211
+ value: 30,
212
+ checked: true,
213
+ };
214
+ await el.updateComplete;
215
+ expect(firstChild.textContent).to.equal('30');
216
+ });
217
+
218
+ // FIXME: wrong values in safari/webkit even though this passes in the "real" debug browsers
219
+ it.skip('inherits the content width including arrow width', async () => {
220
+ const el = await fixture(html`
221
+ <${hostTag}>
222
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
223
+ <${tagOption} .choiceValue=${10}>Item 2 with long label</${tagOption}>
224
+ </${hostTag}>
225
+ `);
226
+ el.opened = true;
227
+ const options = el.formElements;
228
+ await el.updateComplete;
229
+ const { _invokerNode, _inputNode } = getSelectRichMembers(el);
230
+ expect(_invokerNode.clientWidth).to.equal(options[1].clientWidth);
231
+ const newOption = /** @type {LionOption} */ document.createElement(tagNameOption);
232
+ newOption.choiceValue = 30;
233
+ newOption.textContent = '30 with longer label';
234
+ _inputNode.appendChild(newOption);
235
+ await el.updateComplete;
236
+ expect(_invokerNode.clientWidth).to.equal(options[2].clientWidth);
237
+ _inputNode.removeChild(newOption);
238
+ await el.updateComplete;
239
+ expect(_invokerNode.clientWidth).to.equal(options[1].clientWidth);
240
+ });
241
+ });
242
+ describe('overlay', () => {
243
+ it('should be closed by default', async () => {
244
+ const el = await fixture(html` <${hostTag}></${hostTag}> `);
245
+ expect(el.opened).to.be.false;
246
+ });
247
+ it('shows/hides the listbox via opened attribute', async () => {
248
+ const el = await fixture(html` <${hostTag}></${hostTag}> `);
249
+ const { _overlayCtrl } = getSelectRichMembers(el);
250
+ el.opened = true;
251
+ await el.updateComplete;
252
+ expect(_overlayCtrl.isShown).to.be.true;
253
+ el.opened = false;
254
+ await el.updateComplete;
255
+ await el.updateComplete; // safari takes a little longer
256
+ expect(_overlayCtrl.isShown).to.be.false;
257
+ });
258
+ it('syncs opened state with overlay shown', async () => {
259
+ const el = await fixture(html` <${hostTag} .opened=${true}></${hostTag}> `);
260
+ const outerEl =
261
+ /** @type {HTMLButtonElement} */
262
+ await _fixture('<button>somewhere</button>');
263
+ expect(el.opened).to.be.true;
264
+ mimicClick(outerEl);
265
+ await aTimeout(0);
266
+ expect(el.opened).to.be.false;
267
+ });
268
+ it('will focus the listbox on open and invoker on close', async () => {
269
+ const el = await fixture(html` <${hostTag}></${hostTag}> `);
270
+ const { _overlayCtrl, _listboxNode, _invokerNode } = getSelectRichMembers(el);
271
+ await _overlayCtrl.show();
272
+ await el.updateComplete;
273
+ expect(isActiveElement(_listboxNode)).to.be.true;
274
+ expect(isActiveElement(_invokerNode)).to.be.false;
275
+ el.opened = false;
276
+ await el.updateComplete;
277
+ await el.updateComplete; // safari takes a little longer
278
+ expect(isActiveElement(_listboxNode)).to.be.false;
279
+ expect(isActiveElement(_invokerNode)).to.be.true;
280
+ });
281
+ it('opens the listbox with checked option as active', async () => {
282
+ const el = await fixture(html`
283
+ <${hostTag}>
284
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
285
+ <${tagOption} .choiceValue=${20} checked>Item 2</${tagOption}>
286
+ </${hostTag}>
287
+ `);
288
+ const { _overlayCtrl } = getSelectRichMembers(el);
289
+ await _overlayCtrl.show();
290
+ await el.updateComplete;
291
+ const options = el.formElements;
292
+ expect(options[1].active).to.be.true;
293
+ expect(options[1].checked).to.be.true;
294
+ });
295
+ it('stays closed on click if it is disabled or readonly or has a single option', async () => {
296
+ const elReadOnly = await fixture(html`
297
+ <${hostTag} readonly>
298
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
299
+ <${tagOption} .choiceValue=${20} checked>Item 2</${tagOption}>
300
+ </${hostTag}>
301
+ `);
302
+ const { _invokerNode: _invokerNodeReadOnly } = getSelectRichMembers(elReadOnly);
303
+ const elDisabled = await fixture(html`
304
+ <${hostTag} disabled>
305
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
306
+ <${tagOption} .choiceValue=${20} checked>Item 2</${tagOption}>
307
+ </${hostTag}>
308
+ `);
309
+ const { _invokerNode: _invokerNodeDisabled } = getSelectRichMembers(elDisabled);
310
+ const elSingleoption = await fixture(html`
311
+ <${hostTag}>
312
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
313
+ </${hostTag}>
314
+ `);
315
+ const { _invokerNode: _invokerNodeSingleOption } = getSelectRichMembers(elSingleoption);
316
+ _invokerNodeReadOnly.click();
317
+ await elReadOnly.updateComplete;
318
+ expect(elReadOnly.opened).to.be.false;
319
+ _invokerNodeDisabled.click();
320
+ await elDisabled.updateComplete;
321
+ expect(elDisabled.opened).to.be.false;
322
+ _invokerNodeSingleOption.click();
323
+ await elSingleoption.updateComplete;
324
+ expect(elSingleoption.opened).to.be.false;
325
+ });
326
+ it('stays closed with [ArrowUp] or [ArrowDown] key in readonly mode or has a single option', async () => {
327
+ const elReadOnly = await fixture(html`
328
+ <${hostTag} readonly>
329
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
330
+ <${tagOption} .choiceValue=${20} checked>Item 2</${tagOption}>
331
+ </${hostTag}>
332
+ `);
333
+ const elSingleOption = await fixture(html`
334
+ <${hostTag}>
335
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
336
+ </${hostTag}>
337
+ `);
338
+ elReadOnly.dispatchEvent(
339
+ new KeyboardEvent('keyup', {
340
+ key: 'ArrowDown',
341
+ }),
342
+ );
343
+ expect(elReadOnly.opened).to.be.false;
344
+ elReadOnly.dispatchEvent(
345
+ new KeyboardEvent('keyup', {
346
+ key: 'ArrowUp',
347
+ }),
348
+ );
349
+ expect(elReadOnly.opened).to.be.false;
350
+ elSingleOption.dispatchEvent(
351
+ new KeyboardEvent('keyup', {
352
+ key: 'ArrowDown',
353
+ }),
354
+ );
355
+ expect(elSingleOption.opened).to.be.false;
356
+ elSingleOption.dispatchEvent(
357
+ new KeyboardEvent('keyup', {
358
+ key: 'ArrowUp',
359
+ }),
360
+ );
361
+ expect(elSingleOption.opened).to.be.false;
362
+ });
363
+ it('sets inheritsReferenceWidth to min by default', async () => {
364
+ const el = await fixture(html`
365
+ <${hostTag} name="favoriteColor" label="Favorite color">
366
+ <${tagOption} .choiceValue=${'red'}>Red</${tagOption}>
367
+ <${tagOption} .choiceValue=${'hotpink'}>Hotpink</${tagOption}>
368
+ <${tagOption} .choiceValue=${'teal'}>Teal</${tagOption}>
369
+ </${hostTag}>
370
+ `);
371
+ const { _overlayCtrl } = getSelectRichMembers(el);
372
+ expect(_overlayCtrl.inheritsReferenceWidth).to.equal('min');
373
+ el.opened = true;
374
+ await el.updateComplete;
375
+ expect(_overlayCtrl.inheritsReferenceWidth).to.equal('min');
376
+ });
377
+ it('should override the inheritsWidth prop when no default selected feature is used', async () => {
378
+ const el = await fixture(html`
379
+ <${hostTag} name="favoriteColor" label="Favorite color" has-no-default-selected>
380
+ <${tagOption} .choiceValue=${'red'}>Red</${tagOption}>
381
+ <${tagOption} .choiceValue=${'hotpink'}>Hotpink</${tagOption}>
382
+ <${tagOption} .choiceValue=${'teal'}>Teal</${tagOption}>
383
+ </${hostTag}>
384
+ `);
385
+ const { _overlayCtrl } = getSelectRichMembers(el);
386
+
387
+ // The default is min, so we override that behavior here
388
+ _overlayCtrl.updateConfig({
389
+ inheritsReferenceWidth: 'full',
390
+ });
391
+ el._initialInheritsReferenceWidth = 'full';
392
+ expect(_overlayCtrl.inheritsReferenceWidth).to.equal('full');
393
+ el.opened = true;
394
+ await el.updateComplete;
395
+ // Opens while hasNoDefaultSelected = true, so we expect an override
396
+ expect(_overlayCtrl.inheritsReferenceWidth).to.equal('min');
397
+
398
+ // Emulate selecting hotpink, it closing, and opening it again
399
+ el.modelValue = 'hotpink';
400
+ el.opened = false;
401
+ await el.updateComplete; // necessary for overlay controller to actually close and re-open
402
+ await el.updateComplete; // safari takes a little longer
403
+ el.opened = true;
404
+ await el.updateComplete;
405
+ await el.updateComplete; // safari takes a little longer
406
+ await _overlayCtrl._showComplete;
407
+
408
+ // noDefaultSelected will now flip the override back to what was the initial reference width
409
+ expect(_overlayCtrl.inheritsReferenceWidth).to.equal('full');
410
+ });
411
+ it('should have singleOption only if there is exactly one option', async () => {
412
+ const el = await fixture(html`
413
+ <${hostTag}>
414
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
415
+ <${tagOption} .choiceValue=${20}>Item 2</${tagOption}>
416
+ </${hostTag}>
417
+ `);
418
+ const { _inputNode, _invokerNode } = getSelectRichMembers(el);
419
+ expect(el.singleOption).to.be.false;
420
+ expect(_invokerNode.singleOption).to.be.false;
421
+ const optionElm = el.formElements[0];
422
+ optionElm.parentNode.removeChild(optionElm);
423
+ // @ts-ignore [test] we don't need args in this case
424
+ el.requestUpdate();
425
+ await el.updateComplete;
426
+ expect(el.singleOption).to.be.true;
427
+ expect(_invokerNode.singleOption).to.be.true;
428
+ const newOption = /** @type {LionOption} */ document.createElement(tagNameOption);
429
+ newOption.choiceValue = 30;
430
+ _inputNode.appendChild(newOption);
431
+ // @ts-ignore [test] allow to not provide args for testing purposes
432
+ el.requestUpdate();
433
+ await el.updateComplete;
434
+ expect(el.singleOption).to.be.false;
435
+ expect(_invokerNode.singleOption).to.be.false;
436
+ });
437
+ it('should have singleOption only if one option and no hasNoDefaultSelected', async () => {
438
+ const el = await fixture(html`
439
+ <${hostTag} has-no-default-selected>
440
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
441
+ </${hostTag}>
442
+ `);
443
+ const { _invokerNode } = getSelectRichMembers(el);
444
+ expect(el.singleOption).to.be.false;
445
+ expect(_invokerNode.singleOption).to.be.false;
446
+ });
447
+ it('adds/removes the autofocus attribute to/from _listboxNode', async () => {
448
+ const el = await fixture(html` <${hostTag}></${hostTag}> `);
449
+ const { _listboxNode } = getSelectRichMembers(el);
450
+ expect(_listboxNode.hasAttribute('autofocus')).to.be.false;
451
+ el.opened = true;
452
+ await el.updateComplete;
453
+ expect(_listboxNode.hasAttribute('autofocus')).to.be.true;
454
+ el.opened = false;
455
+ await el.updateComplete;
456
+ await el.updateComplete; // safari takes a little longer
457
+ expect(_listboxNode.hasAttribute('autofocus')).to.be.false;
458
+ });
459
+ it('adds focus to element with [role=listbox] when trapsKeyboardFocus is true', async () => {
460
+ const el = await fixture(html`
461
+ <${hostTag} .config=${{
462
+ trapsKeyboardFocus: true,
463
+ }}></${hostTag}>
464
+ `);
465
+ const { _listboxNode } = getSelectRichMembers(el);
466
+ expect(isActiveElement(_listboxNode)).to.be.false;
467
+ el.opened = true;
468
+ await el.updateComplete;
469
+ expect(isActiveElement(_listboxNode)).to.be.true;
470
+ el.opened = false;
471
+ await el.updateComplete;
472
+ await el.updateComplete; // safari takes a little longer
473
+ expect(isActiveElement(_listboxNode)).to.be.false;
474
+ });
475
+ });
476
+ describe('interaction-mode', () => {
477
+ it('allows to specify an interaction-mode which determines other behaviors', async () => {
478
+ const el = await fixture(html`
479
+ <${hostTag} interaction-mode="mac"> </${hostTag}>
480
+ `);
481
+ expect(el.interactionMode).to.equal('mac');
482
+ });
483
+ });
484
+ describe('Keyboard navigation', () => {
485
+ it('opens the listbox with [Enter] key via click handler', async () => {
486
+ const el = await fixture(html` <${hostTag}> </${hostTag}> `);
487
+ const { _invokerNode } = getSelectRichMembers(el);
488
+ _invokerNode.click();
489
+ await aTimeout(0);
490
+ expect(el.opened).to.be.true;
491
+ });
492
+ it('opens the listbox with [ ](Space) key via click handler', async () => {
493
+ const el = await fixture(html` <${hostTag}> </${hostTag}> `);
494
+ const { _invokerNode } = getSelectRichMembers(el);
495
+ _invokerNode.click();
496
+ await aTimeout(0);
497
+ expect(el.opened).to.be.true;
498
+ });
499
+ it('closes the listbox with [Escape] key once opened', async () => {
500
+ const el = await fixture(html` <${hostTag} opened> </${hostTag}> `);
501
+ const { _listboxNode } = getSelectRichMembers(el);
502
+ _listboxNode.dispatchEvent(
503
+ new KeyboardEvent('keydown', {
504
+ key: 'Escape',
505
+ }),
506
+ );
507
+ expect(el.opened).to.be.false;
508
+ });
509
+ it('closes the listbox with [Tab] key once opened', async () => {
510
+ const el = await fixture(html` <${hostTag} opened> </${hostTag}> `);
511
+ // tab can only be caught via keydown
512
+ const { _listboxNode } = getSelectRichMembers(el);
513
+ _listboxNode.dispatchEvent(
514
+ new KeyboardEvent('keydown', {
515
+ key: 'Tab',
516
+ }),
517
+ );
518
+ expect(el.opened).to.be.false;
519
+ });
520
+ it('does not close the listbox with [Tab] key once opened when trapsKeyboardFocus is true', async () => {
521
+ const el = await fixture(html`
522
+ <${hostTag} opened .config=${{
523
+ trapsKeyboardFocus: true,
524
+ }}> </${hostTag}>
525
+ `);
526
+ // tab can only be caught via keydown
527
+ const { _listboxNode } = getSelectRichMembers(el);
528
+ _listboxNode.dispatchEvent(
529
+ new KeyboardEvent('keydown', {
530
+ key: 'Tab',
531
+ }),
532
+ );
533
+ expect(el.opened).to.be.true;
534
+ });
535
+ });
536
+ describe('Mouse navigation', () => {
537
+ it('opens the listbox via click on invoker', async () => {
538
+ const el = await fixture(html` <${hostTag}> </${hostTag}> `);
539
+ expect(el.opened).to.be.false;
540
+ const { _invokerNode } = getSelectRichMembers(el);
541
+ _invokerNode.click();
542
+ await nextFrame(); // reflection of click takes some time
543
+ expect(el.opened).to.be.true;
544
+ });
545
+ it('closes the listbox when an option gets clicked', async () => {
546
+ const el = await fixture(html`
547
+ <${hostTag} opened>
548
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
549
+ </${hostTag}>
550
+ `);
551
+ expect(el.opened).to.be.true;
552
+ el.formElements[0].click();
553
+ expect(el.opened).to.be.false;
554
+ });
555
+ });
556
+ describe('Keyboard navigation Windows', () => {
557
+ it('closes the listbox with [Enter] key once opened', async () => {
558
+ const el = await fixture(html` <${hostTag} opened> </${hostTag}> `);
559
+ const { _listboxNode } = getSelectRichMembers(el);
560
+ _listboxNode.dispatchEvent(
561
+ new KeyboardEvent('keydown', {
562
+ key: 'Enter',
563
+ }),
564
+ );
565
+ expect(el.opened).to.be.false;
566
+ });
567
+ });
568
+ describe('Keyboard navigation Mac', () => {
569
+ it('checks active item and closes the listbox with [Enter] key via click handler once opened', async () => {
570
+ const el = await fixture(html`
571
+ <${hostTag} opened interaction-mode="mac">
572
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
573
+ <${tagOption} .choiceValue=${20}>Item 2</${tagOption}>
574
+ </${hostTag}>
575
+ `);
576
+ const { _listboxNode } = getSelectRichMembers(el);
577
+
578
+ // changes active but not checked
579
+ el.activeIndex = 1;
580
+ expect(el.checkedIndex).to.equal(0);
581
+ _listboxNode.dispatchEvent(
582
+ new KeyboardEvent('keydown', {
583
+ key: 'Enter',
584
+ }),
585
+ );
586
+ expect(el.opened).to.be.false;
587
+ expect(el.checkedIndex).to.equal(1);
588
+ });
589
+ it('opens the listbox with [ArrowUp] key', async () => {
590
+ const el = await fixture(html`
591
+ <${hostTag} interaction-mode="mac"> </${hostTag}>
592
+ `);
593
+ el.dispatchEvent(
594
+ new KeyboardEvent('keyup', {
595
+ key: 'ArrowUp',
596
+ }),
597
+ );
598
+ await el.updateComplete;
599
+ expect(el.opened).to.be.true;
600
+ });
601
+ it('opens the listbox with [ArrowDown] key', async () => {
602
+ const el = await fixture(html`
603
+ <${hostTag} interaction-mode="mac"> </${hostTag}>
604
+ `);
605
+ el.dispatchEvent(
606
+ new KeyboardEvent('keyup', {
607
+ key: 'ArrowDown',
608
+ }),
609
+ );
610
+ await el.updateComplete;
611
+ expect(el.opened).to.be.true;
612
+ });
613
+ });
614
+ describe('Accessibility', () => {
615
+ it('has the right references to its inner elements', async () => {
616
+ const el = await fixture(html`
617
+ <${hostTag} label="age">
618
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
619
+ <${tagOption} .choiceValue=${20}>Item 2</${tagOption}>
620
+ </${hostTag}>
621
+ `);
622
+ const { _invokerNode, _feedbackNode, _labelNode, _helpTextNode } = getSelectRichMembers(el);
623
+ expect(_invokerNode.getAttribute('aria-labelledby')).to.contain(_labelNode.id);
624
+ expect(_invokerNode.getAttribute('aria-labelledby')).to.contain(_invokerNode.id);
625
+ expect(_invokerNode.getAttribute('aria-describedby')).to.contain(_helpTextNode.id);
626
+ expect(_invokerNode.getAttribute('aria-describedby')).to.contain(_feedbackNode.id);
627
+ expect(_invokerNode.getAttribute('aria-haspopup')).to.equal('listbox');
628
+ });
629
+ it('notifies when the listbox is expanded or not', async () => {
630
+ // smoke test for overlay functionality
631
+ const el = await fixture(html` <${hostTag}> </${hostTag}> `);
632
+ const { _invokerNode } = getSelectRichMembers(el);
633
+ expect(_invokerNode.getAttribute('aria-expanded')).to.equal('false');
634
+ el.opened = true;
635
+ await el.updateComplete;
636
+ await el.updateComplete; // need 2 awaits as overlay.show is an async function
637
+
638
+ expect(_invokerNode.getAttribute('aria-expanded')).to.equal('true');
639
+ });
640
+ });
641
+ describe('Use cases', () => {
642
+ it('keeps showing the selected item after a new item has been added in the selectedIndex position', async () => {
643
+ const mySelectContainerTagString = defineCE(
644
+ // @ts-expect-error
645
+ class extends LitElement {
646
+ static get properties() {
647
+ return {
648
+ colorList: Array,
649
+ };
650
+ }
651
+ constructor() {
652
+ super();
653
+ this.colorList = [
654
+ {
655
+ label: 'Red',
656
+ value: 'red',
657
+ checked: false,
658
+ },
659
+ {
660
+ label: 'Hotpink',
661
+ value: 'hotpink',
662
+ checked: true,
663
+ },
664
+ {
665
+ label: 'Teal',
666
+ value: 'teal',
667
+ checked: false,
668
+ },
669
+ ];
670
+ }
671
+ render() {
672
+ return html`
673
+ <${hostTag} label="Favorite color" name="color">
674
+ ${this.colorList.map(
675
+ (colorObj) => html`
676
+ <${tagOption}
677
+ .modelValue=${{
678
+ value: colorObj.value,
679
+ checked: colorObj.checked,
680
+ }}
681
+ >${colorObj.label}</${tagOption}
682
+ >
683
+ `,
684
+ )}
685
+ </${hostTag}>
686
+ `;
687
+ }
688
+ },
689
+ );
690
+ const mySelectContainerTag = unsafeStatic(mySelectContainerTagString);
691
+ const el = await fixture(html`
692
+ <${mySelectContainerTag}></${mySelectContainerTag}>
693
+ `);
694
+ const selectRich =
695
+ /** @type {LionSelectRich} */
696
+ /** @type {ShadowRoot} */ el.shadowRoot.querySelector(hostTagString);
697
+ const { _invokerNode, _listboxNode } = getSelectRichMembers(selectRich);
698
+ expect(selectRich.checkedIndex).to.equal(1);
699
+ expect(selectRich.modelValue).to.equal('hotpink');
700
+ expect(/** @type {LionOption} */ _invokerNode.selectedElement.value).to.equal('hotpink');
701
+ const newOption = /** @type {LionOption} */ document.createElement(tagNameOption);
702
+ newOption.modelValue = {
703
+ checked: false,
704
+ value: 'blue',
705
+ };
706
+ newOption.textContent = 'Blue';
707
+ const hotpinkEl = _listboxNode.children[1];
708
+ hotpinkEl.insertAdjacentElement('beforebegin', newOption);
709
+ expect(selectRich.checkedIndex).to.equal(2);
710
+ expect(selectRich.modelValue).to.equal('hotpink');
711
+ expect(/** @type {LionOption} */ _invokerNode.selectedElement.value).to.equal('hotpink');
712
+ });
713
+ });
714
+ describe('Render from `lit` `cache`', () => {
715
+ describe('when `lion-option` is set by `.choiceValue` property with and no `checked` attribute', () => {
716
+ it('should display the second option', async () => {
717
+ const colours = [
718
+ {
719
+ label: 'Red',
720
+ value: 'red',
721
+ },
722
+ {
723
+ label: 'Blue',
724
+ value: 'blue',
725
+ },
726
+ ];
727
+
728
+ /**
729
+ * Note, inactive tab content is **destroyed** on every tab switch.
730
+ */
731
+ class Wrapper extends LitElement {
732
+ static properties = {
733
+ ...super.properties,
734
+ activeTabIndex: {
735
+ type: Number,
736
+ },
737
+ };
738
+ constructor() {
739
+ super();
740
+ this.activeTabIndex = 0;
741
+ }
742
+
743
+ /**
744
+ * @param {number} index
745
+ */
746
+ changeActiveTabIndex(index) {
747
+ this.activeTabIndex = index;
748
+ }
749
+ render() {
750
+ const changeActiveTabIndexRef = this.changeActiveTabIndex.bind(this);
751
+ return html`
752
+ <${tagTabs}>
753
+ <button
754
+ slot="tab"
755
+ class="first-button"
756
+ @click=${() => changeActiveTabIndexRef(0)}
757
+ >
758
+ Info
759
+ </button>
760
+ <p slot="panel">
761
+ ${cache(
762
+ this.activeTabIndex === 0
763
+ ? html`<${hostTag} name="favoriteColor" label="Favorite color">
764
+ ${colours.map(
765
+ (colour) => html`<${tagOption} .choiceValue="${colour.value}"
766
+ >${colour.label}</${tagOption}
767
+ >`,
768
+ )}
769
+ </${hostTag}>`
770
+ : nothing,
771
+ )}
772
+ </p>
773
+ <button
774
+ slot="tab"
775
+ class="second-button"
776
+ @click=${() => changeActiveTabIndexRef(1)}
777
+ >
778
+ Work
779
+ </button>
780
+ <p slot="panel">Info page with lots of information about us.</p>
781
+ </${tagTabs}>
782
+ `;
783
+ }
784
+ }
785
+ const wrapperFixture = /** @type {(arg: TemplateResult) => Promise<Wrapper>} */ _fixture;
786
+ const tagString = defineCE(Wrapper);
787
+ const wrapperTag = unsafeStatic(tagString);
788
+ const wrapperElement =
789
+ /** @type {Wrapper} */
790
+ await wrapperFixture(html`<${wrapperTag}></${wrapperTag}>`);
791
+ await wrapperElement.updateComplete;
792
+ const wrapperElementShadowRoot = wrapperElement.shadowRoot;
793
+ /**
794
+ * @returns { HTMLElement | null | undefined }
795
+ */
796
+ const getFirstButton = () => wrapperElementShadowRoot?.querySelector('.first-button');
797
+ /**
798
+ * @returns { HTMLElement | null | undefined }
799
+ */
800
+ const getSecondButton = () => wrapperElementShadowRoot?.querySelector('.second-button');
801
+ /**
802
+ * @returns { HTMLElement | null | undefined }
803
+ */
804
+ const getInvoker = () => wrapperElementShadowRoot?.querySelector('lion-select-invoker');
805
+ /**
806
+ * @returns { boolean }
807
+ */
808
+ const isSelectRichRendered = () => !!getInvoker()?.shadowRoot?.childNodes.length;
809
+ /**
810
+ * @returns { string | undefined }
811
+ */
812
+ const getSelectedColourLabel = () =>
813
+ getInvoker()?.shadowRoot?.querySelector('#content-wrapper')?.textContent?.trim();
814
+ const getDialog = () =>
815
+ wrapperElementShadowRoot
816
+ ?.querySelector(hostTagString)
817
+ ?.shadowRoot?.querySelector('dialog');
818
+ const isDialogVisible = () =>
819
+ // @ts-ignore
820
+ isElementVisible(getDialog()) &&
821
+ getDialog()?.querySelector('#overlay-content-node-wrapper[data-popper-placement]');
822
+ await waitUntil(isSelectRichRendered);
823
+ getInvoker()?.click();
824
+ await waitUntil(isDialogVisible);
825
+ // @ts-ignore [dynamic-key-access-in-test]
826
+ const optionBlue =
827
+ /** @type { HTMLElement | undefined } */ wrapperElementShadowRoot?.querySelectorAll(
828
+ tagNameOption,
829
+ )?.[1];
830
+ optionBlue?.click();
831
+ await waitUntil(() => !isDialogVisible());
832
+ const selectedColourLabelBeforeTabSwitch = getSelectedColourLabel();
833
+ expect(selectedColourLabelBeforeTabSwitch).to.equal('Blue');
834
+ getSecondButton()?.click();
835
+ await waitUntil(() => !isSelectRichRendered());
836
+ getFirstButton()?.click();
837
+ await waitUntil(isSelectRichRendered);
838
+ const selectedColourAfterTabSwitch = getSelectedColourLabel();
839
+ expect(selectedColourAfterTabSwitch).to.equal('Blue');
840
+ });
841
+ });
842
+ describe('when `lion-option` is set by `.choiceValue` property and `checked` attribute', () => {
843
+ it('should display the second option', async () => {
844
+ const colours = [
845
+ {
846
+ label: 'Red',
847
+ value: 'red',
848
+ checked: true,
849
+ },
850
+ {
851
+ label: 'Blue',
852
+ value: 'blue',
853
+ checked: false,
854
+ },
855
+ ];
856
+
857
+ /**
858
+ * Note, inactive tab content is **destroyed** on every tab switch.
859
+ */
860
+ class Wrapper extends LitElement {
861
+ static properties = {
862
+ ...super.properties,
863
+ activeTabIndex: {
864
+ type: Number,
865
+ },
866
+ };
867
+ constructor() {
868
+ super();
869
+ this.activeTabIndex = 0;
870
+ }
871
+
872
+ /**
873
+ * @param {number} index
874
+ */
875
+ changeActiveTabIndex(index) {
876
+ this.activeTabIndex = index;
877
+ }
878
+ render() {
879
+ const changeActiveTabIndexRef = this.changeActiveTabIndex.bind(this);
880
+ return html`
881
+ <${tagTabs}>
882
+ <button
883
+ slot="tab"
884
+ class="first-button"
885
+ @click=${() => changeActiveTabIndexRef(0)}
886
+ >
887
+ Info
888
+ </button>
889
+ <p slot="panel">
890
+ ${cache(
891
+ this.activeTabIndex === 0
892
+ ? html`<${hostTag} name="favoriteColor" label="Favorite color">
893
+ ${colours.map(
894
+ (colour) => html`<${tagOption}
895
+ .choiceValue="${colour.value}"
896
+ checked="${colour.checked || nothing}"
897
+ >${colour.label}</${tagOption}
898
+ >`,
899
+ )}
900
+ </${hostTag}>`
901
+ : nothing,
902
+ )}
903
+ </p>
904
+ <button
905
+ slot="tab"
906
+ class="second-button"
907
+ @click=${() => changeActiveTabIndexRef(1)}
908
+ >
909
+ Work
910
+ </button>
911
+ <p slot="panel">Info page with lots of information about us.</p>
912
+ </${tagTabs}>
913
+ `;
914
+ }
915
+ }
916
+ const wrapperFixture = /** @type {(arg: TemplateResult) => Promise<Wrapper>} */ _fixture;
917
+ const tagString = defineCE(Wrapper);
918
+ const wrapperTag = unsafeStatic(tagString);
919
+ const wrapperElement =
920
+ /** @type {Wrapper} */
921
+ await wrapperFixture(html`<${wrapperTag}></${wrapperTag}>`);
922
+ await wrapperElement.updateComplete;
923
+ const wrapperElementShadowRoot = wrapperElement.shadowRoot;
924
+ /**
925
+ * @returns { HTMLElement | null | undefined }
926
+ */
927
+ const getFirstButton = () => wrapperElementShadowRoot?.querySelector('.first-button');
928
+ /**
929
+ * @returns { HTMLElement | null | undefined }
930
+ */
931
+ const getSecondButton = () => wrapperElementShadowRoot?.querySelector('.second-button');
932
+ /**
933
+ * @returns { HTMLElement | null | undefined }
934
+ */
935
+ const getInvoker = () => wrapperElementShadowRoot?.querySelector('lion-select-invoker');
936
+ /**
937
+ * @returns { boolean }
938
+ */
939
+ const isSelectRichRendered = () => !!getInvoker()?.shadowRoot?.childNodes.length;
940
+ /**
941
+ * @returns { string | undefined }
942
+ */
943
+ const getSelectedColourLabel = () =>
944
+ getInvoker()?.shadowRoot?.querySelector('#content-wrapper')?.textContent?.trim();
945
+ const getDialog = () =>
946
+ wrapperElementShadowRoot
947
+ ?.querySelector(hostTagString)
948
+ ?.shadowRoot?.querySelector('dialog');
949
+ const isDialogVisible = () =>
950
+ // @ts-ignore
951
+ isElementVisible(getDialog()) &&
952
+ getDialog()?.querySelector('#overlay-content-node-wrapper[data-popper-placement]');
953
+ await waitUntil(isSelectRichRendered);
954
+ getInvoker()?.click();
955
+ await waitUntil(isDialogVisible);
956
+ // @ts-ignore [dynamic-key-access-in-test]
957
+ const optionBlue =
958
+ /** @type { HTMLElement | undefined } */ wrapperElementShadowRoot?.querySelectorAll(
959
+ tagNameOption,
960
+ )?.[1];
961
+ optionBlue?.click();
962
+ await waitUntil(() => !isDialogVisible());
963
+ const selectedColourLabelBeforeTabSwitch = getSelectedColourLabel();
964
+ expect(selectedColourLabelBeforeTabSwitch).to.equal('Blue');
965
+ getSecondButton()?.click();
966
+ await waitUntil(() => !isSelectRichRendered());
967
+ getFirstButton()?.click();
968
+ await waitUntil(isSelectRichRendered);
969
+ const selectedColourAfterTabSwitch = getSelectedColourLabel();
970
+ expect(selectedColourAfterTabSwitch).to.equal('Blue');
971
+ });
972
+ });
973
+ describe('when `lion-option` is set by `.modelValue` property', () => {
974
+ it('should display the second option', async () => {
975
+ const colours = [
976
+ {
977
+ label: 'Red',
978
+ value: 'red',
979
+ checked: true,
980
+ },
981
+ {
982
+ label: 'Blue',
983
+ value: 'blue',
984
+ checked: false,
985
+ },
986
+ ];
987
+
988
+ /**
989
+ * Note, inactive tab content is **destroyed** on every tab switch.
990
+ */
991
+ class Wrapper extends LitElement {
992
+ static properties = {
993
+ ...super.properties,
994
+ activeTabIndex: {
995
+ type: Number,
996
+ },
997
+ };
998
+ constructor() {
999
+ super();
1000
+ this.activeTabIndex = 0;
1001
+ }
1002
+
1003
+ /**
1004
+ * @param {number} index
1005
+ */
1006
+ changeActiveTabIndex(index) {
1007
+ this.activeTabIndex = index;
1008
+ }
1009
+ render() {
1010
+ const changeActiveTabIndexRef = this.changeActiveTabIndex.bind(this);
1011
+ return html`
1012
+ <${tagTabs}>
1013
+ <button
1014
+ slot="tab"
1015
+ class="first-button"
1016
+ @click=${() => changeActiveTabIndexRef(0)}
1017
+ >
1018
+ Info
1019
+ </button>
1020
+ <p slot="panel">
1021
+ ${cache(
1022
+ this.activeTabIndex === 0
1023
+ ? html`<${hostTag} name="favoriteColor" label="Favorite color">
1024
+ ${colours.map(
1025
+ (colour) => html`<${tagOption}
1026
+ @model-value-changed=${(/** @type {Event} */ ev) => {
1027
+ const lionOption = /** @type {LionOption} */ ev.target;
1028
+ // eslint-disable-next-line no-param-reassign
1029
+ colour.checked = lionOption.modelValue.checked;
1030
+ }}
1031
+ .modelValue=${{
1032
+ value: colour.value,
1033
+ checked: colour.checked,
1034
+ }}
1035
+ >${colour.label}</${tagOption}
1036
+ >`,
1037
+ )}
1038
+ </${hostTag}>`
1039
+ : nothing,
1040
+ )}
1041
+ </p>
1042
+ <button
1043
+ slot="tab"
1044
+ class="second-button"
1045
+ @click=${() => changeActiveTabIndexRef(1)}
1046
+ >
1047
+ Work
1048
+ </button>
1049
+ <p slot="panel">Info page with lots of information about us.</p>
1050
+ </${tagTabs}>
1051
+ `;
1052
+ }
1053
+ }
1054
+ const wrapperFixture = /** @type {(arg: TemplateResult) => Promise<Wrapper>} */ _fixture;
1055
+ const tagString = defineCE(Wrapper);
1056
+ const wrapperTag = unsafeStatic(tagString);
1057
+ const wrapperElement =
1058
+ /** @type {Wrapper} */
1059
+ await wrapperFixture(html`<${wrapperTag}></${wrapperTag}>`);
1060
+ await wrapperElement.updateComplete;
1061
+ const wrapperElementShadowRoot = wrapperElement.shadowRoot;
1062
+ /**
1063
+ * @returns { HTMLElement | null | undefined }
1064
+ */
1065
+ const getFirstButton = () => wrapperElementShadowRoot?.querySelector('.first-button');
1066
+ /**
1067
+ * @returns { HTMLElement | null | undefined }
1068
+ */
1069
+ const getSecondButton = () => wrapperElementShadowRoot?.querySelector('.second-button');
1070
+ /**
1071
+ * @returns { HTMLElement | null | undefined }
1072
+ */
1073
+ const getInvoker = () => wrapperElementShadowRoot?.querySelector('lion-select-invoker');
1074
+ /**
1075
+ * @returns { boolean }
1076
+ */
1077
+ const isSelectRichRendered = () => !!getInvoker()?.shadowRoot?.childNodes.length;
1078
+ /**
1079
+ * @returns { string | undefined }
1080
+ */
1081
+ const getSelectedColourLabel = () =>
1082
+ getInvoker()?.shadowRoot?.querySelector('#content-wrapper')?.textContent?.trim();
1083
+ const getDialog = () =>
1084
+ wrapperElementShadowRoot
1085
+ ?.querySelector(hostTagString)
1086
+ ?.shadowRoot?.querySelector('dialog');
1087
+ const isDialogVisible = () =>
1088
+ // @ts-ignore
1089
+ isElementVisible(getDialog()) &&
1090
+ getDialog()?.querySelector('#overlay-content-node-wrapper[data-popper-placement]');
1091
+ await waitUntil(isSelectRichRendered);
1092
+ getInvoker()?.click();
1093
+ await waitUntil(isDialogVisible);
1094
+ // @ts-ignore [dynamic-key-access-in-test]
1095
+ const optionBlue =
1096
+ /** @type { HTMLElement | undefined } */ wrapperElementShadowRoot?.querySelectorAll(
1097
+ tagNameOption,
1098
+ )?.[1];
1099
+ optionBlue?.click();
1100
+ await waitUntil(() => !isDialogVisible());
1101
+ const selectedColourLabelBeforeTabSwitch = getSelectedColourLabel();
1102
+ expect(selectedColourLabelBeforeTabSwitch).to.equal('Blue');
1103
+ getSecondButton()?.click();
1104
+ await waitUntil(() => !isSelectRichRendered());
1105
+ getFirstButton()?.click();
1106
+ await waitUntil(isSelectRichRendered);
1107
+ const selectedColourAfterTabSwitch = getSelectedColourLabel();
1108
+ expect(selectedColourAfterTabSwitch).to.equal('Blue');
1109
+ });
1110
+ });
1111
+ });
1112
+ describe('Teardown', () => {
1113
+ it('does not throw when tearing down before the overlay controller is set up', () => {
1114
+ const el = /** @type {LionSelectRich} */ document.createElement(hostTagString);
1115
+
1116
+ // @ts-expect-error [allow-private] in tests
1117
+ expect(() => el._teardownOverlayCtrl()).not.to.throw();
1118
+ });
1119
+ it('correctly removes event listeners when disconnected from dom', async () => {
1120
+ const el = await fixture(html`
1121
+ <${hostTag} label="age">
1122
+ <${tagOption} .choiceValue=${10}>Item 1</${tagOption}>
1123
+ <${tagOption} .choiceValue=${20}>Item 2</${tagOption}>
1124
+ </${hostTag}>
1125
+ `);
1126
+ const { _overlayCtrl } = getSelectRichMembers(el);
1127
+ const eventRemoveSpy = sinon.spy(_overlayCtrl, 'removeEventListener');
1128
+ el.parentNode?.removeChild(el);
1129
+ expect(eventRemoveSpy.callCount).to.equal(0);
1130
+ await el.updateComplete;
1131
+ expect(eventRemoveSpy.callCount).to.equal(0);
1132
+ await el.updateComplete;
1133
+ const hasOneInstanceFor = (
1134
+ /** @type {string} */ eventName,
1135
+ /** @type {any[][]} */ eventsToSearch,
1136
+ /** @type {string} */ methodToRemove,
1137
+ ) =>
1138
+ Boolean(
1139
+ eventsToSearch.filter(
1140
+ ([eventToSearch, methodToSearch]) =>
1141
+ eventToSearch === eventName && methodToSearch === methodToRemove,
1142
+ ).length,
1143
+ );
1144
+
1145
+ // @ts-expect-error [allow-private] in tests
1146
+ expect(hasOneInstanceFor('show', eventRemoveSpy.args, el.__overlayOnShow)).to.be.true;
1147
+ // @ts-expect-error [allow-private] in tests
1148
+ expect(hasOneInstanceFor('before-show', eventRemoveSpy.args, el.__overlayBeforeShow)).to.be
1149
+ .true;
1150
+ // @ts-expect-error [allow-private] in tests
1151
+ expect(hasOneInstanceFor('hide', eventRemoveSpy.args, el.__overlayOnHide)).to.be.true;
1152
+ });
1153
+ });
1154
+ describe('Subclassers', () => {
1155
+ it('allows to override the type of overlay', async () => {
1156
+ const mySelectTagString = defineCE(
1157
+ class MySelect extends LionSelectRich {
1158
+ // @ts-expect-error
1159
+ _defineOverlay({ invokerNode, contentNode, contentWrapperNode }) {
1160
+ const ctrl = new OverlayController({
1161
+ placementMode: 'global',
1162
+ contentNode,
1163
+ contentWrapperNode,
1164
+ invokerNode,
1165
+ });
1166
+ this.addEventListener('switch', () => {
1167
+ ctrl.updateConfig({
1168
+ placementMode: 'local',
1169
+ });
1170
+ });
1171
+ return ctrl;
1172
+ }
1173
+ },
1174
+ );
1175
+ const mySelectTag = unsafeStatic(mySelectTagString);
1176
+ const el = await fixture(html`
1177
+ <${mySelectTag} label="Favorite color" name="color">
1178
+
1179
+ ${Array(2).map(
1180
+ (_, i) => html`
1181
+ <${tagOption} .modelValue="${{
1182
+ value: i,
1183
+ checked: false,
1184
+ }}"
1185
+ >value ${i}</${tagOption}
1186
+ >
1187
+ `,
1188
+ )}
1189
+
1190
+ </${mySelectTag}>
1191
+ `);
1192
+ await el.updateComplete;
1193
+ const { _overlayCtrl } = getSelectRichMembers(el);
1194
+ expect(_overlayCtrl.placementMode).to.equal('global');
1195
+ el.dispatchEvent(new Event('switch'));
1196
+ expect(_overlayCtrl.placementMode).to.equal('local');
1197
+ });
1198
+ it('supports putting a placeholder template when there is no default selection initially', async () => {
1199
+ const invokerTagName = defineCE(
1200
+ class extends LionSelectInvoker {
1201
+ _noSelectionTemplate() {
1202
+ return html` Please select an option.. `;
1203
+ }
1204
+ },
1205
+ );
1206
+ // const invokerTag = unsafeStatic(invokerTagName);
1207
+
1208
+ const selectTagName = defineCE(
1209
+ class extends LionSelectRich {
1210
+ get slots() {
1211
+ return {
1212
+ ...super.slots,
1213
+ invoker: () => document.createElement(invokerTagName),
1214
+ };
1215
+ }
1216
+ },
1217
+ );
1218
+ const selectTag = unsafeStatic(selectTagName);
1219
+ const el = await fixture(html`
1220
+ <${selectTag} id="color" name="color" label="Favorite color" has-no-default-selected>
1221
+
1222
+ <${tagOption} .choiceValue=${'red'}>Red</${tagOption}>
1223
+ <${tagOption} .choiceValue=${'hotpink'} disabled>Hotpink</${tagOption}>
1224
+ <${tagOption} .choiceValue=${'teal'}>Teal</${tagOption}>
1225
+
1226
+ </${selectTag}>
1227
+ `);
1228
+ const { _invokerNode } = getSelectRichMembers(el);
1229
+ expect(
1230
+ /** @type {ShadowRoot} */ _invokerNode.shadowRoot.getElementById('content-wrapper'),
1231
+ ).dom.to.equal(`<div id="content-wrapper">Please select an option..</div>`);
1232
+ expect(el.modelValue).to.equal('');
1233
+ });
1234
+ });
1235
+ });
1236
+ }