@lion/ui 0.23.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 (787) hide show
  1. package/README.md +50 -20
  2. package/components/accordion/src/LionAccordion.js +31 -42
  3. package/components/accordion/test/lion-accordion.test.js +108 -134
  4. package/components/button/src/LionButton.js +9 -12
  5. package/components/button/src/LionButtonReset.js +0 -5
  6. package/components/button/src/LionButtonSubmit.js +7 -12
  7. package/components/button/test/demos.screenshots-test.js +50 -11
  8. package/components/button/test/lion-button.test.js +0 -1
  9. package/components/button/test-suites/LionButton.suite.js +135 -145
  10. package/components/button/test-suites/LionButtonReset.suite.js +54 -72
  11. package/components/button/test-suites/LionButtonSubmit.suite.js +49 -68
  12. package/components/calendar/src/LionCalendar.js +151 -104
  13. package/components/calendar/src/calendarStyle.js +0 -1
  14. package/components/calendar/src/utils/createMonth.js +3 -4
  15. package/components/calendar/src/utils/createMultipleMonth.js +15 -7
  16. package/components/calendar/src/utils/createWeek.js +0 -2
  17. package/components/calendar/src/utils/dataTemplate.js +8 -4
  18. package/components/calendar/src/utils/dayTemplate.js +0 -6
  19. package/components/calendar/src/utils/getDayMonthYear.js +6 -2
  20. package/components/calendar/test/demos.screenshots-test.js +40 -9
  21. package/components/calendar/test/lion-calendar.test.js +171 -282
  22. package/components/calendar/test/utils/createMonth.test.js +61 -22
  23. package/components/calendar/test/utils/createMultipleMonth.test.js +14 -7
  24. package/components/calendar/test/utils/createWeek.test.js +51 -17
  25. package/components/calendar/test/utils/dataTemplate.test.js +3 -4
  26. package/components/calendar/test/utils/dayTemplate.test.js +106 -34
  27. package/components/calendar/test/utils/getFirstDayNextMonth.test.js +0 -1
  28. package/components/calendar/test/utils/getLastDayPreviousMonth.test.js +0 -1
  29. package/components/calendar/test/utils/isSameDate.test.js +0 -1
  30. package/components/calendar/test/utils/snapshots/monthTemplate_en-GB_Sunday_2018-12.js +1 -2
  31. package/components/calendar/test-helpers/CalendarObject.js +31 -62
  32. package/components/calendar/test-helpers/DayObject.js +7 -15
  33. package/components/calendar/test-suites/LionCalendar.suite.js +7 -9
  34. package/components/checkbox-group/src/LionCheckboxIndeterminate.js +17 -30
  35. package/components/checkbox-group/test/lion-checkbox-group-integrations.test.js +0 -1
  36. package/components/checkbox-group/test/lion-checkbox-group.test.js +21 -16
  37. package/components/checkbox-group/test/lion-checkbox-indeterminate-integrations.test.js +3 -3
  38. package/components/checkbox-group/test/lion-checkbox-integrations.test.js +3 -2
  39. package/components/checkbox-group/test/lion-checkbox.test.js +30 -16
  40. package/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.js +147 -191
  41. package/components/collapsible/src/LionCollapsible.js +10 -15
  42. package/components/collapsible/test/lion-collapsible.test.js +4 -18
  43. package/components/combobox/src/LionCombobox.js +35 -53
  44. package/components/combobox/src/utils/makeMatchingTextBold.js +2 -5
  45. package/components/combobox/src/validators.js +0 -1
  46. package/components/combobox/test/lion-combobox-integrations.test.js +6 -6
  47. package/components/combobox/test/lion-combobox.test.js +576 -869
  48. package/components/combobox/test/validators.test.js +6 -13
  49. package/components/combobox/test-helpers/combobox-helpers.js +24 -11
  50. package/components/core/src/DisabledMixin.js +61 -66
  51. package/components/core/src/DisabledWithTabIndexMixin.js +76 -83
  52. package/components/core/src/EventTargetShim.js +1 -4
  53. package/components/core/src/ScopedElementsMixin.js +4 -15
  54. package/components/core/src/ScopedStylesController.js +1 -5
  55. package/components/core/src/SlotMixin.js +236 -239
  56. package/components/core/src/browserDetection.js +5 -12
  57. package/components/core/test/DisabledMixin.test.js +24 -39
  58. package/components/core/test/DisabledWithTabIndexMixin.test.js +21 -34
  59. package/components/core/test/EventTargetShim.test.js +0 -8
  60. package/components/core/test/ScopedElementsMixin.test.js +22 -38
  61. package/components/core/test/ScopedStylesController.test.js +11 -20
  62. package/components/core/test/SlotMixin.test.js +102 -154
  63. package/components/core/test-helpers/getCachedFixture.js +5 -11
  64. package/components/core/types/SlotMixinTypes.ts +8 -3
  65. package/components/dialog/src/LionDialog.js +4 -3
  66. package/components/dialog/test/lion-dialog.integration.test.js +10 -20
  67. package/components/dialog/test/lion-dialog.test.js +48 -62
  68. package/components/dialog/test-helpers/test-router.js +4 -6
  69. package/components/drawer/src/LionDrawer.js +18 -34
  70. package/components/drawer/src/drawerStyle.js +0 -1
  71. package/components/drawer/test/lion-drawer.test.js +1 -17
  72. package/components/fieldset/test/lion-fieldset.test.js +6 -4
  73. package/components/form/src/LionForm.js +18 -13
  74. package/components/form/test/lion-form.test.js +22 -52
  75. package/components/form-core/src/FocusMixin.js +172 -174
  76. package/components/form-core/src/FormControlMixin.js +811 -813
  77. package/components/form-core/src/FormatMixin.js +537 -537
  78. package/components/form-core/src/InteractionStateMixin.js +196 -183
  79. package/components/form-core/src/LionField.js +9 -5
  80. package/components/form-core/src/NativeTextFieldMixin.js +114 -116
  81. package/components/form-core/src/choice-group/ChoiceGroupMixin.js +322 -364
  82. package/components/form-core/src/choice-group/ChoiceInputMixin.js +306 -296
  83. package/components/form-core/src/choice-group/CustomChoiceGroupMixin.js +114 -139
  84. package/components/form-core/src/form-group/FormElementsHaveNoError.js +0 -2
  85. package/components/form-core/src/form-group/FormGroupMixin.js +551 -557
  86. package/components/form-core/src/registration/FormRegisteringMixin.js +72 -71
  87. package/components/form-core/src/registration/FormRegistrarMixin.js +201 -217
  88. package/components/form-core/src/registration/FormRegistrarPortalMixin.js +31 -37
  89. package/components/form-core/src/utils/SyncUpdatableMixin.js +106 -117
  90. package/components/form-core/src/utils/getAriaElementsInRightDomOrder.js +1 -2
  91. package/components/form-core/src/validate/LionValidationFeedback.js +12 -8
  92. package/components/form-core/src/validate/Unparseable.js +4 -2
  93. package/components/form-core/src/validate/ValidateMixin.js +829 -883
  94. package/components/form-core/src/validate/Validator.js +3 -6
  95. package/components/form-core/src/validate/resultValidators/DefaultSuccess.js +1 -2
  96. package/components/form-core/src/validate/validators/DateValidators.js +0 -5
  97. package/components/form-core/src/validate/validators/NumberValidators.js +1 -5
  98. package/components/form-core/src/validate/validators/Required.js +1 -1
  99. package/components/form-core/src/validate/validators/StringValidators.js +1 -8
  100. package/components/form-core/test/FocusMixin.test.js +96 -82
  101. package/components/form-core/test/FormControlMixin.test.js +120 -176
  102. package/components/form-core/test/FormRegistrationMixins.test.js +0 -2
  103. package/components/form-core/test/FormatMixin.test.js +0 -1
  104. package/components/form-core/test/InteractionStateMixin.test.js +0 -1
  105. package/components/form-core/test/NativeTextFieldMixin.test.js +0 -1
  106. package/components/form-core/test/choice-group/ChoiceGroupMixin.test.js +0 -1
  107. package/components/form-core/test/choice-group/ChoiceInputMixin.test.js +0 -1
  108. package/components/form-core/test/choice-group/CustomChoiceGroupMixin.integrations.test.js +6 -8
  109. package/components/form-core/test/choice-group/CustomChoiceGroupMixin.test.js +0 -3
  110. package/components/form-core/test/form-group/FormGroupMixin.test.js +0 -1
  111. package/components/form-core/test/lion-field.test.js +88 -98
  112. package/components/form-core/test/utils/SyncUpdatableMixin.test.js +51 -65
  113. package/components/form-core/test/utils/getAriaElementsInRightDomOrder.test.js +3 -3
  114. package/components/form-core/test/validate/DateValidators.test.js +5 -27
  115. package/components/form-core/test/validate/NumberValidators.test.js +4 -16
  116. package/components/form-core/test/validate/Required.test.js +8 -21
  117. package/components/form-core/test/validate/ResultValidator.test.js +1 -2
  118. package/components/form-core/test/validate/StringValidators.test.js +4 -35
  119. package/components/form-core/test/validate/ValidateMixin.test.js +0 -1
  120. package/components/form-core/test/validate/ValidateMixinFeedbackPart.test.js +0 -1
  121. package/components/form-core/test/validate/Validator.test.js +39 -34
  122. package/components/form-core/test/validate/lion-validation-feedback.test.js +81 -43
  123. package/components/form-core/test-helpers/ExampleValidators.js +0 -5
  124. package/components/form-core/test-helpers/getFormControlMembers.js +2 -2
  125. package/components/form-core/test-helpers/mimicUserInput.js +5 -1
  126. package/components/form-core/test-suites/FormRegistrationMixins.suite.js +65 -122
  127. package/components/form-core/test-suites/FormatMixin.suite.js +202 -227
  128. package/components/form-core/test-suites/InteractionStateMixin.suite.js +47 -60
  129. package/components/form-core/test-suites/NativeTextFieldMixin.suite.js +8 -11
  130. package/components/form-core/test-suites/ValidateMixin.suite.js +280 -359
  131. package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +112 -163
  132. package/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.js +185 -218
  133. package/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.js +116 -109
  134. package/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.js +36 -70
  135. package/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.js +57 -65
  136. package/components/form-core/test-suites/form-group/FormGroupMixin.suite.js +664 -523
  137. package/components/form-core/translations/bg-BG.js +0 -1
  138. package/components/form-core/translations/cs-CZ.js +0 -1
  139. package/components/form-core/translations/de-DE.js +0 -1
  140. package/components/form-core/translations/en-AU.js +0 -1
  141. package/components/form-core/translations/en-GB.js +0 -1
  142. package/components/form-core/translations/en-US.js +0 -1
  143. package/components/form-core/translations/es-ES.js +0 -1
  144. package/components/form-core/translations/fr-BE.js +0 -1
  145. package/components/form-core/translations/fr-FR.js +0 -1
  146. package/components/form-core/translations/hu-HU.js +0 -1
  147. package/components/form-core/translations/it-IT.js +0 -1
  148. package/components/form-core/translations/nl-BE.js +0 -1
  149. package/components/form-core/translations/nl-NL.js +0 -1
  150. package/components/form-core/translations/pl-PL.js +0 -1
  151. package/components/form-core/translations/ro-RO.js +0 -1
  152. package/components/form-core/translations/ru-RU.js +0 -1
  153. package/components/form-core/translations/sk-SK.js +0 -1
  154. package/components/form-core/translations/tr-TR.js +0 -1
  155. package/components/form-core/translations/uk-UA.js +0 -1
  156. package/components/form-integrations/test/dialog-integrations.test.js +1 -4
  157. package/components/form-integrations/test/form-group-methods.test.js +28 -31
  158. package/components/form-integrations/test/form-integrations.test.js +27 -28
  159. package/components/form-integrations/test/form-validation-integrations.test.js +21 -29
  160. package/components/form-integrations/test/helpers/umbrella-form.js +3 -5
  161. package/components/form-integrations/test/model-value-consistency.test.js +75 -77
  162. package/components/form-integrations/test/model-value-event.test.js +10 -20
  163. package/components/helpers/src/SbActionLogger.js +13 -17
  164. package/components/helpers/src/SbLocaleSwitcher.js +5 -5
  165. package/components/helpers/src/sortEachDepth.js +0 -2
  166. package/components/helpers/test/renderLitAsNode.test.js +0 -4
  167. package/components/helpers/test/sb-action-logger.test.js +24 -55
  168. package/components/icon/src/IconManager.js +0 -2
  169. package/components/icon/src/LionIcon.js +2 -7
  170. package/components/icon/src/icons.js +0 -2
  171. package/components/icon/test/IconManager.test.js +0 -15
  172. package/components/icon/test/hammer.svg.js +3 -4
  173. package/components/icon/test/heart.svg.js +3 -4
  174. package/components/icon/test/lion-icon.test.js +14 -43
  175. package/components/input/src/LionInput.js +2 -8
  176. package/components/input/test/input-integrations.test.js +0 -5
  177. package/components/input/test/lion-input-integrations.test.js +0 -4
  178. package/components/input/test/lion-input.test.js +28 -58
  179. package/components/input/test-helpers/getInputMembers.js +2 -2
  180. package/components/input-amount/src/LionInputAmount.js +20 -20
  181. package/components/input-amount/src/formatters.js +0 -3
  182. package/components/input-amount/src/parsers.js +0 -3
  183. package/components/input-amount/test/formatters.test.js +24 -16
  184. package/components/input-amount/test/lion-input-amount-integrations.test.js +0 -4
  185. package/components/input-amount/test/lion-input-amount.test.js +123 -147
  186. package/components/input-amount/test/parsers.test.js +33 -17
  187. package/components/input-amount/test/preprocessors.test.js +0 -3
  188. package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +49 -59
  189. package/components/input-amount-dropdown/src/currencyUtil.js +8 -7
  190. package/components/input-amount-dropdown/src/parsers.js +0 -1
  191. package/components/input-amount-dropdown/src/validators.js +0 -1
  192. package/components/input-amount-dropdown/test/LionInputAmountDropdown.test.js +34 -36
  193. package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +18 -13
  194. package/components/input-amount-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
  195. package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +132 -107
  196. package/components/input-date/src/LionInputDate.js +4 -3
  197. package/components/input-date/test/lion-input-date-integrations.test.js +0 -3
  198. package/components/input-date/test/lion-input-date.test.js +19 -32
  199. package/components/input-datepicker/src/LionInputDatepicker.js +17 -29
  200. package/components/input-datepicker/src/localizeNamespaceLoader.js +1 -2
  201. package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +0 -3
  202. package/components/input-datepicker/test/lion-input-datepicker.test.js +88 -153
  203. package/components/input-datepicker/test-helpers/DatepickerInputObject.js +9 -12
  204. package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +6 -4
  205. package/components/input-datepicker/translations/bg-BG.js +0 -1
  206. package/components/input-datepicker/translations/cs-CZ.js +0 -1
  207. package/components/input-datepicker/translations/de-DE.js +0 -1
  208. package/components/input-datepicker/translations/en-AU.js +0 -1
  209. package/components/input-datepicker/translations/en-GB.js +0 -1
  210. package/components/input-datepicker/translations/en-US.js +0 -1
  211. package/components/input-datepicker/translations/es-ES.js +0 -1
  212. package/components/input-datepicker/translations/fr-BE.js +0 -1
  213. package/components/input-datepicker/translations/fr-FR.js +0 -1
  214. package/components/input-datepicker/translations/hu-HU.js +0 -1
  215. package/components/input-datepicker/translations/it-IT.js +0 -1
  216. package/components/input-datepicker/translations/nl-BE.js +0 -1
  217. package/components/input-datepicker/translations/nl-NL.js +0 -1
  218. package/components/input-datepicker/translations/pl-PL.js +0 -1
  219. package/components/input-datepicker/translations/ro-RO.js +0 -1
  220. package/components/input-datepicker/translations/ru-RU.js +0 -1
  221. package/components/input-datepicker/translations/sk-SK.js +0 -1
  222. package/components/input-datepicker/translations/tr-TR.js +0 -1
  223. package/components/input-datepicker/translations/uk-UA.js +0 -1
  224. package/components/input-email/test/lion-input-email-integrations.test.js +0 -2
  225. package/components/input-email/test/lion-input-email.test.js +1 -7
  226. package/components/input-file/src/FileHandle.js +0 -3
  227. package/components/input-file/src/LionInputFile.js +85 -83
  228. package/components/input-file/src/LionSelectedFileList.js +12 -12
  229. package/components/input-file/src/validators.js +10 -9
  230. package/components/input-file/test/FileValidators.test.js +170 -80
  231. package/components/input-file/test/lion-input-file.test.js +160 -244
  232. package/components/input-file/test/lion-selected-file-list.test.js +13 -22
  233. package/components/input-file/translations/bg-BG.js +0 -1
  234. package/components/input-file/translations/cs-CZ.js +0 -1
  235. package/components/input-file/translations/de-DE.js +0 -1
  236. package/components/input-file/translations/en-AU.js +0 -1
  237. package/components/input-file/translations/en-GB.js +0 -1
  238. package/components/input-file/translations/en-PH.js +0 -1
  239. package/components/input-file/translations/en-US.js +0 -1
  240. package/components/input-file/translations/en.js +2 -1
  241. package/components/input-file/translations/es-ES.js +0 -1
  242. package/components/input-file/translations/fr-BE.js +0 -1
  243. package/components/input-file/translations/fr-FR.js +0 -1
  244. package/components/input-file/translations/hu-HU.js +0 -1
  245. package/components/input-file/translations/id-ID.js +0 -1
  246. package/components/input-file/translations/id.js +2 -1
  247. package/components/input-file/translations/it-IT.js +0 -1
  248. package/components/input-file/translations/nl-BE.js +0 -1
  249. package/components/input-file/translations/nl-NL.js +0 -1
  250. package/components/input-file/translations/pl-PL.js +0 -1
  251. package/components/input-file/translations/ro-RO.js +0 -1
  252. package/components/input-file/translations/ru-RU.js +0 -1
  253. package/components/input-file/translations/sk-SK.js +0 -1
  254. package/components/input-file/translations/uk-UA.js +0 -1
  255. package/components/input-file/translations/zh-CN.js +0 -1
  256. package/components/input-iban/src/validators.js +6 -11
  257. package/components/input-iban/test/formatters.test.js +0 -3
  258. package/components/input-iban/test/lion-input-iban-integrations.test.js +0 -2
  259. package/components/input-iban/test/lion-input-iban.test.js +1 -9
  260. package/components/input-iban/test/parsers.test.js +0 -2
  261. package/components/input-iban/test/validators.test.js +0 -12
  262. package/components/input-iban/translations/bg-BG.js +0 -1
  263. package/components/input-iban/translations/cs-CZ.js +0 -1
  264. package/components/input-iban/translations/de-DE.js +0 -1
  265. package/components/input-iban/translations/en-AU.js +0 -1
  266. package/components/input-iban/translations/en-GB.js +0 -1
  267. package/components/input-iban/translations/en-US.js +0 -1
  268. package/components/input-iban/translations/es-ES.js +0 -1
  269. package/components/input-iban/translations/fr-BE.js +0 -1
  270. package/components/input-iban/translations/fr-FR.js +0 -1
  271. package/components/input-iban/translations/hu-HU.js +0 -1
  272. package/components/input-iban/translations/it-IT.js +0 -1
  273. package/components/input-iban/translations/nl-BE.js +0 -1
  274. package/components/input-iban/translations/nl-NL.js +0 -1
  275. package/components/input-iban/translations/pl-PL.js +0 -1
  276. package/components/input-iban/translations/ro-RO.js +0 -1
  277. package/components/input-iban/translations/ru-RU.js +0 -1
  278. package/components/input-iban/translations/sk-SK.js +0 -1
  279. package/components/input-iban/translations/uk-UA.js +0 -1
  280. package/components/input-range/src/LionInputRange.js +18 -19
  281. package/components/input-range/test/lion-input-range.test.js +23 -48
  282. package/components/input-range/translations/bg-BG.js +0 -1
  283. package/components/input-range/translations/cs-CZ.js +0 -1
  284. package/components/input-range/translations/de-DE.js +0 -1
  285. package/components/input-range/translations/en-AU.js +0 -1
  286. package/components/input-range/translations/en-GB.js +0 -1
  287. package/components/input-range/translations/en-PH.js +0 -1
  288. package/components/input-range/translations/en-US.js +0 -1
  289. package/components/input-range/translations/es-ES.js +0 -1
  290. package/components/input-range/translations/fr-BE.js +0 -1
  291. package/components/input-range/translations/fr-FR.js +0 -1
  292. package/components/input-range/translations/hu-HU.js +0 -1
  293. package/components/input-range/translations/it-IT.js +0 -1
  294. package/components/input-range/translations/nl-BE.js +0 -1
  295. package/components/input-range/translations/nl-NL.js +0 -1
  296. package/components/input-range/translations/pl-PL.js +0 -1
  297. package/components/input-range/translations/ro-RO.js +0 -1
  298. package/components/input-range/translations/ru-RU.js +0 -1
  299. package/components/input-range/translations/sk-SK.js +0 -1
  300. package/components/input-range/translations/uk-UA.js +0 -1
  301. package/components/input-range/translations/zh-CN.js +0 -1
  302. package/components/input-stepper/src/LionInputStepper.js +19 -38
  303. package/components/input-stepper/test/lion-input-stepper-integrations.test.js +0 -1
  304. package/components/input-stepper/test/lion-input-stepper.test.js +0 -1
  305. package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +0 -2
  306. package/components/input-stepper/test-suites/lion-input-stepper.suite.js +56 -105
  307. package/components/input-stepper/translations/bg-BG.js +0 -1
  308. package/components/input-stepper/translations/cs-CZ.js +0 -1
  309. package/components/input-stepper/translations/de-DE.js +0 -1
  310. package/components/input-stepper/translations/en-AU.js +0 -1
  311. package/components/input-stepper/translations/en-GB.js +0 -1
  312. package/components/input-stepper/translations/en-US.js +0 -1
  313. package/components/input-stepper/translations/es-ES.js +0 -1
  314. package/components/input-stepper/translations/fr-BE.js +0 -1
  315. package/components/input-stepper/translations/fr-FR.js +0 -1
  316. package/components/input-stepper/translations/hu-HU.js +0 -1
  317. package/components/input-stepper/translations/it-IT.js +0 -1
  318. package/components/input-stepper/translations/nl-BE.js +0 -1
  319. package/components/input-stepper/translations/nl-NL.js +0 -1
  320. package/components/input-stepper/translations/pl-PL.js +0 -1
  321. package/components/input-stepper/translations/ro-RO.js +0 -1
  322. package/components/input-stepper/translations/ru-RU.js +0 -1
  323. package/components/input-stepper/translations/sk-SK.js +0 -1
  324. package/components/input-stepper/translations/uk-UA.js +0 -1
  325. package/components/input-tel/src/LionInputTel.js +53 -37
  326. package/components/input-tel/src/PhoneUtilManager.js +6 -4
  327. package/components/input-tel/src/formatters.js +12 -10
  328. package/components/input-tel/src/parsers.js +3 -3
  329. package/components/input-tel/src/preprocessors.js +15 -7
  330. package/components/input-tel/src/validators.js +4 -6
  331. package/components/input-tel/test/LionInputTel.test.js +4 -2
  332. package/components/input-tel/test/formatters.test.js +22 -10
  333. package/components/input-tel/test/parsers.test.js +40 -11
  334. package/components/input-tel/test/preprocessors.test.js +24 -13
  335. package/components/input-tel/test/validators.test.js +7 -14
  336. package/components/input-tel/test-helpers/mockPhoneUtilManager.js +7 -6
  337. package/components/input-tel/test-suites/LionInputTel.suite.js +33 -73
  338. package/components/input-tel/translations/bg-BG.js +0 -1
  339. package/components/input-tel/translations/cs-CZ.js +0 -1
  340. package/components/input-tel/translations/de-DE.js +0 -1
  341. package/components/input-tel/translations/en-AU.js +0 -1
  342. package/components/input-tel/translations/en-GB.js +0 -1
  343. package/components/input-tel/translations/en-US.js +0 -1
  344. package/components/input-tel/translations/es-ES.js +0 -1
  345. package/components/input-tel/translations/fr-BE.js +0 -1
  346. package/components/input-tel/translations/fr-FR.js +0 -1
  347. package/components/input-tel/translations/hu-HU.js +0 -1
  348. package/components/input-tel/translations/it-IT.js +0 -1
  349. package/components/input-tel/translations/nl-BE.js +0 -1
  350. package/components/input-tel/translations/nl-NL.js +0 -1
  351. package/components/input-tel/translations/pl-PL.js +0 -1
  352. package/components/input-tel/translations/ro-RO.js +0 -1
  353. package/components/input-tel/translations/ru-RU.js +0 -1
  354. package/components/input-tel/translations/sk-SK.js +0 -1
  355. package/components/input-tel/translations/uk-UA.js +0 -1
  356. package/components/input-tel-dropdown/src/LionInputTelDropdown.js +10 -28
  357. package/components/input-tel-dropdown/src/regionCodeToLocale.js +3 -1
  358. package/components/input-tel-dropdown/test/LionInputTelDropdown.test.js +31 -38
  359. package/components/input-tel-dropdown/test/regionCodeToLocale.test.js +0 -1
  360. package/components/input-tel-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
  361. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.js +16 -11
  362. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +54 -79
  363. package/components/listbox/src/LionListbox.js +4 -1
  364. package/components/listbox/src/LionOption.js +8 -7
  365. package/components/listbox/src/LionOptions.js +0 -3
  366. package/components/listbox/src/ListboxMixin.js +786 -820
  367. package/components/listbox/test/lion-listbox.test.js +0 -1
  368. package/components/listbox/test/lion-option.test.js +53 -64
  369. package/components/listbox/test/lion-options.test.js +3 -4
  370. package/components/listbox/test-helpers/getListboxMembers.js +6 -3
  371. package/components/listbox/test-suites/ListboxMixin.suite.js +101 -261
  372. package/components/localize/src/LocalizeManager.js +40 -40
  373. package/components/localize/src/LocalizeMixin.js +130 -157
  374. package/components/localize/src/date/formatDate.js +1 -5
  375. package/components/localize/src/date/getDateFormatBasedOnLocale.js +5 -3
  376. package/components/localize/src/date/getMonthNames.js +3 -5
  377. package/components/localize/src/date/getWeekdayNames.js +1 -5
  378. package/components/localize/src/date/parseDate.js +5 -20
  379. package/components/localize/src/date/utils/normalizeIntlDate.js +0 -7
  380. package/components/localize/src/getLocalizeManager.js +0 -3
  381. package/components/localize/src/number/formatNumber.js +3 -7
  382. package/components/localize/src/number/formatNumberToParts.js +52 -18
  383. package/components/localize/src/number/getCurrencyName.js +5 -5
  384. package/components/localize/src/number/getFractionDigits.js +4 -4
  385. package/components/localize/src/number/getSeparatorsFromNumber.js +1 -3
  386. package/components/localize/src/number/parseNumber.js +0 -3
  387. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceAddGroupSeparators.js +0 -1
  388. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceSpaceBetweenCurrencyCodeAndNumber.js +4 -1
  389. package/components/localize/test/LocalizeManager.test.js +385 -278
  390. package/components/localize/test/LocalizeMixin.test.js +28 -112
  391. package/components/localize/test/date/formatDate.test.js +18 -48
  392. package/components/localize/test/date/getDateFormatBasedOnLocale.test.js +0 -3
  393. package/components/localize/test/date/getMonthNames.test.js +27 -12
  394. package/components/localize/test/date/getWeekdayNames.test.js +93 -49
  395. package/components/localize/test/date/normalizeDateTime.test.js +0 -2
  396. package/components/localize/test/date/parseDate.test.js +12 -16
  397. package/components/localize/test/getLocalizeManager.test.js +0 -3
  398. package/components/localize/test/isLocalizeESModule.test.js +32 -13
  399. package/components/localize/test/localize.test.js +0 -4
  400. package/components/localize/test/number/formatNumber.test.js +215 -106
  401. package/components/localize/test/number/formatNumberToParts.test.js +31 -38
  402. package/components/localize/test/number/getCurrencyName.test.js +20 -6
  403. package/components/localize/test/number/getDecimalSeparator.test.js +5 -4
  404. package/components/localize/test/number/getFractionDigits.test.js +0 -2
  405. package/components/localize/test/number/getGroupSeparator.test.js +0 -2
  406. package/components/localize/test/number/getSeparatorsFromNumber.test.js +5 -3
  407. package/components/localize/test/number/parseNumber.test.js +123 -56
  408. package/components/localize/test/side-effect-free-entrypoint.test.js +0 -6
  409. package/components/localize/test-helpers/fake-imports.js +11 -6
  410. package/components/localize/test-helpers/localizeTearDown.js +0 -1
  411. package/components/menu/src/InteractiveListMixin.js +637 -638
  412. package/components/menu/src/LionMenu.js +46 -59
  413. package/components/menu/src/MoreButtonMenuMixin.js +215 -238
  414. package/components/menu/src/MultiLevelListMixin.js +240 -246
  415. package/components/menu/src/utils/isInView.js +0 -1
  416. package/components/menu/src/utils/listItemInteractions.js +4 -4
  417. package/components/menu/test/InteractiveListMixin.test.js +0 -1
  418. package/components/menu/test/MoreButtonMenuMixin.test.js +3 -2
  419. package/components/menu/test/MultiLevelListMixin.test.js +0 -1
  420. package/components/menu/test/lion-menu-interactions.test.js +0 -1
  421. package/components/menu/test/lion-menu.test.js +6 -2
  422. package/components/menu/test-helpers/mimicKeyPress.js +12 -2
  423. package/components/menu/test-suites/InteractiveListMixin.suite.js +4 -43
  424. package/components/menu/test-suites/LionMenu.suite.js +1 -8
  425. package/components/menu/test-suites/LionMenuInteractions.suite.js +22 -44
  426. package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +34 -41
  427. package/components/menu/test-suites/MultiLevelListMixin.suite.js +5 -23
  428. package/components/overlays/src/ArrowMixin.js +111 -127
  429. package/components/overlays/src/OverlayController.js +166 -151
  430. package/components/overlays/src/OverlayMixin.js +61 -63
  431. package/components/overlays/src/OverlaysManager.js +30 -32
  432. package/components/overlays/src/configurations/visibility-trigger-partials/withClickInteraction.js +0 -1
  433. package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +11 -11
  434. package/components/overlays/src/configurations/withBottomSheetConfig.js +12 -13
  435. package/components/overlays/src/configurations/withDropdownConfig.js +4 -2
  436. package/components/overlays/src/configurations/withModalDialogConfig.js +12 -13
  437. package/components/overlays/src/configurations/withPopoverConfig.js +27 -25
  438. package/components/overlays/src/configurations/withTooltipConfig.js +15 -13
  439. package/components/overlays/src/overlayDocumentStyle.js +1 -1
  440. package/components/overlays/src/overlayShadowDomStyle.js +0 -1
  441. package/components/overlays/src/singleton.js +0 -2
  442. package/components/overlays/src/utils/adopt-styles.js +18 -18
  443. package/components/overlays/src/utils/deep-contains.js +7 -6
  444. package/components/overlays/src/utils/get-focusable-elements.js +7 -10
  445. package/components/overlays/src/utils/inert-siblings.js +2 -4
  446. package/components/overlays/src/utils/is-equal-config.js +2 -3
  447. package/components/overlays/src/utils/is-visible.js +0 -1
  448. package/components/overlays/src/utils/simulate-tab.js +1 -4
  449. package/components/overlays/src/utils/sort-by-tabindex.js +2 -4
  450. package/components/overlays/test/ArrowMixin.test.js +18 -30
  451. package/components/overlays/test/OverlayController.test.js +375 -555
  452. package/components/overlays/test/OverlayMixin.test.js +0 -2
  453. package/components/overlays/test/OverlaysManager.test.js +30 -35
  454. package/components/overlays/test/global-positioning.test.js +6 -10
  455. package/components/overlays/test/local-positioning.test.js +101 -103
  456. package/components/overlays/test/utils-tests/active-element.test.js +12 -27
  457. package/components/overlays/test/utils-tests/adopt-styles.test.js +25 -56
  458. package/components/overlays/test/utils-tests/deep-contains.test.js +73 -74
  459. package/components/overlays/test/utils-tests/get-focusable-elements.test.js +6 -23
  460. package/components/overlays/test/utils-tests/is-equal-config.test.js +32 -13
  461. package/components/overlays/test/utils-tests/visibility.test.js +44 -79
  462. package/components/overlays/test-helpers/createShadowHost.js +5 -3
  463. package/components/overlays/test-helpers/normalizeTransformStyle.js +2 -4
  464. package/components/overlays/test-suites/OverlayMixin.suite.js +152 -181
  465. package/components/overlays/test-suites/WithHoverInteraction.suite.js +96 -79
  466. package/components/overlays/translations/bg-BG.js +0 -1
  467. package/components/overlays/translations/cs-CZ.js +0 -1
  468. package/components/overlays/translations/de-DE.js +0 -1
  469. package/components/overlays/translations/en-AU.js +0 -1
  470. package/components/overlays/translations/en-GB.js +0 -1
  471. package/components/overlays/translations/en-US.js +0 -1
  472. package/components/overlays/translations/es-ES.js +0 -1
  473. package/components/overlays/translations/fr-BE.js +0 -1
  474. package/components/overlays/translations/fr-FR.js +0 -1
  475. package/components/overlays/translations/hu-HU.js +0 -1
  476. package/components/overlays/translations/it-IT.js +0 -1
  477. package/components/overlays/translations/nl-BE.js +0 -1
  478. package/components/overlays/translations/nl-NL.js +0 -1
  479. package/components/overlays/translations/pl-PL.js +0 -1
  480. package/components/overlays/translations/ro-RO.js +0 -1
  481. package/components/overlays/translations/ru-RU.js +0 -1
  482. package/components/overlays/translations/sk-SK.js +0 -1
  483. package/components/overlays/translations/tr-TR.js +0 -1
  484. package/components/overlays/translations/uk-UA.js +0 -1
  485. package/components/pagination/src/LionPagination.js +9 -12
  486. package/components/pagination/test/lion-pagination.test.js +18 -50
  487. package/components/progress-indicator/src/LionProgressIndicator.js +10 -12
  488. package/components/progress-indicator/test/lion-progress-indicator.test.js +1 -22
  489. package/components/radio-group/src/LionRadioGroup.js +1 -2
  490. package/components/radio-group/test/lion-radio-group-integrations.test.js +0 -1
  491. package/components/radio-group/test/lion-radio-group.test.js +27 -27
  492. package/components/radio-group/test/lion-radio-integrations.test.js +3 -2
  493. package/components/radio-group/test/lion-radio.test.js +30 -16
  494. package/components/select/src/LionSelect.js +12 -13
  495. package/components/select/test/lion-select.test.js +7 -12
  496. package/components/select-rich/src/LionSelectInvoker.js +18 -11
  497. package/components/select-rich/src/LionSelectRich.js +20 -43
  498. package/components/select-rich/test/demos.screenshots-test.js +40 -9
  499. package/components/select-rich/test/lion-select-invoker.test.js +26 -43
  500. package/components/select-rich/test/lion-select-listbox-suite-integration.test.js +3 -3
  501. package/components/select-rich/test/lion-select-rich-dialog-integration.test.js +4 -9
  502. package/components/select-rich/test/lion-select-rich-interaction.test.js +116 -116
  503. package/components/select-rich/test/lion-select-rich-upgrade.test.js +3 -7
  504. package/components/select-rich/test/lion-select-rich.test.js +153 -195
  505. package/components/select-rich/test-helpers/getSelectRichMembers.js +4 -1
  506. package/components/steps/src/LionStep.js +21 -12
  507. package/components/steps/src/LionSteps.js +25 -25
  508. package/components/steps/test/lion-step.test.js +18 -25
  509. package/components/steps/test/lion-steps.test.js +45 -78
  510. package/components/switch/src/LionSwitch.js +2 -7
  511. package/components/switch/src/LionSwitchButton.js +5 -6
  512. package/components/switch/test/lion-switch-button.test.js +16 -28
  513. package/components/switch/test/lion-switch.test.js +17 -31
  514. package/components/tabs/src/LionTabs.js +25 -28
  515. package/components/tabs/test/lion-tabs.test.js +156 -154
  516. package/components/textarea/src/LionTextarea.js +4 -23
  517. package/components/textarea/test/lion-textarea-integrations.test.js +0 -5
  518. package/components/textarea/test/lion-textarea.test.js +2 -28
  519. package/components/tooltip/src/LionTooltip.js +6 -6
  520. package/components/tooltip/test/lion-tooltip.test.js +75 -102
  521. package/components/validate-messages/src/getLocalizedMessage.js +8 -7
  522. package/components/validate-messages/src/loadDefaultFeedbackMessages.js +3 -1
  523. package/components/validate-messages/src/loadDefaultFeedbackMessagesNoSideEffects.js +9 -5
  524. package/components/validate-messages/src/per-entrypoint/loadComboboxMessagesNoSideEffects.js +5 -2
  525. package/components/validate-messages/src/per-entrypoint/loadFormCoreMessagesNoSideEffects.js +99 -35
  526. package/components/validate-messages/src/per-entrypoint/loadInputTelMessagesNoSideEffects.js +4 -3
  527. package/components/validate-messages/test/loadDefaultFeedbackMessages.test.js +5 -3
  528. package/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.test.js +80 -45
  529. package/components/validate-messages/translations/bg-BG.js +0 -1
  530. package/components/validate-messages/translations/cs-CZ.js +0 -1
  531. package/components/validate-messages/translations/de-DE.js +0 -1
  532. package/components/validate-messages/translations/en-AU.js +0 -1
  533. package/components/validate-messages/translations/en-GB.js +0 -1
  534. package/components/validate-messages/translations/en-PH.js +0 -1
  535. package/components/validate-messages/translations/en-US.js +0 -1
  536. package/components/validate-messages/translations/es-ES.js +0 -1
  537. package/components/validate-messages/translations/fr-BE.js +0 -1
  538. package/components/validate-messages/translations/fr-FR.js +0 -1
  539. package/components/validate-messages/translations/hu-HU.js +0 -1
  540. package/components/validate-messages/translations/it-IT.js +0 -1
  541. package/components/validate-messages/translations/nl-BE.js +0 -1
  542. package/components/validate-messages/translations/nl-NL.js +0 -1
  543. package/components/validate-messages/translations/pl-PL.js +0 -1
  544. package/components/validate-messages/translations/ro-RO.js +0 -1
  545. package/components/validate-messages/translations/ru-RU.js +0 -1
  546. package/components/validate-messages/translations/sk-SK.js +0 -1
  547. package/components/validate-messages/translations/tr-TR.js +0 -1
  548. package/components/validate-messages/translations/uk-UA.js +0 -1
  549. package/custom-elements.json +191 -56
  550. package/dist-types/components/core/src/SlotMixin.d.ts +6 -1
  551. package/dist-types/components/core/src/SlotMixin.d.ts.map +1 -1
  552. package/dist-types/components/core/types/SlotMixinTypes.d.ts +5 -1
  553. package/dist-types/components/core/types/SlotMixinTypes.d.ts.map +1 -1
  554. package/dist-types/components/form-core/src/LionField.d.ts +3 -1
  555. package/dist-types/components/form-core/src/LionField.d.ts.map +1 -1
  556. package/dist-types/components/input-tel/src/LionInputTel.d.ts +6 -6
  557. package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
  558. package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts +2 -2
  559. package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts.map +1 -1
  560. package/dist-types/components/input-tel/src/formatters.d.ts +2 -2
  561. package/dist-types/components/input-tel/src/formatters.d.ts.map +1 -1
  562. package/dist-types/components/input-tel/src/preprocessors.d.ts +2 -2
  563. package/dist-types/components/input-tel/src/preprocessors.d.ts.map +1 -1
  564. package/dist-types/components/input-tel/test/validators.test.d.ts +1 -1
  565. package/dist-types/components/input-tel/test/validators.test.d.ts.map +1 -1
  566. package/dist-types/components/listbox/src/LionOption.d.ts +5 -2
  567. package/dist-types/components/listbox/src/LionOption.d.ts.map +1 -1
  568. package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
  569. package/dist-types/components/overlays/src/overlayDocumentStyle.d.ts.map +1 -1
  570. package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts +3 -1
  571. package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts.map +1 -1
  572. package/dist-types/components/select-rich/src/LionSelectRich.d.ts +1 -1
  573. package/dist-types/tsconfig.tsbuildinfo +1 -1
  574. package/docs/components/accordion/overview.md +2 -2
  575. package/docs/components/accordion/reference.md +2 -2
  576. package/docs/components/accordion/use-cases.md +2 -2
  577. package/docs/components/button/examples.md +2 -2
  578. package/docs/components/button/extensions.md +2 -2
  579. package/docs/components/button/overview.md +2 -2
  580. package/docs/components/button/use-cases.md +2 -2
  581. package/docs/components/calendar/overview.md +2 -2
  582. package/docs/components/calendar/use-cases.md +2 -2
  583. package/docs/components/checkbox-group/overview.md +4 -4
  584. package/docs/components/checkbox-group/use-cases.md +2 -2
  585. package/docs/components/collapsible/examples.md +2 -2
  586. package/docs/components/collapsible/overview.md +3 -3
  587. package/docs/components/collapsible/use-cases.md +2 -2
  588. package/docs/components/combobox/extensions.md +2 -2
  589. package/docs/components/combobox/overview.md +3 -3
  590. package/docs/components/combobox/use-cases.md +3 -3
  591. package/docs/components/dialog/overview.md +3 -3
  592. package/docs/components/dialog/use-cases.md +2 -2
  593. package/docs/components/drawer/overview.md +2 -2
  594. package/docs/components/drawer/use-cases.md +2 -2
  595. package/docs/components/fieldset/overview.md +7 -7
  596. package/docs/components/fieldset/use-cases.md +2 -2
  597. package/docs/components/form/overview.md +5 -5
  598. package/docs/components/form/use-cases.md +4 -4
  599. package/docs/components/icon/overview.md +2 -2
  600. package/docs/components/icon/use-cases.md +3 -3
  601. package/docs/components/input/overview.md +3 -3
  602. package/docs/components/input/use-cases.md +2 -2
  603. package/docs/components/input-amount/overview.md +5 -5
  604. package/docs/components/input-amount/use-cases.md +2 -2
  605. package/docs/components/input-amount-dropdown/use-cases.md +2 -2
  606. package/docs/components/input-date/overview.md +5 -5
  607. package/docs/components/input-date/use-cases.md +2 -2
  608. package/docs/components/input-datepicker/overview.md +7 -7
  609. package/docs/components/input-datepicker/use-cases.md +2 -2
  610. package/docs/components/input-email/overview.md +4 -4
  611. package/docs/components/input-email/use-cases.md +2 -2
  612. package/docs/components/input-file/overview.md +3 -3
  613. package/docs/components/input-file/use-cases.md +2 -2
  614. package/docs/components/input-iban/overview.md +4 -4
  615. package/docs/components/input-iban/use-cases.md +2 -2
  616. package/docs/components/input-range/overview.md +4 -4
  617. package/docs/components/input-range/use-cases.md +2 -2
  618. package/docs/components/input-stepper/overview.md +3 -3
  619. package/docs/components/input-stepper/use-cases.md +2 -2
  620. package/docs/components/input-tel/overview.md +3 -3
  621. package/docs/components/input-tel/use-cases.md +8 -8
  622. package/docs/components/input-tel-dropdown/extensions.md +2 -2
  623. package/docs/components/input-tel-dropdown/overview.md +3 -3
  624. package/docs/components/input-tel-dropdown/use-cases.md +2 -2
  625. package/docs/components/listbox/overview.md +2 -2
  626. package/docs/components/listbox/use-cases.md +3 -3
  627. package/docs/components/menu/extensions.md +2 -2
  628. package/docs/components/menu/migration.md +2 -2
  629. package/docs/components/menu/overview.md +2 -2
  630. package/docs/components/menu/use-cases.md +1 -1
  631. package/docs/components/pagination/overview.md +2 -2
  632. package/docs/components/pagination/use-cases.md +2 -2
  633. package/docs/components/progress-indicator/examples.md +2 -2
  634. package/docs/components/progress-indicator/overview.md +2 -2
  635. package/docs/components/radio-group/overview.md +5 -5
  636. package/docs/components/radio-group/use-cases.md +2 -2
  637. package/docs/components/select/overview.md +2 -2
  638. package/docs/components/select/use-cases.md +3 -3
  639. package/docs/components/select-rich/examples.md +2 -2
  640. package/docs/components/select-rich/overview.md +2 -2
  641. package/docs/components/select-rich/use-cases.md +4 -4
  642. package/docs/components/steps/overview.md +2 -2
  643. package/docs/components/steps/use-cases.md +2 -2
  644. package/docs/components/switch/overview.md +2 -2
  645. package/docs/components/switch/reference.md +2 -2
  646. package/docs/components/switch/use-cases.md +2 -2
  647. package/docs/components/tabs/examples.md +3 -3
  648. package/docs/components/tabs/overview.md +2 -2
  649. package/docs/components/tabs/use-cases.md +2 -2
  650. package/docs/components/textarea/overview.md +2 -2
  651. package/docs/components/textarea/use-cases.md +2 -2
  652. package/docs/components/tooltip/examples.md +2 -2
  653. package/docs/components/tooltip/overview.md +2 -2
  654. package/docs/components/tooltip/use-cases.md +2 -2
  655. package/docs/fundamentals/index.md +4 -4
  656. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +2 -2
  657. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +2 -2
  658. package/docs/fundamentals/node-tools/providence-analytics/index.md +2 -2
  659. package/docs/fundamentals/node-tools/providence-analytics/overview.md +2 -2
  660. package/docs/fundamentals/node-tools/publish-docs/index.md +2 -2
  661. package/docs/fundamentals/node-tools/publish-docs/overview.md +5 -5
  662. package/docs/fundamentals/node-tools/remark-extend/index.md +2 -2
  663. package/docs/fundamentals/node-tools/remark-extend/overview.md +2 -2
  664. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +2 -2
  665. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +4 -4
  666. package/docs/fundamentals/rationales/TypeScript.md +62 -2
  667. package/docs/fundamentals/rationales/accessibility.md +5 -5
  668. package/docs/fundamentals/rationales/side-effects.md +2 -2
  669. package/docs/fundamentals/rationales/versioning.md +2 -2
  670. package/docs/fundamentals/systems/core/SlotMixin.md +3 -3
  671. package/docs/fundamentals/systems/core/index.md +2 -2
  672. package/docs/fundamentals/systems/core/overview.md +3 -3
  673. package/docs/fundamentals/systems/form/formatting-and-parsing.md +6 -6
  674. package/docs/fundamentals/systems/form/index.md +2 -2
  675. package/docs/fundamentals/systems/form/interaction-states.md +2 -2
  676. package/docs/fundamentals/systems/form/model-value.md +3 -3
  677. package/docs/fundamentals/systems/form/overview.md +30 -30
  678. package/docs/fundamentals/systems/form/styling.md +2 -2
  679. package/docs/fundamentals/systems/form/use-cases.md +2 -2
  680. package/docs/fundamentals/systems/form/validate.md +4 -4
  681. package/docs/fundamentals/systems/icon/index.md +2 -2
  682. package/docs/fundamentals/systems/icon/overview.md +2 -2
  683. package/docs/fundamentals/systems/localize/dates.md +2 -2
  684. package/docs/fundamentals/systems/localize/index.md +2 -2
  685. package/docs/fundamentals/systems/localize/numbers.md +2 -2
  686. package/docs/fundamentals/systems/localize/overview.md +6 -6
  687. package/docs/fundamentals/systems/localize/rationale.md +2 -2
  688. package/docs/fundamentals/systems/localize/text.md +2 -2
  689. package/docs/fundamentals/systems/localize/use-cases.md +2 -2
  690. package/docs/fundamentals/systems/overlays/_edge-cases.md +2 -2
  691. package/docs/fundamentals/systems/overlays/configuration.md +4 -4
  692. package/docs/fundamentals/systems/overlays/index.md +2 -2
  693. package/docs/fundamentals/systems/overlays/overview.md +7 -7
  694. package/docs/fundamentals/systems/overlays/rationale.md +2 -2
  695. package/docs/fundamentals/systems/overlays/use-cases.md +4 -4
  696. package/docs/fundamentals/tools/ajax/index.md +2 -2
  697. package/docs/fundamentals/tools/ajax/overview.md +2 -2
  698. package/docs/fundamentals/tools/ajax/use-cases.md +2 -2
  699. package/docs/fundamentals/tools/helpers/action-logger.md +2 -2
  700. package/docs/fundamentals/tools/helpers/index.md +2 -2
  701. package/docs/fundamentals/tools/helpers/overview.md +3 -3
  702. package/docs/fundamentals/tools/singleton-manager/example-complex/index.md +2 -2
  703. package/docs/fundamentals/tools/singleton-manager/example-fail/index.md +2 -2
  704. package/docs/fundamentals/tools/singleton-manager/example-success/index.md +2 -2
  705. package/docs/fundamentals/tools/singleton-manager/index.md +2 -2
  706. package/docs/fundamentals/tools/singleton-manager/overview.md +6 -6
  707. package/docs/guides/how-to/create-a-custom-field.md +7 -7
  708. package/docs/guides/how-to/create-a-form.md +6 -6
  709. package/docs/guides/how-to/extend-a-native-input.md +4 -4
  710. package/docs/guides/how-to/get-started.md +2 -2
  711. package/docs/guides/how-to/index.md +1 -1
  712. package/docs/guides/index.md +8 -8
  713. package/docs/guides/principles/definitions-and-terms.md +2 -2
  714. package/docs/guides/principles/index.md +5 -5
  715. package/docs/guides/principles/scoped-elements.md +2 -2
  716. package/docs/guides/principles/styling.md +3 -3
  717. package/docs/guides/principles/subclasser-apis.md +2 -2
  718. package/exports/define/lion-accordion.js +0 -1
  719. package/exports/define/lion-button-reset.js +0 -1
  720. package/exports/define/lion-button-submit.js +0 -1
  721. package/exports/define/lion-button.js +0 -1
  722. package/exports/define/lion-calendar.js +0 -1
  723. package/exports/define/lion-checkbox-group.js +0 -1
  724. package/exports/define/lion-checkbox-indeterminate.js +0 -1
  725. package/exports/define/lion-checkbox.js +0 -1
  726. package/exports/define/lion-collapsible.js +0 -1
  727. package/exports/define/lion-combobox.js +0 -1
  728. package/exports/define/lion-dialog.js +0 -1
  729. package/exports/define/lion-drawer.js +0 -1
  730. package/exports/define/lion-field.js +0 -1
  731. package/exports/define/lion-fieldset.js +0 -1
  732. package/exports/define/lion-form.js +0 -1
  733. package/exports/define/lion-icon.js +0 -1
  734. package/exports/define/lion-input-amount-dropdown.js +0 -1
  735. package/exports/define/lion-input-amount.js +0 -1
  736. package/exports/define/lion-input-date.js +0 -1
  737. package/exports/define/lion-input-datepicker.js +0 -1
  738. package/exports/define/lion-input-email.js +0 -1
  739. package/exports/define/lion-input-file.js +0 -1
  740. package/exports/define/lion-input-iban.js +0 -1
  741. package/exports/define/lion-input-range.js +0 -1
  742. package/exports/define/lion-input-stepper.js +0 -1
  743. package/exports/define/lion-input-tel-dropdown.js +0 -1
  744. package/exports/define/lion-input-tel.js +0 -1
  745. package/exports/define/lion-input.js +0 -1
  746. package/exports/define/lion-item.js +0 -1
  747. package/exports/define/lion-listbox.js +0 -1
  748. package/exports/define/lion-menu.js +0 -1
  749. package/exports/define/lion-menuitem.js +0 -1
  750. package/exports/define/lion-option.js +0 -1
  751. package/exports/define/lion-options.js +0 -1
  752. package/exports/define/lion-pagination.js +0 -1
  753. package/exports/define/lion-progress-indicator.js +0 -1
  754. package/exports/define/lion-radio-group.js +0 -1
  755. package/exports/define/lion-radio.js +0 -1
  756. package/exports/define/lion-select-invoker.js +0 -1
  757. package/exports/define/lion-select-rich.js +0 -1
  758. package/exports/define/lion-select.js +0 -1
  759. package/exports/define/lion-selected-file-list.js +0 -1
  760. package/exports/define/lion-step.js +0 -1
  761. package/exports/define/lion-steps.js +0 -1
  762. package/exports/define/lion-switch-button.js +0 -1
  763. package/exports/define/lion-switch.js +0 -1
  764. package/exports/define/lion-tabs.js +0 -1
  765. package/exports/define/lion-textarea.js +0 -1
  766. package/exports/define/lion-tooltip.js +0 -1
  767. package/exports/define/lion-validation-feedback.js +0 -1
  768. package/exports/define-helpers/sb-action-logger.js +0 -1
  769. package/exports/define-helpers/sb-locale-switcher.js +0 -1
  770. package/exports/form-core.js +0 -8
  771. package/exports/localize-no-side-effects.js +0 -1
  772. package/exports/localize.js +0 -2
  773. package/exports/overlays.js +0 -4
  774. package/generated/awesome-phonenumber/LICENSE +22 -0
  775. package/generated/awesome-phonenumber/LICENSE.closure-library +176 -0
  776. package/generated/awesome-phonenumber/LICENSE.libphonenumber +176 -0
  777. package/generated/awesome-phonenumber/checksums.json +6 -0
  778. package/generated/awesome-phonenumber/index-esm.mjs +817 -0
  779. package/generated/awesome-phonenumber/index.d.ts +227 -0
  780. package/generated/awesome-phonenumber/index.js +45 -0
  781. package/generated/awesome-phonenumber/lib/index.js +710 -0
  782. package/generated/awesome-phonenumber/package.json +9 -0
  783. package/generated/awesome-phonenumber/provenance.json +13 -0
  784. package/package.json +32 -10
  785. package/web-types.json +1 -1
  786. package/vendor/README.md +0 -61
  787. package/vendor/awesome-phonenumber-7.9.0-tlouisse.libphonenumber-9.0.41.tgz +0 -0
