@lion/ui 0.22.0 → 0.24.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 (901) hide show
  1. package/README.md +65 -0
  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 +45 -55
  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 +598 -860
  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 -357
  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-core/types/choice-group/ChoiceGroupMixinTypes.ts +5 -0
  157. package/components/form-integrations/test/dialog-integrations.test.js +1 -4
  158. package/components/form-integrations/test/form-group-methods.test.js +28 -31
  159. package/components/form-integrations/test/form-integrations.test.js +27 -28
  160. package/components/form-integrations/test/form-validation-integrations.test.js +21 -29
  161. package/components/form-integrations/test/helpers/umbrella-form.js +3 -5
  162. package/components/form-integrations/test/model-value-consistency.test.js +75 -77
  163. package/components/form-integrations/test/model-value-event.test.js +10 -20
  164. package/components/helpers/src/SbActionLogger.js +13 -17
  165. package/components/helpers/src/SbLocaleSwitcher.js +5 -5
  166. package/components/helpers/src/sortEachDepth.js +0 -2
  167. package/components/helpers/test/renderLitAsNode.test.js +0 -4
  168. package/components/helpers/test/sb-action-logger.test.js +24 -55
  169. package/components/icon/src/IconManager.js +0 -2
  170. package/components/icon/src/LionIcon.js +2 -7
  171. package/components/icon/src/icons.js +0 -2
  172. package/components/icon/test/IconManager.test.js +0 -15
  173. package/components/icon/test/hammer.svg.js +3 -4
  174. package/components/icon/test/heart.svg.js +3 -4
  175. package/components/icon/test/lion-icon.test.js +14 -43
  176. package/components/input/src/LionInput.js +2 -8
  177. package/components/input/test/input-integrations.test.js +0 -5
  178. package/components/input/test/lion-input-integrations.test.js +0 -4
  179. package/components/input/test/lion-input.test.js +28 -58
  180. package/components/input/test-helpers/getInputMembers.js +2 -2
  181. package/components/input-amount/src/LionInputAmount.js +37 -26
  182. package/components/input-amount/src/formatters.js +4 -5
  183. package/components/input-amount/src/parsers.js +0 -3
  184. package/components/input-amount/test/formatters.test.js +102 -80
  185. package/components/input-amount/test/lion-input-amount-integrations.test.js +0 -4
  186. package/components/input-amount/test/lion-input-amount.test.js +155 -164
  187. package/components/input-amount/test/parsers.test.js +33 -17
  188. package/components/input-amount/test/preprocessors.test.js +0 -3
  189. package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +49 -59
  190. package/components/input-amount-dropdown/src/currencyUtil.js +8 -7
  191. package/components/input-amount-dropdown/src/parsers.js +0 -1
  192. package/components/input-amount-dropdown/src/validators.js +0 -1
  193. package/components/input-amount-dropdown/test/LionInputAmountDropdown.test.js +34 -36
  194. package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +18 -13
  195. package/components/input-amount-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
  196. package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +132 -107
  197. package/components/input-date/src/LionInputDate.js +4 -3
  198. package/components/input-date/test/lion-input-date-integrations.test.js +0 -3
  199. package/components/input-date/test/lion-input-date.test.js +19 -32
  200. package/components/input-datepicker/src/LionInputDatepicker.js +17 -29
  201. package/components/input-datepicker/src/localizeNamespaceLoader.js +1 -2
  202. package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +0 -3
  203. package/components/input-datepicker/test/lion-input-datepicker.test.js +88 -153
  204. package/components/input-datepicker/test-helpers/DatepickerInputObject.js +9 -12
  205. package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +6 -4
  206. package/components/input-datepicker/translations/bg-BG.js +0 -1
  207. package/components/input-datepicker/translations/cs-CZ.js +0 -1
  208. package/components/input-datepicker/translations/de-DE.js +0 -1
  209. package/components/input-datepicker/translations/en-AU.js +0 -1
  210. package/components/input-datepicker/translations/en-GB.js +0 -1
  211. package/components/input-datepicker/translations/en-US.js +0 -1
  212. package/components/input-datepicker/translations/es-ES.js +0 -1
  213. package/components/input-datepicker/translations/fr-BE.js +0 -1
  214. package/components/input-datepicker/translations/fr-FR.js +0 -1
  215. package/components/input-datepicker/translations/hu-HU.js +0 -1
  216. package/components/input-datepicker/translations/it-IT.js +0 -1
  217. package/components/input-datepicker/translations/nl-BE.js +0 -1
  218. package/components/input-datepicker/translations/nl-NL.js +0 -1
  219. package/components/input-datepicker/translations/pl-PL.js +0 -1
  220. package/components/input-datepicker/translations/ro-RO.js +0 -1
  221. package/components/input-datepicker/translations/ru-RU.js +0 -1
  222. package/components/input-datepicker/translations/sk-SK.js +0 -1
  223. package/components/input-datepicker/translations/tr-TR.js +0 -1
  224. package/components/input-datepicker/translations/uk-UA.js +0 -1
  225. package/components/input-email/test/lion-input-email-integrations.test.js +0 -2
  226. package/components/input-email/test/lion-input-email.test.js +1 -7
  227. package/components/input-file/src/FileHandle.js +0 -3
  228. package/components/input-file/src/LionInputFile.js +85 -83
  229. package/components/input-file/src/LionSelectedFileList.js +12 -12
  230. package/components/input-file/src/validators.js +10 -9
  231. package/components/input-file/test/FileValidators.test.js +170 -80
  232. package/components/input-file/test/lion-input-file.test.js +160 -244
  233. package/components/input-file/test/lion-selected-file-list.test.js +13 -22
  234. package/components/input-file/translations/bg-BG.js +0 -1
  235. package/components/input-file/translations/cs-CZ.js +0 -1
  236. package/components/input-file/translations/de-DE.js +0 -1
  237. package/components/input-file/translations/en-AU.js +0 -1
  238. package/components/input-file/translations/en-GB.js +0 -1
  239. package/components/input-file/translations/en-PH.js +0 -1
  240. package/components/input-file/translations/en-US.js +0 -1
  241. package/components/input-file/translations/en.js +2 -1
  242. package/components/input-file/translations/es-ES.js +0 -1
  243. package/components/input-file/translations/fr-BE.js +0 -1
  244. package/components/input-file/translations/fr-FR.js +0 -1
  245. package/components/input-file/translations/hu-HU.js +0 -1
  246. package/components/input-file/translations/id-ID.js +0 -1
  247. package/components/input-file/translations/id.js +2 -1
  248. package/components/input-file/translations/it-IT.js +0 -1
  249. package/components/input-file/translations/nl-BE.js +0 -1
  250. package/components/input-file/translations/nl-NL.js +0 -1
  251. package/components/input-file/translations/pl-PL.js +0 -1
  252. package/components/input-file/translations/ro-RO.js +0 -1
  253. package/components/input-file/translations/ru-RU.js +0 -1
  254. package/components/input-file/translations/sk-SK.js +0 -1
  255. package/components/input-file/translations/uk-UA.js +0 -1
  256. package/components/input-file/translations/zh-CN.js +0 -1
  257. package/components/input-iban/src/validators.js +6 -11
  258. package/components/input-iban/test/formatters.test.js +0 -3
  259. package/components/input-iban/test/lion-input-iban-integrations.test.js +0 -2
  260. package/components/input-iban/test/lion-input-iban.test.js +1 -9
  261. package/components/input-iban/test/parsers.test.js +0 -2
  262. package/components/input-iban/test/validators.test.js +0 -12
  263. package/components/input-iban/translations/bg-BG.js +0 -1
  264. package/components/input-iban/translations/cs-CZ.js +0 -1
  265. package/components/input-iban/translations/de-DE.js +0 -1
  266. package/components/input-iban/translations/en-AU.js +0 -1
  267. package/components/input-iban/translations/en-GB.js +0 -1
  268. package/components/input-iban/translations/en-US.js +0 -1
  269. package/components/input-iban/translations/es-ES.js +0 -1
  270. package/components/input-iban/translations/fr-BE.js +0 -1
  271. package/components/input-iban/translations/fr-FR.js +0 -1
  272. package/components/input-iban/translations/hu-HU.js +0 -1
  273. package/components/input-iban/translations/it-IT.js +0 -1
  274. package/components/input-iban/translations/nl-BE.js +0 -1
  275. package/components/input-iban/translations/nl-NL.js +0 -1
  276. package/components/input-iban/translations/pl-PL.js +0 -1
  277. package/components/input-iban/translations/ro-RO.js +0 -1
  278. package/components/input-iban/translations/ru-RU.js +0 -1
  279. package/components/input-iban/translations/sk-SK.js +0 -1
  280. package/components/input-iban/translations/uk-UA.js +0 -1
  281. package/components/input-range/src/LionInputRange.js +18 -19
  282. package/components/input-range/test/lion-input-range.test.js +23 -48
  283. package/components/input-range/translations/bg-BG.js +0 -1
  284. package/components/input-range/translations/cs-CZ.js +0 -1
  285. package/components/input-range/translations/de-DE.js +0 -1
  286. package/components/input-range/translations/en-AU.js +0 -1
  287. package/components/input-range/translations/en-GB.js +0 -1
  288. package/components/input-range/translations/en-PH.js +0 -1
  289. package/components/input-range/translations/en-US.js +0 -1
  290. package/components/input-range/translations/es-ES.js +0 -1
  291. package/components/input-range/translations/fr-BE.js +0 -1
  292. package/components/input-range/translations/fr-FR.js +0 -1
  293. package/components/input-range/translations/hu-HU.js +0 -1
  294. package/components/input-range/translations/it-IT.js +0 -1
  295. package/components/input-range/translations/nl-BE.js +0 -1
  296. package/components/input-range/translations/nl-NL.js +0 -1
  297. package/components/input-range/translations/pl-PL.js +0 -1
  298. package/components/input-range/translations/ro-RO.js +0 -1
  299. package/components/input-range/translations/ru-RU.js +0 -1
  300. package/components/input-range/translations/sk-SK.js +0 -1
  301. package/components/input-range/translations/uk-UA.js +0 -1
  302. package/components/input-range/translations/zh-CN.js +0 -1
  303. package/components/input-stepper/src/LionInputStepper.js +19 -38
  304. package/components/input-stepper/test/lion-input-stepper-integrations.test.js +0 -1
  305. package/components/input-stepper/test/lion-input-stepper.test.js +0 -1
  306. package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +0 -2
  307. package/components/input-stepper/test-suites/lion-input-stepper.suite.js +56 -105
  308. package/components/input-stepper/translations/bg-BG.js +0 -1
  309. package/components/input-stepper/translations/cs-CZ.js +0 -1
  310. package/components/input-stepper/translations/de-DE.js +0 -1
  311. package/components/input-stepper/translations/en-AU.js +0 -1
  312. package/components/input-stepper/translations/en-GB.js +0 -1
  313. package/components/input-stepper/translations/en-US.js +0 -1
  314. package/components/input-stepper/translations/es-ES.js +0 -1
  315. package/components/input-stepper/translations/fr-BE.js +0 -1
  316. package/components/input-stepper/translations/fr-FR.js +0 -1
  317. package/components/input-stepper/translations/hu-HU.js +0 -1
  318. package/components/input-stepper/translations/it-IT.js +0 -1
  319. package/components/input-stepper/translations/nl-BE.js +0 -1
  320. package/components/input-stepper/translations/nl-NL.js +0 -1
  321. package/components/input-stepper/translations/pl-PL.js +0 -1
  322. package/components/input-stepper/translations/ro-RO.js +0 -1
  323. package/components/input-stepper/translations/ru-RU.js +0 -1
  324. package/components/input-stepper/translations/sk-SK.js +0 -1
  325. package/components/input-stepper/translations/uk-UA.js +0 -1
  326. package/components/input-tel/src/LionInputTel.js +53 -37
  327. package/components/input-tel/src/PhoneUtilManager.js +6 -4
  328. package/components/input-tel/src/formatters.js +12 -10
  329. package/components/input-tel/src/parsers.js +3 -3
  330. package/components/input-tel/src/preprocessors.js +15 -7
  331. package/components/input-tel/src/validators.js +4 -6
  332. package/components/input-tel/test/LionInputTel.test.js +4 -2
  333. package/components/input-tel/test/formatters.test.js +22 -10
  334. package/components/input-tel/test/parsers.test.js +40 -11
  335. package/components/input-tel/test/preprocessors.test.js +24 -13
  336. package/components/input-tel/test/validators.test.js +15 -13
  337. package/components/input-tel/test-helpers/mockPhoneUtilManager.js +7 -6
  338. package/components/input-tel/test-suites/LionInputTel.suite.js +33 -73
  339. package/components/input-tel/translations/bg-BG.js +0 -1
  340. package/components/input-tel/translations/cs-CZ.js +0 -1
  341. package/components/input-tel/translations/de-DE.js +0 -1
  342. package/components/input-tel/translations/en-AU.js +0 -1
  343. package/components/input-tel/translations/en-GB.js +0 -1
  344. package/components/input-tel/translations/en-US.js +0 -1
  345. package/components/input-tel/translations/es-ES.js +0 -1
  346. package/components/input-tel/translations/fr-BE.js +0 -1
  347. package/components/input-tel/translations/fr-FR.js +0 -1
  348. package/components/input-tel/translations/hu-HU.js +0 -1
  349. package/components/input-tel/translations/it-IT.js +0 -1
  350. package/components/input-tel/translations/nl-BE.js +0 -1
  351. package/components/input-tel/translations/nl-NL.js +0 -1
  352. package/components/input-tel/translations/pl-PL.js +0 -1
  353. package/components/input-tel/translations/ro-RO.js +0 -1
  354. package/components/input-tel/translations/ru-RU.js +0 -1
  355. package/components/input-tel/translations/sk-SK.js +0 -1
  356. package/components/input-tel/translations/uk-UA.js +0 -1
  357. package/components/input-tel-dropdown/src/LionInputTelDropdown.js +10 -28
  358. package/components/input-tel-dropdown/src/regionCodeToLocale.js +3 -1
  359. package/components/input-tel-dropdown/test/LionInputTelDropdown.test.js +31 -38
  360. package/components/input-tel-dropdown/test/regionCodeToLocale.test.js +0 -1
  361. package/components/input-tel-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
  362. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.js +16 -11
  363. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +54 -79
  364. package/components/listbox/src/LionListbox.js +4 -1
  365. package/components/listbox/src/LionOption.js +8 -7
  366. package/components/listbox/src/LionOptions.js +0 -3
  367. package/components/listbox/src/ListboxMixin.js +801 -819
  368. package/components/listbox/test/lion-listbox.test.js +0 -1
  369. package/components/listbox/test/lion-option.test.js +53 -64
  370. package/components/listbox/test/lion-options.test.js +3 -4
  371. package/components/listbox/test-helpers/getListboxMembers.js +6 -3
  372. package/components/listbox/test-suites/ListboxMixin.suite.js +101 -261
  373. package/components/listbox/types/ListboxMixinTypes.ts +7 -1
  374. package/components/localize/src/LocalizeManager.js +40 -40
  375. package/components/localize/src/LocalizeMixin.js +130 -157
  376. package/components/localize/src/date/formatDate.js +1 -5
  377. package/components/localize/src/date/getDateFormatBasedOnLocale.js +5 -3
  378. package/components/localize/src/date/getMonthNames.js +3 -5
  379. package/components/localize/src/date/getWeekdayNames.js +1 -5
  380. package/components/localize/src/date/parseDate.js +5 -20
  381. package/components/localize/src/date/utils/normalizeIntlDate.js +0 -7
  382. package/components/localize/src/getLocalizeManager.js +0 -3
  383. package/components/localize/src/number/formatNumber.js +3 -7
  384. package/components/localize/src/number/formatNumberToParts.js +52 -18
  385. package/components/localize/src/number/getCurrencyName.js +5 -5
  386. package/components/localize/src/number/getFractionDigits.js +4 -4
  387. package/components/localize/src/number/getSeparatorsFromNumber.js +1 -3
  388. package/components/localize/src/number/parseNumber.js +0 -3
  389. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceAddGroupSeparators.js +0 -1
  390. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceSpaceBetweenCurrencyCodeAndNumber.js +4 -1
  391. package/components/localize/test/LocalizeManager.test.js +385 -278
  392. package/components/localize/test/LocalizeMixin.test.js +28 -112
  393. package/components/localize/test/date/formatDate.test.js +18 -48
  394. package/components/localize/test/date/getDateFormatBasedOnLocale.test.js +0 -3
  395. package/components/localize/test/date/getMonthNames.test.js +27 -12
  396. package/components/localize/test/date/getWeekdayNames.test.js +93 -49
  397. package/components/localize/test/date/normalizeDateTime.test.js +0 -2
  398. package/components/localize/test/date/parseDate.test.js +12 -16
  399. package/components/localize/test/getLocalizeManager.test.js +0 -3
  400. package/components/localize/test/isLocalizeESModule.test.js +32 -13
  401. package/components/localize/test/localize.test.js +0 -4
  402. package/components/localize/test/number/formatNumber.test.js +215 -106
  403. package/components/localize/test/number/formatNumberToParts.test.js +31 -38
  404. package/components/localize/test/number/getCurrencyName.test.js +20 -6
  405. package/components/localize/test/number/getDecimalSeparator.test.js +5 -4
  406. package/components/localize/test/number/getFractionDigits.test.js +0 -2
  407. package/components/localize/test/number/getGroupSeparator.test.js +0 -2
  408. package/components/localize/test/number/getSeparatorsFromNumber.test.js +5 -3
  409. package/components/localize/test/number/parseNumber.test.js +123 -56
  410. package/components/localize/test/side-effect-free-entrypoint.test.js +0 -6
  411. package/components/localize/test-helpers/fake-imports.js +11 -6
  412. package/components/localize/test-helpers/localizeTearDown.js +0 -1
  413. package/components/menu/README.md +360 -0
  414. package/components/menu/src/InteractiveListMixin.js +866 -0
  415. package/components/menu/src/LionMenu.js +423 -0
  416. package/components/menu/src/MoreButtonMenuMixin.js +272 -0
  417. package/components/menu/src/MultiLevelListMixin.js +306 -0
  418. package/components/menu/src/utils/isInView.js +25 -0
  419. package/components/menu/src/utils/listItemInteractions.js +124 -0
  420. package/components/menu/test/InteractiveListMixin.test.js +2 -0
  421. package/components/menu/test/MoreButtonMenuMixin.test.js +5 -0
  422. package/components/menu/test/MultiLevelListMixin.test.js +2 -0
  423. package/components/menu/test/lion-menu-interactions.test.js +2 -0
  424. package/components/menu/test/lion-menu.test.js +18 -0
  425. package/components/menu/test-helpers/mimicKeyPress.js +19 -0
  426. package/components/menu/test-suites/InteractiveListMixin.suite.js +498 -0
  427. package/components/menu/test-suites/LionMenu.suite.js +107 -0
  428. package/components/menu/test-suites/LionMenuInteractions.suite.js +561 -0
  429. package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +365 -0
  430. package/components/menu/test-suites/MultiLevelListMixin.suite.js +291 -0
  431. package/components/menu/types/InteractiveListMixinTypes.ts +126 -0
  432. package/components/menu/types/MoreButtonMenuMixinTypes.ts +51 -0
  433. package/components/menu/types/MultiLevelListMixinTypes.ts +28 -0
  434. package/components/menu/types/OverlayWithListInvokerMixinTypes.ts +61 -0
  435. package/components/overlays/NEXT.md +49 -0
  436. package/components/overlays/src/ArrowMixin.js +111 -127
  437. package/components/overlays/src/OverlayController.js +440 -246
  438. package/components/overlays/src/OverlayMixin.js +130 -68
  439. package/components/overlays/src/OverlaysManager.js +30 -32
  440. package/components/overlays/src/configurations/visibility-trigger-partials/withClickInteraction.js +0 -1
  441. package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +11 -11
  442. package/components/overlays/src/configurations/withBottomSheetConfig.js +12 -13
  443. package/components/overlays/src/configurations/withDropdownConfig.js +4 -2
  444. package/components/overlays/src/configurations/withModalDialogConfig.js +12 -13
  445. package/components/overlays/src/configurations/withPopoverConfig.js +27 -25
  446. package/components/overlays/src/configurations/withTooltipConfig.js +15 -13
  447. package/components/overlays/src/overlayDocumentStyle.js +1 -1
  448. package/components/overlays/src/overlayShadowDomStyle.js +0 -1
  449. package/components/overlays/src/singleton.js +0 -2
  450. package/components/overlays/src/utils/adopt-styles.js +19 -19
  451. package/components/overlays/src/utils/deep-contains.js +7 -6
  452. package/components/overlays/src/utils/get-focusable-elements.js +7 -10
  453. package/components/overlays/src/utils/inert-siblings.js +2 -4
  454. package/components/overlays/src/utils/is-equal-config.js +14 -6
  455. package/components/overlays/src/utils/is-visible.js +0 -1
  456. package/components/overlays/src/utils/simulate-tab.js +1 -4
  457. package/components/overlays/src/utils/sort-by-tabindex.js +2 -4
  458. package/components/overlays/test/ArrowMixin.test.js +18 -30
  459. package/components/overlays/test/OverlayController.test.js +551 -533
  460. package/components/overlays/test/OverlayMixin.test.js +0 -2
  461. package/components/overlays/test/OverlaysManager.test.js +30 -35
  462. package/components/overlays/test/global-positioning.test.js +6 -10
  463. package/components/overlays/test/local-positioning.test.js +101 -103
  464. package/components/overlays/test/utils-tests/active-element.test.js +12 -27
  465. package/components/overlays/test/utils-tests/adopt-styles.test.js +25 -56
  466. package/components/overlays/test/utils-tests/deep-contains.test.js +73 -74
  467. package/components/overlays/test/utils-tests/get-focusable-elements.test.js +6 -23
  468. package/components/overlays/test/utils-tests/is-equal-config.test.js +32 -13
  469. package/components/overlays/test/utils-tests/visibility.test.js +44 -79
  470. package/components/overlays/test-helpers/createShadowHost.js +5 -3
  471. package/components/overlays/test-helpers/normalizeTransformStyle.js +2 -4
  472. package/components/overlays/test-suites/OverlayMixin.suite.js +159 -188
  473. package/components/overlays/test-suites/WithHoverInteraction.suite.js +96 -79
  474. package/components/overlays/translations/bg-BG.js +0 -1
  475. package/components/overlays/translations/cs-CZ.js +0 -1
  476. package/components/overlays/translations/de-DE.js +0 -1
  477. package/components/overlays/translations/en-AU.js +0 -1
  478. package/components/overlays/translations/en-GB.js +0 -1
  479. package/components/overlays/translations/en-US.js +0 -1
  480. package/components/overlays/translations/es-ES.js +0 -1
  481. package/components/overlays/translations/fr-BE.js +0 -1
  482. package/components/overlays/translations/fr-FR.js +0 -1
  483. package/components/overlays/translations/hu-HU.js +0 -1
  484. package/components/overlays/translations/it-IT.js +0 -1
  485. package/components/overlays/translations/nl-BE.js +0 -1
  486. package/components/overlays/translations/nl-NL.js +0 -1
  487. package/components/overlays/translations/pl-PL.js +0 -1
  488. package/components/overlays/translations/ro-RO.js +0 -1
  489. package/components/overlays/translations/ru-RU.js +0 -1
  490. package/components/overlays/translations/sk-SK.js +0 -1
  491. package/components/overlays/translations/tr-TR.js +0 -1
  492. package/components/overlays/translations/uk-UA.js +0 -1
  493. package/components/overlays/types/ArrowMixinTypes.ts +1 -3
  494. package/components/overlays/types/OverlayConfig.ts +20 -5
  495. package/components/overlays/types/OverlayMixinTypes.ts +2 -0
  496. package/components/pagination/src/LionPagination.js +9 -12
  497. package/components/pagination/test/lion-pagination.test.js +18 -50
  498. package/components/progress-indicator/src/LionProgressIndicator.js +10 -12
  499. package/components/progress-indicator/test/lion-progress-indicator.test.js +1 -22
  500. package/components/radio-group/src/LionRadioGroup.js +1 -2
  501. package/components/radio-group/test/lion-radio-group-integrations.test.js +0 -1
  502. package/components/radio-group/test/lion-radio-group.test.js +27 -27
  503. package/components/radio-group/test/lion-radio-integrations.test.js +3 -2
  504. package/components/radio-group/test/lion-radio.test.js +30 -16
  505. package/components/select/src/LionSelect.js +12 -13
  506. package/components/select/test/lion-select.test.js +7 -12
  507. package/components/select-rich/src/LionSelectInvoker.js +18 -11
  508. package/components/select-rich/src/LionSelectRich.js +32 -43
  509. package/components/select-rich/test/demos.screenshots-test.js +40 -9
  510. package/components/select-rich/test/lion-select-invoker.test.js +26 -43
  511. package/components/select-rich/test/lion-select-listbox-suite-integration.test.js +3 -3
  512. package/components/select-rich/test/lion-select-rich-dialog-integration.test.js +4 -9
  513. package/components/select-rich/test/lion-select-rich-interaction.test.js +154 -101
  514. package/components/select-rich/test/lion-select-rich-upgrade.test.js +26 -0
  515. package/components/select-rich/test/lion-select-rich.test.js +153 -195
  516. package/components/select-rich/test-helpers/getSelectRichMembers.js +4 -1
  517. package/components/steps/src/LionStep.js +21 -12
  518. package/components/steps/src/LionSteps.js +25 -25
  519. package/components/steps/test/lion-step.test.js +18 -25
  520. package/components/steps/test/lion-steps.test.js +45 -78
  521. package/components/switch/src/LionSwitch.js +2 -7
  522. package/components/switch/src/LionSwitchButton.js +5 -6
  523. package/components/switch/test/lion-switch-button.test.js +16 -28
  524. package/components/switch/test/lion-switch.test.js +17 -31
  525. package/components/tabs/src/LionTabs.js +25 -28
  526. package/components/tabs/test/lion-tabs.test.js +156 -154
  527. package/components/textarea/src/LionTextarea.js +4 -23
  528. package/components/textarea/test/lion-textarea-integrations.test.js +0 -5
  529. package/components/textarea/test/lion-textarea.test.js +2 -28
  530. package/components/tooltip/src/LionTooltip.js +6 -6
  531. package/components/tooltip/test/lion-tooltip.test.js +75 -102
  532. package/components/validate-messages/src/getLocalizedMessage.js +8 -7
  533. package/components/validate-messages/src/loadDefaultFeedbackMessages.js +3 -1
  534. package/components/validate-messages/src/loadDefaultFeedbackMessagesNoSideEffects.js +9 -5
  535. package/components/validate-messages/src/per-entrypoint/loadComboboxMessagesNoSideEffects.js +5 -2
  536. package/components/validate-messages/src/per-entrypoint/loadFormCoreMessagesNoSideEffects.js +99 -35
  537. package/components/validate-messages/src/per-entrypoint/loadInputTelMessagesNoSideEffects.js +4 -3
  538. package/components/validate-messages/test/loadDefaultFeedbackMessages.test.js +5 -3
  539. package/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.test.js +80 -45
  540. package/components/validate-messages/translations/bg-BG.js +0 -1
  541. package/components/validate-messages/translations/cs-CZ.js +0 -1
  542. package/components/validate-messages/translations/de-DE.js +0 -1
  543. package/components/validate-messages/translations/en-AU.js +0 -1
  544. package/components/validate-messages/translations/en-GB.js +0 -1
  545. package/components/validate-messages/translations/en-PH.js +0 -1
  546. package/components/validate-messages/translations/en-US.js +0 -1
  547. package/components/validate-messages/translations/es-ES.js +0 -1
  548. package/components/validate-messages/translations/fr-BE.js +0 -1
  549. package/components/validate-messages/translations/fr-FR.js +0 -1
  550. package/components/validate-messages/translations/hu-HU.js +0 -1
  551. package/components/validate-messages/translations/it-IT.js +0 -1
  552. package/components/validate-messages/translations/nl-BE.js +0 -1
  553. package/components/validate-messages/translations/nl-NL.js +0 -1
  554. package/components/validate-messages/translations/pl-PL.js +0 -1
  555. package/components/validate-messages/translations/ro-RO.js +0 -1
  556. package/components/validate-messages/translations/ru-RU.js +0 -1
  557. package/components/validate-messages/translations/sk-SK.js +0 -1
  558. package/components/validate-messages/translations/tr-TR.js +0 -1
  559. package/components/validate-messages/translations/uk-UA.js +0 -1
  560. package/custom-elements.json +3312 -206
  561. package/dist-types/components/combobox/src/LionCombobox.d.ts +1 -1
  562. package/dist-types/components/combobox/src/LionCombobox.d.ts.map +1 -1
  563. package/dist-types/components/core/src/SlotMixin.d.ts +6 -1
  564. package/dist-types/components/core/src/SlotMixin.d.ts.map +1 -1
  565. package/dist-types/components/core/types/SlotMixinTypes.d.ts +5 -1
  566. package/dist-types/components/core/types/SlotMixinTypes.d.ts.map +1 -1
  567. package/dist-types/components/dialog/src/LionDialog.d.ts +6 -2
  568. package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
  569. package/dist-types/components/form-core/src/LionField.d.ts +3 -1
  570. package/dist-types/components/form-core/src/LionField.d.ts.map +1 -1
  571. package/dist-types/components/form-core/src/choice-group/ChoiceGroupMixin.d.ts.map +1 -1
  572. package/dist-types/components/form-core/types/choice-group/ChoiceGroupMixinTypes.d.ts +5 -0
  573. package/dist-types/components/form-core/types/choice-group/ChoiceGroupMixinTypes.d.ts.map +1 -1
  574. package/dist-types/components/input-amount/src/LionInputAmount.d.ts +3 -1
  575. package/dist-types/components/input-amount/src/LionInputAmount.d.ts.map +1 -1
  576. package/dist-types/components/input-amount/src/formatters.d.ts +6 -4
  577. package/dist-types/components/input-amount/src/formatters.d.ts.map +1 -1
  578. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +1 -1
  579. package/dist-types/components/input-tel/src/LionInputTel.d.ts +6 -6
  580. package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
  581. package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts +2 -2
  582. package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts.map +1 -1
  583. package/dist-types/components/input-tel/src/formatters.d.ts +2 -2
  584. package/dist-types/components/input-tel/src/formatters.d.ts.map +1 -1
  585. package/dist-types/components/input-tel/src/preprocessors.d.ts +2 -2
  586. package/dist-types/components/input-tel/src/preprocessors.d.ts.map +1 -1
  587. package/dist-types/components/input-tel/test/validators.test.d.ts +1 -1
  588. package/dist-types/components/input-tel/test/validators.test.d.ts.map +1 -1
  589. package/dist-types/components/listbox/src/LionOption.d.ts +5 -2
  590. package/dist-types/components/listbox/src/LionOption.d.ts.map +1 -1
  591. package/dist-types/components/listbox/src/ListboxMixin.d.ts.map +1 -1
  592. package/dist-types/components/listbox/types/ListboxMixinTypes.d.ts +7 -1
  593. package/dist-types/components/listbox/types/ListboxMixinTypes.d.ts.map +1 -1
  594. package/dist-types/components/menu/src/InteractiveListMixin.d.ts +35 -0
  595. package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +1 -0
  596. package/dist-types/components/menu/src/LionMenu.d.ts +129 -0
  597. package/dist-types/components/menu/src/LionMenu.d.ts.map +1 -0
  598. package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +8 -0
  599. package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +1 -0
  600. package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +7 -0
  601. package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +1 -0
  602. package/dist-types/components/menu/src/utils/isInView.d.ts +9 -0
  603. package/dist-types/components/menu/src/utils/isInView.d.ts.map +1 -0
  604. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +48 -0
  605. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +1 -0
  606. package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts +2 -0
  607. package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts.map +1 -0
  608. package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts +2 -0
  609. package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts.map +1 -0
  610. package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts +2 -0
  611. package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts.map +1 -0
  612. package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts +2 -0
  613. package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts.map +1 -0
  614. package/dist-types/components/menu/test/lion-menu.test.d.ts +2 -0
  615. package/dist-types/components/menu/test/lion-menu.test.d.ts.map +1 -0
  616. package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts +7 -0
  617. package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts.map +1 -0
  618. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +11 -0
  619. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +1 -0
  620. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +9 -0
  621. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +1 -0
  622. package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts +5 -0
  623. package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts.map +1 -0
  624. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +11 -0
  625. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +1 -0
  626. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +11 -0
  627. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +1 -0
  628. package/dist-types/components/menu/types/InteractiveListMixinTypes.d.ts +72 -0
  629. package/dist-types/components/menu/types/InteractiveListMixinTypes.d.ts.map +1 -0
  630. package/dist-types/components/menu/types/MoreButtonMenuMixinTypes.d.ts +30 -0
  631. package/dist-types/components/menu/types/MoreButtonMenuMixinTypes.d.ts.map +1 -0
  632. package/dist-types/components/menu/types/MultiLevelListMixinTypes.d.ts +16 -0
  633. package/dist-types/components/menu/types/MultiLevelListMixinTypes.d.ts.map +1 -0
  634. package/dist-types/components/menu/types/OverlayWithListInvokerMixinTypes.d.ts +35 -0
  635. package/dist-types/components/menu/types/OverlayWithListInvokerMixinTypes.d.ts.map +1 -0
  636. package/dist-types/components/overlays/src/OverlayController.d.ts +22 -5
  637. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  638. package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
  639. package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
  640. package/dist-types/components/overlays/src/overlayDocumentStyle.d.ts.map +1 -1
  641. package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
  642. package/dist-types/components/overlays/types/ArrowMixinTypes.d.ts.map +1 -1
  643. package/dist-types/components/overlays/types/OverlayConfig.d.ts +12 -2
  644. package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
  645. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +1 -0
  646. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
  647. package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts +3 -1
  648. package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts.map +1 -1
  649. package/dist-types/components/select-rich/src/LionSelectRich.d.ts +13 -2
  650. package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
  651. package/dist-types/components/select-rich/test/lion-select-rich-interaction.test.d.ts.map +1 -1
  652. package/dist-types/components/select-rich/test/lion-select-rich-upgrade.test.d.ts +2 -0
  653. package/dist-types/components/select-rich/test/lion-select-rich-upgrade.test.d.ts.map +1 -0
  654. package/dist-types/components/tooltip/src/LionTooltip.d.ts +1 -1
  655. package/dist-types/exports/define/lion-item.d.ts +2 -0
  656. package/dist-types/exports/define/lion-item.d.ts.map +1 -0
  657. package/dist-types/exports/define/lion-menu.d.ts +2 -0
  658. package/dist-types/exports/define/lion-menu.d.ts.map +1 -0
  659. package/dist-types/exports/define/lion-menuitem.d.ts +2 -0
  660. package/dist-types/exports/define/lion-menuitem.d.ts.map +1 -0
  661. package/dist-types/exports/menu-test-suites.d.ts +4 -0
  662. package/dist-types/exports/menu-test-suites.d.ts.map +1 -0
  663. package/dist-types/exports/menu.d.ts +3 -0
  664. package/dist-types/exports/menu.d.ts.map +1 -0
  665. package/dist-types/exports/overlays.d.ts +6 -0
  666. package/dist-types/exports/overlays.d.ts.map +1 -1
  667. package/dist-types/tsconfig.tsbuildinfo +1 -1
  668. package/docs/components/accordion/overview.md +2 -2
  669. package/docs/components/accordion/reference.md +2 -2
  670. package/docs/components/accordion/use-cases.md +2 -2
  671. package/docs/components/button/examples.md +2 -2
  672. package/docs/components/button/extensions.md +2 -2
  673. package/docs/components/button/overview.md +2 -2
  674. package/docs/components/button/use-cases.md +2 -2
  675. package/docs/components/calendar/overview.md +2 -2
  676. package/docs/components/calendar/use-cases.md +2 -2
  677. package/docs/components/checkbox-group/overview.md +4 -4
  678. package/docs/components/checkbox-group/use-cases.md +2 -2
  679. package/docs/components/collapsible/examples.md +2 -2
  680. package/docs/components/collapsible/overview.md +3 -3
  681. package/docs/components/collapsible/use-cases.md +2 -2
  682. package/docs/components/combobox/api-table.md +53 -39
  683. package/docs/components/combobox/extensions.md +2 -2
  684. package/docs/components/combobox/overview.md +3 -3
  685. package/docs/components/combobox/use-cases.md +3 -3
  686. package/docs/components/dialog/api-table.md +32 -6
  687. package/docs/components/dialog/overview.md +3 -3
  688. package/docs/components/dialog/use-cases.md +2 -2
  689. package/docs/components/drawer/overview.md +2 -2
  690. package/docs/components/drawer/use-cases.md +2 -2
  691. package/docs/components/fieldset/overview.md +7 -7
  692. package/docs/components/fieldset/use-cases.md +2 -2
  693. package/docs/components/form/overview.md +5 -5
  694. package/docs/components/form/use-cases.md +4 -4
  695. package/docs/components/icon/overview.md +2 -2
  696. package/docs/components/icon/use-cases.md +3 -3
  697. package/docs/components/input/overview.md +3 -3
  698. package/docs/components/input/use-cases.md +2 -2
  699. package/docs/components/input-amount/api-table.md +9 -7
  700. package/docs/components/input-amount/overview.md +5 -5
  701. package/docs/components/input-amount/use-cases.md +17 -6
  702. package/docs/components/input-amount-dropdown/api-table.md +2 -0
  703. package/docs/components/input-amount-dropdown/use-cases.md +2 -2
  704. package/docs/components/input-date/overview.md +5 -5
  705. package/docs/components/input-date/use-cases.md +2 -2
  706. package/docs/components/input-datepicker/api-table.md +63 -45
  707. package/docs/components/input-datepicker/overview.md +7 -7
  708. package/docs/components/input-datepicker/use-cases.md +2 -2
  709. package/docs/components/input-email/overview.md +4 -4
  710. package/docs/components/input-email/use-cases.md +2 -2
  711. package/docs/components/input-file/overview.md +3 -3
  712. package/docs/components/input-file/use-cases.md +2 -2
  713. package/docs/components/input-iban/overview.md +4 -4
  714. package/docs/components/input-iban/use-cases.md +2 -2
  715. package/docs/components/input-range/overview.md +4 -4
  716. package/docs/components/input-range/use-cases.md +2 -2
  717. package/docs/components/input-stepper/overview.md +3 -3
  718. package/docs/components/input-stepper/use-cases.md +2 -2
  719. package/docs/components/input-tel/overview.md +3 -3
  720. package/docs/components/input-tel/use-cases.md +8 -8
  721. package/docs/components/input-tel-dropdown/extensions.md +2 -2
  722. package/docs/components/input-tel-dropdown/overview.md +3 -3
  723. package/docs/components/input-tel-dropdown/use-cases.md +2 -2
  724. package/docs/components/listbox/overview.md +2 -2
  725. package/docs/components/listbox/use-cases.md +3 -3
  726. package/docs/components/menu/api-table.md +44 -0
  727. package/docs/components/menu/applyMenuDemoStyles.js +173 -0
  728. package/docs/components/menu/extensions.md +262 -0
  729. package/docs/components/menu/index.md +13 -0
  730. package/docs/components/menu/migration.md +129 -0
  731. package/docs/components/menu/overview.md +448 -0
  732. package/docs/components/menu/src/DemoNavigationBar.js +441 -0
  733. package/docs/components/menu/src/DemoSpinButton.js +215 -0
  734. package/docs/components/menu/src/DemoToolbar.js +101 -0
  735. package/docs/components/menu/src/DemoTree.js +55 -0
  736. package/docs/components/menu/src/navigation-bar-types.js +41 -0
  737. package/docs/components/menu/use-cases.md +74 -0
  738. package/docs/components/pagination/overview.md +2 -2
  739. package/docs/components/pagination/use-cases.md +2 -2
  740. package/docs/components/progress-indicator/examples.md +2 -2
  741. package/docs/components/progress-indicator/overview.md +2 -2
  742. package/docs/components/radio-group/overview.md +5 -5
  743. package/docs/components/radio-group/use-cases.md +2 -2
  744. package/docs/components/select/overview.md +2 -2
  745. package/docs/components/select/use-cases.md +3 -3
  746. package/docs/components/select-rich/api-table.md +51 -33
  747. package/docs/components/select-rich/examples.md +2 -2
  748. package/docs/components/select-rich/overview.md +2 -2
  749. package/docs/components/select-rich/use-cases.md +4 -4
  750. package/docs/components/steps/overview.md +2 -2
  751. package/docs/components/steps/use-cases.md +2 -2
  752. package/docs/components/switch/overview.md +2 -2
  753. package/docs/components/switch/reference.md +2 -2
  754. package/docs/components/switch/use-cases.md +2 -2
  755. package/docs/components/tabs/examples.md +3 -3
  756. package/docs/components/tabs/overview.md +2 -2
  757. package/docs/components/tabs/use-cases.md +2 -2
  758. package/docs/components/textarea/overview.md +2 -2
  759. package/docs/components/textarea/use-cases.md +2 -2
  760. package/docs/components/tooltip/api-table.md +33 -7
  761. package/docs/components/tooltip/examples.md +2 -2
  762. package/docs/components/tooltip/overview.md +2 -2
  763. package/docs/components/tooltip/use-cases.md +2 -2
  764. package/docs/fundamentals/index.md +4 -4
  765. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +2 -2
  766. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +2 -2
  767. package/docs/fundamentals/node-tools/providence-analytics/index.md +2 -2
  768. package/docs/fundamentals/node-tools/providence-analytics/overview.md +3 -3
  769. package/docs/fundamentals/node-tools/publish-docs/index.md +2 -2
  770. package/docs/fundamentals/node-tools/publish-docs/overview.md +5 -5
  771. package/docs/fundamentals/node-tools/remark-extend/index.md +2 -2
  772. package/docs/fundamentals/node-tools/remark-extend/overview.md +2 -2
  773. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +2 -2
  774. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +4 -4
  775. package/docs/fundamentals/rationales/TypeScript.md +62 -2
  776. package/docs/fundamentals/rationales/accessibility.md +5 -5
  777. package/docs/fundamentals/rationales/side-effects.md +2 -2
  778. package/docs/fundamentals/rationales/versioning.md +2 -2
  779. package/docs/fundamentals/systems/core/SlotMixin.md +3 -3
  780. package/docs/fundamentals/systems/core/index.md +2 -2
  781. package/docs/fundamentals/systems/core/overview.md +3 -3
  782. package/docs/fundamentals/systems/form/formatting-and-parsing.md +6 -6
  783. package/docs/fundamentals/systems/form/index.md +2 -2
  784. package/docs/fundamentals/systems/form/interaction-states.md +2 -2
  785. package/docs/fundamentals/systems/form/model-value.md +3 -3
  786. package/docs/fundamentals/systems/form/overview.md +30 -30
  787. package/docs/fundamentals/systems/form/styling.md +2 -2
  788. package/docs/fundamentals/systems/form/use-cases.md +2 -2
  789. package/docs/fundamentals/systems/form/validate.md +4 -4
  790. package/docs/fundamentals/systems/icon/index.md +2 -2
  791. package/docs/fundamentals/systems/icon/overview.md +2 -2
  792. package/docs/fundamentals/systems/localize/dates.md +2 -2
  793. package/docs/fundamentals/systems/localize/index.md +2 -2
  794. package/docs/fundamentals/systems/localize/numbers.md +2 -2
  795. package/docs/fundamentals/systems/localize/overview.md +6 -6
  796. package/docs/fundamentals/systems/localize/rationale.md +2 -2
  797. package/docs/fundamentals/systems/localize/text.md +2 -2
  798. package/docs/fundamentals/systems/localize/use-cases.md +2 -2
  799. package/docs/fundamentals/systems/overlays/_edge-cases.md +2 -2
  800. package/docs/fundamentals/systems/overlays/api-table.md +46 -43
  801. package/docs/fundamentals/systems/overlays/configuration.md +4 -4
  802. package/docs/fundamentals/systems/overlays/index.md +2 -2
  803. package/docs/fundamentals/systems/overlays/overview.md +7 -7
  804. package/docs/fundamentals/systems/overlays/rationale.md +2 -2
  805. package/docs/fundamentals/systems/overlays/use-cases.md +4 -4
  806. package/docs/fundamentals/tools/ajax/index.md +2 -2
  807. package/docs/fundamentals/tools/ajax/overview.md +2 -2
  808. package/docs/fundamentals/tools/ajax/use-cases.md +2 -2
  809. package/docs/fundamentals/tools/helpers/action-logger.md +2 -2
  810. package/docs/fundamentals/tools/helpers/index.md +2 -2
  811. package/docs/fundamentals/tools/helpers/overview.md +3 -3
  812. package/docs/fundamentals/tools/singleton-manager/example-complex/index.md +2 -2
  813. package/docs/fundamentals/tools/singleton-manager/example-fail/index.md +2 -2
  814. package/docs/fundamentals/tools/singleton-manager/example-success/index.md +2 -2
  815. package/docs/fundamentals/tools/singleton-manager/index.md +2 -2
  816. package/docs/fundamentals/tools/singleton-manager/overview.md +6 -6
  817. package/docs/guides/how-to/create-a-custom-field.md +7 -7
  818. package/docs/guides/how-to/create-a-form.md +6 -6
  819. package/docs/guides/how-to/extend-a-native-input.md +4 -4
  820. package/docs/guides/how-to/get-started.md +2 -2
  821. package/docs/guides/how-to/index.md +1 -1
  822. package/docs/guides/index.md +8 -8
  823. package/docs/guides/principles/definitions-and-terms.md +2 -2
  824. package/docs/guides/principles/index.md +5 -5
  825. package/docs/guides/principles/scoped-elements.md +2 -2
  826. package/docs/guides/principles/styling.md +3 -3
  827. package/docs/guides/principles/subclasser-apis.md +2 -2
  828. package/exports/define/lion-accordion.js +0 -1
  829. package/exports/define/lion-button-reset.js +0 -1
  830. package/exports/define/lion-button-submit.js +0 -1
  831. package/exports/define/lion-button.js +0 -1
  832. package/exports/define/lion-calendar.js +0 -1
  833. package/exports/define/lion-checkbox-group.js +0 -1
  834. package/exports/define/lion-checkbox-indeterminate.js +0 -1
  835. package/exports/define/lion-checkbox.js +0 -1
  836. package/exports/define/lion-collapsible.js +0 -1
  837. package/exports/define/lion-combobox.js +0 -1
  838. package/exports/define/lion-dialog.js +0 -1
  839. package/exports/define/lion-drawer.js +0 -1
  840. package/exports/define/lion-field.js +0 -1
  841. package/exports/define/lion-fieldset.js +0 -1
  842. package/exports/define/lion-form.js +0 -1
  843. package/exports/define/lion-icon.js +0 -1
  844. package/exports/define/lion-input-amount-dropdown.js +0 -1
  845. package/exports/define/lion-input-amount.js +0 -1
  846. package/exports/define/lion-input-date.js +0 -1
  847. package/exports/define/lion-input-datepicker.js +0 -1
  848. package/exports/define/lion-input-email.js +0 -1
  849. package/exports/define/lion-input-file.js +0 -1
  850. package/exports/define/lion-input-iban.js +0 -1
  851. package/exports/define/lion-input-range.js +0 -1
  852. package/exports/define/lion-input-stepper.js +0 -1
  853. package/exports/define/lion-input-tel-dropdown.js +0 -1
  854. package/exports/define/lion-input-tel.js +0 -1
  855. package/exports/define/lion-input.js +0 -1
  856. package/exports/define/lion-item.js +2 -0
  857. package/exports/define/lion-listbox.js +0 -1
  858. package/exports/define/lion-menu.js +2 -0
  859. package/exports/define/lion-menuitem.js +2 -0
  860. package/exports/define/lion-option.js +0 -1
  861. package/exports/define/lion-options.js +0 -1
  862. package/exports/define/lion-pagination.js +0 -1
  863. package/exports/define/lion-progress-indicator.js +0 -1
  864. package/exports/define/lion-radio-group.js +0 -1
  865. package/exports/define/lion-radio.js +0 -1
  866. package/exports/define/lion-select-invoker.js +0 -1
  867. package/exports/define/lion-select-rich.js +0 -1
  868. package/exports/define/lion-select.js +0 -1
  869. package/exports/define/lion-selected-file-list.js +0 -1
  870. package/exports/define/lion-step.js +0 -1
  871. package/exports/define/lion-steps.js +0 -1
  872. package/exports/define/lion-switch-button.js +0 -1
  873. package/exports/define/lion-switch.js +0 -1
  874. package/exports/define/lion-tabs.js +0 -1
  875. package/exports/define/lion-textarea.js +0 -1
  876. package/exports/define/lion-tooltip.js +0 -1
  877. package/exports/define/lion-validation-feedback.js +0 -1
  878. package/exports/define-helpers/sb-action-logger.js +0 -1
  879. package/exports/define-helpers/sb-locale-switcher.js +0 -1
  880. package/exports/form-core.js +0 -8
  881. package/exports/localize-no-side-effects.js +0 -1
  882. package/exports/localize.js +0 -2
  883. package/exports/menu-test-suites.js +4 -0
  884. package/exports/menu.js +3 -0
  885. package/exports/overlays.js +6 -4
  886. package/generated/awesome-phonenumber/LICENSE +22 -0
  887. package/generated/awesome-phonenumber/LICENSE.closure-library +176 -0
  888. package/generated/awesome-phonenumber/LICENSE.libphonenumber +176 -0
  889. package/generated/awesome-phonenumber/checksums.json +6 -0
  890. package/generated/awesome-phonenumber/index-esm.mjs +817 -0
  891. package/generated/awesome-phonenumber/index.d.ts +227 -0
  892. package/generated/awesome-phonenumber/index.js +45 -0
  893. package/generated/awesome-phonenumber/lib/index.js +710 -0
  894. package/generated/awesome-phonenumber/package.json +9 -0
  895. package/generated/awesome-phonenumber/provenance.json +13 -0
  896. package/menu-test-suites.js +4 -0
  897. package/menu.js +3 -0
  898. package/overlays.js +6 -0
  899. package/package.json +35 -6
  900. package/vscode.html-custom-data.json +76 -8
  901. package/web-types.json +202 -17
