@lion/ui 0.23.0 → 0.25.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 (803) hide show
  1. package/README.md +50 -20
  2. package/components/accordion/src/LionAccordion.js +31 -42
  3. package/components/accordion/test/lion-accordion.test.js +108 -134
  4. package/components/button/src/LionButton.js +9 -12
  5. package/components/button/src/LionButtonReset.js +0 -5
  6. package/components/button/src/LionButtonSubmit.js +7 -12
  7. package/components/button/test/demos.screenshots-test.js +50 -11
  8. package/components/button/test/lion-button.test.js +0 -1
  9. package/components/button/test-suites/LionButton.suite.js +135 -145
  10. package/components/button/test-suites/LionButtonReset.suite.js +54 -72
  11. package/components/button/test-suites/LionButtonSubmit.suite.js +49 -68
  12. package/components/calendar/src/LionCalendar.js +151 -104
  13. package/components/calendar/src/calendarStyle.js +0 -1
  14. package/components/calendar/src/utils/createMonth.js +3 -4
  15. package/components/calendar/src/utils/createMultipleMonth.js +15 -7
  16. package/components/calendar/src/utils/createWeek.js +0 -2
  17. package/components/calendar/src/utils/dataTemplate.js +8 -4
  18. package/components/calendar/src/utils/dayTemplate.js +0 -6
  19. package/components/calendar/src/utils/getDayMonthYear.js +6 -2
  20. package/components/calendar/test/demos.screenshots-test.js +40 -9
  21. package/components/calendar/test/lion-calendar.test.js +171 -282
  22. package/components/calendar/test/utils/createMonth.test.js +61 -22
  23. package/components/calendar/test/utils/createMultipleMonth.test.js +14 -7
  24. package/components/calendar/test/utils/createWeek.test.js +51 -17
  25. package/components/calendar/test/utils/dataTemplate.test.js +3 -4
  26. package/components/calendar/test/utils/dayTemplate.test.js +106 -34
  27. package/components/calendar/test/utils/getFirstDayNextMonth.test.js +0 -1
  28. package/components/calendar/test/utils/getLastDayPreviousMonth.test.js +0 -1
  29. package/components/calendar/test/utils/isSameDate.test.js +0 -1
  30. package/components/calendar/test/utils/snapshots/monthTemplate_en-GB_Sunday_2018-12.js +1 -2
  31. package/components/calendar/test-helpers/CalendarObject.js +31 -62
  32. package/components/calendar/test-helpers/DayObject.js +7 -15
  33. package/components/calendar/test-suites/LionCalendar.suite.js +7 -9
  34. package/components/checkbox-group/src/LionCheckboxIndeterminate.js +17 -30
  35. package/components/checkbox-group/test/lion-checkbox-group-integrations.test.js +0 -1
  36. package/components/checkbox-group/test/lion-checkbox-group.test.js +21 -16
  37. package/components/checkbox-group/test/lion-checkbox-indeterminate-integrations.test.js +3 -3
  38. package/components/checkbox-group/test/lion-checkbox-integrations.test.js +3 -2
  39. package/components/checkbox-group/test/lion-checkbox.test.js +30 -16
  40. package/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.js +147 -191
  41. package/components/collapsible/src/LionCollapsible.js +10 -15
  42. package/components/collapsible/test/lion-collapsible.test.js +4 -18
  43. package/components/combobox/src/LionCombobox.js +35 -53
  44. package/components/combobox/src/utils/makeMatchingTextBold.js +2 -5
  45. package/components/combobox/src/validators.js +0 -1
  46. package/components/combobox/test/lion-combobox-integrations.test.js +6 -6
  47. package/components/combobox/test/lion-combobox.test.js +576 -869
  48. package/components/combobox/test/validators.test.js +6 -13
  49. package/components/combobox/test-helpers/combobox-helpers.js +24 -11
  50. package/components/core/src/DisabledMixin.js +61 -66
  51. package/components/core/src/DisabledWithTabIndexMixin.js +76 -83
  52. package/components/core/src/EventTargetShim.js +1 -4
  53. package/components/core/src/ScopedElementsMixin.js +4 -15
  54. package/components/core/src/ScopedStylesController.js +1 -5
  55. package/components/core/src/SlotMixin.js +236 -239
  56. package/components/core/src/browserDetection.js +5 -12
  57. package/components/core/test/DisabledMixin.test.js +24 -39
  58. package/components/core/test/DisabledWithTabIndexMixin.test.js +21 -34
  59. package/components/core/test/EventTargetShim.test.js +0 -8
  60. package/components/core/test/ScopedElementsMixin.test.js +22 -38
  61. package/components/core/test/ScopedStylesController.test.js +11 -20
  62. package/components/core/test/SlotMixin.test.js +102 -154
  63. package/components/core/test-helpers/getCachedFixture.js +5 -11
  64. package/components/core/types/SlotMixinTypes.ts +8 -3
  65. package/components/dialog/src/LionDialog.js +4 -3
  66. package/components/dialog/test/lion-dialog.integration.test.js +10 -20
  67. package/components/dialog/test/lion-dialog.test.js +48 -62
  68. package/components/dialog/test-helpers/test-router.js +4 -6
  69. package/components/drawer/src/LionDrawer.js +18 -34
  70. package/components/drawer/src/drawerStyle.js +0 -1
  71. package/components/drawer/test/lion-drawer.test.js +1 -17
  72. package/components/fieldset/test/lion-fieldset.test.js +6 -4
  73. package/components/form/src/LionForm.js +18 -13
  74. package/components/form/test/lion-form.test.js +22 -52
  75. package/components/form-core/src/FocusMixin.js +172 -174
  76. package/components/form-core/src/FormControlMixin.js +811 -813
  77. package/components/form-core/src/FormatMixin.js +537 -537
  78. package/components/form-core/src/InteractionStateMixin.js +196 -183
  79. package/components/form-core/src/LionField.js +9 -5
  80. package/components/form-core/src/NativeTextFieldMixin.js +114 -116
  81. package/components/form-core/src/choice-group/ChoiceGroupMixin.js +322 -364
  82. package/components/form-core/src/choice-group/ChoiceInputMixin.js +306 -296
  83. package/components/form-core/src/choice-group/CustomChoiceGroupMixin.js +114 -139
  84. package/components/form-core/src/form-group/FormElementsHaveNoError.js +0 -2
  85. package/components/form-core/src/form-group/FormGroupMixin.js +551 -557
  86. package/components/form-core/src/registration/FormRegisteringMixin.js +72 -71
  87. package/components/form-core/src/registration/FormRegistrarMixin.js +201 -217
  88. package/components/form-core/src/registration/FormRegistrarPortalMixin.js +31 -37
  89. package/components/form-core/src/utils/SyncUpdatableMixin.js +106 -117
  90. package/components/form-core/src/utils/getAriaElementsInRightDomOrder.js +1 -2
  91. package/components/form-core/src/validate/LionValidationFeedback.js +12 -8
  92. package/components/form-core/src/validate/Unparseable.js +4 -2
  93. package/components/form-core/src/validate/ValidateMixin.js +829 -883
  94. package/components/form-core/src/validate/Validator.js +3 -6
  95. package/components/form-core/src/validate/resultValidators/DefaultSuccess.js +1 -2
  96. package/components/form-core/src/validate/validators/DateValidators.js +0 -5
  97. package/components/form-core/src/validate/validators/NumberValidators.js +1 -5
  98. package/components/form-core/src/validate/validators/Required.js +1 -1
  99. package/components/form-core/src/validate/validators/StringValidators.js +1 -8
  100. package/components/form-core/test/FocusMixin.test.js +96 -82
  101. package/components/form-core/test/FormControlMixin.test.js +120 -176
  102. package/components/form-core/test/FormRegistrationMixins.test.js +0 -2
  103. package/components/form-core/test/FormatMixin.test.js +0 -1
  104. package/components/form-core/test/InteractionStateMixin.test.js +0 -1
  105. package/components/form-core/test/NativeTextFieldMixin.test.js +0 -1
  106. package/components/form-core/test/choice-group/ChoiceGroupMixin.test.js +0 -1
  107. package/components/form-core/test/choice-group/ChoiceInputMixin.test.js +0 -1
  108. package/components/form-core/test/choice-group/CustomChoiceGroupMixin.integrations.test.js +6 -8
  109. package/components/form-core/test/choice-group/CustomChoiceGroupMixin.test.js +0 -3
  110. package/components/form-core/test/form-group/FormGroupMixin.test.js +0 -1
  111. package/components/form-core/test/lion-field.test.js +88 -98
  112. package/components/form-core/test/utils/SyncUpdatableMixin.test.js +51 -65
  113. package/components/form-core/test/utils/getAriaElementsInRightDomOrder.test.js +3 -3
  114. package/components/form-core/test/validate/DateValidators.test.js +5 -27
  115. package/components/form-core/test/validate/NumberValidators.test.js +4 -16
  116. package/components/form-core/test/validate/Required.test.js +8 -21
  117. package/components/form-core/test/validate/ResultValidator.test.js +1 -2
  118. package/components/form-core/test/validate/StringValidators.test.js +4 -35
  119. package/components/form-core/test/validate/ValidateMixin.test.js +0 -1
  120. package/components/form-core/test/validate/ValidateMixinFeedbackPart.test.js +0 -1
  121. package/components/form-core/test/validate/Validator.test.js +39 -34
  122. package/components/form-core/test/validate/lion-validation-feedback.test.js +81 -43
  123. package/components/form-core/test-helpers/ExampleValidators.js +0 -5
  124. package/components/form-core/test-helpers/getFormControlMembers.js +2 -2
  125. package/components/form-core/test-helpers/mimicUserInput.js +5 -1
  126. package/components/form-core/test-suites/FormRegistrationMixins.suite.js +65 -122
  127. package/components/form-core/test-suites/FormatMixin.suite.js +202 -227
  128. package/components/form-core/test-suites/InteractionStateMixin.suite.js +47 -60
  129. package/components/form-core/test-suites/NativeTextFieldMixin.suite.js +8 -11
  130. package/components/form-core/test-suites/ValidateMixin.suite.js +280 -359
  131. package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +112 -163
  132. package/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.js +185 -218
  133. package/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.js +116 -109
  134. package/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.js +36 -70
  135. package/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.js +57 -65
  136. package/components/form-core/test-suites/form-group/FormGroupMixin.suite.js +664 -523
  137. package/components/form-core/translations/bg-BG.js +0 -1
  138. package/components/form-core/translations/cs-CZ.js +0 -1
  139. package/components/form-core/translations/de-DE.js +0 -1
  140. package/components/form-core/translations/en-AU.js +0 -1
  141. package/components/form-core/translations/en-GB.js +0 -1
  142. package/components/form-core/translations/en-US.js +0 -1
  143. package/components/form-core/translations/es-ES.js +0 -1
  144. package/components/form-core/translations/fr-BE.js +0 -1
  145. package/components/form-core/translations/fr-FR.js +0 -1
  146. package/components/form-core/translations/hu-HU.js +0 -1
  147. package/components/form-core/translations/it-IT.js +0 -1
  148. package/components/form-core/translations/nl-BE.js +0 -1
  149. package/components/form-core/translations/nl-NL.js +0 -1
  150. package/components/form-core/translations/pl-PL.js +0 -1
  151. package/components/form-core/translations/ro-RO.js +0 -1
  152. package/components/form-core/translations/ru-RU.js +0 -1
  153. package/components/form-core/translations/sk-SK.js +0 -1
  154. package/components/form-core/translations/tr-TR.js +0 -1
  155. package/components/form-core/translations/uk-UA.js +0 -1
  156. package/components/form-integrations/test/dialog-integrations.test.js +1 -4
  157. package/components/form-integrations/test/form-group-methods.test.js +28 -31
  158. package/components/form-integrations/test/form-integrations.test.js +27 -28
  159. package/components/form-integrations/test/form-validation-integrations.test.js +21 -29
  160. package/components/form-integrations/test/helpers/umbrella-form.js +3 -5
  161. package/components/form-integrations/test/model-value-consistency.test.js +75 -77
  162. package/components/form-integrations/test/model-value-event.test.js +10 -20
  163. package/components/helpers/src/SbActionLogger.js +13 -17
  164. package/components/helpers/src/SbLocaleSwitcher.js +5 -5
  165. package/components/helpers/src/sortEachDepth.js +0 -2
  166. package/components/helpers/test/renderLitAsNode.test.js +0 -4
  167. package/components/helpers/test/sb-action-logger.test.js +24 -55
  168. package/components/icon/src/IconManager.js +0 -2
  169. package/components/icon/src/LionIcon.js +2 -7
  170. package/components/icon/src/icons.js +0 -2
  171. package/components/icon/test/IconManager.test.js +0 -15
  172. package/components/icon/test/hammer.svg.js +3 -4
  173. package/components/icon/test/heart.svg.js +3 -4
  174. package/components/icon/test/lion-icon.test.js +14 -43
  175. package/components/input/src/LionInput.js +2 -8
  176. package/components/input/test/input-integrations.test.js +0 -5
  177. package/components/input/test/lion-input-integrations.test.js +0 -4
  178. package/components/input/test/lion-input.test.js +28 -58
  179. package/components/input/test-helpers/getInputMembers.js +2 -2
  180. package/components/input-amount/src/LionInputAmount.js +20 -20
  181. package/components/input-amount/src/formatters.js +0 -3
  182. package/components/input-amount/src/parsers.js +0 -3
  183. package/components/input-amount/test/formatters.test.js +24 -16
  184. package/components/input-amount/test/lion-input-amount-integrations.test.js +0 -4
  185. package/components/input-amount/test/lion-input-amount.test.js +123 -147
  186. package/components/input-amount/test/parsers.test.js +33 -17
  187. package/components/input-amount/test/preprocessors.test.js +0 -3
  188. package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +49 -59
  189. package/components/input-amount-dropdown/src/currencyUtil.js +8 -7
  190. package/components/input-amount-dropdown/src/parsers.js +0 -1
  191. package/components/input-amount-dropdown/src/validators.js +0 -1
  192. package/components/input-amount-dropdown/test/LionInputAmountDropdown.test.js +34 -36
  193. package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +18 -13
  194. package/components/input-amount-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
  195. package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +132 -107
  196. package/components/input-date/src/LionInputDate.js +4 -3
  197. package/components/input-date/test/lion-input-date-integrations.test.js +0 -3
  198. package/components/input-date/test/lion-input-date.test.js +19 -32
  199. package/components/input-datepicker/src/LionInputDatepicker.js +17 -29
  200. package/components/input-datepicker/src/localizeNamespaceLoader.js +1 -2
  201. package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +0 -3
  202. package/components/input-datepicker/test/lion-input-datepicker.test.js +88 -153
  203. package/components/input-datepicker/test-helpers/DatepickerInputObject.js +9 -12
  204. package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +6 -4
  205. package/components/input-datepicker/translations/bg-BG.js +0 -1
  206. package/components/input-datepicker/translations/cs-CZ.js +0 -1
  207. package/components/input-datepicker/translations/de-DE.js +0 -1
  208. package/components/input-datepicker/translations/en-AU.js +0 -1
  209. package/components/input-datepicker/translations/en-GB.js +0 -1
  210. package/components/input-datepicker/translations/en-US.js +0 -1
  211. package/components/input-datepicker/translations/es-ES.js +0 -1
  212. package/components/input-datepicker/translations/fr-BE.js +0 -1
  213. package/components/input-datepicker/translations/fr-FR.js +0 -1
  214. package/components/input-datepicker/translations/hu-HU.js +0 -1
  215. package/components/input-datepicker/translations/it-IT.js +0 -1
  216. package/components/input-datepicker/translations/nl-BE.js +0 -1
  217. package/components/input-datepicker/translations/nl-NL.js +0 -1
  218. package/components/input-datepicker/translations/pl-PL.js +0 -1
  219. package/components/input-datepicker/translations/ro-RO.js +0 -1
  220. package/components/input-datepicker/translations/ru-RU.js +0 -1
  221. package/components/input-datepicker/translations/sk-SK.js +0 -1
  222. package/components/input-datepicker/translations/tr-TR.js +0 -1
  223. package/components/input-datepicker/translations/uk-UA.js +0 -1
  224. package/components/input-email/test/lion-input-email-integrations.test.js +0 -2
  225. package/components/input-email/test/lion-input-email.test.js +1 -7
  226. package/components/input-file/src/FileHandle.js +0 -3
  227. package/components/input-file/src/LionInputFile.js +85 -83
  228. package/components/input-file/src/LionSelectedFileList.js +12 -12
  229. package/components/input-file/src/validators.js +10 -9
  230. package/components/input-file/test/FileValidators.test.js +170 -80
  231. package/components/input-file/test/lion-input-file.test.js +160 -244
  232. package/components/input-file/test/lion-selected-file-list.test.js +13 -22
  233. package/components/input-file/translations/bg-BG.js +0 -1
  234. package/components/input-file/translations/cs-CZ.js +0 -1
  235. package/components/input-file/translations/de-DE.js +0 -1
  236. package/components/input-file/translations/en-AU.js +0 -1
  237. package/components/input-file/translations/en-GB.js +0 -1
  238. package/components/input-file/translations/en-PH.js +0 -1
  239. package/components/input-file/translations/en-US.js +0 -1
  240. package/components/input-file/translations/en.js +2 -1
  241. package/components/input-file/translations/es-ES.js +0 -1
  242. package/components/input-file/translations/fr-BE.js +0 -1
  243. package/components/input-file/translations/fr-FR.js +0 -1
  244. package/components/input-file/translations/hu-HU.js +0 -1
  245. package/components/input-file/translations/id-ID.js +0 -1
  246. package/components/input-file/translations/id.js +2 -1
  247. package/components/input-file/translations/it-IT.js +0 -1
  248. package/components/input-file/translations/nl-BE.js +0 -1
  249. package/components/input-file/translations/nl-NL.js +0 -1
  250. package/components/input-file/translations/pl-PL.js +0 -1
  251. package/components/input-file/translations/ro-RO.js +0 -1
  252. package/components/input-file/translations/ru-RU.js +0 -1
  253. package/components/input-file/translations/sk-SK.js +0 -1
  254. package/components/input-file/translations/uk-UA.js +0 -1
  255. package/components/input-file/translations/zh-CN.js +0 -1
  256. package/components/input-iban/src/validators.js +6 -11
  257. package/components/input-iban/test/formatters.test.js +0 -3
  258. package/components/input-iban/test/lion-input-iban-integrations.test.js +0 -2
  259. package/components/input-iban/test/lion-input-iban.test.js +1 -9
  260. package/components/input-iban/test/parsers.test.js +0 -2
  261. package/components/input-iban/test/validators.test.js +0 -12
  262. package/components/input-iban/translations/bg-BG.js +0 -1
  263. package/components/input-iban/translations/cs-CZ.js +0 -1
  264. package/components/input-iban/translations/de-DE.js +0 -1
  265. package/components/input-iban/translations/en-AU.js +0 -1
  266. package/components/input-iban/translations/en-GB.js +0 -1
  267. package/components/input-iban/translations/en-US.js +0 -1
  268. package/components/input-iban/translations/es-ES.js +0 -1
  269. package/components/input-iban/translations/fr-BE.js +0 -1
  270. package/components/input-iban/translations/fr-FR.js +0 -1
  271. package/components/input-iban/translations/hu-HU.js +0 -1
  272. package/components/input-iban/translations/it-IT.js +0 -1
  273. package/components/input-iban/translations/nl-BE.js +0 -1
  274. package/components/input-iban/translations/nl-NL.js +0 -1
  275. package/components/input-iban/translations/pl-PL.js +0 -1
  276. package/components/input-iban/translations/ro-RO.js +0 -1
  277. package/components/input-iban/translations/ru-RU.js +0 -1
  278. package/components/input-iban/translations/sk-SK.js +0 -1
  279. package/components/input-iban/translations/uk-UA.js +0 -1
  280. package/components/input-range/src/LionInputRange.js +18 -19
  281. package/components/input-range/test/lion-input-range.test.js +23 -48
  282. package/components/input-range/translations/bg-BG.js +0 -1
  283. package/components/input-range/translations/cs-CZ.js +0 -1
  284. package/components/input-range/translations/de-DE.js +0 -1
  285. package/components/input-range/translations/en-AU.js +0 -1
  286. package/components/input-range/translations/en-GB.js +0 -1
  287. package/components/input-range/translations/en-PH.js +0 -1
  288. package/components/input-range/translations/en-US.js +0 -1
  289. package/components/input-range/translations/es-ES.js +0 -1
  290. package/components/input-range/translations/fr-BE.js +0 -1
  291. package/components/input-range/translations/fr-FR.js +0 -1
  292. package/components/input-range/translations/hu-HU.js +0 -1
  293. package/components/input-range/translations/it-IT.js +0 -1
  294. package/components/input-range/translations/nl-BE.js +0 -1
  295. package/components/input-range/translations/nl-NL.js +0 -1
  296. package/components/input-range/translations/pl-PL.js +0 -1
  297. package/components/input-range/translations/ro-RO.js +0 -1
  298. package/components/input-range/translations/ru-RU.js +0 -1
  299. package/components/input-range/translations/sk-SK.js +0 -1
  300. package/components/input-range/translations/uk-UA.js +0 -1
  301. package/components/input-range/translations/zh-CN.js +0 -1
  302. package/components/input-stepper/src/LionInputStepper.js +19 -38
  303. package/components/input-stepper/test/lion-input-stepper-integrations.test.js +0 -1
  304. package/components/input-stepper/test/lion-input-stepper.test.js +0 -1
  305. package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +0 -2
  306. package/components/input-stepper/test-suites/lion-input-stepper.suite.js +56 -105
  307. package/components/input-stepper/translations/bg-BG.js +0 -1
  308. package/components/input-stepper/translations/cs-CZ.js +0 -1
  309. package/components/input-stepper/translations/de-DE.js +0 -1
  310. package/components/input-stepper/translations/en-AU.js +0 -1
  311. package/components/input-stepper/translations/en-GB.js +0 -1
  312. package/components/input-stepper/translations/en-US.js +0 -1
  313. package/components/input-stepper/translations/es-ES.js +0 -1
  314. package/components/input-stepper/translations/fr-BE.js +0 -1
  315. package/components/input-stepper/translations/fr-FR.js +0 -1
  316. package/components/input-stepper/translations/hu-HU.js +0 -1
  317. package/components/input-stepper/translations/it-IT.js +0 -1
  318. package/components/input-stepper/translations/nl-BE.js +0 -1
  319. package/components/input-stepper/translations/nl-NL.js +0 -1
  320. package/components/input-stepper/translations/pl-PL.js +0 -1
  321. package/components/input-stepper/translations/ro-RO.js +0 -1
  322. package/components/input-stepper/translations/ru-RU.js +0 -1
  323. package/components/input-stepper/translations/sk-SK.js +0 -1
  324. package/components/input-stepper/translations/uk-UA.js +0 -1
  325. package/components/input-tel/src/LionInputTel.js +53 -37
  326. package/components/input-tel/src/PhoneUtilManager.js +6 -4
  327. package/components/input-tel/src/formatters.js +12 -10
  328. package/components/input-tel/src/parsers.js +3 -3
  329. package/components/input-tel/src/preprocessors.js +15 -7
  330. package/components/input-tel/src/validators.js +4 -6
  331. package/components/input-tel/test/LionInputTel.test.js +4 -2
  332. package/components/input-tel/test/formatters.test.js +22 -10
  333. package/components/input-tel/test/parsers.test.js +127 -11
  334. package/components/input-tel/test/preprocessors.test.js +24 -13
  335. package/components/input-tel/test/validators.test.js +7 -14
  336. package/components/input-tel/test-helpers/mockPhoneUtilManager.js +20 -8
  337. package/components/input-tel/test-suites/LionInputTel.suite.js +33 -73
  338. package/components/input-tel/translations/bg-BG.js +0 -1
  339. package/components/input-tel/translations/cs-CZ.js +0 -1
  340. package/components/input-tel/translations/de-DE.js +0 -1
  341. package/components/input-tel/translations/en-AU.js +0 -1
  342. package/components/input-tel/translations/en-GB.js +0 -1
  343. package/components/input-tel/translations/en-US.js +0 -1
  344. package/components/input-tel/translations/es-ES.js +0 -1
  345. package/components/input-tel/translations/fr-BE.js +0 -1
  346. package/components/input-tel/translations/fr-FR.js +0 -1
  347. package/components/input-tel/translations/hu-HU.js +0 -1
  348. package/components/input-tel/translations/it-IT.js +0 -1
  349. package/components/input-tel/translations/nl-BE.js +0 -1
  350. package/components/input-tel/translations/nl-NL.js +0 -1
  351. package/components/input-tel/translations/pl-PL.js +0 -1
  352. package/components/input-tel/translations/ro-RO.js +0 -1
  353. package/components/input-tel/translations/ru-RU.js +0 -1
  354. package/components/input-tel/translations/sk-SK.js +0 -1
  355. package/components/input-tel/translations/uk-UA.js +0 -1
  356. package/components/input-tel-dropdown/src/LionInputTelDropdown.js +10 -28
  357. package/components/input-tel-dropdown/src/regionCodeToLocale.js +3 -1
  358. package/components/input-tel-dropdown/test/LionInputTelDropdown.test.js +31 -38
  359. package/components/input-tel-dropdown/test/regionCodeToLocale.test.js +0 -1
  360. package/components/input-tel-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
  361. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.js +16 -11
  362. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +54 -79
  363. package/components/listbox/src/LionListbox.js +5 -2
  364. package/components/listbox/src/LionOption.js +8 -7
  365. package/components/listbox/src/LionOptions.js +0 -3
  366. package/components/listbox/src/ListboxMixin.js +786 -820
  367. package/components/listbox/test/lion-listbox.test.js +0 -1
  368. package/components/listbox/test/lion-option.test.js +53 -64
  369. package/components/listbox/test/lion-options.test.js +3 -4
  370. package/components/listbox/test-helpers/getListboxMembers.js +6 -3
  371. package/components/listbox/test-suites/ListboxMixin.suite.js +101 -261
  372. package/components/localize/src/LocalizeManager.js +40 -40
  373. package/components/localize/src/LocalizeMixin.js +130 -157
  374. package/components/localize/src/date/formatDate.js +1 -5
  375. package/components/localize/src/date/getDateFormatBasedOnLocale.js +5 -3
  376. package/components/localize/src/date/getMonthNames.js +3 -5
  377. package/components/localize/src/date/getWeekdayNames.js +1 -5
  378. package/components/localize/src/date/parseDate.js +5 -20
  379. package/components/localize/src/date/utils/normalizeIntlDate.js +0 -7
  380. package/components/localize/src/getLocalizeManager.js +0 -3
  381. package/components/localize/src/number/formatNumber.js +3 -7
  382. package/components/localize/src/number/formatNumberToParts.js +52 -18
  383. package/components/localize/src/number/getCurrencyName.js +5 -5
  384. package/components/localize/src/number/getFractionDigits.js +4 -4
  385. package/components/localize/src/number/getSeparatorsFromNumber.js +1 -3
  386. package/components/localize/src/number/parseNumber.js +0 -3
  387. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceAddGroupSeparators.js +0 -1
  388. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceSpaceBetweenCurrencyCodeAndNumber.js +4 -1
  389. package/components/localize/test/LocalizeManager.test.js +385 -278
  390. package/components/localize/test/LocalizeMixin.test.js +28 -112
  391. package/components/localize/test/date/formatDate.test.js +18 -48
  392. package/components/localize/test/date/getDateFormatBasedOnLocale.test.js +0 -3
  393. package/components/localize/test/date/getMonthNames.test.js +27 -12
  394. package/components/localize/test/date/getWeekdayNames.test.js +93 -49
  395. package/components/localize/test/date/normalizeDateTime.test.js +0 -2
  396. package/components/localize/test/date/parseDate.test.js +12 -16
  397. package/components/localize/test/getLocalizeManager.test.js +0 -3
  398. package/components/localize/test/isLocalizeESModule.test.js +32 -13
  399. package/components/localize/test/localize.test.js +0 -4
  400. package/components/localize/test/number/formatNumber.test.js +215 -106
  401. package/components/localize/test/number/formatNumberToParts.test.js +31 -38
  402. package/components/localize/test/number/getCurrencyName.test.js +20 -6
  403. package/components/localize/test/number/getDecimalSeparator.test.js +5 -4
  404. package/components/localize/test/number/getFractionDigits.test.js +0 -2
  405. package/components/localize/test/number/getGroupSeparator.test.js +0 -2
  406. package/components/localize/test/number/getSeparatorsFromNumber.test.js +5 -3
  407. package/components/localize/test/number/parseNumber.test.js +123 -56
  408. package/components/localize/test/side-effect-free-entrypoint.test.js +0 -6
  409. package/components/localize/test-helpers/fake-imports.js +11 -6
  410. package/components/localize/test-helpers/localizeTearDown.js +0 -1
  411. package/components/menu/src/InteractiveListMixin.js +637 -638
  412. package/components/menu/src/LionMenu.js +46 -59
  413. package/components/menu/src/MoreButtonMenuMixin.js +215 -238
  414. package/components/menu/src/MultiLevelListMixin.js +240 -246
  415. package/components/menu/src/utils/isInView.js +0 -1
  416. package/components/menu/src/utils/listItemInteractions.js +4 -4
  417. package/components/menu/test/InteractiveListMixin.test.js +0 -1
  418. package/components/menu/test/MoreButtonMenuMixin.test.js +3 -2
  419. package/components/menu/test/MultiLevelListMixin.test.js +0 -1
  420. package/components/menu/test/lion-menu-interactions.test.js +0 -1
  421. package/components/menu/test/lion-menu.test.js +6 -2
  422. package/components/menu/test-helpers/mimicKeyPress.js +12 -2
  423. package/components/menu/test-suites/InteractiveListMixin.suite.js +4 -43
  424. package/components/menu/test-suites/LionMenu.suite.js +1 -8
  425. package/components/menu/test-suites/LionMenuInteractions.suite.js +22 -44
  426. package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +34 -41
  427. package/components/menu/test-suites/MultiLevelListMixin.suite.js +5 -23
  428. package/components/overlays/src/ArrowMixin.js +111 -127
  429. package/components/overlays/src/OverlayController.js +172 -152
  430. package/components/overlays/src/OverlayMixin.js +64 -69
  431. package/components/overlays/src/OverlaysManager.js +30 -32
  432. package/components/overlays/src/configurations/visibility-trigger-partials/withClickInteraction.js +0 -1
  433. package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +11 -11
  434. package/components/overlays/src/configurations/withBottomSheetConfig.js +12 -13
  435. package/components/overlays/src/configurations/withDropdownConfig.js +4 -2
  436. package/components/overlays/src/configurations/withModalDialogConfig.js +12 -13
  437. package/components/overlays/src/configurations/withPopoverConfig.js +27 -25
  438. package/components/overlays/src/configurations/withTooltipConfig.js +15 -13
  439. package/components/overlays/src/overlayDocumentStyle.js +1 -1
  440. package/components/overlays/src/overlayShadowDomStyle.js +0 -1
  441. package/components/overlays/src/singleton.js +0 -2
  442. package/components/overlays/src/utils/adopt-styles.js +18 -18
  443. package/components/overlays/src/utils/deep-contains.js +7 -6
  444. package/components/overlays/src/utils/get-focusable-elements.js +7 -10
  445. package/components/overlays/src/utils/inert-siblings.js +2 -4
  446. package/components/overlays/src/utils/is-equal-config.js +2 -3
  447. package/components/overlays/src/utils/is-visible.js +0 -1
  448. package/components/overlays/src/utils/simulate-tab.js +1 -4
  449. package/components/overlays/src/utils/sort-by-tabindex.js +2 -4
  450. package/components/overlays/test/ArrowMixin.test.js +18 -30
  451. package/components/overlays/test/OverlayController.test.js +406 -555
  452. package/components/overlays/test/OverlayMixin.test.js +0 -2
  453. package/components/overlays/test/OverlaysManager.test.js +30 -35
  454. package/components/overlays/test/global-positioning.test.js +6 -10
  455. package/components/overlays/test/invoker-compatibility.test.js +37 -0
  456. package/components/overlays/test/local-positioning.test.js +101 -103
  457. package/components/overlays/test/utils-tests/active-element.test.js +12 -27
  458. package/components/overlays/test/utils-tests/adopt-styles.test.js +25 -56
  459. package/components/overlays/test/utils-tests/deep-contains.test.js +73 -74
  460. package/components/overlays/test/utils-tests/get-focusable-elements.test.js +6 -23
  461. package/components/overlays/test/utils-tests/is-equal-config.test.js +32 -13
  462. package/components/overlays/test/utils-tests/visibility.test.js +44 -79
  463. package/components/overlays/test-helpers/createShadowHost.js +5 -3
  464. package/components/overlays/test-helpers/normalizeTransformStyle.js +2 -4
  465. package/components/overlays/test-suites/OverlayMixin.suite.js +152 -181
  466. package/components/overlays/test-suites/WithHoverInteraction.suite.js +96 -79
  467. package/components/overlays/translations/bg-BG.js +0 -1
  468. package/components/overlays/translations/cs-CZ.js +0 -1
  469. package/components/overlays/translations/de-DE.js +0 -1
  470. package/components/overlays/translations/en-AU.js +0 -1
  471. package/components/overlays/translations/en-GB.js +0 -1
  472. package/components/overlays/translations/en-US.js +0 -1
  473. package/components/overlays/translations/es-ES.js +0 -1
  474. package/components/overlays/translations/fr-BE.js +0 -1
  475. package/components/overlays/translations/fr-FR.js +0 -1
  476. package/components/overlays/translations/hu-HU.js +0 -1
  477. package/components/overlays/translations/it-IT.js +0 -1
  478. package/components/overlays/translations/nl-BE.js +0 -1
  479. package/components/overlays/translations/nl-NL.js +0 -1
  480. package/components/overlays/translations/pl-PL.js +0 -1
  481. package/components/overlays/translations/ro-RO.js +0 -1
  482. package/components/overlays/translations/ru-RU.js +0 -1
  483. package/components/overlays/translations/sk-SK.js +0 -1
  484. package/components/overlays/translations/tr-TR.js +0 -1
  485. package/components/overlays/translations/uk-UA.js +0 -1
  486. package/components/pagination/src/LionPagination.js +9 -12
  487. package/components/pagination/test/lion-pagination.test.js +18 -50
  488. package/components/progress-indicator/src/LionProgressIndicator.js +10 -12
  489. package/components/progress-indicator/test/lion-progress-indicator.test.js +1 -22
  490. package/components/radio-group/src/LionRadioGroup.js +1 -2
  491. package/components/radio-group/test/lion-radio-group-integrations.test.js +0 -1
  492. package/components/radio-group/test/lion-radio-group.test.js +27 -27
  493. package/components/radio-group/test/lion-radio-integrations.test.js +3 -2
  494. package/components/radio-group/test/lion-radio.test.js +30 -16
  495. package/components/select/src/LionSelect.js +12 -13
  496. package/components/select/test/lion-select.test.js +7 -12
  497. package/components/select-rich/src/LionSelectInvoker.js +18 -11
  498. package/components/select-rich/src/LionSelectRich.js +22 -44
  499. package/components/select-rich/test/demos.screenshots-test.js +40 -9
  500. package/components/select-rich/test/lion-select-invoker.test.js +26 -43
  501. package/components/select-rich/test/lion-select-listbox-suite-integration.test.js +3 -3
  502. package/components/select-rich/test/lion-select-rich-dialog-integration.test.js +4 -9
  503. package/components/select-rich/test/lion-select-rich-interaction.test.js +116 -116
  504. package/components/select-rich/test/lion-select-rich-upgrade.test.js +3 -7
  505. package/components/select-rich/test/lion-select-rich.test.js +153 -195
  506. package/components/select-rich/test-helpers/getSelectRichMembers.js +4 -1
  507. package/components/steps/src/LionStep.js +21 -12
  508. package/components/steps/src/LionSteps.js +25 -25
  509. package/components/steps/test/lion-step.test.js +18 -25
  510. package/components/steps/test/lion-steps.test.js +45 -78
  511. package/components/switch/src/LionSwitch.js +2 -7
  512. package/components/switch/src/LionSwitchButton.js +5 -6
  513. package/components/switch/test/lion-switch-button.test.js +16 -28
  514. package/components/switch/test/lion-switch.test.js +17 -31
  515. package/components/tabs/src/LionTabs.js +25 -28
  516. package/components/tabs/test/lion-tabs.test.js +156 -154
  517. package/components/textarea/src/LionTextarea.js +4 -23
  518. package/components/textarea/test/lion-textarea-integrations.test.js +0 -5
  519. package/components/textarea/test/lion-textarea.test.js +2 -28
  520. package/components/tooltip/src/LionTooltip.js +6 -6
  521. package/components/tooltip/test/lion-tooltip.test.js +75 -102
  522. package/components/validate-messages/src/getLocalizedMessage.js +8 -7
  523. package/components/validate-messages/src/loadDefaultFeedbackMessages.js +3 -1
  524. package/components/validate-messages/src/loadDefaultFeedbackMessagesNoSideEffects.js +9 -5
  525. package/components/validate-messages/src/per-entrypoint/loadComboboxMessagesNoSideEffects.js +5 -2
  526. package/components/validate-messages/src/per-entrypoint/loadFormCoreMessagesNoSideEffects.js +99 -35
  527. package/components/validate-messages/src/per-entrypoint/loadInputTelMessagesNoSideEffects.js +4 -3
  528. package/components/validate-messages/test/loadDefaultFeedbackMessages.test.js +5 -3
  529. package/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.test.js +80 -45
  530. package/components/validate-messages/translations/bg-BG.js +0 -1
  531. package/components/validate-messages/translations/cs-CZ.js +0 -1
  532. package/components/validate-messages/translations/de-DE.js +0 -1
  533. package/components/validate-messages/translations/en-AU.js +0 -1
  534. package/components/validate-messages/translations/en-GB.js +0 -1
  535. package/components/validate-messages/translations/en-PH.js +0 -1
  536. package/components/validate-messages/translations/en-US.js +0 -1
  537. package/components/validate-messages/translations/es-ES.js +0 -1
  538. package/components/validate-messages/translations/fr-BE.js +0 -1
  539. package/components/validate-messages/translations/fr-FR.js +0 -1
  540. package/components/validate-messages/translations/hu-HU.js +0 -1
  541. package/components/validate-messages/translations/it-IT.js +0 -1
  542. package/components/validate-messages/translations/nl-BE.js +0 -1
  543. package/components/validate-messages/translations/nl-NL.js +0 -1
  544. package/components/validate-messages/translations/pl-PL.js +0 -1
  545. package/components/validate-messages/translations/ro-RO.js +0 -1
  546. package/components/validate-messages/translations/ru-RU.js +0 -1
  547. package/components/validate-messages/translations/sk-SK.js +0 -1
  548. package/components/validate-messages/translations/tr-TR.js +0 -1
  549. package/components/validate-messages/translations/uk-UA.js +0 -1
  550. package/custom-elements.json +229 -85
  551. package/dist-types/components/core/src/SlotMixin.d.ts +6 -1
  552. package/dist-types/components/core/src/SlotMixin.d.ts.map +1 -1
  553. package/dist-types/components/core/types/SlotMixinTypes.d.ts +5 -1
  554. package/dist-types/components/core/types/SlotMixinTypes.d.ts.map +1 -1
  555. package/dist-types/components/form-core/src/LionField.d.ts +3 -1
  556. package/dist-types/components/form-core/src/LionField.d.ts.map +1 -1
  557. package/dist-types/components/input-tel/src/LionInputTel.d.ts +6 -6
  558. package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
  559. package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts +2 -2
  560. package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts.map +1 -1
  561. package/dist-types/components/input-tel/src/formatters.d.ts +2 -2
  562. package/dist-types/components/input-tel/src/formatters.d.ts.map +1 -1
  563. package/dist-types/components/input-tel/src/preprocessors.d.ts +2 -2
  564. package/dist-types/components/input-tel/src/preprocessors.d.ts.map +1 -1
  565. package/dist-types/components/input-tel/test/validators.test.d.ts +1 -1
  566. package/dist-types/components/input-tel/test/validators.test.d.ts.map +1 -1
  567. package/dist-types/components/input-tel/test-helpers/mockPhoneUtilManager.d.ts +5 -0
  568. package/dist-types/components/input-tel/test-helpers/mockPhoneUtilManager.d.ts.map +1 -1
  569. package/dist-types/components/listbox/src/LionListbox.d.ts +2 -2
  570. package/dist-types/components/listbox/src/LionListbox.d.ts.map +1 -1
  571. package/dist-types/components/listbox/src/LionOption.d.ts +5 -2
  572. package/dist-types/components/listbox/src/LionOption.d.ts.map +1 -1
  573. package/dist-types/components/overlays/src/OverlayController.d.ts +3 -1
  574. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  575. package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
  576. package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
  577. package/dist-types/components/overlays/src/overlayDocumentStyle.d.ts.map +1 -1
  578. package/dist-types/components/overlays/test/invoker-compatibility.test.d.ts +3 -0
  579. package/dist-types/components/overlays/test/invoker-compatibility.test.d.ts.map +1 -0
  580. package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts +3 -1
  581. package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts.map +1 -1
  582. package/dist-types/components/select-rich/src/LionSelectRich.d.ts +6 -5
  583. package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
  584. package/dist-types/tsconfig.tsbuildinfo +1 -1
  585. package/docs/components/accordion/overview.md +2 -2
  586. package/docs/components/accordion/reference.md +2 -2
  587. package/docs/components/accordion/use-cases.md +2 -2
  588. package/docs/components/button/examples.md +2 -2
  589. package/docs/components/button/extensions.md +2 -2
  590. package/docs/components/button/overview.md +2 -2
  591. package/docs/components/button/use-cases.md +2 -2
  592. package/docs/components/calendar/overview.md +2 -2
  593. package/docs/components/calendar/use-cases.md +2 -2
  594. package/docs/components/checkbox-group/overview.md +4 -4
  595. package/docs/components/checkbox-group/use-cases.md +2 -2
  596. package/docs/components/collapsible/examples.md +2 -2
  597. package/docs/components/collapsible/overview.md +3 -3
  598. package/docs/components/collapsible/use-cases.md +2 -2
  599. package/docs/components/combobox/api-table.md +1 -1
  600. package/docs/components/combobox/extensions.md +2 -2
  601. package/docs/components/combobox/overview.md +3 -3
  602. package/docs/components/combobox/use-cases.md +3 -3
  603. package/docs/components/dialog/overview.md +3 -3
  604. package/docs/components/dialog/use-cases.md +2 -2
  605. package/docs/components/drawer/overview.md +2 -2
  606. package/docs/components/drawer/use-cases.md +2 -2
  607. package/docs/components/fieldset/overview.md +7 -7
  608. package/docs/components/fieldset/use-cases.md +2 -2
  609. package/docs/components/form/overview.md +5 -5
  610. package/docs/components/form/use-cases.md +4 -4
  611. package/docs/components/icon/overview.md +2 -2
  612. package/docs/components/icon/use-cases.md +3 -3
  613. package/docs/components/input/overview.md +3 -3
  614. package/docs/components/input/use-cases.md +2 -2
  615. package/docs/components/input-amount/overview.md +5 -5
  616. package/docs/components/input-amount/use-cases.md +2 -2
  617. package/docs/components/input-amount-dropdown/use-cases.md +2 -2
  618. package/docs/components/input-date/overview.md +5 -5
  619. package/docs/components/input-date/use-cases.md +2 -2
  620. package/docs/components/input-datepicker/overview.md +7 -7
  621. package/docs/components/input-datepicker/use-cases.md +2 -2
  622. package/docs/components/input-email/overview.md +4 -4
  623. package/docs/components/input-email/use-cases.md +2 -2
  624. package/docs/components/input-file/overview.md +3 -3
  625. package/docs/components/input-file/use-cases.md +2 -2
  626. package/docs/components/input-iban/overview.md +4 -4
  627. package/docs/components/input-iban/use-cases.md +2 -2
  628. package/docs/components/input-range/overview.md +4 -4
  629. package/docs/components/input-range/use-cases.md +2 -2
  630. package/docs/components/input-stepper/overview.md +3 -3
  631. package/docs/components/input-stepper/use-cases.md +2 -2
  632. package/docs/components/input-tel/overview.md +3 -3
  633. package/docs/components/input-tel/use-cases.md +8 -8
  634. package/docs/components/input-tel-dropdown/extensions.md +2 -2
  635. package/docs/components/input-tel-dropdown/overview.md +3 -3
  636. package/docs/components/input-tel-dropdown/use-cases.md +2 -2
  637. package/docs/components/listbox/api-table.md +4 -4
  638. package/docs/components/listbox/overview.md +2 -2
  639. package/docs/components/listbox/use-cases.md +3 -3
  640. package/docs/components/menu/extensions.md +2 -2
  641. package/docs/components/menu/migration.md +2 -2
  642. package/docs/components/menu/overview.md +2 -2
  643. package/docs/components/menu/use-cases.md +1 -1
  644. package/docs/components/pagination/overview.md +2 -2
  645. package/docs/components/pagination/use-cases.md +2 -2
  646. package/docs/components/progress-indicator/examples.md +2 -2
  647. package/docs/components/progress-indicator/overview.md +2 -2
  648. package/docs/components/radio-group/overview.md +5 -5
  649. package/docs/components/radio-group/use-cases.md +2 -2
  650. package/docs/components/select/overview.md +2 -2
  651. package/docs/components/select/use-cases.md +3 -3
  652. package/docs/components/select-rich/api-table.md +1 -1
  653. package/docs/components/select-rich/examples.md +2 -2
  654. package/docs/components/select-rich/overview.md +2 -2
  655. package/docs/components/select-rich/use-cases.md +4 -4
  656. package/docs/components/steps/overview.md +2 -2
  657. package/docs/components/steps/use-cases.md +2 -2
  658. package/docs/components/switch/overview.md +2 -2
  659. package/docs/components/switch/reference.md +2 -2
  660. package/docs/components/switch/use-cases.md +2 -2
  661. package/docs/components/tabs/examples.md +3 -3
  662. package/docs/components/tabs/overview.md +2 -2
  663. package/docs/components/tabs/use-cases.md +2 -2
  664. package/docs/components/textarea/overview.md +2 -2
  665. package/docs/components/textarea/use-cases.md +2 -2
  666. package/docs/components/tooltip/examples.md +2 -2
  667. package/docs/components/tooltip/overview.md +2 -2
  668. package/docs/components/tooltip/use-cases.md +2 -2
  669. package/docs/fundamentals/index.md +4 -4
  670. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +2 -2
  671. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +2 -2
  672. package/docs/fundamentals/node-tools/providence-analytics/index.md +2 -2
  673. package/docs/fundamentals/node-tools/providence-analytics/overview.md +2 -2
  674. package/docs/fundamentals/node-tools/publish-docs/index.md +2 -2
  675. package/docs/fundamentals/node-tools/publish-docs/overview.md +5 -5
  676. package/docs/fundamentals/node-tools/remark-extend/index.md +2 -2
  677. package/docs/fundamentals/node-tools/remark-extend/overview.md +2 -2
  678. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +2 -2
  679. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +4 -4
  680. package/docs/fundamentals/rationales/TypeScript.md +62 -2
  681. package/docs/fundamentals/rationales/accessibility.md +5 -5
  682. package/docs/fundamentals/rationales/side-effects.md +2 -2
  683. package/docs/fundamentals/rationales/versioning.md +2 -2
  684. package/docs/fundamentals/systems/core/SlotMixin.md +3 -3
  685. package/docs/fundamentals/systems/core/index.md +2 -2
  686. package/docs/fundamentals/systems/core/overview.md +3 -3
  687. package/docs/fundamentals/systems/form/formatting-and-parsing.md +6 -6
  688. package/docs/fundamentals/systems/form/index.md +2 -2
  689. package/docs/fundamentals/systems/form/interaction-states.md +2 -2
  690. package/docs/fundamentals/systems/form/model-value.md +3 -3
  691. package/docs/fundamentals/systems/form/overview.md +30 -30
  692. package/docs/fundamentals/systems/form/styling.md +2 -2
  693. package/docs/fundamentals/systems/form/use-cases.md +2 -2
  694. package/docs/fundamentals/systems/form/validate.md +4 -4
  695. package/docs/fundamentals/systems/icon/index.md +2 -2
  696. package/docs/fundamentals/systems/icon/overview.md +2 -2
  697. package/docs/fundamentals/systems/localize/dates.md +2 -2
  698. package/docs/fundamentals/systems/localize/index.md +2 -2
  699. package/docs/fundamentals/systems/localize/numbers.md +2 -2
  700. package/docs/fundamentals/systems/localize/overview.md +6 -6
  701. package/docs/fundamentals/systems/localize/rationale.md +2 -2
  702. package/docs/fundamentals/systems/localize/text.md +2 -2
  703. package/docs/fundamentals/systems/localize/use-cases.md +2 -2
  704. package/docs/fundamentals/systems/overlays/_edge-cases.md +2 -2
  705. package/docs/fundamentals/systems/overlays/api-table.md +1 -1
  706. package/docs/fundamentals/systems/overlays/configuration.md +4 -4
  707. package/docs/fundamentals/systems/overlays/index.md +2 -2
  708. package/docs/fundamentals/systems/overlays/overview.md +7 -7
  709. package/docs/fundamentals/systems/overlays/rationale.md +2 -2
  710. package/docs/fundamentals/systems/overlays/use-cases.md +4 -4
  711. package/docs/fundamentals/tools/ajax/index.md +2 -2
  712. package/docs/fundamentals/tools/ajax/overview.md +2 -2
  713. package/docs/fundamentals/tools/ajax/use-cases.md +2 -2
  714. package/docs/fundamentals/tools/helpers/action-logger.md +2 -2
  715. package/docs/fundamentals/tools/helpers/index.md +2 -2
  716. package/docs/fundamentals/tools/helpers/overview.md +3 -3
  717. package/docs/fundamentals/tools/singleton-manager/example-complex/index.md +2 -2
  718. package/docs/fundamentals/tools/singleton-manager/example-fail/index.md +2 -2
  719. package/docs/fundamentals/tools/singleton-manager/example-success/index.md +2 -2
  720. package/docs/fundamentals/tools/singleton-manager/index.md +2 -2
  721. package/docs/fundamentals/tools/singleton-manager/overview.md +6 -6
  722. package/docs/guides/how-to/create-a-custom-field.md +7 -7
  723. package/docs/guides/how-to/create-a-form.md +6 -6
  724. package/docs/guides/how-to/extend-a-native-input.md +4 -4
  725. package/docs/guides/how-to/get-started.md +2 -2
  726. package/docs/guides/how-to/index.md +1 -1
  727. package/docs/guides/index.md +8 -8
  728. package/docs/guides/principles/definitions-and-terms.md +2 -2
  729. package/docs/guides/principles/index.md +5 -5
  730. package/docs/guides/principles/scoped-elements.md +2 -2
  731. package/docs/guides/principles/styling.md +3 -3
  732. package/docs/guides/principles/subclasser-apis.md +2 -2
  733. package/exports/define/lion-accordion.js +0 -1
  734. package/exports/define/lion-button-reset.js +0 -1
  735. package/exports/define/lion-button-submit.js +0 -1
  736. package/exports/define/lion-button.js +0 -1
  737. package/exports/define/lion-calendar.js +0 -1
  738. package/exports/define/lion-checkbox-group.js +0 -1
  739. package/exports/define/lion-checkbox-indeterminate.js +0 -1
  740. package/exports/define/lion-checkbox.js +0 -1
  741. package/exports/define/lion-collapsible.js +0 -1
  742. package/exports/define/lion-combobox.js +0 -1
  743. package/exports/define/lion-dialog.js +0 -1
  744. package/exports/define/lion-drawer.js +0 -1
  745. package/exports/define/lion-field.js +0 -1
  746. package/exports/define/lion-fieldset.js +0 -1
  747. package/exports/define/lion-form.js +0 -1
  748. package/exports/define/lion-icon.js +0 -1
  749. package/exports/define/lion-input-amount-dropdown.js +0 -1
  750. package/exports/define/lion-input-amount.js +0 -1
  751. package/exports/define/lion-input-date.js +0 -1
  752. package/exports/define/lion-input-datepicker.js +0 -1
  753. package/exports/define/lion-input-email.js +0 -1
  754. package/exports/define/lion-input-file.js +0 -1
  755. package/exports/define/lion-input-iban.js +0 -1
  756. package/exports/define/lion-input-range.js +0 -1
  757. package/exports/define/lion-input-stepper.js +0 -1
  758. package/exports/define/lion-input-tel-dropdown.js +0 -1
  759. package/exports/define/lion-input-tel.js +0 -1
  760. package/exports/define/lion-input.js +0 -1
  761. package/exports/define/lion-item.js +0 -1
  762. package/exports/define/lion-listbox.js +0 -1
  763. package/exports/define/lion-menu.js +0 -1
  764. package/exports/define/lion-menuitem.js +0 -1
  765. package/exports/define/lion-option.js +0 -1
  766. package/exports/define/lion-options.js +0 -1
  767. package/exports/define/lion-pagination.js +0 -1
  768. package/exports/define/lion-progress-indicator.js +0 -1
  769. package/exports/define/lion-radio-group.js +0 -1
  770. package/exports/define/lion-radio.js +0 -1
  771. package/exports/define/lion-select-invoker.js +0 -1
  772. package/exports/define/lion-select-rich.js +0 -1
  773. package/exports/define/lion-select.js +0 -1
  774. package/exports/define/lion-selected-file-list.js +0 -1
  775. package/exports/define/lion-step.js +0 -1
  776. package/exports/define/lion-steps.js +0 -1
  777. package/exports/define/lion-switch-button.js +0 -1
  778. package/exports/define/lion-switch.js +0 -1
  779. package/exports/define/lion-tabs.js +0 -1
  780. package/exports/define/lion-textarea.js +0 -1
  781. package/exports/define/lion-tooltip.js +0 -1
  782. package/exports/define/lion-validation-feedback.js +0 -1
  783. package/exports/define-helpers/sb-action-logger.js +0 -1
  784. package/exports/define-helpers/sb-locale-switcher.js +0 -1
  785. package/exports/form-core.js +0 -8
  786. package/exports/localize-no-side-effects.js +0 -1
  787. package/exports/localize.js +0 -2
  788. package/exports/overlays.js +0 -4
  789. package/generated/awesome-phonenumber/LICENSE +22 -0
  790. package/generated/awesome-phonenumber/LICENSE.closure-library +176 -0
  791. package/generated/awesome-phonenumber/LICENSE.libphonenumber +176 -0
  792. package/generated/awesome-phonenumber/checksums.json +6 -0
  793. package/generated/awesome-phonenumber/index-esm.mjs +817 -0
  794. package/generated/awesome-phonenumber/index.d.ts +227 -0
  795. package/generated/awesome-phonenumber/index.js +45 -0
  796. package/generated/awesome-phonenumber/lib/index.js +710 -0
  797. package/generated/awesome-phonenumber/package.json +9 -0
  798. package/generated/awesome-phonenumber/provenance.json +13 -0
  799. package/package.json +38 -15
  800. package/vscode.html-custom-data.json +5 -5
  801. package/web-types.json +1 -1
  802. package/vendor/README.md +0 -61
  803. package/vendor/awesome-phonenumber-7.9.0-tlouisse.libphonenumber-9.0.41.tgz +0 -0
