@neo4j-ndl/react 4.20.0 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/lib/cjs/_common/export-stories-utils.js +1 -1
  2. package/lib/cjs/_common/export-stories-utils.js.map +1 -1
  3. package/lib/cjs/_common/utils.js +3 -3
  4. package/lib/cjs/_common/utils.js.map +1 -1
  5. package/lib/cjs/_generated/style-rules/color-utils.js +3 -0
  6. package/lib/cjs/_generated/style-rules/color-utils.js.map +1 -1
  7. package/lib/cjs/_generated/style-rules/date-utils.js +14 -13
  8. package/lib/cjs/_generated/style-rules/date-utils.js.map +1 -1
  9. package/lib/cjs/_generated/style-rules/literal-schemas.js +5 -3
  10. package/lib/cjs/_generated/style-rules/literal-schemas.js.map +1 -1
  11. package/lib/cjs/ai/code-preview/CodePreview.js +1 -1
  12. package/lib/cjs/ai/code-preview/CodePreview.js.map +1 -1
  13. package/lib/cjs/ai/file-tag/FileTag.js.map +1 -1
  14. package/lib/cjs/ai/image-tag/ImageTag.js.map +1 -1
  15. package/lib/cjs/ai/prompt/Prompt.js +10 -10
  16. package/lib/cjs/ai/prompt/Prompt.js.map +1 -1
  17. package/lib/cjs/ai/prompt/stories/prompt-advanced.story.js +1 -1
  18. package/lib/cjs/ai/prompt/stories/prompt-advanced.story.js.map +1 -1
  19. package/lib/cjs/ai/prompt/stories/prompt-context.story.js +1 -1
  20. package/lib/cjs/ai/prompt/stories/prompt-context.story.js.map +1 -1
  21. package/lib/cjs/ai/prompt/stories/prompt-default.story.js +1 -1
  22. package/lib/cjs/ai/prompt/stories/prompt-default.story.js.map +1 -1
  23. package/lib/cjs/ai/prompt/stories/prompt-header.story.js +1 -1
  24. package/lib/cjs/ai/prompt/stories/prompt-header.story.js.map +1 -1
  25. package/lib/cjs/ai/response/Response.js +4 -4
  26. package/lib/cjs/ai/response/Response.js.map +1 -1
  27. package/lib/cjs/ai/response/stories/response-full-example.story.js +1 -1
  28. package/lib/cjs/ai/response/stories/response-full-example.story.js.map +1 -1
  29. package/lib/cjs/ai/suggestion/Suggestion.js.map +1 -1
  30. package/lib/cjs/ai/thinking/thinking-duration-formatter.js +5 -5
  31. package/lib/cjs/ai/thinking/thinking-duration-formatter.js.map +1 -1
  32. package/lib/cjs/banner/Banner.js +2 -2
  33. package/lib/cjs/banner/Banner.js.map +1 -1
  34. package/lib/cjs/button/ButtonBase.js +4 -4
  35. package/lib/cjs/button/ButtonBase.js.map +1 -1
  36. package/lib/cjs/code/Code.js +3 -3
  37. package/lib/cjs/code/Code.js.map +1 -1
  38. package/lib/cjs/code-block/CodeBlock.js +2 -2
  39. package/lib/cjs/code-block/CodeBlock.js.map +1 -1
  40. package/lib/cjs/color-picker/ColorPicker.js +22 -22
  41. package/lib/cjs/color-picker/ColorPicker.js.map +1 -1
  42. package/lib/cjs/color-picker/stories/color-picker-custom-swatches.story.js +20 -20
  43. package/lib/cjs/color-picker/stories/color-picker-custom-swatches.story.js.map +1 -1
  44. package/lib/cjs/color-picker/stories/color-picker-default.story.js +4 -4
  45. package/lib/cjs/color-picker/stories/color-picker-default.story.js.map +1 -1
  46. package/lib/cjs/color-picker/stories/color-picker-dialog.story.js +4 -4
  47. package/lib/cjs/color-picker/stories/color-picker-dialog.story.js.map +1 -1
  48. package/lib/cjs/color-picker/stories/color-picker-without-eyedropper.story.js +4 -4
  49. package/lib/cjs/color-picker/stories/color-picker-without-eyedropper.story.js.map +1 -1
  50. package/lib/cjs/combobox/stories/combobox-large-data-set.story.js +1 -1
  51. package/lib/cjs/combobox/stories/combobox-large-data-set.story.js.map +1 -1
  52. package/lib/cjs/data-grid/Components.js +20 -20
  53. package/lib/cjs/data-grid/Components.js.map +1 -1
  54. package/lib/cjs/data-grid/DataGrid.js +3 -3
  55. package/lib/cjs/data-grid/DataGrid.js.map +1 -1
  56. package/lib/cjs/data-grid/data-grid-nav/data-grid-nav.js +55 -54
  57. package/lib/cjs/data-grid/data-grid-nav/data-grid-nav.js.map +1 -1
  58. package/lib/cjs/data-grid/data-grid-nav/helpers.js +1 -1
  59. package/lib/cjs/data-grid/data-grid-nav/helpers.js.map +1 -1
  60. package/lib/cjs/data-grid/data-grid-nav/index.js +2 -2
  61. package/lib/cjs/data-grid/data-grid-nav/index.js.map +1 -1
  62. package/lib/cjs/data-grid/helpers/index.js +42 -40
  63. package/lib/cjs/data-grid/helpers/index.js.map +1 -1
  64. package/lib/cjs/data-grid/stories/datagrid-in-dialog.story.js +10 -7
  65. package/lib/cjs/data-grid/stories/datagrid-in-dialog.story.js.map +1 -1
  66. package/lib/cjs/data-grid/stories/datagrid-keyboard-navigation.story.js +10 -7
  67. package/lib/cjs/data-grid/stories/datagrid-keyboard-navigation.story.js.map +1 -1
  68. package/lib/cjs/data-grid/stories/datagrid-rule-based-styling-datetime.story.js +5 -5
  69. package/lib/cjs/data-grid/stories/datagrid-rule-based-styling-datetime.story.js.map +1 -1
  70. package/lib/cjs/data-grid/stories/datagrid-search-and-filters.stories.js +1 -1
  71. package/lib/cjs/data-grid/stories/datagrid-search-and-filters.stories.js.map +1 -1
  72. package/lib/cjs/data-grid/stories/datagrid-virtualization.story.js +5 -5
  73. package/lib/cjs/data-grid/stories/datagrid-virtualization.story.js.map +1 -1
  74. package/lib/cjs/data-grid/style-rules/evaluate.js +23 -23
  75. package/lib/cjs/data-grid/style-rules/evaluate.js.map +1 -1
  76. package/lib/cjs/data-grid/style-rules/types.js +1 -1
  77. package/lib/cjs/data-grid/style-rules/types.js.map +1 -1
  78. package/lib/cjs/dialog/Dialog.js +5 -5
  79. package/lib/cjs/dialog/Dialog.js.map +1 -1
  80. package/lib/cjs/dialog/dialog-types.js.map +1 -1
  81. package/lib/cjs/drawer/Drawer.js +5 -5
  82. package/lib/cjs/drawer/Drawer.js.map +1 -1
  83. package/lib/cjs/dropdown-button/DropdownButton.js +4 -4
  84. package/lib/cjs/dropdown-button/DropdownButton.js.map +1 -1
  85. package/lib/cjs/dropzone/stories/dropzone-full.story.js +1 -1
  86. package/lib/cjs/dropzone/stories/dropzone-full.story.js.map +1 -1
  87. package/lib/cjs/flex/stories/flex-default.story.js +1 -1
  88. package/lib/cjs/flex/stories/flex-default.story.js.map +1 -1
  89. package/lib/cjs/hooks/index.js +3 -3
  90. package/lib/cjs/hooks/index.js.map +1 -1
  91. package/lib/cjs/icon-button-base/IconButtonBase.js +4 -4
  92. package/lib/cjs/icon-button-base/IconButtonBase.js.map +1 -1
  93. package/lib/cjs/icons/generated/custom/ScatterPlot.js +30 -0
  94. package/lib/cjs/icons/generated/custom/ScatterPlot.js.map +1 -0
  95. package/lib/cjs/icons/generated/custom/index.js +4 -2
  96. package/lib/cjs/icons/generated/custom/index.js.map +1 -1
  97. package/lib/cjs/inline-edit/InlineEdit.js +8 -8
  98. package/lib/cjs/inline-edit/InlineEdit.js.map +1 -1
  99. package/lib/cjs/kbd/kbd-utils.js +2 -2
  100. package/lib/cjs/kbd/kbd-utils.js.map +1 -1
  101. package/lib/cjs/modal/Modal.js +6 -6
  102. package/lib/cjs/modal/Modal.js.map +1 -1
  103. package/lib/cjs/next/tree-view/TreeView.js +23 -23
  104. package/lib/cjs/next/tree-view/TreeView.js.map +1 -1
  105. package/lib/cjs/next/tree-view/stories/tree-view-lazy.story.js +1 -1
  106. package/lib/cjs/next/tree-view/stories/tree-view-lazy.story.js.map +1 -1
  107. package/lib/cjs/next/tree-view/stories/tree-view-multi.story.js +6 -6
  108. package/lib/cjs/next/tree-view/stories/tree-view-multi.story.js.map +1 -1
  109. package/lib/cjs/popover/Popover.js.map +1 -1
  110. package/lib/cjs/popover/stories/popover-custom-offset.story.js +3 -3
  111. package/lib/cjs/popover/stories/popover-custom-offset.story.js.map +1 -1
  112. package/lib/cjs/popover/use-popover.js +2 -0
  113. package/lib/cjs/popover/use-popover.js.map +1 -1
  114. package/lib/cjs/segmented-control/SegmentedControl.js.map +1 -1
  115. package/lib/cjs/select/Overrides.js +30 -30
  116. package/lib/cjs/select/Overrides.js.map +1 -1
  117. package/lib/cjs/select-icon-button/SelectIconButton.js +4 -4
  118. package/lib/cjs/select-icon-button/SelectIconButton.js.map +1 -1
  119. package/lib/cjs/selectable-tag/stories/selectable-tag-sizes.story.js +1 -1
  120. package/lib/cjs/selectable-tag/stories/selectable-tag-sizes.story.js.map +1 -1
  121. package/lib/cjs/side-navigation/SideNavigation.js +9 -9
  122. package/lib/cjs/side-navigation/SideNavigation.js.map +1 -1
  123. package/lib/cjs/slider/Slider.js +1 -1
  124. package/lib/cjs/slider/Slider.js.map +1 -1
  125. package/lib/cjs/slider/stories/slider-single-controlled.story.js +2 -2
  126. package/lib/cjs/slider/stories/slider-single-controlled.story.js.map +1 -1
  127. package/lib/cjs/spotlight/Spotlight.js +6 -6
  128. package/lib/cjs/spotlight/Spotlight.js.map +1 -1
  129. package/lib/cjs/spotlight/SpotlightProvider.js +6 -6
  130. package/lib/cjs/spotlight/SpotlightProvider.js.map +1 -1
  131. package/lib/cjs/spotlight/SpotlightTarget.js +18 -16
  132. package/lib/cjs/spotlight/SpotlightTarget.js.map +1 -1
  133. package/lib/cjs/status-indicator/StatusIndicator.js +4 -2
  134. package/lib/cjs/status-indicator/StatusIndicator.js.map +1 -1
  135. package/lib/cjs/tabs/Tabs.js +3 -3
  136. package/lib/cjs/tabs/Tabs.js.map +1 -1
  137. package/lib/cjs/tabs/use-tabs-scroll-overflow.js +2 -2
  138. package/lib/cjs/tabs/use-tabs-scroll-overflow.js.map +1 -1
  139. package/lib/cjs/text-input/stories/text-input-full.story.js +1 -1
  140. package/lib/cjs/text-input/stories/text-input-full.story.js.map +1 -1
  141. package/lib/cjs/text-input/stories/text-input-with-icons.story.js +1 -1
  142. package/lib/cjs/text-input/stories/text-input-with-icons.story.js.map +1 -1
  143. package/lib/cjs/theme/agnostic.js +4 -4
  144. package/lib/cjs/theme/agnostic.js.map +1 -1
  145. package/lib/cjs/time-picker/TimePicker.js +24 -24
  146. package/lib/cjs/time-picker/TimePicker.js.map +1 -1
  147. package/lib/cjs/time-picker/generate-time-options.js +3 -3
  148. package/lib/cjs/time-picker/generate-time-options.js.map +1 -1
  149. package/lib/cjs/timezone-picker/TimeZonePicker.js +44 -44
  150. package/lib/cjs/timezone-picker/TimeZonePicker.js.map +1 -1
  151. package/lib/cjs/timezone-picker/generate-timezone-options.js +5 -5
  152. package/lib/cjs/timezone-picker/generate-timezone-options.js.map +1 -1
  153. package/lib/cjs/toast/ToastControlled.js +1 -1
  154. package/lib/cjs/toast/ToastControlled.js.map +1 -1
  155. package/lib/cjs/tooltip/use-tooltip.js +8 -1
  156. package/lib/cjs/tooltip/use-tooltip.js.map +1 -1
  157. package/lib/cjs/tree-view/TreeItemWrapper.js +8 -8
  158. package/lib/cjs/tree-view/TreeItemWrapper.js.map +1 -1
  159. package/lib/cjs/tree-view/TreeView.js +6 -2
  160. package/lib/cjs/tree-view/TreeView.js.map +1 -1
  161. package/lib/cjs/tree-view/TreeViewTextItem.js +17 -17
  162. package/lib/cjs/tree-view/TreeViewTextItem.js.map +1 -1
  163. package/lib/cjs/tree-view/tree-view-keyboard-coordinates.js +2 -0
  164. package/lib/cjs/tree-view/tree-view-keyboard-coordinates.js.map +1 -1
  165. package/lib/cjs/tree-view/tree-view-utils.js +12 -12
  166. package/lib/cjs/tree-view/tree-view-utils.js.map +1 -1
  167. package/lib/esm/_common/export-stories-utils.js +1 -1
  168. package/lib/esm/_common/export-stories-utils.js.map +1 -1
  169. package/lib/esm/_common/utils.js +3 -3
  170. package/lib/esm/_common/utils.js.map +1 -1
  171. package/lib/esm/_generated/style-rules/color-utils.js +3 -0
  172. package/lib/esm/_generated/style-rules/color-utils.js.map +1 -1
  173. package/lib/esm/_generated/style-rules/date-utils.js +14 -13
  174. package/lib/esm/_generated/style-rules/date-utils.js.map +1 -1
  175. package/lib/esm/_generated/style-rules/literal-schemas.js +5 -3
  176. package/lib/esm/_generated/style-rules/literal-schemas.js.map +1 -1
  177. package/lib/esm/ai/code-preview/CodePreview.js +1 -1
  178. package/lib/esm/ai/code-preview/CodePreview.js.map +1 -1
  179. package/lib/esm/ai/file-tag/FileTag.js.map +1 -1
  180. package/lib/esm/ai/image-tag/ImageTag.js.map +1 -1
  181. package/lib/esm/ai/prompt/Prompt.js +10 -10
  182. package/lib/esm/ai/prompt/Prompt.js.map +1 -1
  183. package/lib/esm/ai/prompt/stories/prompt-advanced.story.js +1 -1
  184. package/lib/esm/ai/prompt/stories/prompt-advanced.story.js.map +1 -1
  185. package/lib/esm/ai/prompt/stories/prompt-context.story.js +1 -1
  186. package/lib/esm/ai/prompt/stories/prompt-context.story.js.map +1 -1
  187. package/lib/esm/ai/prompt/stories/prompt-default.story.js +1 -1
  188. package/lib/esm/ai/prompt/stories/prompt-default.story.js.map +1 -1
  189. package/lib/esm/ai/prompt/stories/prompt-header.story.js +1 -1
  190. package/lib/esm/ai/prompt/stories/prompt-header.story.js.map +1 -1
  191. package/lib/esm/ai/response/Response.js +4 -4
  192. package/lib/esm/ai/response/Response.js.map +1 -1
  193. package/lib/esm/ai/response/stories/response-full-example.story.js +1 -1
  194. package/lib/esm/ai/response/stories/response-full-example.story.js.map +1 -1
  195. package/lib/esm/ai/suggestion/Suggestion.js.map +1 -1
  196. package/lib/esm/ai/thinking/thinking-duration-formatter.js +5 -5
  197. package/lib/esm/ai/thinking/thinking-duration-formatter.js.map +1 -1
  198. package/lib/esm/banner/Banner.js +2 -2
  199. package/lib/esm/banner/Banner.js.map +1 -1
  200. package/lib/esm/button/ButtonBase.js +4 -4
  201. package/lib/esm/button/ButtonBase.js.map +1 -1
  202. package/lib/esm/code/Code.js +3 -3
  203. package/lib/esm/code/Code.js.map +1 -1
  204. package/lib/esm/code-block/CodeBlock.js +2 -2
  205. package/lib/esm/code-block/CodeBlock.js.map +1 -1
  206. package/lib/esm/color-picker/ColorPicker.js +22 -22
  207. package/lib/esm/color-picker/ColorPicker.js.map +1 -1
  208. package/lib/esm/color-picker/stories/color-picker-custom-swatches.story.js +20 -20
  209. package/lib/esm/color-picker/stories/color-picker-custom-swatches.story.js.map +1 -1
  210. package/lib/esm/color-picker/stories/color-picker-default.story.js +4 -4
  211. package/lib/esm/color-picker/stories/color-picker-default.story.js.map +1 -1
  212. package/lib/esm/color-picker/stories/color-picker-dialog.story.js +4 -4
  213. package/lib/esm/color-picker/stories/color-picker-dialog.story.js.map +1 -1
  214. package/lib/esm/color-picker/stories/color-picker-without-eyedropper.story.js +4 -4
  215. package/lib/esm/color-picker/stories/color-picker-without-eyedropper.story.js.map +1 -1
  216. package/lib/esm/combobox/stories/combobox-large-data-set.story.js +1 -1
  217. package/lib/esm/combobox/stories/combobox-large-data-set.story.js.map +1 -1
  218. package/lib/esm/data-grid/Components.js +20 -20
  219. package/lib/esm/data-grid/Components.js.map +1 -1
  220. package/lib/esm/data-grid/DataGrid.js +3 -3
  221. package/lib/esm/data-grid/DataGrid.js.map +1 -1
  222. package/lib/esm/data-grid/data-grid-nav/data-grid-nav.js +55 -54
  223. package/lib/esm/data-grid/data-grid-nav/data-grid-nav.js.map +1 -1
  224. package/lib/esm/data-grid/data-grid-nav/helpers.js +1 -1
  225. package/lib/esm/data-grid/data-grid-nav/helpers.js.map +1 -1
  226. package/lib/esm/data-grid/data-grid-nav/index.js +2 -2
  227. package/lib/esm/data-grid/data-grid-nav/index.js.map +1 -1
  228. package/lib/esm/data-grid/helpers/index.js +42 -40
  229. package/lib/esm/data-grid/helpers/index.js.map +1 -1
  230. package/lib/esm/data-grid/stories/datagrid-in-dialog.story.js +10 -7
  231. package/lib/esm/data-grid/stories/datagrid-in-dialog.story.js.map +1 -1
  232. package/lib/esm/data-grid/stories/datagrid-keyboard-navigation.story.js +10 -7
  233. package/lib/esm/data-grid/stories/datagrid-keyboard-navigation.story.js.map +1 -1
  234. package/lib/esm/data-grid/stories/datagrid-rule-based-styling-datetime.story.js +5 -5
  235. package/lib/esm/data-grid/stories/datagrid-rule-based-styling-datetime.story.js.map +1 -1
  236. package/lib/esm/data-grid/stories/datagrid-search-and-filters.stories.js +1 -1
  237. package/lib/esm/data-grid/stories/datagrid-search-and-filters.stories.js.map +1 -1
  238. package/lib/esm/data-grid/stories/datagrid-virtualization.story.js +5 -5
  239. package/lib/esm/data-grid/stories/datagrid-virtualization.story.js.map +1 -1
  240. package/lib/esm/data-grid/style-rules/evaluate.js +23 -23
  241. package/lib/esm/data-grid/style-rules/evaluate.js.map +1 -1
  242. package/lib/esm/data-grid/style-rules/types.js +1 -1
  243. package/lib/esm/data-grid/style-rules/types.js.map +1 -1
  244. package/lib/esm/dialog/Dialog.js +5 -5
  245. package/lib/esm/dialog/Dialog.js.map +1 -1
  246. package/lib/esm/dialog/dialog-types.js.map +1 -1
  247. package/lib/esm/drawer/Drawer.js +5 -5
  248. package/lib/esm/drawer/Drawer.js.map +1 -1
  249. package/lib/esm/dropdown-button/DropdownButton.js +4 -4
  250. package/lib/esm/dropdown-button/DropdownButton.js.map +1 -1
  251. package/lib/esm/dropzone/stories/dropzone-full.story.js +1 -1
  252. package/lib/esm/dropzone/stories/dropzone-full.story.js.map +1 -1
  253. package/lib/esm/flex/stories/flex-default.story.js +1 -1
  254. package/lib/esm/flex/stories/flex-default.story.js.map +1 -1
  255. package/lib/esm/hooks/index.js +3 -3
  256. package/lib/esm/hooks/index.js.map +1 -1
  257. package/lib/esm/icon-button-base/IconButtonBase.js +4 -4
  258. package/lib/esm/icon-button-base/IconButtonBase.js.map +1 -1
  259. package/lib/esm/icons/generated/custom/ScatterPlot.js +28 -0
  260. package/lib/esm/icons/generated/custom/ScatterPlot.js.map +1 -0
  261. package/lib/esm/icons/generated/custom/index.js +1 -0
  262. package/lib/esm/icons/generated/custom/index.js.map +1 -1
  263. package/lib/esm/inline-edit/InlineEdit.js +8 -8
  264. package/lib/esm/inline-edit/InlineEdit.js.map +1 -1
  265. package/lib/esm/kbd/kbd-utils.js +2 -2
  266. package/lib/esm/kbd/kbd-utils.js.map +1 -1
  267. package/lib/esm/modal/Modal.js +6 -6
  268. package/lib/esm/modal/Modal.js.map +1 -1
  269. package/lib/esm/next/tree-view/TreeView.js +23 -23
  270. package/lib/esm/next/tree-view/TreeView.js.map +1 -1
  271. package/lib/esm/next/tree-view/stories/tree-view-lazy.story.js +1 -1
  272. package/lib/esm/next/tree-view/stories/tree-view-lazy.story.js.map +1 -1
  273. package/lib/esm/next/tree-view/stories/tree-view-multi.story.js +6 -6
  274. package/lib/esm/next/tree-view/stories/tree-view-multi.story.js.map +1 -1
  275. package/lib/esm/popover/Popover.js.map +1 -1
  276. package/lib/esm/popover/stories/popover-custom-offset.story.js +3 -3
  277. package/lib/esm/popover/stories/popover-custom-offset.story.js.map +1 -1
  278. package/lib/esm/popover/use-popover.js +2 -0
  279. package/lib/esm/popover/use-popover.js.map +1 -1
  280. package/lib/esm/segmented-control/SegmentedControl.js.map +1 -1
  281. package/lib/esm/select/Overrides.js +30 -30
  282. package/lib/esm/select/Overrides.js.map +1 -1
  283. package/lib/esm/select-icon-button/SelectIconButton.js +4 -4
  284. package/lib/esm/select-icon-button/SelectIconButton.js.map +1 -1
  285. package/lib/esm/selectable-tag/stories/selectable-tag-sizes.story.js +1 -1
  286. package/lib/esm/selectable-tag/stories/selectable-tag-sizes.story.js.map +1 -1
  287. package/lib/esm/side-navigation/SideNavigation.js +9 -9
  288. package/lib/esm/side-navigation/SideNavigation.js.map +1 -1
  289. package/lib/esm/slider/Slider.js +1 -1
  290. package/lib/esm/slider/Slider.js.map +1 -1
  291. package/lib/esm/slider/stories/slider-single-controlled.story.js +2 -2
  292. package/lib/esm/slider/stories/slider-single-controlled.story.js.map +1 -1
  293. package/lib/esm/spotlight/Spotlight.js +6 -6
  294. package/lib/esm/spotlight/Spotlight.js.map +1 -1
  295. package/lib/esm/spotlight/SpotlightProvider.js +6 -6
  296. package/lib/esm/spotlight/SpotlightProvider.js.map +1 -1
  297. package/lib/esm/spotlight/SpotlightTarget.js +18 -16
  298. package/lib/esm/spotlight/SpotlightTarget.js.map +1 -1
  299. package/lib/esm/status-indicator/StatusIndicator.js +4 -2
  300. package/lib/esm/status-indicator/StatusIndicator.js.map +1 -1
  301. package/lib/esm/tabs/Tabs.js +3 -3
  302. package/lib/esm/tabs/Tabs.js.map +1 -1
  303. package/lib/esm/tabs/use-tabs-scroll-overflow.js +2 -2
  304. package/lib/esm/tabs/use-tabs-scroll-overflow.js.map +1 -1
  305. package/lib/esm/text-input/stories/text-input-full.story.js +1 -1
  306. package/lib/esm/text-input/stories/text-input-full.story.js.map +1 -1
  307. package/lib/esm/text-input/stories/text-input-with-icons.story.js +1 -1
  308. package/lib/esm/text-input/stories/text-input-with-icons.story.js.map +1 -1
  309. package/lib/esm/theme/agnostic.js +3 -3
  310. package/lib/esm/theme/agnostic.js.map +1 -1
  311. package/lib/esm/time-picker/TimePicker.js +24 -24
  312. package/lib/esm/time-picker/TimePicker.js.map +1 -1
  313. package/lib/esm/time-picker/generate-time-options.js +3 -3
  314. package/lib/esm/time-picker/generate-time-options.js.map +1 -1
  315. package/lib/esm/timezone-picker/TimeZonePicker.js +44 -44
  316. package/lib/esm/timezone-picker/TimeZonePicker.js.map +1 -1
  317. package/lib/esm/timezone-picker/generate-timezone-options.js +5 -5
  318. package/lib/esm/timezone-picker/generate-timezone-options.js.map +1 -1
  319. package/lib/esm/toast/ToastControlled.js +1 -1
  320. package/lib/esm/toast/ToastControlled.js.map +1 -1
  321. package/lib/esm/tooltip/use-tooltip.js +8 -1
  322. package/lib/esm/tooltip/use-tooltip.js.map +1 -1
  323. package/lib/esm/tree-view/TreeItemWrapper.js +8 -8
  324. package/lib/esm/tree-view/TreeItemWrapper.js.map +1 -1
  325. package/lib/esm/tree-view/TreeView.js +6 -2
  326. package/lib/esm/tree-view/TreeView.js.map +1 -1
  327. package/lib/esm/tree-view/TreeViewTextItem.js +17 -17
  328. package/lib/esm/tree-view/TreeViewTextItem.js.map +1 -1
  329. package/lib/esm/tree-view/tree-view-keyboard-coordinates.js +2 -0
  330. package/lib/esm/tree-view/tree-view-keyboard-coordinates.js.map +1 -1
  331. package/lib/esm/tree-view/tree-view-utils.js +12 -12
  332. package/lib/esm/tree-view/tree-view-utils.js.map +1 -1
  333. package/lib/types/_common/export-stories-utils.d.ts +1 -1
  334. package/lib/types/_common/utils.d.ts +3 -3
  335. package/lib/types/_generated/style-rules/color-utils.d.ts.map +1 -1
  336. package/lib/types/_generated/style-rules/date-utils.d.ts +3 -3
  337. package/lib/types/_generated/style-rules/date-utils.d.ts.map +1 -1
  338. package/lib/types/_generated/style-rules/literal-schemas.d.ts.map +1 -1
  339. package/lib/types/ai/code-preview/CodePreview.d.ts +1 -1
  340. package/lib/types/ai/file-tag/FileTag.d.ts +1 -1
  341. package/lib/types/ai/file-tag/FileTag.d.ts.map +1 -1
  342. package/lib/types/ai/image-tag/ImageTag.d.ts +1 -1
  343. package/lib/types/ai/image-tag/ImageTag.d.ts.map +1 -1
  344. package/lib/types/ai/prompt/Prompt.d.ts +3 -3
  345. package/lib/types/ai/prompt/Prompt.d.ts.map +1 -1
  346. package/lib/types/ai/suggestion/Suggestion.d.ts +1 -1
  347. package/lib/types/ai/suggestion/Suggestion.d.ts.map +1 -1
  348. package/lib/types/ai/thinking/thinking-duration-formatter.d.ts +5 -5
  349. package/lib/types/banner/Banner.d.ts +1 -1
  350. package/lib/types/banner/Banner.d.ts.map +1 -1
  351. package/lib/types/button/ButtonBase.d.ts +2 -2
  352. package/lib/types/button/ButtonBase.d.ts.map +1 -1
  353. package/lib/types/code/Code.d.ts +1 -1
  354. package/lib/types/code/Code.d.ts.map +1 -1
  355. package/lib/types/data-grid/Components.d.ts +2 -2
  356. package/lib/types/data-grid/Components.d.ts.map +1 -1
  357. package/lib/types/data-grid/DataGrid.d.ts +2 -2
  358. package/lib/types/data-grid/data-grid-nav/data-grid-nav.d.ts +4 -4
  359. package/lib/types/data-grid/data-grid-nav/data-grid-nav.d.ts.map +1 -1
  360. package/lib/types/data-grid/data-grid-nav/helpers.d.ts +1 -1
  361. package/lib/types/data-grid/data-grid-nav/index.d.ts +1 -1
  362. package/lib/types/data-grid/data-grid-nav/index.d.ts.map +1 -1
  363. package/lib/types/data-grid/helpers/index.d.ts +5 -5
  364. package/lib/types/data-grid/helpers/index.d.ts.map +1 -1
  365. package/lib/types/data-grid/stories/datagrid-in-dialog.story.d.ts.map +1 -1
  366. package/lib/types/data-grid/stories/datagrid-keyboard-navigation.story.d.ts.map +1 -1
  367. package/lib/types/data-grid/stories/datagrid-pinned-columns.stories.d.ts +2 -2
  368. package/lib/types/data-grid/stories/datagrid-search-and-filters.stories.d.ts +2 -2
  369. package/lib/types/data-grid/stories/datagrid-virtualization.story.d.ts.map +1 -1
  370. package/lib/types/data-grid/style-rules/evaluate.d.ts +1 -1
  371. package/lib/types/dialog/Dialog.d.ts.map +1 -1
  372. package/lib/types/dialog/dialog-types.d.ts +1 -1
  373. package/lib/types/dialog/dialog-types.d.ts.map +1 -1
  374. package/lib/types/drawer/Drawer.d.ts +1 -1
  375. package/lib/types/drawer/Drawer.d.ts.map +1 -1
  376. package/lib/types/dropdown-button/DropdownButton.d.ts +1 -1
  377. package/lib/types/dropdown-button/DropdownButton.d.ts.map +1 -1
  378. package/lib/types/hooks/index.d.ts +3 -3
  379. package/lib/types/icon-button-base/IconButtonBase.d.ts +1 -1
  380. package/lib/types/icon-button-base/IconButtonBase.d.ts.map +1 -1
  381. package/lib/types/icons/generated/custom/ScatterPlot.d.ts +29 -0
  382. package/lib/types/icons/generated/custom/ScatterPlot.d.ts.map +1 -0
  383. package/lib/types/icons/generated/custom/index.d.ts +1 -0
  384. package/lib/types/icons/generated/custom/index.d.ts.map +1 -1
  385. package/lib/types/modal/Modal.d.ts +1 -1
  386. package/lib/types/modal/Modal.d.ts.map +1 -1
  387. package/lib/types/popover/Popover.d.ts.map +1 -1
  388. package/lib/types/popover/use-popover.d.ts.map +1 -1
  389. package/lib/types/segmented-control/SegmentedControl.d.ts +1 -1
  390. package/lib/types/segmented-control/SegmentedControl.d.ts.map +1 -1
  391. package/lib/types/select/Overrides.d.ts.map +1 -1
  392. package/lib/types/select-icon-button/SelectIconButton.d.ts +1 -1
  393. package/lib/types/select-icon-button/SelectIconButton.d.ts.map +1 -1
  394. package/lib/types/selectable-tag/stories/selectable-tag-sizes.story.d.ts.map +1 -1
  395. package/lib/types/spotlight/SpotlightProvider.d.ts.map +1 -1
  396. package/lib/types/spotlight/SpotlightTarget.d.ts +4 -3
  397. package/lib/types/spotlight/SpotlightTarget.d.ts.map +1 -1
  398. package/lib/types/status-indicator/StatusIndicator.d.ts.map +1 -1
  399. package/lib/types/tabs/Tabs.d.ts +1 -1
  400. package/lib/types/tabs/Tabs.d.ts.map +1 -1
  401. package/lib/types/theme/agnostic.d.ts +2 -2
  402. package/lib/types/theme/agnostic.d.ts.map +1 -1
  403. package/lib/types/tooltip/use-tooltip.d.ts.map +1 -1
  404. package/lib/types/tree-view/TreeView.d.ts.map +1 -1
  405. package/lib/types/tree-view/TreeViewTextItem.d.ts.map +1 -1
  406. package/lib/types/tree-view/tree-view-keyboard-coordinates.d.ts.map +1 -1
  407. package/lib/types/tree-view/tree-view-utils.d.ts +12 -12
  408. package/lib/types/tree-view/tree-view-utils.d.ts.map +1 -1
  409. package/package.json +5 -3
  410. package/skills/ndl-react/SKILL.md +54 -3
  411. package/skills/ndl-react/components/ai/file-tag.md +1 -1
  412. package/skills/ndl-react/components/ai/image-tag.md +1 -1
  413. package/skills/ndl-react/components/ai/prompt.md +10 -10
  414. package/skills/ndl-react/components/ai/response.md +1 -1
  415. package/skills/ndl-react/components/ai/suggestion.md +1 -1
  416. package/skills/ndl-react/components/banner.md +1 -1
  417. package/skills/ndl-react/components/clean-icon-button.md +1 -1
  418. package/skills/ndl-react/components/code.md +1 -1
  419. package/skills/ndl-react/components/combobox.md +1 -1
  420. package/skills/ndl-react/components/data-grid.md +35 -28
  421. package/skills/ndl-react/components/dialog.md +1 -1
  422. package/skills/ndl-react/components/drawer.md +1 -1
  423. package/skills/ndl-react/components/dropdown-button.md +1 -1
  424. package/skills/ndl-react/components/dropzone.md +1 -1
  425. package/skills/ndl-react/components/filled-button.md +2 -2
  426. package/skills/ndl-react/components/flex.md +2 -2
  427. package/skills/ndl-react/components/icon-button.md +1 -1
  428. package/skills/ndl-react/components/modal.md +1 -1
  429. package/skills/ndl-react/components/next/tree-view.md +8 -8
  430. package/skills/ndl-react/components/outlined-button.md +2 -2
  431. package/skills/ndl-react/components/popover.md +3 -3
  432. package/skills/ndl-react/components/segmented-control.md +1 -1
  433. package/skills/ndl-react/components/select-icon-button.md +1 -1
  434. package/skills/ndl-react/components/selectable-tag.md +10 -4
  435. package/skills/ndl-react/components/slider.md +2 -2
  436. package/skills/ndl-react/components/tabs.md +1 -1
  437. package/skills/ndl-react/components/text-button.md +2 -2
  438. package/skills/ndl-react/components/text-input.md +2 -2
  439. package/skills/ndl-react/references/styling.md +290 -0