@@ -3,6 +3,7 @@ import { deepContains } from './utils/deep-contains.js';
3
3
  import { overlayShadowDomStyle } from './overlayShadowDomStyle.js';
4
4
  import { _adoptStyleUtils } from './utils/adopt-styles.js';
5
5
  import { getFocusableElements } from './utils/get-focusable-elements.js';
6
+ import { isEqualConfig } from './utils/is-equal-config.js';
6
7
 
7
8
  /**
8
9
  * @typedef {import('@lion/ui/types/overlays.js').OverlayPhase} OverlayPhase
@@ -32,41 +33,43 @@ import { getFocusableElements } from './utils/get-focusable-elements.js';
32
33
  * `<slot name="my-content">` belonging to `<div slot="content"/>` will be wrapped with wrappingDialogNodeL1 and contentWrapperNodeL2
33
34
  * inside shadow dom. With the help of temp markers, `<slot name="my-content">`'s original position will be respected.
34
35
  *
35
- * @param {{ wrappingDialogNodeL1:HTMLDialogElement|HTMLDivElement; contentWrapperNodeL2:Element; contentNodeL3: Element }} opts
36
+ * @param {{
37
+ * wrappingDialogNodeL1: HTMLDialogElement|HTMLDivElement;
38
+ * contentWrapperNodeL2:Element;
39
+ * contentNodeL3: Element;
40
+ * }} opts
36
41
  */