@@ -14,7 +14,6 @@ import {
14
14
  html,
15
15
  waitUntil,
16
16
  } from '@open-wc/testing';
17
-
18
17
  import { isActiveElement } from '../../core/test-helpers/isActiveElement.js';
19
18
  import { createShadowHost } from '../test-helpers/createShadowHost.js';
20
19
  import { _adoptStyleUtils } from '../src/utils/adopt-styles.js';
@@ -45,7 +44,9 @@ async function mimicEscapePress(element) {
45
44
  }
46
45
 
47
46
  // Send the event
48
- await sendKeys({ press: 'Escape' });
47
+ await sendKeys({
48
+ press: 'Escape',
49
+ });
49
50
  // Wait for at least a microtask, so that possible property effects are performed
50
51
  await aTimeout(0);
51
52
  }
@@ -55,7 +56,7 @@ async function mimicEscapePress(element) {
55
56
  * @returns {boolean}
56
57
  */
57
58
  function isRegisteredOnManager(ctrlToFind) {
58
- return Boolean(ctrlToFind.manager?.list?.find(ctrl => ctrlToFind === ctrl));
59
+ return Boolean(ctrlToFind.manager?.list?.find((ctrl) => ctrlToFind === ctrl));
59
60
  }
60
61
 
61
62
  /**
@@ -84,7 +85,7 @@ function getProtectedMembers(overlayControllerEl) {
84
85
  /**
85
86
  * @param {HTMLElement} element
86
87
  * */
87
- const isInViewport = element => {
88
+ const isInViewport = (element) => {
88
89
  const rect = element.getBoundingClientRect();
89
90
  return (
90
91
  rect.top >= 0 &&
@@ -93,40 +94,34 @@ const isInViewport = element => {
93
94
  rect.right <= (window.innerWidth || document.documentElement.clientWidth)
94
95
  );
95
96
  };
96
-
97
- const withGlobalTestConfig = () =>
98
- /** @type {OverlayConfig} */ ({
99
- placementMode: 'global',
100
- contentNode: /** @type {HTMLElement} */ (fixtureSync(html`<div>my content</div>`)),
101
- });
102
-
103
- const withLocalTestConfig = () =>
104
- /** @type {OverlayConfig} */ ({
105
- placementMode: 'local',
106
- contentNode: /** @type {HTMLElement} */ (fixtureSync(html`<div>my content</div>`)),
107
- invokerNode: /** @type {HTMLElement} */ (
108
- fixtureSync(html` <div role="button" style="width: 100px; height: 20px;">Invoker</div> `)
109
- ),
110
- });
97
+ const withGlobalTestConfig = () => /** @type {OverlayConfig} */ ({
98
+ placementMode: 'global',
99
+ contentNode: /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`),
100
+ });
101
+ const withLocalTestConfig = () => /** @type {OverlayConfig} */ ({
102
+ placementMode: 'local',
103
+ contentNode: /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`),
104
+ invokerNode:
105
+ /** @type {HTMLElement} */
106
+ fixtureSync(html` <div role="button" style="width: 100px; height: 20px;">Invoker</div> `),
107
+ });
111
108
 
112
109
  /**
113
110
  * @param {HTMLDivElement} parentContent
114
111
  * @returns {Promise<{parentOverlay: OverlayController; childOverlay: OverlayController}>}
115
112
  */
116
113
  async function createNestedEscControllers(parentContent) {
117
- const childContent = /** @type {HTMLDivElement} */ (parentContent.querySelector('div[id]'));
118
-
114
+ const childContent = /** @type {HTMLDivElement} */ parentContent.querySelector('div[id]');
119
115
  if (parentContent.hasAttribute('data-convert-to-shadow-root')) {
120
- const shadowRootParent = parentContent.attachShadow({ mode: 'open' });
116
+ const shadowRootParent = parentContent.attachShadow({
117
+ mode: 'open',
118
+ });
121
119
  shadowRootParent.appendChild(childContent);
122
120
  }
123
-
124
121
  const parentConfig = {};
125
122
  const childConfig = {};
126
-
127
123
  const parentHasOutsideOnEsc = parentContent.id.startsWith('parent-overlay--hidesOnOutsideEsc');
128
124
  const childHasOutsideOnEsc = childContent.id.startsWith('child-overlay--hidesOnOutsideEsc');
129
-
130
125
  if (parentHasOutsideOnEsc) {
131
126
  parentConfig.hidesOnOutsideEsc = true;
132
127
  } else {
@@ -137,14 +132,11 @@ async function createNestedEscControllers(parentContent) {
137
132
  } else {
138
133
  childConfig.hidesOnEsc = true;
139
134
  }
140
-
141
135
  const parentHasSyncChildrenCloseState =
142
136
  parentContent.dataset.syncChildrenCloseState !== undefined;
143
-
144
137
  if (parentHasSyncChildrenCloseState) {
145
138
  parentConfig.syncChildrenCloseState = true;
146
139
  }
147
-
148
140
  const parentOverlay = new OverlayController({
149
141
  ...withGlobalTestConfig(),
150
142
  contentNode: parentContent,
@@ -155,19 +147,18 @@ async function createNestedEscControllers(parentContent) {
155
147
  contentNode: childContent,
156
148
  ...childConfig,
157
149
  });
158
-
159
150
  await parentOverlay.show();
160
151
  await childOverlay.show();
161
-
162
- return { parentOverlay, childOverlay };
152
+ return {
153
+ parentOverlay,
154
+ childOverlay,
155
+ };
163
156
  }
164
-
165
157
  afterEach(() => {
166
158
  overlays.teardown();
167
159
  // clean document.body from the DOM nodes left by previous tests
168
160
  document.body.innerHTML = '';
169
161
  });
170
-
171
162
  describe('OverlayController', () => {
172
163
  describe('Init', () => {
173
164
  it('adds OverlayController instance to OverlayManager', async () => {
@@ -177,7 +168,6 @@ describe('OverlayController', () => {
177
168
  expect(ctrl.manager).to.equal(overlays);
178
169
  expect(overlays.list).to.include(ctrl);
179
170
  });
180
-
181
171
  it('prepares a content node wrapper', async () => {
182
172
  const ctrl = new OverlayController({
183
173
  ...withGlobalTestConfig(),
@@ -185,12 +175,11 @@ describe('OverlayController', () => {
185
175
  expect(ctrl.content).not.to.be.undefined;
186
176
  expect(ctrl.contentNode.parentElement).to.equal(ctrl.contentWrapperNode);
187
177
  });
188
-
189
178
  describe('Stylesheets', () => {
190
179
  it('calls adoptStyles', async () => {
191
180
  const spy = sinon.spy(_adoptStyleUtils, 'adoptStyle');
192
181
  const { shadowHost, cleanupShadowHost } = createShadowHost();
193
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>contentful</div>'));
182
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>contentful</div>');
194
183
  shadowHost.appendChild(contentNode);
195
184
  new OverlayController({
196
185
  ...withLocalTestConfig(),
@@ -200,7 +189,6 @@ describe('OverlayController', () => {
200
189
  cleanupShadowHost();
201
190
  });
202
191
  });
203
-
204
192
  describe('Z-index on local overlays', () => {
205
193
  /** @type {HTMLElement} */
206
194
  let contentNode;
@@ -210,7 +198,8 @@ describe('OverlayController', () => {
210
198
  */
211
199
  async function createZNode(zIndexVal, { mode } = {}) {
212
200
  if (mode === 'global') {
213
- contentNode = /** @type {HTMLElement} */ (
201
+ contentNode =
202
+ /** @type {HTMLElement} */
214
203
  await fixture(html`
215
204
  <div class="z-index--${zIndexVal}">
216
205
  <style>
@@ -220,69 +209,92 @@ describe('OverlayController', () => {
220
209
  </style>
221
210
  I should be on top
222
211
  </div>
223
- `)
224
- );
212
+ `);
225
213
  }
226
214
  if (mode === 'inline') {
227
- contentNode = /** @type {HTMLElement} */ (
228
- await fixture(html` <div>I should be on top</div> `)
229
- );
215
+ contentNode =
216
+ /** @type {HTMLElement} */
217
+ await fixture(html` <div>I should be on top</div> `);
230
218
  contentNode.style.zIndex = zIndexVal;
231
219
  }
232
220
  return contentNode;
233
221
  }
234
-
235
222
  it('sets a z-index to make sure overlay is painted on top of siblings', async () => {
236
223
  const ctrl = new OverlayController({
237
224
  ...withLocalTestConfig(),
238
- contentNode: await createZNode('auto', { mode: 'global' }),
225
+ contentNode: await createZNode('auto', {
226
+ mode: 'global',
227
+ }),
239
228
  });
240
229
  await ctrl.show();
241
230
  // @ts-expect-error find out why config would/could be undfined
242
231
  expect(ctrl.content.style.zIndex).to.equal(`${ctrl.config.zIndex + 1}`);
243
- ctrl.updateConfig({ contentNode: await createZNode('auto', { mode: 'inline' }) });
232
+ ctrl.updateConfig({
233
+ contentNode: await createZNode('auto', {
234
+ mode: 'inline',
235
+ }),
236
+ });
244
237
  await ctrl.show();
245
238
  // @ts-expect-error find out why config would/could be undfined
246
239
  expect(ctrl.content.style.zIndex).to.equal(`${ctrl.config.zIndex + 1}`);
247
-
248
- ctrl.updateConfig({ contentNode: await createZNode('0', { mode: 'global' }) });
240
+ ctrl.updateConfig({
241
+ contentNode: await createZNode('0', {
242
+ mode: 'global',
243
+ }),
244
+ });
249
245
  await ctrl.show();
250
246
  // @ts-expect-error find out why config would/could be undfined
251
247
  expect(ctrl.content.style.zIndex).to.equal(`${ctrl.config.zIndex + 1}`);
252
- ctrl.updateConfig({ contentNode: await createZNode('0', { mode: 'inline' }) });
248
+ ctrl.updateConfig({
249
+ contentNode: await createZNode('0', {
250
+ mode: 'inline',
251
+ }),
252
+ });
253
253
  await ctrl.show();
254
254
  // @ts-expect-error find out why config would/could be undfined
255
255
  expect(ctrl.content.style.zIndex).to.equal(`${ctrl.config.zIndex + 1}`);
256
256
  });
257
-
258
257
  it.skip("doesn't set a z-index when contentNode already has >= 1", async () => {
259
258
  const ctrl = new OverlayController({
260
259
  ...withLocalTestConfig(),
261
- contentNode: await createZNode('1', { mode: 'global' }),
260
+ contentNode: await createZNode('1', {
261
+ mode: 'global',
262
+ }),
262
263
  });
263
264
  await ctrl.show();
264
265
  expect(ctrl.content.style.zIndex).to.equal('');
265
- ctrl.updateConfig({ contentNode: await createZNode('auto', { mode: 'inline' }) });
266
+ ctrl.updateConfig({
267
+ contentNode: await createZNode('auto', {
268
+ mode: 'inline',
269
+ }),
270
+ });
266
271
  await ctrl.show();
267
272
  expect(ctrl.content.style.zIndex).to.equal('');
268
-
269
- ctrl.updateConfig({ contentNode: await createZNode('2', { mode: 'global' }) });
273
+ ctrl.updateConfig({
274
+ contentNode: await createZNode('2', {
275
+ mode: 'global',
276
+ }),
277
+ });
270
278
  await ctrl.show();
271
279
  expect(ctrl.content.style.zIndex).to.equal('');
272
- ctrl.updateConfig({ contentNode: await createZNode('2', { mode: 'inline' }) });
280
+ ctrl.updateConfig({
281
+ contentNode: await createZNode('2', {
282
+ mode: 'inline',
283
+ }),
284
+ });
273
285
  await ctrl.show();
274
286
  expect(ctrl.content.style.zIndex).to.equal('');
275
287
  });
276
-
277
288
  it("doesn't touch the value of .contentNode", async () => {
278
289
  const ctrl = new OverlayController({
279
290
  ...withLocalTestConfig(),
280
- contentNode: await createZNode('auto', { mode: 'global' }),
291
+ contentNode: await createZNode('auto', {
292
+ mode: 'global',
293
+ }),
281
294
  });
282
295
  expect(ctrl.contentNode.style.zIndex).to.equal('');
283
296
  });
284
297
  });
285
-
286
298
  describe('Offline content', () => {
287
299
  it('throws when passing a content node that was created "offline"', async () => {
288
300
  const contentNode = document.createElement('div');
@@ -292,14 +304,12 @@ describe('OverlayController', () => {
292
304
  contentNode,
293
305
  });
294
306
  };
295
-
296
307
  expect(createOverlayController).to.throw(
297
308
  '[OverlayController] Could not find a render target, makes sure contentNode has a parent element (or contentWrapperNode is connected)',
298
309
  );
299
310
  });
300
-
301
311
  it('succeeds when passing a content node that was created "online"', async () => {
302
- const contentNode = /** @type {HTMLElement} */ (fixtureSync('<div>'));
312
+ const contentNode = /** @type {HTMLElement} */ fixtureSync('<div>');
303
313
  const overlay = new OverlayController({
304
314
  ...withLocalTestConfig(),
305
315
  contentNode,
@@ -311,18 +321,45 @@ describe('OverlayController', () => {
311
321
 
312
322
  // TODO: Add more teardown feature tests
313
323
  describe('Teardown', () => {
324
+ it('allows removing content after teardown without leaving nodes in the DOM', async () => {
325
+ const contentNode = /** @type {HTMLElement} */ fixtureSync('<div>notification</div>');
326
+ const ctrl = new OverlayController({
327
+ placementMode: 'global',
328
+ contentNode,
329
+ });
330
+ const wrapper = ctrl.content;
331
+ await ctrl.show();
332
+ ctrl.teardown();
333
+ ctrl.content.remove();
334
+ expect(contentNode.isConnected).to.be.false;
335
+ expect(wrapper.isConnected).to.be.false;
336
+ expect(isRegisteredOnManager(ctrl)).to.be.false;
337
+ ctrl.teardown();
338
+ });
339
+ it('recreates wrappers after teardown while keeping content available', () => {
340
+ const contentNode = /** @type {HTMLElement} */ fixtureSync('<div>notification</div>');
341
+ const ctrl = new OverlayController({
342
+ placementMode: 'global',
343
+ contentNode,
344
+ });
345
+ const wrapper = ctrl.content;
346
+ ctrl.teardown();
347
+ expect(ctrl.content).to.equal(contentNode);
348
+ ctrl.updateConfig({
349
+ placementMode: 'global',
350
+ contentNode,
351
+ });
352
+ expect(ctrl.content).not.to.equal(wrapper);
353
+ expect(ctrl.content.contains(contentNode)).to.be.true;
354
+ });
314
355
  it('unregisters itself from overlayManager', async () => {
315
356
  const ctrl = new OverlayController(withGlobalTestConfig());
316
-
317
357
  expect(isRegisteredOnManager(ctrl)).to.be.true;
318
-
319
358
  ctrl.teardown();
320
-
321
359
  expect(isRegisteredOnManager(ctrl)).to.be.false;
322
360
  });
323
-
324
361
  it('handles removal from DOM gracefully when overlay is open', async () => {
325
- const contentNode = /** @type {HTMLElement} */ (fixtureSync(html`<div>my content</div>`));
362
+ const contentNode = /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`);
326
363
  const ctrl = new OverlayController({
327
364
  placementMode: 'global',
328
365
  contentNode,
@@ -340,7 +377,6 @@ describe('OverlayController', () => {
340
377
  // Teardown should complete without errors
341
378
  expect(isRegisteredOnManager(ctrl)).to.be.false;
342
379
  });
343
-
344
380
  it('does not throw when hide() is called after teardown() on a shown controller', async () => {
345
381
  const ctrl = new OverlayController({
346
382
  ...withGlobalTestConfig(),
@@ -356,9 +392,8 @@ describe('OverlayController', () => {
356
392
  await ctrl.hide();
357
393
  expect(ctrl.isShown).to.be.false;
358
394
  });
359
-
360
395
  it('cleans up the dom structure it created', async () => {
361
- const contentNode = /** @type {HTMLElement} */ (fixtureSync(html`<div>my content</div>`));
396
+ const contentNode = /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`);
362
397
  const ctrl = new OverlayController({
363
398
  placementMode: 'global',
364
399
  contentNode,
@@ -366,17 +401,15 @@ describe('OverlayController', () => {
366
401
  await ctrl.show();
367
402
  expect(ctrl.contentWrapperNode).to.exist;
368
403
  expect(ctrl.__wrappingDialogNode).to.exist;
369
-
370
404
  await ctrl.teardown();
371
405
  expect(ctrl.contentWrapperNode).to.not.exist;
372
406
  expect(ctrl.__wrappingDialogNode).to.not.exist;
373
407
  });
374
408
  });
375
-
376
409
  describe('Node Configuration', () => {
377
410
  describe('Content', async () => {
378
411
  it('accepts a .contentNode for displaying content of the overlay', async () => {
379
- const myContentNode = /** @type {HTMLElement} */ (fixtureSync('<p>direct node</p>'));
412
+ const myContentNode = /** @type {HTMLElement} */ fixtureSync('<p>direct node</p>');
380
413
  const ctrl = new OverlayController({
381
414
  ...withGlobalTestConfig(),
382
415
  contentNode: myContentNode,
@@ -384,7 +417,6 @@ describe('OverlayController', () => {
384
417
  expect(ctrl.contentNode).to.have.trimmed.text('direct node');
385
418
  expect(ctrl.contentNode).to.equal(myContentNode);
386
419
  });
387
-
388
420
  describe('Embedded dom structure', async () => {
389
421
  describe('When projected in shadow dom', async () => {
390
422
  it('wraps a .contentWrapperNode for style application and a <dialog role="none"> for top layer paints', async () => {
@@ -392,27 +424,25 @@ describe('OverlayController', () => {
392
424
  class extends HTMLElement {
393
425
  constructor() {
394
426
  super();
395
- this.attachShadow({ mode: 'open' });
427
+ this.attachShadow({
428
+ mode: 'open',
429
+ });
396
430
  }
397
-
398
431
  connectedCallback() {
399
432
  /** @type {ShadowRoot} */
400
- (this.shadowRoot).innerHTML = '<slot name="content"></slot>';
433
+ this.shadowRoot.innerHTML = '<slot name="content"></slot>';
401
434
  this.innerHTML = '<div slot="content">projected</div>';
402
435
  }
403
436
  },
404
437
  );
405
-
406
- const el = /** @type {HTMLElement} */ (fixtureSync(`<${tagString}></${tagString}>`));
407
- const myContentNode = /** @type {HTMLElement} */ (el.querySelector('[slot=content]'));
438
+ const el = /** @type {HTMLElement} */ fixtureSync(`<${tagString}></${tagString}>`);
439
+ const myContentNode = /** @type {HTMLElement} */ el.querySelector('[slot=content]');
408
440
  const ctrl = new OverlayController({
409
441
  ...withGlobalTestConfig(),
410
442
  contentNode: myContentNode,
411
443
  });
412
-
413
444
  expect(ctrl.contentNode.assignedSlot?.parentElement).to.equal(ctrl.contentWrapperNode);
414
445
  expect(ctrl.contentWrapperNode.parentElement?.tagName).to.equal('DIALOG');
415
-
416
446
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
417
447
 
418
448
  // The total dom structure created...
@@ -425,24 +455,23 @@ describe('OverlayController', () => {
425
455
  </div>
426
456
  </dialog>
427
457
  `,
428
- { ignoreAttributes: ['closedby'] },
458
+ {
459
+ ignoreAttributes: ['closedby'],
460
+ },
429
461
  );
430
-
431
462
  expect(el).lightDom.to.equal(`<div data-content="" slot="content">projected</div>`);
432
463
  });
433
464
  });
434
-
435
465
  describe('When in light dom', async () => {
436
466
  it('wraps a .contentWrapperNode for style application and a <dialog role="none"> for top layer paints', async () => {
437
467
  const el = fixtureSync('<section><div id="content">non projected</div></section>');
438
- const myContentNode = /** @type {HTMLElement} */ (el.querySelector('#content'));
468
+ const myContentNode = /** @type {HTMLElement} */ el.querySelector('#content');
439
469
  const ctrl = new OverlayController({
440
470
  ...withGlobalTestConfig(),
441
471
  contentNode: myContentNode,
442
472
  });
443
473
  expect(ctrl.contentNode.parentElement).to.equal(ctrl.contentWrapperNode);
444
474
  expect(ctrl.contentWrapperNode.parentElement?.tagName).to.equal('DIALOG');
445
-
446
475
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
447
476
 
448
477
  // The total dom structure created...
@@ -454,16 +483,19 @@ describe('OverlayController', () => {
454
483
  </div>
455
484
  </dialog>
456
485
  `,
457
- { ignoreAttributes: ['closedby'] },
486
+ {
487
+ ignoreAttributes: ['closedby'],
488
+ },
458
489
  );
459
490
  });
460
491
  });
461
-
462
492
  describe('When .contentWrapperNode is provided in a host that is not connected yet', () => {
463
493
  /** @param {{ nested?: boolean }} [opts] */
464
494
  function createDisconnectedHost({ nested = false } = {}) {
465
495
  const host = document.createElement('div');
466
- const shadowRoot = host.attachShadow({ mode: 'open' });
496
+ const shadowRoot = host.attachShadow({
497
+ mode: 'open',
498
+ });
467
499
  const wrapper = document.createElement('div');
468
500
  wrapper.setAttribute('data-id', 'content-wrapper');
469
501
  wrapper.innerHTML = '<slot name="content"></slot>';
@@ -478,93 +510,95 @@ describe('OverlayController', () => {
478
510
  content.slot = 'content';
479
511
  content.textContent = 'projected';
480
512
  host.appendChild(content);
481
- return { host, shadowRoot, wrapper, content };
513
+ return {
514
+ host,
515
+ shadowRoot,
516
+ wrapper,
517
+ content,
518
+ };
482
519
  }
483
-
484
520
  it('does not throw and keeps the projected slot inside the wrapper', async () => {
485
521
  const { host, shadowRoot, wrapper, content } = createDisconnectedHost();
486
522
  expect(wrapper.isConnected).to.be.false;
487
- const slot = /** @type {HTMLSlotElement} */ (content.assignedSlot);
488
-
523
+ const slot = /** @type {HTMLSlotElement} */ content.assignedSlot;
489
524
  const ctrl = new OverlayController({
490
525
  ...withGlobalTestConfig(),
491
526
  contentNode: content,
492
527
  contentWrapperNode: wrapper,
493
528
  });
494
-
495
529
  expect(ctrl.contentWrapperNode).to.equal(wrapper);
496
530
  expect(wrapper.parentElement?.tagName).to.equal('DIALOG');
497
531
  expect(slot.parentElement).to.equal(wrapper);
498
532
  expect(content.parentElement).to.equal(host);
499
533
  expect(shadowRoot.querySelectorAll('slot').length).to.equal(1);
500
534
  });
501
-
502
535
  it('restores the same relocated slot at its original position on teardown', async () => {
503
- const { host, shadowRoot, wrapper, content } = createDisconnectedHost({ nested: true });
504
- const section = /** @type {HTMLElement} */ (shadowRoot.querySelector('section'));
505
- const slot = /** @type {HTMLSlotElement} */ (content.assignedSlot);
536
+ const { host, shadowRoot, wrapper, content } = createDisconnectedHost({
537
+ nested: true,
538
+ });
539
+ const section = /** @type {HTMLElement} */ shadowRoot.querySelector('section');
540
+ const slot = /** @type {HTMLSlotElement} */ content.assignedSlot;
506
541
  const ctrl = new OverlayController({
507
542
  ...withGlobalTestConfig(),
508
543
  contentNode: content,
509
544
  contentWrapperNode: wrapper,
510
545
  });
511
-
512
546
  ctrl.teardown();
513
-
514
547
  expect(content.parentElement).to.equal(host);
515
548
  expect(wrapper.parentElement).to.equal(section);
516
549
  expect(slot.parentElement).to.equal(wrapper);
517
550
  expect(shadowRoot.querySelector('dialog')).to.be.null;
518
551
  expect(shadowRoot.querySelector('slot')).to.equal(slot);
519
552
  });
520
-
521
553
  it('survives repeated updateConfig calls and keeps slot ownership', async () => {
522
554
  const { host, shadowRoot, wrapper, content } = createDisconnectedHost();
523
- const slot = /** @type {HTMLSlotElement} */ (content.assignedSlot);
555
+ const slot = /** @type {HTMLSlotElement} */ content.assignedSlot;
524
556
  const ctrl = new OverlayController({
525
557
  ...withGlobalTestConfig(),
526
558
  contentNode: content,
527
559
  contentWrapperNode: wrapper,
528
560
  });
529
-
530
- expect(() => ctrl.updateConfig({ trapsKeyboardFocus: true })).to.not.throw();
531
- expect(() => ctrl.updateConfig({ trapsKeyboardFocus: false })).to.not.throw();
532
-
561
+ expect(() =>
562
+ ctrl.updateConfig({
563
+ trapsKeyboardFocus: true,
564
+ }),
565
+ ).to.not.throw();
566
+ expect(() =>
567
+ ctrl.updateConfig({
568
+ trapsKeyboardFocus: false,
569
+ }),
570
+ ).to.not.throw();
533
571
  expect(content.parentElement).to.equal(host);
534
572
  expect(shadowRoot.querySelectorAll('slot').length).to.equal(1);
535
573
  expect(shadowRoot.querySelector('slot')).to.equal(slot);
536
574
  expect(wrapper.contains(slot)).to.be.true;
537
575
  });
538
576
  });
539
-
540
577
  describe('When .contenWrapperNode provided', async () => {
541
578
  it('keeps the .contentWrapperNode for style application and wraps a <dialog role="none"> for top layer paints', async () => {
542
579
  const tagString = defineCE(
543
580
  class extends HTMLElement {
544
581
  constructor() {
545
582
  super();
546
- this.attachShadow({ mode: 'open' });
583
+ this.attachShadow({
584
+ mode: 'open',
585
+ });
547
586
  }
548
-
549
587
  connectedCallback() {
550
588
  /** @type {ShadowRoot} */
551
- (this.shadowRoot).innerHTML = '<div><slot name="content"></slot></div>';
589
+ this.shadowRoot.innerHTML = '<div><slot name="content"></slot></div>';
552
590
  this.innerHTML = '<div slot="content">projected</div>';
553
591
  }
554
592
  },
555
593
  );
556
-
557
- const el = /** @type {HTMLElement} */ (fixtureSync(`<${tagString}></${tagString}>`));
558
- const myContentNode = /** @type {HTMLElement} */ (el.querySelector('[slot=content]'));
559
- const myContentWrapper = /** @type {HTMLElement} */ (
560
- el.shadowRoot?.querySelector('div')
561
- );
594
+ const el = /** @type {HTMLElement} */ fixtureSync(`<${tagString}></${tagString}>`);
595
+ const myContentNode = /** @type {HTMLElement} */ el.querySelector('[slot=content]');
596
+ const myContentWrapper = /** @type {HTMLElement} */ el.shadowRoot?.querySelector('div');
562
597
  const ctrl = new OverlayController({
563
598
  ...withGlobalTestConfig(),
564
599
  contentNode: myContentNode,
565
600
  contentWrapperNode: myContentWrapper,
566
601
  });
567
-
568
602
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
569
603
 
570
604
  // The total dom structure created...
@@ -576,21 +610,23 @@ describe('OverlayController', () => {
576
610
  </div>
577
611
  </dialog>
578
612
  `,
579
- { ignoreAttributes: ['closedby'] },
613
+ {
614
+ ignoreAttributes: ['closedby'],
615
+ },
580
616
  );
581
617
  });
582
-
583
618
  it("uses the .contentWrapperNode as container for Popper's arrow", async () => {
584
619
  const tagString = defineCE(
585
620
  class extends HTMLElement {
586
621
  constructor() {
587
622
  super();
588
- this.attachShadow({ mode: 'open' });
623
+ this.attachShadow({
624
+ mode: 'open',
625
+ });
589
626
  }
590
-
591
627
  connectedCallback() {
592
628
  /** @type {ShadowRoot} */
593
- (this.shadowRoot).innerHTML = `
629
+ this.shadowRoot.innerHTML = `
594
630
  <div>
595
631
  <div id="arrow"></div>
596
632
  <slot name="content"></slot>
@@ -599,18 +635,14 @@ describe('OverlayController', () => {
599
635
  }
600
636
  },
601
637
  );
602
-
603
- const el = /** @type {HTMLElement} */ (fixtureSync(`<${tagString}></${tagString}>`));
604
- const myContentNode = /** @type {HTMLElement} */ (el.querySelector('[slot=content]'));
605
- const myContentWrapper = /** @type {HTMLElement} */ (
606
- el.shadowRoot?.querySelector('div')
607
- );
638
+ const el = /** @type {HTMLElement} */ fixtureSync(`<${tagString}></${tagString}>`);
639
+ const myContentNode = /** @type {HTMLElement} */ el.querySelector('[slot=content]');
640
+ const myContentWrapper = /** @type {HTMLElement} */ el.shadowRoot?.querySelector('div');
608
641
  const ctrl = new OverlayController({
609
642
  ...withLocalTestConfig(),
610
643
  contentNode: myContentNode,
611
644
  contentWrapperNode: myContentWrapper,
612
645
  });
613
-
614
646
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
615
647
 
616
648
  // The total dom structure created...
@@ -623,16 +655,17 @@ describe('OverlayController', () => {
623
655
  </div>
624
656
  </dialog>
625
657
  `,
626
- { ignoreAttributes: ['closedby'] },
658
+ {
659
+ ignoreAttributes: ['closedby'],
660
+ },
627
661
  );
628
662
  });
629
663
  });
630
664
  });
631
665
  });
632
-
633
666
  describe('Invoker / Reference', async () => {
634
667
  it('accepts a .invokerNode to directly set invoker', async () => {
635
- const myInvokerNode = /** @type {HTMLElement} */ (fixtureSync('<button>invoke</button>'));
668
+ const myInvokerNode = /** @type {HTMLElement} */ fixtureSync('<button>invoke</button>');
636
669
  const ctrl = new OverlayController({
637
670
  ...withGlobalTestConfig(),
638
671
  invokerNode: myInvokerNode,
@@ -640,10 +673,9 @@ describe('OverlayController', () => {
640
673
  expect(ctrl.invokerNode).to.equal(myInvokerNode);
641
674
  expect(ctrl.referenceNode).to.equal(undefined);
642
675
  });
643
-
644
676
  it('accepts a .referenceNode as positioning anchor different from .invokerNode', async () => {
645
- const myInvokerNode = /** @type {HTMLElement} */ (fixtureSync('<button>invoke</button>'));
646
- const myReferenceNode = /** @type {HTMLElement} */ (fixtureSync('<div>anchor</div>'));
677
+ const myInvokerNode = /** @type {HTMLElement} */ fixtureSync('<button>invoke</button>');
678
+ const myReferenceNode = /** @type {HTMLElement} */ fixtureSync('<div>anchor</div>');
647
679
  const ctrl = new OverlayController({
648
680
  ...withGlobalTestConfig(),
649
681
  invokerNode: myInvokerNode,
@@ -653,33 +685,30 @@ describe('OverlayController', () => {
653
685
  expect(ctrl.invokerNode).to.not.equal(ctrl.referenceNode);
654
686
  });
655
687
  });
656
-
657
688
  describe('Backdrop', () => {
658
689
  it('creates a .backdropNode inside <dialog> for guaranteed top layer paints and positioning opportunities', async () => {
659
690
  const tagString = defineCE(
660
691
  class extends HTMLElement {
661
692
  constructor() {
662
693
  super();
663
- this.attachShadow({ mode: 'open' });
694
+ this.attachShadow({
695
+ mode: 'open',
696
+ });
664
697
  }
665
-
666
698
  connectedCallback() {
667
699
  /** @type {ShadowRoot} */
668
- (this.shadowRoot).innerHTML = '<slot name="content"></slot>';
700
+ this.shadowRoot.innerHTML = '<slot name="content"></slot>';
669
701
  this.innerHTML = '<div slot="content">projected</div>';
670
702
  }
671
703
  },
672
704
  );
673
-
674
- const el = /** @type {HTMLElement} */ (fixtureSync(`<${tagString}></${tagString}>`));
675
- const myContentNode = /** @type {HTMLElement} */ (el.querySelector('[slot=content]'));
676
-
705
+ const el = /** @type {HTMLElement} */ fixtureSync(`<${tagString}></${tagString}>`);
706
+ const myContentNode = /** @type {HTMLElement} */ el.querySelector('[slot=content]');
677
707
  const ctrl = new OverlayController({
678
708
  ...withGlobalTestConfig(),
679
709
  contentNode: myContentNode,
680
710
  hasBackdrop: true,
681
711
  });
682
-
683
712
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
684
713
 
685
714
  // The total dom structure created...
@@ -693,31 +722,29 @@ describe('OverlayController', () => {
693
722
  </div>
694
723
  </dialog>
695
724
  `,
696
- { ignoreAttributes: ['closedby'] },
725
+ {
726
+ ignoreAttributes: ['closedby'],
727
+ },
697
728
  );
698
729
  });
699
730
  });
700
-
701
731
  describe('When contentWrapperNode needs to be provided for correct arrow positioning', () => {
702
732
  it('uses contentWrapperNode as provided for local positioning', async () => {
703
- const el = /** @type {HTMLElement} */ (
733
+ const el =
734
+ /** @type {HTMLElement} */
704
735
  await fixture(html`
705
736
  <div id="contentWrapperNode">
706
737
  <div id="contentNode"></div>
707
738
  <my-arrow></my-arrow>
708
739
  </div>
709
- `)
710
- );
711
-
712
- const contentNode = /** @type {HTMLElement} */ (el.querySelector('#contentNode'));
740
+ `);
741
+ const contentNode = /** @type {HTMLElement} */ el.querySelector('#contentNode');
713
742
  const contentWrapperNode = el;
714
-
715
743
  const ctrl = new OverlayController({
716
744
  ...withLocalTestConfig(),
717
745
  contentNode,
718
746
  contentWrapperNode,
719
747
  });
720
-
721
748
  expect(ctrl.contentWrapperNode).to.equal(contentWrapperNode);
722
749
  });
723
750
  });
@@ -734,27 +761,28 @@ describe('OverlayController', () => {
734
761
  await ctrl.show();
735
762
  expect(isActiveElement(ctrl.contentNode)).to.be.true;
736
763
  });
737
-
738
764
  it('keeps focus within the overlay e.g. you can not tab out by accident', async () => {
739
- const contentNode = /** @type {HTMLElement} */ (
740
- await fixture(html` <div><input id="input1" /><input id="input2" /></div> `)
741
- );
765
+ const contentNode =
766
+ /** @type {HTMLElement} */
767
+ await fixture(html` <div><input id="input1" /><input id="input2" /></div> `);
742
768
  const ctrl = new OverlayController({
743
769
  ...withGlobalTestConfig(),
744
770
  trapsKeyboardFocus: true,
745
771
  contentNode,
746
772
  });
747
773
  await ctrl.show();
748
-
749
774
  await fixture(html`<button>click me</button>`);
750
775
  const input1 = ctrl.contentNode.querySelectorAll('input')[0];
751
776
  const input2 = ctrl.contentNode.querySelectorAll('input')[1];
752
777
  input2.focus();
753
- await sendKeys({ press: 'Tab' });
754
-
778
+ await sendKeys({
779
+ press: 'Tab',
780
+ });
755
781
  if (browserDetection.isChrome) {
756
782
  expect(isActiveElement(document.body)).to.be.true;
757
- await sendKeys({ press: 'Tab' });
783
+ await sendKeys({
784
+ press: 'Tab',
785
+ });
758
786
  expect(isActiveElement(input1)).to.be.true;
759
787
  }
760
788
  if (browserDetection.isFirefox) {
@@ -762,37 +790,40 @@ describe('OverlayController', () => {
762
790
  // once we focus on the latest focusable element, `input2` in this case,
763
791
  // any further Tab presses keeps the focus on `input2` element
764
792
  expect(isActiveElement(input2)).to.be.true;
765
- await sendKeys({ press: 'Tab' });
793
+ await sendKeys({
794
+ press: 'Tab',
795
+ });
766
796
  expect(isActiveElement(input2)).to.be.true;
767
797
  }
768
798
  if (browserDetection.isMacSafari) {
769
799
  expect(isActiveElement(document.body)).to.be.true;
770
- await sendKeys({ press: 'Tab' });
800
+ await sendKeys({
801
+ press: 'Tab',
802
+ });
771
803
  expect(isActiveElement(ctrl.contentNode)).to.be.true;
772
- await sendKeys({ press: 'Tab' });
804
+ await sendKeys({
805
+ press: 'Tab',
806
+ });
773
807
  expect(isActiveElement(input1)).to.be.true;
774
808
  }
775
809
  });
776
-
777
810
  it('focuses the element with [autofocus] when dialog gets opened', async () => {
778
- const contentNode = /** @type {HTMLElement} */ (
779
- await fixture(html` <div><input id="input1" /><input id="input2" autofocus /></div> `)
780
- );
811
+ const contentNode =
812
+ /** @type {HTMLElement} */
813
+ await fixture(html` <div><input id="input1" /><input id="input2" autofocus /></div> `);
781
814
  const ctrl = new OverlayController({
782
815
  ...withGlobalTestConfig(),
783
816
  trapsKeyboardFocus: true,
784
817
  contentNode,
785
818
  });
786
819
  await ctrl.show();
787
-
788
820
  const input2 = ctrl.contentNode.querySelectorAll('input')[1];
789
821
  expect(isActiveElement(input2)).to.be.true;
790
822
  });
791
-
792
823
  it('focuses the contentNode when dialog gets opened and there is no [autofocus]', async () => {
793
- const contentNode = /** @type {HTMLElement} */ (
794
- await fixture(html` <div><input id="input1" /><input id="input2" /></div> `)
795
- );
824
+ const contentNode =
825
+ /** @type {HTMLElement} */
826
+ await fixture(html` <div><input id="input1" /><input id="input2" /></div> `);
796
827
  const ctrl = new OverlayController({
797
828
  ...withGlobalTestConfig(),
798
829
  trapsKeyboardFocus: true,
@@ -801,57 +832,48 @@ describe('OverlayController', () => {
801
832
  await ctrl.show();
802
833
  expect(isActiveElement(contentNode)).to.be.true;
803
834
  });
804
-
805
835
  it('allows to move the focus outside of the overlay if trapsKeyboardFocus is disabled', async () => {
806
- const contentNode = /** @type {HTMLElement} */ (await fixture(html`<div><input /></div>`));
807
-
836
+ const contentNode = /** @type {HTMLElement} */ await fixture(html`<div><input /></div>`);
808
837
  const ctrl = new OverlayController({
809
838
  ...withGlobalTestConfig(),
810
839
  contentNode,
811
840
  trapsKeyboardFocus: false,
812
841
  });
813
842
  // add element to dom to allow focus
814
- /** @type {HTMLElement} */ (await fixture(html`${ctrl.content}`));
843
+ /** @type {HTMLElement} */
844
+ await fixture(html`${ctrl.content}`);
815
845
  await ctrl.show();
816
-
817
- const elOutside = /** @type {HTMLElement} */ (await fixture(html`<input />`));
818
- const input = /** @type {HTMLInputElement} */ (ctrl.contentNode.querySelector('input'));
819
-
846
+ const elOutside = /** @type {HTMLElement} */ await fixture(html`<input />`);
847
+ const input = /** @type {HTMLInputElement} */ ctrl.contentNode.querySelector('input');
820
848
  input.focus();
821
849
  simulateTab();
822
-
823
850
  expect(isActiveElement(elOutside)).to.be.true;
824
851
  });
825
-
826
852
  it('keeps focus within overlay with multiple overlays with all traps on true', async () => {
827
853
  const ctrl0 = new OverlayController({
828
854
  ...withGlobalTestConfig(),
829
855
  trapsKeyboardFocus: true,
830
856
  });
831
-
832
857
  const ctrl1 = new OverlayController({
833
858
  ...withGlobalTestConfig(),
834
859
  trapsKeyboardFocus: true,
835
860
  });
836
-
837
861
  await ctrl0.show();
838
862
  await ctrl1.show();
839
863
  expect(isActiveElement(ctrl1.contentNode)).to.be.true;
840
-
841
864
  await ctrl1.hide();
842
865
  expect(isActiveElement(ctrl0.contentNode)).to.be.true;
843
866
  });
844
-
845
867
  it('warns when contentNode is a host for a shadowRoot', async () => {
846
868
  const warnSpy = sinon.spy(console, 'warn');
847
-
848
- const contentNode = /** @type {HTMLDivElement} */ (await fixture(html` <div></div> `));
849
- contentNode.attachShadow({ mode: 'open' });
850
- const shadowRootContentNode = /** @type {HTMLElement} */ (
851
- await fixture(html` <div><input id="input1" /><input id="input2" /></div> `)
852
- );
869
+ const contentNode = /** @type {HTMLDivElement} */ await fixture(html` <div></div> `);
870
+ contentNode.attachShadow({
871
+ mode: 'open',
872
+ });
873
+ const shadowRootContentNode =
874
+ /** @type {HTMLElement} */
875
+ await fixture(html` <div><input id="input1" /><input id="input2" /></div> `);
853
876
  contentNode.shadowRoot?.appendChild(shadowRootContentNode);
854
-
855
877
  const ctrl = new OverlayController({
856
878
  ...withGlobalTestConfig(),
857
879
  trapsKeyboardFocus: true,
@@ -866,7 +888,6 @@ describe('OverlayController', () => {
866
888
  warnSpy.restore();
867
889
  });
868
890
  });
869
-
870
891
  describe('hidesOnEsc', () => {
871
892
  it('hides on [Escape] press', async () => {
872
893
  const ctrl = new OverlayController({
@@ -877,7 +898,6 @@ describe('OverlayController', () => {
877
898
  await mimicEscapePress(ctrl.contentNode);
878
899
  expect(ctrl.isShown).to.be.false;
879
900
  });
880
-
881
901
  it('stays shown on [Escape] press with `.hidesOnEsc` set to false', async () => {
882
902
  const ctrl = new OverlayController({
883
903
  ...withGlobalTestConfig(),
@@ -887,7 +907,6 @@ describe('OverlayController', () => {
887
907
  await mimicEscapePress(ctrl.contentNode);
888
908
  expect(ctrl.isShown).to.be.true;
889
909
  });
890
-
891
910
  it('stays shown on [Escape] press on outside element', async () => {
892
911
  const ctrl = new OverlayController({
893
912
  ...withGlobalTestConfig(),
@@ -897,7 +916,6 @@ describe('OverlayController', () => {
897
916
  await mimicEscapePress(document);
898
917
  expect(ctrl.isShown).to.be.true;
899
918
  });
900
-
901
919
  it('stays shown on [Escape] press with modal <dialog> and `.hidesOnEsc` is false', async () => {
902
920
  const ctrl = new OverlayController({
903
921
  ...withGlobalTestConfig(),
@@ -908,25 +926,21 @@ describe('OverlayController', () => {
908
926
  await mimicEscapePress(ctrl.contentNode);
909
927
  expect(ctrl.isShown).to.be.true;
910
928
  });
911
-
912
929
  it('parent stays shown on [Escape] press in a nested overlay', async () => {
913
- const parentContent = /** @type {HTMLDivElement} */ (
930
+ const parentContent =
931
+ /** @type {HTMLDivElement} */
914
932
  await fixture(
915
933
  html` <!-- -->
916
934
  <div id="parent-overlay--hidesOnEsc">
917
935
  <div id="child-overlay--hidesOnEsc">we press [Escape] here</div>
918
936
  </div>`,
919
- )
920
- );
937
+ );
921
938
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
922
-
923
939
  await mimicEscapePress(childOverlay.contentNode);
924
-
925
940
  expect(parentOverlay.isShown).to.be.true;
926
941
  expect(childOverlay.isShown).to.be.false;
927
942
  });
928
943
  });
929
-
930
944
  describe('hidesOnOutsideEsc', () => {
931
945
  it('hides on [Escape] press on outside element', async () => {
932
946
  const ctrl = new OverlayController({
@@ -937,7 +951,6 @@ describe('OverlayController', () => {
937
951
  await mimicEscapePress(document);
938
952
  expect(ctrl.isShown).to.be.false;
939
953
  });
940
-
941
954
  it('stays shown on [Escape] press on inside element', async () => {
942
955
  const ctrl = new OverlayController({
943
956
  ...withGlobalTestConfig(),
@@ -947,35 +960,32 @@ describe('OverlayController', () => {
947
960
  await mimicEscapePress(ctrl.contentNode);
948
961
  expect(ctrl.isShown).to.be.true;
949
962
  });
950
-
951
963
  it('stays shown on [Escape] press in a nested overlay', async () => {
952
- const parentContent = /** @type {HTMLDivElement} */ (
964
+ const parentContent =
965
+ /** @type {HTMLDivElement} */
953
966
  await fixture(
954
967
  html` <!-- -->
955
968
  <div id="parent-overlay--hidesOnOutsideEsc">
956
969
  <div id="child-overlay--hidesOnOutsideEsc">we press [Escape] here</div>
957
970
  </div>`,
958
- )
959
- );
971
+ );
960
972
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
961
973
  await mimicEscapePress(childOverlay.contentNode);
962
-
963
974
  expect(parentOverlay.isShown).to.be.true;
964
975
  expect(childOverlay.isShown).to.be.true;
965
976
  });
966
977
  });
967
-
968
978
  describe('Nested hidesOnEsc / hidesOnOutsideEsc', () => {
969
979
  describe('Parent has hidesOnEsc and child has hidesOnOutsideEsc', () => {
970
980
  it('on [Escape] press in child overlay: parent hides, child stays shown', async () => {
971
- const parentContent = /** @type {HTMLDivElement} */ (
981
+ const parentContent =
982
+ /** @type {HTMLDivElement} */
972
983
  await fixture(
973
984
  html` <!-- -->
974
985
  <div id="parent-overlay--hidesOnEsc">
975
986
  <div id="child-overlay--hidesOnOutsideEsc">we press [Escape] here</div>
976
987
  </div>`,
977
- )
978
- );
988
+ );
979
989
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
980
990
  await mimicEscapePress(childOverlay.contentNode);
981
991
  await childOverlay._showComplete;
@@ -991,112 +1001,100 @@ describe('OverlayController', () => {
991
1001
  await childOverlay.teardown();
992
1002
  await parentOverlay.teardown();
993
1003
  });
994
-
995
1004
  it('on [Escape] press outside overlays: parent stays shown, child hides', async () => {
996
- const parentContent = /** @type {HTMLDivElement} */ (
1005
+ const parentContent =
1006
+ /** @type {HTMLDivElement} */
997
1007
  await fixture(
998
1008
  html` <!-- we press [Escape] here -->
999
1009
  <div id="parent-overlay--hidesOnEsc">
1000
1010
  <div id="child-overlay--hidesOnOutsideEsc"></div>
1001
1011
  </div>`,
1002
- )
1003
- );
1012
+ );
1004
1013
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
1005
1014
  await mimicEscapePress(document);
1006
-
1007
1015
  expect(parentOverlay.isShown).to.be.true;
1008
1016
  expect(childOverlay.isShown).to.be.false;
1009
1017
  });
1010
-
1011
1018
  it('on [Escape] press in parent overlay: parent is hidden, child is hidden', async () => {
1012
- const parentContent = /** @type {HTMLDivElement} */ (
1019
+ const parentContent =
1020
+ /** @type {HTMLDivElement} */
1013
1021
  await fixture(
1014
1022
  html` <!-- -->
1015
1023
  <div id="parent-overlay--hidesOnEsc">
1016
1024
  we press [Escape] here
1017
1025
  <div id="child-overlay--hidesOnOutsideEsc"></div>
1018
1026
  </div>`,
1019
- )
1020
- );
1027
+ );
1021
1028
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
1022
1029
  await mimicEscapePress(parentContent);
1023
-
1024
1030
  expect(parentOverlay.isShown).to.be.false;
1025
1031
  expect(childOverlay.isShown).to.be.false;
1026
1032
  });
1027
1033
  });
1028
1034
  describe('Parent has hidesOnOutsideEsc and child has hidesOnEsc', () => {
1029
1035
  it('on [Escape] press in child overlay: parent stays shown, child hides', async () => {
1030
- const parentContent = /** @type {HTMLDivElement} */ (
1036
+ const parentContent =
1037
+ /** @type {HTMLDivElement} */
1031
1038
  await fixture(
1032
1039
  html` <!-- -->
1033
1040
  <div id="parent-overlay--hidesOnOutsideEsc">
1034
1041
  <div id="child-overlay--hidesOnEsc">we press [Escape] here</div>
1035
1042
  </div>`,
1036
- )
1037
- );
1043
+ );
1038
1044
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
1039
1045
  await mimicEscapePress(childOverlay.contentNode);
1040
-
1041
1046
  expect(parentOverlay.isShown).to.be.true;
1042
1047
  expect(childOverlay.isShown).to.be.false;
1043
1048
  });
1044
-
1045
1049
  it('on [Escape] press outside overlays: parent hides, child stays shown', async () => {
1046
- const parentContent = /** @type {HTMLDivElement} */ (
1050
+ const parentContent =
1051
+ /** @type {HTMLDivElement} */
1047
1052
  await fixture(
1048
1053
  html` <!-- we press [Escape] here -->
1049
1054
  <div id="parent-overlay--hidesOnOutsideEsc">
1050
1055
  <div id="child-overlay--hidesOnEsc"></div>
1051
1056
  </div>`,
1052
- )
1053
- );
1057
+ );
1054
1058
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
1055
1059
  await mimicEscapePress(document);
1056
-
1057
1060
  expect(parentOverlay.isShown).to.be.false;
1058
1061
  expect(childOverlay.isShown).to.be.true;
1059
1062
  });
1060
-
1061
1063
  it('on [Escape] press in parent overlay: parent hides, child stays shown', async () => {
1062
- const parentContent = /** @type {HTMLDivElement} */ (
1064
+ const parentContent =
1065
+ /** @type {HTMLDivElement} */
1063
1066
  await fixture(
1064
1067
  html` <!-- we press [Escape] here -->
1065
1068
  <div id="parent-overlay--hidesOnOutsideEsc">
1066
1069
  <div id="child-overlay--hidesOnEsc"></div>
1067
1070
  </div>`,
1068
- )
1069
- );
1071
+ );
1070
1072
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
1071
1073
  await mimicEscapePress(document);
1072
-
1073
1074
  expect(parentOverlay.isShown).to.be.false;
1074
1075
  expect(childOverlay.isShown).to.be.true;
1075
1076
  });
1076
1077
  });
1077
-
1078
1078
  describe('With shadow dom', () => {
1079
1079
  it('on [Escape] press in child overlay in shadow root: parent hides, child stays shown', async () => {
1080
- const parentContent = /** @type {HTMLDivElement} */ (
1080
+ const parentContent =
1081
+ /** @type {HTMLDivElement} */
1081
1082
  await fixture(
1082
1083
  html` <!-- -->
1083
1084
  <div id="parent-overlay--hidesOnEsc" data-convert-to-shadow-root>
1084
1085
  <div id="child-overlay--hidesOnOutsideEsc">we press [Escape] here</div>
1085
1086
  </div>`,
1086
- )
1087
- );
1087
+ );
1088
1088
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
1089
1089
  await mimicEscapePress(childOverlay.contentNode);
1090
-
1091
1090
  expect(parentOverlay.isShown).to.be.false;
1092
1091
  expect(childOverlay.isShown).to.be.true;
1093
1092
  });
1094
1093
  });
1095
1094
  });
1096
-
1097
1095
  describe('hidesOnOutsideClick', () => {
1098
1096
  it('hides on outside click', async () => {
1099
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
1097
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
1100
1098
  const ctrl = new OverlayController({
1101
1099
  ...withGlobalTestConfig(),
1102
1100
  hidesOnOutsideClick: true,
@@ -1106,16 +1104,16 @@ describe('OverlayController', () => {
1106
1104
  mimicClick(document.body);
1107
1105
  await aTimeout(0);
1108
1106
  expect(ctrl.isShown).to.be.false;
1109
-
1110
1107
  await ctrl.show();
1111
- await mimicClick(document.body, { isAsync: true });
1108
+ await mimicClick(document.body, {
1109
+ isAsync: true,
1110
+ });
1112
1111
  await aTimeout(0);
1113
1112
  expect(ctrl.isShown).to.be.false;
1114
1113
  });
1115
-
1116
1114
  it('doesn\'t hide on "inside" click', async () => {
1117
- const invokerNode = /** @type {HTMLElement} */ (await fixture('<button>Invoker</button>'));
1118
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
1115
+ const invokerNode = /** @type {HTMLElement} */ await fixture('<button>Invoker</button>');
1116
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
1119
1117
  const ctrl = new OverlayController({
1120
1118
  ...withGlobalTestConfig(),
1121
1119
  hidesOnOutsideClick: true,
@@ -1132,12 +1130,13 @@ describe('OverlayController', () => {
1132
1130
  // Don't hide on inside (content) click
1133
1131
  ctrl.contentNode.click();
1134
1132
  await aTimeout(0);
1135
-
1136
1133
  expect(ctrl.isShown).to.be.true;
1137
1134
 
1138
1135
  // Don't hide on inside mousedown & outside mouseup
1139
- await mimicClick(ctrl.contentNode, { releaseElement: document.body, isAsync: true });
1140
-
1136
+ await mimicClick(ctrl.contentNode, {
1137
+ releaseElement: document.body,
1138
+ isAsync: true,
1139
+ });
1141
1140
  await aTimeout(0);
1142
1141
  expect(ctrl.isShown).to.be.true;
1143
1142
 
@@ -1147,48 +1146,46 @@ describe('OverlayController', () => {
1147
1146
  await ctrl.show();
1148
1147
  expect(ctrl.isShown).to.be.true;
1149
1148
  });
1150
-
1151
1149
  it('only hides when both mousedown and mouseup events are outside', async () => {
1152
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
1150
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
1153
1151
  const ctrl = new OverlayController({
1154
1152
  ...withGlobalTestConfig(),
1155
1153
  hidesOnOutsideClick: true,
1156
1154
  contentNode,
1157
- invokerNode: /** @type {HTMLElement} */ (
1155
+ invokerNode:
1156
+ /** @type {HTMLElement} */
1158
1157
  fixtureSync(html`
1159
1158
  <div role="button" style="width: 100px; height: 20px;">Invoker</div>
1160
- `)
1161
- ),
1159
+ `),
1162
1160
  });
1163
1161
  await ctrl.show();
1164
- mimicClick(document.body, { releaseElement: contentNode });
1162
+ mimicClick(document.body, {
1163
+ releaseElement: contentNode,
1164
+ });
1165
1165
  await aTimeout(0);
1166
1166
  expect(ctrl.isShown).to.be.true;
1167
-
1168
- mimicClick(contentNode, { releaseElement: document.body });
1167
+ mimicClick(contentNode, {
1168
+ releaseElement: document.body,
1169
+ });
1169
1170
  await aTimeout(0);
1170
1171
  expect(ctrl.isShown).to.be.true;
1171
-
1172
1172
  mimicClick(document.body, {
1173
- releaseElement: /** @type {HTMLElement} */ (ctrl.invokerNode),
1173
+ releaseElement: /** @type {HTMLElement} */ ctrl.invokerNode,
1174
1174
  });
1175
1175
  await aTimeout(0);
1176
1176
  expect(ctrl.isShown).to.be.true;
1177
-
1178
- mimicClick(/** @type {HTMLElement} */ (ctrl.invokerNode), {
1177
+ mimicClick(/** @type {HTMLElement} */ ctrl.invokerNode, {
1179
1178
  releaseElement: document.body,
1180
1179
  });
1181
1180
  await aTimeout(0);
1182
1181
  expect(ctrl.isShown).to.be.true;
1183
-
1184
1182
  mimicClick(document.body);
1185
1183
  await aTimeout(0);
1186
1184
  expect(ctrl.isShown).to.be.false;
1187
1185
  });
1188
-
1189
1186
  it('doesn\'t hide on "inside sub shadow dom" click', async () => {
1190
- const invokerNode = /** @type {HTMLElement} */ (await fixture('<button>Invoker</button>'));
1191
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
1187
+ const invokerNode = /** @type {HTMLElement} */ await fixture('<button>Invoker</button>');
1188
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
1192
1189
  const ctrl = new OverlayController({
1193
1190
  ...withGlobalTestConfig(),
1194
1191
  hidesOnOutsideClick: true,
@@ -1202,25 +1199,26 @@ describe('OverlayController', () => {
1202
1199
  class extends HTMLElement {
1203
1200
  constructor() {
1204
1201
  super();
1205
- this.attachShadow({ mode: 'open' });
1202
+ this.attachShadow({
1203
+ mode: 'open',
1204
+ });
1206
1205
  }
1207
-
1208
1206
  connectedCallback() {
1209
1207
  /** @type {ShadowRoot} */
1210
- (this.shadowRoot).innerHTML = '<div><button>click me</button></div>';
1208
+ this.shadowRoot.innerHTML = '<div><button>click me</button></div>';
1211
1209
  }
1212
1210
  },
1213
1211
  );
1214
1212
  const tag = unsafeStatic(tagString);
1215
1213
  ctrl.updateConfig({
1216
- contentNode: /** @type {HTMLElement} */ (
1214
+ contentNode:
1215
+ /** @type {HTMLElement} */
1217
1216
  await fixture(html`
1218
1217
  <div>
1219
1218
  <div>Content</div>
1220
1219
  <${tag}></${tag}>
1221
1220
  </div>
1222
- `)
1223
- ),
1221
+ `),
1224
1222
  });
1225
1223
  await ctrl.show();
1226
1224
 
@@ -1228,7 +1226,6 @@ describe('OverlayController', () => {
1228
1226
  /** @type {ShadowRoot} */
1229
1227
  // @ts-expect-error
1230
1228
  ctrl.contentNode.querySelector(tagString).shadowRoot.querySelector('button').click();
1231
-
1232
1229
  await aTimeout(0);
1233
1230
  expect(ctrl.isShown).to.be.true;
1234
1231
 
@@ -1238,12 +1235,11 @@ describe('OverlayController', () => {
1238
1235
  await ctrl.show();
1239
1236
  expect(ctrl.isShown).to.be.true;
1240
1237
  });
1241
-
1242
1238
  it('works with 3rd party code using "event.stopPropagation()" on bubble phase', async () => {
1243
- const invokerNode = /** @type {HTMLElement} */ (
1244
- await fixture('<div role="button">Invoker</div>')
1245
- );
1246
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
1239
+ const invokerNode =
1240
+ /** @type {HTMLElement} */
1241
+ await fixture('<div role="button">Invoker</div>');
1242
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
1247
1243
  const ctrl = new OverlayController({
1248
1244
  ...withLocalTestConfig(),
1249
1245
  hidesOnOutsideClick: true,
@@ -1251,22 +1247,17 @@ describe('OverlayController', () => {
1251
1247
  invokerNode,
1252
1248
  });
1253
1249
  const stopProp = (/** @type {Event} */ e) => e.stopPropagation();
1254
- const dom = await fixture(
1255
- `
1250
+ const dom = await fixture(`
1256
1251
  <div>
1257
1252
  <div id="popup">${invokerNode}${contentNode}</div>
1258
1253
  <div id="third-party-noise" @click="${stopProp}" @mousedown="${stopProp}" @mouseup="${stopProp}">
1259
1254
  This element prevents our handlers from reaching the document click handler.
1260
1255
  </div>
1261
1256
  </div>
1262
- `,
1263
- );
1264
-
1257
+ `);
1265
1258
  await ctrl.show();
1266
1259
  expect(ctrl.isShown).to.equal(true);
1267
-
1268
- const noiseEl = /** @type {HTMLElement} */ (dom.querySelector('#third-party-noise'));
1269
-
1260
+ const noiseEl = /** @type {HTMLElement} */ dom.querySelector('#third-party-noise');
1270
1261
  mimicClick(noiseEl);
1271
1262
  await aTimeout(0);
1272
1263
  expect(ctrl.isShown).to.equal(false);
@@ -1275,12 +1266,11 @@ describe('OverlayController', () => {
1275
1266
  await ctrl.show();
1276
1267
  expect(ctrl.isShown).to.equal(true);
1277
1268
  });
1278
-
1279
1269
  it('works with 3rd party code using "event.stopPropagation()" on capture phase', async () => {
1280
- const invokerNode = /** @type {HTMLElement} */ (
1281
- await fixture(html`<div role="button">Invoker</div>`)
1282
- );
1283
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
1270
+ const invokerNode =
1271
+ /** @type {HTMLElement} */
1272
+ await fixture(html`<div role="button">Invoker</div>`);
1273
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
1284
1274
  const ctrl = new OverlayController({
1285
1275
  ...withLocalTestConfig(),
1286
1276
  hidesOnOutsideClick: true,
@@ -1288,7 +1278,8 @@ describe('OverlayController', () => {
1288
1278
  invokerNode,
1289
1279
  });
1290
1280
  const stopProp = (/** @type {Event} */ e) => e.stopPropagation();
1291
- const dom = /** @type {HTMLElement} */ (
1281
+ const dom =
1282
+ /** @type {HTMLElement} */
1292
1283
  await fixture(`
1293
1284
  <div>
1294
1285
  <div id="popup">${invokerNode}${ctrl.content}</div>
@@ -1296,18 +1287,13 @@ describe('OverlayController', () => {
1296
1287
  This element prevents our handlers from reaching the document click handler.
1297
1288
  </div>
1298
1289
  </div>
1299
- `)
1300
- );
1301
-
1302
- const noiseEl = /** @type {HTMLElement} */ (dom.querySelector('#third-party-noise'));
1303
-
1290
+ `);
1291
+ const noiseEl = /** @type {HTMLElement} */ dom.querySelector('#third-party-noise');
1304
1292
  noiseEl.addEventListener('click', stopProp, true);
1305
1293
  noiseEl.addEventListener('mousedown', stopProp, true);
1306
1294
  noiseEl.addEventListener('mouseup', stopProp, true);
1307
-
1308
1295
  await ctrl.show();
1309
1296
  expect(ctrl.isShown).to.equal(true);
1310
-
1311
1297
  mimicClick(noiseEl);
1312
1298
  await aTimeout(0);
1313
1299
  expect(ctrl.isShown).to.equal(false);
@@ -1316,17 +1302,16 @@ describe('OverlayController', () => {
1316
1302
  await ctrl.show();
1317
1303
  expect(ctrl.isShown).to.equal(true);
1318
1304
  });
1319
-
1320
1305
  it('doesn\'t hide on "inside label" click', async () => {
1321
- const contentNode = /** @type {HTMLElement} */ (
1306
+ const contentNode =
1307
+ /** @type {HTMLElement} */
1322
1308
  await fixture(`
1323
1309
  <div>
1324
1310
  <label for="test">test</label>
1325
1311
  <input id="test">
1326
1312
  Content
1327
- </div>`)
1328
- );
1329
- const labelNode = /** @type {HTMLElement} */ (contentNode.querySelector('label[for=test]'));
1313
+ </div>`);
1314
+ const labelNode = /** @type {HTMLElement} */ contentNode.querySelector('label[for=test]');
1330
1315
  const ctrl = new OverlayController({
1331
1316
  ...withGlobalTestConfig(),
1332
1317
  hidesOnOutsideClick: true,
@@ -1337,27 +1322,22 @@ describe('OverlayController', () => {
1337
1322
  // Don't hide on label click
1338
1323
  labelNode.click();
1339
1324
  await aTimeout(0);
1340
-
1341
1325
  expect(ctrl.isShown).to.be.true;
1342
1326
  });
1343
-
1344
1327
  it('hides when window is blurred (useful for iframes)', async () => {
1345
1328
  const ctrl = new OverlayController({
1346
1329
  ...withGlobalTestConfig(),
1347
1330
  hidesOnOutsideClick: true,
1348
1331
  });
1349
1332
  await ctrl.show();
1350
-
1351
1333
  window.dispatchEvent(new Event('blur'));
1352
1334
  await aTimeout(0);
1353
-
1354
1335
  expect(ctrl.isShown).to.be.false;
1355
1336
  });
1356
1337
  });
1357
-
1358
1338
  describe('elementToFocusAfterHide', () => {
1359
1339
  it('focuses body when hiding by default', async () => {
1360
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div><input /></div>'));
1340
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div><input /></div>');
1361
1341
  const ctrl = new OverlayController({
1362
1342
  ...withGlobalTestConfig(),
1363
1343
  viewportConfig: {
@@ -1365,90 +1345,78 @@ describe('OverlayController', () => {
1365
1345
  },
1366
1346
  contentNode,
1367
1347
  });
1368
-
1369
1348
  await ctrl.show();
1370
- const input = /** @type {HTMLInputElement} */ (contentNode.querySelector('input'));
1349
+ const input = /** @type {HTMLInputElement} */ contentNode.querySelector('input');
1371
1350
  input.focus();
1372
1351
  expect(isActiveElement(input)).to.be.true;
1373
-
1374
1352
  await ctrl.hide();
1375
1353
  expect(isActiveElement(document.body)).to.be.true;
1376
1354
  });
1377
-
1378
1355
  it('supports elementToFocusAfterHide option to focus it when hiding', async () => {
1379
- const input = /** @type {HTMLElement} */ (await fixture('<input />'));
1380
- const contentNode = /** @type {HTMLElement} */ (
1381
- await fixture('<div><textarea></textarea></div>')
1382
- );
1356
+ const input = /** @type {HTMLElement} */ await fixture('<input />');
1357
+ const contentNode =
1358
+ /** @type {HTMLElement} */
1359
+ await fixture('<div><textarea></textarea></div>');
1383
1360
  const ctrl = new OverlayController({
1384
1361
  ...withGlobalTestConfig(),
1385
1362
  elementToFocusAfterHide: input,
1386
1363
  contentNode,
1387
1364
  });
1388
-
1389
1365
  await ctrl.show();
1390
- const textarea = /** @type {HTMLTextAreaElement} */ (contentNode.querySelector('textarea'));
1366
+ const textarea = /** @type {HTMLTextAreaElement} */ contentNode.querySelector('textarea');
1391
1367
  textarea.focus();
1392
1368
  expect(isActiveElement(textarea)).to.be.true;
1393
-
1394
1369
  await ctrl.hide();
1395
1370
  expect(isActiveElement(input)).to.be.true;
1396
1371
  expect(isInViewport(input)).to.be.true;
1397
1372
  });
1398
-
1399
1373
  it('supports elementToFocusAfterHide option when shadowRoot involved', async () => {
1400
- const input = /** @type {HTMLElement} */ (await fixture('<input />'));
1401
- const contentNode = /** @type {HTMLElement} */ (
1402
- await fixture('<div><textarea></textarea></div>')
1403
- );
1404
-
1374
+ const input = /** @type {HTMLElement} */ await fixture('<input />');
1375
+ const contentNode =
1376
+ /** @type {HTMLElement} */
1377
+ await fixture('<div><textarea></textarea></div>');
1405
1378
  const shadowHost = document.createElement('div');
1406
- shadowHost.attachShadow({ mode: 'open' });
1407
- /** @type {ShadowRoot} */ (shadowHost.shadowRoot).innerHTML = `<slot></slot>`;
1379
+ shadowHost.attachShadow({
1380
+ mode: 'open',
1381
+ });
1382
+ /** @type {ShadowRoot} */
1383
+ shadowHost.shadowRoot.innerHTML = `<slot></slot>`;
1408
1384
  shadowHost.appendChild(contentNode);
1409
1385
  document.body.appendChild(shadowHost);
1410
-
1411
1386
  const ctrl = new OverlayController({
1412
1387
  ...withGlobalTestConfig(),
1413
1388
  elementToFocusAfterHide: input,
1414
1389
  contentNode,
1415
1390
  });
1416
-
1417
1391
  await ctrl.show();
1418
- const textarea = /** @type {HTMLTextAreaElement} */ (contentNode.querySelector('textarea'));
1392
+ const textarea = /** @type {HTMLTextAreaElement} */ contentNode.querySelector('textarea');
1419
1393
  textarea.focus();
1420
1394
  expect(isActiveElement(textarea)).to.be.true;
1421
-
1422
1395
  await ctrl.hide();
1423
1396
  expect(isActiveElement(input)).to.be.true;
1424
-
1425
1397
  document.body.removeChild(shadowHost);
1426
1398
  });
1427
-
1428
1399
  it(`only sets focus when outside world didn't take over already`, async () => {
1429
- const input = /** @type {HTMLElement} */ (await fixture('<input />'));
1430
- const outsideButton = /** @type {HTMLButtonElement} */ (await fixture('<button></button>'));
1431
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>/div>'));
1400
+ const input = /** @type {HTMLElement} */ await fixture('<input />');
1401
+ const outsideButton = /** @type {HTMLButtonElement} */ await fixture('<button></button>');
1402
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>/div>');
1432
1403
  const ctrl = new OverlayController({
1433
1404
  ...withGlobalTestConfig(),
1434
1405
  elementToFocusAfterHide: input,
1435
1406
  contentNode,
1436
1407
  });
1437
-
1438
1408
  await ctrl.show();
1439
1409
  // an outside element has taken over focus
1440
1410
  outsideButton.focus();
1441
1411
  expect(isActiveElement(outsideButton)).to.be.true;
1442
-
1443
1412
  await ctrl.hide();
1444
1413
  expect(isActiveElement(outsideButton)).to.be.true;
1445
1414
  });
1446
-
1447
1415
  it('allows to set elementToFocusAfterHide on show', async () => {
1448
- const input = /** @type {HTMLElement} */ (await fixture('<input />'));
1449
- const contentNode = /** @type {HTMLElement} */ (
1450
- await fixture('<div><textarea></textarea></div>')
1451
- );
1416
+ const input = /** @type {HTMLElement} */ await fixture('<input />');
1417
+ const contentNode =
1418
+ /** @type {HTMLElement} */
1419
+ await fixture('<div><textarea></textarea></div>');
1452
1420
  const ctrl = new OverlayController({
1453
1421
  ...withGlobalTestConfig(),
1454
1422
  viewportConfig: {
@@ -1456,31 +1424,25 @@ describe('OverlayController', () => {
1456
1424
  },
1457
1425
  contentNode,
1458
1426
  });
1459
-
1460
1427
  await ctrl.show(input);
1461
- const textarea = /** @type {HTMLTextAreaElement} */ (contentNode.querySelector('textarea'));
1428
+ const textarea = /** @type {HTMLTextAreaElement} */ contentNode.querySelector('textarea');
1462
1429
  textarea.focus();
1463
1430
  expect(isActiveElement(textarea)).to.be.true;
1464
-
1465
1431
  await ctrl.hide();
1466
1432
  expect(isActiveElement(input)).to.be.true;
1467
1433
  });
1468
1434
  });
1469
-
1470
1435
  describe('preventsScroll', () => {
1471
1436
  it('prevent scrolling the background', async () => {
1472
1437
  const ctrl = new OverlayController({
1473
1438
  ...withGlobalTestConfig(),
1474
1439
  preventsScroll: true,
1475
1440
  });
1476
-
1477
1441
  await ctrl.show();
1478
1442
  expect(Array.from(document.body.classList)).to.contain('overlays-scroll-lock');
1479
-
1480
1443
  await ctrl.hide();
1481
1444
  expect(Array.from(document.body.classList)).to.not.contain('overlays-scroll-lock');
1482
1445
  });
1483
-
1484
1446
  it('keeps preventing of scrolling when multiple overlays are opened and closed', async () => {
1485
1447
  const ctrl0 = new OverlayController({
1486
1448
  ...withGlobalTestConfig(),
@@ -1490,13 +1452,11 @@ describe('OverlayController', () => {
1490
1452
  ...withGlobalTestConfig(),
1491
1453
  preventsScroll: true,
1492
1454
  });
1493
-
1494
1455
  await ctrl0.show();
1495
1456
  await ctrl1.show();
1496
1457
  await ctrl1.hide();
1497
1458
  expect(Array.from(document.body.classList)).to.contain('overlays-scroll-lock');
1498
1459
  });
1499
-
1500
1460
  it('does not accumulate body margins when nested overlays have preventsScroll', async () => {
1501
1461
  const ctrl0 = new OverlayController({
1502
1462
  ...withGlobalTestConfig(),
@@ -1506,45 +1466,35 @@ describe('OverlayController', () => {
1506
1466
  ...withGlobalTestConfig(),
1507
1467
  preventsScroll: true,
1508
1468
  });
1509
-
1510
1469
  const originalMarginRight = document.body.style.marginRight;
1511
-
1512
1470
  await ctrl0.show();
1513
1471
  const marginAfterFirst = document.body.style.marginRight;
1514
-
1515
1472
  await ctrl1.show();
1516
1473
  const marginAfterSecond = document.body.style.marginRight;
1517
1474
 
1518
1475
  // The margin should NOT increase further when second overlay opens
1519
1476
  expect(marginAfterSecond).to.equal(marginAfterFirst);
1520
-
1521
1477
  await ctrl1.hide();
1522
1478
  // After hiding second, first still prevents scroll — margin stays
1523
1479
  expect(document.body.style.marginRight).to.equal(marginAfterFirst);
1524
-
1525
1480
  await ctrl0.hide();
1526
1481
  // After hiding all, original margin is restored
1527
1482
  expect(document.body.style.marginRight).to.equal(originalMarginRight);
1528
1483
  });
1529
-
1530
1484
  it('restores body margin when overlay with preventsScroll is torn down while shown', async () => {
1531
1485
  const ctrl = new OverlayController({
1532
1486
  ...withGlobalTestConfig(),
1533
1487
  preventsScroll: true,
1534
1488
  });
1535
-
1536
1489
  const originalMarginRight = document.body.style.marginRight;
1537
-
1538
1490
  await ctrl.show();
1539
1491
  const marginAfterShow = document.body.style.marginRight;
1540
1492
  // Margin should be set after show
1541
1493
  expect(marginAfterShow).to.not.equal(originalMarginRight);
1542
-
1543
1494
  ctrl.teardown();
1544
1495
  // Margin should be restored after teardown
1545
1496
  expect(document.body.style.marginRight).to.equal(originalMarginRight);
1546
1497
  });
1547
-
1548
1498
  it('does not break body margin when teardown() is called on a hidden overlay', async () => {
1549
1499
  const ctrl0 = new OverlayController({
1550
1500
  ...withGlobalTestConfig(),
@@ -1554,7 +1504,6 @@ describe('OverlayController', () => {
1554
1504
  ...withGlobalTestConfig(),
1555
1505
  preventsScroll: true,
1556
1506
  });
1557
-
1558
1507
  const originalMarginRight = document.body.style.marginRight;
1559
1508
 
1560
1509
  // Show first overlay
@@ -1572,13 +1521,11 @@ describe('OverlayController', () => {
1572
1521
  // Now margin should be restored
1573
1522
  expect(document.body.style.marginRight).to.equal(originalMarginRight);
1574
1523
  });
1575
-
1576
1524
  it('does not break body margin when updateConfig() is called on a hidden overlay', async () => {
1577
1525
  const ctrl = new OverlayController({
1578
1526
  ...withGlobalTestConfig(),
1579
1527
  preventsScroll: true,
1580
1528
  });
1581
-
1582
1529
  const originalMarginRight = document.body.style.marginRight;
1583
1530
 
1584
1531
  // updateConfig calls teardown internally
@@ -1600,7 +1547,6 @@ describe('OverlayController', () => {
1600
1547
  expect(document.body.style.marginRight).to.equal(originalMarginRight);
1601
1548
  });
1602
1549
  });
1603
-
1604
1550
  describe('hasBackdrop', () => {
1605
1551
  it('has no backdrop by default', async () => {
1606
1552
  const ctrl = new OverlayController({
@@ -1609,7 +1555,6 @@ describe('OverlayController', () => {
1609
1555
  await ctrl.show();
1610
1556
  expect(ctrl.backdropNode).to.be.undefined;
1611
1557
  });
1612
-
1613
1558
  it('supports a backdrop option', async () => {
1614
1559
  const ctrl = new OverlayController({
1615
1560
  ...withGlobalTestConfig(),
@@ -1618,7 +1563,6 @@ describe('OverlayController', () => {
1618
1563
  await ctrl.show();
1619
1564
  expect(ctrl.backdropNode).to.be.undefined;
1620
1565
  await ctrl.hide();
1621
-
1622
1566
  const controllerWithBackdrop = new OverlayController({
1623
1567
  ...withGlobalTestConfig(),
1624
1568
  hasBackdrop: true,
@@ -1626,7 +1570,6 @@ describe('OverlayController', () => {
1626
1570
  await controllerWithBackdrop.show();
1627
1571
  expect(controllerWithBackdrop.backdropNode).to.have.class('overlays__backdrop');
1628
1572
  });
1629
-
1630
1573
  it('reenables the backdrop when shown/hidden/shown', async () => {
1631
1574
  const ctrl = new OverlayController({
1632
1575
  ...withGlobalTestConfig(),
@@ -1638,7 +1581,6 @@ describe('OverlayController', () => {
1638
1581
  await ctrl.show();
1639
1582
  expect(ctrl.backdropNode).to.have.class('overlays__backdrop');
1640
1583
  });
1641
-
1642
1584
  it('adds and stacks backdrops if .hasBackdrop is enabled', async () => {
1643
1585
  const ctrl0 = new OverlayController({
1644
1586
  ...withGlobalTestConfig(),
@@ -1646,7 +1588,6 @@ describe('OverlayController', () => {
1646
1588
  });
1647
1589
  await ctrl0.show();
1648
1590
  expect(ctrl0.backdropNode).to.have.class('overlays__backdrop');
1649
-
1650
1591
  const ctrl1 = new OverlayController({
1651
1592
  ...withGlobalTestConfig(),
1652
1593
  hasBackdrop: false,
@@ -1654,19 +1595,16 @@ describe('OverlayController', () => {
1654
1595
  await ctrl1.show();
1655
1596
  expect(ctrl0.backdropNode).to.have.class('overlays__backdrop');
1656
1597
  expect(ctrl1.backdropNode).to.be.undefined;
1657
-
1658
1598
  const ctrl2 = new OverlayController({
1659
1599
  ...withGlobalTestConfig(),
1660
1600
  hasBackdrop: true,
1661
1601
  });
1662
1602
  await ctrl2.show();
1663
-
1664
1603
  expect(ctrl0.backdropNode).to.have.class('overlays__backdrop');
1665
1604
  expect(ctrl1.backdropNode).to.be.undefined;
1666
1605
  expect(ctrl2.backdropNode).to.have.class('overlays__backdrop');
1667
1606
  });
1668
1607
  });
1669
-
1670
1608
  describe('locally placed overlay with hasBackdrop', () => {
1671
1609
  it('has no backdrop by default', async () => {
1672
1610
  const ctrl = new OverlayController({
@@ -1675,7 +1613,6 @@ describe('OverlayController', () => {
1675
1613
  await ctrl.show();
1676
1614
  expect(ctrl.backdropNode).to.be.undefined;
1677
1615
  });
1678
-
1679
1616
  it('supports a backdrop option', async () => {
1680
1617
  const ctrl = new OverlayController({
1681
1618
  ...withLocalTestConfig(),
@@ -1684,10 +1621,8 @@ describe('OverlayController', () => {
1684
1621
  await ctrl.show();
1685
1622
  expect(ctrl.backdropNode).to.be.undefined;
1686
1623
  await ctrl.hide();
1687
-
1688
1624
  const backdropNode = document.createElement('div');
1689
1625
  backdropNode.classList.add('custom-backdrop');
1690
-
1691
1626
  const controllerWithBackdrop = new OverlayController({
1692
1627
  ...withLocalTestConfig(),
1693
1628
  hasBackdrop: true,
@@ -1696,11 +1631,9 @@ describe('OverlayController', () => {
1696
1631
  await controllerWithBackdrop.show();
1697
1632
  expect(controllerWithBackdrop.backdropNode).to.have.class('custom-backdrop');
1698
1633
  });
1699
-
1700
1634
  it('reenables the backdrop when shown/hidden/shown', async () => {
1701
1635
  const backdropNode = document.createElement('div');
1702
1636
  backdropNode.classList.add('custom-backdrop');
1703
-
1704
1637
  const ctrl = new OverlayController({
1705
1638
  ...withLocalTestConfig(),
1706
1639
  hasBackdrop: true,
@@ -1712,11 +1645,9 @@ describe('OverlayController', () => {
1712
1645
  await ctrl.show();
1713
1646
  expect(ctrl.backdropNode).to.have.class('custom-backdrop');
1714
1647
  });
1715
-
1716
1648
  it('adds and stacks backdrops if .hasBackdrop is enabled', async () => {
1717
1649
  const backdropNode = document.createElement('div');
1718
1650
  backdropNode.classList.add('custom-backdrop-zero');
1719
-
1720
1651
  const ctrl0 = new OverlayController({
1721
1652
  ...withLocalTestConfig(),
1722
1653
  hasBackdrop: true,
@@ -1724,7 +1655,6 @@ describe('OverlayController', () => {
1724
1655
  });
1725
1656
  await ctrl0.show();
1726
1657
  expect(ctrl0.backdropNode).to.have.class('custom-backdrop-zero');
1727
-
1728
1658
  const ctrl1 = new OverlayController({
1729
1659
  ...withLocalTestConfig(),
1730
1660
  hasBackdrop: false,
@@ -1732,23 +1662,19 @@ describe('OverlayController', () => {
1732
1662
  await ctrl1.show();
1733
1663
  expect(ctrl0.backdropNode).to.have.class('custom-backdrop-zero');
1734
1664
  expect(ctrl1.backdropNode).to.be.undefined;
1735
-
1736
1665
  const anotherBackdropNode = document.createElement('div');
1737
1666
  anotherBackdropNode.classList.add('custom-backdrop-two');
1738
-
1739
1667
  const ctrl2 = new OverlayController({
1740
1668
  ...withLocalTestConfig(),
1741
1669
  hasBackdrop: true,
1742
1670
  backdropNode: anotherBackdropNode,
1743
1671
  });
1744
1672
  await ctrl2.show();
1745
-
1746
1673
  expect(ctrl0.backdropNode).to.have.class('custom-backdrop-zero');
1747
1674
  expect(ctrl1.backdropNode).to.be.undefined;
1748
1675
  expect(ctrl2.backdropNode).to.have.class('custom-backdrop-two');
1749
1676
  });
1750
1677
  });
1751
-
1752
1678
  describe('isBlocking', () => {
1753
1679
  it('prevents showing of other overlays', async () => {
1754
1680
  const ctrl0 = new OverlayController({
@@ -1767,30 +1693,25 @@ describe('OverlayController', () => {
1767
1693
  ...withGlobalTestConfig(),
1768
1694
  isBlocking: false,
1769
1695
  });
1770
-
1771
1696
  await ctrl0.show();
1772
1697
  await ctrl1.show();
1773
1698
  await ctrl2.show(); // blocking
1774
1699
  expect(ctrl0.__wrappingDialogNode).to.not.be.displayed;
1775
1700
  expect(ctrl1.__wrappingDialogNode).to.not.be.displayed;
1776
1701
  expect(ctrl2.__wrappingDialogNode).to.be.displayed;
1777
-
1778
1702
  await ctrl3.show();
1779
1703
  await ctrl3._showComplete;
1780
1704
  expect(ctrl3.__wrappingDialogNode).to.be.displayed;
1781
-
1782
1705
  await ctrl2.hide();
1783
1706
  await ctrl2._hideComplete;
1784
1707
  expect(ctrl0.__wrappingDialogNode).to.be.displayed;
1785
1708
  expect(ctrl1.__wrappingDialogNode).to.be.displayed;
1786
-
1787
1709
  await ctrl2.show(); // blocking
1788
1710
  expect(ctrl0.__wrappingDialogNode).to.not.be.displayed;
1789
1711
  expect(ctrl1.__wrappingDialogNode).to.not.be.displayed;
1790
1712
  expect(ctrl2.__wrappingDialogNode).to.be.displayed;
1791
1713
  expect(ctrl3.__wrappingDialogNode).to.not.be.displayed;
1792
1714
  });
1793
-
1794
1715
  it('keeps backdrop status when used in combination with blocking', async () => {
1795
1716
  const ctrl0 = new OverlayController({
1796
1717
  ...withGlobalTestConfig(),
@@ -1798,7 +1719,6 @@ describe('OverlayController', () => {
1798
1719
  hasBackdrop: true,
1799
1720
  });
1800
1721
  await ctrl0.show();
1801
-
1802
1722
  const ctrl1 = new OverlayController({
1803
1723
  ...withGlobalTestConfig(),
1804
1724
  isBlocking: false,
@@ -1808,13 +1728,11 @@ describe('OverlayController', () => {
1808
1728
  await ctrl1.hide();
1809
1729
  expect(ctrl0.hasActiveBackdrop).to.be.true;
1810
1730
  expect(ctrl1.hasActiveBackdrop).to.be.false;
1811
-
1812
1731
  await ctrl1.show();
1813
1732
  expect(ctrl0.hasActiveBackdrop).to.be.true;
1814
1733
  expect(ctrl1.hasActiveBackdrop).to.be.true;
1815
1734
  });
1816
1735
  });
1817
-
1818
1736
  describe('elementToFocusOnShow', () => {
1819
1737
  it('adds tabindex="-1" to the content node when elementToFocusOnShow is true', async () => {
1820
1738
  const ctrl = new OverlayController({
@@ -1822,51 +1740,52 @@ describe('OverlayController', () => {
1822
1740
  isBlocking: false,
1823
1741
  elementToFocusOnShow: true,
1824
1742
  });
1825
- const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
1826
- ctrl.updateConfig({ contentNode });
1743
+ const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
1744
+ ctrl.updateConfig({
1745
+ contentNode,
1746
+ });
1827
1747
  await ctrl.show();
1828
1748
  expect(contentNode.getAttribute('tabindex')).to.equal('-1');
1829
1749
  });
1830
-
1831
1750
  it('makes contentNode the root of "next tab flow"', async () => {
1832
1751
  const ctrl = new OverlayController({
1833
1752
  ...withGlobalTestConfig(),
1834
1753
  isBlocking: false,
1835
1754
  elementToFocusOnShow: true,
1836
1755
  });
1837
- const contentNode = /** @type {HTMLElement} */ (
1838
- await fixture('<div><button>Button</button></div>')
1839
- );
1840
- ctrl.updateConfig({ contentNode });
1756
+ const contentNode =
1757
+ /** @type {HTMLElement} */
1758
+ await fixture('<div><button>Button</button></div>');
1759
+ ctrl.updateConfig({
1760
+ contentNode,
1761
+ });
1841
1762
  await ctrl.show();
1842
- const button = /** @type {HTMLButtonElement} */ (contentNode.querySelector('button'));
1763
+ const button = /** @type {HTMLButtonElement} */ contentNode.querySelector('button');
1843
1764
  button.focus();
1844
1765
  expect(isActiveElement(button)).to.be.true;
1845
1766
  });
1846
1767
  });
1847
-
1848
1768
  describe('syncChildrenCloseState', () => {
1849
1769
  it('does not close all children of nested controllers when syncChildrenCloseState is false', async () => {
1850
- const parentContent = /** @type {HTMLDivElement} */ (
1770
+ const parentContent =
1771
+ /** @type {HTMLDivElement} */
1851
1772
  await fixture(
1852
1773
  html` <!-- -->
1853
1774
  <div data-sync-children-close-state id="parent-overlay">
1854
1775
  <div id="child-overlay">we open our child and it will close when parent does</div>
1855
1776
  </div>`,
1856
- )
1857
- );
1777
+ );
1858
1778
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
1859
1779
  expect(parentOverlay.isShown).to.be.true;
1860
1780
  expect(childOverlay.isShown).to.be.true;
1861
-
1862
1781
  await parentOverlay.hide();
1863
1782
  await childOverlay._hideComplete;
1864
1783
  expect(parentOverlay.isShown).to.be.false;
1865
1784
  expect(childOverlay.isShown).to.be.false;
1866
1785
  });
1867
-
1868
1786
  it('does not close all children of nested controllers when syncChildrenCloseState is false', async () => {
1869
- const parentContent = /** @type {HTMLDivElement} */ (
1787
+ const parentContent =
1788
+ /** @type {HTMLDivElement} */
1870
1789
  await fixture(
1871
1790
  html` <!-- -->
1872
1791
  <div id="parent-overlay">
@@ -1874,18 +1793,15 @@ describe('OverlayController', () => {
1874
1793
  we open our child and it will not close when parent does
1875
1794
  </div>
1876
1795
  </div>`,
1877
- )
1878
- );
1796
+ );
1879
1797
  const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
1880
1798
  expect(parentOverlay.isShown).to.be.true;
1881
1799
  expect(childOverlay.isShown).to.be.true;
1882
-
1883
1800
  await parentOverlay.hide();
1884
1801
  expect(parentOverlay.isShown).to.be.false;
1885
1802
  expect(childOverlay.isShown).to.be.true;
1886
1803
  });
1887
1804
  });
1888
-
1889
1805
  describe('isActivated', () => {
1890
1806
  it('allows to conditionally disable overlay/openable functionality (for responsive context like nav menus, accordions/collapsibles vs plain headings/content etc.)', async () => {
1891
1807
  const ctrl = new OverlayController({
@@ -1906,7 +1822,6 @@ describe('OverlayController', () => {
1906
1822
  // TODO
1907
1823
  describe('requireConnectedNodes', () => {});
1908
1824
  });
1909
-
1910
1825
  describe('Show / Hide / Toggle', () => {
1911
1826
  it('has .isShown which defaults to false', async () => {
1912
1827
  const ctrl = new OverlayController({
@@ -1914,7 +1829,6 @@ describe('OverlayController', () => {
1914
1829
  });
1915
1830
  expect(ctrl.isShown).to.be.false;
1916
1831
  });
1917
-
1918
1832
  it('has async show() which shows the overlay', async () => {
1919
1833
  const ctrl = new OverlayController({
1920
1834
  ...withGlobalTestConfig(),
@@ -1923,55 +1837,44 @@ describe('OverlayController', () => {
1923
1837
  expect(ctrl.isShown).to.be.true;
1924
1838
  expect(ctrl.show()).to.be.instanceOf(Promise);
1925
1839
  });
1926
-
1927
1840
  it('has async hide() which hides the overlay', async () => {
1928
1841
  const ctrl = new OverlayController({
1929
1842
  ...withGlobalTestConfig(),
1930
1843
  });
1931
-
1932
1844
  await ctrl.hide();
1933
1845
  expect(ctrl.isShown).to.be.false;
1934
1846
  expect(ctrl.hide()).to.be.instanceOf(Promise);
1935
1847
  });
1936
-
1937
1848
  it('fires "show" event once overlay becomes shown', async () => {
1938
1849
  const showSpy = sinon.spy();
1939
1850
  const ctrl = new OverlayController({
1940
1851
  ...withGlobalTestConfig(),
1941
1852
  });
1942
-
1943
1853
  ctrl.addEventListener('show', showSpy);
1944
1854
  await ctrl.show();
1945
1855
  expect(showSpy.callCount).to.equal(1);
1946
1856
  await ctrl.show();
1947
1857
  expect(showSpy.callCount).to.equal(1);
1948
1858
  });
1949
-
1950
1859
  it('fires "before-show" event right before overlay becomes shown', async () => {
1951
1860
  const ctrl = new OverlayController({
1952
1861
  ...withGlobalTestConfig(),
1953
1862
  });
1954
-
1955
1863
  const eventSpy = sinon.spy();
1956
-
1957
1864
  ctrl.addEventListener('before-show', eventSpy);
1958
1865
  ctrl.addEventListener('show', eventSpy);
1959
-
1960
1866
  await ctrl.show();
1961
1867
  expect(eventSpy.getCall(0).args[0].type).to.equal('before-show');
1962
1868
  expect(eventSpy.getCall(1).args[0].type).to.equal('show');
1963
-
1964
1869
  expect(eventSpy.callCount).to.equal(2);
1965
1870
  await ctrl.show();
1966
1871
  expect(eventSpy.callCount).to.equal(2);
1967
1872
  });
1968
-
1969
1873
  it('fires "hide" event once overlay becomes hidden', async () => {
1970
1874
  const hideSpy = sinon.spy();
1971
1875
  const ctrl = new OverlayController({
1972
1876
  ...withGlobalTestConfig(),
1973
1877
  });
1974
-
1975
1878
  ctrl.addEventListener('hide', hideSpy);
1976
1879
  await ctrl.show();
1977
1880
  await ctrl.hide();
@@ -1979,38 +1882,29 @@ describe('OverlayController', () => {
1979
1882
  await ctrl.hide();
1980
1883
  expect(hideSpy.callCount).to.equal(1);
1981
1884
  });
1982
-
1983
1885
  it('fires "before-hide" event right before overlay becomes hidden', async () => {
1984
1886
  const ctrl = new OverlayController({
1985
1887
  ...withGlobalTestConfig(),
1986
1888
  });
1987
-
1988
1889
  const eventSpy = sinon.spy();
1989
-
1990
1890
  ctrl.addEventListener('before-hide', eventSpy);
1991
1891
  ctrl.addEventListener('hide', eventSpy);
1992
-
1993
1892
  await ctrl.show();
1994
1893
  await ctrl.hide();
1995
1894
  expect(eventSpy.getCall(0).args[0].type).to.equal('before-hide');
1996
1895
  expect(eventSpy.getCall(1).args[0].type).to.equal('hide');
1997
-
1998
1896
  expect(eventSpy.callCount).to.equal(2);
1999
1897
  await ctrl.hide();
2000
1898
  expect(eventSpy.callCount).to.equal(2);
2001
1899
  });
2002
-
2003
1900
  it('can be toggled', async () => {
2004
1901
  const ctrl = new OverlayController({
2005
1902
  ...withGlobalTestConfig(),
2006
1903
  });
2007
-
2008
1904
  await ctrl.toggle();
2009
1905
  expect(ctrl.isShown).to.be.true;
2010
-
2011
1906
  await ctrl.toggle();
2012
1907
  expect(ctrl.isShown).to.be.false;
2013
-
2014
1908
  await ctrl.toggle();
2015
1909
  expect(ctrl.isShown).to.be.true;
2016
1910
 
@@ -2019,7 +1913,6 @@ describe('OverlayController', () => {
2019
1913
  // check for show
2020
1914
  expect(ctrl.toggle()).to.be.instanceOf(Promise);
2021
1915
  });
2022
-
2023
1916
  it('makes sure the latest shown overlay is visible', async () => {
2024
1917
  const ctrl0 = new OverlayController({
2025
1918
  ...withGlobalTestConfig(),
@@ -2030,18 +1923,14 @@ describe('OverlayController', () => {
2030
1923
  await ctrl0.show();
2031
1924
  const rect = ctrl0.contentNode.getBoundingClientRect();
2032
1925
  const getTopEl = () => document.elementFromPoint(Math.ceil(rect.left), Math.ceil(rect.top));
2033
-
2034
1926
  await ctrl0.show();
2035
1927
  expect(getTopEl()).to.equal(ctrl0.contentNode);
2036
-
2037
1928
  await ctrl1.show();
2038
1929
  expect(getTopEl()).to.equal(ctrl1.contentNode);
2039
-
2040
1930
  await ctrl0.show();
2041
1931
  expect(getTopEl()).to.equal(ctrl0.contentNode);
2042
1932
  });
2043
-
2044
- it('awaits a "transitionHide" hook before hiding for real', done => {
1933
+ it('awaits a "transitionHide" hook before hiding for real', (done) => {
2045
1934
  const ctrl = new OverlayController({
2046
1935
  ...withGlobalTestConfig(),
2047
1936
  });
@@ -2050,12 +1939,10 @@ describe('OverlayController', () => {
2050
1939
  /** @type {{ (): void; (value?: void | PromiseLike<void> | undefined): void; }} */
2051
1940
  let hideTransitionFinished;
2052
1941
  ctrl.transitionHide = () =>
2053
- new Promise(resolve => {
1942
+ new Promise((resolve) => {
2054
1943
  hideTransitionFinished = resolve;
2055
1944
  });
2056
-
2057
1945
  ctrl.hide();
2058
-
2059
1946
  expect(getComputedStyle(ctrl.content).display).to.equal('block');
2060
1947
  setTimeout(() => {
2061
1948
  hideTransitionFinished();
@@ -2065,8 +1952,7 @@ describe('OverlayController', () => {
2065
1952
  }, 0);
2066
1953
  }, 0);
2067
1954
  });
2068
-
2069
- it('awaits a "transitionShow" hook before finishing the show method', done => {
1955
+ it('awaits a "transitionShow" hook before finishing the show method', (done) => {
2070
1956
  const ctrl = new OverlayController({
2071
1957
  ...withGlobalTestConfig(),
2072
1958
  });
@@ -2074,17 +1960,16 @@ describe('OverlayController', () => {
2074
1960
  /** @type {{ (): void; (value?: void | PromiseLike<void> | undefined): void; }} */
2075
1961
  let showTransitionFinished;
2076
1962
  ctrl.transitionShow = () =>
2077
- new Promise(resolve => {
1963
+ new Promise((resolve) => {
2078
1964
  showTransitionFinished = resolve;
2079
1965
  });
2080
1966
  ctrl.show();
2081
-
2082
1967
  let showIsDone = false;
2083
1968
 
2084
- /** @type {Promise<void>} */ (ctrl._showComplete).then(() => {
1969
+ /** @type {Promise<void>} */
1970
+ ctrl._showComplete.then(() => {
2085
1971
  showIsDone = true;
2086
1972
  });
2087
-
2088
1973
  expect(showIsDone).to.be.false;
2089
1974
  setTimeout(() => {
2090
1975
  showTransitionFinished();
@@ -2095,27 +1980,23 @@ describe('OverlayController', () => {
2095
1980
  }, 0);
2096
1981
  });
2097
1982
  });
2098
-
2099
1983
  describe('Update Configuration', () => {
2100
1984
  it('reinitializes content', async () => {
2101
1985
  const ctrl = new OverlayController({
2102
1986
  ...withLocalTestConfig(),
2103
- contentNode: /** @type {HTMLElement} */ (await fixture(html`<div>content1</div>`)),
1987
+ contentNode: /** @type {HTMLElement} */ await fixture(html`<div>content1</div>`),
2104
1988
  });
2105
1989
  await ctrl.show(); // Popper adds inline styles
2106
1990
  expect(ctrl.content.style.transform).not.to.be.undefined;
2107
1991
  expect(ctrl.contentNode.textContent).to.include('content1');
2108
-
2109
1992
  ctrl.updateConfig({
2110
1993
  placementMode: 'local',
2111
- contentNode: /** @type {HTMLElement} */ (await fixture(html`<div>content2</div>`)),
1994
+ contentNode: /** @type {HTMLElement} */ await fixture(html`<div>content2</div>`),
2112
1995
  });
2113
1996
  expect(ctrl.contentNode.textContent).to.include('content2');
2114
1997
  });
2115
-
2116
1998
  it('respects the initial config provided to new OverlayController(initialConfig)', async () => {
2117
- const contentNode = /** @type {HTMLElement} */ (fixtureSync(html`<div>my content</div>`));
2118
-
1999
+ const contentNode = /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`);
2119
2000
  const ctrl = new OverlayController({
2120
2001
  // This is the shared config
2121
2002
  placementMode: 'global',
@@ -2134,46 +2015,44 @@ describe('OverlayController', () => {
2134
2015
 
2135
2016
  // Currently not working, enable again when we fix updateConfig
2136
2017
  it.skip('allows for updating viewport config placement only, while keeping the content shown', async () => {
2137
- const contentNode = /** @type {HTMLElement} */ (fixtureSync(html`<div>my content</div>`));
2138
-
2018
+ const contentNode = /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`);
2139
2019
  const ctrl = new OverlayController({
2140
2020
  // This is the shared config
2141
2021
  placementMode: 'global',
2142
2022
  handlesAccessibility: true,
2143
2023
  contentNode,
2144
2024
  });
2145
-
2146
2025
  ctrl.show();
2147
2026
  expect(ctrl.contentWrapperNode.classList.contains('overlays__overlay-container--center'));
2148
2027
  expect(ctrl.isShown).to.be.true;
2149
-
2150
- ctrl.updateConfig({ viewportConfig: { placement: 'top-right' } });
2028
+ ctrl.updateConfig({
2029
+ viewportConfig: {
2030
+ placement: 'top-right',
2031
+ },
2032
+ });
2151
2033
  expect(ctrl.contentWrapperNode.classList.contains('overlays__overlay-container--top-right'));
2152
2034
  expect(ctrl.isShown).to.be.true;
2153
2035
  });
2154
-
2155
2036
  it('disables backdrop when switching to hasBackrop "false"', async () => {
2156
2037
  const ctrl = new OverlayController({
2157
2038
  ...withLocalTestConfig(),
2158
- contentNode: /** @type {HTMLElement} */ (await fixture(html`<div>content1</div>`)),
2039
+ contentNode: /** @type {HTMLElement} */ await fixture(html`<div>content1</div>`),
2159
2040
  hasBackdrop: true,
2160
2041
  });
2161
2042
  await ctrl.show(); // Popper adds inline styles
2162
2043
  expect(ctrl.backdropNode).not.to.be.undefined;
2163
2044
  expect(Array.from(ctrl.backdropNode.classList)).to.include('overlays__backdrop--visible');
2164
-
2165
2045
  ctrl.updateConfig({
2166
2046
  hasBackdrop: false,
2167
2047
  });
2168
2048
  expect(Array.from(ctrl.backdropNode.classList)).to.not.include('overlays__backdrop--visible');
2169
2049
  });
2170
2050
  });
2171
-
2172
2051
  describe('Accessibility', () => {
2173
2052
  it('synchronizes [aria-expanded] on invoker', async () => {
2174
- const invokerNode = /** @type {HTMLElement} */ (
2175
- await fixture('<div role="button">invoker</div>')
2176
- );
2053
+ const invokerNode =
2054
+ /** @type {HTMLElement} */
2055
+ await fixture('<div role="button">invoker</div>');
2177
2056
  const ctrl = new OverlayController({
2178
2057
  ...withLocalTestConfig(),
2179
2058
  handlesAccessibility: true,
@@ -2185,11 +2064,10 @@ describe('OverlayController', () => {
2185
2064
  await ctrl.hide();
2186
2065
  expect(ctrl.invokerNode?.getAttribute('aria-expanded')).to.equal('false');
2187
2066
  });
2188
-
2189
2067
  it('does not synchronize [aria-expanded] on invoker when the overlay is modal', async () => {
2190
- const invokerNode = /** @type {HTMLElement} */ (
2191
- await fixture('<div role="button">invoker</div>')
2192
- );
2068
+ const invokerNode =
2069
+ /** @type {HTMLElement} */
2070
+ await fixture('<div role="button">invoker</div>');
2193
2071
  const ctrl = new OverlayController({
2194
2072
  ...withLocalTestConfig(),
2195
2073
  trapsKeyboardFocus: true,
@@ -2202,7 +2080,6 @@ describe('OverlayController', () => {
2202
2080
  await ctrl.hide();
2203
2081
  expect(ctrl.invokerNode?.getAttribute('aria-expanded')).to.equal(null);
2204
2082
  });
2205
-
2206
2083
  it('creates unique id for content', async () => {
2207
2084
  const ctrl = new OverlayController({
2208
2085
  ...withLocalTestConfig(),
@@ -2211,11 +2088,10 @@ describe('OverlayController', () => {
2211
2088
  const { contentId } = getProtectedMembers(ctrl);
2212
2089
  expect(ctrl.contentNode.id).to.contain(contentId);
2213
2090
  });
2214
-
2215
2091
  it('preserves content id when present', async () => {
2216
- const contentNode = /** @type {HTMLElement} */ (
2217
- await fixture('<div id="preserved">content</div>')
2218
- );
2092
+ const contentNode =
2093
+ /** @type {HTMLElement} */
2094
+ await fixture('<div id="preserved">content</div>');
2219
2095
  const ctrl = new OverlayController({
2220
2096
  ...withLocalTestConfig(),
2221
2097
  handlesAccessibility: true,
@@ -2223,11 +2099,10 @@ describe('OverlayController', () => {
2223
2099
  });
2224
2100
  expect(ctrl.contentNode.id).to.contain('preserved');
2225
2101
  });
2226
-
2227
2102
  it('adds [role=dialog] on content', async () => {
2228
- const invokerNode = /** @type {HTMLElement} */ (
2229
- await fixture('<div role="button">invoker</div>')
2230
- );
2103
+ const invokerNode =
2104
+ /** @type {HTMLElement} */
2105
+ await fixture('<div role="button">invoker</div>');
2231
2106
  const ctrl = new OverlayController({
2232
2107
  ...withLocalTestConfig(),
2233
2108
  handlesAccessibility: true,
@@ -2235,14 +2110,13 @@ describe('OverlayController', () => {
2235
2110
  });
2236
2111
  expect(ctrl.contentNode.getAttribute('role')).to.equal('dialog');
2237
2112
  });
2238
-
2239
2113
  it('preserves [role] on content when present', async () => {
2240
- const invokerNode = /** @type {HTMLElement} */ (
2241
- await fixture('<div role="button">invoker</div>')
2242
- );
2243
- const contentNode = /** @type {HTMLElement} */ (
2244
- await fixture('<div role="menu">invoker</div>')
2245
- );
2114
+ const invokerNode =
2115
+ /** @type {HTMLElement} */
2116
+ await fixture('<div role="button">invoker</div>');
2117
+ const contentNode =
2118
+ /** @type {HTMLElement} */
2119
+ await fixture('<div role="menu">invoker</div>');
2246
2120
  const ctrl = new OverlayController({
2247
2121
  ...withLocalTestConfig(),
2248
2122
  handlesAccessibility: true,
@@ -2251,7 +2125,6 @@ describe('OverlayController', () => {
2251
2125
  });
2252
2126
  expect(ctrl.contentNode.getAttribute('role')).to.equal('menu');
2253
2127
  });
2254
-
2255
2128
  it('allows to not provide an invokerNode', async () => {
2256
2129
  let properlyInstantiated = false;
2257
2130
  try {
@@ -2262,7 +2135,7 @@ describe('OverlayController', () => {
2262
2135
  });
2263
2136
  properlyInstantiated = true;
2264
2137
  } catch (e) {
2265
- throw new Error(/** @type {Error} */ (e).message);
2138
+ throw new Error(/** @type {Error} */ e.message);
2266
2139
  }
2267
2140
  expect(properlyInstantiated).to.be.true;
2268
2141
  });
@@ -2270,28 +2143,25 @@ describe('OverlayController', () => {
2270
2143
  // TODO: check if we covered all functionality. "Inertness" should be handled by the platform with a modal overlay...
2271
2144
  it.skip('adds attributes inert and aria-hidden="true" on all siblings of rootNode if an overlay is shown', async () => {});
2272
2145
  it.skip('disables pointer events and selection on inert elements', async () => {});
2273
-
2274
2146
  describe('Alert dialog', () => {
2275
2147
  it('sets role="alertdialog" when isAlertDialog is set', async () => {
2276
- const invokerNode = /** @type {HTMLElement} */ (
2277
- await fixture('<div role="button">invoker</div>')
2278
- );
2148
+ const invokerNode =
2149
+ /** @type {HTMLElement} */
2150
+ await fixture('<div role="button">invoker</div>');
2279
2151
  const ctrl = new OverlayController({
2280
2152
  ...withLocalTestConfig(),
2281
2153
  handlesAccessibility: true,
2282
2154
  isAlertDialog: true,
2283
2155
  invokerNode,
2284
2156
  });
2285
-
2286
2157
  expect(ctrl.contentNode?.getAttribute('role')).to.equal('alertdialog');
2287
2158
  });
2288
2159
  });
2289
-
2290
2160
  describe('Tooltip', () => {
2291
2161
  it('adds [aria-describedby] on invoker', async () => {
2292
- const invokerNode = /** @type {HTMLElement} */ (
2293
- await fixture('<div role="button">invoker</div>')
2294
- );
2162
+ const invokerNode =
2163
+ /** @type {HTMLElement} */
2164
+ await fixture('<div role="button">invoker</div>');
2295
2165
  const ctrl = new OverlayController({
2296
2166
  ...withLocalTestConfig(),
2297
2167
  handlesAccessibility: true,
@@ -2299,14 +2169,12 @@ describe('OverlayController', () => {
2299
2169
  invokerNode,
2300
2170
  });
2301
2171
  const { contentId } = getProtectedMembers(ctrl);
2302
-
2303
2172
  expect(ctrl.invokerNode?.getAttribute('aria-describedby')).to.equal(contentId);
2304
2173
  });
2305
-
2306
2174
  it('adds [aria-labelledby] on invoker when invokerRelation is label', async () => {
2307
- const invokerNode = /** @type {HTMLElement} */ (
2308
- await fixture('<div role="button">invoker</div>')
2309
- );
2175
+ const invokerNode =
2176
+ /** @type {HTMLElement} */
2177
+ await fixture('<div role="button">invoker</div>');
2310
2178
  const ctrl = new OverlayController({
2311
2179
  ...withLocalTestConfig(),
2312
2180
  handlesAccessibility: true,
@@ -2315,15 +2183,13 @@ describe('OverlayController', () => {
2315
2183
  invokerNode,
2316
2184
  });
2317
2185
  const { contentId } = getProtectedMembers(ctrl);
2318
-
2319
2186
  expect(ctrl.invokerNode?.getAttribute('aria-describedby')).to.equal(null);
2320
2187
  expect(ctrl.invokerNode?.getAttribute('aria-labelledby')).to.equal(contentId);
2321
2188
  });
2322
-
2323
2189
  it('adds [role=tooltip] on content', async () => {
2324
- const invokerNode = /** @type {HTMLElement} */ (
2325
- await fixture('<div role="button">invoker</div>')
2326
- );
2190
+ const invokerNode =
2191
+ /** @type {HTMLElement} */
2192
+ await fixture('<div role="button">invoker</div>');
2327
2193
  const ctrl = new OverlayController({
2328
2194
  ...withLocalTestConfig(),
2329
2195
  handlesAccessibility: true,
@@ -2332,11 +2198,10 @@ describe('OverlayController', () => {
2332
2198
  });
2333
2199
  expect(ctrl.contentNode.getAttribute('role')).to.equal('tooltip');
2334
2200
  });
2335
-
2336
2201
  it('adds tabindex="-1" to the wrappingDialog element', async () => {
2337
- const invokerNode = /** @type {HTMLElement} */ (
2338
- await fixture('<div role="button">invoker</div>')
2339
- );
2202
+ const invokerNode =
2203
+ /** @type {HTMLElement} */
2204
+ await fixture('<div role="button">invoker</div>');
2340
2205
  const ctrl = new OverlayController({
2341
2206
  ...withLocalTestConfig(),
2342
2207
  handlesAccessibility: true,
@@ -2345,12 +2210,11 @@ describe('OverlayController', () => {
2345
2210
  });
2346
2211
  expect(ctrl.__wrappingDialogNode?.getAttribute('tabindex')).to.equal('-1');
2347
2212
  });
2348
-
2349
2213
  describe('Teardown', () => {
2350
2214
  it('restores [role] on dialog content', async () => {
2351
- const invokerNode = /** @type {HTMLElement} */ (
2352
- await fixture('<div role="button">invoker</div>')
2353
- );
2215
+ const invokerNode =
2216
+ /** @type {HTMLElement} */
2217
+ await fixture('<div role="button">invoker</div>');
2354
2218
  const ctrl = new OverlayController({
2355
2219
  ...withLocalTestConfig(),
2356
2220
  handlesAccessibility: true,
@@ -2360,14 +2224,13 @@ describe('OverlayController', () => {
2360
2224
  ctrl.teardown();
2361
2225
  expect(ctrl.contentNode.getAttribute('role')).to.equal(null);
2362
2226
  });
2363
-
2364
2227
  it('restores [role] on tooltip content', async () => {
2365
- const invokerNode = /** @type {HTMLElement} */ (
2366
- await fixture('<div role="button">invoker</div>')
2367
- );
2368
- const contentNode = /** @type {HTMLElement} */ (
2369
- await fixture('<div role="presentation">content</div>')
2370
- );
2228
+ const invokerNode =
2229
+ /** @type {HTMLElement} */
2230
+ await fixture('<div role="button">invoker</div>');
2231
+ const contentNode =
2232
+ /** @type {HTMLElement} */
2233
+ await fixture('<div role="presentation">content</div>');
2371
2234
  const ctrl = new OverlayController({
2372
2235
  ...withLocalTestConfig(),
2373
2236
  handlesAccessibility: true,
@@ -2379,14 +2242,13 @@ describe('OverlayController', () => {
2379
2242
  ctrl.teardown();
2380
2243
  expect(contentNode.getAttribute('role')).to.equal('presentation');
2381
2244
  });
2382
-
2383
2245
  it('restores [aria-describedby] on content', async () => {
2384
- const invokerNode = /** @type {HTMLElement} */ (
2385
- await fixture('<div role="button">invoker</div>')
2386
- );
2387
- const contentNode = /** @type {HTMLElement} */ (
2388
- await fixture('<div role="presentation">content</div>')
2389
- );
2246
+ const invokerNode =
2247
+ /** @type {HTMLElement} */
2248
+ await fixture('<div role="button">invoker</div>');
2249
+ const contentNode =
2250
+ /** @type {HTMLElement} */
2251
+ await fixture('<div role="presentation">content</div>');
2390
2252
  const ctrl = new OverlayController({
2391
2253
  ...withLocalTestConfig(),
2392
2254
  handlesAccessibility: true,
@@ -2398,14 +2260,13 @@ describe('OverlayController', () => {
2398
2260
  ctrl.teardown();
2399
2261
  expect(invokerNode.getAttribute('aria-describedby')).to.equal(null);
2400
2262
  });
2401
-
2402
2263
  it('restores [aria-labelledby] on content', async () => {
2403
- const invokerNode = /** @type {HTMLElement} */ (
2404
- await fixture('<div role="button">invoker</div>')
2405
- );
2406
- const contentNode = /** @type {HTMLElement} */ (
2407
- await fixture('<div role="presentation">content</div>')
2408
- );
2264
+ const invokerNode =
2265
+ /** @type {HTMLElement} */
2266
+ await fixture('<div role="button">invoker</div>');
2267
+ const contentNode =
2268
+ /** @type {HTMLElement} */
2269
+ await fixture('<div role="presentation">content</div>');
2409
2270
  const ctrl = new OverlayController({
2410
2271
  ...withLocalTestConfig(),
2411
2272
  handlesAccessibility: true,
@@ -2421,7 +2282,6 @@ describe('OverlayController', () => {
2421
2282
  });
2422
2283
  });
2423
2284
  });
2424
-
2425
2285
  describe('Exception handling', () => {
2426
2286
  it('throws if no .placementMode gets passed on', async () => {
2427
2287
  const contentNode = document.createElement('div');
@@ -2433,7 +2293,6 @@ describe('OverlayController', () => {
2433
2293
  });
2434
2294
  }).to.throw('[OverlayController] You need to provide a .placementMode ("global"|"local")');
2435
2295
  });
2436
-
2437
2296
  it('throws if invalid .placementMode gets passed on', async () => {
2438
2297
  expect(() => {
2439
2298
  new OverlayController({
@@ -2444,7 +2303,6 @@ describe('OverlayController', () => {
2444
2303
  '[OverlayController] "invalid" is not a valid .placementMode, use ("global"|"local")',
2445
2304
  );
2446
2305
  });
2447
-
2448
2306
  it('throws if no .contentNode gets passed on', async () => {
2449
2307
  expect(() => {
2450
2308
  new OverlayController({
@@ -2452,7 +2310,6 @@ describe('OverlayController', () => {
2452
2310
  });
2453
2311
  }).to.throw('[OverlayController] You need to provide a .contentNode');
2454
2312
  });
2455
-
2456
2313
  it('throws if handlesAccessibility is false for a tooltip', async () => {
2457
2314
  const contentNode = document.createElement('div');
2458
2315
  document.body.appendChild(contentNode);
@@ -2468,7 +2325,6 @@ describe('OverlayController', () => {
2468
2325
  );
2469
2326
  });
2470
2327
  });
2471
-
2472
2328
  describe('run _keepBodySize only with scroll prevention', () => {
2473
2329
  /**
2474
2330
  * @type {OverlayController}
@@ -2477,15 +2333,12 @@ describe('OverlayController', () => {
2477
2333
  ...withLocalTestConfig(),
2478
2334
  preventsScroll: false,
2479
2335
  });
2480
-
2481
2336
  const overlayControllerPreventsScroll = new OverlayController({
2482
2337
  ...withLocalTestConfig(),
2483
2338
  preventsScroll: true,
2484
2339
  });
2485
-
2486
2340
  it('should not run with scroll prevention', async () => {
2487
2341
  await overlayControllerNoPrevent.show();
2488
-
2489
2342
  expect(
2490
2343
  overlayControllerNoPrevent.manager.__forTesting.bodySizeVars.marginRightInline,
2491
2344
  ).to.equal(undefined);
@@ -2493,11 +2346,9 @@ describe('OverlayController', () => {
2493
2346
  undefined,
2494
2347
  );
2495
2348
  });
2496
-
2497
2349
  it('should run with scroll prevention', async () => {
2498
2350
  await overlayControllerPreventsScroll.hide();
2499
2351
  await overlayControllerPreventsScroll.show();
2500
-
2501
2352
  expect(
2502
2353
  overlayControllerPreventsScroll.manager.__forTesting.bodySizeVars.marginRightInline,
2503
2354
  ).to.not.equal(undefined);