@@ -63,16 +63,16 @@ export class LionItem extends LitElement {
63
63
  /** @type {any} */
64
64
  static get properties() {
65
65
  return {
66
- type: { type: String },
66
+ type: {
67
+ type: String,
68
+ },
67
69
  };
68
70
  }
69
-
70
71
  get _invokerNode() {
71
- return /** @type {HTMLElement[]} */ (Array.from(this.children)).find(
72
- child => child.slot === 'invoker',
72
+ return /** @type {HTMLElement[]} */ Array.from(this.children).find(
73
+ (child) => child.slot === 'invoker',
73
74
  );
74
75
  }
75
-
76
76
  static styles = [
77
77
  css`
78
78
  :host {
@@ -80,16 +80,13 @@ export class LionItem extends LitElement {
80
80
  }
81
81
  `,
82
82
  ];
83
-
84
83
  constructor() {
85
84
  super();
86
85
  /** @type {InteractiveListItemRole |''} */
87
86
  this.type = '';
88
87
  }
89
-
90
88
  connectedCallback() {
91
89
  super.connectedCallback();
92
-
93
90
  if (!this._computedType) {
94
91
  this._computedType = this.type || 'listitem';
95
92
  }
@@ -99,7 +96,6 @@ export class LionItem extends LitElement {
99
96
  this.setAttribute('role', this._computedType);
100
97
  }
101
98
  }
102
-
103
99
  render() {
104
100
  return html`
105
101
  <slot name="invoker"></slot>
@@ -107,7 +103,6 @@ export class LionItem extends LitElement {
107
103
  `;
108
104
  }
109
105
  }
110
-
111
106
  export class LionMenuitem extends LionItem {
112
107
  connectedCallback() {
113
108
  this._computedType = `menuitem${this.type}`;
@@ -139,11 +134,9 @@ export class LionMenuitem extends LionItem {
139
134
  * @param {import('@open-wc/dedupe-mixin').Constructor<import('lit').LitElement>} superclass
140
135
  */
141
136
  // prettier-ignore
142
- const InteractiveListMixinImplementation = /** @type {InteractiveListMixinType} */ (superclass =>
143
- class InteractiveListMixin extends DisabledMixin(SlotMixin(MoreButtonMenuMixin(superclass))) {
144
- /** @type {any} */
145
- static styles = [
146
- css`
137
+ const InteractiveListMixinImplementation = /** @type {InteractiveListMixinType} */superclass => class InteractiveListMixin extends DisabledMixin(SlotMixin(MoreButtonMenuMixin(superclass))) {
138
+ /** @type {any} */
139
+ static styles = [css`
147
140
  :host {
148
141
  display: block;
149
142
  }
@@ -159,709 +152,715 @@ const InteractiveListMixinImplementation = /** @type {InteractiveListMixinType}
159
152
  :host([axis='inline']) ::slotted([slot='list']) {
160
153
  display: flex;
161
154
  }
162
- `,
163
- ];
164
-
165
- render() {
166
- return html`
155
+ `];
156
+ render() {
157
+ return html`
167
158
  <slot name="list"></slot>
168
159
  <slot></slot>
169
160
  `;
170
- }
171
-
172
- static get properties() {
173
- return {
174
- /**
175
- * The axis arrow keys navigate along, in the vocabulary of the
176
- * [focusgroup](https://open-ui.org/components/focusgroup.explainer/) api: `'block'`
177
- * (default: up/down) or `'inline'` (left/right).
178
- */
179
- axis: { type: String, reflect: true },
180
- /**
181
- * Whether more than one item can be checked. The platform name for this is `multiple`
182
- * (`<select multiple>`); selection is explicitly not part of the focusgroup api.
183
- */
184
- multiple: { type: Boolean, attribute: 'multiple' },
185
- /**
186
- * Whether checking an item follows the active item. ARIA/APG vocabulary; selection is out of
187
- * scope for the focusgroup api.
188
- */
189
- selectionFollowsFocus: { type: Boolean, attribute: 'selection-follows-focus' },
190
- /**
191
- * Whether arrow key navigation wraps around at the first/last item: the `wrap` modifier of
192
- * the focusgroup api.
193
- */
194
- wrap: { type: Boolean, attribute: 'wrap' },
195
- /**
196
- * Whether no item is selected on initial render (`checkedIndex` stays -1). The platform name
197
- * for the initial selectedness is "default selected" (`HTMLOptionElement.defaultSelected`,
198
- * `HTMLInputElement.defaultChecked`, the HTML selectedness-setting algorithm); the opt-out is
199
- * named the way the platform names its own opt-outs (`novalidate`, `nomodule`). Same property
200
- * as `ListboxMixin` has, so a listbox and a menu can be configured alike.
201
- */
202
- hasNoDefaultSelected: { type: Boolean, reflect: true, attribute: 'has-no-default-selected' },
203
-
204
- // TODO: implement, for now we start with only more-menu. See instructions in code about more menu.
205
- // Values:
206
- // - 'more-menu'
207
- // - 'scroll-buttons' (think of those material design tab bars)
208
- // - 'scroll-bar' (puts overflow: scroll on it) (think of tab bars, tables etc.)
209
- itemWrap: { type: Boolean, attribute: 'item-wrap' },
210
-
211
- _activateOnTypedChars: { type: Boolean },
212
- _hasSmartListItems: { type: Boolean },
213
- _activeMode: { type: String },
214
- };
215
- }
216
-
217
- get slots() {
218
- return {
219
- ...super.slots,
220
- list: () => document.createElement('div'),
221
- };
222
- }
161
+ }
162
+ static get properties() {
163
+ return {
164
+ /**
165
+ * The axis arrow keys navigate along, in the vocabulary of the
166
+ * [focusgroup](https://open-ui.org/components/focusgroup.explainer/) api: `'block'`
167
+ * (default: up/down) or `'inline'` (left/right).
168
+ */
169
+ axis: {
170
+ type: String,
171
+ reflect: true
172
+ },
173
+ /**
174
+ * Whether more than one item can be checked. The platform name for this is `multiple`
175
+ * (`<select multiple>`); selection is explicitly not part of the focusgroup api.
176
+ */
177
+ multiple: {
178
+ type: Boolean,
179
+ attribute: 'multiple'
180
+ },
181
+ /**
182
+ * Whether checking an item follows the active item. ARIA/APG vocabulary; selection is out of
183
+ * scope for the focusgroup api.
184
+ */
185
+ selectionFollowsFocus: {
186
+ type: Boolean,
187
+ attribute: 'selection-follows-focus'
188
+ },
189
+ /**
190
+ * Whether arrow key navigation wraps around at the first/last item: the `wrap` modifier of
191
+ * the focusgroup api.
192
+ */
193
+ wrap: {
194
+ type: Boolean,
195
+ attribute: 'wrap'
196
+ },
197
+ /**
198
+ * Whether no item is selected on initial render (`checkedIndex` stays -1). The platform name
199
+ * for the initial selectedness is "default selected" (`HTMLOptionElement.defaultSelected`,
200
+ * `HTMLInputElement.defaultChecked`, the HTML selectedness-setting algorithm); the opt-out is
201
+ * named the way the platform names its own opt-outs (`novalidate`, `nomodule`). Same property
202
+ * as `ListboxMixin` has, so a listbox and a menu can be configured alike.
203
+ */
204
+ hasNoDefaultSelected: {
205
+ type: Boolean,
206
+ reflect: true,
207
+ attribute: 'has-no-default-selected'
208
+ },
209
+ // TODO: implement, for now we start with only more-menu. See instructions in code about more menu.
210
+ // Values:
211
+ // - 'more-menu'
212
+ // - 'scroll-buttons' (think of those material design tab bars)
213
+ // - 'scroll-bar' (puts overflow: scroll on it) (think of tab bars, tables etc.)
214
+ itemWrap: {
215
+ type: Boolean,
216
+ attribute: 'item-wrap'
217
+ },
218
+ _activateOnTypedChars: {
219
+ type: Boolean
220
+ },
221
+ _hasSmartListItems: {
222
+ type: Boolean
223
+ },
224
+ _activeMode: {
225
+ type: String
226
+ }
227
+ };
228
+ }
229
+ get slots() {
230
+ return {
231
+ ...super.slots,
232
+ list: () => document.createElement('div')
233
+ };
234
+ }
223
235
 
224
- /**
225
- * This is the (usually focusable, unless combobox) element that will contain [aria-activedescendant]
226
- * Depending on the children, role will be "listbox|menu|menubar|tree|toolbar"
227
- * @type {HTMLElement}
228
- */
229
- get _listNode() {
230
- return /** @type {HTMLElement} */ (Array.from(this.children).find(c => c.slot === 'list'));
231
- }
236
+ /**
237
+ * This is the (usually focusable, unless combobox) element that will contain [aria-activedescendant]
238
+ * Depending on the children, role will be "listbox|menu|menubar|tree|toolbar"
239
+ * @type {HTMLElement}
240
+ */
241
+ get _listNode() {
242
+ return /** @type {HTMLElement} */Array.from(this.children).find(c => c.slot === 'list');
243
+ }
244
+ get _scrollTargetNode() {
245
+ return this;
246
+ }
232
247
 
233
- get _scrollTargetNode() {
234
- return this;
235
- }
248
+ /**
249
+ * Place in the template that contains children with ._childrenRoles
250
+ * @type {HTMLSlotElement}
251
+ */
252
+ get _listItemsSlot() {
253
+ const slots = Array.from(/** @type {ShadowRoot} */this.shadowRoot.querySelectorAll('slot'));
254
+ return /** @type {HTMLSlotElement} */slots.find(s => !s.name);
255
+ }
236
256
 
237
- /**
238
- * Place in the template that contains children with ._childrenRoles
239
- * @type {HTMLSlotElement}
240
- */
241
- get _listItemsSlot() {
242
- const slots = Array.from(
243
- /** @type {ShadowRoot} */ (this.shadowRoot).querySelectorAll('slot'),
244
- );
245
- return /** @type {HTMLSlotElement} */ (slots.find(s => !s.name));
246
- }
257
+ /**
258
+ * When used with FormRegistrarMixin, children will register themselves. Otherwise,
259
+ * __listItems are gathered via a slotchange listener
260
+ * @type {HTMLElement[]}
261
+ */
262
+ get listItems() {
263
+ // @ts-ignore
264
+ return this.__listItems || this.formElements;
265
+ }
247
266
 
248
- /**
249
- * When used with FormRegistrarMixin, children will register themselves. Otherwise,
250
- * __listItems are gathered via a slotchange listener
251
- * @type {HTMLElement[]}
252
- */
253
- get listItems() {
254
- // @ts-ignore
255
- return this.__listItems || this.formElements;
256
- }
267
+ /**
268
+ * The roles to look for when children are registered to listItems
269
+ * @overridable
270
+ * @type {InteractiveListItemRole[]}
271
+ */
272
+ // eslint-disable-next-line class-methods-use-this
273
+ get _childrenRoles() {
274
+ // @ts-ignore - string type in array of InteractiveListItemRole
275
+ return [...this._interactiveChildrenRoles, 'listitem', 'group'];
276
+ }
257
277
 
258
- /**
259
- * The roles to look for when children are registered to listItems
260
- * @overridable
261
- * @type {InteractiveListItemRole[]}
262
- */
263
- // eslint-disable-next-line class-methods-use-this
264
- get _childrenRoles() {
265
- // @ts-ignore - string type in array of InteractiveListItemRole
266
- return [...this._interactiveChildrenRoles, 'listitem', 'group'];
278
+ // eslint-disable-next-line class-methods-use-this
279
+ get _interactiveChildrenRoles() {
280
+ return ['menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'treeitem'];
281
+ }
282
+ get activeIndex() {
283
+ return this.listItems.findIndex(el => isActive(el));
284
+ }
285
+ set activeIndex(index) {
286
+ const activeItem = this.listItems[index];
287
+ if (!activeItem) return;
288
+ const prevActiveEl = this.activeItem;
289
+ // This can be a focusable element or a wrapper thereof
290
+ const el = this.listItems[index];
291
+
292
+ // Unset siblings
293
+ this.listItems.forEach(item => {
294
+ setActive(item, true);
295
+ });
296
+ setActive(el);
297
+
298
+ // Determine focusableEl and prevFocusableEl
299
+
300
+ let focusableEl;
301
+ let prevFocusableEl;
302
+ if (this._activeMode === 'activedescendant') {
303
+ focusableEl = el;
304
+ prevFocusableEl = prevActiveEl;
305
+ }
306
+ // activeMode is 'roving-tabindex' or 'tabbable-disclosure'
307
+ else {
308
+ // are we a focusable element or a wrapper thereof?
309
+ focusableEl = isFocusableElement(el) ? el : el.firstElementChild;
310
+ prevFocusableEl = prevActiveEl && (isFocusableElement(prevActiveEl) ? prevActiveEl : prevActiveEl.firstElementChild);
311
+ }
312
+ if (!focusableEl) return;
313
+
314
+ // Update 'active mode'
315
+ if (this._activeMode === 'activedescendant') {
316
+ this._listNode.setAttribute('aria-activedescendant', focusableEl.id);
317
+ } else if (this._activeMode === 'roving-tabindex' || this._activeMode === 'tabbable-disclosure') {
318
+ // @ts-ignore - Element extends HTMLElement for focus
319
+ focusableEl.focus();
320
+ }
321
+
322
+ // @ts-ignore - focusableEl is safely used as HTMLElement here
323
+ if (this.axis === 'block' && !isInView(this._scrollTargetNode, focusableEl)) {
324
+ focusableEl.scrollIntoView({
325
+ behavior: 'smooth',
326
+ block: 'nearest'
327
+ });
267
328
  }
268
-
269
- // eslint-disable-next-line class-methods-use-this
270
- get _interactiveChildrenRoles() {
271
- return ['menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'treeitem'];
329
+ if (this._activeMode === 'roving-tabindex') {
330
+ if (prevFocusableEl) {
331
+ prevFocusableEl.setAttribute('tabindex', '-1');
332
+ }
333
+ focusableEl.setAttribute('tabindex', '0');
272
334
  }
335
+ }
336
+ get activeItem() {
337
+ return this.listItems[this.activeIndex];
338
+ }
273
339
 
274
- get activeIndex() {
275
- return this.listItems.findIndex(el => isActive(el));
340
+ /**
341
+ * @type {number | number[]}
342
+ */
343
+ get checkedIndex() {
344
+ if (!this.multiple) {
345
+ return this.listItems.findIndex(o => isChecked(o));
276
346
  }
347
+ return this.listItems.filter(o => isChecked(o)).map(o => this.listItems.indexOf(o));
348
+ }
277
349
 
278
- set activeIndex(index) {
279
- const activeItem = this.listItems[index];
280
-
281
- if (!activeItem) return;
282
-
283
- const prevActiveEl = this.activeItem;
284
- // This can be a focusable element or a wrapper thereof
285
- const el = this.listItems[index];
350
+ /**
351
+ * @deprecated
352
+ * This setter exists for backwards compatibility of single choice groups.
353
+ * A setter api would be confusing for a multiple group. Use `setCheckedIndex` instead.
354
+ * @param {number} index
355
+ */
356
+ set checkedIndex(index) {
357
+ this.setCheckedIndex(index);
358
+ }
286
359
 
287
- // Unset siblings
288
- this.listItems.forEach(item => {
289
- setActive(item, true);
360
+ /**
361
+ * When `multiple` is false, will toggle, else will check provided index
362
+ * @param {Number} index
363
+ */
364
+ setCheckedIndex(index) {
365
+ const item = this.listItems[index];
366
+ if (!item) return;
367
+ if (!this.multiple) {
368
+ // Uncheck all
369
+ this.listItems.forEach(listItem => {
370
+ setChecked(listItem, true);
290
371
  });
291
- setActive(el);
292
-
293
- // Determine focusableEl and prevFocusableEl
294
-
295
- let focusableEl;
296
- let prevFocusableEl;
297
-
298
- if (this._activeMode === 'activedescendant') {
299
- focusableEl = el;
300
- prevFocusableEl = prevActiveEl;
301
- }
302
- // activeMode is 'roving-tabindex' or 'tabbable-disclosure'
303
- else {
304
- // are we a focusable element or a wrapper thereof?
305
- focusableEl = isFocusableElement(el) ? el : el.firstElementChild;
306
- prevFocusableEl =
307
- prevActiveEl &&
308
- (isFocusableElement(prevActiveEl) ? prevActiveEl : prevActiveEl.firstElementChild);
309
- }
310
-
311
- if (!focusableEl) return;
312
-
313
- // Update 'active mode'
314
- if (this._activeMode === 'activedescendant') {
315
- this._listNode.setAttribute('aria-activedescendant', focusableEl.id);
316
- } else if (
317
- this._activeMode === 'roving-tabindex' ||
318
- this._activeMode === 'tabbable-disclosure'
319
- ) {
320
- // @ts-ignore - Element extends HTMLElement for focus
321
- focusableEl.focus();
322
- }
323
-
324
- // @ts-ignore - focusableEl is safely used as HTMLElement here
325
- if (this.axis === 'block' && !isInView(this._scrollTargetNode, focusableEl)) {
326
- focusableEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
327
- }
328
-
329
- if (this._activeMode === 'roving-tabindex') {
330
- if (prevFocusableEl) {
331
- prevFocusableEl.setAttribute('tabindex', '-1');
332
- }
333
- focusableEl.setAttribute('tabindex', '0');
334
- }
372
+ setChecked(this.listItems[index]);
373
+ } else {
374
+ toggleChecked(this.listItems[index]);
335
375
  }
376
+ }
336
377
 
337
- get activeItem() {
338
- return this.listItems[this.activeIndex];
339
- }
378
+ /**
379
+ * Since we cannot check instanceof with mixins, use this getter instead.
380
+ * This way, the outside world can confirm the type of an element
381
+ */
382
+ // eslint-disable-next-line class-methods-use-this
383
+ get isInteractiveList() {
384
+ return true;
385
+ }
386
+ constructor() {
387
+ super();
388
+
389
+ // TODO: copy descriptions from ListboxMixin and ChoiceGroupMixin to here
390
+ /** @type {'inline' | 'block'} */
391
+ this.axis = 'block';
392
+ this.multiple = false;
393
+ this.selectionFollowsFocus = false;
394
+ this.wrap = false;
340
395
 
341
396
  /**
342
- * @type {number | number[]}
397
+ * By default, checkedIndex is set to 0. When hasNoDefaultSelected is true,
398
+ * checkedIndex will not be set
399
+ * @type {boolean}
343
400
  */
344
- get checkedIndex() {
345
- if (!this.multiple) {
346
- return this.listItems.findIndex(o => isChecked(o));
347
- }
348
- return this.listItems.filter(o => isChecked(o)).map(o => this.listItems.indexOf(o));
349
- }
401
+ this.hasNoDefaultSelected = false;
350
402
 
351
403
  /**
352
- * @deprecated
353
- * This setter exists for backwards compatibility of single choice groups.
354
- * A setter api would be confusing for a multiple group. Use `setCheckedIndex` instead.
355
- * @param {number} index
404
+ * Whenever possible (for [role="listbox|menu"], usually with one level) we use an
405
+ * [active descendant](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_focus_activedescendant).
406
+ * For [role=toolbar], we use a [roving tabindex](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_roving_tabindex)
407
+ * Other examples:
408
+ * - [role="menubar"](https://www.w3.org/TR/wai-aria-practices-1.1/examples/menubar/menubar-1/menubar-1.html)
409
+ * - [role="tree"](https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-1/treeview-1b.html)
410
+ * For disclosure menus, we need keyboard navigation, but treat every list item
411
+ * (more precisely its anchor child) as a tab stop.
412
+ * @type {'activedescendant'|'roving-tabindex'|'tabbable-disclosure'|'none'}
356
413
  */
357
- set checkedIndex(index) {
358
- this.setCheckedIndex(index);
359
- }
414
+ this._activeMode = 'activedescendant';
360
415
 
361
416
  /**
362
- * When `multiple` is false, will toggle, else will check provided index
363
- * @param {Number} index
417
+ * When children are 'smart' (like LionOption), checked and active states will be set
418
+ * to them and they are responsible for setting [aria-selected].
419
+ * When false, `get listItems()` needs to be configured to point to the list items.
420
+ * @type {boolean}
364
421
  */
365
- setCheckedIndex(index) {
366
- const item = this.listItems[index];
367
- if (!item) return;
368
- if (!this.multiple) {
369
- // Uncheck all
370
- this.listItems.forEach(listItem => {
371
- setChecked(listItem, true);
372
- });
373
- setChecked(this.listItems[index]);
374
- } else {
375
- toggleChecked(this.listItems[index]);
376
- }
377
- }
422
+ this._hasSmartChildren = false;
378
423
 
379
424
  /**
380
- * Since we cannot check instanceof with mixins, use this getter instead.
381
- * This way, the outside world can confirm the type of an element
425
+ * The role that will be put on _listNode
426
+ * @type {'menu'|'menubar'|'listbox'|'tree'|'toolbar'}
382
427
  */
383
- // eslint-disable-next-line class-methods-use-this
384
- get isInteractiveList() {
385
- return true;
386
- }
387
-
388
- constructor() {
389
- super();
390
-
391
- // TODO: copy descriptions from ListboxMixin and ChoiceGroupMixin to here
392
- /** @type {'inline' | 'block'} */
393
- this.axis = 'block';
394
- this.multiple = false;
395
- this.selectionFollowsFocus = false;
396
- this.wrap = false;
428
+ this._listRole = 'menu';
397
429
 
398
- /**
399
- * By default, checkedIndex is set to 0. When hasNoDefaultSelected is true,
400
- * checkedIndex will not be set
401
- * @type {boolean}
402
- */
403
- this.hasNoDefaultSelected = false;
404
-
405
- /**
406
- * Whenever possible (for [role="listbox|menu"], usually with one level) we use an
407
- * [active descendant](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_focus_activedescendant).
408
- * For [role=toolbar], we use a [roving tabindex](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_roving_tabindex)
409
- * Other examples:
410
- * - [role="menubar"](https://www.w3.org/TR/wai-aria-practices-1.1/examples/menubar/menubar-1/menubar-1.html)
411
- * - [role="tree"](https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-1/treeview-1b.html)
412
- * For disclosure menus, we need keyboard navigation, but treat every list item
413
- * (more precisely its anchor child) as a tab stop.
414
- * @type {'activedescendant'|'roving-tabindex'|'tabbable-disclosure'|'none'}
415
- */
416
- this._activeMode = 'activedescendant';
417
-
418
- /**
419
- * When children are 'smart' (like LionOption), checked and active states will be set
420
- * to them and they are responsible for setting [aria-selected].
421
- * When false, `get listItems()` needs to be configured to point to the list items.
422
- * @type {boolean}
423
- */
424
- this._hasSmartChildren = false;
425
-
426
- /**
427
- * The role that will be put on _listNode
428
- * @type {'menu'|'menubar'|'listbox'|'tree'|'toolbar'}
429
- */
430
- this._listRole = 'menu';
431
-
432
- /**
433
- * @type {HTMLElement[]}
434
- */
435
- this.__listItems = [];
436
-
437
- /**
438
- * By default, a typed character (or a sequence thereof) will be matched against
439
- * the values of list items. The first and closest match, becomes active
440
- * (focused or activedescendant depending on _matchMode)
441
- * @type {boolean}
442
- */
443
- this._activateOnTypedChars = false;
444
-
445
- /**
446
- * The pending char sequence that will set active list item
447
- * @type {number}
448
- */
449
- this._activateOnCharTimeout = 2000;
450
-
451
- /**
452
- * @type {string[]}
453
- */
454
- this.__typedChars = [];
455
-
456
- this._onListClick = this._onListClick.bind(this);
457
- this._onListKeyUp = this._onListKeyUp.bind(this);
458
- this._onListKeyDown = this._onListKeyDown.bind(this);
459
- this._onListFocusIn = this._onListFocusIn.bind(this);
460
- }
430
+ /**
431
+ * @type {HTMLElement[]}
432
+ */
433
+ this.__listItems = [];
461
434
 
462
- connectedCallback() {
463
- super.connectedCallback();
464
- window.addEventListener('popstate', this._onPopState);
465
- }
435
+ /**
436
+ * By default, a typed character (or a sequence thereof) will be matched against
437
+ * the values of list items. The first and closest match, becomes active
438
+ * (focused or activedescendant depending on _matchMode)
439
+ * @type {boolean}
440
+ */
441
+ this._activateOnTypedChars = false;
466
442
 
467
- disconnectedCallback() {
468
- super.disconnectedCallback();
469
- window.removeEventListener('popstate', this._onPopState);
470
- }
443
+ /**
444
+ * The pending char sequence that will set active list item
445
+ * @type {number}
446
+ */
447
+ this._activateOnCharTimeout = 2000;
471
448
 
472
449
  /**
473
- * @param {import('lit').PropertyValues } changedProperties
450
+ * @type {string[]}
474
451
  */
475
- firstUpdated(changedProperties) {
476
- super.firstUpdated(changedProperties);
477
- this._setupList();
478
- }
452
+ this.__typedChars = [];
453
+ this._onListClick = this._onListClick.bind(this);
454
+ this._onListKeyUp = this._onListKeyUp.bind(this);
455
+ this._onListKeyDown = this._onListKeyDown.bind(this);
456
+ this._onListFocusIn = this._onListFocusIn.bind(this);
457
+ }
458
+ connectedCallback() {
459
+ super.connectedCallback();
460
+ window.addEventListener('popstate', this._onPopState);
461
+ }
462
+ disconnectedCallback() {
463
+ super.disconnectedCallback();
464
+ window.removeEventListener('popstate', this._onPopState);
465
+ }
466
+
467
+ /**
468
+ * @param {import('lit').PropertyValues } changedProperties
469
+ */
470
+ firstUpdated(changedProperties) {
471
+ super.firstUpdated(changedProperties);
472
+ this._setupList();
473
+ }
479
474
 
475
+ /**
476
+ * @param {Node[]} nodes
477
+ */
478
+ #identifyNewItemsAndInitListItems(nodes) {
480
479
  /**
481
- * @param {Node[]} nodes
480
+ *
481
+ * @param {HTMLElement} node
482
+ * @param {{ newItems: HTMLElement[], level?: number }} opts
483
+ * @returns
482
484
  */
483
- #identifyNewItemsAndInitListItems(nodes) {
484
- /**
485
- *
486
- * @param {HTMLElement} node
487
- * @param {{ newItems: HTMLElement[], level?: number }} opts
488
- * @returns
489
- */
490
- const handleInteractiveListAdditionLevel = (node, { newItems, level = 1 }) => {
491
- // Move list item to element with aria-activedescendant ([role="listbox|menu|menubar"])
492
- if (level === 1) {
493
- this._listNode.appendChild(node);
494
- if (this._hasSmartChildren || !(node instanceof Element)) {
495
- return;
496
- }
497
- }
498
- /**
499
- * When [role=group], we can have a grouped set within a level, like multiple
500
- * menuitemradios or -checkboxes.
501
- * When no role at all, we might deal with a wrapped node (for instance triggering a
502
- * submenu)
503
- * Alternatively, when _activeMode is ['tabbable-disclosure'](https://www.w3.org/TR/wai-aria-practices-1.1/examples/disclosure/disclosure-navigation.html),
504
- * we search for a[href]
505
- */
506
- if (node.getAttribute('role') === 'group') {
507
- // @ts-ignore - HTMLCollection is iterable
508
- for (const child of node.children) {
509
- // @ts-ignore
510
- handleInteractiveListAdditionLevel(child, { newItems, level: level + 1 });
511
- }
485
+ const handleInteractiveListAdditionLevel = (node, {
486
+ newItems,
487
+ level = 1
488
+ }) => {
489
+ // Move list item to element with aria-activedescendant ([role="listbox|menu|menubar"])
490
+ if (level === 1) {
491
+ this._listNode.appendChild(node);
492
+ if (this._hasSmartChildren || !(node instanceof Element)) {
512
493
  return;
513
494
  }
514
- // Also support scenarios like these: https://adrianroselli.com/2019/06/link-disclosure-widget-navigation.html
515
- // TODO: For now, we only allow direct children. Should we consider deeper nesting?
516
- const focusableChildren = Array.from(node.children).filter(c => isFocusableElement(c));
517
- if (focusableChildren.length) {
518
- for (const focusableChild of focusableChildren) {
519
- // @ts-ignore - focusableChild is HTMLElement
520
- newItems.push(focusableChild);
521
- }
522
- } else {
523
- // Then we must be focusable (either via activedescendant, tabindex)
524
- newItems.push(node);
495
+ }
496
+ /**
497
+ * When [role=group], we can have a grouped set within a level, like multiple
498
+ * menuitemradios or -checkboxes.
499
+ * When no role at all, we might deal with a wrapped node (for instance triggering a
500
+ * submenu)
501
+ * Alternatively, when _activeMode is ['tabbable-disclosure'](https://www.w3.org/TR/wai-aria-practices-1.1/examples/disclosure/disclosure-navigation.html),
502
+ * we search for a[href]
503
+ */
504
+ if (node.getAttribute('role') === 'group') {
505
+ // @ts-ignore - HTMLCollection is iterable
506
+ for (const child of node.children) {
507
+ // @ts-ignore
508
+ handleInteractiveListAdditionLevel(child, {
509
+ newItems,
510
+ level: level + 1
511
+ });
525
512
  }
526
- };
527
-
528
- /** @type {HTMLElement[]} */
529
- const newItems = [];
530
-
531
- // Move items to _listNode and add interactive node references (with [role]) to listItems
532
- nodes.forEach(node => {
533
- handleInteractiveListAdditionLevel(/** @type {HTMLElement} */ (node), { newItems });
534
- });
535
-
536
- if (this.itemWrap && nodes.length) {
537
- this._initMoreButtonMenu();
513
+ return;
538
514
  }
539
-
540
- newItems.forEach(item => {
541
- if (!this.__listItems.includes(item)) {
542
- this.__listItems.push(item);
515
+ // Also support scenarios like these: https://adrianroselli.com/2019/06/link-disclosure-widget-navigation.html
516
+ // TODO: For now, we only allow direct children. Should we consider deeper nesting?
517
+ const focusableChildren = Array.from(node.children).filter(c => isFocusableElement(c));
518
+ if (focusableChildren.length) {
519
+ for (const focusableChild of focusableChildren) {
520
+ // @ts-ignore - focusableChild is HTMLElement
521
+ newItems.push(focusableChild);
543
522
  }
544
- });
523
+ } else {
524
+ // Then we must be focusable (either via activedescendant, tabindex)
525
+ newItems.push(node);
526
+ }
527
+ };
545
528
 
546
- this._initListItems(newItems);
547
- }
529
+ /** @type {HTMLElement[]} */
530
+ const newItems = [];
548
531
 
549
- _setupList() {
550
- // /**
551
- // * @param {HTMLElement} node
552
- // */
553
- // const shouldAddItem = node => {
554
- // const role = /** @type {InteractiveListItemRole|'group'} */ (node.getAttribute('role'));
555
- // return (
556
- // (role && this._interactiveChildrenRoles.includes(role)) || node.hasAttribute('data-item')
557
- // );
558
- // };
559
-
560
- this._listItemsSlot.addEventListener('slotchange', () => {
561
- // N.B. we do not use `this._listItemsSlot.assignedNodes()`, as it omits comment nodes.
562
- // Comment nodes are really important for lit-html)
563
- const nodes = Array.from(
564
- (this._listItemsSlot.assignedSlot || this).childNodes || [],
565
- // @ts-expect-error
566
- ).filter(n => !n.slot);
567
- this.#identifyNewItemsAndInitListItems(nodes);
532
+ // Move items to _listNode and add interactive node references (with [role]) to listItems
533
+ nodes.forEach(node => {
534
+ handleInteractiveListAdditionLevel(/** @type {HTMLElement} */node, {
535
+ newItems
568
536
  });
569
-
570
- this._listNode.setAttribute('role', this._listRole);
571
- this._listNode.setAttribute(
572
- 'tabindex',
573
- this._activeMode === 'tabbable-disclosure' ? '-1' : '0',
574
- );
575
- this._listNode.addEventListener('click', this._onListClick);
576
- this._listNode.addEventListener('keyup', this._onListKeyUp);
577
- this._listNode.addEventListener('keydown', this._onListKeyDown);
578
- this._listNode.addEventListener('focusin', this._onListFocusIn);
579
-
580
- // TODO: add "more menu" functionality here... when itemWrap is set. We only support "more-menu" (for now):
581
- // 1. we can measure the width (if the axis is inline) of this._listNode
582
- // and see how its children fit, moving them to an overlayController
583
- // having hideVisually as hide mechanism (opening on focus, closing on blur).
584
- // N.B. this._listNode has `display:flex`. This means we need to add `text-wrap: nowrap;`
585
- // to avoid elems going over two lines, or give them a max-height based on measuring the height of one item.
586
- // 2. N.B. hideVisually needs to be implemented in OverlayController.
587
- // 3. when the more menu opens a next level, MultiLevelListMixin will be applied to the host as well.
588
- // That means it knows when a child menu is open. If _subListMap of one of the items is open, we should hide more menu like this:
589
- // https://jsfiddle.net/a4ocktfp/19/
537
+ });
538
+ if (this.itemWrap && nodes.length) {
539
+ this._initMoreButtonMenu();
590
540
  }
591
-
592
- /**
593
- * When _listItemsSlot receives new items, they are initialized via this method
594
- * @param {LionItem[]|HTMLElement[]} newItems the newly added items needing initialization
595
- */
596
- _initListItems(newItems) {
597
- if (this._activeMode === 'roving-tabindex') {
598
- // Make item focusable, but not part of tab sequence
599
- newItems.forEach(item => item.setAttribute?.('tabindex', '-1'));
600
- } else if (this._activeMode === 'activedescendant') {
601
- newItems.forEach(item => {
602
- // eslint-disable-next-line no-param-reassign
603
- item.id = item.id || `${this.localName}-item-${uuid()}`;
604
- });
605
- } // for 'tabbable-disclosure', we assume items are already focusable and part of tab sequence
606
-
607
- if (!this.hasNoDefaultSelected && this.checkedIndex === -1) {
608
- this.checkedIndex = 0;
541
+ newItems.forEach(item => {
542
+ if (!this.__listItems.includes(item)) {
543
+ this.__listItems.push(item);
609
544
  }
545
+ });
546
+ this._initListItems(newItems);
547
+ }
548
+ _setupList() {
549
+ // /**
550
+ // * @param {HTMLElement} node
551
+ // */
552
+ // const shouldAddItem = node => {
553
+ // const role = /** @type {InteractiveListItemRole|'group'} */ (node.getAttribute('role'));
554
+ // return (
555
+ // (role && this._interactiveChildrenRoles.includes(role)) || node.hasAttribute('data-item')
556
+ // );
557
+ // };
558
+
559
+ this._listItemsSlot.addEventListener('slotchange', () => {
560
+ // N.B. we do not use `this._listItemsSlot.assignedNodes()`, as it omits comment nodes.
561
+ // Comment nodes are really important for lit-html)
562
+ const nodes = Array.from((this._listItemsSlot.assignedSlot || this).childNodes || []
563
+ // @ts-expect-error
564
+ ).filter(n => !n.slot);
565
+ this.#identifyNewItemsAndInitListItems(nodes);
566
+ });
567
+ this._listNode.setAttribute('role', this._listRole);
568
+ this._listNode.setAttribute('tabindex', this._activeMode === 'tabbable-disclosure' ? '-1' : '0');
569
+ this._listNode.addEventListener('click', this._onListClick);
570
+ this._listNode.addEventListener('keyup', this._onListKeyUp);
571
+ this._listNode.addEventListener('keydown', this._onListKeyDown);
572
+ this._listNode.addEventListener('focusin', this._onListFocusIn);
573
+
574
+ // TODO: add "more menu" functionality here... when itemWrap is set. We only support "more-menu" (for now):
575
+ // 1. we can measure the width (if the axis is inline) of this._listNode
576
+ // and see how its children fit, moving them to an overlayController
577
+ // having hideVisually as hide mechanism (opening on focus, closing on blur).
578
+ // N.B. this._listNode has `display:flex`. This means we need to add `text-wrap: nowrap;`
579
+ // to avoid elems going over two lines, or give them a max-height based on measuring the height of one item.
580
+ // 2. N.B. hideVisually needs to be implemented in OverlayController.
581
+ // 3. when the more menu opens a next level, MultiLevelListMixin will be applied to the host as well.
582
+ // That means it knows when a child menu is open. If _subListMap of one of the items is open, we should hide more menu like this:
583
+ // https://jsfiddle.net/a4ocktfp/19/
584
+ }
585
+
586
+ /**
587
+ * When _listItemsSlot receives new items, they are initialized via this method
588
+ * @param {LionItem[]|HTMLElement[]} newItems the newly added items needing initialization
589
+ */
590
+ _initListItems(newItems) {
591
+ if (this._activeMode === 'roving-tabindex') {
592
+ // Make item focusable, but not part of tab sequence
593
+ newItems.forEach(item => item.setAttribute?.('tabindex', '-1'));
594
+ } else if (this._activeMode === 'activedescendant') {
610
595
  newItems.forEach(item => {
611
- if (!item.hasAttribute('checked')) {
612
- setChecked(item, true);
613
- } else {
614
- setChecked(item);
615
- }
596
+ // eslint-disable-next-line no-param-reassign
597
+ item.id = item.id || `${this.localName}-item-${uuid()}`;
616
598
  });
599
+ } // for 'tabbable-disclosure', we assume items are already focusable and part of tab sequence
617
600
 
618
- this._syncCurrentPageWithLocationHref(window.location);
601
+ if (!this.hasNoDefaultSelected && this.checkedIndex === -1) {
602
+ this.checkedIndex = 0;
619
603
  }
620
-
621
- /**
622
- * Handles various keyboard controls
623
- * @param {KeyboardEvent} ev - the keydown event object
624
- */
625
- _onListKeyDown(ev) {
626
- if (isDisabled(this)) {
627
- return;
628
- }
629
-
630
- const charHandled = this.__onKeydownActivateTypedChars(ev);
631
- if (charHandled) {
632
- return;
633
- }
634
-
635
- const { key } = ev;
636
-
637
- switch (key) {
638
- case 'Enter':
639
- case ' ':
640
- ev.preventDefault();
641
- // ev.stopPropagation(); // prevent nested menus from conflicting
642
- this.setCheckedIndex(this.activeIndex);
643
- break;
644
- case 'ArrowUp':
645
- ev.preventDefault();
646
- if (this.axis === 'block' || this._activeMode === 'tabbable-disclosure') {
647
- this.activeIndex = this._getPreviousEnabledOption(this.activeIndex);
648
- }
649
- break;
650
- case 'ArrowLeft':
651
- if (this.axis === 'inline' || this._activeMode === 'tabbable-disclosure') {
652
- this.activeIndex = this._getPreviousEnabledOption(this.activeIndex);
653
- }
654
- break;
655
- case 'ArrowDown':
656
- ev.preventDefault();
657
- if (this.axis === 'block' || this._activeMode === 'tabbable-disclosure') {
658
- this.activeIndex = this._getNextEnabledOption(this.activeIndex);
659
- }
660
- break;
661
- case 'ArrowRight':
662
- if (this.axis === 'inline' || this._activeMode === 'tabbable-disclosure') {
663
- this.activeIndex = this._getNextEnabledOption(this.activeIndex);
664
- }
665
- break;
666
- case 'Home':
667
- ev.preventDefault();
668
- this.activeIndex = this._getNextEnabledOption(0, 0);
669
- break;
670
- case 'End':
671
- ev.preventDefault();
672
- this.activeIndex = this._getPreviousEnabledOption(this.listItems.length - 1, 0);
673
- break;
674
- /* no default */
604
+ newItems.forEach(item => {
605
+ if (!item.hasAttribute('checked')) {
606
+ setChecked(item, true);
607
+ } else {
608
+ setChecked(item);
675
609
  }
610
+ });
611
+ this._syncCurrentPageWithLocationHref(window.location);
612
+ }
676
613
 
677
- const keys = ['ArrowUp', 'ArrowDown', 'Home', 'End'];
678
- if (keys.includes(key) && this.selectionFollowsFocus && !this.multiple) {
614
+ /**
615
+ * Handles various keyboard controls
616
+ * @param {KeyboardEvent} ev - the keydown event object
617
+ */
618
+ _onListKeyDown(ev) {
619
+ if (isDisabled(this)) {
620
+ return;
621
+ }
622
+ const charHandled = this.__onKeydownActivateTypedChars(ev);
623
+ if (charHandled) {
624
+ return;
625
+ }
626
+ const {
627
+ key
628
+ } = ev;
629
+ switch (key) {
630
+ case 'Enter':
631
+ case ' ':
632
+ ev.preventDefault();
633
+ // ev.stopPropagation(); // prevent nested menus from conflicting
679
634
  this.setCheckedIndex(this.activeIndex);
680
- }
681
- }
682
-
683
- /**
684
- * @param {KeyboardEvent} ev - the keydown event object
685
- * @returns {boolean} whether a character key or a number was typed
686
- */
687
- __onKeydownActivateTypedChars(ev) {
688
- if (!this._activateOnTypedChars) {
689
- return false;
690
- }
691
-
692
- const { key, code } = ev;
693
-
694
- if (code.startsWith('Key') || code.startsWith('Digit') || code.startsWith('Numpad')) {
695
- this.__typedChars.push(key);
696
- // TODO: schedule in updated loop for perf
697
- const chars = this.__typedChars.join('');
698
- const matchItem = this.listItems.find(item =>
699
- this._matchCharsAgainstItem({ chars: [chars], item }),
700
- );
701
- // @ts-ignore - matchItem might be undefined
702
- this.activeIndex = this.listItems.indexOf(matchItem);
703
-
704
- // @ts-ignore - __clearCharTimeout can be a function
705
- if (typeof this.__clearCharTimeout === 'function') {
706
- // @ts-ignore
707
- this.__clearCharTimeout();
635
+ break;
636
+ case 'ArrowUp':
637
+ ev.preventDefault();
638
+ if (this.axis === 'block' || this._activeMode === 'tabbable-disclosure') {
639
+ this.activeIndex = this._getPreviousEnabledOption(this.activeIndex);
640
+ }
641
+ break;
642
+ case 'ArrowLeft':
643
+ if (this.axis === 'inline' || this._activeMode === 'tabbable-disclosure') {
644
+ this.activeIndex = this._getPreviousEnabledOption(this.activeIndex);
645
+ }
646
+ break;
647
+ case 'ArrowDown':
648
+ ev.preventDefault();
649
+ if (this.axis === 'block' || this._activeMode === 'tabbable-disclosure') {
650
+ this.activeIndex = this._getNextEnabledOption(this.activeIndex);
708
651
  }
709
- this.__clearCharTimeout = setTimeout(() => {
710
- this.__typedChars = [];
711
- }, this._activateOnCharTimeout);
652
+ break;
653
+ case 'ArrowRight':
654
+ if (this.axis === 'inline' || this._activeMode === 'tabbable-disclosure') {
655
+ this.activeIndex = this._getNextEnabledOption(this.activeIndex);
656
+ }
657
+ break;
658
+ case 'Home':
659
+ ev.preventDefault();
660
+ this.activeIndex = this._getNextEnabledOption(0, 0);
661
+ break;
662
+ case 'End':
663
+ ev.preventDefault();
664
+ this.activeIndex = this._getPreviousEnabledOption(this.listItems.length - 1, 0);
665
+ break;
666
+ /* no default */
667
+ }
668
+ const keys = ['ArrowUp', 'ArrowDown', 'Home', 'End'];
669
+ if (keys.includes(key) && this.selectionFollowsFocus && !this.multiple) {
670
+ this.setCheckedIndex(this.activeIndex);
671
+ }
672
+ }
712
673
 
713
- return true;
714
- }
674
+ /**
675
+ * @param {KeyboardEvent} ev - the keydown event object
676
+ * @returns {boolean} whether a character key or a number was typed
677
+ */
678
+ __onKeydownActivateTypedChars(ev) {
679
+ if (!this._activateOnTypedChars) {
715
680
  return false;
716
681
  }
682
+ const {
683
+ key,
684
+ code
685
+ } = ev;
686
+ if (code.startsWith('Key') || code.startsWith('Digit') || code.startsWith('Numpad')) {
687
+ this.__typedChars.push(key);
688
+ // TODO: schedule in updated loop for perf
689
+ const chars = this.__typedChars.join('');
690
+ const matchItem = this.listItems.find(item => this._matchCharsAgainstItem({
691
+ chars: [chars],
692
+ item
693
+ }));
694
+ // @ts-ignore - matchItem might be undefined
695
+ this.activeIndex = this.listItems.indexOf(matchItem);
696
+
697
+ // @ts-ignore - __clearCharTimeout can be a function
698
+ if (typeof this.__clearCharTimeout === 'function') {
699
+ // @ts-ignore
700
+ this.__clearCharTimeout();
701
+ }
702
+ this.__clearCharTimeout = setTimeout(() => {
703
+ this.__typedChars = [];
704
+ }, this._activateOnCharTimeout);
705
+ return true;
706
+ }
707
+ return false;
708
+ }
717
709
 
718
- /**
719
- * @overridable
720
- * @param {{chars: string[], item: HTMLElement}} config
721
- */
722
- // eslint-disable-next-line class-methods-use-this
723
- _matchCharsAgainstItem({ chars, item }) {
724
- const value = getValue(item).toLowerCase();
725
- return value.startsWith(chars);
710
+ /**
711
+ * @overridable
712
+ * @param {{chars: string[], item: HTMLElement}} config
713
+ */
714
+ // eslint-disable-next-line class-methods-use-this
715
+ _matchCharsAgainstItem({
716
+ chars,
717
+ item
718
+ }) {
719
+ const value = getValue(item).toLowerCase();
720
+ return value.startsWith(chars);
721
+ }
722
+
723
+ /**
724
+ * @param {KeyboardEvent} ev
725
+ */
726
+ __preventScrollingWithArrowKeys(ev) {
727
+ if (this.disabled) {
728
+ return;
729
+ }
730
+ const {
731
+ key
732
+ } = ev;
733
+ switch (key) {
734
+ case 'ArrowUp':
735
+ case 'ArrowDown':
736
+ case 'Home':
737
+ case 'End':
738
+ ev.preventDefault();
739
+ /* no default */
726
740
  }
741
+ }
727
742
 
728
- /**
729
- * @param {KeyboardEvent} ev
730
- */
731
- __preventScrollingWithArrowKeys(ev) {
732
- if (this.disabled) {
733
- return;
734
- }
735
- const { key } = ev;
736
- switch (key) {
737
- case 'ArrowUp':
738
- case 'ArrowDown':
739
- case 'Home':
740
- case 'End':
741
- ev.preventDefault();
742
- /* no default */
743
- }
743
+ /**
744
+ * @overridable
745
+ * @param {FocusEvent} ev
746
+ */
747
+ _onListFocusIn(ev) {
748
+ /** @type {HTMLElement} */
749
+ // @ts-ignore - target is EventTarget
750
+ const {
751
+ target
752
+ } = ev;
753
+ // const item = /** @type {HTMLElement} */ (target.closest('[role]'));
754
+ // @ts-ignore - target is HTMLElement
755
+ const foundIndex = this.listItems.indexOf(target);
756
+ if (foundIndex > -1 && foundIndex !== this.activeIndex) {
757
+ this.activeIndex = foundIndex;
744
758
  }
759
+ }
745
760
 
746
- /**
747
- * @overridable
748
- * @param {FocusEvent} ev
749
- */
750
- _onListFocusIn(ev) {
751
- /** @type {HTMLElement} */
752
- // @ts-ignore - target is EventTarget
753
- const { target } = ev;
754
- // const item = /** @type {HTMLElement} */ (target.closest('[role]'));
755
- // @ts-ignore - target is HTMLElement
756
- const foundIndex = this.listItems.indexOf(target);
757
- if (foundIndex > -1 && foundIndex !== this.activeIndex) {
758
- this.activeIndex = foundIndex;
759
- }
761
+ /**
762
+ * @overridable
763
+ * @param {MouseEvent} ev
764
+ */
765
+ // eslint-disable-next-line class-methods-use-this, no-unused-vars
766
+ _onListClick(ev) {
767
+ /** @type {HTMLElement} */
768
+ // @ts-ignore - target is EventTarget
769
+ const {
770
+ target
771
+ } = ev;
772
+ const item = /** @type {HTMLElement} */target.closest('[role]'); // TODO: we might need a more specific contract
773
+ const foundIndex = this.listItems.indexOf(item);
774
+ if (foundIndex > -1) {
775
+ this.activeIndex = foundIndex;
776
+ this.setCheckedIndex(foundIndex);
760
777
  }
778
+ }
761
779
 
762
- /**
763
- * @overridable
764
- * @param {MouseEvent} ev
765
- */
766
- // eslint-disable-next-line class-methods-use-this, no-unused-vars
767
- _onListClick(ev) {
768
- /** @type {HTMLElement} */
769
- // @ts-ignore - target is EventTarget
770
- const { target } = ev;
771
- const item = /** @type {HTMLElement} */ (target.closest('[role]')); // TODO: we might need a more specific contract
772
- const foundIndex = this.listItems.indexOf(item);
773
- if (foundIndex > -1) {
774
- this.activeIndex = foundIndex;
775
- this.setCheckedIndex(foundIndex);
776
- }
780
+ /**
781
+ * @overridable
782
+ * @param {KeyboardEvent} ev
783
+ */
784
+ // eslint-disable-next-line class-methods-use-this, no-unused-vars
785
+ _onListKeyUp(ev) {
786
+ if (this.disabled) {
787
+ return;
788
+ }
789
+ const {
790
+ key
791
+ } = ev;
792
+ // eslint-disable-next-line default-case
793
+ switch (key) {
794
+ case 'ArrowUp':
795
+ case 'ArrowDown':
796
+ case 'Home':
797
+ case 'End':
798
+ case ' ':
799
+ case 'Enter':
800
+ ev.preventDefault();
777
801
  }
802
+ }
778
803
 
804
+ /**
805
+ * @param {number} currentIndex
806
+ * @param {number} offset
807
+ */
808
+ __getNextOption(currentIndex, offset) {
779
809
  /**
780
- * @overridable
781
- * @param {KeyboardEvent} ev
810
+ * @param {number} i
782
811
  */
783
- // eslint-disable-next-line class-methods-use-this, no-unused-vars
784
- _onListKeyUp(ev) {
785
- if (this.disabled) {
786
- return;
787
- }
788
- const { key } = ev;
789
- // eslint-disable-next-line default-case
790
- switch (key) {
791
- case 'ArrowUp':
792
- case 'ArrowDown':
793
- case 'Home':
794
- case 'End':
795
- case ' ':
796
- case 'Enter':
797
- ev.preventDefault();
812
+ const until = i => offset === 1 ? i < this.listItems.length : i >= 0;
813
+ for (let i = currentIndex + offset; until(i); i += offset) {
814
+ if (this.listItems[i] && !isDisabled(this.listItems[i])) {
815
+ return i;
798
816
  }
799
817
  }
800
-
801
- /**
802
- * @param {number} currentIndex
803
- * @param {number} offset
804
- */
805
- __getNextOption(currentIndex, offset) {
806
- /**
807
- * @param {number} i
808
- */
809
- const until = i => (offset === 1 ? i < this.listItems.length : i >= 0);
810
-
811
- for (let i = currentIndex + offset; until(i); i += offset) {
818
+ if (this.wrap) {
819
+ const startIndex = offset === -1 ? this.listItems.length - 1 : 0;
820
+ for (let i = startIndex; until(i); i += 1) {
812
821
  if (this.listItems[i] && !isDisabled(this.listItems[i])) {
813
822
  return i;
814
823
  }
815
824
  }
816
-
817
- if (this.wrap) {
818
- const startIndex = offset === -1 ? this.listItems.length - 1 : 0;
819
- for (let i = startIndex; until(i); i += 1) {
820
- if (this.listItems[i] && !isDisabled(this.listItems[i])) {
821
- return i;
822
- }
823
- }
824
- }
825
- return currentIndex;
826
825
  }
826
+ return currentIndex;
827
+ }
827
828
 
828
- /**
829
- * @param {number} currentIndex
830
- * @param {number} [offset=1]
831
- */
832
- _getNextEnabledOption(currentIndex, offset = 1) {
833
- return this.__getNextOption(currentIndex, offset);
834
- }
829
+ /**
830
+ * @param {number} currentIndex
831
+ * @param {number} [offset=1]
832
+ */
833
+ _getNextEnabledOption(currentIndex, offset = 1) {
834
+ return this.__getNextOption(currentIndex, offset);
835
+ }
835
836
 
836
- /**
837
- * @param {number} currentIndex
838
- * @param {number} [offset=-1]
839
- */
840
- _getPreviousEnabledOption(currentIndex, offset = -1) {
841
- return this.__getNextOption(currentIndex, offset);
842
- }
837
+ /**
838
+ * @param {number} currentIndex
839
+ * @param {number} [offset=-1]
840
+ */
841
+ _getPreviousEnabledOption(currentIndex, offset = -1) {
842
+ return this.__getNextOption(currentIndex, offset);
843
+ }
843
844
 
844
- /**
845
- * @param {Location} location
846
- */
847
- _syncCurrentPageWithLocationHref(location) {
848
- this.listItems.forEach(item => {
849
- if (/** @type {HTMLAnchorElement} */ (item).href) {
850
- const pathname = location.href.endsWith('/')
851
- ? location.href.substring(0, location.href.length - 1)
852
- : location.href;
853
- if (pathname === /** @type {HTMLAnchorElement} */ (item).href) {
854
- setChecked(item);
855
- } else {
856
- setChecked(item, true);
857
- }
845
+ /**
846
+ * @param {Location} location
847
+ */
848
+ _syncCurrentPageWithLocationHref(location) {
849
+ this.listItems.forEach(item => {
850
+ if (/** @type {HTMLAnchorElement} */item.href) {
851
+ const pathname = location.href.endsWith('/') ? location.href.substring(0, location.href.length - 1) : location.href;
852
+ if (pathname === /** @type {HTMLAnchorElement} */item.href) {
853
+ setChecked(item);
854
+ } else {
855
+ setChecked(item, true);
858
856
  }
859
- });
860
- }
857
+ }
858
+ });
859
+ }
861
860
 
862
- /** @protected */
863
- _onPopState = () => {
864
- this._syncCurrentPageWithLocationHref(document.location);
865
- };
866
- });
861
+ /** @protected */
862
+ _onPopState = () => {
863
+ this._syncCurrentPageWithLocationHref(document.location);
864
+ };
865
+ };
867
866
  export const InteractiveListMixin = dedupeMixin(InteractiveListMixinImplementation);