@m3e/web 2.1.3 → 2.2.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 (185) hide show
  1. package/README.md +3 -0
  2. package/dist/all.js +2765 -343
  3. package/dist/all.js.map +1 -1
  4. package/dist/all.min.js +77 -41
  5. package/dist/all.min.js.map +1 -1
  6. package/dist/app-bar.js +14 -7
  7. package/dist/app-bar.js.map +1 -1
  8. package/dist/app-bar.min.js +1 -1
  9. package/dist/app-bar.min.js.map +1 -1
  10. package/dist/autocomplete.js +5 -9
  11. package/dist/autocomplete.js.map +1 -1
  12. package/dist/autocomplete.min.js +1 -1
  13. package/dist/autocomplete.min.js.map +1 -1
  14. package/dist/bottom-sheet.js +8 -27
  15. package/dist/bottom-sheet.js.map +1 -1
  16. package/dist/bottom-sheet.min.js +1 -1
  17. package/dist/bottom-sheet.min.js.map +1 -1
  18. package/dist/calendar.js +1082 -0
  19. package/dist/calendar.js.map +1 -0
  20. package/dist/calendar.min.js +43 -0
  21. package/dist/calendar.min.js.map +1 -0
  22. package/dist/chips.js +2 -6
  23. package/dist/chips.js.map +1 -1
  24. package/dist/chips.min.js +1 -1
  25. package/dist/chips.min.js.map +1 -1
  26. package/dist/core-a11y.js +23 -9
  27. package/dist/core-a11y.js.map +1 -1
  28. package/dist/core-a11y.min.js +4 -4
  29. package/dist/core-a11y.min.js.map +1 -1
  30. package/dist/core-anchoring.js +135 -15
  31. package/dist/core-anchoring.js.map +1 -1
  32. package/dist/core-anchoring.min.js +1 -1
  33. package/dist/core-anchoring.min.js.map +1 -1
  34. package/dist/core.js +101 -1
  35. package/dist/core.js.map +1 -1
  36. package/dist/core.min.js +1 -1
  37. package/dist/core.min.js.map +1 -1
  38. package/dist/css-custom-data.json +819 -319
  39. package/dist/custom-elements.json +16252 -11972
  40. package/dist/datepicker.js +552 -0
  41. package/dist/datepicker.js.map +1 -0
  42. package/dist/datepicker.min.js +7 -0
  43. package/dist/datepicker.min.js.map +1 -0
  44. package/dist/fab-menu.js +1 -1
  45. package/dist/fab-menu.js.map +1 -1
  46. package/dist/fab-menu.min.js +1 -1
  47. package/dist/fab-menu.min.js.map +1 -1
  48. package/dist/form-field.js +2 -6
  49. package/dist/form-field.js.map +1 -1
  50. package/dist/form-field.min.js +3 -3
  51. package/dist/form-field.min.js.map +1 -1
  52. package/dist/html-custom-data.json +478 -112
  53. package/dist/menu.js +3 -7
  54. package/dist/menu.js.map +1 -1
  55. package/dist/menu.min.js +1 -1
  56. package/dist/menu.min.js.map +1 -1
  57. package/dist/nav-menu.js +3 -11
  58. package/dist/nav-menu.js.map +1 -1
  59. package/dist/nav-menu.min.js +1 -1
  60. package/dist/nav-menu.min.js.map +1 -1
  61. package/dist/nav-rail.js +2 -6
  62. package/dist/nav-rail.js.map +1 -1
  63. package/dist/nav-rail.min.js +1 -1
  64. package/dist/nav-rail.min.js.map +1 -1
  65. package/dist/option.js +3 -7
  66. package/dist/option.js.map +1 -1
  67. package/dist/option.min.js +1 -1
  68. package/dist/option.min.js.map +1 -1
  69. package/dist/paginator.js.map +1 -1
  70. package/dist/paginator.min.js.map +1 -1
  71. package/dist/search.js +805 -0
  72. package/dist/search.js.map +1 -0
  73. package/dist/search.min.js +7 -0
  74. package/dist/search.min.js.map +1 -0
  75. package/dist/select.js +3 -14
  76. package/dist/select.js.map +1 -1
  77. package/dist/select.min.js +1 -1
  78. package/dist/select.min.js.map +1 -1
  79. package/dist/snackbar.js +2 -6
  80. package/dist/snackbar.js.map +1 -1
  81. package/dist/snackbar.min.js +1 -1
  82. package/dist/snackbar.min.js.map +1 -1
  83. package/dist/src/all.d.ts +3 -0
  84. package/dist/src/all.d.ts.map +1 -1
  85. package/dist/src/app-bar/AppBarElement.d.ts +6 -4
  86. package/dist/src/app-bar/AppBarElement.d.ts.map +1 -1
  87. package/dist/src/autocomplete/AutocompleteElement.d.ts +2 -2
  88. package/dist/src/autocomplete/AutocompleteElement.d.ts.map +1 -1
  89. package/dist/src/autocomplete/AutocompleteQueryEventDetail.d.ts +12 -0
  90. package/dist/src/autocomplete/AutocompleteQueryEventDetail.d.ts.map +1 -0
  91. package/dist/src/autocomplete/QueryEventDetail.d.ts +3 -8
  92. package/dist/src/autocomplete/QueryEventDetail.d.ts.map +1 -1
  93. package/dist/src/autocomplete/index.d.ts +1 -0
  94. package/dist/src/autocomplete/index.d.ts.map +1 -1
  95. package/dist/src/bottom-sheet/BottomSheetElement.d.ts.map +1 -1
  96. package/dist/src/calendar/CalendarElement.d.ts +213 -0
  97. package/dist/src/calendar/CalendarElement.d.ts.map +1 -0
  98. package/dist/src/calendar/CalendarView.d.ts +3 -0
  99. package/dist/src/calendar/CalendarView.d.ts.map +1 -0
  100. package/dist/src/calendar/CalendarViewElementBase.d.ts +28 -0
  101. package/dist/src/calendar/CalendarViewElementBase.d.ts.map +1 -0
  102. package/dist/src/calendar/MonthViewElement.d.ts +36 -0
  103. package/dist/src/calendar/MonthViewElement.d.ts.map +1 -0
  104. package/dist/src/calendar/MultiYearViewElement.d.ts +27 -0
  105. package/dist/src/calendar/MultiYearViewElement.d.ts.map +1 -0
  106. package/dist/src/calendar/YearViewElement.d.ts +27 -0
  107. package/dist/src/calendar/YearViewElement.d.ts.map +1 -0
  108. package/dist/src/calendar/index.d.ts +7 -0
  109. package/dist/src/calendar/index.d.ts.map +1 -0
  110. package/dist/src/calendar/utils.d.ts +24 -0
  111. package/dist/src/calendar/utils.d.ts.map +1 -0
  112. package/dist/src/chips/InputChipSetElement.d.ts.map +1 -1
  113. package/dist/src/core/a11y/FocusTrapElement.d.ts.map +1 -1
  114. package/dist/src/core/a11y/InteractivityChecker.d.ts.map +1 -1
  115. package/dist/src/core/anchoring/AnchorOptions.d.ts +1 -1
  116. package/dist/src/core/anchoring/AnchorOptions.d.ts.map +1 -1
  117. package/dist/src/core/anchoring/FloatingPanelElement.d.ts +18 -3
  118. package/dist/src/core/anchoring/FloatingPanelElement.d.ts.map +1 -1
  119. package/dist/src/core/anchoring/positionAnchor.d.ts.map +1 -1
  120. package/dist/src/core/shared/controllers/InertController.d.ts +19 -0
  121. package/dist/src/core/shared/controllers/InertController.d.ts.map +1 -0
  122. package/dist/src/core/shared/controllers/index.d.ts +1 -0
  123. package/dist/src/core/shared/controllers/index.d.ts.map +1 -1
  124. package/dist/src/core/shared/converters/dateConverter.d.ts +4 -0
  125. package/dist/src/core/shared/converters/dateConverter.d.ts.map +1 -0
  126. package/dist/src/core/shared/converters/index.d.ts +1 -0
  127. package/dist/src/core/shared/converters/index.d.ts.map +1 -1
  128. package/dist/src/core/shared/utils/index.d.ts +1 -0
  129. package/dist/src/core/shared/utils/index.d.ts.map +1 -1
  130. package/dist/src/core/shared/utils/registerStyleSheet.d.ts +7 -0
  131. package/dist/src/core/shared/utils/registerStyleSheet.d.ts.map +1 -0
  132. package/dist/src/datepicker/DatepickerElement.d.ts +237 -0
  133. package/dist/src/datepicker/DatepickerElement.d.ts.map +1 -0
  134. package/dist/src/datepicker/DatepickerToggleElement.d.ts +21 -0
  135. package/dist/src/datepicker/DatepickerToggleElement.d.ts.map +1 -0
  136. package/dist/src/datepicker/DatepickerVariant.d.ts +3 -0
  137. package/dist/src/datepicker/DatepickerVariant.d.ts.map +1 -0
  138. package/dist/src/datepicker/index.d.ts +4 -0
  139. package/dist/src/datepicker/index.d.ts.map +1 -0
  140. package/dist/src/form-field/FormFieldElement.d.ts.map +1 -1
  141. package/dist/src/menu/MenuElement.d.ts.map +1 -1
  142. package/dist/src/nav-menu/NavMenuElement.d.ts.map +1 -1
  143. package/dist/src/nav-menu/NavMenuItemElement.d.ts.map +1 -1
  144. package/dist/src/nav-rail/NavRailElement.d.ts.map +1 -1
  145. package/dist/src/option/OptionPanelElement.d.ts.map +1 -1
  146. package/dist/src/paginator/PageEventDetail.d.ts +6 -11
  147. package/dist/src/paginator/PageEventDetail.d.ts.map +1 -1
  148. package/dist/src/paginator/PaginatorElement.d.ts +2 -2
  149. package/dist/src/paginator/PaginatorElement.d.ts.map +1 -1
  150. package/dist/src/paginator/PaginatorPageEventDetail.d.ts +12 -0
  151. package/dist/src/paginator/PaginatorPageEventDetail.d.ts.map +1 -0
  152. package/dist/src/paginator/index.d.ts +1 -0
  153. package/dist/src/paginator/index.d.ts.map +1 -1
  154. package/dist/src/search/SearchBarElement.d.ts +92 -0
  155. package/dist/src/search/SearchBarElement.d.ts.map +1 -0
  156. package/dist/src/search/SearchViewElement.d.ts +146 -0
  157. package/dist/src/search/SearchViewElement.d.ts.map +1 -0
  158. package/dist/src/search/SearchViewMode.d.ts +3 -0
  159. package/dist/src/search/SearchViewMode.d.ts.map +1 -0
  160. package/dist/src/search/SearchViewQueryEventDetail.d.ts +12 -0
  161. package/dist/src/search/SearchViewQueryEventDetail.d.ts.map +1 -0
  162. package/dist/src/search/index.d.ts +5 -0
  163. package/dist/src/search/index.d.ts.map +1 -0
  164. package/dist/src/search/styles/SearchBarStyle.d.ts +12 -0
  165. package/dist/src/search/styles/SearchBarStyle.d.ts.map +1 -0
  166. package/dist/src/search/styles/SearchBarToken.d.ts +27 -0
  167. package/dist/src/search/styles/SearchBarToken.d.ts.map +1 -0
  168. package/dist/src/search/styles/SearchViewStyle.d.ts +12 -0
  169. package/dist/src/search/styles/SearchViewStyle.d.ts.map +1 -0
  170. package/dist/src/search/styles/SearchViewToken.d.ts +26 -0
  171. package/dist/src/search/styles/SearchViewToken.d.ts.map +1 -0
  172. package/dist/src/search/styles/index.d.ts +3 -0
  173. package/dist/src/search/styles/index.d.ts.map +1 -0
  174. package/dist/src/select/SelectElement.d.ts.map +1 -1
  175. package/dist/src/snackbar/SnackbarElement.d.ts.map +1 -1
  176. package/dist/src/stepper/StepperElement.d.ts.map +1 -1
  177. package/dist/stepper.js +2 -6
  178. package/dist/stepper.js.map +1 -1
  179. package/dist/stepper.min.js +1 -1
  180. package/dist/stepper.min.js.map +1 -1
  181. package/dist/tooltip.js +1 -1
  182. package/dist/tooltip.js.map +1 -1
  183. package/dist/tooltip.min.js +1 -1
  184. package/dist/tooltip.min.js.map +1 -1
  185. package/package.json +16 -1
@@ -3,7 +3,7 @@
3
3
  * Copyright (c) 2025 matraic
4
4
  * See LICENSE file in the project root for full license text.
5
5
  */
