@cloudscape-design/components-themeable 3.0.510 → 3.0.512

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 (231) hide show
  1. package/lib/internal/manifest.json +1 -1
  2. package/lib/internal/scss/internal/styles/utils/styles-reset.scss +24 -2
  3. package/lib/internal/template/alert/styles.css.js +25 -25
  4. package/lib/internal/template/alert/styles.scoped.css +45 -51
  5. package/lib/internal/template/alert/styles.selectors.js +25 -25
  6. package/lib/internal/template/anchor-navigation/styles.css.js +8 -8
  7. package/lib/internal/template/anchor-navigation/styles.scoped.css +21 -24
  8. package/lib/internal/template/anchor-navigation/styles.selectors.js +8 -8
  9. package/lib/internal/template/annotation-context/annotation/styles.css.js +24 -24
  10. package/lib/internal/template/annotation-context/annotation/styles.scoped.css +32 -35
  11. package/lib/internal/template/annotation-context/annotation/styles.selectors.js +24 -24
  12. package/lib/internal/template/app-layout/visual-refresh/styles.css.js +80 -80
  13. package/lib/internal/template/app-layout/visual-refresh/styles.scoped.css +175 -181
  14. package/lib/internal/template/app-layout/visual-refresh/styles.selectors.js +80 -80
  15. package/lib/internal/template/attribute-editor/styles.css.js +14 -14
  16. package/lib/internal/template/attribute-editor/styles.scoped.css +27 -30
  17. package/lib/internal/template/attribute-editor/styles.selectors.js +14 -14
  18. package/lib/internal/template/badge/styles.css.js +5 -5
  19. package/lib/internal/template/badge/styles.scoped.css +8 -11
  20. package/lib/internal/template/badge/styles.selectors.js +5 -5
  21. package/lib/internal/template/breadcrumb-group/styles.css.js +7 -7
  22. package/lib/internal/template/breadcrumb-group/styles.scoped.css +18 -24
  23. package/lib/internal/template/breadcrumb-group/styles.selectors.js +7 -7
  24. package/lib/internal/template/button/styles.css.js +20 -20
  25. package/lib/internal/template/button/styles.scoped.css +154 -157
  26. package/lib/internal/template/button/styles.selectors.js +20 -20
  27. package/lib/internal/template/button-dropdown/mobile-expandable-group/styles.css.js +5 -5
  28. package/lib/internal/template/button-dropdown/mobile-expandable-group/styles.scoped.css +8 -11
  29. package/lib/internal/template/button-dropdown/mobile-expandable-group/styles.selectors.js +5 -5
  30. package/lib/internal/template/calendar/styles.css.js +18 -18
  31. package/lib/internal/template/calendar/styles.scoped.css +41 -44
  32. package/lib/internal/template/calendar/styles.selectors.js +18 -18
  33. package/lib/internal/template/cards/styles.css.js +39 -39
  34. package/lib/internal/template/cards/styles.scoped.css +52 -55
  35. package/lib/internal/template/cards/styles.selectors.js +39 -39
  36. package/lib/internal/template/checkbox/styles.css.js +3 -3
  37. package/lib/internal/template/checkbox/styles.scoped.css +8 -11
  38. package/lib/internal/template/checkbox/styles.selectors.js +3 -3
  39. package/lib/internal/template/code-editor/styles.css.js +32 -32
  40. package/lib/internal/template/code-editor/styles.scoped.css +180 -183
  41. package/lib/internal/template/code-editor/styles.selectors.js +32 -32
  42. package/lib/internal/template/collection-preferences/content-display/styles.css.js +11 -11
  43. package/lib/internal/template/collection-preferences/content-display/styles.scoped.css +20 -23
  44. package/lib/internal/template/collection-preferences/content-display/styles.selectors.js +11 -11
  45. package/lib/internal/template/collection-preferences/styles.css.js +37 -37
  46. package/lib/internal/template/collection-preferences/styles.scoped.css +47 -50
  47. package/lib/internal/template/collection-preferences/styles.selectors.js +37 -37
  48. package/lib/internal/template/column-layout/styles.css.js +13 -13
  49. package/lib/internal/template/column-layout/styles.scoped.css +46 -49
  50. package/lib/internal/template/column-layout/styles.selectors.js +13 -13
  51. package/lib/internal/template/container/styles.css.js +29 -29
  52. package/lib/internal/template/container/styles.scoped.css +55 -58
  53. package/lib/internal/template/container/styles.selectors.js +29 -29
  54. package/lib/internal/template/date-picker/styles.css.js +7 -7
  55. package/lib/internal/template/date-picker/styles.scoped.css +12 -15
  56. package/lib/internal/template/date-picker/styles.selectors.js +7 -7
  57. package/lib/internal/template/date-range-picker/styles.css.js +38 -38
  58. package/lib/internal/template/date-range-picker/styles.scoped.css +49 -52
  59. package/lib/internal/template/date-range-picker/styles.selectors.js +38 -38
  60. package/lib/internal/template/drawer/styles.css.js +3 -3
  61. package/lib/internal/template/drawer/styles.scoped.css +11 -14
  62. package/lib/internal/template/drawer/styles.selectors.js +3 -3
  63. package/lib/internal/template/expandable-section/styles.css.js +32 -32
  64. package/lib/internal/template/expandable-section/styles.scoped.css +65 -68
  65. package/lib/internal/template/expandable-section/styles.selectors.js +32 -32
  66. package/lib/internal/template/flashbar/styles.css.js +47 -47
  67. package/lib/internal/template/flashbar/styles.scoped.css +149 -152
  68. package/lib/internal/template/flashbar/styles.selectors.js +47 -47
  69. package/lib/internal/template/form/styles.css.js +9 -9
  70. package/lib/internal/template/form/styles.scoped.css +11 -14
  71. package/lib/internal/template/form/styles.selectors.js +9 -9
  72. package/lib/internal/template/form-field/styles.css.js +19 -19
  73. package/lib/internal/template/form-field/styles.scoped.css +32 -35
  74. package/lib/internal/template/form-field/styles.selectors.js +19 -19
  75. package/lib/internal/template/grid/styles.css.js +53 -53
  76. package/lib/internal/template/grid/styles.scoped.css +57 -60
  77. package/lib/internal/template/grid/styles.selectors.js +53 -53
  78. package/lib/internal/template/header/styles.css.js +34 -34
  79. package/lib/internal/template/header/styles.scoped.css +53 -56
  80. package/lib/internal/template/header/styles.selectors.js +34 -34
  81. package/lib/internal/template/help-panel/styles.css.js +4 -4
  82. package/lib/internal/template/help-panel/styles.scoped.css +66 -69
  83. package/lib/internal/template/help-panel/styles.selectors.js +4 -4
  84. package/lib/internal/template/input/styles.css.js +12 -12
  85. package/lib/internal/template/input/styles.scoped.css +33 -36
  86. package/lib/internal/template/input/styles.selectors.js +12 -12
  87. package/lib/internal/template/internal/components/button-trigger/styles.css.js +10 -10
  88. package/lib/internal/template/internal/components/button-trigger/styles.scoped.css +27 -30
  89. package/lib/internal/template/internal/components/button-trigger/styles.selectors.js +10 -10
  90. package/lib/internal/template/internal/components/chart-filter/styles.css.js +3 -3
  91. package/lib/internal/template/internal/components/chart-filter/styles.scoped.css +6 -9
  92. package/lib/internal/template/internal/components/chart-filter/styles.selectors.js +3 -3
  93. package/lib/internal/template/internal/components/chart-legend/styles.css.js +6 -6
  94. package/lib/internal/template/internal/components/chart-legend/styles.scoped.css +18 -21
  95. package/lib/internal/template/internal/components/chart-legend/styles.selectors.js +6 -6
  96. package/lib/internal/template/internal/components/chart-popover/styles.css.js +3 -3
  97. package/lib/internal/template/internal/components/chart-popover/styles.scoped.css +6 -9
  98. package/lib/internal/template/internal/components/chart-popover/styles.selectors.js +3 -3
  99. package/lib/internal/template/internal/components/chart-series-details/styles.css.js +20 -20
  100. package/lib/internal/template/internal/components/chart-series-details/styles.scoped.css +42 -51
  101. package/lib/internal/template/internal/components/chart-series-details/styles.selectors.js +20 -20
  102. package/lib/internal/template/internal/components/chart-series-marker/styles.css.js +5 -5
  103. package/lib/internal/template/internal/components/chart-series-marker/styles.scoped.css +10 -13
  104. package/lib/internal/template/internal/components/chart-series-marker/styles.selectors.js +5 -5
  105. package/lib/internal/template/internal/components/chart-wrapper/styles.css.js +9 -9
  106. package/lib/internal/template/internal/components/chart-wrapper/styles.scoped.css +12 -15
  107. package/lib/internal/template/internal/components/chart-wrapper/styles.selectors.js +9 -9
  108. package/lib/internal/template/internal/components/dropdown/styles.css.js +20 -20
  109. package/lib/internal/template/internal/components/dropdown/styles.scoped.css +38 -41
  110. package/lib/internal/template/internal/components/dropdown/styles.selectors.js +20 -20
  111. package/lib/internal/template/internal/components/dropdown-footer/styles.css.js +3 -3
  112. package/lib/internal/template/internal/components/dropdown-footer/styles.scoped.css +6 -9
  113. package/lib/internal/template/internal/components/dropdown-footer/styles.selectors.js +3 -3
  114. package/lib/internal/template/internal/components/dropdown-status/styles.css.js +2 -2
  115. package/lib/internal/template/internal/components/dropdown-status/styles.scoped.css +5 -8
  116. package/lib/internal/template/internal/components/dropdown-status/styles.selectors.js +2 -2
  117. package/lib/internal/template/internal/components/focus-lock/utils.d.ts +1 -0
  118. package/lib/internal/template/internal/components/focus-lock/utils.d.ts.map +1 -1
  119. package/lib/internal/template/internal/components/focus-lock/utils.js +4 -3
  120. package/lib/internal/template/internal/components/focus-lock/utils.js.map +1 -1
  121. package/lib/internal/template/internal/components/menu-dropdown/styles.css.js +7 -7
  122. package/lib/internal/template/internal/components/menu-dropdown/styles.scoped.css +16 -19
  123. package/lib/internal/template/internal/components/menu-dropdown/styles.selectors.js +7 -7
  124. package/lib/internal/template/internal/components/option/styles.css.js +17 -17
  125. package/lib/internal/template/internal/components/option/styles.scoped.css +32 -35
  126. package/lib/internal/template/internal/components/option/styles.selectors.js +17 -17
  127. package/lib/internal/template/internal/components/options-list/styles.css.js +2 -2
  128. package/lib/internal/template/internal/components/options-list/styles.scoped.css +5 -8
  129. package/lib/internal/template/internal/components/options-list/styles.selectors.js +2 -2
  130. package/lib/internal/template/internal/components/token-list/styles.css.js +9 -9
  131. package/lib/internal/template/internal/components/token-list/styles.scoped.css +23 -26
  132. package/lib/internal/template/internal/components/token-list/styles.selectors.js +9 -9
  133. package/lib/internal/template/internal/context/single-tab-stop-navigation-context.d.ts +9 -4
  134. package/lib/internal/template/internal/context/single-tab-stop-navigation-context.d.ts.map +1 -1
  135. package/lib/internal/template/internal/context/single-tab-stop-navigation-context.js +15 -5
  136. package/lib/internal/template/internal/context/single-tab-stop-navigation-context.js.map +1 -1
  137. package/lib/internal/template/internal/environment.js +1 -1
  138. package/lib/internal/template/internal/environment.json +1 -1
  139. package/lib/internal/template/internal/utils/scrollable-containers.d.ts +2 -1
  140. package/lib/internal/template/internal/utils/scrollable-containers.d.ts.map +1 -1
  141. package/lib/internal/template/internal/utils/scrollable-containers.js +11 -2
  142. package/lib/internal/template/internal/utils/scrollable-containers.js.map +1 -1
  143. package/lib/internal/template/link/styles.css.js +20 -20
  144. package/lib/internal/template/link/styles.scoped.css +74 -77
  145. package/lib/internal/template/link/styles.selectors.js +20 -20
  146. package/lib/internal/template/modal/styles.css.js +23 -23
  147. package/lib/internal/template/modal/styles.scoped.css +44 -50
  148. package/lib/internal/template/modal/styles.selectors.js +23 -23
  149. package/lib/internal/template/multiselect/styles.css.js +2 -2
  150. package/lib/internal/template/multiselect/styles.scoped.css +5 -8
  151. package/lib/internal/template/multiselect/styles.selectors.js +2 -2
  152. package/lib/internal/template/pagination/styles.css.js +9 -9
  153. package/lib/internal/template/pagination/styles.scoped.css +26 -29
  154. package/lib/internal/template/pagination/styles.selectors.js +9 -9
  155. package/lib/internal/template/popover/styles.css.js +50 -50
  156. package/lib/internal/template/popover/styles.scoped.css +72 -81
  157. package/lib/internal/template/popover/styles.selectors.js +50 -50
  158. package/lib/internal/template/popover/use-popover-position.d.ts.map +1 -1
  159. package/lib/internal/template/popover/use-popover-position.js +4 -2
  160. package/lib/internal/template/popover/use-popover-position.js.map +1 -1
  161. package/lib/internal/template/progress-bar/styles.css.js +18 -18
  162. package/lib/internal/template/progress-bar/styles.scoped.css +35 -38
  163. package/lib/internal/template/progress-bar/styles.selectors.js +18 -18
  164. package/lib/internal/template/property-filter/styles.css.js +31 -31
  165. package/lib/internal/template/property-filter/styles.scoped.css +36 -39
  166. package/lib/internal/template/property-filter/styles.selectors.js +31 -31
  167. package/lib/internal/template/radio-group/styles.css.js +9 -9
  168. package/lib/internal/template/radio-group/styles.scoped.css +18 -21
  169. package/lib/internal/template/radio-group/styles.selectors.js +9 -9
  170. package/lib/internal/template/segmented-control/styles.css.js +14 -14
  171. package/lib/internal/template/segmented-control/styles.scoped.css +36 -39
  172. package/lib/internal/template/segmented-control/styles.selectors.js +14 -14
  173. package/lib/internal/template/select/styles.css.js +1 -1
  174. package/lib/internal/template/select/styles.scoped.css +4 -7
  175. package/lib/internal/template/select/styles.selectors.js +1 -1
  176. package/lib/internal/template/side-navigation/styles.css.js +28 -28
  177. package/lib/internal/template/side-navigation/styles.scoped.css +41 -44
  178. package/lib/internal/template/side-navigation/styles.selectors.js +28 -28
  179. package/lib/internal/template/split-panel/styles.css.js +55 -55
  180. package/lib/internal/template/split-panel/styles.scoped.css +78 -81
  181. package/lib/internal/template/split-panel/styles.selectors.js +55 -55
  182. package/lib/internal/template/table/resizer/styles.css.js +8 -8
  183. package/lib/internal/template/table/resizer/styles.scoped.css +17 -20
  184. package/lib/internal/template/table/resizer/styles.selectors.js +8 -8
  185. package/lib/internal/template/table/table-role/grid-navigation.d.ts.map +1 -1
  186. package/lib/internal/template/table/table-role/grid-navigation.js +73 -41
  187. package/lib/internal/template/table/table-role/grid-navigation.js.map +1 -1
  188. package/lib/internal/template/table/table-role/utils.d.ts +1 -16
  189. package/lib/internal/template/table/table-role/utils.d.ts.map +1 -1
  190. package/lib/internal/template/table/table-role/utils.js +0 -53
  191. package/lib/internal/template/table/table-role/utils.js.map +1 -1
  192. package/lib/internal/template/tabs/styles.css.js +21 -21
  193. package/lib/internal/template/tabs/styles.scoped.css +42 -45
  194. package/lib/internal/template/tabs/styles.selectors.js +21 -21
  195. package/lib/internal/template/text-content/styles.css.js +1 -1
  196. package/lib/internal/template/text-content/styles.scoped.css +63 -66
  197. package/lib/internal/template/text-content/styles.selectors.js +1 -1
  198. package/lib/internal/template/text-filter/styles.css.js +3 -3
  199. package/lib/internal/template/text-filter/styles.scoped.css +6 -9
  200. package/lib/internal/template/text-filter/styles.selectors.js +3 -3
  201. package/lib/internal/template/textarea/styles.css.js +4 -4
  202. package/lib/internal/template/textarea/styles.scoped.css +15 -18
  203. package/lib/internal/template/textarea/styles.selectors.js +4 -4
  204. package/lib/internal/template/tiles/styles.css.js +29 -29
  205. package/lib/internal/template/tiles/styles.scoped.css +76 -82
  206. package/lib/internal/template/tiles/styles.selectors.js +29 -29
  207. package/lib/internal/template/toggle/styles.css.js +8 -8
  208. package/lib/internal/template/toggle/styles.scoped.css +16 -19
  209. package/lib/internal/template/toggle/styles.selectors.js +8 -8
  210. package/lib/internal/template/token-group/styles.css.js +8 -8
  211. package/lib/internal/template/token-group/styles.scoped.css +19 -22
  212. package/lib/internal/template/token-group/styles.selectors.js +8 -8
  213. package/lib/internal/template/top-navigation/1.0-beta/styles.css.js +25 -25
  214. package/lib/internal/template/top-navigation/1.0-beta/styles.scoped.css +45 -48
  215. package/lib/internal/template/top-navigation/1.0-beta/styles.selectors.js +25 -25
  216. package/lib/internal/template/top-navigation/styles.css.js +47 -47
  217. package/lib/internal/template/top-navigation/styles.scoped.css +75 -84
  218. package/lib/internal/template/top-navigation/styles.selectors.js +47 -47
  219. package/lib/internal/template/tutorial-panel/components/tutorial-detail-view/styles.css.js +20 -20
  220. package/lib/internal/template/tutorial-panel/components/tutorial-detail-view/styles.scoped.css +24 -27
  221. package/lib/internal/template/tutorial-panel/components/tutorial-detail-view/styles.selectors.js +20 -20
  222. package/lib/internal/template/tutorial-panel/components/tutorial-list/styles.css.js +18 -18
  223. package/lib/internal/template/tutorial-panel/components/tutorial-list/styles.scoped.css +36 -45
  224. package/lib/internal/template/tutorial-panel/components/tutorial-list/styles.selectors.js +18 -18
  225. package/lib/internal/template/tutorial-panel/styles.css.js +1 -1
  226. package/lib/internal/template/tutorial-panel/styles.scoped.css +4 -7
  227. package/lib/internal/template/tutorial-panel/styles.selectors.js +1 -1
  228. package/lib/internal/template/wizard/styles.css.js +31 -31
  229. package/lib/internal/template/wizard/styles.scoped.css +65 -68
  230. package/lib/internal/template/wizard/styles.selectors.js +31 -31
  231. package/package.json +1 -1
