@ni/nimble-components 32.11.1 → 32.11.2

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 (180) hide show
  1. package/dist/all-components-bundle.js.map +1 -1
  2. package/dist/all-components-bundle.min.js.map +1 -1
  3. package/dist/esm/anchor/index.js.map +1 -1
  4. package/dist/esm/anchor/template.js +1 -1
  5. package/dist/esm/anchor/template.js.map +1 -1
  6. package/dist/esm/anchor-button/index.d.ts +1 -1
  7. package/dist/esm/anchor-button/index.js +1 -1
  8. package/dist/esm/anchor-button/index.js.map +1 -1
  9. package/dist/esm/anchor-button/template.d.ts +1 -1
  10. package/dist/esm/anchor-button/template.js +1 -1
  11. package/dist/esm/anchor-button/template.js.map +1 -1
  12. package/dist/esm/anchor-menu-item/index.d.ts +1 -1
  13. package/dist/esm/anchor-menu-item/index.js.map +1 -1
  14. package/dist/esm/anchor-menu-item/template.d.ts +1 -1
  15. package/dist/esm/anchor-menu-item/template.js +1 -1
  16. package/dist/esm/anchor-menu-item/template.js.map +1 -1
  17. package/dist/esm/anchor-tab/index.d.ts +1 -1
  18. package/dist/esm/anchor-tab/index.js.map +1 -1
  19. package/dist/esm/anchor-tab/template.d.ts +1 -1
  20. package/dist/esm/anchor-tab/template.js +1 -1
  21. package/dist/esm/anchor-tab/template.js.map +1 -1
  22. package/dist/esm/anchor-tabs/index.d.ts +1 -1
  23. package/dist/esm/anchor-tabs/index.js.map +1 -1
  24. package/dist/esm/anchor-tree-item/index.js.map +1 -1
  25. package/dist/esm/anchor-tree-item/template.d.ts +1 -1
  26. package/dist/esm/anchor-tree-item/template.js +1 -1
  27. package/dist/esm/anchor-tree-item/template.js.map +1 -1
  28. package/dist/esm/banner/index.js.map +1 -1
  29. package/dist/esm/breadcrumb-item/index.js.map +1 -1
  30. package/dist/esm/button/index.js +1 -1
  31. package/dist/esm/button/index.js.map +1 -1
  32. package/dist/esm/button/template.d.ts +1 -1
  33. package/dist/esm/button/template.js.map +1 -1
  34. package/dist/esm/checkbox/index.js.map +1 -1
  35. package/dist/esm/combobox/index.js +2 -2
  36. package/dist/esm/combobox/index.js.map +1 -1
  37. package/dist/esm/label-provider/base/index.js +1 -1
  38. package/dist/esm/label-provider/base/index.js.map +1 -1
  39. package/dist/esm/label-provider/core/index.d.ts +1 -1
  40. package/dist/esm/label-provider/core/index.js.map +1 -1
  41. package/dist/esm/label-provider/rich-text/index.d.ts +1 -1
  42. package/dist/esm/label-provider/rich-text/index.js.map +1 -1
  43. package/dist/esm/label-provider/table/index.d.ts +1 -1
  44. package/dist/esm/label-provider/table/index.js.map +1 -1
  45. package/dist/esm/menu/menu.foundation.js.map +1 -1
  46. package/dist/esm/menu-button/index.js +1 -1
  47. package/dist/esm/menu-button/index.js.map +1 -1
  48. package/dist/esm/menu-item/index.js.map +1 -1
  49. package/dist/esm/number-field/index.js.map +1 -1
  50. package/dist/esm/number-field/template.d.ts +1 -1
  51. package/dist/esm/number-field/template.js.map +1 -1
  52. package/dist/esm/patterns/error/types.js +1 -1
  53. package/dist/esm/patterns/error/types.js.map +1 -1
  54. package/dist/esm/patterns/required-visible/template.js +1 -1
  55. package/dist/esm/patterns/required-visible/template.js.map +1 -1
  56. package/dist/esm/patterns/required-visible/types.js +1 -1
  57. package/dist/esm/patterns/required-visible/types.js.map +1 -1
  58. package/dist/esm/patterns/tabs/template.d.ts +1 -1
  59. package/dist/esm/patterns/tabs/template.js.map +1 -1
  60. package/dist/esm/radio/index.js.map +1 -1
  61. package/dist/esm/rich-text/editor/index.d.ts +1 -1
  62. package/dist/esm/rich-text/editor/index.js +1 -1
  63. package/dist/esm/rich-text/editor/index.js.map +1 -1
  64. package/dist/esm/rich-text/editor/models/create-tiptap-editor.d.ts +1 -1
  65. package/dist/esm/rich-text/editor/models/create-tiptap-editor.js +2 -2
  66. package/dist/esm/rich-text/editor/models/create-tiptap-editor.js.map +1 -1
  67. package/dist/esm/rich-text/editor/testing/rich-text-editor.pageobject.d.ts +1 -1
  68. package/dist/esm/rich-text/editor/testing/rich-text-editor.pageobject.js +1 -1
  69. package/dist/esm/rich-text/editor/testing/rich-text-editor.pageobject.js.map +1 -1
  70. package/dist/esm/rich-text/mention-listbox/index.js +1 -1
  71. package/dist/esm/rich-text/mention-listbox/index.js.map +1 -1
  72. package/dist/esm/rich-text/models/markdown-serializer.js +1 -1
  73. package/dist/esm/rich-text/models/markdown-serializer.js.map +1 -1
  74. package/dist/esm/rich-text-mention/base/index.d.ts +2 -2
  75. package/dist/esm/rich-text-mention/base/index.js.map +1 -1
  76. package/dist/esm/rich-text-mention/base/models/mention-internals.js +1 -1
  77. package/dist/esm/rich-text-mention/base/models/mention-internals.js.map +1 -1
  78. package/dist/esm/rich-text-mention/base/models/mention-validator.d.ts +1 -1
  79. package/dist/esm/rich-text-mention/base/models/mention-validator.js.map +1 -1
  80. package/dist/esm/select/index.d.ts +1 -1
  81. package/dist/esm/select/index.js +1 -1
  82. package/dist/esm/select/index.js.map +1 -1
  83. package/dist/esm/select/template.d.ts +1 -1
  84. package/dist/esm/select/template.js +1 -1
  85. package/dist/esm/select/template.js.map +1 -1
  86. package/dist/esm/switch/index.js.map +1 -1
  87. package/dist/esm/table/components/cell/index.js +1 -1
  88. package/dist/esm/table/components/cell/index.js.map +1 -1
  89. package/dist/esm/table/components/cell/template.js.map +1 -1
  90. package/dist/esm/table/components/group-row/index.d.ts +1 -1
  91. package/dist/esm/table/components/group-row/index.js.map +1 -1
  92. package/dist/esm/table/components/row/index.d.ts +1 -1
  93. package/dist/esm/table/components/row/index.js.map +1 -1
  94. package/dist/esm/table/index.d.ts +3 -2
  95. package/dist/esm/table/index.js +1 -1
  96. package/dist/esm/table/index.js.map +1 -1
  97. package/dist/esm/table/models/interactive-selection-manager.d.ts +2 -1
  98. package/dist/esm/table/models/interactive-selection-manager.js.map +1 -1
  99. package/dist/esm/table/models/keyboard-navigation-manager.d.ts +2 -2
  100. package/dist/esm/table/models/keyboard-navigation-manager.js.map +1 -1
  101. package/dist/esm/table/models/selection-managers/multi-selection-manager.d.ts +1 -1
  102. package/dist/esm/table/models/selection-managers/multi-selection-manager.js.map +1 -1
  103. package/dist/esm/table/models/selection-managers/selection-manager-base.d.ts +1 -1
  104. package/dist/esm/table/models/selection-managers/selection-manager-base.js.map +1 -1
  105. package/dist/esm/table/models/table-validator.d.ts +1 -1
  106. package/dist/esm/table/models/table-validator.js.map +1 -1
  107. package/dist/esm/table/models/virtualizer.d.ts +1 -1
  108. package/dist/esm/table/models/virtualizer.js.map +1 -1
  109. package/dist/esm/table/template.js +1 -1
  110. package/dist/esm/table/template.js.map +1 -1
  111. package/dist/esm/table/testing/table.pageobject.d.ts +1 -1
  112. package/dist/esm/table/testing/table.pageobject.js +1 -1
  113. package/dist/esm/table/testing/table.pageobject.js.map +1 -1
  114. package/dist/esm/table-column/base/group-header-view/template.js +1 -1
  115. package/dist/esm/table-column/base/group-header-view/template.js.map +1 -1
  116. package/dist/esm/table-column/base/index.d.ts +1 -1
  117. package/dist/esm/table-column/base/index.js.map +1 -1
  118. package/dist/esm/table-column/base/models/column-internals.d.ts +1 -1
  119. package/dist/esm/table-column/base/models/column-internals.js +1 -1
  120. package/dist/esm/table-column/base/models/column-internals.js.map +1 -1
  121. package/dist/esm/table-column/date-text/index.d.ts +2 -1
  122. package/dist/esm/table-column/date-text/index.js.map +1 -1
  123. package/dist/esm/table-column/duration-text/index.js.map +1 -1
  124. package/dist/esm/table-column/enum-base/index.d.ts +1 -1
  125. package/dist/esm/table-column/enum-base/index.js.map +1 -1
  126. package/dist/esm/table-column/mapping/cell-view/index.d.ts +2 -2
  127. package/dist/esm/table-column/mapping/cell-view/index.js +1 -1
  128. package/dist/esm/table-column/mapping/cell-view/index.js.map +1 -1
  129. package/dist/esm/table-column/mapping/group-header-view/index.d.ts +1 -1
  130. package/dist/esm/table-column/mapping/group-header-view/index.js +1 -1
  131. package/dist/esm/table-column/mapping/group-header-view/index.js.map +1 -1
  132. package/dist/esm/table-column/mapping/index.d.ts +1 -1
  133. package/dist/esm/table-column/mapping/index.js.map +1 -1
  134. package/dist/esm/table-column/menu-button/index.js.map +1 -1
  135. package/dist/esm/table-column/mixins/custom-sort-order.d.ts +1 -1
  136. package/dist/esm/table-column/mixins/custom-sort-order.js.map +1 -1
  137. package/dist/esm/table-column/number-text/index.js.map +1 -1
  138. package/dist/esm/table-column/text-base/cell-view/index.d.ts +1 -1
  139. package/dist/esm/table-column/text-base/cell-view/index.js.map +1 -1
  140. package/dist/esm/tabs/index.js.map +1 -1
  141. package/dist/esm/text-area/template.js +1 -1
  142. package/dist/esm/text-area/template.js.map +1 -1
  143. package/dist/esm/text-field/index.js.map +1 -1
  144. package/dist/esm/text-field/template.d.ts +1 -1
  145. package/dist/esm/text-field/template.js.map +1 -1
  146. package/dist/esm/theme-provider/design-tokens.d.ts +1 -1
  147. package/dist/esm/theme-provider/design-tokens.js.map +1 -1
  148. package/dist/esm/toggle-button/index.js +1 -1
  149. package/dist/esm/toggle-button/index.js.map +1 -1
  150. package/dist/esm/toggle-button/template.d.ts +1 -1
  151. package/dist/esm/toggle-button/template.js +1 -1
  152. package/dist/esm/toggle-button/template.js.map +1 -1
  153. package/dist/esm/toolbar/index.js.map +1 -1
  154. package/dist/esm/tree-item/index.js.map +1 -1
  155. package/dist/esm/utilities/style/multivalue-property-stylesheet-behavior.d.ts +1 -1
  156. package/dist/esm/utilities/style/multivalue-property-stylesheet-behavior.js +1 -1
  157. package/dist/esm/utilities/style/multivalue-property-stylesheet-behavior.js.map +1 -1
  158. package/dist/esm/utilities/unit-format/decimal-unit-format.d.ts +1 -1
  159. package/dist/esm/utilities/unit-format/decimal-unit-format.js.map +1 -1
  160. package/dist/esm/utilities/unit-format/default-unit-format.d.ts +1 -1
  161. package/dist/esm/utilities/unit-format/default-unit-format.js.map +1 -1
  162. package/dist/esm/utilities/unit-format/unit-scale/byte-1024-unit-scale.js.map +1 -1
  163. package/dist/esm/utilities/unit-format/unit-scale/volt-unit-scale.js.map +1 -1
  164. package/dist/esm/wafer-map/experimental/computations.d.ts +1 -1
  165. package/dist/esm/wafer-map/experimental/computations.js.map +1 -1
  166. package/dist/esm/wafer-map/experimental/hover-handler.js.map +1 -1
  167. package/dist/esm/wafer-map/index.d.ts +1 -1
  168. package/dist/esm/wafer-map/index.js +1 -1
  169. package/dist/esm/wafer-map/index.js.map +1 -1
  170. package/dist/esm/wafer-map/modules/computations.d.ts +1 -1
  171. package/dist/esm/wafer-map/modules/computations.js.map +1 -1
  172. package/dist/esm/wafer-map/modules/create-matrix-renderer.d.ts +1 -1
  173. package/dist/esm/wafer-map/modules/create-matrix-renderer.js.map +1 -1
  174. package/dist/esm/wafer-map/modules/hover-handler.js.map +1 -1
  175. package/dist/esm/wafer-map/modules/prerendering.d.ts +1 -1
  176. package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
  177. package/dist/esm/wafer-map/modules/rendering.js.map +1 -1
  178. package/dist/esm/wafer-map/modules/zoom-handler.js +1 -1
  179. package/dist/esm/wafer-map/modules/zoom-handler.js.map +1 -1
  180. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard-navigation-manager.js","sourceRoot":"","sources":["../../../../src/table/models/keyboard-navigation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,MAAM,EACN,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACT,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG/D,OAAO,EAEH,cAAc,EAIjB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAUlE;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAYlC,IAAY,gBAAgB;QACxB,OAAO,CACH,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,cAAc;eAC7C,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,WAAW,CACnD,CAAC;IACN,CAAC;IAED,YACqB,KAAmB,EACnB,WAA+B;QAD/B,UAAK,GAAL,KAAK,CAAc;QACnB,gBAAW,GAAX,WAAW,CAAoB;QAnB5C,cAAS,GAAmB,cAAc,CAAC,IAAI,CAAC;QAChD,sBAAiB,GAAG,CAAC,CAAC,CAAC;QACvB,aAAQ,GAAG,CAAC,CAAC,CAAC;QACd,qBAAgB,GAAG,CAAC,CAAC,CAAC;QACtB,gBAAW,GAAG,CAAC,CAAC,CAAC;QACjB,qBAAgB,GAAG,KAAK,CAAC;QACzB,+BAA0B,GAAG,KAAK,CAAC;QAGnC,wBAAmB,GAAe,EAAE,CAAC;QAwM5B,mBAAc,GAAG,CAAC,KAAiB,EAAQ,EAAE;YAC1D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;YAE9C,sDAAsD;YACtD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,KAAK,SAAS,CAAC;YACvE,IACI,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK;mBACrB,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,CAAC;mBAC3C,CAAC,cAAc,EACpB,CAAC;gBACC,IAAI,WAAW,GAAG,IAAI,CAAC;gBACvB,IACI,IAAI,CAAC,qBAAqB,EAAE;uBACzB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC5C,CAAC;oBACC,WAAW,GAAG,KAAK,CAAC;gBACxB,CAAC;gBACD,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;oBAC1C,mBAAmB;oBACnB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACtB,CAAC;YACL,CAAC;QACL,CAAC,CAAC;QAEe,oBAAe,GAAG,GAAS,EAAE;YAC1C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAClC,CAAC,CAAC;QAEe,yBAAoB,GAAG,CACpC,KAA6B,EACzB,EAAE;YACN,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,oEAAoE;gBACpE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;QACL,CAAC,CAAC;QAEe,sBAAiB,GAAG,CACjC,KAA6B,EACzB,EAAE;YACN,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC,CAAC;QAEe,kBAAa,GAAG,CAAC,KAA6B,EAAQ,EAAE;YACrE,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC;YAC7C,0FAA0F;YAC1F,kGAAkG;YAClG,iGAAiG;YACjG,kBAAkB;YAClB,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG;mBAClC,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,EACrC,CAAC;gBACC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACL,CAAC,CAAC;QAEe,eAAU,GAAG,CAAC,KAA6B,EAAQ,EAAE;YAClE,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC;QAEe,qBAAgB,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC/D,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC/B,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;oBAChB,KAAK,YAAY;wBACb,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACpC,MAAM;oBACV,KAAK,aAAa;wBACd,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBACrC,MAAM;oBACV,KAAK,UAAU;wBACX,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBAClC,MAAM;oBACV,KAAK,YAAY;wBACb,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACpC,MAAM;oBACV,KAAK,SAAS;wBACV,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;wBACjC,MAAM;oBACV,KAAK,WAAW;wBACZ,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACnC,MAAM;oBACV,KAAK,OAAO;wBACR,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC5C,MAAM;oBACV,KAAK,MAAM;wBACP,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC3C,MAAM;oBACV,KAAK,QAAQ;wBACT,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC7C,MAAM;oBACV,KAAK,QAAQ;wBACT,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBAC9C,MAAM;oBACV,KAAK,YAAY;wBACb,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC7B,MAAM;oBACV;wBACI,MAAM;gBACd,CAAC;YACL,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACV,KAAK,CAAC,cAAc,EAAE,CAAC;YAC3B,CAAC;QACL,CAAC,CAAC;QAEe,cAAS,GAAG,CAAC,KAAoB,EAAQ,EAAE;YACxD,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACpD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;oBACxD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;oBACjC,IAAI,GAAG,EAAE,CAAC;wBACN,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC;oBACrD,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC,CAAC;QAEe,sBAAiB,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAChE,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,gBAAgB;mBACjC,CAAC,KAAK,CAAC,GAAG,KAAK,UAAU,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC;YAChE,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;gBAChB,KAAK,SAAS,CAAC;gBACf,KAAK,WAAW,CAAC;gBACjB,KAAK,OAAO,CAAC;gBACb,KAAK,MAAM;oBACP,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;gBACV;oBACI,MAAM;YACd,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBACd,6FAA6F;gBAC7F,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;YACrC,CAAC;QACL,CAAC,CAAC;QA9UE,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC7D,CAAC;IAEM,eAAe;QAClB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjE,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,KAAK,CAAC,gBAAgB,CACvB,SAAS,EACT,IAAI,CAAC,gBAAiC,EACtC,EAAE,OAAO,EAAE,IAAI,EAAE,CACpB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAA0B,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CACvB,SAAS,EACT,IAAI,CAAC,cAA+B,CACvC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,gBAAgB,CACvB,UAAU,EACV,IAAI,CAAC,eAAgC,CACxC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAChC,uBAAuB,EACvB,IAAI,CAAC,oBAAqC,CAC7C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAChC,oBAAoB,EACpB,IAAI,CAAC,iBAAkC,CAC1C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAChC,eAAe,EACf,IAAI,CAAC,aAA8B,CACtC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAChC,WAAW,EACX,IAAI,CAAC,UAA2B,CACnC,CAAC;IACN,CAAC;IAEM,UAAU;QACb,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAC1B,SAAS,EACT,IAAI,CAAC,gBAAiC,EACtC,EAAE,OAAO,EAAE,IAAI,EAAE,CACpB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAC1B,SAAS,EACT,IAAI,CAAC,SAA0B,CAClC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAC1B,SAAS,EACT,IAAI,CAAC,cAA+B,CACvC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAC1B,UAAU,EACV,IAAI,CAAC,eAAgC,CACxC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,SAAS,EACT,IAAI,CAAC,iBAAiB,CACzB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,uBAAuB,EACvB,IAAI,CAAC,oBAAqC,CAC7C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,oBAAoB,EACpB,IAAI,CAAC,iBAAkC,CAC1C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,eAAe,EACf,IAAI,CAAC,aAA8B,CACtC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,WAAW,EACX,IAAI,CAAC,UAA2B,CACnC,CAAC;IACN,CAAC;IAEM,YAAY,CAAC,MAAe,EAAE,IAAa;QAC9C,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,MAAM,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YACzD,eAAe,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,IAAI,MAAM,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YACzD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC9C,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;YAC9B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBAC9C,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBACvD,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;gBAChD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChD,eAAe,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACL,CAAC;QACL,CAAC;aAAM,IACH,IAAI,KAAK,kBAAkB;eACxB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EACnC,CAAC;YACC,IAAI,MAAM,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5C,eAAe,GAAG,IAAI,CAAC;YAC3B,CAAC;QACL,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YAClB,yHAAyH;YACzH,yHAAyH;YACzH,wHAAwH;YACxH,cAAc;YACd,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,cAAc;mBAC7C,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,WAAW,EAClD,CAAC;gBACC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;gBACxD,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClD,mEAAmE;oBACnE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACtB,CAAC;yBAAM,CAAC;wBACJ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;4BACxB,IAAI,CAAC,eAAe,EAAE,CAAC;wBAC3B,CAAC;6BAAM,CAAC;4BACJ,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;wBACzC,CAAC;wBACD,OAAO;oBACX,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACxB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,KAAiB;QACjC,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAClC,OAAO;QACX,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACzB,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACzC,mGAAmG;gBACnG,2BAA2B;gBAC3B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAChD,CAAC;QACL,CAAC;IACL,CAAC;IAEM,SAAS,CAAC,KAAiB;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACzB,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;IACL,CAAC;IAEM,qBAAqB,CACxB,KAAoD;QAEpD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,KAAK,CAAC,MAAkB,CAAC;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CACnD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CACtD,CAAC;YACF,IAAI,CAAC,2BAA2B,CAC5B,GAAG,CAAC,gBAAiB,EACrB,WAAW,EACX,KAAK,CACR,CAAC;QACN,CAAC;IACL,CAAC;IAsJO,cAAc,CAAC,OAAgB;QACnC,IAAI,GAAyC,CAAC;QAC9C,IAAI,WAAkD,CAAC;QACvD,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC/B,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG,EAAE,CAAC;YACxC,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClD,IAAI,IAAI,EAAE,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;oBACxD,IAAI,CAAC,gBAAgB,CAAC,YAAa,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACpD,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC,yCAAyC,CAAC,WAAW,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,WAAW;QACf,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,yCAAyC,CAAC,WAAW,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,cAAc,CAAC,QAAiB;QACpC,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG;eAClC,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,EAC3C,CAAC;YACC,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC;gBACpD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjC,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;oBAC5C,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvD,CAAC;qBAAM,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;oBACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC;YACL,CAAC;YACD,iIAAiI;YACjI,2HAA2H;YAC3H,6BAA6B;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,kBAAkB;QACtB,IAAI,GAAyC,CAAC;QAC9C,IAAI,WAAkD,CAAC;QACvD,IAAI,cAA6C,CAAC;QAClD,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC/B,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACnC,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAC5D,CAAC;QAED,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,aAAa;gBAC7B,OAAO,IAAI,CAAC,uBAAuB,CAC/B,cAAc,EACd,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAC7B,CAAC;YACN,KAAK,cAAc,CAAC,YAAY;gBAC5B,OAAO,CACH,IAAI,CAAC,uBAAuB,CACxB,cAAc,EACd,IAAI,CAAC,WAAW,GAAG,CAAC,CACvB;uBACE,IAAI,CAAC,uBAAuB,CAC3B,cAAc,EACd,cAAc,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAC1C,CACJ,CAAC;YACN,KAAK,cAAc,CAAC,GAAG;gBACnB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;oBACnC,IAAI,CAAC,iBAAiB,CAAC,GAAI,CAAC,CAAC;oBAC7B,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,KAAK,cAAc,CAAC,oBAAoB;gBACpC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtC,KAAK,cAAc,CAAC,IAAI;gBACpB,IACI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;uBACrD,CAAC,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC,EACvD,CAAC;oBACC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACxB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB;gBACI,MAAM;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,mBAAmB;QACvB,IAAI,GAAyC,CAAC;QAC9C,IAAI,WAAkD,CAAC;QACvD,IAAI,cAA6C,CAAC;QAClD,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC/B,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACnC,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAC5D,CAAC;QAED,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,aAAa;gBAC7B,OAAO,CACH,IAAI,CAAC,uBAAuB,CACxB,cAAc,EACd,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAC7B,IAAI,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC,CACvD,CAAC;YACN,KAAK,cAAc,CAAC,YAAY;gBAC5B,OAAO,IAAI,CAAC,uBAAuB,CAC/B,cAAc,EACd,IAAI,CAAC,WAAW,GAAG,CAAC,CACvB,CAAC;YACN,KAAK,cAAc,CAAC,GAAG;gBACnB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;oBACpC,IAAI,CAAC,iBAAiB,CAAC,GAAI,CAAC,CAAC;oBAC7B,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,OAAO,CACH,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC;uBAC9C,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,CAC1C,CAAC;YACN,KAAK,cAAc,CAAC,oBAAoB;gBACpC,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAChD,KAAK,cAAc,CAAC,IAAI;gBACpB,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YACnE;gBACI,MAAM;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,gBAAgB;QACpB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjB,yGAAyG;QACzG,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,eAAe;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAEO,aAAa,CAAC,OAAgB;QAClC,IAAI,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;YAChD,OAAO,CACH,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC;mBAC9C,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,CAC1C,CAAC;QACN,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAEO,kBAAkB;QACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACnB,yGAAyG;QACzG,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,iBAAiB;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEO,YAAY,CAAC,OAAgB;QACjC,IAAI,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,eAAe,CACvB,WAAW,EACX,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CACvC,CAAC;QACN,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,sBAAsB,CAAC,OAAgB;QAC3C,OAAO,CACH,CAAC,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI;eAChC,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,oBAAoB,CAAC;eAC3D,CAAC,OAAO,CACd,CAAC;IACN,CAAC;IAEO,YAAY,CAAC,eAAwB;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,EAAE;YAC/C,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,cAAc,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;YAC1C,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;YACzD,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;YAClE,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC;YACpF,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC;YACjF,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;gBAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9B,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,iBAAiB,CACrB,eAAwB;QAExB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAC/C,IAAI,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,cAAc,CAAC,oBAAoB;aACjD,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,oBAAoB,EAAE,CAAC;gBACzD,UAAU,GAAG,CAAC,CAAC;YACnB,CAAC;QACL,CAAC;QACD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,sBAAsB,GAAG,WAAW,CAAC,MAAM,CAAC;YAClD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC;YAC/C,MAAM,wBAAwB,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvD,WAAW,CAAC,IAAI,CAAC;oBACb,SAAS,EAAE,cAAc,CAAC,WAAW;oBACrC,WAAW,EAAE,SAAS;oBACtB,gBAAgB,EAAE,CAAC;iBACtB,CAAC,CAAC;gBACH,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,WAAW;uBAC1C,IAAI,CAAC,WAAW,KAAK,SAAS;uBAC9B,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAChC,CAAC;oBACC,UAAU,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;YACD,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,WAAW,CAAC,IAAI,CAAC;oBACb,SAAS,EAAE,cAAc,CAAC,cAAc;oBACxC,WAAW,EAAE,SAAS;iBACzB,CAAC,CAAC;gBACH,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,cAAc;uBAC7C,IAAI,CAAC,WAAW,KAAK,SAAS,EACnC,CAAC;oBACC,UAAU,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;YACD,MAAM,qBAAqB,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI;mBACnC,IAAI,CAAC,WAAW,KAAK,SAAS,EACnC,CAAC;gBACC,UAAU,GAAG,eAAe;oBACxB,CAAC,CAAC,qBAAqB,GAAG,CAAC;oBAC3B,CAAC,CAAC,sBAAsB,GAAG,CAAC,CAAC;YACrC,CAAC;YACD,SAAS,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG,EAAE,CAAC;YACxC,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAC/C,CAAC;IAEO,oBAAoB,CACxB,eAAwB;QAExB,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,sBAAsB,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC,aAAa,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrD,WAAW,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,cAAc,CAAC,aAAa;gBACvC,iBAAiB,EAAE,CAAC;aACvB,CAAC,CAAC;QACP,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,aAAa,EAAE,CAAC;YAClD,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACxC,CAAC;aAAM,CAAC;YACJ,8BAA8B;YAC9B,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;QACpC,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAC/C,CAAC;IAEO,gBAAgB,CAAC,aAA0B;QAC/C,sFAAsF;QACtF,sFAAsF;QACtF,8FAA8F;QAC9F,yDAAyD;QACzD,qGAAqG;QACrG,uBAAuB;QACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,qGAAqG;QACrG,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAEO,QAAQ,CAAC,QAAgB,EAAE,WAAoB;QACnD,MAAM,cAAc,GAAG,QAAQ,GAAG,CAAC,CAAC;QACpC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,GAAG,CAAC;YACxB,KAAK,cAAc,CAAC,oBAAoB,CAAC;YACzC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvB,MAAM,aAAa,GAAoB,EAAE,CAAC;gBAC1C,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC7B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC5B,QAAQ,GAAG,WAAW,CAAC;gBAC3B,CAAC;gBACD,QAAQ,IAAI,QAAQ,CAAC;gBACrB,IAAI,cAAc,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACjC,QAAQ,GAAG,CAAC,CAAC;gBACjB,CAAC;gBACD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACf,aAAa,CAAC,KAAK,GAAG,OAAO,CAAC;gBAClC,CAAC;gBAED,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;gBAC7D,CAAC;gBACD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;oBAClB,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;oBAC9D,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG;2BAClC,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,oBAAoB,EAC3D,CAAC;wBACC,OAAO,CACH,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC;+BAC5C,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC,CACrD,CAAC;oBACN,CAAC;oBACD,OAAO,IAAI,CAAC,uBAAuB,CAC/B,cAAc,EACd,IAAI,CAAC,WAAW,CACnB,CAAC;gBACN,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;YACD;gBACI,MAAM;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,UAAU,CAAC,QAAgB,EAAE,WAAoB;QACrD,MAAM,cAAc,GAAG,QAAQ,GAAG,CAAC,CAAC;QACpC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,KAAK,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,KAAK,cAAc,CAAC,GAAG,CAAC;YACxB,KAAK,cAAc,CAAC,oBAAoB,CAAC;YACzC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvB,MAAM,aAAa,GAAoB,EAAE,CAAC;gBAC1C,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC7B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC5B,QAAQ,GAAG,WAAW,CAAC;gBAC3B,CAAC;gBACD,QAAQ,IAAI,QAAQ,CAAC;gBACrB,IAAI,cAAc,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;oBAC5D,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/C,CAAC;gBACD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACf,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;gBAChC,CAAC;gBACD,IACI,QAAQ,GAAG,IAAI,CAAC,QAAQ;uBACrB,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAC3C,CAAC;oBACC,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;gBAC7D,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;YACD;gBACI,MAAM;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,iCAAiC,CAAC,WAAoB;QAC1D,+FAA+F;QAC/F,qEAAqE;QACrE,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,aAAa,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACjD,IAAI,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,CAAC,GAAG,YAAY,aAAa,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;oBACnD,IAAI,IAAI,EAAE,CAAC;wBACP,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CACjD,IAAI,CAAC,MAAO,CACf,CAAC;wBACF,IAAI,IAAI,CAAC,gBAAgB,KAAK,aAAa,EAAE,CAAC;4BAC1C,IAAI,CAAC,2BAA2B,CAC5B,GAAG,CAAC,gBAAiB,EACrB,WAAW,EACX,KAAK,CACR,CAAC;4BACF,OAAO;wBACX,CAAC;wBACD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CACvD,aAAa,CAChB,CAAC;wBACF,IAAI,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC;4BACpB,IAAI,CAAC,wBAAwB,CACzB,YAAY,EACZ,GAAG,CAAC,gBAAiB,EACrB,WAAW,EACX,KAAK,CACR,CAAC;4BACF,OAAO;wBACX,CAAC;oBACL,CAAC;gBACL,CAAC;gBACD,IACI,WAAW;uBACR,IAAI,CAAC,qBAAqB,EAAE;uBAC5B,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,gBAAgB,EAC3C,CAAC;oBACC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAChD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEO,YAAY,CAChB,OAAoB,EACpB,YAA2B;QAE3B,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtD,IAAI,qBAAqB,KAAK,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5B,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;YACxC,IACI,qBAAqB;mBAClB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAC1C,CAAC;gBACC,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC;QACL,CAAC;IACL,CAAC;IAEO,mBAAmB,CACvB,OAAoB,EACpB,SAAkB;QAElB,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,0BAA0B,CAC9B,UAAsB,EACtB,OAAgB;QAEhB,8FAA8F;QAC9F,qCAAqC;QACrC,IAAI,OAAO,EAAE,CAAC;YACV,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACJ,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAEO,gBAAgB;QACpB,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,CAAC;IAClD,CAAC;IAEO,eAAe;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAC9D,IACI,CAAC,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC;eAC7C,CAAC,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC;eAChD,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EACjC,CAAC;YACC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;QACzC,CAAC;IACL,CAAC;IAEO,mBAAmB,CACvB,aAAqB,EACrB,aAA+B;QAE/B,IAAI,aAAa,IAAI,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACpE,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;gBACrB,KAAK,cAAc,CAAC,IAAI,CAAC;gBACzB,KAAK,cAAc,CAAC,aAAa,CAAC;gBAClC,KAAK,cAAc,CAAC,YAAY;oBAC5B,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;oBACrC,MAAM;gBACV;oBACI,MAAM;YACd,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;YAC9B,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC7D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,eAAe,CAAC,WAAoB;QACxC,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzD,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,CAAE,CAAC;QAE5D,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,GAAG;gBACnB,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACV,KAAK,cAAc,CAAC,IAAI,CAAC;YACzB,KAAK,cAAc,CAAC,cAAc,CAAC;YACnC,KAAK,cAAc,CAAC,WAAW;gBAC3B,YAAY,GAAG,UAAU,YAAY,aAAa,CAAC;gBACnD,MAAM;YACV;gBACI,MAAM;QACd,CAAC;QACD,MAAM,YAAY,GAAG,EAAE,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,eAAe,CACnB,GAA6B,EAC7B,YAA2B;QAE3B,MAAM,WAAW,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAC/C,IAAI,gBAAyC,CAAC;QAC9C,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,oBAAoB;gBACpC,gBAAgB,GAAG,WAAW,CAAC,iBAAiB,CAAC;gBACjD,MAAM;YACV,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvB,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC;gBAC7D,MAAM;YACV,CAAC;YACD,KAAK,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;gBACjC,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC;gBACpF,IAAI,gBAAgB,EAAE,CAAC;oBACnB,gBAAgB,GAAG,gBAAgB,CAAC;oBACpC,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;gBAC5D,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC9B,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,QAAQ;qBAChE,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC7C,MAAM;YACV,CAAC;YACD;gBACI,MAAM;QACd,CAAC;QACD,IAAI,gBAAgB,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAEO,kBAAkB;QACtB,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAC9D,IAAI,gBAAyC,CAAC;QAC9C,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,aAAa;gBAC7B,gBAAgB,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACxE,MAAM;YACV,KAAK,cAAc,CAAC,YAAY;gBAC5B,gBAAgB,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClE,MAAM;YACV;gBACI,MAAM;QACd,CAAC;QACD,IAAI,gBAAgB,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,yBAAyB;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CACnC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,CAChD,CAAC;IACN,CAAC;IAEO,+BAA+B;QACnC,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,IACI,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,WAAW,EAAE;gBACvC,IAAI,CAAC,KAAK,CAAC,UAAU,EAC3B,CAAC;YACC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrD,CAAC;QAED,IACI,IAAI,CAAC,KAAK,CAAC,eAAe;eACvB,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,WAAW,EAAE;oBACtC,IAAI,CAAC,KAAK,CAAC,UAAU,EAC/B,CAAC;YACC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,sBAAsB;iBAC5B,gBAAgB,CAAC,cAAc,CAAC;iBAChC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;IAC5C,CAAC;IAEO,qBAAqB;QACzB,OAAO,CACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC;gBAC5D,SAAS,CAChB,CAAC;IACN,CAAC;IAEO,aAAa;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;IACpE,CAAC;IAEO,aAAa,CACjB,GAAyC;QAEzC,IACI,CAAC,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC;eACzC,GAAG,YAAY,aAAa,EACjC,CAAC;YACC,OAAO,GAAG,CAAC,QAAQ,CAAC;QACxB,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,iBAAiB,CAAC,GAA6B;QACnD,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YAC/B,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC9B,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAEO,gBAAgB,CACpB,KAAiC;QAEjC,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAEO,iBAAiB,CACrB,KAAiC;QAEjC,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,SAAS,CAAC,CAAC;IACzE,CAAC;IAEO,oBAAoB,CACxB,KAAiC,EACjC,cAA6C;QAE7C,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,OAAO,aAAa,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACnD,IAAI,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;gBAChC,OAAO,aAAyB,CAAC;YACrC,CAAC;YACD,aAAa,GAAG,aAAa,CAAC,aAAa;mBACnC,aAAa,CAAC,UAAyB,EAAE,IAAI,CAAC;QAC1D,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,SAAS,CAAC,KAAc;QAC5B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,OAAO,aAAa,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACnD,aAAa,GAAG,aAAa,CAAC,aAAa;mBACnC,aAAa,CAAC,UAAyB,EAAE,IAAI,CAAC;QAC1D,CAAC;QAED,OAAO,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC;IACxC,CAAC;IAEO,gBAAgB;QACpB,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC3C,OAAO,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;YAC9C,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC;YACvD,+KAA+K;YAC/K,4HAA4H;YAC5H,kHAAkH;YAClH,IACI,aAAa,YAAY,iBAAiB;mBACvC,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;mBACtC,CAAC,CAAC,aAAa,YAAY,SAAS,CAAC;mBACrC,CAAC,CAAC,aAAa,YAAY,aAAa,CAAC,EAC9C,CAAC;gBACC,MAAM;YACV,CAAC;QACL,CAAC;QAED,OAAO,aAA4B,CAAC;IACxC,CAAC;IAEO,yCAAyC,CAC7C,WAAuC;QAEvC,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,CACH,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC,CAAC;eACxC,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,CACjD,CAAC;IACN,CAAC;IAEO,qBAAqB;QACzB,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,IAAI,CAAC;YACzB,KAAK,cAAc,CAAC,cAAc,CAAC;YACnC,KAAK,cAAc,CAAC,WAAW,CAAC;YAChC,KAAK,cAAc,CAAC,GAAG,CAAC;YACxB,KAAK,cAAc,CAAC,oBAAoB;gBACpC,OAAO,IAAI,CAAC;YAChB;gBACI,OAAO,KAAK,CAAC;QACrB,CAAC;IACL,CAAC;IAEO,kBAAkB;QACtB,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,cAAc,CAAC,aAAa,CAAC;YAClC,KAAK,cAAc,CAAC,YAAY;gBAC5B,OAAO,IAAI,CAAC;YAChB;gBACI,OAAO,KAAK,CAAC;QACrB,CAAC;IACL,CAAC;IAEO,+BAA+B,CACnC,WAAkD;QAElD,IAAI,WAAW,EAAE,iBAAiB,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,oBAAoB,CAAC;YACrD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,uBAAuB,CAC3B,cAA4C,EAC5C,WAAmB;QAEnB,IACI,WAAW,IAAI,CAAC;eACb,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,MAAM,EACtD,CAAC;YACC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC;YAC7C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,uBAAuB,CAC3B,cAA4C,EAC5C,iBAAyB;QAEzB,IACI,iBAAiB,IAAI,CAAC;eACnB,iBAAiB,GAAG,cAAc,CAAC,aAAa,CAAC,MAAM,EAC5D,CAAC;YACC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC;YAC9C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAC3C,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,eAAe,CACnB,WAAkD,EAClD,WAAoB,EACpB,QAAiB;QAEjB,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACvD,MAAM,WAAW,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE9C,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACnE,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;YACrC,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,sBAAsB,CAC1B,WAAkD,EAClD,gBAAwB,EACxB,WAAoB,EACpB,QAAiB;QAEjB,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACvD,MAAM,WAAW,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE9C,IACI,cAAc,IAAI,CAAC;eAChB,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM;eACzC,gBAAgB,IAAI,CAAC;eACrB,gBAAgB;kBACb,WAAW,CAAC,KAAK,CAAC,cAAc,CAAE,CAAC,IAAI,CAAC,QAAQ;qBAC7C,gBAAgB,CAAC,MAAM,EAClC,CAAC;YACC,IAAI,CAAC,wBAAwB,CACzB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,IAAI,CACP,CAAC;YACF,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,yBAAyB,CAC7B,WAAsC,EACtC,WAAoB,EACpB,QAAiB;QAEjB,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACvD,MAAM,WAAW,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE9C,IACI,cAAc,IAAI,CAAC;eAChB,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM;eACzC,WAAW,CAAC,KAAK,CAAC,cAAc,CAAE,CAAC,gBAAgB,EACxD,CAAC;YACC,IAAI,CAAC,2BAA2B,CAAC,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,2BAA2B,CAC/B,QAAgB,EAChB,WAAmB,EACnB,YAAqB;QAErB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,cAAc,CAAC;QAC/C,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAEO,wBAAwB,CAC5B,gBAAwB,EACxB,QAAgB,EAChB,WAAmB,EACnB,YAAqB;QAErB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAEO,gBAAgB,CAAC,QAAiB;QACtC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC;IACL,CAAC;IAEO,iBAAiB,CACrB,WAAmB,EACnB,QAAgB,EAChB,YAAqB;QAErB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;QACrC,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAEO,oBAAoB,CACxB,WAAmB,EACnB,QAAgB,EAChB,YAAqB;QAErB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,GAAY;QAClC,OAAO,GAAG,YAAY,QAAQ,IAAI,GAAG,YAAY,aAAa,CAAC;IACnE,CAAC;CACJ","sourcesContent":["import { Notifier, Subscriber, Observable } from '@microsoft/fast-element';\nimport {\n keyArrowDown,\n keyArrowLeft,\n keyArrowRight,\n keyArrowUp,\n keyEnd,\n keyEnter,\n keyEscape,\n keyFunction2,\n keyHome,\n keyPageDown,\n keyPageUp,\n keySpace,\n keyTab\n} from '@microsoft/fast-web-utilities';\nimport { FoundationElement } from '@microsoft/fast-foundation';\nimport type { ScrollToOptions } from '@tanstack/virtual-core';\nimport type { Table } from '..';\nimport {\n TableActionMenuToggleEventDetail,\n TableFocusType,\n TableHeaderFocusableElements,\n TableRowFocusableElements,\n type TableRecord\n} from '../types';\nimport type { Virtualizer } from './virtualizer';\nimport { TableGroupRow } from '../components/group-row';\nimport { TableRow } from '../components/row';\nimport { TableCell } from '../components/cell';\nimport type { MenuButton } from '../../menu-button';\nimport { tableHeaderTag } from '../components/header';\nimport { TableCellView } from '../../table-column/base/cell-view';\n\ninterface TableFocusState {\n focusType: TableFocusType;\n headerActionIndex?: number;\n rowIndex?: number;\n columnIndex?: number;\n cellContentIndex?: number;\n}\n\n/**\n * Manages the keyboard navigation and focus within the table.\n * @internal\n */\nexport class KeyboardNavigationManager<TData extends TableRecord>\nimplements Subscriber {\n private focusType: TableFocusType = TableFocusType.none;\n private headerActionIndex = -1;\n private rowIndex = -1;\n private cellContentIndex = -1;\n private columnIndex = -1;\n private focusWithinTable = false;\n private isCurrentlyFocusingElement = false;\n private readonly tableNotifier: Notifier;\n private readonly virtualizerNotifier: Notifier;\n private visibleRowNotifiers: Notifier[] = [];\n private get inNavigationMode(): boolean {\n return (\n this.focusType !== TableFocusType.cellActionMenu\n && this.focusType !== TableFocusType.cellContent\n );\n }\n\n public constructor(\n private readonly table: Table<TData>,\n private readonly virtualizer: Virtualizer<TData>\n ) {\n this.tableNotifier = Observable.getNotifier(this.table);\n this.tableNotifier.subscribe(this, 'rowElements');\n this.virtualizerNotifier = Observable.getNotifier(this.virtualizer);\n this.virtualizerNotifier.subscribe(this, 'visibleItems');\n }\n\n public resetFocusState(): void {\n this.focusType = TableFocusType.none;\n const activeElement = this.getActiveElement();\n if (activeElement && this.isInTable(activeElement)) {\n this.setDefaultFocus();\n }\n }\n\n public get hasActiveRowOrCellFocus(): boolean {\n return this.focusWithinTable && this.hasRowOrCellFocusType();\n }\n\n public connect(): void {\n this.table.addEventListener(\n 'keydown',\n this.onCaptureKeyDown as EventListener,\n { capture: true }\n );\n this.table.addEventListener('keydown', this.onKeyDown as EventListener);\n this.table.addEventListener(\n 'focusin',\n this.onTableFocusIn as EventListener\n );\n this.table.addEventListener(\n 'focusout',\n this.onTableFocusOut as EventListener\n );\n this.table.viewport.addEventListener('keydown', this.onViewportKeyDown);\n this.table.viewport.addEventListener(\n 'cell-action-menu-blur',\n this.onCellActionMenuBlur as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-view-focus-in',\n this.onCellViewFocusIn as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-focus-in',\n this.onCellFocusIn as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-blur',\n this.onCellBlur as EventListener\n );\n }\n\n public disconnect(): void {\n this.table.removeEventListener(\n 'keydown',\n this.onCaptureKeyDown as EventListener,\n { capture: true }\n );\n this.table.removeEventListener(\n 'keydown',\n this.onKeyDown as EventListener\n );\n this.table.removeEventListener(\n 'focusin',\n this.onTableFocusIn as EventListener\n );\n this.table.removeEventListener(\n 'focusout',\n this.onTableFocusOut as EventListener\n );\n this.table.viewport.removeEventListener(\n 'keydown',\n this.onViewportKeyDown\n );\n this.table.viewport.removeEventListener(\n 'cell-action-menu-blur',\n this.onCellActionMenuBlur as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-view-focus-in',\n this.onCellViewFocusIn as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-focus-in',\n this.onCellFocusIn as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-blur',\n this.onCellBlur as EventListener\n );\n }\n\n public handleChange(source: unknown, args: unknown): void {\n let focusRowAndCell = false;\n if (source === this.virtualizer && args === 'visibleItems') {\n focusRowAndCell = true;\n } else if (source === this.table && args === 'rowElements') {\n for (const notifier of this.visibleRowNotifiers) {\n notifier.unsubscribe(this);\n }\n this.visibleRowNotifiers = [];\n for (const visibleRow of this.table.rowElements) {\n const rowNotifier = Observable.getNotifier(visibleRow);\n rowNotifier.subscribe(this, 'resolvedRowIndex');\n this.visibleRowNotifiers.push(rowNotifier);\n if (visibleRow.resolvedRowIndex === this.rowIndex) {\n focusRowAndCell = true;\n }\n }\n } else if (\n args === 'resolvedRowIndex'\n && this.isResolvedRowType(source)\n ) {\n if (source.resolvedRowIndex === this.rowIndex) {\n focusRowAndCell = true;\n }\n }\n\n if (focusRowAndCell) {\n // We want open action menus to be closed, and focused interactive cell content blurred, on scroll. We also don't want to\n // refocus the interactive cell content after the scroll, as the element no longer represents the same table data at that\n // point. So in both those cases, we focus the cell here. This also lets us maintain what row/ cell the user had focused\n // previously.\n if (\n this.focusType === TableFocusType.cellActionMenu\n || this.focusType === TableFocusType.cellContent\n ) {\n this.setCellFocusState(this.columnIndex, this.rowIndex, false);\n }\n if (this.inNavigationMode && this.hasRowOrCellFocusType()) {\n if (this.rowIndex > this.table.tableData.length - 1) {\n // Focused row index no longer valid, coerce to 1st row if possible\n if (this.table.tableData.length > 0) {\n this.rowIndex = 0;\n } else {\n if (this.focusWithinTable) {\n this.setDefaultFocus();\n } else {\n this.focusType = TableFocusType.none;\n }\n return;\n }\n }\n if (this.focusWithinTable) {\n this.focusCurrentRow(false);\n }\n }\n }\n }\n\n public onRowFocusIn(event: FocusEvent): void {\n if (this.isCurrentlyFocusingElement) {\n return;\n }\n const row = event.target;\n if (this.isResolvedRowType(row)) {\n if (this.rowIndex !== row.resolvedRowIndex) {\n // If user focuses a row some other way (e.g. mouse), update our focus state so future keyboard nav\n // will start from that row\n this.setRowFocusState(row.resolvedRowIndex);\n }\n }\n }\n\n public onRowBlur(event: FocusEvent): void {\n const row = event.target;\n if (this.isResolvedRowType(row)) {\n this.setElementFocusable(row, false);\n }\n }\n\n public onRowActionMenuToggle(\n event: CustomEvent<TableActionMenuToggleEventDetail>\n ): void {\n const isOpen = event.detail.newState;\n if (isOpen) {\n const row = event.target as TableRow;\n const columnIndex = this.table.visibleColumns.findIndex(\n column => column.columnId === event.detail.columnId\n );\n this.setCellActionMenuFocusState(\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n }\n }\n\n private readonly onTableFocusIn = (event: FocusEvent): void => {\n this.focusWithinTable = true;\n this.updateFocusStateFromActiveElement(false);\n\n // Sets initial focus on the appropriate table content\n const actionMenuOpen = this.table.openActionMenuRecordId !== undefined;\n if (\n (event.target === this.table\n || this.focusType === TableFocusType.none)\n && !actionMenuOpen\n ) {\n let focusHeader = true;\n if (\n this.hasRowOrCellFocusType()\n && this.scrollToAndFocusRow(this.rowIndex)\n ) {\n focusHeader = false;\n }\n if (focusHeader && !this.setFocusOnHeader()) {\n // nothing to focus\n this.table.blur();\n }\n }\n };\n\n private readonly onTableFocusOut = (): void => {\n this.focusWithinTable = false;\n };\n\n private readonly onCellActionMenuBlur = (\n event: CustomEvent<TableCell>\n ): void => {\n event.stopPropagation();\n const cell = event.detail;\n if (cell.actionMenuButton) {\n // Ensure that action menu buttons get hidden when no longer focused\n this.setActionMenuButtonFocused(cell.actionMenuButton, false);\n }\n };\n\n private readonly onCellViewFocusIn = (\n event: CustomEvent<TableCell>\n ): void => {\n event.stopPropagation();\n this.updateFocusStateFromActiveElement(false);\n };\n\n private readonly onCellFocusIn = (event: CustomEvent<TableCell>): void => {\n event.stopPropagation();\n const cell = event.detail;\n this.updateFocusStateFromActiveElement(true);\n // Currently, clicking a non-interactive cell only updates the focus state to that row, it\n // doesn't focus the cell. If we revisit this, we most likely need to set the cells to tabindex=-1\n // upfront too, so their focusing behavior is consistent whether they've been previously keyboard\n // focused or not.\n if (\n this.focusType === TableFocusType.row\n && this.getActiveElement() === cell\n ) {\n this.focusCurrentRow(false);\n }\n };\n\n private readonly onCellBlur = (event: CustomEvent<TableCell>): void => {\n event.stopPropagation();\n const cell = event.detail;\n this.setElementFocusable(cell, false);\n };\n\n private readonly onCaptureKeyDown = (event: KeyboardEvent): void => {\n let handled = false;\n if (event.key === keyTab) {\n handled = this.onTabPressed(event.shiftKey);\n } else if (this.inNavigationMode) {\n switch (event.key) {\n case keyArrowLeft:\n handled = this.onLeftArrowPressed();\n break;\n case keyArrowRight:\n handled = this.onRightArrowPressed();\n break;\n case keyArrowUp:\n handled = this.onUpArrowPressed();\n break;\n case keyArrowDown:\n handled = this.onDownArrowPressed();\n break;\n case keyPageUp:\n handled = this.onPageUpPressed();\n break;\n case keyPageDown:\n handled = this.onPageDownPressed();\n break;\n case keyHome:\n handled = this.onHomePressed(event.ctrlKey);\n break;\n case keyEnd:\n handled = this.onEndPressed(event.ctrlKey);\n break;\n case keyEnter:\n handled = this.onEnterPressed(event.ctrlKey);\n break;\n case keySpace:\n handled = this.onSpacePressed(event.shiftKey);\n break;\n case keyFunction2:\n handled = this.onF2Pressed();\n break;\n default:\n break;\n }\n }\n if (handled) {\n event.preventDefault();\n }\n };\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n if (!this.inNavigationMode && !event.defaultPrevented) {\n if (event.key === keyEscape || event.key === keyFunction2) {\n const row = this.getCurrentRow();\n if (row) {\n this.trySetCellFocus(row.getFocusableElements());\n }\n }\n }\n };\n\n private readonly onViewportKeyDown = (event: KeyboardEvent): void => {\n let handleEvent = !this.inNavigationMode\n && (event.key === keyArrowUp || event.key === keyArrowDown);\n switch (event.key) {\n case keyPageUp:\n case keyPageDown:\n case keyHome:\n case keyEnd:\n handleEvent = true;\n break;\n default:\n break;\n }\n if (handleEvent) {\n // Swallow key presses that would cause table scrolling, independently of keyboard navigation\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n\n private onEnterPressed(ctrlKey: boolean): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n }\n if (this.focusType === TableFocusType.row) {\n if (row instanceof TableGroupRow) {\n this.toggleRowExpanded(row);\n return true;\n }\n }\n if (this.focusType === TableFocusType.cell) {\n if (ctrlKey) {\n const cell = rowElements?.cells[this.columnIndex];\n if (cell?.actionMenuButton && !cell.actionMenuButton.open) {\n cell.actionMenuButton.toggleButton!.control.click();\n return true;\n }\n }\n return this.focusFirstInteractiveElementInCurrentCell(rowElements);\n }\n return false;\n }\n\n private onF2Pressed(): boolean {\n if (this.focusType === TableFocusType.cell) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return this.focusFirstInteractiveElementInCurrentCell(rowElements);\n }\n return false;\n }\n\n private onSpacePressed(shiftKey: boolean): boolean {\n if (\n this.focusType === TableFocusType.row\n || this.focusType === TableFocusType.cell\n ) {\n if (this.focusType === TableFocusType.row || shiftKey) {\n const row = this.getCurrentRow();\n if (row instanceof TableRow && row.selectable) {\n row.onSelectionChange(row.selected, !row.selected);\n } else if (row instanceof TableGroupRow) {\n this.toggleRowExpanded(row);\n }\n }\n // Default Space behavior scrolls down, which is redundant given the rest of our keyboard nav code, and we'd still try to focus a\n // row that you scrolled away from. So suppress default Space behavior if a row or cell is selected, regardless of if we're\n // toggling selection or not.\n return true;\n }\n return false;\n }\n\n private onLeftArrowPressed(): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n let headerElements!: TableHeaderFocusableElements;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n } else if (this.hasHeaderFocusType()) {\n headerElements = this.getTableHeaderFocusableElements();\n }\n\n switch (this.focusType) {\n case TableFocusType.headerActions:\n return this.trySetHeaderActionFocus(\n headerElements,\n this.headerActionIndex - 1\n );\n case TableFocusType.columnHeader:\n return (\n this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex - 1\n )\n || this.trySetHeaderActionFocus(\n headerElements,\n headerElements.headerActions.length - 1\n )\n );\n case TableFocusType.row:\n if (this.isRowExpanded(row) === true) {\n this.toggleRowExpanded(row!);\n return true;\n }\n return false;\n case TableFocusType.rowSelectionCheckbox:\n this.setRowFocusState();\n return this.focusCurrentRow(true);\n case TableFocusType.cell:\n if (\n !this.trySetCellFocus(rowElements, this.columnIndex - 1)\n && !this.trySetRowSelectionCheckboxFocus(rowElements)\n ) {\n this.setRowFocusState();\n this.focusCurrentRow(true);\n }\n return true;\n default:\n break;\n }\n\n return false;\n }\n\n private onRightArrowPressed(): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n let headerElements!: TableHeaderFocusableElements;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n } else if (this.hasHeaderFocusType()) {\n headerElements = this.getTableHeaderFocusableElements();\n }\n\n switch (this.focusType) {\n case TableFocusType.headerActions:\n return (\n this.trySetHeaderActionFocus(\n headerElements,\n this.headerActionIndex + 1\n ) || this.trySetColumnHeaderFocus(headerElements, 0)\n );\n case TableFocusType.columnHeader:\n return this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex + 1\n );\n case TableFocusType.row:\n if (this.isRowExpanded(row) === false) {\n this.toggleRowExpanded(row!);\n return true;\n }\n return (\n this.trySetRowSelectionCheckboxFocus(rowElements)\n || this.trySetCellFocus(rowElements, 0)\n );\n case TableFocusType.rowSelectionCheckbox:\n return this.trySetCellFocus(rowElements, 0);\n case TableFocusType.cell:\n return this.trySetCellFocus(rowElements, this.columnIndex + 1);\n default:\n break;\n }\n\n return false;\n }\n\n private onUpArrowPressed(): boolean {\n this.onMoveUp(1);\n // Always prevent default - prevents page scroll, and FireFox changing focus if focus is at table extents\n return true;\n }\n\n private onPageUpPressed(): boolean {\n return this.onMoveUp(this.virtualizer.pageSize);\n }\n\n private onHomePressed(ctrlKey: boolean): boolean {\n if (this.handleHomeEndWithinRow(ctrlKey)) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return (\n this.trySetRowSelectionCheckboxFocus(rowElements)\n || this.trySetCellFocus(rowElements, 0)\n );\n }\n\n return this.onMoveUp(0, 0);\n }\n\n private onDownArrowPressed(): boolean {\n this.onMoveDown(1);\n // Always prevent default - prevents page scroll, and FireFox changing focus if focus is at table extents\n return true;\n }\n\n private onPageDownPressed(): boolean {\n return this.onMoveDown(this.virtualizer.pageSize);\n }\n\n private onEndPressed(ctrlKey: boolean): boolean {\n if (this.handleHomeEndWithinRow(ctrlKey)) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return this.trySetCellFocus(\n rowElements,\n this.table.visibleColumns.length - 1\n );\n }\n\n return this.onMoveDown(0, this.table.tableData.length - 1);\n }\n\n private handleHomeEndWithinRow(ctrlKey: boolean): boolean {\n return (\n (this.focusType === TableFocusType.cell\n || this.focusType === TableFocusType.rowSelectionCheckbox)\n && !ctrlKey\n );\n }\n\n private onTabPressed(shiftKeyPressed: boolean): boolean {\n const activeElement = this.getActiveElement();\n if (activeElement === null || activeElement === this.table) {\n return false;\n }\n const nextFocusState = this.hasRowOrCellFocusType()\n ? this.getNextRowTabStop(shiftKeyPressed)\n : this.getNextHeaderTabStop(shiftKeyPressed);\n if (nextFocusState) {\n this.focusType = nextFocusState.focusType;\n this.rowIndex = nextFocusState.rowIndex ?? this.rowIndex;\n this.columnIndex = nextFocusState.columnIndex ?? this.columnIndex;\n this.headerActionIndex = nextFocusState.headerActionIndex ?? this.headerActionIndex;\n this.cellContentIndex = nextFocusState.cellContentIndex ?? this.cellContentIndex;\n if (this.hasRowOrCellFocusType()) {\n this.focusCurrentRow(false);\n } else {\n this.focusHeaderElement();\n }\n return true;\n }\n this.blurAfterLastTab(activeElement);\n return false;\n }\n\n private getNextRowTabStop(\n shiftKeyPressed: boolean\n ): TableFocusState | undefined {\n const row = this.getCurrentRow();\n if (row === undefined) {\n return undefined;\n }\n let startIndex = -1;\n const focusStates = [];\n const rowElements = row.getFocusableElements();\n if (rowElements.selectionCheckbox) {\n focusStates.push({\n focusType: TableFocusType.rowSelectionCheckbox\n });\n if (this.focusType === TableFocusType.rowSelectionCheckbox) {\n startIndex = 0;\n }\n }\n let cellIndex = 0;\n while (cellIndex < rowElements.cells.length) {\n const firstCellTabbableIndex = focusStates.length;\n const cellInfo = rowElements.cells[cellIndex]!;\n const cellViewTabbableChildren = cellInfo.cell.cellView.tabbableChildren;\n for (let i = 0; i < cellViewTabbableChildren.length; i++) {\n focusStates.push({\n focusType: TableFocusType.cellContent,\n columnIndex: cellIndex,\n cellContentIndex: i\n });\n if (\n this.focusType === TableFocusType.cellContent\n && this.columnIndex === cellIndex\n && this.cellContentIndex === i\n ) {\n startIndex = focusStates.length - 1;\n }\n }\n if (cellInfo.actionMenuButton) {\n focusStates.push({\n focusType: TableFocusType.cellActionMenu,\n columnIndex: cellIndex\n });\n if (\n this.focusType === TableFocusType.cellActionMenu\n && this.columnIndex === cellIndex\n ) {\n startIndex = focusStates.length - 1;\n }\n }\n const lastCellTabbableIndex = focusStates.length - 1;\n if (\n this.focusType === TableFocusType.cell\n && this.columnIndex === cellIndex\n ) {\n startIndex = shiftKeyPressed\n ? lastCellTabbableIndex + 1\n : firstCellTabbableIndex - 1;\n }\n cellIndex += 1;\n }\n if (this.focusType === TableFocusType.row) {\n startIndex = shiftKeyPressed ? focusStates.length : -1;\n }\n const direction = shiftKeyPressed ? -1 : 1;\n return focusStates[startIndex + direction];\n }\n\n private getNextHeaderTabStop(\n shiftKeyPressed: boolean\n ): TableFocusState | undefined {\n let startIndex = -1;\n const focusStates = [];\n const headerTabbableElements = this.getTableHeaderFocusableElements().headerActions;\n for (let i = 0; i < headerTabbableElements.length; i++) {\n focusStates.push({\n focusType: TableFocusType.headerActions,\n headerActionIndex: i\n });\n }\n if (this.focusType === TableFocusType.headerActions) {\n startIndex = this.headerActionIndex;\n } else {\n // TableFocusType.columnHeader\n startIndex = focusStates.length;\n }\n const direction = shiftKeyPressed ? -1 : 1;\n return focusStates[startIndex + direction];\n }\n\n private blurAfterLastTab(activeElement: HTMLElement): void {\n // In order to get the desired browser-provided Tab/Shift-Tab behavior of focusing the\n // element before/after the table, the table shouldn't have tabIndex=0 when this event\n // handling ends. However it needs to be tabIndex=0 so we can re-focus the table the next time\n // it's tabbed to, so set tabIndex back to 0 after a rAF.\n // Note: In Chrome this is only needed for Shift-Tab, but in Firefox both Tab and Shift-Tab need this\n // to work as expected.\n this.table.tabIndex = -1;\n window.requestAnimationFrame(() => {\n this.table.tabIndex = 0;\n });\n\n // Don't explicitly call blur() on activeElement (causes unexpected behavior on Safari / Mac Firefox)\n this.setElementFocusable(activeElement, false);\n }\n\n private onMoveUp(rowDelta: number, newRowIndex?: number): boolean {\n const coerceRowIndex = rowDelta > 1;\n switch (this.focusType) {\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n case TableFocusType.cell: {\n const scrollOptions: ScrollToOptions = {};\n let rowIndex = this.rowIndex;\n if (newRowIndex !== undefined) {\n rowIndex = newRowIndex;\n }\n rowIndex -= rowDelta;\n if (coerceRowIndex && rowIndex < 0) {\n rowIndex = 0;\n }\n if (rowDelta > 1) {\n scrollOptions.align = 'start';\n }\n\n if (rowIndex < this.rowIndex && rowIndex >= 0) {\n return this.scrollToAndFocusRow(rowIndex, scrollOptions);\n }\n if (rowIndex === -1) {\n const headerElements = this.getTableHeaderFocusableElements();\n if (\n this.focusType === TableFocusType.row\n || this.focusType === TableFocusType.rowSelectionCheckbox\n ) {\n return (\n this.trySetHeaderActionFocus(headerElements, 0)\n || this.trySetColumnHeaderFocus(headerElements, 0)\n );\n }\n return this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex\n );\n }\n return false;\n }\n default:\n break;\n }\n\n return false;\n }\n\n private onMoveDown(rowDelta: number, newRowIndex?: number): boolean {\n const coerceRowIndex = rowDelta > 1;\n switch (this.focusType) {\n case TableFocusType.headerActions: {\n this.setRowFocusState(0);\n return this.scrollToAndFocusRow(0);\n }\n case TableFocusType.columnHeader: {\n this.setCellFocusState(this.columnIndex, 0, false);\n return this.scrollToAndFocusRow(0);\n }\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n case TableFocusType.cell: {\n const scrollOptions: ScrollToOptions = {};\n let rowIndex = this.rowIndex;\n if (newRowIndex !== undefined) {\n rowIndex = newRowIndex;\n }\n rowIndex += rowDelta;\n if (coerceRowIndex && rowIndex >= this.table.tableData.length) {\n rowIndex = this.table.tableData.length - 1;\n }\n if (rowDelta > 1) {\n scrollOptions.align = 'end';\n }\n if (\n rowIndex > this.rowIndex\n && rowIndex < this.table.tableData.length\n ) {\n return this.scrollToAndFocusRow(rowIndex, scrollOptions);\n }\n return false;\n }\n default:\n break;\n }\n\n return false;\n }\n\n private updateFocusStateFromActiveElement(setRowFocus: boolean): void {\n // If the user is interacting with the table with non-keyboard methods (like mouse), we need to\n // update our focus state based on the current active/focused element\n const activeElement = this.getActiveElement();\n if (activeElement) {\n const row = this.getContainingRow(activeElement);\n if (row) {\n if (!(row instanceof TableGroupRow)) {\n const cell = this.getContainingCell(activeElement);\n if (cell) {\n const columnIndex = this.table.visibleColumns.indexOf(\n cell.column!\n );\n if (cell.actionMenuButton === activeElement) {\n this.setCellActionMenuFocusState(\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n return;\n }\n const contentIndex = cell.cellView.tabbableChildren.indexOf(\n activeElement\n );\n if (contentIndex > -1) {\n this.setCellContentFocusState(\n contentIndex,\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n return;\n }\n }\n }\n if (\n setRowFocus\n && this.hasRowOrCellFocusType()\n && this.rowIndex !== row.resolvedRowIndex\n ) {\n this.setRowFocusState(row.resolvedRowIndex);\n }\n }\n }\n }\n\n private focusElement(\n element: HTMLElement,\n focusOptions?: FocusOptions\n ): void {\n const previousActiveElement = this.getActiveElement();\n if (previousActiveElement !== element) {\n this.setElementFocusable(element, true);\n this.isCurrentlyFocusingElement = true;\n element.focus(focusOptions);\n this.isCurrentlyFocusingElement = false;\n if (\n previousActiveElement\n && this.isInTable(previousActiveElement)\n ) {\n this.setElementFocusable(previousActiveElement, false);\n }\n }\n }\n\n private setElementFocusable(\n element: HTMLElement,\n focusable: boolean\n ): void {\n if (element === this.table) {\n return;\n }\n\n element.tabIndex = focusable ? 0 : -1;\n }\n\n private setActionMenuButtonFocused(\n menuButton: MenuButton,\n focused: boolean\n ): void {\n // The action MenuButton needs to be visible in order to be focused, so this CSS class styling\n // handles that (see cell/styles.ts).\n if (focused) {\n menuButton.classList.add('cell-action-menu-focused');\n } else {\n menuButton.classList.remove('cell-action-menu-focused');\n }\n }\n\n private setFocusOnHeader(): boolean {\n if (this.hasHeaderFocusType()) {\n return this.focusHeaderElement();\n }\n this.setDefaultFocus();\n return this.focusType !== TableFocusType.none;\n }\n\n private setDefaultFocus(): void {\n const headerElements = this.getTableHeaderFocusableElements();\n if (\n !this.trySetHeaderActionFocus(headerElements, 0)\n && !this.trySetColumnHeaderFocus(headerElements, 0)\n && !this.scrollToAndFocusRow(0)\n ) {\n this.focusType = TableFocusType.none;\n }\n }\n\n private scrollToAndFocusRow(\n totalRowIndex: number,\n scrollOptions?: ScrollToOptions\n ): boolean {\n if (totalRowIndex >= 0 && totalRowIndex < this.table.tableData.length) {\n switch (this.focusType) {\n case TableFocusType.none:\n case TableFocusType.headerActions:\n case TableFocusType.columnHeader:\n this.setRowFocusState(totalRowIndex);\n break;\n default:\n break;\n }\n this.rowIndex = totalRowIndex;\n this.virtualizer.scrollToIndex(totalRowIndex, scrollOptions);\n this.focusCurrentRow(true);\n return true;\n }\n return false;\n }\n\n private focusCurrentRow(allowScroll: boolean): boolean {\n const visibleRowIndex = this.getCurrentRowVisibleIndex();\n if (visibleRowIndex < 0) {\n return false;\n }\n const focusedRow = this.table.rowElements[visibleRowIndex]!;\n\n let focusRowOnly = false;\n switch (this.focusType) {\n case TableFocusType.row:\n focusRowOnly = true;\n break;\n case TableFocusType.cell:\n case TableFocusType.cellActionMenu:\n case TableFocusType.cellContent:\n focusRowOnly = focusedRow instanceof TableGroupRow;\n break;\n default:\n break;\n }\n const focusOptions = { preventScroll: !allowScroll };\n if (focusRowOnly) {\n this.focusElement(focusedRow, focusOptions);\n return true;\n }\n this.focusRowElement(focusedRow, focusOptions);\n return true;\n }\n\n private focusRowElement(\n row: TableRow | TableGroupRow,\n focusOptions?: FocusOptions\n ): void {\n const rowElements = row.getFocusableElements();\n let focusableElement: HTMLElement | undefined;\n switch (this.focusType) {\n case TableFocusType.rowSelectionCheckbox:\n focusableElement = rowElements.selectionCheckbox;\n break;\n case TableFocusType.cell: {\n focusableElement = rowElements.cells[this.columnIndex]!.cell;\n break;\n }\n case TableFocusType.cellActionMenu: {\n const actionMenuButton = rowElements.cells[this.columnIndex]?.cell.actionMenuButton;\n if (actionMenuButton) {\n focusableElement = actionMenuButton;\n this.setActionMenuButtonFocused(actionMenuButton, true);\n }\n break;\n }\n case TableFocusType.cellContent: {\n focusableElement = rowElements.cells[this.columnIndex]?.cell.cellView\n .tabbableChildren[this.cellContentIndex];\n break;\n }\n default:\n break;\n }\n if (focusableElement) {\n this.focusElement(focusableElement, focusOptions);\n }\n }\n\n private focusHeaderElement(): boolean {\n const headerElements = this.getTableHeaderFocusableElements();\n let focusableElement: HTMLElement | undefined;\n switch (this.focusType) {\n case TableFocusType.headerActions:\n focusableElement = headerElements.headerActions[this.headerActionIndex];\n break;\n case TableFocusType.columnHeader:\n focusableElement = headerElements.columnHeaders[this.columnIndex];\n break;\n default:\n break;\n }\n if (focusableElement) {\n this.focusElement(focusableElement);\n return true;\n }\n return false;\n }\n\n private getCurrentRowVisibleIndex(): number {\n return this.table.rowElements.findIndex(\n row => row.resolvedRowIndex === this.rowIndex\n );\n }\n\n private getTableHeaderFocusableElements(): TableHeaderFocusableElements {\n const headerActions: HTMLElement[] = [];\n if (\n this.table.selectionCheckbox?.getRootNode()\n === this.table.shadowRoot\n ) {\n headerActions.push(this.table.selectionCheckbox);\n }\n\n if (\n this.table.showCollapseAll\n && this.table.collapseAllButton?.getRootNode()\n === this.table.shadowRoot\n ) {\n headerActions.push(this.table.collapseAllButton);\n }\n\n const columnHeaders: HTMLElement[] = [];\n if (this.canFocusColumnHeaders()) {\n this.table.columnHeadersContainer\n .querySelectorAll(tableHeaderTag)\n .forEach(header => columnHeaders.push(header));\n }\n\n return { headerActions, columnHeaders };\n }\n\n private canFocusColumnHeaders(): boolean {\n return (\n this.table.columns.find(c => !c.columnInternals.sortingDisabled)\n !== undefined\n );\n }\n\n private getCurrentRow(): TableRow | TableGroupRow | undefined {\n return this.table.rowElements[this.getCurrentRowVisibleIndex()];\n }\n\n private isRowExpanded(\n row: TableRow | TableGroupRow | undefined\n ): boolean | undefined {\n if (\n (row instanceof TableRow && row.isParentRow)\n || row instanceof TableGroupRow\n ) {\n return row.expanded;\n }\n return undefined;\n }\n\n private toggleRowExpanded(row: TableRow | TableGroupRow): void {\n if (row instanceof TableGroupRow) {\n row.onGroupExpandToggle();\n } else {\n row.onRowExpandToggle();\n }\n this.focusRowElement(row);\n }\n\n private getContainingRow(\n start: Element | undefined | null\n ): TableRow | TableGroupRow | undefined {\n return this.getContainingElement(start, e => this.isResolvedRowType(e));\n }\n\n private getContainingCell(\n start: Element | undefined | null\n ): TableCell | undefined {\n return this.getContainingElement(start, e => e instanceof TableCell);\n }\n\n private getContainingElement<TElement>(\n start: Element | undefined | null,\n isElementMatch: (element: Element) => boolean\n ): TElement | undefined {\n let possibleMatch = start;\n while (possibleMatch && possibleMatch !== this.table) {\n if (isElementMatch(possibleMatch)) {\n return possibleMatch as TElement;\n }\n possibleMatch = possibleMatch.parentElement\n ?? (possibleMatch.parentNode as ShadowRoot)?.host;\n }\n\n return undefined;\n }\n\n private isInTable(start: Element): boolean {\n let possibleMatch = start;\n while (possibleMatch && possibleMatch !== this.table) {\n possibleMatch = possibleMatch.parentElement\n ?? (possibleMatch.parentNode as ShadowRoot)?.host;\n }\n\n return possibleMatch === this.table;\n }\n\n private getActiveElement(): HTMLElement | null {\n let activeElement = document.activeElement;\n while (activeElement?.shadowRoot?.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n // In some cases, the active element may be a sub-part of a control (example: MenuButton -> ToggleButton -> a div with tabindex=0). Stop at the outer control boundary, so that\n // we can more simply check equality against the elements of getTableHeaderFocusableElements() / row.getFocusableElements().\n // (For rows/cells/cell views, we do need to recurse into them, to get to the appropriate focused controls though)\n if (\n activeElement instanceof FoundationElement\n && !this.isResolvedRowType(activeElement)\n && !(activeElement instanceof TableCell)\n && !(activeElement instanceof TableCellView)\n ) {\n break;\n }\n }\n\n return activeElement as HTMLElement;\n }\n\n private focusFirstInteractiveElementInCurrentCell(\n rowElements?: TableRowFocusableElements\n ): boolean {\n if (!rowElements) {\n return false;\n }\n return (\n this.trySetCellContentFocus(rowElements, 0)\n || this.trySetCellActionMenuFocus(rowElements)\n );\n }\n\n private hasRowOrCellFocusType(): boolean {\n switch (this.focusType) {\n case TableFocusType.cell:\n case TableFocusType.cellActionMenu:\n case TableFocusType.cellContent:\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n return true;\n default:\n return false;\n }\n }\n\n private hasHeaderFocusType(): boolean {\n switch (this.focusType) {\n case TableFocusType.headerActions:\n case TableFocusType.columnHeader:\n return true;\n default:\n return false;\n }\n }\n\n private trySetRowSelectionCheckboxFocus(\n rowElements: TableRowFocusableElements | undefined\n ): boolean {\n if (rowElements?.selectionCheckbox) {\n this.focusType = TableFocusType.rowSelectionCheckbox;\n this.focusCurrentRow(true);\n return true;\n }\n return false;\n }\n\n private trySetColumnHeaderFocus(\n headerElements: TableHeaderFocusableElements,\n columnIndex: number\n ): boolean {\n if (\n columnIndex >= 0\n && columnIndex < headerElements.columnHeaders.length\n ) {\n this.focusType = TableFocusType.columnHeader;\n this.columnIndex = columnIndex;\n this.focusHeaderElement();\n return true;\n }\n return false;\n }\n\n private trySetHeaderActionFocus(\n headerElements: TableHeaderFocusableElements,\n headerActionIndex: number\n ): boolean {\n if (\n headerActionIndex >= 0\n && headerActionIndex < headerElements.headerActions.length\n ) {\n this.focusType = TableFocusType.headerActions;\n this.headerActionIndex = headerActionIndex;\n this.focusHeaderElement();\n return true;\n }\n return false;\n }\n\n private trySetCellFocus(\n rowElements: TableRowFocusableElements | undefined,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n if (!rowElements) {\n return false;\n }\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (newColumnIndex >= 0 && newColumnIndex < rowElements.cells.length) {\n this.focusType = TableFocusType.cell;\n this.setRowCellFocusState(newColumnIndex, newRowIndex, true);\n return true;\n }\n\n return false;\n }\n\n private trySetCellContentFocus(\n rowElements: TableRowFocusableElements | undefined,\n cellContentIndex: number,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n if (!rowElements) {\n return false;\n }\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (\n newColumnIndex >= 0\n && newColumnIndex < rowElements.cells.length\n && cellContentIndex >= 0\n && cellContentIndex\n < rowElements.cells[newColumnIndex]!.cell.cellView\n .tabbableChildren.length\n ) {\n this.setCellContentFocusState(\n cellContentIndex,\n newRowIndex,\n newColumnIndex,\n true\n );\n return true;\n }\n\n return false;\n }\n\n private trySetCellActionMenuFocus(\n rowElements: TableRowFocusableElements,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (\n newColumnIndex >= 0\n && newColumnIndex < rowElements.cells.length\n && rowElements.cells[newColumnIndex]!.actionMenuButton\n ) {\n this.setCellActionMenuFocusState(newRowIndex, newColumnIndex, true);\n return true;\n }\n\n return false;\n }\n\n private setCellActionMenuFocusState(\n rowIndex: number,\n columnIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cellActionMenu;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setCellContentFocusState(\n cellContentIndex: number,\n rowIndex: number,\n columnIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cellContent;\n this.cellContentIndex = cellContentIndex;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setRowFocusState(rowIndex?: number): void {\n this.focusType = TableFocusType.row;\n if (rowIndex !== undefined) {\n this.rowIndex = rowIndex;\n }\n }\n\n private setCellFocusState(\n columnIndex: number,\n rowIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cell;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setRowCellFocusState(\n columnIndex: number,\n rowIndex: number,\n focusElement: boolean\n ): void {\n this.rowIndex = rowIndex;\n this.columnIndex = columnIndex;\n if (focusElement) {\n this.focusCurrentRow(true);\n }\n }\n\n private isResolvedRowType(row: unknown): row is TableRow | TableGroupRow {\n return row instanceof TableRow || row instanceof TableGroupRow;\n }\n}\n"]}
1
+ {"version":3,"file":"keyboard-navigation-manager.js","sourceRoot":"","sources":["../../../../src/table/models/keyboard-navigation-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Notifier,\n type Subscriber,\n Observable\n} from '@microsoft/fast-element';\nimport {\n keyArrowDown,\n keyArrowLeft,\n keyArrowRight,\n keyArrowUp,\n keyEnd,\n keyEnter,\n keyEscape,\n keyFunction2,\n keyHome,\n keyPageDown,\n keyPageUp,\n keySpace,\n keyTab\n} from '@microsoft/fast-web-utilities';\nimport { FoundationElement } from '@microsoft/fast-foundation';\nimport type { ScrollToOptions } from '@tanstack/virtual-core';\nimport type { Table } from '..';\nimport { TableFocusType } from '../types';\nimport type {\n TableActionMenuToggleEventDetail,\n TableHeaderFocusableElements,\n TableRowFocusableElements,\n TableRecord\n} from '../types';\nimport type { Virtualizer } from './virtualizer';\nimport { TableGroupRow } from '../components/group-row';\nimport { TableRow } from '../components/row';\nimport { TableCell } from '../components/cell';\nimport type { MenuButton } from '../../menu-button';\nimport { tableHeaderTag } from '../components/header';\nimport { TableCellView } from '../../table-column/base/cell-view';\n\ninterface TableFocusState {\n focusType: TableFocusType;\n headerActionIndex?: number;\n rowIndex?: number;\n columnIndex?: number;\n cellContentIndex?: number;\n}\n\n/**\n * Manages the keyboard navigation and focus within the table.\n * @internal\n */\nexport class KeyboardNavigationManager<TData extends TableRecord>\nimplements Subscriber {\n private focusType: TableFocusType = TableFocusType.none;\n private headerActionIndex = -1;\n private rowIndex = -1;\n private cellContentIndex = -1;\n private columnIndex = -1;\n private focusWithinTable = false;\n private isCurrentlyFocusingElement = false;\n private readonly tableNotifier: Notifier;\n private readonly virtualizerNotifier: Notifier;\n private visibleRowNotifiers: Notifier[] = [];\n private get inNavigationMode(): boolean {\n return (\n this.focusType !== TableFocusType.cellActionMenu\n && this.focusType !== TableFocusType.cellContent\n );\n }\n\n public constructor(\n private readonly table: Table<TData>,\n private readonly virtualizer: Virtualizer<TData>\n ) {\n this.tableNotifier = Observable.getNotifier(this.table);\n this.tableNotifier.subscribe(this, 'rowElements');\n this.virtualizerNotifier = Observable.getNotifier(this.virtualizer);\n this.virtualizerNotifier.subscribe(this, 'visibleItems');\n }\n\n public resetFocusState(): void {\n this.focusType = TableFocusType.none;\n const activeElement = this.getActiveElement();\n if (activeElement && this.isInTable(activeElement)) {\n this.setDefaultFocus();\n }\n }\n\n public get hasActiveRowOrCellFocus(): boolean {\n return this.focusWithinTable && this.hasRowOrCellFocusType();\n }\n\n public connect(): void {\n this.table.addEventListener(\n 'keydown',\n this.onCaptureKeyDown as EventListener,\n { capture: true }\n );\n this.table.addEventListener('keydown', this.onKeyDown as EventListener);\n this.table.addEventListener(\n 'focusin',\n this.onTableFocusIn as EventListener\n );\n this.table.addEventListener(\n 'focusout',\n this.onTableFocusOut as EventListener\n );\n this.table.viewport.addEventListener('keydown', this.onViewportKeyDown);\n this.table.viewport.addEventListener(\n 'cell-action-menu-blur',\n this.onCellActionMenuBlur as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-view-focus-in',\n this.onCellViewFocusIn as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-focus-in',\n this.onCellFocusIn as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-blur',\n this.onCellBlur as EventListener\n );\n }\n\n public disconnect(): void {\n this.table.removeEventListener(\n 'keydown',\n this.onCaptureKeyDown as EventListener,\n { capture: true }\n );\n this.table.removeEventListener(\n 'keydown',\n this.onKeyDown as EventListener\n );\n this.table.removeEventListener(\n 'focusin',\n this.onTableFocusIn as EventListener\n );\n this.table.removeEventListener(\n 'focusout',\n this.onTableFocusOut as EventListener\n );\n this.table.viewport.removeEventListener(\n 'keydown',\n this.onViewportKeyDown\n );\n this.table.viewport.removeEventListener(\n 'cell-action-menu-blur',\n this.onCellActionMenuBlur as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-view-focus-in',\n this.onCellViewFocusIn as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-focus-in',\n this.onCellFocusIn as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-blur',\n this.onCellBlur as EventListener\n );\n }\n\n public handleChange(source: unknown, args: unknown): void {\n let focusRowAndCell = false;\n if (source === this.virtualizer && args === 'visibleItems') {\n focusRowAndCell = true;\n } else if (source === this.table && args === 'rowElements') {\n for (const notifier of this.visibleRowNotifiers) {\n notifier.unsubscribe(this);\n }\n this.visibleRowNotifiers = [];\n for (const visibleRow of this.table.rowElements) {\n const rowNotifier = Observable.getNotifier(visibleRow);\n rowNotifier.subscribe(this, 'resolvedRowIndex');\n this.visibleRowNotifiers.push(rowNotifier);\n if (visibleRow.resolvedRowIndex === this.rowIndex) {\n focusRowAndCell = true;\n }\n }\n } else if (\n args === 'resolvedRowIndex'\n && this.isResolvedRowType(source)\n ) {\n if (source.resolvedRowIndex === this.rowIndex) {\n focusRowAndCell = true;\n }\n }\n\n if (focusRowAndCell) {\n // We want open action menus to be closed, and focused interactive cell content blurred, on scroll. We also don't want to\n // refocus the interactive cell content after the scroll, as the element no longer represents the same table data at that\n // point. So in both those cases, we focus the cell here. This also lets us maintain what row/ cell the user had focused\n // previously.\n if (\n this.focusType === TableFocusType.cellActionMenu\n || this.focusType === TableFocusType.cellContent\n ) {\n this.setCellFocusState(this.columnIndex, this.rowIndex, false);\n }\n if (this.inNavigationMode && this.hasRowOrCellFocusType()) {\n if (this.rowIndex > this.table.tableData.length - 1) {\n // Focused row index no longer valid, coerce to 1st row if possible\n if (this.table.tableData.length > 0) {\n this.rowIndex = 0;\n } else {\n if (this.focusWithinTable) {\n this.setDefaultFocus();\n } else {\n this.focusType = TableFocusType.none;\n }\n return;\n }\n }\n if (this.focusWithinTable) {\n this.focusCurrentRow(false);\n }\n }\n }\n }\n\n public onRowFocusIn(event: FocusEvent): void {\n if (this.isCurrentlyFocusingElement) {\n return;\n }\n const row = event.target;\n if (this.isResolvedRowType(row)) {\n if (this.rowIndex !== row.resolvedRowIndex) {\n // If user focuses a row some other way (e.g. mouse), update our focus state so future keyboard nav\n // will start from that row\n this.setRowFocusState(row.resolvedRowIndex);\n }\n }\n }\n\n public onRowBlur(event: FocusEvent): void {\n const row = event.target;\n if (this.isResolvedRowType(row)) {\n this.setElementFocusable(row, false);\n }\n }\n\n public onRowActionMenuToggle(\n event: CustomEvent<TableActionMenuToggleEventDetail>\n ): void {\n const isOpen = event.detail.newState;\n if (isOpen) {\n const row = event.target as TableRow;\n const columnIndex = this.table.visibleColumns.findIndex(\n column => column.columnId === event.detail.columnId\n );\n this.setCellActionMenuFocusState(\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n }\n }\n\n private readonly onTableFocusIn = (event: FocusEvent): void => {\n this.focusWithinTable = true;\n this.updateFocusStateFromActiveElement(false);\n\n // Sets initial focus on the appropriate table content\n const actionMenuOpen = this.table.openActionMenuRecordId !== undefined;\n if (\n (event.target === this.table\n || this.focusType === TableFocusType.none)\n && !actionMenuOpen\n ) {\n let focusHeader = true;\n if (\n this.hasRowOrCellFocusType()\n && this.scrollToAndFocusRow(this.rowIndex)\n ) {\n focusHeader = false;\n }\n if (focusHeader && !this.setFocusOnHeader()) {\n // nothing to focus\n this.table.blur();\n }\n }\n };\n\n private readonly onTableFocusOut = (): void => {\n this.focusWithinTable = false;\n };\n\n private readonly onCellActionMenuBlur = (\n event: CustomEvent<TableCell>\n ): void => {\n event.stopPropagation();\n const cell = event.detail;\n if (cell.actionMenuButton) {\n // Ensure that action menu buttons get hidden when no longer focused\n this.setActionMenuButtonFocused(cell.actionMenuButton, false);\n }\n };\n\n private readonly onCellViewFocusIn = (\n event: CustomEvent<TableCell>\n ): void => {\n event.stopPropagation();\n this.updateFocusStateFromActiveElement(false);\n };\n\n private readonly onCellFocusIn = (event: CustomEvent<TableCell>): void => {\n event.stopPropagation();\n const cell = event.detail;\n this.updateFocusStateFromActiveElement(true);\n // Currently, clicking a non-interactive cell only updates the focus state to that row, it\n // doesn't focus the cell. If we revisit this, we most likely need to set the cells to tabindex=-1\n // upfront too, so their focusing behavior is consistent whether they've been previously keyboard\n // focused or not.\n if (\n this.focusType === TableFocusType.row\n && this.getActiveElement() === cell\n ) {\n this.focusCurrentRow(false);\n }\n };\n\n private readonly onCellBlur = (event: CustomEvent<TableCell>): void => {\n event.stopPropagation();\n const cell = event.detail;\n this.setElementFocusable(cell, false);\n };\n\n private readonly onCaptureKeyDown = (event: KeyboardEvent): void => {\n let handled = false;\n if (event.key === keyTab) {\n handled = this.onTabPressed(event.shiftKey);\n } else if (this.inNavigationMode) {\n switch (event.key) {\n case keyArrowLeft:\n handled = this.onLeftArrowPressed();\n break;\n case keyArrowRight:\n handled = this.onRightArrowPressed();\n break;\n case keyArrowUp:\n handled = this.onUpArrowPressed();\n break;\n case keyArrowDown:\n handled = this.onDownArrowPressed();\n break;\n case keyPageUp:\n handled = this.onPageUpPressed();\n break;\n case keyPageDown:\n handled = this.onPageDownPressed();\n break;\n case keyHome:\n handled = this.onHomePressed(event.ctrlKey);\n break;\n case keyEnd:\n handled = this.onEndPressed(event.ctrlKey);\n break;\n case keyEnter:\n handled = this.onEnterPressed(event.ctrlKey);\n break;\n case keySpace:\n handled = this.onSpacePressed(event.shiftKey);\n break;\n case keyFunction2:\n handled = this.onF2Pressed();\n break;\n default:\n break;\n }\n }\n if (handled) {\n event.preventDefault();\n }\n };\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n if (!this.inNavigationMode && !event.defaultPrevented) {\n if (event.key === keyEscape || event.key === keyFunction2) {\n const row = this.getCurrentRow();\n if (row) {\n this.trySetCellFocus(row.getFocusableElements());\n }\n }\n }\n };\n\n private readonly onViewportKeyDown = (event: KeyboardEvent): void => {\n let handleEvent = !this.inNavigationMode\n && (event.key === keyArrowUp || event.key === keyArrowDown);\n switch (event.key) {\n case keyPageUp:\n case keyPageDown:\n case keyHome:\n case keyEnd:\n handleEvent = true;\n break;\n default:\n break;\n }\n if (handleEvent) {\n // Swallow key presses that would cause table scrolling, independently of keyboard navigation\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n\n private onEnterPressed(ctrlKey: boolean): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n }\n if (this.focusType === TableFocusType.row) {\n if (row instanceof TableGroupRow) {\n this.toggleRowExpanded(row);\n return true;\n }\n }\n if (this.focusType === TableFocusType.cell) {\n if (ctrlKey) {\n const cell = rowElements?.cells[this.columnIndex];\n if (cell?.actionMenuButton && !cell.actionMenuButton.open) {\n cell.actionMenuButton.toggleButton!.control.click();\n return true;\n }\n }\n return this.focusFirstInteractiveElementInCurrentCell(rowElements);\n }\n return false;\n }\n\n private onF2Pressed(): boolean {\n if (this.focusType === TableFocusType.cell) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return this.focusFirstInteractiveElementInCurrentCell(rowElements);\n }\n return false;\n }\n\n private onSpacePressed(shiftKey: boolean): boolean {\n if (\n this.focusType === TableFocusType.row\n || this.focusType === TableFocusType.cell\n ) {\n if (this.focusType === TableFocusType.row || shiftKey) {\n const row = this.getCurrentRow();\n if (row instanceof TableRow && row.selectable) {\n row.onSelectionChange(row.selected, !row.selected);\n } else if (row instanceof TableGroupRow) {\n this.toggleRowExpanded(row);\n }\n }\n // Default Space behavior scrolls down, which is redundant given the rest of our keyboard nav code, and we'd still try to focus a\n // row that you scrolled away from. So suppress default Space behavior if a row or cell is selected, regardless of if we're\n // toggling selection or not.\n return true;\n }\n return false;\n }\n\n private onLeftArrowPressed(): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n let headerElements!: TableHeaderFocusableElements;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n } else if (this.hasHeaderFocusType()) {\n headerElements = this.getTableHeaderFocusableElements();\n }\n\n switch (this.focusType) {\n case TableFocusType.headerActions:\n return this.trySetHeaderActionFocus(\n headerElements,\n this.headerActionIndex - 1\n );\n case TableFocusType.columnHeader:\n return (\n this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex - 1\n )\n || this.trySetHeaderActionFocus(\n headerElements,\n headerElements.headerActions.length - 1\n )\n );\n case TableFocusType.row:\n if (this.isRowExpanded(row) === true) {\n this.toggleRowExpanded(row!);\n return true;\n }\n return false;\n case TableFocusType.rowSelectionCheckbox:\n this.setRowFocusState();\n return this.focusCurrentRow(true);\n case TableFocusType.cell:\n if (\n !this.trySetCellFocus(rowElements, this.columnIndex - 1)\n && !this.trySetRowSelectionCheckboxFocus(rowElements)\n ) {\n this.setRowFocusState();\n this.focusCurrentRow(true);\n }\n return true;\n default:\n break;\n }\n\n return false;\n }\n\n private onRightArrowPressed(): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n let headerElements!: TableHeaderFocusableElements;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n } else if (this.hasHeaderFocusType()) {\n headerElements = this.getTableHeaderFocusableElements();\n }\n\n switch (this.focusType) {\n case TableFocusType.headerActions:\n return (\n this.trySetHeaderActionFocus(\n headerElements,\n this.headerActionIndex + 1\n ) || this.trySetColumnHeaderFocus(headerElements, 0)\n );\n case TableFocusType.columnHeader:\n return this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex + 1\n );\n case TableFocusType.row:\n if (this.isRowExpanded(row) === false) {\n this.toggleRowExpanded(row!);\n return true;\n }\n return (\n this.trySetRowSelectionCheckboxFocus(rowElements)\n || this.trySetCellFocus(rowElements, 0)\n );\n case TableFocusType.rowSelectionCheckbox:\n return this.trySetCellFocus(rowElements, 0);\n case TableFocusType.cell:\n return this.trySetCellFocus(rowElements, this.columnIndex + 1);\n default:\n break;\n }\n\n return false;\n }\n\n private onUpArrowPressed(): boolean {\n this.onMoveUp(1);\n // Always prevent default - prevents page scroll, and FireFox changing focus if focus is at table extents\n return true;\n }\n\n private onPageUpPressed(): boolean {\n return this.onMoveUp(this.virtualizer.pageSize);\n }\n\n private onHomePressed(ctrlKey: boolean): boolean {\n if (this.handleHomeEndWithinRow(ctrlKey)) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return (\n this.trySetRowSelectionCheckboxFocus(rowElements)\n || this.trySetCellFocus(rowElements, 0)\n );\n }\n\n return this.onMoveUp(0, 0);\n }\n\n private onDownArrowPressed(): boolean {\n this.onMoveDown(1);\n // Always prevent default - prevents page scroll, and FireFox changing focus if focus is at table extents\n return true;\n }\n\n private onPageDownPressed(): boolean {\n return this.onMoveDown(this.virtualizer.pageSize);\n }\n\n private onEndPressed(ctrlKey: boolean): boolean {\n if (this.handleHomeEndWithinRow(ctrlKey)) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return this.trySetCellFocus(\n rowElements,\n this.table.visibleColumns.length - 1\n );\n }\n\n return this.onMoveDown(0, this.table.tableData.length - 1);\n }\n\n private handleHomeEndWithinRow(ctrlKey: boolean): boolean {\n return (\n (this.focusType === TableFocusType.cell\n || this.focusType === TableFocusType.rowSelectionCheckbox)\n && !ctrlKey\n );\n }\n\n private onTabPressed(shiftKeyPressed: boolean): boolean {\n const activeElement = this.getActiveElement();\n if (activeElement === null || activeElement === this.table) {\n return false;\n }\n const nextFocusState = this.hasRowOrCellFocusType()\n ? this.getNextRowTabStop(shiftKeyPressed)\n : this.getNextHeaderTabStop(shiftKeyPressed);\n if (nextFocusState) {\n this.focusType = nextFocusState.focusType;\n this.rowIndex = nextFocusState.rowIndex ?? this.rowIndex;\n this.columnIndex = nextFocusState.columnIndex ?? this.columnIndex;\n this.headerActionIndex = nextFocusState.headerActionIndex ?? this.headerActionIndex;\n this.cellContentIndex = nextFocusState.cellContentIndex ?? this.cellContentIndex;\n if (this.hasRowOrCellFocusType()) {\n this.focusCurrentRow(false);\n } else {\n this.focusHeaderElement();\n }\n return true;\n }\n this.blurAfterLastTab(activeElement);\n return false;\n }\n\n private getNextRowTabStop(\n shiftKeyPressed: boolean\n ): TableFocusState | undefined {\n const row = this.getCurrentRow();\n if (row === undefined) {\n return undefined;\n }\n let startIndex = -1;\n const focusStates = [];\n const rowElements = row.getFocusableElements();\n if (rowElements.selectionCheckbox) {\n focusStates.push({\n focusType: TableFocusType.rowSelectionCheckbox\n });\n if (this.focusType === TableFocusType.rowSelectionCheckbox) {\n startIndex = 0;\n }\n }\n let cellIndex = 0;\n while (cellIndex < rowElements.cells.length) {\n const firstCellTabbableIndex = focusStates.length;\n const cellInfo = rowElements.cells[cellIndex]!;\n const cellViewTabbableChildren = cellInfo.cell.cellView.tabbableChildren;\n for (let i = 0; i < cellViewTabbableChildren.length; i++) {\n focusStates.push({\n focusType: TableFocusType.cellContent,\n columnIndex: cellIndex,\n cellContentIndex: i\n });\n if (\n this.focusType === TableFocusType.cellContent\n && this.columnIndex === cellIndex\n && this.cellContentIndex === i\n ) {\n startIndex = focusStates.length - 1;\n }\n }\n if (cellInfo.actionMenuButton) {\n focusStates.push({\n focusType: TableFocusType.cellActionMenu,\n columnIndex: cellIndex\n });\n if (\n this.focusType === TableFocusType.cellActionMenu\n && this.columnIndex === cellIndex\n ) {\n startIndex = focusStates.length - 1;\n }\n }\n const lastCellTabbableIndex = focusStates.length - 1;\n if (\n this.focusType === TableFocusType.cell\n && this.columnIndex === cellIndex\n ) {\n startIndex = shiftKeyPressed\n ? lastCellTabbableIndex + 1\n : firstCellTabbableIndex - 1;\n }\n cellIndex += 1;\n }\n if (this.focusType === TableFocusType.row) {\n startIndex = shiftKeyPressed ? focusStates.length : -1;\n }\n const direction = shiftKeyPressed ? -1 : 1;\n return focusStates[startIndex + direction];\n }\n\n private getNextHeaderTabStop(\n shiftKeyPressed: boolean\n ): TableFocusState | undefined {\n let startIndex = -1;\n const focusStates = [];\n const headerTabbableElements = this.getTableHeaderFocusableElements().headerActions;\n for (let i = 0; i < headerTabbableElements.length; i++) {\n focusStates.push({\n focusType: TableFocusType.headerActions,\n headerActionIndex: i\n });\n }\n if (this.focusType === TableFocusType.headerActions) {\n startIndex = this.headerActionIndex;\n } else {\n // TableFocusType.columnHeader\n startIndex = focusStates.length;\n }\n const direction = shiftKeyPressed ? -1 : 1;\n return focusStates[startIndex + direction];\n }\n\n private blurAfterLastTab(activeElement: HTMLElement): void {\n // In order to get the desired browser-provided Tab/Shift-Tab behavior of focusing the\n // element before/after the table, the table shouldn't have tabIndex=0 when this event\n // handling ends. However it needs to be tabIndex=0 so we can re-focus the table the next time\n // it's tabbed to, so set tabIndex back to 0 after a rAF.\n // Note: In Chrome this is only needed for Shift-Tab, but in Firefox both Tab and Shift-Tab need this\n // to work as expected.\n this.table.tabIndex = -1;\n window.requestAnimationFrame(() => {\n this.table.tabIndex = 0;\n });\n\n // Don't explicitly call blur() on activeElement (causes unexpected behavior on Safari / Mac Firefox)\n this.setElementFocusable(activeElement, false);\n }\n\n private onMoveUp(rowDelta: number, newRowIndex?: number): boolean {\n const coerceRowIndex = rowDelta > 1;\n switch (this.focusType) {\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n case TableFocusType.cell: {\n const scrollOptions: ScrollToOptions = {};\n let rowIndex = this.rowIndex;\n if (newRowIndex !== undefined) {\n rowIndex = newRowIndex;\n }\n rowIndex -= rowDelta;\n if (coerceRowIndex && rowIndex < 0) {\n rowIndex = 0;\n }\n if (rowDelta > 1) {\n scrollOptions.align = 'start';\n }\n\n if (rowIndex < this.rowIndex && rowIndex >= 0) {\n return this.scrollToAndFocusRow(rowIndex, scrollOptions);\n }\n if (rowIndex === -1) {\n const headerElements = this.getTableHeaderFocusableElements();\n if (\n this.focusType === TableFocusType.row\n || this.focusType === TableFocusType.rowSelectionCheckbox\n ) {\n return (\n this.trySetHeaderActionFocus(headerElements, 0)\n || this.trySetColumnHeaderFocus(headerElements, 0)\n );\n }\n return this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex\n );\n }\n return false;\n }\n default:\n break;\n }\n\n return false;\n }\n\n private onMoveDown(rowDelta: number, newRowIndex?: number): boolean {\n const coerceRowIndex = rowDelta > 1;\n switch (this.focusType) {\n case TableFocusType.headerActions: {\n this.setRowFocusState(0);\n return this.scrollToAndFocusRow(0);\n }\n case TableFocusType.columnHeader: {\n this.setCellFocusState(this.columnIndex, 0, false);\n return this.scrollToAndFocusRow(0);\n }\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n case TableFocusType.cell: {\n const scrollOptions: ScrollToOptions = {};\n let rowIndex = this.rowIndex;\n if (newRowIndex !== undefined) {\n rowIndex = newRowIndex;\n }\n rowIndex += rowDelta;\n if (coerceRowIndex && rowIndex >= this.table.tableData.length) {\n rowIndex = this.table.tableData.length - 1;\n }\n if (rowDelta > 1) {\n scrollOptions.align = 'end';\n }\n if (\n rowIndex > this.rowIndex\n && rowIndex < this.table.tableData.length\n ) {\n return this.scrollToAndFocusRow(rowIndex, scrollOptions);\n }\n return false;\n }\n default:\n break;\n }\n\n return false;\n }\n\n private updateFocusStateFromActiveElement(setRowFocus: boolean): void {\n // If the user is interacting with the table with non-keyboard methods (like mouse), we need to\n // update our focus state based on the current active/focused element\n const activeElement = this.getActiveElement();\n if (activeElement) {\n const row = this.getContainingRow(activeElement);\n if (row) {\n if (!(row instanceof TableGroupRow)) {\n const cell = this.getContainingCell(activeElement);\n if (cell) {\n const columnIndex = this.table.visibleColumns.indexOf(\n cell.column!\n );\n if (cell.actionMenuButton === activeElement) {\n this.setCellActionMenuFocusState(\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n return;\n }\n const contentIndex = cell.cellView.tabbableChildren.indexOf(\n activeElement\n );\n if (contentIndex > -1) {\n this.setCellContentFocusState(\n contentIndex,\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n return;\n }\n }\n }\n if (\n setRowFocus\n && this.hasRowOrCellFocusType()\n && this.rowIndex !== row.resolvedRowIndex\n ) {\n this.setRowFocusState(row.resolvedRowIndex);\n }\n }\n }\n }\n\n private focusElement(\n element: HTMLElement,\n focusOptions?: FocusOptions\n ): void {\n const previousActiveElement = this.getActiveElement();\n if (previousActiveElement !== element) {\n this.setElementFocusable(element, true);\n this.isCurrentlyFocusingElement = true;\n element.focus(focusOptions);\n this.isCurrentlyFocusingElement = false;\n if (\n previousActiveElement\n && this.isInTable(previousActiveElement)\n ) {\n this.setElementFocusable(previousActiveElement, false);\n }\n }\n }\n\n private setElementFocusable(\n element: HTMLElement,\n focusable: boolean\n ): void {\n if (element === this.table) {\n return;\n }\n\n element.tabIndex = focusable ? 0 : -1;\n }\n\n private setActionMenuButtonFocused(\n menuButton: MenuButton,\n focused: boolean\n ): void {\n // The action MenuButton needs to be visible in order to be focused, so this CSS class styling\n // handles that (see cell/styles.ts).\n if (focused) {\n menuButton.classList.add('cell-action-menu-focused');\n } else {\n menuButton.classList.remove('cell-action-menu-focused');\n }\n }\n\n private setFocusOnHeader(): boolean {\n if (this.hasHeaderFocusType()) {\n return this.focusHeaderElement();\n }\n this.setDefaultFocus();\n return this.focusType !== TableFocusType.none;\n }\n\n private setDefaultFocus(): void {\n const headerElements = this.getTableHeaderFocusableElements();\n if (\n !this.trySetHeaderActionFocus(headerElements, 0)\n && !this.trySetColumnHeaderFocus(headerElements, 0)\n && !this.scrollToAndFocusRow(0)\n ) {\n this.focusType = TableFocusType.none;\n }\n }\n\n private scrollToAndFocusRow(\n totalRowIndex: number,\n scrollOptions?: ScrollToOptions\n ): boolean {\n if (totalRowIndex >= 0 && totalRowIndex < this.table.tableData.length) {\n switch (this.focusType) {\n case TableFocusType.none:\n case TableFocusType.headerActions:\n case TableFocusType.columnHeader:\n this.setRowFocusState(totalRowIndex);\n break;\n default:\n break;\n }\n this.rowIndex = totalRowIndex;\n this.virtualizer.scrollToIndex(totalRowIndex, scrollOptions);\n this.focusCurrentRow(true);\n return true;\n }\n return false;\n }\n\n private focusCurrentRow(allowScroll: boolean): boolean {\n const visibleRowIndex = this.getCurrentRowVisibleIndex();\n if (visibleRowIndex < 0) {\n return false;\n }\n const focusedRow = this.table.rowElements[visibleRowIndex]!;\n\n let focusRowOnly = false;\n switch (this.focusType) {\n case TableFocusType.row:\n focusRowOnly = true;\n break;\n case TableFocusType.cell:\n case TableFocusType.cellActionMenu:\n case TableFocusType.cellContent:\n focusRowOnly = focusedRow instanceof TableGroupRow;\n break;\n default:\n break;\n }\n const focusOptions = { preventScroll: !allowScroll };\n if (focusRowOnly) {\n this.focusElement(focusedRow, focusOptions);\n return true;\n }\n this.focusRowElement(focusedRow, focusOptions);\n return true;\n }\n\n private focusRowElement(\n row: TableRow | TableGroupRow,\n focusOptions?: FocusOptions\n ): void {\n const rowElements = row.getFocusableElements();\n let focusableElement: HTMLElement | undefined;\n switch (this.focusType) {\n case TableFocusType.rowSelectionCheckbox:\n focusableElement = rowElements.selectionCheckbox;\n break;\n case TableFocusType.cell: {\n focusableElement = rowElements.cells[this.columnIndex]!.cell;\n break;\n }\n case TableFocusType.cellActionMenu: {\n const actionMenuButton = rowElements.cells[this.columnIndex]?.cell.actionMenuButton;\n if (actionMenuButton) {\n focusableElement = actionMenuButton;\n this.setActionMenuButtonFocused(actionMenuButton, true);\n }\n break;\n }\n case TableFocusType.cellContent: {\n focusableElement = rowElements.cells[this.columnIndex]?.cell.cellView\n .tabbableChildren[this.cellContentIndex];\n break;\n }\n default:\n break;\n }\n if (focusableElement) {\n this.focusElement(focusableElement, focusOptions);\n }\n }\n\n private focusHeaderElement(): boolean {\n const headerElements = this.getTableHeaderFocusableElements();\n let focusableElement: HTMLElement | undefined;\n switch (this.focusType) {\n case TableFocusType.headerActions:\n focusableElement = headerElements.headerActions[this.headerActionIndex];\n break;\n case TableFocusType.columnHeader:\n focusableElement = headerElements.columnHeaders[this.columnIndex];\n break;\n default:\n break;\n }\n if (focusableElement) {\n this.focusElement(focusableElement);\n return true;\n }\n return false;\n }\n\n private getCurrentRowVisibleIndex(): number {\n return this.table.rowElements.findIndex(\n row => row.resolvedRowIndex === this.rowIndex\n );\n }\n\n private getTableHeaderFocusableElements(): TableHeaderFocusableElements {\n const headerActions: HTMLElement[] = [];\n if (\n this.table.selectionCheckbox?.getRootNode()\n === this.table.shadowRoot\n ) {\n headerActions.push(this.table.selectionCheckbox);\n }\n\n if (\n this.table.showCollapseAll\n && this.table.collapseAllButton?.getRootNode()\n === this.table.shadowRoot\n ) {\n headerActions.push(this.table.collapseAllButton);\n }\n\n const columnHeaders: HTMLElement[] = [];\n if (this.canFocusColumnHeaders()) {\n this.table.columnHeadersContainer\n .querySelectorAll(tableHeaderTag)\n .forEach(header => columnHeaders.push(header));\n }\n\n return { headerActions, columnHeaders };\n }\n\n private canFocusColumnHeaders(): boolean {\n return (\n this.table.columns.find(c => !c.columnInternals.sortingDisabled)\n !== undefined\n );\n }\n\n private getCurrentRow(): TableRow | TableGroupRow | undefined {\n return this.table.rowElements[this.getCurrentRowVisibleIndex()];\n }\n\n private isRowExpanded(\n row: TableRow | TableGroupRow | undefined\n ): boolean | undefined {\n if (\n (row instanceof TableRow && row.isParentRow)\n || row instanceof TableGroupRow\n ) {\n return row.expanded;\n }\n return undefined;\n }\n\n private toggleRowExpanded(row: TableRow | TableGroupRow): void {\n if (row instanceof TableGroupRow) {\n row.onGroupExpandToggle();\n } else {\n row.onRowExpandToggle();\n }\n this.focusRowElement(row);\n }\n\n private getContainingRow(\n start: Element | undefined | null\n ): TableRow | TableGroupRow | undefined {\n return this.getContainingElement(start, e => this.isResolvedRowType(e));\n }\n\n private getContainingCell(\n start: Element | undefined | null\n ): TableCell | undefined {\n return this.getContainingElement(start, e => e instanceof TableCell);\n }\n\n private getContainingElement<TElement>(\n start: Element | undefined | null,\n isElementMatch: (element: Element) => boolean\n ): TElement | undefined {\n let possibleMatch = start;\n while (possibleMatch && possibleMatch !== this.table) {\n if (isElementMatch(possibleMatch)) {\n return possibleMatch as TElement;\n }\n possibleMatch = possibleMatch.parentElement\n ?? (possibleMatch.parentNode as ShadowRoot)?.host;\n }\n\n return undefined;\n }\n\n private isInTable(start: Element): boolean {\n let possibleMatch = start;\n while (possibleMatch && possibleMatch !== this.table) {\n possibleMatch = possibleMatch.parentElement\n ?? (possibleMatch.parentNode as ShadowRoot)?.host;\n }\n\n return possibleMatch === this.table;\n }\n\n private getActiveElement(): HTMLElement | null {\n let activeElement = document.activeElement;\n while (activeElement?.shadowRoot?.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n // In some cases, the active element may be a sub-part of a control (example: MenuButton -> ToggleButton -> a div with tabindex=0). Stop at the outer control boundary, so that\n // we can more simply check equality against the elements of getTableHeaderFocusableElements() / row.getFocusableElements().\n // (For rows/cells/cell views, we do need to recurse into them, to get to the appropriate focused controls though)\n if (\n activeElement instanceof FoundationElement\n && !this.isResolvedRowType(activeElement)\n && !(activeElement instanceof TableCell)\n && !(activeElement instanceof TableCellView)\n ) {\n break;\n }\n }\n\n return activeElement as HTMLElement;\n }\n\n private focusFirstInteractiveElementInCurrentCell(\n rowElements?: TableRowFocusableElements\n ): boolean {\n if (!rowElements) {\n return false;\n }\n return (\n this.trySetCellContentFocus(rowElements, 0)\n || this.trySetCellActionMenuFocus(rowElements)\n );\n }\n\n private hasRowOrCellFocusType(): boolean {\n switch (this.focusType) {\n case TableFocusType.cell:\n case TableFocusType.cellActionMenu:\n case TableFocusType.cellContent:\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n return true;\n default:\n return false;\n }\n }\n\n private hasHeaderFocusType(): boolean {\n switch (this.focusType) {\n case TableFocusType.headerActions:\n case TableFocusType.columnHeader:\n return true;\n default:\n return false;\n }\n }\n\n private trySetRowSelectionCheckboxFocus(\n rowElements: TableRowFocusableElements | undefined\n ): boolean {\n if (rowElements?.selectionCheckbox) {\n this.focusType = TableFocusType.rowSelectionCheckbox;\n this.focusCurrentRow(true);\n return true;\n }\n return false;\n }\n\n private trySetColumnHeaderFocus(\n headerElements: TableHeaderFocusableElements,\n columnIndex: number\n ): boolean {\n if (\n columnIndex >= 0\n && columnIndex < headerElements.columnHeaders.length\n ) {\n this.focusType = TableFocusType.columnHeader;\n this.columnIndex = columnIndex;\n this.focusHeaderElement();\n return true;\n }\n return false;\n }\n\n private trySetHeaderActionFocus(\n headerElements: TableHeaderFocusableElements,\n headerActionIndex: number\n ): boolean {\n if (\n headerActionIndex >= 0\n && headerActionIndex < headerElements.headerActions.length\n ) {\n this.focusType = TableFocusType.headerActions;\n this.headerActionIndex = headerActionIndex;\n this.focusHeaderElement();\n return true;\n }\n return false;\n }\n\n private trySetCellFocus(\n rowElements: TableRowFocusableElements | undefined,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n if (!rowElements) {\n return false;\n }\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (newColumnIndex >= 0 && newColumnIndex < rowElements.cells.length) {\n this.focusType = TableFocusType.cell;\n this.setRowCellFocusState(newColumnIndex, newRowIndex, true);\n return true;\n }\n\n return false;\n }\n\n private trySetCellContentFocus(\n rowElements: TableRowFocusableElements | undefined,\n cellContentIndex: number,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n if (!rowElements) {\n return false;\n }\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (\n newColumnIndex >= 0\n && newColumnIndex < rowElements.cells.length\n && cellContentIndex >= 0\n && cellContentIndex\n < rowElements.cells[newColumnIndex]!.cell.cellView\n .tabbableChildren.length\n ) {\n this.setCellContentFocusState(\n cellContentIndex,\n newRowIndex,\n newColumnIndex,\n true\n );\n return true;\n }\n\n return false;\n }\n\n private trySetCellActionMenuFocus(\n rowElements: TableRowFocusableElements,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (\n newColumnIndex >= 0\n && newColumnIndex < rowElements.cells.length\n && rowElements.cells[newColumnIndex]!.actionMenuButton\n ) {\n this.setCellActionMenuFocusState(newRowIndex, newColumnIndex, true);\n return true;\n }\n\n return false;\n }\n\n private setCellActionMenuFocusState(\n rowIndex: number,\n columnIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cellActionMenu;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setCellContentFocusState(\n cellContentIndex: number,\n rowIndex: number,\n columnIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cellContent;\n this.cellContentIndex = cellContentIndex;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setRowFocusState(rowIndex?: number): void {\n this.focusType = TableFocusType.row;\n if (rowIndex !== undefined) {\n this.rowIndex = rowIndex;\n }\n }\n\n private setCellFocusState(\n columnIndex: number,\n rowIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cell;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setRowCellFocusState(\n columnIndex: number,\n rowIndex: number,\n focusElement: boolean\n ): void {\n this.rowIndex = rowIndex;\n this.columnIndex = columnIndex;\n if (focusElement) {\n this.focusCurrentRow(true);\n }\n }\n\n private isResolvedRowType(row: unknown): row is TableRow | TableGroupRow {\n return row instanceof TableRow || row instanceof TableGroupRow;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { TableRecord, TableRowState } from '../../types';
1
+ import { type TableRecord, type TableRowState } from '../../types';
2
2
  import { SelectionManagerBase } from './selection-manager-base';
3
3
  /**
4
4
  * Selection manager for interactive selection when the selection mode of the table is
@@ -1 +1 @@
1
- {"version":3,"file":"multi-selection-manager.js","sourceRoot":"","sources":["../../../../../src/table/models/selection-managers/multi-selection-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Row as TanStackRow,\n RowSelectionState as TanStackRowSelectionState\n} from '@tanstack/table-core';\nimport {\n TableNode,\n TableRecord,\n TableRowSelectionState,\n TableRowState\n} from '../../types';\nimport { SelectionManagerBase } from './selection-manager-base';\n\n/**\n * Selection manager for interactive selection when the selection mode of the table is\n * `TableRowSelectionMode.multiple`.\n */\nexport class MultiSelectionManager<\n TData extends TableRecord\n> extends SelectionManagerBase<TData> {\n private shiftSelectStartRowId?: string;\n private previousShiftSelectRowEndId?: string;\n\n public override handleRowSelectionToggle(\n rowState: TableRowState,\n isSelecting: boolean,\n shiftKey: boolean\n ): boolean {\n if (shiftKey) {\n if (this.tryUpdateRangeSelection(rowState.id, true)) {\n // Made a range selection\n return true;\n }\n }\n\n this.shiftSelectStartRowId = isSelecting ? rowState.id : undefined;\n this.previousShiftSelectRowEndId = undefined;\n this.toggleIsRowSelected(rowState, isSelecting);\n return true;\n }\n\n public override handleRowClick(\n rowState: TableRowState,\n shiftKey: boolean,\n ctrlKey: boolean\n ): boolean {\n if (shiftKey) {\n const additiveSelection = ctrlKey;\n if (this.tryUpdateRangeSelection(rowState.id, additiveSelection)) {\n // Made a range selection\n return true;\n }\n }\n\n if (ctrlKey) {\n const isSelecting = rowState.selectionState !== TableRowSelectionState.selected;\n this.shiftSelectStartRowId = isSelecting ? rowState.id : undefined;\n this.previousShiftSelectRowEndId = undefined;\n this.toggleIsRowSelected(rowState);\n return true;\n }\n\n this.shiftSelectStartRowId = rowState.id;\n this.previousShiftSelectRowEndId = undefined;\n return this.selectSingleRow(rowState);\n }\n\n public override handleActionMenuOpening(rowState: TableRowState): boolean {\n if (rowState.selectionState === TableRowSelectionState.selected) {\n return false;\n }\n return this.selectSingleRow(rowState);\n }\n\n public override reset(): void {\n this.shiftSelectStartRowId = undefined;\n this.previousShiftSelectRowEndId = undefined;\n }\n\n private tryUpdateRangeSelection(\n rowId: string,\n additiveSelection: boolean\n ): boolean {\n if (this.shiftSelectStartRowId === undefined) {\n return false;\n }\n\n const allRows = this.getAllOrderedRows();\n const selectionStartIndex = this.getRowIndexForId(\n this.shiftSelectStartRowId,\n allRows\n );\n if (selectionStartIndex === -1) {\n return false;\n }\n\n let selectionState: TanStackRowSelectionState = {};\n if (additiveSelection) {\n // If the range selection is additive to the existing selection, start with the initial selection state\n // and remove the previous range selection, if any. Otherwise, the range selection will start empty and\n // only contain the new range selection.\n selectionState = this.tanStackTable.getState().rowSelection;\n this.removePreviousRangeSelection(\n selectionState,\n selectionStartIndex,\n allRows\n );\n }\n\n this.addNewRangeSelection(\n selectionState,\n rowId,\n selectionStartIndex,\n allRows\n );\n this.previousShiftSelectRowEndId = rowId;\n this.tanStackTable.setRowSelection(selectionState);\n\n return true;\n }\n\n private removePreviousRangeSelection(\n selection: TanStackRowSelectionState,\n shiftSelectStartRowIndex: number,\n allRows: TanStackRow<TableNode<TData>>[]\n ): void {\n const previousRangeEndIndex = this.getRowIndexForId(\n this.previousShiftSelectRowEndId,\n allRows\n );\n this.updateSelectionStateForRange(\n selection,\n shiftSelectStartRowIndex,\n previousRangeEndIndex,\n allRows,\n false\n );\n }\n\n private addNewRangeSelection(\n selection: TanStackRowSelectionState,\n endRangeRowId: string,\n shiftSelectStartRowIndex: number,\n allRows: TanStackRow<TableNode<TData>>[]\n ): void {\n const newRangeEndIndex = this.getRowIndexForId(endRangeRowId, allRows);\n this.updateSelectionStateForRange(\n selection,\n shiftSelectStartRowIndex,\n newRangeEndIndex,\n allRows,\n true\n );\n }\n\n private updateSelectionStateForRange(\n selection: TanStackRowSelectionState,\n rangeStartIndex: number,\n rangeEndIndex: number,\n allRows: TanStackRow<TableNode<TData>>[],\n isSelecting: boolean\n ): void {\n if (rangeStartIndex === -1 || rangeEndIndex === -1) {\n return;\n }\n\n const firstRowIndex = Math.min(rangeStartIndex, rangeEndIndex);\n const lastRowIndex = Math.max(rangeStartIndex, rangeEndIndex);\n for (let i = firstRowIndex; i <= lastRowIndex; i++) {\n const row = allRows[i]!;\n if (row.getIsGrouped()) {\n continue;\n }\n this.updateSelectionStateForRow(selection, row.id, isSelecting);\n }\n\n const endRangeRow = allRows[rangeEndIndex]!;\n if (endRangeRow.getIsGrouped()) {\n this.getAllLeafRowIds(endRangeRow.id).forEach(id => this.updateSelectionStateForRow(selection, id, isSelecting));\n }\n }\n\n private updateSelectionStateForRow(\n selection: TanStackRowSelectionState,\n rowId: string,\n isSelecting: boolean\n ): void {\n if (isSelecting) {\n selection[rowId] = true;\n } else {\n delete selection[rowId];\n }\n }\n\n private getRowIndexForId(\n id: string | undefined,\n rows: TanStackRow<TableNode<TData>>[]\n ): number {\n if (!id) {\n return -1;\n }\n return rows.findIndex(x => x.id === id);\n }\n}\n"]}
1
+ {"version":3,"file":"multi-selection-manager.js","sourceRoot":"","sources":["../../../../../src/table/models/selection-managers/multi-selection-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAGH,sBAAsB,EAEzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;GAGG;AACH,MAAM,OAAO,qBAEX,SAAQ,oBAA2B;IAIjB,wBAAwB,CACpC,QAAuB,EACvB,WAAoB,EACpB,QAAiB;QAEjB,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;gBAClD,yBAAyB;gBACzB,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAC;QAC7C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,cAAc,CAC1B,QAAuB,EACvB,QAAiB,EACjB,OAAgB;QAEhB,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,iBAAiB,GAAG,OAAO,CAAC;YAClC,IAAI,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE,CAAC;gBAC/D,yBAAyB;gBACzB,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,KAAK,sBAAsB,CAAC,QAAQ,CAAC;YAChF,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAC;YAC7C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAC;QAC7C,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAEe,uBAAuB,CAAC,QAAuB;QAC3D,IAAI,QAAQ,CAAC,cAAc,KAAK,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YAC9D,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAEe,KAAK;QACjB,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACvC,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAC;IACjD,CAAC;IAEO,uBAAuB,CAC3B,KAAa,EACb,iBAA0B;QAE1B,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;YAC3C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzC,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAC7C,IAAI,CAAC,qBAAqB,EAC1B,OAAO,CACV,CAAC;QACF,IAAI,mBAAmB,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,cAAc,GAA8B,EAAE,CAAC;QACnD,IAAI,iBAAiB,EAAE,CAAC;YACpB,uGAAuG;YACvG,uGAAuG;YACvG,wCAAwC;YACxC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC;YAC5D,IAAI,CAAC,4BAA4B,CAC7B,cAAc,EACd,mBAAmB,EACnB,OAAO,CACV,CAAC;QACN,CAAC;QAED,IAAI,CAAC,oBAAoB,CACrB,cAAc,EACd,KAAK,EACL,mBAAmB,EACnB,OAAO,CACV,CAAC;QACF,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC;QACzC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAEnD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,4BAA4B,CAChC,SAAoC,EACpC,wBAAgC,EAChC,OAAwC;QAExC,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAC/C,IAAI,CAAC,2BAA2B,EAChC,OAAO,CACV,CAAC;QACF,IAAI,CAAC,4BAA4B,CAC7B,SAAS,EACT,wBAAwB,EACxB,qBAAqB,EACrB,OAAO,EACP,KAAK,CACR,CAAC;IACN,CAAC;IAEO,oBAAoB,CACxB,SAAoC,EACpC,aAAqB,EACrB,wBAAgC,EAChC,OAAwC;QAExC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,4BAA4B,CAC7B,SAAS,EACT,wBAAwB,EACxB,gBAAgB,EAChB,OAAO,EACP,IAAI,CACP,CAAC;IACN,CAAC;IAEO,4BAA4B,CAChC,SAAoC,EACpC,eAAuB,EACvB,aAAqB,EACrB,OAAwC,EACxC,WAAoB;QAEpB,IAAI,eAAe,KAAK,CAAC,CAAC,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO;QACX,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAC9D,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YACxB,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;gBACrB,SAAS;YACb,CAAC;YACD,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAE,CAAC;QAC5C,IAAI,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACrH,CAAC;IACL,CAAC;IAEO,0BAA0B,CAC9B,SAAoC,EACpC,KAAa,EACb,WAAoB;QAEpB,IAAI,WAAW,EAAE,CAAC;YACd,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAC5B,CAAC;aAAM,CAAC;YACJ,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAEO,gBAAgB,CACpB,EAAsB,EACtB,IAAqC;QAErC,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,OAAO,CAAC,CAAC,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;CACJ","sourcesContent":["import type {\n Row as TanStackRow,\n RowSelectionState as TanStackRowSelectionState\n} from '@tanstack/table-core';\nimport {\n type TableNode,\n type TableRecord,\n TableRowSelectionState,\n type TableRowState\n} from '../../types';\nimport { SelectionManagerBase } from './selection-manager-base';\n\n/**\n * Selection manager for interactive selection when the selection mode of the table is\n * `TableRowSelectionMode.multiple`.\n */\nexport class MultiSelectionManager<\n TData extends TableRecord\n> extends SelectionManagerBase<TData> {\n private shiftSelectStartRowId?: string;\n private previousShiftSelectRowEndId?: string;\n\n public override handleRowSelectionToggle(\n rowState: TableRowState,\n isSelecting: boolean,\n shiftKey: boolean\n ): boolean {\n if (shiftKey) {\n if (this.tryUpdateRangeSelection(rowState.id, true)) {\n // Made a range selection\n return true;\n }\n }\n\n this.shiftSelectStartRowId = isSelecting ? rowState.id : undefined;\n this.previousShiftSelectRowEndId = undefined;\n this.toggleIsRowSelected(rowState, isSelecting);\n return true;\n }\n\n public override handleRowClick(\n rowState: TableRowState,\n shiftKey: boolean,\n ctrlKey: boolean\n ): boolean {\n if (shiftKey) {\n const additiveSelection = ctrlKey;\n if (this.tryUpdateRangeSelection(rowState.id, additiveSelection)) {\n // Made a range selection\n return true;\n }\n }\n\n if (ctrlKey) {\n const isSelecting = rowState.selectionState !== TableRowSelectionState.selected;\n this.shiftSelectStartRowId = isSelecting ? rowState.id : undefined;\n this.previousShiftSelectRowEndId = undefined;\n this.toggleIsRowSelected(rowState);\n return true;\n }\n\n this.shiftSelectStartRowId = rowState.id;\n this.previousShiftSelectRowEndId = undefined;\n return this.selectSingleRow(rowState);\n }\n\n public override handleActionMenuOpening(rowState: TableRowState): boolean {\n if (rowState.selectionState === TableRowSelectionState.selected) {\n return false;\n }\n return this.selectSingleRow(rowState);\n }\n\n public override reset(): void {\n this.shiftSelectStartRowId = undefined;\n this.previousShiftSelectRowEndId = undefined;\n }\n\n private tryUpdateRangeSelection(\n rowId: string,\n additiveSelection: boolean\n ): boolean {\n if (this.shiftSelectStartRowId === undefined) {\n return false;\n }\n\n const allRows = this.getAllOrderedRows();\n const selectionStartIndex = this.getRowIndexForId(\n this.shiftSelectStartRowId,\n allRows\n );\n if (selectionStartIndex === -1) {\n return false;\n }\n\n let selectionState: TanStackRowSelectionState = {};\n if (additiveSelection) {\n // If the range selection is additive to the existing selection, start with the initial selection state\n // and remove the previous range selection, if any. Otherwise, the range selection will start empty and\n // only contain the new range selection.\n selectionState = this.tanStackTable.getState().rowSelection;\n this.removePreviousRangeSelection(\n selectionState,\n selectionStartIndex,\n allRows\n );\n }\n\n this.addNewRangeSelection(\n selectionState,\n rowId,\n selectionStartIndex,\n allRows\n );\n this.previousShiftSelectRowEndId = rowId;\n this.tanStackTable.setRowSelection(selectionState);\n\n return true;\n }\n\n private removePreviousRangeSelection(\n selection: TanStackRowSelectionState,\n shiftSelectStartRowIndex: number,\n allRows: TanStackRow<TableNode<TData>>[]\n ): void {\n const previousRangeEndIndex = this.getRowIndexForId(\n this.previousShiftSelectRowEndId,\n allRows\n );\n this.updateSelectionStateForRange(\n selection,\n shiftSelectStartRowIndex,\n previousRangeEndIndex,\n allRows,\n false\n );\n }\n\n private addNewRangeSelection(\n selection: TanStackRowSelectionState,\n endRangeRowId: string,\n shiftSelectStartRowIndex: number,\n allRows: TanStackRow<TableNode<TData>>[]\n ): void {\n const newRangeEndIndex = this.getRowIndexForId(endRangeRowId, allRows);\n this.updateSelectionStateForRange(\n selection,\n shiftSelectStartRowIndex,\n newRangeEndIndex,\n allRows,\n true\n );\n }\n\n private updateSelectionStateForRange(\n selection: TanStackRowSelectionState,\n rangeStartIndex: number,\n rangeEndIndex: number,\n allRows: TanStackRow<TableNode<TData>>[],\n isSelecting: boolean\n ): void {\n if (rangeStartIndex === -1 || rangeEndIndex === -1) {\n return;\n }\n\n const firstRowIndex = Math.min(rangeStartIndex, rangeEndIndex);\n const lastRowIndex = Math.max(rangeStartIndex, rangeEndIndex);\n for (let i = firstRowIndex; i <= lastRowIndex; i++) {\n const row = allRows[i]!;\n if (row.getIsGrouped()) {\n continue;\n }\n this.updateSelectionStateForRow(selection, row.id, isSelecting);\n }\n\n const endRangeRow = allRows[rangeEndIndex]!;\n if (endRangeRow.getIsGrouped()) {\n this.getAllLeafRowIds(endRangeRow.id).forEach(id => this.updateSelectionStateForRow(selection, id, isSelecting));\n }\n }\n\n private updateSelectionStateForRow(\n selection: TanStackRowSelectionState,\n rowId: string,\n isSelecting: boolean\n ): void {\n if (isSelecting) {\n selection[rowId] = true;\n } else {\n delete selection[rowId];\n }\n }\n\n private getRowIndexForId(\n id: string | undefined,\n rows: TanStackRow<TableNode<TData>>[]\n ): number {\n if (!id) {\n return -1;\n }\n return rows.findIndex(x => x.id === id);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { Table as TanStackTable, Row as TanStackRow } from '@tanstack/table-core';
2
- import { TableNode, TableRecord, TableRowState } from '../../types';
2
+ import { type TableNode, type TableRecord, type TableRowState } from '../../types';
3
3
  /**
4
4
  * Abstract base class for handling behavior associated with interactive row selection of the table.
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"selection-manager-base.js","sourceRoot":"","sources":["../../../../../src/table/models/selection-managers/selection-manager-base.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Table as TanStackTable,\n Row as TanStackRow,\n RowSelectionState as TanStackRowSelectionState\n} from '@tanstack/table-core';\nimport {\n TableNode,\n TableRecord,\n TableRowSelectionState,\n TableRowState\n} from '../../types';\n\n/**\n * Abstract base class for handling behavior associated with interactive row selection of the table.\n */\nexport abstract class SelectionManagerBase<TData extends TableRecord> {\n protected tanStackTable: TanStackTable<TableNode<TData>>;\n\n public constructor(tanStackTable: TanStackTable<TableNode<TData>>) {\n this.tanStackTable = tanStackTable;\n }\n\n public abstract handleRowSelectionToggle(\n rowState: TableRowState,\n isSelecting: boolean,\n shiftKey: boolean\n ): boolean;\n\n public abstract handleRowClick(\n rowState: TableRowState,\n shiftKey: boolean,\n ctrlKey: boolean\n ): boolean;\n\n public abstract handleActionMenuOpening(rowState: TableRowState): boolean;\n\n public reset(): void {}\n\n protected toggleIsRowSelected(\n rowState: TableRowState,\n isSelecting?: boolean\n ): void {\n if (\n rowState.isGroupRow\n && rowState.selectionState === TableRowSelectionState.selected\n ) {\n // Work around for https://github.com/TanStack/table/issues/4759\n // Manually deselect all leaf rows when a fully selected group is being deselected.\n this.deselectAllLeafRows(rowState.id);\n } else {\n this.tanStackTable.getRow(rowState.id).toggleSelected(isSelecting, {\n selectChildren: rowState.isGroupRow\n });\n }\n }\n\n protected selectSingleRow(rowState: TableRowState): boolean {\n if (rowState.isGroupRow) {\n throw new Error('function not intended to select grouped rows');\n }\n\n const currentSelection = this.tanStackTable.getState().rowSelection;\n const selectedRecordIds: string[] = [];\n Object.entries(currentSelection).forEach(([recordId, isSelected]) => {\n if (isSelected) {\n selectedRecordIds.push(recordId);\n }\n });\n\n if (\n selectedRecordIds.length === 1\n && selectedRecordIds[0] === rowState.id\n ) {\n // The clicked row is already the only selected row. Do nothing.\n return false;\n }\n\n const newSelectionState: TanStackRowSelectionState = {};\n newSelectionState[rowState.id] = true;\n this.tanStackTable.setRowSelection(newSelectionState);\n return true;\n }\n\n protected deselectAllLeafRows(rowId: string): void {\n const groupRow = this.tanStackTable.getRow(rowId);\n const leafRowIds = this.getAllLeafRowIds(groupRow.id);\n\n const selectionState = this.tanStackTable.getState().rowSelection;\n for (const id of leafRowIds) {\n delete selectionState[id];\n }\n\n this.tanStackTable.setRowSelection(selectionState);\n }\n\n protected getAllLeafRowIds(id: string): string[] {\n const row = this.tanStackTable\n .getRowModel()\n .flatRows.find(x => x.id === id);\n if (!row?.getIsGrouped()) {\n return [];\n }\n\n return row\n .getLeafRows()\n .filter(leafRow => !leafRow.getIsGrouped())\n .map(leafRow => leafRow.id);\n }\n\n protected getAllOrderedRows(): TanStackRow<TableNode<TData>>[] {\n const topLevelRows = this.tanStackTable.getPreExpandedRowModel().rows;\n return this.getOrderedRows(topLevelRows);\n }\n\n private getOrderedRows(\n topLevelRows: TanStackRow<TableNode<TData>>[]\n ): TanStackRow<TableNode<TData>>[] {\n const allRows: TanStackRow<TableNode<TData>>[] = [];\n for (const row of topLevelRows) {\n allRows.push(row);\n if (row.subRows?.length) {\n allRows.push(...this.getOrderedRows(row.subRows));\n }\n }\n return allRows;\n }\n}\n"]}
1
+ {"version":3,"file":"selection-manager-base.js","sourceRoot":"","sources":["../../../../../src/table/models/selection-managers/selection-manager-base.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Table as TanStackTable,\n Row as TanStackRow,\n RowSelectionState as TanStackRowSelectionState\n} from '@tanstack/table-core';\nimport {\n type TableNode,\n type TableRecord,\n TableRowSelectionState,\n type TableRowState\n} from '../../types';\n\n/**\n * Abstract base class for handling behavior associated with interactive row selection of the table.\n */\nexport abstract class SelectionManagerBase<TData extends TableRecord> {\n protected tanStackTable: TanStackTable<TableNode<TData>>;\n\n public constructor(tanStackTable: TanStackTable<TableNode<TData>>) {\n this.tanStackTable = tanStackTable;\n }\n\n public abstract handleRowSelectionToggle(\n rowState: TableRowState,\n isSelecting: boolean,\n shiftKey: boolean\n ): boolean;\n\n public abstract handleRowClick(\n rowState: TableRowState,\n shiftKey: boolean,\n ctrlKey: boolean\n ): boolean;\n\n public abstract handleActionMenuOpening(rowState: TableRowState): boolean;\n\n public reset(): void {}\n\n protected toggleIsRowSelected(\n rowState: TableRowState,\n isSelecting?: boolean\n ): void {\n if (\n rowState.isGroupRow\n && rowState.selectionState === TableRowSelectionState.selected\n ) {\n // Work around for https://github.com/TanStack/table/issues/4759\n // Manually deselect all leaf rows when a fully selected group is being deselected.\n this.deselectAllLeafRows(rowState.id);\n } else {\n this.tanStackTable.getRow(rowState.id).toggleSelected(isSelecting, {\n selectChildren: rowState.isGroupRow\n });\n }\n }\n\n protected selectSingleRow(rowState: TableRowState): boolean {\n if (rowState.isGroupRow) {\n throw new Error('function not intended to select grouped rows');\n }\n\n const currentSelection = this.tanStackTable.getState().rowSelection;\n const selectedRecordIds: string[] = [];\n Object.entries(currentSelection).forEach(([recordId, isSelected]) => {\n if (isSelected) {\n selectedRecordIds.push(recordId);\n }\n });\n\n if (\n selectedRecordIds.length === 1\n && selectedRecordIds[0] === rowState.id\n ) {\n // The clicked row is already the only selected row. Do nothing.\n return false;\n }\n\n const newSelectionState: TanStackRowSelectionState = {};\n newSelectionState[rowState.id] = true;\n this.tanStackTable.setRowSelection(newSelectionState);\n return true;\n }\n\n protected deselectAllLeafRows(rowId: string): void {\n const groupRow = this.tanStackTable.getRow(rowId);\n const leafRowIds = this.getAllLeafRowIds(groupRow.id);\n\n const selectionState = this.tanStackTable.getState().rowSelection;\n for (const id of leafRowIds) {\n delete selectionState[id];\n }\n\n this.tanStackTable.setRowSelection(selectionState);\n }\n\n protected getAllLeafRowIds(id: string): string[] {\n const row = this.tanStackTable\n .getRowModel()\n .flatRows.find(x => x.id === id);\n if (!row?.getIsGrouped()) {\n return [];\n }\n\n return row\n .getLeafRows()\n .filter(leafRow => !leafRow.getIsGrouped())\n .map(leafRow => leafRow.id);\n }\n\n protected getAllOrderedRows(): TanStackRow<TableNode<TData>>[] {\n const topLevelRows = this.tanStackTable.getPreExpandedRowModel().rows;\n return this.getOrderedRows(topLevelRows);\n }\n\n private getOrderedRows(\n topLevelRows: TanStackRow<TableNode<TData>>[]\n ): TanStackRow<TableNode<TData>>[] {\n const allRows: TanStackRow<TableNode<TData>>[] = [];\n for (const row of topLevelRows) {\n allRows.push(row);\n if (row.subRows?.length) {\n allRows.push(...this.getOrderedRows(row.subRows));\n }\n }\n return allRows;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { TableColumn } from '../../table-column/base';
2
- import { TableRecord, TableRowSelectionMode, TableSetRecordHierarchyOptions, TableValidity } from '../types';
2
+ import { type TableRecord, TableRowSelectionMode, type TableSetRecordHierarchyOptions, type TableValidity } from '../types';
3
3
  /**
4
4
  * Helper class for the nimble-table to validate that the table's configuration
5
5
  * is valid and report which aspects of the configuration are valid or invalid.
@@ -1 +1 @@
1
- {"version":3,"file":"table-validator.js","sourceRoot":"","sources":["../../../../src/table/models/table-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TableColumn } from '../../table-column/base';\nimport {\n TableRecord,\n TableRowSelectionMode,\n TableSetRecordHierarchyOptions,\n TableValidity\n} from '../types';\n\n/**\n * Helper class for the nimble-table to validate that the table's configuration\n * is valid and report which aspects of the configuration are valid or invalid.\n */\nexport class TableValidator<TData extends TableRecord> {\n private duplicateRecordId = false;\n private missingRecordId = false;\n private invalidRecordId = false;\n private duplicateColumnId = false;\n private missingColumnId = false;\n private duplicateSortIndex = false;\n private duplicateGroupIndex = false;\n private idFieldNameNotConfigured = false;\n private invalidColumnConfiguration = false;\n private invalidParentIdConfiguration = false;\n\n private readonly recordIds = new Set<string>();\n\n public getValidity(): TableValidity {\n return {\n duplicateRecordId: this.duplicateRecordId,\n missingRecordId: this.missingRecordId,\n invalidRecordId: this.invalidRecordId,\n duplicateColumnId: this.duplicateColumnId,\n missingColumnId: this.missingColumnId,\n duplicateSortIndex: this.duplicateSortIndex,\n duplicateGroupIndex: this.duplicateGroupIndex,\n idFieldNameNotConfigured: this.idFieldNameNotConfigured,\n invalidColumnConfiguration: this.invalidColumnConfiguration,\n invalidParentIdConfiguration: this.invalidParentIdConfiguration\n };\n }\n\n public isValid(): boolean {\n return Object.values(this.getValidity()).every(x => x === false);\n }\n\n public areRecordIdsValid(): boolean {\n const validity = this.getValidity();\n return (\n !validity.duplicateRecordId\n && !validity.missingRecordId\n && !validity.invalidRecordId\n );\n }\n\n public validateIdFieldConfiguration(\n selectionMode: TableRowSelectionMode,\n idFieldName: string | undefined,\n parentIdFieldName: string | undefined\n ): boolean {\n const idFieldNameRequired = selectionMode !== TableRowSelectionMode.none\n || typeof parentIdFieldName === 'string';\n if (idFieldNameRequired) {\n this.idFieldNameNotConfigured = typeof idFieldName !== 'string';\n } else {\n this.idFieldNameNotConfigured = false;\n }\n return !this.idFieldNameNotConfigured;\n }\n\n public validateRecordIds(\n data: readonly TData[],\n idFieldName: string | undefined\n ): boolean {\n // Start off by assuming all IDs are valid.\n this.duplicateRecordId = false;\n this.missingRecordId = false;\n this.invalidRecordId = false;\n this.recordIds.clear();\n\n if (typeof idFieldName !== 'string') {\n return true;\n }\n\n for (const record of data) {\n if (!Object.prototype.hasOwnProperty.call(record, idFieldName)) {\n this.missingRecordId = true;\n continue;\n }\n\n const id = record[idFieldName];\n if (typeof id !== 'string') {\n this.invalidRecordId = true;\n continue;\n }\n\n if (this.recordIds.has(id)) {\n this.duplicateRecordId = true;\n }\n this.recordIds.add(id);\n }\n\n return (\n !this.missingRecordId\n && !this.invalidRecordId\n && !this.duplicateRecordId\n );\n }\n\n public validateColumnIds(\n columnIds: readonly (string | undefined)[]\n ): boolean {\n this.missingColumnId = false;\n this.duplicateColumnId = false;\n\n const anyColumnsHaveIds = columnIds.some(id => id);\n\n if (!anyColumnsHaveIds) {\n return true;\n }\n\n const idSet = new Set<string>();\n for (const columnId of columnIds) {\n if (!columnId) {\n this.missingColumnId = true;\n continue;\n }\n\n if (idSet.has(columnId)) {\n this.duplicateColumnId = true;\n }\n idSet.add(columnId);\n }\n\n return !this.missingColumnId && !this.duplicateColumnId;\n }\n\n public validateColumnSortIndices(sortIndices: readonly number[]): boolean {\n this.duplicateSortIndex = !this.validateIndicesAreUnique(sortIndices);\n return !this.duplicateSortIndex;\n }\n\n public validateColumnGroupIndices(\n groupIndices: readonly number[]\n ): boolean {\n this.duplicateGroupIndex = !this.validateIndicesAreUnique(groupIndices);\n return !this.duplicateGroupIndex;\n }\n\n public validateColumnConfigurations(\n columns: readonly TableColumn[]\n ): boolean {\n this.invalidColumnConfiguration = columns.some(\n x => !x.columnInternals.validator.isColumnValid\n );\n return !this.invalidColumnConfiguration;\n }\n\n public getPresentRecordIds(\n requestedRecordIds: readonly string[]\n ): string[] {\n return requestedRecordIds.filter(id => this.recordIds.has(id));\n }\n\n public getOptionsWithPresentIds(\n requestedOptions: readonly TableSetRecordHierarchyOptions[]\n ): TableSetRecordHierarchyOptions[] {\n return requestedOptions.filter(item => this.recordIds.has(item.recordId));\n }\n\n public setParentIdConfigurationValidity(valid: boolean): void {\n this.invalidParentIdConfiguration = !valid;\n }\n\n private validateIndicesAreUnique(indices: readonly number[]): boolean {\n const numberSet = new Set<number>(indices);\n return numberSet.size === indices.length;\n }\n}\n"]}
1
+ {"version":3,"file":"table-validator.js","sourceRoot":"","sources":["../../../../src/table/models/table-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TableColumn } from '../../table-column/base';\nimport {\n type TableRecord,\n TableRowSelectionMode,\n type TableSetRecordHierarchyOptions,\n type TableValidity\n} from '../types';\n\n/**\n * Helper class for the nimble-table to validate that the table's configuration\n * is valid and report which aspects of the configuration are valid or invalid.\n */\nexport class TableValidator<TData extends TableRecord> {\n private duplicateRecordId = false;\n private missingRecordId = false;\n private invalidRecordId = false;\n private duplicateColumnId = false;\n private missingColumnId = false;\n private duplicateSortIndex = false;\n private duplicateGroupIndex = false;\n private idFieldNameNotConfigured = false;\n private invalidColumnConfiguration = false;\n private invalidParentIdConfiguration = false;\n\n private readonly recordIds = new Set<string>();\n\n public getValidity(): TableValidity {\n return {\n duplicateRecordId: this.duplicateRecordId,\n missingRecordId: this.missingRecordId,\n invalidRecordId: this.invalidRecordId,\n duplicateColumnId: this.duplicateColumnId,\n missingColumnId: this.missingColumnId,\n duplicateSortIndex: this.duplicateSortIndex,\n duplicateGroupIndex: this.duplicateGroupIndex,\n idFieldNameNotConfigured: this.idFieldNameNotConfigured,\n invalidColumnConfiguration: this.invalidColumnConfiguration,\n invalidParentIdConfiguration: this.invalidParentIdConfiguration\n };\n }\n\n public isValid(): boolean {\n return Object.values(this.getValidity()).every(x => x === false);\n }\n\n public areRecordIdsValid(): boolean {\n const validity = this.getValidity();\n return (\n !validity.duplicateRecordId\n && !validity.missingRecordId\n && !validity.invalidRecordId\n );\n }\n\n public validateIdFieldConfiguration(\n selectionMode: TableRowSelectionMode,\n idFieldName: string | undefined,\n parentIdFieldName: string | undefined\n ): boolean {\n const idFieldNameRequired = selectionMode !== TableRowSelectionMode.none\n || typeof parentIdFieldName === 'string';\n if (idFieldNameRequired) {\n this.idFieldNameNotConfigured = typeof idFieldName !== 'string';\n } else {\n this.idFieldNameNotConfigured = false;\n }\n return !this.idFieldNameNotConfigured;\n }\n\n public validateRecordIds(\n data: readonly TData[],\n idFieldName: string | undefined\n ): boolean {\n // Start off by assuming all IDs are valid.\n this.duplicateRecordId = false;\n this.missingRecordId = false;\n this.invalidRecordId = false;\n this.recordIds.clear();\n\n if (typeof idFieldName !== 'string') {\n return true;\n }\n\n for (const record of data) {\n if (!Object.prototype.hasOwnProperty.call(record, idFieldName)) {\n this.missingRecordId = true;\n continue;\n }\n\n const id = record[idFieldName];\n if (typeof id !== 'string') {\n this.invalidRecordId = true;\n continue;\n }\n\n if (this.recordIds.has(id)) {\n this.duplicateRecordId = true;\n }\n this.recordIds.add(id);\n }\n\n return (\n !this.missingRecordId\n && !this.invalidRecordId\n && !this.duplicateRecordId\n );\n }\n\n public validateColumnIds(\n columnIds: readonly (string | undefined)[]\n ): boolean {\n this.missingColumnId = false;\n this.duplicateColumnId = false;\n\n const anyColumnsHaveIds = columnIds.some(id => id);\n\n if (!anyColumnsHaveIds) {\n return true;\n }\n\n const idSet = new Set<string>();\n for (const columnId of columnIds) {\n if (!columnId) {\n this.missingColumnId = true;\n continue;\n }\n\n if (idSet.has(columnId)) {\n this.duplicateColumnId = true;\n }\n idSet.add(columnId);\n }\n\n return !this.missingColumnId && !this.duplicateColumnId;\n }\n\n public validateColumnSortIndices(sortIndices: readonly number[]): boolean {\n this.duplicateSortIndex = !this.validateIndicesAreUnique(sortIndices);\n return !this.duplicateSortIndex;\n }\n\n public validateColumnGroupIndices(\n groupIndices: readonly number[]\n ): boolean {\n this.duplicateGroupIndex = !this.validateIndicesAreUnique(groupIndices);\n return !this.duplicateGroupIndex;\n }\n\n public validateColumnConfigurations(\n columns: readonly TableColumn[]\n ): boolean {\n this.invalidColumnConfiguration = columns.some(\n x => !x.columnInternals.validator.isColumnValid\n );\n return !this.invalidColumnConfiguration;\n }\n\n public getPresentRecordIds(\n requestedRecordIds: readonly string[]\n ): string[] {\n return requestedRecordIds.filter(id => this.recordIds.has(id));\n }\n\n public getOptionsWithPresentIds(\n requestedOptions: readonly TableSetRecordHierarchyOptions[]\n ): TableSetRecordHierarchyOptions[] {\n return requestedOptions.filter(item => this.recordIds.has(item.recordId));\n }\n\n public setParentIdConfigurationValidity(valid: boolean): void {\n this.invalidParentIdConfiguration = !valid;\n }\n\n private validateIndicesAreUnique(indices: readonly number[]): boolean {\n const numberSet = new Set<number>(indices);\n return numberSet.size === indices.length;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { Table as TanStackTable } from '@tanstack/table-core';
2
- import { VirtualItem, ScrollToOptions } from '@tanstack/virtual-core';
2
+ import { type VirtualItem, type ScrollToOptions } from '@tanstack/virtual-core';
3
3
  import type { Table } from '..';
4
4
  import type { TableNode, TableRecord } from '../types';
5
5
  /**