37
42
  function rearrangeNodes({ wrappingDialogNodeL1, contentWrapperNodeL2, contentNodeL3 }) {
38
- if (!(contentWrapperNodeL2.isConnected || contentNodeL3.isConnected)) {
43
+ // if contentWrapperNode is provided by the user,
44
+ // we assume it lives in shadow dom around a slot.
45
+ const hasLegacyMethodOfProvidingWrapperNode = Boolean(contentWrapperNodeL2.parentNode);
46
+ // We could be initialized via a directive (in offline dom). It's important that we know about the parents,
47
+ // as we cannot deal with single content nodes
48
+ const hasContentNodeAttachmentPoints = Boolean(contentNodeL3.parentNode);
49
+ if (!hasLegacyMethodOfProvidingWrapperNode && !hasContentNodeAttachmentPoints) {
39
50
  throw new Error(
40
- '[OverlayController] Could not find a render target, since the provided contentNode is not connected to the DOM. Make sure that it is connected, e.g. by doing "document.body.appendChild(contentNode)", before passing it on.',
51
+ '[OverlayController] Could not find a render target, makes sure contentNode has a parent element (or contentWrapperNode is connected)',
41
52
  );
42
53
  }
43
54
 
55
+ /** @type {Node} */
44
56
  let parentElement;
45
- const tempMarker = document.createComment('tempMarker');
46
-
47
- if (contentWrapperNodeL2.isConnected) {
57
+ const tempMarker = document.createComment('overlay-insertion-marker');
58
+ // Moving the wrapper can change slot assignment, so capture the node we relocate up front
59
+ // and restore that same node during cleanup.
60
+ const contentNodeOrSlot = contentNodeL3.assignedSlot || contentNodeL3;
61
+ if (hasLegacyMethodOfProvidingWrapperNode) {
48
62
  // This is the case when contentWrapperNode (living in shadow dom, wrapping <slot name="my-content-outlet">) is already provided via controller.
49
63
  parentElement = contentWrapperNodeL2.parentElement || contentWrapperNodeL2.getRootNode();
50
64
  parentElement.insertBefore(tempMarker, contentWrapperNodeL2);
51
65
  // Wrap...
52
66
  wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
53
- }
54
- // if contentNodeL3.isConnected
55
- else {
56
- const contentIsProjected = contentNodeL3.assignedSlot;
57
- if (contentIsProjected) {
58
- parentElement =
59
- contentNodeL3.assignedSlot.parentElement || contentNodeL3.assignedSlot.getRootNode();
60
- parentElement.insertBefore(tempMarker, contentNodeL3.assignedSlot);
61
- wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
62
- // Important: we do not move around contentNodeL3, but the assigned slot
63
- contentWrapperNodeL2.appendChild(contentNodeL3.assignedSlot);
64
- } else {
65
- parentElement = contentNodeL3.parentElement || contentNodeL3.getRootNode();
66
- parentElement.insertBefore(tempMarker, contentNodeL3);
67
- wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
68
- contentWrapperNodeL2.appendChild(contentNodeL3);
69
- }
67
+ } else {
68
+ parentElement = contentNodeOrSlot.parentElement || contentNodeOrSlot.getRootNode();
69
+ parentElement.insertBefore(tempMarker, contentNodeOrSlot);
70
+ wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
71
+ // Important: for projected content we do not move contentNodeL3, but its assigned slot
72
+ contentWrapperNodeL2.appendChild(contentNodeOrSlot);
70
73
  }
71
74
 
72
75
  /**
@@ -93,7 +96,20 @@ function rearrangeNodes({ wrappingDialogNodeL1, contentWrapperNodeL2, contentNod
93
96
  * ```
94
97
  */
95
98
  parentElement.insertBefore(wrappingDialogNodeL1, tempMarker);
96
- parentElement?.removeChild(tempMarker);
99
+ return function cleanup() {
100
+ if (hasLegacyMethodOfProvidingWrapperNode) {
101
+ parentElement?.insertBefore(contentWrapperNodeL2, tempMarker);
102
+ } else {
103
+ parentElement?.insertBefore(contentNodeOrSlot, tempMarker);
104
+ if (parentElement.contains(contentWrapperNodeL2)) {
105
+ contentWrapperNodeL2.remove();
106
+ }
107
+ }
108
+ parentElement?.removeChild(tempMarker);
109
+ if (parentElement.contains(wrappingDialogNodeL1)) {
110
+ parentElement?.removeChild(wrappingDialogNodeL1);
111
+ }
112
+ };
97
113
  }
98
114
 
99
115
  /**
@@ -101,11 +117,25 @@ function rearrangeNodes({ wrappingDialogNodeL1, contentWrapperNodeL2, contentNod
101
117
  */
102
118
  async function preloadPopper() {
103
119
  // @ts-ignore [external]: import complains about untyped module, but we typecast it ourselves
104
- return /** @type {* & Promise<PopperModule>} */ (import('@popperjs/core/dist/esm/popper.js'));
120
+ return /** @type {* & Promise<PopperModule>} */ import('@popperjs/core/dist/esm/popper.js');
105
121
  }
106
-
107
122
  const childDialogsClosedInEventLoopWeakmap = new WeakMap();
108
123
 
124
+ /**
125
+ * @param {HTMLElement | null} el
126
+ * @param {string} selector
127
+ * @returns {HTMLElement | null}
128
+ */
129
+ function deepClosest(el, selector) {
130
+ // @ts-ignore - comparing HTMLElement to document/window for safety
131
+ return (
132
+ // @ts-ignore - type comparison check
133
+ (el && el !== document && el !== window && el.closest(selector)) ||
134
+ // @ts-ignore - host property on ShadowRoot
135
+ deepClosest(el.getRootNode().host, selector)
136
+ );
137
+ }
138
+
109
139
  /**
110
140
  * OverlayController is the fundament for every single type of overlay. With the right
111
141
  * configuration, it can be used to build (modal) dialogs, tooltips, dropdowns, popovers,
@@ -173,12 +203,10 @@ export class OverlayController extends EventTarget {
173
203
  super();
174
204
  this.manager = manager;
175
205
  this.__sharedConfig = config;
176
-
177
206
  this.__activeElementRightBeforeHide = null;
178
207
 
179
208
  /** @type {OverlayConfig} */
180
209
  this.config = {};
181
-
182
210
  this._defaultConfig = {
183
211
  placementMode: undefined,
184
212
  contentNode: config.contentNode,
@@ -236,8 +264,20 @@ export class OverlayController extends EventTarget {
236
264
  placement: 'center',
237
265
  },
238
266
  zIndex: 9999,
267
+ isActivated: true,
268
+ elementToFocusOnShow: false,
269
+ // This means that content will have visually-hidden / sr-only styles. This is handy for:
270
+ // - hidden menus that should be "indexable" by screen readers (like the Links list in VO: https://support.apple.com/en-gb/guide/voiceover/mchlp2719/mac)
271
+ // - "more" menus that put content in a dropdown that do not fit in the current row
272
+ // - menus that should generally open on tab.
273
+ // @ts-ignore - hideVisually is an extension property
274
+ hideVisually: false,
275
+ requireConnectedNodes: true,
276
+ // hides children overlays when parent is closed...
277
+ syncChildrenCloseState: false,
278
+ // // In next major, we remove this prop. Now we disable it for backwards compatibility and enable it in the places we need it internally
279
+ // _shouldTeardownDomStructure: false,
239
280
  };
240
-
241
281
  this._contentId = `overlay-content--${Math.random().toString(36).slice(2, 10)}`;
242
282
  this.__originalAttrs = new Map();
243
283
  /** @private */
@@ -248,6 +288,7 @@ export class OverlayController extends EventTarget {
248
288
  this.__cancelHandler = this.__cancelHandler.bind(this);
249
289
  this.__escKeyHandlerCalled = false;
250
290
  }
291
+ __hasSetup = false;
251
292
 
252
293
  /**
253
294
  * The invokerNode
@@ -262,12 +303,12 @@ export class OverlayController extends EventTarget {
262
303
  * @type {HTMLDialogElement | HTMLDivElement}
263
304
  */
264
305
  get content() {
265
- return /** @type {HTMLDialogElement | HTMLDivElement} */ (this.__wrappingDialogNode);
306
+ return /** @type {HTMLDialogElement | HTMLDivElement} */ this.__wrappingDialogNode;
266
307
  }
267
308
 
268
309
  /**
269
310
  * Determines the connection point in DOM (body vs next to invoker).
270
- * @type {'global' | 'local' | undefined}
311
+ * @type {'global' | 'local' | 'custom' | undefined}
271
312
  */
272
313
  get placementMode() {
273
314
  return this.config?.placementMode;
@@ -288,7 +329,7 @@ export class OverlayController extends EventTarget {
288
329
  * @type {HTMLElement}
289
330
  */
290
331
  get referenceNode() {
291
- return /** @type {HTMLElement} */ (this.config?.referenceNode);
332
+ return /** @type {HTMLElement} */ this.config?.referenceNode;
292
333
  }
293
334
 
294
335
  /**
@@ -296,7 +337,7 @@ export class OverlayController extends EventTarget {
296
337
  * @type {HTMLElement}
297
338
  */
298
339
  get contentNode() {
299
- return /** @type {HTMLElement} */ (this.config?.contentNode);
340
+ return /** @type {HTMLElement} */ this.config?.contentNode;
300
341
  }
301
342
 
302
343
  /**
@@ -307,9 +348,7 @@ export class OverlayController extends EventTarget {
307
348
  * @type {HTMLElement}
308
349
  */
309
350
  get contentWrapperNode() {
310
- return /** @type {HTMLElement} */ (
311
- this.__contentWrapperNode || this.config?.contentWrapperNode
312
- );
351
+ return /** @type {HTMLElement} */ this.__contentWrapperNode || this.config?.contentWrapperNode;
313
352
  }
314
353
 
315
354
  /**
@@ -318,7 +357,7 @@ export class OverlayController extends EventTarget {
318
357
  * @type {HTMLElement}
319
358
  */
320
359
  get backdropNode() {
321
- return /** @type {HTMLElement} */ (this.__backdropNode || this.config?.backdropNode);
360
+ return /** @type {HTMLElement} */ this.__backdropNode || this.config?.backdropNode;
322
361
  }
323
362
 
324
363
  /**
@@ -326,8 +365,9 @@ export class OverlayController extends EventTarget {
326
365
  * @type {HTMLElement}
327
366
  */
328
367
  get elementToFocusAfterHide() {
329
- return /** @type {HTMLElement} */ (
330
- this.__elementToFocusAfterHide || this.config?.elementToFocusAfterHide
368
+ return (
369
+ /** @type {HTMLElement} */ this.__elementToFocusAfterHide ||
370
+ this.config?.elementToFocusAfterHide
331
371
  );
332
372
  }
333
373
 
@@ -336,7 +376,7 @@ export class OverlayController extends EventTarget {
336
376
  * @type {boolean}
337
377
  */
338
378
  get hasBackdrop() {
339
- return /** @type {boolean} */ (!!this.backdropNode || this.config?.hasBackdrop);
379
+ return /** @type {boolean} */ !!this.backdropNode || this.config?.hasBackdrop;
340
380
  }
341
381
 
342
382
  /**
@@ -344,7 +384,7 @@ export class OverlayController extends EventTarget {
344
384
  * @type {boolean}
345
385
  */
346
386
  get isBlocking() {
347
- return /** @type {boolean} */ (this.config?.isBlocking);
387
+ return /** @type {boolean} */ this.config?.isBlocking;
348
388
  }
349
389
 
350
390
  /**
@@ -352,7 +392,7 @@ export class OverlayController extends EventTarget {
352
392
  * @type {boolean}
353
393
  */
354
394
  get preventsScroll() {
355
- return /** @type {boolean} */ (this.config?.preventsScroll);
395
+ return /** @type {boolean} */ this.config?.preventsScroll;
356
396
  }
357
397
 
358
398
  /**
@@ -360,7 +400,7 @@ export class OverlayController extends EventTarget {
360
400
  * @type {boolean}
361
401
  */
362
402
  get trapsKeyboardFocus() {
363
- return /** @type {boolean} */ (this.config?.trapsKeyboardFocus);
403
+ return /** @type {boolean} */ this.config?.trapsKeyboardFocus;
364
404
  }
365
405
 
366
406
  /**
@@ -368,7 +408,7 @@ export class OverlayController extends EventTarget {
368
408
  * @type {boolean}
369
409
  */
370
410
  get hidesOnEsc() {
371
- return /** @type {boolean} */ (this.config?.hidesOnEsc);
411
+ return /** @type {boolean} */ this.config?.hidesOnEsc;
372
412
  }
373
413
 
374
414
  /**
@@ -376,7 +416,7 @@ export class OverlayController extends EventTarget {
376
416
  * @type {boolean}
377
417
  */
378
418
  get hidesOnOutsideClick() {
379
- return /** @type {boolean} */ (this.config?.hidesOnOutsideClick);
419
+ return /** @type {boolean} */ this.config?.hidesOnOutsideClick;
380
420
  }
381
421
 
382
422
  /**
@@ -384,7 +424,7 @@ export class OverlayController extends EventTarget {
384
424
  * @type {boolean}
385
425
  */
386
426
  get hidesOnOutsideEsc() {
387
- return /** @type {boolean} */ (this.config?.hidesOnOutsideEsc);
427
+ return /** @type {boolean} */ this.config?.hidesOnOutsideEsc;
388
428
  }
389
429
 
390
430
  /**
@@ -411,7 +451,7 @@ export class OverlayController extends EventTarget {
411
451
  * @type {boolean}
412
452
  */
413
453
  get handlesAccessibility() {
414
- return /** @type {boolean} */ (this.config?.handlesAccessibility);
454
+ return /** @type {boolean} */ this.config?.handlesAccessibility;
415
455
  }
416
456
 
417
457
  /**
@@ -420,7 +460,7 @@ export class OverlayController extends EventTarget {
420
460
  * @type {boolean}
421
461
  */
422
462
  get isTooltip() {
423
- return /** @type {boolean} */ (this.config?.isTooltip);
463
+ return /** @type {boolean} */ this.config?.isTooltip;
424
464
  }
425
465
 
426
466
  /**
@@ -428,7 +468,7 @@ export class OverlayController extends EventTarget {
428
468
  * to communicate an important message and require a response.
429
469
  */
430
470
  get isAlertDialog() {
431
- return /** @type {boolean} */ (this.config?.isAlertDialog);
471
+ return /** @type {boolean} */ this.config?.isAlertDialog;
432
472
  }
433
473
 
434
474
  /**
@@ -445,7 +485,7 @@ export class OverlayController extends EventTarget {
445
485
  * @type {PopperOptions}
446
486
  */
447
487
  get popperConfig() {
448
- return /** @type {PopperOptions} */ (this.config?.popperConfig);
488
+ return /** @type {PopperOptions} */ this.config?.popperConfig;
449
489
  }
450
490
 
451
491
  /**
@@ -453,11 +493,10 @@ export class OverlayController extends EventTarget {
453
493
  * @type {ViewportConfig}
454
494
  */
455
495
  get viewportConfig() {
456
- return /** @type {ViewportConfig} */ (this.config?.viewportConfig);
496
+ return /** @type {ViewportConfig} */ this.config?.viewportConfig;
457
497
  }
458
-
459
498
  get visibilityTriggerFunction() {
460
- return /** @type {function} */ (this.config?.visibilityTriggerFunction);
499
+ return /** @type {function} */ this.config?.visibilityTriggerFunction;
461
500
  }
462
501
 
463
502
  /**
@@ -492,20 +531,20 @@ export class OverlayController extends EventTarget {
492
531
  * @param { OverlayConfig } cfgToAdd
493
532
  */
494
533
  updateConfig(cfgToAdd) {
495
- // Teardown all previous configs
496
- this.teardown();
497
-
498
534
  /**
499
535
  * @type {OverlayConfig}
500
536
  * @private
501
537
  */
502
- this.__prevConfig = this.config;
538
+ const prevConfig = this.config;
503
539
 
504
540
  /** @type {OverlayConfig} */
505
- this.config = {
506
- ...this._defaultConfig, // our basic ingredients
507
- ...this.__sharedConfig, // the initial configured overlayController
508
- ...cfgToAdd, // the added config
541
+ const newConfig = {
542
+ ...this._defaultConfig,
543
+ // our basic ingredients
544
+ ...this.__sharedConfig,
545
+ // the initial configured overlayController
546
+ ...cfgToAdd,
547
+ // the added config
509
548
  popperConfig: {
510
549
  ...(this._defaultConfig.popperConfig || {}),
511
550
  ...(this.__sharedConfig.popperConfig || {}),
@@ -517,21 +556,23 @@ export class OverlayController extends EventTarget {
517
556
  ],
518
557
  },
519
558
  };
559
+ const shouldUpdate = !this.__hasSetup || !isEqualConfig(prevConfig, newConfig);
560
+ if (!shouldUpdate) return;
561
+ // Teardown all previous configs
562
+
563
+ this.teardown();
564
+ this.config = newConfig;
520
565
 
521
566
  /** @private */
522
567
  this.__validateConfiguration(this.config);
523
568
  /** @protected */
524
569
  this._init();
525
- /** @private */
526
- this.__elementToFocusAfterHide = undefined;
527
-
528
570
  if (!this.#isRegisteredOnManager()) {
529
571
  this.manager.add(this);
530
572
  }
531
573
  }
532
-
533
574
  #isRegisteredOnManager() {
534
- return Boolean(this.manager.list.find(ctrl => this === ctrl));
575
+ return Boolean(this.manager.list.find((ctrl) => this === ctrl));
535
576
  }
536
577
 
537
578
  /**
@@ -545,7 +586,7 @@ export class OverlayController extends EventTarget {
545
586
  '[OverlayController] You need to provide a .placementMode ("global"|"local")',
546
587
  );
547
588
  }
548
- if (!['global', 'local'].includes(newConfig.placementMode)) {
589
+ if (!['global', 'local', 'custom'].includes(newConfig.placementMode)) {
549
590
  throw new Error(
550
591
  `[OverlayController] "${newConfig.placementMode}" is not a valid .placementMode, use ("global"|"local")`,
551
592
  );
@@ -564,35 +605,64 @@ export class OverlayController extends EventTarget {
564
605
  * @protected
565
606
  */
566
607
  _init() {
567
- if (!this.__contentHasBeenInitialized) {
568
- this.__initContentDomStructure();
569
- this.__contentHasBeenInitialized = true;
570
- }
608
+ if (!this.config.isActivated) return;
609
+
610
+ // TODO: should not be behind a flag when we are fully tearing down...
611
+ // TODO 2: When we move away from dialog (use popover to paint to top layer)
612
+ // and popper.js, (use popover and anchor positioning and popperjs as fallback, but we can put styles on contentNode),
613
+ // we dont need to create complex wrappers
614
+ // if (!this.__contentHasBeenInitialized) {
615
+ this.__initContentDomStructure();
616
+ // this.__contentHasBeenInitialized = true;
617
+ // }
618
+ this.__initVisibility();
571
619
 
572
620
  // Reset all positioning styles (local, c.q. Popper) and classes (global)
573
- this.contentWrapperNode.removeAttribute('style');
574
- this.contentWrapperNode.removeAttribute('class');
575
-
621
+ if (this.contentWrapperNode !== this.contentNode) {
622
+ this.contentWrapperNode.removeAttribute('style');
623
+ this.contentWrapperNode.removeAttribute('class');
624
+ }
576
625
  if (this.placementMode === 'local') {
577
626
  // Lazily load Popper as soon as the first local overlay is used...
578
627
  if (!OverlayController.popperModule) {
579
628
  OverlayController.popperModule = preloadPopper();
580
629
  }
581
630
  }
582
- this.__handleOverlayStyles({ phase: 'init' });
583
- this._handleFeatures({ phase: 'init' });
631
+ this.__handleOverlayStyles({
632
+ phase: 'init',
633
+ });
634
+ this._handleFeatures({
635
+ phase: 'init',
636
+ });
637
+
638
+ /** @private */
639
+ this.__elementToFocusAfterHide = undefined;
640
+ this.contentNode.dataset.content = '';
641
+
642
+ // Use event delegation to listen for clicks on close buttons...
643
+ this.contentNode.addEventListener('click', this.#hideOnCloseButtonClick);
644
+ this.__hasSetup = true;
584
645
  }
646
+ #hideOnCloseButtonClick = (/** @type {{ target: any; }} */ ev) => {
647
+ const isOurCloseButton =
648
+ ev.target.hasAttribute('data-close') &&
649
+ deepClosest(ev.target, '[data-content]') === this.contentNode;
650
+ if (!isOurCloseButton) return;
651
+ this.hide();
652
+ };
585
653
 
586
654
  /**
587
655
  * @param {{ phase: OverlayPhase }} config
588
656
  * @private
589
657
  */
590
658
  __handleOverlayStyles({ phase }) {
591
- const rootNode = /** @type {ShadowRoot} */ (this.contentWrapperNode?.getRootNode());
659
+ const rootNode = /** @type {ShadowRoot} */ this.contentWrapperNode?.getRootNode();
592
660
  if (phase === 'init') {
593
661
  _adoptStyleUtils.adoptStyle(rootNode, overlayShadowDomStyle);
594
662
  } else if (phase === 'teardown') {
595
- _adoptStyleUtils.adoptStyle(rootNode, overlayShadowDomStyle, { teardown: true });
663
+ _adoptStyleUtils.adoptStyle(rootNode, overlayShadowDomStyle, {
664
+ teardown: true,
665
+ });
596
666
  }
597
667
  }
598
668
 
@@ -623,84 +693,107 @@ export class OverlayController extends EventTarget {
623
693
  * @private
624
694
  */
625
695
  __initContentDomStructure() {
626
- const wrappingDialogElement = document.createElement('dialog');
627
- // We use a dialog for its visual capabilities: it renders to the top layer.
628
- // A11y will depend on the type of overlay and is arranged on contentNode level.
629
- // Also see: https://www.scottohara.me/blog/2019/03/05/open-dialog.html
630
- //
631
- // The role="dialog" is set on the contentNode (or another role), so role="none"
632
- // is valid here, although AXE complains about this setup.
633
- // For now we need to add `ignoredRules: ['aria-allowed-role']` in your AXE tests.
634
- // see: https://lion.js.org/fundamentals/systems/overlays/rationale/#considerations
635
- wrappingDialogElement.setAttribute('role', 'none');
636
- wrappingDialogElement.setAttribute('data-overlay-outer-wrapper', '');
637
- // N.B. position: fixed is needed to escape out of 'overflow: hidden'
638
- // We give a high z-index for non-modal dialogs, so that we at least win from all siblings of our
639
- // parent stacking context
640
- // padding reset so we don't get a weird dialog visual square showing up
641
- wrappingDialogElement.style.cssText = `display:none; z-index: ${this.config.zIndex}; padding: 0;`;
642
- this.__wrappingDialogNode = wrappingDialogElement;
643
-
644
- /**
645
- * Based on the configuration of the developer, multiple scenarios are accounted for
646
- * A. We already have a contentWrapperNode ()
647
- */
648
- if (!this.config?.contentWrapperNode) {
649
- this.__contentWrapperNode = document.createElement('div');
650
- }
651
- this.contentWrapperNode.setAttribute('data-id', 'content-wrapper');
652
- // 'hack' that makes sure popperjs (that is applied one level lower) works correctly in deeply nested shadow roots
653
- this.contentWrapperNode.style.transform = 'translateZ(0px)';
696
+ if (this.placementMode !== 'custom') {
697
+ const wrappingDialogElement = document.createElement('dialog');
698
+ // We use a dialog for its visual capabilities: it renders to the top layer.
699
+ // A11y will depend on the type of overlay and is arranged on contentNode level.
700
+ // Also see: https://www.scottohara.me/blog/2019/03/05/open-dialog.html
701
+ //
702
+ // The role="dialog" is set on the contentNode (or another role), so role="none"
703
+ // is valid here, although AXE complains about this setup.
704
+ // For now we need to add `ignoredRules: ['aria-allowed-role']` in your AXE tests.
705
+ // see: https://lion.js.org/fundamentals/systems/overlays/rationale/#considerations
706
+ wrappingDialogElement.setAttribute('role', 'none');
707
+ wrappingDialogElement.setAttribute('data-overlay-outer-wrapper', '');
708
+ // N.B. position: fixed is needed to escape out of 'overflow: hidden'
709
+ // We give a high z-index for non-modal dialogs, so that we at least win from all siblings of our
710
+ // parent stacking context
711
+ // padding reset so we don't get a weird dialog visual square showing up
712
+ wrappingDialogElement.style.cssText = `display:none; z-index: ${this.config.zIndex}; padding: 0;`;
713
+ // @ts-ignore - 'custom' is a valid extension of placementMode
714
+ if (this.config.placementMode === 'custom') {
715
+ // The user should have full freedom to control the content node, so its wrapper nodes should remain neutral.
716
+ wrappingDialogElement.style.cssText += `position: static;`;
717
+ }
718
+ this.__wrappingDialogNode = wrappingDialogElement;
654
719
 
655
- rearrangeNodes({
656
- wrappingDialogNodeL1: wrappingDialogElement,
657
- contentWrapperNodeL2: this.contentWrapperNode,
658
- contentNodeL3: this.contentNode,
659
- });
660
- wrappingDialogElement.open = true;
720
+ /**
721
+ * Based on the configuration of the developer, multiple scenarios are accounted for
722
+ * A. We already have a contentWrapperNode ()
723
+ */
724
+ if (!this.config?.contentWrapperNode) {
725
+ this.__contentWrapperNode = document.createElement('div');
726
+ }
727
+ this.contentWrapperNode.setAttribute('data-id', 'content-wrapper');
728
+ // 'hack' that makes sure popperjs (that is applied one level lower) works correctly in deeply nested shadow roots
729
+ this.contentWrapperNode.style.transform = 'translateZ(0px)';
730
+ this.__rearrangeNodesCleanup = rearrangeNodes({
731
+ wrappingDialogNodeL1: wrappingDialogElement,
732
+ contentWrapperNodeL2: this.contentWrapperNode,
733
+ contentNodeL3: this.contentNode,
734
+ // requireConnectedNodes: Boolean(this.config.requireConnectedNodes),
735
+ });
736
+ wrappingDialogElement.open = true;
737
+ if (this.isTooltip) {
738
+ // needed to prevent tooltip getting focus in Safari and Firefox
739
+ wrappingDialogElement.setAttribute('tabindex', '-1');
740
+ }
741
+ this.contentWrapperNode.style.zIndex = '1';
742
+ if (getComputedStyle(this.contentNode).position === 'absolute') {
743
+ // Having a _contWrapperNode and a contentNode with 'position:absolute' results in
744
+ // computed height of 0...
745
+ this.contentNode.style.position = 'static';
746
+ }
661
747
 
662
- if (this.isTooltip) {
663
- // needed to prevent tooltip getting focus in Safari and Firefox
664
- wrappingDialogElement.setAttribute('tabindex', '-1');
748
+ // Here we prevent any interference of the native <dialog> element with the keyboard behavior
749
+ // as defined by the OverlayController. This is needed until we can configure `closedby="none"`
750
+ // on the native dialog for all browsers: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby
751
+ const hasClosedBySupport = HTMLDialogElement && 'closedBy' in HTMLDialogElement.prototype;
752
+ if (hasClosedBySupport) {
753
+ // @ts-ignore - closedBy is a newer property not in all TypeScript versions
754
+ wrappingDialogElement.closedBy = 'none';
755
+ } else {
756
+ wrappingDialogElement.addEventListener(
757
+ 'keydown',
758
+ (/** @type {* & KeyboardEvent} */ event) => {
759
+ if (event.key === 'Escape') {
760
+ event.preventDefault();
761
+ }
762
+ },
763
+ );
764
+ wrappingDialogElement.addEventListener(
765
+ 'keyup',
766
+ (/** @type {* & KeyboardEvent} */ event) => {
767
+ if (event.key === 'Escape') {
768
+ event.preventDefault();
769
+ }
770
+ },
771
+ );
772
+ wrappingDialogElement.addEventListener('cancel', (event) => {
773
+ event.stopPropagation();
774
+ });
775
+ wrappingDialogElement.addEventListener('close', (event) => {
776
+ event.stopPropagation();
777
+ });
778
+ }
779
+ } else {
780
+ // quick hack to make none-popper/global flows work...
781
+ this.__contentWrapperNode = this.contentNode;
782
+ this.__wrappingDialogNode = this.contentNode;
665
783
  }
666
-
784
+ }
785
+ __initVisibility() {
786
+ // TODO: allow defaultOpen?
787
+ /** @type {HTMLDialogElement} */
667
788
  this.__wrappingDialogNode.style.display = 'none';
668
- this.contentWrapperNode.style.zIndex = '1';
669
-
670
- if (getComputedStyle(this.contentNode).position === 'absolute') {
671
- // Having a _contWrapperNode and a contentNode with 'position:absolute' results in
672
- // computed height of 0...
673
- this.contentNode.style.position = 'static';
674
- }
789
+ }
675
790
 
676
- // Here we prevent any interference of the native <dialog> element with the keyboard behavior
677
- // as defined by the OverlayController. This is needed until we can configure `closedby="none"`
678
- // on the native dialog for all browsers: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby
679
- const hasClosedBySupport = HTMLDialogElement && 'closedBy' in HTMLDialogElement.prototype;
680
- if (hasClosedBySupport) {
681
- // @ts-ignore [closedBy is feature-detected above]
682
- wrappingDialogElement.closedBy = 'none';
683
- } else {
684
- wrappingDialogElement.addEventListener(
685
- 'keydown',
686
- (/** @type {* & KeyboardEvent} */ event) => {
687
- if (event.key === 'Escape') {
688
- event.preventDefault();
689
- }
690
- },
691
- );
692
- wrappingDialogElement.addEventListener('keyup', (/** @type {* & KeyboardEvent} */ event) => {
693
- if (event.key === 'Escape') {
694
- event.preventDefault();
695
- }
696
- });
697
- wrappingDialogElement.addEventListener('cancel', event => {
698
- event.stopPropagation();
699
- });
700
- wrappingDialogElement.addEventListener('close', event => {
701
- event.stopPropagation();
702
- });
703
- }
791
+ // Clean up the DOM structure, leaving it as we found it.
792
+ // TODO: __teardownContentDomStructure method... use Resettable (rename ro Restorable) found in VisibilitToggleCtrl
793
+ __teardownVisibility() {
794
+ // TODO: full structure. For now we just reset display prop...
795
+ /** @type {HTMLDialogElement} */
796
+ this.__wrappingDialogNode.style.display = '';
704
797
  }
705
798
 
706
799
  /**
@@ -712,7 +805,6 @@ export class OverlayController extends EventTarget {
712
805
  if (this.placementMode !== 'local') {
713
806
  return;
714
807
  }
715
-
716
808
  if (phase === 'setup') {
717
809
  const zIndexNumber = Number(getComputedStyle(this.contentNode).zIndex);
718
810
  if (zIndexNumber < 1 || Number.isNaN(zIndexNumber)) {
@@ -729,7 +821,6 @@ export class OverlayController extends EventTarget {
729
821
  if (phase === 'init') {
730
822
  this.__storeOriginalAttrs(this.contentNode, ['role', 'id']);
731
823
  const isModal = this.trapsKeyboardFocus;
732
-
733
824
  if (this.invokerNode) {
734
825
  const attributesToStore = ['aria-labelledby', 'aria-describedby'];
735
826
  if (!isModal) {
@@ -737,7 +828,6 @@ export class OverlayController extends EventTarget {
737
828
  }
738
829
  this.__storeOriginalAttrs(this.invokerNode, attributesToStore);
739
830
  }
740
-
741
831
  if (!this.contentNode.id) {
742
832
  this.contentNode.setAttribute('id', this._contentId);
743
833
  }
@@ -773,7 +863,7 @@ export class OverlayController extends EventTarget {
773
863
  __storeOriginalAttrs(node, attrs) {
774
864
  /** @type {Record<string, any>} */
775
865
  const attrMap = {};
776
- attrs.forEach(attrName => {
866
+ attrs.forEach((attrName) => {
777
867
  attrMap[attrName] = node.getAttribute(attrName);
778
868
  });
779
869
  this.__originalAttrs.set(node, attrMap);
@@ -792,9 +882,8 @@ export class OverlayController extends EventTarget {
792
882
  }
793
883
  this.__originalAttrs.clear();
794
884
  }
795
-
796
885
  get isShown() {
797
- return Boolean(this.__wrappingDialogNode?.style.display !== 'none');
886
+ return Boolean(this.__wrappingDialogNode && this.__wrappingDialogNode.style.display !== 'none');
798
887
  }
799
888
 
800
889
  /**
@@ -808,32 +897,47 @@ export class OverlayController extends EventTarget {
808
897
  if (this._showComplete) {
809
898
  await this._showComplete;
810
899
  }
811
- this._showComplete = new Promise(resolve => {
900
+ this._showComplete = new Promise((resolve) => {
812
901
  this._showResolve = resolve;
813
902
  });
814
903
 
904
+ // Teardown() removes the content dom structure we created (contentWrapperNode +
905
+ // wrapping <dialog>). Make sure it exists again before the manager (which sets
906
+ // our elevation on the wrapping node) and the show logic below touch it.
907
+ if (!this.__wrappingDialogNode) {
908
+ this._init();
909
+ }
815
910
  if (this.manager) {
816
911
  this.manager.show(this);
817
912
  }
818
-
819
913
  if (this.isShown) {
820
914
  /** @type {function} */
821
- (this._showResolve)();
915
+ this._showResolve();
822
916
  return;
823
917
  }
824
-
825
- const event = new CustomEvent('before-show', { cancelable: true });
918
+ const event = new CustomEvent('before-show', {
919
+ cancelable: true,
920
+ });
826
921
  this.dispatchEvent(event);
827
922
  if (!event.defaultPrevented) {
828
923
  if ('HTMLDialogElement' in window && this.__wrappingDialogNode instanceof HTMLDialogElement) {
829
924
  this.__wrappingDialogNode.open = true;
830
925
  }
926
+
831
927
  // @ts-ignore
832
928
  this.__wrappingDialogNode.style.display = '';
833
- this._keepBodySize({ phase: 'before-show' });
834
- await this._handleFeatures({ phase: 'show' });
835
- this._keepBodySize({ phase: 'show' });
836
- await this._handlePosition({ phase: 'show' });
929
+ this._keepBodySize({
930
+ phase: 'before-show',
931
+ });
932
+ await this._handleFeatures({
933
+ phase: 'show',
934
+ });
935
+ this._keepBodySize({
936
+ phase: 'show',
937
+ });
938
+ await this._handlePosition({
939
+ phase: 'show',
940
+ });
837
941
  this.__elementToFocusAfterHide = elementToFocusAfterHide;
838
942
  this.dispatchEvent(new Event('show'));
839
943
  await this._transitionShow({
@@ -841,8 +945,17 @@ export class OverlayController extends EventTarget {
841
945
  contentNode: this.contentNode,
842
946
  });
843
947
  }
948
+
949
+ // a styling/debug hook for open state
950
+ this.contentNode.setAttribute('data-open', '');
951
+ if (this.config.elementToFocusOnShow) {
952
+ this.contentNode.focus({
953
+ preventScroll: true,
954
+ });
955
+ }
956
+
844
957
  /** @type {function} */
845
- (this._showResolve)();
958
+ this._showResolve();
846
959
  }
847
960
 
848
961
  /**
@@ -852,7 +965,6 @@ export class OverlayController extends EventTarget {
852
965
  async _handlePosition({ phase }) {
853
966
  if (this.placementMode === 'global') {
854
967
  const placementClass = `overlays__overlay-container--${this.viewportConfig.placement}`;
855
-
856
968
  if (phase === 'show') {
857
969
  this.contentWrapperNode.classList.add('overlays__overlay-container');
858
970
  this.contentWrapperNode.classList.add(placementClass);
@@ -871,8 +983,10 @@ export class OverlayController extends EventTarget {
871
983
  * This is however necessary for initial placement.
872
984
  */
873
985
  await this.__createPopperInstance();
874
- /** @type {import('@popperjs/core').Instance} */ (this._popper).forceUpdate();
986
+ /** @type {import('@popperjs/core').Instance} */
987
+ this._popper.forceUpdate();
875
988
  }
989
+ // N.B. leave it up to the user if placementMode === 'custom'
876
990
  }
877
991
 
878
992
  /**
@@ -880,11 +994,10 @@ export class OverlayController extends EventTarget {
880
994
  * @protected
881
995
  */
882
996
  _keepBodySize({ phase }) {
883
- if (!this.preventsScroll) {
884
- return;
885
- }
886
-
887
- this.manager.requestToKeepBodySize({ phase });
997
+ if (!this.preventsScroll) return;
998
+ this.manager.requestToKeepBodySize({
999
+ phase,
1000
+ });
888
1001
  }
889
1002
 
890
1003
  /**
@@ -892,7 +1005,9 @@ export class OverlayController extends EventTarget {
892
1005
  * @event hide right after the overlay is hidden
893
1006
  */
894
1007
  async hide() {
895
- this._hideComplete = new Promise(resolve => {
1008
+ // Function like a no-op for dynamic edge cases...
1009
+ if (!this.config.isActivated) return;
1010
+ this._hideComplete = new Promise((resolve) => {
896
1011
  this._hideResolve = resolve;
897
1012
  });
898
1013
 
@@ -900,39 +1015,41 @@ export class OverlayController extends EventTarget {
900
1015
  // while the dialog was open.
901
1016
  // We need this in the _restoreFocus method to determine if we should focus this.elementToFocusAfterHide when the
902
1017
  // dialog is closed or keep focus on the element that the user deliberately gave focus
903
- this.__activeElementRightBeforeHide = /** @type {ShadowRoot} */ (
904
- this.contentNode.getRootNode()
905
- ).activeElement;
906
-
1018
+ this.__activeElementRightBeforeHide =
1019
+ /** @type {ShadowRoot} */ this.contentNode.getRootNode().activeElement;
907
1020
  if (this.manager && this.#isRegisteredOnManager()) {
908
1021
  this.manager.hide(this);
909
1022
  }
910
-
911
1023
  if (!this.isShown) {
912
- /** @type {function} */ (this._hideResolve)();
1024
+ /** @type {function} */ this._hideResolve();
913
1025
  return;
914
1026
  }
915
-
916
- const event = new CustomEvent('before-hide', { cancelable: true });
1027
+ const event = new CustomEvent('before-hide', {
1028
+ cancelable: true,
1029
+ });
917
1030
  this.dispatchEvent(event);
918
1031
  if (!event.defaultPrevented) {
919
1032
  await this._transitionHide({
920
1033
  backdropNode: this.backdropNode,
921
1034
  contentNode: this.contentNode,
922
1035
  });
923
-
924
1036
  if ('HTMLDialogElement' in window && this.__wrappingDialogNode instanceof HTMLDialogElement) {
925
1037
  this.__wrappingDialogNode.close();
926
1038
  }
927
-
928
1039
  // @ts-ignore
929
1040
  this.__wrappingDialogNode.style.display = 'none';
930
- this._handleFeatures({ phase: 'hide' });
931
- this._keepBodySize({ phase: 'hide' });
1041
+ this._handleFeatures({
1042
+ phase: 'hide',
1043
+ });
1044
+ this._keepBodySize({
1045
+ phase: 'hide',
1046
+ });
932
1047
  this.dispatchEvent(new Event('hide'));
933
1048
  this._restoreFocus();
934
1049
  }
935
- /** @type {function} */ (this._hideResolve)();
1050
+ /** @type {function} */
1051
+ this._hideResolve();
1052
+ this.contentNode.removeAttribute('data-open');
936
1053
  }
937
1054
 
938
1055
  /**
@@ -951,8 +1068,13 @@ export class OverlayController extends EventTarget {
951
1068
  // eslint-disable-next-line class-methods-use-this, no-empty-function, no-unused-vars
952
1069
  async _transitionHide({ backdropNode, contentNode }) {
953
1070
  // `this.transitionHide` is a hook for our users
954
- await this.transitionHide({ backdropNode, contentNode });
955
- this._handlePosition({ phase: 'hide' });
1071
+ await this.transitionHide({
1072
+ backdropNode,
1073
+ contentNode,
1074
+ });
1075
+ this._handlePosition({
1076
+ phase: 'hide',
1077
+ });
956
1078
  if (!backdropNode) {
957
1079
  return;
958
1080
  }
@@ -974,8 +1096,10 @@ export class OverlayController extends EventTarget {
974
1096
  // eslint-disable-next-line class-methods-use-this, no-empty-function, no-unused-vars
975
1097
  async _transitionShow(showConfig) {
976
1098
  // `this.transitionShow` is a hook for our users
977
- await this.transitionShow({ backdropNode: this.backdropNode, contentNode: this.contentNode });
978
-
1099
+ await this.transitionShow({
1100
+ backdropNode: this.backdropNode,
1101
+ contentNode: this.contentNode,
1102
+ });
979
1103
  if (showConfig.backdropNode) {
980
1104
  showConfig.backdropNode.classList.add(`overlays__backdrop--animation-in`);
981
1105
  }
@@ -988,19 +1112,18 @@ export class OverlayController extends EventTarget {
988
1112
  const weStillOwnActiveElement =
989
1113
  this.__activeElementRightBeforeHide instanceof HTMLElement &&
990
1114
  this.contentNode.contains(this.__activeElementRightBeforeHide);
991
-
992
1115
  if (!weStillOwnActiveElement) {
993
1116
  return;
994
1117
  }
995
-
996
1118
  if (this.elementToFocusAfterHide instanceof HTMLElement) {
997
1119
  this.elementToFocusAfterHide.focus();
998
- this.elementToFocusAfterHide.scrollIntoView({ block: 'nearest' });
1120
+ this.elementToFocusAfterHide.scrollIntoView({
1121
+ block: 'nearest',
1122
+ });
999
1123
  } else {
1000
- /** @type {HTMLElement} */ (this.__activeElementRightBeforeHide).blur();
1124
+ /** @type {HTMLElement} */ this.__activeElementRightBeforeHide.blur();
1001
1125
  }
1002
1126
  }
1003
-
1004
1127
  async toggle() {
1005
1128
  return this.isShown ? this.hide() : this.show();
1006
1129
  }
@@ -1011,55 +1134,109 @@ export class OverlayController extends EventTarget {
1011
1134
  * @protected
1012
1135
  */
1013
1136
  _handleFeatures({ phase }) {
1014
- this._handleZIndex({ phase });
1015
-
1137
+ this._handleZIndex({
1138
+ phase,
1139
+ });
1016
1140
  if (this.preventsScroll) {
1017
- this._handlePreventsScroll({ phase });
1141
+ this._handlePreventsScroll({
1142
+ phase,
1143
+ });
1018
1144
  }
1019
1145
  if (this.isBlocking) {
1020
- this._handleBlocking({ phase });
1146
+ this._handleBlocking({
1147
+ phase,
1148
+ });
1021
1149
  }
1022
1150
  if (this.hasBackdrop) {
1023
- this._handleBackdrop({ phase });
1151
+ this._handleBackdrop({
1152
+ phase,
1153
+ });
1024
1154
  }
1025
1155
  if (this.trapsKeyboardFocus) {
1026
- this._handleTrapsKeyboardFocus({ phase });
1156
+ this._handleTrapsKeyboardFocus({
1157
+ phase,
1158
+ });
1027
1159
  }
1028
1160
  if (this.hidesOnEsc) {
1029
- this._handleHidesOnEsc({ phase });
1161
+ this._handleHidesOnEsc({
1162
+ phase,
1163
+ });
1030
1164
  }
1031
1165
  if (this.hidesOnOutsideEsc) {
1032
- this._handleHidesOnOutsideEsc({ phase });
1166
+ this._handleHidesOnOutsideEsc({
1167
+ phase,
1168
+ });
1033
1169
  }
1034
1170
  if (this.hidesOnOutsideClick) {
1035
- this._handleHidesOnOutsideClick({ phase });
1171
+ this._handleHidesOnOutsideClick({
1172
+ phase,
1173
+ });
1036
1174
  }
1037
1175
  if (this.handlesAccessibility) {
1038
- this._handleAccessibility({ phase });
1176
+ this._handleAccessibility({
1177
+ phase,
1178
+ });
1039
1179
  }
1040
1180
  if (this.inheritsReferenceWidth) {
1041
1181
  this._handleInheritsReferenceWidth();
1042
1182
  }
1043
1183
  if (this.visibilityTriggerFunction) {
1044
- this._handleVisibilityTriggers({ phase });
1184
+ this._handleVisibilityTriggers({
1185
+ phase,
1186
+ });
1187
+ }
1188
+ if (this.config.syncChildrenCloseState) {
1189
+ this._handleSyncChildrenCloseState({
1190
+ phase,
1191
+ });
1192
+ }
1193
+ if (this.config.elementToFocusOnShow) {
1194
+ this._handleElementToFocusOnShow({
1195
+ phase,
1196
+ });
1197
+ }
1198
+ }
1199
+
1200
+ /**
1201
+ * @param {{phase: OverlayPhase}} opts
1202
+ * @returns {void}
1203
+ */
1204
+ _handleElementToFocusOnShow({ phase }) {
1205
+ if (phase === 'init') {
1206
+ this.contentNode?.setAttribute('tabindex', '-1');
1207
+ } else if (phase === 'teardown') {
1208
+ // TODO: capture initial attr, use Resettable mechanism of VisibilityToggleCtrl in whole Controller
1209
+ this.contentNode?.removeAttribute('tabindex');
1045
1210
  }
1046
1211
  }
1047
1212
 
1213
+ /**
1214
+ * @param {{phase: OverlayPhase}} opts
1215
+ * @returns {void}
1216
+ */
1217
+ _handleSyncChildrenCloseState({ phase }) {
1218
+ if (phase !== 'hide') return;
1219
+ const visibleChildren = this.manager.shownList.filter(
1220
+ (ctrl) => ctrl !== this && deepContains(this.contentNode, ctrl.contentNode),
1221
+ );
1222
+ visibleChildren.forEach((ctrl) => ctrl.hide());
1223
+ }
1224
+
1048
1225
  /**
1049
1226
  * @param {{ phase: OverlayPhase }} config
1050
1227
  */
1051
1228
  _handleVisibilityTriggers({ phase }) {
1052
- if (typeof this.visibilityTriggerFunction === 'function') {
1053
- if (phase === 'init') {
1054
- this.__visibilityTriggerHandler = this.visibilityTriggerFunction({
1055
- phase,
1056
- controller: this,
1057
- });
1058
- }
1059
- if (this.__visibilityTriggerHandler[phase]) {
1060
- this.__visibilityTriggerHandler[phase]();
1061
- }
1229
+ if (typeof this.visibilityTriggerFunction !== 'function') return;
1230
+
1231
+ // Here we initialize the __visibilityTriggerHandler of our invokerNode. It's important that we ONLY do this on init,
1232
+ // otherwise we risk not being able to properly clean up listeners...
1233
+ if (phase === 'init') {
1234
+ this.__visibilityTriggerHandler = this.visibilityTriggerFunction({
1235
+ controller: this,
1236
+ });
1062
1237
  }
1238
+ // Here we run the appropriate lifecycle, if defined in our handler
1239
+ this.__visibilityTriggerHandler[phase]?.();
1063
1240
  }
1064
1241
 
1065
1242
  /**
@@ -1096,7 +1273,6 @@ export class OverlayController extends EventTarget {
1096
1273
  /* no default */
1097
1274
  }
1098
1275
  }
1099
-
1100
1276
  get hasActiveBackdrop() {
1101
1277
  return this.__hasActiveBackdrop;
1102
1278
  }
@@ -1141,7 +1317,7 @@ export class OverlayController extends EventTarget {
1141
1317
  /**
1142
1318
  * @param {KeyboardEvent} event
1143
1319
  */
1144
- #isShiftPressedOnKeyDownHandler = event => {
1320
+ #isShiftPressedOnKeyDownHandler = (event) => {
1145
1321
  if (event.key === 'Shift') {
1146
1322
  this.#isShiftPressed = true;
1147
1323
  }
@@ -1150,26 +1326,23 @@ export class OverlayController extends EventTarget {
1150
1326
  /**
1151
1327
  * @param {KeyboardEvent} event
1152
1328
  */
1153
- #isShiftPressedOnKeyUpHandler = event => {
1329
+ #isShiftPressedOnKeyUpHandler = (event) => {
1154
1330
  if (event.key === 'Shift') {
1155
1331
  this.#isShiftPressed = false;
1156
1332
  }
1157
1333
  };
1158
-
1159
1334
  #handleShiftKeyPress = () => {
1160
1335
  window.addEventListener('keydown', this.#isShiftPressedOnKeyDownHandler);
1161
1336
  window.addEventListener('keyup', this.#isShiftPressedOnKeyUpHandler);
1162
1337
  };
1163
-
1164
1338
  #stopHandlingShiftKeyPress = () => {
1165
1339
  window.removeEventListener('keydown', this.#isShiftPressedOnKeyDownHandler);
1166
1340
  window.removeEventListener('keyup', this.#isShiftPressedOnKeyUpHandler);
1167
1341
  };
1168
-
1169
1342
  #getInitialElementToFocus = () => {
1170
1343
  const focusableElements = getFocusableElements(this.contentNode);
1171
1344
  // Initial focus goes to first element with autofocus, or `contentNode`
1172
- return focusableElements.find(e => e.hasAttribute('autofocus')) || this.contentNode;
1345
+ return focusableElements.find((e) => e.hasAttribute('autofocus')) || this.contentNode;
1173
1346
  };
1174
1347
 
1175
1348
  /**
@@ -1204,7 +1377,6 @@ export class OverlayController extends EventTarget {
1204
1377
  if (phase === 'init') {
1205
1378
  this.contentNode.style.outline = 'none';
1206
1379
  this.contentNode.tabIndex = -1;
1207
-
1208
1380
  const isContentShadowHost = Boolean(this.contentNode.shadowRoot);
1209
1381
  if (isContentShadowHost) {
1210
1382
  // eslint-disable-next-line no-console
@@ -1216,7 +1388,9 @@ export class OverlayController extends EventTarget {
1216
1388
  if (phase === 'show') {
1217
1389
  this.#handleShiftKeyPress();
1218
1390
  this.#handleFocusInsideDialog();
1391
+ // @ts-ignore - HTMLDialogElement methods
1219
1392
  this.__wrappingDialogNode?.close();
1393
+ // @ts-ignore - HTMLDialogElement methods
1220
1394
  this.__wrappingDialogNode?.showModal();
1221
1395
  /**
1222
1396
  * At this moment `#handleFocusInsideDialog` should handle the focus.
@@ -1255,7 +1429,6 @@ export class OverlayController extends EventTarget {
1255
1429
  ) {
1256
1430
  return;
1257
1431
  }
1258
-
1259
1432
  if (this.#hasPressedInside(event)) {
1260
1433
  this.__escKeyHandlerCalled = true;
1261
1434
  this.hide();
@@ -1270,18 +1443,17 @@ export class OverlayController extends EventTarget {
1270
1443
  * @param {KeyboardEvent} event
1271
1444
  * @returns {boolean}
1272
1445
  */
1273
- #hasPressedInside = event =>
1274
- event.composedPath().includes(/** @type {EventTarget} */ (this.__wrappingDialogNode)) ||
1446
+ #hasPressedInside = (event) =>
1447
+ event.composedPath().includes(/** @type {EventTarget} */ this.__wrappingDialogNode) ||
1275
1448
  (this.invokerNode && event.composedPath().includes(this.invokerNode)) ||
1276
- deepContains(this.contentNode, /** @type {HTMLElement|ShadowRoot} */ (event.target));
1449
+ deepContains(this.contentNode, /** @type {HTMLElement|ShadowRoot} */ event.target);
1277
1450
 
1278
1451
  /**
1279
1452
  * @param {KeyboardEvent} event
1280
1453
  * @returns {void}
1281
1454
  */
1282
- #outsideEscKeyHandler = event => {
1455
+ #outsideEscKeyHandler = (event) => {
1283
1456
  if (event.key !== 'Escape') return;
1284
-
1285
1457
  if (this.#hasPressedInside(event)) return;
1286
1458
  this.hide();
1287
1459
  };
@@ -1353,7 +1525,6 @@ export class OverlayController extends EventTarget {
1353
1525
  */
1354
1526
  _handleHidesOnOutsideClick({ phase }) {
1355
1527
  const addOrRemoveListener = phase === 'show' ? 'addEventListener' : 'removeEventListener';
1356
-
1357
1528
  if (phase === 'show') {
1358
1529
  /**
1359
1530
  * We listen to click (more specifically mouseup and mousedown) events
@@ -1381,7 +1552,6 @@ export class OverlayController extends EventTarget {
1381
1552
  // [1]. was mousedown inside content or invoker
1382
1553
  wasMouseDownInside = true;
1383
1554
  };
1384
-
1385
1555
  this.__onInsideMouseUp = () => {
1386
1556
  // [3]. was mouseup inside content or invoker
1387
1557
  wasMouseUpInside = true;
@@ -1410,7 +1580,6 @@ export class OverlayController extends EventTarget {
1410
1580
  });
1411
1581
  };
1412
1582
  }
1413
-
1414
1583
  this.contentWrapperNode[addOrRemoveListener](
1415
1584
  'mousedown',
1416
1585
  /** @type {EventListenerOrEventListenerObject} */
@@ -1421,7 +1590,7 @@ export class OverlayController extends EventTarget {
1421
1590
  this.contentWrapperNode[addOrRemoveListener](
1422
1591
  'mouseup',
1423
1592
  /** @type {EventListenerOrEventListenerObject} */
1424
- (this.__onInsideMouseUp),
1593
+ this.__onInsideMouseUp,
1425
1594
  true,
1426
1595
  );
1427
1596
  if (this.invokerNode) {
@@ -1437,7 +1606,7 @@ export class OverlayController extends EventTarget {
1437
1606
  this.invokerNode[addOrRemoveListener](
1438
1607
  'mouseup',
1439
1608
  /** @type {EventListenerOrEventListenerObject} */
1440
- (this.__onInsideMouseUp),
1609
+ this.__onInsideMouseUp,
1441
1610
  true,
1442
1611
  );
1443
1612
  }
@@ -1462,23 +1631,50 @@ export class OverlayController extends EventTarget {
1462
1631
  */
1463
1632
  _handleAccessibility({ phase }) {
1464
1633
  if (phase === 'init' || phase === 'teardown') {
1465
- this.__setupTeardownAccessibility({ phase });
1634
+ this.__setupTeardownAccessibility({
1635
+ phase,
1636
+ });
1466
1637
  }
1467
1638
  const isModal = this.trapsKeyboardFocus;
1468
1639
  if (this.invokerNode && !this.isTooltip && !isModal) {
1469
1640
  this.invokerNode.setAttribute('aria-expanded', `${phase === 'show'}`);
1470
1641
  }
1471
1642
  }
1472
-
1473
1643
  teardown() {
1474
- this.__handleOverlayStyles({ phase: 'teardown' });
1644
+ if (!this.__hasSetup) return;
1645
+ this.__handleOverlayStyles({
1646
+ phase: 'teardown',
1647
+ });
1475
1648
  if (this.isShown) {
1476
- this._keepBodySize({ phase: 'teardown' });
1649
+ this._keepBodySize({
1650
+ phase: 'teardown',
1651
+ });
1477
1652
  }
1478
- this._handleFeatures({ phase: 'teardown' });
1653
+ this._handleFeatures({
1654
+ phase: 'teardown',
1655
+ });
1479
1656
  if (this.#isRegisteredOnManager()) {
1480
1657
  this.manager.remove(this);
1481
1658
  }
1659
+ this.contentNode?.removeEventListener('click', this.#hideOnCloseButtonClick);
1660
+
1661
+ // if (this.config._shouldTeardownDomStructure) {
1662
+ this.__rearrangeNodesCleanup?.();
1663
+ this.__rearrangeNodesCleanup = undefined;
1664
+ // }
1665
+ this.__teardownVisibility();
1666
+
1667
+ // When we created the contentWrapperNode/wrapping <dialog> ourselves, restore the
1668
+ // original dom structure and drop the (now detached) references, so that a
1669
+ // subsequent setup recreates them and `contentWrapperNode`/`content` no longer
1670
+ // expose stale nodes.
1671
+ if (this.contentWrapperNode !== this.contentNode) {
1672
+ this.contentWrapperNode?.removeAttribute('style');
1673
+ this.contentWrapperNode?.removeAttribute('class');
1674
+ this.__contentWrapperNode = undefined;
1675
+ this.__wrappingDialogNode = undefined;
1676
+ }
1677
+ this.__hasSetup = false;
1482
1678
  }
1483
1679
 
1484
1680
  /** @private */
@@ -1487,11 +1683,10 @@ export class OverlayController extends EventTarget {
1487
1683
  this._popper.destroy();
1488
1684
  this._popper = undefined;
1489
1685
  }
1490
-
1491
1686
  if (OverlayController.popperModule !== undefined) {
1492
1687
  const { createPopper } = await OverlayController.popperModule;
1493
1688
  this._popper = createPopper(
1494
- /** @type {HTMLElement} */ (this._referenceNode),
1689
+ /** @type {HTMLElement} */ this._referenceNode,
1495
1690
  this.contentWrapperNode,
1496
1691
  {
1497
1692
  ...this.config?.popperConfig,
@@ -1499,11 +1694,10 @@ export class OverlayController extends EventTarget {
1499
1694
  );
1500
1695
  }
1501
1696
  }
1502
-
1503
1697
  _hasDisabledInvoker() {
1504
1698
  if (this.invokerNode) {
1505
1699
  return (
1506
- /** @type {HTMLElement & { disabled: boolean }} */ (this.invokerNode).disabled ||
1700
+ /** @type {HTMLElement & { disabled: boolean }} */ this.invokerNode.disabled ||
1507
1701
  this.invokerNode.getAttribute('aria-disabled') === 'true'
1508
1702
  );
1509
1703
  }