@@ -1 +1 @@
1
- {"version":3,"file":"DataGrid.js","sourceRoot":"","sources":["../../../src/data-grid/DataGrid.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport {\n type RowData,\n type Table as DataGridType,\n} from '@tanstack/react-table';\nimport classNames from 'classnames';\nimport {\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type CommonProps, type HtmlAttributes } from '../_common/types';\nimport { useResizeObserver } from '../hooks';\nimport { type Skeleton } from '../skeleton';\nimport {\n ActionButton,\n ActionCell,\n Body,\n BodyCell,\n BodyRow,\n ColumnControls,\n DropDownCell,\n Header,\n HeaderCell,\n HeaderTitle,\n InlineEditCell,\n LoadingPlaceholder,\n Navigation,\n NoDataIcon,\n NoDataPlaceholder,\n NoDataPlaceholderContentWrapper,\n Pagination,\n PaginationArrowButton,\n PaginationNumericButton,\n PaginationNumericButtons,\n ResizingBar,\n RowsPerPage,\n Scrollable,\n TableResults,\n} from './Components';\nimport {\n type DataGridComponentsInterface,\n DataGridContext,\n type DataGridContextType,\n} from './data-grid-context';\nimport { useTableNav } from './data-grid-nav';\nimport { updateColumnWidths } from './helpers';\nimport {\n type DataGridStyleRule,\n type DataGridStyleRuleValueConverters,\n} from './style-rules/types';\n\nenum BorderStyleEnum {\n AllSides = 'all-sides',\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n None = 'none',\n}\n\nexport type BorderStyle = `${BorderStyleEnum}`;\n\nenum HeaderStyleEnum {\n Filled = 'filled',\n Clean = 'clean',\n}\n\nexport type HeaderStyle = `${HeaderStyleEnum}`;\n\nexport type DataGridProps<T extends RowData> = {\n styling?: Partial<{\n /** Alternate the background color of rows */\n hasZebraStriping: boolean;\n /** Type of border that will be used */\n borderStyle: BorderStyle;\n /** If header should have styles or not (Aura example) */\n headerStyle: HeaderStyle;\n /** If background hover effects should be enabled on rows and header cells */\n hasHoverEffects: boolean;\n /** If table should have less padding */\n isCompact: boolean;\n }>;\n /** Resizing the width of columns */\n isResizable?: boolean;\n /** Enables table's loading state */\n isLoading?: boolean;\n /**\n * Enables keyboard navigation.\n * To control keyboard navigation programmatically\n * for edge cases, pass a `ref` to `tableNavRef`\n */\n isKeyboardNavigable?: boolean;\n /**\n * Enables automatic resizing of columns.\n * If `isResizable` is `true`, the columns will only be automatically resized on initial render of the table.\n * If `isResizable` is `false`, the columns will be resized automatically to always fit the table width (assuming that column maxWidths allow for it).\n * Note: Action columns are a fixed size of 40px, and Pinned columns are not resized automatically.\n * @defaultValue true\n */\n isAutoResizingColumns?: boolean;\n /**\n * Reference to the tableNav instance\n * for programmatic control\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n tableNavRef?: React.RefObject<any>;\n /** Table instance created from `useTable`*/\n tableInstance: DataGridType<T>;\n /** Table sub-component overrides */\n components?: DataGridComponentsInterface<T>;\n /** @deprecated Use htmlAttributes, className and style on the root element instead */\n rootProps?: HtmlAttributes<'div'>;\n isSkeletonLoading?: boolean;\n skeletonProps?: React.ComponentProps<typeof Skeleton>;\n /** The target element for portaled elements to be rendered in, e.g. the modal root if the data grid is inside a modal.\n * This is used in for example the DropdownCell, RowsPerPage, and ColumnControls.\n */\n portalTarget?: HTMLElement | null;\n /** Rule-based conditional styling for cells and rows. */\n styleRules?: DataGridStyleRule[];\n /** Per-column converters that teach the style-rule engine how to interpret complex cell values. */\n styleRuleValueConverters?: DataGridStyleRuleValueConverters;\n ref?: React.Ref<HTMLDivElement>;\n};\n\nconst DEFAULT_STYLING: Required<DataGridProps<unknown>['styling']> = {\n borderStyle: BorderStyleEnum.Horizontal,\n hasHoverEffects: true,\n hasZebraStriping: false,\n headerStyle: HeaderStyleEnum.Filled,\n isCompact: false,\n};\n\nconst DataGridComponent = function DataGrid<T extends RowData = unknown>({\n isResizable = true,\n isLoading = false,\n isKeyboardNavigable = true,\n isAutoResizingColumns = true,\n tableInstance,\n components,\n rootProps,\n styling = {},\n tableNavRef,\n isSkeletonLoading = false,\n skeletonProps,\n ref,\n portalTarget = document.body,\n styleRules,\n styleRuleValueConverters,\n htmlAttributes,\n className,\n style,\n ...restProps\n}: CommonProps<'div', DataGridProps<T>>) {\n const { className: rootClassName = '', style: rootStyle = {} } =\n rootProps || {};\n\n const [isScrollable, setIsScrollable] = useState(false);\n const [isMediumNavigation, setIsMediumNavigation] = useState(false);\n const [isSmallNavigation, setIsSmallNavigation] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const scrollableContainerRef = useRef<HTMLDivElement>(null);\n\n tableInstance.setOptions((prevOptions) => {\n return {\n ...prevOptions,\n enableSorting: isSkeletonLoading ? false : prevOptions.enableSorting,\n };\n });\n\n // Triggers when the whole container is resized\n useResizeObserver({\n onResize: (entry) => {\n if (entry.width === undefined) {\n return;\n }\n isAutoResizingColumns &&\n !isResizable &&\n updateColumnWidths(tableInstance, entry.width); // don't resize columns when the table is resizable due to problems with the resize handler.\n setIsScrollable(tableInstance.getTotalSize() > entry.width);\n setIsMediumNavigation(entry.width <= 680);\n setIsSmallNavigation(entry.width <= 480);\n },\n ref: scrollableContainerRef as React.RefObject<HTMLElement>,\n });\n\n // Triggers when the individual columns are resized\n useResizeObserver({\n onResize: () => {\n if (scrollableContainerRef.current === null) {\n return;\n }\n setIsScrollable(\n tableInstance.getTotalSize() >\n scrollableContainerRef.current.clientWidth,\n );\n },\n ref: tableRef as React.RefObject<HTMLElement>,\n });\n\n const Styling = useMemo(\n () => ({\n ...DEFAULT_STYLING,\n ...styling,\n }),\n [styling],\n );\n\n const Components = useMemo(\n () =>\n ({\n ...DataGridComponents,\n ...components,\n }) as DataGridContextType<T>['components'],\n [components],\n );\n const ScrollableContainer = Components?.Scrollable\n ? Components.Scrollable\n : Scrollable;\n\n const { listeners, tableNav } = useTableNav({\n isDebug: false,\n });\n\n /** Surface the tableNav instance for programmatic control if needed */\n useImperativeHandle(tableNavRef, () => tableNav, [tableNav]);\n\n useEffect(() => {\n if (isAutoResizingColumns && isResizable) {\n updateColumnWidths(\n tableInstance,\n scrollableContainerRef.current?.clientWidth\n ? scrollableContainerRef.current.clientWidth - 1 // -1 to avoid horizontal scrollbar\n : 0,\n );\n }\n }, [isAutoResizingColumns, tableInstance, isResizable]);\n\n return (\n <DataGridContext.Provider\n value={\n {\n components: Components,\n dataGridNav: tableNav,\n hasResizeColumns: isAutoResizingColumns,\n isKeyboardNavigationEnabled: isKeyboardNavigable,\n isLoading: isLoading,\n isMediumNavigation,\n isResizable: isResizable,\n isSkeletonLoading,\n isSmallNavigation,\n portalTarget: portalTarget,\n skeletonProps,\n styleRuleValueConverters,\n styleRules,\n tableProps: tableInstance,\n } as DataGridContextType<T>\n }\n >\n <div\n // Root props needs to be first in order to override className\n {...rootProps}\n className={classNames('ndl-data-grid-root', rootClassName, className, {\n 'ndl-data-grid-border-horizontal':\n Styling.borderStyle === BorderStyleEnum.Horizontal ||\n Styling.borderStyle === BorderStyleEnum.AllSides,\n 'ndl-data-grid-border-vertical':\n Styling.borderStyle === BorderStyleEnum.Vertical ||\n Styling.borderStyle === BorderStyleEnum.AllSides,\n 'ndl-data-grid-compact': Styling.isCompact,\n 'ndl-data-grid-focusable-cells': isKeyboardNavigable,\n 'ndl-data-grid-header-filled':\n Styling.headerStyle === HeaderStyleEnum.Filled,\n 'ndl-data-grid-hover-effects': Styling.hasHoverEffects,\n 'ndl-data-grid-resizable': isResizable,\n 'ndl-data-grid-zebra-striping': Styling.hasZebraStriping,\n })}\n ref={ref}\n style={{ ...rootStyle, ...style }}\n {...restProps}\n {...htmlAttributes}\n {...(isKeyboardNavigable ? listeners : {})}\n >\n {/* Make DataGrid horizontally scrollable and avoid horizontal scrollbar have an extra vertical scrollbar (esp. Safari) */}\n {/* This behavior can be overridden by consumers through replacing the scrolling container */}\n <ScrollableContainer\n ref={scrollableContainerRef}\n htmlAttributes={{\n onKeyDown: (e) => {\n if (isScrollable && !isKeyboardNavigable) {\n if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') {\n e.stopPropagation();\n }\n }\n },\n // Ensure that the user can focus and scroll inside the table with arrow keys even if there is no interactive element inside\n tabIndex: isScrollable && !isKeyboardNavigable ? 0 : undefined,\n }}\n >\n {/* Table content Area */}\n <div\n className=\"ndl-div-table\"\n role={isKeyboardNavigable ? 'grid' : 'table'}\n aria-busy={isLoading ? 'true' : 'false'}\n ref={tableRef}\n >\n {/* DataGrid Header Area */}\n {Components?.Header && <Components.Header />}\n {Components?.Body && <Components.Body />}\n </div>\n </ScrollableContainer>\n {/* Bottom Navigation Area */}\n {Components?.Navigation && <Components.Navigation />}\n </div>\n </DataGridContext.Provider>\n );\n};\n\nconst DataGridComponents = {\n ActionButton,\n ActionCell,\n Body,\n BodyCell,\n BodyRow,\n ColumnControls,\n DropDownCell,\n Header,\n HeaderCell,\n HeaderTitle,\n InlineEditCell,\n LoadingPlaceholder,\n Navigation,\n NoDataIcon,\n NoDataPlaceholder,\n NoDataPlaceholderContentWrapper,\n Pagination,\n PaginationArrowButton,\n PaginationNumericButton,\n PaginationNumericButtons,\n ResizingBar,\n RowsPerPage,\n Scrollable,\n TableResults,\n};\n\nconst DataGrid = Object.assign(DataGridComponent, DataGridComponents);\n\nexport { DataGrid };\n"]}
1
+ {"version":3,"file":"DataGrid.js","sourceRoot":"","sources":["../../../src/data-grid/DataGrid.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport {\n type RowData,\n type Table as DataGridType,\n} from '@tanstack/react-table';\nimport classNames from 'classnames';\nimport {\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type CommonProps, type HtmlAttributes } from '../_common/types';\nimport { useResizeObserver } from '../hooks';\nimport { type Skeleton } from '../skeleton';\nimport {\n ActionButton,\n ActionCell,\n Body,\n BodyCell,\n BodyRow,\n ColumnControls,\n DropDownCell,\n Header,\n HeaderCell,\n HeaderTitle,\n InlineEditCell,\n LoadingPlaceholder,\n Navigation,\n NoDataIcon,\n NoDataPlaceholder,\n NoDataPlaceholderContentWrapper,\n Pagination,\n PaginationArrowButton,\n PaginationNumericButton,\n PaginationNumericButtons,\n ResizingBar,\n RowsPerPage,\n Scrollable,\n TableResults,\n} from './Components';\nimport {\n type DataGridComponentsInterface,\n DataGridContext,\n type DataGridContextType,\n} from './data-grid-context';\nimport { useTableNav } from './data-grid-nav';\nimport { updateColumnWidths } from './helpers';\nimport {\n type DataGridStyleRule,\n type DataGridStyleRuleValueConverters,\n} from './style-rules/types';\n\nenum BorderStyleEnum {\n AllSides = 'all-sides',\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n None = 'none',\n}\n\nexport type BorderStyle = `${BorderStyleEnum}`;\n\nenum HeaderStyleEnum {\n Filled = 'filled',\n Clean = 'clean',\n}\n\nexport type HeaderStyle = `${HeaderStyleEnum}`;\n\nexport type DataGridProps<T extends RowData> = {\n styling?: Partial<{\n /** Alternate the background color of rows */\n hasZebraStriping: boolean;\n /** Type of border that will be used */\n borderStyle: BorderStyle;\n /** If header should have styles or not (Aura example) */\n headerStyle: HeaderStyle;\n /** If background hover effects should be enabled on rows and header cells */\n hasHoverEffects: boolean;\n /** If table should have less padding */\n isCompact: boolean;\n }>;\n /** Resizing the width of columns */\n isResizable?: boolean;\n /** Enables table's loading state */\n isLoading?: boolean;\n /**\n * Enables keyboard navigation.\n * To control keyboard navigation programmatically\n * for edge cases, pass a `ref` to `tableNavRef`\n */\n isKeyboardNavigable?: boolean;\n /**\n * Enables automatic resizing of columns.\n * If `isResizable` is `true`, the columns will only be automatically resized on initial render of the table.\n * If `isResizable` is `false`, the columns will be resized automatically to always fit the table width (assuming that column maxWidths allow for it).\n * Note: Action columns are a fixed size of 40px, and Pinned columns are not resized automatically.\n * @defaultValue true\n */\n isAutoResizingColumns?: boolean;\n /**\n * Reference to the tableNav instance\n * for programmatic control\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n tableNavRef?: React.RefObject<any>;\n /** Table instance created from `useTable`*/\n tableInstance: DataGridType<T>;\n /** Table sub-component overrides */\n components?: DataGridComponentsInterface<T>;\n /** @deprecated Use htmlAttributes, className and style on the root element instead */\n rootProps?: HtmlAttributes<'div'>;\n isSkeletonLoading?: boolean;\n skeletonProps?: React.ComponentProps<typeof Skeleton>;\n /** The target element for portaled elements to be rendered in, e.g. the modal root if the data grid is inside a modal.\n * This is used in for example the DropdownCell, RowsPerPage, and ColumnControls.\n */\n portalTarget?: HTMLElement | null;\n /** Rule-based conditional styling for cells and rows. */\n styleRules?: DataGridStyleRule[];\n /** Per-column converters that teach the style-rule engine how to interpret complex cell values. */\n styleRuleValueConverters?: DataGridStyleRuleValueConverters;\n ref?: React.Ref<HTMLDivElement>;\n};\n\nconst DEFAULT_STYLING: Required<DataGridProps<unknown>['styling']> = {\n borderStyle: BorderStyleEnum.Horizontal,\n hasHoverEffects: true,\n hasZebraStriping: false,\n headerStyle: HeaderStyleEnum.Filled,\n isCompact: false,\n};\n\nconst DataGridComponent = function DataGrid<T extends RowData = unknown>({\n isResizable = true,\n isLoading = false,\n isKeyboardNavigable = true,\n isAutoResizingColumns = true,\n tableInstance,\n components,\n rootProps,\n styling = {},\n tableNavRef,\n isSkeletonLoading = false,\n skeletonProps,\n ref,\n portalTarget = document.body,\n styleRules,\n styleRuleValueConverters,\n htmlAttributes,\n className,\n style,\n ...restProps\n}: CommonProps<'div', DataGridProps<T>>) {\n const { className: rootClassName = '', style: rootStyle = {} } =\n rootProps || {};\n\n const [isScrollable, setIsScrollable] = useState(false);\n const [isMediumNavigation, setIsMediumNavigation] = useState(false);\n const [isSmallNavigation, setIsSmallNavigation] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const scrollableContainerRef = useRef<HTMLDivElement>(null);\n\n tableInstance.setOptions((prevOptions) => {\n return {\n ...prevOptions,\n enableSorting: isSkeletonLoading ? false : prevOptions.enableSorting,\n };\n });\n\n // Triggers when the whole container is resized\n useResizeObserver({\n onResize: (entry) => {\n if (entry.width === undefined) {\n return;\n }\n isAutoResizingColumns &&\n !isResizable &&\n updateColumnWidths(tableInstance, entry.width); // don't resize columns when the table is resizable due to problems with the resize handler.\n setIsScrollable(tableInstance.getTotalSize() > entry.width);\n setIsMediumNavigation(entry.width <= 680);\n setIsSmallNavigation(entry.width <= 480);\n },\n ref: scrollableContainerRef as React.RefObject<HTMLElement>,\n });\n\n // Triggers when the individual columns are resized\n useResizeObserver({\n onResize: () => {\n if (scrollableContainerRef.current === null) {\n return;\n }\n setIsScrollable(\n tableInstance.getTotalSize() >\n scrollableContainerRef.current.clientWidth,\n );\n },\n ref: tableRef as React.RefObject<HTMLElement>,\n });\n\n const Styling = useMemo(\n () => ({\n ...DEFAULT_STYLING,\n ...styling,\n }),\n [styling],\n );\n\n const Components = useMemo(\n () =>\n ({\n ...DataGridComponents,\n ...components,\n }) as DataGridContextType<T>['components'],\n [components],\n );\n const ScrollableContainer = Components?.Scrollable\n ? Components.Scrollable\n : Scrollable;\n\n const { listeners, tableNav } = useTableNav({\n isDebug: false,\n });\n\n /** Surface the tableNav instance for programmatic control if needed */\n useImperativeHandle(tableNavRef, () => tableNav, [tableNav]);\n\n useEffect(() => {\n if (isAutoResizingColumns && isResizable) {\n updateColumnWidths(\n tableInstance,\n scrollableContainerRef.current?.clientWidth\n ? scrollableContainerRef.current.clientWidth - 1 // -1 to avoid horizontal scrollbar\n : 0,\n );\n }\n }, [isAutoResizingColumns, tableInstance, isResizable]);\n\n return (\n <DataGridContext.Provider\n value={\n {\n components: Components,\n dataGridNav: tableNav,\n hasResizeColumns: isAutoResizingColumns,\n isKeyboardNavigationEnabled: isKeyboardNavigable,\n isLoading: isLoading,\n isMediumNavigation,\n isResizable: isResizable,\n isSkeletonLoading,\n isSmallNavigation,\n portalTarget: portalTarget,\n skeletonProps,\n styleRuleValueConverters,\n styleRules,\n tableProps: tableInstance,\n } as DataGridContextType<T>\n }\n >\n <div\n // Root props needs to be first in order to override className\n {...rootProps}\n className={classNames('ndl-data-grid-root', rootClassName, className, {\n 'ndl-data-grid-border-horizontal':\n Styling.borderStyle === BorderStyleEnum.Horizontal ||\n Styling.borderStyle === BorderStyleEnum.AllSides,\n 'ndl-data-grid-border-vertical':\n Styling.borderStyle === BorderStyleEnum.Vertical ||\n Styling.borderStyle === BorderStyleEnum.AllSides,\n 'ndl-data-grid-compact': Styling.isCompact,\n 'ndl-data-grid-focusable-cells': isKeyboardNavigable,\n 'ndl-data-grid-header-filled':\n Styling.headerStyle === HeaderStyleEnum.Filled,\n 'ndl-data-grid-hover-effects': Styling.hasHoverEffects,\n 'ndl-data-grid-resizable': isResizable,\n 'ndl-data-grid-zebra-striping': Styling.hasZebraStriping,\n })}\n ref={ref}\n style={{ ...rootStyle, ...style }}\n {...restProps}\n {...htmlAttributes}\n {...(isKeyboardNavigable ? listeners : {})}\n >\n {/* Make DataGrid horizontally scrollable and avoid horizontal scrollbar have an extra vertical scrollbar (esp. Safari) */}\n {/* This behavior can be overridden by consumers through replacing the scrolling container */}\n <ScrollableContainer\n ref={scrollableContainerRef}\n htmlAttributes={{\n onKeyDown: (event) => {\n if (isScrollable && !isKeyboardNavigable) {\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n event.stopPropagation();\n }\n }\n },\n // Ensure that the user can focus and scroll inside the table with arrow keys even if there is no interactive element inside\n tabIndex: isScrollable && !isKeyboardNavigable ? 0 : undefined,\n }}\n >\n {/* Table content Area */}\n <div\n className=\"ndl-div-table\"\n role={isKeyboardNavigable ? 'grid' : 'table'}\n aria-busy={isLoading ? 'true' : 'false'}\n ref={tableRef}\n >\n {/* DataGrid Header Area */}\n {Components?.Header && <Components.Header />}\n {Components?.Body && <Components.Body />}\n </div>\n </ScrollableContainer>\n {/* Bottom Navigation Area */}\n {Components?.Navigation && <Components.Navigation />}\n </div>\n </DataGridContext.Provider>\n );\n};\n\nconst DataGridComponents = {\n ActionButton,\n ActionCell,\n Body,\n BodyCell,\n BodyRow,\n ColumnControls,\n DropDownCell,\n Header,\n HeaderCell,\n HeaderTitle,\n InlineEditCell,\n LoadingPlaceholder,\n Navigation,\n NoDataIcon,\n NoDataPlaceholder,\n NoDataPlaceholderContentWrapper,\n Pagination,\n PaginationArrowButton,\n PaginationNumericButton,\n PaginationNumericButtons,\n ResizingBar,\n RowsPerPage,\n Scrollable,\n TableResults,\n};\n\nconst DataGrid = Object.assign(DataGridComponent, DataGridComponents);\n\nexport { DataGrid };\n"]}
@@ -70,9 +70,9 @@ class DataGridNav {
70
70
  this.keys = [];
71
71
  }