6
- import{__classPrivateFieldGet as t,__classPrivateFieldSet as e,__decorate as i}from"tslib";import{hasKeys as s,isDisabledMixin as n,isCheckedOrSelected as a,checkOrSelect as r,Disabled as o,customElement as h}from"@m3e/web/core";import{isServer as l,LitElement as c,html as d,css as m}from"lit";import{query as u}from"lit/decorators.js";const f=["alt","shift","ctrl","meta"];var p,v,g,w,b,A,k,y,I,S,E,D,N,P;function M(t){return t.which||t.charCode||t.keyCode}function x(t,...e){return e.length?e.some(e=>t[`${e}Key`]):t.altKey||t.shiftKey||t.ctrlKey||t.metaKey}function F(t,...e){return f.every(i=>!x(t,i)||e.includes(i))}!function(t){t[t.Backspace=8]="Backspace",t[t.Tab=9]="Tab",t[t.Enter=13]="Enter",t[t.Shift=16]="Shift",t[t.Ctrl=17]="Ctrl",t[t.Alt=18]="Alt",t[t.PauseBreak=19]="PauseBreak",t[t.CapsLock=20]="CapsLock",t[t.Escape=27]="Escape",t[t.Space=32]="Space",t[t.PageUp=33]="PageUp",t[t.PageDown=34]="PageDown",t[t.End=35]="End",t[t.Home=36]="Home",t[t.LeftArrow=37]="LeftArrow",t[t.UpArrow=38]="UpArrow",t[t.RightArrow=39]="RightArrow",t[t.DownArrow=40]="DownArrow",t[t.Insert=45]="Insert",t[t.Delete=46]="Delete",t[t.Zero=48]="Zero",t[t.ClosedParen=48]="ClosedParen",t[t.One=49]="One",t[t.ExclamationMark=49]="ExclamationMark",t[t.Two=50]="Two",t[t.AtSign=50]="AtSign",t[t.Three=51]="Three",t[t.PoundSign=51]="PoundSign",t[t.Hash=51]="Hash",t[t.Four=52]="Four",t[t.DollarSign=52]="DollarSign",t[t.Five=53]="Five",t[t.PercentSign=53]="PercentSign",t[t.Six=54]="Six",t[t.Caret=54]="Caret",t[t.Hat=54]="Hat",t[t.Seven=55]="Seven",t[t.Ampersand=55]="Ampersand",t[t.Eight=56]="Eight",t[t.Star=56]="Star",t[t.Asterik=56]="Asterik",t[t.Nine=57]="Nine",t[t.OpenParen=57]="OpenParen",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z",t[t.LeftWindowKey=91]="LeftWindowKey",t[t.RightWindowKey=92]="RightWindowKey",t[t.SelectKey=93]="SelectKey",t[t.Numpad0=96]="Numpad0",t[t.Numpad1=97]="Numpad1",t[t.Numpad2=98]="Numpad2",t[t.Numpad3=99]="Numpad3",t[t.Numpad4=100]="Numpad4",t[t.Numpad5=101]="Numpad5",t[t.Numpad6=102]="Numpad6",t[t.Numpad7=103]="Numpad7",t[t.Numpad8=104]="Numpad8",t[t.Numpad9=105]="Numpad9",t[t.Multiply=106]="Multiply",t[t.Add=107]="Add",t[t.Subtract=109]="Subtract",t[t.DecimalPoint=110]="DecimalPoint",t[t.Divide=111]="Divide",t[t.F1=112]="F1",t[t.F2=113]="F2",t[t.F3=114]="F3",t[t.F4=115]="F4",t[t.F5=116]="F5",t[t.F6=117]="F6",t[t.F7=118]="F7",t[t.F8=119]="F8",t[t.F9=120]="F9",t[t.F10=121]="F10",t[t.F11=122]="F11",t[t.F12=123]="F12",t[t.NumLock=144]="NumLock",t[t.ScrollLock=145]="ScrollLock",t[t.SemiColon=186]="SemiColon",t[t.Equals=187]="Equals",t[t.Comma=188]="Comma",t[t.Dash=189]="Dash",t[t.Period=190]="Period",t[t.UnderScore=189]="UnderScore",t[t.PlusSign=187]="PlusSign",t[t.ForwardSlash=191]="ForwardSlash",t[t.Tilde=192]="Tilde",t[t.GraveAccent=192]="GraveAccent",t[t.OpenBracket=219]="OpenBracket",t[t.ClosedBracket=221]="ClosedBracket",t[t.Quote=222]="Quote"}(p||(p={}));class T{constructor(){v.set(this,new Array),g.set(this,null),w.set(this,void 0)}get items(){return t(this,v,"f")}get activeItem(){return t(this,g,"f")}setItems(t){const i=this.items.filter(e=>!t.includes(e)),s=t.filter(t=>!this.items.includes(t));return e(this,v,t,"f"),this.activeItem&&!this.items.includes(this.activeItem)&&this.updateActiveItem(null),{added:s,removed:i}}setActiveItem(e){this.activeItem!==e&&(this.updateActiveItem(e),t(this,w,"f")?.call(this))}updateActiveItem(t){e(this,g,t??null,"f")}onActiveItemChange(t){return e(this,w,t,"f"),this}}v=new WeakMap,g=new WeakMap,w=new WeakMap;const C=Symbol("typeaheadLabel");function W(t){return s(t,C)}class L{constructor(t){b.add(this),A.set(this,void 0),k.set(this,-1),y.set(this,void 0),I.set(this,void 0),S.set(this,new Array),E.set(this,-1),D.set(this,[]),e(this,A,t.debounceInterval??200,"f"),e(this,y,t.callback,"f"),e(this,I,t.skipPredicate,"f")}get isTyping(){return t(this,S,"f").length>0}setItems(t){e(this,D,t,"f")}setSelectedIndex(t){e(this,E,t,"f")}reset(){t(this,S,"f").length=0}onKeyDown(e){if(e.key&&1===e.key.length)t(this,b,"m",N).call(this,e.key);else{const i=M(e);(i>=p.A&&i<=p.Z||i>=p.Zero&&i<=p.Nine)&&t(this,b,"m",N).call(this,String.fromCharCode(i))}}}
6
+ import{__classPrivateFieldGet as t,__classPrivateFieldSet as e,__decorate as i}from"tslib";import{hasKeys as s,isDisabledMixin as n,isCheckedOrSelected as a,checkOrSelect as r,Disabled as o,customElement as h}from"@m3e/web/core";import{isServer as l,LitElement as c,html as d,css as m}from"lit";import{query as u}from"lit/decorators.js";const f=["alt","shift","ctrl","meta"];var p,v,g,w,b,A,k,y,I,E,S,N,D,M;function P(t){return t.which||t.charCode||t.keyCode}function T(t,...e){return e.length?e.some(e=>t[`${e}Key`]):t.altKey||t.shiftKey||t.ctrlKey||t.metaKey}function x(t,...e){return f.every(i=>!T(t,i)||e.includes(i))}!function(t){t[t.Backspace=8]="Backspace",t[t.Tab=9]="Tab",t[t.Enter=13]="Enter",t[t.Shift=16]="Shift",t[t.Ctrl=17]="Ctrl",t[t.Alt=18]="Alt",t[t.PauseBreak=19]="PauseBreak",t[t.CapsLock=20]="CapsLock",t[t.Escape=27]="Escape",t[t.Space=32]="Space",t[t.PageUp=33]="PageUp",t[t.PageDown=34]="PageDown",t[t.End=35]="End",t[t.Home=36]="Home",t[t.LeftArrow=37]="LeftArrow",t[t.UpArrow=38]="UpArrow",t[t.RightArrow=39]="RightArrow",t[t.DownArrow=40]="DownArrow",t[t.Insert=45]="Insert",t[t.Delete=46]="Delete",t[t.Zero=48]="Zero",t[t.ClosedParen=48]="ClosedParen",t[t.One=49]="One",t[t.ExclamationMark=49]="ExclamationMark",t[t.Two=50]="Two",t[t.AtSign=50]="AtSign",t[t.Three=51]="Three",t[t.PoundSign=51]="PoundSign",t[t.Hash=51]="Hash",t[t.Four=52]="Four",t[t.DollarSign=52]="DollarSign",t[t.Five=53]="Five",t[t.PercentSign=53]="PercentSign",t[t.Six=54]="Six",t[t.Caret=54]="Caret",t[t.Hat=54]="Hat",t[t.Seven=55]="Seven",t[t.Ampersand=55]="Ampersand",t[t.Eight=56]="Eight",t[t.Star=56]="Star",t[t.Asterik=56]="Asterik",t[t.Nine=57]="Nine",t[t.OpenParen=57]="OpenParen",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z",t[t.LeftWindowKey=91]="LeftWindowKey",t[t.RightWindowKey=92]="RightWindowKey",t[t.SelectKey=93]="SelectKey",t[t.Numpad0=96]="Numpad0",t[t.Numpad1=97]="Numpad1",t[t.Numpad2=98]="Numpad2",t[t.Numpad3=99]="Numpad3",t[t.Numpad4=100]="Numpad4",t[t.Numpad5=101]="Numpad5",t[t.Numpad6=102]="Numpad6",t[t.Numpad7=103]="Numpad7",t[t.Numpad8=104]="Numpad8",t[t.Numpad9=105]="Numpad9",t[t.Multiply=106]="Multiply",t[t.Add=107]="Add",t[t.Subtract=109]="Subtract",t[t.DecimalPoint=110]="DecimalPoint",t[t.Divide=111]="Divide",t[t.F1=112]="F1",t[t.F2=113]="F2",t[t.F3=114]="F3",t[t.F4=115]="F4",t[t.F5=116]="F5",t[t.F6=117]="F6",t[t.F7=118]="F7",t[t.F8=119]="F8",t[t.F9=120]="F9",t[t.F10=121]="F10",t[t.F11=122]="F11",t[t.F12=123]="F12",t[t.NumLock=144]="NumLock",t[t.ScrollLock=145]="ScrollLock",t[t.SemiColon=186]="SemiColon",t[t.Equals=187]="Equals",t[t.Comma=188]="Comma",t[t.Dash=189]="Dash",t[t.Period=190]="Period",t[t.UnderScore=189]="UnderScore",t[t.PlusSign=187]="PlusSign",t[t.ForwardSlash=191]="ForwardSlash",t[t.Tilde=192]="Tilde",t[t.GraveAccent=192]="GraveAccent",t[t.OpenBracket=219]="OpenBracket",t[t.ClosedBracket=221]="ClosedBracket",t[t.Quote=222]="Quote"}(p||(p={}));class F{constructor(){v.set(this,new Array),g.set(this,null),w.set(this,void 0)}get items(){return t(this,v,"f")}get activeItem(){return t(this,g,"f")}setItems(t){const i=this.items.filter(e=>!t.includes(e)),s=t.filter(t=>!this.items.includes(t));return e(this,v,t,"f"),this.activeItem&&!this.items.includes(this.activeItem)&&this.updateActiveItem(null),{added:s,removed:i}}setActiveItem(e){this.activeItem!==e&&(this.updateActiveItem(e),t(this,w,"f")?.call(this))}updateActiveItem(t){e(this,g,t??null,"f")}onActiveItemChange(t){return e(this,w,t,"f"),this}}v=new WeakMap,g=new WeakMap,w=new WeakMap;const C=Symbol("typeaheadLabel");function W(t){return s(t,C)}class L{constructor(t){b.add(this),A.set(this,void 0),k.set(this,-1),y.set(this,void 0),I.set(this,void 0),E.set(this,new Array),S.set(this,-1),N.set(this,[]),e(this,A,t.debounceInterval??200,"f"),e(this,y,t.callback,"f"),e(this,I,t.skipPredicate,"f")}get isTyping(){return t(this,E,"f").length>0}setItems(t){e(this,N,t,"f")}setSelectedIndex(t){e(this,S,t,"f")}reset(){t(this,E,"f").length=0}onKeyDown(e){if(e.key&&1===e.key.length)t(this,b,"m",D).call(this,e.key);else{const i=P(e);(i>=p.A&&i<=p.Z||i>=p.Zero&&i<=p.Nine)&&t(this,b,"m",D).call(this,String.fromCharCode(i))}}}
7
7
  /**
8
8
  * Adapted from Angular Material CDK KeyManager
9
9
  * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/key-manager/list-key-manager.ts
@@ -12,7 +12,7 @@ import{__classPrivateFieldGet as t,__classPrivateFieldSet as e,__decorate as i}f
12
12
  * Copyright (c) 2025 Google LLC
13
13
  * See LICENSE file in the project root for full license text.
14
14
  */
15
- var R,O,U,K,H,B,$,Z,j,_,G,Q,q,V,J,X;A=new WeakMap,k=new WeakMap,y=new WeakMap,I=new WeakMap,S=new WeakMap,E=new WeakMap,D=new WeakMap,b=new WeakSet,N=function(i){t(this,S,"f").push(i.toLocaleUpperCase()),clearTimeout(t(this,k,"f")),e(this,k,setTimeout(()=>t(this,b,"m",P).call(this),t(this,A,"f")),"f")},P=function(){const e=t(this,S,"f").join("");for(let i=1;i<t(this,D,"f").length+1;i++){const s=(t(this,E,"f")+i)%t(this,D,"f").length,n=t(this,D,"f")[s],a=n[C]?.().toLocaleUpperCase().trim();if(!t(this,I,"f")?.call(this,n)&&0===a?.indexOf(e)){t(this,y,"f").call(this,n);break}}this.reset()};class Y extends T{constructor(){super(...arguments),R.add(this),O.set(this,void 0),this.wrap=!1,this.homeAndEnd=!1,this.pageUpAndDown=!1,this.pageDelta=10,this.vertical=!1,this.allowedModifiers=[],this.skipPredicate=t=>n(t)&&t.disabled,this.directionality="ltr"}setItems(e){return t(this,O,"f")?.setItems(e),super.setItems(e)}updateActiveItem(e){super.updateActiveItem(e),t(this,O,"f")&&t(this,O,"f").setSelectedIndex(e?this.items.indexOf(e):-1)}withHomeAndEnd(t=!0){return this.homeAndEnd=t,this}withPageUpAndDown(t=!0,e=10){return this.pageUpAndDown=t,this.pageDelta=e,this}withWrap(t=!0){return this.wrap=t,this}withVerticalOrientation(t=!0){return this.vertical=t,this}withAllowedModifiers(...t){return this.allowedModifiers=t,this}withTypeahead(t=!0){return e(this,O,t?new L({callback:t=>this.setActiveItem(t)}):void 0,"f"),this}withSkipPredicate(t){return this.skipPredicate=t,this}withDirectionality(t){return this.directionality=t,this}onKeyDown(e){if(e.defaultPrevented)return;const i=F(e,...this.allowedModifiers);switch(e.key){case"Left":case"ArrowLeft":if(i&&!this.vertical){e.preventDefault();const i="ltr"===this.directionality?t(this,R,"m",B).call(this):t(this,R,"m",H).call(this);i&&this.setActiveItem(i)}break;case"Up":case"ArrowUp":if(i){e.preventDefault();const i="ltr"===this.directionality?t(this,R,"m",B).call(this):t(this,R,"m",H).call(this);i&&this.setActiveItem(i)}break;case"Right":case"ArrowRight":if(i&&!this.vertical){e.preventDefault();const i="ltr"===this.directionality?t(this,R,"m",H).call(this):t(this,R,"m",B).call(this);i&&this.setActiveItem(i)}break;case"Down":case"ArrowDown":if(i){e.preventDefault();const i="ltr"===this.directionality?t(this,R,"m",H).call(this):t(this,R,"m",B).call(this);i&&this.setActiveItem(i)}break;case"Home":if(i&&this.homeAndEnd){e.preventDefault();const i=t(this,R,"m",U).call(this);i&&this.setActiveItem(i)}break;case"End":if(i&&this.homeAndEnd){e.preventDefault();const i=t(this,R,"m",K).call(this);i&&this.setActiveItem(i)}break;case"PageUp":if(i&&this.pageUpAndDown){e.preventDefault();const i=("ltr"===this.directionality?t(this,R,"m",$):t(this,R,"m",Z))(this.activeItem?Math.max(0,this.items.indexOf(this.activeItem)-this.pageDelta):0);i&&this.setActiveItem(i)}break;case"PageDown":if(i&&this.pageUpAndDown){e.preventDefault();const i=("ltr"===this.directionality?t(this,R,"m",Z):t(this,R,"m",$))(this.activeItem?Math.min(this.items.length-1,this.items.indexOf(this.activeItem)+this.pageDelta):this.items.length-1);i&&this.setActiveItem(i)}break;default:(i||x(e,"shift"))&&t(this,O,"f")?.onKeyDown(e)}}}O=new WeakMap,R=new WeakSet,U=function(){for(let t=0;t<this.items.length&&this.items[t]!==this.activeItem;t++){const e=this.items[t];if(!this.skipPredicate(e))return e}return null},K=function(){for(let t=this.items.length-1;t>=0&&this.items[t]!==this.activeItem;t--){const e=this.items[t];if(!this.skipPredicate(e))return e}return null},H=function(){for(let t=0;t<this.items.length;t++)if(this.items[t]===this.activeItem){for(let e=t+1;e<this.items.length;e++){const t=this.items[e];if(!this.skipPredicate(t))return t}break}return this.wrap?t(this,R,"m",U).call(this):null},B=function(){for(let t=0;t<this.items.length;t++)if(this.items[t]===this.activeItem){for(let e=t-1;e>=0;e--){const t=this.items[e];if(!this.skipPredicate(t))return t}break}return this.wrap?t(this,R,"m",K).call(this):null},$=function(t){for(let e=t;e>=0;e--){const t=this.items[e];if(!this.skipPredicate(t))return t}return null},Z=function(t){for(let e=t;e<this.items.length;e++){const t=this.items[e];if(!this.skipPredicate(t))return t}return null};class z extends Y{constructor(){super(...arguments),j.set(this,void 0)}setActiveItem(e){super.setActiveItem(e),e?.focus(t(this,j,"f"))}withOptions(t){return e(this,j,t,"f"),this}}j=new WeakMap;class tt extends z{constructor(){super(...arguments),_.set(this,!1)}updateActiveItem(e){if(super.updateActiveItem(e),!t(this,_,"f")){e?.setAttribute("tabindex","0");for(const t of this.items)t!==e&&t.hasAttribute("tabindex")&&t.setAttribute("tabindex","-1")}}setItems(e){const i=super.setItems(e);if(!t(this,_,"f"))for(const t of i.added)t===this.activeItem||this.skipPredicate(t)||t.setAttribute("tabindex","-1");return i}disableRovingTabIndex(i=!0){if(i!==t(this,_,"f")){e(this,_,i,"f");for(const e of this.items)this.skipPredicate(e)||e?.setAttribute("tabindex",t(this,_,"f")||e===this.activeItem?"0":"-1")}return this}}_=new WeakMap;class et extends tt{constructor(){super(...arguments),G.set(this,!1)}get disabled(){return t(this,G,"f")}set disabled(t){e(this,G,t,"f"),this.items.forEach(e=>e.disabled=t)}setItems(t){this.disabled&&t.forEach(t=>t.disabled=!0);const{added:e,removed:i}=super.setItems(t);if((e.length>0||i.length>0)&&(this.activeItem||this.updateActiveItem(e.find(t=>!this.skipPredicate(t))??null),this.activeItem&&(this.activeItem.disabled||!a(this.activeItem)))){const t=e.find(t=>!this.skipPredicate(t)&&a(t));t&&this.updateActiveItem(t)}return{added:e,removed:i}}}G=new WeakMap;const it=Symbol("selectionManager");class st extends et{constructor(){super(...arguments),Q.add(this),q.set(this,void 0),V.set(this,new Array),J.set(this,!1)}get multi(){return t(this,J,"f")}set multi(i){e(this,J,i,"f"),t(this,Q,"m",X).call(this,!0)}get selectedItems(){return t(this,V,"f")}notifySelectionChange(t){this.items.includes(t)&&(a(t)?this.select(t):this.deselect(t))}deselect(e){if(this.items.includes(e)){a(e)&&r(e,!1);const i=t(this,V,"f").indexOf(e);i>=0&&(t(this,V,"f").splice(i,1),t(this,q,"f")?.call(this))}}select(e,i=!0){if(!e||this.items.includes(e)){if(!this.multi){for(const i of t(this,V,"f"))i!==e&&r(i,!1);t(this,V,"f").length=0}e&&(t(this,V,"f").push(e),a(e)||r(e,!0)),i&&this.updateActiveItem(e),t(this,q,"f")?.call(this)}}setItems(i){const{added:s,removed:n}=super.setItems(i);return e(this,V,t(this,V,"f").filter(t=>!n.includes(t)),"f"),t(this,V,"f").push(...s.filter(t=>a(t))),t(this,Q,"m",X).call(this),t(this,q,"f")?.call(this),{added:s,removed:n}}onSelectedItemsChange(t){return e(this,q,t,"f"),this}}
15
+ var R,O,U,K,H,B,$,Z,_,j,G,Q,q,V,J,X;A=new WeakMap,k=new WeakMap,y=new WeakMap,I=new WeakMap,E=new WeakMap,S=new WeakMap,N=new WeakMap,b=new WeakSet,D=function(i){t(this,E,"f").push(i.toLocaleUpperCase()),clearTimeout(t(this,k,"f")),e(this,k,setTimeout(()=>t(this,b,"m",M).call(this),t(this,A,"f")),"f")},M=function(){const e=t(this,E,"f").join("");for(let i=1;i<t(this,N,"f").length+1;i++){const s=(t(this,S,"f")+i)%t(this,N,"f").length,n=t(this,N,"f")[s],a=n[C]?.().toLocaleUpperCase().trim();if(!t(this,I,"f")?.call(this,n)&&0===a?.indexOf(e)){t(this,y,"f").call(this,n);break}}this.reset()};class Y extends F{constructor(){super(...arguments),R.add(this),O.set(this,void 0),this.wrap=!1,this.homeAndEnd=!1,this.pageUpAndDown=!1,this.pageDelta=10,this.vertical=!1,this.allowedModifiers=[],this.skipPredicate=t=>n(t)&&t.disabled,this.directionality="ltr"}setItems(e){return t(this,O,"f")?.setItems(e),super.setItems(e)}updateActiveItem(e){super.updateActiveItem(e),t(this,O,"f")&&t(this,O,"f").setSelectedIndex(e?this.items.indexOf(e):-1)}withHomeAndEnd(t=!0){return this.homeAndEnd=t,this}withPageUpAndDown(t=!0,e=10){return this.pageUpAndDown=t,this.pageDelta=e,this}withWrap(t=!0){return this.wrap=t,this}withVerticalOrientation(t=!0){return this.vertical=t,this}withAllowedModifiers(...t){return this.allowedModifiers=t,this}withTypeahead(t=!0){return e(this,O,t?new L({callback:t=>this.setActiveItem(t)}):void 0,"f"),this}withSkipPredicate(t){return this.skipPredicate=t,this}withDirectionality(t){return this.directionality=t,this}onKeyDown(e){if(e.defaultPrevented)return;const i=x(e,...this.allowedModifiers);switch(e.key){case"Left":case"ArrowLeft":if(i&&!this.vertical){e.preventDefault();const i="ltr"===this.directionality?t(this,R,"m",B).call(this):t(this,R,"m",H).call(this);i&&this.setActiveItem(i)}break;case"Up":case"ArrowUp":if(i){e.preventDefault();const i="ltr"===this.directionality?t(this,R,"m",B).call(this):t(this,R,"m",H).call(this);i&&this.setActiveItem(i)}break;case"Right":case"ArrowRight":if(i&&!this.vertical){e.preventDefault();const i="ltr"===this.directionality?t(this,R,"m",H).call(this):t(this,R,"m",B).call(this);i&&this.setActiveItem(i)}break;case"Down":case"ArrowDown":if(i){e.preventDefault();const i="ltr"===this.directionality?t(this,R,"m",H).call(this):t(this,R,"m",B).call(this);i&&this.setActiveItem(i)}break;case"Home":if(i&&this.homeAndEnd){e.preventDefault();const i=t(this,R,"m",U).call(this);i&&this.setActiveItem(i)}break;case"End":if(i&&this.homeAndEnd){e.preventDefault();const i=t(this,R,"m",K).call(this);i&&this.setActiveItem(i)}break;case"PageUp":if(i&&this.pageUpAndDown){e.preventDefault();const i=("ltr"===this.directionality?t(this,R,"m",$):t(this,R,"m",Z))(this.activeItem?Math.max(0,this.items.indexOf(this.activeItem)-this.pageDelta):0);i&&this.setActiveItem(i)}break;case"PageDown":if(i&&this.pageUpAndDown){e.preventDefault();const i=("ltr"===this.directionality?t(this,R,"m",Z):t(this,R,"m",$))(this.activeItem?Math.min(this.items.length-1,this.items.indexOf(this.activeItem)+this.pageDelta):this.items.length-1);i&&this.setActiveItem(i)}break;default:(i||T(e,"shift"))&&t(this,O,"f")?.onKeyDown(e)}}}O=new WeakMap,R=new WeakSet,U=function(){for(let t=0;t<this.items.length&&this.items[t]!==this.activeItem;t++){const e=this.items[t];if(!this.skipPredicate(e))return e}return null},K=function(){for(let t=this.items.length-1;t>=0&&this.items[t]!==this.activeItem;t--){const e=this.items[t];if(!this.skipPredicate(e))return e}return null},H=function(){for(let t=0;t<this.items.length;t++)if(this.items[t]===this.activeItem){for(let e=t+1;e<this.items.length;e++){const t=this.items[e];if(!this.skipPredicate(t))return t}break}return this.wrap?t(this,R,"m",U).call(this):null},B=function(){for(let t=0;t<this.items.length;t++)if(this.items[t]===this.activeItem){for(let e=t-1;e>=0;e--){const t=this.items[e];if(!this.skipPredicate(t))return t}break}return this.wrap?t(this,R,"m",K).call(this):null},$=function(t){for(let e=t;e>=0;e--){const t=this.items[e];if(!this.skipPredicate(t))return t}return null},Z=function(t){for(let e=t;e<this.items.length;e++){const t=this.items[e];if(!this.skipPredicate(t))return t}return null};class z extends Y{constructor(){super(...arguments),_.set(this,void 0)}setActiveItem(e){super.setActiveItem(e),e?.focus(t(this,_,"f"))}withOptions(t){return e(this,_,t,"f"),this}}_=new WeakMap;class tt extends z{constructor(){super(...arguments),j.set(this,!1)}updateActiveItem(e){if(super.updateActiveItem(e),!t(this,j,"f")){e?.setAttribute("tabindex","0");for(const t of this.items)t!==e&&t.hasAttribute("tabindex")&&t.setAttribute("tabindex","-1")}}setItems(e){const i=super.setItems(e);if(!t(this,j,"f"))for(const t of i.added)t===this.activeItem||this.skipPredicate(t)||t.setAttribute("tabindex","-1");return i}disableRovingTabIndex(i=!0){if(i!==t(this,j,"f")){e(this,j,i,"f");for(const e of this.items)this.skipPredicate(e)||e?.setAttribute("tabindex",t(this,j,"f")||e===this.activeItem?"0":"-1")}return this}}j=new WeakMap;class et extends tt{constructor(){super(...arguments),G.set(this,!1)}get disabled(){return t(this,G,"f")}set disabled(t){e(this,G,t,"f"),this.items.forEach(e=>e.disabled=t)}setItems(t){this.disabled&&t.forEach(t=>t.disabled=!0);const{added:e,removed:i}=super.setItems(t);if((e.length>0||i.length>0)&&(this.activeItem||this.updateActiveItem(e.find(t=>!this.skipPredicate(t))??null),this.activeItem&&(this.activeItem.disabled||!a(this.activeItem)))){const t=e.find(t=>!this.skipPredicate(t)&&a(t));t&&this.updateActiveItem(t)}return{added:e,removed:i}}}G=new WeakMap;const it=Symbol("selectionManager");class st extends et{constructor(){super(...arguments),Q.add(this),q.set(this,void 0),V.set(this,new Array),J.set(this,!1)}get multi(){return t(this,J,"f")}set multi(i){e(this,J,i,"f"),t(this,Q,"m",X).call(this,!0)}get selectedItems(){return t(this,V,"f")}notifySelectionChange(t){this.items.includes(t)&&(a(t)?this.select(t):this.deselect(t))}deselect(e){if(this.items.includes(e)){a(e)&&r(e,!1);const i=t(this,V,"f").indexOf(e);i>=0&&(t(this,V,"f").splice(i,1),t(this,q,"f")?.call(this))}}select(e,i=!0){if(!e||this.items.includes(e)){if(!this.multi){for(const i of t(this,V,"f"))i!==e&&r(i,!1);t(this,V,"f").length=0}e&&(t(this,V,"f").push(e),a(e)||r(e,!0)),i&&this.updateActiveItem(e),t(this,q,"f")?.call(this)}}setItems(i){const{added:s,removed:n}=super.setItems(i);return e(this,V,t(this,V,"f").filter(t=>!n.includes(t)),"f"),t(this,V,"f").push(...s.filter(t=>a(t))),t(this,Q,"m",X).call(this),t(this,q,"f")?.call(this),{added:s,removed:n}}onSelectedItemsChange(t){return e(this,q,t,"f"),this}}
16
16
  /**
17
17
  * Adapted from Angular Material CDK AriaDescriber
18
18
  * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/aria-describer/aria-reference.ts
@@ -29,7 +29,7 @@ function nt(t,e){return t.getAttribute(e)?.match(/\S+/g)??[]}function at(t,e,i){
29
29
  * @license MIT
30
30
  * Copyright (c) 2025 Google LLC
31
31
  * See LICENSE file in the project root for full license text.
32
- */var ht,lt,ct,dt,mt,ut,ft,pt,vt,gt,wt,bt,At;q=new WeakMap,V=new WeakMap,J=new WeakMap,Q=new WeakSet,X=function(e=!1){if(!this.multi&&t(this,V,"f").length>1){for(let e=1;e<t(this,V,"f").length;e++)r(t(this,V,"f")[e],!1);t(this,V,"f").length=1,e&&t(this,q,"f")?.call(this)}};class kt{static describe(e,i,s="tooltip"){if(l)return;const n=e.getRootNode();if(!(n instanceof ShadowRoot||n instanceof Document))return;let a=t(this,ht,"f",ct).get(n);a||(a={containerElement:t(this,ht,"m",dt).call(this),messageRegistry:new Map},(n instanceof Document?n.body:n).appendChild(a.containerElement),t(this,ht,"f",ct).set(n,a));const r=`${s}:${i}`;let o=a.messageRegistry.get(r);o||(o={messageElement:t(this,ht,"m",mt).call(this,i,s),count:0},a.containerElement.appendChild(o.messageElement),a.messageRegistry.set(r,o)),o.count++,at(e,"aria-describedby",o.messageElement.id)}static removeDescription(e,i,s="tooltip"){if(l)return;const n=e.getRootNode(),a=t(this,ht,"f",ct).get(n);if(!a)return;const r=`${s}:${i}`,o=a.messageRegistry.get(r);o&&(o.count--,rt(e,"aria-describedby",o.messageElement.id),o.count<=0&&(o.messageElement.remove(),a.messageRegistry.delete(r)),0==a.messageRegistry.size&&(a.containerElement?.remove(),t(this,ht,"f",ct).delete(n)))}}ht=kt,dt=function(){const t=document.createElement("div");return t.classList.add("m3e-describedby-message-container"),ot(t.style),t},mt=function(i,s){var n,a;const r=document.createElement("span");return r.id=`m3e-describedby-message-${e(this,ht,(a=t(this,ht,"f",lt),n=a++,a),"f",lt),n}`,r.role=s,r.ariaAtomic="true",r.innerText=i.trim(),r},lt={value:0},ct={value:new Map},globalThis.M3eAriaDescriber=kt;class yt{static isFocusable(e,i){return e.matches(":is(button,input,select,textarea,object,:is(a,area)[href],[tabindex],[contenteditable=true]):not(:disabled,[disabled])")?!t(this,ut,"m",ft).call(this,i):!(!e.localName.includes("-")||!e.matches(":not(:disabled,[disabled])")||"true"===e.getAttribute("aria-disabled"))&&(!!e.shadowRoot?.delegatesFocus&&!t(this,ut,"m",ft).call(this,i))}static findInteractiveElements(t){const e=new Array,i=t.ownerDocument.createTreeWalker(t,NodeFilter.SHOW_ELEMENT);for(let t=i.nextNode();t;t=i.nextNode()){const t=i.currentNode;this.isFocusable(t)&&e.push(t)}return e}}ut=yt,ft=function(t){return t?.some(t=>t.matches(":is([aria-hidden='true'],:disabled,[disabled])"))??!1},globalThis.M3eInteractivityChecker=yt;let It=class extends(o(c)){constructor(){super(...arguments),pt.add(this)}render(){const e=d`<div class="trap" .inert="${this.disabled}" tabindex="0" aria-hidden="true" @focus="${t(this,pt,"m",vt)}"></div>`;return d`${e}<slot></slot>${e}`}};
32
+ */var ht,lt,ct,dt,mt,ut,ft,pt,vt,gt,wt,bt,At,kt;q=new WeakMap,V=new WeakMap,J=new WeakMap,Q=new WeakSet,X=function(e=!1){if(!this.multi&&t(this,V,"f").length>1){for(let e=1;e<t(this,V,"f").length;e++)r(t(this,V,"f")[e],!1);t(this,V,"f").length=1,e&&t(this,q,"f")?.call(this)}};class yt{static describe(e,i,s="tooltip"){if(l)return;const n=e.getRootNode();if(!(n instanceof ShadowRoot||n instanceof Document))return;let a=t(this,ht,"f",ct).get(n);a||(a={containerElement:t(this,ht,"m",dt).call(this),messageRegistry:new Map},(n instanceof Document?n.body:n).appendChild(a.containerElement),t(this,ht,"f",ct).set(n,a));const r=`${s}:${i}`;let o=a.messageRegistry.get(r);o||(o={messageElement:t(this,ht,"m",mt).call(this,i,s),count:0},a.containerElement.appendChild(o.messageElement),a.messageRegistry.set(r,o)),o.count++,at(e,"aria-describedby",o.messageElement.id)}static removeDescription(e,i,s="tooltip"){if(l)return;const n=e.getRootNode(),a=t(this,ht,"f",ct).get(n);if(!a)return;const r=`${s}:${i}`,o=a.messageRegistry.get(r);o&&(o.count--,rt(e,"aria-describedby",o.messageElement.id),o.count<=0&&(o.messageElement.remove(),a.messageRegistry.delete(r)),0==a.messageRegistry.size&&(a.containerElement?.remove(),t(this,ht,"f",ct).delete(n)))}}ht=yt,dt=function(){const t=document.createElement("div");return t.classList.add("m3e-describedby-message-container"),ot(t.style),t},mt=function(i,s){var n,a;const r=document.createElement("span");return r.id=`m3e-describedby-message-${e(this,ht,(a=t(this,ht,"f",lt),n=a++,a),"f",lt),n}`,r.role=s,r.ariaAtomic="true",r.innerText=i.trim(),r},lt={value:0},ct={value:new Map},globalThis.M3eAriaDescriber=yt;class It{static isFocusable(e,i){return e.matches(":is(button,input,select,textarea,object,:is(a,area)[href],[tabindex]:not([tabindex='-1']),[contenteditable=true]):not(:disabled,[disabled],[hidden])")?!t(this,ut,"m",pt).call(this,e)&&!t(this,ut,"m",ft).call(this,i):!(!e.localName.includes("-")||!e.matches(":not(:disabled,[disabled])")||"true"===e.getAttribute("aria-disabled"))&&(!!e.shadowRoot?.delegatesFocus&&(!t(this,ut,"m",pt).call(this,e)&&!t(this,ut,"m",ft).call(this,i)))}static findInteractiveElements(t){const e=new Array,i=t.ownerDocument.createTreeWalker(t,NodeFilter.SHOW_ELEMENT);for(let t=i.nextNode();t;t=i.nextNode()){const t=i.currentNode;this.isFocusable(t)&&e.push(t)}return e}}ut=It,ft=function(e){return e?.some(e=>e.matches(":is([aria-hidden='true'],:disabled,[disabled],[inert],[hidden])")||t(this,ut,"m",pt).call(this,e))??!1},pt=function(t){const e=getComputedStyle(t);return"none"===e.display||"hidden"===e.visibility},globalThis.M3eInteractivityChecker=It;let Et=class extends(o(c)){constructor(){super(...arguments),vt.add(this)}render(){const e=d`<div class="trap" .inert="${this.disabled}" tabindex="0" aria-hidden="true" @focus="${t(this,vt,"m",gt)}"></div>`;return d`${e}<slot></slot>${e}`}};
33
33
  /**
34
34
  * Adapted from Angular Material CDK Live Announcer
35
35
  * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/live-announcer/live-announcer.ts
@@ -38,5 +38,5 @@ function nt(t,e){return t.getAttribute(e)?.match(/\S+/g)??[]}function at(t,e,i){
38
38
  * Copyright (c) 2025 Google LLC
39
39
  * See LICENSE file in the project root for full license text.
40
40
  */
41
- var St,Et,Dt,Nt,Pt,Mt,xt;pt=new WeakSet,vt=function(e){function i(t,e){return t===e||t instanceof HTMLElement&&null!==t.shadowRoot&&t.shadowRoot.contains(e)}const[s,n]=t(this,pt,"m",gt).call(this),a=e?.target===this._firstTrap,r=i(e.relatedTarget,s),o=i(e.relatedTarget,n),h=!r&&!o;!a&&o||a&&h?s?.focus():(a&&r||!a&&h)&&n?.focus()},gt=function(){let e=null,i=null;return t(this,pt,"m",wt).call(this,this,[],(t,s)=>{yt.isFocusable(t,s)&&t instanceof HTMLElement&&t.tabIndex>=0&&(e=e??t,i=t)}),[e,i]},wt=function e(i,s,n){s=[...s,i];for(const a of i.childNodes){if(a.nodeType!==Node.ELEMENT_NODE)continue;const i=a;n(i,s),i.shadowRoot?t(this,pt,"m",bt).call(this,i,s,n):i instanceof HTMLSlotElement?t(this,pt,"m",At).call(this,i,s,n):i.hasChildNodes()&&t(this,pt,"m",e).call(this,i,s,n)}},bt=function(e,i,s){for(const n of e.shadowRoot?.childNodes??[]){if(n.nodeType!==Node.ELEMENT_NODE)continue;const e=n;s(e,i),e.hasChildNodes()&&t(this,pt,"m",wt).call(this,e,i,s)}},At=function(e,i,s){for(const n of e.assignedElements())s(n,i),n.hasChildNodes()&&t(this,pt,"m",wt).call(this,n,i,s)},It.styles=m`:host { display: contents; } .trap { outline: none; }`,i([u(".trap")],It.prototype,"_firstTrap",void 0),It=i([h("m3e-focus-trap")],It);class Ft{static announce(i,...s){if(l)return Promise.resolve();let n,a;e(this,St,t(this,St,"f",Dt)??t(this,St,"m",xt).call(this),"f",Dt),1===s.length&&"number"==typeof s[0]?a=s[0]:[n,a]=s,this.clear(),clearTimeout(t(this,St,"f",Nt)),t(this,St,"f",Dt).setAttribute("aria-live",n??"polite");for(const e of document.querySelectorAll("m3e-dialog"))at(e,"aria-owns",t(this,St,"f",Dt).id);return e(this,St,t(this,St,"f",Pt)??new Promise(t=>e(this,St,t,"f",Mt)),"f",Pt),clearTimeout(t(this,St,"f",Nt)),e(this,St,setTimeout(()=>{t(this,St,"f",Dt)&&(t(this,St,"f",Dt).textContent=i,void 0!==a&&e(this,St,setTimeout(()=>this.clear(),a),"f",Nt),t(this,St,"f",Mt)?.call(this),e(this,St,e(this,St,void 0,"f",Mt),"f",Pt))},100),"f",Nt),t(this,St,"f",Pt)}static clear(){t(this,St,"f",Dt)&&(t(this,St,"f",Dt).textContent="")}}St=Ft,xt=function(){var i,s;const n=document.getElementsByClassName("m3e-live-announcer");for(let t=0;t<n.length;t++)n[t].remove();const a=document.createElement("div");return a.classList.add("m3e-live-announcer"),a.setAttribute("aria-atomic","true"),a.setAttribute("aria-live","polite"),a.id=`m3e-live-announcer-${e(this,St,(s=t(this,St,"f",Et),i=s++,s),"f",Et),i}`,ot(a.style),document.body.append(a),a},Et={value:0},Dt={value:void 0},Nt={value:void 0},Pt={value:void 0},Mt={value:void 0},globalThis.M3eLiveAnnouncer=Ft;export{z as FocusKeyManager,p as KeyCode,Y as ListKeyManager,T as ListManager,kt as M3eAriaDescriber,It as M3eFocusTrapElement,yt as M3eInteractivityChecker,Ft as M3eLiveAnnouncer,f as ModifierKeys,et as RadioKeyManager,tt as RovingTabIndexManager,st as SelectionManager,L as Typeahead,at as addAriaReferencedId,nt as getAriaReferenceIds,M as getKeyCode,x as hasModifierKey,F as isModifierAllowed,W as isTypeaheadItem,rt as removeAriaReferencedId,it as selectionManager,C as typeaheadLabel};
41
+ var St,Nt,Dt,Mt,Pt,Tt,xt;vt=new WeakSet,gt=function(e){function i(t,e){return t===e||t instanceof HTMLElement&&null!==t.shadowRoot&&t.shadowRoot.contains(e)}const[s,n]=t(this,vt,"m",wt).call(this),a=e?.target===this._firstTrap,r=i(e.relatedTarget,s),o=i(e.relatedTarget,n),h=!r&&!o;!a&&o||a&&h?s?.focus():(a&&r||!a&&h)&&n?.focus()},wt=function(){let e=null,i=null;return t(this,vt,"m",bt).call(this,this,[],(t,s)=>{It.isFocusable(t,s)&&t instanceof HTMLElement&&t.tabIndex>=0&&(e=e??t,i=t)}),[e,i]},bt=function e(i,s,n){s=[...s,i];for(const a of i.childNodes){if(a.nodeType!==Node.ELEMENT_NODE)continue;const i=a;n(i,s),i.shadowRoot?t(this,vt,"m",At).call(this,i,s,n):i instanceof HTMLSlotElement?t(this,vt,"m",kt).call(this,i,s,n):i.hasChildNodes()&&t(this,vt,"m",e).call(this,i,s,n)}},At=function(e,i,s){for(const n of e.shadowRoot?.childNodes??[]){if(n.nodeType!==Node.ELEMENT_NODE)continue;const e=n;s(e,i),e.hasChildNodes()&&t(this,vt,"m",bt).call(this,e,i,s)}},kt=function e(i,s,n){s=[...s,i];let a=i.assignedElements();0==a.length&&i.hasChildNodes()&&(a=i.childNodes);for(const i of a){if(i.nodeType!==Node.ELEMENT_NODE)continue;const a=i;a instanceof HTMLSlotElement?t(this,vt,"m",e).call(this,a,s,n):(n(a,s),a.hasChildNodes()&&t(this,vt,"m",bt).call(this,a,s,n))}},Et.styles=m`:host { display: contents; } .trap { outline: none; }`,i([u(".trap")],Et.prototype,"_firstTrap",void 0),Et=i([h("m3e-focus-trap")],Et);class Ft{static announce(i,...s){if(l)return Promise.resolve();let n,a;e(this,St,t(this,St,"f",Dt)??t(this,St,"m",xt).call(this),"f",Dt),1===s.length&&"number"==typeof s[0]?a=s[0]:[n,a]=s,this.clear(),clearTimeout(t(this,St,"f",Mt)),t(this,St,"f",Dt).setAttribute("aria-live",n??"polite");for(const e of document.querySelectorAll("m3e-dialog"))at(e,"aria-owns",t(this,St,"f",Dt).id);return e(this,St,t(this,St,"f",Pt)??new Promise(t=>e(this,St,t,"f",Tt)),"f",Pt),clearTimeout(t(this,St,"f",Mt)),e(this,St,setTimeout(()=>{t(this,St,"f",Dt)&&(t(this,St,"f",Dt).textContent=i,void 0!==a&&e(this,St,setTimeout(()=>this.clear(),a),"f",Mt),t(this,St,"f",Tt)?.call(this),e(this,St,e(this,St,void 0,"f",Tt),"f",Pt))},100),"f",Mt),t(this,St,"f",Pt)}static clear(){t(this,St,"f",Dt)&&(t(this,St,"f",Dt).textContent="")}}St=Ft,xt=function(){var i,s;const n=document.getElementsByClassName("m3e-live-announcer");for(let t=0;t<n.length;t++)n[t].remove();const a=document.createElement("div");return a.classList.add("m3e-live-announcer"),a.setAttribute("aria-atomic","true"),a.setAttribute("aria-live","polite"),a.id=`m3e-live-announcer-${e(this,St,(s=t(this,St,"f",Nt),i=s++,s),"f",Nt),i}`,ot(a.style),document.body.append(a),a},Nt={value:0},Dt={value:void 0},Mt={value:void 0},Pt={value:void 0},Tt={value:void 0},globalThis.M3eLiveAnnouncer=Ft;export{z as FocusKeyManager,p as KeyCode,Y as ListKeyManager,F as ListManager,yt as M3eAriaDescriber,Et as M3eFocusTrapElement,It as M3eInteractivityChecker,Ft as M3eLiveAnnouncer,f as ModifierKeys,et as RadioKeyManager,tt as RovingTabIndexManager,st as SelectionManager,L as Typeahead,at as addAriaReferencedId,nt as getAriaReferenceIds,P as getKeyCode,T as hasModifierKey,x as isModifierAllowed,W as isTypeaheadItem,rt as removeAriaReferencedId,it as selectionManager,C as typeaheadLabel};
42
42
  //# sourceMappingURL=core-a11y.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-a11y.min.js","sources":["../../src/core/a11y/keycodes/ModifierKeys.ts","../../src/core/a11y/keycodes/KeyCode.ts","../../src/core/a11y/keycodes/getKeyCode.ts","../../src/core/a11y/keycodes/hasModifierKey.ts","../../src/core/a11y/keycodes/isModifierAllowed.ts","../../src/core/a11y/list-key/ListManager.ts","../../src/core/a11y/list-key/Typeahead.ts","../../src/core/a11y/list-key/ListKeyManager.ts","../../src/core/a11y/list-key/FocusKeyManager.ts","../../src/core/a11y/list-key/RovingTabIndexManager.ts","../../src/core/a11y/list-key/RadioKeyManager.ts","../../src/core/a11y/list-key/SelectionManager.ts","../../src/core/a11y/aria-reference.ts","../../src/core/a11y/visuallyHide.ts","../../src/core/a11y/AriaDescriber.ts","../../src/core/a11y/InteractivityChecker.ts","../../src/core/a11y/FocusTrapElement.ts","../../src/core/a11y/LiveAnnouncer.ts"],"sourcesContent":["/** Specifies the keyboard modifier keys. */\r\nexport type ModifierKey = \"alt\" | \"shift\" | \"ctrl\" | \"meta\";\r\n\r\n/** The modifier keys. */\r\nexport const ModifierKeys: readonly ModifierKey[] = [\"alt\", \"shift\", \"ctrl\", \"meta\"];\r\n","/** Specifies known key code values. */\r\nexport enum KeyCode {\r\n Backspace = 8,\r\n Tab = 9,\r\n Enter = 13,\r\n Shift = 16,\r\n Ctrl = 17,\r\n Alt = 18,\r\n PauseBreak = 19,\r\n CapsLock = 20,\r\n Escape = 27,\r\n Space = 32,\r\n PageUp = 33,\r\n PageDown = 34,\r\n End = 35,\r\n Home = 36,\r\n\r\n LeftArrow = 37,\r\n UpArrow = 38,\r\n RightArrow = 39,\r\n DownArrow = 40,\r\n\r\n Insert = 45,\r\n Delete = 46,\r\n\r\n Zero = 48,\r\n ClosedParen = Zero,\r\n One = 49,\r\n ExclamationMark = One,\r\n Two = 50,\r\n AtSign = Two,\r\n Three = 51,\r\n PoundSign = Three,\r\n Hash = PoundSign,\r\n Four = 52,\r\n DollarSign = Four,\r\n Five = 53,\r\n PercentSign = Five,\r\n Six = 54,\r\n Caret = Six,\r\n Hat = Caret,\r\n Seven = 55,\r\n Ampersand = Seven,\r\n Eight = 56,\r\n Star = Eight,\r\n Asterik = Star,\r\n Nine = 57,\r\n OpenParen = Nine,\r\n\r\n A = 65,\r\n B = 66,\r\n C = 67,\r\n D = 68,\r\n E = 69,\r\n F = 70,\r\n G = 71,\r\n H = 72,\r\n I = 73,\r\n J = 74,\r\n K = 75,\r\n L = 76,\r\n M = 77,\r\n N = 78,\r\n O = 79,\r\n P = 80,\r\n Q = 81,\r\n R = 82,\r\n S = 83,\r\n T = 84,\r\n U = 85,\r\n V = 86,\r\n W = 87,\r\n X = 88,\r\n Y = 89,\r\n Z = 90,\r\n\r\n LeftWindowKey = 91,\r\n RightWindowKey = 92,\r\n SelectKey = 93,\r\n\r\n Numpad0 = 96,\r\n Numpad1 = 97,\r\n Numpad2 = 98,\r\n Numpad3 = 99,\r\n Numpad4 = 100,\r\n Numpad5 = 101,\r\n Numpad6 = 102,\r\n Numpad7 = 103,\r\n Numpad8 = 104,\r\n Numpad9 = 105,\r\n\r\n Multiply = 106,\r\n Add = 107,\r\n Subtract = 109,\r\n DecimalPoint = 110,\r\n Divide = 111,\r\n\r\n F1 = 112,\r\n F2 = 113,\r\n F3 = 114,\r\n F4 = 115,\r\n F5 = 116,\r\n F6 = 117,\r\n F7 = 118,\r\n F8 = 119,\r\n F9 = 120,\r\n F10 = 121,\r\n F11 = 122,\r\n F12 = 123,\r\n\r\n NumLock = 144,\r\n ScrollLock = 145,\r\n\r\n SemiColon = 186,\r\n Equals = 187,\r\n Comma = 188,\r\n Dash = 189,\r\n Period = 190,\r\n UnderScore = Dash,\r\n PlusSign = Equals,\r\n ForwardSlash = 191,\r\n Tilde = 192,\r\n GraveAccent = Tilde,\r\n\r\n OpenBracket = 219,\r\n ClosedBracket = 221,\r\n Quote = 222,\r\n}\r\n","/**\r\n * Resolves the key code for the specified `KeyboardEvent`.\r\n * @param {KeyboardEvent} e The `KeyboardEvent` for which to resolve the key code.\r\n * @returns {number} The key code for `e`.\r\n */\r\nexport function getKeyCode(e: KeyboardEvent): number {\r\n return e.which || e.charCode || e.keyCode;\r\n}\r\n","import { ModifierKey } from \"./ModifierKeys\";\r\n\r\n/**\r\n * Determines whether a modifier key is pressed.\r\n * @param {KeyboardEvent} e The `KeyboardEvent` to test.\r\n * @param {ModifierKey[]} modifiers The modifier keys to test.\r\n * @returns {boolean} A value indicating whether a modifier key is pressed.\r\n */\r\nexport function hasModifierKey(e: KeyboardEvent, ...modifiers: ModifierKey[]): boolean {\r\n return modifiers.length ? modifiers.some((x) => e[`${x}Key`]) : e.altKey || e.shiftKey || e.ctrlKey || e.metaKey;\r\n}\r\n","import { hasModifierKey } from \"./hasModifierKey\";\r\nimport { ModifierKey, ModifierKeys } from \"./ModifierKeys\";\r\n\r\n/**\r\n * Determines whether the specified modifier keys are allowed.\r\n * @param {KeyboardEvent} e The `KeyboardEvent` to test.\r\n * @param {ModifierKey[]} modifiers The allowed modifier keys.\r\n * @returns {boolean} A value indicating whether `modifiers` are allowed.\r\n */\r\nexport function isModifierAllowed(e: KeyboardEvent, ...modifiers: ModifierKey[]): boolean {\r\n return ModifierKeys.every((x) => !hasModifierKey(e, x) || modifiers.includes(x));\r\n}\r\n","/**\r\n * Utility for managing a list of items which supports activation.\r\n * @template T The type of managed item.\r\n */\r\nexport class ListManager<T> {\r\n /** @private */ #items = new Array<T>();\r\n /** @private */ #activeItem: T | null = null;\r\n /** @private */ #onActiveItemChangeCallback?: () => void;\r\n\r\n /** The items being managed. */\r\n get items(): ReadonlyArray<T> {\r\n return this.#items;\r\n }\r\n\r\n /** The active item. */\r\n get activeItem(): T | null {\r\n return this.#activeItem;\r\n }\r\n\r\n /**\r\n * Sets the items to manage.\r\n * @param {Array<T>} items The new items.\r\n * @returns {{ added: ReadonlyArray<T>; removed: ReadonlyArray<T> }} An object specifying added and removed items.\r\n */\r\n setItems(items: Array<T>): { added: ReadonlyArray<T>; removed: ReadonlyArray<T> } {\r\n const removed = this.items.filter((x) => !items.includes(x));\r\n const added = items.filter((x) => !this.items.includes(x));\r\n\r\n this.#items = items;\r\n\r\n if (this.activeItem && !this.items.includes(this.activeItem)) {\r\n this.updateActiveItem(null);\r\n }\r\n\r\n return { added, removed };\r\n }\r\n\r\n /**\r\n * Sets the active item.\r\n * @param {T | null | undefined} item The new active item.\r\n */\r\n setActiveItem(item: T | null | undefined): void {\r\n if (this.activeItem !== item) {\r\n this.updateActiveItem(item);\r\n this.#onActiveItemChangeCallback?.();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the active item.\r\n * @param {T | null | undefined} item The active item.\r\n */\r\n updateActiveItem(item: T | null | undefined): void {\r\n this.#activeItem = item ?? null;\r\n }\r\n\r\n /**\r\n * Configures the list manager with a callback invoked when an item is activated.\r\n * @param {() => void} callback The callback invoked when an item is activated.\r\n * @returns {ListManager<T>} The configured list manager.\r\n */\r\n onActiveItemChange(callback: () => void): this {\r\n this.#onActiveItemChangeCallback = callback;\r\n return this;\r\n }\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK KeyManager\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/key-manager/typeahead.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\nimport { hasKeys } from \"@m3e/web/core\";\r\n\r\nimport { getKeyCode, KeyCode } from \"../keycodes\";\r\n\r\n/** A symbol through which to access an element's textual content used for typeahead search. */\r\nexport const typeaheadLabel = Symbol(\"typeaheadLabel\");\r\n\r\n/** Defines functionality required for an item that supports searching using typeahead. */\r\nexport interface TypeaheadItem {\r\n /** Returns the textual content to search. */\r\n [typeaheadLabel]?(): string;\r\n}\r\n\r\n/**\r\n * Determines whether a value is a `TypeaheadItem`.\r\n * @param {unknown} value The value to test.\r\n * @returns A value indicating whether `value` is an `TypeaheadItem`.\r\n */\r\nexport function isTypeaheadItem(value: unknown): value is TypeaheadItem {\r\n return hasKeys<TypeaheadItem>(value, typeaheadLabel);\r\n}\r\n\r\n/** Encapsulates options used to select items based on typeahead.\r\n * @template T The type of `TypeaheadItem`.\r\n */\r\nexport interface TypeaheadOptions<T extends TypeaheadItem = TypeaheadItem> {\r\n /** The interval, in milliseconds, before searching items. */\r\n debounceInterval?: number;\r\n\r\n /** Function used to determine whether an item should be skipped. */\r\n skipPredicate?: (item: T) => boolean;\r\n\r\n /** Function invoked when an item is selected. */\r\n callback: (item: T) => void;\r\n}\r\n\r\n/**\r\n * Implements typeahead functionality which selects items based on keyboard input.\r\n * @template T The type of `TypeaheadItem`.\r\n */\r\nexport class Typeahead<T extends TypeaheadItem = TypeaheadItem> {\r\n /** @private */ #debounceInterval: number;\r\n /** @private */ #timeoutId = -1;\r\n /** @private */ #callback: (item: T) => void;\r\n /** @private */ #skipPredicate?: (item: T) => boolean;\r\n\r\n /** @private */ #pressedKeys = new Array<string>();\r\n /** @private */ #selectedIndex = -1;\r\n /** @private */ #items: readonly T[] = [];\r\n\r\n /**\r\n * Initializes a new instance of this class.\r\n * @param {TypeaheadOptions<T>} options Options that control typeahead behavior.\r\n */\r\n constructor(options: TypeaheadOptions<T>) {\r\n this.#debounceInterval = options.debounceInterval ?? 200;\r\n this.#callback = options.callback;\r\n this.#skipPredicate = options.skipPredicate;\r\n }\r\n\r\n /** A value indicating whether the user is currently typing. */\r\n get isTyping(): boolean {\r\n return this.#pressedKeys.length > 0;\r\n }\r\n\r\n /**\r\n * Sets the items to search.\r\n * @param {readonly T[]} items The items to search.\r\n */\r\n setItems(items: readonly T[]): void {\r\n this.#items = items;\r\n }\r\n\r\n /**\r\n * Sets the index of the selected item.\r\n * @param {number} index The index of the selected item.\r\n */\r\n setSelectedIndex(index: number): void {\r\n this.#selectedIndex = index;\r\n }\r\n\r\n /** Resets the stored sequence of typed characters. */\r\n reset(): void {\r\n this.#pressedKeys.length = 0;\r\n }\r\n\r\n /**\r\n * Sets the selected item depending on the key event passed in.\r\n * @param {KeyboardEvent} e The keyboard event to be used for determining which element should be active.\r\n */\r\n onKeyDown(e: KeyboardEvent): void {\r\n if (e.key && e.key.length === 1) {\r\n this.#appendKey(e.key);\r\n } else {\r\n const keycode = getKeyCode(e);\r\n if ((keycode >= KeyCode.A && keycode <= KeyCode.Z) || (keycode >= KeyCode.Zero && keycode <= KeyCode.Nine)) {\r\n this.#appendKey(String.fromCharCode(keycode));\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #appendKey(key: string): void {\r\n this.#pressedKeys.push(key.toLocaleUpperCase());\r\n clearTimeout(this.#timeoutId);\r\n this.#timeoutId = setTimeout(() => this.#searchItems(), this.#debounceInterval);\r\n }\r\n\r\n /** @private */\r\n #searchItems(): void {\r\n const term = this.#pressedKeys.join(\"\");\r\n for (let i = 1; i < this.#items.length + 1; i++) {\r\n const index = (this.#selectedIndex + i) % this.#items.length;\r\n const item = this.#items[index];\r\n const label = item[typeaheadLabel]?.().toLocaleUpperCase().trim();\r\n if (!this.#skipPredicate?.(item) && label?.indexOf(term) === 0) {\r\n this.#callback(item);\r\n break;\r\n }\r\n }\r\n this.reset();\r\n }\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK KeyManager\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/key-manager/list-key-manager.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\nimport { isDisabledMixin } from \"@m3e/web/core\";\r\n\r\nimport { hasModifierKey, isModifierAllowed, ModifierKey } from \"../keycodes\";\r\n\r\nimport { ListManager } from \"./ListManager\";\r\nimport { Typeahead, TypeaheadItem } from \"./Typeahead\";\r\n\r\n/**\r\n * Utility for managing keyboard events for selectable lists.\r\n * @template T The type of managed item.\r\n */\r\nexport class ListKeyManager<T extends HTMLElement & TypeaheadItem> extends ListManager<T> {\r\n /** @private */ #typeahead?: Typeahead<T>;\r\n\r\n /**\r\n * Whether the active item will wrap to the other end of\r\n * list when there are no more items in the given direction.\r\n * @default false\r\n */\r\n public wrap = false;\r\n\r\n /**\r\n * Whether to activate the first and last items respectively when\r\n * the `HOME` or `END` key is pressed.\r\n * @default false\r\n */\r\n public homeAndEnd = false;\r\n\r\n /**\r\n * Whether to activate every 10th (or configured) first/last item\r\n * in the up/down direction when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @default false\r\n */\r\n public pageUpAndDown = false;\r\n\r\n /**\r\n * The number of items to skip when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @default 10\r\n */\r\n public pageDelta = 10;\r\n\r\n /**\r\n * Whether to the list is oriented vertically.\r\n * @default false\r\n */\r\n public vertical = false;\r\n\r\n /** The allowed modifier keys.\r\n * @default []\r\n */\r\n public allowedModifiers: ModifierKey[] = [];\r\n\r\n /**\r\n * A function used to skip items.\r\n * @param {T} item The item to test.\r\n * @returns {boolean} Whether `item` should be skipped.\r\n */\r\n public skipPredicate: (item: T) => boolean = (item) => isDisabledMixin(item) && item.disabled;\r\n\r\n /**\r\n * The directionality.\r\n * @default \"ltr\"\r\n */\r\n public directionality: \"ltr\" | \"rtl\" = \"ltr\";\r\n\r\n /** @inheritdoc */\r\n override setItems(items: T[]): { added: readonly T[]; removed: readonly T[] } {\r\n this.#typeahead?.setItems(items);\r\n return super.setItems(items);\r\n }\r\n\r\n /** @inheritdoc */\r\n override updateActiveItem(item: T | null | undefined): void {\r\n super.updateActiveItem(item);\r\n if (this.#typeahead) {\r\n this.#typeahead.setSelectedIndex(item ? this.items.indexOf(item) : -1);\r\n }\r\n }\r\n\r\n /**\r\n * Configures the key manager to activate the first and last items respectively when the `HOME` or `END` key is pressed.\r\n * @param {boolean} [enabled = true] Whether to activate the first and last items respectively when\r\n * the `HOME` or `END` key is pressed.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withHomeAndEnd(enabled: boolean = true): this {\r\n this.homeAndEnd = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures the key manager to page up and down when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @param {boolean} [enabled = true] Whether to activate page up and down when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @param {number} [pageDelta=10] The number of items to skip when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withPageUpAndDown(enabled: boolean = true, pageDelta: number = 10): this {\r\n this.pageUpAndDown = enabled;\r\n this.pageDelta = pageDelta;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures wrapping mode, which determines whether the active item will wrap to the other end of list when there are no more items in the given direction.\r\n * @param {boolean} [enabled = true] Whether the active item will wrap to the other end of\r\n * list when there are no more items in the given direction.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withWrap(enabled: boolean = true): this {\r\n this.wrap = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures whether to move the selection vertically.\r\n * @param {boolean} [enabled = true] Whether to move selection vertically.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withVerticalOrientation(enabled: boolean = true): this {\r\n this.vertical = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configured allowed modifier keys.\r\n * @param {ModifierKey[]} modifiers The allowed modifier keys.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withAllowedModifiers(...modifiers: ModifierKey[]): this {\r\n this.allowedModifiers = modifiers;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures whether typeahead is enabled.\r\n * @param {boolean} [enabled = true] Whether typeahead is enabled.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withTypeahead(enabled: boolean = true): this {\r\n if (enabled) {\r\n this.#typeahead = new Typeahead<T>({ callback: (item) => this.setActiveItem(item) });\r\n } else {\r\n this.#typeahead = undefined;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures a function used to test whether an item should be skipped.\r\n * @param skipPredicate A function used to determine whether an item should be skipped.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withSkipPredicate(skipPredicate: (item: T) => boolean): this {\r\n this.skipPredicate = skipPredicate;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures the directionality.\r\n * @param {\"ltr\" | \"rtl\"} directionality The directionality.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withDirectionality(directionality: \"ltr\" | \"rtl\"): this {\r\n this.directionality = directionality;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the active item depending on the key event passed in.\r\n * @param {KeyboardEvent} e The keyboard event to be used for determining which element should be active.\r\n */\r\n onKeyDown(e: KeyboardEvent): void {\r\n if (e.defaultPrevented) return;\r\n\r\n const modifierAllowed = isModifierAllowed(e, ...this.allowedModifiers);\r\n\r\n switch (e.key) {\r\n case \"Left\":\r\n case \"ArrowLeft\":\r\n if (modifierAllowed && !this.vertical) {\r\n e.preventDefault();\r\n const prev = this.directionality === \"ltr\" ? this.#findPrevious() : this.#findNext();\r\n if (prev) {\r\n this.setActiveItem(prev);\r\n }\r\n }\r\n break;\r\n case \"Up\":\r\n case \"ArrowUp\":\r\n if (modifierAllowed) {\r\n e.preventDefault();\r\n const prev = this.directionality === \"ltr\" ? this.#findPrevious() : this.#findNext();\r\n if (prev) {\r\n this.setActiveItem(prev);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"Right\":\r\n case \"ArrowRight\":\r\n if (modifierAllowed && !this.vertical) {\r\n e.preventDefault();\r\n const next = this.directionality === \"ltr\" ? this.#findNext() : this.#findPrevious();\r\n if (next) {\r\n this.setActiveItem(next);\r\n }\r\n }\r\n break;\r\n\r\n case \"Down\":\r\n case \"ArrowDown\":\r\n if (modifierAllowed) {\r\n e.preventDefault();\r\n const next = this.directionality === \"ltr\" ? this.#findNext() : this.#findPrevious();\r\n if (next) {\r\n this.setActiveItem(next);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"Home\":\r\n if (modifierAllowed && this.homeAndEnd) {\r\n e.preventDefault();\r\n const first = this.#findFirst();\r\n if (first) {\r\n this.setActiveItem(first);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"End\":\r\n if (modifierAllowed && this.homeAndEnd) {\r\n e.preventDefault();\r\n const last = this.#findLast();\r\n if (last) {\r\n this.setActiveItem(last);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"PageUp\":\r\n if (modifierAllowed && this.pageUpAndDown) {\r\n e.preventDefault();\r\n const prev = (this.directionality === \"ltr\" ? this.#findPreviousByIndex : this.#findNextByIndex)(\r\n this.activeItem ? Math.max(0, this.items.indexOf(this.activeItem) - this.pageDelta) : 0,\r\n );\r\n if (prev) {\r\n this.setActiveItem(prev);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"PageDown\":\r\n if (modifierAllowed && this.pageUpAndDown) {\r\n e.preventDefault();\r\n const next = (this.directionality === \"ltr\" ? this.#findNextByIndex : this.#findPreviousByIndex)(\r\n this.activeItem\r\n ? Math.min(this.items.length - 1, this.items.indexOf(this.activeItem) + this.pageDelta)\r\n : this.items.length - 1,\r\n );\r\n if (next) {\r\n this.setActiveItem(next);\r\n }\r\n }\r\n\r\n break;\r\n\r\n default:\r\n if (modifierAllowed || hasModifierKey(e, \"shift\")) {\r\n this.#typeahead?.onKeyDown(e);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n /** @private */\r\n #findFirst(): T | null {\r\n for (let i = 0; i < this.items.length; i++) {\r\n if (this.items[i] === this.activeItem) break;\r\n const test = this.items[i];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** @private */\r\n #findLast(): T | null {\r\n for (let i = this.items.length - 1; i >= 0; i--) {\r\n if (this.items[i] === this.activeItem) break;\r\n const test = this.items[i];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** @private */\r\n #findNext(): T | null {\r\n for (let i = 0; i < this.items.length; i++) {\r\n if (this.items[i] === this.activeItem) {\r\n for (let j = i + 1; j < this.items.length; j++) {\r\n const test = this.items[j];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return this.wrap ? this.#findFirst() : null;\r\n }\r\n\r\n /** @private */\r\n #findPrevious(): T | null {\r\n for (let i = 0; i < this.items.length; i++) {\r\n if (this.items[i] === this.activeItem) {\r\n for (let j = i - 1; j >= 0; j--) {\r\n const test = this.items[j];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return this.wrap ? this.#findLast() : null;\r\n }\r\n\r\n /** @private */\r\n #findPreviousByIndex(index: number): T | null {\r\n for (let i = index; i >= 0; i--) {\r\n const test = this.items[i];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** @private */\r\n #findNextByIndex(index: number): T | null {\r\n for (let i = index; i < this.items.length; i++) {\r\n const test = this.items[i];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n","import { ListKeyManager } from \"./ListKeyManager\";\r\n\r\n/**\r\n * Utility for managing keyboard events for selectable lists whose items directly receive focus.\r\n * @template T The type of managed item.\r\n */\r\nexport class FocusKeyManager<T extends HTMLElement> extends ListKeyManager<T> {\r\n /** @private */ #focusOptions?: FocusOptions;\r\n\r\n /** @inheritdoc */\r\n override setActiveItem(item: T | null | undefined): void {\r\n super.setActiveItem(item);\r\n item?.focus(this.#focusOptions);\r\n }\r\n\r\n /**\r\n * Configures the key manager with options used to focus items.\r\n * @param {FocusOptions} options Options used to focus items.\r\n * @returns {FocusKeyManager<T>} The configured key manager.\r\n */\r\n withOptions(options: FocusOptions): this {\r\n this.#focusOptions = options;\r\n return this;\r\n }\r\n}\r\n","import { FocusKeyManager } from \"./FocusKeyManager\";\r\n\r\n/**\r\n * Utility for managing keyboard events and a roving tab index for selectable lists whose items directly receive focus.\r\n * @template T The type of managed item.\r\n */\r\nexport class RovingTabIndexManager<T extends HTMLElement> extends FocusKeyManager<T> {\r\n /** @private */ #disableRovingTabIndex = false;\r\n\r\n /** @inheritdoc */\r\n override updateActiveItem(item: T | null | undefined): void {\r\n super.updateActiveItem(item);\r\n\r\n if (!this.#disableRovingTabIndex) {\r\n item?.setAttribute(\"tabindex\", \"0\");\r\n for (const other of this.items) {\r\n if (other !== item && other.hasAttribute(\"tabindex\")) {\r\n other.setAttribute(\"tabindex\", \"-1\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override setItems(items: T[]): { added: readonly T[]; removed: readonly T[] } {\r\n const result = super.setItems(items);\r\n\r\n if (!this.#disableRovingTabIndex) {\r\n for (const added of result.added) {\r\n if (added !== this.activeItem && !this.skipPredicate(added)) {\r\n added.setAttribute(\"tabindex\", \"-1\");\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Configures whether roving tab index is disabled.\r\n * @param {boolean} [disabled=true] Whether the roving tab index is disabled.\r\n * @returns {RovingTabIndexManager<T>} The configured roving tab index manager.\r\n */\r\n disableRovingTabIndex(disabled: boolean = true): this {\r\n if (disabled !== this.#disableRovingTabIndex) {\r\n this.#disableRovingTabIndex = disabled;\r\n for (const item of this.items) {\r\n if (!this.skipPredicate(item)) {\r\n item?.setAttribute(\"tabindex\", this.#disableRovingTabIndex || item === this.activeItem ? \"0\" : \"-1\");\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n","import { LitElement } from \"lit\";\r\n\r\nimport { CheckedOrSelectedMixin, DisabledMixin, isCheckedOrSelected } from \"@m3e/web/core\";\r\n\r\nimport { RovingTabIndexManager } from \"./RovingTabIndexManager\";\r\n\r\n/**\r\n * Utility for managing keyboard events for selectable lists whose items behave like a radio.\r\n * @template T The type of managed item.\r\n */\r\nexport class RadioKeyManager<\r\n T extends LitElement & DisabledMixin & CheckedOrSelectedMixin,\r\n> extends RovingTabIndexManager<T> {\r\n /** @private */ #disabled = false;\r\n\r\n /** A value indicating whether managed items are disabled. */\r\n get disabled(): boolean {\r\n return this.#disabled;\r\n }\r\n set disabled(value: boolean) {\r\n this.#disabled = value;\r\n this.items.forEach((x) => (x.disabled = value));\r\n }\r\n\r\n /** @inheritdoc */\r\n override setItems(items: T[]): { added: readonly T[]; removed: readonly T[] } {\r\n if (this.disabled) {\r\n items.forEach((x) => (x.disabled = true));\r\n }\r\n\r\n const { added, removed } = super.setItems(items);\r\n\r\n if (added.length > 0 || removed.length > 0) {\r\n if (!this.activeItem) {\r\n this.updateActiveItem(added.find((x) => !this.skipPredicate(x)) ?? null);\r\n }\r\n\r\n if (this.activeItem && (this.activeItem.disabled || !isCheckedOrSelected(this.activeItem))) {\r\n const checked = added.find((x) => !this.skipPredicate(x) && isCheckedOrSelected(x));\r\n if (checked) {\r\n this.updateActiveItem(checked);\r\n }\r\n }\r\n }\r\n\r\n return { added, removed };\r\n }\r\n}\r\n","import { LitElement } from \"lit\";\r\n\r\nimport { CheckedOrSelectedMixin, DisabledMixin, checkOrSelect, isCheckedOrSelected } from \"@m3e/web/core\";\r\n\r\nimport { RadioKeyManager } from \"./RadioKeyManager\";\r\n\r\n/** A symbol through which to access an element's selection manager. */\r\nexport const selectionManager = Symbol(\"selectionManager\");\r\n\r\n/**\r\n * Utility for managing keyboard events for selectable lists where one or more items can be selected.\r\n * @template T The type of managed item.\r\n */\r\nexport class SelectionManager<\r\n T extends LitElement & DisabledMixin & CheckedOrSelectedMixin,\r\n> extends RadioKeyManager<T> {\r\n /** @private */ #onSelectedItemsChangeCallback?: () => void;\r\n /** @private */ #selectedItems = new Array<T>();\r\n /** @private */ #multi = false;\r\n\r\n /** A value indicating whether multiple items can be selected. */\r\n get multi(): boolean {\r\n return this.#multi;\r\n }\r\n set multi(value: boolean) {\r\n this.#multi = value;\r\n this.#enforceSingleSelect(true);\r\n }\r\n\r\n /** The selected items. */\r\n get selectedItems(): readonly T[] {\r\n return this.#selectedItems;\r\n }\r\n\r\n /**\r\n * Selects or deselects the item based on the item's checked or selected state.\r\n * @param {T} item The item whose selection state has changed.\r\n */\r\n notifySelectionChange(item: T): void {\r\n if (this.items.includes(item)) {\r\n if (isCheckedOrSelected(item)) {\r\n this.select(item);\r\n } else {\r\n this.deselect(item);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the specified item.\r\n * @param {T} item The item to deselect.\r\n */\r\n deselect(item: T): void {\r\n if (this.items.includes(item)) {\r\n if (isCheckedOrSelected(item)) {\r\n checkOrSelect(item, false);\r\n }\r\n\r\n const index = this.#selectedItems.indexOf(item);\r\n if (index >= 0) {\r\n this.#selectedItems.splice(index, 1);\r\n this.#onSelectedItemsChangeCallback?.();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the selected item.\r\n * @param {T | null | undefined} item The selected item.\r\n * @param {boolean} [activate=true] A value indicating whether to activate the item.\r\n */\r\n select(item: T | null | undefined, activate: boolean = true): void {\r\n if (!item || this.items.includes(item)) {\r\n if (!this.multi) {\r\n for (const selected of this.#selectedItems) {\r\n if (selected !== item) {\r\n checkOrSelect(selected, false);\r\n }\r\n }\r\n this.#selectedItems.length = 0;\r\n }\r\n\r\n if (item) {\r\n this.#selectedItems.push(item);\r\n if (!isCheckedOrSelected(item)) {\r\n checkOrSelect(item, true);\r\n }\r\n }\r\n\r\n if (activate) {\r\n this.updateActiveItem(item);\r\n }\r\n\r\n this.#onSelectedItemsChangeCallback?.();\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override setItems(items: T[]): { added: readonly T[]; removed: readonly T[] } {\r\n const { added, removed } = super.setItems(items);\r\n\r\n this.#selectedItems = this.#selectedItems.filter((x) => !removed.includes(x));\r\n this.#selectedItems.push(...added.filter((x) => isCheckedOrSelected(x)));\r\n this.#enforceSingleSelect();\r\n this.#onSelectedItemsChangeCallback?.();\r\n return { added, removed };\r\n }\r\n\r\n /**\r\n * Configures the selection manager with a callback invoked when selected items change.\r\n * @param {() => void} callback The callback invoked when selected items change.\r\n * @returns {SelectionManager<T>} The configured selection manager.\r\n */\r\n onSelectedItemsChange(callback: () => void): this {\r\n this.#onSelectedItemsChangeCallback = callback;\r\n return this;\r\n }\r\n\r\n /** @private */\r\n #enforceSingleSelect(emit = false): void {\r\n if (!this.multi && this.#selectedItems.length > 1) {\r\n for (let i = 1; i < this.#selectedItems.length; i++) {\r\n checkOrSelect(this.#selectedItems[i], false);\r\n }\r\n this.#selectedItems.length = 1;\r\n if (emit) {\r\n this.#onSelectedItemsChangeCallback?.();\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK AriaDescriber\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/aria-describer/aria-reference.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\n/**\r\n * Gets a list of IDs referenced by an element for the specified ARIA attribute.\r\n * @param {Element} element The element from which to get referenced IDs.\r\n * @param {`aria-${string}`} attribute The ARIA attribute from which to get referenced IDs.\r\n * @returns {string[]} a list of IDs referenced by `element` for `attribute`.\r\n */\r\nexport function getAriaReferenceIds(element: Element, attribute: `aria-${string}`): string[] {\r\n return element.getAttribute(attribute)?.match(/\\S+/g) ?? [];\r\n}\r\n\r\n/**\r\n * Adds an ID to the list of IDs referenced by an element for a given ARIA attribute.\r\n * @param {Element} element The element to which to add a referenced ID.\r\n * @param {`aria-${string}`} attribute The ARIA attribute to which to add an ID.\r\n * @param {string} id The ID to add.\r\n */\r\nexport function addAriaReferencedId(element: Element, attribute: `aria-${string}`, id: string): void {\r\n id = id.trim();\r\n\r\n const ids = getAriaReferenceIds(element, attribute);\r\n if (!ids.some((existingId) => existingId.trim() === id)) {\r\n ids.push(id);\r\n element.setAttribute(attribute, ids.join(\" \"));\r\n }\r\n}\r\n\r\n/**\r\n * Removes an ID from a list of IDs referenced by an element for the specified ARIA attribute.\r\n * @param {Element} element The element from which to remove an ID.\r\n * @param {`aria-${string}`} attribute The ARIA attribute from which to remove an ID.\r\n * @param {string} id The ID to remove.\r\n */\r\nexport function removeAriaReferencedId(element: Element, attribute: `aria-${string}`, id: string): void {\r\n id = id.trim();\r\n const ids = getAriaReferenceIds(element, attribute).filter((val) => val !== id);\r\n\r\n if (ids.length > 0) {\r\n element.setAttribute(attribute, ids.join(\" \"));\r\n } else {\r\n element.removeAttribute(attribute);\r\n }\r\n}\r\n","/**\r\n * Visually hides an element.\r\n * @param {CSSStyleDeclaration} style The style of the element to visually hide.\r\n */\r\nexport function visuallyHide(style: CSSStyleDeclaration): void {\r\n style.position = \"absolute\";\r\n style.appearance = \"none\";\r\n style.visibility = \"hidden\";\r\n style.border = \"0\";\r\n style.outline = \"0\";\r\n style.overflow = \"hidden\";\r\n style.left = \"0\";\r\n style.height = \"1px\";\r\n style.width = \"1px\";\r\n style.margin = \"-1px\";\r\n style.padding = \"0\";\r\n style.whiteSpace = \"nowrap\";\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK ARIA Describer\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/aria-describer/aria-describer.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\nimport { isServer } from \"lit\";\r\n\r\nimport { addAriaReferencedId, removeAriaReferencedId } from \"./aria-reference\";\r\nimport { visuallyHide } from \"./visuallyHide\";\r\n\r\n/** Utility for generating visually hidden elements that convey descriptive messages using `aria-describedby`. */\r\nexport class M3eAriaDescriber {\r\n /** @private */ static #nextId = 0;\r\n /** @private */ static #messageContainers = new Map<\r\n ParentNode,\r\n {\r\n containerElement: HTMLElement;\r\n messageRegistry: Map<string, { messageElement: Element; count: number }>;\r\n }\r\n >();\r\n\r\n /**\r\n * Adds an `aria-describedby` reference to a hidden element that contains the message.\r\n * @param {Element} element The element for which to provide a visually hidden description.\r\n * @param {string} message The message used to describe `element`.\r\n * @param {string} [role=\"tooltip\"] The ARIA role of the message.\r\n */\r\n static describe(element: Element, message: string, role: string = \"tooltip\"): void {\r\n if (isServer) {\r\n return;\r\n }\r\n\r\n const rootNode = element.getRootNode() as ParentNode;\r\n if (!(rootNode instanceof ShadowRoot || rootNode instanceof Document)) {\r\n return;\r\n }\r\n\r\n let container = this.#messageContainers.get(rootNode);\r\n if (!container) {\r\n container = {\r\n containerElement: this.#createMessageContainer(),\r\n messageRegistry: new Map<string, { messageElement: Element; count: number }>(),\r\n };\r\n\r\n // Append to body if document, otherwise, append as a child of shadow root.\r\n (rootNode instanceof Document ? rootNode.body : rootNode).appendChild(container.containerElement);\r\n this.#messageContainers.set(rootNode, container);\r\n }\r\n\r\n const key = `${role}:${message}`;\r\n let entry = container.messageRegistry.get(key);\r\n if (!entry) {\r\n entry = { messageElement: this.#createMessageElement(message, role), count: 0 };\r\n container.containerElement.appendChild(entry.messageElement);\r\n container.messageRegistry.set(key, entry);\r\n }\r\n\r\n entry.count++;\r\n\r\n addAriaReferencedId(element, \"aria-describedby\", entry.messageElement.id);\r\n }\r\n\r\n /**\r\n * Removes an `aria-describedby` reference to a hidden element that contains the message.\r\n * @param {Element} element The element from which to remove a visually hidden description.\r\n * @param {string} message The message used to describe `element`.\r\n * @param {string} [role=\"tooltip\"] The ARIA role of the message.\r\n */\r\n static removeDescription(element: Element, message: string, role: string = \"tooltip\"): void {\r\n if (isServer) {\r\n return;\r\n }\r\n\r\n const rootNode = element.getRootNode() as ParentNode;\r\n const container = this.#messageContainers.get(rootNode);\r\n if (!container) {\r\n return;\r\n }\r\n\r\n const key = `${role}:${message}`;\r\n const entry = container.messageRegistry.get(key);\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n entry.count--;\r\n removeAriaReferencedId(element, \"aria-describedby\", entry.messageElement.id);\r\n\r\n // If there are no more elements referencing the message, remove it from the DOM.\r\n if (entry.count <= 0) {\r\n entry.messageElement.remove();\r\n container.messageRegistry.delete(key);\r\n }\r\n\r\n // If there are no more registered messages, remove the container from the DOM.\r\n if (container.messageRegistry.size == 0) {\r\n container.containerElement?.remove();\r\n this.#messageContainers.delete(rootNode);\r\n }\r\n }\r\n\r\n /** @private */\r\n static #createMessageContainer(): HTMLElement {\r\n const messageContainer = document.createElement(\"div\");\r\n messageContainer.classList.add(\"m3e-describedby-message-container\");\r\n visuallyHide(messageContainer.style);\r\n return messageContainer;\r\n }\r\n\r\n /** @private */\r\n static #createMessageElement(message: string, role: string): HTMLElement {\r\n const messageElement = document.createElement(\"span\");\r\n messageElement.id = `m3e-describedby-message-${this.#nextId++}`;\r\n messageElement.role = role;\r\n messageElement.ariaAtomic = \"true\";\r\n messageElement.innerText = message.trim();\r\n return messageElement;\r\n }\r\n}\r\n\r\n// This is the class type, as opposed to an instance of the class.\r\ntype M3eAriaDescriberClass = typeof M3eAriaDescriber;\r\n\r\ndeclare global {\r\n /** Utility for generating visually hidden elements that convey descriptive messages using `aria-describedby`. */\r\n var M3eAriaDescriber: M3eAriaDescriberClass;\r\n}\r\n\r\nglobalThis.M3eAriaDescriber = M3eAriaDescriber;\r\n","/** Utility for checking the interactivity of an element, such as whether it is focusable. */\r\nexport class M3eInteractivityChecker {\r\n /**\r\n * Determines whether a given element can receive focus.\r\n * @param {Element} element The element to test.\r\n * @param {readonly Element[]} [parents = undefined] The known parent elements to test. The default value is `undefined`.\r\n * @returns {boolean} Whether `element` can receive focus.\r\n */\r\n static isFocusable(element: Element, parents?: readonly Element[]): boolean {\r\n if (\r\n element.matches(\r\n \":is(button,input,select,textarea,object,:is(a,area)[href],[tabindex],[contenteditable=true]):not(:disabled,[disabled])\",\r\n )\r\n ) {\r\n return !this.#cannotFocusParent(parents);\r\n }\r\n\r\n if (\r\n !element.localName.includes(\"-\") ||\r\n !element.matches(\":not(:disabled,[disabled])\") ||\r\n element.getAttribute(\"aria-disabled\") === \"true\"\r\n ) {\r\n return false;\r\n }\r\n\r\n if (element.shadowRoot?.delegatesFocus) {\r\n return !this.#cannotFocusParent(parents);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n static #cannotFocusParent(parents?: readonly Element[]): boolean {\r\n return parents?.some((x) => x.matches(\":is([aria-hidden='true'],:disabled,[disabled])\")) ?? false;\r\n }\r\n\r\n /**\r\n * Finds interactive elements that descend from the specified element.\r\n * @param {HTMLElement} element The `HTMLElement` to search.\r\n * @returns {HTMLElement[]} The interactive elements that descend from `element`.\r\n */\r\n static findInteractiveElements(element: HTMLElement): HTMLElement[] {\r\n const elements = new Array<HTMLElement>();\r\n const walker = element.ownerDocument.createTreeWalker(element, NodeFilter.SHOW_ELEMENT);\r\n\r\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\r\n const element = <HTMLElement>walker.currentNode;\r\n if (this.isFocusable(element)) {\r\n elements.push(element);\r\n }\r\n }\r\n\r\n return elements;\r\n }\r\n}\r\n\r\n// This is the class type, as opposed to an instance of the class.\r\ntype M3eInteractivityCheckerClass = typeof M3eInteractivityChecker;\r\n\r\ndeclare global {\r\n /** Utility for checking the interactivity of an element, such as whether it is focusable. */\r\n var M3eInteractivityChecker: M3eInteractivityCheckerClass;\r\n}\r\n\r\nglobalThis.M3eInteractivityChecker = M3eInteractivityChecker;\r\n","import { css, CSSResultGroup, html, LitElement } from \"lit\";\r\nimport { query } from \"lit/decorators.js\";\r\n\r\nimport { customElement, Disabled } from \"@m3e/web/core\";\r\n\r\nimport { M3eInteractivityChecker } from \"./InteractivityChecker\";\r\n\r\n/**\r\n * A non-visual element used to trap focus within nested content.\r\n * @tag m3e-focus-trap\r\n *\r\n * @slot - Renders content for which to trap focus.\r\n *\r\n * @attr disabled - Disables the focus trap.\r\n */\r\n@customElement(\"m3e-focus-trap\")\r\nexport class M3eFocusTrapElement extends Disabled(LitElement) {\r\n /** The styles of the element. */\r\n static override styles: CSSResultGroup = css`\r\n :host {\r\n display: contents;\r\n }\r\n .trap {\r\n outline: none;\r\n }\r\n `;\r\n\r\n /** @private */ @query(\".trap\") private readonly _firstTrap!: HTMLElement | null;\r\n\r\n /** @inheritdoc */\r\n protected override render(): unknown {\r\n const trap = html`<div\r\n class=\"trap\"\r\n .inert=\"${this.disabled}\"\r\n tabindex=\"0\"\r\n aria-hidden=\"true\"\r\n @focus=\"${this.#onFocus}\"\r\n ></div>`;\r\n return html`${trap}<slot></slot>${trap}`;\r\n }\r\n\r\n /** @private */\r\n #onFocus(e: FocusEvent): void {\r\n function matchesRelatedTarget(relatedTarget: EventTarget | null, test: HTMLElement | null): boolean {\r\n return (\r\n relatedTarget === test ||\r\n (relatedTarget instanceof HTMLElement &&\r\n relatedTarget.shadowRoot !== null &&\r\n relatedTarget.shadowRoot.contains(test))\r\n );\r\n }\r\n\r\n const [first, last] = this.#getFirstAndLastFocusableChild();\r\n const isFirst = e?.target === this._firstTrap;\r\n const fromFirst = matchesRelatedTarget(e.relatedTarget, first);\r\n const fromLast = matchesRelatedTarget(e.relatedTarget, last);\r\n const fromOutside = !fromFirst && !fromLast;\r\n\r\n if ((!isFirst && fromLast) || (isFirst && fromOutside)) {\r\n first?.focus();\r\n return;\r\n }\r\n if ((isFirst && fromFirst) || (!isFirst && fromOutside)) {\r\n last?.focus();\r\n }\r\n }\r\n\r\n /** @private */\r\n #getFirstAndLastFocusableChild(): [HTMLElement | null, HTMLElement | null] {\r\n let first: HTMLElement | null = null;\r\n let last: HTMLElement | null = null;\r\n\r\n this.#walkTree(this, [], (element, parents) => {\r\n if (\r\n M3eInteractivityChecker.isFocusable(element, parents) &&\r\n element instanceof HTMLElement &&\r\n element.tabIndex >= 0\r\n ) {\r\n first = first ?? element;\r\n last = element;\r\n }\r\n });\r\n\r\n return [first, last];\r\n }\r\n\r\n /** @private */\r\n #walkTree(\r\n root: Element,\r\n parents: readonly Element[],\r\n callback: (element: Element, parents: readonly Element[]) => void,\r\n ): void {\r\n parents = [...parents, root];\r\n\r\n for (const node of root.childNodes) {\r\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\r\n const element = <HTMLElement>node;\r\n\r\n callback(element, parents);\r\n\r\n if (element.shadowRoot) {\r\n this.#walkShadowRoot(element, parents, callback);\r\n } else if (element instanceof HTMLSlotElement) {\r\n this.#walkSlot(element, parents, callback);\r\n } else if (element.hasChildNodes()) {\r\n this.#walkTree(element, parents, callback);\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #walkShadowRoot(\r\n root: Element,\r\n parents: readonly Element[],\r\n callback: (element: Element, parents: readonly Element[]) => void,\r\n ): void {\r\n for (const node of root.shadowRoot?.childNodes ?? []) {\r\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\r\n const element = <HTMLElement>node;\r\n callback(element, parents);\r\n if (!element.hasChildNodes()) continue;\r\n this.#walkTree(element, parents, callback);\r\n }\r\n }\r\n\r\n /** @private */\r\n #walkSlot(\r\n slot: HTMLSlotElement,\r\n parents: readonly Element[],\r\n callback: (element: Element, parents: readonly Element[]) => void,\r\n ) {\r\n for (const node of slot.assignedElements()) {\r\n callback(node, parents);\r\n if (!node.hasChildNodes()) continue;\r\n this.#walkTree(node, parents, callback);\r\n }\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m3e-focus-trap\": M3eFocusTrapElement;\r\n }\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK Live Announcer\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/live-announcer/live-announcer.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\nimport { isServer } from \"lit\";\r\n\r\nimport { addAriaReferencedId } from \"./aria-reference\";\r\nimport { visuallyHide } from \"./visuallyHide\";\r\n\r\n/** Specifies the possible politeness levels in which to announce messages. */\r\nexport type ARIALivePoliteness = \"off\" | \"polite\" | \"assertive\";\r\n\r\n/** Utility for announcing messages to screen readers. */\r\nexport class M3eLiveAnnouncer {\r\n /** @private */ static #nextId = 0;\r\n /** @private */ static #liveElement?: HTMLElement;\r\n /** @private */ static #previousTimeout: number;\r\n /** @private */ static #currentPromise?: Promise<void>;\r\n /** @private */ static #currentResolve?: () => void;\r\n\r\n /**\r\n * Announces the specified message to screen readers.\r\n * @param {string} message The message to announce.\r\n * @returns {Promise<void>} A `Promise` that resolves when `message` is added to the DOM.\r\n */\r\n static announce(message: string): Promise<void>;\r\n\r\n /**\r\n * Announces the specified message to screen readers.\r\n * @param {string} message The message to announce.\r\n * @param {ARIALivePoliteness | undefined} politeness The politeness in which to announce `message`.\r\n * @returns {Promise<void>} A `Promise` that resolves when `message` is added to the DOM.\r\n */\r\n static announce(message: string, politeness?: ARIALivePoliteness): Promise<void>;\r\n\r\n /**\r\n * Announces the specified message to screen readers.\r\n * @param {string} message The message to announce.\r\n * @param {number | undefined} duration The duration, in milliseconds, after which to clear the announcement. Note\r\n * that this takes effect after the message has been added to the DOM, which can be up to\r\n * 100ms after `announce` has been called.\r\n * @returns {Promise<void>} A `Promise` that resolves when `message` is added to the DOM.\r\n */\r\n static announce(message: string, duration?: number): Promise<void>;\r\n\r\n /**\r\n * Announces the specified message to screen readers.\r\n * @param {string} message The message to announce.\r\n * @param {ARIALivePoliteness | undefined} politeness The politeness in which to announce `message`.\r\n * @param {number | undefined} duration The duration, in milliseconds, after which to clear the announcement. Note\r\n * that this takes effect after the message has been added to the DOM, which can be up to 100ms after `announce` has been called.\r\n * @returns {Promise<void>} A `Promise` that resolves when `message` is added to the DOM.\r\n */\r\n static announce(message: string, politeness?: ARIALivePoliteness, duration?: number): Promise<void>;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static announce(message: string, ...args: any[]): Promise<void> {\r\n if (isServer) {\r\n return Promise.resolve();\r\n }\r\n\r\n this.#liveElement = this.#liveElement ?? this.#createLiveElement();\r\n\r\n let politeness: ARIALivePoliteness | undefined;\r\n let duration: number | undefined;\r\n\r\n if (args.length === 1 && typeof args[0] === \"number\") {\r\n duration = args[0];\r\n } else {\r\n [politeness, duration] = args;\r\n }\r\n\r\n this.clear();\r\n clearTimeout(this.#previousTimeout);\r\n\r\n this.#liveElement.setAttribute(\"aria-live\", politeness ?? \"polite\");\r\n\r\n for (const modal of document.querySelectorAll(\"m3e-dialog\")) {\r\n addAriaReferencedId(modal, \"aria-owns\", this.#liveElement.id);\r\n }\r\n\r\n this.#currentPromise = this.#currentPromise ?? new Promise((resolve) => (this.#currentResolve = resolve));\r\n clearTimeout(this.#previousTimeout);\r\n\r\n this.#previousTimeout = setTimeout(() => {\r\n if (!this.#liveElement) {\r\n return;\r\n }\r\n\r\n this.#liveElement.textContent = message;\r\n if (duration !== undefined) {\r\n this.#previousTimeout = setTimeout(() => this.clear(), duration);\r\n }\r\n\r\n this.#currentResolve?.();\r\n this.#currentPromise = this.#currentResolve = undefined;\r\n }, 100);\r\n\r\n return this.#currentPromise;\r\n }\r\n\r\n /**\r\n * Clears the current text from the announcer element. Can be used to prevent\r\n * screen readers from reading the text out again while the user is going\r\n * through page landmarks.\r\n */\r\n static clear() {\r\n if (this.#liveElement) {\r\n this.#liveElement.textContent = \"\";\r\n }\r\n }\r\n\r\n /** @private */\r\n static #createLiveElement(): HTMLElement {\r\n const prev = document.getElementsByClassName(\"m3e-live-announcer\");\r\n for (let i = 0; i < prev.length; i++) {\r\n prev[i].remove();\r\n }\r\n\r\n const liveAnnouncer = document.createElement(\"div\");\r\n liveAnnouncer.classList.add(\"m3e-live-announcer\");\r\n liveAnnouncer.setAttribute(\"aria-atomic\", \"true\");\r\n liveAnnouncer.setAttribute(\"aria-live\", \"polite\");\r\n liveAnnouncer.id = `m3e-live-announcer-${this.#nextId++}`;\r\n\r\n visuallyHide(liveAnnouncer.style);\r\n\r\n document.body.append(liveAnnouncer);\r\n\r\n return liveAnnouncer;\r\n }\r\n}\r\n\r\n// This is the class type, as opposed to an instance of the class.\r\ntype M3eLiveAnnouncerClass = typeof M3eLiveAnnouncer;\r\n\r\ndeclare global {\r\n /** Utility for announcing messages to screen readers. */\r\n var M3eLiveAnnouncer: M3eLiveAnnouncerClass;\r\n}\r\n\r\nglobalThis.M3eLiveAnnouncer = M3eLiveAnnouncer;\r\n"],"names":["ModifierKeys","KeyCode","getKeyCode","e","which","charCode","keyCode","hasModifierKey","modifiers","length","some","x","altKey","shiftKey","ctrlKey","metaKey","isModifierAllowed","every","includes","ListManager","constructor","_ListManager_items","set","this","Array","_ListManager_activeItem","_ListManager_onActiveItemChangeCallback","items","__classPrivateFieldGet","activeItem","setItems","removed","filter","added","__classPrivateFieldSet","updateActiveItem","setActiveItem","item","call","onActiveItemChange","callback","typeaheadLabel","Symbol","isTypeaheadItem","value","hasKeys","Typeahead","options","_Typeahead_debounceInterval","_Typeahead_timeoutId","_Typeahead_callback","_Typeahead_skipPredicate","_Typeahead_pressedKeys","_Typeahead_selectedIndex","_Typeahead_items","debounceInterval","skipPredicate","isTyping","setSelectedIndex","index","reset","onKeyDown","key","keycode","A","Z","Zero","Nine","_Typeahead_instances","_Typeahead_appendKey","String","fromCharCode","push","toLocaleUpperCase","clearTimeout","setTimeout","_Typeahead_searchItems","term","join","i","label","trim","indexOf","ListKeyManager","_ListKeyManager_typeahead","wrap","homeAndEnd","pageUpAndDown","pageDelta","vertical","allowedModifiers","isDisabledMixin","disabled","directionality","super","withHomeAndEnd","enabled","withPageUpAndDown","withWrap","withVerticalOrientation","withAllowedModifiers","withTypeahead","undefined","withSkipPredicate","withDirectionality","defaultPrevented","modifierAllowed","preventDefault","prev","_ListKeyManager_instances","_ListKeyManager_findNext","next","_ListKeyManager_findPrevious","first","last","_ListKeyManager_findPreviousByIndex","_ListKeyManager_findNextByIndex","Math","max","min","test","_ListKeyManager_findLast","j","_ListKeyManager_findFirst","FocusKeyManager","_FocusKeyManager_focusOptions","focus","withOptions","RovingTabIndexManager","_RovingTabIndexManager_disableRovingTabIndex","setAttribute","other","hasAttribute","result","disableRovingTabIndex","RadioKeyManager","_RadioKeyManager_disabled","forEach","find","isCheckedOrSelected","checked","selectionManager","SelectionManager","_SelectionManager_onSelectedItemsChangeCallback","_SelectionManager_selectedItems","_SelectionManager_multi","multi","_SelectionManager_instances","_SelectionManager_enforceSingleSelect","selectedItems","notifySelectionChange","select","deselect","checkOrSelect","splice","activate","selected","onSelectedItemsChange","getAriaReferenceIds","element","attribute","getAttribute","match","addAriaReferencedId","id","ids","existingId","removeAriaReferencedId","val","removeAttribute","visuallyHide","style","position","appearance","visibility","border","outline","overflow","left","height","width","margin","padding","whiteSpace","WeakMap","WeakSet","emit","M3eAriaDescriber","describe","message","role","isServer","rootNode","getRootNode","ShadowRoot","Document","container","_a","_M3eAriaDescriber_messageContainers","get","containerElement","_M3eAriaDescriber_createMessageContainer","messageRegistry","Map","body","appendChild","entry","messageElement","count","removeDescription","remove","delete","size","messageContainer","document","createElement","classList","add","_M3eAriaDescriber_createMessageElement","_c","_M3eAriaDescriber_nextId","_b","ariaAtomic","innerText","globalThis","M3eInteractivityChecker","isFocusable","parents","matches","_M3eInteractivityChecker_cannotFocusParent","localName","shadowRoot","delegatesFocus","findInteractiveElements","elements","walker","ownerDocument","createTreeWalker","NodeFilter","SHOW_ELEMENT","node","nextNode","currentNode","M3eFocusTrapElement","Disabled","LitElement","render","trap","html","_M3eFocusTrapElement_instances","_M3eFocusTrapElement_onFocus","matchesRelatedTarget","relatedTarget","HTMLElement","contains","_M3eFocusTrapElement_getFirstAndLastFocusableChild","isFirst","target","_firstTrap","fromFirst","fromLast","fromOutside","_M3eFocusTrapElement_walkTree","tabIndex","root","childNodes","nodeType","Node","ELEMENT_NODE","_M3eFocusTrapElement_walkShadowRoot","HTMLSlotElement","_M3eFocusTrapElement_walkSlot","hasChildNodes","slot","assignedElements","styles","css","__decorate","query","prototype","customElement","M3eLiveAnnouncer","announce","args","Promise","resolve","politeness","duration","_M3eLiveAnnouncer_liveElement","_M3eLiveAnnouncer_createLiveElement","clear","_M3eLiveAnnouncer_previousTimeout","modal","querySelectorAll","_M3eLiveAnnouncer_currentResolve","_M3eLiveAnnouncer_currentPromise","textContent","getElementsByClassName","liveAnnouncer","_M3eLiveAnnouncer_nextId","append"],"mappings":"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"}
1
+ {"version":3,"file":"core-a11y.min.js","sources":["../../src/core/a11y/keycodes/ModifierKeys.ts","../../src/core/a11y/keycodes/KeyCode.ts","../../src/core/a11y/keycodes/getKeyCode.ts","../../src/core/a11y/keycodes/hasModifierKey.ts","../../src/core/a11y/keycodes/isModifierAllowed.ts","../../src/core/a11y/list-key/ListManager.ts","../../src/core/a11y/list-key/Typeahead.ts","../../src/core/a11y/list-key/ListKeyManager.ts","../../src/core/a11y/list-key/FocusKeyManager.ts","../../src/core/a11y/list-key/RovingTabIndexManager.ts","../../src/core/a11y/list-key/RadioKeyManager.ts","../../src/core/a11y/list-key/SelectionManager.ts","../../src/core/a11y/aria-reference.ts","../../src/core/a11y/visuallyHide.ts","../../src/core/a11y/AriaDescriber.ts","../../src/core/a11y/InteractivityChecker.ts","../../src/core/a11y/FocusTrapElement.ts","../../src/core/a11y/LiveAnnouncer.ts"],"sourcesContent":["/** Specifies the keyboard modifier keys. */\r\nexport type ModifierKey = \"alt\" | \"shift\" | \"ctrl\" | \"meta\";\r\n\r\n/** The modifier keys. */\r\nexport const ModifierKeys: readonly ModifierKey[] = [\"alt\", \"shift\", \"ctrl\", \"meta\"];\r\n","/** Specifies known key code values. */\r\nexport enum KeyCode {\r\n Backspace = 8,\r\n Tab = 9,\r\n Enter = 13,\r\n Shift = 16,\r\n Ctrl = 17,\r\n Alt = 18,\r\n PauseBreak = 19,\r\n CapsLock = 20,\r\n Escape = 27,\r\n Space = 32,\r\n PageUp = 33,\r\n PageDown = 34,\r\n End = 35,\r\n Home = 36,\r\n\r\n LeftArrow = 37,\r\n UpArrow = 38,\r\n RightArrow = 39,\r\n DownArrow = 40,\r\n\r\n Insert = 45,\r\n Delete = 46,\r\n\r\n Zero = 48,\r\n ClosedParen = Zero,\r\n One = 49,\r\n ExclamationMark = One,\r\n Two = 50,\r\n AtSign = Two,\r\n Three = 51,\r\n PoundSign = Three,\r\n Hash = PoundSign,\r\n Four = 52,\r\n DollarSign = Four,\r\n Five = 53,\r\n PercentSign = Five,\r\n Six = 54,\r\n Caret = Six,\r\n Hat = Caret,\r\n Seven = 55,\r\n Ampersand = Seven,\r\n Eight = 56,\r\n Star = Eight,\r\n Asterik = Star,\r\n Nine = 57,\r\n OpenParen = Nine,\r\n\r\n A = 65,\r\n B = 66,\r\n C = 67,\r\n D = 68,\r\n E = 69,\r\n F = 70,\r\n G = 71,\r\n H = 72,\r\n I = 73,\r\n J = 74,\r\n K = 75,\r\n L = 76,\r\n M = 77,\r\n N = 78,\r\n O = 79,\r\n P = 80,\r\n Q = 81,\r\n R = 82,\r\n S = 83,\r\n T = 84,\r\n U = 85,\r\n V = 86,\r\n W = 87,\r\n X = 88,\r\n Y = 89,\r\n Z = 90,\r\n\r\n LeftWindowKey = 91,\r\n RightWindowKey = 92,\r\n SelectKey = 93,\r\n\r\n Numpad0 = 96,\r\n Numpad1 = 97,\r\n Numpad2 = 98,\r\n Numpad3 = 99,\r\n Numpad4 = 100,\r\n Numpad5 = 101,\r\n Numpad6 = 102,\r\n Numpad7 = 103,\r\n Numpad8 = 104,\r\n Numpad9 = 105,\r\n\r\n Multiply = 106,\r\n Add = 107,\r\n Subtract = 109,\r\n DecimalPoint = 110,\r\n Divide = 111,\r\n\r\n F1 = 112,\r\n F2 = 113,\r\n F3 = 114,\r\n F4 = 115,\r\n F5 = 116,\r\n F6 = 117,\r\n F7 = 118,\r\n F8 = 119,\r\n F9 = 120,\r\n F10 = 121,\r\n F11 = 122,\r\n F12 = 123,\r\n\r\n NumLock = 144,\r\n ScrollLock = 145,\r\n\r\n SemiColon = 186,\r\n Equals = 187,\r\n Comma = 188,\r\n Dash = 189,\r\n Period = 190,\r\n UnderScore = Dash,\r\n PlusSign = Equals,\r\n ForwardSlash = 191,\r\n Tilde = 192,\r\n GraveAccent = Tilde,\r\n\r\n OpenBracket = 219,\r\n ClosedBracket = 221,\r\n Quote = 222,\r\n}\r\n","/**\r\n * Resolves the key code for the specified `KeyboardEvent`.\r\n * @param {KeyboardEvent} e The `KeyboardEvent` for which to resolve the key code.\r\n * @returns {number} The key code for `e`.\r\n */\r\nexport function getKeyCode(e: KeyboardEvent): number {\r\n return e.which || e.charCode || e.keyCode;\r\n}\r\n","import { ModifierKey } from \"./ModifierKeys\";\r\n\r\n/**\r\n * Determines whether a modifier key is pressed.\r\n * @param {KeyboardEvent} e The `KeyboardEvent` to test.\r\n * @param {ModifierKey[]} modifiers The modifier keys to test.\r\n * @returns {boolean} A value indicating whether a modifier key is pressed.\r\n */\r\nexport function hasModifierKey(e: KeyboardEvent, ...modifiers: ModifierKey[]): boolean {\r\n return modifiers.length ? modifiers.some((x) => e[`${x}Key`]) : e.altKey || e.shiftKey || e.ctrlKey || e.metaKey;\r\n}\r\n","import { hasModifierKey } from \"./hasModifierKey\";\r\nimport { ModifierKey, ModifierKeys } from \"./ModifierKeys\";\r\n\r\n/**\r\n * Determines whether the specified modifier keys are allowed.\r\n * @param {KeyboardEvent} e The `KeyboardEvent` to test.\r\n * @param {ModifierKey[]} modifiers The allowed modifier keys.\r\n * @returns {boolean} A value indicating whether `modifiers` are allowed.\r\n */\r\nexport function isModifierAllowed(e: KeyboardEvent, ...modifiers: ModifierKey[]): boolean {\r\n return ModifierKeys.every((x) => !hasModifierKey(e, x) || modifiers.includes(x));\r\n}\r\n","/**\r\n * Utility for managing a list of items which supports activation.\r\n * @template T The type of managed item.\r\n */\r\nexport class ListManager<T> {\r\n /** @private */ #items = new Array<T>();\r\n /** @private */ #activeItem: T | null = null;\r\n /** @private */ #onActiveItemChangeCallback?: () => void;\r\n\r\n /** The items being managed. */\r\n get items(): ReadonlyArray<T> {\r\n return this.#items;\r\n }\r\n\r\n /** The active item. */\r\n get activeItem(): T | null {\r\n return this.#activeItem;\r\n }\r\n\r\n /**\r\n * Sets the items to manage.\r\n * @param {Array<T>} items The new items.\r\n * @returns {{ added: ReadonlyArray<T>; removed: ReadonlyArray<T> }} An object specifying added and removed items.\r\n */\r\n setItems(items: Array<T>): { added: ReadonlyArray<T>; removed: ReadonlyArray<T> } {\r\n const removed = this.items.filter((x) => !items.includes(x));\r\n const added = items.filter((x) => !this.items.includes(x));\r\n\r\n this.#items = items;\r\n\r\n if (this.activeItem && !this.items.includes(this.activeItem)) {\r\n this.updateActiveItem(null);\r\n }\r\n\r\n return { added, removed };\r\n }\r\n\r\n /**\r\n * Sets the active item.\r\n * @param {T | null | undefined} item The new active item.\r\n */\r\n setActiveItem(item: T | null | undefined): void {\r\n if (this.activeItem !== item) {\r\n this.updateActiveItem(item);\r\n this.#onActiveItemChangeCallback?.();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the active item.\r\n * @param {T | null | undefined} item The active item.\r\n */\r\n updateActiveItem(item: T | null | undefined): void {\r\n this.#activeItem = item ?? null;\r\n }\r\n\r\n /**\r\n * Configures the list manager with a callback invoked when an item is activated.\r\n * @param {() => void} callback The callback invoked when an item is activated.\r\n * @returns {ListManager<T>} The configured list manager.\r\n */\r\n onActiveItemChange(callback: () => void): this {\r\n this.#onActiveItemChangeCallback = callback;\r\n return this;\r\n }\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK KeyManager\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/key-manager/typeahead.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\nimport { hasKeys } from \"@m3e/web/core\";\r\n\r\nimport { getKeyCode, KeyCode } from \"../keycodes\";\r\n\r\n/** A symbol through which to access an element's textual content used for typeahead search. */\r\nexport const typeaheadLabel = Symbol(\"typeaheadLabel\");\r\n\r\n/** Defines functionality required for an item that supports searching using typeahead. */\r\nexport interface TypeaheadItem {\r\n /** Returns the textual content to search. */\r\n [typeaheadLabel]?(): string;\r\n}\r\n\r\n/**\r\n * Determines whether a value is a `TypeaheadItem`.\r\n * @param {unknown} value The value to test.\r\n * @returns A value indicating whether `value` is an `TypeaheadItem`.\r\n */\r\nexport function isTypeaheadItem(value: unknown): value is TypeaheadItem {\r\n return hasKeys<TypeaheadItem>(value, typeaheadLabel);\r\n}\r\n\r\n/** Encapsulates options used to select items based on typeahead.\r\n * @template T The type of `TypeaheadItem`.\r\n */\r\nexport interface TypeaheadOptions<T extends TypeaheadItem = TypeaheadItem> {\r\n /** The interval, in milliseconds, before searching items. */\r\n debounceInterval?: number;\r\n\r\n /** Function used to determine whether an item should be skipped. */\r\n skipPredicate?: (item: T) => boolean;\r\n\r\n /** Function invoked when an item is selected. */\r\n callback: (item: T) => void;\r\n}\r\n\r\n/**\r\n * Implements typeahead functionality which selects items based on keyboard input.\r\n * @template T The type of `TypeaheadItem`.\r\n */\r\nexport class Typeahead<T extends TypeaheadItem = TypeaheadItem> {\r\n /** @private */ #debounceInterval: number;\r\n /** @private */ #timeoutId = -1;\r\n /** @private */ #callback: (item: T) => void;\r\n /** @private */ #skipPredicate?: (item: T) => boolean;\r\n\r\n /** @private */ #pressedKeys = new Array<string>();\r\n /** @private */ #selectedIndex = -1;\r\n /** @private */ #items: readonly T[] = [];\r\n\r\n /**\r\n * Initializes a new instance of this class.\r\n * @param {TypeaheadOptions<T>} options Options that control typeahead behavior.\r\n */\r\n constructor(options: TypeaheadOptions<T>) {\r\n this.#debounceInterval = options.debounceInterval ?? 200;\r\n this.#callback = options.callback;\r\n this.#skipPredicate = options.skipPredicate;\r\n }\r\n\r\n /** A value indicating whether the user is currently typing. */\r\n get isTyping(): boolean {\r\n return this.#pressedKeys.length > 0;\r\n }\r\n\r\n /**\r\n * Sets the items to search.\r\n * @param {readonly T[]} items The items to search.\r\n */\r\n setItems(items: readonly T[]): void {\r\n this.#items = items;\r\n }\r\n\r\n /**\r\n * Sets the index of the selected item.\r\n * @param {number} index The index of the selected item.\r\n */\r\n setSelectedIndex(index: number): void {\r\n this.#selectedIndex = index;\r\n }\r\n\r\n /** Resets the stored sequence of typed characters. */\r\n reset(): void {\r\n this.#pressedKeys.length = 0;\r\n }\r\n\r\n /**\r\n * Sets the selected item depending on the key event passed in.\r\n * @param {KeyboardEvent} e The keyboard event to be used for determining which element should be active.\r\n */\r\n onKeyDown(e: KeyboardEvent): void {\r\n if (e.key && e.key.length === 1) {\r\n this.#appendKey(e.key);\r\n } else {\r\n const keycode = getKeyCode(e);\r\n if ((keycode >= KeyCode.A && keycode <= KeyCode.Z) || (keycode >= KeyCode.Zero && keycode <= KeyCode.Nine)) {\r\n this.#appendKey(String.fromCharCode(keycode));\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #appendKey(key: string): void {\r\n this.#pressedKeys.push(key.toLocaleUpperCase());\r\n clearTimeout(this.#timeoutId);\r\n this.#timeoutId = setTimeout(() => this.#searchItems(), this.#debounceInterval);\r\n }\r\n\r\n /** @private */\r\n #searchItems(): void {\r\n const term = this.#pressedKeys.join(\"\");\r\n for (let i = 1; i < this.#items.length + 1; i++) {\r\n const index = (this.#selectedIndex + i) % this.#items.length;\r\n const item = this.#items[index];\r\n const label = item[typeaheadLabel]?.().toLocaleUpperCase().trim();\r\n if (!this.#skipPredicate?.(item) && label?.indexOf(term) === 0) {\r\n this.#callback(item);\r\n break;\r\n }\r\n }\r\n this.reset();\r\n }\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK KeyManager\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/key-manager/list-key-manager.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\nimport { isDisabledMixin } from \"@m3e/web/core\";\r\n\r\nimport { hasModifierKey, isModifierAllowed, ModifierKey } from \"../keycodes\";\r\n\r\nimport { ListManager } from \"./ListManager\";\r\nimport { Typeahead, TypeaheadItem } from \"./Typeahead\";\r\n\r\n/**\r\n * Utility for managing keyboard events for selectable lists.\r\n * @template T The type of managed item.\r\n */\r\nexport class ListKeyManager<T extends HTMLElement & TypeaheadItem> extends ListManager<T> {\r\n /** @private */ #typeahead?: Typeahead<T>;\r\n\r\n /**\r\n * Whether the active item will wrap to the other end of\r\n * list when there are no more items in the given direction.\r\n * @default false\r\n */\r\n public wrap = false;\r\n\r\n /**\r\n * Whether to activate the first and last items respectively when\r\n * the `HOME` or `END` key is pressed.\r\n * @default false\r\n */\r\n public homeAndEnd = false;\r\n\r\n /**\r\n * Whether to activate every 10th (or configured) first/last item\r\n * in the up/down direction when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @default false\r\n */\r\n public pageUpAndDown = false;\r\n\r\n /**\r\n * The number of items to skip when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @default 10\r\n */\r\n public pageDelta = 10;\r\n\r\n /**\r\n * Whether to the list is oriented vertically.\r\n * @default false\r\n */\r\n public vertical = false;\r\n\r\n /** The allowed modifier keys.\r\n * @default []\r\n */\r\n public allowedModifiers: ModifierKey[] = [];\r\n\r\n /**\r\n * A function used to skip items.\r\n * @param {T} item The item to test.\r\n * @returns {boolean} Whether `item` should be skipped.\r\n */\r\n public skipPredicate: (item: T) => boolean = (item) => isDisabledMixin(item) && item.disabled;\r\n\r\n /**\r\n * The directionality.\r\n * @default \"ltr\"\r\n */\r\n public directionality: \"ltr\" | \"rtl\" = \"ltr\";\r\n\r\n /** @inheritdoc */\r\n override setItems(items: T[]): { added: readonly T[]; removed: readonly T[] } {\r\n this.#typeahead?.setItems(items);\r\n return super.setItems(items);\r\n }\r\n\r\n /** @inheritdoc */\r\n override updateActiveItem(item: T | null | undefined): void {\r\n super.updateActiveItem(item);\r\n if (this.#typeahead) {\r\n this.#typeahead.setSelectedIndex(item ? this.items.indexOf(item) : -1);\r\n }\r\n }\r\n\r\n /**\r\n * Configures the key manager to activate the first and last items respectively when the `HOME` or `END` key is pressed.\r\n * @param {boolean} [enabled = true] Whether to activate the first and last items respectively when\r\n * the `HOME` or `END` key is pressed.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withHomeAndEnd(enabled: boolean = true): this {\r\n this.homeAndEnd = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures the key manager to page up and down when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @param {boolean} [enabled = true] Whether to activate page up and down when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @param {number} [pageDelta=10] The number of items to skip when the `PAGEUP` or `PAGEDOWN` key is pressed.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withPageUpAndDown(enabled: boolean = true, pageDelta: number = 10): this {\r\n this.pageUpAndDown = enabled;\r\n this.pageDelta = pageDelta;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures wrapping mode, which determines whether the active item will wrap to the other end of list when there are no more items in the given direction.\r\n * @param {boolean} [enabled = true] Whether the active item will wrap to the other end of\r\n * list when there are no more items in the given direction.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withWrap(enabled: boolean = true): this {\r\n this.wrap = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures whether to move the selection vertically.\r\n * @param {boolean} [enabled = true] Whether to move selection vertically.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withVerticalOrientation(enabled: boolean = true): this {\r\n this.vertical = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configured allowed modifier keys.\r\n * @param {ModifierKey[]} modifiers The allowed modifier keys.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withAllowedModifiers(...modifiers: ModifierKey[]): this {\r\n this.allowedModifiers = modifiers;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures whether typeahead is enabled.\r\n * @param {boolean} [enabled = true] Whether typeahead is enabled.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withTypeahead(enabled: boolean = true): this {\r\n if (enabled) {\r\n this.#typeahead = new Typeahead<T>({ callback: (item) => this.setActiveItem(item) });\r\n } else {\r\n this.#typeahead = undefined;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures a function used to test whether an item should be skipped.\r\n * @param skipPredicate A function used to determine whether an item should be skipped.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withSkipPredicate(skipPredicate: (item: T) => boolean): this {\r\n this.skipPredicate = skipPredicate;\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures the directionality.\r\n * @param {\"ltr\" | \"rtl\"} directionality The directionality.\r\n * @returns {ListKeyManager<T>} The configured key manager.\r\n */\r\n withDirectionality(directionality: \"ltr\" | \"rtl\"): this {\r\n this.directionality = directionality;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the active item depending on the key event passed in.\r\n * @param {KeyboardEvent} e The keyboard event to be used for determining which element should be active.\r\n */\r\n onKeyDown(e: KeyboardEvent): void {\r\n if (e.defaultPrevented) return;\r\n\r\n const modifierAllowed = isModifierAllowed(e, ...this.allowedModifiers);\r\n\r\n switch (e.key) {\r\n case \"Left\":\r\n case \"ArrowLeft\":\r\n if (modifierAllowed && !this.vertical) {\r\n e.preventDefault();\r\n const prev = this.directionality === \"ltr\" ? this.#findPrevious() : this.#findNext();\r\n if (prev) {\r\n this.setActiveItem(prev);\r\n }\r\n }\r\n break;\r\n case \"Up\":\r\n case \"ArrowUp\":\r\n if (modifierAllowed) {\r\n e.preventDefault();\r\n const prev = this.directionality === \"ltr\" ? this.#findPrevious() : this.#findNext();\r\n if (prev) {\r\n this.setActiveItem(prev);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"Right\":\r\n case \"ArrowRight\":\r\n if (modifierAllowed && !this.vertical) {\r\n e.preventDefault();\r\n const next = this.directionality === \"ltr\" ? this.#findNext() : this.#findPrevious();\r\n if (next) {\r\n this.setActiveItem(next);\r\n }\r\n }\r\n break;\r\n\r\n case \"Down\":\r\n case \"ArrowDown\":\r\n if (modifierAllowed) {\r\n e.preventDefault();\r\n const next = this.directionality === \"ltr\" ? this.#findNext() : this.#findPrevious();\r\n if (next) {\r\n this.setActiveItem(next);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"Home\":\r\n if (modifierAllowed && this.homeAndEnd) {\r\n e.preventDefault();\r\n const first = this.#findFirst();\r\n if (first) {\r\n this.setActiveItem(first);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"End\":\r\n if (modifierAllowed && this.homeAndEnd) {\r\n e.preventDefault();\r\n const last = this.#findLast();\r\n if (last) {\r\n this.setActiveItem(last);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"PageUp\":\r\n if (modifierAllowed && this.pageUpAndDown) {\r\n e.preventDefault();\r\n const prev = (this.directionality === \"ltr\" ? this.#findPreviousByIndex : this.#findNextByIndex)(\r\n this.activeItem ? Math.max(0, this.items.indexOf(this.activeItem) - this.pageDelta) : 0,\r\n );\r\n if (prev) {\r\n this.setActiveItem(prev);\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"PageDown\":\r\n if (modifierAllowed && this.pageUpAndDown) {\r\n e.preventDefault();\r\n const next = (this.directionality === \"ltr\" ? this.#findNextByIndex : this.#findPreviousByIndex)(\r\n this.activeItem\r\n ? Math.min(this.items.length - 1, this.items.indexOf(this.activeItem) + this.pageDelta)\r\n : this.items.length - 1,\r\n );\r\n if (next) {\r\n this.setActiveItem(next);\r\n }\r\n }\r\n\r\n break;\r\n\r\n default:\r\n if (modifierAllowed || hasModifierKey(e, \"shift\")) {\r\n this.#typeahead?.onKeyDown(e);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n /** @private */\r\n #findFirst(): T | null {\r\n for (let i = 0; i < this.items.length; i++) {\r\n if (this.items[i] === this.activeItem) break;\r\n const test = this.items[i];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** @private */\r\n #findLast(): T | null {\r\n for (let i = this.items.length - 1; i >= 0; i--) {\r\n if (this.items[i] === this.activeItem) break;\r\n const test = this.items[i];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** @private */\r\n #findNext(): T | null {\r\n for (let i = 0; i < this.items.length; i++) {\r\n if (this.items[i] === this.activeItem) {\r\n for (let j = i + 1; j < this.items.length; j++) {\r\n const test = this.items[j];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return this.wrap ? this.#findFirst() : null;\r\n }\r\n\r\n /** @private */\r\n #findPrevious(): T | null {\r\n for (let i = 0; i < this.items.length; i++) {\r\n if (this.items[i] === this.activeItem) {\r\n for (let j = i - 1; j >= 0; j--) {\r\n const test = this.items[j];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return this.wrap ? this.#findLast() : null;\r\n }\r\n\r\n /** @private */\r\n #findPreviousByIndex(index: number): T | null {\r\n for (let i = index; i >= 0; i--) {\r\n const test = this.items[i];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** @private */\r\n #findNextByIndex(index: number): T | null {\r\n for (let i = index; i < this.items.length; i++) {\r\n const test = this.items[i];\r\n if (!this.skipPredicate(test)) {\r\n return test;\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n","import { ListKeyManager } from \"./ListKeyManager\";\r\n\r\n/**\r\n * Utility for managing keyboard events for selectable lists whose items directly receive focus.\r\n * @template T The type of managed item.\r\n */\r\nexport class FocusKeyManager<T extends HTMLElement> extends ListKeyManager<T> {\r\n /** @private */ #focusOptions?: FocusOptions;\r\n\r\n /** @inheritdoc */\r\n override setActiveItem(item: T | null | undefined): void {\r\n super.setActiveItem(item);\r\n item?.focus(this.#focusOptions);\r\n }\r\n\r\n /**\r\n * Configures the key manager with options used to focus items.\r\n * @param {FocusOptions} options Options used to focus items.\r\n * @returns {FocusKeyManager<T>} The configured key manager.\r\n */\r\n withOptions(options: FocusOptions): this {\r\n this.#focusOptions = options;\r\n return this;\r\n }\r\n}\r\n","import { FocusKeyManager } from \"./FocusKeyManager\";\r\n\r\n/**\r\n * Utility for managing keyboard events and a roving tab index for selectable lists whose items directly receive focus.\r\n * @template T The type of managed item.\r\n */\r\nexport class RovingTabIndexManager<T extends HTMLElement> extends FocusKeyManager<T> {\r\n /** @private */ #disableRovingTabIndex = false;\r\n\r\n /** @inheritdoc */\r\n override updateActiveItem(item: T | null | undefined): void {\r\n super.updateActiveItem(item);\r\n\r\n if (!this.#disableRovingTabIndex) {\r\n item?.setAttribute(\"tabindex\", \"0\");\r\n for (const other of this.items) {\r\n if (other !== item && other.hasAttribute(\"tabindex\")) {\r\n other.setAttribute(\"tabindex\", \"-1\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override setItems(items: T[]): { added: readonly T[]; removed: readonly T[] } {\r\n const result = super.setItems(items);\r\n\r\n if (!this.#disableRovingTabIndex) {\r\n for (const added of result.added) {\r\n if (added !== this.activeItem && !this.skipPredicate(added)) {\r\n added.setAttribute(\"tabindex\", \"-1\");\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Configures whether roving tab index is disabled.\r\n * @param {boolean} [disabled=true] Whether the roving tab index is disabled.\r\n * @returns {RovingTabIndexManager<T>} The configured roving tab index manager.\r\n */\r\n disableRovingTabIndex(disabled: boolean = true): this {\r\n if (disabled !== this.#disableRovingTabIndex) {\r\n this.#disableRovingTabIndex = disabled;\r\n for (const item of this.items) {\r\n if (!this.skipPredicate(item)) {\r\n item?.setAttribute(\"tabindex\", this.#disableRovingTabIndex || item === this.activeItem ? \"0\" : \"-1\");\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n","import { LitElement } from \"lit\";\r\n\r\nimport { CheckedOrSelectedMixin, DisabledMixin, isCheckedOrSelected } from \"@m3e/web/core\";\r\n\r\nimport { RovingTabIndexManager } from \"./RovingTabIndexManager\";\r\n\r\n/**\r\n * Utility for managing keyboard events for selectable lists whose items behave like a radio.\r\n * @template T The type of managed item.\r\n */\r\nexport class RadioKeyManager<\r\n T extends LitElement & DisabledMixin & CheckedOrSelectedMixin,\r\n> extends RovingTabIndexManager<T> {\r\n /** @private */ #disabled = false;\r\n\r\n /** A value indicating whether managed items are disabled. */\r\n get disabled(): boolean {\r\n return this.#disabled;\r\n }\r\n set disabled(value: boolean) {\r\n this.#disabled = value;\r\n this.items.forEach((x) => (x.disabled = value));\r\n }\r\n\r\n /** @inheritdoc */\r\n override setItems(items: T[]): { added: readonly T[]; removed: readonly T[] } {\r\n if (this.disabled) {\r\n items.forEach((x) => (x.disabled = true));\r\n }\r\n\r\n const { added, removed } = super.setItems(items);\r\n\r\n if (added.length > 0 || removed.length > 0) {\r\n if (!this.activeItem) {\r\n this.updateActiveItem(added.find((x) => !this.skipPredicate(x)) ?? null);\r\n }\r\n\r\n if (this.activeItem && (this.activeItem.disabled || !isCheckedOrSelected(this.activeItem))) {\r\n const checked = added.find((x) => !this.skipPredicate(x) && isCheckedOrSelected(x));\r\n if (checked) {\r\n this.updateActiveItem(checked);\r\n }\r\n }\r\n }\r\n\r\n return { added, removed };\r\n }\r\n}\r\n","import { LitElement } from \"lit\";\r\n\r\nimport { CheckedOrSelectedMixin, DisabledMixin, checkOrSelect, isCheckedOrSelected } from \"@m3e/web/core\";\r\n\r\nimport { RadioKeyManager } from \"./RadioKeyManager\";\r\n\r\n/** A symbol through which to access an element's selection manager. */\r\nexport const selectionManager = Symbol(\"selectionManager\");\r\n\r\n/**\r\n * Utility for managing keyboard events for selectable lists where one or more items can be selected.\r\n * @template T The type of managed item.\r\n */\r\nexport class SelectionManager<\r\n T extends LitElement & DisabledMixin & CheckedOrSelectedMixin,\r\n> extends RadioKeyManager<T> {\r\n /** @private */ #onSelectedItemsChangeCallback?: () => void;\r\n /** @private */ #selectedItems = new Array<T>();\r\n /** @private */ #multi = false;\r\n\r\n /** A value indicating whether multiple items can be selected. */\r\n get multi(): boolean {\r\n return this.#multi;\r\n }\r\n set multi(value: boolean) {\r\n this.#multi = value;\r\n this.#enforceSingleSelect(true);\r\n }\r\n\r\n /** The selected items. */\r\n get selectedItems(): readonly T[] {\r\n return this.#selectedItems;\r\n }\r\n\r\n /**\r\n * Selects or deselects the item based on the item's checked or selected state.\r\n * @param {T} item The item whose selection state has changed.\r\n */\r\n notifySelectionChange(item: T): void {\r\n if (this.items.includes(item)) {\r\n if (isCheckedOrSelected(item)) {\r\n this.select(item);\r\n } else {\r\n this.deselect(item);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the specified item.\r\n * @param {T} item The item to deselect.\r\n */\r\n deselect(item: T): void {\r\n if (this.items.includes(item)) {\r\n if (isCheckedOrSelected(item)) {\r\n checkOrSelect(item, false);\r\n }\r\n\r\n const index = this.#selectedItems.indexOf(item);\r\n if (index >= 0) {\r\n this.#selectedItems.splice(index, 1);\r\n this.#onSelectedItemsChangeCallback?.();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the selected item.\r\n * @param {T | null | undefined} item The selected item.\r\n * @param {boolean} [activate=true] A value indicating whether to activate the item.\r\n */\r\n select(item: T | null | undefined, activate: boolean = true): void {\r\n if (!item || this.items.includes(item)) {\r\n if (!this.multi) {\r\n for (const selected of this.#selectedItems) {\r\n if (selected !== item) {\r\n checkOrSelect(selected, false);\r\n }\r\n }\r\n this.#selectedItems.length = 0;\r\n }\r\n\r\n if (item) {\r\n this.#selectedItems.push(item);\r\n if (!isCheckedOrSelected(item)) {\r\n checkOrSelect(item, true);\r\n }\r\n }\r\n\r\n if (activate) {\r\n this.updateActiveItem(item);\r\n }\r\n\r\n this.#onSelectedItemsChangeCallback?.();\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override setItems(items: T[]): { added: readonly T[]; removed: readonly T[] } {\r\n const { added, removed } = super.setItems(items);\r\n\r\n this.#selectedItems = this.#selectedItems.filter((x) => !removed.includes(x));\r\n this.#selectedItems.push(...added.filter((x) => isCheckedOrSelected(x)));\r\n this.#enforceSingleSelect();\r\n this.#onSelectedItemsChangeCallback?.();\r\n return { added, removed };\r\n }\r\n\r\n /**\r\n * Configures the selection manager with a callback invoked when selected items change.\r\n * @param {() => void} callback The callback invoked when selected items change.\r\n * @returns {SelectionManager<T>} The configured selection manager.\r\n */\r\n onSelectedItemsChange(callback: () => void): this {\r\n this.#onSelectedItemsChangeCallback = callback;\r\n return this;\r\n }\r\n\r\n /** @private */\r\n #enforceSingleSelect(emit = false): void {\r\n if (!this.multi && this.#selectedItems.length > 1) {\r\n for (let i = 1; i < this.#selectedItems.length; i++) {\r\n checkOrSelect(this.#selectedItems[i], false);\r\n }\r\n this.#selectedItems.length = 1;\r\n if (emit) {\r\n this.#onSelectedItemsChangeCallback?.();\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK AriaDescriber\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/aria-describer/aria-reference.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\n/**\r\n * Gets a list of IDs referenced by an element for the specified ARIA attribute.\r\n * @param {Element} element The element from which to get referenced IDs.\r\n * @param {`aria-${string}`} attribute The ARIA attribute from which to get referenced IDs.\r\n * @returns {string[]} a list of IDs referenced by `element` for `attribute`.\r\n */\r\nexport function getAriaReferenceIds(element: Element, attribute: `aria-${string}`): string[] {\r\n return element.getAttribute(attribute)?.match(/\\S+/g) ?? [];\r\n}\r\n\r\n/**\r\n * Adds an ID to the list of IDs referenced by an element for a given ARIA attribute.\r\n * @param {Element} element The element to which to add a referenced ID.\r\n * @param {`aria-${string}`} attribute The ARIA attribute to which to add an ID.\r\n * @param {string} id The ID to add.\r\n */\r\nexport function addAriaReferencedId(element: Element, attribute: `aria-${string}`, id: string): void {\r\n id = id.trim();\r\n\r\n const ids = getAriaReferenceIds(element, attribute);\r\n if (!ids.some((existingId) => existingId.trim() === id)) {\r\n ids.push(id);\r\n element.setAttribute(attribute, ids.join(\" \"));\r\n }\r\n}\r\n\r\n/**\r\n * Removes an ID from a list of IDs referenced by an element for the specified ARIA attribute.\r\n * @param {Element} element The element from which to remove an ID.\r\n * @param {`aria-${string}`} attribute The ARIA attribute from which to remove an ID.\r\n * @param {string} id The ID to remove.\r\n */\r\nexport function removeAriaReferencedId(element: Element, attribute: `aria-${string}`, id: string): void {\r\n id = id.trim();\r\n const ids = getAriaReferenceIds(element, attribute).filter((val) => val !== id);\r\n\r\n if (ids.length > 0) {\r\n element.setAttribute(attribute, ids.join(\" \"));\r\n } else {\r\n element.removeAttribute(attribute);\r\n }\r\n}\r\n","/**\r\n * Visually hides an element.\r\n * @param {CSSStyleDeclaration} style The style of the element to visually hide.\r\n */\r\nexport function visuallyHide(style: CSSStyleDeclaration): void {\r\n style.position = \"absolute\";\r\n style.appearance = \"none\";\r\n style.visibility = \"hidden\";\r\n style.border = \"0\";\r\n style.outline = \"0\";\r\n style.overflow = \"hidden\";\r\n style.left = \"0\";\r\n style.height = \"1px\";\r\n style.width = \"1px\";\r\n style.margin = \"-1px\";\r\n style.padding = \"0\";\r\n style.whiteSpace = \"nowrap\";\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK ARIA Describer\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/aria-describer/aria-describer.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\nimport { isServer } from \"lit\";\r\n\r\nimport { addAriaReferencedId, removeAriaReferencedId } from \"./aria-reference\";\r\nimport { visuallyHide } from \"./visuallyHide\";\r\n\r\n/** Utility for generating visually hidden elements that convey descriptive messages using `aria-describedby`. */\r\nexport class M3eAriaDescriber {\r\n /** @private */ static #nextId = 0;\r\n /** @private */ static #messageContainers = new Map<\r\n ParentNode,\r\n {\r\n containerElement: HTMLElement;\r\n messageRegistry: Map<string, { messageElement: Element; count: number }>;\r\n }\r\n >();\r\n\r\n /**\r\n * Adds an `aria-describedby` reference to a hidden element that contains the message.\r\n * @param {Element} element The element for which to provide a visually hidden description.\r\n * @param {string} message The message used to describe `element`.\r\n * @param {string} [role=\"tooltip\"] The ARIA role of the message.\r\n */\r\n static describe(element: Element, message: string, role: string = \"tooltip\"): void {\r\n if (isServer) {\r\n return;\r\n }\r\n\r\n const rootNode = element.getRootNode() as ParentNode;\r\n if (!(rootNode instanceof ShadowRoot || rootNode instanceof Document)) {\r\n return;\r\n }\r\n\r\n let container = this.#messageContainers.get(rootNode);\r\n if (!container) {\r\n container = {\r\n containerElement: this.#createMessageContainer(),\r\n messageRegistry: new Map<string, { messageElement: Element; count: number }>(),\r\n };\r\n\r\n // Append to body if document, otherwise, append as a child of shadow root.\r\n (rootNode instanceof Document ? rootNode.body : rootNode).appendChild(container.containerElement);\r\n this.#messageContainers.set(rootNode, container);\r\n }\r\n\r\n const key = `${role}:${message}`;\r\n let entry = container.messageRegistry.get(key);\r\n if (!entry) {\r\n entry = { messageElement: this.#createMessageElement(message, role), count: 0 };\r\n container.containerElement.appendChild(entry.messageElement);\r\n container.messageRegistry.set(key, entry);\r\n }\r\n\r\n entry.count++;\r\n\r\n addAriaReferencedId(element, \"aria-describedby\", entry.messageElement.id);\r\n }\r\n\r\n /**\r\n * Removes an `aria-describedby` reference to a hidden element that contains the message.\r\n * @param {Element} element The element from which to remove a visually hidden description.\r\n * @param {string} message The message used to describe `element`.\r\n * @param {string} [role=\"tooltip\"] The ARIA role of the message.\r\n */\r\n static removeDescription(element: Element, message: string, role: string = \"tooltip\"): void {\r\n if (isServer) {\r\n return;\r\n }\r\n\r\n const rootNode = element.getRootNode() as ParentNode;\r\n const container = this.#messageContainers.get(rootNode);\r\n if (!container) {\r\n return;\r\n }\r\n\r\n const key = `${role}:${message}`;\r\n const entry = container.messageRegistry.get(key);\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n entry.count--;\r\n removeAriaReferencedId(element, \"aria-describedby\", entry.messageElement.id);\r\n\r\n // If there are no more elements referencing the message, remove it from the DOM.\r\n if (entry.count <= 0) {\r\n entry.messageElement.remove();\r\n container.messageRegistry.delete(key);\r\n }\r\n\r\n // If there are no more registered messages, remove the container from the DOM.\r\n if (container.messageRegistry.size == 0) {\r\n container.containerElement?.remove();\r\n this.#messageContainers.delete(rootNode);\r\n }\r\n }\r\n\r\n /** @private */\r\n static #createMessageContainer(): HTMLElement {\r\n const messageContainer = document.createElement(\"div\");\r\n messageContainer.classList.add(\"m3e-describedby-message-container\");\r\n visuallyHide(messageContainer.style);\r\n return messageContainer;\r\n }\r\n\r\n /** @private */\r\n static #createMessageElement(message: string, role: string): HTMLElement {\r\n const messageElement = document.createElement(\"span\");\r\n messageElement.id = `m3e-describedby-message-${this.#nextId++}`;\r\n messageElement.role = role;\r\n messageElement.ariaAtomic = \"true\";\r\n messageElement.innerText = message.trim();\r\n return messageElement;\r\n }\r\n}\r\n\r\n// This is the class type, as opposed to an instance of the class.\r\ntype M3eAriaDescriberClass = typeof M3eAriaDescriber;\r\n\r\ndeclare global {\r\n /** Utility for generating visually hidden elements that convey descriptive messages using `aria-describedby`. */\r\n var M3eAriaDescriber: M3eAriaDescriberClass;\r\n}\r\n\r\nglobalThis.M3eAriaDescriber = M3eAriaDescriber;\r\n","/** Utility for checking the interactivity of an element, such as whether it is focusable. */\r\nexport class M3eInteractivityChecker {\r\n /**\r\n * Determines whether a given element can receive focus.\r\n * @param {Element} element The element to test.\r\n * @param {readonly Element[]} [parents = undefined] The known parent elements to test. The default value is `undefined`.\r\n * @returns {boolean} Whether `element` can receive focus.\r\n */\r\n static isFocusable(element: Element, parents?: readonly Element[]): boolean {\r\n if (\r\n element.matches(\r\n \":is(button,input,select,textarea,object,:is(a,area)[href],[tabindex]:not([tabindex='-1']),[contenteditable=true]):not(:disabled,[disabled],[hidden])\",\r\n )\r\n ) {\r\n return !this.#isVisiblyHidden(element) && !this.#cannotFocusParent(parents);\r\n }\r\n\r\n if (\r\n !element.localName.includes(\"-\") ||\r\n !element.matches(\":not(:disabled,[disabled])\") ||\r\n element.getAttribute(\"aria-disabled\") === \"true\"\r\n ) {\r\n return false;\r\n }\r\n\r\n if (element.shadowRoot?.delegatesFocus) {\r\n return !this.#isVisiblyHidden(element) && !this.#cannotFocusParent(parents);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** @private */\r\n static #cannotFocusParent(parents?: readonly Element[]): boolean {\r\n return (\r\n parents?.some(\r\n (x) => x.matches(\":is([aria-hidden='true'],:disabled,[disabled],[inert],[hidden])\") || this.#isVisiblyHidden(x),\r\n ) ?? false\r\n );\r\n }\r\n\r\n /** @private */\r\n static #isVisiblyHidden(element: Element): boolean {\r\n const style = getComputedStyle(element);\r\n return style.display === \"none\" || style.visibility === \"hidden\";\r\n }\r\n\r\n /**\r\n * Finds interactive elements that descend from the specified element.\r\n * @param {HTMLElement} element The `HTMLElement` to search.\r\n * @returns {HTMLElement[]} The interactive elements that descend from `element`.\r\n */\r\n static findInteractiveElements(element: HTMLElement): HTMLElement[] {\r\n const elements = new Array<HTMLElement>();\r\n const walker = element.ownerDocument.createTreeWalker(element, NodeFilter.SHOW_ELEMENT);\r\n\r\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\r\n const element = <HTMLElement>walker.currentNode;\r\n if (this.isFocusable(element)) {\r\n elements.push(element);\r\n }\r\n }\r\n\r\n return elements;\r\n }\r\n}\r\n\r\n// This is the class type, as opposed to an instance of the class.\r\ntype M3eInteractivityCheckerClass = typeof M3eInteractivityChecker;\r\n\r\ndeclare global {\r\n /** Utility for checking the interactivity of an element, such as whether it is focusable. */\r\n var M3eInteractivityChecker: M3eInteractivityCheckerClass;\r\n}\r\n\r\nglobalThis.M3eInteractivityChecker = M3eInteractivityChecker;\r\n","import { css, CSSResultGroup, html, LitElement } from \"lit\";\r\nimport { query } from \"lit/decorators.js\";\r\n\r\nimport { customElement, Disabled } from \"@m3e/web/core\";\r\n\r\nimport { M3eInteractivityChecker } from \"./InteractivityChecker\";\r\n\r\n/**\r\n * A non-visual element used to trap focus within nested content.\r\n * @tag m3e-focus-trap\r\n *\r\n * @slot - Renders content for which to trap focus.\r\n *\r\n * @attr disabled - Disables the focus trap.\r\n */\r\n@customElement(\"m3e-focus-trap\")\r\nexport class M3eFocusTrapElement extends Disabled(LitElement) {\r\n /** The styles of the element. */\r\n static override styles: CSSResultGroup = css`\r\n :host {\r\n display: contents;\r\n }\r\n .trap {\r\n outline: none;\r\n }\r\n `;\r\n\r\n /** @private */ @query(\".trap\") private readonly _firstTrap!: HTMLElement | null;\r\n\r\n /** @inheritdoc */\r\n protected override render(): unknown {\r\n const trap = html`<div\r\n class=\"trap\"\r\n .inert=\"${this.disabled}\"\r\n tabindex=\"0\"\r\n aria-hidden=\"true\"\r\n @focus=\"${this.#onFocus}\"\r\n ></div>`;\r\n return html`${trap}<slot></slot>${trap}`;\r\n }\r\n\r\n /** @private */\r\n #onFocus(e: FocusEvent): void {\r\n function matchesRelatedTarget(relatedTarget: EventTarget | null, test: HTMLElement | null): boolean {\r\n return (\r\n relatedTarget === test ||\r\n (relatedTarget instanceof HTMLElement &&\r\n relatedTarget.shadowRoot !== null &&\r\n relatedTarget.shadowRoot.contains(test))\r\n );\r\n }\r\n\r\n const [first, last] = this.#getFirstAndLastFocusableChild();\r\n const isFirst = e?.target === this._firstTrap;\r\n const fromFirst = matchesRelatedTarget(e.relatedTarget, first);\r\n const fromLast = matchesRelatedTarget(e.relatedTarget, last);\r\n const fromOutside = !fromFirst && !fromLast;\r\n\r\n if ((!isFirst && fromLast) || (isFirst && fromOutside)) {\r\n first?.focus();\r\n return;\r\n }\r\n if ((isFirst && fromFirst) || (!isFirst && fromOutside)) {\r\n last?.focus();\r\n }\r\n }\r\n\r\n /** @private */\r\n #getFirstAndLastFocusableChild(): [HTMLElement | null, HTMLElement | null] {\r\n let first: HTMLElement | null = null;\r\n let last: HTMLElement | null = null;\r\n\r\n this.#walkTree(this, [], (element, parents) => {\r\n if (\r\n M3eInteractivityChecker.isFocusable(element, parents) &&\r\n element instanceof HTMLElement &&\r\n element.tabIndex >= 0\r\n ) {\r\n first = first ?? element;\r\n last = element;\r\n }\r\n });\r\n\r\n return [first, last];\r\n }\r\n\r\n /** @private */\r\n #walkTree(\r\n root: Element,\r\n parents: readonly Element[],\r\n callback: (element: Element, parents: readonly Element[]) => void,\r\n ): void {\r\n parents = [...parents, root];\r\n\r\n for (const node of root.childNodes) {\r\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\r\n const element = <HTMLElement>node;\r\n\r\n callback(element, parents);\r\n\r\n if (element.shadowRoot) {\r\n this.#walkShadowRoot(element, parents, callback);\r\n } else if (element instanceof HTMLSlotElement) {\r\n this.#walkSlot(element, parents, callback);\r\n } else if (element.hasChildNodes()) {\r\n this.#walkTree(element, parents, callback);\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #walkShadowRoot(\r\n root: Element,\r\n parents: readonly Element[],\r\n callback: (element: Element, parents: readonly Element[]) => void,\r\n ): void {\r\n for (const node of root.shadowRoot?.childNodes ?? []) {\r\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\r\n const element = <HTMLElement>node;\r\n callback(element, parents);\r\n if (!element.hasChildNodes()) continue;\r\n this.#walkTree(element, parents, callback);\r\n }\r\n }\r\n\r\n /** @private */\r\n #walkSlot(\r\n slot: HTMLSlotElement,\r\n parents: readonly Element[],\r\n callback: (element: Element, parents: readonly Element[]) => void,\r\n ) {\r\n parents = [...parents, slot];\r\n let childNodes: Array<Element> | NodeListOf<ChildNode> = slot.assignedElements();\r\n if (childNodes.length == 0 && slot.hasChildNodes()) {\r\n childNodes = slot.childNodes;\r\n }\r\n for (const node of childNodes) {\r\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\r\n const element = <HTMLElement>node;\r\n\r\n if (element instanceof HTMLSlotElement) {\r\n this.#walkSlot(element, parents, callback);\r\n continue;\r\n }\r\n\r\n callback(element, parents);\r\n if (!element.hasChildNodes()) continue;\r\n this.#walkTree(element, parents, callback);\r\n }\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m3e-focus-trap\": M3eFocusTrapElement;\r\n }\r\n}\r\n","/**\r\n * Adapted from Angular Material CDK Live Announcer\r\n * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/live-announcer/live-announcer.ts\r\n *\r\n * @license MIT\r\n * Copyright (c) 2025 Google LLC\r\n * See LICENSE file in the project root for full license text.\r\n */\r\n\r\nimport { isServer } from \"lit\";\r\n\r\nimport { addAriaReferencedId } from \"./aria-reference\";\r\nimport { visuallyHide } from \"./visuallyHide\";\r\n\r\n/** Specifies the possible politeness levels in which to announce messages. */\r\nexport type ARIALivePoliteness = \"off\" | \"polite\" | \"assertive\";\r\n\r\n/** Utility for announcing messages to screen readers. */\r\nexport class M3eLiveAnnouncer {\r\n /** @private */ static #nextId = 0;\r\n /** @private */ static #liveElement?: HTMLElement;\r\n /** @private */ static #previousTimeout: number;\r\n /** @private */ static #currentPromise?: Promise<void>;\r\n /** @private */ static #currentResolve?: () => void;\r\n\r\n /**\r\n * Announces the specified message to screen readers.\r\n * @param {string} message The message to announce.\r\n * @returns {Promise<void>} A `Promise` that resolves when `message` is added to the DOM.\r\n */\r\n static announce(message: string): Promise<void>;\r\n\r\n /**\r\n * Announces the specified message to screen readers.\r\n * @param {string} message The message to announce.\r\n * @param {ARIALivePoliteness | undefined} politeness The politeness in which to announce `message`.\r\n * @returns {Promise<void>} A `Promise` that resolves when `message` is added to the DOM.\r\n */\r\n static announce(message: string, politeness?: ARIALivePoliteness): Promise<void>;\r\n\r\n /**\r\n * Announces the specified message to screen readers.\r\n * @param {string} message The message to announce.\r\n * @param {number | undefined} duration The duration, in milliseconds, after which to clear the announcement. Note\r\n * that this takes effect after the message has been added to the DOM, which can be up to\r\n * 100ms after `announce` has been called.\r\n * @returns {Promise<void>} A `Promise` that resolves when `message` is added to the DOM.\r\n */\r\n static announce(message: string, duration?: number): Promise<void>;\r\n\r\n /**\r\n * Announces the specified message to screen readers.\r\n * @param {string} message The message to announce.\r\n * @param {ARIALivePoliteness | undefined} politeness The politeness in which to announce `message`.\r\n * @param {number | undefined} duration The duration, in milliseconds, after which to clear the announcement. Note\r\n * that this takes effect after the message has been added to the DOM, which can be up to 100ms after `announce` has been called.\r\n * @returns {Promise<void>} A `Promise` that resolves when `message` is added to the DOM.\r\n */\r\n static announce(message: string, politeness?: ARIALivePoliteness, duration?: number): Promise<void>;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static announce(message: string, ...args: any[]): Promise<void> {\r\n if (isServer) {\r\n return Promise.resolve();\r\n }\r\n\r\n this.#liveElement = this.#liveElement ?? this.#createLiveElement();\r\n\r\n let politeness: ARIALivePoliteness | undefined;\r\n let duration: number | undefined;\r\n\r\n if (args.length === 1 && typeof args[0] === \"number\") {\r\n duration = args[0];\r\n } else {\r\n [politeness, duration] = args;\r\n }\r\n\r\n this.clear();\r\n clearTimeout(this.#previousTimeout);\r\n\r\n this.#liveElement.setAttribute(\"aria-live\", politeness ?? \"polite\");\r\n\r\n for (const modal of document.querySelectorAll(\"m3e-dialog\")) {\r\n addAriaReferencedId(modal, \"aria-owns\", this.#liveElement.id);\r\n }\r\n\r\n this.#currentPromise = this.#currentPromise ?? new Promise((resolve) => (this.#currentResolve = resolve));\r\n clearTimeout(this.#previousTimeout);\r\n\r\n this.#previousTimeout = setTimeout(() => {\r\n if (!this.#liveElement) {\r\n return;\r\n }\r\n\r\n this.#liveElement.textContent = message;\r\n if (duration !== undefined) {\r\n this.#previousTimeout = setTimeout(() => this.clear(), duration);\r\n }\r\n\r\n this.#currentResolve?.();\r\n this.#currentPromise = this.#currentResolve = undefined;\r\n }, 100);\r\n\r\n return this.#currentPromise;\r\n }\r\n\r\n /**\r\n * Clears the current text from the announcer element. Can be used to prevent\r\n * screen readers from reading the text out again while the user is going\r\n * through page landmarks.\r\n */\r\n static clear() {\r\n if (this.#liveElement) {\r\n this.#liveElement.textContent = \"\";\r\n }\r\n }\r\n\r\n /** @private */\r\n static #createLiveElement(): HTMLElement {\r\n const prev = document.getElementsByClassName(\"m3e-live-announcer\");\r\n for (let i = 0; i < prev.length; i++) {\r\n prev[i].remove();\r\n }\r\n\r\n const liveAnnouncer = document.createElement(\"div\");\r\n liveAnnouncer.classList.add(\"m3e-live-announcer\");\r\n liveAnnouncer.setAttribute(\"aria-atomic\", \"true\");\r\n liveAnnouncer.setAttribute(\"aria-live\", \"polite\");\r\n liveAnnouncer.id = `m3e-live-announcer-${this.#nextId++}`;\r\n\r\n visuallyHide(liveAnnouncer.style);\r\n\r\n document.body.append(liveAnnouncer);\r\n\r\n return liveAnnouncer;\r\n }\r\n}\r\n\r\n// This is the class type, as opposed to an instance of the class.\r\ntype M3eLiveAnnouncerClass = typeof M3eLiveAnnouncer;\r\n\r\ndeclare global {\r\n /** Utility for announcing messages to screen readers. */\r\n var M3eLiveAnnouncer: M3eLiveAnnouncerClass;\r\n}\r\n\r\nglobalThis.M3eLiveAnnouncer = M3eLiveAnnouncer;\r\n"],"names":["ModifierKeys","KeyCode","getKeyCode","e","which","charCode","keyCode","hasModifierKey","modifiers","length","some","x","altKey","shiftKey","ctrlKey","metaKey","isModifierAllowed","every","includes","ListManager","constructor","_ListManager_items","set","this","Array","_ListManager_activeItem","_ListManager_onActiveItemChangeCallback","items","__classPrivateFieldGet","activeItem","setItems","removed","filter","added","__classPrivateFieldSet","updateActiveItem","setActiveItem","item","call","onActiveItemChange","callback","typeaheadLabel","Symbol","isTypeaheadItem","value","hasKeys","Typeahead","options","_Typeahead_debounceInterval","_Typeahead_timeoutId","_Typeahead_callback","_Typeahead_skipPredicate","_Typeahead_pressedKeys","_Typeahead_selectedIndex","_Typeahead_items","debounceInterval","skipPredicate","isTyping","setSelectedIndex","index","reset","onKeyDown","key","keycode","A","Z","Zero","Nine","_Typeahead_instances","_Typeahead_appendKey","String","fromCharCode","push","toLocaleUpperCase","clearTimeout","setTimeout","_Typeahead_searchItems","term","join","i","label","trim","indexOf","ListKeyManager","_ListKeyManager_typeahead","wrap","homeAndEnd","pageUpAndDown","pageDelta","vertical","allowedModifiers","isDisabledMixin","disabled","directionality","super","withHomeAndEnd","enabled","withPageUpAndDown","withWrap","withVerticalOrientation","withAllowedModifiers","withTypeahead","undefined","withSkipPredicate","withDirectionality","defaultPrevented","modifierAllowed","preventDefault","prev","_ListKeyManager_instances","_ListKeyManager_findNext","next","_ListKeyManager_findPrevious","first","last","_ListKeyManager_findPreviousByIndex","_ListKeyManager_findNextByIndex","Math","max","min","test","_ListKeyManager_findLast","j","_ListKeyManager_findFirst","FocusKeyManager","_FocusKeyManager_focusOptions","focus","withOptions","RovingTabIndexManager","_RovingTabIndexManager_disableRovingTabIndex","setAttribute","other","hasAttribute","result","disableRovingTabIndex","RadioKeyManager","_RadioKeyManager_disabled","forEach","find","isCheckedOrSelected","checked","selectionManager","SelectionManager","_SelectionManager_onSelectedItemsChangeCallback","_SelectionManager_selectedItems","_SelectionManager_multi","multi","_SelectionManager_instances","_SelectionManager_enforceSingleSelect","selectedItems","notifySelectionChange","select","deselect","checkOrSelect","splice","activate","selected","onSelectedItemsChange","getAriaReferenceIds","element","attribute","getAttribute","match","addAriaReferencedId","id","ids","existingId","removeAriaReferencedId","val","removeAttribute","visuallyHide","style","position","appearance","visibility","border","outline","overflow","left","height","width","margin","padding","whiteSpace","WeakMap","WeakSet","emit","M3eAriaDescriber","describe","message","role","isServer","rootNode","getRootNode","ShadowRoot","Document","container","_a","_M3eAriaDescriber_messageContainers","get","containerElement","_M3eAriaDescriber_createMessageContainer","messageRegistry","Map","body","appendChild","entry","messageElement","count","removeDescription","remove","delete","size","messageContainer","document","createElement","classList","add","_M3eAriaDescriber_createMessageElement","_c","_M3eAriaDescriber_nextId","_b","ariaAtomic","innerText","globalThis","M3eInteractivityChecker","isFocusable","parents","matches","_M3eInteractivityChecker_cannotFocusParent","localName","shadowRoot","delegatesFocus","findInteractiveElements","elements","walker","ownerDocument","createTreeWalker","NodeFilter","SHOW_ELEMENT","node","nextNode","currentNode","_M3eInteractivityChecker_isVisiblyHidden","getComputedStyle","display","M3eFocusTrapElement","Disabled","LitElement","render","trap","html","_M3eFocusTrapElement_instances","_M3eFocusTrapElement_onFocus","matchesRelatedTarget","relatedTarget","HTMLElement","contains","_M3eFocusTrapElement_getFirstAndLastFocusableChild","isFirst","target","_firstTrap","fromFirst","fromLast","fromOutside","_M3eFocusTrapElement_walkTree","tabIndex","root","childNodes","nodeType","Node","ELEMENT_NODE","_M3eFocusTrapElement_walkShadowRoot","HTMLSlotElement","_M3eFocusTrapElement_walkSlot","hasChildNodes","slot","assignedElements","styles","css","__decorate","query","prototype","customElement","M3eLiveAnnouncer","announce","args","Promise","resolve","politeness","duration","_M3eLiveAnnouncer_liveElement","_M3eLiveAnnouncer_createLiveElement","clear","_M3eLiveAnnouncer_previousTimeout","modal","querySelectorAll","_M3eLiveAnnouncer_currentResolve","_M3eLiveAnnouncer_currentPromise","textContent","getElementsByClassName","liveAnnouncer","_M3eLiveAnnouncer_nextId","append"],"mappings":"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"}