@@ -2,60 +2,60 @@
2
2
  // es-module interop with Babel and Typescript
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  module.exports.default = {
5
- "drawer": "awsui_drawer_1r9lg_ptaxg_189",
6
- "refresh": "awsui_refresh_1r9lg_ptaxg_189",
7
- "animating": "awsui_animating_1r9lg_ptaxg_203",
8
- "preference-icon--layout-border": "awsui_preference-icon--layout-border_1r9lg_ptaxg_226",
9
- "preference-icon--layout-background": "awsui_preference-icon--layout-background_1r9lg_ptaxg_230",
10
- "preference-icon--layout-header": "awsui_preference-icon--layout-header_1r9lg_ptaxg_233",
11
- "preference-icon--border": "awsui_preference-icon--border_1r9lg_ptaxg_236",
12
- "preference-icon--primary-button": "awsui_preference-icon--primary-button_1r9lg_ptaxg_240",
13
- "preference-icon--secondary": "awsui_preference-icon--secondary_1r9lg_ptaxg_243",
14
- "preference-icon--disabled-element": "awsui_preference-icon--disabled-element_1r9lg_ptaxg_246",
15
- "preference-icon--separator": "awsui_preference-icon--separator_1r9lg_ptaxg_249",
16
- "preference-icon--focus-text": "awsui_preference-icon--focus-text_1r9lg_ptaxg_252",
17
- "preference-icon-refresh--layout-top": "awsui_preference-icon-refresh--layout-top_1r9lg_ptaxg_256",
18
- "preference-icon-refresh--layout-main": "awsui_preference-icon-refresh--layout-main_1r9lg_ptaxg_259",
19
- "preference-icon-refresh--primary": "awsui_preference-icon-refresh--primary_1r9lg_ptaxg_262",
20
- "preference-icon-refresh--disabled": "awsui_preference-icon-refresh--disabled_1r9lg_ptaxg_265",
21
- "preference-icon-refresh--column-header": "awsui_preference-icon-refresh--column-header_1r9lg_ptaxg_268",
22
- "preference-icon-refresh--window": "awsui_preference-icon-refresh--window_1r9lg_ptaxg_271",
23
- "preference-icon-refresh--secondary": "awsui_preference-icon-refresh--secondary_1r9lg_ptaxg_275",
24
- "preference-icon-refresh--default": "awsui_preference-icon-refresh--default_1r9lg_ptaxg_278",
25
- "preference-icon-refresh--separator": "awsui_preference-icon-refresh--separator_1r9lg_ptaxg_281",
26
- "preference-icon-refresh--input-default": "awsui_preference-icon-refresh--input-default_1r9lg_ptaxg_284",
27
- "preference-icon-refresh--heading": "awsui_preference-icon-refresh--heading_1r9lg_ptaxg_287",
28
- "root": "awsui_root_1r9lg_ptaxg_291",
29
- "preferences-button": "awsui_preferences-button_1r9lg_ptaxg_304",
30
- "close-button": "awsui_close-button_1r9lg_ptaxg_308",
31
- "drawer-closed": "awsui_drawer-closed_1r9lg_ptaxg_320",
32
- "drawer-content-side": "awsui_drawer-content-side_1r9lg_ptaxg_325",
33
- "drawer-content-bottom": "awsui_drawer-content-bottom_1r9lg_ptaxg_341",
34
- "position-bottom": "awsui_position-bottom_1r9lg_ptaxg_350",
35
- "position-side": "awsui_position-side_1r9lg_ptaxg_377",
36
- "slider": "awsui_slider_1r9lg_ptaxg_383",
37
- "slider-side": "awsui_slider-side_1r9lg_ptaxg_412",
38
- "slider-wrapper-bottom": "awsui_slider-wrapper-bottom_1r9lg_ptaxg_417",
39
- "slider-wrapper-side": "awsui_slider-wrapper-side_1r9lg_ptaxg_428",
40
- "open-button": "awsui_open-button_1r9lg_ptaxg_439",
41
- "open-button-side": "awsui_open-button-side_1r9lg_ptaxg_443",
42
- "slider-icon": "awsui_slider-icon_1r9lg_ptaxg_450",
43
- "slider-icon-bottom": "awsui_slider-icon-bottom_1r9lg_ptaxg_456",
44
- "slider-icon-side": "awsui_slider-icon-side_1r9lg_ptaxg_459",
45
- "pane-header-wrapper-bottom": "awsui_pane-header-wrapper-bottom_1r9lg_ptaxg_463",
46
- "drawer-mobile": "awsui_drawer-mobile_1r9lg_ptaxg_473",
47
- "drawer-disable-content-paddings": "awsui_drawer-disable-content-paddings_1r9lg_ptaxg_476",
48
- "content-bottom": "awsui_content-bottom_1r9lg_ptaxg_484",
49
- "pane-bottom-center-align": "awsui_pane-bottom-center-align_1r9lg_ptaxg_497",
50
- "pane-bottom-content-nav-padding": "awsui_pane-bottom-content-nav-padding_1r9lg_ptaxg_502",
51
- "pane-bottom-content-tools-padding": "awsui_pane-bottom-content-tools-padding_1r9lg_ptaxg_506",
52
- "content-bottom-max-width": "awsui_content-bottom-max-width_1r9lg_ptaxg_510",
53
- "content-side": "awsui_content-side_1r9lg_ptaxg_515",
54
- "pane-header-wrapper-side": "awsui_pane-header-wrapper-side_1r9lg_ptaxg_526",
55
- "pane-content-wrapper-side": "awsui_pane-content-wrapper-side_1r9lg_ptaxg_530",
56
- "header": "awsui_header_1r9lg_ptaxg_535",
57
- "header-text": "awsui_header-text_1r9lg_ptaxg_544",
58
- "header-actions": "awsui_header-actions_1r9lg_ptaxg_555",
59
- "divider": "awsui_divider_1r9lg_ptaxg_563"
5
+ "drawer": "awsui_drawer_1r9lg_aq665_189",
6
+ "refresh": "awsui_refresh_1r9lg_aq665_189",
7
+ "animating": "awsui_animating_1r9lg_aq665_203",
8
+ "preference-icon--layout-border": "awsui_preference-icon--layout-border_1r9lg_aq665_226",
9
+ "preference-icon--layout-background": "awsui_preference-icon--layout-background_1r9lg_aq665_230",
10
+ "preference-icon--layout-header": "awsui_preference-icon--layout-header_1r9lg_aq665_233",
11
+ "preference-icon--border": "awsui_preference-icon--border_1r9lg_aq665_236",
12
+ "preference-icon--primary-button": "awsui_preference-icon--primary-button_1r9lg_aq665_240",
13
+ "preference-icon--secondary": "awsui_preference-icon--secondary_1r9lg_aq665_243",
14
+ "preference-icon--disabled-element": "awsui_preference-icon--disabled-element_1r9lg_aq665_246",
15
+ "preference-icon--separator": "awsui_preference-icon--separator_1r9lg_aq665_249",
16
+ "preference-icon--focus-text": "awsui_preference-icon--focus-text_1r9lg_aq665_252",
17
+ "preference-icon-refresh--layout-top": "awsui_preference-icon-refresh--layout-top_1r9lg_aq665_256",
18
+ "preference-icon-refresh--layout-main": "awsui_preference-icon-refresh--layout-main_1r9lg_aq665_259",
19
+ "preference-icon-refresh--primary": "awsui_preference-icon-refresh--primary_1r9lg_aq665_262",
20
+ "preference-icon-refresh--disabled": "awsui_preference-icon-refresh--disabled_1r9lg_aq665_265",
21
+ "preference-icon-refresh--column-header": "awsui_preference-icon-refresh--column-header_1r9lg_aq665_268",
22
+ "preference-icon-refresh--window": "awsui_preference-icon-refresh--window_1r9lg_aq665_271",
23
+ "preference-icon-refresh--secondary": "awsui_preference-icon-refresh--secondary_1r9lg_aq665_275",
24
+ "preference-icon-refresh--default": "awsui_preference-icon-refresh--default_1r9lg_aq665_278",
25
+ "preference-icon-refresh--separator": "awsui_preference-icon-refresh--separator_1r9lg_aq665_281",
26
+ "preference-icon-refresh--input-default": "awsui_preference-icon-refresh--input-default_1r9lg_aq665_284",
27
+ "preference-icon-refresh--heading": "awsui_preference-icon-refresh--heading_1r9lg_aq665_287",
28
+ "root": "awsui_root_1r9lg_aq665_291",
29
+ "preferences-button": "awsui_preferences-button_1r9lg_aq665_326",
30
+ "close-button": "awsui_close-button_1r9lg_aq665_330",
31
+ "drawer-closed": "awsui_drawer-closed_1r9lg_aq665_342",
32
+ "drawer-content-side": "awsui_drawer-content-side_1r9lg_aq665_347",
33
+ "drawer-content-bottom": "awsui_drawer-content-bottom_1r9lg_aq665_363",
34
+ "position-bottom": "awsui_position-bottom_1r9lg_aq665_372",
35
+ "position-side": "awsui_position-side_1r9lg_aq665_399",
36
+ "slider": "awsui_slider_1r9lg_aq665_405",
37
+ "slider-side": "awsui_slider-side_1r9lg_aq665_434",
38
+ "slider-wrapper-bottom": "awsui_slider-wrapper-bottom_1r9lg_aq665_439",
39
+ "slider-wrapper-side": "awsui_slider-wrapper-side_1r9lg_aq665_450",
40
+ "open-button": "awsui_open-button_1r9lg_aq665_461",
41
+ "open-button-side": "awsui_open-button-side_1r9lg_aq665_465",
42
+ "slider-icon": "awsui_slider-icon_1r9lg_aq665_472",
43
+ "slider-icon-bottom": "awsui_slider-icon-bottom_1r9lg_aq665_478",
44
+ "slider-icon-side": "awsui_slider-icon-side_1r9lg_aq665_481",
45
+ "pane-header-wrapper-bottom": "awsui_pane-header-wrapper-bottom_1r9lg_aq665_485",
46
+ "drawer-mobile": "awsui_drawer-mobile_1r9lg_aq665_495",
47
+ "drawer-disable-content-paddings": "awsui_drawer-disable-content-paddings_1r9lg_aq665_498",
48
+ "content-bottom": "awsui_content-bottom_1r9lg_aq665_506",
49
+ "pane-bottom-center-align": "awsui_pane-bottom-center-align_1r9lg_aq665_519",
50
+ "pane-bottom-content-nav-padding": "awsui_pane-bottom-content-nav-padding_1r9lg_aq665_524",
51
+ "pane-bottom-content-tools-padding": "awsui_pane-bottom-content-tools-padding_1r9lg_aq665_528",
52
+ "content-bottom-max-width": "awsui_content-bottom-max-width_1r9lg_aq665_532",
53
+ "content-side": "awsui_content-side_1r9lg_aq665_537",
54
+ "pane-header-wrapper-side": "awsui_pane-header-wrapper-side_1r9lg_aq665_548",
55
+ "pane-content-wrapper-side": "awsui_pane-content-wrapper-side_1r9lg_aq665_552",
56
+ "header": "awsui_header_1r9lg_aq665_557",
57
+ "header-text": "awsui_header-text_1r9lg_aq665_566",
58
+ "header-actions": "awsui_header-actions_1r9lg_aq665_577",
59
+ "divider": "awsui_divider_1r9lg_aq665_585"
60
60
  };