72
72
  /** Used as a keyboard listener for key down */
73
- tableKeyDown(e) {
73
+ tableKeyDown(event) {
74
74
  var _a;
75
- this.debugLog('tableKeyDown', `Key pressed: ${e.key}`);
75
+ this.debugLog('tableKeyDown', `Key pressed: ${event.key}`);
76
76
  if (this.disabled) {
77
77
  this.debugLog('tableKeyDown', 'interaction is disabled');
78
78
  return;
@@ -87,69 +87,70 @@ class DataGridNav {
87
87
  * Cannot work with preventDefault as it will
88
88
  * first capture the event from an input in cell for example
89
89
  */
90
- if (keys_1.Keys.ArrowDown === e.key ||
91
- keys_1.Keys.ArrowUp === e.key ||
92
- keys_1.Keys.ArrowLeft === e.key ||
93
- keys_1.Keys.ArrowRight === e.key) {
94
- e.preventDefault();
90
+ if (keys_1.Keys.ArrowDown === event.key ||
91
+ keys_1.Keys.ArrowUp === event.key ||
92
+ keys_1.Keys.ArrowLeft === event.key ||
93
+ keys_1.Keys.ArrowRight === event.key) {
94
+ event.preventDefault();
95
95
  }
96
96
  /**
97
97
  * Add key to the stack if it's
98
98
  * not the same with the last (long press)
99
99
  */
100
- if (this.keys.length === 0 || this.keys[this.keys.length - 1] !== e.key) {
101
- this.keys.push(e.key);
100
+ if (this.keys.length === 0 ||
101
+ this.keys[this.keys.length - 1] !== event.key) {
102
+ this.keys.push(event.key);
102
103
  }
103
104
  /**
104
105
  * Need to check if we are inside a grid cell
105
106
  * or not to enable/disable Grid Navigation
106
107
  */
107
- if (!(e.target instanceof Element)) {
108
+ if (!(event.target instanceof Element)) {
108
109
  return;
109
110
  }
110
- const cell = (_a = e.target.parentElement) === null || _a === void 0 ? void 0 : _a.closest(`${this.selectors.Cell},${this.selectors.Row}`);
111
+ const cell = (_a = event.target.parentElement) === null || _a === void 0 ? void 0 : _a.closest(`${this.selectors.Cell},${this.selectors.Row}`);
111
112
  if (!cell) {
112
113
  this.debugLog('tableKeyDown', 'cell not found');
113
114
  return;
114
115
  }
115
116
  if (cell.matches(this.selectors.Cell)) {
116
117
  this.debugLog('tableKeyDown', 'event captured in cell');
117
- this.cellNavigation(e);
118
+ this.cellNavigation(event);
118
119
  }
119
120
  else {
120
121
  this.debugLog('tableKeyDown', 'event captured in grid');
121
- this.gridNavigation(e);
122
+ this.gridNavigation(event);
122
123
  }
123
124
  }
124
125
  /**
125
126
  * Handles the navigation inside a cell
126
127
  */
127
- cellNavigation(e) {
128
- if (!(e.target instanceof Element)) {
128
+ cellNavigation(event) {
129
+ if (!(event.target instanceof Element)) {
129
130
  return;
130
131
  }
131
- const cell = e.target.closest(this.selectors.Cell);
132
+ const cell = event.target.closest(this.selectors.Cell);
132
133
  if (!cell) {
133
134
  this.debugLog('cellNavigation', 'cell not found');
134
135
  return;
135
136
  }
136
137
  if (this.getValidFocusableChild(cell)) {
137
138
  this.debugLog('cellNavigation', 'valid focusable child found');
138
- this.gridNavigation(e);
139
+ this.gridNavigation(event);
139
140
  return;
140
141
  }
141
142
  const focusableWidgets = cell
142
143
  ? [...cell.querySelectorAll(this.selectors.Focusable)]
143
144
  : [];
144
- const widgetIdx = focusableWidgets.findIndex((el) => el === e.target);
145
+ const widgetIdx = focusableWidgets.findIndex((el) => el === event.target);
145
146
  /**
146
147
  * Keys: Escape
147
148
  * Restore grid navigation
148
149
  */
149
- if (e.key === keys_1.Keys.Escape && this.isFocusable(cell)) {
150
+ if (event.key === keys_1.Keys.Escape && this.isFocusable(cell)) {
150
151
  cell.focus();
151
- e.preventDefault();
152
- e.stopPropagation();
152
+ event.preventDefault();
153
+ event.stopPropagation();
153
154
  return;
154
155
  }
155
156
  /**
@@ -159,7 +160,7 @@ class DataGridNav {
159
160
  * Arrow Down disabled:
160
161
  * https://github.com/w3c/aria-practices/issues/2739#issuecomment-1613538972
161
162
  */
162
- if (e.key === keys_1.Keys.ArrowRight || e.key === keys_1.Keys.ArrowDown) {
163
+ if (event.key === keys_1.Keys.ArrowRight || event.key === keys_1.Keys.ArrowDown) {
163
164
  const nextFocusable = widgetIdx === focusableWidgets.length - 1 ? 0 : widgetIdx + 1;
164
165
  const widgetToFocus = focusableWidgets[nextFocusable];
165
166
  if (this.isFocusable(widgetToFocus)) {
@@ -174,7 +175,7 @@ class DataGridNav {
174
175
  * Arrow Up disabled:
175
176
  * https://github.com/w3c/aria-practices/issues/2739#issuecomment-1613538972
176
177
  */
177
- if (e.key === keys_1.Keys.ArrowLeft || e.key === keys_1.Keys.ArrowUp) {
178
+ if (event.key === keys_1.Keys.ArrowLeft || event.key === keys_1.Keys.ArrowUp) {
178
179
  const previousFocusable = widgetIdx === 0 ? focusableWidgets.length - 1 : widgetIdx - 1;
179
180
  const widgetToFocus = focusableWidgets[previousFocusable];
180
181
  if (this.isFocusable(widgetToFocus)) {
@@ -185,7 +186,7 @@ class DataGridNav {
185
186
  }
186
187
  /**
187
188
  * Get the valid focusable child of a cell
188
- * @return {FocusableElement | null} - The valid focusable child, or null if there are none or multiple focusable children
189
+ * @returns `FocusableElement` | `null` - The valid focusable child, or null if there are none or multiple focusable children
189
190
  */
190
191
  getValidFocusableChild(el) {
191
192
  const focusableChildren = [
@@ -202,9 +203,9 @@ class DataGridNav {
202
203
  * Handles the navigation outside a cell
203
204
  * on the grid level
204
205
  */
205
- gridNavigation(e) {
206
+ gridNavigation(event) {
206
207
  var _a;
207
- if (!(e.target instanceof Element)) {
208
+ if (!(event.target instanceof Element)) {
208
209
  return;
209
210
  }
210
211
  if (this.keys.length === 1) {
@@ -213,24 +214,24 @@ class DataGridNav {
213
214
  * Should move focus inside the cell to the first focusable element:
214
215
  * https://www.w3.org/WAI/ARIA/apg/patterns/grid/#gridNav_inside
215
216
  */
216
- if (e.key === keys_1.Keys.Enter) {
217
- const cell = e.target.querySelector(this.selectors.Focusable);
217
+ if (event.key === keys_1.Keys.Enter) {
218
+ const cell = event.target.querySelector(this.selectors.Focusable);
218
219
  if (cell && this.isFocusable(cell)) {
219
220
  // Enter can trigger child elements:
220
221
  // Source: https://www.reddit.com/r/learnjavascript/comments/14kpj24/wrong_keydown_listener_is_called_with_focus/
221
- // If the e.preventDefault causes issues, we can offset the execution with setTimeout
222
+ // If the event.preventDefault causes issues, we can offset the execution with setTimeout
222
223
  cell.focus();
223
- e.preventDefault();
224
+ event.preventDefault();
224
225
  }
225
226
  }
226
227
  /**
227
228
  * Keys: ArrowLeft, ArrowRight
228
229
  * Should move focus to the next/previous cell
229
230
  */
230
- if (e.key === keys_1.Keys.ArrowLeft || e.key === keys_1.Keys.ArrowRight) {
231
- const direction = e.key === keys_1.Keys.ArrowLeft ? 'prev' : 'next';
231
+ if (event.key === keys_1.Keys.ArrowLeft || event.key === keys_1.Keys.ArrowRight) {
232
+ const direction = event.key === keys_1.Keys.ArrowLeft ? 'prev' : 'next';
232
233
  // Get the closest cell we are currently in
233
- const cell = e.target.closest(this.selectors.Cell);
234
+ const cell = event.target.closest(this.selectors.Cell);
234
235
  if (cell && cell instanceof Element) {
235
236
  const closeFocusable = this.findUntil(direction, cell, this.selectors.Cell);
236
237
  if (closeFocusable) {
@@ -248,8 +249,8 @@ class DataGridNav {
248
249
  * Keys: Up,Down
249
250
  * Should move focus to the same column of the next/previous row
250
251
  */
251
- if (e.key === keys_1.Keys.ArrowDown || e.key === keys_1.Keys.ArrowUp) {
252
- this.verticalCellNavigation(e);
252
+ if (event.key === keys_1.Keys.ArrowDown || event.key === keys_1.Keys.ArrowUp) {
253
+ this.verticalCellNavigation(event);
253
254
  return;
254
255
  }
255
256
  /**
@@ -257,18 +258,18 @@ class DataGridNav {
257
258
  * Should move focus to the first/last row
258
259
  * or a predefined number of rows if user provides a value
259
260
  */
260
- if (e.key === keys_1.Keys.PageUp || e.key === keys_1.Keys.PageDown) {
261
- this.pageCellNavigation(e);
261
+ if (event.key === keys_1.Keys.PageUp || event.key === keys_1.Keys.PageDown) {
262
+ this.pageCellNavigation(event);
262
263
  return;
263
264
  }
264
265
  /**
265
266
  * Keys: Home, End
266
267
  * Should move focus to the first/last cell of the current row
267
268
  */
268
- if (e.key === keys_1.Keys.Home || e.key === keys_1.Keys.End) {
269
- const row = e.target.closest(this.selectors.Row);
269
+ if (event.key === keys_1.Keys.Home || event.key === keys_1.Keys.End) {
270
+ const row = event.target.closest(this.selectors.Row);
270
271
  const rowChildren = [...((row === null || row === void 0 ? void 0 : row.children) || [])];
271
- if (e.key === 'End') {
272
+ if (event.key === 'End') {
272
273
  rowChildren.reverse();
273
274
  }
274
275
  this.focusOnFirstCell(rowChildren);
@@ -282,7 +283,7 @@ class DataGridNav {
282
283
  const [firstKey, secondKey] = this.keys;
283
284
  if (firstKey === 'Control' &&
284
285
  (secondKey === keys_1.Keys.Home || secondKey === keys_1.Keys.End)) {
285
- const row = e.target.closest(this.selectors.Row);
286
+ const row = event.target.closest(this.selectors.Row);
286
287
  const siblings = (_a = row.parentElement) === null || _a === void 0 ? void 0 : _a.children;
287
288
  if (!siblings) {
288
289
  this.debugLog('cellNavigation', 'siblings not found');
@@ -297,20 +298,20 @@ class DataGridNav {
297
298
  }
298
299
  }
299
300
  }
300
- pageCellNavigation(e) {
301
+ pageCellNavigation(event) {
301
302
  var _a;
302
- if (!(e.target instanceof Element)) {
303
+ if (!(event.target instanceof Element)) {
303
304
  return;
304
305
  }
305
- const row = e.target.closest(this.selectors.Row);
306
- const cell = e.target.closest(this.selectors.Cell);
306
+ const row = event.target.closest(this.selectors.Row);
307
+ const cell = event.target.closest(this.selectors.Cell);
307
308
  if (row && cell) {
308
309
  const position = this.getColumnIndex(cell);
309
310
  if (position === undefined) {
310
311
  this.debugLog('cellNavigation', 'position not found');
311
312
  return;
312
313
  }
313
- const direction = e.key === keys_1.Keys.PageUp ? 'prev' : 'next';
314
+ const direction = event.key === keys_1.Keys.PageUp ? 'prev' : 'next';
314
315
  const siblings = (_a = row.parentElement) === null || _a === void 0 ? void 0 : _a.children;
315
316
  if (!siblings) {
316
317
  this.debugLog('cellNavigation', 'siblings not found');
@@ -325,7 +326,7 @@ class DataGridNav {
325
326
  return;
326
327
  }
327
328
  let lastVisitedSibling = sibling;
328
- for (let i = 0; i < this.pageUpDown - 1 && sibling; i++) {
329
+ for (let index = 0; index < this.pageUpDown - 1 && sibling; index++) {
329
330
  sibling = sibling[methodClbk];
330
331
  if (sibling) {
331
332
  lastVisitedSibling = sibling;
@@ -352,13 +353,13 @@ class DataGridNav {
352
353
  }
353
354
  }
354
355
  }
355
- verticalCellNavigation(e) {
356
+ verticalCellNavigation(event) {
356
357
  var _a, _b, _c, _d, _e;
357
- if (!(e.target instanceof Element)) {
358
+ if (!(event.target instanceof Element)) {
358
359
  return;
359
360
  }
360
- const row = e.target.closest(this.selectors.Row);
361
- const cell = e.target.closest(this.selectors.Cell);
361
+ const row = event.target.closest(this.selectors.Row);
362
+ const cell = event.target.closest(this.selectors.Cell);
362
363
  if (row && cell) {
363
364
  const cellPosition = this.getColumnIndex(cell);
364
365
  const rowPosition = this.getRowIndex(row);
@@ -368,7 +369,7 @@ class DataGridNav {
368
369
  this.debugLog('verticalCellNavigation', 'row or cell position not found');
369
370
  return;
370
371
  }
371
- const direction = e.key === keys_1.Keys.ArrowUp ? 'prev' : 'next';
372
+ const direction = event.key === keys_1.Keys.ArrowUp ? 'prev' : 'next';
372
373
  /** Find previous rowgroup and focus on the proper cell */
373
374
  if (rowPosition === 0 && direction === 'prev') {
374
375
  const currentRowGroup = (_a = row.parentElement) === null || _a === void 0 ? void 0 : _a.closest(this.selectors.RowGroup);
@@ -445,8 +446,8 @@ class DataGridNav {
445
446
  * reversed order
446
447
  */
447
448
  focusOnFirstCell(el) {
448
- for (let i = 0; i < el.length; i++) {
449
- const child = el[i];
449
+ for (let index = 0; index < el.length; index++) {
450
+ const child = el[index];
450
451
  if (this.isFocusable(child)) {
451
452
  child.focus();
452
453
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid-nav.js","sourceRoot":"","sources":["../../../../src/data-grid/data-grid-nav/data-grid-nav.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport { isValidInteractiveElement } from './helpers';\nimport { Keys } from './keys';\nimport { Selectors } from './selectors';\n\ntype FocusableElement = HTMLElement | SVGElement;\n\nexport type Config =\n | {\n /** Enable debug logs */\n isDebug?: boolean;\n /** CSS Selectors being used to find Rows, Row Groups, Cells and Focusable elements */\n selectors?: Partial<typeof Selectors>;\n /** How many rows to move when pressing page up/down - Default goes to first/last row */\n pageUpDown?: number;\n }\n | undefined;\n\nexport class DataGridNav {\n private selectors: Record<keyof typeof Selectors, string>;\n readonly pageUpDown: number | undefined;\n private keys: string[] = [];\n private disabled: boolean;\n readonly debug: boolean;\n\n constructor();\n constructor(config: Config);\n constructor(config: Config = {}) {\n const { selectors = {}, pageUpDown, isDebug = false } = config;\n this.selectors = { ...Selectors, ...selectors };\n this.pageUpDown = pageUpDown;\n this.keys = [];\n this.debug = isDebug;\n this.disabled = false;\n }\n\n private debugLog = (functionName: string, message: string) => {\n if (this.debug) {\n console.info(`[${functionName}]: ${message}`);\n }\n };\n\n /**\n * Disables the keyboard listener in cases\n * that elements inside the grid need to use\n * arrows keys etc., like select dropdowns\n */\n public disable() {\n this.disabled = true;\n }\n\n /**\n * Enables the keyboard listeners\n */\n public enable() {\n this.disabled = false;\n }\n\n private isFocusable(el: Element): el is FocusableElement {\n return el instanceof HTMLElement || el instanceof SVGElement;\n }\n\n public focusParentCell(el: Element) {\n const cell = el.closest(this.selectors.Cell);\n if (cell && this.isFocusable(cell)) {\n cell.focus();\n }\n }\n\n /** Used as a keyboard listener for key up */\n public tableKeyUp() {\n // TODO: have a cleanup as user can press key\n // and then move to another tab, and get back to the same tab\n // so this will not be empty (the bug exists with .pop)\n this.keys = [];\n }\n\n /** Used as a keyboard listener for key down */\n public tableKeyDown(e: KeyboardEvent) {\n this.debugLog('tableKeyDown', `Key pressed: ${e.key}`);\n if (this.disabled) {\n this.debugLog('tableKeyDown', 'interaction is disabled');\n return;\n }\n /**\n * Avoid page scrolling etc.\n * Enable default behavior for:\n * Tab, Shift + Tab\n * TODO: Actually it will be better to just prevent\n * in ArrowKeys and PageKeys maybe?\n * Or should the consumer stop propagation?!\n * Cannot work with preventDefault as it will\n * first capture the event from an input in cell for example\n */\n if (\n Keys.ArrowDown === e.key ||\n Keys.ArrowUp === e.key ||\n Keys.ArrowLeft === e.key ||\n Keys.ArrowRight === e.key\n ) {\n e.preventDefault();\n }\n\n /**\n * Add key to the stack if it's\n * not the same with the last (long press)\n */\n if (this.keys.length === 0 || this.keys[this.keys.length - 1] !== e.key) {\n this.keys.push(e.key);\n }\n\n /**\n * Need to check if we are inside a grid cell\n * or not to enable/disable Grid Navigation\n */\n if (!(e.target instanceof Element)) {\n return;\n }\n const cell = e.target.parentElement?.closest(\n `${this.selectors.Cell},${this.selectors.Row}`,\n );\n\n if (!cell) {\n this.debugLog('tableKeyDown', 'cell not found');\n return;\n }\n\n if (cell.matches(this.selectors.Cell)) {\n this.debugLog('tableKeyDown', 'event captured in cell');\n this.cellNavigation(e);\n } else {\n this.debugLog('tableKeyDown', 'event captured in grid');\n this.gridNavigation(e);\n }\n }\n\n /**\n * Handles the navigation inside a cell\n */\n public cellNavigation(e: KeyboardEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n\n const cell = e.target.closest(this.selectors.Cell);\n\n if (!cell) {\n this.debugLog('cellNavigation', 'cell not found');\n return;\n }\n\n if (this.getValidFocusableChild(cell)) {\n this.debugLog('cellNavigation', 'valid focusable child found');\n this.gridNavigation(e);\n return;\n }\n\n const focusableWidgets = cell\n ? [...cell.querySelectorAll(this.selectors.Focusable)]\n : [];\n const widgetIdx = focusableWidgets.findIndex((el) => el === e.target);\n\n /**\n * Keys: Escape\n * Restore grid navigation\n */\n if (e.key === Keys.Escape && this.isFocusable(cell)) {\n cell.focus();\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n /**\n * Keys: ArrowRight, ArrowDown\n * Move to the next focusable cell, or the first one\n *\n * Arrow Down disabled:\n * https://github.com/w3c/aria-practices/issues/2739#issuecomment-1613538972\n */\n if (e.key === Keys.ArrowRight || e.key === Keys.ArrowDown) {\n const nextFocusable =\n widgetIdx === focusableWidgets.length - 1 ? 0 : widgetIdx + 1;\n const widgetToFocus = focusableWidgets[nextFocusable];\n if (this.isFocusable(widgetToFocus)) {\n widgetToFocus.focus();\n }\n return;\n }\n\n /**\n * Keys: ArrowLeft, ArrowUp\n * Move to the previous focusable cell, or the last one\n *\n * Arrow Up disabled:\n * https://github.com/w3c/aria-practices/issues/2739#issuecomment-1613538972\n */\n if (e.key === Keys.ArrowLeft || e.key === Keys.ArrowUp) {\n const previousFocusable =\n widgetIdx === 0 ? focusableWidgets.length - 1 : widgetIdx - 1;\n const widgetToFocus = focusableWidgets[previousFocusable];\n if (this.isFocusable(widgetToFocus)) {\n widgetToFocus.focus();\n }\n return;\n }\n }\n\n /**\n * Get the valid focusable child of a cell\n * @return {FocusableElement | null} - The valid focusable child, or null if there are none or multiple focusable children\n */\n private getValidFocusableChild(el: Element): FocusableElement | null {\n const focusableChildren = [\n ...el.querySelectorAll(this.selectors.Focusable),\n ];\n if (\n focusableChildren.length === 1 &&\n isValidInteractiveElement(focusableChildren[0]) &&\n this.isFocusable(focusableChildren[0])\n ) {\n return focusableChildren[0];\n }\n return null;\n }\n\n /**\n * Handles the navigation outside a cell\n * on the grid level\n */\n public gridNavigation(e: KeyboardEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n\n if (this.keys.length === 1) {\n /**\n * Keys: Enter\n * Should move focus inside the cell to the first focusable element:\n * https://www.w3.org/WAI/ARIA/apg/patterns/grid/#gridNav_inside\n */\n if (e.key === Keys.Enter) {\n const cell = e.target.querySelector(this.selectors.Focusable);\n if (cell && this.isFocusable(cell)) {\n // Enter can trigger child elements:\n // Source: https://www.reddit.com/r/learnjavascript/comments/14kpj24/wrong_keydown_listener_is_called_with_focus/\n // If the e.preventDefault causes issues, we can offset the execution with setTimeout\n cell.focus();\n e.preventDefault();\n }\n }\n\n /**\n * Keys: ArrowLeft, ArrowRight\n * Should move focus to the next/previous cell\n */\n if (e.key === Keys.ArrowLeft || e.key === Keys.ArrowRight) {\n const direction = e.key === Keys.ArrowLeft ? 'prev' : 'next';\n // Get the closest cell we are currently in\n const cell = e.target.closest(this.selectors.Cell);\n\n if (cell && cell instanceof Element) {\n const closeFocusable = this.findUntil(\n direction,\n cell,\n this.selectors.Cell,\n );\n if (closeFocusable) {\n const focusableChild = this.getValidFocusableChild(closeFocusable);\n\n const toFocus = focusableChild ?? closeFocusable;\n toFocus.focus();\n toFocus.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }\n }\n\n /**\n * Keys: Up,Down\n * Should move focus to the same column of the next/previous row\n */\n if (e.key === Keys.ArrowDown || e.key === Keys.ArrowUp) {\n this.verticalCellNavigation(e);\n return;\n }\n\n /**\n * Keys: PageUp, PageDown\n * Should move focus to the first/last row\n * or a predefined number of rows if user provides a value\n */\n if (e.key === Keys.PageUp || e.key === Keys.PageDown) {\n this.pageCellNavigation(e);\n return;\n }\n\n /**\n * Keys: Home, End\n * Should move focus to the first/last cell of the current row\n */\n if (e.key === Keys.Home || e.key === Keys.End) {\n const row = e.target.closest(this.selectors.Row) as Element;\n const rowChildren = [...(row?.children || [])];\n if (e.key === 'End') {\n rowChildren.reverse();\n }\n this.focusOnFirstCell(rowChildren);\n }\n } else {\n /**\n * Keys: Control + Home, Control + End\n * Should move focus to the first/last cell of the first/last row\n */\n const [firstKey, secondKey] = this.keys;\n if (\n firstKey === 'Control' &&\n (secondKey === Keys.Home || secondKey === Keys.End)\n ) {\n const row = e.target.closest(this.selectors.Row) as Element;\n const siblings = row.parentElement?.children;\n\n if (!siblings) {\n this.debugLog('cellNavigation', 'siblings not found');\n return;\n }\n\n const rowToFocus =\n secondKey === Keys.Home ? siblings[0] : siblings[siblings.length - 1];\n const rowChildren = [...(rowToFocus?.children || [])];\n if (secondKey === Keys.End) {\n rowChildren.reverse();\n }\n this.focusOnFirstCell(rowChildren);\n }\n }\n }\n\n private pageCellNavigation(e: KeyboardEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n const row = e.target.closest(this.selectors.Row) as Element;\n const cell = e.target.closest(this.selectors.Cell) as Element;\n\n if (row && cell) {\n const position = this.getColumnIndex(cell);\n\n if (position === undefined) {\n this.debugLog('cellNavigation', 'position not found');\n return;\n }\n\n const direction = e.key === Keys.PageUp ? 'prev' : 'next';\n const siblings = row.parentElement?.children;\n\n if (!siblings) {\n this.debugLog('cellNavigation', 'siblings not found');\n return;\n }\n\n // If pageUpDown is defined, we should move that number of rows, or to the closest possible\n let destinationRow: Element | ChildNode;\n if (this.pageUpDown) {\n const methodClbk =\n direction === 'prev' ? 'previousSibling' : 'nextSibling';\n let sibling = row[methodClbk];\n if (sibling === null) {\n return;\n }\n\n let lastVisitedSibling = sibling;\n\n for (let i = 0; i < this.pageUpDown - 1 && sibling; i++) {\n sibling = sibling[methodClbk];\n if (sibling) {\n lastVisitedSibling = sibling;\n }\n }\n destinationRow = sibling ? sibling : lastVisitedSibling;\n } else {\n destinationRow =\n direction === 'prev' ? siblings[0] : siblings[siblings.length - 1];\n }\n if (!destinationRow || !(destinationRow instanceof Element)) {\n return;\n }\n\n const child = destinationRow.children[position];\n if (child && this.isFocusable(child)) {\n const focusableGrandChild = this.getValidFocusableChild(child);\n if (focusableGrandChild) {\n focusableGrandChild.focus();\n } else {\n child.focus();\n }\n }\n }\n }\n\n private verticalCellNavigation(e: KeyboardEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n const row = e.target.closest(this.selectors.Row) as Element;\n const cell = e.target.closest(this.selectors.Cell) as Element;\n\n if (row && cell) {\n const cellPosition = this.getColumnIndex(cell);\n const rowPosition = this.getRowIndex(row);\n this.debugLog('gridNavigation', `Initial row position: ${rowPosition}`);\n this.debugLog('gridNavigation', `Initial cell position: ${cellPosition}`);\n if (cellPosition === undefined || rowPosition === undefined) {\n this.debugLog(\n 'verticalCellNavigation',\n 'row or cell position not found',\n );\n return;\n }\n\n const direction = e.key === Keys.ArrowUp ? 'prev' : 'next';\n\n /** Find previous rowgroup and focus on the proper cell */\n if (rowPosition === 0 && direction === 'prev') {\n const currentRowGroup = row.parentElement?.closest(\n this.selectors.RowGroup,\n );\n const siblingRowGroups = [\n ...(currentRowGroup?.parentElement?.children || []),\n ];\n const currentRowGroupIdx = siblingRowGroups.findIndex(\n (el) => el === currentRowGroup,\n );\n if (currentRowGroupIdx !== 0) {\n const previousRowGroup = siblingRowGroups[currentRowGroupIdx - 1];\n const rows = [\n ...previousRowGroup.querySelectorAll(this.selectors.Row),\n ];\n const child = rows[rows.length - 1].children[cellPosition];\n if (child && this.isFocusable(child)) {\n const focusableGrandChild = this.getValidFocusableChild(child);\n if (focusableGrandChild) {\n focusableGrandChild.focus();\n } else {\n child.focus();\n }\n }\n return;\n }\n }\n\n const siblingRows = [\n ...(row.parentElement?.querySelectorAll(this.selectors.Row) || []),\n ];\n /** Find next rowgroup and focus on the proper cell */\n if (rowPosition === siblingRows.length - 1 && direction === 'next') {\n const currentRowGroup = row.parentElement?.closest(\n this.selectors.RowGroup,\n );\n const siblingRowGroups = [\n ...(currentRowGroup?.parentElement?.children || []),\n ];\n const currentRowGroupIdx = siblingRowGroups.findIndex(\n (el) => el === currentRowGroup,\n );\n if (currentRowGroupIdx !== siblingRowGroups.length - 1) {\n const nextRowGroup = siblingRowGroups[currentRowGroupIdx + 1];\n const rows = [...nextRowGroup.querySelectorAll(this.selectors.Row)];\n const child = rows[0].children[cellPosition];\n if (child && this.isFocusable(child)) {\n const focusableGrandChild = this.getValidFocusableChild(child);\n if (focusableGrandChild) {\n focusableGrandChild.focus();\n } else {\n child.focus();\n }\n }\n return;\n }\n return;\n }\n\n /** Navigation in the same rowgroup */\n const destinationRow = this.findUntil(direction, row, this.selectors.Row);\n if (!destinationRow) {\n return;\n }\n\n const child = destinationRow.children[cellPosition];\n if (child && this.isFocusable(child)) {\n const focusableGrandChild = this.getValidFocusableChild(child);\n if (focusableGrandChild) {\n focusableGrandChild.focus();\n } else {\n child.focus();\n }\n }\n }\n }\n\n /**\n * Sending a row `Element` and then the first cell will be focused.\n *\n * If you want to focus the last cell then the row children can be passed in\n * reversed order\n */\n private focusOnFirstCell(el: Element[]) {\n for (let i = 0; i < el.length; i++) {\n const child = el[i];\n if (this.isFocusable(child)) {\n child.focus();\n return;\n }\n }\n }\n\n /**\n * Get the column index of a `cell` based on the first `row` parent.\n * `cellIndex` could be used, but it's not supported in HTML tables.\n */\n private getColumnIndex(cell: Element) {\n let position = 0;\n const siblings = cell?.parentNode?.children;\n if (!siblings) {\n return undefined;\n }\n\n while (cell !== siblings[position] && siblings[position] !== undefined) {\n position++;\n }\n\n // Cell position find was not possible, maybe should log here\n if (siblings[position] === undefined) {\n this.debugLog('getColumnIndex', 'position finding was not successful');\n return undefined;\n }\n return position;\n }\n\n /**\n * Get the row index of a `row` based\n * on its sibling rows\n */\n private getRowIndex(row: Element) {\n let position = 0;\n const siblings = row?.parentNode?.children;\n if (!siblings) {\n return undefined;\n }\n\n while (row !== siblings[position] && siblings[position] !== undefined) {\n position++;\n }\n\n // Cell position find was not possible\n if (siblings[position] === undefined) {\n this.debugLog('getRowIndex', 'position finding was not successful');\n return undefined;\n }\n return position;\n }\n\n /**\n * Equivalent to prevUntil/nextUntil in jQuery\n * https://api.jquery.com/prevUntil/\n */\n private findUntil(\n direction: 'next' | 'prev',\n el: Element | ChildNode,\n matchSelector: string,\n exitSelector?: string,\n ): FocusableElement | null {\n let element: ChildNode = el;\n const method = direction === 'next' ? 'nextSibling' : 'previousSibling';\n\n while (element[method]) {\n const sibling = element[method];\n if (!sibling) {\n return null;\n }\n if (\n exitSelector &&\n sibling instanceof Element &&\n sibling.matches(exitSelector)\n ) {\n return null;\n }\n\n if (sibling instanceof Element && sibling.matches(matchSelector)) {\n return sibling as FocusableElement;\n }\n\n element = sibling;\n }\n\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"data-grid-nav.js","sourceRoot":"","sources":["../../../../src/data-grid/data-grid-nav/data-grid-nav.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,uCAAsD;AACtD,iCAA8B;AAC9B,2CAAwC;AAexC,MAAa,WAAW;IAStB,YAAY,SAAiB,EAAE;QANvB,SAAI,GAAa,EAAE,CAAC;QAepB,aAAQ,GAAG,CAAC,YAAoB,EAAE,OAAe,EAAE,EAAE;YAC3D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,MAAM,OAAO,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC;QAZA,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,UAAU,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;QAC/D,IAAI,CAAC,SAAS,mCAAQ,qBAAS,GAAK,SAAS,CAAE,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAQD;;;;OAIG;IACI,OAAO;QACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,MAAM;QACX,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEO,WAAW,CAAC,EAAW;QAC7B,OAAO,EAAE,YAAY,WAAW,IAAI,EAAE,YAAY,UAAU,CAAC;IAC/D,CAAC;IAEM,eAAe,CAAC,EAAW;QAChC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,6CAA6C;IACtC,UAAU;QACf,6CAA6C;QAC7C,8DAA8D;QAC9D,uDAAuD;QACvD,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,+CAA+C;IACxC,YAAY,CAAC,KAAoB;;QACtC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,gBAAgB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QACD;;;;;;;;;WASG;QACH,IACE,WAAI,CAAC,SAAS,KAAK,KAAK,CAAC,GAAG;YAC5B,WAAI,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG;YAC1B,WAAI,CAAC,SAAS,KAAK,KAAK,CAAC,GAAG;YAC5B,WAAI,CAAC,UAAU,KAAK,KAAK,CAAC,GAAG,EAC7B,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;QAED;;;WAGG;QACH,IACE,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,EAC7C,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QAED;;;WAGG;QACH,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAA,KAAK,CAAC,MAAM,CAAC,aAAa,0CAAE,OAAO,CAC9C,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAC/C,CAAC;QAEF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,KAAoB;QACxC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,6BAA6B,CAAC,CAAC;YAC/D,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI;YAC3B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;QAE1E;;;WAGG;QACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED;;;;;;WAMG;QACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,SAAS,EAAE,CAAC;YAClE,MAAM,aAAa,GACjB,SAAS,KAAK,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACtD,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpC,aAAa,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YACD,OAAO;QACT,CAAC;QAED;;;;;;WAMG;QACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,OAAO,EAAE,CAAC;YAC/D,MAAM,iBAAiB,GACrB,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpC,aAAa,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAAC,EAAW;QACxC,MAAM,iBAAiB,GAAG;YACxB,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SACjD,CAAC;QACF,IACE,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAC9B,IAAA,mCAAyB,EAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EACtC,CAAC;YACD,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,KAAoB;;QACxC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B;;;;eAIG;YACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAClE,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,oCAAoC;oBACpC,iHAAiH;oBACjH,yFAAyF;oBACzF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,KAAK,CAAC,cAAc,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC;YAED;;;eAGG;YACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,UAAU,EAAE,CAAC;gBAClE,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBACjE,2CAA2C;gBAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAEvD,IAAI,IAAI,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;oBACpC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CACnC,SAAS,EACT,IAAI,EACJ,IAAI,CAAC,SAAS,CAAC,IAAI,CACpB,CAAC;oBACF,IAAI,cAAc,EAAE,CAAC;wBACnB,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;wBAEnE,MAAM,OAAO,GAAG,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,cAAc,CAAC;wBACjD,OAAO,CAAC,KAAK,EAAE,CAAC;wBAChB,OAAO,CAAC,cAAc,CAAC;4BACrB,KAAK,EAAE,SAAS;4BAChB,MAAM,EAAE,SAAS;yBAClB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED;;;eAGG;YACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,OAAO,EAAE,CAAC;gBAC/D,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YAED;;;;eAIG;YACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7D,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED;;;eAGG;YACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,GAAG,EAAE,CAAC;gBACtD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAY,CAAC;gBAChE,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,KAAI,EAAE,CAAC,CAAC,CAAC;gBAC/C,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;oBACxB,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,CAAC;gBACD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;aAAM,CAAC;YACN;;;eAGG;YACH,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;YACxC,IACE,QAAQ,KAAK,SAAS;gBACtB,CAAC,SAAS,KAAK,WAAI,CAAC,IAAI,IAAI,SAAS,KAAK,WAAI,CAAC,GAAG,CAAC,EACnD,CAAC;gBACD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAY,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAA,GAAG,CAAC,aAAa,0CAAE,QAAQ,CAAC;gBAE7C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;oBACtD,OAAO;gBACT,CAAC;gBAED,MAAM,UAAU,GACd,SAAS,KAAK,WAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACxE,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,KAAI,EAAE,CAAC,CAAC,CAAC;gBACtD,IAAI,SAAS,KAAK,WAAI,CAAC,GAAG,EAAE,CAAC;oBAC3B,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,CAAC;gBACD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,KAAoB;;QAC7C,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAY,CAAC;QAChE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAY,CAAC;QAElE,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAA,GAAG,CAAC,aAAa,0CAAE,QAAQ,CAAC;YAE7C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,2FAA2F;YAC3F,IAAI,cAAmC,CAAC;YACxC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,UAAU,GACd,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC3D,IAAI,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC9B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,IAAI,kBAAkB,GAAG,OAAO,CAAC;gBAEjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;oBACpE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC9B,IAAI,OAAO,EAAE,CAAC;wBACZ,kBAAkB,GAAG,OAAO,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBACD,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,cAAc;oBACZ,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,YAAY,OAAO,CAAC,EAAE,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;gBAC/D,IAAI,mBAAmB,EAAE,CAAC;oBACxB,mBAAmB,CAAC,KAAK,EAAE,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,KAAoB;;QACjD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAY,CAAC;QAChE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAY,CAAC;QAElE,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,0BAA0B,YAAY,EAAE,CAAC,CAAC;YAC1E,IAAI,YAAY,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC5D,IAAI,CAAC,QAAQ,CACX,wBAAwB,EACxB,gCAAgC,CACjC,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK,WAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAE/D,0DAA0D;YAC1D,IAAI,WAAW,KAAK,CAAC,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBAC9C,MAAM,eAAe,GAAG,MAAA,GAAG,CAAC,aAAa,0CAAE,OAAO,CAChD,IAAI,CAAC,SAAS,CAAC,QAAQ,CACxB,CAAC;gBACF,MAAM,gBAAgB,GAAG;oBACvB,GAAG,CAAC,CAAA,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,aAAa,0CAAE,QAAQ,KAAI,EAAE,CAAC;iBACpD,CAAC;gBACF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,CACnD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,eAAe,CAC/B,CAAC;gBACF,IAAI,kBAAkB,KAAK,CAAC,EAAE,CAAC;oBAC7B,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;oBAClE,MAAM,IAAI,GAAG;wBACX,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;qBACzD,CAAC;oBACF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBAC3D,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;wBACrC,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;wBAC/D,IAAI,mBAAmB,EAAE,CAAC;4BACxB,mBAAmB,CAAC,KAAK,EAAE,CAAC;wBAC9B,CAAC;6BAAM,CAAC;4BACN,KAAK,CAAC,KAAK,EAAE,CAAC;wBAChB,CAAC;oBACH,CAAC;oBACD,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG;gBAClB,GAAG,CAAC,CAAA,MAAA,GAAG,CAAC,aAAa,0CAAE,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAI,EAAE,CAAC;aACnE,CAAC;YACF,sDAAsD;YACtD,IAAI,WAAW,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBACnE,MAAM,eAAe,GAAG,MAAA,GAAG,CAAC,aAAa,0CAAE,OAAO,CAChD,IAAI,CAAC,SAAS,CAAC,QAAQ,CACxB,CAAC;gBACF,MAAM,gBAAgB,GAAG;oBACvB,GAAG,CAAC,CAAA,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,aAAa,0CAAE,QAAQ,KAAI,EAAE,CAAC;iBACpD,CAAC;gBACF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,CACnD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,eAAe,CAC/B,CAAC;gBACF,IAAI,kBAAkB,KAAK,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvD,MAAM,YAAY,GAAG,gBAAgB,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;oBAC9D,MAAM,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;oBACpE,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBAC7C,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;wBACrC,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;wBAC/D,IAAI,mBAAmB,EAAE,CAAC;4BACxB,mBAAmB,CAAC,KAAK,EAAE,CAAC;wBAC9B,CAAC;6BAAM,CAAC;4BACN,KAAK,CAAC,KAAK,EAAE,CAAC;wBAChB,CAAC;oBACH,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,OAAO;YACT,CAAC;YAED,sCAAsC;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC1E,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACpD,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;gBAC/D,IAAI,mBAAmB,EAAE,CAAC;oBACxB,mBAAmB,CAAC,KAAK,EAAE,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,gBAAgB,CAAC,EAAa;QACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,IAAa;;QAClC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,0CAAE,QAAQ,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACvE,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,6DAA6D;QAC7D,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,qCAAqC,CAAC,CAAC;YACvE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,GAAY;;QAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,0CAAE,QAAQ,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,GAAG,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACtE,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,sCAAsC;QACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,qCAAqC,CAAC,CAAC;YACpE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACK,SAAS,CACf,SAA0B,EAC1B,EAAuB,EACvB,aAAqB,EACrB,YAAqB;QAErB,IAAI,OAAO,GAAc,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAExE,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IACE,YAAY;gBACZ,OAAO,YAAY,OAAO;gBAC1B,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,EAC7B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,OAAO,YAAY,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjE,OAAO,OAA2B,CAAC;YACrC,CAAC;YAED,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAxkBD,kCAwkBC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport { isValidInteractiveElement } from './helpers';\nimport { Keys } from './keys';\nimport { Selectors } from './selectors';\n\ntype FocusableElement = HTMLElement | SVGElement;\n\nexport type Config =\n | {\n /** Enable debug logs */\n isDebug?: boolean;\n /** CSS Selectors being used to find Rows, Row Groups, Cells and Focusable elements */\n selectors?: Partial<typeof Selectors>;\n /** How many rows to move when pressing page up/down - Default goes to first/last row */\n pageUpDown?: number;\n }\n | undefined;\n\nexport class DataGridNav {\n private selectors: Record<keyof typeof Selectors, string>;\n readonly pageUpDown: number | undefined;\n private keys: string[] = [];\n private disabled: boolean;\n readonly debug: boolean;\n\n constructor();\n constructor(config: Config);\n constructor(config: Config = {}) {\n const { selectors = {}, pageUpDown, isDebug = false } = config;\n this.selectors = { ...Selectors, ...selectors };\n this.pageUpDown = pageUpDown;\n this.keys = [];\n this.debug = isDebug;\n this.disabled = false;\n }\n\n private debugLog = (functionName: string, message: string) => {\n if (this.debug) {\n console.info(`[${functionName}]: ${message}`);\n }\n };\n\n /**\n * Disables the keyboard listener in cases\n * that elements inside the grid need to use\n * arrows keys etc., like select dropdowns\n */\n public disable() {\n this.disabled = true;\n }\n\n /**\n * Enables the keyboard listeners\n */\n public enable() {\n this.disabled = false;\n }\n\n private isFocusable(el: Element): el is FocusableElement {\n return el instanceof HTMLElement || el instanceof SVGElement;\n }\n\n public focusParentCell(el: Element) {\n const cell = el.closest(this.selectors.Cell);\n if (cell && this.isFocusable(cell)) {\n cell.focus();\n }\n }\n\n /** Used as a keyboard listener for key up */\n public tableKeyUp() {\n // TODO: have a cleanup as user can press key\n // and then move to another tab, and get back to the same tab\n // so this will not be empty (the bug exists with .pop)\n this.keys = [];\n }\n\n /** Used as a keyboard listener for key down */\n public tableKeyDown(event: KeyboardEvent) {\n this.debugLog('tableKeyDown', `Key pressed: ${event.key}`);\n if (this.disabled) {\n this.debugLog('tableKeyDown', 'interaction is disabled');\n return;\n }\n /**\n * Avoid page scrolling etc.\n * Enable default behavior for:\n * Tab, Shift + Tab\n * TODO: Actually it will be better to just prevent\n * in ArrowKeys and PageKeys maybe?\n * Or should the consumer stop propagation?!\n * Cannot work with preventDefault as it will\n * first capture the event from an input in cell for example\n */\n if (\n Keys.ArrowDown === event.key ||\n Keys.ArrowUp === event.key ||\n Keys.ArrowLeft === event.key ||\n Keys.ArrowRight === event.key\n ) {\n event.preventDefault();\n }\n\n /**\n * Add key to the stack if it's\n * not the same with the last (long press)\n */\n if (\n this.keys.length === 0 ||\n this.keys[this.keys.length - 1] !== event.key\n ) {\n this.keys.push(event.key);\n }\n\n /**\n * Need to check if we are inside a grid cell\n * or not to enable/disable Grid Navigation\n */\n if (!(event.target instanceof Element)) {\n return;\n }\n const cell = event.target.parentElement?.closest(\n `${this.selectors.Cell},${this.selectors.Row}`,\n );\n\n if (!cell) {\n this.debugLog('tableKeyDown', 'cell not found');\n return;\n }\n\n if (cell.matches(this.selectors.Cell)) {\n this.debugLog('tableKeyDown', 'event captured in cell');\n this.cellNavigation(event);\n } else {\n this.debugLog('tableKeyDown', 'event captured in grid');\n this.gridNavigation(event);\n }\n }\n\n /**\n * Handles the navigation inside a cell\n */\n public cellNavigation(event: KeyboardEvent) {\n if (!(event.target instanceof Element)) {\n return;\n }\n\n const cell = event.target.closest(this.selectors.Cell);\n\n if (!cell) {\n this.debugLog('cellNavigation', 'cell not found');\n return;\n }\n\n if (this.getValidFocusableChild(cell)) {\n this.debugLog('cellNavigation', 'valid focusable child found');\n this.gridNavigation(event);\n return;\n }\n\n const focusableWidgets = cell\n ? [...cell.querySelectorAll(this.selectors.Focusable)]\n : [];\n const widgetIdx = focusableWidgets.findIndex((el) => el === event.target);\n\n /**\n * Keys: Escape\n * Restore grid navigation\n */\n if (event.key === Keys.Escape && this.isFocusable(cell)) {\n cell.focus();\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n /**\n * Keys: ArrowRight, ArrowDown\n * Move to the next focusable cell, or the first one\n *\n * Arrow Down disabled:\n * https://github.com/w3c/aria-practices/issues/2739#issuecomment-1613538972\n */\n if (event.key === Keys.ArrowRight || event.key === Keys.ArrowDown) {\n const nextFocusable =\n widgetIdx === focusableWidgets.length - 1 ? 0 : widgetIdx + 1;\n const widgetToFocus = focusableWidgets[nextFocusable];\n if (this.isFocusable(widgetToFocus)) {\n widgetToFocus.focus();\n }\n return;\n }\n\n /**\n * Keys: ArrowLeft, ArrowUp\n * Move to the previous focusable cell, or the last one\n *\n * Arrow Up disabled:\n * https://github.com/w3c/aria-practices/issues/2739#issuecomment-1613538972\n */\n if (event.key === Keys.ArrowLeft || event.key === Keys.ArrowUp) {\n const previousFocusable =\n widgetIdx === 0 ? focusableWidgets.length - 1 : widgetIdx - 1;\n const widgetToFocus = focusableWidgets[previousFocusable];\n if (this.isFocusable(widgetToFocus)) {\n widgetToFocus.focus();\n }\n return;\n }\n }\n\n /**\n * Get the valid focusable child of a cell\n * @returns `FocusableElement` | `null` - The valid focusable child, or null if there are none or multiple focusable children\n */\n private getValidFocusableChild(el: Element): FocusableElement | null {\n const focusableChildren = [\n ...el.querySelectorAll(this.selectors.Focusable),\n ];\n if (\n focusableChildren.length === 1 &&\n isValidInteractiveElement(focusableChildren[0]) &&\n this.isFocusable(focusableChildren[0])\n ) {\n return focusableChildren[0];\n }\n return null;\n }\n\n /**\n * Handles the navigation outside a cell\n * on the grid level\n */\n public gridNavigation(event: KeyboardEvent) {\n if (!(event.target instanceof Element)) {\n return;\n }\n\n if (this.keys.length === 1) {\n /**\n * Keys: Enter\n * Should move focus inside the cell to the first focusable element:\n * https://www.w3.org/WAI/ARIA/apg/patterns/grid/#gridNav_inside\n */\n if (event.key === Keys.Enter) {\n const cell = event.target.querySelector(this.selectors.Focusable);\n if (cell && this.isFocusable(cell)) {\n // Enter can trigger child elements:\n // Source: https://www.reddit.com/r/learnjavascript/comments/14kpj24/wrong_keydown_listener_is_called_with_focus/\n // If the event.preventDefault causes issues, we can offset the execution with setTimeout\n cell.focus();\n event.preventDefault();\n }\n }\n\n /**\n * Keys: ArrowLeft, ArrowRight\n * Should move focus to the next/previous cell\n */\n if (event.key === Keys.ArrowLeft || event.key === Keys.ArrowRight) {\n const direction = event.key === Keys.ArrowLeft ? 'prev' : 'next';\n // Get the closest cell we are currently in\n const cell = event.target.closest(this.selectors.Cell);\n\n if (cell && cell instanceof Element) {\n const closeFocusable = this.findUntil(\n direction,\n cell,\n this.selectors.Cell,\n );\n if (closeFocusable) {\n const focusableChild = this.getValidFocusableChild(closeFocusable);\n\n const toFocus = focusableChild ?? closeFocusable;\n toFocus.focus();\n toFocus.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }\n }\n\n /**\n * Keys: Up,Down\n * Should move focus to the same column of the next/previous row\n */\n if (event.key === Keys.ArrowDown || event.key === Keys.ArrowUp) {\n this.verticalCellNavigation(event);\n return;\n }\n\n /**\n * Keys: PageUp, PageDown\n * Should move focus to the first/last row\n * or a predefined number of rows if user provides a value\n */\n if (event.key === Keys.PageUp || event.key === Keys.PageDown) {\n this.pageCellNavigation(event);\n return;\n }\n\n /**\n * Keys: Home, End\n * Should move focus to the first/last cell of the current row\n */\n if (event.key === Keys.Home || event.key === Keys.End) {\n const row = event.target.closest(this.selectors.Row) as Element;\n const rowChildren = [...(row?.children || [])];\n if (event.key === 'End') {\n rowChildren.reverse();\n }\n this.focusOnFirstCell(rowChildren);\n }\n } else {\n /**\n * Keys: Control + Home, Control + End\n * Should move focus to the first/last cell of the first/last row\n */\n const [firstKey, secondKey] = this.keys;\n if (\n firstKey === 'Control' &&\n (secondKey === Keys.Home || secondKey === Keys.End)\n ) {\n const row = event.target.closest(this.selectors.Row) as Element;\n const siblings = row.parentElement?.children;\n\n if (!siblings) {\n this.debugLog('cellNavigation', 'siblings not found');\n return;\n }\n\n const rowToFocus =\n secondKey === Keys.Home ? siblings[0] : siblings[siblings.length - 1];\n const rowChildren = [...(rowToFocus?.children || [])];\n if (secondKey === Keys.End) {\n rowChildren.reverse();\n }\n this.focusOnFirstCell(rowChildren);\n }\n }\n }\n\n private pageCellNavigation(event: KeyboardEvent) {\n if (!(event.target instanceof Element)) {\n return;\n }\n const row = event.target.closest(this.selectors.Row) as Element;\n const cell = event.target.closest(this.selectors.Cell) as Element;\n\n if (row && cell) {\n const position = this.getColumnIndex(cell);\n\n if (position === undefined) {\n this.debugLog('cellNavigation', 'position not found');\n return;\n }\n\n const direction = event.key === Keys.PageUp ? 'prev' : 'next';\n const siblings = row.parentElement?.children;\n\n if (!siblings) {\n this.debugLog('cellNavigation', 'siblings not found');\n return;\n }\n\n // If pageUpDown is defined, we should move that number of rows, or to the closest possible\n let destinationRow: Element | ChildNode;\n if (this.pageUpDown) {\n const methodClbk =\n direction === 'prev' ? 'previousSibling' : 'nextSibling';\n let sibling = row[methodClbk];\n if (sibling === null) {\n return;\n }\n\n let lastVisitedSibling = sibling;\n\n for (let index = 0; index < this.pageUpDown - 1 && sibling; index++) {\n sibling = sibling[methodClbk];\n if (sibling) {\n lastVisitedSibling = sibling;\n }\n }\n destinationRow = sibling ? sibling : lastVisitedSibling;\n } else {\n destinationRow =\n direction === 'prev' ? siblings[0] : siblings[siblings.length - 1];\n }\n if (!destinationRow || !(destinationRow instanceof Element)) {\n return;\n }\n\n const child = destinationRow.children[position];\n if (child && this.isFocusable(child)) {\n const focusableGrandChild = this.getValidFocusableChild(child);\n if (focusableGrandChild) {\n focusableGrandChild.focus();\n } else {\n child.focus();\n }\n }\n }\n }\n\n private verticalCellNavigation(event: KeyboardEvent) {\n if (!(event.target instanceof Element)) {\n return;\n }\n const row = event.target.closest(this.selectors.Row) as Element;\n const cell = event.target.closest(this.selectors.Cell) as Element;\n\n if (row && cell) {\n const cellPosition = this.getColumnIndex(cell);\n const rowPosition = this.getRowIndex(row);\n this.debugLog('gridNavigation', `Initial row position: ${rowPosition}`);\n this.debugLog('gridNavigation', `Initial cell position: ${cellPosition}`);\n if (cellPosition === undefined || rowPosition === undefined) {\n this.debugLog(\n 'verticalCellNavigation',\n 'row or cell position not found',\n );\n return;\n }\n\n const direction = event.key === Keys.ArrowUp ? 'prev' : 'next';\n\n /** Find previous rowgroup and focus on the proper cell */\n if (rowPosition === 0 && direction === 'prev') {\n const currentRowGroup = row.parentElement?.closest(\n this.selectors.RowGroup,\n );\n const siblingRowGroups = [\n ...(currentRowGroup?.parentElement?.children || []),\n ];\n const currentRowGroupIdx = siblingRowGroups.findIndex(\n (el) => el === currentRowGroup,\n );\n if (currentRowGroupIdx !== 0) {\n const previousRowGroup = siblingRowGroups[currentRowGroupIdx - 1];\n const rows = [\n ...previousRowGroup.querySelectorAll(this.selectors.Row),\n ];\n const child = rows[rows.length - 1].children[cellPosition];\n if (child && this.isFocusable(child)) {\n const focusableGrandChild = this.getValidFocusableChild(child);\n if (focusableGrandChild) {\n focusableGrandChild.focus();\n } else {\n child.focus();\n }\n }\n return;\n }\n }\n\n const siblingRows = [\n ...(row.parentElement?.querySelectorAll(this.selectors.Row) || []),\n ];\n /** Find next rowgroup and focus on the proper cell */\n if (rowPosition === siblingRows.length - 1 && direction === 'next') {\n const currentRowGroup = row.parentElement?.closest(\n this.selectors.RowGroup,\n );\n const siblingRowGroups = [\n ...(currentRowGroup?.parentElement?.children || []),\n ];\n const currentRowGroupIdx = siblingRowGroups.findIndex(\n (el) => el === currentRowGroup,\n );\n if (currentRowGroupIdx !== siblingRowGroups.length - 1) {\n const nextRowGroup = siblingRowGroups[currentRowGroupIdx + 1];\n const rows = [...nextRowGroup.querySelectorAll(this.selectors.Row)];\n const child = rows[0].children[cellPosition];\n if (child && this.isFocusable(child)) {\n const focusableGrandChild = this.getValidFocusableChild(child);\n if (focusableGrandChild) {\n focusableGrandChild.focus();\n } else {\n child.focus();\n }\n }\n return;\n }\n return;\n }\n\n /** Navigation in the same rowgroup */\n const destinationRow = this.findUntil(direction, row, this.selectors.Row);\n if (!destinationRow) {\n return;\n }\n\n const child = destinationRow.children[cellPosition];\n if (child && this.isFocusable(child)) {\n const focusableGrandChild = this.getValidFocusableChild(child);\n if (focusableGrandChild) {\n focusableGrandChild.focus();\n } else {\n child.focus();\n }\n }\n }\n }\n\n /**\n * Sending a row `Element` and then the first cell will be focused.\n *\n * If you want to focus the last cell then the row children can be passed in\n * reversed order\n */\n private focusOnFirstCell(el: Element[]) {\n for (let index = 0; index < el.length; index++) {\n const child = el[index];\n if (this.isFocusable(child)) {\n child.focus();\n return;\n }\n }\n }\n\n /**\n * Get the column index of a `cell` based on the first `row` parent.\n * `cellIndex` could be used, but it's not supported in HTML tables.\n */\n private getColumnIndex(cell: Element) {\n let position = 0;\n const siblings = cell?.parentNode?.children;\n if (!siblings) {\n return undefined;\n }\n\n while (cell !== siblings[position] && siblings[position] !== undefined) {\n position++;\n }\n\n // Cell position find was not possible, maybe should log here\n if (siblings[position] === undefined) {\n this.debugLog('getColumnIndex', 'position finding was not successful');\n return undefined;\n }\n return position;\n }\n\n /**\n * Get the row index of a `row` based\n * on its sibling rows\n */\n private getRowIndex(row: Element) {\n let position = 0;\n const siblings = row?.parentNode?.children;\n if (!siblings) {\n return undefined;\n }\n\n while (row !== siblings[position] && siblings[position] !== undefined) {\n position++;\n }\n\n // Cell position find was not possible\n if (siblings[position] === undefined) {\n this.debugLog('getRowIndex', 'position finding was not successful');\n return undefined;\n }\n return position;\n }\n\n /**\n * Equivalent to prevUntil/nextUntil in jQuery\n * https://api.jquery.com/prevUntil/\n */\n private findUntil(\n direction: 'next' | 'prev',\n el: Element | ChildNode,\n matchSelector: string,\n exitSelector?: string,\n ): FocusableElement | null {\n let element: ChildNode = el;\n const method = direction === 'next' ? 'nextSibling' : 'previousSibling';\n\n while (element[method]) {\n const sibling = element[method];\n if (!sibling) {\n return null;\n }\n if (\n exitSelector &&\n sibling instanceof Element &&\n sibling.matches(exitSelector)\n ) {\n return null;\n }\n\n if (sibling instanceof Element && sibling.matches(matchSelector)) {\n return sibling as FocusableElement;\n }\n\n element = sibling;\n }\n\n return null;\n }\n}\n"]}
@@ -23,7 +23,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
23
23
  exports.isValidInteractiveElement = void 0;
24
24
  /**
25
25
  * This function checks that an element is interactive and of a type that doesn't disrupt grid navigation.
26
- * @param element the element to check
26
+ * @param element - The element to check
27
27
  * @returns true if the element is an interactive element that doesn't disrupt grid navigation
28
28
  */
29
29
  const isValidInteractiveElement = (element) => {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/data-grid/data-grid-nav/helpers.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH;;;;GAIG;AACI,MAAM,yBAAyB,GAAG,CAAC,OAAgB,EAAW,EAAE;IACrE,IAAI,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5D,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;QACpC,UAAU;QACV,OAAO;QACP,QAAQ;QACR,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,SAAS,GAAI,OAA4B,CAAC,IAAI,CAAC;QACrD,OAAO,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAvBW,QAAA,yBAAyB,6BAuBpC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n/**\n * This function checks that an element is interactive and of a type that doesn't disrupt grid navigation.\n * @param element the element to check\n * @returns true if the element is an interactive element that doesn't disrupt grid navigation\n */\nexport const isValidInteractiveElement = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n\n const interactiveTags = new Set(['A', 'BUTTON', 'DETAILS']);\n const interactiveInputTypes = new Set([\n 'checkbox',\n 'radio',\n 'submit',\n 'reset',\n ]);\n\n if (interactiveTags.has(element.tagName)) {\n return true;\n }\n\n if (element.tagName === 'INPUT') {\n const inputType = (element as HTMLInputElement).type;\n return interactiveInputTypes.has(inputType);\n }\n\n return false;\n};\n"]}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/data-grid/data-grid-nav/helpers.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH;;;;GAIG;AACI,MAAM,yBAAyB,GAAG,CAAC,OAAgB,EAAW,EAAE;IACrE,IAAI,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5D,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;QACpC,UAAU;QACV,OAAO;QACP,QAAQ;QACR,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,SAAS,GAAI,OAA4B,CAAC,IAAI,CAAC;QACrD,OAAO,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAvBW,QAAA,yBAAyB,6BAuBpC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n/**\n * This function checks that an element is interactive and of a type that doesn't disrupt grid navigation.\n * @param element - The element to check\n * @returns true if the element is an interactive element that doesn't disrupt grid navigation\n */\nexport const isValidInteractiveElement = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n\n const interactiveTags = new Set(['A', 'BUTTON', 'DETAILS']);\n const interactiveInputTypes = new Set([\n 'checkbox',\n 'radio',\n 'submit',\n 'reset',\n ]);\n\n if (interactiveTags.has(element.tagName)) {\n return true;\n }\n\n if (element.tagName === 'INPUT') {\n const inputType = (element as HTMLInputElement).type;\n return interactiveInputTypes.has(inputType);\n }\n\n return false;\n};\n"]}
@@ -32,7 +32,7 @@ function useTableNav(options) {
32
32
  }
33
33
  // A piece of state to force a re-render when you want to react to instance changes
34
34
  const [, setVersion] = (0, react_1.useState)(0);
35
- const forceUpdate = (0, react_1.useCallback)(() => setVersion((v) => v + 1), []);
35
+ const forceUpdate = (0, react_1.useCallback)(() => setVersion((version) => version + 1), []);
36
36
  // Wrap the instance in a proxy that intercepts reads/writes
37
37
  const proxiedInstance = (0, react_1.useMemo)(() => {
38
38
  const handler = {
@@ -69,7 +69,7 @@ function useTableNav(options) {
69
69
  }, [forceUpdate]);
70
70
  return {
71
71
  listeners: {
72
- onKeyDown: (e) => proxiedInstance.tableKeyDown(e.nativeEvent),
72
+ onKeyDown: (event) => proxiedInstance.tableKeyDown(event.nativeEvent),
73
73
  onKeyUp: () => proxiedInstance.tableKeyUp(),
74
74
  },
75
75
  tableNav: proxiedInstance,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data-grid/data-grid-nav/index.tsx"],"names":[],"mappings":";;AAyBA,kCA2DC;AA/DD,iCAA+D;AAE/D,mDAA2D;AAE3D,SAAgB,WAAW,CAAC,OAAgB;IAC1C,qEAAqE;IACrE,MAAM,WAAW,GAAG,IAAA,cAAM,EAAqB,IAAI,CAAC,CAAC;IACrD,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACjC,WAAW,CAAC,OAAO,GAAG,IAAI,2BAAW,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,mFAAmF;IACnF,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,CAAC,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpE,4DAA4D;IAC5D,MAAM,eAAe,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QACnC,MAAM,OAAO,GAA8B;YACzC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;gBACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAElD,+DAA+D;gBAC/D,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,8DAA8D;oBAC9D,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE;wBACxB,2BAA2B;wBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;wBAEzC,2EAA2E;wBAC3E,oFAAoF;wBACpF,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;4BACjD,WAAW,EAAE,CAAC;wBAChB,CAAC;wBACD,OAAO,MAAM,CAAC;oBAChB,CAAC,CAAC;gBACJ,CAAC;gBAED,8CAA8C;gBAC9C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,mEAAmE;YACnE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ;gBAClC,gEAAgE;gBAChE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC7D,+CAA+C;gBAC/C,WAAW,EAAE,CAAC;gBACd,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;QAEF,OAAO,IAAI,KAAK,CAAC,WAAW,CAAC,OAAsB,EAAE,OAAO,CAAC,CAAC;QAC9D,+EAA+E;IACjF,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO;QACL,SAAS,EAAE;YACT,SAAS,EAAE,CAAC,CAAsB,EAAE,EAAE,CACpC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;YAC7C,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE;SAC5C;QACD,QAAQ,EAAE,eAAe;KAC1B,CAAC;AACJ,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport type React from 'react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { type Config, DataGridNav } from './data-grid-nav';\n\nexport function useTableNav(options?: Config) {\n // Store the actual class instance in a ref so we only create it once\n const instanceRef = useRef<DataGridNav | null>(null);\n if (instanceRef.current === null) {\n instanceRef.current = new DataGridNav(options);\n }\n\n // A piece of state to force a re-render when you want to react to instance changes\n const [, setVersion] = useState(0);\n const forceUpdate = useCallback(() => setVersion((v) => v + 1), []);\n\n // Wrap the instance in a proxy that intercepts reads/writes\n const proxiedInstance = useMemo(() => {\n const handler: ProxyHandler<DataGridNav> = {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // If it's a function (a class method), we can intercept calls:\n if (typeof value === 'function') {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (...args: any[]) => {\n // Call the original method\n const result = value.apply(target, args);\n\n // Example: force re-render if the method is known to change internal state\n // or if you want to force re-render after *every* method call, remove the condition\n if (['enable', 'disable'].includes(String(prop))) {\n forceUpdate();\n }\n return result;\n };\n }\n\n // Otherwise, it's a property. Just return it.\n return value;\n },\n\n // Trap for property assignments, so React can re-render on changes\n set(target, prop, newValue, receiver) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const result = Reflect.set(target, prop, newValue, receiver);\n // Force re-render after setting *any* property\n forceUpdate();\n return result;\n },\n };\n\n return new Proxy(instanceRef.current as DataGridNav, handler);\n // We only want to create a new Proxy if the instanceRef or forceUpdate changes\n }, [forceUpdate]);\n\n return {\n listeners: {\n onKeyDown: (e: React.KeyboardEvent) =>\n proxiedInstance.tableKeyDown(e.nativeEvent),\n onKeyUp: () => proxiedInstance.tableKeyUp(),\n },\n tableNav: proxiedInstance,\n };\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data-grid/data-grid-nav/index.tsx"],"names":[],"mappings":";;AAyBA,kCA8DC;AAlED,iCAA+D;AAE/D,mDAA2D;AAE3D,SAAgB,WAAW,CAAC,OAAgB;IAC1C,qEAAqE;IACrE,MAAM,WAAW,GAAG,IAAA,cAAM,EAAqB,IAAI,CAAC,CAAC;IACrD,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACjC,WAAW,CAAC,OAAO,GAAG,IAAI,2BAAW,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,mFAAmF;IACnF,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,CAAC,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,IAAA,mBAAW,EAC7B,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,EAC1C,EAAE,CACH,CAAC;IAEF,4DAA4D;IAC5D,MAAM,eAAe,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QACnC,MAAM,OAAO,GAA8B;YACzC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;gBACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAElD,+DAA+D;gBAC/D,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,8DAA8D;oBAC9D,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE;wBACxB,2BAA2B;wBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;wBAEzC,2EAA2E;wBAC3E,oFAAoF;wBACpF,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;4BACjD,WAAW,EAAE,CAAC;wBAChB,CAAC;wBACD,OAAO,MAAM,CAAC;oBAChB,CAAC,CAAC;gBACJ,CAAC;gBAED,8CAA8C;gBAC9C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,mEAAmE;YACnE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ;gBAClC,gEAAgE;gBAChE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC7D,+CAA+C;gBAC/C,WAAW,EAAE,CAAC;gBACd,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;QAEF,OAAO,IAAI,KAAK,CAAC,WAAW,CAAC,OAAsB,EAAE,OAAO,CAAC,CAAC;QAC9D,+EAA+E;IACjF,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO;QACL,SAAS,EAAE;YACT,SAAS,EAAE,CAAC,KAA0B,EAAE,EAAE,CACxC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC;YACjD,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE;SAC5C;QACD,QAAQ,EAAE,eAAe;KAC1B,CAAC;AACJ,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport type React from 'react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { type Config, DataGridNav } from './data-grid-nav';\n\nexport function useTableNav(options?: Config) {\n // Store the actual class instance in a ref so we only create it once\n const instanceRef = useRef<DataGridNav | null>(null);\n if (instanceRef.current === null) {\n instanceRef.current = new DataGridNav(options);\n }\n\n // A piece of state to force a re-render when you want to react to instance changes\n const [, setVersion] = useState(0);\n const forceUpdate = useCallback(\n () => setVersion((version) => version + 1),\n [],\n );\n\n // Wrap the instance in a proxy that intercepts reads/writes\n const proxiedInstance = useMemo(() => {\n const handler: ProxyHandler<DataGridNav> = {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // If it's a function (a class method), we can intercept calls:\n if (typeof value === 'function') {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (...args: any[]) => {\n // Call the original method\n const result = value.apply(target, args);\n\n // Example: force re-render if the method is known to change internal state\n // or if you want to force re-render after *every* method call, remove the condition\n if (['enable', 'disable'].includes(String(prop))) {\n forceUpdate();\n }\n return result;\n };\n }\n\n // Otherwise, it's a property. Just return it.\n return value;\n },\n\n // Trap for property assignments, so React can re-render on changes\n set(target, prop, newValue, receiver) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const result = Reflect.set(target, prop, newValue, receiver);\n // Force re-render after setting *any* property\n forceUpdate();\n return result;\n },\n };\n\n return new Proxy(instanceRef.current as DataGridNav, handler);\n // We only want to create a new Proxy if the instanceRef or forceUpdate changes\n }, [forceUpdate]);\n\n return {\n listeners: {\n onKeyDown: (event: React.KeyboardEvent) =>\n proxiedInstance.tableKeyDown(event.nativeEvent),\n onKeyUp: () => proxiedInstance.tableKeyUp(),\n },\n tableNav: proxiedInstance,\n };\n}\n"]}