61
61
 
@@ -1,13 +1,13 @@
1
1
 
2
2
  import './styles.scoped.css';
3
3
  export default {
4
- "resize-active": "awsui_resize-active_x7peu_y5tq5_93",
5
- "resize-active-with-focus": "awsui_resize-active-with-focus_x7peu_y5tq5_93",
6
- "divider": "awsui_divider_x7peu_y5tq5_98",
7
- "divider-disabled": "awsui_divider-disabled_x7peu_y5tq5_111",
8
- "divider-active": "awsui_divider-active_x7peu_y5tq5_114",
9
- "resizer": "awsui_resizer_x7peu_y5tq5_118",
10
- "has-focus": "awsui_has-focus_x7peu_y5tq5_153",
11
- "tracker": "awsui_tracker_x7peu_y5tq5_173"
4
+ "resize-active": "awsui_resize-active_x7peu_sju2h_93",
5
+ "resize-active-with-focus": "awsui_resize-active-with-focus_x7peu_sju2h_93",
6
+ "divider": "awsui_divider_x7peu_sju2h_98",
7
+ "divider-disabled": "awsui_divider-disabled_x7peu_sju2h_111",
8
+ "divider-active": "awsui_divider-active_x7peu_sju2h_114",
9
+ "resizer": "awsui_resizer_x7peu_sju2h_118",
10
+ "has-focus": "awsui_has-focus_x7peu_sju2h_175",
11
+ "tracker": "awsui_tracker_x7peu_sju2h_195"
12
12
  };
13
13
 
@@ -90,13 +90,13 @@ surrounding text. (WCAG F73) https://www.w3.org/WAI/WCAG21/Techniques/failures/F
90
90
  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
91
91
  SPDX-License-Identifier: Apache-2.0
92
92
  */
93
- .awsui_resize-active_x7peu_y5tq5_93:not(#\9):not(.awsui_resize-active-with-focus_x7peu_y5tq5_93) * {
93
+ .awsui_resize-active_x7peu_sju2h_93:not(#\9):not(.awsui_resize-active-with-focus_x7peu_sju2h_93) * {
94
94
  cursor: col-resize;
95
95
  -webkit-user-select: none;
96
96
  user-select: none;
97
97
  }
98
98
 
99
- th:not(#\9):not(:last-child) > .awsui_divider_x7peu_y5tq5_98 {
99
+ th:not(#\9):not(:last-child) > .awsui_divider_x7peu_sju2h_98 {
100
100
  position: absolute;
101
101
  outline: none;
102
102
  pointer-events: none;
@@ -109,26 +109,26 @@ th:not(#\9):not(:last-child) > .awsui_divider_x7peu_y5tq5_98 {
109
109
  border-left: var(--border-item-width-0zxiwv, 1px) solid var(--color-border-divider-interactive-default-2k7xs4, #687078);
110
110
  box-sizing: border-box;
111
111
  }
112
- th:not(#\9):not(:last-child) > .awsui_divider-disabled_x7peu_y5tq5_111 {
112
+ th:not(#\9):not(:last-child) > .awsui_divider-disabled_x7peu_sju2h_111 {
113
113
  border-left-color: var(--color-border-divider-default-in8dkg, #eaeded);
114
114
  }
115
- th:not(#\9):not(:last-child) > .awsui_divider-active_x7peu_y5tq5_114 {
115
+ th:not(#\9):not(:last-child) > .awsui_divider-active_x7peu_sju2h_114 {
116
116
  border-left: 2px solid var(--color-border-divider-active-n0a8d4, #687078);
117
117
  }
118
118
 
119
- .awsui_resizer_x7peu_y5tq5_118:not(#\9) {
120
- /* stylelint-disable-next-line plugin/no-unsupported-browser-features */
119
+ .awsui_resizer_x7peu_sju2h_118:not(#\9) {
121
120
  border-collapse: separate;
122
121
  border-spacing: 0;
122
+ box-sizing: border-box;
123
123
  caption-side: top;
124
124
  cursor: auto;
125
- direction: ltr;
125
+ direction: inherit;
126
126
  empty-cells: show;
127
127
  font-family: serif;
128
128
  font-size: medium;
129
129
  font-style: normal;
130
130
  font-variant: normal;
131
- font-weight: normal;
131
+ font-weight: 400;
132
132
  font-stretch: normal;
133
133
  line-height: normal;
134
134
  -webkit-hyphens: none;
@@ -137,15 +137,12 @@ th:not(#\9):not(:last-child) > .awsui_divider-active_x7peu_y5tq5_114 {
137
137
  list-style: disc outside none;
138
138
  tab-size: 8;
139
139
  text-align: left;
140
- text-align-last: auto;
141
140
  text-indent: 0;
142
141
  text-shadow: none;
143
142
  text-transform: none;
144
143
  visibility: visible;
145
144
  white-space: normal;
146
- widows: 2;
147
145
  word-spacing: normal;
148
- box-sizing: border-box;
149
146
  font-size: var(--font-size-body-m-pa3mqb, 14px);
150
147
  line-height: var(--line-height-body-m-2zx78l, 22px);
151
148
  color: var(--color-text-body-default-ffdwgg, #16191f);
@@ -163,29 +160,29 @@ th:not(#\9):not(:last-child) > .awsui_divider-active_x7peu_y5tq5_114 {
163
160
  width: var(--space-l-xu1x80, 20px);
164
161
  z-index: 10;
165
162
  }
166
- .awsui_resizer_x7peu_y5tq5_118:not(#\9):focus {
163
+ .awsui_resizer_x7peu_sju2h_118:not(#\9):focus {
167
164
  outline: none;
168
165
  text-decoration: none;
169
166
  }
170
- .awsui_resize-active_x7peu_y5tq5_93 .awsui_resizer_x7peu_y5tq5_118:not(#\9) {
167
+ .awsui_resize-active_x7peu_sju2h_93 .awsui_resizer_x7peu_sju2h_118:not(#\9) {
171
168
  pointer-events: none;
172
169
  }
173
- th:not(#\9):last-child > .awsui_resizer_x7peu_y5tq5_118 {
170
+ th:not(#\9):last-child > .awsui_resizer_x7peu_sju2h_118 {
174
171
  width: calc(var(--space-l-xu1x80, 20px) / 2);
175
172
  right: 0;
176
173
  }
177
- .awsui_resizer_x7peu_y5tq5_118:not(#\9):hover + .awsui_divider_x7peu_y5tq5_98 {
174
+ .awsui_resizer_x7peu_sju2h_118:not(#\9):hover + .awsui_divider_x7peu_sju2h_98 {
178
175
  border-left: 2px solid var(--color-border-divider-active-n0a8d4, #687078);
179
176
  }
180
- body[data-awsui-focus-visible=true] .awsui_resizer_x7peu_y5tq5_118.awsui_has-focus_x7peu_y5tq5_153:not(#\9) {
177
+ body[data-awsui-focus-visible=true] .awsui_resizer_x7peu_sju2h_118.awsui_has-focus_x7peu_sju2h_175:not(#\9) {
181
178
  position: relative;
182
179
  position: absolute;
183
180
  }
184
- body[data-awsui-focus-visible=true] .awsui_resizer_x7peu_y5tq5_118.awsui_has-focus_x7peu_y5tq5_153:not(#\9) {
181
+ body[data-awsui-focus-visible=true] .awsui_resizer_x7peu_sju2h_118.awsui_has-focus_x7peu_sju2h_175:not(#\9) {
185
182
  outline: 2px dotted transparent;
186
183
  outline-offset: calc(calc(var(--space-table-header-focus-outline-gutter-czfdw1, 0px) - 2px) - 1px);
187
184
  }
188
- body[data-awsui-focus-visible=true] .awsui_resizer_x7peu_y5tq5_118.awsui_has-focus_x7peu_y5tq5_153:not(#\9)::before {
185
+ body[data-awsui-focus-visible=true] .awsui_resizer_x7peu_sju2h_118.awsui_has-focus_x7peu_sju2h_175:not(#\9)::before {
189
186
  content: " ";
190
187
  display: block;
191
188
  position: absolute;
@@ -197,7 +194,7 @@ body[data-awsui-focus-visible=true] .awsui_resizer_x7peu_y5tq5_118.awsui_has-foc
197
194
  box-shadow: 0 0 0 2px var(--color-border-item-focused-v8nq2m, #0073bb);
198
195
  }
199
196
 
200
- .awsui_tracker_x7peu_y5tq5_173:not(#\9) {
197
+ .awsui_tracker_x7peu_sju2h_195:not(#\9) {
201
198
  display: none;
202
199
  position: absolute;
203
200
  border-left: var(--border-divider-list-width-471u6a, 1px) dashed var(--color-border-divider-active-n0a8d4, #687078);
@@ -205,6 +202,6 @@ body[data-awsui-focus-visible=true] .awsui_resizer_x7peu_y5tq5_118.awsui_has-foc
205
202
  top: 0;
206
203
  bottom: 0;
207
204
  }
208
- .awsui_resize-active_x7peu_y5tq5_93 .awsui_tracker_x7peu_y5tq5_173:not(#\9) {
205
+ .awsui_resize-active_x7peu_sju2h_93 .awsui_tracker_x7peu_sju2h_195:not(#\9) {
209
206
  display: block;
210
207
  }
@@ -2,13 +2,13 @@
2
2
  // es-module interop with Babel and Typescript
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  module.exports.default = {
5
- "resize-active": "awsui_resize-active_x7peu_y5tq5_93",
6
- "resize-active-with-focus": "awsui_resize-active-with-focus_x7peu_y5tq5_93",
7
- "divider": "awsui_divider_x7peu_y5tq5_98",
8
- "divider-disabled": "awsui_divider-disabled_x7peu_y5tq5_111",
9
- "divider-active": "awsui_divider-active_x7peu_y5tq5_114",
10
- "resizer": "awsui_resizer_x7peu_y5tq5_118",
11
- "has-focus": "awsui_has-focus_x7peu_y5tq5_153",
12
- "tracker": "awsui_tracker_x7peu_y5tq5_173"
5
+ "resize-active": "awsui_resize-active_x7peu_sju2h_93",
6
+ "resize-active-with-focus": "awsui_resize-active-with-focus_x7peu_sju2h_93",
7
+ "divider": "awsui_divider_x7peu_sju2h_98",
8
+ "divider-disabled": "awsui_divider-disabled_x7peu_sju2h_111",
9
+ "divider-active": "awsui_divider-active_x7peu_sju2h_114",
10
+ "resizer": "awsui_resizer_x7peu_sju2h_118",
11
+ "has-focus": "awsui_has-focus_x7peu_sju2h_175",
12
+ "tracker": "awsui_tracker_x7peu_sju2h_195"
13
13
  };
14
14
 
@@ -1 +1 @@
1
- {"version":3,"file":"grid-navigation.d.ts","sourceRoot":"lib/default/","sources":["table/table-role/grid-navigation.tsx"],"names":[],"mappings":";AAcA,OAAO,EAAe,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAMhE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,eA2B/G"}
1
+ {"version":3,"file":"grid-navigation.d.ts","sourceRoot":"lib/default/","sources":["table/table-role/grid-navigation.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAe,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAWhE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,eAoC/G"}
@@ -1,11 +1,13 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import React from 'react';
3
4
  import { useEffect, useMemo } from 'react';
4
- import { defaultIsSuppressed, muteElementFocusables, restoreElementFocusables, getFirstFocusable, getFocusables, findTableRowByAriaRowIndex, findTableRowCellByAriaColIndex, setTabIndex, } from './utils';
5
+ import { defaultIsSuppressed, findTableRowByAriaRowIndex, findTableRowCellByAriaColIndex } from './utils';
5
6
  import { KeyCode } from '../../internal/keycode';
6
7
  import { useStableCallback } from '@cloudscape-design/component-toolkit/internal';
7
- import React from 'react';
8
8
  import { nodeBelongs } from '../../internal/utils/node-belongs';
9
+ import { getAllFocusables } from '../../internal/components/focus-lock/utils';
10
+ import { SingleTabStopNavigationContext, } from '../../internal/context/single-tab-stop-navigation-context';
9
11
  /**
10
12
  * Makes table navigable with keyboard commands.
11
13
  * See grid-navigation.md
@@ -31,7 +33,10 @@ export function GridNavigationProvider({ keyboardNavigation, pageSize, getTable,
31
33
  gridNavigation.refresh();
32
34
  }
33
35
  });
34
- return React.createElement(React.Fragment, null, children);
36
+ return (React.createElement(SingleTabStopNavigationContext.Provider, { value: {
37
+ navigationActive: keyboardNavigation,
38
+ registerFocusable: gridNavigation.registerFocusable,
39
+ } }, children));
35
40
  }
36
41
  /**
37
42
  * This helper encapsulates the grid navigation behaviors which are:
@@ -46,6 +51,19 @@ class GridNavigationProcessor {
46
51
  this._table = null;
47
52
  // State
48
53
  this.focusedCell = null;
54
+ this.focusables = new Set();
55
+ this.focusHandlers = new Map();
56
+ this.focusTarget = null;
57
+ this.registerFocusable = (focusable, changeHandler) => {
58
+ this.focusables.add(focusable);
59
+ this.focusHandlers.set(focusable, changeHandler);
60
+ changeHandler(this.focusTarget, this.isSuppressed(focusable.current));
61
+ return () => this.unregisterFocusable(focusable);
62
+ };
63
+ this.unregisterFocusable = (focusable) => {
64
+ this.focusables.delete(focusable);
65
+ this.focusHandlers.delete(focusable);
66
+ };
49
67
  this.onFocusin = (event) => {
50
68
  var _a;
51
69
  if (!(event.target instanceof HTMLElement)) {
@@ -56,11 +74,11 @@ class GridNavigationProcessor {
56
74
  return;
57
75
  }
58
76
  this.focusedCell = cell;
59
- this.ensureSingleFocusable();
77
+ this.updateFocusTarget();
60
78
  // Focusing on cell is not eligible when it contains focusable elements in the content.
61
79
  // If content focusables are available - move the focus to the first one.
62
80
  if (cell.element === cell.cellElement) {
63
- (_a = getFirstFocusable(cell.cellElement)) === null || _a === void 0 ? void 0 : _a.focus();
81
+ (_a = this.getFocusablesFrom(cell.cellElement)[0]) === null || _a === void 0 ? void 0 : _a.focus();
64
82
  }
65
83
  };
66
84
  this.onFocusout = () => {
@@ -91,8 +109,7 @@ class GridNavigationProcessor {
91
109
  const from = this.focusedCell;
92
110
  const minExtreme = Number.NEGATIVE_INFINITY;
93
111
  const maxExtreme = Number.POSITIVE_INFINITY;
94
- // Do not intercept any keys when the navigation is suppressed.
95
- if (this.isSuppressed(from.element)) {
112
+ if (this.isSuppressed(document.activeElement) || !this.isRegistered(document.activeElement)) {
96
113
  return;
97
114
  }
98
115
  switch (key) {
@@ -130,18 +147,27 @@ class GridNavigationProcessor {
130
147
  return;
131
148
  }
132
149
  };
150
+ this.getRegisteredElements = () => {
151
+ const registeredElements = new Set();
152
+ for (const focusable of this.focusables) {
153
+ if (focusable.current) {
154
+ registeredElements.add(focusable.current);
155
+ }
156
+ }
157
+ return registeredElements;
158
+ };
133
159
  }
134
160
  init(table) {
135
161
  this._table = table;
136
162
  this.table.addEventListener('focusin', this.onFocusin);
137
163
  this.table.addEventListener('focusout', this.onFocusout);
138
164
  this.table.addEventListener('keydown', this.onKeydown);
139
- this.ensureSingleFocusable();
165
+ this.updateFocusTarget();
140
166
  this.cleanup = () => {
141
167
  this.table.removeEventListener('focusin', this.onFocusin);
142
168
  this.table.removeEventListener('focusout', this.onFocusout);
143
169
  this.table.removeEventListener('keydown', this.onKeydown);
144
- restoreElementFocusables(this.table);
170
+ this.focusables.forEach(this.unregisterFocusable);
145
171
  };
146
172
  }
147
173
  cleanup() {
@@ -151,14 +177,16 @@ class GridNavigationProcessor {
151
177
  this._pageSize = pageSize;
152
178
  }
153
179
  refresh() {
154
- if (this._table) {
155
- // Update focused cell indices in case table rows, columns, or firstIndex change.
156
- if (this.focusedCell) {
157
- this.focusedCell = this.findFocusedCell(this.focusedCell.element);
180
+ // Timeout ensures the newly rendered content elements are registered.
181
+ setTimeout(() => {
182
+ if (this._table) {
183
+ // Update focused cell indices in case table rows, columns, or firstIndex change.
184
+ if (this.focusedCell) {
185
+ this.focusedCell = this.findFocusedCell(this.focusedCell.element);
186
+ }
187
+ this.updateFocusTarget();
158
188
  }
159
- // Ensure newly added elements if any are muted.
160
- this.ensureSingleFocusable();
161
- }
189
+ }, 0);
162
190
  }
163
191
  get pageSize() {
164
192
  return this._pageSize;
@@ -169,36 +197,40 @@ class GridNavigationProcessor {
169
197
  }
170
198
  return this._table;
171
199
  }
172
- isSuppressed(focusedElement) {
173
- return defaultIsSuppressed(focusedElement);
174
- }
175
200
  moveFocusBy(cell, delta) {
176
201
  var _a;
177
202
  (_a = this.getNextFocusable(cell, delta)) === null || _a === void 0 ? void 0 : _a.focus();
178
203
  }
179
- /**
180
- * Finds focused cell props corresponding the focused element inside the table.
181
- * The function relies on ARIA colindex/rowindex attributes being correctly applied.
182
- */
204
+ updateFocusTarget() {
205
+ this.focusTarget = this.getSingleFocusable();
206
+ this.focusables.forEach(focusable => {
207
+ const element = focusable.current;
208
+ const handler = this.focusHandlers.get(focusable);
209
+ handler(this.focusTarget, this.isSuppressed(element));
210
+ });
211
+ }
212
+ isSuppressed(element) {
213
+ return !element || defaultIsSuppressed(element);
214
+ }
215
+ isRegistered(element) {
216
+ return !element || this.getRegisteredElements().has(element);
217
+ }
183
218
  findFocusedCell(focusedElement) {
184
219
  var _a, _b;
185
220
  const cellElement = focusedElement.closest('td,th');
186
221
  const rowElement = cellElement === null || cellElement === void 0 ? void 0 : cellElement.closest('tr');
187
222
  if (!cellElement || !rowElement) {
188
- return null;
223
+ return this.focusedCell;
189
224
  }
190
225
  const colIndex = parseInt((_a = cellElement.getAttribute('aria-colindex')) !== null && _a !== void 0 ? _a : '');
191
226
  const rowIndex = parseInt((_b = rowElement.getAttribute('aria-rowindex')) !== null && _b !== void 0 ? _b : '');
192
227
  if (isNaN(colIndex) || isNaN(rowIndex)) {
193
- return null;
228
+ return this.focusedCell;
194
229
  }
195
- const cellFocusables = getFocusables(cellElement);
230
+ const cellFocusables = this.getFocusablesFrom(cellElement);
196
231
  const elementIndex = cellFocusables.indexOf(focusedElement);
197
232
  return { rowIndex, colIndex, rowElement, cellElement, element: focusedElement, elementIndex };
198
233
  }
199
- /**
200
- * Finds element to be focused next. The focus can transition between cells or interactive elements inside cells.
201
- */
202
234
  getNextFocusable(from, delta) {
203
235
  var _a;
204
236
  // Find next row to move focus into (can be null if the top/bottom is reached).
@@ -208,7 +240,7 @@ class GridNavigationProcessor {
208
240
  return null;
209
241
  }
210
242
  // Return next interactive cell content element if available.
211
- const cellFocusables = getFocusables(from.cellElement);
243
+ const cellFocusables = this.getFocusablesFrom(from.cellElement);
212
244
  const nextElementIndex = from.elementIndex + delta.x;
213
245
  if (delta.x && from.elementIndex !== -1 && 0 <= nextElementIndex && nextElementIndex < cellFocusables.length) {
214
246
  return cellFocusables[nextElementIndex];
@@ -224,27 +256,27 @@ class GridNavigationProcessor {
224
256
  return null;
225
257
  }
226
258
  // Return cell interactive content or the cell itself.
227
- const targetCellFocusables = getFocusables(targetCell);
259
+ const targetCellFocusables = this.getFocusablesFrom(targetCell);
228
260
  const focusIndex = delta.x < 0 ? targetCellFocusables.length - 1 : delta.x > 0 ? 0 : from.elementIndex;
229
261
  const focusTarget = (_a = targetCellFocusables[focusIndex]) !== null && _a !== void 0 ? _a : targetCell;
230
262
  return focusTarget;
231
263
  }
232
- /**
233
- * Makes the cell element, the first interactive element or the first cell of the table user-focusable.
234
- */
235
- ensureSingleFocusable() {
264
+ getSingleFocusable() {
236
265
  var _a;
237
- const cellSuppressed = this.focusedCell ? this.isSuppressed(this.focusedCell.element) : false;
238
- muteElementFocusables(this.table, cellSuppressed);
266
+ const cell = this.focusedCell;
239
267
  const firstTableCell = this.table.querySelector('td,th');
240
268
  // A single element of the table is made user-focusable.
241
269
  // It defaults to the first interactive element of the first cell or the first cell itself otherwise.
242
- let focusTarget = (_a = (firstTableCell && getFocusables(firstTableCell)[0])) !== null && _a !== void 0 ? _a : firstTableCell;
270
+ let focusTarget = (_a = (firstTableCell && this.getFocusablesFrom(firstTableCell)[0])) !== null && _a !== void 0 ? _a : firstTableCell;
243
271
  // When a navigation-focused element is present in the table it is used for user-navigation instead.
244
- if (this.focusedCell) {
245
- focusTarget = this.getNextFocusable(this.focusedCell, { x: 0, y: 0 });
272
+ if (cell) {
273
+ focusTarget = this.getNextFocusable(cell, { x: 0, y: 0 });
246
274
  }
247
- setTabIndex(focusTarget, 0);
275
+ return focusTarget;
276
+ }
277
+ getFocusablesFrom(target) {
278
+ const registeredElements = this.getRegisteredElements();
279
+ return getAllFocusables(target).filter(el => registeredElements.has(el));
248
280
  }
249
281
  }
250
282
  //# sourceMappingURL=grid-navigation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grid-navigation.js","sourceRoot":"lib/default/","sources":["table/table-role/grid-navigation.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useEffect, useMemo } from 'react';\nimport {\n defaultIsSuppressed,\n muteElementFocusables,\n restoreElementFocusables,\n getFirstFocusable,\n getFocusables,\n findTableRowByAriaRowIndex,\n findTableRowCellByAriaColIndex,\n setTabIndex,\n} from './utils';\nimport { FocusedCell, GridNavigationProps } from './interfaces';\nimport { KeyCode } from '../../internal/keycode';\nimport { useStableCallback } from '@cloudscape-design/component-toolkit/internal';\nimport React from 'react';\nimport { nodeBelongs } from '../../internal/utils/node-belongs';\n\n/**\n * Makes table navigable with keyboard commands.\n * See grid-navigation.md\n */\nexport function GridNavigationProvider({ keyboardNavigation, pageSize, getTable, children }: GridNavigationProps) {\n const gridNavigation = useMemo(() => new GridNavigationProcessor(), []);\n\n const getTableStable = useStableCallback(getTable);\n\n // Initialize the processor with the table container assuming it is mounted synchronously and only once.\n useEffect(() => {\n if (keyboardNavigation) {\n const table = getTableStable();\n table && gridNavigation.init(table);\n }\n return () => gridNavigation.cleanup();\n }, [keyboardNavigation, gridNavigation, getTableStable]);\n\n // Notify the processor of the props change.\n useEffect(() => {\n gridNavigation.update({ pageSize });\n }, [gridNavigation, pageSize]);\n\n // Notify the processor of the new render.\n useEffect(() => {\n if (keyboardNavigation) {\n gridNavigation.refresh();\n }\n });\n\n return <>{children}</>;\n}\n\n/**\n * This helper encapsulates the grid navigation behaviors which are:\n * 1. Responding to keyboard commands and moving the focus accordingly;\n * 2. Muting table interactive elements for only one to be user-focusable at a time;\n * 3. Suppressing the above behaviors when focusing an element inside a dialog or when instructed explicitly.\n */\nclass GridNavigationProcessor {\n // Props\n private _pageSize = 0;\n private _table: null | HTMLTableElement = null;\n\n // State\n private focusedCell: null | FocusedCell = null;\n\n public init(table: HTMLTableElement) {\n this._table = table;\n\n this.table.addEventListener('focusin', this.onFocusin);\n this.table.addEventListener('focusout', this.onFocusout);\n this.table.addEventListener('keydown', this.onKeydown);\n\n this.ensureSingleFocusable();\n\n this.cleanup = () => {\n this.table.removeEventListener('focusin', this.onFocusin);\n this.table.removeEventListener('focusout', this.onFocusout);\n this.table.removeEventListener('keydown', this.onKeydown);\n\n restoreElementFocusables(this.table);\n };\n }\n\n public cleanup() {\n // Do nothing before initialized.\n }\n\n public update({ pageSize }: { pageSize: number }) {\n this._pageSize = pageSize;\n }\n\n public refresh() {\n if (this._table) {\n // Update focused cell indices in case table rows, columns, or firstIndex change.\n if (this.focusedCell) {\n this.focusedCell = this.findFocusedCell(this.focusedCell.element);\n }\n\n // Ensure newly added elements if any are muted.\n this.ensureSingleFocusable();\n }\n }\n\n private get pageSize() {\n return this._pageSize;\n }\n\n private get table(): HTMLTableElement {\n if (!this._table) {\n throw new Error('Invariant violation: GridNavigationProcessor is used before initialization.');\n }\n return this._table;\n }\n\n private isSuppressed(focusedElement: HTMLElement): boolean {\n return defaultIsSuppressed(focusedElement);\n }\n\n private onFocusin = (event: FocusEvent) => {\n if (!(event.target instanceof HTMLElement)) {\n return;\n }\n\n const cell = this.findFocusedCell(event.target);\n if (!cell) {\n return;\n }\n\n this.focusedCell = cell;\n\n this.ensureSingleFocusable();\n\n // Focusing on cell is not eligible when it contains focusable elements in the content.\n // If content focusables are available - move the focus to the first one.\n if (cell.element === cell.cellElement) {\n getFirstFocusable(cell.cellElement)?.focus();\n }\n };\n\n private onFocusout = () => {\n // When focus leaves the cell and the cell no longer belong to the table it indicates the focused element has been unmounted.\n // In that case the focus needs to be restored on the same coordinates.\n setTimeout(() => {\n if (this.focusedCell && !nodeBelongs(this.table, this.focusedCell.element)) {\n this.moveFocusBy(this.focusedCell, { x: 0, y: 0 });\n }\n }, 0);\n };\n\n private onKeydown = (event: KeyboardEvent) => {\n if (!this.focusedCell) {\n return;\n }\n\n const ctrlKey = event.ctrlKey ? 1 : 0;\n const altKey = event.altKey ? 1 : 0;\n const shiftKey = event.shiftKey ? 1 : 0;\n const metaKey = event.metaKey ? 1 : 0;\n const numModifiersPressed = ctrlKey + altKey + shiftKey + metaKey;\n\n let key = event.keyCode;\n if (numModifiersPressed === 1 && event.ctrlKey) {\n key = -key;\n } else if (numModifiersPressed) {\n return;\n }\n\n const from = this.focusedCell;\n const minExtreme = Number.NEGATIVE_INFINITY;\n const maxExtreme = Number.POSITIVE_INFINITY;\n\n // Do not intercept any keys when the navigation is suppressed.\n if (this.isSuppressed(from.element)) {\n return;\n }\n\n switch (key) {\n case KeyCode.up:\n event.preventDefault();\n return this.moveFocusBy(from, { y: -1, x: 0 });\n\n case KeyCode.down:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 1, x: 0 });\n\n case KeyCode.left:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 0, x: -1 });\n\n case KeyCode.right:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 0, x: 1 });\n\n case KeyCode.pageUp:\n event.preventDefault();\n return this.moveFocusBy(from, { y: -this.pageSize, x: 0 });\n\n case KeyCode.pageDown:\n event.preventDefault();\n return this.moveFocusBy(from, { y: this.pageSize, x: 0 });\n\n case KeyCode.home:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 0, x: minExtreme });\n\n case KeyCode.end:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 0, x: maxExtreme });\n\n case -KeyCode.home:\n event.preventDefault();\n return this.moveFocusBy(from, { y: minExtreme, x: minExtreme });\n\n case -KeyCode.end:\n event.preventDefault();\n return this.moveFocusBy(from, { y: maxExtreme, x: maxExtreme });\n\n default:\n return;\n }\n };\n\n private moveFocusBy(cell: FocusedCell, delta: { x: number; y: number }) {\n this.getNextFocusable(cell, delta)?.focus();\n }\n\n /**\n * Finds focused cell props corresponding the focused element inside the table.\n * The function relies on ARIA colindex/rowindex attributes being correctly applied.\n */\n private findFocusedCell(focusedElement: HTMLElement): null | FocusedCell {\n const cellElement = focusedElement.closest('td,th') as null | HTMLTableCellElement;\n const rowElement = cellElement?.closest('tr');\n\n if (!cellElement || !rowElement) {\n return null;\n }\n\n const colIndex = parseInt(cellElement.getAttribute('aria-colindex') ?? '');\n const rowIndex = parseInt(rowElement.getAttribute('aria-rowindex') ?? '');\n if (isNaN(colIndex) || isNaN(rowIndex)) {\n return null;\n }\n\n const cellFocusables = getFocusables(cellElement);\n const elementIndex = cellFocusables.indexOf(focusedElement);\n\n return { rowIndex, colIndex, rowElement, cellElement, element: focusedElement, elementIndex };\n }\n\n /**\n * Finds element to be focused next. The focus can transition between cells or interactive elements inside cells.\n */\n private getNextFocusable(from: FocusedCell, delta: { y: number; x: number }) {\n // Find next row to move focus into (can be null if the top/bottom is reached).\n const targetAriaRowIndex = from.rowIndex + delta.y;\n const targetRow = findTableRowByAriaRowIndex(this.table, targetAriaRowIndex, delta.y);\n if (!targetRow) {\n return null;\n }\n\n // Return next interactive cell content element if available.\n const cellFocusables = getFocusables(from.cellElement);\n const nextElementIndex = from.elementIndex + delta.x;\n if (delta.x && from.elementIndex !== -1 && 0 <= nextElementIndex && nextElementIndex < cellFocusables.length) {\n return cellFocusables[nextElementIndex];\n }\n\n // Find next cell to focus or move focus into (can be null if the left/right edge is reached).\n const targetAriaColIndex = from.colIndex + delta.x;\n const targetCell = findTableRowCellByAriaColIndex(targetRow, targetAriaColIndex, delta.x);\n if (!targetCell) {\n return null;\n }\n\n // When target cell matches the current cell it means we reached the left or right boundary.\n if (targetCell === from.cellElement && delta.x !== 0) {\n return null;\n }\n\n // Return cell interactive content or the cell itself.\n const targetCellFocusables = getFocusables(targetCell);\n const focusIndex = delta.x < 0 ? targetCellFocusables.length - 1 : delta.x > 0 ? 0 : from.elementIndex;\n const focusTarget = targetCellFocusables[focusIndex] ?? targetCell;\n return focusTarget;\n }\n\n /**\n * Makes the cell element, the first interactive element or the first cell of the table user-focusable.\n */\n private ensureSingleFocusable() {\n const cellSuppressed = this.focusedCell ? this.isSuppressed(this.focusedCell.element) : false;\n muteElementFocusables(this.table, cellSuppressed);\n\n const firstTableCell = this.table.querySelector('td,th') as null | HTMLTableCellElement;\n\n // A single element of the table is made user-focusable.\n // It defaults to the first interactive element of the first cell or the first cell itself otherwise.\n let focusTarget: null | HTMLElement = (firstTableCell && getFocusables(firstTableCell)[0]) ?? firstTableCell;\n\n // When a navigation-focused element is present in the table it is used for user-navigation instead.\n if (this.focusedCell) {\n focusTarget = this.getNextFocusable(this.focusedCell, { x: 0, y: 0 });\n }\n\n setTabIndex(focusTarget, 0);\n }\n}\n"]}
1
+ {"version":3,"file":"grid-navigation.js","sourceRoot":"lib/default/","sources":["table/table-role/grid-navigation.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,8BAA8B,EAAE,MAAM,SAAS,CAAC;AAE1G,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EACL,8BAA8B,GAG/B,MAAM,2DAA2D,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAuB;IAC9G,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,uBAAuB,EAAE,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEnD,wGAAwG;IACxG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,kBAAkB,EAAE;YACtB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;YAC/B,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrC;QACD,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC,EAAE,CAAC,kBAAkB,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;IAEzD,4CAA4C;IAC5C,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE/B,0CAA0C;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,kBAAkB,EAAE;YACtB,cAAc,CAAC,OAAO,EAAE,CAAC;SAC1B;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,oBAAC,8BAA8B,CAAC,QAAQ,IACtC,KAAK,EAAE;YACL,gBAAgB,EAAE,kBAAkB;YACpC,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;SACpD,IAEA,QAAQ,CAC+B,CAC3C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,uBAAuB;IAA7B;QACE,QAAQ;QACA,cAAS,GAAG,CAAC,CAAC;QACd,WAAM,GAA4B,IAAI,CAAC;QAE/C,QAAQ;QACA,gBAAW,GAAuB,IAAI,CAAC;QACvC,eAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC5C,kBAAa,GAAG,IAAI,GAAG,EAA+C,CAAC;QACvE,gBAAW,GAAmB,IAAI,CAAC;QAwCpC,sBAAiB,GAAG,CAAC,SAA8B,EAAE,aAAqC,EAAE,EAAE;YACnG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACjD,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACtE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC,CAAC;QAEK,wBAAmB,GAAG,CAAC,SAA8B,EAAE,EAAE;YAC9D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC,CAAC;QAaM,cAAS,GAAG,CAAC,KAAiB,EAAE,EAAE;;YACxC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,WAAW,CAAC,EAAE;gBAC1C,OAAO;aACR;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,EAAE;gBACT,OAAO;aACR;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAExB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAEzB,uFAAuF;YACvF,yEAAyE;YACzE,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE;gBACrC,MAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,0CAAE,KAAK,EAAE,CAAC;aACtD;QACH,CAAC,CAAC;QAEM,eAAU,GAAG,GAAG,EAAE;YACxB,6HAA6H;YAC7H,uEAAuE;YACvE,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;oBAC1E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;iBACpD;YACH,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,CAAC,CAAC;QAEM,cAAS,GAAG,CAAC,KAAoB,EAAE,EAAE;YAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrB,OAAO;aACR;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,mBAAmB,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;YAElE,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,IAAI,mBAAmB,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;gBAC9C,GAAG,GAAG,CAAC,GAAG,CAAC;aACZ;iBAAM,IAAI,mBAAmB,EAAE;gBAC9B,OAAO;aACR;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;YAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;YAE5C,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;gBAC3F,OAAO;aACR;YAED,QAAQ,GAAG,EAAE;gBACX,KAAK,OAAO,CAAC,EAAE;oBACb,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAEjD,KAAK,OAAO,CAAC,IAAI;oBACf,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAEhD,KAAK,OAAO,CAAC,IAAI;oBACf,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAEjD,KAAK,OAAO,CAAC,KAAK;oBAChB,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAEhD,KAAK,OAAO,CAAC,MAAM;oBACjB,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAE7D,KAAK,OAAO,CAAC,QAAQ;oBACnB,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAE5D,KAAK,OAAO,CAAC,IAAI;oBACf,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;gBAEzD,KAAK,OAAO,CAAC,GAAG;oBACd,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;gBAEzD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;gBAElE,KAAK,CAAC,OAAO,CAAC,GAAG;oBACf,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;gBAElE;oBACE,OAAO;aACV;QACH,CAAC,CAAC;QAuBM,0BAAqB,GAAG,GAAiB,EAAE;YACjD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAW,CAAC;YAC9C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;gBACvC,IAAI,SAAS,CAAC,OAAO,EAAE;oBACrB,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;iBAC3C;aACF;YACD,OAAO,kBAAkB,CAAC;QAC5B,CAAC,CAAC;IA6EJ,CAAC;IA9QQ,IAAI,CAAC,KAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;YAClB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACpD,CAAC,CAAC;IACJ,CAAC;IAEM,OAAO;QACZ,iCAAiC;IACnC,CAAC;IAEM,MAAM,CAAC,EAAE,QAAQ,EAAwB;QAC9C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAEM,OAAO;QACZ,sEAAsE;QACtE,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,iFAAiF;gBACjF,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;iBACnE;gBACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;aAC1B;QACH,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAcD,IAAY,QAAQ;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAY,KAAK;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;SAChG;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAyGO,WAAW,CAAC,IAAiB,EAAE,KAA+B;;QACpE,MAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,0CAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAClC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,OAAuB;QAC1C,OAAO,CAAC,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAEO,YAAY,CAAC,OAAuB;QAC1C,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAYO,eAAe,CAAC,cAA2B;;QACjD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAgC,CAAC;QACnF,MAAM,UAAU,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE;YAC/B,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAA,WAAW,CAAC,YAAY,CAAC,eAAe,CAAC,mCAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAA,UAAU,CAAC,YAAY,CAAC,eAAe,CAAC,mCAAI,EAAE,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;YACtC,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAE5D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;IAChG,CAAC;IAEO,gBAAgB,CAAC,IAAiB,EAAE,KAA+B;;QACzE,+EAA+E;QAC/E,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,0BAA0B,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,IAAI,CAAC;SACb;QAED,6DAA6D;QAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,gBAAgB,IAAI,gBAAgB,GAAG,cAAc,CAAC,MAAM,EAAE;YAC5G,OAAO,cAAc,CAAC,gBAAgB,CAAC,CAAC;SACzC;QAED,8FAA8F;QAC9F,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,8BAA8B,CAAC,SAAS,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,IAAI,CAAC;SACb;QAED,4FAA4F;QAC5F,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE;YACpD,OAAO,IAAI,CAAC;SACb;QAED,sDAAsD;QACtD,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;QACvG,MAAM,WAAW,GAAG,MAAA,oBAAoB,CAAC,UAAU,CAAC,mCAAI,UAAU,CAAC;QACnE,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,kBAAkB;;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAgC,CAAC;QAExF,wDAAwD;QACxD,qGAAqG;QACrG,IAAI,WAAW,GACb,MAAA,CAAC,cAAc,IAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAI,cAAc,CAAC;QAElF,oGAAoG;QACpG,IAAI,IAAI,EAAE;YACR,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC3D;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,iBAAiB,CAAC,MAAmB;QAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport React from 'react';\nimport { useEffect, useMemo } from 'react';\nimport { defaultIsSuppressed, findTableRowByAriaRowIndex, findTableRowCellByAriaColIndex } from './utils';\nimport { FocusedCell, GridNavigationProps } from './interfaces';\nimport { KeyCode } from '../../internal/keycode';\nimport { useStableCallback } from '@cloudscape-design/component-toolkit/internal';\nimport { nodeBelongs } from '../../internal/utils/node-belongs';\nimport { getAllFocusables } from '../../internal/components/focus-lock/utils';\nimport {\n SingleTabStopNavigationContext,\n FocusableDefinition,\n FocusableChangeHandler,\n} from '../../internal/context/single-tab-stop-navigation-context';\n\n/**\n * Makes table navigable with keyboard commands.\n * See grid-navigation.md\n */\nexport function GridNavigationProvider({ keyboardNavigation, pageSize, getTable, children }: GridNavigationProps) {\n const gridNavigation = useMemo(() => new GridNavigationProcessor(), []);\n\n const getTableStable = useStableCallback(getTable);\n\n // Initialize the processor with the table container assuming it is mounted synchronously and only once.\n useEffect(() => {\n if (keyboardNavigation) {\n const table = getTableStable();\n table && gridNavigation.init(table);\n }\n return () => gridNavigation.cleanup();\n }, [keyboardNavigation, gridNavigation, getTableStable]);\n\n // Notify the processor of the props change.\n useEffect(() => {\n gridNavigation.update({ pageSize });\n }, [gridNavigation, pageSize]);\n\n // Notify the processor of the new render.\n useEffect(() => {\n if (keyboardNavigation) {\n gridNavigation.refresh();\n }\n });\n\n return (\n <SingleTabStopNavigationContext.Provider\n value={{\n navigationActive: keyboardNavigation,\n registerFocusable: gridNavigation.registerFocusable,\n }}\n >\n {children}\n </SingleTabStopNavigationContext.Provider>\n );\n}\n\n/**\n * This helper encapsulates the grid navigation behaviors which are:\n * 1. Responding to keyboard commands and moving the focus accordingly;\n * 2. Muting table interactive elements for only one to be user-focusable at a time;\n * 3. Suppressing the above behaviors when focusing an element inside a dialog or when instructed explicitly.\n */\nclass GridNavigationProcessor {\n // Props\n private _pageSize = 0;\n private _table: null | HTMLTableElement = null;\n\n // State\n private focusedCell: null | FocusedCell = null;\n private focusables = new Set<FocusableDefinition>();\n private focusHandlers = new Map<FocusableDefinition, FocusableChangeHandler>();\n private focusTarget: null | Element = null;\n\n public init(table: HTMLTableElement) {\n this._table = table;\n\n this.table.addEventListener('focusin', this.onFocusin);\n this.table.addEventListener('focusout', this.onFocusout);\n this.table.addEventListener('keydown', this.onKeydown);\n\n this.updateFocusTarget();\n\n this.cleanup = () => {\n this.table.removeEventListener('focusin', this.onFocusin);\n this.table.removeEventListener('focusout', this.onFocusout);\n this.table.removeEventListener('keydown', this.onKeydown);\n this.focusables.forEach(this.unregisterFocusable);\n };\n }\n\n public cleanup() {\n // Do nothing before initialized.\n }\n\n public update({ pageSize }: { pageSize: number }) {\n this._pageSize = pageSize;\n }\n\n public refresh() {\n // Timeout ensures the newly rendered content elements are registered.\n setTimeout(() => {\n if (this._table) {\n // Update focused cell indices in case table rows, columns, or firstIndex change.\n if (this.focusedCell) {\n this.focusedCell = this.findFocusedCell(this.focusedCell.element);\n }\n this.updateFocusTarget();\n }\n }, 0);\n }\n\n public registerFocusable = (focusable: FocusableDefinition, changeHandler: FocusableChangeHandler) => {\n this.focusables.add(focusable);\n this.focusHandlers.set(focusable, changeHandler);\n changeHandler(this.focusTarget, this.isSuppressed(focusable.current));\n return () => this.unregisterFocusable(focusable);\n };\n\n public unregisterFocusable = (focusable: FocusableDefinition) => {\n this.focusables.delete(focusable);\n this.focusHandlers.delete(focusable);\n };\n\n private get pageSize() {\n return this._pageSize;\n }\n\n private get table(): HTMLTableElement {\n if (!this._table) {\n throw new Error('Invariant violation: GridNavigationProcessor is used before initialization.');\n }\n return this._table;\n }\n\n private onFocusin = (event: FocusEvent) => {\n if (!(event.target instanceof HTMLElement)) {\n return;\n }\n\n const cell = this.findFocusedCell(event.target);\n if (!cell) {\n return;\n }\n\n this.focusedCell = cell;\n\n this.updateFocusTarget();\n\n // Focusing on cell is not eligible when it contains focusable elements in the content.\n // If content focusables are available - move the focus to the first one.\n if (cell.element === cell.cellElement) {\n this.getFocusablesFrom(cell.cellElement)[0]?.focus();\n }\n };\n\n private onFocusout = () => {\n // When focus leaves the cell and the cell no longer belong to the table it indicates the focused element has been unmounted.\n // In that case the focus needs to be restored on the same coordinates.\n setTimeout(() => {\n if (this.focusedCell && !nodeBelongs(this.table, this.focusedCell.element)) {\n this.moveFocusBy(this.focusedCell, { x: 0, y: 0 });\n }\n }, 0);\n };\n\n private onKeydown = (event: KeyboardEvent) => {\n if (!this.focusedCell) {\n return;\n }\n\n const ctrlKey = event.ctrlKey ? 1 : 0;\n const altKey = event.altKey ? 1 : 0;\n const shiftKey = event.shiftKey ? 1 : 0;\n const metaKey = event.metaKey ? 1 : 0;\n const numModifiersPressed = ctrlKey + altKey + shiftKey + metaKey;\n\n let key = event.keyCode;\n if (numModifiersPressed === 1 && event.ctrlKey) {\n key = -key;\n } else if (numModifiersPressed) {\n return;\n }\n\n const from = this.focusedCell;\n const minExtreme = Number.NEGATIVE_INFINITY;\n const maxExtreme = Number.POSITIVE_INFINITY;\n\n if (this.isSuppressed(document.activeElement) || !this.isRegistered(document.activeElement)) {\n return;\n }\n\n switch (key) {\n case KeyCode.up:\n event.preventDefault();\n return this.moveFocusBy(from, { y: -1, x: 0 });\n\n case KeyCode.down:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 1, x: 0 });\n\n case KeyCode.left:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 0, x: -1 });\n\n case KeyCode.right:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 0, x: 1 });\n\n case KeyCode.pageUp:\n event.preventDefault();\n return this.moveFocusBy(from, { y: -this.pageSize, x: 0 });\n\n case KeyCode.pageDown:\n event.preventDefault();\n return this.moveFocusBy(from, { y: this.pageSize, x: 0 });\n\n case KeyCode.home:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 0, x: minExtreme });\n\n case KeyCode.end:\n event.preventDefault();\n return this.moveFocusBy(from, { y: 0, x: maxExtreme });\n\n case -KeyCode.home:\n event.preventDefault();\n return this.moveFocusBy(from, { y: minExtreme, x: minExtreme });\n\n case -KeyCode.end:\n event.preventDefault();\n return this.moveFocusBy(from, { y: maxExtreme, x: maxExtreme });\n\n default:\n return;\n }\n };\n\n private moveFocusBy(cell: FocusedCell, delta: { x: number; y: number }) {\n this.getNextFocusable(cell, delta)?.focus();\n }\n\n private updateFocusTarget() {\n this.focusTarget = this.getSingleFocusable();\n this.focusables.forEach(focusable => {\n const element = focusable.current;\n const handler = this.focusHandlers.get(focusable)!;\n handler(this.focusTarget, this.isSuppressed(element));\n });\n }\n\n private isSuppressed(element: null | Element) {\n return !element || defaultIsSuppressed(element);\n }\n\n private isRegistered(element: null | Element) {\n return !element || this.getRegisteredElements().has(element);\n }\n\n private getRegisteredElements = (): Set<Element> => {\n const registeredElements = new Set<Element>();\n for (const focusable of this.focusables) {\n if (focusable.current) {\n registeredElements.add(focusable.current);\n }\n }\n return registeredElements;\n };\n\n private findFocusedCell(focusedElement: HTMLElement): null | FocusedCell {\n const cellElement = focusedElement.closest('td,th') as null | HTMLTableCellElement;\n const rowElement = cellElement?.closest('tr');\n\n if (!cellElement || !rowElement) {\n return this.focusedCell;\n }\n\n const colIndex = parseInt(cellElement.getAttribute('aria-colindex') ?? '');\n const rowIndex = parseInt(rowElement.getAttribute('aria-rowindex') ?? '');\n if (isNaN(colIndex) || isNaN(rowIndex)) {\n return this.focusedCell;\n }\n\n const cellFocusables = this.getFocusablesFrom(cellElement);\n const elementIndex = cellFocusables.indexOf(focusedElement);\n\n return { rowIndex, colIndex, rowElement, cellElement, element: focusedElement, elementIndex };\n }\n\n private getNextFocusable(from: FocusedCell, delta: { y: number; x: number }) {\n // Find next row to move focus into (can be null if the top/bottom is reached).\n const targetAriaRowIndex = from.rowIndex + delta.y;\n const targetRow = findTableRowByAriaRowIndex(this.table, targetAriaRowIndex, delta.y);\n if (!targetRow) {\n return null;\n }\n\n // Return next interactive cell content element if available.\n const cellFocusables = this.getFocusablesFrom(from.cellElement);\n const nextElementIndex = from.elementIndex + delta.x;\n if (delta.x && from.elementIndex !== -1 && 0 <= nextElementIndex && nextElementIndex < cellFocusables.length) {\n return cellFocusables[nextElementIndex];\n }\n\n // Find next cell to focus or move focus into (can be null if the left/right edge is reached).\n const targetAriaColIndex = from.colIndex + delta.x;\n const targetCell = findTableRowCellByAriaColIndex(targetRow, targetAriaColIndex, delta.x);\n if (!targetCell) {\n return null;\n }\n\n // When target cell matches the current cell it means we reached the left or right boundary.\n if (targetCell === from.cellElement && delta.x !== 0) {\n return null;\n }\n\n // Return cell interactive content or the cell itself.\n const targetCellFocusables = this.getFocusablesFrom(targetCell);\n const focusIndex = delta.x < 0 ? targetCellFocusables.length - 1 : delta.x > 0 ? 0 : from.elementIndex;\n const focusTarget = targetCellFocusables[focusIndex] ?? targetCell;\n return focusTarget;\n }\n\n private getSingleFocusable() {\n const cell = this.focusedCell;\n const firstTableCell = this.table.querySelector('td,th') as null | HTMLTableCellElement;\n\n // A single element of the table is made user-focusable.\n // It defaults to the first interactive element of the first cell or the first cell itself otherwise.\n let focusTarget: null | HTMLElement =\n (firstTableCell && this.getFocusablesFrom(firstTableCell)[0]) ?? firstTableCell;\n\n // When a navigation-focused element is present in the table it is used for user-navigation instead.\n if (cell) {\n focusTarget = this.getNextFocusable(cell, { x: 0, y: 0 });\n }\n\n return focusTarget;\n }\n\n private getFocusablesFrom(target: HTMLElement) {\n const registeredElements = this.getRegisteredElements();\n return getAllFocusables(target).filter(el => registeredElements.has(el));\n }\n}\n"]}