@oracle/oraclejet-preact 21.0.0 → 21.0.1

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 (898) hide show
  1. package/amd/{BaseDiagram-295ed9cc.js → BaseDiagram-7845a7ae.js} +2 -2
  2. package/amd/{BaseDiagram-295ed9cc.js.map → BaseDiagram-7845a7ae.js.map} +1 -1
  3. package/amd/{BaseNavigationListItem-299cbfab.js → BaseNavigationListItem-0efcad58.js} +2 -2
  4. package/amd/{BaseNavigationListItem-299cbfab.js.map → BaseNavigationListItem-0efcad58.js.map} +1 -1
  5. package/amd/{CollapsibleNavigationListExternalLinkItem-fcf1805d.js → CollapsibleNavigationListExternalLinkItem-06a92293.js} +2 -2
  6. package/amd/{CollapsibleNavigationListExternalLinkItem-fcf1805d.js.map → CollapsibleNavigationListExternalLinkItem-06a92293.js.map} +1 -1
  7. package/amd/{ColorInputText-55b31f03.js → ColorInputText-3ac0f956.js} +2 -2
  8. package/amd/{ColorInputText-55b31f03.js.map → ColorInputText-3ac0f956.js.map} +1 -1
  9. package/amd/ColorPickerVariants.styles.css +1 -1
  10. package/amd/ColorPickerVariants.styles2.css +1 -1
  11. package/amd/ColorSwatchVariants.styles.css +1 -1
  12. package/amd/ColorSwatchVariants.styles2.css +1 -1
  13. package/amd/ContainerDiagram-5e392270.js +2 -0
  14. package/amd/{ContainerDiagram-521f402a.js.map → ContainerDiagram-5e392270.js.map} +1 -1
  15. package/amd/ConveyorBeltVariants.styles.css +6 -6
  16. package/amd/ConveyorBeltVariants.styles2.css +6 -6
  17. package/amd/{Diagram-b73d20a3.js → Diagram-3ef5b038.js} +2 -2
  18. package/amd/{Diagram-b73d20a3.js.map → Diagram-3ef5b038.js.map} +1 -1
  19. package/amd/DiagramStyles.styles2.css +16 -10
  20. package/amd/DiagramStyles.styles3.css +10 -16
  21. package/amd/DrawerPopupVariants.styles.css +5 -5
  22. package/amd/DrawerPopupVariants.styles2.css +5 -5
  23. package/amd/Expander-4b1f2445.js +2 -0
  24. package/amd/{Expander-150fa95e.js.map → Expander-4b1f2445.js.map} +1 -1
  25. package/amd/FormLayoutVariants.styles.css +14 -14
  26. package/amd/FormLayoutVariants.styles2.css +14 -14
  27. package/amd/IndentedCellLayout-dc0896ab.js +1 -1
  28. package/amd/IndentedCellLayout-dc0896ab.js.map +1 -1
  29. package/amd/{InputColor-019b9397.js → InputColor-96a82077.js} +2 -2
  30. package/amd/{InputColor-019b9397.js.map → InputColor-96a82077.js.map} +1 -1
  31. package/amd/InputDatePicker-37824ba4.js +2 -0
  32. package/amd/{InputDatePicker-613800d1.js.map → InputDatePicker-37824ba4.js.map} +1 -1
  33. package/amd/ListStyles.styles.css +105 -7
  34. package/amd/ListStyles.styles2.css +7 -105
  35. package/amd/MeterCircleVariants.styles.css +8 -8
  36. package/amd/MeterCircleVariants.styles2.css +8 -8
  37. package/amd/NavigationListExternalLinkItem-382cd5a2.js +2 -0
  38. package/amd/{NavigationListExternalLinkItem-3d98a9e8.js.map → NavigationListExternalLinkItem-382cd5a2.js.map} +1 -1
  39. package/amd/NavigationListLinkItem-8ed2c18d.js +2 -0
  40. package/amd/{NavigationListLinkItem-c4b2b73c.js.map → NavigationListLinkItem-8ed2c18d.js.map} +1 -1
  41. package/amd/OverflowTabBar-9e7277f4.js +2 -0
  42. package/amd/OverflowTabBar-9e7277f4.js.map +1 -0
  43. package/amd/OverflowTabBarItem-7d80beed.js +2 -0
  44. package/amd/{OverflowTabBarItem-11f199ee.js.map → OverflowTabBarItem-7d80beed.js.map} +1 -1
  45. package/amd/PRIVATE_BaseDiagram.js +1 -1
  46. package/amd/PRIVATE_List/themes/ListStyles.css.js +1 -1
  47. package/amd/PRIVATE_List.js +1 -1
  48. package/amd/PRIVATE_SelectCommon.js +1 -1
  49. package/amd/PRIVATE_Table.js +1 -1
  50. package/amd/PRIVATE_TableList/themes/ListStyles.css.js +1 -1
  51. package/amd/PRIVATE_TableList/themes/redwood/ListTheme.js +1 -1
  52. package/amd/PRIVATE_TableList/themes/redwood/ListTheme.js.map +1 -1
  53. package/amd/PRIVATE_TableList/themes/redwood/ListVariants.css.js +1 -1
  54. package/amd/PRIVATE_TableList/themes/stable/ListTheme.js +1 -1
  55. package/amd/PRIVATE_TableList/themes/stable/ListTheme.js.map +1 -1
  56. package/amd/PRIVATE_TableList/themes/stable/ListVariants.css.js +1 -1
  57. package/amd/PRIVATE_TableList.js +1 -1
  58. package/amd/ProgressBarVariants.styles.css +1 -1
  59. package/amd/ProgressBarVariants.styles2.css +1 -1
  60. package/amd/ProgressCircleVariants.styles.css +4 -4
  61. package/amd/ProgressCircleVariants.styles2.css +4 -4
  62. package/amd/RadioIconVariants.styles.css +3 -3
  63. package/amd/RadioIconVariants.styles2.css +3 -3
  64. package/amd/{ReorderableTabBar-35cce8ac.js → ReorderableTabBar-7fb56c0b.js} +2 -2
  65. package/amd/{ReorderableTabBar-35cce8ac.js.map → ReorderableTabBar-7fb56c0b.js.map} +1 -1
  66. package/amd/SortControl-eb114fee.js +2 -0
  67. package/amd/{SortControl-115bc431.js.map → SortControl-eb114fee.js.map} +1 -1
  68. package/amd/TabBar-34e0073f.js +2 -0
  69. package/amd/TabBar-34e0073f.js.map +1 -0
  70. package/amd/{TabBarItem-191d0223.js → TabBarItem-60866864.js} +2 -2
  71. package/amd/{TabBarItem-191d0223.js.map → TabBarItem-60866864.js.map} +1 -1
  72. package/amd/TabBarItemVariants.styles.css +3 -3
  73. package/amd/TabBarItemVariants.styles2.css +3 -3
  74. package/amd/{TabBarLinkItem-5f376f4e.js → TabBarLinkItem-7b5b5b73.js} +2 -2
  75. package/amd/{TabBarLinkItem-5f376f4e.js.map → TabBarLinkItem-7b5b5b73.js.map} +1 -1
  76. package/amd/TabBarMixed-b61a657d.js +2 -0
  77. package/amd/{TabBarMixed-e16ca418.js.map → TabBarMixed-b61a657d.js.map} +1 -1
  78. package/amd/{Table-76c8555b.js → Table-caf0eeb9.js} +2 -2
  79. package/amd/{Table-76c8555b.js.map → Table-caf0eeb9.js.map} +1 -1
  80. package/amd/{TableDisplay-938d743b.js → TableDisplay-d2efde54.js} +2 -2
  81. package/amd/{TableDisplay-938d743b.js.map → TableDisplay-d2efde54.js.map} +1 -1
  82. package/amd/{TableView-490cc209.js → TableView-94381f75.js} +2 -2
  83. package/amd/{TableView-490cc209.js.map → TableView-94381f75.js.map} +1 -1
  84. package/amd/Theme-redwood/theme.css +301 -306
  85. package/amd/Theme-stable/theme.css +542 -537
  86. package/amd/TrainVariants.styles.css +6 -6
  87. package/amd/TrainVariants.styles2.css +6 -6
  88. package/amd/{TreeTableView-1b66b880.js → TreeTableView-ef0d26bd.js} +2 -2
  89. package/amd/{TreeTableView-1b66b880.js.map → TreeTableView-ef0d26bd.js.map} +1 -1
  90. package/amd/UNSAFE_CollapsibleNavigationList.js +1 -1
  91. package/amd/UNSAFE_ColorInputText.js +1 -1
  92. package/amd/UNSAFE_ColorPalette.js +1 -1
  93. package/amd/UNSAFE_ColorPicker/themes/redwood/ColorPickerTheme.js +1 -1
  94. package/amd/UNSAFE_ColorPicker/themes/redwood/ColorPickerTheme.js.map +1 -1
  95. package/amd/UNSAFE_ColorPicker/themes/redwood/ColorPickerVariants.css.js +1 -1
  96. package/amd/UNSAFE_ColorPicker/themes/stable/ColorPickerTheme.js +1 -1
  97. package/amd/UNSAFE_ColorPicker/themes/stable/ColorPickerTheme.js.map +1 -1
  98. package/amd/UNSAFE_ColorPicker/themes/stable/ColorPickerVariants.css.js +1 -1
  99. package/amd/UNSAFE_ColorPicker.js +1 -1
  100. package/amd/UNSAFE_ColorSwatch/themes/redwood/ColorSwatchTheme.js +1 -1
  101. package/amd/UNSAFE_ColorSwatch/themes/redwood/ColorSwatchTheme.js.map +1 -1
  102. package/amd/UNSAFE_ColorSwatch/themes/redwood/ColorSwatchVariants.css.js +1 -1
  103. package/amd/UNSAFE_ColorSwatch/themes/stable/ColorSwatchTheme.js +1 -1
  104. package/amd/UNSAFE_ColorSwatch/themes/stable/ColorSwatchTheme.js.map +1 -1
  105. package/amd/UNSAFE_ColorSwatch/themes/stable/ColorSwatchVariants.css.js +1 -1
  106. package/amd/UNSAFE_ColorSwatch.js +1 -1
  107. package/amd/UNSAFE_ContainerDiagram/themes/DiagramStyles.css.js +1 -1
  108. package/amd/UNSAFE_ContainerDiagram.js +1 -1
  109. package/amd/UNSAFE_ConveyorBelt/themes/redwood/ConveyorBeltTheme.js +1 -1
  110. package/amd/UNSAFE_ConveyorBelt/themes/redwood/ConveyorBeltTheme.js.map +1 -1
  111. package/amd/UNSAFE_ConveyorBelt/themes/redwood/ConveyorBeltVariants.css.js +1 -1
  112. package/amd/UNSAFE_ConveyorBelt/themes/stable/ConveyorBeltTheme.js +1 -1
  113. package/amd/UNSAFE_ConveyorBelt/themes/stable/ConveyorBeltTheme.js.map +1 -1
  114. package/amd/UNSAFE_ConveyorBelt/themes/stable/ConveyorBeltVariants.css.js +1 -1
  115. package/amd/UNSAFE_ConveyorBelt.js +1 -1
  116. package/amd/UNSAFE_Diagram/themes/DiagramStyles.css.js +1 -1
  117. package/amd/UNSAFE_Diagram.js +1 -1
  118. package/amd/UNSAFE_DrawerPopup/themes/redwood/DrawerPopupTheme.js +1 -1
  119. package/amd/UNSAFE_DrawerPopup/themes/redwood/DrawerPopupTheme.js.map +1 -1
  120. package/amd/UNSAFE_DrawerPopup/themes/redwood/DrawerPopupVariants.css.js +1 -1
  121. package/amd/UNSAFE_DrawerPopup/themes/stable/DrawerPopupTheme.js +1 -1
  122. package/amd/UNSAFE_DrawerPopup/themes/stable/DrawerPopupTheme.js.map +1 -1
  123. package/amd/UNSAFE_DrawerPopup/themes/stable/DrawerPopupVariants.css.js +1 -1
  124. package/amd/UNSAFE_DrawerPopup.js +1 -1
  125. package/amd/UNSAFE_Expander.js +1 -1
  126. package/amd/UNSAFE_FormLayout/themes/redwood/FormLayoutTheme.js +1 -1
  127. package/amd/UNSAFE_FormLayout/themes/redwood/FormLayoutTheme.js.map +1 -1
  128. package/amd/UNSAFE_FormLayout/themes/redwood/FormLayoutVariants.css.js +1 -1
  129. package/amd/UNSAFE_FormLayout/themes/stable/FormLayoutTheme.js +1 -1
  130. package/amd/UNSAFE_FormLayout/themes/stable/FormLayoutTheme.js.map +1 -1
  131. package/amd/UNSAFE_FormLayout/themes/stable/FormLayoutVariants.css.js +1 -1
  132. package/amd/UNSAFE_FormLayout.js +1 -1
  133. package/amd/UNSAFE_HierarchicalList.js +1 -1
  134. package/amd/UNSAFE_IconProgressButton.js +1 -1
  135. package/amd/UNSAFE_IndentedCellLayout.js +1 -1
  136. package/amd/UNSAFE_InlineSelectSingle.js +1 -1
  137. package/amd/UNSAFE_InputColor.js +1 -1
  138. package/amd/UNSAFE_InputDatePicker.js +1 -1
  139. package/amd/UNSAFE_InputSearch.js +1 -1
  140. package/amd/UNSAFE_InputSearch.js.map +1 -1
  141. package/amd/UNSAFE_InputTimePicker.js +1 -1
  142. package/amd/UNSAFE_InputTimePicker.js.map +1 -1
  143. package/amd/UNSAFE_ListView.js +1 -1
  144. package/amd/UNSAFE_MeterCircle/themes/redwood/MeterCircleTheme.js +1 -1
  145. package/amd/UNSAFE_MeterCircle/themes/redwood/MeterCircleTheme.js.map +1 -1
  146. package/amd/UNSAFE_MeterCircle/themes/redwood/MeterCircleVariants.css.js +1 -1
  147. package/amd/UNSAFE_MeterCircle/themes/stable/MeterCircleTheme.js +1 -1
  148. package/amd/UNSAFE_MeterCircle/themes/stable/MeterCircleTheme.js.map +1 -1
  149. package/amd/UNSAFE_MeterCircle/themes/stable/MeterCircleVariants.css.js +1 -1
  150. package/amd/UNSAFE_MeterCircle.js +1 -1
  151. package/amd/UNSAFE_NavigationList.js +1 -1
  152. package/amd/UNSAFE_OverflowTabBar.js +1 -1
  153. package/amd/UNSAFE_ProgressBar/themes/redwood/ProgressBarTheme.js +1 -1
  154. package/amd/UNSAFE_ProgressBar/themes/redwood/ProgressBarTheme.js.map +1 -1
  155. package/amd/UNSAFE_ProgressBar/themes/redwood/ProgressBarVariants.css.js +1 -1
  156. package/amd/UNSAFE_ProgressBar/themes/stable/ProgressBarTheme.js +1 -1
  157. package/amd/UNSAFE_ProgressBar/themes/stable/ProgressBarTheme.js.map +1 -1
  158. package/amd/UNSAFE_ProgressBar/themes/stable/ProgressBarVariants.css.js +1 -1
  159. package/amd/UNSAFE_ProgressBar.js +1 -1
  160. package/amd/UNSAFE_ProgressButton.js +1 -1
  161. package/amd/UNSAFE_ProgressButtonLabelLayout.js +1 -1
  162. package/amd/UNSAFE_ProgressCircle/themes/redwood/ProgressCircleTheme.js +1 -1
  163. package/amd/UNSAFE_ProgressCircle/themes/redwood/ProgressCircleTheme.js.map +1 -1
  164. package/amd/UNSAFE_ProgressCircle/themes/redwood/ProgressCircleVariants.css.js +1 -1
  165. package/amd/UNSAFE_ProgressCircle/themes/stable/ProgressCircleTheme.js +1 -1
  166. package/amd/UNSAFE_ProgressCircle/themes/stable/ProgressCircleTheme.js.map +1 -1
  167. package/amd/UNSAFE_ProgressCircle/themes/stable/ProgressCircleVariants.css.js +1 -1
  168. package/amd/UNSAFE_ProgressCircle.js +1 -1
  169. package/amd/UNSAFE_RadioItem/themes/redwood/RadioIconTheme.js +1 -1
  170. package/amd/UNSAFE_RadioItem/themes/redwood/RadioIconTheme.js.map +1 -1
  171. package/amd/UNSAFE_RadioItem/themes/redwood/RadioIconVariants.css.js +1 -1
  172. package/amd/UNSAFE_RadioItem/themes/stable/RadioIconTheme.js +1 -1
  173. package/amd/UNSAFE_RadioItem/themes/stable/RadioIconTheme.js.map +1 -1
  174. package/amd/UNSAFE_RadioItem/themes/stable/RadioIconVariants.css.js +1 -1
  175. package/amd/UNSAFE_RadioItem.js +1 -1
  176. package/amd/UNSAFE_Refresher.js +1 -1
  177. package/amd/UNSAFE_ReorderableTabBar.js +1 -1
  178. package/amd/UNSAFE_RichSelectionItem.js +1 -1
  179. package/amd/UNSAFE_RichSelectionItem.js.map +1 -1
  180. package/amd/UNSAFE_SelectMultiple.js +1 -1
  181. package/amd/UNSAFE_SelectSingle.js +1 -1
  182. package/amd/UNSAFE_SortControl.js +1 -1
  183. package/amd/UNSAFE_TabBar.js +1 -1
  184. package/amd/UNSAFE_TabBarCommon/themes/redwood/TabBarItemTheme.js +1 -1
  185. package/amd/UNSAFE_TabBarCommon/themes/redwood/TabBarItemTheme.js.map +1 -1
  186. package/amd/UNSAFE_TabBarCommon/themes/redwood/TabBarItemVariants.css.js +1 -1
  187. package/amd/UNSAFE_TabBarCommon/themes/stable/TabBarItemTheme.js +1 -1
  188. package/amd/UNSAFE_TabBarCommon/themes/stable/TabBarItemTheme.js.map +1 -1
  189. package/amd/UNSAFE_TabBarCommon/themes/stable/TabBarItemVariants.css.js +1 -1
  190. package/amd/UNSAFE_TabBarCommon.js +1 -1
  191. package/amd/UNSAFE_TabBarMixed.js +1 -1
  192. package/amd/UNSAFE_TableDisplay.js +1 -1
  193. package/amd/UNSAFE_TableView.js +1 -1
  194. package/amd/UNSAFE_TimePicker.js +1 -1
  195. package/amd/UNSAFE_Train/themes/redwood/TrainTheme.js +1 -1
  196. package/amd/UNSAFE_Train/themes/redwood/TrainTheme.js.map +1 -1
  197. package/amd/UNSAFE_Train/themes/redwood/TrainVariants.css.js +1 -1
  198. package/amd/UNSAFE_Train/themes/stable/TrainTheme.js +1 -1
  199. package/amd/UNSAFE_Train/themes/stable/TrainTheme.js.map +1 -1
  200. package/amd/UNSAFE_Train/themes/stable/TrainVariants.css.js +1 -1
  201. package/amd/UNSAFE_Train.js +1 -1
  202. package/amd/UNSAFE_TreeTableView.js +1 -1
  203. package/amd/UNSAFE_TreeView.js +1 -1
  204. package/amd/UNSAFE_VirtualizedListView.js +1 -1
  205. package/amd/hooks/PRIVATE_useDetectHorizontalOverflow.js +1 -1
  206. package/amd/hooks/PRIVATE_useTabBar.js +1 -1
  207. package/amd/useDetectHorizontalOverflow-88d9b328.js +2 -0
  208. package/amd/useDetectHorizontalOverflow-88d9b328.js.map +1 -0
  209. package/amd/useTabBar-edf8f8a1.js +2 -0
  210. package/amd/useTabBar-edf8f8a1.js.map +1 -0
  211. package/cjs/AvatarVariants.styles.css +25 -25
  212. package/cjs/AvatarVariants.styles2.css +25 -25
  213. package/cjs/{BaseCardView-e38589c6.js → BaseCardView-f3b3402b.js} +4 -1
  214. package/cjs/{BaseCardView-e38589c6.js.map → BaseCardView-f3b3402b.js.map} +1 -1
  215. package/cjs/ButtonLabelLayoutVariants.styles.css +8 -8
  216. package/cjs/ButtonLabelLayoutVariants.styles2.css +8 -8
  217. package/cjs/CheckboxIconVariants.styles.css +7 -7
  218. package/cjs/CheckboxIconVariants.styles2.css +7 -7
  219. package/cjs/ColorPickerVariants.styles.css +1 -1
  220. package/cjs/ColorPickerVariants.styles2.css +1 -1
  221. package/cjs/ConveyorBeltVariants.styles.css +6 -6
  222. package/cjs/ConveyorBeltVariants.styles2.css +6 -6
  223. package/cjs/DiagramStyles.styles.css +12 -81
  224. package/cjs/DiagramStyles.styles2.css +81 -12
  225. package/cjs/InputSearchVariants.styles.css +3 -3
  226. package/cjs/InputSearchVariants.styles2.css +3 -3
  227. package/cjs/{List-eea800fd.js → List-436100e1.js} +3 -1
  228. package/cjs/{List-eea800fd.js.map → List-436100e1.js.map} +1 -1
  229. package/cjs/MeterBarVariants.styles.css +4 -4
  230. package/cjs/MeterBarVariants.styles2.css +4 -4
  231. package/cjs/NavigationListItemVariants.styles.css +5 -5
  232. package/cjs/NavigationListItemVariants.styles2.css +5 -5
  233. package/cjs/PRIVATE_BaseCardView.js +1 -1
  234. package/cjs/PRIVATE_SelectCommon.js +2 -2
  235. package/cjs/PRIVATE_TableList.js +1 -1
  236. package/cjs/ProgressBarVariants.styles.css +1 -1
  237. package/cjs/ProgressBarVariants.styles2.css +1 -1
  238. package/cjs/ProgressCircleVariants.styles.css +4 -4
  239. package/cjs/ProgressCircleVariants.styles2.css +4 -4
  240. package/cjs/RadioIconVariants.styles.css +3 -3
  241. package/cjs/RadioIconVariants.styles2.css +3 -3
  242. package/cjs/{TabBar-1cd4ac17.js → TabBar-ba4bcd32.js} +9 -5
  243. package/cjs/TabBar-ba4bcd32.js.map +1 -0
  244. package/cjs/TabBarItemVariants.styles.css +3 -3
  245. package/cjs/TabBarItemVariants.styles2.css +3 -3
  246. package/cjs/Theme-redwood/theme.css +413 -413
  247. package/cjs/Theme-stable/theme.css +559 -559
  248. package/cjs/{TimePicker-25997417.js → TimePicker-fe817eb1.js} +2 -2
  249. package/cjs/{TimePicker-25997417.js.map → TimePicker-fe817eb1.js.map} +1 -1
  250. package/cjs/UNSAFE_CardFlexView.js +1 -1
  251. package/cjs/UNSAFE_CardGridView.js +1 -1
  252. package/cjs/UNSAFE_ColorInputText.js +82 -82
  253. package/cjs/UNSAFE_HierarchicalList.js +1 -1
  254. package/cjs/UNSAFE_InlineSelectSingle.js +3 -3
  255. package/cjs/UNSAFE_InputColor.js +82 -82
  256. package/cjs/UNSAFE_InputSearch.js +1 -1
  257. package/cjs/UNSAFE_InputTimePicker.js +2 -2
  258. package/cjs/UNSAFE_ListView.js +1 -1
  259. package/cjs/UNSAFE_OverflowTabBar.js +9 -5
  260. package/cjs/UNSAFE_OverflowTabBar.js.map +1 -1
  261. package/cjs/UNSAFE_ReorderableTabBar.js +13 -13
  262. package/cjs/UNSAFE_RichSelectionItem.js +1 -1
  263. package/cjs/UNSAFE_SelectMultiple.js +2 -2
  264. package/cjs/UNSAFE_SelectSingle.js +3 -3
  265. package/cjs/UNSAFE_TabBar.js +3 -3
  266. package/cjs/UNSAFE_TabBarMixed.js +26 -26
  267. package/cjs/UNSAFE_TabBarMixed.js.map +1 -1
  268. package/cjs/UNSAFE_TextArea.js +174 -72
  269. package/cjs/UNSAFE_TextArea.js.map +1 -1
  270. package/cjs/UNSAFE_TextAreaAutosize.js +3 -3
  271. package/cjs/UNSAFE_TextAreaAutosize.js.map +1 -1
  272. package/cjs/UNSAFE_TimePicker.js +2 -2
  273. package/cjs/UNSAFE_TreeView.js +1 -1
  274. package/cjs/dropdownStyles.styles.css +104 -6
  275. package/cjs/dropdownStyles.styles2.css +6 -104
  276. package/cjs/hooks/PRIVATE_useDetectHorizontalOverflow.js +1 -1
  277. package/cjs/hooks/PRIVATE_useTabBar.js +1 -1
  278. package/cjs/{useDetectHorizontalOverflow-622817d4.js → useDetectHorizontalOverflow-15084cbf.js} +30 -58
  279. package/cjs/useDetectHorizontalOverflow-15084cbf.js.map +1 -0
  280. package/cjs/{useDisplayValue-ce2d071e.js → useDisplayValue-777c9be5.js} +2 -2
  281. package/cjs/{useDisplayValue-ce2d071e.js.map → useDisplayValue-777c9be5.js.map} +1 -1
  282. package/cjs/{useSelectCommon-544c22ee.js → useSelectCommon-bb44fdb6.js} +2 -2
  283. package/cjs/{useSelectCommon-544c22ee.js.map → useSelectCommon-bb44fdb6.js.map} +1 -1
  284. package/cjs/{useTabBar-ec20851a.js → useTabBar-1cfaf3e6.js} +2 -5
  285. package/cjs/useTabBar-1cfaf3e6.js.map +1 -0
  286. package/cjs/useTextAreaAltEnter-27263abe.js +68 -0
  287. package/cjs/useTextAreaAltEnter-27263abe.js.map +1 -0
  288. package/es/BaseBarChart-26b0e87c.js +3 -3
  289. package/es/BaseBarGroup-ff0495d8.js +1 -1
  290. package/es/{BaseButton-77bb9d91.js → BaseButton-f3a607e1.js} +2 -2
  291. package/es/{BaseButton-77bb9d91.js.map → BaseButton-f3a607e1.js.map} +1 -1
  292. package/es/BaseCardView-21ee7272.js +6 -6
  293. package/es/BaseDiagram-c48f2fc4.js +7 -7
  294. package/es/BaseNavigationListItem-973e1502.js +5 -5
  295. package/es/BaseRichSelection-b0ee75b8.js +9 -9
  296. package/es/BaseSelector-33194eea.js +1 -1
  297. package/es/BaseSwatchView-028f6717.js +2 -2
  298. package/es/{Button-64b2d5c7.js → Button-166a6aa3.js} +2 -2
  299. package/es/{Button-64b2d5c7.js.map → Button-166a6aa3.js.map} +1 -1
  300. package/es/ButtonSet-6cba414c.js +2 -2
  301. package/es/ButtonSetButton-125e316b.js +1 -1
  302. package/es/ButtonSetIconButton-8b969ad2.js +4 -4
  303. package/es/{Center-e2a7c4c7.js → Center-0388bd0c.js} +2 -2
  304. package/es/{Center-e2a7c4c7.js.map → Center-0388bd0c.js.map} +1 -1
  305. package/es/Chart-5d837bee.js +11 -11
  306. package/es/CheckboxControl-777f547a.js +6 -6
  307. package/es/CheckboxRadioField-b332f3ef.js +6 -6
  308. package/es/CheckboxRadioLabelValueLayout-05524fdf.js +1 -1
  309. package/es/CheckboxSetContext-1be56556.js +9 -0
  310. package/es/CheckboxSetContext-1be56556.js.map +1 -0
  311. package/es/Chip-a0b982b3.js +1 -1
  312. package/es/ClearIcon-f9ae8ca2.js +1 -1
  313. package/es/CollapseIcon-134ba4b8.js +1 -1
  314. package/es/Collapsible-6a2da8e9.js +2 -2
  315. package/es/ColorPalette-660c0665.js +4 -4
  316. package/es/{ColorPicker-d399a2dc.js → ColorPicker-98ba93ac.js} +3 -3
  317. package/es/{ColorPicker-d399a2dc.js.map → ColorPicker-98ba93ac.js.map} +1 -1
  318. package/es/ColorSwatch-ac777ee8.js +5 -5
  319. package/es/{CompactLabelAssistance-db24bf83.js → CompactLabelAssistance-44907e8b.js} +6 -6
  320. package/es/{CompactLabelAssistance-db24bf83.js.map → CompactLabelAssistance-44907e8b.js.map} +1 -1
  321. package/es/CompactUserAssistance-80d7ed0f.js +6 -6
  322. package/es/ComponentMessageContainer-f95c0576.js +4 -4
  323. package/es/{DatePicker-56fb4fcf.js → DatePicker-659b8c72.js} +8 -8
  324. package/es/{DatePicker-56fb4fcf.js.map → DatePicker-659b8c72.js.map} +1 -1
  325. package/es/DatePickerHeader-2fa4dff3.js +3 -3
  326. package/es/{Dialog-6fc62c1d.js → Dialog-c1502d03.js} +7 -7
  327. package/es/{Dialog-6fc62c1d.js.map → Dialog-c1502d03.js.map} +1 -1
  328. package/es/DirectionalCollapseArrowIcon-1f47a4a6.js +1 -1
  329. package/es/DirectionalExpandArrowIcon-ddaa04dc.js +1 -1
  330. package/es/{Dropdown-a3e401ae.js → Dropdown-e3f6f436.js} +6 -6
  331. package/es/{Dropdown-a3e401ae.js.map → Dropdown-e3f6f436.js.map} +1 -1
  332. package/es/{EmbeddedIconButton-3824dbe1.js → EmbeddedIconButton-8dca2a64.js} +2 -2
  333. package/es/{EmbeddedIconButton-3824dbe1.js.map → EmbeddedIconButton-8dca2a64.js.map} +1 -1
  334. package/es/{EmbeddedTextField-12d0e0a7.js → EmbeddedTextField-e4b319a0.js} +2 -2
  335. package/es/{EmbeddedTextField-12d0e0a7.js.map → EmbeddedTextField-e4b319a0.js.map} +1 -1
  336. package/es/{EnvironmentProvider-12bbb301.js → EnvironmentProvider-60423f29.js} +3 -3
  337. package/es/{EnvironmentProvider-12bbb301.js.map → EnvironmentProvider-60423f29.js.map} +1 -1
  338. package/es/Expander-19633442.js +2 -2
  339. package/es/FilmStrip-c0155ba5.js +1 -1
  340. package/es/{Flex-f0f1bb0d.js → Flex-f5fe143f.js} +2 -2
  341. package/es/{Flex-f0f1bb0d.js.map → Flex-f5fe143f.js.map} +1 -1
  342. package/es/{Floating-87cd2bbf.js → Floating-91e0f4c1.js} +4 -4
  343. package/es/{Floating-87cd2bbf.js.map → Floating-91e0f4c1.js.map} +1 -1
  344. package/es/FormLayoutVariants.styles.css +14 -14
  345. package/es/FormLayoutVariants.styles2.css +14 -14
  346. package/es/{Grid-45385814.js → Grid-67dc57cb.js} +2 -2
  347. package/es/{Grid-45385814.js.map → Grid-67dc57cb.js.map} +1 -1
  348. package/es/{HighlightText-39c46ea1.js → HighlightText-790fa99f.js} +2 -2
  349. package/es/{HighlightText-39c46ea1.js.map → HighlightText-790fa99f.js.map} +1 -1
  350. package/es/Icon-c0fda273.js +3 -3
  351. package/es/IconButton-94077753.js +4 -4
  352. package/es/IconSwitchButton-ced93277.js +4 -4
  353. package/es/IconToggleButton-8605dd2d.js +4 -4
  354. package/es/{IconUserAssistance-b03771f5.js → IconUserAssistance-16f55b57.js} +3 -3
  355. package/es/{IconUserAssistance-b03771f5.js.map → IconUserAssistance-16f55b57.js.map} +1 -1
  356. package/es/InlineHelp-6a8bd475.js +1 -1
  357. package/es/InlineUserAssistance-5d329af5.js +5 -5
  358. package/es/InputDateMask-9255cb45.js +6 -6
  359. package/es/InputSearchVariants.styles.css +3 -3
  360. package/es/InputSearchVariants.styles2.css +3 -3
  361. package/es/InputTimeMask-8f552768.js +6 -6
  362. package/es/Label-293073f5.js +8 -8
  363. package/es/LabelValueLayout-cb1f7711.js +1 -1
  364. package/es/{Layer-937ca8d8.js → Layer-542de448.js} +3 -3
  365. package/es/{Layer-937ca8d8.js.map → Layer-542de448.js.map} +1 -1
  366. package/es/{LayerHost-20500ac8.js → LayerHost-c4481db3.js} +2 -2
  367. package/es/{LayerHost-20500ac8.js.map → LayerHost-c4481db3.js.map} +1 -1
  368. package/es/{LayerManager-55001240.js → LayerManager-4b79a6a2.js} +2 -2
  369. package/es/{LayerManager-55001240.js.map → LayerManager-4b79a6a2.js.map} +1 -1
  370. package/es/Link-530a365a.js +1 -1
  371. package/es/List-5419d582.js +4 -4
  372. package/es/List-eab74f6d.js +8 -8
  373. package/es/{ListItemLayout-bcebf158.js → ListItemLayout-bc6fb853.js} +2 -2
  374. package/es/{ListItemLayout-bcebf158.js.map → ListItemLayout-bc6fb853.js.map} +1 -1
  375. package/es/ListStyles.styles.css +7 -105
  376. package/es/ListStyles.styles2.css +105 -7
  377. package/es/{LiveRegion-bd98c133.js → LiveRegion-74d90422.js} +2 -2
  378. package/es/{LiveRegion-bd98c133.js.map → LiveRegion-74d90422.js.map} +1 -1
  379. package/es/{MaxLengthLiveRegion-8551ea6a.js → MaxLengthLiveRegion-96ac8f1c.js} +3 -3
  380. package/es/{MaxLengthLiveRegion-8551ea6a.js.map → MaxLengthLiveRegion-96ac8f1c.js.map} +1 -1
  381. package/es/MenuItemVariants.styles.css +8 -8
  382. package/es/MenuItemVariants.styles2.css +8 -8
  383. package/es/Message-f941b6ee.js +2 -2
  384. package/es/{MessageLayer-0523ebac.js → MessageLayer-7aad786a.js} +6 -6
  385. package/es/{MessageLayer-0523ebac.js.map → MessageLayer-7aad786a.js.map} +1 -1
  386. package/es/MessagesManager-a42ca15e.js +3 -3
  387. package/es/MeterCircleVariants.styles.css +8 -8
  388. package/es/MeterCircleVariants.styles2.css +8 -8
  389. package/es/Modal-863676e2.js +3 -3
  390. package/es/{MonthView-31ced05b.js → MonthView-5ba0a449.js} +5 -5
  391. package/es/{MonthView-31ced05b.js.map → MonthView-5ba0a449.js.map} +1 -1
  392. package/es/NavigationList-0281b772.js +4 -4
  393. package/es/{NumberInputText-8c8fffa0.js → NumberInputText-e001d629.js} +7 -7
  394. package/es/{NumberInputText-8c8fffa0.js.map → NumberInputText-e001d629.js.map} +1 -1
  395. package/es/OverflowTabBarItem-75b943ec.js +8 -8
  396. package/es/PRIVATE_BaseBarChart.js +37 -37
  397. package/es/PRIVATE_BaseCardView.js +22 -22
  398. package/es/PRIVATE_BaseDiagram.js +30 -30
  399. package/es/PRIVATE_BaseSelector.js +17 -17
  400. package/es/PRIVATE_BaseSwatchView.js +18 -18
  401. package/es/PRIVATE_Chart.js +36 -36
  402. package/es/PRIVATE_CheckboxControl.js +25 -25
  403. package/es/PRIVATE_CheckboxRadioField.js +27 -27
  404. package/es/PRIVATE_ClearIcon.js +18 -18
  405. package/es/PRIVATE_DatePickerHeader.js +20 -20
  406. package/es/PRIVATE_DatePickerLayout.js +4 -4
  407. package/es/PRIVATE_EmbeddedIconButton.js +6 -6
  408. package/es/PRIVATE_EmbeddedTextField.js +18 -18
  409. package/es/PRIVATE_FilmStrip.js +17 -17
  410. package/es/PRIVATE_FormControls.js +21 -21
  411. package/es/PRIVATE_IconSwitchButton.js +17 -17
  412. package/es/PRIVATE_Icons/CheckboxCrossed.js +16 -16
  413. package/es/PRIVATE_Icons/CheckboxMixed.js +16 -16
  414. package/es/PRIVATE_Icons/CheckboxOff.js +16 -16
  415. package/es/PRIVATE_Icons/CheckboxOn.js +16 -16
  416. package/es/PRIVATE_Icons/None.js +16 -16
  417. package/es/PRIVATE_InputBase.js +28 -28
  418. package/es/PRIVATE_List/themes/ListStyles.css.js +1 -1
  419. package/es/PRIVATE_List.js +22 -22
  420. package/es/PRIVATE_Message.js +20 -20
  421. package/es/PRIVATE_MessageLayer.js +12 -12
  422. package/es/PRIVATE_MonthView.js +20 -20
  423. package/es/PRIVATE_MonthYearGridView.js +7 -7
  424. package/es/PRIVATE_PlotArea.js +5 -5
  425. package/es/PRIVATE_RevealToggleIcon.js +18 -18
  426. package/es/PRIVATE_RichSelectionCommon.js +28 -28
  427. package/es/PRIVATE_SelectCommon.js +33 -33
  428. package/es/PRIVATE_StyledCard.js +17 -17
  429. package/es/PRIVATE_StyledCheckbox.js +16 -16
  430. package/es/PRIVATE_StyledSwitch.js +4 -4
  431. package/es/PRIVATE_SwatchFlexView.js +18 -18
  432. package/es/PRIVATE_Table.js +39 -39
  433. package/es/PRIVATE_TableList/themes/ListStyles.css.js +1 -1
  434. package/es/PRIVATE_TableList/themes/redwood/ListTheme.js +1 -1
  435. package/es/PRIVATE_TableList/themes/redwood/ListVariants.css.js +1 -1
  436. package/es/PRIVATE_TableList/themes/stable/ListTheme.js +1 -1
  437. package/es/PRIVATE_TableList/themes/stable/ListVariants.css.js +1 -1
  438. package/es/PRIVATE_TableList.js +29 -29
  439. package/es/PRIVATE_ThemedIcons/CalendarIcon.js +16 -16
  440. package/es/PRIVATE_ThemedIcons/ChartMarqueeSelectIcon.js +16 -16
  441. package/es/PRIVATE_ThemedIcons/ChartPanIcon.js +16 -16
  442. package/es/PRIVATE_ThemedIcons/ChartZoomIcon.js +16 -16
  443. package/es/PRIVATE_ThemedIcons/CheckIcon.js +16 -16
  444. package/es/PRIVATE_ThemedIcons/CheckboxCrossedIcon.js +16 -16
  445. package/es/PRIVATE_ThemedIcons/CheckboxMixedIcon.js +16 -16
  446. package/es/PRIVATE_ThemedIcons/CheckboxOffIcon.js +16 -16
  447. package/es/PRIVATE_ThemedIcons/CheckboxOnIcon.js +16 -16
  448. package/es/PRIVATE_ThemedIcons/CloseIcon.js +16 -16
  449. package/es/PRIVATE_ThemedIcons/CollapseIcon.js +17 -17
  450. package/es/PRIVATE_ThemedIcons/CollapseUpIcon.js +16 -16
  451. package/es/PRIVATE_ThemedIcons/DecrementIcon.js +16 -16
  452. package/es/PRIVATE_ThemedIcons/DeleteIcon.js +16 -16
  453. package/es/PRIVATE_ThemedIcons/DirectionalCollapseArrowIcon.js +17 -17
  454. package/es/PRIVATE_ThemedIcons/DirectionalExpandArrowIcon.js +17 -17
  455. package/es/PRIVATE_ThemedIcons/DragHandleIcon.js +16 -16
  456. package/es/PRIVATE_ThemedIcons/DropdownArrowIcon.js +16 -16
  457. package/es/PRIVATE_ThemedIcons/ExpandIcon.js +16 -16
  458. package/es/PRIVATE_ThemedIcons/HelpIcon.js +16 -16
  459. package/es/PRIVATE_ThemedIcons/IncrementIcon.js +16 -16
  460. package/es/PRIVATE_ThemedIcons/MenuButtonDropdownIcon.js +16 -16
  461. package/es/PRIVATE_ThemedIcons/MessageConfirmationIcon.js +16 -16
  462. package/es/PRIVATE_ThemedIcons/MessageErrorIcon.js +16 -16
  463. package/es/PRIVATE_ThemedIcons/MessageInfoIcon.js +16 -16
  464. package/es/PRIVATE_ThemedIcons/MessageWarningIcon.js +16 -16
  465. package/es/PRIVATE_ThemedIcons/MinusIcon.js +16 -16
  466. package/es/PRIVATE_ThemedIcons/NavDownIcon.js +16 -16
  467. package/es/PRIVATE_ThemedIcons/None.js +16 -16
  468. package/es/PRIVATE_ThemedIcons/OverviewHorizontalDragHandleIcon.js +16 -16
  469. package/es/PRIVATE_ThemedIcons/PlusIcon.js +16 -16
  470. package/es/PRIVATE_ThemedIcons/RadioOffIcon.js +16 -16
  471. package/es/PRIVATE_ThemedIcons/RadioOnIcon.js +16 -16
  472. package/es/PRIVATE_ThemedIcons/SortAscendingIcon.js +16 -16
  473. package/es/PRIVATE_ThemedIcons/SortDescendingIcon.js +16 -16
  474. package/es/PRIVATE_ThemedIcons/UnsortedIcon.js +16 -16
  475. package/es/PRIVATE_ThemedIcons/ViewHideIcon.js +16 -16
  476. package/es/PRIVATE_ThemedIcons/ViewIcon.js +16 -16
  477. package/es/PRIVATE_TimeComponent.js +19 -19
  478. package/es/PRIVATE_TruncatingLink.js +16 -16
  479. package/es/PRIVATE_VisOverview.js +16 -16
  480. package/es/PRIVATE_VisStatusMessage.js +5 -5
  481. package/es/PRIVATE_VisTabularDatatip.js +4 -4
  482. package/es/PolarChartWithDimensions-76ff5180.js +7 -7
  483. package/es/{Popup-83eb0d14.js → Popup-5e092ea2.js} +10 -10
  484. package/es/{Popup-83eb0d14.js.map → Popup-5e092ea2.js.map} +1 -1
  485. package/es/ProgressBarVariants.styles.css +1 -1
  486. package/es/ProgressBarVariants.styles2.css +1 -1
  487. package/es/ProgressButtonLabelLayout-66b9ffed.js +3 -3
  488. package/es/{ProgressCircle-840273b1.js → ProgressCircle-5f423576.js} +2 -2
  489. package/es/{ProgressCircle-840273b1.js.map → ProgressCircle-5f423576.js.map} +1 -1
  490. package/es/ProgressCircleVariants.styles.css +4 -4
  491. package/es/ProgressCircleVariants.styles2.css +4 -4
  492. package/es/RadioItem-1a4b2f6c.js +6 -6
  493. package/es/ReadonlyTextField-bddb2cdf.js +2 -2
  494. package/es/ReadonlyTextFieldInput-bc7ef76e.js +1 -1
  495. package/es/{ReferenceLineArea-6408ffab.js → ReferenceLineArea-ee334176.js} +3 -3
  496. package/es/{ReferenceLineArea-6408ffab.js.map → ReferenceLineArea-ee334176.js.map} +1 -1
  497. package/es/RevealToggleIcon-f599e415.js +1 -1
  498. package/es/{SectionedContent-55b8f8c6.js → SectionedContent-ce3d19ab.js} +5 -5
  499. package/es/{SectionedContent-55b8f8c6.js.map → SectionedContent-ce3d19ab.js.map} +1 -1
  500. package/es/SegmentStyles.styles.css +12 -9
  501. package/es/SegmentStyles.styles2.css +9 -12
  502. package/es/SelectMenuGroupContext-ea5310eb.js +6 -6
  503. package/es/{SelectMobileDropdown-cec84a47.js → SelectMobileDropdown-502af91c.js} +7 -7
  504. package/es/{SelectMobileDropdown-cec84a47.js.map → SelectMobileDropdown-502af91c.js.map} +1 -1
  505. package/es/SelectMobileFieldInput-bd65672b.js +4 -4
  506. package/es/{SelectorAll-855a2050.js → SelectorAll-4b170e2f.js} +5 -5
  507. package/es/{SelectorAll-855a2050.js.map → SelectorAll-4b170e2f.js.map} +1 -1
  508. package/es/Sheet-9a10abc4.js +2 -2
  509. package/es/SortControl-73376bf0.js +3 -3
  510. package/es/SplitMenuButtonTheme.styles.css +4 -4
  511. package/es/SplitMenuButtonTheme.styles2.css +4 -4
  512. package/es/StyledCard-0e89c7fd.js +1 -1
  513. package/es/{StyledLabelValueLayout-69ac5e9a.js → StyledLabelValueLayout-1ebe21b2.js} +2 -2
  514. package/es/{StyledLabelValueLayout-69ac5e9a.js.map → StyledLabelValueLayout-1ebe21b2.js.map} +1 -1
  515. package/es/StyledSwitch-dc6a94af.js +2 -2
  516. package/es/StyledTextField-56e1a6e7.js +3 -3
  517. package/es/Submenu-481b3c39.js +1 -1
  518. package/es/{TabBar-36932ca2.js → TabBar-de0cb67b.js} +14 -12
  519. package/es/TabBar-de0cb67b.js.map +1 -0
  520. package/es/TabBarContextMenu-41639eb7.js +2 -2
  521. package/es/TabBarItemVariants.styles.css +3 -3
  522. package/es/TabBarItemVariants.styles2.css +3 -3
  523. package/es/TabBarLayout-5876474d.js +1 -1
  524. package/es/Table-fd39c1b5.js +9 -9
  525. package/es/TableColGroup-2f67372c.js +1 -1
  526. package/es/{TextField-0a9a5a57.js → TextField-a556da78.js} +2 -2
  527. package/es/{TextField-0a9a5a57.js.map → TextField-a556da78.js.map} +1 -1
  528. package/es/TextFieldContent-5e5ed450.js +2 -2
  529. package/es/{TextureDefs-295dccbd.js → TextureDefs-7373dec8.js} +2 -2
  530. package/es/{TextureDefs-295dccbd.js.map → TextureDefs-7373dec8.js.map} +1 -1
  531. package/es/Theme-redwood/theme.css +361 -371
  532. package/es/Theme-stable/theme.css +459 -449
  533. package/es/TimeComponentCanvas2D-e22cb491.js +6 -6
  534. package/es/TimePicker-aba30924.js +2 -2
  535. package/es/ToggleButton-d2b3a635.js +1 -1
  536. package/es/TreeItemLayout-7783b7bf.js +2 -2
  537. package/es/TruncatingLink-e0338cb2.js +4 -4
  538. package/es/TruncatingText-868308d3.js +1 -1
  539. package/es/UNSAFE_AccordionItemMultiple.js +18 -18
  540. package/es/UNSAFE_AccordionItemSingle.js +18 -18
  541. package/es/UNSAFE_ActionCard.js +17 -17
  542. package/es/UNSAFE_BarChart.js +37 -37
  543. package/es/UNSAFE_BareButton.js +2 -2
  544. package/es/UNSAFE_BaseButton.js +5 -5
  545. package/es/UNSAFE_Button.js +6 -6
  546. package/es/UNSAFE_ButtonSet.js +17 -17
  547. package/es/UNSAFE_ButtonSetButton.js +5 -5
  548. package/es/UNSAFE_ButtonSetIconButton.js +17 -17
  549. package/es/UNSAFE_ButtonSetItem.js +18 -18
  550. package/es/UNSAFE_ButtonSetMultiple.js +17 -17
  551. package/es/UNSAFE_ButtonSetSingle.js +17 -17
  552. package/es/UNSAFE_Card.js +17 -17
  553. package/es/UNSAFE_CardFlexView.js +22 -22
  554. package/es/UNSAFE_CardGridView.js +22 -22
  555. package/es/UNSAFE_Center.js +5 -5
  556. package/es/UNSAFE_Checkbox.js +25 -25
  557. package/es/UNSAFE_CheckboxItem.js +77 -139
  558. package/es/UNSAFE_CheckboxItem.js.map +1 -1
  559. package/es/UNSAFE_CheckboxRadioField.js +4 -4
  560. package/es/UNSAFE_CheckboxSet.js +75 -41
  561. package/es/UNSAFE_CheckboxSet.js.map +1 -1
  562. package/es/UNSAFE_Chip.js +2 -2
  563. package/es/UNSAFE_Collapsible.js +18 -18
  564. package/es/UNSAFE_CollapsibleNavigationList.js +28 -28
  565. package/es/UNSAFE_ColorInputText.js +109 -109
  566. package/es/UNSAFE_ColorPalette.js +21 -21
  567. package/es/UNSAFE_ColorPicker.js +23 -23
  568. package/es/UNSAFE_ColorSwatch.js +18 -18
  569. package/es/UNSAFE_ComboChart.js +38 -38
  570. package/es/UNSAFE_ComponentMessage.js +20 -20
  571. package/es/UNSAFE_ContainerDiagram.js +30 -30
  572. package/es/UNSAFE_ConveyorBelt.js +18 -18
  573. package/es/UNSAFE_DatePicker.js +27 -27
  574. package/es/UNSAFE_Diagram.js +30 -30
  575. package/es/UNSAFE_Dialog.js +22 -22
  576. package/es/UNSAFE_DragHandle.js +17 -17
  577. package/es/UNSAFE_DrawerLayout.js +12 -12
  578. package/es/UNSAFE_DrawerPopup.js +11 -11
  579. package/es/UNSAFE_Dropdown.js +15 -15
  580. package/es/UNSAFE_Environment.js +4 -4
  581. package/es/UNSAFE_Expander.js +20 -20
  582. package/es/UNSAFE_FilePicker.js +4 -4
  583. package/es/UNSAFE_FilmStrip.js +19 -19
  584. package/es/UNSAFE_Flex.js +4 -4
  585. package/es/UNSAFE_Floating.js +11 -11
  586. package/es/UNSAFE_FormLayout/themes/redwood/FormLayoutTheme.js +1 -1
  587. package/es/UNSAFE_FormLayout/themes/redwood/FormLayoutVariants.css.js +1 -1
  588. package/es/UNSAFE_FormLayout/themes/stable/FormLayoutTheme.js +1 -1
  589. package/es/UNSAFE_FormLayout/themes/stable/FormLayoutVariants.css.js +1 -1
  590. package/es/UNSAFE_FormLayout.js +3 -3
  591. package/es/UNSAFE_Gantt.js +23 -23
  592. package/es/UNSAFE_Grid.js +4 -4
  593. package/es/UNSAFE_HierarchicalList.js +30 -30
  594. package/es/UNSAFE_HighlightText.js +4 -4
  595. package/es/UNSAFE_Icon.js +16 -16
  596. package/es/UNSAFE_IconButton.js +17 -17
  597. package/es/UNSAFE_IconMenuButton.js +26 -26
  598. package/es/UNSAFE_IconProgressButton.js +22 -22
  599. package/es/UNSAFE_IconToggleButton.js +17 -17
  600. package/es/UNSAFE_IndentedCellLayout/themes/redwood/IndentedCellLayoutBaseTheme.css.js +1 -1
  601. package/es/UNSAFE_IndentedCellLayout/themes/stable/IndentedCellLayoutBaseTheme.css.js +1 -1
  602. package/es/UNSAFE_IndentedCellLayout.js +1 -1
  603. package/es/UNSAFE_Indexer.js +19 -19
  604. package/es/UNSAFE_InlineSelectSingle.js +36 -36
  605. package/es/UNSAFE_InputColor.js +108 -108
  606. package/es/UNSAFE_InputDateMask/themes/SegmentStyles.css.js +1 -1
  607. package/es/UNSAFE_InputDateMask.js +30 -30
  608. package/es/UNSAFE_InputDatePicker.js +39 -39
  609. package/es/UNSAFE_InputPassword.js +28 -28
  610. package/es/UNSAFE_InputSearch/themes/redwood/InputSearchTheme.js +1 -1
  611. package/es/UNSAFE_InputSearch/themes/redwood/InputSearchVariants.css.js +1 -1
  612. package/es/UNSAFE_InputSearch/themes/stable/InputSearchTheme.js +1 -1
  613. package/es/UNSAFE_InputSearch/themes/stable/InputSearchVariants.css.js +1 -1
  614. package/es/UNSAFE_InputSearch.js +35 -35
  615. package/es/UNSAFE_InputSensitiveText.js +29 -29
  616. package/es/UNSAFE_InputText.js +30 -30
  617. package/es/UNSAFE_InputTimeMask/themes/SegmentStyles.css.js +1 -1
  618. package/es/UNSAFE_InputTimeMask.js +29 -29
  619. package/es/UNSAFE_InputTimePicker.js +39 -39
  620. package/es/UNSAFE_Label.js +25 -25
  621. package/es/UNSAFE_LabelValueLayout.js +4 -4
  622. package/es/UNSAFE_LabelledLink.js +27 -27
  623. package/es/UNSAFE_Layer.js +8 -8
  624. package/es/UNSAFE_Legend.js +29 -29
  625. package/es/UNSAFE_LineAreaChart.js +38 -38
  626. package/es/UNSAFE_Link.js +2 -2
  627. package/es/UNSAFE_ListGroupHeaderLayout.js +5 -5
  628. package/es/UNSAFE_ListItemLayout.js +5 -5
  629. package/es/UNSAFE_ListView.js +29 -29
  630. package/es/UNSAFE_LiveRegion.js +4 -4
  631. package/es/UNSAFE_Menu/themes/redwood/MenuItemTheme.js +1 -1
  632. package/es/UNSAFE_Menu/themes/redwood/MenuItemVariants.css.js +1 -1
  633. package/es/UNSAFE_Menu/themes/stable/MenuItemTheme.js +1 -1
  634. package/es/UNSAFE_Menu/themes/stable/MenuItemVariants.css.js +1 -1
  635. package/es/UNSAFE_Menu.js +27 -27
  636. package/es/UNSAFE_MenuButton.js +26 -26
  637. package/es/UNSAFE_MessageBanner.js +20 -20
  638. package/es/UNSAFE_MessageToast.js +22 -22
  639. package/es/UNSAFE_MeterBar.js +16 -16
  640. package/es/UNSAFE_MeterCircle/themes/redwood/MeterCircleTheme.js +1 -1
  641. package/es/UNSAFE_MeterCircle/themes/redwood/MeterCircleVariants.css.js +1 -1
  642. package/es/UNSAFE_MeterCircle/themes/stable/MeterCircleTheme.js +1 -1
  643. package/es/UNSAFE_MeterCircle/themes/stable/MeterCircleVariants.css.js +1 -1
  644. package/es/UNSAFE_MeterCircle.js +18 -18
  645. package/es/UNSAFE_Modal.js +8 -8
  646. package/es/UNSAFE_NavigationList.js +28 -28
  647. package/es/UNSAFE_NumberInputText.js +32 -32
  648. package/es/UNSAFE_OverflowTabBar.js +39 -35
  649. package/es/UNSAFE_OverflowTabBar.js.map +1 -1
  650. package/es/UNSAFE_PictoChart.js +26 -26
  651. package/es/UNSAFE_PieChart.js +30 -30
  652. package/es/UNSAFE_PolarBarChart.js +31 -31
  653. package/es/UNSAFE_PolarLineAreaChart.js +31 -31
  654. package/es/UNSAFE_Popup.js +18 -18
  655. package/es/UNSAFE_ProgressBar/themes/redwood/ProgressBarTheme.js +1 -1
  656. package/es/UNSAFE_ProgressBar/themes/redwood/ProgressBarVariants.css.js +1 -1
  657. package/es/UNSAFE_ProgressBar/themes/stable/ProgressBarTheme.js +1 -1
  658. package/es/UNSAFE_ProgressBar/themes/stable/ProgressBarVariants.css.js +1 -1
  659. package/es/UNSAFE_ProgressBar.js +5 -5
  660. package/es/UNSAFE_ProgressButton.js +22 -22
  661. package/es/UNSAFE_ProgressButtonLabelLayout.js +11 -11
  662. package/es/UNSAFE_ProgressCircle/themes/redwood/ProgressCircleTheme.js +1 -1
  663. package/es/UNSAFE_ProgressCircle/themes/redwood/ProgressCircleVariants.css.js +1 -1
  664. package/es/UNSAFE_ProgressCircle/themes/stable/ProgressCircleTheme.js +1 -1
  665. package/es/UNSAFE_ProgressCircle/themes/stable/ProgressCircleVariants.css.js +1 -1
  666. package/es/UNSAFE_ProgressCircle.js +5 -5
  667. package/es/UNSAFE_RadioItem.js +25 -25
  668. package/es/UNSAFE_RadioSet.js +27 -27
  669. package/es/UNSAFE_RangeBarChart.js +37 -37
  670. package/es/UNSAFE_RatingGauge.js +18 -18
  671. package/es/UNSAFE_Refresher.js +5 -5
  672. package/es/UNSAFE_ReorderableTabBar.js +33 -33
  673. package/es/UNSAFE_RichCheckboxSet.js +65 -69
  674. package/es/UNSAFE_RichCheckboxSet.js.map +1 -1
  675. package/es/UNSAFE_RichRadioSet.js +29 -29
  676. package/es/UNSAFE_RichSelectionItem.js +122 -177
  677. package/es/UNSAFE_RichSelectionItem.js.map +1 -1
  678. package/es/UNSAFE_ScatterChart.js +37 -37
  679. package/es/UNSAFE_SectionalLegend.js +29 -29
  680. package/es/UNSAFE_SelectMultiple.js +40 -40
  681. package/es/UNSAFE_SelectSingle.js +39 -39
  682. package/es/UNSAFE_SelectionCard.js +17 -17
  683. package/es/UNSAFE_Selector.js +17 -17
  684. package/es/UNSAFE_SelectorAll.js +19 -19
  685. package/es/UNSAFE_Sheet.js +11 -11
  686. package/es/UNSAFE_Slider.js +28 -28
  687. package/es/UNSAFE_SortControl.js +19 -19
  688. package/es/UNSAFE_SplitMenuButton/themes/redwood/SplitMenuButtonTheme.css.js +1 -1
  689. package/es/UNSAFE_SplitMenuButton/themes/stable/SplitMenuButtonTheme.css.js +1 -1
  690. package/es/UNSAFE_SplitMenuButton.js +27 -27
  691. package/es/UNSAFE_SwipeActions.js +26 -26
  692. package/es/UNSAFE_Switch/themes/redwood/SwitchBaseTheme.css.js +1 -1
  693. package/es/UNSAFE_Switch/themes/redwood/SwitchTheme.js +1 -1
  694. package/es/UNSAFE_Switch/themes/stable/SwitchBaseTheme.css.js +1 -1
  695. package/es/UNSAFE_Switch/themes/stable/SwitchTheme.js +1 -1
  696. package/es/UNSAFE_Switch.js +27 -27
  697. package/es/UNSAFE_TabBar.js +34 -34
  698. package/es/UNSAFE_TabBarCommon/themes/redwood/TabBarItemTheme.js +1 -1
  699. package/es/UNSAFE_TabBarCommon/themes/redwood/TabBarItemVariants.css.js +1 -1
  700. package/es/UNSAFE_TabBarCommon/themes/stable/TabBarItemTheme.js +1 -1
  701. package/es/UNSAFE_TabBarCommon/themes/stable/TabBarItemVariants.css.js +1 -1
  702. package/es/UNSAFE_TabBarCommon.js +30 -30
  703. package/es/UNSAFE_TabBarMixed.js +32 -32
  704. package/es/UNSAFE_TabBarMixed.js.map +1 -1
  705. package/es/UNSAFE_TableDisplay.js +19 -19
  706. package/es/UNSAFE_TableView.js +39 -39
  707. package/es/UNSAFE_TagCloud.js +27 -27
  708. package/es/UNSAFE_TextArea.js +29 -29
  709. package/es/UNSAFE_TextAreaAutosize.js +29 -29
  710. package/es/UNSAFE_TextField.js +21 -21
  711. package/es/UNSAFE_TimePicker.js +30 -30
  712. package/es/UNSAFE_ToggleButton.js +5 -5
  713. package/es/UNSAFE_Toolbar.js +4 -4
  714. package/es/UNSAFE_Train.js +17 -17
  715. package/es/UNSAFE_TreeItemLayout.js +5 -5
  716. package/es/UNSAFE_TreeTableView.js +39 -39
  717. package/es/UNSAFE_TreeView.js +30 -30
  718. package/es/UNSAFE_TruncatingBadge.js +17 -17
  719. package/es/UNSAFE_TruncatingText.js +17 -17
  720. package/es/UNSAFE_UserAssistance.js +26 -26
  721. package/es/UNSAFE_View.js +7 -7
  722. package/es/UNSAFE_VirtualizedListView.js +22 -22
  723. package/es/UNSAFE_VisInvalidDataMessage.js +6 -6
  724. package/es/UNSAFE_VisNoDataMessage.js +6 -6
  725. package/es/UNSAFE_VisProgressiveLoader.js +5 -5
  726. package/es/UNSAFE_WindowOverlay.js +4 -4
  727. package/es/{View-5e006875.js → View-0ee9645e.js} +5 -5
  728. package/es/{View-5e006875.js.map → View-0ee9645e.js.map} +1 -1
  729. package/es/{VisStatusMessage-091fb10e.js → VisStatusMessage-56f961f5.js} +2 -2
  730. package/es/{VisStatusMessage-091fb10e.js.map → VisStatusMessage-56f961f5.js.map} +1 -1
  731. package/es/{VisTabularDatatip-e3acfb61.js → VisTabularDatatip-e71cef20.js} +2 -2
  732. package/es/{VisTabularDatatip-e3acfb61.js.map → VisTabularDatatip-e71cef20.js.map} +1 -1
  733. package/es/{WindowOverlay-05bff667.js → WindowOverlay-9f2cbaa0.js} +2 -2
  734. package/es/{WindowOverlay-05bff667.js.map → WindowOverlay-9f2cbaa0.js.map} +1 -1
  735. package/es/{YearsGridView-db24fc9f.js → YearsGridView-6a5c2c74.js} +4 -4
  736. package/es/{YearsGridView-db24fc9f.js.map → YearsGridView-6a5c2c74.js.map} +1 -1
  737. package/es/hoc/PRIVATE_withDirectionIcon.js +4 -4
  738. package/es/hoc/PRIVATE_withThemeIcon.js +3 -3
  739. package/es/hoc/UNSAFE_withThemeProps.js +3 -3
  740. package/es/hooks/PRIVATE_useChartContextMenu.js +24 -24
  741. package/es/hooks/PRIVATE_useChartDatatip.js +14 -14
  742. package/es/hooks/PRIVATE_useChartEvents.js +20 -20
  743. package/es/hooks/PRIVATE_useChartMarquee.js +19 -19
  744. package/es/hooks/PRIVATE_useCollectionFocusRing.js +17 -17
  745. package/es/hooks/PRIVATE_useCssVars.js +7 -7
  746. package/es/hooks/PRIVATE_useCurrentKey.js +4 -4
  747. package/es/hooks/PRIVATE_useDatatip.js +12 -12
  748. package/es/hooks/PRIVATE_useDetectHorizontalOverflow.js +17 -17
  749. package/es/hooks/PRIVATE_useFloating.js +4 -4
  750. package/es/hooks/PRIVATE_useItemAction.js +17 -17
  751. package/es/hooks/PRIVATE_useListCommon.js +18 -18
  752. package/es/hooks/PRIVATE_useOutsideMousedown.js +9 -9
  753. package/es/hooks/PRIVATE_useRadioFocusManager.js +4 -4
  754. package/es/hooks/PRIVATE_useReorderable.js +19 -19
  755. package/es/hooks/PRIVATE_useRovingTabIndexContainer.js +4 -4
  756. package/es/hooks/PRIVATE_useSelection.js +4 -4
  757. package/es/hooks/PRIVATE_useTabBar.js +28 -28
  758. package/es/hooks/PRIVATE_useTabbableModeSet.js +17 -17
  759. package/es/hooks/PRIVATE_useTooltipOnTruncation.js +17 -17
  760. package/es/hooks/PRIVATE_useVisContextMenu.js +24 -24
  761. package/es/hooks/PRIVATE_useVisDragModeControls.js +19 -19
  762. package/es/hooks/PRIVATE_useVisEvents.js +4 -4
  763. package/es/hooks/PRIVATE_useVisMeterEvents.js +14 -14
  764. package/es/hooks/PRIVATE_useVisSelection.js +15 -15
  765. package/es/hooks/UNSAFE_useBareButton.js +2 -2
  766. package/es/hooks/UNSAFE_useColorScheme.js +3 -3
  767. package/es/hooks/UNSAFE_useCurrentBgColor.js +2 -2
  768. package/es/hooks/UNSAFE_useDensity.js +3 -3
  769. package/es/hooks/UNSAFE_useHiddenTestMethod.js +3 -3
  770. package/es/hooks/UNSAFE_useOutsideClick.js +8 -8
  771. package/es/hooks/UNSAFE_usePrefixSuffix.js +4 -4
  772. package/es/hooks/UNSAFE_useScale.js +3 -3
  773. package/es/hooks/UNSAFE_useTestId.js +3 -3
  774. package/es/hooks/UNSAFE_useTheme.js +3 -3
  775. package/es/hooks/UNSAFE_useThemeInterpolations.js +6 -6
  776. package/es/hooks/UNSAFE_useTooltip.js +17 -17
  777. package/es/hooks/UNSAFE_useTranslationBundle.js +3 -3
  778. package/es/hooks/UNSAFE_useUser.js +3 -3
  779. package/es/{popupUtils-c052da19.js → popupUtils-87073802.js} +2 -2
  780. package/es/{popupUtils-c052da19.js.map → popupUtils-87073802.js.map} +1 -1
  781. package/es/{tooltipUtils-8f52a37e.js → tooltipUtils-f2f90085.js} +5 -5
  782. package/es/{tooltipUtils-8f52a37e.js.map → tooltipUtils-f2f90085.js.map} +1 -1
  783. package/es/useBareButton-3d8d3267.js +1 -1
  784. package/es/useCellNavigation-74703ae5.js +1 -1
  785. package/es/useChartContextMenu-f63e0e70.js +2 -2
  786. package/es/{useChartDatatip-7a0287e7.js → useChartDatatip-c8797dc7.js} +4 -4
  787. package/es/{useChartDatatip-7a0287e7.js.map → useChartDatatip-c8797dc7.js.map} +1 -1
  788. package/es/{useColorScheme-febcabc0.js → useColorScheme-0d2625c5.js} +2 -2
  789. package/es/{useColorScheme-febcabc0.js.map → useColorScheme-0d2625c5.js.map} +1 -1
  790. package/es/useContextMenu-5730737d.js +2 -2
  791. package/es/{useCssVars-663740c4.js → useCssVars-697799fa.js} +5 -5
  792. package/es/{useCssVars-663740c4.js.map → useCssVars-697799fa.js.map} +1 -1
  793. package/es/{useCurrentKey-89b60d32.js → useCurrentKey-2cdeda49.js} +2 -2
  794. package/es/{useCurrentKey-89b60d32.js.map → useCurrentKey-2cdeda49.js.map} +1 -1
  795. package/es/{useDatatip-e234ee0a.js → useDatatip-73d51f39.js} +4 -4
  796. package/es/{useDatatip-e234ee0a.js.map → useDatatip-73d51f39.js.map} +1 -1
  797. package/es/{useDatatipAndCursor-0b8febe5.js → useDatatipAndCursor-142787d4.js} +2 -2
  798. package/es/{useDatatipAndCursor-0b8febe5.js.map → useDatatipAndCursor-142787d4.js.map} +1 -1
  799. package/es/{useDensity-482708e7.js → useDensity-9c3ef227.js} +2 -2
  800. package/es/{useDensity-482708e7.js.map → useDensity-9c3ef227.js.map} +1 -1
  801. package/es/{useDetectHorizontalOverflow-9b684feb.js → useDetectHorizontalOverflow-5b505e78.js} +30 -58
  802. package/es/useDetectHorizontalOverflow-5b505e78.js.map +1 -0
  803. package/es/useDisplayValue-f7c80ffe.js +6 -6
  804. package/es/{useFloating-38c13cfa.js → useFloating-98ad16ec.js} +2 -2
  805. package/es/{useFloating-38c13cfa.js.map → useFloating-98ad16ec.js.map} +1 -1
  806. package/es/{useHiddenTestMethod-dc102488.js → useHiddenTestMethod-4bb568f0.js} +2 -2
  807. package/es/{useHiddenTestMethod-dc102488.js.map → useHiddenTestMethod-4bb568f0.js.map} +1 -1
  808. package/es/useInputBase-6dc2e103.js +6 -6
  809. package/es/{useKeyboardEvents-ce2d5783.js → useKeyboardEvents-18678615.js} +2 -2
  810. package/es/{useKeyboardEvents-ce2d5783.js.map → useKeyboardEvents-18678615.js.map} +1 -1
  811. package/es/useLegendContextMenu-a6e566c4.js +6 -6
  812. package/es/{useMeterDatatip-e21c0d4b.js → useMeterDatatip-27882514.js} +3 -3
  813. package/es/{useMeterDatatip-e21c0d4b.js.map → useMeterDatatip-27882514.js.map} +1 -1
  814. package/es/useNavigation-a4715511.js +1 -1
  815. package/es/{useOutsideClick-552699e3.js → useOutsideClick-cad76f8b.js} +2 -2
  816. package/es/{useOutsideClick-552699e3.js.map → useOutsideClick-cad76f8b.js.map} +1 -1
  817. package/es/{useOutsideMousedown-36235b3d.js → useOutsideMousedown-9da55345.js} +2 -2
  818. package/es/{useOutsideMousedown-36235b3d.js.map → useOutsideMousedown-9da55345.js.map} +1 -1
  819. package/es/{usePopupAnimation-83d1dde8.js → usePopupAnimation-c12f24ba.js} +2 -2
  820. package/es/{usePopupAnimation-83d1dde8.js.map → usePopupAnimation-c12f24ba.js.map} +1 -1
  821. package/es/{usePrefixSuffix-7a0fb41b.js → usePrefixSuffix-56167b97.js} +2 -2
  822. package/es/{usePrefixSuffix-7a0fb41b.js.map → usePrefixSuffix-56167b97.js.map} +1 -1
  823. package/es/{useRadioFocusManager-d14e0331.js → useRadioFocusManager-afcb8a84.js} +2 -2
  824. package/es/{useRadioFocusManager-d14e0331.js.map → useRadioFocusManager-afcb8a84.js.map} +1 -1
  825. package/es/{useReorderableItem-936082ee.js → useReorderableItem-c47eebbe.js} +3 -3
  826. package/es/{useReorderableItem-936082ee.js.map → useReorderableItem-c47eebbe.js.map} +1 -1
  827. package/es/{useRovingTabIndexContainer-50d6566f.js → useRovingTabIndexContainer-51de19b5.js} +2 -2
  828. package/es/{useRovingTabIndexContainer-50d6566f.js.map → useRovingTabIndexContainer-51de19b5.js.map} +1 -1
  829. package/es/{useScale-9936da9d.js → useScale-4a98c348.js} +2 -2
  830. package/es/{useScale-9936da9d.js.map → useScale-4a98c348.js.map} +1 -1
  831. package/es/useSelectCommon-480b6641.js +5 -5
  832. package/es/{useSelectDrill-93387909.js → useSelectDrill-81f36802.js} +2 -2
  833. package/es/{useSelectDrill-93387909.js.map → useSelectDrill-81f36802.js.map} +1 -1
  834. package/es/{useSelection-429274e4.js → useSelection-584c64a6.js} +2 -2
  835. package/es/{useSelection-429274e4.js.map → useSelection-584c64a6.js.map} +1 -1
  836. package/es/{useSelection-58503244.js → useSelection-9f099db0.js} +6 -6
  837. package/es/{useSelection-58503244.js.map → useSelection-9f099db0.js.map} +1 -1
  838. package/es/{useTabBar-04a0093f.js → useTabBar-f068eee4.js} +6 -9
  839. package/es/useTabBar-f068eee4.js.map +1 -0
  840. package/es/{useTestId-20c68501.js → useTestId-2c0e08d3.js} +2 -2
  841. package/es/{useTestId-20c68501.js.map → useTestId-2c0e08d3.js.map} +1 -1
  842. package/es/{useTheme-eef5d217.js → useTheme-2c44fa3e.js} +2 -2
  843. package/es/{useTheme-eef5d217.js.map → useTheme-2c44fa3e.js.map} +1 -1
  844. package/es/{useThemeInterpolations-2d6f0d78.js → useThemeInterpolations-9df8ad1a.js} +5 -5
  845. package/es/{useThemeInterpolations-2d6f0d78.js.map → useThemeInterpolations-9df8ad1a.js.map} +1 -1
  846. package/es/{useTooltip-8decbde6.js → useTooltip-7779b267.js} +2 -2
  847. package/es/{useTooltip-8decbde6.js.map → useTooltip-7779b267.js.map} +1 -1
  848. package/es/{useTooltipControlled-ccfa2705.js → useTooltipControlled-729b3aac.js} +5 -5
  849. package/es/{useTooltipControlled-ccfa2705.js.map → useTooltipControlled-729b3aac.js.map} +1 -1
  850. package/es/{useTooltipOnTruncation-2df1e74f.js → useTooltipOnTruncation-5e2c2a50.js} +4 -4
  851. package/es/{useTooltipOnTruncation-2df1e74f.js.map → useTooltipOnTruncation-5e2c2a50.js.map} +1 -1
  852. package/es/{useTranslationBundle-ded09d52.js → useTranslationBundle-752de59a.js} +2 -2
  853. package/es/{useTranslationBundle-ded09d52.js.map → useTranslationBundle-752de59a.js.map} +1 -1
  854. package/es/useTruncationTooltip-fd1dac2a.js +3 -3
  855. package/es/{useUser-e1199cab.js → useUser-2c24ff59.js} +2 -2
  856. package/es/{useUser-e1199cab.js.map → useUser-2c24ff59.js.map} +1 -1
  857. package/es/useVisDragModeControls-092e8ac4.js +1 -1
  858. package/es/{useVisEvents-012f2a18.js → useVisEvents-454b5545.js} +2 -2
  859. package/es/{useVisEvents-012f2a18.js.map → useVisEvents-454b5545.js.map} +1 -1
  860. package/es/utils/PRIVATE_collectionUtils.js +17 -17
  861. package/es/utils/PRIVATE_tabBarUtils.js +17 -17
  862. package/es/utils/PRIVATE_tooltipUtils.js +14 -14
  863. package/es/utils/PRIVATE_visTestUtils.js +4 -4
  864. package/es/utils/UNSAFE_popupUtils.js +8 -8
  865. package/es/{withDirectionIcon-abc3124a.js → withDirectionIcon-dec377dd.js} +2 -2
  866. package/es/{withDirectionIcon-abc3124a.js.map → withDirectionIcon-dec377dd.js.map} +1 -1
  867. package/es/withThemeProps-3565a045.js +2 -2
  868. package/package.json +2 -2
  869. package/types/UNSAFE_TabBarMixed/useTabBarMixed.d.ts +1 -1
  870. package/amd/ContainerDiagram-521f402a.js +0 -2
  871. package/amd/Expander-150fa95e.js +0 -2
  872. package/amd/InputDatePicker-613800d1.js +0 -2
  873. package/amd/NavigationListExternalLinkItem-3d98a9e8.js +0 -2
  874. package/amd/NavigationListLinkItem-c4b2b73c.js +0 -2
  875. package/amd/OverflowTabBar-37f590ba.js +0 -2
  876. package/amd/OverflowTabBar-37f590ba.js.map +0 -1
  877. package/amd/OverflowTabBarItem-11f199ee.js +0 -2
  878. package/amd/SortControl-115bc431.js +0 -2
  879. package/amd/TabBar-dc8cadc2.js +0 -2
  880. package/amd/TabBar-dc8cadc2.js.map +0 -1
  881. package/amd/TabBarMixed-e16ca418.js +0 -2
  882. package/amd/useDetectHorizontalOverflow-7f5bba36.js +0 -2
  883. package/amd/useDetectHorizontalOverflow-7f5bba36.js.map +0 -1
  884. package/amd/useTabBar-2d8fc9aa.js +0 -2
  885. package/amd/useTabBar-2d8fc9aa.js.map +0 -1
  886. package/cjs/TabBar-1cd4ac17.js.map +0 -1
  887. package/cjs/TextArea-d65e3f5b.js +0 -207
  888. package/cjs/TextArea-d65e3f5b.js.map +0 -1
  889. package/cjs/useDetectHorizontalOverflow-622817d4.js.map +0 -1
  890. package/cjs/useTabBar-ec20851a.js.map +0 -1
  891. package/es/CheckboxSet-3e0ce80c.js +0 -52
  892. package/es/CheckboxSet-3e0ce80c.js.map +0 -1
  893. package/es/TabBar-36932ca2.js.map +0 -1
  894. package/es/useDetectHorizontalOverflow-9b684feb.js.map +0 -1
  895. package/es/useTabBar-04a0093f.js.map +0 -1
  896. /package/amd/UNSAFE_IndentedCellLayout/themes/{redwood → stable}/IndentedCellLayoutBaseTheme.styles.css +0 -0
  897. /package/es/UNSAFE_IndentedCellLayout/themes/{redwood → stable}/IndentedCellLayoutBaseTheme.styles.css +0 -0
  898. /package/es/UNSAFE_Switch/themes/{redwood → stable}/SwitchBaseTheme.styles.css +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"BaseDiagram-295ed9cc.js","sources":["../../src/PRIVATE_BaseDiagram/utils/diagramUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramLabel.tsx","../../src/PRIVATE_BaseDiagram/utils/tabbableModeUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramNodeElement.tsx","../../src/PRIVATE_BaseDiagram/utils/dropFeedbackUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramLinkElement.tsx","../../src/PRIVATE_BaseDiagram/utils/zoomUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramLabelLayer.tsx","../../src/PRIVATE_BaseDiagram/DiagramLinkLayer.tsx","../../src/PRIVATE_BaseDiagram/DiagramPromotedLinkElement.tsx","../../src/PRIVATE_BaseDiagram/DiagramPromotedLinkLayer.tsx","../../src/PRIVATE_BaseDiagram/DiagramNodeLayer.tsx","../../src/PRIVATE_BaseDiagram/DiagramLayers.tsx","../../src/PRIVATE_BaseDiagram/utils/panUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramOverview.tsx","../../src/PRIVATE_BaseDiagram/DiagramPanZoomContainer.tsx","../../src/PRIVATE_BaseDiagram/utils/navUtils.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramNavigation.ts","../../src/PRIVATE_BaseDiagram/hooks/useEvents.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramDatatip.ts","../../src/PRIVATE_BaseDiagram/hooks/usePointerGesture.ts","../../src/PRIVATE_BaseDiagram/hooks/useDragPan.ts","../../src/PRIVATE_BaseDiagram/hooks/useDrag.ts","../../src/PRIVATE_BaseDiagram/hooks/usePinch.ts","../../src/PRIVATE_BaseDiagram/hooks/usePinchZoom.ts","../../src/PRIVATE_BaseDiagram/hooks/usePanZoom.ts","../../src/PRIVATE_BaseDiagram/hooks/useWheelZoom.ts","../../src/PRIVATE_BaseDiagram/hooks/useWheel.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramContextMenu.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramTabbableMode.ts","../../src/PRIVATE_BaseDiagram/hooks/dndDiagramUtils.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramDnd.ts","../../src/PRIVATE_BaseDiagram/BaseDiagramWithDimensionsWithData.tsx","../../src/PRIVATE_BaseDiagram/hooks/useDiagramSelection.ts","../../src/PRIVATE_BaseDiagram/utils/contextMenuUtils.ts","../../src/PRIVATE_BaseDiagram/EmptyBaseDiagramWithDimensions.tsx","../../src/PRIVATE_BaseDiagram/BaseDiagramWithDimensions.tsx","../../src/PRIVATE_BaseDiagram/BaseDiagram.tsx"],"sourcesContent":["import type {\n DiagramNodeData,\n DiagramLinkData,\n ItemInfo,\n Bounds,\n Position,\n Dimensions,\n DatatipContext,\n DiagramLabelStyles,\n DiagramLabelPosition,\n DiagramLayoutOutput,\n PromotedLinkId\n} from '../diagram.types';\nimport type { RefObject } from 'preact';\nimport type { BundleType } from '#resources/nls/bundle';\nimport type { Font, GetTextDimensionsType, TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { generateAriaLabel } from '#utils/UNSAFE_visUtils/accUtils';\nimport { DatatipConfig } from '#utils/UNSAFE_visTypes/common';\nimport { addKey, containsKey, Keys, removeKey } from '#utils/UNSAFE_keys';\n\nconst hasFiniteRect = (bounds: { x: number; y: number; width: number; height: number }) =>\n Number.isFinite(bounds.x) &&\n Number.isFinite(bounds.y) &&\n Number.isFinite(bounds.width) &&\n Number.isFinite(bounds.height);\n\nconst hasFiniteSize = (dimensions: { width: number; height: number }) =>\n Number.isFinite(dimensions.width) && Number.isFinite(dimensions.height);\n\nexport function serializeDiagramKey(key: string | number) {\n return `${typeof key === 'number' ? 'n' : 's'}:${key}`;\n}\n\nexport function deserializeDiagramKey<K extends string | number>(serializedKey?: string | null) {\n if (serializedKey == null) {\n return undefined;\n }\n const prefix = serializedKey.slice(0, 2);\n const value = serializedKey.slice(2);\n if (prefix === 'n:') {\n return Number(value) as K;\n }\n if (prefix === 's:') {\n return value as K;\n }\n return undefined;\n}\n\nexport function getMapEntryBySerializedKey<K, V>(map: Map<K, V>, serializedKey?: string | null) {\n const key = deserializeDiagramKey<K & (string | number)>(serializedKey);\n if (key == null) {\n return null;\n }\n const value = map.get(key as K);\n return value !== undefined ? { key: key as K, value } : null;\n}\n\nfunction escapeAttributeValueForSelector(value: string) {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\nexport function queryElementByAttributeValue(\n root: ParentNode,\n attribute: string,\n value?: string | null\n): Element | null {\n if (value == null) {\n return null;\n }\n return root.querySelector(`[${attribute}=\"${escapeAttributeValueForSelector(value)}\"]`);\n}\n\nexport function queryElementBySerializedDiagramKey<E extends Element, K extends string | number>(\n root: ParentNode,\n attribute: string,\n key: K\n) {\n return queryElementByAttributeValue(root, attribute, serializeDiagramKey(key)) as E | null;\n}\n\n/**\n * Constructs the json object to be passed into the layout function\n */\nexport function constructLayoutJSON<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n nodeItems: Map<K1, D1>,\n linkItems: Map<K2, D2>,\n promotedLinks: PromotedLinkId<K1, D2>[],\n dimensions: Map<K1, Dimensions>,\n width: number,\n height: number,\n zoom: number,\n nodeIdToParentMap: Map<K1, K1>,\n rootRef?: RefObject<HTMLDivElement>,\n getTextDimensions?: GetTextDimensionsType\n) {\n const labelDims: Map<K1 | K2, TextDimensions> = new Map();\n const nodeValues = Array.from(nodeItems.values());\n const linkValues = Array.from(linkItems.values());\n if (getTextDimensions) {\n getLabelProps(nodeValues, linkValues, labelDims, getTextDimensions);\n }\n\n const linkKeys = Array.from(linkItems.keys());\n for (const id of linkKeys) {\n const item = linkItems.get(id as K2);\n if (item && getTextDimensions && item.label) {\n const label = item.label;\n const fontProps = _getFontProps(item.labelStyle);\n labelDims.set(id as K1 | K2, getTextDimensions(label, fontProps));\n }\n }\n const getLabelDimensions = function (data: D1 | D2) {\n return labelDims.get(data.id);\n };\n const getNodeDimensions = function (data: D1) {\n return dimensions.get(data.id);\n };\n const getRelativeNodeBounds = function (id: K1, containerId?: K1) {\n if (!Number.isFinite(zoom) || zoom <= 0) {\n return undefined;\n }\n const absPos = getAbsoluteNodePosition(id, containerId, rootRef);\n if (absPos && hasFiniteRect(absPos)) {\n return {\n x: absPos.x / zoom,\n y: absPos.y / zoom,\n width: absPos.width / zoom,\n height: absPos.height / zoom\n };\n } else {\n return undefined;\n }\n };\n\n const getContainerId = function (startNode: K1, endNode: K1) {\n return getCommonAncestorId(startNode, endNode, nodeIdToParentMap);\n };\n\n const getPromotedLinks = function () {\n return promotedLinks;\n };\n\n return {\n layoutJSON: {\n getNodeDimensions: getNodeDimensions,\n getLabelDimensions: getLabelDimensions,\n getContainerId,\n getRelativeNodeBounds,\n getPromotedLinks,\n componentSize: {\n width: width,\n height: height\n }\n },\n labelDims: labelDims\n };\n}\n\nfunction normalizeBounds(bounds: Bounds, zoom: number) {\n if (!Number.isFinite(zoom) || zoom <= 0 || !hasFiniteRect(bounds)) {\n return null;\n }\n return {\n x: bounds.x / zoom,\n y: bounds.y / zoom,\n width: bounds.width / zoom,\n height: bounds.height / zoom\n };\n}\n\nfunction getAbsoluteLinkBounds<K1 extends string | number, K2 extends string | number, D2>(\n itemId: K2 | PromotedLinkId<K1, D2>,\n referenceId: K1 | undefined,\n bounds: Map<K2 | PromotedLinkId<K1, D2>, Bounds | Dimensions>,\n zoom: number,\n rootRef?: RefObject<HTMLDivElement>,\n isPromoted?: boolean\n) {\n if (rootRef && rootRef.current) {\n let linkElement;\n if (isPromoted) {\n linkElement = queryElementByAttributeValue(\n rootRef.current,\n 'data-oj-private-promoted-link',\n getPromotedString(itemId as PromotedLinkId<K1, D2>)\n );\n } else {\n linkElement = queryElementBySerializedDiagramKey(\n rootRef.current,\n 'data-oj-private-link',\n itemId as K2\n );\n }\n let nodeContainer;\n if (referenceId) {\n nodeContainer = queryElementBySerializedDiagramKey(\n rootRef.current,\n 'data-oj-private-node',\n referenceId\n );\n }\n const dims = bounds.get(itemId);\n if (linkElement && nodeContainer && dims && hasFiniteSize(dims)) {\n const linkBoundingRect = normalizeBounds(linkElement.getBoundingClientRect(), zoom);\n const diagramBoundingRect = normalizeBounds(nodeContainer.getBoundingClientRect(), zoom);\n if (linkBoundingRect == null || diagramBoundingRect == null) {\n return null;\n }\n return {\n x: linkBoundingRect.x - diagramBoundingRect.x,\n y: linkBoundingRect.y - diagramBoundingRect.y,\n width: dims.width,\n height: dims.height\n };\n }\n }\n return null;\n}\n\nexport function getBounds<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n nodes: D1[],\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeBounds: Map<K1, Bounds>,\n linkDimensions: Map<K2, Dimensions>,\n promotedLinkDimensions: Map<string, Dimensions>,\n zoom: number,\n rootRef?: RefObject<HTMLDivElement>\n) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let topId: K1 | undefined;\n let leftId: K1 | undefined;\n for (let i = 0; i < nodes.length; i++) {\n const nodeId = nodes[i].id;\n const bounds = nodeBounds.get(nodeId);\n if (bounds) {\n if (minX > bounds.x) {\n minX = bounds.x;\n leftId = nodeId;\n }\n if (minY > bounds.y) {\n minY = bounds.y;\n topId = nodeId;\n }\n if (maxX < bounds.x + bounds.width) {\n maxX = bounds.x + bounds.width;\n }\n if (maxY < bounds.y + bounds.height) {\n maxY = bounds.y + bounds.height;\n }\n }\n }\n const nodeMinX = minX;\n const nodeMinY = minY;\n let linkMinX = 0;\n let linkMinY = 0;\n let linkMaxX = maxX - minX;\n let linkMaxY = maxY - minY;\n\n for (let i = 0; i < links.length; i++) {\n const linkId = links[i].id;\n //Top and left bounds are relative to the current most top and left nodes\n const topBounds = getAbsoluteLinkBounds(linkId, topId, linkDimensions, zoom, rootRef);\n const leftBounds = getAbsoluteLinkBounds(linkId, leftId, linkDimensions, zoom, rootRef);\n if (leftBounds) {\n if (leftBounds.x < linkMinX) {\n linkMinX = leftBounds.x;\n }\n if (linkMaxX < leftBounds.x + leftBounds.width) {\n linkMaxX = leftBounds.x + leftBounds.width;\n }\n }\n if (topBounds) {\n if (topBounds.y < linkMinY) {\n linkMinY = topBounds.y;\n }\n if (linkMaxY < topBounds.y + topBounds.height) {\n linkMaxY = topBounds.y + topBounds.height;\n }\n }\n }\n\n for (let i = 0; i < promotedLinks.length; i++) {\n const promotedLink = promotedLinks[i];\n //Top and left bounds are relative to the current most top and left nodes\n const topBounds = getAbsoluteLinkBounds(\n promotedLink,\n topId,\n promotedLinkDimensions,\n zoom,\n rootRef,\n true\n );\n const leftBounds = getAbsoluteLinkBounds(\n promotedLink,\n leftId,\n promotedLinkDimensions,\n zoom,\n rootRef,\n true\n );\n if (leftBounds) {\n if (leftBounds.x < linkMinX) {\n linkMinX = leftBounds.x;\n }\n if (linkMaxX < leftBounds.x + leftBounds.width) {\n linkMaxX = leftBounds.x + leftBounds.width;\n }\n }\n if (topBounds) {\n if (topBounds.y < linkMinY) {\n linkMinY = topBounds.y;\n }\n if (linkMaxY < topBounds.y + topBounds.height) {\n linkMaxY = topBounds.y + topBounds.height;\n }\n }\n }\n return {\n minX: nodeMinX,\n minY: nodeMinY,\n contentWidth: maxX - minX,\n contentHeight: maxY - minY,\n bounds: { x: linkMinX, y: linkMinY, width: linkMaxX - linkMinX, height: linkMaxY - linkMinY }\n };\n}\n\nfunction getAbsoluteNodePosition<K1 extends string | number>(\n nodeId: K1,\n containerId?: K1,\n rootRef?: RefObject<HTMLDivElement>\n) {\n if (rootRef && rootRef.current) {\n const nodeElement = queryElementBySerializedDiagramKey(\n rootRef.current,\n 'data-oj-private-node',\n nodeId\n );\n let nodeContainer;\n if (containerId) {\n nodeContainer = queryElementBySerializedDiagramKey(\n rootRef.current,\n 'data-oj-private-child',\n containerId\n );\n } else {\n nodeContainer = rootRef.current.querySelector('[data-oj-private-node-container]');\n }\n if (nodeElement && nodeContainer) {\n const nodeBoundingRect = nodeElement.getBoundingClientRect();\n const nodeContainerRect = nodeContainer.getBoundingClientRect();\n const bounds = {\n x: nodeBoundingRect.x - nodeContainerRect.x,\n y: nodeBoundingRect.y - nodeContainerRect.y,\n width: nodeBoundingRect.width,\n height: nodeBoundingRect.height\n };\n return hasFiniteRect(bounds) ? bounds : null;\n }\n }\n return null;\n}\n\nfunction getLabelProps<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramNodeData<K2, K1>\n>(\n nodeItems: D1[],\n linkItems: D2[],\n labelDims: Map<K1 | K2, TextDimensions>,\n getTextDimensions: GetTextDimensionsType\n) {\n nodeItems.forEach((value) => {\n if (value.nodes) {\n getNodeLabelProps<K1, K2, D1>(value.nodes, labelDims, getTextDimensions);\n }\n if (value.label) {\n const label = value.label;\n const fontProps = _getFontProps(value.labelStyle);\n labelDims.set(value.id as K1, getTextDimensions(label, fontProps));\n }\n });\n linkItems.forEach((value) => {\n if (value.label) {\n const label = value.label;\n const fontProps = _getFontProps(value.labelStyle);\n labelDims.set(value.id as K2, getTextDimensions(label, fontProps));\n }\n });\n}\n\nfunction getNodeLabelProps<K1, K2, D1 extends DiagramNodeData<K1, D1>>(\n nodeItems: D1[],\n labelDims: Map<K1 | K2, TextDimensions>,\n getTextDimensions: GetTextDimensionsType\n) {\n nodeItems.forEach((value) => {\n if (value.nodes) {\n getNodeLabelProps<K1, K2, D1>(value.nodes, labelDims, getTextDimensions);\n }\n if (value.label) {\n const label = value.label;\n const fontProps = _getFontProps(value.labelStyle);\n labelDims.set(value.id as K1, getTextDimensions(label, fontProps));\n }\n });\n}\n\n/**\n * Deconstructs the output of the layout function\n */\nexport function deconstructLayoutJSON<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(layoutJSON: DiagramLayoutOutput<K1, K2>, nodeData: D1[], linkData: D2[]) {\n const positions: Map<K1, Position> = new Map();\n const nodeLabelPos: Map<K1, DiagramLabelPosition> = new Map();\n const linkLabelPos: Map<K2, DiagramLabelPosition> = new Map();\n findPoints(layoutJSON, nodeData, positions, nodeLabelPos);\n const links = layoutJSON.links;\n let link;\n if (links) {\n for (let i = 0; i < linkData.length; i++) {\n link = links[linkData[i].id];\n if (link && link.label) linkLabelPos.set(linkData[i].id, link.label);\n }\n }\n return {\n nodePoints: positions,\n nodeLabelPos: nodeLabelPos,\n linkLabelPos: linkLabelPos\n };\n}\n\nfunction findPoints<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n output: DiagramLayoutOutput<K1, K2>,\n nodeData: D1[],\n positions: Map<K1, Position>,\n nodeLabelPos: Map<K1, DiagramLabelPosition>\n) {\n const nodes = output.nodes;\n let node;\n if (nodes) {\n for (let i = 0; i < nodeData.length; i++) {\n const data = nodeData[i];\n const id = data.id;\n if (data.nodes) {\n findPoints(output, data.nodes, positions, nodeLabelPos);\n }\n node = nodes[id];\n if (node) {\n positions.set(id, node.position);\n if (node.label) {\n nodeLabelPos.set(id, node.label);\n }\n }\n }\n }\n}\n\n/**\n * Merges the node points into the dimensions\n */\nexport function mergeDimensions<K1 extends string | number>(\n dimensions: Map<K1, Dimensions>,\n nodePoints: Map<K1, Position>,\n rootRef?: RefObject<HTMLDivElement>\n) {\n const nodeBounds: Map<K1, Bounds> = new Map();\n const nodeAbsBounds: Map<K1, Bounds> = new Map();\n dimensions.forEach((value, key) => {\n const point = nodePoints.get(key);\n const absPoint = getAbsoluteNodePosition(key, undefined, rootRef);\n const hasFinitePoint = point != null && Number.isFinite(point.x) && Number.isFinite(point.y);\n const hasFiniteSize = Number.isFinite(value.width) && Number.isFinite(value.height);\n const hasFiniteAbsPoint =\n absPoint != null &&\n Number.isFinite(absPoint.x) &&\n Number.isFinite(absPoint.y) &&\n Number.isFinite(absPoint.width) &&\n Number.isFinite(absPoint.height);\n\n if (hasFinitePoint && hasFiniteSize) {\n nodeBounds.set(key, { x: point.x, y: point.y, width: value.width, height: value.height });\n }\n if (hasFiniteAbsPoint && hasFiniteSize) {\n nodeAbsBounds.set(key, {\n x: absPoint.x,\n y: absPoint.y,\n width: value.width,\n height: value.height\n });\n }\n });\n return { nodeBounds, nodeAbsBounds };\n}\n\n/**\n * Deep equality check for whether two arrays of bounds are the same\n */\nexport function isEqualBounds<K1>(bounds1: Map<K1, Bounds>, bounds2: Map<K1, Bounds>) {\n if (bounds1.size !== bounds2.size) return false;\n let equal = true;\n bounds1.forEach((value, key) => {\n const b2Value = bounds2.get(key);\n if (!b2Value) equal = false;\n else if (\n Math.abs(value.x - b2Value.x) > 0.5 ||\n Math.abs(value.y - b2Value.y) > 0.5 ||\n Math.abs(value.width - b2Value.width) > 0.5 ||\n Math.abs(value.height - b2Value.height) > 0.5\n )\n equal = false;\n });\n return equal;\n}\n\n/**\n * Returns the text for the diagram datatip.\n */\nexport function getDatatipContent<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n nodesMap: Map<K1, D1>,\n linksMap: Map<K2, D2>,\n focusedItem?: ItemInfo<K1, K2, D2>,\n hoveredItem?: ItemInfo<K1, K2, D2>,\n datatip?: DatatipConfig<DatatipContext<K1, D1, D2>>\n) {\n let itemInfo;\n const isPointerActive = hoveredItem?.isCurrent;\n if (isPointerActive && hoveredItem.id != null) {\n itemInfo = hoveredItem;\n }\n if (focusedItem && focusedItem.isCurrent) {\n itemInfo = focusedItem;\n }\n if (itemInfo && datatip) {\n let context: DatatipContext<K1, D1, D2>;\n switch (itemInfo.type) {\n case 'node': {\n context = { data: nodesMap.get(itemInfo.id as K1) as D1, type: 'node' };\n break;\n }\n case 'link': {\n context = { data: linksMap.get(itemInfo.id as K2) as D2, type: 'link' };\n break;\n }\n default: {\n context = { id: itemInfo.id as PromotedLinkId<K1, D2>, type: 'promotedLink' };\n }\n }\n\n return datatip(context);\n }\n if (itemInfo) {\n const text = (\n itemInfo.type === 'node' ? nodesMap.get(itemInfo.id as K1) : linksMap.get(itemInfo.id as K2)\n )?.accessibleLabel;\n return {\n content: text\n };\n }\n return;\n}\n\n/**\n * Creates a map with key id and value node or link data\n */\nexport function createLinksMap<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n items: (D2 | DiagramLinkData<string, K1>)[]\n) {\n const itemIdToDataMap = new Map();\n const itemIdToIndexMap = new Map();\n const itemIndexToIdMap = new Map();\n const itemIdToParentMap = new Map();\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n itemIdToDataMap.set(item.id, item);\n itemIdToIndexMap.set(item.id, i);\n itemIndexToIdMap.set(i, item.id);\n }\n return {\n itemIdToDataMap,\n itemIdToIndexMap,\n itemIndexToIdMap,\n itemIdToParentMap\n };\n}\n\n/**\n * Creates a map with key id and value node or link data\n */\nexport function createPromotedLinksMap<K1 extends string | number, D2>(\n items: PromotedLinkId<K1, D2>[]\n) {\n const promotedLinkMap = new Map();\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n promotedLinkMap.set(getPromotedString(item), item);\n }\n return promotedLinkMap;\n}\n\n/**\n * Creates a map with key id and value node or link data\n */\nexport function createNodesMap<K1, D1 extends DiagramNodeData<K1, D1>>(\n items: D1[],\n expanded: Keys<K1>\n) {\n const itemIdToDataMap = new Map<K1, D1>();\n const itemIdToIndexMap = new Map<K1, string>();\n const itemIndexToIdMap = new Map<string, K1>();\n const itemIdToParentMap = new Map<K1, K1>();\n const allContainerNodes: D1[] = [];\n const allVisibleNodes: K1[] = [];\n const allVisibleNodesData: D1[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const index = String(i);\n itemIdToDataMap.set(item.id, item);\n itemIdToIndexMap.set(item.id, index);\n itemIndexToIdMap.set(index, item.id);\n allVisibleNodes.push(item.id);\n allVisibleNodesData.push(item);\n if ((item as D1).nodes) {\n allContainerNodes.push(item);\n if (containsKey(expanded, item.id)) {\n _createItemMap<K1, D1>(\n (item as D1).nodes!,\n itemIdToDataMap,\n itemIdToIndexMap,\n itemIndexToIdMap,\n itemIdToParentMap,\n allContainerNodes,\n expanded,\n allVisibleNodes,\n allVisibleNodesData,\n item.id as K1,\n String(i)\n );\n }\n }\n }\n return {\n itemIdToDataMap,\n itemIdToIndexMap,\n itemIndexToIdMap,\n itemIdToParentMap,\n allContainerNodes,\n allVisibleNodes,\n allVisibleNodesData\n };\n}\n\nfunction _createItemMap<K1, D1 extends DiagramNodeData<K1, D1>>(\n items: D1[],\n itemIdToDataMap: Map<K1, D1>,\n itemIdToIndexMap: Map<K1, string>,\n itemIndexToIdMap: Map<string, K1>,\n itemIdToParentMap: Map<K1, K1>,\n allContainerNodes: D1[],\n expanded: Keys<K1>,\n allVisibleNodes: K1[],\n allVisibleNodesData: D1[],\n parentId: K1,\n parentIndex: string\n) {\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const index = `${parentIndex}_${i}`;\n itemIdToDataMap.set(item.id, item);\n itemIdToIndexMap.set(item.id, index);\n itemIndexToIdMap.set(index, item.id);\n itemIdToParentMap.set(item.id, parentId);\n allVisibleNodes.push(item.id);\n allVisibleNodesData.push(item);\n if (item.nodes) {\n allContainerNodes.push(item);\n if (containsKey(expanded, item.id)) {\n _createItemMap(\n item.nodes,\n itemIdToDataMap,\n itemIdToIndexMap,\n itemIndexToIdMap,\n itemIdToParentMap,\n allContainerNodes,\n expanded,\n allVisibleNodes,\n allVisibleNodesData,\n item.id,\n index\n );\n }\n }\n }\n}\n\n/**\n * Filter out links with no start or end nodes\n */\nexport function filterLinksWithNoStartOrEndNodes<K2, K1, D1, D2 extends DiagramLinkData<K2, K1>>(\n links: D2[],\n nodesMap: Map<K1, D1>\n) {\n const newLinks: D2[] = [];\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n if (nodesMap.get(link.startNode) && nodesMap.get(link.endNode)) {\n newLinks.push(link);\n }\n }\n return newLinks;\n}\n\n/**\n * Pulls out the dimensions from an array of bounds\n */\nexport function getDimensionsFromBounds<K1>(bounds: Map<K1, Bounds>) {\n const dims: Map<K1, Dimensions> = new Map();\n bounds.forEach((value, key) => {\n dims.set(key, { width: value.width, height: value.height });\n });\n return dims;\n}\n\n/**\n * Returns the center position of the node or link\n * For links, draws a straight line between the centers of the start/end node\n * and returns the center of that line\n */\nexport function getFocusedItemBounds<\n K1 extends string | number,\n K2 extends string | number,\n D2 extends DiagramLinkData<K2, K1>\n>(\n focusedItemInfo: ItemInfo<K1, K2, D2>,\n bounds: Map<K1, Bounds>,\n links: D2[],\n linkIdToIndexMap: Map<K2, number>,\n zoom: number,\n rootRef?: RefObject<HTMLDivElement>\n) {\n if (focusedItemInfo.type === 'node') {\n const nodeBounds = bounds.get(focusedItemInfo.id as K1) || bounds.values().next().value!;\n const liveBounds = getAbsoluteNodePosition(focusedItemInfo.id as K1, undefined, rootRef);\n if (liveBounds && hasFiniteRect(liveBounds) && Number.isFinite(zoom) && zoom > 0) {\n return {\n x: liveBounds.x,\n y: liveBounds.y,\n width: liveBounds.width / zoom,\n height: liveBounds.height / zoom\n };\n }\n\n // Return the first element if cannot find the Node index\n return {\n x: nodeBounds.x,\n y: nodeBounds.y,\n width: nodeBounds.width,\n height: nodeBounds.height\n };\n } else {\n // Center of a straight line between start/end node centers\n const link =\n focusedItemInfo.type === 'promotedLink'\n ? focusedItemInfo.id\n : links[linkIdToIndexMap.get(focusedItemInfo.id as K2) || 0];\n const startNB = bounds.get(link.startNode) || bounds.values().next().value!;\n const endNB = bounds.get(link.endNode) || bounds.values().next().value!;\n const startNCenter = {\n x: startNB.x + startNB.width / 2,\n y: startNB.y + startNB.height / 2\n };\n const endNCenter = { x: endNB.x + endNB.width / 2, y: endNB.y + endNB.height / 2 };\n\n const minX = Math.min(startNCenter.x, endNCenter.x);\n const minY = Math.min(startNCenter.y, endNCenter.y);\n return {\n x: minX,\n y: minY,\n width: Math.abs(startNCenter.x - endNCenter.x),\n height: Math.abs(startNCenter.y - endNCenter.y)\n };\n }\n}\n\n/**\n * Returns the bounds of the diagram content\n */\nexport function getContentBounds<K1>(nodeBounds: Map<K1, Bounds>, labelBounds?: Bounds): Bounds {\n if (nodeBounds.size === 0) return { x: 0, width: Infinity, y: 0, height: Infinity };\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let dims;\n nodeBounds.forEach((value) => {\n dims = value;\n minX = dims.x < minX ? dims.x : minX;\n minY = dims.y < minY ? dims.y : minY;\n maxX = dims.x + dims.width > maxX ? dims.x + dims.width : maxX;\n maxY = dims.y + dims.height > maxY ? dims.y + dims.height : maxY;\n });\n if (labelBounds) {\n minX = labelBounds.x < minX ? labelBounds.x : minX;\n minY = labelBounds.y < minY ? labelBounds.y : minY;\n maxX = labelBounds.x + labelBounds.width > maxX ? labelBounds.x + labelBounds.width : maxX;\n maxY = labelBounds.y + labelBounds.height > maxY ? labelBounds.y + labelBounds.height : maxY;\n }\n return { x: minX, width: maxX - minX, y: minY, height: maxY - minY };\n}\n\n/**\n * Returns the label bounds\n */\nexport function getAllLabelBounds<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n labelDims: Map<K1 | K2, TextDimensions>,\n nodeLabelPos: Map<K1, DiagramLabelPosition> = new Map(),\n linkLabelPos: Map<K2, DiagramLabelPosition> = new Map(),\n isRTL: boolean,\n rootRef?: RefObject<HTMLDivElement>\n) {\n if (nodeLabelPos.size === 0) return undefined;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let dims;\n let nodeBound;\n\n nodeLabelPos.forEach((value, key) => {\n dims = getLabelBounds(value, labelDims.get(key)!, isRTL);\n nodeBound = getAbsoluteNodePosition(key, undefined, rootRef);\n if (nodeBound) {\n minX = dims.x + nodeBound.x < minX ? dims.x + nodeBound.x : minX;\n minY = dims.y + nodeBound.y < minY ? dims.y + nodeBound.y : minY;\n maxX = dims.x + dims.width + nodeBound.x > maxX ? dims.x + dims.width + nodeBound.x : maxX;\n maxY = dims.y + dims.height + nodeBound.y > maxY ? dims.y + dims.height + nodeBound.y : maxY;\n }\n });\n linkLabelPos.forEach((value, key) => {\n dims = getLabelBounds(value, labelDims.get(key)!, isRTL);\n if (dims) {\n minX = dims.x < minX ? dims.x : minX;\n minY = dims.y < minY ? dims.y : minY;\n maxX = dims.x + dims.width > maxX ? dims.x + dims.width : maxX;\n maxY = dims.y + dims.height > maxY ? dims.y + dims.height : maxY;\n }\n });\n return { x: minX, width: maxX - minX, y: minY, height: maxY - minY };\n}\n\nfunction getLabelBounds(label: DiagramLabelPosition, dims: TextDimensions, isRTL: boolean) {\n const labelPos = getLabelPosition(dims, label, isRTL);\n const isRotating = label.rotationAngle;\n if (!isRotating) {\n return { x: labelPos.x, y: labelPos.y, width: dims.width, height: dims.height };\n } else {\n // Find the 4 corners of the label bounds relative to the rotation point\n const rotationPoint = label.rotationPoint\n ? label.rotationPoint\n : { x: dims.width / 2, y: dims.height / 2 };\n const angle = label.rotationAngle!;\n const topLeft = getCoordsRelToRotPoint({ x: 0, y: 0 }, rotationPoint);\n const topRight = getCoordsRelToRotPoint({ x: dims.width, y: 0 }, rotationPoint);\n const bottomLeft = getCoordsRelToRotPoint({ x: 0, y: dims.height }, rotationPoint);\n const bottomRight = getCoordsRelToRotPoint({ x: dims.width, y: dims.height }, rotationPoint);\n const rotTopLeft = rotatePoint(topLeft, angle);\n const rotBotLeft = rotatePoint(bottomLeft, angle);\n const rotTopRight = rotatePoint(topRight, angle);\n const rotBotRight = rotatePoint(bottomRight, angle);\n const points = [rotTopLeft, rotBotLeft, rotTopRight, rotBotRight].map((pos: Position) => {\n return {\n x: pos.x + labelPos.x + rotationPoint.x,\n y: pos.y + labelPos.y + rotationPoint.y\n };\n });\n return getBoundsFromPoints(points);\n }\n}\n\nfunction getCoordsRelToRotPoint(labelPoint: Position, rotPoint: Position) {\n return { x: labelPoint.x - rotPoint.x, y: labelPoint.y - rotPoint.y };\n}\n\nfunction rotatePoint(pos: Position, angle: number) {\n return {\n x: pos.x * Math.cos(angle) - pos.y * Math.sin(angle),\n y: pos.x * Math.sin(angle) + pos.y * Math.cos(angle)\n };\n}\n\nfunction getBoundsFromPoints(points: Position[]) {\n let minX = points[0].x;\n let minY = points[0].y;\n let maxX = points[0].x;\n let maxY = points[0].y;\n for (let i = 1; i < points.length; i++) {\n const point = points[i];\n if (point.x < minX) minX = point.x;\n else if (point.x > maxX) maxX = point.x;\n if (point.y < minY) minY = point.y;\n else if (point.y > maxY) maxY = point.y;\n }\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\n\n/**\n * Returns the position of the label\n * @param dimensions\n * @param positionProps\n * @returns position of the label\n */\nexport function getLabelPosition(\n dimensions: TextDimensions,\n positionProps: DiagramLabelPosition,\n isRTL: boolean\n) {\n const position = positionProps.position;\n const hAlign = positionProps.hAlign ? positionProps.hAlign : isRTL ? 'right' : 'left';\n const vAlign = positionProps.vAlign;\n let x, y;\n if (hAlign === 'center') {\n x = position.x - dimensions.width / 2;\n } else if (hAlign === 'right') {\n x = position.x - dimensions.width;\n } else {\n x = position.x;\n }\n\n if (vAlign === 'middle') {\n y = position.y - dimensions.height / 2;\n } else if (vAlign === 'bottom') {\n y = position.y - dimensions.height;\n } else if (vAlign === 'baseline') {\n y = position.y + dimensions.y;\n } else {\n y = position.y;\n }\n return {\n x: x,\n y: y\n };\n}\n\n/**\n * Compares if two ItemInfo are equal\n */\nexport function isEqualItem<K1, K2, D2>(\n item1?: ItemInfo<K1, K2, D2>,\n item2?: ItemInfo<K1, K2, D2>\n) {\n if (item1?.type === 'promotedLink' && item2?.type === 'promotedLink') {\n return isSamePromotedLinkId(item1.id, item2.id);\n }\n return item1?.id === item2?.id && item1?.type === item2?.type;\n}\n\nconst isPromotedLinkId = <K1 extends string | number, D2>(\n value: unknown\n): value is PromotedLinkId<K1, D2> => {\n return typeof value === 'object' && value != null && 'startNode' in value && 'endNode' in value;\n};\n\nexport function isSamePromotedLinkId<K1 extends string | number, D2>(\n id1: unknown,\n id2: unknown\n) {\n if (id1 == null || id2 == null) {\n return id1 === id2;\n }\n if (!isPromotedLinkId<K1, D2>(id1) || !isPromotedLinkId<K1, D2>(id2)) {\n return false;\n }\n return getPromotedString(id1) === getPromotedString(id2);\n}\n\nexport function includesPromotedLinkId<K1, D2>(\n ids: PromotedLinkId<K1, D2>[],\n id: PromotedLinkId<K1, D2>\n) {\n return ids.some((candidate) => isSamePromotedLinkId(candidate, id));\n}\n\n/**\n * Returns the item info of the data-oj-node or data-oj-link attribute for a given element.\n */\nexport function getNavigableInfo<K1, K2, D2>(\n element: Element,\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>,\n nodesMap: Map<K1, unknown>,\n linksMap: Map<K2, unknown>,\n rootElementRef?: RefObject<HTMLDivElement>\n): ItemInfo<K1, K2, D2> {\n let type;\n let elem = element;\n let navigableId: K1 | K2 | PromotedLinkId<K1, D2> | undefined;\n while (navigableId == null) {\n const element = elem as HTMLElement;\n if (element.dataset['ojPrivateNode']) {\n const entry = getMapEntryBySerializedKey(nodesMap, element.dataset['ojPrivateNode']);\n if (entry) {\n type = 'node';\n navigableId = entry.key;\n }\n } else if (element.dataset['ojPrivateLink']) {\n const entry = getMapEntryBySerializedKey(linksMap, element.dataset['ojPrivateLink']);\n if (entry) {\n navigableId = entry.key;\n type = 'link';\n }\n } else if (element.dataset['ojPrivatePromotedLink']) {\n navigableId = promotedLinkMap.get(element.dataset['ojPrivatePromotedLink']);\n type = 'promotedLink';\n }\n if (navigableId == null) {\n if (elem.parentElement && elem.parentElement !== rootElementRef?.current) {\n elem = elem.parentElement;\n } else {\n break;\n }\n }\n }\n return {\n id: navigableId as K1 | K2,\n type: type\n } as ItemInfo<K1, K2, D2>;\n}\n\n/**\n * Returns the id of the node the expand collapse button belongs to\n */\nexport function expCollapseButtonId<K1>(\n element: HTMLElement,\n nodesMap: Map<K1, unknown>,\n rootElementRef?: RefObject<HTMLDivElement>\n): K1 | undefined {\n let elem = element;\n let id: K1 | undefined;\n while (id == null) {\n id = getMapEntryBySerializedKey(nodesMap, elem.dataset['ojPrivateButton'])?.key;\n if (!id) {\n if (\n elem.parentElement &&\n !elem.parentElement.dataset['ojPrivateNode'] &&\n elem.parentElement !== rootElementRef?.current\n ) {\n elem = elem.parentElement;\n } else {\n break;\n }\n }\n }\n return id;\n}\n\n/**\n * Returns the aria label\n */\nexport function getItemAriaLabel(\n translations: BundleType,\n supportsSelection: boolean,\n states: {\n isSelected?: boolean;\n isIndirect?: boolean;\n isExpanded?: boolean;\n isCollapsed?: boolean;\n containsControls?: boolean;\n },\n accessibleLabel?: string\n) {\n return generateAriaLabel(translations, accessibleLabel || '', {\n isSelected: !supportsSelection ? undefined : states.isSelected,\n isIndirect: states.isIndirect,\n isExpanded: states.isExpanded,\n isCollapsed: states.isCollapsed,\n containsControls: states.containsControls\n });\n}\n\n/**\n * Returns the font props for a node or link\n */\nfunction _getFontProps(styles?: DiagramLabelStyles) {\n const fontProps: Font = {};\n if (!styles) return fontProps;\n if (styles.fontFamily) fontProps.fontFamily = styles.fontFamily;\n if (styles.fontSize) fontProps.fontSize = styles.fontSize;\n if (styles.fontStyle) fontProps.fontStyle = styles.fontStyle;\n if (styles.fontWeight) fontProps.fontWeight = styles.fontWeight;\n return fontProps;\n}\n\n/**\n * Returns whether the node is a leaf node\n */\n\nexport function isLeafNode<K1, D1 extends DiagramNodeData<K1, D1>>(nodeData: D1) {\n return !nodeData.nodes;\n}\n\nexport function isContainerReady<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n nodeData: D1,\n nodeBounds: Map<K1, Bounds>,\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n linkDimensions: Map<K2, Dimensions>,\n promotedLinkDimensions: Map<string, Dimensions>\n) {\n const nodes = nodeData.nodes!;\n for (let i = 0; i < nodes?.length; i++) {\n const child = nodes[i].id;\n if (!nodeBounds.get(child)) {\n return false;\n }\n }\n for (let i = 0; i < links.length; i++) {\n const link = links[i].id;\n const linkDims = linkDimensions.get(link);\n if (!linkDims || (linkDims.width === 0 && linkDims.height === 0)) {\n return false;\n }\n }\n for (let i = 0; i < promotedLinks.length; i++) {\n const link = promotedLinks[i];\n const linkDims = promotedLinkDimensions.get(getPromotedString(link));\n if (!linkDims || (linkDims.width === 0 && linkDims.height === 0)) {\n return false;\n }\n }\n return true;\n}\n\nexport function getPromotedString<K1 extends string | number, D2>(id: PromotedLinkId<K1, D2>) {\n return `${serializeDiagramKey(id.startNode)}_${serializeDiagramKey(id.endNode)}`;\n}\n\nexport function comparePromotedLinks<K1, D2>(\n link1: PromotedLinkId<K1, D2>,\n link2: PromotedLinkId<K1, D2>\n) {\n return link1.startNode === link2.startNode && link1.endNode === link2.endNode;\n}\n\nexport function isPromoted<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n link: D2 | PromotedLinkId<K1, D2>\n) {\n return !('id' in link);\n}\n\nfunction getCommonAncestorId<K1>(startId: K1, endId: K1, nodeIdToParentMap: Map<K1, K1>) {\n const startAnc = _getAncestorIds(startId, nodeIdToParentMap);\n const endAnc = _getAncestorIds(endId, nodeIdToParentMap);\n for (let i = 0; i < startAnc.length; i++) {\n if (endAnc.indexOf(startAnc[i]) > -1) {\n return startAnc[i];\n }\n }\n return undefined;\n}\n\nexport function getLinksForNode<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n containerId: K1 | undefined,\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeIdToParentMap: Map<K1, K1>\n) {\n // front links are in front of nodes\n const frontLinks = [];\n const backLinks = [];\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n const ancId = getCommonAncestorId(link.startNode, link.endNode, nodeIdToParentMap);\n if (ancId === containerId) {\n if (!nodeIdToParentMap.get(link.startNode) && !nodeIdToParentMap.get(link.endNode))\n backLinks.push(link);\n else frontLinks.push(link);\n }\n }\n const frontPromotedLinks = [];\n const backPromotedLinks = [];\n for (let i = 0; i < promotedLinks.length; i++) {\n const link = promotedLinks[i];\n const ancId = getCommonAncestorId(link.startNode, link.endNode, nodeIdToParentMap);\n if (ancId === containerId) {\n if (!nodeIdToParentMap.get(link.startNode) && !nodeIdToParentMap.get(link.endNode))\n backPromotedLinks.push(link);\n else frontPromotedLinks.push(link);\n }\n }\n return { frontLinks, frontPromotedLinks, backLinks, backPromotedLinks };\n}\n\nfunction _getAncestorIds<K1, D1 extends DiagramNodeData<K1, D1>>(nodeId: K1, nodes: Map<K1, K1>) {\n const ancestors = [];\n let anc = nodes.get(nodeId);\n while (anc !== undefined) {\n ancestors.push(anc);\n anc = nodes.get(anc);\n }\n return ancestors;\n}\n\nexport function containerLinksReady<\n K1 extends string | number,\n K2 extends string | number,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>(containerLinks: (D2 | PromotedLinkId<K1, D2>)[], layoutOutput: L) {\n const nodes = layoutOutput.nodes;\n for (let i = 0; i < containerLinks.length; i++) {\n const link = containerLinks[i];\n if (!(nodes[link.startNode] && nodes[link.endNode])) {\n return false;\n }\n }\n return true;\n}\n\nexport function changeExpanded<K1>(id: K1, expanded: Keys<K1>) {\n if (containsKey(expanded, id)) {\n return removeKey(expanded, id, false);\n } else {\n return addKey(expanded, id);\n }\n}\n\nexport function getPromotedLinks<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(links: D2[], expanded: Keys<K1>, allContainerNodes: D1[], allVisibleNodes: K1[]) {\n const collapsed: D1[] = [];\n allContainerNodes.forEach((node: D1) => {\n if (!containsKey(expanded, node.id)) {\n collapsed.push(node);\n }\n });\n const promotedLinks = [];\n const linkToPromotedMap = new Map<K2, string>();\n const promotedToLinkMap = new Map<string, D2[]>();\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n const linkId = link.id;\n const startVisible = allVisibleNodes.includes(link.startNode)\n ? link.startNode\n : firstVisibleAncestor(link.startNode, collapsed);\n const endVisible = allVisibleNodes.includes(link.endNode)\n ? link.endNode\n : firstVisibleAncestor(link.endNode, collapsed);\n if (\n startVisible &&\n endVisible &&\n (startVisible !== link.startNode || endVisible !== link.endNode) &&\n startVisible !== endVisible\n ) {\n const promotedLinkId = `${startVisible}_${endVisible}`;\n let subLinks = promotedToLinkMap.get(promotedLinkId);\n if (subLinks) {\n subLinks.push(link);\n } else {\n const promotedLink = {\n id: promotedLinkId,\n startNode: startVisible,\n endNode: endVisible\n };\n promotedLinks.push(promotedLink);\n subLinks = [link];\n }\n promotedToLinkMap.set(promotedLinkId, subLinks);\n linkToPromotedMap.set(linkId, promotedLinkId);\n }\n }\n const finalPromoted = [];\n for (let i = 0; i < promotedLinks.length; i++) {\n const promotedLink = promotedLinks[i];\n finalPromoted.push({\n startNode: promotedLink.startNode,\n endNode: promotedLink.endNode,\n links: promotedToLinkMap.get(promotedLink.id)!\n });\n }\n return finalPromoted;\n}\n\n// One of the start/end node position changed causing the link position to change\nexport function linkPositionChanged<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n nodeBounds: Map<K1, Bounds>,\n bounds: Map<K1, Bounds>,\n links: D2[]\n) {\n const nodesWithLinks: K1[] = [];\n links.forEach((value) => {\n if (!nodesWithLinks.includes(value.startNode)) {\n nodesWithLinks.push(value.startNode);\n }\n if (!nodesWithLinks.includes(value.endNode)) {\n nodesWithLinks.push(value.endNode);\n }\n });\n let rerender = false;\n nodeBounds.forEach((value, key) => {\n const b2Value = bounds.get(key);\n let equal = true;\n if (!b2Value) equal = false;\n else if (\n Math.abs(value.x - b2Value.x) > 0.5 ||\n Math.abs(value.y - b2Value.y) > 0.5 ||\n Math.abs(value.width - b2Value.width) > 0.5 ||\n Math.abs(value.height - b2Value.height) > 0.5\n ) {\n equal = false;\n }\n if (!equal && nodesWithLinks.includes(key)) {\n rerender = true;\n }\n });\n return rerender;\n}\n\nexport function getChildInfo<K1, D1 extends DiagramNodeData<K1, D1>>(\n id: K1,\n nodeIdToDataMap: Map<K1, D1>\n) {\n const nodes = nodeIdToDataMap.get(id)?.nodes;\n if (nodes && nodes.length > 0) {\n return nodes[0];\n }\n return undefined;\n}\n\nfunction firstVisibleAncestor<K1, D1 extends DiagramNodeData<K1, D1>>(nodeId: K1, collapsed: D1[]) {\n const isDescendant = (chId: K1, data?: D1[]) => {\n if (data) {\n for (let i = 0; i < data.length; i++) {\n if (data[i].id === chId || isDescendant(chId, data[i].nodes)) {\n return true;\n }\n }\n }\n return false;\n };\n for (let i = 0; i < collapsed.length; i++) {\n const node = collapsed[i];\n if (isDescendant(nodeId, node.nodes)) {\n return node.id;\n }\n }\n return null;\n}\n","import type { DiagramLabelPosition, DiagramLabelStyles } from './diagram.types';\nimport { getLabelPosition } from './utils/diagramUtils';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { labelStyles } from './themes/DiagramStyles.css';\nimport type { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { Property } from 'csstype';\n\n/**\n * Props for the label component\n */\ntype LabelProps = {\n styles?: LabelStyles;\n text: string;\n position: DiagramLabelPosition;\n dimensions: TextDimensions;\n isRTL: boolean;\n};\n\n/**\n * Label styles\n */\ntype LabelStyles = DiagramLabelStyles & {\n borderStyle?: Property.BorderStyle;\n};\n\nexport const DiagramLabel = ({ text, position, styles, dimensions, isRTL }: LabelProps) => {\n const { labelStyle, labelBorderStyle } = labelStyles;\n\n const labelPosition = getLabelPosition(dimensions, position, isRTL);\n const labelRotation = getLabelRotation(position);\n return (\n <div\n class={classNames([labelStyle, styles && styles.borderColor && labelBorderStyle])}\n style={{\n top: labelPosition.y,\n left: labelPosition.x,\n ...styles,\n ...labelRotation\n }}>\n {text}\n </div>\n );\n};\n\n/**\n * Returns the label rotation props\n * @param position\n * @returns rotation props\n */\nfunction getLabelRotation(position: DiagramLabelPosition) {\n const rotationAngle = position.rotationAngle;\n const rotationPoint = position.rotationPoint;\n const rotation: {\n transform?: string;\n 'transform-origin'?: string;\n } = {};\n if (rotationAngle) {\n rotation['transform'] = `rotate(${rotationAngle}deg)`;\n }\n if (rotationPoint) {\n rotation['transform-origin'] = `${rotationPoint.x}px ${rotationPoint.y}px`;\n }\n return rotation;\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { allTabbableElements } from '#utils/PRIVATE_tabbableUtils';\nimport type { FocusableElement } from '#utils/PRIVATE_tabbableUtils';\n\nexport const NODE_ITEM_SELECTOR = '[data-oj-private-node]';\nexport const LINK_ITEM_SELECTOR = '[data-oj-private-link]';\nexport const PROMOTED_LINK_ITEM_SELECTOR = '[data-oj-private-promoted-link]';\nconst ROVING_TABINDEX_ATTR = 'data-oj-roving-tabindex-item';\nconst ROVING_RESTORE_PREFIX = 'roving:';\n\nconst BASE_FOCUSABLE_DESCENDANT_SELECTOR_PARTS = [\n 'button:not([disabled]):not([hidden])',\n '[href]:not([disabled]):not([hidden])',\n 'input:not([disabled]):not([hidden])',\n 'select:not([disabled]):not([hidden])',\n 'textarea:not([disabled]):not([hidden])',\n 'video:not([disabled]):not([hidden])',\n \"[contenteditable]:not([contenteditable='false'])\"\n];\n\nconst FOCUSABLE_DESCENDANT_SELECTOR = [\n ...BASE_FOCUSABLE_DESCENDANT_SELECTOR_PARTS,\n '[tabindex]:not([disabled]):not([hidden])'\n].join(', ');\n\nconst getFocusScope = (contentElement: Element | null, focusScopeSelector?: string) => {\n if (!(contentElement instanceof HTMLElement || contentElement instanceof SVGElement)) {\n return null;\n }\n\n const focusScopeCandidate =\n focusScopeSelector != null ? contentElement.querySelector(focusScopeSelector) : null;\n return focusScopeCandidate instanceof HTMLElement || focusScopeCandidate instanceof SVGElement\n ? focusScopeCandidate\n : contentElement;\n};\n\nexport const getClosestFocusableDescendant = (element: Element | null) => {\n if (element == null) {\n return null;\n }\n\n if (element.matches(FOCUSABLE_DESCENDANT_SELECTOR)) {\n return element as FocusableElement;\n }\n\n return element.closest(FOCUSABLE_DESCENDANT_SELECTOR) as FocusableElement | null;\n};\n\nexport const getRestorableFocusIds = (rootElement: HTMLElement, activeElement: Element | null) => {\n if (!activeElement || activeElement === rootElement || !rootElement.contains(activeElement)) {\n return {\n activeElementId: null,\n activeCustomElementId: null\n };\n }\n\n if (activeElement instanceof HTMLElement) {\n const rovingTabIndexId = activeElement.getAttribute(ROVING_TABINDEX_ATTR);\n if (rovingTabIndexId) {\n return {\n activeElementId: null,\n activeCustomElementId: `${ROVING_RESTORE_PREFIX}${rovingTabIndexId}`\n };\n }\n }\n\n if (activeElement instanceof HTMLElement && activeElement.id) {\n return {\n activeElementId: activeElement.id,\n activeCustomElementId: null\n };\n }\n\n let parentElement = activeElement.parentElement;\n while (parentElement && parentElement !== rootElement) {\n if (\n parentElement.matches(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n )\n ) {\n break;\n }\n if (parentElement.id) {\n return {\n activeElementId: null,\n activeCustomElementId: parentElement.id\n };\n }\n parentElement = parentElement.parentElement;\n }\n\n return {\n activeElementId: null,\n activeCustomElementId: null\n };\n};\n\nexport const getRestorableElement = (\n rootElement: HTMLElement,\n focusedItemElement: Element,\n elementId: string | null\n) => {\n if (!elementId) {\n return null;\n }\n\n const candidate = rootElement.ownerDocument.getElementById(elementId);\n if (!(candidate instanceof HTMLElement) || !focusedItemElement.contains(candidate)) {\n return null;\n }\n\n return candidate;\n};\n\nconst getDiagramItemTabbables = (contentElement: Element | null, focusScopeSelector?: string) => {\n const focusScope = getFocusScope(contentElement, focusScopeSelector);\n if (focusScope == null) {\n return [];\n }\n\n return allTabbableElements(focusScope as FocusableElement);\n};\n\nexport const focusDiagramItemContent = ({\n contentElement,\n focusAction,\n restoreElementId,\n restoreCustomElementId,\n focusScopeSelector\n}: {\n contentElement: Element | null;\n focusAction?: 'first' | 'restore';\n restoreElementId?: string | null;\n restoreCustomElementId?: string | null;\n focusScopeSelector?: string;\n}) => {\n const focusScope = getFocusScope(contentElement, focusScopeSelector);\n if (focusScope == null) {\n return false;\n }\n\n const tabbables = getDiagramItemTabbables(contentElement, focusScopeSelector);\n\n if (focusAction === 'restore') {\n for (const restoreId of [restoreElementId, restoreCustomElementId]) {\n if (!restoreId) {\n continue;\n }\n\n const restoreTarget = restoreId.startsWith(ROVING_RESTORE_PREFIX)\n ? (focusScope.querySelector(\n `[${ROVING_TABINDEX_ATTR}=\"${restoreId.slice(ROVING_RESTORE_PREFIX.length)}\"]`\n ) as Element | null)\n : (focusScope.ownerDocument.getElementById(restoreId) as Element | null);\n if (\n restoreTarget != null &&\n focusScope.contains(restoreTarget) &&\n 'focus' in restoreTarget &&\n typeof restoreTarget.focus === 'function'\n ) {\n restoreTarget.focus({ preventScroll: true });\n return true;\n }\n }\n }\n\n if (tabbables.length > 0) {\n tabbables[0].focus({ preventScroll: true });\n return true;\n }\n\n return false;\n};\n\nexport const hasDiagramItemTabbables = ({\n contentElement,\n focusScopeSelector\n}: {\n contentElement: Element | null;\n focusScopeSelector?: string;\n}) => getDiagramItemTabbables(contentElement, focusScopeSelector).length > 0;\n\nexport const containFocusWithinDiagramItem = ({\n event,\n contentElement,\n focusScopeSelector\n}: {\n event: KeyboardEvent;\n contentElement: Element | null;\n focusScopeSelector?: string;\n}) => {\n if (event.key !== 'Tab') {\n return false;\n }\n\n if (!(contentElement instanceof HTMLElement || contentElement instanceof SVGElement)) {\n return false;\n }\n\n const focusScopeCandidate =\n focusScopeSelector != null ? contentElement.querySelector(focusScopeSelector) : null;\n const focusScope =\n focusScopeCandidate instanceof HTMLElement || focusScopeCandidate instanceof SVGElement\n ? focusScopeCandidate\n : contentElement;\n const tabbables = allTabbableElements(focusScope as FocusableElement);\n if (tabbables.length === 0) {\n return false;\n }\n\n const activeElement = contentElement.ownerDocument.activeElement as Element | null;\n const firstTabbable = tabbables[0];\n const lastTabbable = tabbables[tabbables.length - 1];\n const isActiveWithinScope = activeElement != null && focusScope.contains(activeElement);\n\n if (\n (!event.shiftKey && (!isActiveWithinScope || activeElement === lastTabbable)) ||\n (event.shiftKey && (!isActiveWithinScope || activeElement === firstTabbable))\n ) {\n event.preventDefault();\n event.stopPropagation();\n (event.shiftKey ? lastTabbable : firstTabbable).focus({ preventScroll: true });\n return true;\n }\n\n return false;\n};\n","import type {\n Position,\n InternalNodeState,\n NodeRendererContext,\n DiagramLabelPosition,\n DiagramNodeData\n} from './diagram.types';\nimport { useResizeObserver } from '#hooks/UNSAFE_useResizeObserver';\nimport { useCallback, useLayoutEffect, useRef } from 'preact/hooks';\nimport { getItemAriaLabel } from './utils/diagramUtils';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { buttonStyle, itemStyles, layerStyles } from './themes/DiagramStyles.css';\nimport { ComponentChildren } from 'preact';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { FocusTrap } from '#UNSAFE_FocusTrap';\nimport { useUser } from '#hooks/UNSAFE_useUser';\nimport { DiagramLabel } from './DiagramLabel';\nimport { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { EmbeddedIconButton } from '#PRIVATE_EmbeddedIconButton';\nimport { Plus } from '#UNSAFE_RedwoodIcons/Plus';\nimport { Minus } from '#UNSAFE_RedwoodIcons/Minus';\nimport { baseStyle as focusTrackerBaseStyle } from '../PRIVATE_FocusTracker/themes/FocusTrackerStyles.css';\nimport { focusDiagramItemContent } from './utils/tabbableModeUtils';\nimport { serializeDiagramKey } from './utils/diagramUtils';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\n\n/**\n * Props for node component\n */\ntype NodeProps<K1, K2, D1> = {\n id: K1;\n position?: Position;\n state: InternalNodeState;\n isDimmed?: boolean;\n activeId?: string;\n accessibleLabel?: string;\n data: D1;\n nodeRenderer: (context: NodeRendererContext<D1>) => ComponentChildren;\n onNodeSizeChanged: (width: number, height: number, id: K1) => void;\n supportsSelection: boolean;\n content?: { content: ComponentChildren; width: number; height: number };\n labelPosition?: DiagramLabelPosition;\n labelDimensions?: Map<K1 | K2, TextDimensions>;\n dropFeedback?: { accepted: boolean };\n};\n\nexport const DiagramNodeElement = <K1, K2, D1 extends DiagramNodeData<K1, D1>>({\n id,\n state,\n position,\n activeId,\n nodeRenderer,\n onNodeSizeChanged,\n data,\n accessibleLabel,\n isDimmed,\n supportsSelection,\n content,\n labelPosition,\n labelDimensions,\n dropFeedback\n}: NodeProps<K1, K2, D1>) => {\n const { nodeStyles, dimmedItemStyle, nodeDropFeedbackStyle } = itemStyles;\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const ref = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const tabbableFocusStateRef = useRef({\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n });\n tabbableFocusStateRef.current = {\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n };\n const handleTabbableFocusFailure = useCallback(() => {\n state.onTabbableModeFocusFailure?.({\n focusOwner: tabbableFocusStateRef.current.tabbableModeFocusAction === 'restore'\n });\n }, [state.onTabbableModeFocusFailure]);\n // FocusTrap calls this when the node enters tabbable mode so we can restore\n // the previous inner focus after rerender, or fall back to the first tabbable.\n const autoFocusRef = useRef<{ focus: () => void }>({\n focus: () => {\n const tabbableFocusState = tabbableFocusStateRef.current;\n const didFocus = focusDiagramItemContent({\n contentElement: contentRef.current,\n focusAction: tabbableFocusState.tabbableModeFocusAction,\n restoreElementId: tabbableFocusState.tabbableModeRestoreElementId,\n restoreCustomElementId: tabbableFocusState.tabbableModeRestoreCustomElementId,\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n });\n if (!didFocus) {\n handleTabbableFocusFailure();\n }\n }\n });\n useLayoutEffect(() => {\n if (!state.isTabbable || !state.tabbableModeFocusAction) {\n return;\n }\n\n const frameId = window.requestAnimationFrame(() => {\n const tabbableFocusState = tabbableFocusStateRef.current;\n const didFocus = focusDiagramItemContent({\n contentElement: contentRef.current,\n focusAction: tabbableFocusState.tabbableModeFocusAction,\n restoreElementId: tabbableFocusState.tabbableModeRestoreElementId,\n restoreCustomElementId: tabbableFocusState.tabbableModeRestoreCustomElementId,\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n });\n if (!didFocus) {\n handleTabbableFocusFailure();\n }\n });\n\n return () => {\n window.cancelAnimationFrame(frameId);\n };\n }, [handleTabbableFocusFailure, state.isTabbable, state.tabbableModeFocusAction]);\n // TODO JET-62472 change to one resize observer function\n const optionsRef = useRef({ box: 'border-box' as const });\n\n useResizeObserver(\n ref,\n useCallback(\n (entry: ResizeObserverEntry) => {\n const boxSize = Array.isArray(entry.borderBoxSize)\n ? entry.borderBoxSize[0]\n : entry.borderBoxSize;\n const width = Number.isFinite(boxSize?.inlineSize)\n ? boxSize.inlineSize\n : entry.contentRect.width;\n const height = Number.isFinite(boxSize?.blockSize)\n ? boxSize.blockSize\n : entry.contentRect.height;\n onNodeSizeChanged(width, height, id);\n },\n [id, onNodeSizeChanged]\n ),\n optionsRef.current\n );\n const nodePos = position ? position : { x: 0, y: 0 };\n const { direction } = useUser();\n const hasLabel = data.label && labelPosition && labelDimensions;\n const serializedId = serializeDiagramKey(id as string | number);\n const expander = (\n <div data-oj-private-button={serializedId} class={buttonStyle}>\n <EmbeddedIconButton aria-hidden={true} size=\"xs\">\n {content ? <Minus /> : <Plus />}\n </EmbeddedIconButton>\n </div>\n );\n const context = {\n state,\n data: data,\n childContext: content,\n expander: expander\n };\n return (\n <div\n ref={ref}\n key={id}\n class={classNames([\n nodeStyles,\n dropFeedback?.accepted === false ? VisDndStyles.dndRejectedStyle : undefined\n ])}\n data-oj-private-node={serializedId}\n role={content ? 'group' : 'img'}\n tabIndex={-1}\n aria-label={getItemAriaLabel(\n translations,\n supportsSelection,\n {\n isSelected: state.isSelected,\n isExpanded: content !== undefined,\n isCollapsed: content === undefined && data.nodes !== undefined\n },\n accessibleLabel\n )}\n style={{\n top: nodePos.y,\n left: nodePos.x\n }}\n id={state.isFocused || state.isHovered ? activeId : undefined}>\n {dropFeedback ? (\n <div\n class={classNames([\n nodeDropFeedbackStyle,\n dropFeedback.accepted\n ? VisDndStyles.dndDragOverHTMLStyle\n : VisDndStyles.dndRejectedStyle\n ])}\n data-oj-private-drop-feedback={dropFeedback.accepted ? 'accept' : 'reject'}\n />\n ) : undefined}\n <div ref={contentRef} class={classNames([isDimmed ? dimmedItemStyle : undefined])}>\n <TabbableModeContext.Provider value={{ isTabbable: !!state.isTabbable }}>\n <FocusTrap\n autoFocusRef={\n state.isTabbable && state.tabbableModeFocusAction ? autoFocusRef : undefined\n }\n isDisabled={!state.isTabbable}\n restoreFocusRef={false}>\n {nodeRenderer(context)}\n </FocusTrap>\n </TabbableModeContext.Provider>\n </div>\n {hasLabel ? (\n <div class={layerStyles}>\n <DiagramLabel\n styles={data.labelStyle}\n text={data.label!}\n position={labelPosition!}\n dimensions={labelDimensions.get(id)!}\n isRTL={direction === 'rtl'}\n />\n </div>\n ) : undefined}\n </div>\n );\n};\n","export type SvgDropFeedbackBounds = { x: number; y: number; width: number; height: number };\n\nexport const isSameBounds = (bounds1?: SvgDropFeedbackBounds, bounds2?: SvgDropFeedbackBounds) =>\n bounds1?.x === bounds2?.x &&\n bounds1?.y === bounds2?.y &&\n bounds1?.width === bounds2?.width &&\n bounds1?.height === bounds2?.height;\n\nexport const getSvgDropFeedbackBounds = (element: SVGGElement) => {\n if (typeof element.getBBox !== 'function') {\n return undefined;\n }\n\n let bounds: DOMRect;\n try {\n bounds = element.getBBox();\n } catch {\n return undefined;\n }\n\n if (\n !Number.isFinite(bounds.x) ||\n !Number.isFinite(bounds.y) ||\n !Number.isFinite(bounds.width) ||\n !Number.isFinite(bounds.height) ||\n (bounds.width === 0 && bounds.height === 0)\n ) {\n return undefined;\n }\n\n return { x: bounds.x, y: bounds.y, width: bounds.width, height: bounds.height };\n};\n","import type { InternalLinkState, LinkRendererContext, DiagramLinkData } from './diagram.types';\nimport { getItemAriaLabel } from './utils/diagramUtils';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { itemStyles } from './themes/DiagramStyles.css';\nimport { ComponentChildren } from 'preact';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useResizeObserver } from '#hooks/UNSAFE_useResizeObserver';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { containFocusWithinDiagramItem, focusDiagramItemContent } from './utils/tabbableModeUtils';\nimport { serializeDiagramKey } from './utils/diagramUtils';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\nimport {\n getSvgDropFeedbackBounds,\n isSameBounds,\n SvgDropFeedbackBounds\n} from './utils/dropFeedbackUtils';\n\n/**\n * Props for Link\n */\nexport type LinkProps<K1, K2, D2, L> = {\n id: K2;\n state: InternalLinkState;\n isDimmed?: boolean;\n activeId?: string;\n accessibleLabel?: string;\n data: D2 | DiagramLinkData<string, K1>;\n linkRenderer: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n supportsSelection: boolean;\n layoutOutput: L;\n onLinkSizeChanged: (width: number, height: number, id: K2) => void;\n dropFeedback?: { accepted: boolean };\n};\n\nexport const DiagramLinkElement = <K1, K2, D2 extends DiagramLinkData<K2, K1>, L>({\n id,\n state,\n activeId,\n data,\n linkRenderer,\n accessibleLabel,\n isDimmed,\n supportsSelection,\n layoutOutput,\n onLinkSizeChanged,\n dropFeedback\n}: LinkProps<K1, K2, D2, L>) => {\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const { dimmedItemStyle, linkStyles, svgDropFeedbackStyle } = itemStyles;\n const context = {\n state,\n data,\n layoutOutput,\n type: 'link'\n } as LinkRendererContext<K1, D2, L>;\n const ref = useRef<SVGGElement>(null);\n const [dropFeedbackBounds, setDropFeedbackBounds] = useState<SvgDropFeedbackBounds>();\n const tabbableFocusStateRef = useRef({\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n });\n tabbableFocusStateRef.current = {\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n };\n const handleTabbableFocusFailure = useCallback(() => {\n state.onTabbableModeFocusFailure?.({\n focusOwner: tabbableFocusStateRef.current.tabbableModeFocusAction === 'restore'\n });\n }, [state.onTabbableModeFocusFailure]);\n const optionsRef = useRef({ box: 'border-box' as const });\n const serializedId = serializeDiagramKey(id as string | number);\n useResizeObserver(\n ref,\n useCallback(\n (entry: ResizeObserverEntry) => {\n const boxSize = Array.isArray(entry.borderBoxSize)\n ? entry.borderBoxSize[0]\n : entry.borderBoxSize;\n const width = Number.isFinite(boxSize?.inlineSize)\n ? boxSize.inlineSize\n : entry.contentRect.width;\n const height = Number.isFinite(boxSize?.blockSize)\n ? boxSize.blockSize\n : entry.contentRect.height;\n onLinkSizeChanged(width, height, id);\n },\n [id, onLinkSizeChanged]\n ),\n optionsRef.current\n );\n useLayoutEffect(() => {\n if (!state.isTabbable || !state.tabbableModeFocusAction) {\n return;\n }\n\n const tabbableFocusState = tabbableFocusStateRef.current;\n const didFocus = focusDiagramItemContent({\n contentElement: ref.current,\n focusAction: tabbableFocusState.tabbableModeFocusAction,\n restoreElementId: tabbableFocusState.tabbableModeRestoreElementId,\n restoreCustomElementId: tabbableFocusState.tabbableModeRestoreCustomElementId\n });\n if (!didFocus) {\n handleTabbableFocusFailure();\n }\n }, [handleTabbableFocusFailure, state.isTabbable, state.tabbableModeFocusAction]);\n\n useLayoutEffect(() => {\n if (!dropFeedback?.accepted || !ref.current) {\n setDropFeedbackBounds((current) => (current === undefined ? current : undefined));\n return;\n }\n\n const nextBounds = getSvgDropFeedbackBounds(ref.current);\n setDropFeedbackBounds((current) => (isSameBounds(current, nextBounds) ? current : nextBounds));\n }, [dropFeedback?.accepted, layoutOutput]);\n\n const handleKeyDownCapture = useCallback(\n (event: KeyboardEvent) => {\n if (!state.isTabbable) {\n return;\n }\n\n containFocusWithinDiagramItem({\n event,\n contentElement: ref.current\n });\n },\n [state.isTabbable]\n );\n\n return (\n <g\n ref={ref}\n key={id}\n tabIndex={-1}\n id={state.isFocused || state.isHovered ? activeId : undefined}\n aria-label={getItemAriaLabel(\n translations,\n supportsSelection,\n {\n isSelected: state.isSelected\n },\n accessibleLabel\n )}\n data-oj-private-link={serializedId}\n data-oj-private-drop-feedback={dropFeedback?.accepted === false ? 'reject' : undefined}\n role=\"img\"\n onKeyDownCapture={handleKeyDownCapture}\n class={classNames([\n linkStyles,\n isDimmed && dimmedItemStyle,\n dropFeedback?.accepted === false && VisDndStyles.dndRejectedStyle\n ])}>\n <TabbableModeContext.Provider value={{ isTabbable: !!state.isTabbable }}>\n {linkRenderer(context)}\n </TabbableModeContext.Provider>\n {dropFeedback?.accepted && dropFeedbackBounds ? (\n <rect\n x={dropFeedbackBounds.x}\n y={dropFeedbackBounds.y}\n width={dropFeedbackBounds.width}\n height={dropFeedbackBounds.height}\n class={classNames([svgDropFeedbackStyle, VisDndStyles.dndDragOverSvgStyle])}\n data-oj-private-drop-feedback=\"accept\"\n />\n ) : undefined}\n </g>\n );\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport { Bounds, DiagramLinkData, ItemInfo, Zoom } from '#PRIVATE_BaseDiagram/diagram.types';\n\nexport const ZOOM_INCREMENT = 0.05;\nconst ZOOM_TO_FIT_PADDING = 20;\n\nexport const zoom = (\n nextZoom: number,\n zoom: number,\n minZoom: number,\n maxZoom: number,\n onZoomChange?: (detail: { zoomValue: number }) => void\n) => {\n const newZoom = constrainZoom(nextZoom, minZoom, maxZoom);\n const isZoomChanged = newZoom !== zoom;\n isZoomChanged &&\n onZoomChange &&\n onZoomChange({\n zoomValue: newZoom\n });\n return newZoom;\n};\n\n/**\n * Returns the zoom properties for the diagram.\n */\nexport function getZoomProps(props: Zoom, width: number, height: number, contentBounds: Bounds) {\n const zoomTofitZoom = getZoomToFitZoom(width, height, contentBounds);\n const maxZoom = props.maxZoom || 1;\n const minZoom = props.minZoom || Math.min(maxZoom, zoomTofitZoom);\n const zoom = props.zoomValue ? props.zoomValue : zoomTofitZoom;\n return {\n zooming: props.zooming ? props.zooming : 'off',\n // default value of 0 indicates zoom-to-fit level\n minZoom: minZoom,\n maxZoom: maxZoom,\n // zoom value of 0 will default to zoom to fit\n zoomValue: constrainZoom(zoom, minZoom, maxZoom),\n onZoom: props.onZoom\n };\n}\n\n/**\n * Returns the zoom to fit zoom level\n */\nexport function getZoomToFitZoom(width: number, height: number, contentBounds: Bounds) {\n const zoomX = (width - 2 * ZOOM_TO_FIT_PADDING) / contentBounds.width;\n const zoomY = (height - 2 * ZOOM_TO_FIT_PADDING) / contentBounds.height;\n return Math.min(zoomX, zoomY);\n}\n\n/**\n * Constrains the zoom level\n */\nfunction constrainZoom(zoom: number, minZoom: number, maxZoom: number) {\n let newZoom = Math.max(minZoom, zoom);\n newZoom = Math.min(maxZoom, newZoom);\n return newZoom;\n}\n\n/**\n * Returns the panX, panY, and zoom when zooming and centering an item\n */\nexport function zoomAndCenterItemFromInfo<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n info: ItemInfo<K1, K2, D2>,\n linkIdToDataMap: Map<K2, D2>,\n bounds: Map<K1, Bounds>,\n width: number,\n height: number,\n maxZoom: number\n) {\n const type = info.type;\n let totalBounds;\n if (type === 'node') {\n totalBounds = bounds.get(info.id as K1)!;\n } else {\n const link = linkIdToDataMap.get(info.id as K2)!;\n const startNodeBounds = bounds.get(link.startNode)!;\n const endNodeBounds = bounds.get(link.endNode)!;\n const minX = Math.min(startNodeBounds.x, endNodeBounds.x);\n const minY = Math.min(startNodeBounds.y, endNodeBounds.y);\n const maxX = Math.max(\n startNodeBounds.x + startNodeBounds.width,\n endNodeBounds.x + startNodeBounds.width\n );\n const maxY = Math.max(\n startNodeBounds.y + startNodeBounds.height,\n endNodeBounds.y + endNodeBounds.height\n );\n totalBounds = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n }\n return getPanZoomToCenterNode(totalBounds, maxZoom, width, height);\n}\n\n/**\n * Returns the pan and zoom values in order\n * to center a node or link\n */\nfunction getPanZoomToCenterNode(bounds: Bounds, maxZoom: number, width: number, height: number) {\n const zoomX = (width - 2 * ZOOM_TO_FIT_PADDING) / bounds.width;\n const zoomY = (height - 2 * ZOOM_TO_FIT_PADDING) / bounds.height;\n const zoom = Math.min(zoomX, zoomY, maxZoom);\n const cX = bounds.width / 2 + bounds.x;\n const cY = bounds.height / 2 + bounds.y;\n return { centerX: cX, centerY: cY, zoom: zoom };\n}\n","import type { DiagramLabelPosition, DiagramLinkData } from './diagram.types';\nimport { DiagramLabel } from './DiagramLabel';\nimport type { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { layerStyles } from './themes/DiagramStyles.css';\nimport { useUser } from '#hooks/UNSAFE_useUser';\n\ntype Props<K1, K2, D2 extends DiagramLinkData<K2, K1>> = {\n labelPosition: Map<K2, DiagramLabelPosition>;\n itemProps: D2[];\n labelDimensions: Map<K2, TextDimensions>;\n};\n\nexport function DiagramLabelLayer<K1, K2, D2 extends DiagramLinkData<K2, K1>>({\n labelPosition,\n itemProps,\n labelDimensions\n}: Props<K1, K2, D2>) {\n const { direction } = useUser();\n return (\n <div class={layerStyles}>\n {itemProps.map((item) => {\n if (item.label && labelPosition.get(item.id)) {\n return (\n <DiagramLabel\n styles={item.labelStyle}\n text={item.label}\n position={labelPosition.get(item.id)!}\n dimensions={labelDimensions.get(item.id)!}\n isRTL={direction === 'rtl'}\n />\n );\n }\n return undefined;\n })}\n </div>\n );\n}\n","import { ComponentChildren } from 'preact';\nimport type {\n States,\n InternalLinkState,\n LinkRendererContext,\n DiagramLinkData,\n DiagramLayoutOutput,\n Bounds,\n DiagramLabelPosition\n} from './diagram.types';\nimport { DiagramLinkElement } from './DiagramLinkElement';\nimport { layerStyles, linkLayerStyle } from './themes/DiagramStyles.css';\nimport { getZoomToFitZoom } from './utils/zoomUtils';\nimport { DiagramLabelLayer } from './DiagramLabelLayer';\nimport { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\n\ntype Props<K2, K1, D2, L> = {\n links: D2[];\n states: States<K1, K2, D2>;\n linkRenderer: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n width: number;\n height: number;\n supportsSelection: boolean;\n layoutOutput: L;\n combinedNodeBounds: Bounds;\n labelDimensions: Map<K1 | K2, TextDimensions>;\n linkLabelPositions: Map<K2, DiagramLabelPosition>;\n onLinkSizeChanged: (width: number, height: number, id: K2) => void;\n minX: number;\n minY: number;\n};\n\nexport function DiagramLinkLayer<\n K2 extends string | number,\n K1 extends string | number,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n links,\n states,\n linkRenderer,\n width,\n height,\n supportsSelection,\n onLinkSizeChanged,\n layoutOutput,\n combinedNodeBounds,\n linkLabelPositions,\n labelDimensions,\n minX,\n minY\n}: Props<K2, K1, D2, L>) {\n const zoom = getZoomToFitZoom(width, height, combinedNodeBounds);\n return (\n <div class={linkLayerStyle} style={{ top: -minY, left: -minX }}>\n <svg width={width / zoom} height={height / zoom} class={layerStyles} overflow=\"visible\">\n {links.map((link) => {\n const isTabbableOwner = states.isTabbableMode && states.tabbableModeItemId === link.id;\n const dropFeedback =\n states.dropFeedback?.type === 'link' && states.dropFeedback.id === link.id\n ? states.dropFeedback\n : undefined;\n const state: InternalLinkState = {\n isSelected: states.selectedLinkIds.includes(link.id),\n isFocused: states.focusedId === link.id,\n isHovered: states.hoveredId === link.id,\n zoom: states.zoom,\n isTabbable: isTabbableOwner,\n tabbableModeFocusAction: isTabbableOwner ? states.tabbableModeFocusAction : undefined,\n tabbableModeRestoreElementId: isTabbableOwner\n ? states.tabbableModeRestoreElementId\n : undefined,\n tabbableModeRestoreCustomElementId: isTabbableOwner\n ? states.tabbableModeRestoreCustomElementId\n : undefined,\n onTabbableModeFocusFailure: isTabbableOwner\n ? states.onTabbableModeFocusFailure\n : undefined\n };\n return (\n <DiagramLinkElement\n id={link.id}\n state={state}\n isDimmed={\n (states.highlightedNodeIds.length !== 0 ||\n states.highlightedLinkIds.length !== 0 ||\n states.highlightedPromotedLinkIds.length !== 0) &&\n !states.highlightedLinkIds.includes(link.id)\n }\n activeId={states.activeId}\n accessibleLabel={link.accessibleLabel}\n data={link}\n linkRenderer={linkRenderer}\n supportsSelection={supportsSelection}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onLinkSizeChanged}\n dropFeedback={dropFeedback}\n />\n );\n })}\n </svg>\n {labelDimensions ? (\n <div>\n {links && linkLabelPositions ? (\n <DiagramLabelLayer\n labelPosition={linkLabelPositions}\n itemProps={links}\n labelDimensions={labelDimensions}\n />\n ) : undefined}\n </div>\n ) : undefined}\n </div>\n );\n}\n","import type { InternalLinkState, LinkRendererContext, PromotedLinkId } from './diagram.types';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { itemStyles } from './themes/DiagramStyles.css';\nimport { ComponentChildren } from 'preact';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useResizeObserver } from '#hooks/UNSAFE_useResizeObserver';\nimport { getItemAriaLabel, getPromotedString } from './utils/diagramUtils';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { containFocusWithinDiagramItem, focusDiagramItemContent } from './utils/tabbableModeUtils';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\nimport {\n getSvgDropFeedbackBounds,\n isSameBounds,\n SvgDropFeedbackBounds\n} from './utils/dropFeedbackUtils';\n\n/**\n * Props for Link\n */\nexport type LinkProps<K1, D2, L> = {\n id: PromotedLinkId<K1, D2>;\n state: InternalLinkState;\n isDimmed?: boolean;\n activeId?: string;\n linkRenderer: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n supportsSelection: boolean;\n layoutOutput: L;\n onLinkSizeChanged: (width: number, height: number, id: string) => void;\n dropFeedback?: { accepted: boolean };\n};\n\nexport const DiagramPromotedLinkElement = <K1 extends string | number, D2, L>({\n id,\n state,\n activeId,\n linkRenderer,\n isDimmed,\n supportsSelection,\n layoutOutput,\n onLinkSizeChanged,\n dropFeedback\n}: LinkProps<K1, D2, L>) => {\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const { dimmedItemStyle, linkStyles, svgDropFeedbackStyle } = itemStyles;\n const context = {\n state,\n data: id.links,\n layoutOutput,\n startNode: id.startNode,\n endNode: id.endNode,\n type: 'promotedLink'\n } as LinkRendererContext<K1, D2, L>;\n const ref = useRef<SVGGElement>(null);\n const [dropFeedbackBounds, setDropFeedbackBounds] = useState<SvgDropFeedbackBounds>();\n const tabbableFocusStateRef = useRef({\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n });\n tabbableFocusStateRef.current = {\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n };\n const handleTabbableFocusFailure = useCallback(() => {\n state.onTabbableModeFocusFailure?.({\n focusOwner: tabbableFocusStateRef.current.tabbableModeFocusAction === 'restore'\n });\n }, [state.onTabbableModeFocusFailure]);\n const optionsRef = useRef({ box: 'border-box' as const });\n const stringId = getPromotedString(id);\n useResizeObserver(\n ref,\n useCallback(\n (entry: ResizeObserverEntry) => {\n const boxSize = Array.isArray(entry.borderBoxSize)\n ? entry.borderBoxSize[0]\n : entry.borderBoxSize;\n const width = Number.isFinite(boxSize?.inlineSize)\n ? boxSize.inlineSize\n : entry.contentRect.width;\n const height = Number.isFinite(boxSize?.blockSize)\n ? boxSize.blockSize\n : entry.contentRect.height;\n onLinkSizeChanged(width, height, stringId);\n },\n [stringId, onLinkSizeChanged]\n ),\n optionsRef.current\n );\n useLayoutEffect(() => {\n if (!state.isTabbable || !state.tabbableModeFocusAction) {\n return;\n }\n\n const tabbableFocusState = tabbableFocusStateRef.current;\n const didFocus = focusDiagramItemContent({\n contentElement: ref.current,\n focusAction: tabbableFocusState.tabbableModeFocusAction,\n restoreElementId: tabbableFocusState.tabbableModeRestoreElementId,\n restoreCustomElementId: tabbableFocusState.tabbableModeRestoreCustomElementId\n });\n if (!didFocus) {\n handleTabbableFocusFailure();\n }\n }, [handleTabbableFocusFailure, state.isTabbable, state.tabbableModeFocusAction]);\n\n useLayoutEffect(() => {\n if (!dropFeedback?.accepted || !ref.current) {\n setDropFeedbackBounds((current) => (current === undefined ? current : undefined));\n return;\n }\n\n const nextBounds = getSvgDropFeedbackBounds(ref.current);\n setDropFeedbackBounds((current) => (isSameBounds(current, nextBounds) ? current : nextBounds));\n }, [dropFeedback?.accepted, layoutOutput]);\n\n const handleKeyDownCapture = useCallback(\n (event: KeyboardEvent) => {\n if (!state.isTabbable) {\n return;\n }\n\n containFocusWithinDiagramItem({\n event,\n contentElement: ref.current\n });\n },\n [state.isTabbable]\n );\n\n const num_links = id.links.length;\n const accessibleLabel =\n num_links > 1\n ? translations.diagram_promotedLinks({ num_links: num_links.toString() })\n : translations.diagram_promotedLink();\n return (\n <g\n ref={ref}\n key={stringId}\n tabIndex={-1}\n id={state.isFocused || state.isHovered ? activeId : undefined}\n aria-label={getItemAriaLabel(\n translations,\n supportsSelection,\n {\n isSelected: state.isSelected,\n isIndirect: true\n },\n accessibleLabel\n )}\n data-oj-private-promoted-link={stringId}\n data-oj-private-drop-feedback={dropFeedback?.accepted === false ? 'reject' : undefined}\n role=\"img\"\n onKeyDownCapture={handleKeyDownCapture}\n class={classNames([\n linkStyles,\n isDimmed && dimmedItemStyle,\n dropFeedback?.accepted === false && VisDndStyles.dndRejectedStyle\n ])}>\n <TabbableModeContext.Provider value={{ isTabbable: !!state.isTabbable }}>\n {linkRenderer(context)}\n </TabbableModeContext.Provider>\n {dropFeedback?.accepted && dropFeedbackBounds ? (\n <rect\n x={dropFeedbackBounds.x}\n y={dropFeedbackBounds.y}\n width={dropFeedbackBounds.width}\n height={dropFeedbackBounds.height}\n class={classNames([svgDropFeedbackStyle, VisDndStyles.dndDragOverSvgStyle])}\n data-oj-private-drop-feedback=\"accept\"\n />\n ) : undefined}\n </g>\n );\n};\n","import { ComponentChildren } from 'preact';\nimport type {\n States,\n InternalLinkState,\n LinkRendererContext,\n DiagramLinkData,\n DiagramLayoutOutput,\n Bounds,\n PromotedLinkId\n} from './diagram.types';\nimport { layerStyles, linkLayerStyle } from './themes/DiagramStyles.css';\nimport { getZoomToFitZoom } from './utils/zoomUtils';\nimport { DiagramPromotedLinkElement } from './DiagramPromotedLinkElement';\nimport { includesPromotedLinkId, isSamePromotedLinkId } from './utils/diagramUtils';\n\ntype Props<K2, K1, D2, L> = {\n links: PromotedLinkId<K1, D2>[];\n states: States<K1, K2, D2>;\n linkRenderer: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n width: number;\n height: number;\n supportsSelection: boolean;\n layoutOutput: L;\n combinedNodeBounds: Bounds;\n onLinkSizeChanged: (width: number, height: number, id: string) => void;\n minX: number;\n minY: number;\n};\n\nexport function DiagramPromotedLinkLayer<\n K2 extends string | number,\n K1 extends string | number,\n D2 extends DiagramLinkData<K2, K1> = DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2> = DiagramLayoutOutput<K1, K2>\n>({\n links,\n states,\n linkRenderer,\n width,\n height,\n supportsSelection,\n onLinkSizeChanged,\n layoutOutput,\n combinedNodeBounds,\n minX,\n minY\n}: Props<K2, K1, D2, L>) {\n const zoom = getZoomToFitZoom(width, height, combinedNodeBounds);\n return (\n <div class={linkLayerStyle} style={{ top: -minY, left: -minX }}>\n <svg width={width / zoom} height={height / zoom} class={layerStyles} overflow=\"visible\">\n {links.map((link) => {\n const isTabbableOwner =\n states.isTabbableMode && isSamePromotedLinkId<K1, D2>(states.tabbableModeItemId, link);\n const dropFeedback =\n states.dropFeedback?.type === 'promotedLink' &&\n isSamePromotedLinkId<K1, D2>(states.dropFeedback.id, link)\n ? states.dropFeedback\n : undefined;\n const state: InternalLinkState = {\n isSelected: includesPromotedLinkId(states.selectedPromotedLinkIds, link),\n isFocused: isSamePromotedLinkId<K1, D2>(states.focusedId, link),\n isHovered: isSamePromotedLinkId<K1, D2>(states.hoveredId, link),\n zoom: states.zoom,\n isTabbable: isTabbableOwner,\n tabbableModeFocusAction: isTabbableOwner ? states.tabbableModeFocusAction : undefined,\n tabbableModeRestoreElementId: isTabbableOwner\n ? states.tabbableModeRestoreElementId\n : undefined,\n tabbableModeRestoreCustomElementId: isTabbableOwner\n ? states.tabbableModeRestoreCustomElementId\n : undefined,\n onTabbableModeFocusFailure: isTabbableOwner\n ? states.onTabbableModeFocusFailure\n : undefined\n };\n return (\n <DiagramPromotedLinkElement\n id={link}\n state={state}\n isDimmed={\n (states.highlightedNodeIds.length !== 0 ||\n states.highlightedLinkIds.length !== 0 ||\n states.highlightedPromotedLinkIds.length !== 0) &&\n !includesPromotedLinkId(states.highlightedPromotedLinkIds, link)\n }\n activeId={states.activeId}\n linkRenderer={linkRenderer}\n supportsSelection={supportsSelection}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onLinkSizeChanged}\n dropFeedback={dropFeedback}\n />\n );\n })}\n </svg>\n </div>\n );\n}\n","import { ComponentChildren, RefObject } from 'preact';\nimport type {\n States,\n InternalNodeState,\n NodeRendererContext,\n Bounds,\n DiagramNodeData,\n DiagramLabelPosition,\n Dimensions,\n DiagramLinkData,\n LinkRendererContext,\n DiagramLayoutOutput,\n PromotedLinkId\n} from './diagram.types';\nimport { DiagramNodeElement } from './DiagramNodeElement';\nimport { layerStyles } from './themes/DiagramStyles.css';\nimport {\n containerLinksReady,\n getBounds,\n getLinksForNode,\n isContainerReady,\n isLeafNode,\n serializeDiagramKey\n} from './utils/diagramUtils';\nimport { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { DiagramLinkLayer } from './DiagramLinkLayer';\nimport { DiagramPromotedLinkLayer } from './DiagramPromotedLinkLayer';\nimport { containsKey } from '#utils/UNSAFE_keys';\n\ntype Props<K1, K2, D1, D2, L> = {\n nodes: D1[];\n states: States<K1, K2, D2>;\n nodeRenderer: (context: NodeRendererContext<D1>) => ComponentChildren;\n linkRenderer?: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n onNodeSizeChanged: (width: number, height: number, id: K1) => void;\n onLinkSizeChanged: (width: number, height: number, id: K2) => void;\n onPromotedLinkSizeChanged: (width: number, height: number, id: string) => void;\n nodeBounds: Map<K1, Bounds>;\n supportsSelection: boolean;\n minX?: number;\n minY?: number;\n nodeLabelPositions: Map<K1, DiagramLabelPosition>;\n linkLabelPositions: Map<K2, DiagramLabelPosition>;\n labelDimensions: Map<K1 | K2, TextDimensions>;\n links: D2[];\n promotedLinks: PromotedLinkId<K1, D2>[];\n parentId?: K1;\n nodeIdToParentMap: Map<K1, K1>;\n layoutOutput?: L;\n // width height are for svg for links\n width: number;\n height: number;\n zoom: number;\n linkDimensions: Map<K2, Dimensions>;\n promotedLinkDimensions: Map<string, Dimensions>;\n rootRef?: RefObject<HTMLDivElement>;\n combinedNodeBounds: Bounds;\n nodeBoundsRef: RefObject<Map<K1, Bounds>>;\n normalizeLinks?: boolean;\n};\n\nexport function DiagramNodeLayer<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n nodes,\n states,\n nodeRenderer,\n linkRenderer,\n nodeBounds,\n width,\n height,\n onNodeSizeChanged,\n onLinkSizeChanged,\n onPromotedLinkSizeChanged,\n supportsSelection,\n nodeLabelPositions,\n linkLabelPositions,\n labelDimensions,\n minX = 0,\n minY = 0,\n parentId,\n links,\n promotedLinks,\n layoutOutput,\n zoom,\n nodeIdToParentMap,\n linkDimensions,\n promotedLinkDimensions,\n rootRef,\n combinedNodeBounds,\n nodeBoundsRef,\n normalizeLinks = false\n}: Props<K1, K2, D1, D2, L>) {\n const { frontLinks, frontPromotedLinks, backLinks, backPromotedLinks } = getLinksForNode<\n K1,\n K2,\n D2\n >(parentId, links, promotedLinks, nodeIdToParentMap);\n return (\n <div class={layerStyles} data-oj-private-node-container>\n {layoutOutput &&\n linkRenderer &&\n backLinks.length > 0 &&\n containerLinksReady<K1, K2, D2, L>(backLinks, layoutOutput) && (\n <DiagramLinkLayer\n links={backLinks}\n states={states}\n linkRenderer={linkRenderer}\n width={width / zoom}\n height={height}\n supportsSelection={supportsSelection}\n labelDimensions={labelDimensions}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onLinkSizeChanged}\n linkLabelPositions={linkLabelPositions}\n combinedNodeBounds={combinedNodeBounds}\n minY={normalizeLinks ? minY : 0}\n minX={normalizeLinks ? minX : 0}\n />\n )}\n {layoutOutput &&\n linkRenderer &&\n backPromotedLinks.length > 0 &&\n containerLinksReady<K1, K2, D2, L>(backPromotedLinks, layoutOutput) && (\n <DiagramPromotedLinkLayer\n links={backPromotedLinks as PromotedLinkId<K1, D2>[]}\n states={states}\n linkRenderer={linkRenderer}\n width={width / zoom}\n height={height}\n supportsSelection={supportsSelection}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onPromotedLinkSizeChanged}\n combinedNodeBounds={combinedNodeBounds}\n minY={normalizeLinks ? minY : 0}\n minX={normalizeLinks ? minX : 0}\n />\n )}\n\n {nodes.map((node) => {\n const isTabbableOwner = states.isTabbableMode && states.tabbableModeItemId === node.id;\n const dropFeedback =\n states.dropFeedback?.type === 'node' && states.dropFeedback.id === node.id\n ? states.dropFeedback\n : undefined;\n // this is for initial render before the layout function so render all nodes at 0,0\n const position =\n nodeBounds && nodeBounds.get(node.id)\n ? { x: nodeBounds.get(node.id)!.x - minX, y: nodeBounds.get(node.id)!.y - minY }\n : undefined;\n const state: InternalNodeState = {\n isSelected: states.selectedNodeIds.includes(node.id),\n isFocused: states.focusedId === node.id,\n isHovered: states.hoveredId === node.id,\n zoom: states.zoom,\n isExpanded: states.expanded && containsKey(states.expanded, node.id),\n // The tabbable-mode owner can temporarily differ from visual focus during rerender.\n isTabbable: isTabbableOwner,\n tabbableModeFocusAction: isTabbableOwner ? states.tabbableModeFocusAction : undefined,\n tabbableModeRestoreElementId: isTabbableOwner\n ? states.tabbableModeRestoreElementId\n : undefined,\n tabbableModeRestoreCustomElementId: isTabbableOwner\n ? states.tabbableModeRestoreCustomElementId\n : undefined,\n onTabbableModeFocusFailure: isTabbableOwner\n ? states.onTabbableModeFocusFailure\n : undefined\n };\n const { backLinks, backPromotedLinks } = getLinksForNode<K1, K2, D2>(\n node.id,\n links,\n promotedLinks,\n nodeIdToParentMap\n );\n\n // Leaf node or node is collapsed\n if (isLeafNode(node) || !containsKey(states.expanded, node.id)) {\n return (\n <DiagramNodeElement\n id={node.id}\n position={position}\n state={state}\n isDimmed={\n (states.highlightedNodeIds.length !== 0 ||\n states.highlightedLinkIds.length !== 0 ||\n states.highlightedPromotedLinkIds.length !== 0) &&\n !states.highlightedNodeIds.includes(node.id)\n }\n activeId={states.activeId}\n nodeRenderer={nodeRenderer}\n onNodeSizeChanged={onNodeSizeChanged}\n accessibleLabel={node.accessibleLabel}\n data={node}\n supportsSelection={supportsSelection}\n labelDimensions={labelDimensions}\n labelPosition={nodeLabelPositions?.get(node.id)}\n dropFeedback={dropFeedback}\n />\n );\n // Expanded container where children are ready\n } else if (\n nodeBounds &&\n isContainerReady<K1, K2, D1, D2>(\n node,\n nodeBounds,\n backLinks,\n backPromotedLinks,\n linkDimensions,\n promotedLinkDimensions\n )\n ) {\n const childContent = getContent<K1, K2, D1, D2, L>(\n node,\n states,\n nodeRenderer,\n onNodeSizeChanged,\n onLinkSizeChanged,\n onPromotedLinkSizeChanged,\n supportsSelection,\n links,\n promotedLinks,\n nodeIdToParentMap,\n width,\n height,\n zoom,\n node.id,\n nodeBounds,\n linkDimensions,\n promotedLinkDimensions,\n combinedNodeBounds,\n nodeBoundsRef,\n nodeLabelPositions,\n linkLabelPositions,\n labelDimensions,\n linkRenderer,\n layoutOutput,\n rootRef\n );\n return (\n <DiagramNodeElement\n id={node.id}\n position={position}\n state={state}\n isDimmed={\n (states.highlightedNodeIds.length !== 0 ||\n states.highlightedLinkIds.length !== 0 ||\n states.highlightedPromotedLinkIds.length !== 0) &&\n !states.highlightedNodeIds.includes(node.id)\n }\n activeId={states.activeId}\n nodeRenderer={nodeRenderer}\n onNodeSizeChanged={onNodeSizeChanged}\n accessibleLabel={node.accessibleLabel}\n data={node}\n supportsSelection={supportsSelection}\n content={childContent}\n labelDimensions={labelDimensions}\n labelPosition={nodeLabelPositions?.get(node.id)}\n dropFeedback={dropFeedback}\n />\n );\n } else {\n const childContent = getContent<K1, K2, D1, D2, L>(\n node,\n states,\n nodeRenderer,\n onNodeSizeChanged,\n onLinkSizeChanged,\n onPromotedLinkSizeChanged,\n supportsSelection,\n links,\n promotedLinks,\n nodeIdToParentMap,\n width,\n height,\n zoom,\n node.id,\n nodeBounds,\n linkDimensions,\n promotedLinkDimensions,\n combinedNodeBounds,\n nodeBoundsRef,\n nodeLabelPositions,\n linkLabelPositions,\n labelDimensions,\n linkRenderer,\n layoutOutput,\n rootRef\n );\n return <div>{childContent.content}</div>;\n }\n })}\n {layoutOutput &&\n linkRenderer &&\n frontLinks.length > 0 &&\n containerLinksReady<K1, K2, D2, L>(frontLinks, layoutOutput) && (\n <DiagramLinkLayer\n links={frontLinks}\n states={states}\n linkRenderer={linkRenderer}\n width={width / zoom}\n height={height}\n supportsSelection={supportsSelection}\n labelDimensions={labelDimensions}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onLinkSizeChanged}\n linkLabelPositions={linkLabelPositions}\n combinedNodeBounds={combinedNodeBounds}\n minY={normalizeLinks ? minY : 0}\n minX={normalizeLinks ? minX : 0}\n />\n )}\n {layoutOutput &&\n linkRenderer &&\n frontPromotedLinks.length > 0 &&\n containerLinksReady<K1, K2, D2, L>(frontPromotedLinks, layoutOutput) && (\n <DiagramPromotedLinkLayer\n links={frontPromotedLinks as PromotedLinkId<K1, D2>[]}\n states={states}\n linkRenderer={linkRenderer}\n width={width / zoom}\n height={height}\n supportsSelection={supportsSelection}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onPromotedLinkSizeChanged}\n combinedNodeBounds={combinedNodeBounds}\n minY={normalizeLinks ? minY : 0}\n minX={normalizeLinks ? minX : 0}\n />\n )}\n </div>\n );\n}\n\nfunction getContent<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>(\n nodeData: D1,\n states: States<K1, K2, D2>,\n nodeRenderer: (context: NodeRendererContext<D1>) => ComponentChildren,\n onNodeSizeChanged: (width: number, height: number, id: K1) => void,\n onLinkSizeChanged: (width: number, height: number, id: K2) => void,\n onPromotedLinkSizeChanged: (width: number, height: number, id: string) => void,\n supportsSelection: boolean,\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeIdToParentMap: Map<K1, K1>,\n width: number,\n height: number,\n zoom: number,\n parentId: K1,\n nodeBounds: Map<K1, Bounds>,\n linkDimensions: Map<K2, Dimensions>,\n promotedLinkDimensions: Map<string, Dimensions>,\n combinedNodeBounds: Bounds,\n nodeBoundsRef: RefObject<Map<K1, Bounds>>,\n nodeLabelPositions: Map<K1, DiagramLabelPosition>,\n linkLabelPositions: Map<K2, DiagramLabelPosition>,\n labelDimensions: Map<K1 | K2, TextDimensions>,\n linkRenderer?: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren,\n layoutOutput?: L,\n rootRef?: RefObject<HTMLDivElement>\n) {\n const nodes = nodeData.nodes!;\n const { backLinks, backPromotedLinks } = getLinksForNode<K1, K2, D2>(\n parentId,\n links,\n promotedLinks,\n nodeIdToParentMap\n );\n const { minX, minY, contentWidth, contentHeight, bounds } = getBounds(\n nodes,\n backLinks,\n backPromotedLinks,\n nodeBounds,\n linkDimensions,\n promotedLinkDimensions,\n zoom,\n rootRef\n );\n const nodeFullBounds = nodeBoundsRef.current;\n nodeFullBounds?.set(nodeData.id, bounds);\n nodeBoundsRef.current = nodeFullBounds;\n\n const content = (\n <div\n data-oj-private-child={serializeDiagramKey(parentId as string | number)}\n style={{ position: 'relative' }}>\n <DiagramNodeLayer\n nodes={nodes}\n nodeBounds={nodeBounds}\n states={states}\n minX={nodeBounds ? minX : undefined}\n minY={nodeBounds ? minY : undefined}\n nodeRenderer={nodeRenderer}\n onNodeSizeChanged={onNodeSizeChanged}\n onLinkSizeChanged={onLinkSizeChanged}\n onPromotedLinkSizeChanged={onPromotedLinkSizeChanged}\n supportsSelection={supportsSelection}\n nodeLabelPositions={nodeLabelPositions}\n linkLabelPositions={linkLabelPositions}\n labelDimensions={labelDimensions}\n links={links}\n promotedLinks={promotedLinks}\n nodeIdToParentMap={nodeIdToParentMap}\n linkRenderer={linkRenderer}\n layoutOutput={layoutOutput}\n width={width}\n height={height}\n zoom={zoom}\n parentId={parentId}\n linkDimensions={linkDimensions}\n promotedLinkDimensions={promotedLinkDimensions}\n rootRef={rootRef}\n combinedNodeBounds={combinedNodeBounds}\n nodeBoundsRef={nodeBoundsRef}\n />\n </div>\n );\n return {\n content,\n width: contentWidth ? contentWidth : 0,\n height: contentHeight ? contentHeight - minY! : 0,\n bounds\n };\n}\n","import type {\n NodeRendererContext,\n LinkRendererContext,\n States,\n Bounds,\n DiagramLabelPosition,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput,\n Dimensions,\n PromotedLinkId\n} from './diagram.types';\nimport { DiagramNodeLayer } from './DiagramNodeLayer';\nimport { ComponentChildren, RefObject } from 'preact';\nimport type { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { getBounds, getLinksForNode } from './utils/diagramUtils';\nimport { useTabbableMode } from '#hooks/UNSAFE_useTabbableMode';\n\n/**\n * Props for Diagram layers component\n */\ntype DiagramLayersProps<K1, K2, D1, D2, L> = {\n nodes: D1[];\n links: D2[];\n nodeRenderer: (context: NodeRendererContext<D1>) => ComponentChildren;\n linkRenderer?: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n states: States<K1, K2, D2>;\n nodeBounds: Map<K1, Bounds>;\n // width height are for svg for links\n width: number;\n height: number;\n onNodeSizeChanged: (width: number, height: number, id: K1) => void;\n onLinkSizeChanged: (width: number, height: number, id: K2) => void;\n onPromotedLinkSizeChanged: (width: number, height: number, id: string) => void;\n nodeLabelPositions: Map<K1, DiagramLabelPosition>;\n linkLabelPositions: Map<K2, DiagramLabelPosition>;\n labelDimensions: Map<K1 | K2, TextDimensions>;\n supportsSelection: boolean;\n layoutOutput?: L;\n combinedNodeBounds: Bounds;\n zoom: number;\n nodeIdToParentMap: Map<K1, K1>;\n linkDimensions: Map<K2, Dimensions>;\n promotedLinkDimensions: Map<string, Dimensions>;\n rootRef?: RefObject<HTMLDivElement>;\n nodeBoundsRef: RefObject<Map<K1, Bounds>>;\n promotedLinks: PromotedLinkId<K1, D2>[];\n normalizeLinks: boolean;\n};\n\nexport function DiagramLayers<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n nodes,\n links,\n promotedLinks,\n nodeRenderer,\n linkRenderer,\n states,\n nodeBounds,\n width,\n height,\n onNodeSizeChanged,\n onLinkSizeChanged,\n onPromotedLinkSizeChanged,\n labelDimensions,\n nodeLabelPositions,\n linkLabelPositions,\n supportsSelection,\n layoutOutput,\n zoom,\n nodeIdToParentMap,\n linkDimensions,\n promotedLinkDimensions,\n rootRef,\n combinedNodeBounds,\n nodeBoundsRef,\n normalizeLinks\n}: DiagramLayersProps<K1, K2, D1, D2, L>) {\n const { isTabbable } = useTabbableMode();\n\n // Update states with tabbable mode information\n const updatedStates = {\n ...states,\n isTabbableMode: isTabbable\n };\n\n const { backLinks, backPromotedLinks } = getLinksForNode<K1, K2, D2>(\n undefined,\n links,\n promotedLinks,\n nodeIdToParentMap\n );\n const { minX, minY } = getBounds(\n nodes,\n backLinks,\n backPromotedLinks,\n nodeBounds,\n linkDimensions,\n promotedLinkDimensions,\n zoom,\n rootRef\n );\n return (\n <>\n <DiagramNodeLayer\n nodes={nodes}\n nodeBounds={nodeBounds}\n states={updatedStates}\n nodeRenderer={nodeRenderer}\n onNodeSizeChanged={onNodeSizeChanged}\n onLinkSizeChanged={onLinkSizeChanged}\n onPromotedLinkSizeChanged={onPromotedLinkSizeChanged}\n supportsSelection={supportsSelection}\n nodeLabelPositions={nodeLabelPositions}\n linkLabelPositions={linkLabelPositions}\n labelDimensions={labelDimensions}\n linkDimensions={linkDimensions}\n promotedLinkDimensions={promotedLinkDimensions}\n rootRef={rootRef}\n links={links}\n promotedLinks={promotedLinks}\n nodeIdToParentMap={nodeIdToParentMap}\n linkRenderer={linkRenderer}\n layoutOutput={layoutOutput}\n width={width}\n height={height}\n zoom={zoom}\n minX={nodeBounds && minX !== Infinity ? minX : undefined}\n minY={nodeBounds && minY !== Infinity ? minY : undefined}\n combinedNodeBounds={combinedNodeBounds}\n nodeBoundsRef={nodeBoundsRef}\n normalizeLinks={normalizeLinks}\n />\n </>\n );\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { Bounds, PanState, Pan } from '../diagram.types';\nexport type PanBounds = {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n};\n\n/**\n * The pan values that describes where the diagram content\n * is panned\n */\nexport type PanningState = {\n panX: number;\n panY: number;\n};\n\nconst PAN_EPSILON = 0.000001;\n\nconst constrainValueToBounds = (value: number, min: number, max: number) => {\n if (value > max + PAN_EPSILON) {\n return max;\n }\n if (value < min - PAN_EPSILON) {\n return min;\n }\n return value;\n};\n\nexport const constrainPanToBounds = (nextPan: PanningState, panBounds: PanBounds) => {\n const minX = Math.min(panBounds.minX, panBounds.maxX);\n const maxX = Math.max(panBounds.minX, panBounds.maxX);\n const minY = Math.min(panBounds.minY, panBounds.maxY);\n const maxY = Math.max(panBounds.minY, panBounds.maxY);\n return {\n panX: constrainValueToBounds(nextPan.panX, minX, maxX),\n panY: constrainValueToBounds(nextPan.panY, minY, maxY)\n };\n};\n\nconst constrainPan = (\n previousPan: PanningState,\n nextPan: PanningState,\n panBounds: PanBounds,\n panDirection: 'x' | 'y' | 'any'\n) => {\n const panX = panDirection !== 'y' ? nextPan.panX : previousPan.panX;\n const panY = panDirection !== 'x' ? nextPan.panY : previousPan.panY;\n return constrainPanToBounds({ panX, panY }, panBounds);\n};\n\nexport const pan = (\n previousPan: PanningState,\n nextPan: PanningState,\n panDirection: 'x' | 'y' | 'any',\n zoom: number,\n width: number,\n height: number,\n panBounds?: PanBounds,\n onPanChange?: (detail: PanState) => void\n) => {\n if (!panBounds) {\n //On initial render before nodes are rendered\n return { newPan: { panX: 0, panY: 0 } };\n }\n const newPan = constrainPan(previousPan, nextPan, panBounds, panDirection);\n const isPanChanged = newPan.panX !== previousPan.panX || newPan.panY !== previousPan.panY;\n const center = panXYToCenterXY(newPan.panX, newPan.panY, zoom, width, height);\n isPanChanged &&\n onPanChange &&\n onPanChange({\n centerX: center.centerX,\n centerY: center.centerY\n });\n return { newPan };\n};\n\nexport const getPanBounds = (\n dWidth: number,\n dHeight: number,\n elemBounds: Bounds,\n zoom: number,\n minZoom: number,\n initPanZoomState: {\n zoom: number;\n centerX?: number;\n centerY?: number;\n },\n panType?: string\n): PanBounds => {\n const { x, y, width, height } = elemBounds;\n let minX, maxX, minY, maxY;\n if (panType === 'centerContent') {\n minX = dWidth / 2 - (width + x) * zoom;\n minY = dHeight / 2 - (height + y) * zoom;\n maxX = dWidth / 2 - x * zoom;\n maxY = dHeight / 2 - y * zoom;\n } else {\n // panType equals fixed\n const zoomRatio = zoom / minZoom;\n // Find left corner of the content at min zoom and content is centered\n const minZoomX = (dWidth - width * minZoom) / 2 - x * minZoom;\n const minZoomY = (dHeight - height * minZoom) / 2 - y * minZoom;\n // When we pan all the way to the right, the left corner of displayable area is 0,0 as in min zoom.\n // When we pan all the way to the left, lets find the corner of the displayable area\n const leftCornerX = dWidth - dWidth * zoomRatio;\n const leftCornerY = dHeight - dHeight * zoomRatio;\n // Now we have everything to calculate pan zoom constraints\n minX = leftCornerX + minZoomX * zoomRatio;\n minY = leftCornerY + minZoomY * zoomRatio;\n maxX = minZoomX * zoomRatio;\n maxY = minZoomY * zoomRatio;\n\n // Keep the minZoom canvas constraint from fixed panning, but do not allow panning so far\n // into the minZoom canvas padding that the diagram content is completely outside the viewport.\n minX = Math.max(minX, dWidth / 2 - (width + x) * zoom);\n minY = Math.max(minY, dHeight / 2 - (height + y) * zoom);\n maxX = Math.min(maxX, dWidth / 2 - x * zoom);\n maxY = Math.min(maxY, dHeight / 2 - y * zoom);\n\n if (minX > maxX) {\n minX = maxX = (minX + maxX) / 2;\n }\n if (minY > maxY) {\n minY = maxY = (minY + maxY) / 2;\n }\n }\n const initZoom = initPanZoomState.zoom;\n const initCenterX = initPanZoomState.centerX;\n const initCenterY = initPanZoomState.centerY;\n // If an initial panZoomState is set, should expand pan bounds to include it.\n // Fixed panning is the exception: its bounds are defined by the minZoom canvas,\n // so zooming back to minZoom should re-center instead of preserving an out-of-bounds\n // high-zoom pan position.\n if (panType === 'fixed') {\n return {\n minX: minX,\n maxX: maxX,\n minY: minY,\n maxY: maxY\n };\n }\n let dx, dy;\n if (initCenterX) {\n const boundsX = initCenterX * initZoom - dWidth / 2;\n if (-boundsX * initZoom < minX) {\n dx = minX - boundsX * initZoom;\n minX -= dx;\n maxX += dx;\n } else if (-boundsX * initZoom > maxX) {\n dx = -boundsX * initZoom - maxX;\n minX -= dx;\n maxX += dx;\n }\n }\n if (initCenterY) {\n const boundsY = initCenterY * initZoom - dHeight / 2;\n if (-boundsY * initZoom < minY) {\n dy = minY - boundsY * initZoom;\n minY -= dy;\n maxY += dy;\n } else if (-boundsY * initZoom > maxY) {\n dy = -boundsY * initZoom - maxY;\n minY -= dy;\n maxY += dy;\n }\n }\n return {\n minX: minX,\n maxX: maxX,\n minY: minY,\n maxY: maxY\n };\n};\n\n/**\n * Returns the pan properties for the diagram.\n */\nexport function getPanProps(\n props: Pan,\n contentBounds: Bounds,\n userDragMode: string | undefined,\n isDeviceTouch: boolean\n) {\n const contentX = contentBounds.width !== Infinity ? contentBounds.x : 0;\n const contentY = contentBounds.height !== Infinity ? contentBounds.y : 0;\n // DiagramNodeLayer renders nodes relative to the content origin, so pan math uses the\n // same content-relative coordinate space and converts back to layout coordinates for onPan.\n return {\n panning: isDeviceTouch\n ? userDragMode === 'pan' && props.panning\n ? props.panning\n : 'off'\n : props.panning\n ? props.panning\n : 'off',\n panDirection: props.panDirection ? props.panDirection : 'any',\n centerX: props.centerX !== undefined ? props.centerX - contentX : contentBounds.width / 2,\n centerY: props.centerY !== undefined ? props.centerY - contentY : contentBounds.height / 2,\n onPan: props.onPan\n ? ({ centerX, centerY }: PanState) => {\n props.onPan?.({\n centerX: centerX + contentX,\n centerY: centerY + contentY\n });\n }\n : undefined\n };\n}\n\n/**\n * Converts centerX,Y coordinates to panX,Y coordinates\n */\nexport function centerXYToPanXY(\n centerX: number,\n centerY: number,\n zoom: number,\n width: number,\n height: number\n) {\n return {\n panX: width / 2 - centerX * zoom,\n panY: height / 2 - centerY * zoom\n };\n}\n/**\n * Converts panX,Y coordinates to centerX,Y coordinates\n */\nexport function panXYToCenterXY(\n panX: number,\n panY: number,\n zoom: number,\n width: number,\n height: number\n) {\n return {\n centerX: (width / 2 - panX) / zoom,\n centerY: (height / 2 - panY) / zoom\n };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n Bounds,\n DiagramLayoutOutput,\n DiagramNodeData,\n DiagramOverviewConfig,\n Pan,\n PanState\n} from './diagram.types';\nimport { OverviewSlidingWindow } from '#PRIVATE_VisOverview';\nimport type { PanBounds } from './utils/panUtils';\nimport { panXYToCenterXY } from './utils/panUtils';\nimport { overviewStyles } from './themes/DiagramStyles.css';\nimport { containsKey, Keys } from '#utils/UNSAFE_keys';\n\nconst OVERVIEW_GAP = 12;\nconst OVERVIEW_MIN_WIDTH = 120;\nconst OVERVIEW_MAX_WIDTH = 220;\nconst OVERVIEW_MIN_HEIGHT = 90;\nconst OVERVIEW_MAX_HEIGHT = 160;\n\ntype OverviewNodeBounds<K1> = {\n id: K1;\n bounds: Bounds;\n isExpandedContainer: boolean;\n};\n\ntype DiagramOverviewProps<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n L extends DiagramLayoutOutput<K1, K2>\n> = {\n nodes: D1[];\n nodeBounds: Map<K1, Bounds>;\n nodeAbsBounds: Map<K1, Bounds>;\n expanded: Keys<K1>;\n contentBounds: Bounds;\n componentWidth: number;\n componentHeight: number;\n layoutCenterX: number;\n layoutCenterY: number;\n zoom: number;\n minZoom: number;\n panBounds?: PanBounds;\n layoutOutput?: L;\n overview: DiagramOverviewConfig<L>;\n isRtl: boolean;\n panning: NonNullable<Pan['panning']>;\n panDirection: NonNullable<Pan['panDirection']>;\n onPan?: (detail: PanState) => void;\n};\n\nconst clamp = (value: number, min: number, max: number) => {\n return Math.min(max, Math.max(min, value));\n};\n\nconst roundPixel = (value: number) => Math.round(value);\nconst roundPixelSize = (value: number) => Math.max(1, Math.round(value));\n\nconst getOverviewSize = (width: number, height: number) => {\n const maxWidth = Math.max(0, width - 2 * OVERVIEW_GAP);\n const maxHeight = Math.max(0, height - 2 * OVERVIEW_GAP);\n return {\n width: clamp(width * 0.25, OVERVIEW_MIN_WIDTH, Math.min(maxWidth, OVERVIEW_MAX_WIDTH)),\n height: clamp(height * 0.25, OVERVIEW_MIN_HEIGHT, Math.min(maxHeight, OVERVIEW_MAX_HEIGHT))\n };\n};\n\nconst getChildBounds = <K1 extends string | number, D1 extends DiagramNodeData<K1, D1>>(\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>\n) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const node of nodes) {\n const bounds = nodeBounds.get(node.id);\n if (bounds) {\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n maxX = Math.max(maxX, bounds.x + bounds.width);\n maxY = Math.max(maxY, bounds.y + bounds.height);\n }\n }\n return minX === Infinity\n ? undefined\n : {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n};\n\nconst getOverviewNodeBounds = <K1 extends string | number, D1 extends DiagramNodeData<K1, D1>>(\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>,\n expanded: Keys<K1>,\n offsetX = 0,\n offsetY = 0\n) => {\n const overviewNodeBounds: OverviewNodeBounds<K1>[] = [];\n for (const node of nodes) {\n const bounds = nodeBounds.get(node.id);\n if (!bounds) {\n continue;\n }\n const childNodes = node.nodes;\n const isExpandedContainer = !!childNodes && containsKey(expanded, node.id);\n const overviewBounds = {\n x: bounds.x + offsetX,\n y: bounds.y + offsetY,\n width: bounds.width,\n height: bounds.height\n };\n overviewNodeBounds.push({ id: node.id, bounds: overviewBounds, isExpandedContainer });\n\n if (isExpandedContainer) {\n const childBounds = getChildBounds(childNodes, nodeBounds);\n if (childBounds) {\n const childOffsetX =\n overviewBounds.x +\n Math.max(0, (overviewBounds.width - childBounds.width) / 2) -\n childBounds.x;\n const childOffsetY =\n overviewBounds.y +\n Math.max(0, (overviewBounds.height - childBounds.height) / 2) -\n childBounds.y;\n overviewNodeBounds.push(\n ...getOverviewNodeBounds(childNodes, nodeBounds, expanded, childOffsetX, childOffsetY)\n );\n }\n }\n }\n return overviewNodeBounds;\n};\n\nconst getMeasuredOverviewNodeBounds = <\n K1 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>,\n expanded: Keys<K1>\n) => {\n const overviewNodeBounds: OverviewNodeBounds<K1>[] = [];\n for (const node of nodes) {\n const bounds = nodeBounds.get(node.id);\n const childNodes = node.nodes;\n const isExpandedContainer = !!childNodes && containsKey(expanded, node.id);\n if (bounds) {\n overviewNodeBounds.push({ id: node.id, bounds, isExpandedContainer });\n }\n\n if (isExpandedContainer) {\n overviewNodeBounds.push(...getMeasuredOverviewNodeBounds(childNodes, nodeBounds, expanded));\n }\n }\n return overviewNodeBounds;\n};\n\nconst mergeOverviewNodeBounds = <K1 extends string | number>(\n layoutOverviewNodeBounds: OverviewNodeBounds<K1>[],\n measuredOverviewNodeBounds: OverviewNodeBounds<K1>[]\n) => {\n const measuredBoundsById = new Map<K1, OverviewNodeBounds<K1>>();\n measuredOverviewNodeBounds.forEach((item) => {\n measuredBoundsById.set(item.id, item);\n });\n\n return layoutOverviewNodeBounds.map((item) => measuredBoundsById.get(item.id) ?? item);\n};\n\nconst getMeasuredLayoutBounds = <K1 extends string | number, D1 extends DiagramNodeData<K1, D1>>(\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>,\n nodeAbsBounds: Map<K1, Bounds>,\n zoom: number\n) => {\n let originX: number | undefined;\n let originY: number | undefined;\n\n for (const node of nodes) {\n const bounds = nodeBounds.get(node.id);\n const absBounds = nodeAbsBounds.get(node.id);\n if (bounds && absBounds) {\n originX = bounds.x - absBounds.x / zoom;\n originY = bounds.y - absBounds.y / zoom;\n break;\n }\n }\n\n if (originX === undefined || originY === undefined) {\n return undefined;\n }\n\n const measuredBounds = new Map<K1, Bounds>();\n nodeAbsBounds.forEach((bounds, id) => {\n measuredBounds.set(id, {\n x: originX! + bounds.x / zoom,\n y: originY! + bounds.y / zoom,\n width: bounds.width,\n height: bounds.height\n });\n });\n return measuredBounds;\n};\n\nexport function DiagramOverview<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n nodes,\n nodeBounds,\n nodeAbsBounds,\n expanded,\n contentBounds,\n componentWidth,\n componentHeight,\n layoutCenterX,\n layoutCenterY,\n zoom,\n minZoom,\n panBounds,\n layoutOutput,\n overview,\n isRtl,\n panning,\n panDirection,\n onPan\n}: DiagramOverviewProps<K1, K2, D1, L>) {\n const isOverviewReady =\n contentBounds.width > 0 &&\n contentBounds.height > 0 &&\n contentBounds.width !== Infinity &&\n contentBounds.height !== Infinity &&\n zoom > 0;\n const overviewSize = getOverviewSize(componentWidth, componentHeight);\n if (!isOverviewReady || overviewSize.width <= 0 || overviewSize.height <= 0) {\n return null;\n }\n const contentWidth = contentBounds.width;\n const contentHeight = contentBounds.height;\n\n const viewportWidth = componentWidth / zoom;\n const viewportHeight = componentHeight / zoom;\n const viewportCenterX = layoutCenterX;\n const viewportCenterY = layoutCenterY;\n const panMinCenter = panBounds\n ? panXYToCenterXY(panBounds.maxX, panBounds.maxY, zoom, componentWidth, componentHeight)\n : undefined;\n const panMaxCenter = panBounds\n ? panXYToCenterXY(panBounds.minX, panBounds.minY, zoom, componentWidth, componentHeight)\n : undefined;\n const viewportMinX = panMinCenter\n ? contentBounds.x + panMinCenter.centerX - viewportWidth / 2\n : contentBounds.x;\n const viewportMinY = panMinCenter\n ? contentBounds.y + panMinCenter.centerY - viewportHeight / 2\n : contentBounds.y;\n const viewportMaxX = panMaxCenter\n ? contentBounds.x + panMaxCenter.centerX - viewportWidth / 2\n : Math.max(contentBounds.x, contentBounds.x + contentWidth - viewportWidth);\n const viewportMaxY = panMaxCenter\n ? contentBounds.y + panMaxCenter.centerY - viewportHeight / 2\n : Math.max(contentBounds.y, contentBounds.y + contentHeight - viewportHeight);\n const useCanvasFitArea = panning === 'fixed' && minZoom > 0;\n const overviewBounds = useCanvasFitArea\n ? {\n x: contentBounds.x + contentWidth / 2 - componentWidth / (2 * minZoom),\n y: contentBounds.y + contentHeight / 2 - componentHeight / (2 * minZoom),\n width: componentWidth / minZoom,\n height: componentHeight / minZoom\n }\n : {\n x: contentBounds.x,\n y: contentBounds.y,\n width: contentWidth,\n height: contentHeight\n };\n\n const scaledOverviewRatio = Math.min(\n overviewSize.width / overviewBounds.width,\n overviewSize.height / overviewBounds.height\n );\n const scaledOverviewWidth = overviewBounds.width * scaledOverviewRatio;\n const scaledOverviewHeight = overviewBounds.height * scaledOverviewRatio;\n const overviewCanvasX = (overviewSize.width - scaledOverviewWidth) / 2;\n const overviewCanvasY = (overviewSize.height - scaledOverviewHeight) / 2;\n const windowWidth = Math.max(0, viewportWidth * scaledOverviewRatio);\n const windowHeight = Math.max(0, viewportHeight * scaledOverviewRatio);\n const minWindowX = overviewCanvasX + (viewportMinX - overviewBounds.x) * scaledOverviewRatio;\n const minWindowY = overviewCanvasY + (viewportMinY - overviewBounds.y) * scaledOverviewRatio;\n const maxWindowX = Math.max(\n minWindowX,\n overviewCanvasX + (viewportMaxX - overviewBounds.x) * scaledOverviewRatio\n );\n const maxWindowY = Math.max(\n minWindowY,\n overviewCanvasY + (viewportMaxY - overviewBounds.y) * scaledOverviewRatio\n );\n const windowX = clamp(\n overviewCanvasX +\n (viewportCenterX - viewportWidth / 2 - overviewBounds.x) * scaledOverviewRatio,\n minWindowX,\n maxWindowX\n );\n const windowY = clamp(\n overviewCanvasY +\n (viewportCenterY - viewportHeight / 2 - overviewBounds.y) * scaledOverviewRatio,\n minWindowY,\n maxWindowY\n );\n\n const hAlign = overview.hAlign ?? 'end';\n const vAlign = overview.vAlign ?? 'bottom';\n const startLeft = isRtl ? componentWidth - overviewSize.width - OVERVIEW_GAP : OVERVIEW_GAP;\n const endLeft = isRtl ? OVERVIEW_GAP : componentWidth - overviewSize.width - OVERVIEW_GAP;\n const left =\n hAlign === 'center'\n ? (componentWidth - overviewSize.width) / 2\n : hAlign === 'start'\n ? startLeft\n : endLeft;\n const top =\n vAlign === 'middle'\n ? (componentHeight - overviewSize.height) / 2\n : vAlign === 'top'\n ? OVERVIEW_GAP\n : componentHeight - overviewSize.height - OVERVIEW_GAP;\n\n const toOverviewX = (x: number) => overviewCanvasX + (x - overviewBounds.x) * scaledOverviewRatio;\n const toOverviewY = (y: number) => overviewCanvasY + (y - overviewBounds.y) * scaledOverviewRatio;\n\n const panToWindow = (nextWindowX: number, nextWindowY: number) => {\n const clampedX = clamp(nextWindowX, minWindowX, maxWindowX);\n const clampedY = clamp(nextWindowY, minWindowY, maxWindowY);\n onPan?.({\n centerX:\n panDirection !== 'y'\n ? overviewBounds.x + (clampedX - overviewCanvasX + windowWidth / 2) / scaledOverviewRatio\n : viewportCenterX,\n centerY:\n panDirection !== 'x'\n ? overviewBounds.y + (clampedY - overviewCanvasY + windowHeight / 2) / scaledOverviewRatio\n : viewportCenterY\n });\n };\n\n const customContent =\n overview.renderer && layoutOutput ? overview.renderer({ layoutOutput }) : undefined;\n const measuredNodeBounds = getMeasuredLayoutBounds(nodes, nodeBounds, nodeAbsBounds, zoom);\n const layoutOverviewNodeBounds = getOverviewNodeBounds(nodes, nodeBounds, expanded);\n const overviewNodeBounds = measuredNodeBounds\n ? mergeOverviewNodeBounds(\n layoutOverviewNodeBounds,\n getMeasuredOverviewNodeBounds(nodes, measuredNodeBounds, expanded)\n )\n : layoutOverviewNodeBounds;\n const stopDiagramPan = (event: PointerEvent) => {\n event.stopPropagation();\n };\n\n return (\n <div\n data-oj-private-object=\"overview\"\n class={overviewStyles.overviewContainerStyle}\n style={{ left, top, width: overviewSize.width, height: overviewSize.height }}>\n <div class={overviewStyles.overviewContentStyle}>\n {customContent ?? (\n <svg width=\"100%\" height=\"100%\">\n <rect\n data-oj-private-object=\"overview-window-background\"\n x={roundPixel(windowX) + 1}\n y={roundPixel(windowY) + 1}\n width={Math.max(0, roundPixel(windowWidth) - 2)}\n height={Math.max(0, roundPixel(windowHeight) - 2)}\n class={overviewStyles.overviewViewportBackgroundStyle}\n />\n {overviewNodeBounds.map(({ id, bounds, isExpandedContainer }) => {\n const x = toOverviewX(bounds.x);\n const y = toOverviewY(bounds.y);\n const width = Math.max(1, bounds.width * scaledOverviewRatio);\n const height = Math.max(1, bounds.height * scaledOverviewRatio);\n const roundedX = roundPixel(x);\n const roundedY = roundPixel(y);\n const roundedWidth = roundPixelSize(width);\n const roundedHeight = roundPixelSize(height);\n if (isExpandedContainer) {\n return (\n <rect\n key={id}\n data-oj-private-overview-node={id}\n x={roundedX}\n y={roundedY}\n width={roundedWidth}\n height={roundedHeight}\n class={overviewStyles.overviewContainerNodeStyle}\n />\n );\n }\n const radius = roundPixelSize(Math.min(width, height) / 2);\n return (\n <circle\n key={id}\n data-oj-private-overview-node={id}\n cx={roundPixel(x + width / 2)}\n cy={roundPixel(y + height / 2)}\n r={radius}\n class={overviewStyles.overviewNodeStyle}\n />\n );\n })}\n </svg>\n )}\n </div>\n <svg\n class={overviewStyles.overviewOverlayStyle}\n width=\"100%\"\n height=\"100%\"\n onPointerDown={stopDiagramPan}\n onPointerMove={stopDiagramPan}\n onPointerUp={stopDiagramPan}\n onPointerCancel={stopDiagramPan}>\n <OverviewSlidingWindow\n x={overviewCanvasX}\n y={overviewCanvasY}\n width={scaledOverviewWidth}\n height={scaledOverviewHeight}\n windowX={windowX}\n windowY={windowY}\n windowWidth={windowWidth}\n windowHeight={windowHeight}\n minWindowX={minWindowX}\n minWindowY={minWindowY}\n maxWindowX={maxWindowX}\n maxWindowY={maxWindowY}\n isInteractive={!!onPan}\n orientation={\n panDirection === 'any' ? 'both' : panDirection === 'x' ? 'horizontal' : 'vertical'\n }\n onWindowDimsChange={({ deltaX, deltaY }) => {\n panToWindow(windowX + deltaX, windowY + deltaY);\n }}\n />\n </svg>\n </div>\n );\n}\n","import { ComponentChildren } from 'preact';\nimport { centerXYToPanXY } from './utils/panUtils';\nimport { panZoomStyles } from './themes/DiagramStyles.css';\n\ntype Props = {\n centerX: number;\n centerY: number;\n zoom: number;\n width: number;\n height: number;\n children: ComponentChildren;\n};\n\nexport function DiagramPanZoomContainer({\n centerX,\n centerY,\n children,\n zoom,\n width,\n height\n}: Props) {\n const panValues = centerXYToPanXY(centerX, centerY, zoom, width, height);\n return (\n <div\n class={panZoomStyles}\n style={{\n transform: `translate(${panValues.panX}px, ${panValues.panY}px) scale(${zoom})`\n }}>\n {children}\n </div>\n );\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type {\n DiagramNodeData,\n DiagramLinkData,\n Bounds,\n ItemInfo,\n PromotedLinkId\n} from '../diagram.types';\nimport { comparePromotedLinks, getPromotedString } from './diagramUtils';\n\n/**\n * Navigation direction\n */\nexport type NavDirection = 'right' | 'left' | 'up' | 'down';\n\ntype linkDetailType<K2> =\n | {\n id: K2;\n angle: number;\n distance: number;\n type: 'link';\n /**\n * Ingoing = 1, outgoing = 0\n */\n direction: 0 | 1;\n }\n | {\n id: string;\n angle: number;\n distance: number;\n type: 'promotedLink';\n /**\n * Ingoing = 1, outgoing = 0\n */\n direction: 0 | 1;\n };\n\n/**\n * Returns the link data based on link info in a diagram.\n * @param itemInfo\n * @returns\n */\nexport function getLinkDetailFromInfo<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n itemInfo: ItemInfo<K1, K2, D2>,\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[]\n): D2 | PromotedLinkId<K1, D2> | undefined {\n let link;\n for (let i = 0; i < links.length; i++) {\n link = links[i];\n if (itemInfo.id === link.id) {\n return link;\n }\n }\n for (let i = 0; i < promotedLinks.length; i++) {\n link = promotedLinks[i];\n if (comparePromotedLinks(itemInfo.id as PromotedLinkId<K1, D2>, link)) {\n return link;\n }\n }\n return undefined;\n}\n\n/**\n * Utility method that adds sorting attributes of each link to an array\n */\nexport function addSortingAttributes<\n K1 extends string | number,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n node: D1,\n listOfLinks: (D2 | PromotedLinkId<K1, D2>)[],\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>\n) {\n let angle, distance, direction;\n const linkDetail: linkDetailType<K2>[] = [];\n for (let i = 0; i < listOfLinks.length; i++) {\n const link = listOfLinks[i];\n angle = _getClockwiseAngle(node, link, nodes, nodeBounds);\n distance = _getNodesDistance(link, nodes, nodeBounds);\n direction = _getLinkDirection(node, link);\n if ('id' in link)\n linkDetail.push({\n id: link.id,\n angle: angle,\n distance: distance,\n direction: direction,\n type: 'link'\n });\n else {\n linkDetail.push({\n id: getPromotedString(link),\n angle: angle,\n distance: distance,\n direction: direction,\n type: 'promotedLink'\n });\n }\n }\n return linkDetail;\n}\n\n/**\n * Returns a function that compares two link around a given node\n * The links are analyzed by angle, distance from the node and direction. The sorting attributes are added to the links before sorting.\n */\nexport function getLinkComparator<K2>() {\n return (link1: linkDetailType<K2>, link2: linkDetailType<K2>) => {\n const { angle: linkAngle1, distance: linkDistance1, direction: linkDirection1 } = link1;\n const { angle: linkAngle2, distance: linkDistance2, direction: linkDirection2 } = link2;\n let res = -1;\n\n if (!_anglesAreEqualWithinTolerance(linkAngle1, linkAngle2) && linkAngle1 > linkAngle2) {\n res = 1;\n } else if (_anglesAreEqualWithinTolerance(linkAngle1, linkAngle2)) {\n //check distance and direction\n if (linkDistance1 > linkDistance2) {\n res = 1;\n } else if (linkDistance2 == linkDistance1 && linkDirection1 > linkDirection2) {\n //outgoing to ingoing\n res = 1;\n } else if (linkDistance2 == linkDistance1 && linkDirection1 == linkDirection2) {\n res = 0;\n }\n }\n return res;\n };\n}\n\n/**\n * Returns navigable links for a given node\n */\nexport function getNavigableLinksForNodeId<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n nodeId: K1,\n listOfLinks: (D2 | PromotedLinkId<K1, D2>)[]\n) {\n const links: (D2 | PromotedLinkId<K1, D2>)[] = [];\n listOfLinks.forEach((link) => {\n const startId = link.startNode;\n const endId = link.endNode;\n\n if (startId == nodeId || endId == nodeId) links.push(link);\n });\n\n return links;\n}\n\n/**\n * Get the clockwise angle for the link given node as a center\n */\nfunction _getClockwiseAngle<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(node: D1, link: D2 | PromotedLinkId<K1, D2>, nodes: D1[], nodeBounds: Map<K1, Bounds>) {\n //find opposite node\n let currNode;\n let startNode = nodes[0];\n let endNode = nodes[0];\n for (let i = 0; i < nodes.length; i++) {\n currNode = nodes[i];\n if (currNode.id === link.startNode) {\n startNode = currNode;\n } else if (currNode.id === link.endNode) {\n endNode = currNode;\n }\n }\n const oppositeNode = node.id == startNode.id ? endNode : startNode;\n\n const p1 = _getNodeCenter(node, nodeBounds);\n const p2 = _getNodeCenter(oppositeNode, nodeBounds);\n let angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n angle = angle < 0 ? angle + Math.PI * 2 : angle;\n return angle;\n}\n\n/**\n * Get the distance between start and end nodes for the given link\n */\nfunction _getNodesDistance<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(link: D2 | PromotedLinkId<K1, D2>, nodes: D1[], nodeBounds: Map<K1, Bounds>) {\n let currNode;\n let startNode = nodes[0];\n let endNode = nodes[0];\n for (let i = 0; i < nodes.length; i++) {\n currNode = nodes[i];\n if (currNode.id === link.startNode) {\n startNode = currNode;\n } else if (currNode.id === link.endNode) {\n endNode = currNode;\n }\n }\n const p1 = _getNodeCenter(startNode, nodeBounds);\n const p2 = _getNodeCenter(endNode, nodeBounds);\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n}\n\n/**\n * Get link direction for the given node. 1 if the node is the end node\n * and 0 if it is the start node\n */\nfunction _getLinkDirection<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(node: D1, link: D2 | PromotedLinkId<K1, D2>): 0 | 1 {\n if (link.endNode === node.id) {\n return 1;\n }\n return 0;\n}\n\n/**\n * Get node center\n */\nfunction _getNodeCenter<K1, D1 extends DiagramNodeData<K1, D1>>(\n node: D1,\n nodeBounds: Map<K1, Bounds>\n) {\n const nodeBB = nodeBounds.get(node.id)!;\n return { x: nodeBB.x + nodeBB.width / 2, y: nodeBB.y + nodeBB.height / 2 };\n}\n\n/**\n * Calculates the angle weighted by distance\n */\nexport function calcDistanceAngleWeighted(\n objectBB: Bounds,\n currentBB: Bounds,\n direction: NavDirection\n) {\n // Variables used for calculating penalties when calculating distances between two navigables.\n const optimalAngle1 = (15 / 180) * Math.PI;\n const optimalAngle2 = (40 / 180) * Math.PI;\n const suboptimalAnglePenalty1 = 2; // multiplier to the distance\n const suboptimalAnglePenalty2 = 6; // multiplier to the distance\n\n const objCenterX = objectBB.x + objectBB.width / 2;\n const objCenterY = objectBB.y + objectBB.height / 2;\n\n const curCenterX = currentBB.x + currentBB.width / 2;\n const curCenterY = currentBB.y + currentBB.height / 2;\n\n const x_dist = Math.abs(objCenterX - curCenterX);\n const y_dist = Math.abs(objCenterY - curCenterY);\n\n const angle = Math.atan2(y_dist, x_dist);\n\n let distance = Math.sqrt(x_dist * x_dist + y_dist * y_dist);\n\n // Angle penalty based on direction\n if (\n (angle > optimalAngle1 && (direction == 'right' || direction == 'left')) ||\n (angle < Math.PI / 2 - optimalAngle1 && (direction == 'up' || direction == 'down'))\n ) {\n if (\n (angle > optimalAngle2 && (direction == 'right' || direction == 'left')) ||\n (angle < Math.PI / 2 - optimalAngle2 && (direction == 'up' || direction == 'down'))\n ) {\n distance *= suboptimalAnglePenalty2;\n } else {\n distance *= suboptimalAnglePenalty1;\n }\n }\n\n return distance;\n}\n\n/**\n * Given a direction, is a certain node is a valid destination to navigate to\n */\nexport function isValidDestination(\n objBB: Bounds,\n curBB: Bounds,\n direction: NavDirection,\n compareCenters: boolean\n) {\n // compare the centers of the navigable and to be valid, the navigable must be in the right direction\n // without tolerance\n if (compareCenters) {\n const objCenterX = objBB.x + 0.5 * objBB.width;\n const curCenterX = curBB.x + 0.5 * curBB.width;\n const objCenterY = objBB.y + 0.5 * objBB.height;\n const curCenterY = curBB.y + 0.5 * curBB.height;\n\n switch (direction) {\n case 'up':\n return objCenterY < curCenterY;\n case 'down':\n return objBB.y > curCenterY;\n case 'right':\n return objCenterX > curCenterX;\n case 'left':\n return objCenterX < curCenterX;\n default:\n break;\n }\n return true;\n }\n\n switch (direction) {\n case 'up':\n return objBB.y < curBB.y || _areEqualWithinTolerance(objBB.y, curBB.y);\n case 'down':\n return objBB.y > curBB.y || _areEqualWithinTolerance(objBB.y, curBB.y);\n case 'right':\n return objBB.x > curBB.x || _areEqualWithinTolerance(objBB.x, curBB.x);\n case 'left':\n return objBB.x < curBB.x || _areEqualWithinTolerance(objBB.x, curBB.x);\n default:\n break;\n }\n return true;\n}\n\n/**\n * Returns true if two nodes are in contact\n */\nexport function calcInContact(objRect: Bounds, curRect: Bounds, direction: NavDirection) {\n switch (direction) {\n case 'up':\n return (\n _isVerticallyAligned(objRect, curRect) &&\n (curRect.y <= objRect.y + objRect.height ||\n _areEqualWithinTolerance(curRect.y, objRect.y + objRect.height))\n );\n case 'down':\n return (\n _isVerticallyAligned(objRect, curRect) &&\n (objRect.y <= curRect.y + curRect.height ||\n _areEqualWithinTolerance(objRect.y, curRect.y + curRect.height))\n );\n case 'right':\n return (\n _isHorizontallyAligned(objRect, curRect) &&\n (objRect.x <= curRect.x + curRect.width ||\n _areEqualWithinTolerance(objRect.x, curRect.x + curRect.width))\n );\n case 'left':\n return (\n _isHorizontallyAligned(objRect, curRect) &&\n (curRect.x <= objRect.x + objRect.width ||\n _areEqualWithinTolerance(curRect.x, objRect.x + objRect.width))\n );\n default:\n break;\n }\n\n return false;\n}\n\nfunction _isVerticallyAligned(rect1: Bounds, rect2: Bounds) {\n return (\n (rect1.x >= rect2.x && rect1.x <= rect2.x + rect2.width) ||\n (rect2.x >= rect1.x && rect2.x <= rect1.x + rect1.width)\n );\n}\n\nfunction _isHorizontallyAligned(rect1: Bounds, rect2: Bounds) {\n return (\n (rect1.y >= rect2.y && rect1.y <= rect2.y + rect2.height) ||\n (rect2.y >= rect1.y && rect2.y <= rect1.y + rect1.height)\n );\n}\n\nfunction _areEqualWithinTolerance(a: number, b: number) {\n return Math.abs(a - b) <= 0.0000001;\n}\n\nfunction _anglesAreEqualWithinTolerance(a1: number, a2: number) {\n let res = Math.abs(a1 - a2) <= 0.0000001;\n if (!res) {\n res = Math.abs(Math.PI * 2 + Math.min(a1, a2) - Math.max(a1, a2)) <= 0.0000001;\n }\n return res;\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport {\n NavDirection,\n addSortingAttributes,\n calcDistanceAngleWeighted,\n calcInContact,\n getLinkComparator,\n getNavigableLinksForNodeId,\n isValidDestination\n} from '../utils/navUtils';\nimport type {\n DiagramNodeData,\n DiagramLinkData,\n Bounds,\n ItemInfo,\n PromotedLinkId\n} from '../diagram.types';\nimport { useRef } from 'preact/hooks';\nimport { getPromotedString, isPromoted } from '../utils/diagramUtils';\n\nexport function useDiagramNavigation<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n bounds: Map<K1, Bounds>,\n linkIdToDataMap: Map<K2, D2>,\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>,\n nodeIdToDataMap: Map<K1, D1>\n) {\n const currentKeyboardFocusNode = useRef<K1>();\n const nodeBoundsById = bounds;\n\n function getNextNavigableNode(\n direction: NavDirection,\n compareCenters: boolean,\n current?: D1,\n listOfObjects?: D1[]\n ) {\n if (!listOfObjects) return current;\n\n if (!current) return listOfObjects[0];\n const currBB = nodeBoundsById.get(current.id);\n if (!currBB) return current;\n\n let nextObject = current; //init to current object\n let nextDistance = Number.MAX_VALUE;\n\n // If an object is in contact it overrules all other attributes\n // Only another in contact object with better attributes will have higher precedence\n let nextInContact = false;\n\n // Whether or not the for loop has encountered the current object\n let hasFoundCurrent = false;\n\n let object, inContact, distance;\n for (let i = 0; i < listOfObjects.length; i++) {\n object = listOfObjects[i];\n\n if (object === current) {\n hasFoundCurrent = true;\n continue;\n }\n const objBB = nodeBoundsById.get(object.id);\n if (!objBB) continue;\n\n const objBounds = { x: objBB.x, y: objBB.y, width: objBB.width, height: objBB.height };\n const currBounds = { x: currBB.x, y: currBB.y, width: currBB.width, height: currBB.height };\n if (!isValidDestination(objBounds, currBounds, direction, compareCenters)) continue;\n\n inContact = calcInContact(objBounds, currBounds, direction);\n\n if (nextInContact && !inContact) continue;\n\n distance = calcDistanceAngleWeighted(objBounds, currBounds, direction);\n\n if (distance == 0 && !hasFoundCurrent) continue;\n\n // Make sure incontact flag have highest precedence\n if (\n (!nextInContact && inContact) ||\n (distance < nextDistance && ((nextInContact && inContact) || !nextInContact))\n ) {\n nextDistance = distance;\n nextObject = object;\n nextInContact = inContact;\n }\n }\n return nextObject;\n }\n\n /**\n * Get next navigavle link depending on direction - clockwise or conter clockwise.\n * The decision is made based on location of nodes centers rather than link paths or link angles.\n */\n function getNextNavigableLink(\n direction: string,\n listOfNodes: D1[],\n currentLink?: D2 | PromotedLinkId<K1, D2>,\n listOfLinks?: D2[],\n promotedLinks?: PromotedLinkId<K1, D2>[]\n ) {\n if (!(listOfLinks || promotedLinks)) return currentLink;\n const allLinks =\n listOfLinks && promotedLinks\n ? [...listOfLinks, ...promotedLinks]\n : (listOfLinks ? listOfLinks : promotedLinks)!;\n\n if (!currentLink) return allLinks[0];\n const keyboardFocusNode = currentKeyboardFocusNode.current;\n const nodeId = keyboardFocusNode ? keyboardFocusNode : currentLink.startNode;\n const node = nodeIdToDataMap.get(nodeId);\n\n if (!node) return currentLink;\n const adjLinks = getNavigableLinksForNodeId<K1, K2, D2>(node.id, allLinks);\n const linksWithSortingAttributes = addSortingAttributes<K1, K2, D1, D2>(\n node,\n adjLinks,\n listOfNodes,\n nodeBoundsById\n );\n linksWithSortingAttributes.sort(getLinkComparator());\n //clockwise direction\n const bForward = direction == 'down' ? true : false;\n let index = 0;\n for (let i = 0; i < linksWithSortingAttributes.length; i++) {\n const id = 'id' in currentLink ? currentLink.id : getPromotedString(currentLink);\n const link = linksWithSortingAttributes[i];\n if (link.id === id) {\n if (bForward) index = i == linksWithSortingAttributes.length - 1 ? 0 : i + 1;\n else index = i == 0 ? linksWithSortingAttributes.length - 1 : i - 1;\n break;\n }\n }\n if (linksWithSortingAttributes[index].type === 'link') {\n return linkIdToDataMap.get(linksWithSortingAttributes[index].id as K2);\n }\n return promotedLinkMap.get(linksWithSortingAttributes[index].id as string);\n }\n\n /**\n * Returns the link detail when a node to link navigation occurs\n */\n function navigateFromNodeToLink(\n listOfLinks: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n event: KeyboardEvent,\n node?: D1\n ): ItemInfo<K1, K2, D2> | undefined {\n if (!node) return undefined;\n const adjLinks = getNavigableLinksForNodeId(node.id, [...listOfLinks, ...promotedLinks]);\n if (adjLinks.length < 1) return undefined;\n let link = adjLinks[0];\n const nodeBB = nodeBoundsById.get(node.id)!;\n let object;\n let currNode: K1;\n let currNodeBB;\n let currNodeBBCenterX;\n const nodeCenterX = nodeBB.x + nodeBB.width / 2;\n currentKeyboardFocusNode.current = node.id;\n for (let i = 0; i < adjLinks.length; i++) {\n object = adjLinks[i];\n currNode = object.startNode === node.id ? object.endNode : object.startNode;\n currNodeBB = nodeBoundsById.get(currNode);\n currNodeBBCenterX = currNodeBB!.x + currNodeBB!.width / 2;\n if (\n // equivalent of ≤ and ≥\n (event.altKey && event.code === 'Comma' && currNodeBBCenterX <= nodeCenterX) ||\n (event.altKey && event.code === 'Period' && currNodeBBCenterX >= nodeCenterX)\n ) {\n link = object;\n break;\n }\n }\n return (\n isPromoted(link) ? { id: link, type: 'promotedLink' } : { id: (link as D2).id, type: 'link' }\n ) as ItemInfo<K1, K2, D2>;\n }\n\n /**\n * Returns the node detail when a link to node navigation occurs\n */\n function navigateFromLinkToNode(\n startNode: K1,\n endNode: K1,\n key: string\n ): ItemInfo<K1, K2, D2> | undefined {\n const startNodeBB = nodeBoundsById.get(startNode);\n const endNodeBB = nodeBoundsById.get(endNode);\n if (!startNodeBB || !endNodeBB) return undefined;\n const startNodeCenterX = startNodeBB.x + startNodeBB.width / 2;\n const endNodeCenterX = endNodeBB.x + endNodeBB.width / 2;\n const newNode =\n (endNodeCenterX > startNodeCenterX && key === 'ArrowRight') ||\n (endNodeCenterX < startNodeCenterX && key === 'ArrowLeft')\n ? endNode\n : startNode;\n return { id: newNode, type: 'node' };\n }\n\n return {\n getNextNavigableNode,\n getNextNavigableLink,\n navigateFromNodeToLink,\n navigateFromLinkToNode\n };\n}\n","import {\n ItemInfo,\n ItemHoverDetail,\n ItemFocusDetail,\n Bounds,\n DiagramNodeData,\n DiagramLinkData,\n ExpandedItemDetail,\n PromotedLinkId\n} from '../diagram.types';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport {\n isEqualItem,\n getNavigableInfo,\n changeExpanded,\n expCollapseButtonId,\n getPromotedString,\n isPromoted,\n getChildInfo\n} from '../utils/diagramUtils';\nimport { zoomAndCenterItemFromInfo } from '../utils/zoomUtils';\nimport { getRandomId } from '#utils/PRIVATE_visLayoutUtils/layoutUtils';\nimport { getLinkDetailFromInfo } from '../utils/navUtils';\nimport { useDiagramNavigation } from './useDiagramNavigation';\nimport type { NavDirection } from '../utils/navUtils';\nimport { useVisHover } from '#hooks/PRIVATE_useVisHover';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { gestureTypes } from '#hooks/PRIVATE_useVisContextMenu';\nimport { Keys } from '#utils/UNSAFE_keys';\n\nconst DEFAULT_KB_PAN = 15;\nconst DEFAULT_KB_ZOOM = 0.15;\nconst DIAGRAM_ITEM_SELECTOR =\n '[data-oj-private-node], [data-oj-private-link], [data-oj-private-promoted-link]';\n\nexport function useEvents<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n touchResponse: 'touchStart' | 'touchHold',\n initNode: D1,\n nodes: D1[],\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeBounds: Map<K1, Bounds>,\n navigationNodeBounds: Map<K1, Bounds>,\n linkIdToDataMap: Map<K2, D2>,\n nodeIdToDataMap: Map<K1, D1>,\n width: number,\n height: number,\n maxZoom: number,\n expanded: Keys<K1>,\n itemIdToParentMap: Map<K1, K1>,\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>,\n onItemHover?: (detail: ItemHoverDetail<K1, K2, D1, D2>) => void,\n onItemFocus?: (detail: ItemFocusDetail<K1, K2, D1, D2>) => void,\n kbPanCallback?: (props: {\n dPan?: { dx: number; dy: number };\n nPan?: { cx: number; cy: number };\n center?: boolean;\n }) => void,\n kbZoomCallback?: (props: { dZoom?: number; nZoom?: number }) => void,\n onExpandedChange?: (detail: ExpandedItemDetail<K1>) => void,\n isTabbableMode?: () => boolean,\n shouldIgnoreTransientBlur?: (event: FocusEvent) => boolean\n) {\n const {\n getNextNavigableNode,\n getNextNavigableLink,\n navigateFromNodeToLink,\n navigateFromLinkToNode\n } = useDiagramNavigation<K1, K2, D1, D2>(\n navigationNodeBounds,\n linkIdToDataMap,\n promotedLinkMap,\n nodeIdToDataMap\n );\n const [focusedItemInfo, setfocusedItemInfo] = useState<ItemInfo<K1, K2, D2>>({\n id: initNode.id,\n type: 'node'\n });\n const [hoveredItemInfo, sethoveredItemInfo] = useState<ItemInfo<K1, K2, D2>>();\n const activeId = useRef<string>();\n\n const getNearestVisibleNodeId = (nodeId: K1) => {\n let currentNodeId: K1 | undefined = nodeId;\n while (currentNodeId != null && !nodeIdToDataMap.has(currentNodeId)) {\n currentNodeId = itemIdToParentMap.get(currentNodeId);\n }\n return currentNodeId;\n };\n\n const getVisibleFallbackItemInfo = (itemInfo: ItemInfo<K1, K2, D2>) => {\n if (itemInfo.type === 'node') {\n const nearestVisibleNodeId = getNearestVisibleNodeId(itemInfo.id as K1) ?? initNode.id;\n return nearestVisibleNodeId === itemInfo.id\n ? undefined\n : { ...itemInfo, id: nearestVisibleNodeId };\n }\n\n if (itemInfo.type === 'link') {\n if (linkIdToDataMap.has(itemInfo.id as K2)) {\n return undefined;\n }\n return { id: initNode.id, type: 'node' } as ItemInfo<K1, K2, D2>;\n }\n\n const promotedLinkId = getPromotedString(itemInfo.id as PromotedLinkId<K1, D2>);\n if (promotedLinkMap.has(promotedLinkId)) {\n return undefined;\n }\n\n const fallbackNodeId =\n getNearestVisibleNodeId((itemInfo.id as PromotedLinkId<K1, D2>).startNode) ??\n getNearestVisibleNodeId((itemInfo.id as PromotedLinkId<K1, D2>).endNode) ??\n initNode.id;\n return { id: fallbackNodeId, type: 'node' } as ItemInfo<K1, K2, D2>;\n };\n\n const resolvedFocusedItemInfo = getVisibleFallbackItemInfo(focusedItemInfo) ?? focusedItemInfo;\n\n const cancelEvent = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const normalizeKey = (key: string) => {\n switch (key) {\n case 'Up':\n return 'ArrowUp';\n case 'Down':\n return 'ArrowDown';\n case 'Left':\n return 'ArrowLeft';\n case 'Right':\n return 'ArrowRight';\n case 'Esc':\n return 'Escape';\n default:\n return key;\n }\n };\n\n const isElementFocusVisible = (element: Element) => {\n try {\n return element.matches(':focus-visible');\n } catch {\n return false;\n }\n };\n\n const isChangeItemType = (itemInfo: ItemInfo<K1, K2, D2>, key: string, event: KeyboardEvent) => {\n // check if switching from node to link\n // equivalent of ≤ and ≥\n if (\n itemInfo.type === 'node' &&\n event.altKey &&\n (event.code === 'Period' || event.code === 'Comma' || key === '>' || key === '<')\n ) {\n return true;\n }\n\n // check if switching from link to node\n return itemInfo.type !== 'node' && (key === 'ArrowLeft' || key === 'ArrowRight');\n };\n\n const syncFocusedItemInfoFromTarget = (\n target: EventTarget | null,\n currentTarget?: EventTarget | null\n ) => {\n if (!(target instanceof Element)) {\n return undefined;\n }\n\n const itemTarget = target.closest(DIAGRAM_ITEM_SELECTOR);\n if (!(itemTarget instanceof HTMLElement)) {\n return undefined;\n }\n\n if (currentTarget instanceof Element && !currentTarget.contains(itemTarget)) {\n return undefined;\n }\n\n const itemInfo = getNavigableInfo<K1, K2, D2>(\n itemTarget,\n promotedLinkMap,\n nodeIdToDataMap,\n linkIdToDataMap\n );\n const isFocusVisible = isElementFocusVisible(target) || isElementFocusVisible(itemTarget);\n const syncedItemInfo = {\n ...itemInfo,\n isCurrent: true,\n isFocusVisible\n } as ItemInfo<K1, K2, D2>;\n if (\n !focusedItemInfo.isCurrent ||\n focusedItemInfo.isFocusVisible !== isFocusVisible ||\n !isEqualItem(itemInfo, focusedItemInfo)\n ) {\n updatefocusedItemInfo(syncedItemInfo);\n }\n return syncedItemInfo;\n };\n\n const keyDownHandler = (event: KeyboardEvent) => {\n const key = normalizeKey(event.key);\n const tabbableModeActive = isTabbableMode?.() ?? false;\n const currentTarget = event.currentTarget as Element | null;\n const target = event.target as Element | null;\n const hasInternalFocus = currentTarget != null && event.target !== currentTarget;\n const itemTarget = target?.closest(DIAGRAM_ITEM_SELECTOR);\n const isOwnerElementTarget = itemTarget != null && itemTarget === target;\n let eventConsumed = false;\n const syncedFocusedItemInfo =\n !tabbableModeActive && isOwnerElementTarget\n ? undefined\n : syncFocusedItemInfoFromTarget(event.target, event.currentTarget);\n const currentFocusedItemInfo = syncedFocusedItemInfo ?? resolvedFocusedItemInfo;\n\n // tabbing out of the diagram\n if (key === 'Tab') {\n return;\n }\n if (tabbableModeActive && hasInternalFocus && key !== 'F2' && key !== 'Escape') {\n return;\n }\n // if this a switch from node to link or vice versa\n if (isChangeItemType(currentFocusedItemInfo, key, event)) {\n let nextItemInfo: ItemInfo<K1, K2, D2> | undefined;\n if (currentFocusedItemInfo.type === 'node') {\n nextItemInfo = navigateFromNodeToLink(\n links,\n promotedLinks,\n event,\n nodeIdToDataMap.get(currentFocusedItemInfo.id)\n );\n } else if (currentFocusedItemInfo.type === 'link') {\n const data = linkIdToDataMap.get(currentFocusedItemInfo.id as K2)!;\n nextItemInfo = navigateFromLinkToNode(data.startNode, data.endNode, key);\n } else {\n // promoted link\n const id = currentFocusedItemInfo.id;\n nextItemInfo = navigateFromLinkToNode(id.startNode, id.endNode, key);\n }\n handleKeyboardInput(nextItemInfo);\n eventConsumed = true;\n } else if (isNavigationEvent(key)) {\n const nextItemInfo = handleKeyboardNavigationEvent(currentFocusedItemInfo, key) as ItemInfo<\n K1,\n K2,\n D2\n >;\n handleKeyboardInput(nextItemInfo);\n eventConsumed = true;\n } else {\n switch (key) {\n case 'PageUp': {\n kbPanCallback &&\n kbPanCallback({\n dPan: {\n dx: event.shiftKey ? -DEFAULT_KB_PAN : 0,\n dy: event.shiftKey ? 0 : -DEFAULT_KB_PAN\n }\n });\n eventConsumed = true;\n break;\n }\n case 'PageDown': {\n kbPanCallback &&\n kbPanCallback({\n dPan: {\n dx: event.shiftKey ? DEFAULT_KB_PAN : 0,\n dy: event.shiftKey ? 0 : DEFAULT_KB_PAN\n }\n });\n eventConsumed = true;\n break;\n }\n case '+':\n case '=': {\n kbZoomCallback && kbZoomCallback({ dZoom: DEFAULT_KB_ZOOM });\n eventConsumed = true;\n break;\n }\n case '-':\n case '_': {\n kbZoomCallback && kbZoomCallback({ dZoom: -DEFAULT_KB_ZOOM });\n eventConsumed = true;\n break;\n }\n case '0': {\n if (event.ctrlKey && event.altKey) {\n const { centerX, centerY, zoom } = zoomAndCenterItemFromInfo(\n currentFocusedItemInfo,\n linkIdToDataMap,\n nodeBounds,\n width,\n height,\n maxZoom\n );\n kbZoomCallback && kbZoomCallback({ nZoom: zoom });\n kbPanCallback && kbPanCallback({ nPan: { cx: centerX, cy: centerY } });\n } else {\n // zoom to fit\n kbZoomCallback && kbZoomCallback({});\n kbPanCallback && kbPanCallback({ center: true });\n }\n eventConsumed = true;\n break;\n }\n case ' ': {\n if ((event.ctrlKey || event.metaKey) && event.shiftKey) {\n if (currentFocusedItemInfo.type === 'node') {\n const id = currentFocusedItemInfo.id;\n const newExpanded = changeExpanded(id, expanded);\n onExpandedChange && onExpandedChange({ expanded: newExpanded });\n }\n }\n break;\n }\n case '[': {\n if (currentFocusedItemInfo.type === 'node') {\n const child = getChildInfo(currentFocusedItemInfo.id, nodeIdToDataMap);\n if (child) {\n const item = { id: child.id, type: 'node' } as ItemInfo<K1, K2, D2>;\n handleKeyboardInput(item);\n }\n }\n eventConsumed = true;\n break;\n }\n case ']': {\n if (currentFocusedItemInfo.type === 'node') {\n const parentId = itemIdToParentMap.get(currentFocusedItemInfo.id);\n if (parentId) {\n const item = { id: parentId, type: 'node' } as ItemInfo<K1, K2, D2>;\n handleKeyboardInput(item);\n }\n }\n eventConsumed = true;\n break;\n }\n }\n }\n if (eventConsumed) {\n cancelEvent(event);\n }\n };\n\n const keyUpHandler = (event: KeyboardEvent) => {\n const key = normalizeKey(event.key);\n switch (key) {\n case 'Tab': {\n updatefocusedItemInfo({\n ...resolvedFocusedItemInfo,\n isCurrent: true,\n isFocusVisible: true\n });\n break;\n }\n }\n };\n\n const blurHandler = (event: FocusEvent) => {\n const currentTarget = event.currentTarget as HTMLDivElement | null;\n const relatedTarget = event.relatedTarget as Element | null;\n if (currentTarget != null && relatedTarget != null && currentTarget.contains(relatedTarget)) {\n return;\n }\n if (shouldIgnoreTransientBlur?.(event)) {\n return;\n }\n\n if (hoveredItemInfo != null || resolvedFocusedItemInfo.isCurrent) {\n onItemFocus?.(undefined);\n }\n const itemInfo = { ...resolvedFocusedItemInfo, isCurrent: false, isFocusVisible: false };\n setfocusedItemInfo(itemInfo);\n };\n\n const onHover = (event: PointerEvent) => {\n const itemInfo = getNavigableInfo<K1, K2, D2>(\n event.target as HTMLElement,\n promotedLinkMap,\n nodeIdToDataMap,\n linkIdToDataMap\n );\n if (itemInfo && !isEqualItem(itemInfo, hoveredItemInfo)) {\n sethoveredItemInfo({ ...itemInfo, isCurrent: true });\n activeId.current = getRandomId();\n setfocusedItemInfo({ ...focusedItemInfo, isCurrent: false });\n let detail: ItemHoverDetail<K1, K2, D1, D2>;\n if (itemInfo.type === 'node') {\n detail = {\n id: itemInfo.id,\n type: 'node',\n data: nodeIdToDataMap.get(itemInfo.id as K1)\n };\n } else if (itemInfo.type === 'link') {\n detail = {\n id: itemInfo.id,\n type: 'link',\n data: linkIdToDataMap.get(itemInfo.id as K2)\n };\n } else if (itemInfo.type === 'promotedLink') {\n detail = {\n type: 'promotedLink',\n id: itemInfo.id\n };\n }\n onItemHover?.(detail);\n }\n };\n\n const onHoverLeave = () => {\n sethoveredItemInfo(undefined);\n activeId.current = undefined;\n onItemHover?.(undefined);\n };\n\n const hoverHandlers = useVisHover(onHover, undefined, onHoverLeave, touchResponse);\n\n const pointerUpHandler = (event: PointerEvent) => {\n const itemInfo = getNavigableInfo<K1, K2, D2>(\n event.target as HTMLElement,\n promotedLinkMap,\n nodeIdToDataMap,\n linkIdToDataMap\n );\n if (itemInfo.id != null) {\n let buttonId;\n if (itemInfo.type === 'node') {\n buttonId = expCollapseButtonId<K1>(event.target as HTMLElement, nodeIdToDataMap);\n if (buttonId) {\n const newExpanded = changeExpanded(buttonId, expanded);\n onExpandedChange && onExpandedChange({ expanded: newExpanded });\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n setfocusedItemInfo(itemInfo);\n activeId.current = getRandomId();\n }\n };\n\n function updatefocusedItemInfo(itemInfo: ItemInfo<K1, K2, D2>) {\n if (itemInfo.type === 'node') {\n onItemFocus?.({\n id: itemInfo.id as K1,\n type: 'node',\n data: nodeIdToDataMap.get(itemInfo.id)\n });\n } else if (itemInfo.type === 'link') {\n onItemFocus?.({\n id: itemInfo.id as K2,\n type: 'link',\n data: linkIdToDataMap.get(itemInfo.id)\n });\n } else if (itemInfo.type === 'promotedLink') {\n onItemFocus?.({\n id: itemInfo.id,\n type: 'promotedLink'\n });\n }\n activeId.current = getRandomId();\n setfocusedItemInfo(itemInfo);\n }\n\n function handleKeyboardInput(item?: ItemInfo<K1, K2, D2>) {\n if (!item) return;\n if (!isEqualItem(item, focusedItemInfo)) {\n item.isCurrent = true;\n item.isFocusVisible = true;\n if (hoveredItemInfo) {\n sethoveredItemInfo({ ...hoveredItemInfo, isCurrent: false });\n }\n updatefocusedItemInfo(item);\n }\n }\n\n function isNavigationEvent(key: string) {\n switch (key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'ArrowRight':\n case 'ArrowLeft': {\n return true;\n }\n }\n return false;\n }\n\n function handleKeyboardNavigationEvent(currentItemInfo: ItemInfo<K1, K2, D2>, key: string) {\n let direction: NavDirection = 'down';\n switch (key) {\n case 'ArrowDown': {\n direction = 'down';\n break;\n }\n case 'ArrowUp': {\n direction = 'up';\n break;\n }\n case 'ArrowRight': {\n direction = 'right';\n break;\n }\n case 'ArrowLeft': {\n direction = 'left';\n break;\n }\n }\n if (currentItemInfo.type === 'node') {\n const parent = itemIdToParentMap.get(currentItemInfo.id as K1);\n const navigableNodes =\n parent && nodeIdToDataMap.get(parent) ? nodeIdToDataMap.get(parent)!.nodes! : nodes;\n const itemDetail = getNextNavigableNode(\n direction,\n true,\n nodeIdToDataMap.get(currentItemInfo.id as K1),\n navigableNodes\n );\n return itemDetail ? { id: itemDetail.id, type: 'node' } : currentItemInfo;\n } else {\n const linkDetail = getLinkDetailFromInfo<K1, K2, D2>(currentItemInfo, links, promotedLinks);\n const itemDetail = getNextNavigableLink(direction, nodes, linkDetail, links, promotedLinks);\n if (itemDetail && isPromoted(itemDetail)) return { id: itemDetail, type: 'promotedLink' };\n else if (itemDetail && !isPromoted(itemDetail))\n return { id: (itemDetail as D2).id, type: 'link' };\n else return { id: currentItemInfo.id, type: currentItemInfo.type };\n }\n }\n const onContextMenuDismissed = (gesture: gestureTypes) => {\n if (gesture === 'keyboard') {\n updatefocusedItemInfo({\n ...focusedItemInfo,\n isFocusVisible: true,\n isCurrent: true\n });\n }\n };\n\n const onFocus = (event: FocusEvent) => {\n activeId.current = getRandomId();\n\n const currentTarget = event.currentTarget as HTMLDivElement | null;\n if (currentTarget == null) {\n return;\n }\n\n const target = event.target as Element | null;\n if (target != null && target !== currentTarget) {\n if (syncFocusedItemInfoFromTarget(target, currentTarget) == null) {\n return;\n }\n return;\n }\n\n const isFocusVisible =\n resolvedFocusedItemInfo.isFocusVisible || isElementFocusVisible(currentTarget);\n if (\n !resolvedFocusedItemInfo.isCurrent ||\n resolvedFocusedItemInfo.isFocusVisible !== isFocusVisible\n ) {\n updatefocusedItemInfo({\n ...resolvedFocusedItemInfo,\n isCurrent: true,\n isFocusVisible\n });\n }\n };\n useEffect(() => {\n const fallbackItemInfo = getVisibleFallbackItemInfo(focusedItemInfo);\n if (fallbackItemInfo == null || isEqualItem(fallbackItemInfo, focusedItemInfo)) {\n return;\n }\n\n updatefocusedItemInfo(fallbackItemInfo);\n }, [\n focusedItemInfo,\n initNode.id,\n itemIdToParentMap,\n linkIdToDataMap,\n nodeIdToDataMap,\n promotedLinkMap\n ]);\n const hasActiveDescendant =\n (resolvedFocusedItemInfo.isCurrent && resolvedFocusedItemInfo.isFocusVisible) ||\n hoveredItemInfo?.isCurrent;\n return {\n focusedItemInfo: resolvedFocusedItemInfo,\n hoveredItemInfo,\n activeId: hasActiveDescendant ? activeId.current : undefined,\n onContextMenuDismissed,\n syncFocusedItemInfoFromTarget,\n eventsProps: mergeProps(hoverHandlers, {\n onKeyUp: keyUpHandler,\n onKeyDown: keyDownHandler,\n onBlur: blurHandler,\n onPointerUp: pointerUpHandler,\n onFocus\n })\n };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n ItemInfo,\n Bounds,\n DatatipContext,\n DiagramNodeData,\n DiagramLinkData\n} from '../diagram.types';\nimport type { RefObject } from 'preact';\nimport { useDatatip } from '#hooks/PRIVATE_useDatatip';\nimport { calculateOffset } from '#utils/PRIVATE_visLayoutUtils/layoutUtils';\nimport type { PanningState } from '../utils/panUtils';\nimport { useUser } from '#hooks/UNSAFE_useUser';\nimport { getDatatipContent } from '../utils/diagramUtils';\nimport { DatatipConfig } from '#utils/UNSAFE_visTypes/common';\n\nconst DEBUG_FLAG = '__OJ_DIAGRAM_TABBABLE_DEBUG__';\n\nconst isDebugEnabled = () => {\n const globalDebugFlag = (globalThis as typeof globalThis & Record<string, unknown>)[DEBUG_FLAG];\n return globalDebugFlag === true;\n};\n\ntype props<K1, K2, D1, D2> = {\n touchResponse: 'touchStart' | 'touchHold';\n datatip?: DatatipConfig<DatatipContext<K1, D1, D2>>;\n text?: string;\n focusedItemInfo: ItemInfo<K1, K2, D2>;\n focusedItemBoundsRef: RefObject<Bounds | null>;\n panState: PanningState;\n zoom: number;\n width: number;\n nodesMap: Map<K1, D1>;\n linksMap: Map<K2, D2>;\n hoveredItem?: ItemInfo<K1, K2, D2>;\n isTabbableMode?: boolean;\n};\n\n/**\n * Returns the datatip.\n * @param text The text string for the diagram item.\n * @param rootRef The ref for root of the diagram.\n * @param focusedItemBoundsRef The ref for focused item bounds.\n * @param focusedItemInfo The ItemInfo for focused item.\n * @returns\n */\nexport const useDiagramDatatip = <\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>({\n touchResponse,\n datatip,\n focusedItemBoundsRef,\n focusedItemInfo,\n panState,\n zoom,\n width,\n nodesMap,\n linksMap,\n hoveredItem,\n isTabbableMode = false\n}: props<K1, K2, D1, D2>) => {\n const { direction } = useUser();\n const isRtl = direction === 'rtl';\n\n const datatipC = getDatatipContent(nodesMap, linksMap, focusedItemInfo, hoveredItem, datatip);\n const elementBounds = focusedItemBoundsRef.current\n ? {\n x: focusedItemBoundsRef.current.x + panState.panX,\n y: focusedItemBoundsRef.current.y + panState.panY,\n width: focusedItemBoundsRef.current.width * zoom,\n height: focusedItemBoundsRef.current.height * zoom\n }\n : undefined;\n const offset = focusedItemInfo.isCurrent\n ? calculateOffset(isRtl, width, elementBounds)\n : calculateOffset(isRtl, width);\n\n if (isDebugEnabled()) {\n console.log('[diagram datatip debug]', {\n focusedItemInfo,\n hoveredItem,\n focusedItemBounds: focusedItemBoundsRef.current,\n elementBounds,\n panState,\n zoom\n });\n }\n\n const { datatipContent, datatipProps } = useDatatip({\n content: datatipC?.content,\n borderColor: datatipC?.borderColor,\n placement: 'top-start',\n offset,\n anchor: focusedItemInfo?.isCurrent ? 'element' : 'pointer',\n touchResponse,\n isDisabled: isTabbableMode\n });\n return { datatipContent: datatipContent, datatipProps: datatipProps };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { safeSetPointerCapture } from '#utils/PRIVATE_visPointerUtils';\n\ntype PointerGesture = {\n pointers: PointerEvent[];\n};\n\ntype UsePointerGestureOptions = {\n captureTargetRef: RefObject<HTMLDivElement>;\n numPointers: number;\n onPointerGestureDown?: (detail: PointerGesture) => void;\n onPointerGestureMove?: (detail: PointerGesture) => void;\n onPointerGestureEnd?: (detail: PointerGesture) => void;\n onExtraneousPointerDown?: (detail: PointerGesture) => void;\n isDisabled?: boolean;\n};\n\nconst usePointerGesture = ({\n captureTargetRef,\n numPointers = 1,\n onPointerGestureDown,\n onPointerGestureMove,\n onPointerGestureEnd,\n onExtraneousPointerDown,\n isDisabled = false\n}: UsePointerGestureOptions) => {\n const activePointers = useRef<PointerEvent[]>([]);\n\n if (isDisabled) {\n activePointers.current = [];\n }\n\n const onPointerDown = (e: PointerEvent) => {\n activePointers.current.push(e);\n if (activePointers.current.length === numPointers) {\n onPointerGestureDown && onPointerGestureDown({ pointers: activePointers.current });\n } else if (activePointers.current.length > numPointers) {\n onExtraneousPointerDown && onExtraneousPointerDown({ pointers: activePointers.current });\n }\n };\n\n const onPointerMove = (e: PointerEvent) => {\n if (activePointers.current.length === 0) return;\n\n const index = activePointers.current.findIndex(\n (pointerEvent) => pointerEvent.pointerId === e.pointerId\n );\n if (index === -1) return;\n\n activePointers.current[index] = e;\n if (activePointers.current.length === numPointers) {\n activePointers.current.forEach((e) =>\n safeSetPointerCapture(captureTargetRef.current, e.pointerId)\n );\n\n onPointerGestureMove && onPointerGestureMove({ pointers: activePointers.current });\n }\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const index = activePointers.current.findIndex(\n (pointerEvent) => pointerEvent.pointerId === e.pointerId\n );\n if (index === -1) return;\n\n activePointers.current[index] = e;\n if (activePointers.current.length === numPointers) {\n onPointerGestureEnd && onPointerGestureEnd({ pointers: activePointers.current });\n }\n activePointers.current.splice(index, 1);\n };\n\n const onPointerCancel = onPointerUp;\n const onPointerLeave = onPointerUp;\n\n return isDisabled\n ? {}\n : {\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onPointerLeave\n };\n};\n\nexport { usePointerGesture };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { PanState } from '../diagram.types';\nimport type { RefObject } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { useDrag } from './useDrag';\nimport { PanBounds, pan, centerXYToPanXY } from '../utils/panUtils';\n/**\n * Options for useDragPan hook\n */\ntype UseDragPanOptions = {\n panProps: {\n centerX: number;\n centerY: number;\n panDirection: 'x' | 'y' | 'any';\n onPan?: (detail: PanState) => void;\n panning?: 'centerContent' | 'fixed' | 'off';\n };\n captureTargetRef: RefObject<HTMLDivElement>;\n panBounds?: PanBounds;\n onDragPanStart?: () => void;\n onDragPanEnd?: () => void;\n zoom: number;\n width: number;\n height: number;\n};\n\nconst useDragPan = ({\n panProps,\n captureTargetRef,\n panBounds,\n width,\n height,\n zoom,\n onDragPanStart,\n onDragPanEnd\n}: UseDragPanOptions) => {\n const prevPanState = useRef({ panX: 0, panY: 0 });\n const initialPanState = useRef({ panX: 0, panY: 0 });\n const dragProps = useDrag({\n captureTargetRef,\n onDragStart: () => {\n const panValues = centerXYToPanXY(panProps.centerX, panProps.centerY, zoom, width, height);\n initialPanState.current = {\n panX: panValues.panX,\n panY: panValues.panY\n };\n prevPanState.current = panValues;\n onDragPanStart && onDragPanStart();\n },\n onDragMove: ({ dx, dy }) => {\n const nextPan = {\n panX: initialPanState.current.panX + dx,\n panY: initialPanState.current.panY + dy\n };\n const { newPan } = pan(\n prevPanState.current,\n nextPan,\n panProps.panDirection,\n zoom,\n width,\n height,\n panBounds,\n panProps.onPan\n );\n prevPanState.current = newPan;\n },\n onDragEnd: ({ originalEvent }) => {\n // If panning occurred, call preventDefault to prevent selection from occurring\n if (\n initialPanState.current.panX !== prevPanState.current.panX ||\n initialPanState.current.panY !== prevPanState.current.panY\n )\n originalEvent.preventDefault();\n onDragPanEnd && onDragPanEnd();\n },\n isDisabled: panProps.panning === 'off'\n });\n\n return dragProps;\n};\n\nexport { useDragPan };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { usePointerGesture } from './usePointerGesture';\n/**\n * Draggable region\n */\ntype DraggableRegion = {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n};\n\ntype DragDetail = {\n x: number;\n y: number;\n dx: number;\n dy: number;\n regionOffsetX: number;\n regionOffsetY: number;\n originalEvent: PointerEvent;\n};\n\ntype UseDragOptions = {\n captureTargetRef: RefObject<HTMLDivElement>;\n draggableRegion?: DraggableRegion;\n onDragStart?: (detail: Omit<DragDetail, 'dx' | 'dy'>) => void;\n onDragMove?: (detail: DragDetail) => void;\n onDragEnd?: (detail: DragDetail) => void;\n isDisabled?: boolean;\n};\n/**\n * Whether point with coordinates are in the draggable region\n */\nconst inDraggableRegion = (x: number, y: number, region?: DraggableRegion) => {\n if (!region) return true;\n const { xMin, xMax, yMin, yMax } = region;\n return x >= xMin && x <= xMax && y >= yMin && y <= yMax;\n};\n\n/**\n * Returns region offset\n */\nconst getRegionOffset = (x: number, y: number, region?: DraggableRegion) => {\n if (!region) return { regionOffsetX: x, regionOffsetY: y };\n return { regionOffsetX: x - region.xMin, regionOffsetY: y - region.yMin };\n};\n\nconst useDrag = ({\n captureTargetRef,\n draggableRegion,\n onDragStart,\n onDragMove,\n onDragEnd,\n isDisabled = false\n}: UseDragOptions) => {\n const inactiveState = { isDragging: false, x0: -1, y0: -1, regionOffsetX: -1, regionOffsetY: -1 };\n const dragState = useRef(inactiveState);\n\n const handlePointerEvent = (e: PointerEvent, cb?: (detail: DragDetail) => void) => {\n const { isDragging, x0, y0, regionOffsetX, regionOffsetY } = dragState.current;\n if (!isDragging) return;\n const x = e.pageX;\n const y = e.pageY;\n cb && cb({ x, y, dx: x - x0, dy: y - y0, regionOffsetX, regionOffsetY, originalEvent: e });\n };\n\n const dragProps = usePointerGesture({\n captureTargetRef,\n numPointers: 1, // Only allow 1 pointer dragging\n onExtraneousPointerDown: () => {\n dragState.current = inactiveState;\n },\n onPointerGestureDown: ({ pointers: [e] }) => {\n const x = e.pageX;\n const y = e.pageY;\n if (e.button !== 0 || !inDraggableRegion(x, y, draggableRegion)) return;\n const { regionOffsetX, regionOffsetY } = getRegionOffset(x, y, draggableRegion);\n dragState.current = { isDragging: true, x0: x, y0: y, regionOffsetX, regionOffsetY };\n onDragStart && onDragStart({ x, y, regionOffsetX, regionOffsetY, originalEvent: e });\n },\n onPointerGestureMove: ({ pointers: [e] }) => {\n handlePointerEvent(e, onDragMove);\n },\n onPointerGestureEnd: ({ pointers: [e] }) => {\n handlePointerEvent(e, onDragEnd);\n dragState.current = inactiveState;\n }\n });\n\n return isDisabled ? {} : dragProps;\n};\n\nexport { useDrag };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { usePointerGesture } from './usePointerGesture';\n\ntype Point = { x: number; y: number };\n\nconst getMidpoint = (p1: Point, p2: Point) => ({ x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 });\nconst getDistance = (p1: Point, p2: Point) => Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p2.y) ** 2);\n\ntype PinchDetail = {\n origin: Point;\n delta: number;\n};\n\ntype UsePinchOptions = {\n captureTargetRef: RefObject<HTMLDivElement>;\n onPinchZoomStart?: (detail: PinchDetail) => void;\n onPinchZoomChange?: (detail: PinchDetail) => void;\n onPinchZoomEnd?: () => void;\n isDisabled?: boolean;\n};\n\nconst usePinch = ({\n captureTargetRef,\n onPinchZoomStart,\n onPinchZoomChange,\n onPinchZoomEnd,\n isDisabled = false\n}: UsePinchOptions) => {\n const origin = useRef({ x: -1, y: -1 });\n const prevDistance = useRef(-1);\n const reset = () => {\n origin.current = { x: -1, y: -1 };\n prevDistance.current = -1;\n };\n\n if (isDisabled) reset();\n\n const pinchProps = usePointerGesture({\n captureTargetRef,\n numPointers: 2, // Pinch gesture requires 2 pointers\n onPointerGestureDown: ({ pointers: [pointer1, pointer2] }) => {\n const p1 = { x: pointer1.offsetX, y: pointer1.offsetY };\n const p2 = { x: pointer2.offsetX, y: pointer2.offsetY };\n origin.current = getMidpoint(p1, p2);\n prevDistance.current = getDistance(p1, p2);\n onPinchZoomStart &&\n onPinchZoomStart({\n origin: origin.current,\n delta: 0\n });\n },\n onPointerGestureMove: ({ pointers: [pointer1, pointer2] }) => {\n const p1 = { x: pointer1.offsetX, y: pointer1.offsetY };\n const p2 = { x: pointer2.offsetX, y: pointer2.offsetY };\n const distance = getDistance(p1, p2);\n const delta = distance - prevDistance.current;\n prevDistance.current = distance;\n onPinchZoomChange &&\n onPinchZoomChange({\n origin: origin.current,\n delta\n });\n },\n onPointerGestureEnd: () => {\n reset();\n onPinchZoomEnd && onPinchZoomEnd();\n }\n });\n\n return isDisabled ? {} : pinchProps;\n};\n\nexport { usePinch };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport { usePinch } from './usePinch';\nimport { zoom, ZOOM_INCREMENT } from '../utils/zoomUtils';\n\ntype UsePinchZoomOptions = {\n captureTargetRef: RefObject<HTMLDivElement>;\n zooming: 'on' | 'off';\n minZoom: number;\n maxZoom: number;\n zoomValue: number;\n onZoom?: (detail: { zoomValue: number }) => void;\n};\n\nconst usePinchZoom = ({\n captureTargetRef,\n zooming,\n minZoom,\n maxZoom,\n zoomValue,\n onZoom\n}: UsePinchZoomOptions) => {\n const pinchProps = usePinch({\n captureTargetRef,\n onPinchZoomChange: ({ delta }) => {\n const newZoom = zoomValue * (1 + ZOOM_INCREMENT * delta);\n zoom(newZoom, zoomValue, minZoom, maxZoom, onZoom);\n },\n isDisabled: zooming === 'off'\n });\n\n return pinchProps;\n};\n\nexport { usePinchZoom };\n","import { Pan, Zoom, Bounds } from '../diagram.types';\nimport type { RefObject } from 'preact';\nimport { useLayoutEffect, useState, useRef } from 'preact/hooks';\nimport { useDragPan } from './useDragPan';\nimport { useWheelZoom } from './useWheelZoom';\nimport { usePinchZoom } from './usePinchZoom';\nimport {} from '../utils/diagramUtils';\nimport {\n PanBounds,\n getPanBounds,\n pan,\n getPanProps,\n centerXYToPanXY,\n constrainPanToBounds\n} from '../utils/panUtils';\nimport { zoom, getZoomProps, getZoomToFitZoom } from '../utils/zoomUtils';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { isTouch } from '#utils/UNSAFE_visUtils/clientUtils';\nimport { Property } from 'csstype';\nimport { useVisDragModeControls } from '#hooks/PRIVATE_useVisDragModeControls';\n\nexport type PanZoomProps = {\n props: Pan & Zoom;\n captureTargetRef: RefObject<HTMLDivElement>;\n width: number;\n height: number;\n contentBounds: Bounds;\n isRtl: boolean;\n};\n\nexport const usePanZoom = ({\n props,\n captureTargetRef,\n width,\n height,\n contentBounds,\n isRtl\n}: PanZoomProps) => {\n const [cursor, setCursor] = useState<Property.Cursor>();\n const normalizedContentBounds = {\n x: 0,\n y: 0,\n width: contentBounds.width,\n height: contentBounds.height\n };\n const zoomProps = getZoomProps(props, width, height, normalizedContentBounds);\n const panBounds = useRef<PanBounds>();\n const prevPanBoundsInputs = useRef<{\n zoomValue: number;\n minZoom: number;\n panning: string;\n width: number;\n height: number;\n contentWidth: number;\n contentHeight: number;\n }>();\n const initPanZoomState = useRef<{\n zoom: number;\n centerX?: number;\n centerY?: number;\n }>();\n\n const isDeviceTouch = isTouch();\n const plotArea = {\n width: width,\n height: height,\n x: 0,\n y: 0\n };\n\n const showPanButton = isDeviceTouch ? props.panning && props.panning !== 'off' : undefined;\n const dragModeOptions = {\n isZoomScroll: true,\n plotAreaSpace: plotArea,\n componentWidth: width,\n isRtl,\n showPanButton: showPanButton ?? false,\n showZoomButton: false,\n showSelectButton: false,\n isDisabled: !isDeviceTouch\n };\n\n const { toggleButtonContent, userDragMode } = useVisDragModeControls(dragModeOptions);\n const panProps = getPanProps(props, contentBounds, userDragMode, isDeviceTouch);\n const { centerX: panCenterX, centerY: panCenterY, onPan, panning } = panProps;\n const panBoundsInputs = {\n zoomValue: zoomProps.zoomValue,\n minZoom: zoomProps.minZoom,\n panning,\n width,\n height,\n contentWidth: normalizedContentBounds.width,\n contentHeight: normalizedContentBounds.height\n };\n const previousPanBoundsInputs = prevPanBoundsInputs.current;\n if (\n contentBounds.width !== Infinity &&\n (!previousPanBoundsInputs ||\n panBoundsInputs.zoomValue !== previousPanBoundsInputs.zoomValue ||\n panBoundsInputs.minZoom !== previousPanBoundsInputs.minZoom ||\n panBoundsInputs.panning !== previousPanBoundsInputs.panning ||\n panBoundsInputs.width !== previousPanBoundsInputs.width ||\n panBoundsInputs.height !== previousPanBoundsInputs.height ||\n panBoundsInputs.contentWidth !== previousPanBoundsInputs.contentWidth ||\n panBoundsInputs.contentHeight !== previousPanBoundsInputs.contentHeight)\n ) {\n initPanZoomState.current ??= {\n zoom: props.zoomValue || 0,\n centerX: props.centerX !== undefined ? props.centerX - contentBounds.x : undefined,\n centerY: props.centerY !== undefined ? props.centerY - contentBounds.y : undefined\n };\n panBounds.current = getPanBounds(\n width,\n height,\n normalizedContentBounds,\n zoomProps.zoomValue,\n zoomProps.minZoom,\n initPanZoomState.current,\n panning\n );\n prevPanBoundsInputs.current = panBoundsInputs;\n }\n useLayoutEffect(() => {\n if (panning !== 'fixed' || !onPan || !panBounds.current || contentBounds.width === Infinity) {\n return;\n }\n const currentPan = centerXYToPanXY(panCenterX, panCenterY, zoomProps.zoomValue, width, height);\n const constrainedPan = constrainPanToBounds(currentPan, panBounds.current);\n if (constrainedPan.panX !== currentPan.panX || constrainedPan.panY !== currentPan.panY) {\n pan(\n currentPan,\n constrainedPan,\n panProps.panDirection,\n zoomProps.zoomValue,\n width,\n height,\n panBounds.current,\n onPan\n );\n }\n }, [\n contentBounds.height,\n contentBounds.width,\n height,\n onPan,\n panProps.panDirection,\n panCenterX,\n panCenterY,\n panning,\n width,\n zoomProps.minZoom,\n zoomProps.zoomValue\n ]);\n const dragPanProps = useDragPan({\n panProps: panProps,\n captureTargetRef: captureTargetRef,\n panBounds: panBounds.current,\n zoom: zoomProps.zoomValue,\n width,\n height,\n onDragPanStart: () => setCursor('grabbing'),\n onDragPanEnd: () => setCursor('auto')\n });\n //dZoom or nZoom is required\n const kbZoomCallback = (props: { dZoom?: number; nZoom?: number }) => {\n const newZoom = props.dZoom\n ? zoomProps.zoomValue + props.dZoom\n : getZoomToFitZoom(width, height, contentBounds);\n const constrainedZoom = zoom(\n props.nZoom ? props.nZoom : newZoom,\n zoomProps.zoomValue,\n zoomProps.minZoom,\n zoomProps.maxZoom,\n zoomProps.onZoom\n );\n if (constrainedZoom !== zoomProps.zoomValue) {\n panOnZoom(constrainedZoom, width / 2, height / 2);\n }\n };\n const prevPanState = useRef({ panX: 0, panY: 0 });\n\n // dPan or nPan is required\n const kbPanCallback = (props: {\n dPan?: { dx: number; dy: number };\n nPan?: { cx: number; cy: number };\n center?: boolean;\n }) => {\n let centerX;\n let centerY;\n if (props.center) {\n centerX = normalizedContentBounds.width / 2;\n centerY = normalizedContentBounds.height / 2;\n } else if (props.dPan) {\n centerX = panProps.centerX + props.dPan.dx;\n centerY = panProps.centerY + props.dPan.dy;\n } else {\n centerX = props.nPan!.cx - contentBounds.x;\n centerY = props.nPan!.cy - contentBounds.y;\n }\n prevPanState.current = centerXYToPanXY(\n panProps.centerX,\n panProps.centerY,\n zoomProps.zoomValue,\n width,\n height\n );\n const panValues = centerXYToPanXY(centerX, centerY, zoomProps.zoomValue, width, height);\n const { newPan } = pan(\n prevPanState.current,\n panValues,\n panProps.panDirection,\n zoomProps.zoomValue,\n width,\n height,\n panBounds.current,\n panProps.onPan\n );\n prevPanState.current = newPan;\n };\n function panOnZoom(newZoom: number, focusX: number, focusY: number) {\n if (\n panProps.panning === 'off' ||\n !panProps.onPan ||\n !initPanZoomState.current ||\n contentBounds.width === Infinity\n ) {\n return;\n }\n const oldPan = centerXYToPanXY(\n panProps.centerX,\n panProps.centerY,\n zoomProps.zoomValue,\n width,\n height\n );\n const zoomRatio = newZoom / zoomProps.zoomValue;\n const nextPan = {\n panX: oldPan.panX * zoomRatio + focusX * (1 - zoomRatio),\n panY: oldPan.panY * zoomRatio + focusY * (1 - zoomRatio)\n };\n const nextPanBounds = getPanBounds(\n width,\n height,\n normalizedContentBounds,\n newZoom,\n zoomProps.minZoom,\n initPanZoomState.current,\n panProps.panning\n );\n const constrainedPan = constrainPanToBounds(nextPan, nextPanBounds);\n const previousPanAtNewZoom = centerXYToPanXY(\n panProps.centerX,\n panProps.centerY,\n newZoom,\n width,\n height\n );\n const { newPan } = pan(\n previousPanAtNewZoom,\n constrainedPan,\n panProps.panDirection,\n newZoom,\n width,\n height,\n nextPanBounds,\n panProps.onPan\n );\n prevPanState.current = newPan;\n }\n const wheelZoomProps = useWheelZoom({\n ...zoomProps,\n onPanOnZoom: ({ zoomValue, x, y }) => panOnZoom(zoomValue, x, y)\n });\n const pinchZoomProps = usePinchZoom({\n captureTargetRef,\n zooming: zoomProps.zooming,\n minZoom: zoomProps.minZoom,\n maxZoom: zoomProps.maxZoom,\n zoomValue: zoomProps.zoomValue,\n onZoom: zoomProps.onZoom\n });\n const panZoomProps = mergeProps(dragPanProps, wheelZoomProps, pinchZoomProps);\n return {\n panZoomProps,\n panProps,\n zoomProps,\n toggleButtonContent,\n cursor,\n centerX: panProps.centerX,\n centerY: panProps.centerY,\n zoomValue: zoomProps.zoomValue,\n panBounds: panBounds.current,\n kbPanCallback: panProps.panning !== 'off' ? kbPanCallback : undefined,\n kbZoomCallback: zoomProps.zooming !== 'off' ? kbZoomCallback : undefined\n };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { useWheel } from './useWheel';\nimport { zoom, ZOOM_INCREMENT } from '../utils/zoomUtils';\n\ntype UseWheelZoomOptions = {\n zooming: 'on' | 'off';\n minZoom: number;\n maxZoom: number;\n zoomValue: number;\n onZoom?: (detail: { zoomValue: number }) => void;\n onPanOnZoom?: (detail: { zoomValue: number; x: number; y: number }) => void;\n};\n\nconst useWheelZoom = ({\n zooming,\n minZoom,\n maxZoom,\n zoomValue,\n onZoom,\n onPanOnZoom\n}: UseWheelZoomOptions) => {\n const wheelProps = useWheel({\n onWheel: ({ x, y, deltaY }) => {\n const newZoom = zoomValue * (1 + ZOOM_INCREMENT * deltaY);\n const constrainedZoom = zoom(newZoom, zoomValue, minZoom, maxZoom, onZoom);\n if (constrainedZoom !== zoomValue) {\n onPanOnZoom?.({ zoomValue: constrainedZoom, x, y });\n }\n },\n isDisabled: zooming === 'off'\n });\n\n return wheelProps;\n};\n\nexport { useWheelZoom };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\ntype WheelDetail = {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n ctrlKey: boolean;\n};\n\ntype UseWheelOptions = {\n onWheel: (detail: WheelDetail) => void;\n preventDefault?: boolean;\n isDisabled?: boolean;\n};\n\nconst PX_FACTOR_PER_LINE = 15; // Value used in Toolkit\nconst PX_FACTOR_PER_PAGE = 40; // Value copied from datagrid; this is not handled in Toolkit\n\nconst getNormalizedDelta = (e: WheelEvent) => {\n const { deltaX, deltaY, deltaMode } = e;\n\n switch (deltaMode) {\n case e.DOM_DELTA_PIXEL:\n return { deltaX: -deltaX, deltaY: -deltaY };\n case e.DOM_DELTA_LINE:\n return { deltaX: -deltaX * PX_FACTOR_PER_LINE, deltaY: -deltaY * PX_FACTOR_PER_LINE };\n case e.DOM_DELTA_PAGE:\n return { deltaX: -deltaX * PX_FACTOR_PER_PAGE, deltaY: -deltaY * PX_FACTOR_PER_PAGE };\n default:\n return { deltaX: -deltaX, deltaY: -deltaY };\n }\n};\n\nconst useWheel = ({\n onWheel: onWheelCallback,\n preventDefault = true,\n isDisabled = false\n}: UseWheelOptions) => {\n const onWheel = (e: WheelEvent) => {\n const { deltaX, deltaY } = getNormalizedDelta(e);\n if (preventDefault) e.preventDefault();\n const bounds = (e.currentTarget as HTMLElement).getBoundingClientRect();\n onWheelCallback({\n x: e.clientX - bounds.left,\n y: e.clientY - bounds.top,\n deltaX,\n deltaY,\n ctrlKey: e.ctrlKey || e.metaKey\n });\n };\n return isDisabled ? {} : { onWheel };\n};\n\nexport { useWheel, PX_FACTOR_PER_LINE };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type { RefObject } from 'preact';\nimport type {\n DiagramContextMenuConfig,\n DiagramContextMenuContext,\n ItemInfo,\n PromotedLinkId\n} from '../diagram.types';\nimport { type gestureTypes, useContextMenu } from '#hooks/PRIVATE_useVisContextMenu';\nimport { getDiagramContextMenuContext } from '../utils/contextMenuUtils';\nimport {\n getMapEntryBySerializedKey,\n getPromotedString,\n queryElementByAttributeValue,\n queryElementBySerializedDiagramKey\n} from '../utils/diagramUtils';\n\ntype Props<K1 extends string | number, K2 extends string | number, D1, D2> = {\n nodesMap: Map<K1, D1>;\n linksMap: Map<K2, D2>;\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>;\n focusedItemInfo: ItemInfo<K1, K2, D2>;\n rootRef: RefObject<HTMLDivElement>;\n contextMenuConfig?: DiagramContextMenuConfig<K1, D1, D2>;\n onContextMenuDismissed?: (gesture: gestureTypes) => void;\n};\n\nexport const useDiagramContextMenu = <K1 extends string | number, K2 extends string | number, D1, D2>({\n focusedItemInfo,\n rootRef,\n contextMenuConfig,\n onContextMenuDismissed,\n nodesMap,\n linksMap,\n promotedLinkMap\n}: Props<K1, K2, D1, D2>) => {\n const { contextMenuProps, contextMenuContent } = useContextMenu<\n DiagramContextMenuContext<K1, D1, D2>\n >({\n onContextMenuHandler: ({ gesture, target }) => {\n let idx;\n let elementType: 'node' | 'link' | 'promotedLink' | 'background' = 'background';\n const currentTarget = target as HTMLElement;\n if (gesture === 'keyboard') {\n idx = focusedItemInfo.id;\n elementType = focusedItemInfo.type;\n } else if (\n (currentTarget.closest('[data-oj-private-node]') as HTMLElement)?.dataset['ojPrivateNode']\n ) {\n idx = getMapEntryBySerializedKey(\n nodesMap,\n (currentTarget.closest('[data-oj-private-node]') as HTMLElement)?.dataset['ojPrivateNode']\n )?.key;\n if (idx != null) {\n elementType = 'node';\n }\n } else if (\n (currentTarget.closest('[data-oj-private-link]') as SVGElement)?.dataset[\n 'ojPrivateLink'\n ] as K2\n ) {\n idx = getMapEntryBySerializedKey(\n linksMap,\n (currentTarget.closest('[data-oj-private-link]') as SVGElement)?.dataset['ojPrivateLink']\n )?.key;\n if (idx != null) {\n elementType = 'link';\n }\n } else if (\n (currentTarget.closest('[data-oj-private-promoted-link]') as SVGElement)?.dataset[\n 'ojPrivatePromotedLink'\n ] as K2\n ) {\n idx = (currentTarget.closest('[data-oj-private-promoted-link]') as SVGElement)?.dataset[\n 'ojPrivatePromotedLink'\n ] as string;\n idx = promotedLinkMap.get(idx);\n elementType = 'promotedLink';\n }\n\n const { context } = getDiagramContextMenuContext<K1, K2, D1, D2>(\n nodesMap,\n linksMap,\n elementType,\n idx as K1 | K2 | PromotedLinkId<K1, D2> | string | undefined\n );\n if (gesture === 'keyboard') {\n let element;\n if (focusedItemInfo.type === 'node') {\n element = rootRef.current && idx != null\n ? queryElementBySerializedDiagramKey(rootRef.current, 'data-oj-private-node', idx as K1)\n : null;\n } else if (focusedItemInfo.type === 'link') {\n element = rootRef.current && idx != null\n ? queryElementBySerializedDiagramKey(rootRef.current, 'data-oj-private-link', idx as K2)\n : null;\n } else {\n element = rootRef.current\n ? queryElementByAttributeValue(\n rootRef.current,\n 'data-oj-private-promoted-link',\n getPromotedString(idx as PromotedLinkId<K1, D2>)\n )\n : null;\n }\n return {\n type: 'element',\n context,\n elem: element ? element : null\n };\n }\n return { type: 'pointer', context };\n },\n contextMenuOptions: {\n isDisabled: !contextMenuConfig //If there is not a context menu renderer we disable the hook\n },\n rootRef,\n contextMenuConfig,\n onContextMenuDismissed\n });\n\n return { contextMenuContent, contextMenuProps };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport type { ItemInfo, PromotedLinkId } from '../diagram.types';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useTabbableModeSet } from '#hooks/PRIVATE_useTabbableModeSet';\nimport { baseStyle as focusTrackerBaseStyle } from '../../PRIVATE_FocusTracker/themes/FocusTrackerStyles.css';\nimport { getPromotedString, isSamePromotedLinkId, serializeDiagramKey } from '../utils/diagramUtils';\nimport {\n focusDiagramItemContent,\n getClosestFocusableDescendant,\n getRestorableFocusIds,\n LINK_ITEM_SELECTOR,\n NODE_ITEM_SELECTOR,\n PROMOTED_LINK_ITEM_SELECTOR\n} from '../utils/tabbableModeUtils';\n\ntype TabbableDiagramItem<K1 extends string | number, K2 extends string | number, D2> =\n | { id: K1; type: 'node' }\n | { id: K2; type: 'link' }\n | { id: PromotedLinkId<K1, D2>; type: 'promotedLink' };\n\ntype UseDiagramTabbableModeProps<K1 extends string | number, K2 extends string | number, D2> = {\n rootRef: RefObject<HTMLDivElement>;\n focusedItemInfo: ItemInfo<K1, K2, D2>;\n isTabbableModeRef: RefObject<boolean>;\n shouldIgnoreTransientBlurRef: RefObject<boolean>;\n nodeIdsByAttr: Map<string, K1>;\n linkIdsByAttr: Map<string, K2>;\n promotedLinkIdsByAttr: Map<string, PromotedLinkId<K1, D2>>;\n visibility: 'visible' | 'hidden';\n};\n\nconst DEBUG_FLAG = '__OJ_DIAGRAM_TABBABLE_DEBUG__';\nconst DEBUG_PREFIX = '[diagram tabbable debug]';\n\nconst isDebugEnabled = () => {\n const globalDebugFlag = (globalThis as typeof globalThis & Record<string, unknown>)[DEBUG_FLAG];\n return globalDebugFlag === true;\n};\n\nconst describeElement = (element: Element | null | undefined) => {\n if (element == null) {\n return null;\n }\n\n const dataNodeId = element.getAttribute('data-oj-private-node');\n const dataLinkId = element.getAttribute('data-oj-private-link');\n const dataPromotedLinkId = element.getAttribute('data-oj-private-promoted-link');\n\n return {\n tagName: element.tagName,\n id: 'id' in element ? (element as HTMLElement).id || null : null,\n role: element.getAttribute('role'),\n ariaLabel: element.getAttribute('aria-label'),\n dataNodeId,\n dataLinkId,\n dataPromotedLinkId,\n textContent: element.textContent?.trim().slice(0, 80) || null\n };\n};\n\nconst debugLog = (message: string, details?: unknown) => {\n if (!isDebugEnabled()) {\n return;\n }\n\n if (details === undefined) {\n console.log(DEBUG_PREFIX, message);\n } else {\n console.log(DEBUG_PREFIX, message, details);\n }\n};\n\nexport const useDiagramTabbableMode = <K1 extends string | number, K2 extends string | number, D2>({\n rootRef,\n focusedItemInfo,\n isTabbableModeRef,\n shouldIgnoreTransientBlurRef,\n nodeIdsByAttr,\n linkIdsByAttr,\n promotedLinkIdsByAttr,\n visibility\n}: UseDiagramTabbableModeProps<K1, K2, D2>) => {\n const [tabbableModeFocusAction, setTabbableModeFocusAction] = useState<\n 'first' | 'restore' | undefined\n >(undefined);\n const [restoreRequestCount, setRestoreRequestCount] = useState(0);\n const shouldRestoreDiagramFocusRef = useRef(false);\n const previousInnerFocusIdRef = useRef<string | null>(null);\n const previousCustomFocusIdRef = useRef<string | null>(null);\n const shouldRestoreItemOwnerFocusRef = useRef(false);\n const shouldRestoreTransientItemOwnerFocusRef = useRef(false);\n const shouldRestoreTabbableContentRef = useRef(false);\n const previousVisibilityRef = useRef<'visible' | 'hidden'>('hidden');\n const prevIsTabbableModeRef = useRef(false);\n const shouldExitTabbableModeOnRootFocusRef = useRef(false);\n const shouldFinalizeRootRestoreRef = useRef(false);\n const transientBlurTimeoutRef = useRef<number | null>(null);\n const rootEntryFirstFocusFrameRef = useRef<number | null>(null);\n const pendingFallbackFocusOwnerRef = useRef(false);\n const pendingFallbackItemRef = useRef<TabbableDiagramItem<K1, K2, D2>>();\n const pendingRestoreChildFocusRef = useRef(false);\n const hasRetriedOwnerChildFocusRef = useRef(false);\n\n const clearTransientBlurIgnore = useCallback(() => {\n shouldIgnoreTransientBlurRef.current = false;\n if (transientBlurTimeoutRef.current != null) {\n window.clearTimeout(transientBlurTimeoutRef.current);\n transientBlurTimeoutRef.current = null;\n }\n }, []);\n\n const armTransientBlurIgnore = useCallback(() => {\n shouldIgnoreTransientBlurRef.current = true;\n if (transientBlurTimeoutRef.current != null) {\n window.clearTimeout(transientBlurTimeoutRef.current);\n }\n // Ignore only the immediate blur generated by the current interaction.\n transientBlurTimeoutRef.current = window.setTimeout(() => {\n shouldIgnoreTransientBlurRef.current = false;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n transientBlurTimeoutRef.current = null;\n }, 0);\n }, []);\n\n const clearStoredFocusRestoreState = useCallback(() => {\n shouldRestoreDiagramFocusRef.current = false;\n previousInnerFocusIdRef.current = null;\n previousCustomFocusIdRef.current = null;\n shouldRestoreItemOwnerFocusRef.current = false;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n shouldRestoreTabbableContentRef.current = false;\n shouldExitTabbableModeOnRootFocusRef.current = false;\n shouldFinalizeRootRestoreRef.current = false;\n pendingFallbackFocusOwnerRef.current = false;\n pendingFallbackItemRef.current = undefined;\n pendingRestoreChildFocusRef.current = false;\n hasRetriedOwnerChildFocusRef.current = false;\n clearTransientBlurIgnore();\n }, [clearTransientBlurIgnore]);\n\n const hasStoredFocusRestoreTarget = useCallback(() => {\n return (\n shouldRestoreDiagramFocusRef.current ||\n previousInnerFocusIdRef.current != null ||\n previousCustomFocusIdRef.current != null ||\n shouldRestoreItemOwnerFocusRef.current ||\n shouldRestoreTransientItemOwnerFocusRef.current ||\n shouldRestoreTabbableContentRef.current ||\n pendingFallbackFocusOwnerRef.current ||\n pendingFallbackItemRef.current != null ||\n pendingRestoreChildFocusRef.current\n );\n }, []);\n\n const captureFocusRestoreState = useCallback(() => {\n const rootElement = rootRef.current;\n if (!rootElement) {\n return;\n }\n\n const activeElement = document.activeElement as Element | null;\n const isDiagramRootFocused = activeElement === rootElement;\n const shouldRestoreFocus =\n activeElement != null && (isDiagramRootFocused || rootElement.contains(activeElement));\n const hadStoredRestoreTarget = hasStoredFocusRestoreTarget();\n\n const { activeElementId, activeCustomElementId } = getRestorableFocusIds(\n rootElement,\n activeElement\n );\n const hasNextRestoreTarget = activeElementId != null || activeCustomElementId != null;\n const shouldRestoreItemOwnerFocus =\n shouldRestoreFocus && !isDiagramRootFocused && !hasNextRestoreTarget;\n\n // If an interaction inside tabbable content already captured a specific\n // restore target, don't overwrite it just because focus briefly bounced\n // back to the diagram root during rerender.\n if (\n isDiagramRootFocused &&\n !hasNextRestoreTarget &&\n hadStoredRestoreTarget &&\n shouldRestoreTabbableContentRef.current\n ) {\n debugLog('captureFocusRestoreState preserve root rebound', {\n activeElement: describeElement(activeElement),\n hadStoredRestoreTarget\n });\n return;\n }\n\n // During rerender, focus can momentarily fall back to body/null before the\n // diagram root becomes focusable again. Preserve the previously captured\n // target through that transient state instead of overwriting it.\n if (!shouldRestoreFocus && !hasNextRestoreTarget && hadStoredRestoreTarget) {\n debugLog('captureFocusRestoreState preserve transient blur', {\n activeElement: describeElement(activeElement),\n hadStoredRestoreTarget\n });\n armTransientBlurIgnore();\n return;\n }\n\n shouldRestoreDiagramFocusRef.current = shouldRestoreFocus;\n previousInnerFocusIdRef.current = activeElementId;\n previousCustomFocusIdRef.current = activeCustomElementId;\n shouldRestoreItemOwnerFocusRef.current = shouldRestoreItemOwnerFocus;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n shouldRestoreTabbableContentRef.current = isTabbableModeRef.current === true;\n if (shouldRestoreFocus || hasNextRestoreTarget || shouldRestoreItemOwnerFocus) {\n armTransientBlurIgnore();\n } else {\n clearTransientBlurIgnore();\n }\n\n debugLog('captureFocusRestoreState', {\n activeElement: describeElement(activeElement),\n isDiagramRootFocused,\n shouldRestoreFocus,\n activeElementId,\n activeCustomElementId,\n shouldRestoreItemOwnerFocus\n });\n }, [armTransientBlurIgnore, clearTransientBlurIgnore, hasStoredFocusRestoreTarget, rootRef]);\n\n const getTabbableItemFromElement = useCallback(\n (element: HTMLElement) => {\n const nodeElement = element.closest(NODE_ITEM_SELECTOR);\n if (nodeElement instanceof HTMLElement) {\n const nodeId = nodeIdsByAttr.get(nodeElement.getAttribute('data-oj-private-node') ?? '');\n if (nodeId != null) {\n return { id: nodeId, type: 'node' } as TabbableDiagramItem<K1, K2, D2>;\n }\n }\n\n const linkElement = element.closest(LINK_ITEM_SELECTOR);\n if (linkElement instanceof HTMLElement) {\n const linkId = linkIdsByAttr.get(linkElement.getAttribute('data-oj-private-link') ?? '');\n if (linkId != null) {\n return { id: linkId, type: 'link' } as TabbableDiagramItem<K1, K2, D2>;\n }\n }\n\n const promotedLinkElement = element.closest(PROMOTED_LINK_ITEM_SELECTOR);\n if (promotedLinkElement instanceof HTMLElement) {\n const promotedLinkId = promotedLinkIdsByAttr.get(\n promotedLinkElement.getAttribute('data-oj-private-promoted-link') ?? ''\n );\n if (promotedLinkId != null) {\n return { id: promotedLinkId, type: 'promotedLink' } as TabbableDiagramItem<K1, K2, D2>;\n }\n }\n\n return null;\n },\n [linkIdsByAttr, nodeIdsByAttr, promotedLinkIdsByAttr]\n );\n\n const shouldIgnoreTransientBlur = useCallback(\n (event: FocusEvent) => {\n const currentTarget = event.currentTarget;\n const relatedTarget = event.relatedTarget as Element | null;\n return (\n shouldIgnoreTransientBlurRef.current &&\n currentTarget === rootRef.current &&\n (relatedTarget == null ||\n (currentTarget instanceof Element &&\n relatedTarget === currentTarget.ownerDocument.body)) &&\n hasStoredFocusRestoreTarget()\n );\n },\n [hasStoredFocusRestoreTarget, rootRef]\n );\n\n const getCurrentTabbableItemElement = useCallback(\n (item?: TabbableDiagramItem<K1, K2, D2>) => {\n const rootElement = rootRef.current;\n if (!rootElement || item == null) {\n return null;\n }\n\n const selector =\n item.type === 'node'\n ? NODE_ITEM_SELECTOR\n : item.type === 'link'\n ? LINK_ITEM_SELECTOR\n : PROMOTED_LINK_ITEM_SELECTOR;\n const attrName =\n item.type === 'node'\n ? 'data-oj-private-node'\n : item.type === 'link'\n ? 'data-oj-private-link'\n : 'data-oj-private-promoted-link';\n const attrValue =\n item.type === 'promotedLink'\n ? getPromotedString(item.id as PromotedLinkId<K1, D2>)\n : serializeDiagramKey(item.id);\n\n for (const element of rootElement.querySelectorAll(selector)) {\n if (element.getAttribute(attrName) === attrValue) {\n return element;\n }\n }\n\n return null;\n },\n [rootRef]\n );\n\n const isSameTabbableItem = useCallback(\n (\n item1?: TabbableDiagramItem<K1, K2, D2> | null,\n item2?: TabbableDiagramItem<K1, K2, D2> | null\n ) => {\n return (\n item1?.type === item2?.type &&\n (item1?.type === 'promotedLink'\n ? isSamePromotedLinkId<K1, D2>(item1?.id, item2?.id)\n : item1?.id === item2?.id)\n );\n },\n []\n );\n\n const focusedTabbableItem = useMemo(\n () =>\n focusedItemInfo.type === 'node' ||\n focusedItemInfo.type === 'link' ||\n focusedItemInfo.type === 'promotedLink'\n ? ({\n id: focusedItemInfo.id,\n type: focusedItemInfo.type\n } as TabbableDiagramItem<K1, K2, D2>)\n : undefined,\n [focusedItemInfo]\n );\n\n const [isCurrentTabbableItem, rawTabbableSetProps, getCurrentTabbableKey, setCurrentTabbableKey] =\n useTabbableModeSet<TabbableDiagramItem<K1, K2, D2>>(\n rootRef,\n getTabbableItemFromElement,\n focusedTabbableItem,\n undefined,\n undefined,\n isSameTabbableItem\n );\n const currentTabbableItem = getCurrentTabbableKey() ?? focusedTabbableItem;\n const isTabbableMode = isCurrentTabbableItem(currentTabbableItem);\n isTabbableModeRef.current = isTabbableMode;\n\n const captureFocusRestoreStateFromTarget = useCallback(\n (target: EventTarget | null) => {\n const rootElement = rootRef.current;\n if (!(target instanceof Element) || rootElement == null || !rootElement.contains(target)) {\n return false;\n }\n\n const restorableTarget = getClosestFocusableDescendant(target) ?? target;\n const focusedItemElement = restorableTarget.closest(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n );\n if (focusedItemElement == null) {\n return false;\n }\n if (focusedItemElement instanceof HTMLElement) {\n const targetItem = getTabbableItemFromElement(focusedItemElement);\n if (targetItem != null) {\n setCurrentTabbableKey(targetItem);\n }\n }\n\n const { activeElementId, activeCustomElementId } = getRestorableFocusIds(\n rootElement,\n restorableTarget\n );\n const hasRestoreTarget = activeElementId != null || activeCustomElementId != null;\n\n shouldRestoreDiagramFocusRef.current = false;\n previousInnerFocusIdRef.current = activeElementId;\n previousCustomFocusIdRef.current = activeCustomElementId;\n shouldRestoreItemOwnerFocusRef.current = !hasRestoreTarget;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n shouldRestoreTabbableContentRef.current = isTabbableModeRef.current === true;\n shouldFinalizeRootRestoreRef.current = false;\n if (!hasRestoreTarget && isTabbableModeRef.current) {\n setTabbableModeFocusAction('restore');\n }\n armTransientBlurIgnore();\n debugLog('captureFocusRestoreStateFromTarget', {\n target: describeElement(target),\n restorableTarget: describeElement(restorableTarget),\n focusedItemElement: describeElement(focusedItemElement),\n activeElementId,\n activeCustomElementId,\n hasRestoreTarget,\n shouldRestoreItemOwnerFocus: !hasRestoreTarget,\n isTabbableMode: isTabbableModeRef.current\n });\n return true;\n },\n [\n armTransientBlurIgnore,\n getTabbableItemFromElement,\n isTabbableModeRef,\n rootRef,\n setCurrentTabbableKey\n ]\n );\n\n const syncTabbableModeFromTarget = useCallback(\n (target: EventTarget | null) => {\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n const targetItem = getTabbableItemFromElement(target);\n if (targetItem == null) {\n return;\n }\n\n if (\n target.matches(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n )\n ) {\n setCurrentTabbableKey(undefined);\n isTabbableModeRef.current = false;\n } else {\n setCurrentTabbableKey(targetItem);\n isTabbableModeRef.current = true;\n }\n\n debugLog('syncTabbableModeFromTarget', {\n target: describeElement(target),\n targetItem,\n enteredInnerFocus: !target.matches(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n )\n });\n },\n [getTabbableItemFromElement, isTabbableModeRef, setCurrentTabbableKey]\n );\n\n const handleInnerFocusKeyDownCapture = useCallback(\n (event: KeyboardEvent) => {\n const targetItem =\n event.target instanceof HTMLElement ? getTabbableItemFromElement(event.target) : null;\n if (targetItem == null) {\n return false;\n }\n\n if (event.key === 'F2') {\n event.preventDefault();\n event.stopPropagation();\n if (isCurrentTabbableItem(targetItem)) {\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n clearStoredFocusRestoreState();\n window.setTimeout(() => {\n rootRef.current?.focus({ preventScroll: true });\n }, 0);\n } else {\n setCurrentTabbableKey(targetItem);\n isTabbableModeRef.current = true;\n setTabbableModeFocusAction('first');\n }\n debugLog('handleInnerFocusKeyDownCapture F2', {\n target: describeElement(event.target as Element | null),\n targetItem,\n wasCurrentTabbable: isCurrentTabbableItem(targetItem)\n });\n return true;\n }\n\n if (event.key === 'Esc' || event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n clearStoredFocusRestoreState();\n window.setTimeout(() => {\n rootRef.current?.focus({ preventScroll: true });\n }, 0);\n debugLog('handleInnerFocusKeyDownCapture Escape', {\n target: describeElement(event.target as Element | null),\n targetItem\n });\n return true;\n }\n\n return false;\n },\n [\n clearStoredFocusRestoreState,\n getTabbableItemFromElement,\n isCurrentTabbableItem,\n isTabbableModeRef,\n rootRef,\n setCurrentTabbableKey\n ]\n );\n\n const tabbableSetProps = useMemo(\n () => ({\n ...rawTabbableSetProps,\n onFocus: (event: FocusEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n if (target === rootRef.current) {\n if (shouldExitTabbableModeOnRootFocusRef.current) {\n shouldExitTabbableModeOnRootFocusRef.current = false;\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n } else if (\n shouldRestoreTabbableContentRef.current &&\n hasStoredFocusRestoreTarget() &&\n currentTabbableItem?.type === 'node'\n ) {\n isTabbableModeRef.current = true;\n setCurrentTabbableKey(currentTabbableItem);\n setTabbableModeFocusAction('restore');\n setRestoreRequestCount((count) => count + 1);\n }\n debugLog('tabbableSetProps.onFocus root', {\n target: describeElement(target),\n shouldExitTabbableModeOnRootFocus: shouldExitTabbableModeOnRootFocusRef.current,\n hasStoredFocusRestoreTarget: hasStoredFocusRestoreTarget(),\n currentTabbableItem\n });\n rawTabbableSetProps.onFocus(event);\n return;\n }\n\n const isDiagramItemWrapper = target.matches(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n );\n if (!isDiagramItemWrapper) {\n if (hasStoredFocusRestoreTarget()) {\n clearStoredFocusRestoreState();\n }\n rawTabbableSetProps.onFocus(event);\n if (target instanceof HTMLElement) {\n const targetItem = getTabbableItemFromElement(target);\n if (targetItem != null) {\n setCurrentTabbableKey(targetItem);\n }\n }\n isTabbableModeRef.current = true;\n debugLog('tabbableSetProps.onFocus inner content', {\n target: describeElement(target),\n currentActiveElement: describeElement(document.activeElement as Element | null)\n });\n }\n },\n onKeyDown: (event: KeyboardEvent) => {\n if (handleInnerFocusKeyDownCapture(event)) {\n return;\n }\n\n if (event.target === rootRef.current && event.key === 'F2' && currentTabbableItem != null) {\n if (!isCurrentTabbableItem(currentTabbableItem)) {\n isTabbableModeRef.current = true;\n setTabbableModeFocusAction('first');\n } else {\n setTabbableModeFocusAction(undefined);\n }\n }\n\n rawTabbableSetProps.onKeyDown(event);\n },\n onBlur: (event: FocusEvent) => {\n // During expand/collapse rerender, the focused child can disappear before\n // the root regains focus. Ignore that transient blur if we already know\n // how to restore focus once rendering completes.\n if (shouldIgnoreTransientBlur(event)) {\n debugLog('tabbableSetProps.onBlur ignored transient blur', {\n target: describeElement(event.target as Element | null),\n relatedTarget: describeElement(event.relatedTarget as Element | null),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n return;\n }\n\n const currentTarget = event.currentTarget as Element | null;\n const relatedTarget = event.relatedTarget as Element | null;\n if (\n currentTarget == null ||\n relatedTarget == null ||\n !currentTarget.contains(relatedTarget)\n ) {\n isTabbableModeRef.current = false;\n }\n debugLog('tabbableSetProps.onBlur', {\n target: describeElement(event.target as Element | null),\n relatedTarget: describeElement(relatedTarget),\n activeElement: describeElement(document.activeElement as Element | null),\n exitedTabbableMode:\n currentTarget == null || relatedTarget == null || !currentTarget.contains(relatedTarget)\n });\n rawTabbableSetProps.onBlur(event);\n }\n }),\n [\n clearStoredFocusRestoreState,\n currentTabbableItem,\n getTabbableItemFromElement,\n handleInnerFocusKeyDownCapture,\n hasStoredFocusRestoreTarget,\n isCurrentTabbableItem,\n isTabbableModeRef,\n rawTabbableSetProps,\n rootRef,\n setCurrentTabbableKey,\n shouldIgnoreTransientBlur\n ]\n );\n\n const onTabbableModeFocusFailure = useCallback(\n (detail?: { focusOwner?: boolean }) => {\n const rootElement = rootRef.current;\n const shouldFocusOwner = detail?.focusOwner === true;\n const fallbackItem = currentTabbableItem;\n const ownerElement = getCurrentTabbableItemElement(fallbackItem) as\n | (Element & { focus?: (options?: FocusOptions) => void })\n | null;\n const focusTarget =\n shouldFocusOwner && ownerElement && typeof ownerElement.focus === 'function'\n ? ownerElement\n : rootElement;\n\n pendingFallbackFocusOwnerRef.current = shouldFocusOwner;\n pendingFallbackItemRef.current = fallbackItem;\n pendingRestoreChildFocusRef.current =\n shouldFocusOwner && fallbackItem?.type === 'node' && !hasRetriedOwnerChildFocusRef.current;\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n shouldRestoreDiagramFocusRef.current = false;\n if (!shouldFocusOwner) {\n previousInnerFocusIdRef.current = null;\n previousCustomFocusIdRef.current = null;\n }\n shouldRestoreItemOwnerFocusRef.current = false;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n shouldExitTabbableModeOnRootFocusRef.current = false;\n shouldFinalizeRootRestoreRef.current = false;\n clearTransientBlurIgnore();\n if (focusTarget != null) {\n setRestoreRequestCount((count) => count + 1);\n }\n debugLog('onTabbableModeFocusFailure', {\n currentTabbableItem: fallbackItem,\n shouldFocusOwner,\n ownerElement: describeElement(ownerElement),\n rootElement: describeElement(rootElement),\n scheduledFocusTarget: describeElement(focusTarget),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n },\n [\n clearStoredFocusRestoreState,\n currentTabbableItem,\n getCurrentTabbableItemElement,\n isTabbableModeRef,\n rootRef,\n setCurrentTabbableKey\n ]\n );\n\n const requestFocusRestore = useCallback(() => {\n if (isTabbableModeRef.current || shouldRestoreTabbableContentRef.current) {\n setTabbableModeFocusAction('restore');\n } else {\n shouldFinalizeRootRestoreRef.current = true;\n }\n setRestoreRequestCount((count) => count + 1);\n debugLog('requestFocusRestore', {\n isTabbableMode: isTabbableModeRef.current,\n activeElement: describeElement(document.activeElement as Element | null)\n });\n }, [isTabbableModeRef]);\n\n const restoreDiagramRootFocus = useCallback(() => {\n const rootElement = rootRef.current;\n if (!rootElement || rootElement.style.visibility === 'hidden') {\n return false;\n }\n\n shouldExitTabbableModeOnRootFocusRef.current = false;\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n rootElement.focus({ preventScroll: true });\n clearStoredFocusRestoreState();\n shouldFinalizeRootRestoreRef.current = false;\n debugLog('restoreDiagramRootFocus', {\n rootElement: describeElement(rootElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n return true;\n }, [clearStoredFocusRestoreState, isTabbableModeRef, rootRef, setCurrentTabbableKey]);\n\n useLayoutEffect(() => {\n if (visibility === 'hidden' && previousVisibilityRef.current !== 'hidden') {\n captureFocusRestoreState();\n if (isTabbableModeRef.current) {\n setTabbableModeFocusAction('restore');\n }\n } else if (visibility === 'visible' && previousVisibilityRef.current === 'hidden') {\n if (hasStoredFocusRestoreTarget()) {\n if (isTabbableMode) {\n shouldRestoreDiagramFocusRef.current = false;\n shouldFinalizeRootRestoreRef.current = false;\n shouldExitTabbableModeOnRootFocusRef.current = false;\n if (tabbableModeFocusAction !== 'restore') {\n setTabbableModeFocusAction('restore');\n }\n } else {\n shouldRestoreDiagramFocusRef.current = true;\n shouldFinalizeRootRestoreRef.current = true;\n }\n }\n }\n previousVisibilityRef.current = visibility;\n }, [\n captureFocusRestoreState,\n hasStoredFocusRestoreTarget,\n isTabbableMode,\n isTabbableModeRef,\n tabbableModeFocusAction,\n visibility\n ]);\n\n useLayoutEffect(() => {\n const rootElement = rootRef.current;\n if (!rootElement || rootElement.style.visibility === 'hidden') {\n return;\n }\n\n if (pendingFallbackItemRef.current != null || pendingFallbackFocusOwnerRef.current) {\n const fallbackItem = pendingFallbackItemRef.current;\n const shouldFocusOwner = pendingFallbackFocusOwnerRef.current;\n const ownerElement = getCurrentTabbableItemElement(fallbackItem) as\n | (Element & { focus?: (options?: FocusOptions) => void })\n | null;\n\n debugLog('pending fallback attempt', {\n fallbackItem,\n shouldFocusOwner,\n ownerElement: describeElement(ownerElement),\n rootElement: describeElement(rootElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n\n if (\n shouldFocusOwner &&\n ownerElement != null &&\n ownerElement.isConnected &&\n typeof ownerElement.focus === 'function'\n ) {\n ownerElement.focus({ preventScroll: true });\n if (document.activeElement === ownerElement) {\n debugLog('pending fallback focused owner', {\n ownerElement: describeElement(ownerElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n pendingFallbackFocusOwnerRef.current = false;\n pendingFallbackItemRef.current = undefined;\n if (pendingRestoreChildFocusRef.current && fallbackItem != null) {\n hasRetriedOwnerChildFocusRef.current = true;\n isTabbableModeRef.current = true;\n setCurrentTabbableKey(fallbackItem);\n setTabbableModeFocusAction('restore');\n const didRestoreOwnerChildFocus =\n fallbackItem.type === 'node'\n ? focusDiagramItemContent({\n contentElement: ownerElement,\n focusAction: 'restore',\n restoreElementId: previousInnerFocusIdRef.current,\n restoreCustomElementId: previousCustomFocusIdRef.current,\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n })\n : false;\n if (didRestoreOwnerChildFocus) {\n pendingRestoreChildFocusRef.current = false;\n debugLog('pending fallback restored owner child focus immediately', {\n fallbackItem,\n ownerElement: describeElement(ownerElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n clearStoredFocusRestoreState();\n return;\n }\n setRestoreRequestCount((count) => count + 1);\n debugLog('pending fallback retry child restore', {\n fallbackItem,\n ownerElement: describeElement(ownerElement),\n restoreElementId: previousInnerFocusIdRef.current,\n restoreCustomElementId: previousCustomFocusIdRef.current\n });\n return;\n }\n clearStoredFocusRestoreState();\n return;\n }\n }\n\n if (rootElement.style.visibility !== 'hidden') {\n rootElement.focus({ preventScroll: true });\n if (document.activeElement === rootElement) {\n debugLog('pending fallback focused root', {\n rootElement: describeElement(rootElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n clearStoredFocusRestoreState();\n return;\n }\n }\n\n debugLog('pending fallback did not focus target', {\n fallbackItem,\n shouldFocusOwner,\n ownerElement: describeElement(ownerElement),\n rootElement: describeElement(rootElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n }\n\n const activeElement = document.activeElement as Element | null;\n const isFocusOutsideDiagram =\n activeElement == null ||\n activeElement === rootElement.ownerDocument.body ||\n !rootElement.contains(activeElement);\n\n const shouldRestoreOwnerFocus =\n (shouldRestoreItemOwnerFocusRef.current ||\n (shouldRestoreTransientItemOwnerFocusRef.current &&\n shouldIgnoreTransientBlurRef.current)) &&\n isFocusOutsideDiagram;\n const shouldRestoreDiagramFocus =\n shouldRestoreDiagramFocusRef.current || shouldRestoreOwnerFocus;\n const hasStoredRestoreTarget = hasStoredFocusRestoreTarget();\n\n debugLog('restore effect enter', {\n activeElement: describeElement(activeElement),\n isTabbableMode,\n currentTabbableItem,\n shouldRestoreDiagramFocus: shouldRestoreDiagramFocusRef.current,\n shouldRestoreOwnerFocus,\n shouldRestoreTransientItemOwnerFocus: shouldRestoreTransientItemOwnerFocusRef.current,\n shouldFinalizeRootRestore: shouldFinalizeRootRestoreRef.current,\n previousInnerFocusId: previousInnerFocusIdRef.current,\n previousCustomFocusId: previousCustomFocusIdRef.current,\n tabbableModeFocusAction,\n restoreRequestCount,\n hasStoredRestoreTarget\n });\n\n if (\n activeElement === rootElement &&\n hasStoredRestoreTarget &&\n shouldRestoreTabbableContentRef.current &&\n currentTabbableItem?.type === 'node'\n ) {\n const contentElement = getCurrentTabbableItemElement(currentTabbableItem);\n const didRestoreFromRoot = focusDiagramItemContent({\n contentElement,\n focusAction: 'restore',\n restoreElementId: previousInnerFocusIdRef.current,\n restoreCustomElementId: previousCustomFocusIdRef.current,\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n });\n\n if (didRestoreFromRoot) {\n isTabbableModeRef.current = true;\n setCurrentTabbableKey(currentTabbableItem);\n clearStoredFocusRestoreState();\n debugLog('restore effect restored owner child focus from root', {\n contentElement: describeElement(contentElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n return;\n }\n }\n\n if (\n hasStoredRestoreTarget &&\n !pendingRestoreChildFocusRef.current &&\n !shouldFinalizeRootRestoreRef.current &&\n !shouldRestoreOwnerFocus\n ) {\n if (\n !shouldIgnoreTransientBlurRef.current &&\n activeElement != null &&\n rootElement.contains(activeElement) &&\n activeElement !== rootElement\n ) {\n clearStoredFocusRestoreState();\n }\n debugLog('restore effect early return', {\n activeElement: describeElement(activeElement),\n hasStoredRestoreTarget,\n shouldFinalizeRootRestore: shouldFinalizeRootRestoreRef.current,\n shouldRestoreOwnerFocus,\n shouldIgnoreTransientBlur: shouldIgnoreTransientBlurRef.current\n });\n return;\n }\n\n if (isTabbableMode && shouldRestoreOwnerFocus) {\n const contentElement = getCurrentTabbableItemElement(currentTabbableItem);\n const didFocus =\n currentTabbableItem != null\n ? focusDiagramItemContent({\n contentElement,\n focusAction: 'restore',\n restoreElementId: previousInnerFocusIdRef.current,\n restoreCustomElementId: previousCustomFocusIdRef.current,\n focusScopeSelector:\n currentTabbableItem.type === 'node' ? `.${focusTrackerBaseStyle}` : undefined\n })\n : false;\n\n if (didFocus) {\n clearStoredFocusRestoreState();\n debugLog('restore effect restored owner child focus', {\n contentElement: describeElement(contentElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n return;\n }\n\n debugLog('restore effect owner child restore failed, falling back to root', {\n contentElement: describeElement(contentElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n restoreDiagramRootFocus();\n return;\n }\n\n if (!isTabbableMode) {\n const hasStoredInnerRestoreTarget =\n previousInnerFocusIdRef.current != null ||\n previousCustomFocusIdRef.current != null ||\n shouldRestoreItemOwnerFocusRef.current ||\n shouldRestoreTransientItemOwnerFocusRef.current;\n if (\n shouldRestoreDiagramFocus &&\n hasStoredInnerRestoreTarget &&\n shouldRestoreTabbableContentRef.current &&\n currentTabbableItem?.type === 'node' &&\n activeElement === rootElement\n ) {\n isTabbableModeRef.current = true;\n setCurrentTabbableKey(currentTabbableItem);\n setTabbableModeFocusAction('restore');\n setRestoreRequestCount((count) => count + 1);\n debugLog('restore effect re-entered tabbable mode from root focus', {\n currentTabbableItem,\n activeElement: describeElement(activeElement)\n });\n return;\n }\n shouldExitTabbableModeOnRootFocusRef.current = false;\n if (shouldRestoreDiagramFocus) {\n rootElement.focus({ preventScroll: true });\n debugLog('restore effect focused root while not in tabbable mode', {\n activeElement: describeElement(document.activeElement as Element | null)\n });\n }\n if (\n !shouldRestoreDiagramFocus ||\n shouldFinalizeRootRestoreRef.current ||\n shouldRestoreOwnerFocus\n ) {\n clearStoredFocusRestoreState();\n shouldFinalizeRootRestoreRef.current = false;\n }\n return;\n }\n\n if (shouldRestoreDiagramFocus) {\n restoreDiagramRootFocus();\n return;\n }\n }, [\n clearStoredFocusRestoreState,\n currentTabbableItem,\n getCurrentTabbableItemElement,\n hasStoredFocusRestoreTarget,\n isTabbableMode,\n restoreRequestCount,\n rootRef,\n restoreDiagramRootFocus,\n tabbableModeFocusAction,\n visibility\n ]);\n\n useEffect(() => {\n if (isTabbableMode !== prevIsTabbableModeRef.current) {\n if (isTabbableMode) {\n setTabbableModeFocusAction('first');\n } else {\n setTabbableModeFocusAction(undefined);\n }\n prevIsTabbableModeRef.current = isTabbableMode;\n }\n }, [isTabbableMode]);\n\n useEffect(() => {\n if (rootEntryFirstFocusFrameRef.current != null) {\n window.cancelAnimationFrame(rootEntryFirstFocusFrameRef.current);\n rootEntryFirstFocusFrameRef.current = null;\n }\n\n const rootElement = rootRef.current;\n if (\n !rootElement ||\n !isTabbableMode ||\n tabbableModeFocusAction !== 'first' ||\n currentTabbableItem == null ||\n document.activeElement !== rootElement\n ) {\n return;\n }\n\n rootEntryFirstFocusFrameRef.current = window.requestAnimationFrame(() => {\n rootEntryFirstFocusFrameRef.current = window.requestAnimationFrame(() => {\n rootEntryFirstFocusFrameRef.current = null;\n const currentRootElement = rootRef.current;\n if (!currentRootElement || document.activeElement !== currentRootElement) {\n return;\n }\n\n const contentElement = getCurrentTabbableItemElement(currentTabbableItem);\n const didFocus =\n currentTabbableItem.type === 'node'\n ? focusDiagramItemContent({\n contentElement,\n focusAction: 'first',\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n })\n : focusDiagramItemContent({\n contentElement,\n focusAction: 'first'\n });\n\n if (!didFocus) {\n return;\n }\n\n debugLog('root entry focused first tabbable', {\n currentTabbableItem,\n contentElement: describeElement(contentElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n });\n });\n\n return () => {\n if (rootEntryFirstFocusFrameRef.current != null) {\n window.cancelAnimationFrame(rootEntryFirstFocusFrameRef.current);\n rootEntryFirstFocusFrameRef.current = null;\n }\n };\n }, [\n currentTabbableItem,\n getCurrentTabbableItemElement,\n isTabbableMode,\n rootRef,\n tabbableModeFocusAction\n ]);\n\n useEffect(() => {\n if (!isTabbableMode && !hasStoredFocusRestoreTarget()) {\n clearStoredFocusRestoreState();\n }\n }, [clearStoredFocusRestoreState, hasStoredFocusRestoreTarget, isTabbableMode]);\n\n useEffect(() => {\n if (visibility === 'visible' && isTabbableMode && tabbableModeFocusAction != null) {\n setTabbableModeFocusAction(undefined);\n }\n }, [isTabbableMode, tabbableModeFocusAction, visibility]);\n\n useEffect(() => {\n return () => {\n if (rootEntryFirstFocusFrameRef.current != null) {\n window.cancelAnimationFrame(rootEntryFirstFocusFrameRef.current);\n }\n if (transientBlurTimeoutRef.current != null) {\n window.clearTimeout(transientBlurTimeoutRef.current);\n }\n };\n }, []);\n\n return {\n captureFocusRestoreState,\n captureFocusRestoreStateFromTarget,\n handleInnerFocusKeyDownCapture,\n isTabbableMode,\n onTabbableModeFocusFailure,\n requestFocusRestore,\n syncTabbableModeFromTarget,\n tabbableModeFocusAction,\n tabbableModeRestoreCustomElementId: previousCustomFocusIdRef.current,\n tabbableModeRestoreElementId: previousInnerFocusIdRef.current,\n tabbableSetProps\n };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport type {\n Bounds,\n DiagramNodeData,\n DiagramLinkData,\n PromotedLinkId,\n DiagramDragStartDetail,\n DiagramDropDetail\n} from '../diagram.types';\nimport {\n getMapEntryBySerializedKey,\n getPromotedString,\n serializeDiagramKey\n} from '../utils/diagramUtils';\n\nconst DROP_OFFSET_X_DATA_TYPE = 'text/_dvtDropOffsetX';\nconst DROP_OFFSET_Y_DATA_TYPE = 'text/_dvtDropOffsetY';\n\nconst getClientCoordinate = (value?: number, fallback?: number) => value ?? fallback ?? 0;\nconst getSafeZoom = (zoom: number) => (Number.isFinite(zoom) && zoom !== 0 ? zoom : 1);\nconst getClosestElement = (target: EventTarget | null, selector: string) => {\n if (target instanceof Element) {\n return target.closest(selector);\n }\n\n if (target instanceof Node) {\n return target.parentElement?.closest(selector) ?? null;\n }\n\n return null;\n};\n\nconst getElementBounds = (element: Element) => {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height\n };\n};\n\nconst getOutlineOverflow = (element: HTMLElement) => {\n const computedStyle = window.getComputedStyle(element);\n const outlineWidth = Number.parseFloat(computedStyle.outlineWidth || '0') || 0;\n const outlineOffset = Number.parseFloat(computedStyle.outlineOffset || '0') || 0;\n return outlineWidth + Math.max(0, outlineOffset);\n};\n\nconst getVisualBounds = (element: HTMLElement) => {\n const rootBounds = getElementBounds(element);\n const rootOverflow = getOutlineOverflow(element);\n let left = rootBounds.left - rootOverflow;\n let top = rootBounds.top - rootOverflow;\n let right = rootBounds.right + rootOverflow;\n let bottom = rootBounds.bottom + rootOverflow;\n const stack = Array.from(element.children) as HTMLElement[];\n\n while (stack.length > 0) {\n const currentElement = stack.pop()!;\n const bounds = getElementBounds(currentElement);\n left = Math.min(left, bounds.left);\n top = Math.min(top, bounds.top);\n right = Math.max(right, bounds.right);\n bottom = Math.max(bottom, bounds.bottom);\n\n const overflow = getOutlineOverflow(currentElement);\n if (overflow > 0) {\n left = Math.min(left, bounds.left - overflow);\n top = Math.min(top, bounds.top - overflow);\n right = Math.max(right, bounds.right + overflow);\n bottom = Math.max(bottom, bounds.bottom + overflow);\n }\n\n stack.push(...(Array.from(currentElement.children) as HTMLElement[]));\n }\n\n return {\n left,\n top,\n right,\n bottom,\n width: right - left,\n height: bottom - top\n };\n};\n\nconst applyOutlineAsBoxShadow = (source: HTMLElement, clone: HTMLElement) => {\n const sourceElements = [source, ...Array.from(source.querySelectorAll<HTMLElement>('*'))];\n const cloneElements = [clone, ...Array.from(clone.querySelectorAll<HTMLElement>('*'))];\n\n sourceElements.forEach((sourceElement, index) => {\n const cloneElement = cloneElements[index];\n if (!cloneElement) {\n return;\n }\n const computedStyle = window.getComputedStyle(sourceElement);\n const outlineStyle = computedStyle.outlineStyle;\n const outlineWidth = Number.parseFloat(computedStyle.outlineWidth || '0') || 0;\n const outlineOffset = Number.parseFloat(computedStyle.outlineOffset || '0') || 0;\n const outlineColor = computedStyle.outlineColor;\n\n if (outlineStyle === 'none' || outlineWidth === 0) {\n return;\n }\n\n const spread = outlineWidth + Math.max(0, outlineOffset);\n const existingBoxShadow = computedStyle.boxShadow;\n const outlineShadow = `0 0 0 ${spread}px ${outlineColor}`;\n cloneElement.style.boxShadow =\n existingBoxShadow && existingBoxShadow !== 'none'\n ? `${existingBoxShadow}, ${outlineShadow}`\n : outlineShadow;\n cloneElement.style.outline = 'none';\n });\n};\n\nfunction getMinimumNodePosition<K>(nodeBounds: Map<K, Bounds>) {\n let minX = Infinity;\n let minY = Infinity;\n\n nodeBounds.forEach((bounds) => {\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n });\n\n return {\n minX: minX === Infinity ? 0 : minX,\n minY: minY === Infinity ? 0 : minY\n };\n}\n\nfunction getDiagramPointerPosition<K>(\n event: DragEvent,\n rootRef: RefObject<HTMLDivElement>,\n nodeBounds: Map<K, Bounds>,\n panX: number,\n panY: number,\n zoom: number\n) {\n const safePanX = Number.isFinite(panX) ? panX : 0;\n const safePanY = Number.isFinite(panY) ? panY : 0;\n const safeZoom = getSafeZoom(zoom);\n const rootRect = rootRef.current?.getBoundingClientRect();\n const clientX = getClientCoordinate(event.clientX, event.offsetX);\n const clientY = getClientCoordinate(event.clientY, event.offsetY);\n const { minX, minY } = getMinimumNodePosition(nodeBounds);\n const relativeX = rootRect\n ? (clientX - rootRect.left - safePanX) / safeZoom\n : (event.offsetX - safePanX) / safeZoom;\n const relativeY = rootRect\n ? (clientY - rootRect.top - safePanY) / safeZoom\n : (event.offsetY - safePanY) / safeZoom;\n\n return {\n clientX,\n clientY,\n x: relativeX + minX,\n y: relativeY + minY\n };\n}\n\nexport function setDiagramDropOffset<\n K1 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n event: DragEvent,\n rootRef: RefObject<HTMLDivElement>,\n context: DiagramDragStartDetail<D1>,\n nodeBounds: Map<K1, Bounds>,\n panX: number,\n panY: number,\n zoom: number\n) {\n if (!context || context.type !== 'nodes') {\n return;\n }\n\n const draggedNodeBounds = context.nodes\n .map(({ data }) => nodeBounds.get(data.id))\n .filter((bounds): bounds is Bounds => bounds !== undefined);\n if (draggedNodeBounds.length === 0) {\n return;\n }\n\n const contentMinX = Math.min(...draggedNodeBounds.map((bounds) => bounds.x));\n const contentMinY = Math.min(...draggedNodeBounds.map((bounds) => bounds.y));\n const pointerPosition = getDiagramPointerPosition(event, rootRef, nodeBounds, panX, panY, zoom);\n\n event.dataTransfer?.setData(DROP_OFFSET_X_DATA_TYPE, String(contentMinX - pointerPosition.x));\n event.dataTransfer?.setData(DROP_OFFSET_Y_DATA_TYPE, String(contentMinY - pointerPosition.y));\n}\n\nexport function getDiagramDragContext<\n K1 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n target: EventTarget,\n event: DragEvent,\n selectedNodeIds: Set<K1>,\n nodesMap: Map<K1, D1>,\n nodeBounds: Map<K1, Bounds>,\n nodeDraggable?: (data: D1) => 'on' | 'off'\n) {\n const nodeElement = getClosestElement(target, '[data-oj-private-node]') as HTMLElement | null;\n const nodeEntry = getMapEntryBySerializedKey(nodesMap, nodeElement?.dataset['ojPrivateNode']);\n if (!nodeEntry || !nodeDraggable || nodeDraggable(nodeEntry.value) !== 'on') {\n return undefined;\n }\n\n const draggedNodes =\n selectedNodeIds.size > 1 && selectedNodeIds.has(nodeEntry.key)\n ? Array.from(selectedNodeIds)\n .map((id) => {\n const data = nodesMap.get(id);\n const bounds = nodeBounds.get(id);\n if (!data || !bounds || nodeDraggable(data) !== 'on') {\n return null;\n }\n return { data, bounds };\n })\n .filter((item): item is { data: D1; bounds: Bounds } => item !== null)\n : [{ data: nodeEntry.value, bounds: nodeBounds.get(nodeEntry.key) }];\n\n const validDraggedNodes = draggedNodes.filter(\n (item): item is { data: D1; bounds: Bounds } => item.bounds !== undefined\n );\n if (validDraggedNodes.length === 0) {\n return undefined;\n }\n\n const minX = Math.min(...validDraggedNodes.map((item) => item.bounds.x));\n const minY = Math.min(...validDraggedNodes.map((item) => item.bounds.y));\n\n return {\n type: 'nodes',\n nodes: validDraggedNodes.map(({ data, bounds }) => ({\n data,\n nodeOffset: {\n x: bounds.x - minX,\n y: bounds.y - minY\n }\n })),\n event\n } as DiagramDragStartDetail<D1>;\n}\n\nexport function getDiagramDropContext<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n event: DragEvent,\n rootRef: RefObject<HTMLDivElement>,\n nodesMap: Map<K1, D1>,\n linksMap: Map<K2, D2>,\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeBounds: Map<K1, Bounds>,\n panX: number,\n panY: number,\n zoom: number\n) {\n const pointerPosition = getDiagramPointerPosition(event, rootRef, nodeBounds, panX, panY, zoom);\n const safeZoom = getSafeZoom(zoom);\n const clientX = pointerPosition.clientX;\n const clientY = pointerPosition.clientY;\n const target = event.target as HTMLElement | null;\n const offsetX =\n event.type === 'drop' ? Number(event.dataTransfer?.getData(DROP_OFFSET_X_DATA_TYPE)) || 0 : 0;\n const offsetY =\n event.type === 'drop' ? Number(event.dataTransfer?.getData(DROP_OFFSET_Y_DATA_TYPE)) || 0 : 0;\n const x = pointerPosition.x + offsetX;\n const y = pointerPosition.y + offsetY;\n const nodeElement = getClosestElement(target, '[data-oj-private-node]') as HTMLElement | null;\n\n const nodeEntry = getMapEntryBySerializedKey(\n nodesMap,\n nodeElement?.getAttribute('data-oj-private-node')\n );\n if (nodeEntry) {\n const bounds = nodeBounds.get(nodeEntry.key);\n const nodeRect = nodeElement?.getBoundingClientRect();\n const nodeX = nodeRect\n ? (clientX - nodeRect.left) / safeZoom + offsetX\n : bounds\n ? x - bounds.x\n : x;\n const nodeY = nodeRect\n ? (clientY - nodeRect.top) / safeZoom + offsetY\n : bounds\n ? y - bounds.y\n : y;\n return {\n type: 'node',\n x: bounds ? bounds.x + nodeX : x,\n y: bounds ? bounds.y + nodeY : y,\n nodeX,\n nodeY,\n data: nodeEntry.value,\n event\n } as DiagramDropDetail<K1, D1, D2>;\n }\n\n const linkEntry = getMapEntryBySerializedKey(\n linksMap,\n getClosestElement(target, '[data-oj-private-link]')?.getAttribute('data-oj-private-link')\n );\n if (linkEntry) {\n return {\n type: 'link',\n data: linkEntry.value,\n event\n } as DiagramDropDetail<K1, D1, D2>;\n }\n\n const promotedLinkEntry = promotedLinks.find(\n (link) =>\n getPromotedString(link) ===\n getClosestElement(target, '[data-oj-private-promoted-link]')?.getAttribute(\n 'data-oj-private-promoted-link'\n )\n );\n if (promotedLinkEntry) {\n return {\n type: 'promotedLink',\n startNode: promotedLinkEntry.startNode,\n endNode: promotedLinkEntry.endNode,\n data: promotedLinkEntry.links,\n event\n } as DiagramDropDetail<K1, D1, D2>;\n }\n\n return {\n type: 'background',\n x,\n y,\n event\n } as DiagramDropDetail<K1, D1, D2>;\n}\n\nexport function isDiagramDraggable<K1 extends string | number, D1 extends DiagramNodeData<K1, D1>>(\n nodesMap: Map<K1, D1>,\n nodeDraggable?: (data: D1) => 'on' | 'off'\n) {\n if (!nodeDraggable) {\n return false;\n }\n for (const node of nodesMap.values()) {\n if (nodeDraggable(node) === 'on') {\n return true;\n }\n }\n return false;\n}\n\nexport function getDragImageElements<\n K1 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(rootRef: RefObject<HTMLDivElement>, context: DiagramDragStartDetail<D1>, event: DragEvent) {\n if (!context || context.type !== 'nodes') {\n return null;\n }\n\n const root = rootRef.current;\n if (!root) {\n return null;\n }\n\n const nodeElementMap = new Map<string, HTMLElement>();\n root.querySelectorAll<HTMLElement>('[data-oj-private-node]').forEach((element) => {\n const key = element.dataset['ojPrivateNode'];\n if (key != null) {\n nodeElementMap.set(key, element);\n }\n });\n\n const nodeElements = context.nodes\n .map(({ data }) => nodeElementMap.get(serializeDiagramKey(data.id)) ?? null)\n .filter((element): element is HTMLElement => element != null);\n\n if (nodeElements.length === 0) {\n return null;\n }\n\n const elementBounds = nodeElements.map(getElementBounds);\n const visualBounds = nodeElements.map(getVisualBounds);\n const minLeft = Math.min(...visualBounds.map((bounds) => bounds.left));\n const minTop = Math.min(...visualBounds.map((bounds) => bounds.top));\n const maxRight = Math.max(...visualBounds.map((bounds) => bounds.right));\n const maxBottom = Math.max(...visualBounds.map((bounds) => bounds.bottom));\n\n const container = document.createElement('div');\n container.style.position = 'absolute';\n container.style.width = `${maxRight - minLeft}px`;\n container.style.height = `${maxBottom - minTop}px`;\n container.style.pointerEvents = 'none';\n container.style.overflow = 'visible';\n\n nodeElements.forEach((element, index) => {\n const bounds = elementBounds[index];\n const visual = visualBounds[index];\n const wrapper = document.createElement('div');\n const clone = element.cloneNode(true) as HTMLElement;\n applyOutlineAsBoxShadow(element, clone);\n wrapper.style.position = 'absolute';\n wrapper.style.left = `${visual.left - minLeft}px`;\n wrapper.style.top = `${visual.top - minTop}px`;\n wrapper.style.width = `${visual.width}px`;\n wrapper.style.height = `${visual.height}px`;\n wrapper.style.pointerEvents = 'none';\n wrapper.style.overflow = 'visible';\n\n clone.style.position = 'absolute';\n clone.style.left = `${bounds.left - visual.left}px`;\n clone.style.top = `${bounds.top - visual.top}px`;\n clone.style.width = `${bounds.width}px`;\n clone.style.height = `${bounds.height}px`;\n clone.style.margin = '0';\n clone.style.overflow = 'visible';\n wrapper.appendChild(clone);\n container.appendChild(wrapper);\n });\n\n return {\n image: container,\n offSetX: getClientCoordinate(event.clientX, event.offsetX) - minLeft,\n offSetY: getClientCoordinate(event.clientY, event.offsetY) - minTop,\n width: maxRight - minLeft,\n height: maxBottom - minTop\n };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport type { Dispatch, StateUpdater } from 'preact/hooks';\nimport type {\n Bounds,\n DiagramDndProps,\n DiagramNodeData,\n DiagramLinkData,\n DiagramDropDetail,\n DiagramDragStartDetail,\n PromotedLinkId,\n SelectedItemDetail,\n DiagramDropFeedback\n} from '../diagram.types';\nimport { centerXYToPanXY } from '../utils/panUtils';\nimport {\n getDiagramDragContext,\n getDiagramDropContext,\n getDragImageElements,\n setDiagramDropOffset,\n isDiagramDraggable\n} from './dndDiagramUtils';\nimport { getPromotedString } from '../utils/diagramUtils';\nimport { useDnd, DragImageProps } from '#hooks/PRIVATE_useVisDnd';\n\ntype Props<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n> = DiagramDndProps<K1, D1, D2> & {\n rootRef: RefObject<HTMLDivElement>;\n nodesMap: Map<K1, D1>;\n linksMap: Map<K2, D2>;\n promotedLinks: PromotedLinkId<K1, D2>[];\n nodeBounds: Map<K1, Bounds>;\n selectedNodeIds: Set<K1>;\n selectionMode: 'none' | 'single' | 'multiple';\n onSelectionChange?: (detail: SelectedItemDetail<K1, K2, D1, D2>) => void;\n setDropFeedback: Dispatch<StateUpdater<DiagramDropFeedback<K1, K2, D2> | undefined>>;\n centerX: number;\n centerY: number;\n zoomValue: number;\n width: number;\n height: number;\n setDatatipDisabled: Dispatch<StateUpdater<boolean>>;\n};\n\nconst getAcceptedDiagramDropEffect = (\n effectAllowed: DataTransfer['effectAllowed']\n): DataTransfer['dropEffect'] => {\n switch (effectAllowed) {\n case 'copy':\n case 'all':\n case 'copyLink':\n case 'copyMove':\n case 'uninitialized':\n return 'copy';\n case 'link':\n case 'linkMove':\n return 'link';\n case 'none':\n return 'none';\n case 'move':\n default:\n return 'move';\n }\n};\n\nconst setDiagramNativeDropEffect = (event: DragEvent, accepted: boolean) => {\n const dataTransfer = event.dataTransfer;\n if (!dataTransfer) {\n return;\n }\n\n if (!accepted) {\n dataTransfer.dropEffect = 'none';\n return;\n }\n\n const acceptedDropEffect = getAcceptedDiagramDropEffect(dataTransfer.effectAllowed);\n if (dataTransfer.dropEffect !== acceptedDropEffect) {\n dataTransfer.dropEffect = acceptedDropEffect;\n }\n};\n\nexport const useDiagramDnd = <\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>({\n onDragStart,\n onDrag,\n onDragEnd,\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n nodeDraggable,\n rootRef,\n nodesMap,\n linksMap,\n promotedLinks,\n nodeBounds,\n selectedNodeIds,\n selectionMode,\n onSelectionChange,\n setDropFeedback,\n centerX,\n centerY,\n zoomValue,\n width,\n height,\n setDatatipDisabled\n}: Props<K1, K2, D1, D2>) => {\n const draggable = isDiagramDraggable(nodesMap, nodeDraggable);\n const panValues = centerXYToPanXY(centerX, centerY, zoomValue, width, height);\n\n const getDragContext = function (target: HTMLElement, event: DragEvent) {\n return getDiagramDragContext(\n target,\n event,\n selectedNodeIds,\n nodesMap,\n nodeBounds,\n nodeDraggable\n );\n };\n\n const getDropContext = function (event: DragEvent) {\n return getDiagramDropContext<K1, K2, D1, D2>(\n event,\n rootRef,\n nodesMap,\n linksMap,\n promotedLinks,\n nodeBounds,\n panValues.panX,\n panValues.panY,\n zoomValue\n );\n };\n\n const getDiagramDragImage = function (props: DragImageProps<DiagramDragStartDetail<D1>>) {\n setDiagramDropOffset(\n props.event,\n rootRef,\n props.context,\n nodeBounds,\n panValues.panX,\n panValues.panY,\n zoomValue\n );\n return getDragImageElements(rootRef, props.context, props.event);\n };\n\n const getDropFeedback = function (\n context: DiagramDropDetail<K1, D1, D2>,\n accepted: boolean\n ): DiagramDropFeedback<K1, K2, D2> {\n switch (context.type) {\n case 'node':\n return { type: 'node', id: context.data.id, accepted };\n case 'link':\n return { type: 'link', id: context.data.id, accepted };\n case 'promotedLink':\n return {\n type: 'promotedLink',\n id: {\n startNode: context.startNode,\n endNode: context.endNode,\n links: context.data\n },\n accepted\n };\n case 'background':\n default:\n return { type: 'background', accepted };\n }\n };\n\n const isSameDropFeedback = function (\n feedback1?: DiagramDropFeedback<K1, K2, D2>,\n feedback2?: DiagramDropFeedback<K1, K2, D2>\n ) {\n if (feedback1 === feedback2) {\n return true;\n }\n if (\n feedback1?.type !== feedback2?.type ||\n feedback1?.accepted !== feedback2?.accepted ||\n !feedback1 ||\n !feedback2\n ) {\n return false;\n }\n switch (feedback1.type) {\n case 'node':\n return feedback2.type === 'node' && feedback1.id === feedback2.id;\n case 'link':\n return feedback2.type === 'link' && feedback1.id === feedback2.id;\n case 'promotedLink':\n return (\n feedback2.type === 'promotedLink' &&\n getPromotedString(feedback1.id) === getPromotedString(feedback2.id)\n );\n case 'background':\n default:\n return true;\n }\n };\n\n const updateDropFeedback = function (feedback?: DiagramDropFeedback<K1, K2, D2>) {\n setDropFeedback((current) => (isSameDropFeedback(current, feedback) ? current : feedback));\n };\n\n const showDropEffect = function (context: DiagramDropDetail<K1, D1, D2>) {\n setDiagramNativeDropEffect(context.event, true);\n updateDropFeedback(getDropFeedback(context, true));\n };\n\n const showRejectedDropEffect = function (context: DiagramDropDetail<K1, D1, D2>) {\n setDiagramNativeDropEffect(context.event, false);\n updateDropFeedback(getDropFeedback(context, false));\n };\n\n const clearDropEffect = function () {\n updateDropFeedback(undefined);\n };\n\n const onPreDndStart = function (context: DiagramDragStartDetail<D1>) {\n if (!onSelectionChange || selectionMode === 'none' || context?.type !== 'nodes') {\n return;\n }\n\n const selectableNodes = context.nodes.filter((item) => item.data.selectable !== 'off');\n const ids = selectableNodes.map((item) => item.data.id);\n const selectionUnchanged =\n ids.length === selectedNodeIds.size && ids.every((id) => selectedNodeIds.has(id));\n if (selectionUnchanged) {\n return;\n }\n\n onSelectionChange({\n nodes: {\n ids,\n data: selectableNodes.map((item) => item.data)\n },\n links: {\n ids: [],\n data: []\n },\n promotedLinks: {\n ids: []\n }\n });\n };\n\n const { dragProps, dropProps, content } = useDnd<\n DiagramDragStartDetail<D1>,\n DiagramDropDetail<K1, D1, D2>\n >({\n onDragStart,\n onDrag,\n onDragEnd,\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n getDragContext,\n getDropContext,\n getDragImage: getDiagramDragImage,\n onPreDndStart,\n setDatatipDisabled,\n showDropEffect,\n showRejectedDropEffect,\n clearDropEffect\n });\n\n return {\n draggable,\n dndProps: draggable ? { ...dragProps, ...dropProps } : dropProps,\n dndContent: content\n };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n BaseDiagramWithDimensionsProps,\n Bounds,\n DiagramLabelPosition,\n States,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput,\n Dimensions,\n PromotedLinkId,\n DiagramDropFeedback\n} from './diagram.types';\nimport type { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { DiagramLayers } from './DiagramLayers';\nimport { DiagramOverview } from './DiagramOverview';\nimport { DiagramPanZoomContainer } from './DiagramPanZoomContainer';\nimport { useEvents } from './hooks/useEvents';\nimport { useDiagramDatatip } from './hooks/useDiagramDatatip';\nimport { useTextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { usePanZoom } from './hooks/usePanZoom';\nimport { useLayoutEffect, useRef, useState, useMemo, useCallback, useEffect } from 'preact/hooks';\nimport { useUser } from '#hooks/UNSAFE_useUser';\nimport { useDiagramSelection } from './hooks/useDiagramSelection';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { Keys } from '#utils/UNSAFE_keys';\nimport {\n constructLayoutJSON,\n deconstructLayoutJSON,\n getFocusedItemBounds,\n mergeDimensions,\n isEqualBounds,\n getDimensionsFromBounds,\n getContentBounds,\n filterLinksWithNoStartOrEndNodes,\n getAllLabelBounds,\n createLinksMap,\n createNodesMap,\n getPromotedLinks,\n getPromotedString,\n createPromotedLinksMap,\n linkPositionChanged,\n serializeDiagramKey\n} from './utils/diagramUtils';\nimport { centerXYToPanXY } from './utils/panUtils';\nimport { dropFeedbackStyles, outerStyles } from './themes/DiagramStyles.css';\nimport { useVisTouchResponse } from '#hooks/PRIVATE_useVisTouchResponse';\nimport { merge } from '@oracle/oraclejet-internal-utilities/stringUtils';\nimport { useDiagramContextMenu } from './hooks/useDiagramContextMenu';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { useDiagramTabbableMode } from './hooks/useDiagramTabbableMode';\nimport { useDiagramDnd } from './hooks/useDiagramDnd';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\nimport { classNames } from '#utils/UNSAFE_classNames';\n\nconst emptyKeys = { all: false, keys: new Set() };\nconst defaultOverviewConfig = {};\n\nconst isFiniteDimension = (value: number) => Number.isFinite(value);\n\nexport function BaseDiagramWithDimensionsWithData<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n nodes = [],\n links = [],\n width,\n height,\n selectedIds = {},\n selectionMode = 'none',\n layout,\n nodeRenderer,\n linkRenderer,\n onSelectionChange,\n onItemHover,\n onItemFocus,\n highlightedIds = {},\n datatip,\n expanded = emptyKeys as Keys<K1>,\n onExpandedChange,\n contextMenuConfig,\n normalizeLinks,\n overview = 'off',\n ...otherProps\n}: BaseDiagramWithDimensionsProps<K1, K2, D1, D2, L>) {\n const focusedItemBoundsRef = useRef<Bounds | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const [bounds, setBounds] = useState<Map<K1, Bounds>>(new Map());\n const [absBounds, setAbsBounds] = useState<Map<K1, Bounds>>(new Map());\n const linkDimensions = useRef<Map<K2, Dimensions>>(new Map());\n const promotedLinkDimensions = useRef<Map<string, Dimensions>>(new Map());\n const [combinedLabelBounds, setCombinedLabelBounds] = useState<Bounds>();\n const { direction } = useUser();\n const isRtl = direction === 'rtl';\n\n const diagramNodes = nodes;\n const nodeMap = useMemo(\n () => createNodesMap<K1, D1>(diagramNodes, expanded),\n [diagramNodes, expanded]\n );\n const nodeIdToParentMap = nodeMap.itemIdToParentMap;\n const navigationBounds = nodeIdToParentMap.size > 0 ? absBounds : bounds;\n const nodeIdToDataMap = nodeMap.itemIdToDataMap;\n const nodeIdsByAttr = useMemo(() => {\n const idsByAttr = new Map<string, K1>();\n nodeIdToDataMap.forEach((_, id) => {\n idsByAttr.set(serializeDiagramKey(id), id);\n });\n return idsByAttr;\n }, [nodeIdToDataMap]);\n const diagramLinks = useMemo(\n () => filterLinksWithNoStartOrEndNodes(links, nodeIdToDataMap),\n [links, nodeIdToDataMap]\n );\n const linkMap = useMemo(() => createLinksMap<K1, K2, D2>(diagramLinks), [diagramLinks]);\n const linkIdToDataMap = linkMap.itemIdToDataMap;\n const linkIdsByAttr = useMemo(() => {\n const idsByAttr = new Map<string, K2>();\n linkIdToDataMap.forEach((_, id) => {\n idsByAttr.set(serializeDiagramKey(id), id);\n });\n return idsByAttr;\n }, [linkIdToDataMap]);\n const resizeThrottling = useRef<boolean>(false);\n const newDimensions = getDimensionsFromBounds(bounds);\n const { textMeasureContent, getTextDimensions } = useTextDimensions();\n const labelDimensions = useRef<Map<K1 | K2, TextDimensions>>(new Map());\n const shouldIgnoreTransientBlurRef = useRef(false);\n const linkDimsChanged = useRef<boolean>(false);\n const linkRerenderNeeded = useRef<boolean>(false);\n const nodeLabelPosRef = useRef<Map<K1, DiagramLabelPosition>>(new Map());\n const linkLabelPosRef = useRef<Map<K2, DiagramLabelPosition>>(new Map());\n const [layoutOutput, setLayoutOutput] = useState<L>();\n const nodeBoundsRef = useRef<Map<K1, Bounds>>(new Map());\n const isTabbableModeRef = useRef(false);\n const promotedLinks = useMemo(\n () =>\n getPromotedLinks<K1, K2, D1, D2>(\n links,\n expanded,\n nodeMap.allContainerNodes,\n nodeMap.allVisibleNodes\n ),\n [links, expanded, nodeMap.allContainerNodes, nodeMap.allVisibleNodes]\n );\n const promotedLinkIdsByAttr = useMemo(() => {\n const idsByAttr = new Map<string, PromotedLinkId<K1, D2>>();\n promotedLinks.forEach((id) => {\n idsByAttr.set(getPromotedString(id), id);\n });\n return idsByAttr;\n }, [promotedLinks]);\n const promotedLinkMap = useMemo(\n () => createPromotedLinksMap<K1, D2>(promotedLinks),\n [promotedLinks]\n );\n const contentBounds = useMemo(\n () => getContentBounds(bounds, combinedLabelBounds),\n [bounds, combinedLabelBounds]\n );\n const {\n panZoomProps,\n panProps,\n zoomProps,\n toggleButtonContent,\n cursor,\n centerX: contentRelativeCenterX,\n centerY: contentRelativeCenterY,\n zoomValue,\n panBounds,\n kbPanCallback,\n kbZoomCallback\n } = usePanZoom({\n props: otherProps,\n captureTargetRef: rootRef,\n width: width,\n height: height,\n contentBounds,\n isRtl\n });\n\n const { touchResponse, touchResponseStyle } = useVisTouchResponse({\n type: 'auto',\n supportsTouchDragGestures: zoomProps.zooming === 'on' || panProps.panning !== 'off',\n rootRef\n });\n const [dropFeedback, setDropFeedback] = useState<DiagramDropFeedback<K1, K2, D2>>();\n\n const [visibility, setVisibility] = useState<'visible' | 'hidden'>('hidden');\n const {\n onContextMenuDismissed,\n focusedItemInfo,\n hoveredItemInfo,\n activeId,\n syncFocusedItemInfoFromTarget,\n eventsProps\n } = useEvents<K1, K2, D1, D2>(\n touchResponse,\n diagramNodes[0],\n diagramNodes,\n diagramLinks,\n promotedLinks,\n bounds,\n navigationBounds,\n linkIdToDataMap,\n nodeIdToDataMap,\n width,\n height,\n otherProps.maxZoom || 1,\n expanded,\n nodeIdToParentMap,\n promotedLinkMap,\n onItemHover,\n onItemFocus,\n kbPanCallback,\n kbZoomCallback,\n onExpandedChange,\n () => isTabbableModeRef.current,\n (event) => {\n const currentTarget = event.currentTarget as HTMLElement | null;\n const relatedTarget = event.relatedTarget as Element | null;\n return (\n isTabbableModeRef.current &&\n shouldIgnoreTransientBlurRef.current &&\n currentTarget != null &&\n (relatedTarget == null || relatedTarget === currentTarget.ownerDocument.body)\n );\n }\n );\n const {\n captureFocusRestoreState,\n captureFocusRestoreStateFromTarget,\n handleInnerFocusKeyDownCapture,\n isTabbableMode,\n onTabbableModeFocusFailure,\n requestFocusRestore,\n syncTabbableModeFromTarget,\n tabbableModeFocusAction,\n tabbableModeRestoreCustomElementId,\n tabbableModeRestoreElementId,\n tabbableSetProps\n } = useDiagramTabbableMode<K1, K2, D2>({\n rootRef,\n focusedItemInfo,\n isTabbableModeRef,\n shouldIgnoreTransientBlurRef,\n nodeIdsByAttr,\n linkIdsByAttr,\n promotedLinkIdsByAttr,\n visibility\n });\n const style = {\n width: width,\n height: height,\n cursor: dropFeedback?.accepted === false ? 'no-drop' : cursor,\n visibility: visibility,\n ...touchResponseStyle\n };\n const { selectionProps, selectionContent } = useDiagramSelection<K1, K2, D1, D2>({\n selectedIds,\n selectionMode,\n nodeMap,\n linkMap,\n focusedItemInfo,\n onSelectionChange,\n rootRef,\n promotedLinkMap\n });\n\n // This is for the datatip kb position\n if (focusedItemInfo && absBounds.size > 0) {\n focusedItemBoundsRef.current = getFocusedItemBounds(\n focusedItemInfo,\n absBounds,\n diagramLinks,\n linkMap.itemIdToIndexMap,\n zoomValue,\n rootRef\n );\n }\n\n const [datatipDisabled, setDatatipDisabled] = useState(false);\n\n const {\n datatipContent,\n datatipProps: { 'aria-describedby': datatipAriaDescribedby, ...datatipProps }\n } = useDiagramDatatip({\n touchResponse,\n datatip: datatipDisabled ? undefined : datatip,\n focusedItemInfo,\n focusedItemBoundsRef,\n panState: centerXYToPanXY(\n contentRelativeCenterX,\n contentRelativeCenterY,\n zoomValue,\n width,\n height\n ),\n zoom: zoomValue,\n width: width,\n nodesMap: nodeIdToDataMap,\n linksMap: linkIdToDataMap,\n hoveredItem: hoveredItemInfo,\n isTabbableMode\n });\n\n // When expanded changes, diagram loses focus so we need to call re-render\n const expandRerender = useRef(false);\n const hasMountedExpandedRef = useRef(false);\n useLayoutEffect(() => {\n const rootElement = rootRef.current;\n if (!rootElement) {\n return;\n }\n\n if (!hasMountedExpandedRef.current) {\n hasMountedExpandedRef.current = true;\n return;\n }\n\n const activeElement = rootElement.ownerDocument.activeElement;\n const shouldRestoreFocus =\n activeElement === rootElement ||\n (activeElement instanceof Element && rootElement.contains(activeElement));\n\n if (!shouldRestoreFocus) {\n return;\n }\n\n captureFocusRestoreState();\n requestFocusRestore();\n expandRerender.current = true;\n }, [captureFocusRestoreState, expanded, requestFocusRestore]);\n useLayoutEffect(() => {\n if (visibility === 'visible' && expandRerender.current === true) {\n expandRerender.current = false;\n }\n }, [visibility]);\n const states = useRef<States<K1, K2, D2>>();\n\n states.current = {\n // update states to new state\n selectedNodeIds: selectedIds.nodes ?? [],\n selectedLinkIds: selectedIds.links ?? [],\n selectedPromotedLinkIds: selectedIds.promotedLinks ?? [],\n focusedId:\n focusedItemInfo.isCurrent && focusedItemInfo.isFocusVisible ? focusedItemInfo.id : undefined,\n tabbableModeItemId: isTabbableMode ? focusedItemInfo.id : undefined,\n hoveredId: hoveredItemInfo?.isCurrent ? hoveredItemInfo.id : undefined,\n activeId,\n highlightedNodeIds: highlightedIds.nodes ?? [],\n highlightedLinkIds: highlightedIds.links ?? [],\n highlightedPromotedLinkIds: highlightedIds.promotedLinks ?? [],\n isTabbableMode,\n zoom: zoomValue,\n expanded: expanded || { all: false, keys: new Set() },\n onTabbableModeFocusFailure,\n tabbableModeFocusAction,\n tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId,\n dropFeedback\n };\n const layoutCenterX = contentBounds.x + contentRelativeCenterX;\n const layoutCenterY = contentBounds.y + contentRelativeCenterY;\n const overviewConfig = overview === 'on' ? defaultOverviewConfig : overview;\n\n const { contextMenuContent, contextMenuProps } = useDiagramContextMenu<K1, K2, D1, D2>({\n focusedItemInfo,\n rootRef,\n contextMenuConfig: nodes.length > 0 ? contextMenuConfig : undefined,\n onContextMenuDismissed,\n nodesMap: nodeIdToDataMap,\n linksMap: linkIdToDataMap,\n promotedLinkMap\n });\n\n const { draggable, dndProps, dndContent } = useDiagramDnd<K1, K2, D1, D2>({\n onDrag: otherProps.onDrag,\n onDragStart: otherProps.onDragStart,\n onDragEnd: otherProps.onDragEnd,\n onDragEnter: otherProps.onDragEnter,\n onDragLeave: otherProps.onDragLeave,\n onDragOver: otherProps.onDragOver,\n onDrop: otherProps.onDrop,\n nodeDraggable: otherProps.nodeDraggable,\n rootRef,\n nodesMap: nodeIdToDataMap,\n linksMap: linkIdToDataMap,\n promotedLinks,\n nodeBounds: bounds,\n selectedNodeIds: new Set(selectedIds.nodes ?? []),\n selectionMode,\n onSelectionChange,\n setDropFeedback,\n centerX: contentRelativeCenterX,\n centerY: contentRelativeCenterY,\n zoomValue,\n width,\n height,\n setDatatipDisabled\n });\n\n const mergedEventProps = mergeProps(\n panZoomProps,\n eventsProps,\n tabbableSetProps,\n selectionProps,\n datatipProps,\n contextMenuProps,\n dndProps\n );\n\n const captureTabbableModeInteractionFocus = useCallback(\n (target: EventTarget | null) => {\n const rootElement = rootRef.current;\n if (rootElement == null || !(target instanceof Element) || !rootElement.contains(target)) {\n return;\n }\n if (captureFocusRestoreStateFromTarget(target)) {\n return;\n }\n\n if (isTabbableModeRef.current) {\n captureFocusRestoreState();\n }\n },\n [captureFocusRestoreState, captureFocusRestoreStateFromTarget]\n );\n\n const handlePointerDownCapture = useCallback(\n (event: PointerEvent) => {\n captureTabbableModeInteractionFocus(event.target);\n },\n [captureTabbableModeInteractionFocus]\n );\n\n const handleKeyDownCapture = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n captureTabbableModeInteractionFocus(event.target);\n }\n },\n [captureTabbableModeInteractionFocus]\n );\n\n useEffect(() => {\n const rootElement = rootRef.current;\n const ownerDocument = rootElement?.ownerDocument;\n if (rootElement == null || ownerDocument == null) {\n return;\n }\n\n const handleFocusCapture = (event: FocusEvent) => {\n const currentRoot = rootRef.current;\n if (\n currentRoot != null &&\n event.target instanceof Element &&\n currentRoot.contains(event.target)\n ) {\n syncFocusedItemInfoFromTarget(event.target, currentRoot);\n syncTabbableModeFromTarget(event.target);\n }\n };\n\n const handleKeyDownCapture = (event: KeyboardEvent) => {\n const currentRoot = rootRef.current;\n if (\n currentRoot == null ||\n !(event.target instanceof Element) ||\n !currentRoot.contains(event.target)\n ) {\n return;\n }\n\n if (handleInnerFocusKeyDownCapture(event)) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n captureTabbableModeInteractionFocus(event.target);\n }\n };\n\n ownerDocument.addEventListener('focus', handleFocusCapture as EventListener, true);\n ownerDocument.addEventListener('keydown', handleKeyDownCapture as EventListener, true);\n return () => {\n ownerDocument.removeEventListener('focus', handleFocusCapture as EventListener, true);\n ownerDocument.removeEventListener('keydown', handleKeyDownCapture as EventListener, true);\n };\n }, [\n captureTabbableModeInteractionFocus,\n handleInnerFocusKeyDownCapture,\n syncFocusedItemInfoFromTarget,\n syncTabbableModeFromTarget\n ]);\n\n // Called anytime node changes size\n const onNodeSizeChanged = (nodeWidth: number, nodeHeight: number, id: K1) => {\n if (!isFiniteDimension(nodeWidth) || !isFiniteDimension(nodeHeight)) {\n return;\n }\n newDimensions.set(id, { width: nodeWidth, height: nodeHeight });\n if (resizeThrottling.current) {\n return;\n }\n\n resizeThrottling.current = true;\n // performs layout at the next available animation frame when all measurements should be ready\n window.requestAnimationFrame(() => {\n const { labelDims, layoutJSON } = constructLayoutJSON<K1, K2, D1, D2>(\n nodeIdToDataMap,\n linkIdToDataMap,\n promotedLinks,\n newDimensions,\n width,\n height,\n zoomValue,\n nodeIdToParentMap,\n rootRef,\n getTextDimensions\n );\n labelDimensions.current = labelDims;\n const nextLayoutOutput = layout(layoutJSON);\n const { nodePoints, nodeLabelPos, linkLabelPos } = deconstructLayoutJSON<K1, K2, D1, D2>(\n nextLayoutOutput,\n diagramNodes,\n diagramLinks\n );\n nodeLabelPosRef.current = nodeLabelPos;\n linkLabelPosRef.current = linkLabelPos;\n const { nodeBounds, nodeAbsBounds } = mergeDimensions(newDimensions, nodePoints, rootRef);\n const labelBounds = getAllLabelBounds(\n labelDims,\n nodeLabelPos,\n linkLabelPos,\n direction === 'rtl',\n rootRef\n );\n const equalBounds = isEqualBounds(nodeBounds, bounds);\n if (!equalBounds || linkDimsChanged.current || linkRerenderNeeded.current) {\n linkRerenderNeeded.current = linkPositionChanged(nodeBounds, bounds, links);\n setBounds(nodeBounds);\n setAbsBounds(nodeAbsBounds);\n setCombinedLabelBounds(labelBounds);\n setLayoutOutput(nextLayoutOutput);\n linkDimsChanged.current = false;\n setVisibility('hidden');\n } else if (visibility === 'hidden') {\n // Even when measured bounds have already converged, the latest layout output may\n // still carry corrected link geometry after container expand/collapse settles.\n setLayoutOutput(nextLayoutOutput);\n setVisibility('visible');\n }\n resizeThrottling.current = false;\n });\n };\n\n const onLinkSizeChanged = (linkWidth: number, linkHeight: number, id: K2) => {\n if (!isFiniteDimension(linkWidth) || !isFiniteDimension(linkHeight)) {\n return;\n }\n if (linkWidth !== 0 || linkHeight !== 0) {\n const linkDims = linkDimensions.current.get(id);\n if (\n !linkDims ||\n (linkDims &&\n (Math.abs(linkWidth - linkDims.width) > 0.5 ||\n Math.abs(linkHeight - linkDims.height) > 0.5))\n ) {\n linkDimensions.current.set(id, { width: linkWidth, height: linkHeight });\n linkDimsChanged.current = true;\n }\n }\n };\n\n const onPromotedLinkSizeChanged = (linkWidth: number, linkHeight: number, id: string) => {\n if (!isFiniteDimension(linkWidth) || !isFiniteDimension(linkHeight)) {\n return;\n }\n if (linkWidth !== 0 || linkHeight !== 0) {\n const linkDims = promotedLinkDimensions.current.get(id);\n if (\n !linkDims ||\n (linkDims &&\n (Math.abs(linkWidth - linkDims.width) > 0.5 ||\n Math.abs(linkHeight - linkDims.height) > 0.5))\n ) {\n promotedLinkDimensions.current.set(id, { width: linkWidth, height: linkHeight });\n linkDimsChanged.current = true;\n }\n }\n };\n\n useLayoutEffect(() => {\n if (overviewConfig === 'off' || visibility !== 'visible' || bounds.size === 0) {\n return;\n }\n const frame = window.requestAnimationFrame(() => {\n const nodePositions = new Map<K1, { x: number; y: number }>();\n bounds.forEach((value, key) => {\n nodePositions.set(key, { x: value.x, y: value.y });\n });\n const { nodeAbsBounds } = mergeDimensions(\n getDimensionsFromBounds(bounds),\n nodePositions,\n rootRef\n );\n if (!isEqualBounds(nodeAbsBounds, absBounds)) {\n setAbsBounds(nodeAbsBounds);\n }\n });\n return () => window.cancelAnimationFrame(frame);\n }, [absBounds, bounds, overviewConfig, visibility, zoomValue]);\n\n return (\n <div\n ref={rootRef}\n class={classNames([\n outerStyles,\n dropFeedback?.accepted === false ? VisDndStyles.dndRejectedStyle : undefined\n ])}\n {...mergedEventProps}\n draggable={draggable}\n style={style}\n tabIndex={0}\n role=\"application\"\n aria-label={otherProps['aria-label']}\n aria-labelledby={otherProps['aria-labelledby']}\n aria-describedby={merge([otherProps['aria-describedby'], datatipAriaDescribedby])}\n aria-activedescendant={activeId}\n onPointerDownCapture={handlePointerDownCapture}\n onKeyDownCapture={handleKeyDownCapture}>\n {dropFeedback?.type === 'background' ? (\n <div\n class={classNames([\n dropFeedbackStyles.backgroundDropFeedbackStyle,\n dropFeedback.accepted\n ? VisDndStyles.dndDragOverHTMLStyle\n : VisDndStyles.dndRejectedStyle\n ])}\n data-oj-private-drop-feedback={dropFeedback.accepted ? 'accept' : 'reject'}\n />\n ) : undefined}\n {getTextDimensions ? (\n <>\n <DiagramPanZoomContainer\n centerX={contentRelativeCenterX}\n centerY={contentRelativeCenterY}\n zoom={zoomValue}\n width={width}\n height={height}>\n <TabbableModeContext.Provider value={{ isTabbable: isTabbableMode }}>\n <DiagramLayers\n nodes={diagramNodes}\n links={diagramLinks}\n zoom={zoomValue}\n nodeRenderer={nodeRenderer}\n linkRenderer={linkRenderer}\n width={width}\n height={height}\n nodeBounds={bounds}\n linkDimensions={linkDimensions.current}\n promotedLinkDimensions={promotedLinkDimensions.current}\n states={states.current!}\n onNodeSizeChanged={onNodeSizeChanged}\n onLinkSizeChanged={onLinkSizeChanged}\n onPromotedLinkSizeChanged={onPromotedLinkSizeChanged}\n nodeLabelPositions={nodeLabelPosRef.current}\n linkLabelPositions={linkLabelPosRef.current}\n labelDimensions={labelDimensions.current}\n supportsSelection={\n selectionMode !== 'none' ||\n !!(selectedIds?.nodes && selectedIds.nodes.length > 0) ||\n !!(selectedIds?.links && selectedIds.links.length > 0)\n }\n layoutOutput={layoutOutput}\n nodeIdToParentMap={nodeIdToParentMap}\n rootRef={rootRef}\n combinedNodeBounds={contentBounds}\n nodeBoundsRef={nodeBoundsRef}\n promotedLinks={promotedLinks}\n normalizeLinks={normalizeLinks}\n />\n </TabbableModeContext.Provider>\n </DiagramPanZoomContainer>\n {overviewConfig !== 'off' && (\n <DiagramOverview<K1, K2, D1, L>\n nodes={diagramNodes}\n nodeBounds={bounds}\n nodeAbsBounds={absBounds}\n expanded={expanded}\n contentBounds={contentBounds}\n componentWidth={width}\n componentHeight={height}\n layoutCenterX={layoutCenterX}\n layoutCenterY={layoutCenterY}\n zoom={zoomValue}\n minZoom={zoomProps.minZoom}\n panBounds={panBounds}\n layoutOutput={layoutOutput}\n overview={overviewConfig}\n isRtl={isRtl}\n panning={panProps.panning}\n panDirection={panProps.panDirection}\n onPan={panProps.panning !== 'off' ? otherProps.onPan : undefined}\n />\n )}\n </>\n ) : undefined}\n {textMeasureContent}\n {datatipContent}\n {contextMenuContent}\n {selectionContent}\n {toggleButtonContent}\n {dndContent}\n </div>\n );\n}\n","import { useSelection } from '#hooks/PRIVATE_useVisSelection';\nimport type {\n DiagramLinkData,\n DiagramNodeData,\n ItemInfo,\n PromotedLinkId,\n SelectedItemDetail\n} from '../diagram.types';\nimport { getNavigableInfo, serializeDiagramKey } from '../utils/diagramUtils';\nimport type { RefObject } from 'preact';\n\ntype SelectionProps<K1, K2, D1, D2> = {\n selectedIds: {\n nodes?: K1[];\n links?: K2[];\n promotedLinks?: PromotedLinkId<K1, D2>[];\n };\n selectionMode: 'none' | 'single' | 'multiple';\n nodeMap: {\n itemIdToDataMap: Map<K1, D1>;\n };\n linkMap: {\n itemIdToDataMap: Map<K2, D2>;\n };\n focusedItemInfo: ItemInfo<K1, K2, D2>;\n onSelectionChange?: (detail: SelectedItemDetail<K1, K2, D1, D2>) => void;\n rootRef: RefObject<HTMLDivElement>;\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>;\n};\n\ntype EncodedNodeId = `N_${string}`;\ntype EncodedLinkId = `L_${string}`;\ntype EncodedPromotedLinkId = `P_${string}`;\n\nexport function useDiagramSelection<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>({\n selectedIds,\n selectionMode,\n nodeMap,\n linkMap,\n focusedItemInfo,\n onSelectionChange,\n rootRef,\n promotedLinkMap\n}: SelectionProps<K1, K2, D1, D2>) {\n const nodeIdToDataMap = nodeMap.itemIdToDataMap;\n const nodeEncodedToIdMap = new Map<string, K1>();\n const linkEncodedToIdMap = new Map<string, K2>();\n\n const linkIdToDataMap = linkMap.itemIdToDataMap;\n const encodeNodeId = (id: K1) => {\n const encoded = `N_${serializeDiagramKey(id)}` as EncodedNodeId;\n nodeEncodedToIdMap.set(encoded, id);\n return encoded;\n };\n const decodeNodeId = (id: EncodedNodeId) => nodeEncodedToIdMap.get(id);\n const encodeLinkId = (id: K2) => {\n const encoded = `L_${serializeDiagramKey(id)}` as EncodedLinkId;\n linkEncodedToIdMap.set(encoded, id);\n return encoded;\n };\n const decodeLinkId = (id: EncodedLinkId) => linkEncodedToIdMap.get(id);\n const encodePromotedLinkId = (id: PromotedLinkId<K1, D2>) =>\n `P_${JSON.stringify(id)}` as EncodedPromotedLinkId;\n const decodePromotedLinkId = (id: EncodedPromotedLinkId) => JSON.parse(id.slice(2));\n\n const encodedNodesSelection = selectedIds.nodes ? selectedIds.nodes.map(encodeNodeId) : [];\n const encodedLinksSelection = selectedIds.links ? selectedIds.links.map(encodeLinkId) : [];\n const encodedPromotedLinksSelection = selectedIds.promotedLinks\n ? selectedIds.promotedLinks.map(encodePromotedLinkId)\n : [];\n const encodedSelection = [\n ...encodedNodesSelection,\n ...encodedLinksSelection,\n ...encodedPromotedLinksSelection\n ];\n const idExtracter = (event: Event) => {\n // return encodeNodeId(id) or encodeLinkId(id) depending on node or link selection or undefined if clicked on empty space\n const info =\n event.type === 'keyup'\n ? focusedItemInfo\n : getNavigableInfo<K1, K2, D2>(\n event.target as HTMLElement,\n promotedLinkMap,\n nodeIdToDataMap,\n linkIdToDataMap,\n rootRef\n );\n return info.id !== undefined\n ? info.type === 'node'\n ? encodeNodeId(info.id as K1)\n : info.type === 'link'\n ? encodeLinkId(info.id as K2)\n : encodePromotedLinkId(info.id)\n : undefined;\n };\n\n const onEncodedSelectionChange = (detail: {\n ids: (EncodedNodeId | EncodedLinkId | EncodedPromotedLinkId)[];\n }) => {\n const newNodeIds = detail.ids\n .filter((encId) => encId[0] === 'N')\n .map((encId) => decodeNodeId(encId as EncodedNodeId)!);\n const newLinkIds = detail.ids\n .filter((encId) => encId[0] === 'L')\n .map((encId) => decodeLinkId(encId as EncodedLinkId)!);\n\n const newPromotedLinkIds = detail.ids\n .filter((encId) => encId[0] === 'P')\n .map((encId) => decodePromotedLinkId(encId as EncodedPromotedLinkId)!);\n\n const newSelectedNodeIds = newNodeIds.filter(\n (id) => nodeIdToDataMap.get(id)?.selectable !== 'off'\n );\n const newSelectedLinkIds = newLinkIds.filter(\n (id) => linkIdToDataMap.get(id)?.selectable !== 'off'\n );\n\n const nodeData = newSelectedNodeIds.map((selectedId) => {\n return nodeIdToDataMap.get(selectedId);\n });\n const linkData = newSelectedLinkIds.map((selectedId) => {\n return linkIdToDataMap.get(selectedId);\n });\n return (\n onSelectionChange &&\n onSelectionChange({\n nodes: {\n ids: newSelectedNodeIds,\n data: nodeData\n },\n links: {\n ids: newSelectedLinkIds,\n data: linkData\n },\n promotedLinks: {\n ids: newPromotedLinkIds\n }\n })\n );\n };\n\n const getDataById = (id: EncodedNodeId | EncodedLinkId | EncodedPromotedLinkId) => {\n let data;\n if (id[0] === 'N') {\n const nodeId = decodeNodeId(id as EncodedNodeId)!;\n data = nodeMap.itemIdToDataMap.get(nodeId);\n } else if (id[0] === 'L') {\n const linkId = decodeLinkId(id as EncodedLinkId)!;\n data = linkMap.itemIdToDataMap.get(linkId);\n } else if (id[0] === 'P') {\n data = decodePromotedLinkId(id as EncodedPromotedLinkId)!;\n }\n return data;\n };\n\n const isKeyboardSelection = (event: KeyboardEvent) => {\n return event.key === '[' || event.key === ']';\n };\n\n const { selectionContent, selectionProps } = useSelection<\n EncodedNodeId | EncodedLinkId | EncodedPromotedLinkId,\n D1 | D2 | DiagramLinkData<string, K1>\n >({\n selection: encodedSelection,\n idExtracter,\n selectionMode,\n getDataById,\n onChange: onEncodedSelectionChange,\n isKeyboardSelection\n });\n\n return { selectionContent, selectionProps };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type { DiagramContextMenuContext, PromotedLinkId } from '../diagram.types';\n\nexport function getDiagramContextMenuContext<K1 extends string | number, K2 extends string | number, D1, D2>(\n nodesMap: Map<K1, D1>,\n linksMap: Map<K2, D2>,\n type: 'node' | 'link' | 'promotedLink' | 'background',\n idx?: K1 | K2 | PromotedLinkId<K1, D2> | string\n) {\n let context: DiagramContextMenuContext<K1, D1, D2>;\n\n if (type === 'node') {\n context = {\n data: nodesMap.get(idx as K1)!,\n type\n };\n } else if (type === 'link') {\n context = {\n data: linksMap.get(idx as K2)!,\n type\n };\n } else if (type === 'promotedLink') {\n context = {\n id: idx as PromotedLinkId<K1, D2>,\n type\n };\n } else {\n context = {\n type: 'background'\n };\n }\n\n return {\n context: context as DiagramContextMenuContext<K1, D1, D2>\n };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n BaseDiagramWithDimensionsProps,\n Bounds,\n DiagramDropFeedback,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput,\n PromotedLinkId\n} from './diagram.types';\nimport { useMemo, useRef, useState } from 'preact/hooks';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\nimport { dropFeedbackStyles, noDataStyle, outerStyles } from './themes/DiagramStyles.css';\nimport { useDiagramDnd } from './hooks/useDiagramDnd';\n\nexport function EmptyBaseDiagramWithDimensions<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n width,\n height,\n selectionMode = 'none',\n selectedIds = {},\n onSelectionChange,\n ...otherProps\n}: BaseDiagramWithDimensionsProps<K1, K2, D1, D2, L>) {\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const rootRef = useRef<HTMLDivElement>(null);\n const [, setDatatipDisabled] = useState(false);\n const [dropFeedback, setDropFeedback] = useState<DiagramDropFeedback<K1, K2, D2>>();\n const nodesMap = useMemo(() => new Map<K1, D1>(), []);\n const linksMap = useMemo(() => new Map<K2, D2>(), []);\n const promotedLinks = useMemo(() => [] as PromotedLinkId<K1, D2>[], []);\n const nodeBounds = useMemo(() => new Map<K1, Bounds>(), []);\n const selectedNodeIds = useMemo(() => new Set<K1>(selectedIds.nodes ?? []), [selectedIds.nodes]);\n const { draggable, dndProps, dndContent } = useDiagramDnd<K1, K2, D1, D2>({\n onDrag: otherProps.onDrag,\n onDragStart: otherProps.onDragStart,\n onDragEnd: otherProps.onDragEnd,\n onDragEnter: otherProps.onDragEnter,\n onDragLeave: otherProps.onDragLeave,\n onDragOver: otherProps.onDragOver,\n onDrop: otherProps.onDrop,\n nodeDraggable: otherProps.nodeDraggable,\n rootRef,\n nodesMap,\n linksMap,\n promotedLinks,\n nodeBounds,\n selectedNodeIds,\n selectionMode,\n onSelectionChange,\n setDropFeedback,\n centerX: width / 2,\n centerY: height / 2,\n zoomValue: 1,\n width,\n height,\n setDatatipDisabled\n });\n const style = {\n width,\n height,\n cursor: dropFeedback?.accepted === false ? 'no-drop' : undefined\n };\n\n return (\n <div\n ref={rootRef}\n class={classNames([\n outerStyles,\n dropFeedback?.accepted === false ? VisDndStyles.dndRejectedStyle : undefined\n ])}\n {...dndProps}\n draggable={draggable}\n style={style}\n tabIndex={0}\n role=\"application\"\n aria-label={otherProps['aria-label']}\n aria-labelledby={otherProps['aria-labelledby']}\n aria-describedby={otherProps['aria-describedby']}>\n {dropFeedback?.type === 'background' ? (\n <div\n class={classNames([\n dropFeedbackStyles.backgroundDropFeedbackStyle,\n dropFeedback.accepted\n ? VisDndStyles.dndDragOverHTMLStyle\n : VisDndStyles.dndRejectedStyle\n ])}\n data-oj-private-drop-feedback={dropFeedback.accepted ? 'accept' : 'reject'}\n />\n ) : undefined}\n <div class={noDataStyle}>{translations.vis_noData()}</div>\n {dndContent}\n </div>\n );\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n BaseDiagramWithDimensionsProps,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput\n} from './diagram.types';\nimport { BaseDiagramWithDimensionsWithData } from './BaseDiagramWithDimensionsWithData';\nimport { EmptyBaseDiagramWithDimensions } from './EmptyBaseDiagramWithDimensions';\n\nexport function BaseDiagramWithDimensions<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>(props: BaseDiagramWithDimensionsProps<K1, K2, D1, D2, L>) {\n return props.nodes && props.nodes.length > 0 ? (\n <BaseDiagramWithDimensionsWithData {...props} />\n ) : (\n <EmptyBaseDiagramWithDimensions {...props} />\n );\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n BaseDiagramProps,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput\n} from './diagram.types';\nimport { TrackResizeContainer } from '#UNSAFE_TrackResizeContainer';\nimport { dimensionStyle } from './themes/DiagramStyles.css';\nimport { BaseDiagramWithDimensions } from './BaseDiagramWithDimensions';\n\n/**\n * Diagrams are used to display a set of nodes and the links between them.\n */\nexport function BaseDiagram<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({ width, height, ...otherProps }: BaseDiagramProps<K1, K2, D1, D2, L>) {\n return (\n <TrackResizeContainer width={width} height={height} class={dimensionStyle}>\n {(width, height) => (\n <BaseDiagramWithDimensions width={width} height={height} {...otherProps} />\n )}\n </TrackResizeContainer>\n );\n}\n"],"names":["hasFiniteRect","bounds","Number","isFinite","x","y","width","height","serializeDiagramKey","key","getMapEntryBySerializedKey","map","serializedKey","prefix","slice","value","deserializeDiagramKey","get","undefined","queryElementByAttributeValue","root","attribute","querySelector","replace","escapeAttributeValueForSelector","queryElementBySerializedDiagramKey","constructLayoutJSON","nodeItems","linkItems","promotedLinks","dimensions","zoom","nodeIdToParentMap","rootRef","getTextDimensions","labelDims","Map","nodeValues","Array","from","values","linkValues","forEach","nodes","getNodeLabelProps","label","fontProps","_getFontProps","labelStyle","set","id","getLabelProps","linkKeys","keys","item","layoutJSON","getNodeDimensions","data","getLabelDimensions","getContainerId","startNode","endNode","getCommonAncestorId","getRelativeNodeBounds","containerId","absPos","getAbsoluteNodePosition","getPromotedLinks","componentSize","normalizeBounds","getAbsoluteLinkBounds","itemId","referenceId","isPromoted","current","linkElement","nodeContainer","getPromotedString","dims","linkBoundingRect","getBoundingClientRect","diagramBoundingRect","getBounds","links","nodeBounds","linkDimensions","promotedLinkDimensions","topId","leftId","minX","Infinity","minY","maxX","maxY","i","length","nodeId","nodeMinX","nodeMinY","linkMinX","linkMinY","linkMaxX","linkMaxY","linkId","topBounds","leftBounds","promotedLink","contentWidth","contentHeight","nodeElement","nodeBoundingRect","nodeContainerRect","deconstructLayoutJSON","nodeData","linkData","positions","nodeLabelPos","linkLabelPos","findPoints","link","nodePoints","output","node","position","mergeDimensions","nodeAbsBounds","point","absPoint","hasFinitePoint","hasFiniteSize","hasFiniteAbsPoint","isEqualBounds","bounds1","bounds2","size","equal","b2Value","Math","abs","_createItemMap","items","itemIdToDataMap","itemIdToIndexMap","itemIndexToIdMap","itemIdToParentMap","allContainerNodes","expanded","allVisibleNodes","allVisibleNodesData","parentId","parentIndex","index","push","containsKey","getDimensionsFromBounds","getLabelBounds","isRTL","labelPos","getLabelPosition","rotationAngle","rotationPoint","angle","topLeft","getCoordsRelToRotPoint","topRight","bottomLeft","bottomRight","points","getBoundsFromPoints","rotatePoint","pos","labelPoint","rotPoint","cos","sin","positionProps","hAlign","vAlign","isEqualItem","item1","item2","type","isSamePromotedLinkId","isPromotedLinkId","id1","id2","includesPromotedLinkId","ids","some","candidate","getNavigableInfo","element","promotedLinkMap","nodesMap","linksMap","rootElementRef","navigableId","elem","dataset","entry","parentElement","getItemAriaLabel","translations","supportsSelection","states","accessibleLabel","generateAriaLabel","isSelected","isIndirect","isExpanded","isCollapsed","containsControls","styles","fontFamily","fontSize","fontStyle","fontWeight","startId","endId","startAnc","_getAncestorIds","endAnc","indexOf","getLinksForNode","frontLinks","backLinks","frontPromotedLinks","backPromotedLinks","ancestors","anc","containerLinksReady","containerLinks","layoutOutput","changeExpanded","removeKey","addKey","firstVisibleAncestor","collapsed","isDescendant","chId","DiagramLabel","text","labelBorderStyle","labelStyles","labelPosition","labelRotation","rotation","getLabelRotation","_jsx","class","classNames","borderColor","style","top","left","children","NODE_ITEM_SELECTOR","LINK_ITEM_SELECTOR","PROMOTED_LINK_ITEM_SELECTOR","ROVING_TABINDEX_ATTR","ROVING_RESTORE_PREFIX","FOCUSABLE_DESCENDANT_SELECTOR","join","getFocusScope","contentElement","focusScopeSelector","HTMLElement","SVGElement","focusScopeCandidate","getRestorableFocusIds","rootElement","activeElement","contains","activeElementId","activeCustomElementId","rovingTabIndexId","getAttribute","matches","focusDiagramItemContent","focusAction","restoreElementId","restoreCustomElementId","focusScope","tabbables","allTabbableElements","getDiagramItemTabbables","restoreId","restoreTarget","startsWith","ownerDocument","getElementById","focus","preventScroll","containFocusWithinDiagramItem","event","firstTabbable","lastTabbable","isActiveWithinScope","shiftKey","preventDefault","stopPropagation","DiagramNodeElement","state","activeId","nodeRenderer","onNodeSizeChanged","isDimmed","content","labelDimensions","dropFeedback","nodeStyles","dimmedItemStyle","nodeDropFeedbackStyle","itemStyles","useTranslationBundle","ref","useRef","contentRef","tabbableFocusStateRef","tabbableModeFocusAction","tabbableModeRestoreElementId","tabbableModeRestoreCustomElementId","handleTabbableFocusFailure","useCallback","onTabbableModeFocusFailure","focusOwner","autoFocusRef","tabbableFocusState","focusTrackerBaseStyle","useLayoutEffect","isTabbable","frameId","window","requestAnimationFrame","cancelAnimationFrame","optionsRef","box","useResizeObserver","boxSize","isArray","borderBoxSize","inlineSize","contentRect","blockSize","nodePos","direction","useUser","hasLabel","serializedId","expander","jsx","buttonStyle","EmbeddedIconButton","Minus","Plus","context","childContext","_jsxs","accepted","VisDndStyles","dndRejectedStyle","role","tabIndex","isFocused","isHovered","dndDragOverHTMLStyle","TabbableModeContext","Provider","FocusTrap","isDisabled","restoreFocusRef","layerStyles","isSameBounds","getSvgDropFeedbackBounds","getBBox","DiagramLinkElement","linkRenderer","onLinkSizeChanged","linkStyles","svgDropFeedbackStyle","dropFeedbackBounds","setDropFeedbackBounds","useState","nextBounds","handleKeyDownCapture","jsxs","onKeyDownCapture","dndDragOverSvgStyle","nextZoom","minZoom","maxZoom","onZoomChange","newZoom","constrainZoom","zoomValue","getZoomToFitZoom","contentBounds","zoomX","zoomY","min","max","zoomAndCenterItemFromInfo","info","linkIdToDataMap","totalBounds","startNodeBounds","endNodeBounds","cX","cY","centerX","centerY","getPanZoomToCenterNode","DiagramLabelLayer","itemProps","DiagramLinkLayer","combinedNodeBounds","linkLabelPositions","linkLayerStyle","overflow","isTabbableOwner","isTabbableMode","tabbableModeItemId","selectedLinkIds","includes","focusedId","hoveredId","highlightedNodeIds","highlightedLinkIds","highlightedPromotedLinkIds","DiagramPromotedLinkElement","stringId","num_links","diagram_promotedLinks","toString","diagram_promotedLink","DiagramPromotedLinkLayer","selectedPromotedLinkIds","DiagramNodeLayer","onPromotedLinkSizeChanged","nodeLabelPositions","nodeBoundsRef","normalizeLinks","selectedNodeIds","child","linkDims","isContainerReady","childContent","getContent","nodeFullBounds","DiagramLayers","useTabbableMode","updatedStates","_Fragment","PAN_EPSILON","constrainValueToBounds","constrainPanToBounds","nextPan","panBounds","panX","panY","pan","previousPan","panDirection","onPanChange","newPan","constrainPan","isPanChanged","center","panXYToCenterXY","getPanBounds","dWidth","dHeight","elemBounds","initPanZoomState","panType","zoomRatio","minZoomX","minZoomY","initZoom","initCenterX","initCenterY","dx","dy","boundsX","boundsY","centerXYToPanXY","OVERVIEW_GAP","clamp","roundPixel","round","roundPixelSize","getChildBounds","getOverviewNodeBounds","offsetX","offsetY","overviewNodeBounds","childNodes","isExpandedContainer","overviewBounds","childBounds","childOffsetX","childOffsetY","getMeasuredOverviewNodeBounds","DiagramOverview","componentWidth","componentHeight","layoutCenterX","layoutCenterY","overview","isRtl","panning","onPan","isOverviewReady","overviewSize","maxWidth","maxHeight","getOverviewSize","viewportWidth","viewportHeight","viewportCenterX","viewportCenterY","panMinCenter","panMaxCenter","viewportMinX","viewportMinY","viewportMaxX","viewportMaxY","scaledOverviewRatio","scaledOverviewWidth","scaledOverviewHeight","overviewCanvasX","overviewCanvasY","windowWidth","windowHeight","minWindowX","minWindowY","maxWindowX","maxWindowY","windowX","windowY","startLeft","endLeft","customContent","renderer","measuredNodeBounds","originX","originY","absBounds","measuredBounds","getMeasuredLayoutBounds","layoutOverviewNodeBounds","measuredOverviewNodeBounds","measuredBoundsById","mergeOverviewNodeBounds","stopDiagramPan","overviewStyles","overviewContainerStyle","overviewContentStyle","overviewViewportBackgroundStyle","toOverviewX","toOverviewY","roundedX","roundedY","roundedWidth","roundedHeight","overviewContainerNodeStyle","radius","cx","cy","r","overviewNodeStyle","overviewOverlayStyle","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","OverviewSlidingWindow","isInteractive","orientation","onWindowDimsChange","deltaX","deltaY","nextWindowX","nextWindowY","clampedX","clampedY","panToWindow","DiagramPanZoomContainer","panValues","panZoomStyles","transform","getNavigableLinksForNodeId","listOfLinks","_getClockwiseAngle","currNode","oppositeNode","p1","_getNodeCenter","p2","atan2","PI","_getNodesDistance","sqrt","pow","_getLinkDirection","nodeBB","calcDistanceAngleWeighted","objectBB","currentBB","optimalAngle1","optimalAngle2","objCenterX","objCenterY","curCenterX","curCenterY","x_dist","y_dist","distance","isValidDestination","objBB","curBB","compareCenters","_areEqualWithinTolerance","calcInContact","objRect","curRect","_isVerticallyAligned","_isHorizontallyAligned","rect1","rect2","a","b","_anglesAreEqualWithinTolerance","a1","a2","res","useDiagramNavigation","nodeIdToDataMap","currentKeyboardFocusNode","nodeBoundsById","getNextNavigableNode","listOfObjects","currBB","object","inContact","nextObject","nextDistance","MAX_VALUE","nextInContact","hasFoundCurrent","objBounds","currBounds","getNextNavigableLink","listOfNodes","currentLink","allLinks","keyboardFocusNode","linksWithSortingAttributes","linkDetail","addSortingAttributes","sort","link1","link2","linkAngle1","linkDistance1","linkDirection1","linkAngle2","linkDistance2","linkDirection2","bForward","navigateFromNodeToLink","adjLinks","currNodeBB","currNodeBBCenterX","nodeCenterX","altKey","code","navigateFromLinkToNode","startNodeBB","endNodeBB","startNodeCenterX","endNodeCenterX","DIAGRAM_ITEM_SELECTOR","useEvents","touchResponse","initNode","navigationNodeBounds","onItemHover","onItemFocus","kbPanCallback","kbZoomCallback","onExpandedChange","shouldIgnoreTransientBlur","focusedItemInfo","setfocusedItemInfo","hoveredItemInfo","sethoveredItemInfo","getNearestVisibleNodeId","currentNodeId","has","getVisibleFallbackItemInfo","itemInfo","nearestVisibleNodeId","promotedLinkId","resolvedFocusedItemInfo","normalizeKey","isElementFocusVisible","syncFocusedItemInfoFromTarget","target","currentTarget","Element","itemTarget","closest","isFocusVisible","syncedItemInfo","isCurrent","updatefocusedItemInfo","hoverHandlers","useVisHover","detail","getRandomId","handleKeyboardInput","useEffect","fallbackItemInfo","hasActiveDescendant","onContextMenuDismissed","gesture","eventsProps","mergeProps","onKeyUp","onKeyDown","tabbableModeActive","hasInternalFocus","eventConsumed","currentFocusedItemInfo","isChangeItemType","nextItemInfo","isNavigationEvent","currentItemInfo","parent","navigableNodes","itemDetail","getLinkDetailFromInfo","handleKeyboardNavigationEvent","dPan","dZoom","ctrlKey","nZoom","nPan","metaKey","newExpanded","getChildInfo","cancelEvent","onBlur","relatedTarget","buttonId","expCollapseButtonId","onFocus","useDiagramDatatip","datatip","focusedItemBoundsRef","panState","hoveredItem","datatipC","focusedItem","isPointerActive","getDatatipContent","elementBounds","offset","calculateOffset","globalThis","console","log","focusedItemBounds","datatipContent","datatipProps","useDatatip","placement","anchor","usePointerGesture","captureTargetRef","numPointers","onPointerGestureDown","onPointerGestureMove","onPointerGestureEnd","onExtraneousPointerDown","activePointers","e","findIndex","pointerEvent","pointerId","pointers","splice","safeSetPointerCapture","onPointerLeave","useDragPan","panProps","onDragPanStart","onDragPanEnd","prevPanState","initialPanState","dragProps","draggableRegion","onDragStart","onDragMove","onDragEnd","inactiveState","isDragging","x0","y0","regionOffsetX","regionOffsetY","dragState","handlePointerEvent","cb","pageX","pageY","originalEvent","button","region","xMin","xMax","yMin","yMax","inDraggableRegion","getRegionOffset","useDrag","getDistance","usePinchZoom","zooming","onZoom","pinchProps","onPinchZoomStart","onPinchZoomChange","onPinchZoomEnd","origin","prevDistance","reset","pointer1","pointer2","getMidpoint","delta","usePinch","usePanZoom","props","cursor","setCursor","normalizedContentBounds","zoomProps","zoomTofitZoom","getZoomProps","prevPanBoundsInputs","isDeviceTouch","isTouch","plotArea","showPanButton","dragModeOptions","isZoomScroll","plotAreaSpace","showZoomButton","showSelectButton","toggleButtonContent","userDragMode","useVisDragModeControls","contentX","contentY","getPanProps","panCenterX","panCenterY","panBoundsInputs","previousPanBoundsInputs","currentPan","constrainedPan","dragPanProps","panOnZoom","focusX","focusY","oldPan","nextPanBounds","previousPanAtNewZoom","wheelZoomProps","onPanOnZoom","onWheel","onWheelCallback","deltaMode","DOM_DELTA_PIXEL","DOM_DELTA_LINE","DOM_DELTA_PAGE","getNormalizedDelta","clientX","clientY","useWheel","constrainedZoom","useWheelZoom","pinchZoomProps","panZoomProps","DEBUG_PREFIX","describeElement","dataNodeId","dataLinkId","dataPromotedLinkId","tagName","ariaLabel","textContent","trim","debugLog","message","details","useDiagramTabbableMode","isTabbableModeRef","shouldIgnoreTransientBlurRef","nodeIdsByAttr","linkIdsByAttr","promotedLinkIdsByAttr","visibility","setTabbableModeFocusAction","restoreRequestCount","setRestoreRequestCount","shouldRestoreDiagramFocusRef","previousInnerFocusIdRef","previousCustomFocusIdRef","shouldRestoreItemOwnerFocusRef","shouldRestoreTransientItemOwnerFocusRef","shouldRestoreTabbableContentRef","previousVisibilityRef","prevIsTabbableModeRef","shouldExitTabbableModeOnRootFocusRef","shouldFinalizeRootRestoreRef","transientBlurTimeoutRef","rootEntryFirstFocusFrameRef","pendingFallbackFocusOwnerRef","pendingFallbackItemRef","pendingRestoreChildFocusRef","hasRetriedOwnerChildFocusRef","clearTransientBlurIgnore","clearTimeout","armTransientBlurIgnore","setTimeout","clearStoredFocusRestoreState","hasStoredFocusRestoreTarget","captureFocusRestoreState","document","isDiagramRootFocused","shouldRestoreFocus","hadStoredRestoreTarget","hasNextRestoreTarget","shouldRestoreItemOwnerFocus","getTabbableItemFromElement","promotedLinkElement","body","getCurrentTabbableItemElement","selector","attrName","attrValue","querySelectorAll","isSameTabbableItem","focusedTabbableItem","useMemo","isCurrentTabbableItem","rawTabbableSetProps","getCurrentTabbableKey","setCurrentTabbableKey","useTabbableModeSet","currentTabbableItem","captureFocusRestoreStateFromTarget","restorableTarget","focusedItemElement","targetItem","hasRestoreTarget","syncTabbableModeFromTarget","enteredInnerFocus","handleInnerFocusKeyDownCapture","wasCurrentTabbable","tabbableSetProps","count","shouldExitTabbableModeOnRootFocus","currentActiveElement","exitedTabbableMode","shouldFocusOwner","fallbackItem","ownerElement","focusTarget","scheduledFocusTarget","requestFocusRestore","restoreDiagramRootFocus","isConnected","isFocusOutsideDiagram","shouldRestoreOwnerFocus","shouldRestoreDiagramFocus","hasStoredRestoreTarget","shouldRestoreTransientItemOwnerFocus","shouldFinalizeRootRestore","previousInnerFocusId","previousCustomFocusId","hasStoredInnerRestoreTarget","currentRootElement","DROP_OFFSET_X_DATA_TYPE","DROP_OFFSET_Y_DATA_TYPE","getClientCoordinate","fallback","getSafeZoom","getClosestElement","Node","getElementBounds","rect","right","bottom","getOutlineOverflow","computedStyle","getComputedStyle","outlineWidth","parseFloat","outlineOffset","getVisualBounds","rootBounds","rootOverflow","stack","currentElement","pop","getDiagramPointerPosition","safePanX","safePanY","safeZoom","rootRect","getMinimumNodePosition","getDiagramDragContext","nodeDraggable","nodeEntry","validDraggedNodes","filter","nodeOffset","getDiagramDropContext","pointerPosition","dataTransfer","getData","nodeRect","nodeX","nodeY","linkEntry","promotedLinkEntry","find","getDragImageElements","nodeElementMap","nodeElements","visualBounds","minLeft","minTop","maxRight","maxBottom","container","createElement","pointerEvents","visual","wrapper","clone","cloneNode","source","sourceElements","cloneElements","sourceElement","cloneElement","outlineStyle","outlineColor","spread","existingBoxShadow","boxShadow","outlineShadow","outline","applyOutlineAsBoxShadow","margin","appendChild","image","offSetX","offSetY","setDiagramNativeDropEffect","dropEffect","acceptedDropEffect","effectAllowed","getAcceptedDiagramDropEffect","useDiagramDnd","onDrag","onDragEnter","onDragLeave","onDragOver","onDrop","selectionMode","onSelectionChange","setDropFeedback","setDatatipDisabled","draggable","isDiagramDraggable","getDropFeedback","updateDropFeedback","feedback","feedback1","feedback2","isSameDropFeedback","dropProps","useDnd","getDragContext","getDropContext","getDragImage","draggedNodeBounds","contentMinX","contentMinY","setData","String","setDiagramDropOffset","onPreDndStart","selectableNodes","selectable","every","showDropEffect","showRejectedDropEffect","clearDropEffect","dndProps","dndContent","emptyKeys","all","Set","defaultOverviewConfig","isFiniteDimension","BaseDiagramWithDimensionsWithData","selectedIds","layout","highlightedIds","contextMenuConfig","otherProps","setBounds","setAbsBounds","combinedLabelBounds","setCombinedLabelBounds","diagramNodes","nodeMap","createNodesMap","navigationBounds","idsByAttr","_","diagramLinks","newLinks","filterLinksWithNoStartOrEndNodes","linkMap","createLinksMap","resizeThrottling","newDimensions","textMeasureContent","useTextDimensions","linkDimsChanged","linkRerenderNeeded","nodeLabelPosRef","linkLabelPosRef","setLayoutOutput","linkToPromotedMap","promotedToLinkMap","startVisible","endVisible","subLinks","finalPromoted","createPromotedLinksMap","labelBounds","getContentBounds","contentRelativeCenterX","contentRelativeCenterY","touchResponseStyle","useVisTouchResponse","supportsTouchDragGestures","setVisibility","selectionProps","selectionContent","nodeEncodedToIdMap","linkEncodedToIdMap","encodeNodeId","encoded","decodeNodeId","encodeLinkId","decodeLinkId","encodePromotedLinkId","JSON","stringify","decodePromotedLinkId","parse","encodedSelection","useSelection","selection","idExtracter","getDataById","onChange","newNodeIds","encId","newLinkIds","newPromotedLinkIds","newSelectedNodeIds","newSelectedLinkIds","selectedId","isKeyboardSelection","useDiagramSelection","linkIdToIndexMap","next","liveBounds","startNB","endNB","startNCenter","endNCenter","getFocusedItemBounds","datatipDisabled","datatipAriaDescribedby","expandRerender","hasMountedExpandedRef","overviewConfig","contextMenuContent","contextMenuProps","useContextMenu","onContextMenuHandler","idx","elementType","getDiagramContextMenuContext","contextMenuOptions","useDiagramContextMenu","mergedEventProps","captureTabbableModeInteractionFocus","handlePointerDownCapture","handleFocusCapture","currentRoot","addEventListener","removeEventListener","frame","nodePositions","outerStyles","merge","l","onPointerDownCapture","dropFeedbackStyles","backgroundDropFeedbackStyle","nodeWidth","nodeHeight","nextLayoutOutput","nodeBound","getAllLabelBounds","nodesWithLinks","rerender","linkPositionChanged","linkWidth","linkHeight","EmptyBaseDiagramWithDimensions","noDataStyle","vis_noData","BaseDiagramWithDimensions","TrackResizeContainer","dimensionStyle"],"mappings":"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"}
1
+ {"version":3,"file":"BaseDiagram-7845a7ae.js","sources":["../../src/PRIVATE_BaseDiagram/utils/diagramUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramLabel.tsx","../../src/PRIVATE_BaseDiagram/utils/tabbableModeUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramNodeElement.tsx","../../src/PRIVATE_BaseDiagram/utils/dropFeedbackUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramLinkElement.tsx","../../src/PRIVATE_BaseDiagram/utils/zoomUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramLabelLayer.tsx","../../src/PRIVATE_BaseDiagram/DiagramLinkLayer.tsx","../../src/PRIVATE_BaseDiagram/DiagramPromotedLinkElement.tsx","../../src/PRIVATE_BaseDiagram/DiagramPromotedLinkLayer.tsx","../../src/PRIVATE_BaseDiagram/DiagramNodeLayer.tsx","../../src/PRIVATE_BaseDiagram/DiagramLayers.tsx","../../src/PRIVATE_BaseDiagram/utils/panUtils.ts","../../src/PRIVATE_BaseDiagram/DiagramOverview.tsx","../../src/PRIVATE_BaseDiagram/DiagramPanZoomContainer.tsx","../../src/PRIVATE_BaseDiagram/utils/navUtils.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramNavigation.ts","../../src/PRIVATE_BaseDiagram/hooks/useEvents.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramDatatip.ts","../../src/PRIVATE_BaseDiagram/hooks/usePointerGesture.ts","../../src/PRIVATE_BaseDiagram/hooks/useDragPan.ts","../../src/PRIVATE_BaseDiagram/hooks/useDrag.ts","../../src/PRIVATE_BaseDiagram/hooks/usePinch.ts","../../src/PRIVATE_BaseDiagram/hooks/usePinchZoom.ts","../../src/PRIVATE_BaseDiagram/hooks/usePanZoom.ts","../../src/PRIVATE_BaseDiagram/hooks/useWheelZoom.ts","../../src/PRIVATE_BaseDiagram/hooks/useWheel.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramContextMenu.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramTabbableMode.ts","../../src/PRIVATE_BaseDiagram/hooks/dndDiagramUtils.ts","../../src/PRIVATE_BaseDiagram/hooks/useDiagramDnd.ts","../../src/PRIVATE_BaseDiagram/BaseDiagramWithDimensionsWithData.tsx","../../src/PRIVATE_BaseDiagram/hooks/useDiagramSelection.ts","../../src/PRIVATE_BaseDiagram/utils/contextMenuUtils.ts","../../src/PRIVATE_BaseDiagram/EmptyBaseDiagramWithDimensions.tsx","../../src/PRIVATE_BaseDiagram/BaseDiagramWithDimensions.tsx","../../src/PRIVATE_BaseDiagram/BaseDiagram.tsx"],"sourcesContent":["import type {\n DiagramNodeData,\n DiagramLinkData,\n ItemInfo,\n Bounds,\n Position,\n Dimensions,\n DatatipContext,\n DiagramLabelStyles,\n DiagramLabelPosition,\n DiagramLayoutOutput,\n PromotedLinkId\n} from '../diagram.types';\nimport type { RefObject } from 'preact';\nimport type { BundleType } from '#resources/nls/bundle';\nimport type { Font, GetTextDimensionsType, TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { generateAriaLabel } from '#utils/UNSAFE_visUtils/accUtils';\nimport { DatatipConfig } from '#utils/UNSAFE_visTypes/common';\nimport { addKey, containsKey, Keys, removeKey } from '#utils/UNSAFE_keys';\n\nconst hasFiniteRect = (bounds: { x: number; y: number; width: number; height: number }) =>\n Number.isFinite(bounds.x) &&\n Number.isFinite(bounds.y) &&\n Number.isFinite(bounds.width) &&\n Number.isFinite(bounds.height);\n\nconst hasFiniteSize = (dimensions: { width: number; height: number }) =>\n Number.isFinite(dimensions.width) && Number.isFinite(dimensions.height);\n\nexport function serializeDiagramKey(key: string | number) {\n return `${typeof key === 'number' ? 'n' : 's'}:${key}`;\n}\n\nexport function deserializeDiagramKey<K extends string | number>(serializedKey?: string | null) {\n if (serializedKey == null) {\n return undefined;\n }\n const prefix = serializedKey.slice(0, 2);\n const value = serializedKey.slice(2);\n if (prefix === 'n:') {\n return Number(value) as K;\n }\n if (prefix === 's:') {\n return value as K;\n }\n return undefined;\n}\n\nexport function getMapEntryBySerializedKey<K, V>(map: Map<K, V>, serializedKey?: string | null) {\n const key = deserializeDiagramKey<K & (string | number)>(serializedKey);\n if (key == null) {\n return null;\n }\n const value = map.get(key as K);\n return value !== undefined ? { key: key as K, value } : null;\n}\n\nfunction escapeAttributeValueForSelector(value: string) {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\nexport function queryElementByAttributeValue(\n root: ParentNode,\n attribute: string,\n value?: string | null\n): Element | null {\n if (value == null) {\n return null;\n }\n return root.querySelector(`[${attribute}=\"${escapeAttributeValueForSelector(value)}\"]`);\n}\n\nexport function queryElementBySerializedDiagramKey<E extends Element, K extends string | number>(\n root: ParentNode,\n attribute: string,\n key: K\n) {\n return queryElementByAttributeValue(root, attribute, serializeDiagramKey(key)) as E | null;\n}\n\n/**\n * Constructs the json object to be passed into the layout function\n */\nexport function constructLayoutJSON<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n nodeItems: Map<K1, D1>,\n linkItems: Map<K2, D2>,\n promotedLinks: PromotedLinkId<K1, D2>[],\n dimensions: Map<K1, Dimensions>,\n width: number,\n height: number,\n zoom: number,\n nodeIdToParentMap: Map<K1, K1>,\n rootRef?: RefObject<HTMLDivElement>,\n getTextDimensions?: GetTextDimensionsType\n) {\n const labelDims: Map<K1 | K2, TextDimensions> = new Map();\n const nodeValues = Array.from(nodeItems.values());\n const linkValues = Array.from(linkItems.values());\n if (getTextDimensions) {\n getLabelProps(nodeValues, linkValues, labelDims, getTextDimensions);\n }\n\n const linkKeys = Array.from(linkItems.keys());\n for (const id of linkKeys) {\n const item = linkItems.get(id as K2);\n if (item && getTextDimensions && item.label) {\n const label = item.label;\n const fontProps = _getFontProps(item.labelStyle);\n labelDims.set(id as K1 | K2, getTextDimensions(label, fontProps));\n }\n }\n const getLabelDimensions = function (data: D1 | D2) {\n return labelDims.get(data.id);\n };\n const getNodeDimensions = function (data: D1) {\n return dimensions.get(data.id);\n };\n const getRelativeNodeBounds = function (id: K1, containerId?: K1) {\n if (!Number.isFinite(zoom) || zoom <= 0) {\n return undefined;\n }\n const absPos = getAbsoluteNodePosition(id, containerId, rootRef);\n if (absPos && hasFiniteRect(absPos)) {\n return {\n x: absPos.x / zoom,\n y: absPos.y / zoom,\n width: absPos.width / zoom,\n height: absPos.height / zoom\n };\n } else {\n return undefined;\n }\n };\n\n const getContainerId = function (startNode: K1, endNode: K1) {\n return getCommonAncestorId(startNode, endNode, nodeIdToParentMap);\n };\n\n const getPromotedLinks = function () {\n return promotedLinks;\n };\n\n return {\n layoutJSON: {\n getNodeDimensions: getNodeDimensions,\n getLabelDimensions: getLabelDimensions,\n getContainerId,\n getRelativeNodeBounds,\n getPromotedLinks,\n componentSize: {\n width: width,\n height: height\n }\n },\n labelDims: labelDims\n };\n}\n\nfunction normalizeBounds(bounds: Bounds, zoom: number) {\n if (!Number.isFinite(zoom) || zoom <= 0 || !hasFiniteRect(bounds)) {\n return null;\n }\n return {\n x: bounds.x / zoom,\n y: bounds.y / zoom,\n width: bounds.width / zoom,\n height: bounds.height / zoom\n };\n}\n\nfunction getAbsoluteLinkBounds<K1 extends string | number, K2 extends string | number, D2>(\n itemId: K2 | PromotedLinkId<K1, D2>,\n referenceId: K1 | undefined,\n bounds: Map<K2 | PromotedLinkId<K1, D2>, Bounds | Dimensions>,\n zoom: number,\n rootRef?: RefObject<HTMLDivElement>,\n isPromoted?: boolean\n) {\n if (rootRef && rootRef.current) {\n let linkElement;\n if (isPromoted) {\n linkElement = queryElementByAttributeValue(\n rootRef.current,\n 'data-oj-private-promoted-link',\n getPromotedString(itemId as PromotedLinkId<K1, D2>)\n );\n } else {\n linkElement = queryElementBySerializedDiagramKey(\n rootRef.current,\n 'data-oj-private-link',\n itemId as K2\n );\n }\n let nodeContainer;\n if (referenceId) {\n nodeContainer = queryElementBySerializedDiagramKey(\n rootRef.current,\n 'data-oj-private-node',\n referenceId\n );\n }\n const dims = bounds.get(itemId);\n if (linkElement && nodeContainer && dims && hasFiniteSize(dims)) {\n const linkBoundingRect = normalizeBounds(linkElement.getBoundingClientRect(), zoom);\n const diagramBoundingRect = normalizeBounds(nodeContainer.getBoundingClientRect(), zoom);\n if (linkBoundingRect == null || diagramBoundingRect == null) {\n return null;\n }\n return {\n x: linkBoundingRect.x - diagramBoundingRect.x,\n y: linkBoundingRect.y - diagramBoundingRect.y,\n width: dims.width,\n height: dims.height\n };\n }\n }\n return null;\n}\n\nexport function getBounds<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n nodes: D1[],\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeBounds: Map<K1, Bounds>,\n linkDimensions: Map<K2, Dimensions>,\n promotedLinkDimensions: Map<string, Dimensions>,\n zoom: number,\n rootRef?: RefObject<HTMLDivElement>\n) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let topId: K1 | undefined;\n let leftId: K1 | undefined;\n for (let i = 0; i < nodes.length; i++) {\n const nodeId = nodes[i].id;\n const bounds = nodeBounds.get(nodeId);\n if (bounds) {\n if (minX > bounds.x) {\n minX = bounds.x;\n leftId = nodeId;\n }\n if (minY > bounds.y) {\n minY = bounds.y;\n topId = nodeId;\n }\n if (maxX < bounds.x + bounds.width) {\n maxX = bounds.x + bounds.width;\n }\n if (maxY < bounds.y + bounds.height) {\n maxY = bounds.y + bounds.height;\n }\n }\n }\n const nodeMinX = minX;\n const nodeMinY = minY;\n let linkMinX = 0;\n let linkMinY = 0;\n let linkMaxX = maxX - minX;\n let linkMaxY = maxY - minY;\n\n for (let i = 0; i < links.length; i++) {\n const linkId = links[i].id;\n //Top and left bounds are relative to the current most top and left nodes\n const topBounds = getAbsoluteLinkBounds(linkId, topId, linkDimensions, zoom, rootRef);\n const leftBounds = getAbsoluteLinkBounds(linkId, leftId, linkDimensions, zoom, rootRef);\n if (leftBounds) {\n if (leftBounds.x < linkMinX) {\n linkMinX = leftBounds.x;\n }\n if (linkMaxX < leftBounds.x + leftBounds.width) {\n linkMaxX = leftBounds.x + leftBounds.width;\n }\n }\n if (topBounds) {\n if (topBounds.y < linkMinY) {\n linkMinY = topBounds.y;\n }\n if (linkMaxY < topBounds.y + topBounds.height) {\n linkMaxY = topBounds.y + topBounds.height;\n }\n }\n }\n\n for (let i = 0; i < promotedLinks.length; i++) {\n const promotedLink = promotedLinks[i];\n //Top and left bounds are relative to the current most top and left nodes\n const topBounds = getAbsoluteLinkBounds(\n promotedLink,\n topId,\n promotedLinkDimensions,\n zoom,\n rootRef,\n true\n );\n const leftBounds = getAbsoluteLinkBounds(\n promotedLink,\n leftId,\n promotedLinkDimensions,\n zoom,\n rootRef,\n true\n );\n if (leftBounds) {\n if (leftBounds.x < linkMinX) {\n linkMinX = leftBounds.x;\n }\n if (linkMaxX < leftBounds.x + leftBounds.width) {\n linkMaxX = leftBounds.x + leftBounds.width;\n }\n }\n if (topBounds) {\n if (topBounds.y < linkMinY) {\n linkMinY = topBounds.y;\n }\n if (linkMaxY < topBounds.y + topBounds.height) {\n linkMaxY = topBounds.y + topBounds.height;\n }\n }\n }\n return {\n minX: nodeMinX,\n minY: nodeMinY,\n contentWidth: maxX - minX,\n contentHeight: maxY - minY,\n bounds: { x: linkMinX, y: linkMinY, width: linkMaxX - linkMinX, height: linkMaxY - linkMinY }\n };\n}\n\nfunction getAbsoluteNodePosition<K1 extends string | number>(\n nodeId: K1,\n containerId?: K1,\n rootRef?: RefObject<HTMLDivElement>\n) {\n if (rootRef && rootRef.current) {\n const nodeElement = queryElementBySerializedDiagramKey(\n rootRef.current,\n 'data-oj-private-node',\n nodeId\n );\n let nodeContainer;\n if (containerId) {\n nodeContainer = queryElementBySerializedDiagramKey(\n rootRef.current,\n 'data-oj-private-child',\n containerId\n );\n } else {\n nodeContainer = rootRef.current.querySelector('[data-oj-private-node-container]');\n }\n if (nodeElement && nodeContainer) {\n const nodeBoundingRect = nodeElement.getBoundingClientRect();\n const nodeContainerRect = nodeContainer.getBoundingClientRect();\n const bounds = {\n x: nodeBoundingRect.x - nodeContainerRect.x,\n y: nodeBoundingRect.y - nodeContainerRect.y,\n width: nodeBoundingRect.width,\n height: nodeBoundingRect.height\n };\n return hasFiniteRect(bounds) ? bounds : null;\n }\n }\n return null;\n}\n\nfunction getLabelProps<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramNodeData<K2, K1>\n>(\n nodeItems: D1[],\n linkItems: D2[],\n labelDims: Map<K1 | K2, TextDimensions>,\n getTextDimensions: GetTextDimensionsType\n) {\n nodeItems.forEach((value) => {\n if (value.nodes) {\n getNodeLabelProps<K1, K2, D1>(value.nodes, labelDims, getTextDimensions);\n }\n if (value.label) {\n const label = value.label;\n const fontProps = _getFontProps(value.labelStyle);\n labelDims.set(value.id as K1, getTextDimensions(label, fontProps));\n }\n });\n linkItems.forEach((value) => {\n if (value.label) {\n const label = value.label;\n const fontProps = _getFontProps(value.labelStyle);\n labelDims.set(value.id as K2, getTextDimensions(label, fontProps));\n }\n });\n}\n\nfunction getNodeLabelProps<K1, K2, D1 extends DiagramNodeData<K1, D1>>(\n nodeItems: D1[],\n labelDims: Map<K1 | K2, TextDimensions>,\n getTextDimensions: GetTextDimensionsType\n) {\n nodeItems.forEach((value) => {\n if (value.nodes) {\n getNodeLabelProps<K1, K2, D1>(value.nodes, labelDims, getTextDimensions);\n }\n if (value.label) {\n const label = value.label;\n const fontProps = _getFontProps(value.labelStyle);\n labelDims.set(value.id as K1, getTextDimensions(label, fontProps));\n }\n });\n}\n\n/**\n * Deconstructs the output of the layout function\n */\nexport function deconstructLayoutJSON<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(layoutJSON: DiagramLayoutOutput<K1, K2>, nodeData: D1[], linkData: D2[]) {\n const positions: Map<K1, Position> = new Map();\n const nodeLabelPos: Map<K1, DiagramLabelPosition> = new Map();\n const linkLabelPos: Map<K2, DiagramLabelPosition> = new Map();\n findPoints(layoutJSON, nodeData, positions, nodeLabelPos);\n const links = layoutJSON.links;\n let link;\n if (links) {\n for (let i = 0; i < linkData.length; i++) {\n link = links[linkData[i].id];\n if (link && link.label) linkLabelPos.set(linkData[i].id, link.label);\n }\n }\n return {\n nodePoints: positions,\n nodeLabelPos: nodeLabelPos,\n linkLabelPos: linkLabelPos\n };\n}\n\nfunction findPoints<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n output: DiagramLayoutOutput<K1, K2>,\n nodeData: D1[],\n positions: Map<K1, Position>,\n nodeLabelPos: Map<K1, DiagramLabelPosition>\n) {\n const nodes = output.nodes;\n let node;\n if (nodes) {\n for (let i = 0; i < nodeData.length; i++) {\n const data = nodeData[i];\n const id = data.id;\n if (data.nodes) {\n findPoints(output, data.nodes, positions, nodeLabelPos);\n }\n node = nodes[id];\n if (node) {\n positions.set(id, node.position);\n if (node.label) {\n nodeLabelPos.set(id, node.label);\n }\n }\n }\n }\n}\n\n/**\n * Merges the node points into the dimensions\n */\nexport function mergeDimensions<K1 extends string | number>(\n dimensions: Map<K1, Dimensions>,\n nodePoints: Map<K1, Position>,\n rootRef?: RefObject<HTMLDivElement>\n) {\n const nodeBounds: Map<K1, Bounds> = new Map();\n const nodeAbsBounds: Map<K1, Bounds> = new Map();\n dimensions.forEach((value, key) => {\n const point = nodePoints.get(key);\n const absPoint = getAbsoluteNodePosition(key, undefined, rootRef);\n const hasFinitePoint = point != null && Number.isFinite(point.x) && Number.isFinite(point.y);\n const hasFiniteSize = Number.isFinite(value.width) && Number.isFinite(value.height);\n const hasFiniteAbsPoint =\n absPoint != null &&\n Number.isFinite(absPoint.x) &&\n Number.isFinite(absPoint.y) &&\n Number.isFinite(absPoint.width) &&\n Number.isFinite(absPoint.height);\n\n if (hasFinitePoint && hasFiniteSize) {\n nodeBounds.set(key, { x: point.x, y: point.y, width: value.width, height: value.height });\n }\n if (hasFiniteAbsPoint && hasFiniteSize) {\n nodeAbsBounds.set(key, {\n x: absPoint.x,\n y: absPoint.y,\n width: value.width,\n height: value.height\n });\n }\n });\n return { nodeBounds, nodeAbsBounds };\n}\n\n/**\n * Deep equality check for whether two arrays of bounds are the same\n */\nexport function isEqualBounds<K1>(bounds1: Map<K1, Bounds>, bounds2: Map<K1, Bounds>) {\n if (bounds1.size !== bounds2.size) return false;\n let equal = true;\n bounds1.forEach((value, key) => {\n const b2Value = bounds2.get(key);\n if (!b2Value) equal = false;\n else if (\n Math.abs(value.x - b2Value.x) > 0.5 ||\n Math.abs(value.y - b2Value.y) > 0.5 ||\n Math.abs(value.width - b2Value.width) > 0.5 ||\n Math.abs(value.height - b2Value.height) > 0.5\n )\n equal = false;\n });\n return equal;\n}\n\n/**\n * Returns the text for the diagram datatip.\n */\nexport function getDatatipContent<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n nodesMap: Map<K1, D1>,\n linksMap: Map<K2, D2>,\n focusedItem?: ItemInfo<K1, K2, D2>,\n hoveredItem?: ItemInfo<K1, K2, D2>,\n datatip?: DatatipConfig<DatatipContext<K1, D1, D2>>\n) {\n let itemInfo;\n const isPointerActive = hoveredItem?.isCurrent;\n if (isPointerActive && hoveredItem.id != null) {\n itemInfo = hoveredItem;\n }\n if (focusedItem && focusedItem.isCurrent) {\n itemInfo = focusedItem;\n }\n if (itemInfo && datatip) {\n let context: DatatipContext<K1, D1, D2>;\n switch (itemInfo.type) {\n case 'node': {\n context = { data: nodesMap.get(itemInfo.id as K1) as D1, type: 'node' };\n break;\n }\n case 'link': {\n context = { data: linksMap.get(itemInfo.id as K2) as D2, type: 'link' };\n break;\n }\n default: {\n context = { id: itemInfo.id as PromotedLinkId<K1, D2>, type: 'promotedLink' };\n }\n }\n\n return datatip(context);\n }\n if (itemInfo) {\n const text = (\n itemInfo.type === 'node' ? nodesMap.get(itemInfo.id as K1) : linksMap.get(itemInfo.id as K2)\n )?.accessibleLabel;\n return {\n content: text\n };\n }\n return;\n}\n\n/**\n * Creates a map with key id and value node or link data\n */\nexport function createLinksMap<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n items: (D2 | DiagramLinkData<string, K1>)[]\n) {\n const itemIdToDataMap = new Map();\n const itemIdToIndexMap = new Map();\n const itemIndexToIdMap = new Map();\n const itemIdToParentMap = new Map();\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n itemIdToDataMap.set(item.id, item);\n itemIdToIndexMap.set(item.id, i);\n itemIndexToIdMap.set(i, item.id);\n }\n return {\n itemIdToDataMap,\n itemIdToIndexMap,\n itemIndexToIdMap,\n itemIdToParentMap\n };\n}\n\n/**\n * Creates a map with key id and value node or link data\n */\nexport function createPromotedLinksMap<K1 extends string | number, D2>(\n items: PromotedLinkId<K1, D2>[]\n) {\n const promotedLinkMap = new Map();\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n promotedLinkMap.set(getPromotedString(item), item);\n }\n return promotedLinkMap;\n}\n\n/**\n * Creates a map with key id and value node or link data\n */\nexport function createNodesMap<K1, D1 extends DiagramNodeData<K1, D1>>(\n items: D1[],\n expanded: Keys<K1>\n) {\n const itemIdToDataMap = new Map<K1, D1>();\n const itemIdToIndexMap = new Map<K1, string>();\n const itemIndexToIdMap = new Map<string, K1>();\n const itemIdToParentMap = new Map<K1, K1>();\n const allContainerNodes: D1[] = [];\n const allVisibleNodes: K1[] = [];\n const allVisibleNodesData: D1[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const index = String(i);\n itemIdToDataMap.set(item.id, item);\n itemIdToIndexMap.set(item.id, index);\n itemIndexToIdMap.set(index, item.id);\n allVisibleNodes.push(item.id);\n allVisibleNodesData.push(item);\n if ((item as D1).nodes) {\n allContainerNodes.push(item);\n if (containsKey(expanded, item.id)) {\n _createItemMap<K1, D1>(\n (item as D1).nodes!,\n itemIdToDataMap,\n itemIdToIndexMap,\n itemIndexToIdMap,\n itemIdToParentMap,\n allContainerNodes,\n expanded,\n allVisibleNodes,\n allVisibleNodesData,\n item.id as K1,\n String(i)\n );\n }\n }\n }\n return {\n itemIdToDataMap,\n itemIdToIndexMap,\n itemIndexToIdMap,\n itemIdToParentMap,\n allContainerNodes,\n allVisibleNodes,\n allVisibleNodesData\n };\n}\n\nfunction _createItemMap<K1, D1 extends DiagramNodeData<K1, D1>>(\n items: D1[],\n itemIdToDataMap: Map<K1, D1>,\n itemIdToIndexMap: Map<K1, string>,\n itemIndexToIdMap: Map<string, K1>,\n itemIdToParentMap: Map<K1, K1>,\n allContainerNodes: D1[],\n expanded: Keys<K1>,\n allVisibleNodes: K1[],\n allVisibleNodesData: D1[],\n parentId: K1,\n parentIndex: string\n) {\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const index = `${parentIndex}_${i}`;\n itemIdToDataMap.set(item.id, item);\n itemIdToIndexMap.set(item.id, index);\n itemIndexToIdMap.set(index, item.id);\n itemIdToParentMap.set(item.id, parentId);\n allVisibleNodes.push(item.id);\n allVisibleNodesData.push(item);\n if (item.nodes) {\n allContainerNodes.push(item);\n if (containsKey(expanded, item.id)) {\n _createItemMap(\n item.nodes,\n itemIdToDataMap,\n itemIdToIndexMap,\n itemIndexToIdMap,\n itemIdToParentMap,\n allContainerNodes,\n expanded,\n allVisibleNodes,\n allVisibleNodesData,\n item.id,\n index\n );\n }\n }\n }\n}\n\n/**\n * Filter out links with no start or end nodes\n */\nexport function filterLinksWithNoStartOrEndNodes<K2, K1, D1, D2 extends DiagramLinkData<K2, K1>>(\n links: D2[],\n nodesMap: Map<K1, D1>\n) {\n const newLinks: D2[] = [];\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n if (nodesMap.get(link.startNode) && nodesMap.get(link.endNode)) {\n newLinks.push(link);\n }\n }\n return newLinks;\n}\n\n/**\n * Pulls out the dimensions from an array of bounds\n */\nexport function getDimensionsFromBounds<K1>(bounds: Map<K1, Bounds>) {\n const dims: Map<K1, Dimensions> = new Map();\n bounds.forEach((value, key) => {\n dims.set(key, { width: value.width, height: value.height });\n });\n return dims;\n}\n\n/**\n * Returns the center position of the node or link\n * For links, draws a straight line between the centers of the start/end node\n * and returns the center of that line\n */\nexport function getFocusedItemBounds<\n K1 extends string | number,\n K2 extends string | number,\n D2 extends DiagramLinkData<K2, K1>\n>(\n focusedItemInfo: ItemInfo<K1, K2, D2>,\n bounds: Map<K1, Bounds>,\n links: D2[],\n linkIdToIndexMap: Map<K2, number>,\n zoom: number,\n rootRef?: RefObject<HTMLDivElement>\n) {\n if (focusedItemInfo.type === 'node') {\n const nodeBounds = bounds.get(focusedItemInfo.id as K1) || bounds.values().next().value!;\n const liveBounds = getAbsoluteNodePosition(focusedItemInfo.id as K1, undefined, rootRef);\n if (liveBounds && hasFiniteRect(liveBounds) && Number.isFinite(zoom) && zoom > 0) {\n return {\n x: liveBounds.x,\n y: liveBounds.y,\n width: liveBounds.width / zoom,\n height: liveBounds.height / zoom\n };\n }\n\n // Return the first element if cannot find the Node index\n return {\n x: nodeBounds.x,\n y: nodeBounds.y,\n width: nodeBounds.width,\n height: nodeBounds.height\n };\n } else {\n // Center of a straight line between start/end node centers\n const link =\n focusedItemInfo.type === 'promotedLink'\n ? focusedItemInfo.id\n : links[linkIdToIndexMap.get(focusedItemInfo.id as K2) || 0];\n const startNB = bounds.get(link.startNode) || bounds.values().next().value!;\n const endNB = bounds.get(link.endNode) || bounds.values().next().value!;\n const startNCenter = {\n x: startNB.x + startNB.width / 2,\n y: startNB.y + startNB.height / 2\n };\n const endNCenter = { x: endNB.x + endNB.width / 2, y: endNB.y + endNB.height / 2 };\n\n const minX = Math.min(startNCenter.x, endNCenter.x);\n const minY = Math.min(startNCenter.y, endNCenter.y);\n return {\n x: minX,\n y: minY,\n width: Math.abs(startNCenter.x - endNCenter.x),\n height: Math.abs(startNCenter.y - endNCenter.y)\n };\n }\n}\n\n/**\n * Returns the bounds of the diagram content\n */\nexport function getContentBounds<K1>(nodeBounds: Map<K1, Bounds>, labelBounds?: Bounds): Bounds {\n if (nodeBounds.size === 0) return { x: 0, width: Infinity, y: 0, height: Infinity };\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let dims;\n nodeBounds.forEach((value) => {\n dims = value;\n minX = dims.x < minX ? dims.x : minX;\n minY = dims.y < minY ? dims.y : minY;\n maxX = dims.x + dims.width > maxX ? dims.x + dims.width : maxX;\n maxY = dims.y + dims.height > maxY ? dims.y + dims.height : maxY;\n });\n if (labelBounds) {\n minX = labelBounds.x < minX ? labelBounds.x : minX;\n minY = labelBounds.y < minY ? labelBounds.y : minY;\n maxX = labelBounds.x + labelBounds.width > maxX ? labelBounds.x + labelBounds.width : maxX;\n maxY = labelBounds.y + labelBounds.height > maxY ? labelBounds.y + labelBounds.height : maxY;\n }\n return { x: minX, width: maxX - minX, y: minY, height: maxY - minY };\n}\n\n/**\n * Returns the label bounds\n */\nexport function getAllLabelBounds<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n labelDims: Map<K1 | K2, TextDimensions>,\n nodeLabelPos: Map<K1, DiagramLabelPosition> = new Map(),\n linkLabelPos: Map<K2, DiagramLabelPosition> = new Map(),\n isRTL: boolean,\n rootRef?: RefObject<HTMLDivElement>\n) {\n if (nodeLabelPos.size === 0) return undefined;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let dims;\n let nodeBound;\n\n nodeLabelPos.forEach((value, key) => {\n dims = getLabelBounds(value, labelDims.get(key)!, isRTL);\n nodeBound = getAbsoluteNodePosition(key, undefined, rootRef);\n if (nodeBound) {\n minX = dims.x + nodeBound.x < minX ? dims.x + nodeBound.x : minX;\n minY = dims.y + nodeBound.y < minY ? dims.y + nodeBound.y : minY;\n maxX = dims.x + dims.width + nodeBound.x > maxX ? dims.x + dims.width + nodeBound.x : maxX;\n maxY = dims.y + dims.height + nodeBound.y > maxY ? dims.y + dims.height + nodeBound.y : maxY;\n }\n });\n linkLabelPos.forEach((value, key) => {\n dims = getLabelBounds(value, labelDims.get(key)!, isRTL);\n if (dims) {\n minX = dims.x < minX ? dims.x : minX;\n minY = dims.y < minY ? dims.y : minY;\n maxX = dims.x + dims.width > maxX ? dims.x + dims.width : maxX;\n maxY = dims.y + dims.height > maxY ? dims.y + dims.height : maxY;\n }\n });\n return { x: minX, width: maxX - minX, y: minY, height: maxY - minY };\n}\n\nfunction getLabelBounds(label: DiagramLabelPosition, dims: TextDimensions, isRTL: boolean) {\n const labelPos = getLabelPosition(dims, label, isRTL);\n const isRotating = label.rotationAngle;\n if (!isRotating) {\n return { x: labelPos.x, y: labelPos.y, width: dims.width, height: dims.height };\n } else {\n // Find the 4 corners of the label bounds relative to the rotation point\n const rotationPoint = label.rotationPoint\n ? label.rotationPoint\n : { x: dims.width / 2, y: dims.height / 2 };\n const angle = label.rotationAngle!;\n const topLeft = getCoordsRelToRotPoint({ x: 0, y: 0 }, rotationPoint);\n const topRight = getCoordsRelToRotPoint({ x: dims.width, y: 0 }, rotationPoint);\n const bottomLeft = getCoordsRelToRotPoint({ x: 0, y: dims.height }, rotationPoint);\n const bottomRight = getCoordsRelToRotPoint({ x: dims.width, y: dims.height }, rotationPoint);\n const rotTopLeft = rotatePoint(topLeft, angle);\n const rotBotLeft = rotatePoint(bottomLeft, angle);\n const rotTopRight = rotatePoint(topRight, angle);\n const rotBotRight = rotatePoint(bottomRight, angle);\n const points = [rotTopLeft, rotBotLeft, rotTopRight, rotBotRight].map((pos: Position) => {\n return {\n x: pos.x + labelPos.x + rotationPoint.x,\n y: pos.y + labelPos.y + rotationPoint.y\n };\n });\n return getBoundsFromPoints(points);\n }\n}\n\nfunction getCoordsRelToRotPoint(labelPoint: Position, rotPoint: Position) {\n return { x: labelPoint.x - rotPoint.x, y: labelPoint.y - rotPoint.y };\n}\n\nfunction rotatePoint(pos: Position, angle: number) {\n return {\n x: pos.x * Math.cos(angle) - pos.y * Math.sin(angle),\n y: pos.x * Math.sin(angle) + pos.y * Math.cos(angle)\n };\n}\n\nfunction getBoundsFromPoints(points: Position[]) {\n let minX = points[0].x;\n let minY = points[0].y;\n let maxX = points[0].x;\n let maxY = points[0].y;\n for (let i = 1; i < points.length; i++) {\n const point = points[i];\n if (point.x < minX) minX = point.x;\n else if (point.x > maxX) maxX = point.x;\n if (point.y < minY) minY = point.y;\n else if (point.y > maxY) maxY = point.y;\n }\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\n\n/**\n * Returns the position of the label\n * @param dimensions\n * @param positionProps\n * @returns position of the label\n */\nexport function getLabelPosition(\n dimensions: TextDimensions,\n positionProps: DiagramLabelPosition,\n isRTL: boolean\n) {\n const position = positionProps.position;\n const hAlign = positionProps.hAlign ? positionProps.hAlign : isRTL ? 'right' : 'left';\n const vAlign = positionProps.vAlign;\n let x, y;\n if (hAlign === 'center') {\n x = position.x - dimensions.width / 2;\n } else if (hAlign === 'right') {\n x = position.x - dimensions.width;\n } else {\n x = position.x;\n }\n\n if (vAlign === 'middle') {\n y = position.y - dimensions.height / 2;\n } else if (vAlign === 'bottom') {\n y = position.y - dimensions.height;\n } else if (vAlign === 'baseline') {\n y = position.y + dimensions.y;\n } else {\n y = position.y;\n }\n return {\n x: x,\n y: y\n };\n}\n\n/**\n * Compares if two ItemInfo are equal\n */\nexport function isEqualItem<K1, K2, D2>(\n item1?: ItemInfo<K1, K2, D2>,\n item2?: ItemInfo<K1, K2, D2>\n) {\n if (item1?.type === 'promotedLink' && item2?.type === 'promotedLink') {\n return isSamePromotedLinkId(item1.id, item2.id);\n }\n return item1?.id === item2?.id && item1?.type === item2?.type;\n}\n\nconst isPromotedLinkId = <K1 extends string | number, D2>(\n value: unknown\n): value is PromotedLinkId<K1, D2> => {\n return typeof value === 'object' && value != null && 'startNode' in value && 'endNode' in value;\n};\n\nexport function isSamePromotedLinkId<K1 extends string | number, D2>(\n id1: unknown,\n id2: unknown\n) {\n if (id1 == null || id2 == null) {\n return id1 === id2;\n }\n if (!isPromotedLinkId<K1, D2>(id1) || !isPromotedLinkId<K1, D2>(id2)) {\n return false;\n }\n return getPromotedString(id1) === getPromotedString(id2);\n}\n\nexport function includesPromotedLinkId<K1, D2>(\n ids: PromotedLinkId<K1, D2>[],\n id: PromotedLinkId<K1, D2>\n) {\n return ids.some((candidate) => isSamePromotedLinkId(candidate, id));\n}\n\n/**\n * Returns the item info of the data-oj-node or data-oj-link attribute for a given element.\n */\nexport function getNavigableInfo<K1, K2, D2>(\n element: Element,\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>,\n nodesMap: Map<K1, unknown>,\n linksMap: Map<K2, unknown>,\n rootElementRef?: RefObject<HTMLDivElement>\n): ItemInfo<K1, K2, D2> {\n let type;\n let elem = element;\n let navigableId: K1 | K2 | PromotedLinkId<K1, D2> | undefined;\n while (navigableId == null) {\n const element = elem as HTMLElement;\n if (element.dataset['ojPrivateNode']) {\n const entry = getMapEntryBySerializedKey(nodesMap, element.dataset['ojPrivateNode']);\n if (entry) {\n type = 'node';\n navigableId = entry.key;\n }\n } else if (element.dataset['ojPrivateLink']) {\n const entry = getMapEntryBySerializedKey(linksMap, element.dataset['ojPrivateLink']);\n if (entry) {\n navigableId = entry.key;\n type = 'link';\n }\n } else if (element.dataset['ojPrivatePromotedLink']) {\n navigableId = promotedLinkMap.get(element.dataset['ojPrivatePromotedLink']);\n type = 'promotedLink';\n }\n if (navigableId == null) {\n if (elem.parentElement && elem.parentElement !== rootElementRef?.current) {\n elem = elem.parentElement;\n } else {\n break;\n }\n }\n }\n return {\n id: navigableId as K1 | K2,\n type: type\n } as ItemInfo<K1, K2, D2>;\n}\n\n/**\n * Returns the id of the node the expand collapse button belongs to\n */\nexport function expCollapseButtonId<K1>(\n element: HTMLElement,\n nodesMap: Map<K1, unknown>,\n rootElementRef?: RefObject<HTMLDivElement>\n): K1 | undefined {\n let elem = element;\n let id: K1 | undefined;\n while (id == null) {\n id = getMapEntryBySerializedKey(nodesMap, elem.dataset['ojPrivateButton'])?.key;\n if (!id) {\n if (\n elem.parentElement &&\n !elem.parentElement.dataset['ojPrivateNode'] &&\n elem.parentElement !== rootElementRef?.current\n ) {\n elem = elem.parentElement;\n } else {\n break;\n }\n }\n }\n return id;\n}\n\n/**\n * Returns the aria label\n */\nexport function getItemAriaLabel(\n translations: BundleType,\n supportsSelection: boolean,\n states: {\n isSelected?: boolean;\n isIndirect?: boolean;\n isExpanded?: boolean;\n isCollapsed?: boolean;\n containsControls?: boolean;\n },\n accessibleLabel?: string\n) {\n return generateAriaLabel(translations, accessibleLabel || '', {\n isSelected: !supportsSelection ? undefined : states.isSelected,\n isIndirect: states.isIndirect,\n isExpanded: states.isExpanded,\n isCollapsed: states.isCollapsed,\n containsControls: states.containsControls\n });\n}\n\n/**\n * Returns the font props for a node or link\n */\nfunction _getFontProps(styles?: DiagramLabelStyles) {\n const fontProps: Font = {};\n if (!styles) return fontProps;\n if (styles.fontFamily) fontProps.fontFamily = styles.fontFamily;\n if (styles.fontSize) fontProps.fontSize = styles.fontSize;\n if (styles.fontStyle) fontProps.fontStyle = styles.fontStyle;\n if (styles.fontWeight) fontProps.fontWeight = styles.fontWeight;\n return fontProps;\n}\n\n/**\n * Returns whether the node is a leaf node\n */\n\nexport function isLeafNode<K1, D1 extends DiagramNodeData<K1, D1>>(nodeData: D1) {\n return !nodeData.nodes;\n}\n\nexport function isContainerReady<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n nodeData: D1,\n nodeBounds: Map<K1, Bounds>,\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n linkDimensions: Map<K2, Dimensions>,\n promotedLinkDimensions: Map<string, Dimensions>\n) {\n const nodes = nodeData.nodes!;\n for (let i = 0; i < nodes?.length; i++) {\n const child = nodes[i].id;\n if (!nodeBounds.get(child)) {\n return false;\n }\n }\n for (let i = 0; i < links.length; i++) {\n const link = links[i].id;\n const linkDims = linkDimensions.get(link);\n if (!linkDims || (linkDims.width === 0 && linkDims.height === 0)) {\n return false;\n }\n }\n for (let i = 0; i < promotedLinks.length; i++) {\n const link = promotedLinks[i];\n const linkDims = promotedLinkDimensions.get(getPromotedString(link));\n if (!linkDims || (linkDims.width === 0 && linkDims.height === 0)) {\n return false;\n }\n }\n return true;\n}\n\nexport function getPromotedString<K1 extends string | number, D2>(id: PromotedLinkId<K1, D2>) {\n return `${serializeDiagramKey(id.startNode)}_${serializeDiagramKey(id.endNode)}`;\n}\n\nexport function comparePromotedLinks<K1, D2>(\n link1: PromotedLinkId<K1, D2>,\n link2: PromotedLinkId<K1, D2>\n) {\n return link1.startNode === link2.startNode && link1.endNode === link2.endNode;\n}\n\nexport function isPromoted<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n link: D2 | PromotedLinkId<K1, D2>\n) {\n return !('id' in link);\n}\n\nfunction getCommonAncestorId<K1>(startId: K1, endId: K1, nodeIdToParentMap: Map<K1, K1>) {\n const startAnc = _getAncestorIds(startId, nodeIdToParentMap);\n const endAnc = _getAncestorIds(endId, nodeIdToParentMap);\n for (let i = 0; i < startAnc.length; i++) {\n if (endAnc.indexOf(startAnc[i]) > -1) {\n return startAnc[i];\n }\n }\n return undefined;\n}\n\nexport function getLinksForNode<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n containerId: K1 | undefined,\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeIdToParentMap: Map<K1, K1>\n) {\n // front links are in front of nodes\n const frontLinks = [];\n const backLinks = [];\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n const ancId = getCommonAncestorId(link.startNode, link.endNode, nodeIdToParentMap);\n if (ancId === containerId) {\n if (!nodeIdToParentMap.get(link.startNode) && !nodeIdToParentMap.get(link.endNode))\n backLinks.push(link);\n else frontLinks.push(link);\n }\n }\n const frontPromotedLinks = [];\n const backPromotedLinks = [];\n for (let i = 0; i < promotedLinks.length; i++) {\n const link = promotedLinks[i];\n const ancId = getCommonAncestorId(link.startNode, link.endNode, nodeIdToParentMap);\n if (ancId === containerId) {\n if (!nodeIdToParentMap.get(link.startNode) && !nodeIdToParentMap.get(link.endNode))\n backPromotedLinks.push(link);\n else frontPromotedLinks.push(link);\n }\n }\n return { frontLinks, frontPromotedLinks, backLinks, backPromotedLinks };\n}\n\nfunction _getAncestorIds<K1, D1 extends DiagramNodeData<K1, D1>>(nodeId: K1, nodes: Map<K1, K1>) {\n const ancestors = [];\n let anc = nodes.get(nodeId);\n while (anc !== undefined) {\n ancestors.push(anc);\n anc = nodes.get(anc);\n }\n return ancestors;\n}\n\nexport function containerLinksReady<\n K1 extends string | number,\n K2 extends string | number,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>(containerLinks: (D2 | PromotedLinkId<K1, D2>)[], layoutOutput: L) {\n const nodes = layoutOutput.nodes;\n for (let i = 0; i < containerLinks.length; i++) {\n const link = containerLinks[i];\n if (!(nodes[link.startNode] && nodes[link.endNode])) {\n return false;\n }\n }\n return true;\n}\n\nexport function changeExpanded<K1>(id: K1, expanded: Keys<K1>) {\n if (containsKey(expanded, id)) {\n return removeKey(expanded, id, false);\n } else {\n return addKey(expanded, id);\n }\n}\n\nexport function getPromotedLinks<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(links: D2[], expanded: Keys<K1>, allContainerNodes: D1[], allVisibleNodes: K1[]) {\n const collapsed: D1[] = [];\n allContainerNodes.forEach((node: D1) => {\n if (!containsKey(expanded, node.id)) {\n collapsed.push(node);\n }\n });\n const promotedLinks = [];\n const linkToPromotedMap = new Map<K2, string>();\n const promotedToLinkMap = new Map<string, D2[]>();\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n const linkId = link.id;\n const startVisible = allVisibleNodes.includes(link.startNode)\n ? link.startNode\n : firstVisibleAncestor(link.startNode, collapsed);\n const endVisible = allVisibleNodes.includes(link.endNode)\n ? link.endNode\n : firstVisibleAncestor(link.endNode, collapsed);\n if (\n startVisible &&\n endVisible &&\n (startVisible !== link.startNode || endVisible !== link.endNode) &&\n startVisible !== endVisible\n ) {\n const promotedLinkId = `${startVisible}_${endVisible}`;\n let subLinks = promotedToLinkMap.get(promotedLinkId);\n if (subLinks) {\n subLinks.push(link);\n } else {\n const promotedLink = {\n id: promotedLinkId,\n startNode: startVisible,\n endNode: endVisible\n };\n promotedLinks.push(promotedLink);\n subLinks = [link];\n }\n promotedToLinkMap.set(promotedLinkId, subLinks);\n linkToPromotedMap.set(linkId, promotedLinkId);\n }\n }\n const finalPromoted = [];\n for (let i = 0; i < promotedLinks.length; i++) {\n const promotedLink = promotedLinks[i];\n finalPromoted.push({\n startNode: promotedLink.startNode,\n endNode: promotedLink.endNode,\n links: promotedToLinkMap.get(promotedLink.id)!\n });\n }\n return finalPromoted;\n}\n\n// One of the start/end node position changed causing the link position to change\nexport function linkPositionChanged<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n nodeBounds: Map<K1, Bounds>,\n bounds: Map<K1, Bounds>,\n links: D2[]\n) {\n const nodesWithLinks: K1[] = [];\n links.forEach((value) => {\n if (!nodesWithLinks.includes(value.startNode)) {\n nodesWithLinks.push(value.startNode);\n }\n if (!nodesWithLinks.includes(value.endNode)) {\n nodesWithLinks.push(value.endNode);\n }\n });\n let rerender = false;\n nodeBounds.forEach((value, key) => {\n const b2Value = bounds.get(key);\n let equal = true;\n if (!b2Value) equal = false;\n else if (\n Math.abs(value.x - b2Value.x) > 0.5 ||\n Math.abs(value.y - b2Value.y) > 0.5 ||\n Math.abs(value.width - b2Value.width) > 0.5 ||\n Math.abs(value.height - b2Value.height) > 0.5\n ) {\n equal = false;\n }\n if (!equal && nodesWithLinks.includes(key)) {\n rerender = true;\n }\n });\n return rerender;\n}\n\nexport function getChildInfo<K1, D1 extends DiagramNodeData<K1, D1>>(\n id: K1,\n nodeIdToDataMap: Map<K1, D1>\n) {\n const nodes = nodeIdToDataMap.get(id)?.nodes;\n if (nodes && nodes.length > 0) {\n return nodes[0];\n }\n return undefined;\n}\n\nfunction firstVisibleAncestor<K1, D1 extends DiagramNodeData<K1, D1>>(nodeId: K1, collapsed: D1[]) {\n const isDescendant = (chId: K1, data?: D1[]) => {\n if (data) {\n for (let i = 0; i < data.length; i++) {\n if (data[i].id === chId || isDescendant(chId, data[i].nodes)) {\n return true;\n }\n }\n }\n return false;\n };\n for (let i = 0; i < collapsed.length; i++) {\n const node = collapsed[i];\n if (isDescendant(nodeId, node.nodes)) {\n return node.id;\n }\n }\n return null;\n}\n","import type { DiagramLabelPosition, DiagramLabelStyles } from './diagram.types';\nimport { getLabelPosition } from './utils/diagramUtils';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { labelStyles } from './themes/DiagramStyles.css';\nimport type { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { Property } from 'csstype';\n\n/**\n * Props for the label component\n */\ntype LabelProps = {\n styles?: LabelStyles;\n text: string;\n position: DiagramLabelPosition;\n dimensions: TextDimensions;\n isRTL: boolean;\n};\n\n/**\n * Label styles\n */\ntype LabelStyles = DiagramLabelStyles & {\n borderStyle?: Property.BorderStyle;\n};\n\nexport const DiagramLabel = ({ text, position, styles, dimensions, isRTL }: LabelProps) => {\n const { labelStyle, labelBorderStyle } = labelStyles;\n\n const labelPosition = getLabelPosition(dimensions, position, isRTL);\n const labelRotation = getLabelRotation(position);\n return (\n <div\n class={classNames([labelStyle, styles && styles.borderColor && labelBorderStyle])}\n style={{\n top: labelPosition.y,\n left: labelPosition.x,\n ...styles,\n ...labelRotation\n }}>\n {text}\n </div>\n );\n};\n\n/**\n * Returns the label rotation props\n * @param position\n * @returns rotation props\n */\nfunction getLabelRotation(position: DiagramLabelPosition) {\n const rotationAngle = position.rotationAngle;\n const rotationPoint = position.rotationPoint;\n const rotation: {\n transform?: string;\n 'transform-origin'?: string;\n } = {};\n if (rotationAngle) {\n rotation['transform'] = `rotate(${rotationAngle}deg)`;\n }\n if (rotationPoint) {\n rotation['transform-origin'] = `${rotationPoint.x}px ${rotationPoint.y}px`;\n }\n return rotation;\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { allTabbableElements } from '#utils/PRIVATE_tabbableUtils';\nimport type { FocusableElement } from '#utils/PRIVATE_tabbableUtils';\n\nexport const NODE_ITEM_SELECTOR = '[data-oj-private-node]';\nexport const LINK_ITEM_SELECTOR = '[data-oj-private-link]';\nexport const PROMOTED_LINK_ITEM_SELECTOR = '[data-oj-private-promoted-link]';\nconst ROVING_TABINDEX_ATTR = 'data-oj-roving-tabindex-item';\nconst ROVING_RESTORE_PREFIX = 'roving:';\n\nconst BASE_FOCUSABLE_DESCENDANT_SELECTOR_PARTS = [\n 'button:not([disabled]):not([hidden])',\n '[href]:not([disabled]):not([hidden])',\n 'input:not([disabled]):not([hidden])',\n 'select:not([disabled]):not([hidden])',\n 'textarea:not([disabled]):not([hidden])',\n 'video:not([disabled]):not([hidden])',\n \"[contenteditable]:not([contenteditable='false'])\"\n];\n\nconst FOCUSABLE_DESCENDANT_SELECTOR = [\n ...BASE_FOCUSABLE_DESCENDANT_SELECTOR_PARTS,\n '[tabindex]:not([disabled]):not([hidden])'\n].join(', ');\n\nconst getFocusScope = (contentElement: Element | null, focusScopeSelector?: string) => {\n if (!(contentElement instanceof HTMLElement || contentElement instanceof SVGElement)) {\n return null;\n }\n\n const focusScopeCandidate =\n focusScopeSelector != null ? contentElement.querySelector(focusScopeSelector) : null;\n return focusScopeCandidate instanceof HTMLElement || focusScopeCandidate instanceof SVGElement\n ? focusScopeCandidate\n : contentElement;\n};\n\nexport const getClosestFocusableDescendant = (element: Element | null) => {\n if (element == null) {\n return null;\n }\n\n if (element.matches(FOCUSABLE_DESCENDANT_SELECTOR)) {\n return element as FocusableElement;\n }\n\n return element.closest(FOCUSABLE_DESCENDANT_SELECTOR) as FocusableElement | null;\n};\n\nexport const getRestorableFocusIds = (rootElement: HTMLElement, activeElement: Element | null) => {\n if (!activeElement || activeElement === rootElement || !rootElement.contains(activeElement)) {\n return {\n activeElementId: null,\n activeCustomElementId: null\n };\n }\n\n if (activeElement instanceof HTMLElement) {\n const rovingTabIndexId = activeElement.getAttribute(ROVING_TABINDEX_ATTR);\n if (rovingTabIndexId) {\n return {\n activeElementId: null,\n activeCustomElementId: `${ROVING_RESTORE_PREFIX}${rovingTabIndexId}`\n };\n }\n }\n\n if (activeElement instanceof HTMLElement && activeElement.id) {\n return {\n activeElementId: activeElement.id,\n activeCustomElementId: null\n };\n }\n\n let parentElement = activeElement.parentElement;\n while (parentElement && parentElement !== rootElement) {\n if (\n parentElement.matches(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n )\n ) {\n break;\n }\n if (parentElement.id) {\n return {\n activeElementId: null,\n activeCustomElementId: parentElement.id\n };\n }\n parentElement = parentElement.parentElement;\n }\n\n return {\n activeElementId: null,\n activeCustomElementId: null\n };\n};\n\nexport const getRestorableElement = (\n rootElement: HTMLElement,\n focusedItemElement: Element,\n elementId: string | null\n) => {\n if (!elementId) {\n return null;\n }\n\n const candidate = rootElement.ownerDocument.getElementById(elementId);\n if (!(candidate instanceof HTMLElement) || !focusedItemElement.contains(candidate)) {\n return null;\n }\n\n return candidate;\n};\n\nconst getDiagramItemTabbables = (contentElement: Element | null, focusScopeSelector?: string) => {\n const focusScope = getFocusScope(contentElement, focusScopeSelector);\n if (focusScope == null) {\n return [];\n }\n\n return allTabbableElements(focusScope as FocusableElement);\n};\n\nexport const focusDiagramItemContent = ({\n contentElement,\n focusAction,\n restoreElementId,\n restoreCustomElementId,\n focusScopeSelector\n}: {\n contentElement: Element | null;\n focusAction?: 'first' | 'restore';\n restoreElementId?: string | null;\n restoreCustomElementId?: string | null;\n focusScopeSelector?: string;\n}) => {\n const focusScope = getFocusScope(contentElement, focusScopeSelector);\n if (focusScope == null) {\n return false;\n }\n\n const tabbables = getDiagramItemTabbables(contentElement, focusScopeSelector);\n\n if (focusAction === 'restore') {\n for (const restoreId of [restoreElementId, restoreCustomElementId]) {\n if (!restoreId) {\n continue;\n }\n\n const restoreTarget = restoreId.startsWith(ROVING_RESTORE_PREFIX)\n ? (focusScope.querySelector(\n `[${ROVING_TABINDEX_ATTR}=\"${restoreId.slice(ROVING_RESTORE_PREFIX.length)}\"]`\n ) as Element | null)\n : (focusScope.ownerDocument.getElementById(restoreId) as Element | null);\n if (\n restoreTarget != null &&\n focusScope.contains(restoreTarget) &&\n 'focus' in restoreTarget &&\n typeof restoreTarget.focus === 'function'\n ) {\n restoreTarget.focus({ preventScroll: true });\n return true;\n }\n }\n }\n\n if (tabbables.length > 0) {\n tabbables[0].focus({ preventScroll: true });\n return true;\n }\n\n return false;\n};\n\nexport const hasDiagramItemTabbables = ({\n contentElement,\n focusScopeSelector\n}: {\n contentElement: Element | null;\n focusScopeSelector?: string;\n}) => getDiagramItemTabbables(contentElement, focusScopeSelector).length > 0;\n\nexport const containFocusWithinDiagramItem = ({\n event,\n contentElement,\n focusScopeSelector\n}: {\n event: KeyboardEvent;\n contentElement: Element | null;\n focusScopeSelector?: string;\n}) => {\n if (event.key !== 'Tab') {\n return false;\n }\n\n if (!(contentElement instanceof HTMLElement || contentElement instanceof SVGElement)) {\n return false;\n }\n\n const focusScopeCandidate =\n focusScopeSelector != null ? contentElement.querySelector(focusScopeSelector) : null;\n const focusScope =\n focusScopeCandidate instanceof HTMLElement || focusScopeCandidate instanceof SVGElement\n ? focusScopeCandidate\n : contentElement;\n const tabbables = allTabbableElements(focusScope as FocusableElement);\n if (tabbables.length === 0) {\n return false;\n }\n\n const activeElement = contentElement.ownerDocument.activeElement as Element | null;\n const firstTabbable = tabbables[0];\n const lastTabbable = tabbables[tabbables.length - 1];\n const isActiveWithinScope = activeElement != null && focusScope.contains(activeElement);\n\n if (\n (!event.shiftKey && (!isActiveWithinScope || activeElement === lastTabbable)) ||\n (event.shiftKey && (!isActiveWithinScope || activeElement === firstTabbable))\n ) {\n event.preventDefault();\n event.stopPropagation();\n (event.shiftKey ? lastTabbable : firstTabbable).focus({ preventScroll: true });\n return true;\n }\n\n return false;\n};\n","import type {\n Position,\n InternalNodeState,\n NodeRendererContext,\n DiagramLabelPosition,\n DiagramNodeData\n} from './diagram.types';\nimport { useResizeObserver } from '#hooks/UNSAFE_useResizeObserver';\nimport { useCallback, useLayoutEffect, useRef } from 'preact/hooks';\nimport { getItemAriaLabel } from './utils/diagramUtils';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { buttonStyle, itemStyles, layerStyles } from './themes/DiagramStyles.css';\nimport { ComponentChildren } from 'preact';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { FocusTrap } from '#UNSAFE_FocusTrap';\nimport { useUser } from '#hooks/UNSAFE_useUser';\nimport { DiagramLabel } from './DiagramLabel';\nimport { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { EmbeddedIconButton } from '#PRIVATE_EmbeddedIconButton';\nimport { Plus } from '#UNSAFE_RedwoodIcons/Plus';\nimport { Minus } from '#UNSAFE_RedwoodIcons/Minus';\nimport { baseStyle as focusTrackerBaseStyle } from '../PRIVATE_FocusTracker/themes/FocusTrackerStyles.css';\nimport { focusDiagramItemContent } from './utils/tabbableModeUtils';\nimport { serializeDiagramKey } from './utils/diagramUtils';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\n\n/**\n * Props for node component\n */\ntype NodeProps<K1, K2, D1> = {\n id: K1;\n position?: Position;\n state: InternalNodeState;\n isDimmed?: boolean;\n activeId?: string;\n accessibleLabel?: string;\n data: D1;\n nodeRenderer: (context: NodeRendererContext<D1>) => ComponentChildren;\n onNodeSizeChanged: (width: number, height: number, id: K1) => void;\n supportsSelection: boolean;\n content?: { content: ComponentChildren; width: number; height: number };\n labelPosition?: DiagramLabelPosition;\n labelDimensions?: Map<K1 | K2, TextDimensions>;\n dropFeedback?: { accepted: boolean };\n};\n\nexport const DiagramNodeElement = <K1, K2, D1 extends DiagramNodeData<K1, D1>>({\n id,\n state,\n position,\n activeId,\n nodeRenderer,\n onNodeSizeChanged,\n data,\n accessibleLabel,\n isDimmed,\n supportsSelection,\n content,\n labelPosition,\n labelDimensions,\n dropFeedback\n}: NodeProps<K1, K2, D1>) => {\n const { nodeStyles, dimmedItemStyle, nodeDropFeedbackStyle } = itemStyles;\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const ref = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const tabbableFocusStateRef = useRef({\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n });\n tabbableFocusStateRef.current = {\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n };\n const handleTabbableFocusFailure = useCallback(() => {\n state.onTabbableModeFocusFailure?.({\n focusOwner: tabbableFocusStateRef.current.tabbableModeFocusAction === 'restore'\n });\n }, [state.onTabbableModeFocusFailure]);\n // FocusTrap calls this when the node enters tabbable mode so we can restore\n // the previous inner focus after rerender, or fall back to the first tabbable.\n const autoFocusRef = useRef<{ focus: () => void }>({\n focus: () => {\n const tabbableFocusState = tabbableFocusStateRef.current;\n const didFocus = focusDiagramItemContent({\n contentElement: contentRef.current,\n focusAction: tabbableFocusState.tabbableModeFocusAction,\n restoreElementId: tabbableFocusState.tabbableModeRestoreElementId,\n restoreCustomElementId: tabbableFocusState.tabbableModeRestoreCustomElementId,\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n });\n if (!didFocus) {\n handleTabbableFocusFailure();\n }\n }\n });\n useLayoutEffect(() => {\n if (!state.isTabbable || !state.tabbableModeFocusAction) {\n return;\n }\n\n const frameId = window.requestAnimationFrame(() => {\n const tabbableFocusState = tabbableFocusStateRef.current;\n const didFocus = focusDiagramItemContent({\n contentElement: contentRef.current,\n focusAction: tabbableFocusState.tabbableModeFocusAction,\n restoreElementId: tabbableFocusState.tabbableModeRestoreElementId,\n restoreCustomElementId: tabbableFocusState.tabbableModeRestoreCustomElementId,\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n });\n if (!didFocus) {\n handleTabbableFocusFailure();\n }\n });\n\n return () => {\n window.cancelAnimationFrame(frameId);\n };\n }, [handleTabbableFocusFailure, state.isTabbable, state.tabbableModeFocusAction]);\n // TODO JET-62472 change to one resize observer function\n const optionsRef = useRef({ box: 'border-box' as const });\n\n useResizeObserver(\n ref,\n useCallback(\n (entry: ResizeObserverEntry) => {\n const boxSize = Array.isArray(entry.borderBoxSize)\n ? entry.borderBoxSize[0]\n : entry.borderBoxSize;\n const width = Number.isFinite(boxSize?.inlineSize)\n ? boxSize.inlineSize\n : entry.contentRect.width;\n const height = Number.isFinite(boxSize?.blockSize)\n ? boxSize.blockSize\n : entry.contentRect.height;\n onNodeSizeChanged(width, height, id);\n },\n [id, onNodeSizeChanged]\n ),\n optionsRef.current\n );\n const nodePos = position ? position : { x: 0, y: 0 };\n const { direction } = useUser();\n const hasLabel = data.label && labelPosition && labelDimensions;\n const serializedId = serializeDiagramKey(id as string | number);\n const expander = (\n <div data-oj-private-button={serializedId} class={buttonStyle}>\n <EmbeddedIconButton aria-hidden={true} size=\"xs\">\n {content ? <Minus /> : <Plus />}\n </EmbeddedIconButton>\n </div>\n );\n const context = {\n state,\n data: data,\n childContext: content,\n expander: expander\n };\n return (\n <div\n ref={ref}\n key={id}\n class={classNames([\n nodeStyles,\n dropFeedback?.accepted === false ? VisDndStyles.dndRejectedStyle : undefined\n ])}\n data-oj-private-node={serializedId}\n role={content ? 'group' : 'img'}\n tabIndex={-1}\n aria-label={getItemAriaLabel(\n translations,\n supportsSelection,\n {\n isSelected: state.isSelected,\n isExpanded: content !== undefined,\n isCollapsed: content === undefined && data.nodes !== undefined\n },\n accessibleLabel\n )}\n style={{\n top: nodePos.y,\n left: nodePos.x\n }}\n id={state.isFocused || state.isHovered ? activeId : undefined}>\n {dropFeedback ? (\n <div\n class={classNames([\n nodeDropFeedbackStyle,\n dropFeedback.accepted\n ? VisDndStyles.dndDragOverHTMLStyle\n : VisDndStyles.dndRejectedStyle\n ])}\n data-oj-private-drop-feedback={dropFeedback.accepted ? 'accept' : 'reject'}\n />\n ) : undefined}\n <div ref={contentRef} class={classNames([isDimmed ? dimmedItemStyle : undefined])}>\n <TabbableModeContext.Provider value={{ isTabbable: !!state.isTabbable }}>\n <FocusTrap\n autoFocusRef={\n state.isTabbable && state.tabbableModeFocusAction ? autoFocusRef : undefined\n }\n isDisabled={!state.isTabbable}\n restoreFocusRef={false}>\n {nodeRenderer(context)}\n </FocusTrap>\n </TabbableModeContext.Provider>\n </div>\n {hasLabel ? (\n <div class={layerStyles}>\n <DiagramLabel\n styles={data.labelStyle}\n text={data.label!}\n position={labelPosition!}\n dimensions={labelDimensions.get(id)!}\n isRTL={direction === 'rtl'}\n />\n </div>\n ) : undefined}\n </div>\n );\n};\n","export type SvgDropFeedbackBounds = { x: number; y: number; width: number; height: number };\n\nexport const isSameBounds = (bounds1?: SvgDropFeedbackBounds, bounds2?: SvgDropFeedbackBounds) =>\n bounds1?.x === bounds2?.x &&\n bounds1?.y === bounds2?.y &&\n bounds1?.width === bounds2?.width &&\n bounds1?.height === bounds2?.height;\n\nexport const getSvgDropFeedbackBounds = (element: SVGGElement) => {\n if (typeof element.getBBox !== 'function') {\n return undefined;\n }\n\n let bounds: DOMRect;\n try {\n bounds = element.getBBox();\n } catch {\n return undefined;\n }\n\n if (\n !Number.isFinite(bounds.x) ||\n !Number.isFinite(bounds.y) ||\n !Number.isFinite(bounds.width) ||\n !Number.isFinite(bounds.height) ||\n (bounds.width === 0 && bounds.height === 0)\n ) {\n return undefined;\n }\n\n return { x: bounds.x, y: bounds.y, width: bounds.width, height: bounds.height };\n};\n","import type { InternalLinkState, LinkRendererContext, DiagramLinkData } from './diagram.types';\nimport { getItemAriaLabel } from './utils/diagramUtils';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { itemStyles } from './themes/DiagramStyles.css';\nimport { ComponentChildren } from 'preact';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useResizeObserver } from '#hooks/UNSAFE_useResizeObserver';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { containFocusWithinDiagramItem, focusDiagramItemContent } from './utils/tabbableModeUtils';\nimport { serializeDiagramKey } from './utils/diagramUtils';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\nimport {\n getSvgDropFeedbackBounds,\n isSameBounds,\n SvgDropFeedbackBounds\n} from './utils/dropFeedbackUtils';\n\n/**\n * Props for Link\n */\nexport type LinkProps<K1, K2, D2, L> = {\n id: K2;\n state: InternalLinkState;\n isDimmed?: boolean;\n activeId?: string;\n accessibleLabel?: string;\n data: D2 | DiagramLinkData<string, K1>;\n linkRenderer: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n supportsSelection: boolean;\n layoutOutput: L;\n onLinkSizeChanged: (width: number, height: number, id: K2) => void;\n dropFeedback?: { accepted: boolean };\n};\n\nexport const DiagramLinkElement = <K1, K2, D2 extends DiagramLinkData<K2, K1>, L>({\n id,\n state,\n activeId,\n data,\n linkRenderer,\n accessibleLabel,\n isDimmed,\n supportsSelection,\n layoutOutput,\n onLinkSizeChanged,\n dropFeedback\n}: LinkProps<K1, K2, D2, L>) => {\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const { dimmedItemStyle, linkStyles, svgDropFeedbackStyle } = itemStyles;\n const context = {\n state,\n data,\n layoutOutput,\n type: 'link'\n } as LinkRendererContext<K1, D2, L>;\n const ref = useRef<SVGGElement>(null);\n const [dropFeedbackBounds, setDropFeedbackBounds] = useState<SvgDropFeedbackBounds>();\n const tabbableFocusStateRef = useRef({\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n });\n tabbableFocusStateRef.current = {\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n };\n const handleTabbableFocusFailure = useCallback(() => {\n state.onTabbableModeFocusFailure?.({\n focusOwner: tabbableFocusStateRef.current.tabbableModeFocusAction === 'restore'\n });\n }, [state.onTabbableModeFocusFailure]);\n const optionsRef = useRef({ box: 'border-box' as const });\n const serializedId = serializeDiagramKey(id as string | number);\n useResizeObserver(\n ref,\n useCallback(\n (entry: ResizeObserverEntry) => {\n const boxSize = Array.isArray(entry.borderBoxSize)\n ? entry.borderBoxSize[0]\n : entry.borderBoxSize;\n const width = Number.isFinite(boxSize?.inlineSize)\n ? boxSize.inlineSize\n : entry.contentRect.width;\n const height = Number.isFinite(boxSize?.blockSize)\n ? boxSize.blockSize\n : entry.contentRect.height;\n onLinkSizeChanged(width, height, id);\n },\n [id, onLinkSizeChanged]\n ),\n optionsRef.current\n );\n useLayoutEffect(() => {\n if (!state.isTabbable || !state.tabbableModeFocusAction) {\n return;\n }\n\n const tabbableFocusState = tabbableFocusStateRef.current;\n const didFocus = focusDiagramItemContent({\n contentElement: ref.current,\n focusAction: tabbableFocusState.tabbableModeFocusAction,\n restoreElementId: tabbableFocusState.tabbableModeRestoreElementId,\n restoreCustomElementId: tabbableFocusState.tabbableModeRestoreCustomElementId\n });\n if (!didFocus) {\n handleTabbableFocusFailure();\n }\n }, [handleTabbableFocusFailure, state.isTabbable, state.tabbableModeFocusAction]);\n\n useLayoutEffect(() => {\n if (!dropFeedback?.accepted || !ref.current) {\n setDropFeedbackBounds((current) => (current === undefined ? current : undefined));\n return;\n }\n\n const nextBounds = getSvgDropFeedbackBounds(ref.current);\n setDropFeedbackBounds((current) => (isSameBounds(current, nextBounds) ? current : nextBounds));\n }, [dropFeedback?.accepted, layoutOutput]);\n\n const handleKeyDownCapture = useCallback(\n (event: KeyboardEvent) => {\n if (!state.isTabbable) {\n return;\n }\n\n containFocusWithinDiagramItem({\n event,\n contentElement: ref.current\n });\n },\n [state.isTabbable]\n );\n\n return (\n <g\n ref={ref}\n key={id}\n tabIndex={-1}\n id={state.isFocused || state.isHovered ? activeId : undefined}\n aria-label={getItemAriaLabel(\n translations,\n supportsSelection,\n {\n isSelected: state.isSelected\n },\n accessibleLabel\n )}\n data-oj-private-link={serializedId}\n data-oj-private-drop-feedback={dropFeedback?.accepted === false ? 'reject' : undefined}\n role=\"img\"\n onKeyDownCapture={handleKeyDownCapture}\n class={classNames([\n linkStyles,\n isDimmed && dimmedItemStyle,\n dropFeedback?.accepted === false && VisDndStyles.dndRejectedStyle\n ])}>\n <TabbableModeContext.Provider value={{ isTabbable: !!state.isTabbable }}>\n {linkRenderer(context)}\n </TabbableModeContext.Provider>\n {dropFeedback?.accepted && dropFeedbackBounds ? (\n <rect\n x={dropFeedbackBounds.x}\n y={dropFeedbackBounds.y}\n width={dropFeedbackBounds.width}\n height={dropFeedbackBounds.height}\n class={classNames([svgDropFeedbackStyle, VisDndStyles.dndDragOverSvgStyle])}\n data-oj-private-drop-feedback=\"accept\"\n />\n ) : undefined}\n </g>\n );\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport { Bounds, DiagramLinkData, ItemInfo, Zoom } from '#PRIVATE_BaseDiagram/diagram.types';\n\nexport const ZOOM_INCREMENT = 0.05;\nconst ZOOM_TO_FIT_PADDING = 20;\n\nexport const zoom = (\n nextZoom: number,\n zoom: number,\n minZoom: number,\n maxZoom: number,\n onZoomChange?: (detail: { zoomValue: number }) => void\n) => {\n const newZoom = constrainZoom(nextZoom, minZoom, maxZoom);\n const isZoomChanged = newZoom !== zoom;\n isZoomChanged &&\n onZoomChange &&\n onZoomChange({\n zoomValue: newZoom\n });\n return newZoom;\n};\n\n/**\n * Returns the zoom properties for the diagram.\n */\nexport function getZoomProps(props: Zoom, width: number, height: number, contentBounds: Bounds) {\n const zoomTofitZoom = getZoomToFitZoom(width, height, contentBounds);\n const maxZoom = props.maxZoom || 1;\n const minZoom = props.minZoom || Math.min(maxZoom, zoomTofitZoom);\n const zoom = props.zoomValue ? props.zoomValue : zoomTofitZoom;\n return {\n zooming: props.zooming ? props.zooming : 'off',\n // default value of 0 indicates zoom-to-fit level\n minZoom: minZoom,\n maxZoom: maxZoom,\n // zoom value of 0 will default to zoom to fit\n zoomValue: constrainZoom(zoom, minZoom, maxZoom),\n onZoom: props.onZoom\n };\n}\n\n/**\n * Returns the zoom to fit zoom level\n */\nexport function getZoomToFitZoom(width: number, height: number, contentBounds: Bounds) {\n const zoomX = (width - 2 * ZOOM_TO_FIT_PADDING) / contentBounds.width;\n const zoomY = (height - 2 * ZOOM_TO_FIT_PADDING) / contentBounds.height;\n return Math.min(zoomX, zoomY);\n}\n\n/**\n * Constrains the zoom level\n */\nfunction constrainZoom(zoom: number, minZoom: number, maxZoom: number) {\n let newZoom = Math.max(minZoom, zoom);\n newZoom = Math.min(maxZoom, newZoom);\n return newZoom;\n}\n\n/**\n * Returns the panX, panY, and zoom when zooming and centering an item\n */\nexport function zoomAndCenterItemFromInfo<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n info: ItemInfo<K1, K2, D2>,\n linkIdToDataMap: Map<K2, D2>,\n bounds: Map<K1, Bounds>,\n width: number,\n height: number,\n maxZoom: number\n) {\n const type = info.type;\n let totalBounds;\n if (type === 'node') {\n totalBounds = bounds.get(info.id as K1)!;\n } else {\n const link = linkIdToDataMap.get(info.id as K2)!;\n const startNodeBounds = bounds.get(link.startNode)!;\n const endNodeBounds = bounds.get(link.endNode)!;\n const minX = Math.min(startNodeBounds.x, endNodeBounds.x);\n const minY = Math.min(startNodeBounds.y, endNodeBounds.y);\n const maxX = Math.max(\n startNodeBounds.x + startNodeBounds.width,\n endNodeBounds.x + startNodeBounds.width\n );\n const maxY = Math.max(\n startNodeBounds.y + startNodeBounds.height,\n endNodeBounds.y + endNodeBounds.height\n );\n totalBounds = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n }\n return getPanZoomToCenterNode(totalBounds, maxZoom, width, height);\n}\n\n/**\n * Returns the pan and zoom values in order\n * to center a node or link\n */\nfunction getPanZoomToCenterNode(bounds: Bounds, maxZoom: number, width: number, height: number) {\n const zoomX = (width - 2 * ZOOM_TO_FIT_PADDING) / bounds.width;\n const zoomY = (height - 2 * ZOOM_TO_FIT_PADDING) / bounds.height;\n const zoom = Math.min(zoomX, zoomY, maxZoom);\n const cX = bounds.width / 2 + bounds.x;\n const cY = bounds.height / 2 + bounds.y;\n return { centerX: cX, centerY: cY, zoom: zoom };\n}\n","import type { DiagramLabelPosition, DiagramLinkData } from './diagram.types';\nimport { DiagramLabel } from './DiagramLabel';\nimport type { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { layerStyles } from './themes/DiagramStyles.css';\nimport { useUser } from '#hooks/UNSAFE_useUser';\n\ntype Props<K1, K2, D2 extends DiagramLinkData<K2, K1>> = {\n labelPosition: Map<K2, DiagramLabelPosition>;\n itemProps: D2[];\n labelDimensions: Map<K2, TextDimensions>;\n};\n\nexport function DiagramLabelLayer<K1, K2, D2 extends DiagramLinkData<K2, K1>>({\n labelPosition,\n itemProps,\n labelDimensions\n}: Props<K1, K2, D2>) {\n const { direction } = useUser();\n return (\n <div class={layerStyles}>\n {itemProps.map((item) => {\n if (item.label && labelPosition.get(item.id)) {\n return (\n <DiagramLabel\n styles={item.labelStyle}\n text={item.label}\n position={labelPosition.get(item.id)!}\n dimensions={labelDimensions.get(item.id)!}\n isRTL={direction === 'rtl'}\n />\n );\n }\n return undefined;\n })}\n </div>\n );\n}\n","import { ComponentChildren } from 'preact';\nimport type {\n States,\n InternalLinkState,\n LinkRendererContext,\n DiagramLinkData,\n DiagramLayoutOutput,\n Bounds,\n DiagramLabelPosition\n} from './diagram.types';\nimport { DiagramLinkElement } from './DiagramLinkElement';\nimport { layerStyles, linkLayerStyle } from './themes/DiagramStyles.css';\nimport { getZoomToFitZoom } from './utils/zoomUtils';\nimport { DiagramLabelLayer } from './DiagramLabelLayer';\nimport { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\n\ntype Props<K2, K1, D2, L> = {\n links: D2[];\n states: States<K1, K2, D2>;\n linkRenderer: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n width: number;\n height: number;\n supportsSelection: boolean;\n layoutOutput: L;\n combinedNodeBounds: Bounds;\n labelDimensions: Map<K1 | K2, TextDimensions>;\n linkLabelPositions: Map<K2, DiagramLabelPosition>;\n onLinkSizeChanged: (width: number, height: number, id: K2) => void;\n minX: number;\n minY: number;\n};\n\nexport function DiagramLinkLayer<\n K2 extends string | number,\n K1 extends string | number,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n links,\n states,\n linkRenderer,\n width,\n height,\n supportsSelection,\n onLinkSizeChanged,\n layoutOutput,\n combinedNodeBounds,\n linkLabelPositions,\n labelDimensions,\n minX,\n minY\n}: Props<K2, K1, D2, L>) {\n const zoom = getZoomToFitZoom(width, height, combinedNodeBounds);\n return (\n <div class={linkLayerStyle} style={{ top: -minY, left: -minX }}>\n <svg width={width / zoom} height={height / zoom} class={layerStyles} overflow=\"visible\">\n {links.map((link) => {\n const isTabbableOwner = states.isTabbableMode && states.tabbableModeItemId === link.id;\n const dropFeedback =\n states.dropFeedback?.type === 'link' && states.dropFeedback.id === link.id\n ? states.dropFeedback\n : undefined;\n const state: InternalLinkState = {\n isSelected: states.selectedLinkIds.includes(link.id),\n isFocused: states.focusedId === link.id,\n isHovered: states.hoveredId === link.id,\n zoom: states.zoom,\n isTabbable: isTabbableOwner,\n tabbableModeFocusAction: isTabbableOwner ? states.tabbableModeFocusAction : undefined,\n tabbableModeRestoreElementId: isTabbableOwner\n ? states.tabbableModeRestoreElementId\n : undefined,\n tabbableModeRestoreCustomElementId: isTabbableOwner\n ? states.tabbableModeRestoreCustomElementId\n : undefined,\n onTabbableModeFocusFailure: isTabbableOwner\n ? states.onTabbableModeFocusFailure\n : undefined\n };\n return (\n <DiagramLinkElement\n id={link.id}\n state={state}\n isDimmed={\n (states.highlightedNodeIds.length !== 0 ||\n states.highlightedLinkIds.length !== 0 ||\n states.highlightedPromotedLinkIds.length !== 0) &&\n !states.highlightedLinkIds.includes(link.id)\n }\n activeId={states.activeId}\n accessibleLabel={link.accessibleLabel}\n data={link}\n linkRenderer={linkRenderer}\n supportsSelection={supportsSelection}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onLinkSizeChanged}\n dropFeedback={dropFeedback}\n />\n );\n })}\n </svg>\n {labelDimensions ? (\n <div>\n {links && linkLabelPositions ? (\n <DiagramLabelLayer\n labelPosition={linkLabelPositions}\n itemProps={links}\n labelDimensions={labelDimensions}\n />\n ) : undefined}\n </div>\n ) : undefined}\n </div>\n );\n}\n","import type { InternalLinkState, LinkRendererContext, PromotedLinkId } from './diagram.types';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { itemStyles } from './themes/DiagramStyles.css';\nimport { ComponentChildren } from 'preact';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useResizeObserver } from '#hooks/UNSAFE_useResizeObserver';\nimport { getItemAriaLabel, getPromotedString } from './utils/diagramUtils';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { containFocusWithinDiagramItem, focusDiagramItemContent } from './utils/tabbableModeUtils';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\nimport {\n getSvgDropFeedbackBounds,\n isSameBounds,\n SvgDropFeedbackBounds\n} from './utils/dropFeedbackUtils';\n\n/**\n * Props for Link\n */\nexport type LinkProps<K1, D2, L> = {\n id: PromotedLinkId<K1, D2>;\n state: InternalLinkState;\n isDimmed?: boolean;\n activeId?: string;\n linkRenderer: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n supportsSelection: boolean;\n layoutOutput: L;\n onLinkSizeChanged: (width: number, height: number, id: string) => void;\n dropFeedback?: { accepted: boolean };\n};\n\nexport const DiagramPromotedLinkElement = <K1 extends string | number, D2, L>({\n id,\n state,\n activeId,\n linkRenderer,\n isDimmed,\n supportsSelection,\n layoutOutput,\n onLinkSizeChanged,\n dropFeedback\n}: LinkProps<K1, D2, L>) => {\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const { dimmedItemStyle, linkStyles, svgDropFeedbackStyle } = itemStyles;\n const context = {\n state,\n data: id.links,\n layoutOutput,\n startNode: id.startNode,\n endNode: id.endNode,\n type: 'promotedLink'\n } as LinkRendererContext<K1, D2, L>;\n const ref = useRef<SVGGElement>(null);\n const [dropFeedbackBounds, setDropFeedbackBounds] = useState<SvgDropFeedbackBounds>();\n const tabbableFocusStateRef = useRef({\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n });\n tabbableFocusStateRef.current = {\n tabbableModeFocusAction: state.tabbableModeFocusAction,\n tabbableModeRestoreElementId: state.tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId: state.tabbableModeRestoreCustomElementId\n };\n const handleTabbableFocusFailure = useCallback(() => {\n state.onTabbableModeFocusFailure?.({\n focusOwner: tabbableFocusStateRef.current.tabbableModeFocusAction === 'restore'\n });\n }, [state.onTabbableModeFocusFailure]);\n const optionsRef = useRef({ box: 'border-box' as const });\n const stringId = getPromotedString(id);\n useResizeObserver(\n ref,\n useCallback(\n (entry: ResizeObserverEntry) => {\n const boxSize = Array.isArray(entry.borderBoxSize)\n ? entry.borderBoxSize[0]\n : entry.borderBoxSize;\n const width = Number.isFinite(boxSize?.inlineSize)\n ? boxSize.inlineSize\n : entry.contentRect.width;\n const height = Number.isFinite(boxSize?.blockSize)\n ? boxSize.blockSize\n : entry.contentRect.height;\n onLinkSizeChanged(width, height, stringId);\n },\n [stringId, onLinkSizeChanged]\n ),\n optionsRef.current\n );\n useLayoutEffect(() => {\n if (!state.isTabbable || !state.tabbableModeFocusAction) {\n return;\n }\n\n const tabbableFocusState = tabbableFocusStateRef.current;\n const didFocus = focusDiagramItemContent({\n contentElement: ref.current,\n focusAction: tabbableFocusState.tabbableModeFocusAction,\n restoreElementId: tabbableFocusState.tabbableModeRestoreElementId,\n restoreCustomElementId: tabbableFocusState.tabbableModeRestoreCustomElementId\n });\n if (!didFocus) {\n handleTabbableFocusFailure();\n }\n }, [handleTabbableFocusFailure, state.isTabbable, state.tabbableModeFocusAction]);\n\n useLayoutEffect(() => {\n if (!dropFeedback?.accepted || !ref.current) {\n setDropFeedbackBounds((current) => (current === undefined ? current : undefined));\n return;\n }\n\n const nextBounds = getSvgDropFeedbackBounds(ref.current);\n setDropFeedbackBounds((current) => (isSameBounds(current, nextBounds) ? current : nextBounds));\n }, [dropFeedback?.accepted, layoutOutput]);\n\n const handleKeyDownCapture = useCallback(\n (event: KeyboardEvent) => {\n if (!state.isTabbable) {\n return;\n }\n\n containFocusWithinDiagramItem({\n event,\n contentElement: ref.current\n });\n },\n [state.isTabbable]\n );\n\n const num_links = id.links.length;\n const accessibleLabel =\n num_links > 1\n ? translations.diagram_promotedLinks({ num_links: num_links.toString() })\n : translations.diagram_promotedLink();\n return (\n <g\n ref={ref}\n key={stringId}\n tabIndex={-1}\n id={state.isFocused || state.isHovered ? activeId : undefined}\n aria-label={getItemAriaLabel(\n translations,\n supportsSelection,\n {\n isSelected: state.isSelected,\n isIndirect: true\n },\n accessibleLabel\n )}\n data-oj-private-promoted-link={stringId}\n data-oj-private-drop-feedback={dropFeedback?.accepted === false ? 'reject' : undefined}\n role=\"img\"\n onKeyDownCapture={handleKeyDownCapture}\n class={classNames([\n linkStyles,\n isDimmed && dimmedItemStyle,\n dropFeedback?.accepted === false && VisDndStyles.dndRejectedStyle\n ])}>\n <TabbableModeContext.Provider value={{ isTabbable: !!state.isTabbable }}>\n {linkRenderer(context)}\n </TabbableModeContext.Provider>\n {dropFeedback?.accepted && dropFeedbackBounds ? (\n <rect\n x={dropFeedbackBounds.x}\n y={dropFeedbackBounds.y}\n width={dropFeedbackBounds.width}\n height={dropFeedbackBounds.height}\n class={classNames([svgDropFeedbackStyle, VisDndStyles.dndDragOverSvgStyle])}\n data-oj-private-drop-feedback=\"accept\"\n />\n ) : undefined}\n </g>\n );\n};\n","import { ComponentChildren } from 'preact';\nimport type {\n States,\n InternalLinkState,\n LinkRendererContext,\n DiagramLinkData,\n DiagramLayoutOutput,\n Bounds,\n PromotedLinkId\n} from './diagram.types';\nimport { layerStyles, linkLayerStyle } from './themes/DiagramStyles.css';\nimport { getZoomToFitZoom } from './utils/zoomUtils';\nimport { DiagramPromotedLinkElement } from './DiagramPromotedLinkElement';\nimport { includesPromotedLinkId, isSamePromotedLinkId } from './utils/diagramUtils';\n\ntype Props<K2, K1, D2, L> = {\n links: PromotedLinkId<K1, D2>[];\n states: States<K1, K2, D2>;\n linkRenderer: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n width: number;\n height: number;\n supportsSelection: boolean;\n layoutOutput: L;\n combinedNodeBounds: Bounds;\n onLinkSizeChanged: (width: number, height: number, id: string) => void;\n minX: number;\n minY: number;\n};\n\nexport function DiagramPromotedLinkLayer<\n K2 extends string | number,\n K1 extends string | number,\n D2 extends DiagramLinkData<K2, K1> = DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2> = DiagramLayoutOutput<K1, K2>\n>({\n links,\n states,\n linkRenderer,\n width,\n height,\n supportsSelection,\n onLinkSizeChanged,\n layoutOutput,\n combinedNodeBounds,\n minX,\n minY\n}: Props<K2, K1, D2, L>) {\n const zoom = getZoomToFitZoom(width, height, combinedNodeBounds);\n return (\n <div class={linkLayerStyle} style={{ top: -minY, left: -minX }}>\n <svg width={width / zoom} height={height / zoom} class={layerStyles} overflow=\"visible\">\n {links.map((link) => {\n const isTabbableOwner =\n states.isTabbableMode && isSamePromotedLinkId<K1, D2>(states.tabbableModeItemId, link);\n const dropFeedback =\n states.dropFeedback?.type === 'promotedLink' &&\n isSamePromotedLinkId<K1, D2>(states.dropFeedback.id, link)\n ? states.dropFeedback\n : undefined;\n const state: InternalLinkState = {\n isSelected: includesPromotedLinkId(states.selectedPromotedLinkIds, link),\n isFocused: isSamePromotedLinkId<K1, D2>(states.focusedId, link),\n isHovered: isSamePromotedLinkId<K1, D2>(states.hoveredId, link),\n zoom: states.zoom,\n isTabbable: isTabbableOwner,\n tabbableModeFocusAction: isTabbableOwner ? states.tabbableModeFocusAction : undefined,\n tabbableModeRestoreElementId: isTabbableOwner\n ? states.tabbableModeRestoreElementId\n : undefined,\n tabbableModeRestoreCustomElementId: isTabbableOwner\n ? states.tabbableModeRestoreCustomElementId\n : undefined,\n onTabbableModeFocusFailure: isTabbableOwner\n ? states.onTabbableModeFocusFailure\n : undefined\n };\n return (\n <DiagramPromotedLinkElement\n id={link}\n state={state}\n isDimmed={\n (states.highlightedNodeIds.length !== 0 ||\n states.highlightedLinkIds.length !== 0 ||\n states.highlightedPromotedLinkIds.length !== 0) &&\n !includesPromotedLinkId(states.highlightedPromotedLinkIds, link)\n }\n activeId={states.activeId}\n linkRenderer={linkRenderer}\n supportsSelection={supportsSelection}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onLinkSizeChanged}\n dropFeedback={dropFeedback}\n />\n );\n })}\n </svg>\n </div>\n );\n}\n","import { ComponentChildren, RefObject } from 'preact';\nimport type {\n States,\n InternalNodeState,\n NodeRendererContext,\n Bounds,\n DiagramNodeData,\n DiagramLabelPosition,\n Dimensions,\n DiagramLinkData,\n LinkRendererContext,\n DiagramLayoutOutput,\n PromotedLinkId\n} from './diagram.types';\nimport { DiagramNodeElement } from './DiagramNodeElement';\nimport { layerStyles } from './themes/DiagramStyles.css';\nimport {\n containerLinksReady,\n getBounds,\n getLinksForNode,\n isContainerReady,\n isLeafNode,\n serializeDiagramKey\n} from './utils/diagramUtils';\nimport { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { DiagramLinkLayer } from './DiagramLinkLayer';\nimport { DiagramPromotedLinkLayer } from './DiagramPromotedLinkLayer';\nimport { containsKey } from '#utils/UNSAFE_keys';\n\ntype Props<K1, K2, D1, D2, L> = {\n nodes: D1[];\n states: States<K1, K2, D2>;\n nodeRenderer: (context: NodeRendererContext<D1>) => ComponentChildren;\n linkRenderer?: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n onNodeSizeChanged: (width: number, height: number, id: K1) => void;\n onLinkSizeChanged: (width: number, height: number, id: K2) => void;\n onPromotedLinkSizeChanged: (width: number, height: number, id: string) => void;\n nodeBounds: Map<K1, Bounds>;\n supportsSelection: boolean;\n minX?: number;\n minY?: number;\n nodeLabelPositions: Map<K1, DiagramLabelPosition>;\n linkLabelPositions: Map<K2, DiagramLabelPosition>;\n labelDimensions: Map<K1 | K2, TextDimensions>;\n links: D2[];\n promotedLinks: PromotedLinkId<K1, D2>[];\n parentId?: K1;\n nodeIdToParentMap: Map<K1, K1>;\n layoutOutput?: L;\n // width height are for svg for links\n width: number;\n height: number;\n zoom: number;\n linkDimensions: Map<K2, Dimensions>;\n promotedLinkDimensions: Map<string, Dimensions>;\n rootRef?: RefObject<HTMLDivElement>;\n combinedNodeBounds: Bounds;\n nodeBoundsRef: RefObject<Map<K1, Bounds>>;\n normalizeLinks?: boolean;\n};\n\nexport function DiagramNodeLayer<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n nodes,\n states,\n nodeRenderer,\n linkRenderer,\n nodeBounds,\n width,\n height,\n onNodeSizeChanged,\n onLinkSizeChanged,\n onPromotedLinkSizeChanged,\n supportsSelection,\n nodeLabelPositions,\n linkLabelPositions,\n labelDimensions,\n minX = 0,\n minY = 0,\n parentId,\n links,\n promotedLinks,\n layoutOutput,\n zoom,\n nodeIdToParentMap,\n linkDimensions,\n promotedLinkDimensions,\n rootRef,\n combinedNodeBounds,\n nodeBoundsRef,\n normalizeLinks = false\n}: Props<K1, K2, D1, D2, L>) {\n const { frontLinks, frontPromotedLinks, backLinks, backPromotedLinks } = getLinksForNode<\n K1,\n K2,\n D2\n >(parentId, links, promotedLinks, nodeIdToParentMap);\n return (\n <div class={layerStyles} data-oj-private-node-container>\n {layoutOutput &&\n linkRenderer &&\n backLinks.length > 0 &&\n containerLinksReady<K1, K2, D2, L>(backLinks, layoutOutput) && (\n <DiagramLinkLayer\n links={backLinks}\n states={states}\n linkRenderer={linkRenderer}\n width={width / zoom}\n height={height}\n supportsSelection={supportsSelection}\n labelDimensions={labelDimensions}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onLinkSizeChanged}\n linkLabelPositions={linkLabelPositions}\n combinedNodeBounds={combinedNodeBounds}\n minY={normalizeLinks ? minY : 0}\n minX={normalizeLinks ? minX : 0}\n />\n )}\n {layoutOutput &&\n linkRenderer &&\n backPromotedLinks.length > 0 &&\n containerLinksReady<K1, K2, D2, L>(backPromotedLinks, layoutOutput) && (\n <DiagramPromotedLinkLayer\n links={backPromotedLinks as PromotedLinkId<K1, D2>[]}\n states={states}\n linkRenderer={linkRenderer}\n width={width / zoom}\n height={height}\n supportsSelection={supportsSelection}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onPromotedLinkSizeChanged}\n combinedNodeBounds={combinedNodeBounds}\n minY={normalizeLinks ? minY : 0}\n minX={normalizeLinks ? minX : 0}\n />\n )}\n\n {nodes.map((node) => {\n const isTabbableOwner = states.isTabbableMode && states.tabbableModeItemId === node.id;\n const dropFeedback =\n states.dropFeedback?.type === 'node' && states.dropFeedback.id === node.id\n ? states.dropFeedback\n : undefined;\n // this is for initial render before the layout function so render all nodes at 0,0\n const position =\n nodeBounds && nodeBounds.get(node.id)\n ? { x: nodeBounds.get(node.id)!.x - minX, y: nodeBounds.get(node.id)!.y - minY }\n : undefined;\n const state: InternalNodeState = {\n isSelected: states.selectedNodeIds.includes(node.id),\n isFocused: states.focusedId === node.id,\n isHovered: states.hoveredId === node.id,\n zoom: states.zoom,\n isExpanded: states.expanded && containsKey(states.expanded, node.id),\n // The tabbable-mode owner can temporarily differ from visual focus during rerender.\n isTabbable: isTabbableOwner,\n tabbableModeFocusAction: isTabbableOwner ? states.tabbableModeFocusAction : undefined,\n tabbableModeRestoreElementId: isTabbableOwner\n ? states.tabbableModeRestoreElementId\n : undefined,\n tabbableModeRestoreCustomElementId: isTabbableOwner\n ? states.tabbableModeRestoreCustomElementId\n : undefined,\n onTabbableModeFocusFailure: isTabbableOwner\n ? states.onTabbableModeFocusFailure\n : undefined\n };\n const { backLinks, backPromotedLinks } = getLinksForNode<K1, K2, D2>(\n node.id,\n links,\n promotedLinks,\n nodeIdToParentMap\n );\n\n // Leaf node or node is collapsed\n if (isLeafNode(node) || !containsKey(states.expanded, node.id)) {\n return (\n <DiagramNodeElement\n id={node.id}\n position={position}\n state={state}\n isDimmed={\n (states.highlightedNodeIds.length !== 0 ||\n states.highlightedLinkIds.length !== 0 ||\n states.highlightedPromotedLinkIds.length !== 0) &&\n !states.highlightedNodeIds.includes(node.id)\n }\n activeId={states.activeId}\n nodeRenderer={nodeRenderer}\n onNodeSizeChanged={onNodeSizeChanged}\n accessibleLabel={node.accessibleLabel}\n data={node}\n supportsSelection={supportsSelection}\n labelDimensions={labelDimensions}\n labelPosition={nodeLabelPositions?.get(node.id)}\n dropFeedback={dropFeedback}\n />\n );\n // Expanded container where children are ready\n } else if (\n nodeBounds &&\n isContainerReady<K1, K2, D1, D2>(\n node,\n nodeBounds,\n backLinks,\n backPromotedLinks,\n linkDimensions,\n promotedLinkDimensions\n )\n ) {\n const childContent = getContent<K1, K2, D1, D2, L>(\n node,\n states,\n nodeRenderer,\n onNodeSizeChanged,\n onLinkSizeChanged,\n onPromotedLinkSizeChanged,\n supportsSelection,\n links,\n promotedLinks,\n nodeIdToParentMap,\n width,\n height,\n zoom,\n node.id,\n nodeBounds,\n linkDimensions,\n promotedLinkDimensions,\n combinedNodeBounds,\n nodeBoundsRef,\n nodeLabelPositions,\n linkLabelPositions,\n labelDimensions,\n linkRenderer,\n layoutOutput,\n rootRef\n );\n return (\n <DiagramNodeElement\n id={node.id}\n position={position}\n state={state}\n isDimmed={\n (states.highlightedNodeIds.length !== 0 ||\n states.highlightedLinkIds.length !== 0 ||\n states.highlightedPromotedLinkIds.length !== 0) &&\n !states.highlightedNodeIds.includes(node.id)\n }\n activeId={states.activeId}\n nodeRenderer={nodeRenderer}\n onNodeSizeChanged={onNodeSizeChanged}\n accessibleLabel={node.accessibleLabel}\n data={node}\n supportsSelection={supportsSelection}\n content={childContent}\n labelDimensions={labelDimensions}\n labelPosition={nodeLabelPositions?.get(node.id)}\n dropFeedback={dropFeedback}\n />\n );\n } else {\n const childContent = getContent<K1, K2, D1, D2, L>(\n node,\n states,\n nodeRenderer,\n onNodeSizeChanged,\n onLinkSizeChanged,\n onPromotedLinkSizeChanged,\n supportsSelection,\n links,\n promotedLinks,\n nodeIdToParentMap,\n width,\n height,\n zoom,\n node.id,\n nodeBounds,\n linkDimensions,\n promotedLinkDimensions,\n combinedNodeBounds,\n nodeBoundsRef,\n nodeLabelPositions,\n linkLabelPositions,\n labelDimensions,\n linkRenderer,\n layoutOutput,\n rootRef\n );\n return <div>{childContent.content}</div>;\n }\n })}\n {layoutOutput &&\n linkRenderer &&\n frontLinks.length > 0 &&\n containerLinksReady<K1, K2, D2, L>(frontLinks, layoutOutput) && (\n <DiagramLinkLayer\n links={frontLinks}\n states={states}\n linkRenderer={linkRenderer}\n width={width / zoom}\n height={height}\n supportsSelection={supportsSelection}\n labelDimensions={labelDimensions}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onLinkSizeChanged}\n linkLabelPositions={linkLabelPositions}\n combinedNodeBounds={combinedNodeBounds}\n minY={normalizeLinks ? minY : 0}\n minX={normalizeLinks ? minX : 0}\n />\n )}\n {layoutOutput &&\n linkRenderer &&\n frontPromotedLinks.length > 0 &&\n containerLinksReady<K1, K2, D2, L>(frontPromotedLinks, layoutOutput) && (\n <DiagramPromotedLinkLayer\n links={frontPromotedLinks as PromotedLinkId<K1, D2>[]}\n states={states}\n linkRenderer={linkRenderer}\n width={width / zoom}\n height={height}\n supportsSelection={supportsSelection}\n layoutOutput={layoutOutput}\n onLinkSizeChanged={onPromotedLinkSizeChanged}\n combinedNodeBounds={combinedNodeBounds}\n minY={normalizeLinks ? minY : 0}\n minX={normalizeLinks ? minX : 0}\n />\n )}\n </div>\n );\n}\n\nfunction getContent<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>(\n nodeData: D1,\n states: States<K1, K2, D2>,\n nodeRenderer: (context: NodeRendererContext<D1>) => ComponentChildren,\n onNodeSizeChanged: (width: number, height: number, id: K1) => void,\n onLinkSizeChanged: (width: number, height: number, id: K2) => void,\n onPromotedLinkSizeChanged: (width: number, height: number, id: string) => void,\n supportsSelection: boolean,\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeIdToParentMap: Map<K1, K1>,\n width: number,\n height: number,\n zoom: number,\n parentId: K1,\n nodeBounds: Map<K1, Bounds>,\n linkDimensions: Map<K2, Dimensions>,\n promotedLinkDimensions: Map<string, Dimensions>,\n combinedNodeBounds: Bounds,\n nodeBoundsRef: RefObject<Map<K1, Bounds>>,\n nodeLabelPositions: Map<K1, DiagramLabelPosition>,\n linkLabelPositions: Map<K2, DiagramLabelPosition>,\n labelDimensions: Map<K1 | K2, TextDimensions>,\n linkRenderer?: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren,\n layoutOutput?: L,\n rootRef?: RefObject<HTMLDivElement>\n) {\n const nodes = nodeData.nodes!;\n const { backLinks, backPromotedLinks } = getLinksForNode<K1, K2, D2>(\n parentId,\n links,\n promotedLinks,\n nodeIdToParentMap\n );\n const { minX, minY, contentWidth, contentHeight, bounds } = getBounds(\n nodes,\n backLinks,\n backPromotedLinks,\n nodeBounds,\n linkDimensions,\n promotedLinkDimensions,\n zoom,\n rootRef\n );\n const nodeFullBounds = nodeBoundsRef.current;\n nodeFullBounds?.set(nodeData.id, bounds);\n nodeBoundsRef.current = nodeFullBounds;\n\n const content = (\n <div\n data-oj-private-child={serializeDiagramKey(parentId as string | number)}\n style={{ position: 'relative' }}>\n <DiagramNodeLayer\n nodes={nodes}\n nodeBounds={nodeBounds}\n states={states}\n minX={nodeBounds ? minX : undefined}\n minY={nodeBounds ? minY : undefined}\n nodeRenderer={nodeRenderer}\n onNodeSizeChanged={onNodeSizeChanged}\n onLinkSizeChanged={onLinkSizeChanged}\n onPromotedLinkSizeChanged={onPromotedLinkSizeChanged}\n supportsSelection={supportsSelection}\n nodeLabelPositions={nodeLabelPositions}\n linkLabelPositions={linkLabelPositions}\n labelDimensions={labelDimensions}\n links={links}\n promotedLinks={promotedLinks}\n nodeIdToParentMap={nodeIdToParentMap}\n linkRenderer={linkRenderer}\n layoutOutput={layoutOutput}\n width={width}\n height={height}\n zoom={zoom}\n parentId={parentId}\n linkDimensions={linkDimensions}\n promotedLinkDimensions={promotedLinkDimensions}\n rootRef={rootRef}\n combinedNodeBounds={combinedNodeBounds}\n nodeBoundsRef={nodeBoundsRef}\n />\n </div>\n );\n return {\n content,\n width: contentWidth ? contentWidth : 0,\n height: contentHeight ? contentHeight - minY! : 0,\n bounds\n };\n}\n","import type {\n NodeRendererContext,\n LinkRendererContext,\n States,\n Bounds,\n DiagramLabelPosition,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput,\n Dimensions,\n PromotedLinkId\n} from './diagram.types';\nimport { DiagramNodeLayer } from './DiagramNodeLayer';\nimport { ComponentChildren, RefObject } from 'preact';\nimport type { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { getBounds, getLinksForNode } from './utils/diagramUtils';\nimport { useTabbableMode } from '#hooks/UNSAFE_useTabbableMode';\n\n/**\n * Props for Diagram layers component\n */\ntype DiagramLayersProps<K1, K2, D1, D2, L> = {\n nodes: D1[];\n links: D2[];\n nodeRenderer: (context: NodeRendererContext<D1>) => ComponentChildren;\n linkRenderer?: (context: LinkRendererContext<K1, D2, L>) => ComponentChildren;\n states: States<K1, K2, D2>;\n nodeBounds: Map<K1, Bounds>;\n // width height are for svg for links\n width: number;\n height: number;\n onNodeSizeChanged: (width: number, height: number, id: K1) => void;\n onLinkSizeChanged: (width: number, height: number, id: K2) => void;\n onPromotedLinkSizeChanged: (width: number, height: number, id: string) => void;\n nodeLabelPositions: Map<K1, DiagramLabelPosition>;\n linkLabelPositions: Map<K2, DiagramLabelPosition>;\n labelDimensions: Map<K1 | K2, TextDimensions>;\n supportsSelection: boolean;\n layoutOutput?: L;\n combinedNodeBounds: Bounds;\n zoom: number;\n nodeIdToParentMap: Map<K1, K1>;\n linkDimensions: Map<K2, Dimensions>;\n promotedLinkDimensions: Map<string, Dimensions>;\n rootRef?: RefObject<HTMLDivElement>;\n nodeBoundsRef: RefObject<Map<K1, Bounds>>;\n promotedLinks: PromotedLinkId<K1, D2>[];\n normalizeLinks: boolean;\n};\n\nexport function DiagramLayers<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n nodes,\n links,\n promotedLinks,\n nodeRenderer,\n linkRenderer,\n states,\n nodeBounds,\n width,\n height,\n onNodeSizeChanged,\n onLinkSizeChanged,\n onPromotedLinkSizeChanged,\n labelDimensions,\n nodeLabelPositions,\n linkLabelPositions,\n supportsSelection,\n layoutOutput,\n zoom,\n nodeIdToParentMap,\n linkDimensions,\n promotedLinkDimensions,\n rootRef,\n combinedNodeBounds,\n nodeBoundsRef,\n normalizeLinks\n}: DiagramLayersProps<K1, K2, D1, D2, L>) {\n const { isTabbable } = useTabbableMode();\n\n // Update states with tabbable mode information\n const updatedStates = {\n ...states,\n isTabbableMode: isTabbable\n };\n\n const { backLinks, backPromotedLinks } = getLinksForNode<K1, K2, D2>(\n undefined,\n links,\n promotedLinks,\n nodeIdToParentMap\n );\n const { minX, minY } = getBounds(\n nodes,\n backLinks,\n backPromotedLinks,\n nodeBounds,\n linkDimensions,\n promotedLinkDimensions,\n zoom,\n rootRef\n );\n return (\n <>\n <DiagramNodeLayer\n nodes={nodes}\n nodeBounds={nodeBounds}\n states={updatedStates}\n nodeRenderer={nodeRenderer}\n onNodeSizeChanged={onNodeSizeChanged}\n onLinkSizeChanged={onLinkSizeChanged}\n onPromotedLinkSizeChanged={onPromotedLinkSizeChanged}\n supportsSelection={supportsSelection}\n nodeLabelPositions={nodeLabelPositions}\n linkLabelPositions={linkLabelPositions}\n labelDimensions={labelDimensions}\n linkDimensions={linkDimensions}\n promotedLinkDimensions={promotedLinkDimensions}\n rootRef={rootRef}\n links={links}\n promotedLinks={promotedLinks}\n nodeIdToParentMap={nodeIdToParentMap}\n linkRenderer={linkRenderer}\n layoutOutput={layoutOutput}\n width={width}\n height={height}\n zoom={zoom}\n minX={nodeBounds && minX !== Infinity ? minX : undefined}\n minY={nodeBounds && minY !== Infinity ? minY : undefined}\n combinedNodeBounds={combinedNodeBounds}\n nodeBoundsRef={nodeBoundsRef}\n normalizeLinks={normalizeLinks}\n />\n </>\n );\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { Bounds, PanState, Pan } from '../diagram.types';\nexport type PanBounds = {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n};\n\n/**\n * The pan values that describes where the diagram content\n * is panned\n */\nexport type PanningState = {\n panX: number;\n panY: number;\n};\n\nconst PAN_EPSILON = 0.000001;\n\nconst constrainValueToBounds = (value: number, min: number, max: number) => {\n if (value > max + PAN_EPSILON) {\n return max;\n }\n if (value < min - PAN_EPSILON) {\n return min;\n }\n return value;\n};\n\nexport const constrainPanToBounds = (nextPan: PanningState, panBounds: PanBounds) => {\n const minX = Math.min(panBounds.minX, panBounds.maxX);\n const maxX = Math.max(panBounds.minX, panBounds.maxX);\n const minY = Math.min(panBounds.minY, panBounds.maxY);\n const maxY = Math.max(panBounds.minY, panBounds.maxY);\n return {\n panX: constrainValueToBounds(nextPan.panX, minX, maxX),\n panY: constrainValueToBounds(nextPan.panY, minY, maxY)\n };\n};\n\nconst constrainPan = (\n previousPan: PanningState,\n nextPan: PanningState,\n panBounds: PanBounds,\n panDirection: 'x' | 'y' | 'any'\n) => {\n const panX = panDirection !== 'y' ? nextPan.panX : previousPan.panX;\n const panY = panDirection !== 'x' ? nextPan.panY : previousPan.panY;\n return constrainPanToBounds({ panX, panY }, panBounds);\n};\n\nexport const pan = (\n previousPan: PanningState,\n nextPan: PanningState,\n panDirection: 'x' | 'y' | 'any',\n zoom: number,\n width: number,\n height: number,\n panBounds?: PanBounds,\n onPanChange?: (detail: PanState) => void\n) => {\n if (!panBounds) {\n //On initial render before nodes are rendered\n return { newPan: { panX: 0, panY: 0 } };\n }\n const newPan = constrainPan(previousPan, nextPan, panBounds, panDirection);\n const isPanChanged = newPan.panX !== previousPan.panX || newPan.panY !== previousPan.panY;\n const center = panXYToCenterXY(newPan.panX, newPan.panY, zoom, width, height);\n isPanChanged &&\n onPanChange &&\n onPanChange({\n centerX: center.centerX,\n centerY: center.centerY\n });\n return { newPan };\n};\n\nexport const getPanBounds = (\n dWidth: number,\n dHeight: number,\n elemBounds: Bounds,\n zoom: number,\n minZoom: number,\n initPanZoomState: {\n zoom: number;\n centerX?: number;\n centerY?: number;\n },\n panType?: string\n): PanBounds => {\n const { x, y, width, height } = elemBounds;\n let minX, maxX, minY, maxY;\n if (panType === 'centerContent') {\n minX = dWidth / 2 - (width + x) * zoom;\n minY = dHeight / 2 - (height + y) * zoom;\n maxX = dWidth / 2 - x * zoom;\n maxY = dHeight / 2 - y * zoom;\n } else {\n // panType equals fixed\n const zoomRatio = zoom / minZoom;\n // Find left corner of the content at min zoom and content is centered\n const minZoomX = (dWidth - width * minZoom) / 2 - x * minZoom;\n const minZoomY = (dHeight - height * minZoom) / 2 - y * minZoom;\n // When we pan all the way to the right, the left corner of displayable area is 0,0 as in min zoom.\n // When we pan all the way to the left, lets find the corner of the displayable area\n const leftCornerX = dWidth - dWidth * zoomRatio;\n const leftCornerY = dHeight - dHeight * zoomRatio;\n // Now we have everything to calculate pan zoom constraints\n minX = leftCornerX + minZoomX * zoomRatio;\n minY = leftCornerY + minZoomY * zoomRatio;\n maxX = minZoomX * zoomRatio;\n maxY = minZoomY * zoomRatio;\n\n // Keep the minZoom canvas constraint from fixed panning, but do not allow panning so far\n // into the minZoom canvas padding that the diagram content is completely outside the viewport.\n minX = Math.max(minX, dWidth / 2 - (width + x) * zoom);\n minY = Math.max(minY, dHeight / 2 - (height + y) * zoom);\n maxX = Math.min(maxX, dWidth / 2 - x * zoom);\n maxY = Math.min(maxY, dHeight / 2 - y * zoom);\n\n if (minX > maxX) {\n minX = maxX = (minX + maxX) / 2;\n }\n if (minY > maxY) {\n minY = maxY = (minY + maxY) / 2;\n }\n }\n const initZoom = initPanZoomState.zoom;\n const initCenterX = initPanZoomState.centerX;\n const initCenterY = initPanZoomState.centerY;\n // If an initial panZoomState is set, should expand pan bounds to include it.\n // Fixed panning is the exception: its bounds are defined by the minZoom canvas,\n // so zooming back to minZoom should re-center instead of preserving an out-of-bounds\n // high-zoom pan position.\n if (panType === 'fixed') {\n return {\n minX: minX,\n maxX: maxX,\n minY: minY,\n maxY: maxY\n };\n }\n let dx, dy;\n if (initCenterX) {\n const boundsX = initCenterX * initZoom - dWidth / 2;\n if (-boundsX * initZoom < minX) {\n dx = minX - boundsX * initZoom;\n minX -= dx;\n maxX += dx;\n } else if (-boundsX * initZoom > maxX) {\n dx = -boundsX * initZoom - maxX;\n minX -= dx;\n maxX += dx;\n }\n }\n if (initCenterY) {\n const boundsY = initCenterY * initZoom - dHeight / 2;\n if (-boundsY * initZoom < minY) {\n dy = minY - boundsY * initZoom;\n minY -= dy;\n maxY += dy;\n } else if (-boundsY * initZoom > maxY) {\n dy = -boundsY * initZoom - maxY;\n minY -= dy;\n maxY += dy;\n }\n }\n return {\n minX: minX,\n maxX: maxX,\n minY: minY,\n maxY: maxY\n };\n};\n\n/**\n * Returns the pan properties for the diagram.\n */\nexport function getPanProps(\n props: Pan,\n contentBounds: Bounds,\n userDragMode: string | undefined,\n isDeviceTouch: boolean\n) {\n const contentX = contentBounds.width !== Infinity ? contentBounds.x : 0;\n const contentY = contentBounds.height !== Infinity ? contentBounds.y : 0;\n // DiagramNodeLayer renders nodes relative to the content origin, so pan math uses the\n // same content-relative coordinate space and converts back to layout coordinates for onPan.\n return {\n panning: isDeviceTouch\n ? userDragMode === 'pan' && props.panning\n ? props.panning\n : 'off'\n : props.panning\n ? props.panning\n : 'off',\n panDirection: props.panDirection ? props.panDirection : 'any',\n centerX: props.centerX !== undefined ? props.centerX - contentX : contentBounds.width / 2,\n centerY: props.centerY !== undefined ? props.centerY - contentY : contentBounds.height / 2,\n onPan: props.onPan\n ? ({ centerX, centerY }: PanState) => {\n props.onPan?.({\n centerX: centerX + contentX,\n centerY: centerY + contentY\n });\n }\n : undefined\n };\n}\n\n/**\n * Converts centerX,Y coordinates to panX,Y coordinates\n */\nexport function centerXYToPanXY(\n centerX: number,\n centerY: number,\n zoom: number,\n width: number,\n height: number\n) {\n return {\n panX: width / 2 - centerX * zoom,\n panY: height / 2 - centerY * zoom\n };\n}\n/**\n * Converts panX,Y coordinates to centerX,Y coordinates\n */\nexport function panXYToCenterXY(\n panX: number,\n panY: number,\n zoom: number,\n width: number,\n height: number\n) {\n return {\n centerX: (width / 2 - panX) / zoom,\n centerY: (height / 2 - panY) / zoom\n };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n Bounds,\n DiagramLayoutOutput,\n DiagramNodeData,\n DiagramOverviewConfig,\n Pan,\n PanState\n} from './diagram.types';\nimport { OverviewSlidingWindow } from '#PRIVATE_VisOverview';\nimport type { PanBounds } from './utils/panUtils';\nimport { panXYToCenterXY } from './utils/panUtils';\nimport { overviewStyles } from './themes/DiagramStyles.css';\nimport { containsKey, Keys } from '#utils/UNSAFE_keys';\n\nconst OVERVIEW_GAP = 12;\nconst OVERVIEW_MIN_WIDTH = 120;\nconst OVERVIEW_MAX_WIDTH = 220;\nconst OVERVIEW_MIN_HEIGHT = 90;\nconst OVERVIEW_MAX_HEIGHT = 160;\n\ntype OverviewNodeBounds<K1> = {\n id: K1;\n bounds: Bounds;\n isExpandedContainer: boolean;\n};\n\ntype DiagramOverviewProps<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n L extends DiagramLayoutOutput<K1, K2>\n> = {\n nodes: D1[];\n nodeBounds: Map<K1, Bounds>;\n nodeAbsBounds: Map<K1, Bounds>;\n expanded: Keys<K1>;\n contentBounds: Bounds;\n componentWidth: number;\n componentHeight: number;\n layoutCenterX: number;\n layoutCenterY: number;\n zoom: number;\n minZoom: number;\n panBounds?: PanBounds;\n layoutOutput?: L;\n overview: DiagramOverviewConfig<L>;\n isRtl: boolean;\n panning: NonNullable<Pan['panning']>;\n panDirection: NonNullable<Pan['panDirection']>;\n onPan?: (detail: PanState) => void;\n};\n\nconst clamp = (value: number, min: number, max: number) => {\n return Math.min(max, Math.max(min, value));\n};\n\nconst roundPixel = (value: number) => Math.round(value);\nconst roundPixelSize = (value: number) => Math.max(1, Math.round(value));\n\nconst getOverviewSize = (width: number, height: number) => {\n const maxWidth = Math.max(0, width - 2 * OVERVIEW_GAP);\n const maxHeight = Math.max(0, height - 2 * OVERVIEW_GAP);\n return {\n width: clamp(width * 0.25, OVERVIEW_MIN_WIDTH, Math.min(maxWidth, OVERVIEW_MAX_WIDTH)),\n height: clamp(height * 0.25, OVERVIEW_MIN_HEIGHT, Math.min(maxHeight, OVERVIEW_MAX_HEIGHT))\n };\n};\n\nconst getChildBounds = <K1 extends string | number, D1 extends DiagramNodeData<K1, D1>>(\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>\n) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const node of nodes) {\n const bounds = nodeBounds.get(node.id);\n if (bounds) {\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n maxX = Math.max(maxX, bounds.x + bounds.width);\n maxY = Math.max(maxY, bounds.y + bounds.height);\n }\n }\n return minX === Infinity\n ? undefined\n : {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n};\n\nconst getOverviewNodeBounds = <K1 extends string | number, D1 extends DiagramNodeData<K1, D1>>(\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>,\n expanded: Keys<K1>,\n offsetX = 0,\n offsetY = 0\n) => {\n const overviewNodeBounds: OverviewNodeBounds<K1>[] = [];\n for (const node of nodes) {\n const bounds = nodeBounds.get(node.id);\n if (!bounds) {\n continue;\n }\n const childNodes = node.nodes;\n const isExpandedContainer = !!childNodes && containsKey(expanded, node.id);\n const overviewBounds = {\n x: bounds.x + offsetX,\n y: bounds.y + offsetY,\n width: bounds.width,\n height: bounds.height\n };\n overviewNodeBounds.push({ id: node.id, bounds: overviewBounds, isExpandedContainer });\n\n if (isExpandedContainer) {\n const childBounds = getChildBounds(childNodes, nodeBounds);\n if (childBounds) {\n const childOffsetX =\n overviewBounds.x +\n Math.max(0, (overviewBounds.width - childBounds.width) / 2) -\n childBounds.x;\n const childOffsetY =\n overviewBounds.y +\n Math.max(0, (overviewBounds.height - childBounds.height) / 2) -\n childBounds.y;\n overviewNodeBounds.push(\n ...getOverviewNodeBounds(childNodes, nodeBounds, expanded, childOffsetX, childOffsetY)\n );\n }\n }\n }\n return overviewNodeBounds;\n};\n\nconst getMeasuredOverviewNodeBounds = <\n K1 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>,\n expanded: Keys<K1>\n) => {\n const overviewNodeBounds: OverviewNodeBounds<K1>[] = [];\n for (const node of nodes) {\n const bounds = nodeBounds.get(node.id);\n const childNodes = node.nodes;\n const isExpandedContainer = !!childNodes && containsKey(expanded, node.id);\n if (bounds) {\n overviewNodeBounds.push({ id: node.id, bounds, isExpandedContainer });\n }\n\n if (isExpandedContainer) {\n overviewNodeBounds.push(...getMeasuredOverviewNodeBounds(childNodes, nodeBounds, expanded));\n }\n }\n return overviewNodeBounds;\n};\n\nconst mergeOverviewNodeBounds = <K1 extends string | number>(\n layoutOverviewNodeBounds: OverviewNodeBounds<K1>[],\n measuredOverviewNodeBounds: OverviewNodeBounds<K1>[]\n) => {\n const measuredBoundsById = new Map<K1, OverviewNodeBounds<K1>>();\n measuredOverviewNodeBounds.forEach((item) => {\n measuredBoundsById.set(item.id, item);\n });\n\n return layoutOverviewNodeBounds.map((item) => measuredBoundsById.get(item.id) ?? item);\n};\n\nconst getMeasuredLayoutBounds = <K1 extends string | number, D1 extends DiagramNodeData<K1, D1>>(\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>,\n nodeAbsBounds: Map<K1, Bounds>,\n zoom: number\n) => {\n let originX: number | undefined;\n let originY: number | undefined;\n\n for (const node of nodes) {\n const bounds = nodeBounds.get(node.id);\n const absBounds = nodeAbsBounds.get(node.id);\n if (bounds && absBounds) {\n originX = bounds.x - absBounds.x / zoom;\n originY = bounds.y - absBounds.y / zoom;\n break;\n }\n }\n\n if (originX === undefined || originY === undefined) {\n return undefined;\n }\n\n const measuredBounds = new Map<K1, Bounds>();\n nodeAbsBounds.forEach((bounds, id) => {\n measuredBounds.set(id, {\n x: originX! + bounds.x / zoom,\n y: originY! + bounds.y / zoom,\n width: bounds.width,\n height: bounds.height\n });\n });\n return measuredBounds;\n};\n\nexport function DiagramOverview<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n nodes,\n nodeBounds,\n nodeAbsBounds,\n expanded,\n contentBounds,\n componentWidth,\n componentHeight,\n layoutCenterX,\n layoutCenterY,\n zoom,\n minZoom,\n panBounds,\n layoutOutput,\n overview,\n isRtl,\n panning,\n panDirection,\n onPan\n}: DiagramOverviewProps<K1, K2, D1, L>) {\n const isOverviewReady =\n contentBounds.width > 0 &&\n contentBounds.height > 0 &&\n contentBounds.width !== Infinity &&\n contentBounds.height !== Infinity &&\n zoom > 0;\n const overviewSize = getOverviewSize(componentWidth, componentHeight);\n if (!isOverviewReady || overviewSize.width <= 0 || overviewSize.height <= 0) {\n return null;\n }\n const contentWidth = contentBounds.width;\n const contentHeight = contentBounds.height;\n\n const viewportWidth = componentWidth / zoom;\n const viewportHeight = componentHeight / zoom;\n const viewportCenterX = layoutCenterX;\n const viewportCenterY = layoutCenterY;\n const panMinCenter = panBounds\n ? panXYToCenterXY(panBounds.maxX, panBounds.maxY, zoom, componentWidth, componentHeight)\n : undefined;\n const panMaxCenter = panBounds\n ? panXYToCenterXY(panBounds.minX, panBounds.minY, zoom, componentWidth, componentHeight)\n : undefined;\n const viewportMinX = panMinCenter\n ? contentBounds.x + panMinCenter.centerX - viewportWidth / 2\n : contentBounds.x;\n const viewportMinY = panMinCenter\n ? contentBounds.y + panMinCenter.centerY - viewportHeight / 2\n : contentBounds.y;\n const viewportMaxX = panMaxCenter\n ? contentBounds.x + panMaxCenter.centerX - viewportWidth / 2\n : Math.max(contentBounds.x, contentBounds.x + contentWidth - viewportWidth);\n const viewportMaxY = panMaxCenter\n ? contentBounds.y + panMaxCenter.centerY - viewportHeight / 2\n : Math.max(contentBounds.y, contentBounds.y + contentHeight - viewportHeight);\n const useCanvasFitArea = panning === 'fixed' && minZoom > 0;\n const overviewBounds = useCanvasFitArea\n ? {\n x: contentBounds.x + contentWidth / 2 - componentWidth / (2 * minZoom),\n y: contentBounds.y + contentHeight / 2 - componentHeight / (2 * minZoom),\n width: componentWidth / minZoom,\n height: componentHeight / minZoom\n }\n : {\n x: contentBounds.x,\n y: contentBounds.y,\n width: contentWidth,\n height: contentHeight\n };\n\n const scaledOverviewRatio = Math.min(\n overviewSize.width / overviewBounds.width,\n overviewSize.height / overviewBounds.height\n );\n const scaledOverviewWidth = overviewBounds.width * scaledOverviewRatio;\n const scaledOverviewHeight = overviewBounds.height * scaledOverviewRatio;\n const overviewCanvasX = (overviewSize.width - scaledOverviewWidth) / 2;\n const overviewCanvasY = (overviewSize.height - scaledOverviewHeight) / 2;\n const windowWidth = Math.max(0, viewportWidth * scaledOverviewRatio);\n const windowHeight = Math.max(0, viewportHeight * scaledOverviewRatio);\n const minWindowX = overviewCanvasX + (viewportMinX - overviewBounds.x) * scaledOverviewRatio;\n const minWindowY = overviewCanvasY + (viewportMinY - overviewBounds.y) * scaledOverviewRatio;\n const maxWindowX = Math.max(\n minWindowX,\n overviewCanvasX + (viewportMaxX - overviewBounds.x) * scaledOverviewRatio\n );\n const maxWindowY = Math.max(\n minWindowY,\n overviewCanvasY + (viewportMaxY - overviewBounds.y) * scaledOverviewRatio\n );\n const windowX = clamp(\n overviewCanvasX +\n (viewportCenterX - viewportWidth / 2 - overviewBounds.x) * scaledOverviewRatio,\n minWindowX,\n maxWindowX\n );\n const windowY = clamp(\n overviewCanvasY +\n (viewportCenterY - viewportHeight / 2 - overviewBounds.y) * scaledOverviewRatio,\n minWindowY,\n maxWindowY\n );\n\n const hAlign = overview.hAlign ?? 'end';\n const vAlign = overview.vAlign ?? 'bottom';\n const startLeft = isRtl ? componentWidth - overviewSize.width - OVERVIEW_GAP : OVERVIEW_GAP;\n const endLeft = isRtl ? OVERVIEW_GAP : componentWidth - overviewSize.width - OVERVIEW_GAP;\n const left =\n hAlign === 'center'\n ? (componentWidth - overviewSize.width) / 2\n : hAlign === 'start'\n ? startLeft\n : endLeft;\n const top =\n vAlign === 'middle'\n ? (componentHeight - overviewSize.height) / 2\n : vAlign === 'top'\n ? OVERVIEW_GAP\n : componentHeight - overviewSize.height - OVERVIEW_GAP;\n\n const toOverviewX = (x: number) => overviewCanvasX + (x - overviewBounds.x) * scaledOverviewRatio;\n const toOverviewY = (y: number) => overviewCanvasY + (y - overviewBounds.y) * scaledOverviewRatio;\n\n const panToWindow = (nextWindowX: number, nextWindowY: number) => {\n const clampedX = clamp(nextWindowX, minWindowX, maxWindowX);\n const clampedY = clamp(nextWindowY, minWindowY, maxWindowY);\n onPan?.({\n centerX:\n panDirection !== 'y'\n ? overviewBounds.x + (clampedX - overviewCanvasX + windowWidth / 2) / scaledOverviewRatio\n : viewportCenterX,\n centerY:\n panDirection !== 'x'\n ? overviewBounds.y + (clampedY - overviewCanvasY + windowHeight / 2) / scaledOverviewRatio\n : viewportCenterY\n });\n };\n\n const customContent =\n overview.renderer && layoutOutput ? overview.renderer({ layoutOutput }) : undefined;\n const measuredNodeBounds = getMeasuredLayoutBounds(nodes, nodeBounds, nodeAbsBounds, zoom);\n const layoutOverviewNodeBounds = getOverviewNodeBounds(nodes, nodeBounds, expanded);\n const overviewNodeBounds = measuredNodeBounds\n ? mergeOverviewNodeBounds(\n layoutOverviewNodeBounds,\n getMeasuredOverviewNodeBounds(nodes, measuredNodeBounds, expanded)\n )\n : layoutOverviewNodeBounds;\n const stopDiagramPan = (event: PointerEvent) => {\n event.stopPropagation();\n };\n\n return (\n <div\n data-oj-private-object=\"overview\"\n class={overviewStyles.overviewContainerStyle}\n style={{ left, top, width: overviewSize.width, height: overviewSize.height }}>\n <div class={overviewStyles.overviewContentStyle}>\n {customContent ?? (\n <svg width=\"100%\" height=\"100%\">\n <rect\n data-oj-private-object=\"overview-window-background\"\n x={roundPixel(windowX) + 1}\n y={roundPixel(windowY) + 1}\n width={Math.max(0, roundPixel(windowWidth) - 2)}\n height={Math.max(0, roundPixel(windowHeight) - 2)}\n class={overviewStyles.overviewViewportBackgroundStyle}\n />\n {overviewNodeBounds.map(({ id, bounds, isExpandedContainer }) => {\n const x = toOverviewX(bounds.x);\n const y = toOverviewY(bounds.y);\n const width = Math.max(1, bounds.width * scaledOverviewRatio);\n const height = Math.max(1, bounds.height * scaledOverviewRatio);\n const roundedX = roundPixel(x);\n const roundedY = roundPixel(y);\n const roundedWidth = roundPixelSize(width);\n const roundedHeight = roundPixelSize(height);\n if (isExpandedContainer) {\n return (\n <rect\n key={id}\n data-oj-private-overview-node={id}\n x={roundedX}\n y={roundedY}\n width={roundedWidth}\n height={roundedHeight}\n class={overviewStyles.overviewContainerNodeStyle}\n />\n );\n }\n const radius = roundPixelSize(Math.min(width, height) / 2);\n return (\n <circle\n key={id}\n data-oj-private-overview-node={id}\n cx={roundPixel(x + width / 2)}\n cy={roundPixel(y + height / 2)}\n r={radius}\n class={overviewStyles.overviewNodeStyle}\n />\n );\n })}\n </svg>\n )}\n </div>\n <svg\n class={overviewStyles.overviewOverlayStyle}\n width=\"100%\"\n height=\"100%\"\n onPointerDown={stopDiagramPan}\n onPointerMove={stopDiagramPan}\n onPointerUp={stopDiagramPan}\n onPointerCancel={stopDiagramPan}>\n <OverviewSlidingWindow\n x={overviewCanvasX}\n y={overviewCanvasY}\n width={scaledOverviewWidth}\n height={scaledOverviewHeight}\n windowX={windowX}\n windowY={windowY}\n windowWidth={windowWidth}\n windowHeight={windowHeight}\n minWindowX={minWindowX}\n minWindowY={minWindowY}\n maxWindowX={maxWindowX}\n maxWindowY={maxWindowY}\n isInteractive={!!onPan}\n orientation={\n panDirection === 'any' ? 'both' : panDirection === 'x' ? 'horizontal' : 'vertical'\n }\n onWindowDimsChange={({ deltaX, deltaY }) => {\n panToWindow(windowX + deltaX, windowY + deltaY);\n }}\n />\n </svg>\n </div>\n );\n}\n","import { ComponentChildren } from 'preact';\nimport { centerXYToPanXY } from './utils/panUtils';\nimport { panZoomStyles } from './themes/DiagramStyles.css';\n\ntype Props = {\n centerX: number;\n centerY: number;\n zoom: number;\n width: number;\n height: number;\n children: ComponentChildren;\n};\n\nexport function DiagramPanZoomContainer({\n centerX,\n centerY,\n children,\n zoom,\n width,\n height\n}: Props) {\n const panValues = centerXYToPanXY(centerX, centerY, zoom, width, height);\n return (\n <div\n class={panZoomStyles}\n style={{\n transform: `translate(${panValues.panX}px, ${panValues.panY}px) scale(${zoom})`\n }}>\n {children}\n </div>\n );\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type {\n DiagramNodeData,\n DiagramLinkData,\n Bounds,\n ItemInfo,\n PromotedLinkId\n} from '../diagram.types';\nimport { comparePromotedLinks, getPromotedString } from './diagramUtils';\n\n/**\n * Navigation direction\n */\nexport type NavDirection = 'right' | 'left' | 'up' | 'down';\n\ntype linkDetailType<K2> =\n | {\n id: K2;\n angle: number;\n distance: number;\n type: 'link';\n /**\n * Ingoing = 1, outgoing = 0\n */\n direction: 0 | 1;\n }\n | {\n id: string;\n angle: number;\n distance: number;\n type: 'promotedLink';\n /**\n * Ingoing = 1, outgoing = 0\n */\n direction: 0 | 1;\n };\n\n/**\n * Returns the link data based on link info in a diagram.\n * @param itemInfo\n * @returns\n */\nexport function getLinkDetailFromInfo<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n itemInfo: ItemInfo<K1, K2, D2>,\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[]\n): D2 | PromotedLinkId<K1, D2> | undefined {\n let link;\n for (let i = 0; i < links.length; i++) {\n link = links[i];\n if (itemInfo.id === link.id) {\n return link;\n }\n }\n for (let i = 0; i < promotedLinks.length; i++) {\n link = promotedLinks[i];\n if (comparePromotedLinks(itemInfo.id as PromotedLinkId<K1, D2>, link)) {\n return link;\n }\n }\n return undefined;\n}\n\n/**\n * Utility method that adds sorting attributes of each link to an array\n */\nexport function addSortingAttributes<\n K1 extends string | number,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n node: D1,\n listOfLinks: (D2 | PromotedLinkId<K1, D2>)[],\n nodes: D1[],\n nodeBounds: Map<K1, Bounds>\n) {\n let angle, distance, direction;\n const linkDetail: linkDetailType<K2>[] = [];\n for (let i = 0; i < listOfLinks.length; i++) {\n const link = listOfLinks[i];\n angle = _getClockwiseAngle(node, link, nodes, nodeBounds);\n distance = _getNodesDistance(link, nodes, nodeBounds);\n direction = _getLinkDirection(node, link);\n if ('id' in link)\n linkDetail.push({\n id: link.id,\n angle: angle,\n distance: distance,\n direction: direction,\n type: 'link'\n });\n else {\n linkDetail.push({\n id: getPromotedString(link),\n angle: angle,\n distance: distance,\n direction: direction,\n type: 'promotedLink'\n });\n }\n }\n return linkDetail;\n}\n\n/**\n * Returns a function that compares two link around a given node\n * The links are analyzed by angle, distance from the node and direction. The sorting attributes are added to the links before sorting.\n */\nexport function getLinkComparator<K2>() {\n return (link1: linkDetailType<K2>, link2: linkDetailType<K2>) => {\n const { angle: linkAngle1, distance: linkDistance1, direction: linkDirection1 } = link1;\n const { angle: linkAngle2, distance: linkDistance2, direction: linkDirection2 } = link2;\n let res = -1;\n\n if (!_anglesAreEqualWithinTolerance(linkAngle1, linkAngle2) && linkAngle1 > linkAngle2) {\n res = 1;\n } else if (_anglesAreEqualWithinTolerance(linkAngle1, linkAngle2)) {\n //check distance and direction\n if (linkDistance1 > linkDistance2) {\n res = 1;\n } else if (linkDistance2 == linkDistance1 && linkDirection1 > linkDirection2) {\n //outgoing to ingoing\n res = 1;\n } else if (linkDistance2 == linkDistance1 && linkDirection1 == linkDirection2) {\n res = 0;\n }\n }\n return res;\n };\n}\n\n/**\n * Returns navigable links for a given node\n */\nexport function getNavigableLinksForNodeId<K1, K2, D2 extends DiagramLinkData<K2, K1>>(\n nodeId: K1,\n listOfLinks: (D2 | PromotedLinkId<K1, D2>)[]\n) {\n const links: (D2 | PromotedLinkId<K1, D2>)[] = [];\n listOfLinks.forEach((link) => {\n const startId = link.startNode;\n const endId = link.endNode;\n\n if (startId == nodeId || endId == nodeId) links.push(link);\n });\n\n return links;\n}\n\n/**\n * Get the clockwise angle for the link given node as a center\n */\nfunction _getClockwiseAngle<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(node: D1, link: D2 | PromotedLinkId<K1, D2>, nodes: D1[], nodeBounds: Map<K1, Bounds>) {\n //find opposite node\n let currNode;\n let startNode = nodes[0];\n let endNode = nodes[0];\n for (let i = 0; i < nodes.length; i++) {\n currNode = nodes[i];\n if (currNode.id === link.startNode) {\n startNode = currNode;\n } else if (currNode.id === link.endNode) {\n endNode = currNode;\n }\n }\n const oppositeNode = node.id == startNode.id ? endNode : startNode;\n\n const p1 = _getNodeCenter(node, nodeBounds);\n const p2 = _getNodeCenter(oppositeNode, nodeBounds);\n let angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n angle = angle < 0 ? angle + Math.PI * 2 : angle;\n return angle;\n}\n\n/**\n * Get the distance between start and end nodes for the given link\n */\nfunction _getNodesDistance<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(link: D2 | PromotedLinkId<K1, D2>, nodes: D1[], nodeBounds: Map<K1, Bounds>) {\n let currNode;\n let startNode = nodes[0];\n let endNode = nodes[0];\n for (let i = 0; i < nodes.length; i++) {\n currNode = nodes[i];\n if (currNode.id === link.startNode) {\n startNode = currNode;\n } else if (currNode.id === link.endNode) {\n endNode = currNode;\n }\n }\n const p1 = _getNodeCenter(startNode, nodeBounds);\n const p2 = _getNodeCenter(endNode, nodeBounds);\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n}\n\n/**\n * Get link direction for the given node. 1 if the node is the end node\n * and 0 if it is the start node\n */\nfunction _getLinkDirection<\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(node: D1, link: D2 | PromotedLinkId<K1, D2>): 0 | 1 {\n if (link.endNode === node.id) {\n return 1;\n }\n return 0;\n}\n\n/**\n * Get node center\n */\nfunction _getNodeCenter<K1, D1 extends DiagramNodeData<K1, D1>>(\n node: D1,\n nodeBounds: Map<K1, Bounds>\n) {\n const nodeBB = nodeBounds.get(node.id)!;\n return { x: nodeBB.x + nodeBB.width / 2, y: nodeBB.y + nodeBB.height / 2 };\n}\n\n/**\n * Calculates the angle weighted by distance\n */\nexport function calcDistanceAngleWeighted(\n objectBB: Bounds,\n currentBB: Bounds,\n direction: NavDirection\n) {\n // Variables used for calculating penalties when calculating distances between two navigables.\n const optimalAngle1 = (15 / 180) * Math.PI;\n const optimalAngle2 = (40 / 180) * Math.PI;\n const suboptimalAnglePenalty1 = 2; // multiplier to the distance\n const suboptimalAnglePenalty2 = 6; // multiplier to the distance\n\n const objCenterX = objectBB.x + objectBB.width / 2;\n const objCenterY = objectBB.y + objectBB.height / 2;\n\n const curCenterX = currentBB.x + currentBB.width / 2;\n const curCenterY = currentBB.y + currentBB.height / 2;\n\n const x_dist = Math.abs(objCenterX - curCenterX);\n const y_dist = Math.abs(objCenterY - curCenterY);\n\n const angle = Math.atan2(y_dist, x_dist);\n\n let distance = Math.sqrt(x_dist * x_dist + y_dist * y_dist);\n\n // Angle penalty based on direction\n if (\n (angle > optimalAngle1 && (direction == 'right' || direction == 'left')) ||\n (angle < Math.PI / 2 - optimalAngle1 && (direction == 'up' || direction == 'down'))\n ) {\n if (\n (angle > optimalAngle2 && (direction == 'right' || direction == 'left')) ||\n (angle < Math.PI / 2 - optimalAngle2 && (direction == 'up' || direction == 'down'))\n ) {\n distance *= suboptimalAnglePenalty2;\n } else {\n distance *= suboptimalAnglePenalty1;\n }\n }\n\n return distance;\n}\n\n/**\n * Given a direction, is a certain node is a valid destination to navigate to\n */\nexport function isValidDestination(\n objBB: Bounds,\n curBB: Bounds,\n direction: NavDirection,\n compareCenters: boolean\n) {\n // compare the centers of the navigable and to be valid, the navigable must be in the right direction\n // without tolerance\n if (compareCenters) {\n const objCenterX = objBB.x + 0.5 * objBB.width;\n const curCenterX = curBB.x + 0.5 * curBB.width;\n const objCenterY = objBB.y + 0.5 * objBB.height;\n const curCenterY = curBB.y + 0.5 * curBB.height;\n\n switch (direction) {\n case 'up':\n return objCenterY < curCenterY;\n case 'down':\n return objBB.y > curCenterY;\n case 'right':\n return objCenterX > curCenterX;\n case 'left':\n return objCenterX < curCenterX;\n default:\n break;\n }\n return true;\n }\n\n switch (direction) {\n case 'up':\n return objBB.y < curBB.y || _areEqualWithinTolerance(objBB.y, curBB.y);\n case 'down':\n return objBB.y > curBB.y || _areEqualWithinTolerance(objBB.y, curBB.y);\n case 'right':\n return objBB.x > curBB.x || _areEqualWithinTolerance(objBB.x, curBB.x);\n case 'left':\n return objBB.x < curBB.x || _areEqualWithinTolerance(objBB.x, curBB.x);\n default:\n break;\n }\n return true;\n}\n\n/**\n * Returns true if two nodes are in contact\n */\nexport function calcInContact(objRect: Bounds, curRect: Bounds, direction: NavDirection) {\n switch (direction) {\n case 'up':\n return (\n _isVerticallyAligned(objRect, curRect) &&\n (curRect.y <= objRect.y + objRect.height ||\n _areEqualWithinTolerance(curRect.y, objRect.y + objRect.height))\n );\n case 'down':\n return (\n _isVerticallyAligned(objRect, curRect) &&\n (objRect.y <= curRect.y + curRect.height ||\n _areEqualWithinTolerance(objRect.y, curRect.y + curRect.height))\n );\n case 'right':\n return (\n _isHorizontallyAligned(objRect, curRect) &&\n (objRect.x <= curRect.x + curRect.width ||\n _areEqualWithinTolerance(objRect.x, curRect.x + curRect.width))\n );\n case 'left':\n return (\n _isHorizontallyAligned(objRect, curRect) &&\n (curRect.x <= objRect.x + objRect.width ||\n _areEqualWithinTolerance(curRect.x, objRect.x + objRect.width))\n );\n default:\n break;\n }\n\n return false;\n}\n\nfunction _isVerticallyAligned(rect1: Bounds, rect2: Bounds) {\n return (\n (rect1.x >= rect2.x && rect1.x <= rect2.x + rect2.width) ||\n (rect2.x >= rect1.x && rect2.x <= rect1.x + rect1.width)\n );\n}\n\nfunction _isHorizontallyAligned(rect1: Bounds, rect2: Bounds) {\n return (\n (rect1.y >= rect2.y && rect1.y <= rect2.y + rect2.height) ||\n (rect2.y >= rect1.y && rect2.y <= rect1.y + rect1.height)\n );\n}\n\nfunction _areEqualWithinTolerance(a: number, b: number) {\n return Math.abs(a - b) <= 0.0000001;\n}\n\nfunction _anglesAreEqualWithinTolerance(a1: number, a2: number) {\n let res = Math.abs(a1 - a2) <= 0.0000001;\n if (!res) {\n res = Math.abs(Math.PI * 2 + Math.min(a1, a2) - Math.max(a1, a2)) <= 0.0000001;\n }\n return res;\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport {\n NavDirection,\n addSortingAttributes,\n calcDistanceAngleWeighted,\n calcInContact,\n getLinkComparator,\n getNavigableLinksForNodeId,\n isValidDestination\n} from '../utils/navUtils';\nimport type {\n DiagramNodeData,\n DiagramLinkData,\n Bounds,\n ItemInfo,\n PromotedLinkId\n} from '../diagram.types';\nimport { useRef } from 'preact/hooks';\nimport { getPromotedString, isPromoted } from '../utils/diagramUtils';\n\nexport function useDiagramNavigation<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n bounds: Map<K1, Bounds>,\n linkIdToDataMap: Map<K2, D2>,\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>,\n nodeIdToDataMap: Map<K1, D1>\n) {\n const currentKeyboardFocusNode = useRef<K1>();\n const nodeBoundsById = bounds;\n\n function getNextNavigableNode(\n direction: NavDirection,\n compareCenters: boolean,\n current?: D1,\n listOfObjects?: D1[]\n ) {\n if (!listOfObjects) return current;\n\n if (!current) return listOfObjects[0];\n const currBB = nodeBoundsById.get(current.id);\n if (!currBB) return current;\n\n let nextObject = current; //init to current object\n let nextDistance = Number.MAX_VALUE;\n\n // If an object is in contact it overrules all other attributes\n // Only another in contact object with better attributes will have higher precedence\n let nextInContact = false;\n\n // Whether or not the for loop has encountered the current object\n let hasFoundCurrent = false;\n\n let object, inContact, distance;\n for (let i = 0; i < listOfObjects.length; i++) {\n object = listOfObjects[i];\n\n if (object === current) {\n hasFoundCurrent = true;\n continue;\n }\n const objBB = nodeBoundsById.get(object.id);\n if (!objBB) continue;\n\n const objBounds = { x: objBB.x, y: objBB.y, width: objBB.width, height: objBB.height };\n const currBounds = { x: currBB.x, y: currBB.y, width: currBB.width, height: currBB.height };\n if (!isValidDestination(objBounds, currBounds, direction, compareCenters)) continue;\n\n inContact = calcInContact(objBounds, currBounds, direction);\n\n if (nextInContact && !inContact) continue;\n\n distance = calcDistanceAngleWeighted(objBounds, currBounds, direction);\n\n if (distance == 0 && !hasFoundCurrent) continue;\n\n // Make sure incontact flag have highest precedence\n if (\n (!nextInContact && inContact) ||\n (distance < nextDistance && ((nextInContact && inContact) || !nextInContact))\n ) {\n nextDistance = distance;\n nextObject = object;\n nextInContact = inContact;\n }\n }\n return nextObject;\n }\n\n /**\n * Get next navigavle link depending on direction - clockwise or conter clockwise.\n * The decision is made based on location of nodes centers rather than link paths or link angles.\n */\n function getNextNavigableLink(\n direction: string,\n listOfNodes: D1[],\n currentLink?: D2 | PromotedLinkId<K1, D2>,\n listOfLinks?: D2[],\n promotedLinks?: PromotedLinkId<K1, D2>[]\n ) {\n if (!(listOfLinks || promotedLinks)) return currentLink;\n const allLinks =\n listOfLinks && promotedLinks\n ? [...listOfLinks, ...promotedLinks]\n : (listOfLinks ? listOfLinks : promotedLinks)!;\n\n if (!currentLink) return allLinks[0];\n const keyboardFocusNode = currentKeyboardFocusNode.current;\n const nodeId = keyboardFocusNode ? keyboardFocusNode : currentLink.startNode;\n const node = nodeIdToDataMap.get(nodeId);\n\n if (!node) return currentLink;\n const adjLinks = getNavigableLinksForNodeId<K1, K2, D2>(node.id, allLinks);\n const linksWithSortingAttributes = addSortingAttributes<K1, K2, D1, D2>(\n node,\n adjLinks,\n listOfNodes,\n nodeBoundsById\n );\n linksWithSortingAttributes.sort(getLinkComparator());\n //clockwise direction\n const bForward = direction == 'down' ? true : false;\n let index = 0;\n for (let i = 0; i < linksWithSortingAttributes.length; i++) {\n const id = 'id' in currentLink ? currentLink.id : getPromotedString(currentLink);\n const link = linksWithSortingAttributes[i];\n if (link.id === id) {\n if (bForward) index = i == linksWithSortingAttributes.length - 1 ? 0 : i + 1;\n else index = i == 0 ? linksWithSortingAttributes.length - 1 : i - 1;\n break;\n }\n }\n if (linksWithSortingAttributes[index].type === 'link') {\n return linkIdToDataMap.get(linksWithSortingAttributes[index].id as K2);\n }\n return promotedLinkMap.get(linksWithSortingAttributes[index].id as string);\n }\n\n /**\n * Returns the link detail when a node to link navigation occurs\n */\n function navigateFromNodeToLink(\n listOfLinks: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n event: KeyboardEvent,\n node?: D1\n ): ItemInfo<K1, K2, D2> | undefined {\n if (!node) return undefined;\n const adjLinks = getNavigableLinksForNodeId(node.id, [...listOfLinks, ...promotedLinks]);\n if (adjLinks.length < 1) return undefined;\n let link = adjLinks[0];\n const nodeBB = nodeBoundsById.get(node.id)!;\n let object;\n let currNode: K1;\n let currNodeBB;\n let currNodeBBCenterX;\n const nodeCenterX = nodeBB.x + nodeBB.width / 2;\n currentKeyboardFocusNode.current = node.id;\n for (let i = 0; i < adjLinks.length; i++) {\n object = adjLinks[i];\n currNode = object.startNode === node.id ? object.endNode : object.startNode;\n currNodeBB = nodeBoundsById.get(currNode);\n currNodeBBCenterX = currNodeBB!.x + currNodeBB!.width / 2;\n if (\n // equivalent of ≤ and ≥\n (event.altKey && event.code === 'Comma' && currNodeBBCenterX <= nodeCenterX) ||\n (event.altKey && event.code === 'Period' && currNodeBBCenterX >= nodeCenterX)\n ) {\n link = object;\n break;\n }\n }\n return (\n isPromoted(link) ? { id: link, type: 'promotedLink' } : { id: (link as D2).id, type: 'link' }\n ) as ItemInfo<K1, K2, D2>;\n }\n\n /**\n * Returns the node detail when a link to node navigation occurs\n */\n function navigateFromLinkToNode(\n startNode: K1,\n endNode: K1,\n key: string\n ): ItemInfo<K1, K2, D2> | undefined {\n const startNodeBB = nodeBoundsById.get(startNode);\n const endNodeBB = nodeBoundsById.get(endNode);\n if (!startNodeBB || !endNodeBB) return undefined;\n const startNodeCenterX = startNodeBB.x + startNodeBB.width / 2;\n const endNodeCenterX = endNodeBB.x + endNodeBB.width / 2;\n const newNode =\n (endNodeCenterX > startNodeCenterX && key === 'ArrowRight') ||\n (endNodeCenterX < startNodeCenterX && key === 'ArrowLeft')\n ? endNode\n : startNode;\n return { id: newNode, type: 'node' };\n }\n\n return {\n getNextNavigableNode,\n getNextNavigableLink,\n navigateFromNodeToLink,\n navigateFromLinkToNode\n };\n}\n","import {\n ItemInfo,\n ItemHoverDetail,\n ItemFocusDetail,\n Bounds,\n DiagramNodeData,\n DiagramLinkData,\n ExpandedItemDetail,\n PromotedLinkId\n} from '../diagram.types';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport {\n isEqualItem,\n getNavigableInfo,\n changeExpanded,\n expCollapseButtonId,\n getPromotedString,\n isPromoted,\n getChildInfo\n} from '../utils/diagramUtils';\nimport { zoomAndCenterItemFromInfo } from '../utils/zoomUtils';\nimport { getRandomId } from '#utils/PRIVATE_visLayoutUtils/layoutUtils';\nimport { getLinkDetailFromInfo } from '../utils/navUtils';\nimport { useDiagramNavigation } from './useDiagramNavigation';\nimport type { NavDirection } from '../utils/navUtils';\nimport { useVisHover } from '#hooks/PRIVATE_useVisHover';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { gestureTypes } from '#hooks/PRIVATE_useVisContextMenu';\nimport { Keys } from '#utils/UNSAFE_keys';\n\nconst DEFAULT_KB_PAN = 15;\nconst DEFAULT_KB_ZOOM = 0.15;\nconst DIAGRAM_ITEM_SELECTOR =\n '[data-oj-private-node], [data-oj-private-link], [data-oj-private-promoted-link]';\n\nexport function useEvents<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n touchResponse: 'touchStart' | 'touchHold',\n initNode: D1,\n nodes: D1[],\n links: D2[],\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeBounds: Map<K1, Bounds>,\n navigationNodeBounds: Map<K1, Bounds>,\n linkIdToDataMap: Map<K2, D2>,\n nodeIdToDataMap: Map<K1, D1>,\n width: number,\n height: number,\n maxZoom: number,\n expanded: Keys<K1>,\n itemIdToParentMap: Map<K1, K1>,\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>,\n onItemHover?: (detail: ItemHoverDetail<K1, K2, D1, D2>) => void,\n onItemFocus?: (detail: ItemFocusDetail<K1, K2, D1, D2>) => void,\n kbPanCallback?: (props: {\n dPan?: { dx: number; dy: number };\n nPan?: { cx: number; cy: number };\n center?: boolean;\n }) => void,\n kbZoomCallback?: (props: { dZoom?: number; nZoom?: number }) => void,\n onExpandedChange?: (detail: ExpandedItemDetail<K1>) => void,\n isTabbableMode?: () => boolean,\n shouldIgnoreTransientBlur?: (event: FocusEvent) => boolean\n) {\n const {\n getNextNavigableNode,\n getNextNavigableLink,\n navigateFromNodeToLink,\n navigateFromLinkToNode\n } = useDiagramNavigation<K1, K2, D1, D2>(\n navigationNodeBounds,\n linkIdToDataMap,\n promotedLinkMap,\n nodeIdToDataMap\n );\n const [focusedItemInfo, setfocusedItemInfo] = useState<ItemInfo<K1, K2, D2>>({\n id: initNode.id,\n type: 'node'\n });\n const [hoveredItemInfo, sethoveredItemInfo] = useState<ItemInfo<K1, K2, D2>>();\n const activeId = useRef<string>();\n\n const getNearestVisibleNodeId = (nodeId: K1) => {\n let currentNodeId: K1 | undefined = nodeId;\n while (currentNodeId != null && !nodeIdToDataMap.has(currentNodeId)) {\n currentNodeId = itemIdToParentMap.get(currentNodeId);\n }\n return currentNodeId;\n };\n\n const getVisibleFallbackItemInfo = (itemInfo: ItemInfo<K1, K2, D2>) => {\n if (itemInfo.type === 'node') {\n const nearestVisibleNodeId = getNearestVisibleNodeId(itemInfo.id as K1) ?? initNode.id;\n return nearestVisibleNodeId === itemInfo.id\n ? undefined\n : { ...itemInfo, id: nearestVisibleNodeId };\n }\n\n if (itemInfo.type === 'link') {\n if (linkIdToDataMap.has(itemInfo.id as K2)) {\n return undefined;\n }\n return { id: initNode.id, type: 'node' } as ItemInfo<K1, K2, D2>;\n }\n\n const promotedLinkId = getPromotedString(itemInfo.id as PromotedLinkId<K1, D2>);\n if (promotedLinkMap.has(promotedLinkId)) {\n return undefined;\n }\n\n const fallbackNodeId =\n getNearestVisibleNodeId((itemInfo.id as PromotedLinkId<K1, D2>).startNode) ??\n getNearestVisibleNodeId((itemInfo.id as PromotedLinkId<K1, D2>).endNode) ??\n initNode.id;\n return { id: fallbackNodeId, type: 'node' } as ItemInfo<K1, K2, D2>;\n };\n\n const resolvedFocusedItemInfo = getVisibleFallbackItemInfo(focusedItemInfo) ?? focusedItemInfo;\n\n const cancelEvent = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const normalizeKey = (key: string) => {\n switch (key) {\n case 'Up':\n return 'ArrowUp';\n case 'Down':\n return 'ArrowDown';\n case 'Left':\n return 'ArrowLeft';\n case 'Right':\n return 'ArrowRight';\n case 'Esc':\n return 'Escape';\n default:\n return key;\n }\n };\n\n const isElementFocusVisible = (element: Element) => {\n try {\n return element.matches(':focus-visible');\n } catch {\n return false;\n }\n };\n\n const isChangeItemType = (itemInfo: ItemInfo<K1, K2, D2>, key: string, event: KeyboardEvent) => {\n // check if switching from node to link\n // equivalent of ≤ and ≥\n if (\n itemInfo.type === 'node' &&\n event.altKey &&\n (event.code === 'Period' || event.code === 'Comma' || key === '>' || key === '<')\n ) {\n return true;\n }\n\n // check if switching from link to node\n return itemInfo.type !== 'node' && (key === 'ArrowLeft' || key === 'ArrowRight');\n };\n\n const syncFocusedItemInfoFromTarget = (\n target: EventTarget | null,\n currentTarget?: EventTarget | null\n ) => {\n if (!(target instanceof Element)) {\n return undefined;\n }\n\n const itemTarget = target.closest(DIAGRAM_ITEM_SELECTOR);\n if (!(itemTarget instanceof HTMLElement)) {\n return undefined;\n }\n\n if (currentTarget instanceof Element && !currentTarget.contains(itemTarget)) {\n return undefined;\n }\n\n const itemInfo = getNavigableInfo<K1, K2, D2>(\n itemTarget,\n promotedLinkMap,\n nodeIdToDataMap,\n linkIdToDataMap\n );\n const isFocusVisible = isElementFocusVisible(target) || isElementFocusVisible(itemTarget);\n const syncedItemInfo = {\n ...itemInfo,\n isCurrent: true,\n isFocusVisible\n } as ItemInfo<K1, K2, D2>;\n if (\n !focusedItemInfo.isCurrent ||\n focusedItemInfo.isFocusVisible !== isFocusVisible ||\n !isEqualItem(itemInfo, focusedItemInfo)\n ) {\n updatefocusedItemInfo(syncedItemInfo);\n }\n return syncedItemInfo;\n };\n\n const keyDownHandler = (event: KeyboardEvent) => {\n const key = normalizeKey(event.key);\n const tabbableModeActive = isTabbableMode?.() ?? false;\n const currentTarget = event.currentTarget as Element | null;\n const target = event.target as Element | null;\n const hasInternalFocus = currentTarget != null && event.target !== currentTarget;\n const itemTarget = target?.closest(DIAGRAM_ITEM_SELECTOR);\n const isOwnerElementTarget = itemTarget != null && itemTarget === target;\n let eventConsumed = false;\n const syncedFocusedItemInfo =\n !tabbableModeActive && isOwnerElementTarget\n ? undefined\n : syncFocusedItemInfoFromTarget(event.target, event.currentTarget);\n const currentFocusedItemInfo = syncedFocusedItemInfo ?? resolvedFocusedItemInfo;\n\n // tabbing out of the diagram\n if (key === 'Tab') {\n return;\n }\n if (tabbableModeActive && hasInternalFocus && key !== 'F2' && key !== 'Escape') {\n return;\n }\n // if this a switch from node to link or vice versa\n if (isChangeItemType(currentFocusedItemInfo, key, event)) {\n let nextItemInfo: ItemInfo<K1, K2, D2> | undefined;\n if (currentFocusedItemInfo.type === 'node') {\n nextItemInfo = navigateFromNodeToLink(\n links,\n promotedLinks,\n event,\n nodeIdToDataMap.get(currentFocusedItemInfo.id)\n );\n } else if (currentFocusedItemInfo.type === 'link') {\n const data = linkIdToDataMap.get(currentFocusedItemInfo.id as K2)!;\n nextItemInfo = navigateFromLinkToNode(data.startNode, data.endNode, key);\n } else {\n // promoted link\n const id = currentFocusedItemInfo.id;\n nextItemInfo = navigateFromLinkToNode(id.startNode, id.endNode, key);\n }\n handleKeyboardInput(nextItemInfo);\n eventConsumed = true;\n } else if (isNavigationEvent(key)) {\n const nextItemInfo = handleKeyboardNavigationEvent(currentFocusedItemInfo, key) as ItemInfo<\n K1,\n K2,\n D2\n >;\n handleKeyboardInput(nextItemInfo);\n eventConsumed = true;\n } else {\n switch (key) {\n case 'PageUp': {\n kbPanCallback &&\n kbPanCallback({\n dPan: {\n dx: event.shiftKey ? -DEFAULT_KB_PAN : 0,\n dy: event.shiftKey ? 0 : -DEFAULT_KB_PAN\n }\n });\n eventConsumed = true;\n break;\n }\n case 'PageDown': {\n kbPanCallback &&\n kbPanCallback({\n dPan: {\n dx: event.shiftKey ? DEFAULT_KB_PAN : 0,\n dy: event.shiftKey ? 0 : DEFAULT_KB_PAN\n }\n });\n eventConsumed = true;\n break;\n }\n case '+':\n case '=': {\n kbZoomCallback && kbZoomCallback({ dZoom: DEFAULT_KB_ZOOM });\n eventConsumed = true;\n break;\n }\n case '-':\n case '_': {\n kbZoomCallback && kbZoomCallback({ dZoom: -DEFAULT_KB_ZOOM });\n eventConsumed = true;\n break;\n }\n case '0': {\n if (event.ctrlKey && event.altKey) {\n const { centerX, centerY, zoom } = zoomAndCenterItemFromInfo(\n currentFocusedItemInfo,\n linkIdToDataMap,\n nodeBounds,\n width,\n height,\n maxZoom\n );\n kbZoomCallback && kbZoomCallback({ nZoom: zoom });\n kbPanCallback && kbPanCallback({ nPan: { cx: centerX, cy: centerY } });\n } else {\n // zoom to fit\n kbZoomCallback && kbZoomCallback({});\n kbPanCallback && kbPanCallback({ center: true });\n }\n eventConsumed = true;\n break;\n }\n case ' ': {\n if ((event.ctrlKey || event.metaKey) && event.shiftKey) {\n if (currentFocusedItemInfo.type === 'node') {\n const id = currentFocusedItemInfo.id;\n const newExpanded = changeExpanded(id, expanded);\n onExpandedChange && onExpandedChange({ expanded: newExpanded });\n }\n }\n break;\n }\n case '[': {\n if (currentFocusedItemInfo.type === 'node') {\n const child = getChildInfo(currentFocusedItemInfo.id, nodeIdToDataMap);\n if (child) {\n const item = { id: child.id, type: 'node' } as ItemInfo<K1, K2, D2>;\n handleKeyboardInput(item);\n }\n }\n eventConsumed = true;\n break;\n }\n case ']': {\n if (currentFocusedItemInfo.type === 'node') {\n const parentId = itemIdToParentMap.get(currentFocusedItemInfo.id);\n if (parentId) {\n const item = { id: parentId, type: 'node' } as ItemInfo<K1, K2, D2>;\n handleKeyboardInput(item);\n }\n }\n eventConsumed = true;\n break;\n }\n }\n }\n if (eventConsumed) {\n cancelEvent(event);\n }\n };\n\n const keyUpHandler = (event: KeyboardEvent) => {\n const key = normalizeKey(event.key);\n switch (key) {\n case 'Tab': {\n updatefocusedItemInfo({\n ...resolvedFocusedItemInfo,\n isCurrent: true,\n isFocusVisible: true\n });\n break;\n }\n }\n };\n\n const blurHandler = (event: FocusEvent) => {\n const currentTarget = event.currentTarget as HTMLDivElement | null;\n const relatedTarget = event.relatedTarget as Element | null;\n if (currentTarget != null && relatedTarget != null && currentTarget.contains(relatedTarget)) {\n return;\n }\n if (shouldIgnoreTransientBlur?.(event)) {\n return;\n }\n\n if (hoveredItemInfo != null || resolvedFocusedItemInfo.isCurrent) {\n onItemFocus?.(undefined);\n }\n const itemInfo = { ...resolvedFocusedItemInfo, isCurrent: false, isFocusVisible: false };\n setfocusedItemInfo(itemInfo);\n };\n\n const onHover = (event: PointerEvent) => {\n const itemInfo = getNavigableInfo<K1, K2, D2>(\n event.target as HTMLElement,\n promotedLinkMap,\n nodeIdToDataMap,\n linkIdToDataMap\n );\n if (itemInfo && !isEqualItem(itemInfo, hoveredItemInfo)) {\n sethoveredItemInfo({ ...itemInfo, isCurrent: true });\n activeId.current = getRandomId();\n setfocusedItemInfo({ ...focusedItemInfo, isCurrent: false });\n let detail: ItemHoverDetail<K1, K2, D1, D2>;\n if (itemInfo.type === 'node') {\n detail = {\n id: itemInfo.id,\n type: 'node',\n data: nodeIdToDataMap.get(itemInfo.id as K1)\n };\n } else if (itemInfo.type === 'link') {\n detail = {\n id: itemInfo.id,\n type: 'link',\n data: linkIdToDataMap.get(itemInfo.id as K2)\n };\n } else if (itemInfo.type === 'promotedLink') {\n detail = {\n type: 'promotedLink',\n id: itemInfo.id\n };\n }\n onItemHover?.(detail);\n }\n };\n\n const onHoverLeave = () => {\n sethoveredItemInfo(undefined);\n activeId.current = undefined;\n onItemHover?.(undefined);\n };\n\n const hoverHandlers = useVisHover(onHover, undefined, onHoverLeave, touchResponse);\n\n const pointerUpHandler = (event: PointerEvent) => {\n const itemInfo = getNavigableInfo<K1, K2, D2>(\n event.target as HTMLElement,\n promotedLinkMap,\n nodeIdToDataMap,\n linkIdToDataMap\n );\n if (itemInfo.id != null) {\n let buttonId;\n if (itemInfo.type === 'node') {\n buttonId = expCollapseButtonId<K1>(event.target as HTMLElement, nodeIdToDataMap);\n if (buttonId) {\n const newExpanded = changeExpanded(buttonId, expanded);\n onExpandedChange && onExpandedChange({ expanded: newExpanded });\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n setfocusedItemInfo(itemInfo);\n activeId.current = getRandomId();\n }\n };\n\n function updatefocusedItemInfo(itemInfo: ItemInfo<K1, K2, D2>) {\n if (itemInfo.type === 'node') {\n onItemFocus?.({\n id: itemInfo.id as K1,\n type: 'node',\n data: nodeIdToDataMap.get(itemInfo.id)\n });\n } else if (itemInfo.type === 'link') {\n onItemFocus?.({\n id: itemInfo.id as K2,\n type: 'link',\n data: linkIdToDataMap.get(itemInfo.id)\n });\n } else if (itemInfo.type === 'promotedLink') {\n onItemFocus?.({\n id: itemInfo.id,\n type: 'promotedLink'\n });\n }\n activeId.current = getRandomId();\n setfocusedItemInfo(itemInfo);\n }\n\n function handleKeyboardInput(item?: ItemInfo<K1, K2, D2>) {\n if (!item) return;\n if (!isEqualItem(item, focusedItemInfo)) {\n item.isCurrent = true;\n item.isFocusVisible = true;\n if (hoveredItemInfo) {\n sethoveredItemInfo({ ...hoveredItemInfo, isCurrent: false });\n }\n updatefocusedItemInfo(item);\n }\n }\n\n function isNavigationEvent(key: string) {\n switch (key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'ArrowRight':\n case 'ArrowLeft': {\n return true;\n }\n }\n return false;\n }\n\n function handleKeyboardNavigationEvent(currentItemInfo: ItemInfo<K1, K2, D2>, key: string) {\n let direction: NavDirection = 'down';\n switch (key) {\n case 'ArrowDown': {\n direction = 'down';\n break;\n }\n case 'ArrowUp': {\n direction = 'up';\n break;\n }\n case 'ArrowRight': {\n direction = 'right';\n break;\n }\n case 'ArrowLeft': {\n direction = 'left';\n break;\n }\n }\n if (currentItemInfo.type === 'node') {\n const parent = itemIdToParentMap.get(currentItemInfo.id as K1);\n const navigableNodes =\n parent && nodeIdToDataMap.get(parent) ? nodeIdToDataMap.get(parent)!.nodes! : nodes;\n const itemDetail = getNextNavigableNode(\n direction,\n true,\n nodeIdToDataMap.get(currentItemInfo.id as K1),\n navigableNodes\n );\n return itemDetail ? { id: itemDetail.id, type: 'node' } : currentItemInfo;\n } else {\n const linkDetail = getLinkDetailFromInfo<K1, K2, D2>(currentItemInfo, links, promotedLinks);\n const itemDetail = getNextNavigableLink(direction, nodes, linkDetail, links, promotedLinks);\n if (itemDetail && isPromoted(itemDetail)) return { id: itemDetail, type: 'promotedLink' };\n else if (itemDetail && !isPromoted(itemDetail))\n return { id: (itemDetail as D2).id, type: 'link' };\n else return { id: currentItemInfo.id, type: currentItemInfo.type };\n }\n }\n const onContextMenuDismissed = (gesture: gestureTypes) => {\n if (gesture === 'keyboard') {\n updatefocusedItemInfo({\n ...focusedItemInfo,\n isFocusVisible: true,\n isCurrent: true\n });\n }\n };\n\n const onFocus = (event: FocusEvent) => {\n activeId.current = getRandomId();\n\n const currentTarget = event.currentTarget as HTMLDivElement | null;\n if (currentTarget == null) {\n return;\n }\n\n const target = event.target as Element | null;\n if (target != null && target !== currentTarget) {\n if (syncFocusedItemInfoFromTarget(target, currentTarget) == null) {\n return;\n }\n return;\n }\n\n const isFocusVisible =\n resolvedFocusedItemInfo.isFocusVisible || isElementFocusVisible(currentTarget);\n if (\n !resolvedFocusedItemInfo.isCurrent ||\n resolvedFocusedItemInfo.isFocusVisible !== isFocusVisible\n ) {\n updatefocusedItemInfo({\n ...resolvedFocusedItemInfo,\n isCurrent: true,\n isFocusVisible\n });\n }\n };\n useEffect(() => {\n const fallbackItemInfo = getVisibleFallbackItemInfo(focusedItemInfo);\n if (fallbackItemInfo == null || isEqualItem(fallbackItemInfo, focusedItemInfo)) {\n return;\n }\n\n updatefocusedItemInfo(fallbackItemInfo);\n }, [\n focusedItemInfo,\n initNode.id,\n itemIdToParentMap,\n linkIdToDataMap,\n nodeIdToDataMap,\n promotedLinkMap\n ]);\n const hasActiveDescendant =\n (resolvedFocusedItemInfo.isCurrent && resolvedFocusedItemInfo.isFocusVisible) ||\n hoveredItemInfo?.isCurrent;\n return {\n focusedItemInfo: resolvedFocusedItemInfo,\n hoveredItemInfo,\n activeId: hasActiveDescendant ? activeId.current : undefined,\n onContextMenuDismissed,\n syncFocusedItemInfoFromTarget,\n eventsProps: mergeProps(hoverHandlers, {\n onKeyUp: keyUpHandler,\n onKeyDown: keyDownHandler,\n onBlur: blurHandler,\n onPointerUp: pointerUpHandler,\n onFocus\n })\n };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n ItemInfo,\n Bounds,\n DatatipContext,\n DiagramNodeData,\n DiagramLinkData\n} from '../diagram.types';\nimport type { RefObject } from 'preact';\nimport { useDatatip } from '#hooks/PRIVATE_useDatatip';\nimport { calculateOffset } from '#utils/PRIVATE_visLayoutUtils/layoutUtils';\nimport type { PanningState } from '../utils/panUtils';\nimport { useUser } from '#hooks/UNSAFE_useUser';\nimport { getDatatipContent } from '../utils/diagramUtils';\nimport { DatatipConfig } from '#utils/UNSAFE_visTypes/common';\n\nconst DEBUG_FLAG = '__OJ_DIAGRAM_TABBABLE_DEBUG__';\n\nconst isDebugEnabled = () => {\n const globalDebugFlag = (globalThis as typeof globalThis & Record<string, unknown>)[DEBUG_FLAG];\n return globalDebugFlag === true;\n};\n\ntype props<K1, K2, D1, D2> = {\n touchResponse: 'touchStart' | 'touchHold';\n datatip?: DatatipConfig<DatatipContext<K1, D1, D2>>;\n text?: string;\n focusedItemInfo: ItemInfo<K1, K2, D2>;\n focusedItemBoundsRef: RefObject<Bounds | null>;\n panState: PanningState;\n zoom: number;\n width: number;\n nodesMap: Map<K1, D1>;\n linksMap: Map<K2, D2>;\n hoveredItem?: ItemInfo<K1, K2, D2>;\n isTabbableMode?: boolean;\n};\n\n/**\n * Returns the datatip.\n * @param text The text string for the diagram item.\n * @param rootRef The ref for root of the diagram.\n * @param focusedItemBoundsRef The ref for focused item bounds.\n * @param focusedItemInfo The ItemInfo for focused item.\n * @returns\n */\nexport const useDiagramDatatip = <\n K1,\n K2,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>({\n touchResponse,\n datatip,\n focusedItemBoundsRef,\n focusedItemInfo,\n panState,\n zoom,\n width,\n nodesMap,\n linksMap,\n hoveredItem,\n isTabbableMode = false\n}: props<K1, K2, D1, D2>) => {\n const { direction } = useUser();\n const isRtl = direction === 'rtl';\n\n const datatipC = getDatatipContent(nodesMap, linksMap, focusedItemInfo, hoveredItem, datatip);\n const elementBounds = focusedItemBoundsRef.current\n ? {\n x: focusedItemBoundsRef.current.x + panState.panX,\n y: focusedItemBoundsRef.current.y + panState.panY,\n width: focusedItemBoundsRef.current.width * zoom,\n height: focusedItemBoundsRef.current.height * zoom\n }\n : undefined;\n const offset = focusedItemInfo.isCurrent\n ? calculateOffset(isRtl, width, elementBounds)\n : calculateOffset(isRtl, width);\n\n if (isDebugEnabled()) {\n console.log('[diagram datatip debug]', {\n focusedItemInfo,\n hoveredItem,\n focusedItemBounds: focusedItemBoundsRef.current,\n elementBounds,\n panState,\n zoom\n });\n }\n\n const { datatipContent, datatipProps } = useDatatip({\n content: datatipC?.content,\n borderColor: datatipC?.borderColor,\n placement: 'top-start',\n offset,\n anchor: focusedItemInfo?.isCurrent ? 'element' : 'pointer',\n touchResponse,\n isDisabled: isTabbableMode\n });\n return { datatipContent: datatipContent, datatipProps: datatipProps };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { safeSetPointerCapture } from '#utils/PRIVATE_visPointerUtils';\n\ntype PointerGesture = {\n pointers: PointerEvent[];\n};\n\ntype UsePointerGestureOptions = {\n captureTargetRef: RefObject<HTMLDivElement>;\n numPointers: number;\n onPointerGestureDown?: (detail: PointerGesture) => void;\n onPointerGestureMove?: (detail: PointerGesture) => void;\n onPointerGestureEnd?: (detail: PointerGesture) => void;\n onExtraneousPointerDown?: (detail: PointerGesture) => void;\n isDisabled?: boolean;\n};\n\nconst usePointerGesture = ({\n captureTargetRef,\n numPointers = 1,\n onPointerGestureDown,\n onPointerGestureMove,\n onPointerGestureEnd,\n onExtraneousPointerDown,\n isDisabled = false\n}: UsePointerGestureOptions) => {\n const activePointers = useRef<PointerEvent[]>([]);\n\n if (isDisabled) {\n activePointers.current = [];\n }\n\n const onPointerDown = (e: PointerEvent) => {\n activePointers.current.push(e);\n if (activePointers.current.length === numPointers) {\n onPointerGestureDown && onPointerGestureDown({ pointers: activePointers.current });\n } else if (activePointers.current.length > numPointers) {\n onExtraneousPointerDown && onExtraneousPointerDown({ pointers: activePointers.current });\n }\n };\n\n const onPointerMove = (e: PointerEvent) => {\n if (activePointers.current.length === 0) return;\n\n const index = activePointers.current.findIndex(\n (pointerEvent) => pointerEvent.pointerId === e.pointerId\n );\n if (index === -1) return;\n\n activePointers.current[index] = e;\n if (activePointers.current.length === numPointers) {\n activePointers.current.forEach((e) =>\n safeSetPointerCapture(captureTargetRef.current, e.pointerId)\n );\n\n onPointerGestureMove && onPointerGestureMove({ pointers: activePointers.current });\n }\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const index = activePointers.current.findIndex(\n (pointerEvent) => pointerEvent.pointerId === e.pointerId\n );\n if (index === -1) return;\n\n activePointers.current[index] = e;\n if (activePointers.current.length === numPointers) {\n onPointerGestureEnd && onPointerGestureEnd({ pointers: activePointers.current });\n }\n activePointers.current.splice(index, 1);\n };\n\n const onPointerCancel = onPointerUp;\n const onPointerLeave = onPointerUp;\n\n return isDisabled\n ? {}\n : {\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onPointerLeave\n };\n};\n\nexport { usePointerGesture };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { PanState } from '../diagram.types';\nimport type { RefObject } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { useDrag } from './useDrag';\nimport { PanBounds, pan, centerXYToPanXY } from '../utils/panUtils';\n/**\n * Options for useDragPan hook\n */\ntype UseDragPanOptions = {\n panProps: {\n centerX: number;\n centerY: number;\n panDirection: 'x' | 'y' | 'any';\n onPan?: (detail: PanState) => void;\n panning?: 'centerContent' | 'fixed' | 'off';\n };\n captureTargetRef: RefObject<HTMLDivElement>;\n panBounds?: PanBounds;\n onDragPanStart?: () => void;\n onDragPanEnd?: () => void;\n zoom: number;\n width: number;\n height: number;\n};\n\nconst useDragPan = ({\n panProps,\n captureTargetRef,\n panBounds,\n width,\n height,\n zoom,\n onDragPanStart,\n onDragPanEnd\n}: UseDragPanOptions) => {\n const prevPanState = useRef({ panX: 0, panY: 0 });\n const initialPanState = useRef({ panX: 0, panY: 0 });\n const dragProps = useDrag({\n captureTargetRef,\n onDragStart: () => {\n const panValues = centerXYToPanXY(panProps.centerX, panProps.centerY, zoom, width, height);\n initialPanState.current = {\n panX: panValues.panX,\n panY: panValues.panY\n };\n prevPanState.current = panValues;\n onDragPanStart && onDragPanStart();\n },\n onDragMove: ({ dx, dy }) => {\n const nextPan = {\n panX: initialPanState.current.panX + dx,\n panY: initialPanState.current.panY + dy\n };\n const { newPan } = pan(\n prevPanState.current,\n nextPan,\n panProps.panDirection,\n zoom,\n width,\n height,\n panBounds,\n panProps.onPan\n );\n prevPanState.current = newPan;\n },\n onDragEnd: ({ originalEvent }) => {\n // If panning occurred, call preventDefault to prevent selection from occurring\n if (\n initialPanState.current.panX !== prevPanState.current.panX ||\n initialPanState.current.panY !== prevPanState.current.panY\n )\n originalEvent.preventDefault();\n onDragPanEnd && onDragPanEnd();\n },\n isDisabled: panProps.panning === 'off'\n });\n\n return dragProps;\n};\n\nexport { useDragPan };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { usePointerGesture } from './usePointerGesture';\n/**\n * Draggable region\n */\ntype DraggableRegion = {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n};\n\ntype DragDetail = {\n x: number;\n y: number;\n dx: number;\n dy: number;\n regionOffsetX: number;\n regionOffsetY: number;\n originalEvent: PointerEvent;\n};\n\ntype UseDragOptions = {\n captureTargetRef: RefObject<HTMLDivElement>;\n draggableRegion?: DraggableRegion;\n onDragStart?: (detail: Omit<DragDetail, 'dx' | 'dy'>) => void;\n onDragMove?: (detail: DragDetail) => void;\n onDragEnd?: (detail: DragDetail) => void;\n isDisabled?: boolean;\n};\n/**\n * Whether point with coordinates are in the draggable region\n */\nconst inDraggableRegion = (x: number, y: number, region?: DraggableRegion) => {\n if (!region) return true;\n const { xMin, xMax, yMin, yMax } = region;\n return x >= xMin && x <= xMax && y >= yMin && y <= yMax;\n};\n\n/**\n * Returns region offset\n */\nconst getRegionOffset = (x: number, y: number, region?: DraggableRegion) => {\n if (!region) return { regionOffsetX: x, regionOffsetY: y };\n return { regionOffsetX: x - region.xMin, regionOffsetY: y - region.yMin };\n};\n\nconst useDrag = ({\n captureTargetRef,\n draggableRegion,\n onDragStart,\n onDragMove,\n onDragEnd,\n isDisabled = false\n}: UseDragOptions) => {\n const inactiveState = { isDragging: false, x0: -1, y0: -1, regionOffsetX: -1, regionOffsetY: -1 };\n const dragState = useRef(inactiveState);\n\n const handlePointerEvent = (e: PointerEvent, cb?: (detail: DragDetail) => void) => {\n const { isDragging, x0, y0, regionOffsetX, regionOffsetY } = dragState.current;\n if (!isDragging) return;\n const x = e.pageX;\n const y = e.pageY;\n cb && cb({ x, y, dx: x - x0, dy: y - y0, regionOffsetX, regionOffsetY, originalEvent: e });\n };\n\n const dragProps = usePointerGesture({\n captureTargetRef,\n numPointers: 1, // Only allow 1 pointer dragging\n onExtraneousPointerDown: () => {\n dragState.current = inactiveState;\n },\n onPointerGestureDown: ({ pointers: [e] }) => {\n const x = e.pageX;\n const y = e.pageY;\n if (e.button !== 0 || !inDraggableRegion(x, y, draggableRegion)) return;\n const { regionOffsetX, regionOffsetY } = getRegionOffset(x, y, draggableRegion);\n dragState.current = { isDragging: true, x0: x, y0: y, regionOffsetX, regionOffsetY };\n onDragStart && onDragStart({ x, y, regionOffsetX, regionOffsetY, originalEvent: e });\n },\n onPointerGestureMove: ({ pointers: [e] }) => {\n handlePointerEvent(e, onDragMove);\n },\n onPointerGestureEnd: ({ pointers: [e] }) => {\n handlePointerEvent(e, onDragEnd);\n dragState.current = inactiveState;\n }\n });\n\n return isDisabled ? {} : dragProps;\n};\n\nexport { useDrag };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { usePointerGesture } from './usePointerGesture';\n\ntype Point = { x: number; y: number };\n\nconst getMidpoint = (p1: Point, p2: Point) => ({ x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 });\nconst getDistance = (p1: Point, p2: Point) => Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p2.y) ** 2);\n\ntype PinchDetail = {\n origin: Point;\n delta: number;\n};\n\ntype UsePinchOptions = {\n captureTargetRef: RefObject<HTMLDivElement>;\n onPinchZoomStart?: (detail: PinchDetail) => void;\n onPinchZoomChange?: (detail: PinchDetail) => void;\n onPinchZoomEnd?: () => void;\n isDisabled?: boolean;\n};\n\nconst usePinch = ({\n captureTargetRef,\n onPinchZoomStart,\n onPinchZoomChange,\n onPinchZoomEnd,\n isDisabled = false\n}: UsePinchOptions) => {\n const origin = useRef({ x: -1, y: -1 });\n const prevDistance = useRef(-1);\n const reset = () => {\n origin.current = { x: -1, y: -1 };\n prevDistance.current = -1;\n };\n\n if (isDisabled) reset();\n\n const pinchProps = usePointerGesture({\n captureTargetRef,\n numPointers: 2, // Pinch gesture requires 2 pointers\n onPointerGestureDown: ({ pointers: [pointer1, pointer2] }) => {\n const p1 = { x: pointer1.offsetX, y: pointer1.offsetY };\n const p2 = { x: pointer2.offsetX, y: pointer2.offsetY };\n origin.current = getMidpoint(p1, p2);\n prevDistance.current = getDistance(p1, p2);\n onPinchZoomStart &&\n onPinchZoomStart({\n origin: origin.current,\n delta: 0\n });\n },\n onPointerGestureMove: ({ pointers: [pointer1, pointer2] }) => {\n const p1 = { x: pointer1.offsetX, y: pointer1.offsetY };\n const p2 = { x: pointer2.offsetX, y: pointer2.offsetY };\n const distance = getDistance(p1, p2);\n const delta = distance - prevDistance.current;\n prevDistance.current = distance;\n onPinchZoomChange &&\n onPinchZoomChange({\n origin: origin.current,\n delta\n });\n },\n onPointerGestureEnd: () => {\n reset();\n onPinchZoomEnd && onPinchZoomEnd();\n }\n });\n\n return isDisabled ? {} : pinchProps;\n};\n\nexport { usePinch };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport { usePinch } from './usePinch';\nimport { zoom, ZOOM_INCREMENT } from '../utils/zoomUtils';\n\ntype UsePinchZoomOptions = {\n captureTargetRef: RefObject<HTMLDivElement>;\n zooming: 'on' | 'off';\n minZoom: number;\n maxZoom: number;\n zoomValue: number;\n onZoom?: (detail: { zoomValue: number }) => void;\n};\n\nconst usePinchZoom = ({\n captureTargetRef,\n zooming,\n minZoom,\n maxZoom,\n zoomValue,\n onZoom\n}: UsePinchZoomOptions) => {\n const pinchProps = usePinch({\n captureTargetRef,\n onPinchZoomChange: ({ delta }) => {\n const newZoom = zoomValue * (1 + ZOOM_INCREMENT * delta);\n zoom(newZoom, zoomValue, minZoom, maxZoom, onZoom);\n },\n isDisabled: zooming === 'off'\n });\n\n return pinchProps;\n};\n\nexport { usePinchZoom };\n","import { Pan, Zoom, Bounds } from '../diagram.types';\nimport type { RefObject } from 'preact';\nimport { useLayoutEffect, useState, useRef } from 'preact/hooks';\nimport { useDragPan } from './useDragPan';\nimport { useWheelZoom } from './useWheelZoom';\nimport { usePinchZoom } from './usePinchZoom';\nimport {} from '../utils/diagramUtils';\nimport {\n PanBounds,\n getPanBounds,\n pan,\n getPanProps,\n centerXYToPanXY,\n constrainPanToBounds\n} from '../utils/panUtils';\nimport { zoom, getZoomProps, getZoomToFitZoom } from '../utils/zoomUtils';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { isTouch } from '#utils/UNSAFE_visUtils/clientUtils';\nimport { Property } from 'csstype';\nimport { useVisDragModeControls } from '#hooks/PRIVATE_useVisDragModeControls';\n\nexport type PanZoomProps = {\n props: Pan & Zoom;\n captureTargetRef: RefObject<HTMLDivElement>;\n width: number;\n height: number;\n contentBounds: Bounds;\n isRtl: boolean;\n};\n\nexport const usePanZoom = ({\n props,\n captureTargetRef,\n width,\n height,\n contentBounds,\n isRtl\n}: PanZoomProps) => {\n const [cursor, setCursor] = useState<Property.Cursor>();\n const normalizedContentBounds = {\n x: 0,\n y: 0,\n width: contentBounds.width,\n height: contentBounds.height\n };\n const zoomProps = getZoomProps(props, width, height, normalizedContentBounds);\n const panBounds = useRef<PanBounds>();\n const prevPanBoundsInputs = useRef<{\n zoomValue: number;\n minZoom: number;\n panning: string;\n width: number;\n height: number;\n contentWidth: number;\n contentHeight: number;\n }>();\n const initPanZoomState = useRef<{\n zoom: number;\n centerX?: number;\n centerY?: number;\n }>();\n\n const isDeviceTouch = isTouch();\n const plotArea = {\n width: width,\n height: height,\n x: 0,\n y: 0\n };\n\n const showPanButton = isDeviceTouch ? props.panning && props.panning !== 'off' : undefined;\n const dragModeOptions = {\n isZoomScroll: true,\n plotAreaSpace: plotArea,\n componentWidth: width,\n isRtl,\n showPanButton: showPanButton ?? false,\n showZoomButton: false,\n showSelectButton: false,\n isDisabled: !isDeviceTouch\n };\n\n const { toggleButtonContent, userDragMode } = useVisDragModeControls(dragModeOptions);\n const panProps = getPanProps(props, contentBounds, userDragMode, isDeviceTouch);\n const { centerX: panCenterX, centerY: panCenterY, onPan, panning } = panProps;\n const panBoundsInputs = {\n zoomValue: zoomProps.zoomValue,\n minZoom: zoomProps.minZoom,\n panning,\n width,\n height,\n contentWidth: normalizedContentBounds.width,\n contentHeight: normalizedContentBounds.height\n };\n const previousPanBoundsInputs = prevPanBoundsInputs.current;\n if (\n contentBounds.width !== Infinity &&\n (!previousPanBoundsInputs ||\n panBoundsInputs.zoomValue !== previousPanBoundsInputs.zoomValue ||\n panBoundsInputs.minZoom !== previousPanBoundsInputs.minZoom ||\n panBoundsInputs.panning !== previousPanBoundsInputs.panning ||\n panBoundsInputs.width !== previousPanBoundsInputs.width ||\n panBoundsInputs.height !== previousPanBoundsInputs.height ||\n panBoundsInputs.contentWidth !== previousPanBoundsInputs.contentWidth ||\n panBoundsInputs.contentHeight !== previousPanBoundsInputs.contentHeight)\n ) {\n initPanZoomState.current ??= {\n zoom: props.zoomValue || 0,\n centerX: props.centerX !== undefined ? props.centerX - contentBounds.x : undefined,\n centerY: props.centerY !== undefined ? props.centerY - contentBounds.y : undefined\n };\n panBounds.current = getPanBounds(\n width,\n height,\n normalizedContentBounds,\n zoomProps.zoomValue,\n zoomProps.minZoom,\n initPanZoomState.current,\n panning\n );\n prevPanBoundsInputs.current = panBoundsInputs;\n }\n useLayoutEffect(() => {\n if (panning !== 'fixed' || !onPan || !panBounds.current || contentBounds.width === Infinity) {\n return;\n }\n const currentPan = centerXYToPanXY(panCenterX, panCenterY, zoomProps.zoomValue, width, height);\n const constrainedPan = constrainPanToBounds(currentPan, panBounds.current);\n if (constrainedPan.panX !== currentPan.panX || constrainedPan.panY !== currentPan.panY) {\n pan(\n currentPan,\n constrainedPan,\n panProps.panDirection,\n zoomProps.zoomValue,\n width,\n height,\n panBounds.current,\n onPan\n );\n }\n }, [\n contentBounds.height,\n contentBounds.width,\n height,\n onPan,\n panProps.panDirection,\n panCenterX,\n panCenterY,\n panning,\n width,\n zoomProps.minZoom,\n zoomProps.zoomValue\n ]);\n const dragPanProps = useDragPan({\n panProps: panProps,\n captureTargetRef: captureTargetRef,\n panBounds: panBounds.current,\n zoom: zoomProps.zoomValue,\n width,\n height,\n onDragPanStart: () => setCursor('grabbing'),\n onDragPanEnd: () => setCursor('auto')\n });\n //dZoom or nZoom is required\n const kbZoomCallback = (props: { dZoom?: number; nZoom?: number }) => {\n const newZoom = props.dZoom\n ? zoomProps.zoomValue + props.dZoom\n : getZoomToFitZoom(width, height, contentBounds);\n const constrainedZoom = zoom(\n props.nZoom ? props.nZoom : newZoom,\n zoomProps.zoomValue,\n zoomProps.minZoom,\n zoomProps.maxZoom,\n zoomProps.onZoom\n );\n if (constrainedZoom !== zoomProps.zoomValue) {\n panOnZoom(constrainedZoom, width / 2, height / 2);\n }\n };\n const prevPanState = useRef({ panX: 0, panY: 0 });\n\n // dPan or nPan is required\n const kbPanCallback = (props: {\n dPan?: { dx: number; dy: number };\n nPan?: { cx: number; cy: number };\n center?: boolean;\n }) => {\n let centerX;\n let centerY;\n if (props.center) {\n centerX = normalizedContentBounds.width / 2;\n centerY = normalizedContentBounds.height / 2;\n } else if (props.dPan) {\n centerX = panProps.centerX + props.dPan.dx;\n centerY = panProps.centerY + props.dPan.dy;\n } else {\n centerX = props.nPan!.cx - contentBounds.x;\n centerY = props.nPan!.cy - contentBounds.y;\n }\n prevPanState.current = centerXYToPanXY(\n panProps.centerX,\n panProps.centerY,\n zoomProps.zoomValue,\n width,\n height\n );\n const panValues = centerXYToPanXY(centerX, centerY, zoomProps.zoomValue, width, height);\n const { newPan } = pan(\n prevPanState.current,\n panValues,\n panProps.panDirection,\n zoomProps.zoomValue,\n width,\n height,\n panBounds.current,\n panProps.onPan\n );\n prevPanState.current = newPan;\n };\n function panOnZoom(newZoom: number, focusX: number, focusY: number) {\n if (\n panProps.panning === 'off' ||\n !panProps.onPan ||\n !initPanZoomState.current ||\n contentBounds.width === Infinity\n ) {\n return;\n }\n const oldPan = centerXYToPanXY(\n panProps.centerX,\n panProps.centerY,\n zoomProps.zoomValue,\n width,\n height\n );\n const zoomRatio = newZoom / zoomProps.zoomValue;\n const nextPan = {\n panX: oldPan.panX * zoomRatio + focusX * (1 - zoomRatio),\n panY: oldPan.panY * zoomRatio + focusY * (1 - zoomRatio)\n };\n const nextPanBounds = getPanBounds(\n width,\n height,\n normalizedContentBounds,\n newZoom,\n zoomProps.minZoom,\n initPanZoomState.current,\n panProps.panning\n );\n const constrainedPan = constrainPanToBounds(nextPan, nextPanBounds);\n const previousPanAtNewZoom = centerXYToPanXY(\n panProps.centerX,\n panProps.centerY,\n newZoom,\n width,\n height\n );\n const { newPan } = pan(\n previousPanAtNewZoom,\n constrainedPan,\n panProps.panDirection,\n newZoom,\n width,\n height,\n nextPanBounds,\n panProps.onPan\n );\n prevPanState.current = newPan;\n }\n const wheelZoomProps = useWheelZoom({\n ...zoomProps,\n onPanOnZoom: ({ zoomValue, x, y }) => panOnZoom(zoomValue, x, y)\n });\n const pinchZoomProps = usePinchZoom({\n captureTargetRef,\n zooming: zoomProps.zooming,\n minZoom: zoomProps.minZoom,\n maxZoom: zoomProps.maxZoom,\n zoomValue: zoomProps.zoomValue,\n onZoom: zoomProps.onZoom\n });\n const panZoomProps = mergeProps(dragPanProps, wheelZoomProps, pinchZoomProps);\n return {\n panZoomProps,\n panProps,\n zoomProps,\n toggleButtonContent,\n cursor,\n centerX: panProps.centerX,\n centerY: panProps.centerY,\n zoomValue: zoomProps.zoomValue,\n panBounds: panBounds.current,\n kbPanCallback: panProps.panning !== 'off' ? kbPanCallback : undefined,\n kbZoomCallback: zoomProps.zooming !== 'off' ? kbZoomCallback : undefined\n };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { useWheel } from './useWheel';\nimport { zoom, ZOOM_INCREMENT } from '../utils/zoomUtils';\n\ntype UseWheelZoomOptions = {\n zooming: 'on' | 'off';\n minZoom: number;\n maxZoom: number;\n zoomValue: number;\n onZoom?: (detail: { zoomValue: number }) => void;\n onPanOnZoom?: (detail: { zoomValue: number; x: number; y: number }) => void;\n};\n\nconst useWheelZoom = ({\n zooming,\n minZoom,\n maxZoom,\n zoomValue,\n onZoom,\n onPanOnZoom\n}: UseWheelZoomOptions) => {\n const wheelProps = useWheel({\n onWheel: ({ x, y, deltaY }) => {\n const newZoom = zoomValue * (1 + ZOOM_INCREMENT * deltaY);\n const constrainedZoom = zoom(newZoom, zoomValue, minZoom, maxZoom, onZoom);\n if (constrainedZoom !== zoomValue) {\n onPanOnZoom?.({ zoomValue: constrainedZoom, x, y });\n }\n },\n isDisabled: zooming === 'off'\n });\n\n return wheelProps;\n};\n\nexport { useWheelZoom };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\ntype WheelDetail = {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n ctrlKey: boolean;\n};\n\ntype UseWheelOptions = {\n onWheel: (detail: WheelDetail) => void;\n preventDefault?: boolean;\n isDisabled?: boolean;\n};\n\nconst PX_FACTOR_PER_LINE = 15; // Value used in Toolkit\nconst PX_FACTOR_PER_PAGE = 40; // Value copied from datagrid; this is not handled in Toolkit\n\nconst getNormalizedDelta = (e: WheelEvent) => {\n const { deltaX, deltaY, deltaMode } = e;\n\n switch (deltaMode) {\n case e.DOM_DELTA_PIXEL:\n return { deltaX: -deltaX, deltaY: -deltaY };\n case e.DOM_DELTA_LINE:\n return { deltaX: -deltaX * PX_FACTOR_PER_LINE, deltaY: -deltaY * PX_FACTOR_PER_LINE };\n case e.DOM_DELTA_PAGE:\n return { deltaX: -deltaX * PX_FACTOR_PER_PAGE, deltaY: -deltaY * PX_FACTOR_PER_PAGE };\n default:\n return { deltaX: -deltaX, deltaY: -deltaY };\n }\n};\n\nconst useWheel = ({\n onWheel: onWheelCallback,\n preventDefault = true,\n isDisabled = false\n}: UseWheelOptions) => {\n const onWheel = (e: WheelEvent) => {\n const { deltaX, deltaY } = getNormalizedDelta(e);\n if (preventDefault) e.preventDefault();\n const bounds = (e.currentTarget as HTMLElement).getBoundingClientRect();\n onWheelCallback({\n x: e.clientX - bounds.left,\n y: e.clientY - bounds.top,\n deltaX,\n deltaY,\n ctrlKey: e.ctrlKey || e.metaKey\n });\n };\n return isDisabled ? {} : { onWheel };\n};\n\nexport { useWheel, PX_FACTOR_PER_LINE };\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type { RefObject } from 'preact';\nimport type {\n DiagramContextMenuConfig,\n DiagramContextMenuContext,\n ItemInfo,\n PromotedLinkId\n} from '../diagram.types';\nimport { type gestureTypes, useContextMenu } from '#hooks/PRIVATE_useVisContextMenu';\nimport { getDiagramContextMenuContext } from '../utils/contextMenuUtils';\nimport {\n getMapEntryBySerializedKey,\n getPromotedString,\n queryElementByAttributeValue,\n queryElementBySerializedDiagramKey\n} from '../utils/diagramUtils';\n\ntype Props<K1 extends string | number, K2 extends string | number, D1, D2> = {\n nodesMap: Map<K1, D1>;\n linksMap: Map<K2, D2>;\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>;\n focusedItemInfo: ItemInfo<K1, K2, D2>;\n rootRef: RefObject<HTMLDivElement>;\n contextMenuConfig?: DiagramContextMenuConfig<K1, D1, D2>;\n onContextMenuDismissed?: (gesture: gestureTypes) => void;\n};\n\nexport const useDiagramContextMenu = <K1 extends string | number, K2 extends string | number, D1, D2>({\n focusedItemInfo,\n rootRef,\n contextMenuConfig,\n onContextMenuDismissed,\n nodesMap,\n linksMap,\n promotedLinkMap\n}: Props<K1, K2, D1, D2>) => {\n const { contextMenuProps, contextMenuContent } = useContextMenu<\n DiagramContextMenuContext<K1, D1, D2>\n >({\n onContextMenuHandler: ({ gesture, target }) => {\n let idx;\n let elementType: 'node' | 'link' | 'promotedLink' | 'background' = 'background';\n const currentTarget = target as HTMLElement;\n if (gesture === 'keyboard') {\n idx = focusedItemInfo.id;\n elementType = focusedItemInfo.type;\n } else if (\n (currentTarget.closest('[data-oj-private-node]') as HTMLElement)?.dataset['ojPrivateNode']\n ) {\n idx = getMapEntryBySerializedKey(\n nodesMap,\n (currentTarget.closest('[data-oj-private-node]') as HTMLElement)?.dataset['ojPrivateNode']\n )?.key;\n if (idx != null) {\n elementType = 'node';\n }\n } else if (\n (currentTarget.closest('[data-oj-private-link]') as SVGElement)?.dataset[\n 'ojPrivateLink'\n ] as K2\n ) {\n idx = getMapEntryBySerializedKey(\n linksMap,\n (currentTarget.closest('[data-oj-private-link]') as SVGElement)?.dataset['ojPrivateLink']\n )?.key;\n if (idx != null) {\n elementType = 'link';\n }\n } else if (\n (currentTarget.closest('[data-oj-private-promoted-link]') as SVGElement)?.dataset[\n 'ojPrivatePromotedLink'\n ] as K2\n ) {\n idx = (currentTarget.closest('[data-oj-private-promoted-link]') as SVGElement)?.dataset[\n 'ojPrivatePromotedLink'\n ] as string;\n idx = promotedLinkMap.get(idx);\n elementType = 'promotedLink';\n }\n\n const { context } = getDiagramContextMenuContext<K1, K2, D1, D2>(\n nodesMap,\n linksMap,\n elementType,\n idx as K1 | K2 | PromotedLinkId<K1, D2> | string | undefined\n );\n if (gesture === 'keyboard') {\n let element;\n if (focusedItemInfo.type === 'node') {\n element = rootRef.current && idx != null\n ? queryElementBySerializedDiagramKey(rootRef.current, 'data-oj-private-node', idx as K1)\n : null;\n } else if (focusedItemInfo.type === 'link') {\n element = rootRef.current && idx != null\n ? queryElementBySerializedDiagramKey(rootRef.current, 'data-oj-private-link', idx as K2)\n : null;\n } else {\n element = rootRef.current\n ? queryElementByAttributeValue(\n rootRef.current,\n 'data-oj-private-promoted-link',\n getPromotedString(idx as PromotedLinkId<K1, D2>)\n )\n : null;\n }\n return {\n type: 'element',\n context,\n elem: element ? element : null\n };\n }\n return { type: 'pointer', context };\n },\n contextMenuOptions: {\n isDisabled: !contextMenuConfig //If there is not a context menu renderer we disable the hook\n },\n rootRef,\n contextMenuConfig,\n onContextMenuDismissed\n });\n\n return { contextMenuContent, contextMenuProps };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport type { ItemInfo, PromotedLinkId } from '../diagram.types';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useTabbableModeSet } from '#hooks/PRIVATE_useTabbableModeSet';\nimport { baseStyle as focusTrackerBaseStyle } from '../../PRIVATE_FocusTracker/themes/FocusTrackerStyles.css';\nimport { getPromotedString, isSamePromotedLinkId, serializeDiagramKey } from '../utils/diagramUtils';\nimport {\n focusDiagramItemContent,\n getClosestFocusableDescendant,\n getRestorableFocusIds,\n LINK_ITEM_SELECTOR,\n NODE_ITEM_SELECTOR,\n PROMOTED_LINK_ITEM_SELECTOR\n} from '../utils/tabbableModeUtils';\n\ntype TabbableDiagramItem<K1 extends string | number, K2 extends string | number, D2> =\n | { id: K1; type: 'node' }\n | { id: K2; type: 'link' }\n | { id: PromotedLinkId<K1, D2>; type: 'promotedLink' };\n\ntype UseDiagramTabbableModeProps<K1 extends string | number, K2 extends string | number, D2> = {\n rootRef: RefObject<HTMLDivElement>;\n focusedItemInfo: ItemInfo<K1, K2, D2>;\n isTabbableModeRef: RefObject<boolean>;\n shouldIgnoreTransientBlurRef: RefObject<boolean>;\n nodeIdsByAttr: Map<string, K1>;\n linkIdsByAttr: Map<string, K2>;\n promotedLinkIdsByAttr: Map<string, PromotedLinkId<K1, D2>>;\n visibility: 'visible' | 'hidden';\n};\n\nconst DEBUG_FLAG = '__OJ_DIAGRAM_TABBABLE_DEBUG__';\nconst DEBUG_PREFIX = '[diagram tabbable debug]';\n\nconst isDebugEnabled = () => {\n const globalDebugFlag = (globalThis as typeof globalThis & Record<string, unknown>)[DEBUG_FLAG];\n return globalDebugFlag === true;\n};\n\nconst describeElement = (element: Element | null | undefined) => {\n if (element == null) {\n return null;\n }\n\n const dataNodeId = element.getAttribute('data-oj-private-node');\n const dataLinkId = element.getAttribute('data-oj-private-link');\n const dataPromotedLinkId = element.getAttribute('data-oj-private-promoted-link');\n\n return {\n tagName: element.tagName,\n id: 'id' in element ? (element as HTMLElement).id || null : null,\n role: element.getAttribute('role'),\n ariaLabel: element.getAttribute('aria-label'),\n dataNodeId,\n dataLinkId,\n dataPromotedLinkId,\n textContent: element.textContent?.trim().slice(0, 80) || null\n };\n};\n\nconst debugLog = (message: string, details?: unknown) => {\n if (!isDebugEnabled()) {\n return;\n }\n\n if (details === undefined) {\n console.log(DEBUG_PREFIX, message);\n } else {\n console.log(DEBUG_PREFIX, message, details);\n }\n};\n\nexport const useDiagramTabbableMode = <K1 extends string | number, K2 extends string | number, D2>({\n rootRef,\n focusedItemInfo,\n isTabbableModeRef,\n shouldIgnoreTransientBlurRef,\n nodeIdsByAttr,\n linkIdsByAttr,\n promotedLinkIdsByAttr,\n visibility\n}: UseDiagramTabbableModeProps<K1, K2, D2>) => {\n const [tabbableModeFocusAction, setTabbableModeFocusAction] = useState<\n 'first' | 'restore' | undefined\n >(undefined);\n const [restoreRequestCount, setRestoreRequestCount] = useState(0);\n const shouldRestoreDiagramFocusRef = useRef(false);\n const previousInnerFocusIdRef = useRef<string | null>(null);\n const previousCustomFocusIdRef = useRef<string | null>(null);\n const shouldRestoreItemOwnerFocusRef = useRef(false);\n const shouldRestoreTransientItemOwnerFocusRef = useRef(false);\n const shouldRestoreTabbableContentRef = useRef(false);\n const previousVisibilityRef = useRef<'visible' | 'hidden'>('hidden');\n const prevIsTabbableModeRef = useRef(false);\n const shouldExitTabbableModeOnRootFocusRef = useRef(false);\n const shouldFinalizeRootRestoreRef = useRef(false);\n const transientBlurTimeoutRef = useRef<number | null>(null);\n const rootEntryFirstFocusFrameRef = useRef<number | null>(null);\n const pendingFallbackFocusOwnerRef = useRef(false);\n const pendingFallbackItemRef = useRef<TabbableDiagramItem<K1, K2, D2>>();\n const pendingRestoreChildFocusRef = useRef(false);\n const hasRetriedOwnerChildFocusRef = useRef(false);\n\n const clearTransientBlurIgnore = useCallback(() => {\n shouldIgnoreTransientBlurRef.current = false;\n if (transientBlurTimeoutRef.current != null) {\n window.clearTimeout(transientBlurTimeoutRef.current);\n transientBlurTimeoutRef.current = null;\n }\n }, []);\n\n const armTransientBlurIgnore = useCallback(() => {\n shouldIgnoreTransientBlurRef.current = true;\n if (transientBlurTimeoutRef.current != null) {\n window.clearTimeout(transientBlurTimeoutRef.current);\n }\n // Ignore only the immediate blur generated by the current interaction.\n transientBlurTimeoutRef.current = window.setTimeout(() => {\n shouldIgnoreTransientBlurRef.current = false;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n transientBlurTimeoutRef.current = null;\n }, 0);\n }, []);\n\n const clearStoredFocusRestoreState = useCallback(() => {\n shouldRestoreDiagramFocusRef.current = false;\n previousInnerFocusIdRef.current = null;\n previousCustomFocusIdRef.current = null;\n shouldRestoreItemOwnerFocusRef.current = false;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n shouldRestoreTabbableContentRef.current = false;\n shouldExitTabbableModeOnRootFocusRef.current = false;\n shouldFinalizeRootRestoreRef.current = false;\n pendingFallbackFocusOwnerRef.current = false;\n pendingFallbackItemRef.current = undefined;\n pendingRestoreChildFocusRef.current = false;\n hasRetriedOwnerChildFocusRef.current = false;\n clearTransientBlurIgnore();\n }, [clearTransientBlurIgnore]);\n\n const hasStoredFocusRestoreTarget = useCallback(() => {\n return (\n shouldRestoreDiagramFocusRef.current ||\n previousInnerFocusIdRef.current != null ||\n previousCustomFocusIdRef.current != null ||\n shouldRestoreItemOwnerFocusRef.current ||\n shouldRestoreTransientItemOwnerFocusRef.current ||\n shouldRestoreTabbableContentRef.current ||\n pendingFallbackFocusOwnerRef.current ||\n pendingFallbackItemRef.current != null ||\n pendingRestoreChildFocusRef.current\n );\n }, []);\n\n const captureFocusRestoreState = useCallback(() => {\n const rootElement = rootRef.current;\n if (!rootElement) {\n return;\n }\n\n const activeElement = document.activeElement as Element | null;\n const isDiagramRootFocused = activeElement === rootElement;\n const shouldRestoreFocus =\n activeElement != null && (isDiagramRootFocused || rootElement.contains(activeElement));\n const hadStoredRestoreTarget = hasStoredFocusRestoreTarget();\n\n const { activeElementId, activeCustomElementId } = getRestorableFocusIds(\n rootElement,\n activeElement\n );\n const hasNextRestoreTarget = activeElementId != null || activeCustomElementId != null;\n const shouldRestoreItemOwnerFocus =\n shouldRestoreFocus && !isDiagramRootFocused && !hasNextRestoreTarget;\n\n // If an interaction inside tabbable content already captured a specific\n // restore target, don't overwrite it just because focus briefly bounced\n // back to the diagram root during rerender.\n if (\n isDiagramRootFocused &&\n !hasNextRestoreTarget &&\n hadStoredRestoreTarget &&\n shouldRestoreTabbableContentRef.current\n ) {\n debugLog('captureFocusRestoreState preserve root rebound', {\n activeElement: describeElement(activeElement),\n hadStoredRestoreTarget\n });\n return;\n }\n\n // During rerender, focus can momentarily fall back to body/null before the\n // diagram root becomes focusable again. Preserve the previously captured\n // target through that transient state instead of overwriting it.\n if (!shouldRestoreFocus && !hasNextRestoreTarget && hadStoredRestoreTarget) {\n debugLog('captureFocusRestoreState preserve transient blur', {\n activeElement: describeElement(activeElement),\n hadStoredRestoreTarget\n });\n armTransientBlurIgnore();\n return;\n }\n\n shouldRestoreDiagramFocusRef.current = shouldRestoreFocus;\n previousInnerFocusIdRef.current = activeElementId;\n previousCustomFocusIdRef.current = activeCustomElementId;\n shouldRestoreItemOwnerFocusRef.current = shouldRestoreItemOwnerFocus;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n shouldRestoreTabbableContentRef.current = isTabbableModeRef.current === true;\n if (shouldRestoreFocus || hasNextRestoreTarget || shouldRestoreItemOwnerFocus) {\n armTransientBlurIgnore();\n } else {\n clearTransientBlurIgnore();\n }\n\n debugLog('captureFocusRestoreState', {\n activeElement: describeElement(activeElement),\n isDiagramRootFocused,\n shouldRestoreFocus,\n activeElementId,\n activeCustomElementId,\n shouldRestoreItemOwnerFocus\n });\n }, [armTransientBlurIgnore, clearTransientBlurIgnore, hasStoredFocusRestoreTarget, rootRef]);\n\n const getTabbableItemFromElement = useCallback(\n (element: HTMLElement) => {\n const nodeElement = element.closest(NODE_ITEM_SELECTOR);\n if (nodeElement instanceof HTMLElement) {\n const nodeId = nodeIdsByAttr.get(nodeElement.getAttribute('data-oj-private-node') ?? '');\n if (nodeId != null) {\n return { id: nodeId, type: 'node' } as TabbableDiagramItem<K1, K2, D2>;\n }\n }\n\n const linkElement = element.closest(LINK_ITEM_SELECTOR);\n if (linkElement instanceof HTMLElement) {\n const linkId = linkIdsByAttr.get(linkElement.getAttribute('data-oj-private-link') ?? '');\n if (linkId != null) {\n return { id: linkId, type: 'link' } as TabbableDiagramItem<K1, K2, D2>;\n }\n }\n\n const promotedLinkElement = element.closest(PROMOTED_LINK_ITEM_SELECTOR);\n if (promotedLinkElement instanceof HTMLElement) {\n const promotedLinkId = promotedLinkIdsByAttr.get(\n promotedLinkElement.getAttribute('data-oj-private-promoted-link') ?? ''\n );\n if (promotedLinkId != null) {\n return { id: promotedLinkId, type: 'promotedLink' } as TabbableDiagramItem<K1, K2, D2>;\n }\n }\n\n return null;\n },\n [linkIdsByAttr, nodeIdsByAttr, promotedLinkIdsByAttr]\n );\n\n const shouldIgnoreTransientBlur = useCallback(\n (event: FocusEvent) => {\n const currentTarget = event.currentTarget;\n const relatedTarget = event.relatedTarget as Element | null;\n return (\n shouldIgnoreTransientBlurRef.current &&\n currentTarget === rootRef.current &&\n (relatedTarget == null ||\n (currentTarget instanceof Element &&\n relatedTarget === currentTarget.ownerDocument.body)) &&\n hasStoredFocusRestoreTarget()\n );\n },\n [hasStoredFocusRestoreTarget, rootRef]\n );\n\n const getCurrentTabbableItemElement = useCallback(\n (item?: TabbableDiagramItem<K1, K2, D2>) => {\n const rootElement = rootRef.current;\n if (!rootElement || item == null) {\n return null;\n }\n\n const selector =\n item.type === 'node'\n ? NODE_ITEM_SELECTOR\n : item.type === 'link'\n ? LINK_ITEM_SELECTOR\n : PROMOTED_LINK_ITEM_SELECTOR;\n const attrName =\n item.type === 'node'\n ? 'data-oj-private-node'\n : item.type === 'link'\n ? 'data-oj-private-link'\n : 'data-oj-private-promoted-link';\n const attrValue =\n item.type === 'promotedLink'\n ? getPromotedString(item.id as PromotedLinkId<K1, D2>)\n : serializeDiagramKey(item.id);\n\n for (const element of rootElement.querySelectorAll(selector)) {\n if (element.getAttribute(attrName) === attrValue) {\n return element;\n }\n }\n\n return null;\n },\n [rootRef]\n );\n\n const isSameTabbableItem = useCallback(\n (\n item1?: TabbableDiagramItem<K1, K2, D2> | null,\n item2?: TabbableDiagramItem<K1, K2, D2> | null\n ) => {\n return (\n item1?.type === item2?.type &&\n (item1?.type === 'promotedLink'\n ? isSamePromotedLinkId<K1, D2>(item1?.id, item2?.id)\n : item1?.id === item2?.id)\n );\n },\n []\n );\n\n const focusedTabbableItem = useMemo(\n () =>\n focusedItemInfo.type === 'node' ||\n focusedItemInfo.type === 'link' ||\n focusedItemInfo.type === 'promotedLink'\n ? ({\n id: focusedItemInfo.id,\n type: focusedItemInfo.type\n } as TabbableDiagramItem<K1, K2, D2>)\n : undefined,\n [focusedItemInfo]\n );\n\n const [isCurrentTabbableItem, rawTabbableSetProps, getCurrentTabbableKey, setCurrentTabbableKey] =\n useTabbableModeSet<TabbableDiagramItem<K1, K2, D2>>(\n rootRef,\n getTabbableItemFromElement,\n focusedTabbableItem,\n undefined,\n undefined,\n isSameTabbableItem\n );\n const currentTabbableItem = getCurrentTabbableKey() ?? focusedTabbableItem;\n const isTabbableMode = isCurrentTabbableItem(currentTabbableItem);\n isTabbableModeRef.current = isTabbableMode;\n\n const captureFocusRestoreStateFromTarget = useCallback(\n (target: EventTarget | null) => {\n const rootElement = rootRef.current;\n if (!(target instanceof Element) || rootElement == null || !rootElement.contains(target)) {\n return false;\n }\n\n const restorableTarget = getClosestFocusableDescendant(target) ?? target;\n const focusedItemElement = restorableTarget.closest(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n );\n if (focusedItemElement == null) {\n return false;\n }\n if (focusedItemElement instanceof HTMLElement) {\n const targetItem = getTabbableItemFromElement(focusedItemElement);\n if (targetItem != null) {\n setCurrentTabbableKey(targetItem);\n }\n }\n\n const { activeElementId, activeCustomElementId } = getRestorableFocusIds(\n rootElement,\n restorableTarget\n );\n const hasRestoreTarget = activeElementId != null || activeCustomElementId != null;\n\n shouldRestoreDiagramFocusRef.current = false;\n previousInnerFocusIdRef.current = activeElementId;\n previousCustomFocusIdRef.current = activeCustomElementId;\n shouldRestoreItemOwnerFocusRef.current = !hasRestoreTarget;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n shouldRestoreTabbableContentRef.current = isTabbableModeRef.current === true;\n shouldFinalizeRootRestoreRef.current = false;\n if (!hasRestoreTarget && isTabbableModeRef.current) {\n setTabbableModeFocusAction('restore');\n }\n armTransientBlurIgnore();\n debugLog('captureFocusRestoreStateFromTarget', {\n target: describeElement(target),\n restorableTarget: describeElement(restorableTarget),\n focusedItemElement: describeElement(focusedItemElement),\n activeElementId,\n activeCustomElementId,\n hasRestoreTarget,\n shouldRestoreItemOwnerFocus: !hasRestoreTarget,\n isTabbableMode: isTabbableModeRef.current\n });\n return true;\n },\n [\n armTransientBlurIgnore,\n getTabbableItemFromElement,\n isTabbableModeRef,\n rootRef,\n setCurrentTabbableKey\n ]\n );\n\n const syncTabbableModeFromTarget = useCallback(\n (target: EventTarget | null) => {\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n const targetItem = getTabbableItemFromElement(target);\n if (targetItem == null) {\n return;\n }\n\n if (\n target.matches(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n )\n ) {\n setCurrentTabbableKey(undefined);\n isTabbableModeRef.current = false;\n } else {\n setCurrentTabbableKey(targetItem);\n isTabbableModeRef.current = true;\n }\n\n debugLog('syncTabbableModeFromTarget', {\n target: describeElement(target),\n targetItem,\n enteredInnerFocus: !target.matches(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n )\n });\n },\n [getTabbableItemFromElement, isTabbableModeRef, setCurrentTabbableKey]\n );\n\n const handleInnerFocusKeyDownCapture = useCallback(\n (event: KeyboardEvent) => {\n const targetItem =\n event.target instanceof HTMLElement ? getTabbableItemFromElement(event.target) : null;\n if (targetItem == null) {\n return false;\n }\n\n if (event.key === 'F2') {\n event.preventDefault();\n event.stopPropagation();\n if (isCurrentTabbableItem(targetItem)) {\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n clearStoredFocusRestoreState();\n window.setTimeout(() => {\n rootRef.current?.focus({ preventScroll: true });\n }, 0);\n } else {\n setCurrentTabbableKey(targetItem);\n isTabbableModeRef.current = true;\n setTabbableModeFocusAction('first');\n }\n debugLog('handleInnerFocusKeyDownCapture F2', {\n target: describeElement(event.target as Element | null),\n targetItem,\n wasCurrentTabbable: isCurrentTabbableItem(targetItem)\n });\n return true;\n }\n\n if (event.key === 'Esc' || event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n clearStoredFocusRestoreState();\n window.setTimeout(() => {\n rootRef.current?.focus({ preventScroll: true });\n }, 0);\n debugLog('handleInnerFocusKeyDownCapture Escape', {\n target: describeElement(event.target as Element | null),\n targetItem\n });\n return true;\n }\n\n return false;\n },\n [\n clearStoredFocusRestoreState,\n getTabbableItemFromElement,\n isCurrentTabbableItem,\n isTabbableModeRef,\n rootRef,\n setCurrentTabbableKey\n ]\n );\n\n const tabbableSetProps = useMemo(\n () => ({\n ...rawTabbableSetProps,\n onFocus: (event: FocusEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n if (target === rootRef.current) {\n if (shouldExitTabbableModeOnRootFocusRef.current) {\n shouldExitTabbableModeOnRootFocusRef.current = false;\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n } else if (\n shouldRestoreTabbableContentRef.current &&\n hasStoredFocusRestoreTarget() &&\n currentTabbableItem?.type === 'node'\n ) {\n isTabbableModeRef.current = true;\n setCurrentTabbableKey(currentTabbableItem);\n setTabbableModeFocusAction('restore');\n setRestoreRequestCount((count) => count + 1);\n }\n debugLog('tabbableSetProps.onFocus root', {\n target: describeElement(target),\n shouldExitTabbableModeOnRootFocus: shouldExitTabbableModeOnRootFocusRef.current,\n hasStoredFocusRestoreTarget: hasStoredFocusRestoreTarget(),\n currentTabbableItem\n });\n rawTabbableSetProps.onFocus(event);\n return;\n }\n\n const isDiagramItemWrapper = target.matches(\n `${NODE_ITEM_SELECTOR}, ${LINK_ITEM_SELECTOR}, ${PROMOTED_LINK_ITEM_SELECTOR}`\n );\n if (!isDiagramItemWrapper) {\n if (hasStoredFocusRestoreTarget()) {\n clearStoredFocusRestoreState();\n }\n rawTabbableSetProps.onFocus(event);\n if (target instanceof HTMLElement) {\n const targetItem = getTabbableItemFromElement(target);\n if (targetItem != null) {\n setCurrentTabbableKey(targetItem);\n }\n }\n isTabbableModeRef.current = true;\n debugLog('tabbableSetProps.onFocus inner content', {\n target: describeElement(target),\n currentActiveElement: describeElement(document.activeElement as Element | null)\n });\n }\n },\n onKeyDown: (event: KeyboardEvent) => {\n if (handleInnerFocusKeyDownCapture(event)) {\n return;\n }\n\n if (event.target === rootRef.current && event.key === 'F2' && currentTabbableItem != null) {\n if (!isCurrentTabbableItem(currentTabbableItem)) {\n isTabbableModeRef.current = true;\n setTabbableModeFocusAction('first');\n } else {\n setTabbableModeFocusAction(undefined);\n }\n }\n\n rawTabbableSetProps.onKeyDown(event);\n },\n onBlur: (event: FocusEvent) => {\n // During expand/collapse rerender, the focused child can disappear before\n // the root regains focus. Ignore that transient blur if we already know\n // how to restore focus once rendering completes.\n if (shouldIgnoreTransientBlur(event)) {\n debugLog('tabbableSetProps.onBlur ignored transient blur', {\n target: describeElement(event.target as Element | null),\n relatedTarget: describeElement(event.relatedTarget as Element | null),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n return;\n }\n\n const currentTarget = event.currentTarget as Element | null;\n const relatedTarget = event.relatedTarget as Element | null;\n if (\n currentTarget == null ||\n relatedTarget == null ||\n !currentTarget.contains(relatedTarget)\n ) {\n isTabbableModeRef.current = false;\n }\n debugLog('tabbableSetProps.onBlur', {\n target: describeElement(event.target as Element | null),\n relatedTarget: describeElement(relatedTarget),\n activeElement: describeElement(document.activeElement as Element | null),\n exitedTabbableMode:\n currentTarget == null || relatedTarget == null || !currentTarget.contains(relatedTarget)\n });\n rawTabbableSetProps.onBlur(event);\n }\n }),\n [\n clearStoredFocusRestoreState,\n currentTabbableItem,\n getTabbableItemFromElement,\n handleInnerFocusKeyDownCapture,\n hasStoredFocusRestoreTarget,\n isCurrentTabbableItem,\n isTabbableModeRef,\n rawTabbableSetProps,\n rootRef,\n setCurrentTabbableKey,\n shouldIgnoreTransientBlur\n ]\n );\n\n const onTabbableModeFocusFailure = useCallback(\n (detail?: { focusOwner?: boolean }) => {\n const rootElement = rootRef.current;\n const shouldFocusOwner = detail?.focusOwner === true;\n const fallbackItem = currentTabbableItem;\n const ownerElement = getCurrentTabbableItemElement(fallbackItem) as\n | (Element & { focus?: (options?: FocusOptions) => void })\n | null;\n const focusTarget =\n shouldFocusOwner && ownerElement && typeof ownerElement.focus === 'function'\n ? ownerElement\n : rootElement;\n\n pendingFallbackFocusOwnerRef.current = shouldFocusOwner;\n pendingFallbackItemRef.current = fallbackItem;\n pendingRestoreChildFocusRef.current =\n shouldFocusOwner && fallbackItem?.type === 'node' && !hasRetriedOwnerChildFocusRef.current;\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n shouldRestoreDiagramFocusRef.current = false;\n if (!shouldFocusOwner) {\n previousInnerFocusIdRef.current = null;\n previousCustomFocusIdRef.current = null;\n }\n shouldRestoreItemOwnerFocusRef.current = false;\n shouldRestoreTransientItemOwnerFocusRef.current = false;\n shouldExitTabbableModeOnRootFocusRef.current = false;\n shouldFinalizeRootRestoreRef.current = false;\n clearTransientBlurIgnore();\n if (focusTarget != null) {\n setRestoreRequestCount((count) => count + 1);\n }\n debugLog('onTabbableModeFocusFailure', {\n currentTabbableItem: fallbackItem,\n shouldFocusOwner,\n ownerElement: describeElement(ownerElement),\n rootElement: describeElement(rootElement),\n scheduledFocusTarget: describeElement(focusTarget),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n },\n [\n clearStoredFocusRestoreState,\n currentTabbableItem,\n getCurrentTabbableItemElement,\n isTabbableModeRef,\n rootRef,\n setCurrentTabbableKey\n ]\n );\n\n const requestFocusRestore = useCallback(() => {\n if (isTabbableModeRef.current || shouldRestoreTabbableContentRef.current) {\n setTabbableModeFocusAction('restore');\n } else {\n shouldFinalizeRootRestoreRef.current = true;\n }\n setRestoreRequestCount((count) => count + 1);\n debugLog('requestFocusRestore', {\n isTabbableMode: isTabbableModeRef.current,\n activeElement: describeElement(document.activeElement as Element | null)\n });\n }, [isTabbableModeRef]);\n\n const restoreDiagramRootFocus = useCallback(() => {\n const rootElement = rootRef.current;\n if (!rootElement || rootElement.style.visibility === 'hidden') {\n return false;\n }\n\n shouldExitTabbableModeOnRootFocusRef.current = false;\n isTabbableModeRef.current = false;\n setCurrentTabbableKey(undefined);\n setTabbableModeFocusAction(undefined);\n rootElement.focus({ preventScroll: true });\n clearStoredFocusRestoreState();\n shouldFinalizeRootRestoreRef.current = false;\n debugLog('restoreDiagramRootFocus', {\n rootElement: describeElement(rootElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n return true;\n }, [clearStoredFocusRestoreState, isTabbableModeRef, rootRef, setCurrentTabbableKey]);\n\n useLayoutEffect(() => {\n if (visibility === 'hidden' && previousVisibilityRef.current !== 'hidden') {\n captureFocusRestoreState();\n if (isTabbableModeRef.current) {\n setTabbableModeFocusAction('restore');\n }\n } else if (visibility === 'visible' && previousVisibilityRef.current === 'hidden') {\n if (hasStoredFocusRestoreTarget()) {\n if (isTabbableMode) {\n shouldRestoreDiagramFocusRef.current = false;\n shouldFinalizeRootRestoreRef.current = false;\n shouldExitTabbableModeOnRootFocusRef.current = false;\n if (tabbableModeFocusAction !== 'restore') {\n setTabbableModeFocusAction('restore');\n }\n } else {\n shouldRestoreDiagramFocusRef.current = true;\n shouldFinalizeRootRestoreRef.current = true;\n }\n }\n }\n previousVisibilityRef.current = visibility;\n }, [\n captureFocusRestoreState,\n hasStoredFocusRestoreTarget,\n isTabbableMode,\n isTabbableModeRef,\n tabbableModeFocusAction,\n visibility\n ]);\n\n useLayoutEffect(() => {\n const rootElement = rootRef.current;\n if (!rootElement || rootElement.style.visibility === 'hidden') {\n return;\n }\n\n if (pendingFallbackItemRef.current != null || pendingFallbackFocusOwnerRef.current) {\n const fallbackItem = pendingFallbackItemRef.current;\n const shouldFocusOwner = pendingFallbackFocusOwnerRef.current;\n const ownerElement = getCurrentTabbableItemElement(fallbackItem) as\n | (Element & { focus?: (options?: FocusOptions) => void })\n | null;\n\n debugLog('pending fallback attempt', {\n fallbackItem,\n shouldFocusOwner,\n ownerElement: describeElement(ownerElement),\n rootElement: describeElement(rootElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n\n if (\n shouldFocusOwner &&\n ownerElement != null &&\n ownerElement.isConnected &&\n typeof ownerElement.focus === 'function'\n ) {\n ownerElement.focus({ preventScroll: true });\n if (document.activeElement === ownerElement) {\n debugLog('pending fallback focused owner', {\n ownerElement: describeElement(ownerElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n pendingFallbackFocusOwnerRef.current = false;\n pendingFallbackItemRef.current = undefined;\n if (pendingRestoreChildFocusRef.current && fallbackItem != null) {\n hasRetriedOwnerChildFocusRef.current = true;\n isTabbableModeRef.current = true;\n setCurrentTabbableKey(fallbackItem);\n setTabbableModeFocusAction('restore');\n const didRestoreOwnerChildFocus =\n fallbackItem.type === 'node'\n ? focusDiagramItemContent({\n contentElement: ownerElement,\n focusAction: 'restore',\n restoreElementId: previousInnerFocusIdRef.current,\n restoreCustomElementId: previousCustomFocusIdRef.current,\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n })\n : false;\n if (didRestoreOwnerChildFocus) {\n pendingRestoreChildFocusRef.current = false;\n debugLog('pending fallback restored owner child focus immediately', {\n fallbackItem,\n ownerElement: describeElement(ownerElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n clearStoredFocusRestoreState();\n return;\n }\n setRestoreRequestCount((count) => count + 1);\n debugLog('pending fallback retry child restore', {\n fallbackItem,\n ownerElement: describeElement(ownerElement),\n restoreElementId: previousInnerFocusIdRef.current,\n restoreCustomElementId: previousCustomFocusIdRef.current\n });\n return;\n }\n clearStoredFocusRestoreState();\n return;\n }\n }\n\n if (rootElement.style.visibility !== 'hidden') {\n rootElement.focus({ preventScroll: true });\n if (document.activeElement === rootElement) {\n debugLog('pending fallback focused root', {\n rootElement: describeElement(rootElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n clearStoredFocusRestoreState();\n return;\n }\n }\n\n debugLog('pending fallback did not focus target', {\n fallbackItem,\n shouldFocusOwner,\n ownerElement: describeElement(ownerElement),\n rootElement: describeElement(rootElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n }\n\n const activeElement = document.activeElement as Element | null;\n const isFocusOutsideDiagram =\n activeElement == null ||\n activeElement === rootElement.ownerDocument.body ||\n !rootElement.contains(activeElement);\n\n const shouldRestoreOwnerFocus =\n (shouldRestoreItemOwnerFocusRef.current ||\n (shouldRestoreTransientItemOwnerFocusRef.current &&\n shouldIgnoreTransientBlurRef.current)) &&\n isFocusOutsideDiagram;\n const shouldRestoreDiagramFocus =\n shouldRestoreDiagramFocusRef.current || shouldRestoreOwnerFocus;\n const hasStoredRestoreTarget = hasStoredFocusRestoreTarget();\n\n debugLog('restore effect enter', {\n activeElement: describeElement(activeElement),\n isTabbableMode,\n currentTabbableItem,\n shouldRestoreDiagramFocus: shouldRestoreDiagramFocusRef.current,\n shouldRestoreOwnerFocus,\n shouldRestoreTransientItemOwnerFocus: shouldRestoreTransientItemOwnerFocusRef.current,\n shouldFinalizeRootRestore: shouldFinalizeRootRestoreRef.current,\n previousInnerFocusId: previousInnerFocusIdRef.current,\n previousCustomFocusId: previousCustomFocusIdRef.current,\n tabbableModeFocusAction,\n restoreRequestCount,\n hasStoredRestoreTarget\n });\n\n if (\n activeElement === rootElement &&\n hasStoredRestoreTarget &&\n shouldRestoreTabbableContentRef.current &&\n currentTabbableItem?.type === 'node'\n ) {\n const contentElement = getCurrentTabbableItemElement(currentTabbableItem);\n const didRestoreFromRoot = focusDiagramItemContent({\n contentElement,\n focusAction: 'restore',\n restoreElementId: previousInnerFocusIdRef.current,\n restoreCustomElementId: previousCustomFocusIdRef.current,\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n });\n\n if (didRestoreFromRoot) {\n isTabbableModeRef.current = true;\n setCurrentTabbableKey(currentTabbableItem);\n clearStoredFocusRestoreState();\n debugLog('restore effect restored owner child focus from root', {\n contentElement: describeElement(contentElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n return;\n }\n }\n\n if (\n hasStoredRestoreTarget &&\n !pendingRestoreChildFocusRef.current &&\n !shouldFinalizeRootRestoreRef.current &&\n !shouldRestoreOwnerFocus\n ) {\n if (\n !shouldIgnoreTransientBlurRef.current &&\n activeElement != null &&\n rootElement.contains(activeElement) &&\n activeElement !== rootElement\n ) {\n clearStoredFocusRestoreState();\n }\n debugLog('restore effect early return', {\n activeElement: describeElement(activeElement),\n hasStoredRestoreTarget,\n shouldFinalizeRootRestore: shouldFinalizeRootRestoreRef.current,\n shouldRestoreOwnerFocus,\n shouldIgnoreTransientBlur: shouldIgnoreTransientBlurRef.current\n });\n return;\n }\n\n if (isTabbableMode && shouldRestoreOwnerFocus) {\n const contentElement = getCurrentTabbableItemElement(currentTabbableItem);\n const didFocus =\n currentTabbableItem != null\n ? focusDiagramItemContent({\n contentElement,\n focusAction: 'restore',\n restoreElementId: previousInnerFocusIdRef.current,\n restoreCustomElementId: previousCustomFocusIdRef.current,\n focusScopeSelector:\n currentTabbableItem.type === 'node' ? `.${focusTrackerBaseStyle}` : undefined\n })\n : false;\n\n if (didFocus) {\n clearStoredFocusRestoreState();\n debugLog('restore effect restored owner child focus', {\n contentElement: describeElement(contentElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n return;\n }\n\n debugLog('restore effect owner child restore failed, falling back to root', {\n contentElement: describeElement(contentElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n restoreDiagramRootFocus();\n return;\n }\n\n if (!isTabbableMode) {\n const hasStoredInnerRestoreTarget =\n previousInnerFocusIdRef.current != null ||\n previousCustomFocusIdRef.current != null ||\n shouldRestoreItemOwnerFocusRef.current ||\n shouldRestoreTransientItemOwnerFocusRef.current;\n if (\n shouldRestoreDiagramFocus &&\n hasStoredInnerRestoreTarget &&\n shouldRestoreTabbableContentRef.current &&\n currentTabbableItem?.type === 'node' &&\n activeElement === rootElement\n ) {\n isTabbableModeRef.current = true;\n setCurrentTabbableKey(currentTabbableItem);\n setTabbableModeFocusAction('restore');\n setRestoreRequestCount((count) => count + 1);\n debugLog('restore effect re-entered tabbable mode from root focus', {\n currentTabbableItem,\n activeElement: describeElement(activeElement)\n });\n return;\n }\n shouldExitTabbableModeOnRootFocusRef.current = false;\n if (shouldRestoreDiagramFocus) {\n rootElement.focus({ preventScroll: true });\n debugLog('restore effect focused root while not in tabbable mode', {\n activeElement: describeElement(document.activeElement as Element | null)\n });\n }\n if (\n !shouldRestoreDiagramFocus ||\n shouldFinalizeRootRestoreRef.current ||\n shouldRestoreOwnerFocus\n ) {\n clearStoredFocusRestoreState();\n shouldFinalizeRootRestoreRef.current = false;\n }\n return;\n }\n\n if (shouldRestoreDiagramFocus) {\n restoreDiagramRootFocus();\n return;\n }\n }, [\n clearStoredFocusRestoreState,\n currentTabbableItem,\n getCurrentTabbableItemElement,\n hasStoredFocusRestoreTarget,\n isTabbableMode,\n restoreRequestCount,\n rootRef,\n restoreDiagramRootFocus,\n tabbableModeFocusAction,\n visibility\n ]);\n\n useEffect(() => {\n if (isTabbableMode !== prevIsTabbableModeRef.current) {\n if (isTabbableMode) {\n setTabbableModeFocusAction('first');\n } else {\n setTabbableModeFocusAction(undefined);\n }\n prevIsTabbableModeRef.current = isTabbableMode;\n }\n }, [isTabbableMode]);\n\n useEffect(() => {\n if (rootEntryFirstFocusFrameRef.current != null) {\n window.cancelAnimationFrame(rootEntryFirstFocusFrameRef.current);\n rootEntryFirstFocusFrameRef.current = null;\n }\n\n const rootElement = rootRef.current;\n if (\n !rootElement ||\n !isTabbableMode ||\n tabbableModeFocusAction !== 'first' ||\n currentTabbableItem == null ||\n document.activeElement !== rootElement\n ) {\n return;\n }\n\n rootEntryFirstFocusFrameRef.current = window.requestAnimationFrame(() => {\n rootEntryFirstFocusFrameRef.current = window.requestAnimationFrame(() => {\n rootEntryFirstFocusFrameRef.current = null;\n const currentRootElement = rootRef.current;\n if (!currentRootElement || document.activeElement !== currentRootElement) {\n return;\n }\n\n const contentElement = getCurrentTabbableItemElement(currentTabbableItem);\n const didFocus =\n currentTabbableItem.type === 'node'\n ? focusDiagramItemContent({\n contentElement,\n focusAction: 'first',\n focusScopeSelector: `.${focusTrackerBaseStyle}`\n })\n : focusDiagramItemContent({\n contentElement,\n focusAction: 'first'\n });\n\n if (!didFocus) {\n return;\n }\n\n debugLog('root entry focused first tabbable', {\n currentTabbableItem,\n contentElement: describeElement(contentElement),\n activeElement: describeElement(document.activeElement as Element | null)\n });\n });\n });\n\n return () => {\n if (rootEntryFirstFocusFrameRef.current != null) {\n window.cancelAnimationFrame(rootEntryFirstFocusFrameRef.current);\n rootEntryFirstFocusFrameRef.current = null;\n }\n };\n }, [\n currentTabbableItem,\n getCurrentTabbableItemElement,\n isTabbableMode,\n rootRef,\n tabbableModeFocusAction\n ]);\n\n useEffect(() => {\n if (!isTabbableMode && !hasStoredFocusRestoreTarget()) {\n clearStoredFocusRestoreState();\n }\n }, [clearStoredFocusRestoreState, hasStoredFocusRestoreTarget, isTabbableMode]);\n\n useEffect(() => {\n if (visibility === 'visible' && isTabbableMode && tabbableModeFocusAction != null) {\n setTabbableModeFocusAction(undefined);\n }\n }, [isTabbableMode, tabbableModeFocusAction, visibility]);\n\n useEffect(() => {\n return () => {\n if (rootEntryFirstFocusFrameRef.current != null) {\n window.cancelAnimationFrame(rootEntryFirstFocusFrameRef.current);\n }\n if (transientBlurTimeoutRef.current != null) {\n window.clearTimeout(transientBlurTimeoutRef.current);\n }\n };\n }, []);\n\n return {\n captureFocusRestoreState,\n captureFocusRestoreStateFromTarget,\n handleInnerFocusKeyDownCapture,\n isTabbableMode,\n onTabbableModeFocusFailure,\n requestFocusRestore,\n syncTabbableModeFromTarget,\n tabbableModeFocusAction,\n tabbableModeRestoreCustomElementId: previousCustomFocusIdRef.current,\n tabbableModeRestoreElementId: previousInnerFocusIdRef.current,\n tabbableSetProps\n };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport type {\n Bounds,\n DiagramNodeData,\n DiagramLinkData,\n PromotedLinkId,\n DiagramDragStartDetail,\n DiagramDropDetail\n} from '../diagram.types';\nimport {\n getMapEntryBySerializedKey,\n getPromotedString,\n serializeDiagramKey\n} from '../utils/diagramUtils';\n\nconst DROP_OFFSET_X_DATA_TYPE = 'text/_dvtDropOffsetX';\nconst DROP_OFFSET_Y_DATA_TYPE = 'text/_dvtDropOffsetY';\n\nconst getClientCoordinate = (value?: number, fallback?: number) => value ?? fallback ?? 0;\nconst getSafeZoom = (zoom: number) => (Number.isFinite(zoom) && zoom !== 0 ? zoom : 1);\nconst getClosestElement = (target: EventTarget | null, selector: string) => {\n if (target instanceof Element) {\n return target.closest(selector);\n }\n\n if (target instanceof Node) {\n return target.parentElement?.closest(selector) ?? null;\n }\n\n return null;\n};\n\nconst getElementBounds = (element: Element) => {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height\n };\n};\n\nconst getOutlineOverflow = (element: HTMLElement) => {\n const computedStyle = window.getComputedStyle(element);\n const outlineWidth = Number.parseFloat(computedStyle.outlineWidth || '0') || 0;\n const outlineOffset = Number.parseFloat(computedStyle.outlineOffset || '0') || 0;\n return outlineWidth + Math.max(0, outlineOffset);\n};\n\nconst getVisualBounds = (element: HTMLElement) => {\n const rootBounds = getElementBounds(element);\n const rootOverflow = getOutlineOverflow(element);\n let left = rootBounds.left - rootOverflow;\n let top = rootBounds.top - rootOverflow;\n let right = rootBounds.right + rootOverflow;\n let bottom = rootBounds.bottom + rootOverflow;\n const stack = Array.from(element.children) as HTMLElement[];\n\n while (stack.length > 0) {\n const currentElement = stack.pop()!;\n const bounds = getElementBounds(currentElement);\n left = Math.min(left, bounds.left);\n top = Math.min(top, bounds.top);\n right = Math.max(right, bounds.right);\n bottom = Math.max(bottom, bounds.bottom);\n\n const overflow = getOutlineOverflow(currentElement);\n if (overflow > 0) {\n left = Math.min(left, bounds.left - overflow);\n top = Math.min(top, bounds.top - overflow);\n right = Math.max(right, bounds.right + overflow);\n bottom = Math.max(bottom, bounds.bottom + overflow);\n }\n\n stack.push(...(Array.from(currentElement.children) as HTMLElement[]));\n }\n\n return {\n left,\n top,\n right,\n bottom,\n width: right - left,\n height: bottom - top\n };\n};\n\nconst applyOutlineAsBoxShadow = (source: HTMLElement, clone: HTMLElement) => {\n const sourceElements = [source, ...Array.from(source.querySelectorAll<HTMLElement>('*'))];\n const cloneElements = [clone, ...Array.from(clone.querySelectorAll<HTMLElement>('*'))];\n\n sourceElements.forEach((sourceElement, index) => {\n const cloneElement = cloneElements[index];\n if (!cloneElement) {\n return;\n }\n const computedStyle = window.getComputedStyle(sourceElement);\n const outlineStyle = computedStyle.outlineStyle;\n const outlineWidth = Number.parseFloat(computedStyle.outlineWidth || '0') || 0;\n const outlineOffset = Number.parseFloat(computedStyle.outlineOffset || '0') || 0;\n const outlineColor = computedStyle.outlineColor;\n\n if (outlineStyle === 'none' || outlineWidth === 0) {\n return;\n }\n\n const spread = outlineWidth + Math.max(0, outlineOffset);\n const existingBoxShadow = computedStyle.boxShadow;\n const outlineShadow = `0 0 0 ${spread}px ${outlineColor}`;\n cloneElement.style.boxShadow =\n existingBoxShadow && existingBoxShadow !== 'none'\n ? `${existingBoxShadow}, ${outlineShadow}`\n : outlineShadow;\n cloneElement.style.outline = 'none';\n });\n};\n\nfunction getMinimumNodePosition<K>(nodeBounds: Map<K, Bounds>) {\n let minX = Infinity;\n let minY = Infinity;\n\n nodeBounds.forEach((bounds) => {\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n });\n\n return {\n minX: minX === Infinity ? 0 : minX,\n minY: minY === Infinity ? 0 : minY\n };\n}\n\nfunction getDiagramPointerPosition<K>(\n event: DragEvent,\n rootRef: RefObject<HTMLDivElement>,\n nodeBounds: Map<K, Bounds>,\n panX: number,\n panY: number,\n zoom: number\n) {\n const safePanX = Number.isFinite(panX) ? panX : 0;\n const safePanY = Number.isFinite(panY) ? panY : 0;\n const safeZoom = getSafeZoom(zoom);\n const rootRect = rootRef.current?.getBoundingClientRect();\n const clientX = getClientCoordinate(event.clientX, event.offsetX);\n const clientY = getClientCoordinate(event.clientY, event.offsetY);\n const { minX, minY } = getMinimumNodePosition(nodeBounds);\n const relativeX = rootRect\n ? (clientX - rootRect.left - safePanX) / safeZoom\n : (event.offsetX - safePanX) / safeZoom;\n const relativeY = rootRect\n ? (clientY - rootRect.top - safePanY) / safeZoom\n : (event.offsetY - safePanY) / safeZoom;\n\n return {\n clientX,\n clientY,\n x: relativeX + minX,\n y: relativeY + minY\n };\n}\n\nexport function setDiagramDropOffset<\n K1 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n event: DragEvent,\n rootRef: RefObject<HTMLDivElement>,\n context: DiagramDragStartDetail<D1>,\n nodeBounds: Map<K1, Bounds>,\n panX: number,\n panY: number,\n zoom: number\n) {\n if (!context || context.type !== 'nodes') {\n return;\n }\n\n const draggedNodeBounds = context.nodes\n .map(({ data }) => nodeBounds.get(data.id))\n .filter((bounds): bounds is Bounds => bounds !== undefined);\n if (draggedNodeBounds.length === 0) {\n return;\n }\n\n const contentMinX = Math.min(...draggedNodeBounds.map((bounds) => bounds.x));\n const contentMinY = Math.min(...draggedNodeBounds.map((bounds) => bounds.y));\n const pointerPosition = getDiagramPointerPosition(event, rootRef, nodeBounds, panX, panY, zoom);\n\n event.dataTransfer?.setData(DROP_OFFSET_X_DATA_TYPE, String(contentMinX - pointerPosition.x));\n event.dataTransfer?.setData(DROP_OFFSET_Y_DATA_TYPE, String(contentMinY - pointerPosition.y));\n}\n\nexport function getDiagramDragContext<\n K1 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(\n target: EventTarget,\n event: DragEvent,\n selectedNodeIds: Set<K1>,\n nodesMap: Map<K1, D1>,\n nodeBounds: Map<K1, Bounds>,\n nodeDraggable?: (data: D1) => 'on' | 'off'\n) {\n const nodeElement = getClosestElement(target, '[data-oj-private-node]') as HTMLElement | null;\n const nodeEntry = getMapEntryBySerializedKey(nodesMap, nodeElement?.dataset['ojPrivateNode']);\n if (!nodeEntry || !nodeDraggable || nodeDraggable(nodeEntry.value) !== 'on') {\n return undefined;\n }\n\n const draggedNodes =\n selectedNodeIds.size > 1 && selectedNodeIds.has(nodeEntry.key)\n ? Array.from(selectedNodeIds)\n .map((id) => {\n const data = nodesMap.get(id);\n const bounds = nodeBounds.get(id);\n if (!data || !bounds || nodeDraggable(data) !== 'on') {\n return null;\n }\n return { data, bounds };\n })\n .filter((item): item is { data: D1; bounds: Bounds } => item !== null)\n : [{ data: nodeEntry.value, bounds: nodeBounds.get(nodeEntry.key) }];\n\n const validDraggedNodes = draggedNodes.filter(\n (item): item is { data: D1; bounds: Bounds } => item.bounds !== undefined\n );\n if (validDraggedNodes.length === 0) {\n return undefined;\n }\n\n const minX = Math.min(...validDraggedNodes.map((item) => item.bounds.x));\n const minY = Math.min(...validDraggedNodes.map((item) => item.bounds.y));\n\n return {\n type: 'nodes',\n nodes: validDraggedNodes.map(({ data, bounds }) => ({\n data,\n nodeOffset: {\n x: bounds.x - minX,\n y: bounds.y - minY\n }\n })),\n event\n } as DiagramDragStartDetail<D1>;\n}\n\nexport function getDiagramDropContext<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>(\n event: DragEvent,\n rootRef: RefObject<HTMLDivElement>,\n nodesMap: Map<K1, D1>,\n linksMap: Map<K2, D2>,\n promotedLinks: PromotedLinkId<K1, D2>[],\n nodeBounds: Map<K1, Bounds>,\n panX: number,\n panY: number,\n zoom: number\n) {\n const pointerPosition = getDiagramPointerPosition(event, rootRef, nodeBounds, panX, panY, zoom);\n const safeZoom = getSafeZoom(zoom);\n const clientX = pointerPosition.clientX;\n const clientY = pointerPosition.clientY;\n const target = event.target as HTMLElement | null;\n const offsetX =\n event.type === 'drop' ? Number(event.dataTransfer?.getData(DROP_OFFSET_X_DATA_TYPE)) || 0 : 0;\n const offsetY =\n event.type === 'drop' ? Number(event.dataTransfer?.getData(DROP_OFFSET_Y_DATA_TYPE)) || 0 : 0;\n const x = pointerPosition.x + offsetX;\n const y = pointerPosition.y + offsetY;\n const nodeElement = getClosestElement(target, '[data-oj-private-node]') as HTMLElement | null;\n\n const nodeEntry = getMapEntryBySerializedKey(\n nodesMap,\n nodeElement?.getAttribute('data-oj-private-node')\n );\n if (nodeEntry) {\n const bounds = nodeBounds.get(nodeEntry.key);\n const nodeRect = nodeElement?.getBoundingClientRect();\n const nodeX = nodeRect\n ? (clientX - nodeRect.left) / safeZoom + offsetX\n : bounds\n ? x - bounds.x\n : x;\n const nodeY = nodeRect\n ? (clientY - nodeRect.top) / safeZoom + offsetY\n : bounds\n ? y - bounds.y\n : y;\n return {\n type: 'node',\n x: bounds ? bounds.x + nodeX : x,\n y: bounds ? bounds.y + nodeY : y,\n nodeX,\n nodeY,\n data: nodeEntry.value,\n event\n } as DiagramDropDetail<K1, D1, D2>;\n }\n\n const linkEntry = getMapEntryBySerializedKey(\n linksMap,\n getClosestElement(target, '[data-oj-private-link]')?.getAttribute('data-oj-private-link')\n );\n if (linkEntry) {\n return {\n type: 'link',\n data: linkEntry.value,\n event\n } as DiagramDropDetail<K1, D1, D2>;\n }\n\n const promotedLinkEntry = promotedLinks.find(\n (link) =>\n getPromotedString(link) ===\n getClosestElement(target, '[data-oj-private-promoted-link]')?.getAttribute(\n 'data-oj-private-promoted-link'\n )\n );\n if (promotedLinkEntry) {\n return {\n type: 'promotedLink',\n startNode: promotedLinkEntry.startNode,\n endNode: promotedLinkEntry.endNode,\n data: promotedLinkEntry.links,\n event\n } as DiagramDropDetail<K1, D1, D2>;\n }\n\n return {\n type: 'background',\n x,\n y,\n event\n } as DiagramDropDetail<K1, D1, D2>;\n}\n\nexport function isDiagramDraggable<K1 extends string | number, D1 extends DiagramNodeData<K1, D1>>(\n nodesMap: Map<K1, D1>,\n nodeDraggable?: (data: D1) => 'on' | 'off'\n) {\n if (!nodeDraggable) {\n return false;\n }\n for (const node of nodesMap.values()) {\n if (nodeDraggable(node) === 'on') {\n return true;\n }\n }\n return false;\n}\n\nexport function getDragImageElements<\n K1 extends string | number,\n D1 extends DiagramNodeData<K1, D1>\n>(rootRef: RefObject<HTMLDivElement>, context: DiagramDragStartDetail<D1>, event: DragEvent) {\n if (!context || context.type !== 'nodes') {\n return null;\n }\n\n const root = rootRef.current;\n if (!root) {\n return null;\n }\n\n const nodeElementMap = new Map<string, HTMLElement>();\n root.querySelectorAll<HTMLElement>('[data-oj-private-node]').forEach((element) => {\n const key = element.dataset['ojPrivateNode'];\n if (key != null) {\n nodeElementMap.set(key, element);\n }\n });\n\n const nodeElements = context.nodes\n .map(({ data }) => nodeElementMap.get(serializeDiagramKey(data.id)) ?? null)\n .filter((element): element is HTMLElement => element != null);\n\n if (nodeElements.length === 0) {\n return null;\n }\n\n const elementBounds = nodeElements.map(getElementBounds);\n const visualBounds = nodeElements.map(getVisualBounds);\n const minLeft = Math.min(...visualBounds.map((bounds) => bounds.left));\n const minTop = Math.min(...visualBounds.map((bounds) => bounds.top));\n const maxRight = Math.max(...visualBounds.map((bounds) => bounds.right));\n const maxBottom = Math.max(...visualBounds.map((bounds) => bounds.bottom));\n\n const container = document.createElement('div');\n container.style.position = 'absolute';\n container.style.width = `${maxRight - minLeft}px`;\n container.style.height = `${maxBottom - minTop}px`;\n container.style.pointerEvents = 'none';\n container.style.overflow = 'visible';\n\n nodeElements.forEach((element, index) => {\n const bounds = elementBounds[index];\n const visual = visualBounds[index];\n const wrapper = document.createElement('div');\n const clone = element.cloneNode(true) as HTMLElement;\n applyOutlineAsBoxShadow(element, clone);\n wrapper.style.position = 'absolute';\n wrapper.style.left = `${visual.left - minLeft}px`;\n wrapper.style.top = `${visual.top - minTop}px`;\n wrapper.style.width = `${visual.width}px`;\n wrapper.style.height = `${visual.height}px`;\n wrapper.style.pointerEvents = 'none';\n wrapper.style.overflow = 'visible';\n\n clone.style.position = 'absolute';\n clone.style.left = `${bounds.left - visual.left}px`;\n clone.style.top = `${bounds.top - visual.top}px`;\n clone.style.width = `${bounds.width}px`;\n clone.style.height = `${bounds.height}px`;\n clone.style.margin = '0';\n clone.style.overflow = 'visible';\n wrapper.appendChild(clone);\n container.appendChild(wrapper);\n });\n\n return {\n image: container,\n offSetX: getClientCoordinate(event.clientX, event.offsetX) - minLeft,\n offSetY: getClientCoordinate(event.clientY, event.offsetY) - minTop,\n width: maxRight - minLeft,\n height: maxBottom - minTop\n };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type { RefObject } from 'preact';\nimport type { Dispatch, StateUpdater } from 'preact/hooks';\nimport type {\n Bounds,\n DiagramDndProps,\n DiagramNodeData,\n DiagramLinkData,\n DiagramDropDetail,\n DiagramDragStartDetail,\n PromotedLinkId,\n SelectedItemDetail,\n DiagramDropFeedback\n} from '../diagram.types';\nimport { centerXYToPanXY } from '../utils/panUtils';\nimport {\n getDiagramDragContext,\n getDiagramDropContext,\n getDragImageElements,\n setDiagramDropOffset,\n isDiagramDraggable\n} from './dndDiagramUtils';\nimport { getPromotedString } from '../utils/diagramUtils';\nimport { useDnd, DragImageProps } from '#hooks/PRIVATE_useVisDnd';\n\ntype Props<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n> = DiagramDndProps<K1, D1, D2> & {\n rootRef: RefObject<HTMLDivElement>;\n nodesMap: Map<K1, D1>;\n linksMap: Map<K2, D2>;\n promotedLinks: PromotedLinkId<K1, D2>[];\n nodeBounds: Map<K1, Bounds>;\n selectedNodeIds: Set<K1>;\n selectionMode: 'none' | 'single' | 'multiple';\n onSelectionChange?: (detail: SelectedItemDetail<K1, K2, D1, D2>) => void;\n setDropFeedback: Dispatch<StateUpdater<DiagramDropFeedback<K1, K2, D2> | undefined>>;\n centerX: number;\n centerY: number;\n zoomValue: number;\n width: number;\n height: number;\n setDatatipDisabled: Dispatch<StateUpdater<boolean>>;\n};\n\nconst getAcceptedDiagramDropEffect = (\n effectAllowed: DataTransfer['effectAllowed']\n): DataTransfer['dropEffect'] => {\n switch (effectAllowed) {\n case 'copy':\n case 'all':\n case 'copyLink':\n case 'copyMove':\n case 'uninitialized':\n return 'copy';\n case 'link':\n case 'linkMove':\n return 'link';\n case 'none':\n return 'none';\n case 'move':\n default:\n return 'move';\n }\n};\n\nconst setDiagramNativeDropEffect = (event: DragEvent, accepted: boolean) => {\n const dataTransfer = event.dataTransfer;\n if (!dataTransfer) {\n return;\n }\n\n if (!accepted) {\n dataTransfer.dropEffect = 'none';\n return;\n }\n\n const acceptedDropEffect = getAcceptedDiagramDropEffect(dataTransfer.effectAllowed);\n if (dataTransfer.dropEffect !== acceptedDropEffect) {\n dataTransfer.dropEffect = acceptedDropEffect;\n }\n};\n\nexport const useDiagramDnd = <\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>({\n onDragStart,\n onDrag,\n onDragEnd,\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n nodeDraggable,\n rootRef,\n nodesMap,\n linksMap,\n promotedLinks,\n nodeBounds,\n selectedNodeIds,\n selectionMode,\n onSelectionChange,\n setDropFeedback,\n centerX,\n centerY,\n zoomValue,\n width,\n height,\n setDatatipDisabled\n}: Props<K1, K2, D1, D2>) => {\n const draggable = isDiagramDraggable(nodesMap, nodeDraggable);\n const panValues = centerXYToPanXY(centerX, centerY, zoomValue, width, height);\n\n const getDragContext = function (target: HTMLElement, event: DragEvent) {\n return getDiagramDragContext(\n target,\n event,\n selectedNodeIds,\n nodesMap,\n nodeBounds,\n nodeDraggable\n );\n };\n\n const getDropContext = function (event: DragEvent) {\n return getDiagramDropContext<K1, K2, D1, D2>(\n event,\n rootRef,\n nodesMap,\n linksMap,\n promotedLinks,\n nodeBounds,\n panValues.panX,\n panValues.panY,\n zoomValue\n );\n };\n\n const getDiagramDragImage = function (props: DragImageProps<DiagramDragStartDetail<D1>>) {\n setDiagramDropOffset(\n props.event,\n rootRef,\n props.context,\n nodeBounds,\n panValues.panX,\n panValues.panY,\n zoomValue\n );\n return getDragImageElements(rootRef, props.context, props.event);\n };\n\n const getDropFeedback = function (\n context: DiagramDropDetail<K1, D1, D2>,\n accepted: boolean\n ): DiagramDropFeedback<K1, K2, D2> {\n switch (context.type) {\n case 'node':\n return { type: 'node', id: context.data.id, accepted };\n case 'link':\n return { type: 'link', id: context.data.id, accepted };\n case 'promotedLink':\n return {\n type: 'promotedLink',\n id: {\n startNode: context.startNode,\n endNode: context.endNode,\n links: context.data\n },\n accepted\n };\n case 'background':\n default:\n return { type: 'background', accepted };\n }\n };\n\n const isSameDropFeedback = function (\n feedback1?: DiagramDropFeedback<K1, K2, D2>,\n feedback2?: DiagramDropFeedback<K1, K2, D2>\n ) {\n if (feedback1 === feedback2) {\n return true;\n }\n if (\n feedback1?.type !== feedback2?.type ||\n feedback1?.accepted !== feedback2?.accepted ||\n !feedback1 ||\n !feedback2\n ) {\n return false;\n }\n switch (feedback1.type) {\n case 'node':\n return feedback2.type === 'node' && feedback1.id === feedback2.id;\n case 'link':\n return feedback2.type === 'link' && feedback1.id === feedback2.id;\n case 'promotedLink':\n return (\n feedback2.type === 'promotedLink' &&\n getPromotedString(feedback1.id) === getPromotedString(feedback2.id)\n );\n case 'background':\n default:\n return true;\n }\n };\n\n const updateDropFeedback = function (feedback?: DiagramDropFeedback<K1, K2, D2>) {\n setDropFeedback((current) => (isSameDropFeedback(current, feedback) ? current : feedback));\n };\n\n const showDropEffect = function (context: DiagramDropDetail<K1, D1, D2>) {\n setDiagramNativeDropEffect(context.event, true);\n updateDropFeedback(getDropFeedback(context, true));\n };\n\n const showRejectedDropEffect = function (context: DiagramDropDetail<K1, D1, D2>) {\n setDiagramNativeDropEffect(context.event, false);\n updateDropFeedback(getDropFeedback(context, false));\n };\n\n const clearDropEffect = function () {\n updateDropFeedback(undefined);\n };\n\n const onPreDndStart = function (context: DiagramDragStartDetail<D1>) {\n if (!onSelectionChange || selectionMode === 'none' || context?.type !== 'nodes') {\n return;\n }\n\n const selectableNodes = context.nodes.filter((item) => item.data.selectable !== 'off');\n const ids = selectableNodes.map((item) => item.data.id);\n const selectionUnchanged =\n ids.length === selectedNodeIds.size && ids.every((id) => selectedNodeIds.has(id));\n if (selectionUnchanged) {\n return;\n }\n\n onSelectionChange({\n nodes: {\n ids,\n data: selectableNodes.map((item) => item.data)\n },\n links: {\n ids: [],\n data: []\n },\n promotedLinks: {\n ids: []\n }\n });\n };\n\n const { dragProps, dropProps, content } = useDnd<\n DiagramDragStartDetail<D1>,\n DiagramDropDetail<K1, D1, D2>\n >({\n onDragStart,\n onDrag,\n onDragEnd,\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n getDragContext,\n getDropContext,\n getDragImage: getDiagramDragImage,\n onPreDndStart,\n setDatatipDisabled,\n showDropEffect,\n showRejectedDropEffect,\n clearDropEffect\n });\n\n return {\n draggable,\n dndProps: draggable ? { ...dragProps, ...dropProps } : dropProps,\n dndContent: content\n };\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n BaseDiagramWithDimensionsProps,\n Bounds,\n DiagramLabelPosition,\n States,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput,\n Dimensions,\n PromotedLinkId,\n DiagramDropFeedback\n} from './diagram.types';\nimport type { TextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { DiagramLayers } from './DiagramLayers';\nimport { DiagramOverview } from './DiagramOverview';\nimport { DiagramPanZoomContainer } from './DiagramPanZoomContainer';\nimport { useEvents } from './hooks/useEvents';\nimport { useDiagramDatatip } from './hooks/useDiagramDatatip';\nimport { useTextDimensions } from '#hooks/PRIVATE_useTextDimensions';\nimport { usePanZoom } from './hooks/usePanZoom';\nimport { useLayoutEffect, useRef, useState, useMemo, useCallback, useEffect } from 'preact/hooks';\nimport { useUser } from '#hooks/UNSAFE_useUser';\nimport { useDiagramSelection } from './hooks/useDiagramSelection';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { Keys } from '#utils/UNSAFE_keys';\nimport {\n constructLayoutJSON,\n deconstructLayoutJSON,\n getFocusedItemBounds,\n mergeDimensions,\n isEqualBounds,\n getDimensionsFromBounds,\n getContentBounds,\n filterLinksWithNoStartOrEndNodes,\n getAllLabelBounds,\n createLinksMap,\n createNodesMap,\n getPromotedLinks,\n getPromotedString,\n createPromotedLinksMap,\n linkPositionChanged,\n serializeDiagramKey\n} from './utils/diagramUtils';\nimport { centerXYToPanXY } from './utils/panUtils';\nimport { dropFeedbackStyles, outerStyles } from './themes/DiagramStyles.css';\nimport { useVisTouchResponse } from '#hooks/PRIVATE_useVisTouchResponse';\nimport { merge } from '@oracle/oraclejet-internal-utilities/stringUtils';\nimport { useDiagramContextMenu } from './hooks/useDiagramContextMenu';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { useDiagramTabbableMode } from './hooks/useDiagramTabbableMode';\nimport { useDiagramDnd } from './hooks/useDiagramDnd';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\nimport { classNames } from '#utils/UNSAFE_classNames';\n\nconst emptyKeys = { all: false, keys: new Set() };\nconst defaultOverviewConfig = {};\n\nconst isFiniteDimension = (value: number) => Number.isFinite(value);\n\nexport function BaseDiagramWithDimensionsWithData<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n nodes = [],\n links = [],\n width,\n height,\n selectedIds = {},\n selectionMode = 'none',\n layout,\n nodeRenderer,\n linkRenderer,\n onSelectionChange,\n onItemHover,\n onItemFocus,\n highlightedIds = {},\n datatip,\n expanded = emptyKeys as Keys<K1>,\n onExpandedChange,\n contextMenuConfig,\n normalizeLinks,\n overview = 'off',\n ...otherProps\n}: BaseDiagramWithDimensionsProps<K1, K2, D1, D2, L>) {\n const focusedItemBoundsRef = useRef<Bounds | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const [bounds, setBounds] = useState<Map<K1, Bounds>>(new Map());\n const [absBounds, setAbsBounds] = useState<Map<K1, Bounds>>(new Map());\n const linkDimensions = useRef<Map<K2, Dimensions>>(new Map());\n const promotedLinkDimensions = useRef<Map<string, Dimensions>>(new Map());\n const [combinedLabelBounds, setCombinedLabelBounds] = useState<Bounds>();\n const { direction } = useUser();\n const isRtl = direction === 'rtl';\n\n const diagramNodes = nodes;\n const nodeMap = useMemo(\n () => createNodesMap<K1, D1>(diagramNodes, expanded),\n [diagramNodes, expanded]\n );\n const nodeIdToParentMap = nodeMap.itemIdToParentMap;\n const navigationBounds = nodeIdToParentMap.size > 0 ? absBounds : bounds;\n const nodeIdToDataMap = nodeMap.itemIdToDataMap;\n const nodeIdsByAttr = useMemo(() => {\n const idsByAttr = new Map<string, K1>();\n nodeIdToDataMap.forEach((_, id) => {\n idsByAttr.set(serializeDiagramKey(id), id);\n });\n return idsByAttr;\n }, [nodeIdToDataMap]);\n const diagramLinks = useMemo(\n () => filterLinksWithNoStartOrEndNodes(links, nodeIdToDataMap),\n [links, nodeIdToDataMap]\n );\n const linkMap = useMemo(() => createLinksMap<K1, K2, D2>(diagramLinks), [diagramLinks]);\n const linkIdToDataMap = linkMap.itemIdToDataMap;\n const linkIdsByAttr = useMemo(() => {\n const idsByAttr = new Map<string, K2>();\n linkIdToDataMap.forEach((_, id) => {\n idsByAttr.set(serializeDiagramKey(id), id);\n });\n return idsByAttr;\n }, [linkIdToDataMap]);\n const resizeThrottling = useRef<boolean>(false);\n const newDimensions = getDimensionsFromBounds(bounds);\n const { textMeasureContent, getTextDimensions } = useTextDimensions();\n const labelDimensions = useRef<Map<K1 | K2, TextDimensions>>(new Map());\n const shouldIgnoreTransientBlurRef = useRef(false);\n const linkDimsChanged = useRef<boolean>(false);\n const linkRerenderNeeded = useRef<boolean>(false);\n const nodeLabelPosRef = useRef<Map<K1, DiagramLabelPosition>>(new Map());\n const linkLabelPosRef = useRef<Map<K2, DiagramLabelPosition>>(new Map());\n const [layoutOutput, setLayoutOutput] = useState<L>();\n const nodeBoundsRef = useRef<Map<K1, Bounds>>(new Map());\n const isTabbableModeRef = useRef(false);\n const promotedLinks = useMemo(\n () =>\n getPromotedLinks<K1, K2, D1, D2>(\n links,\n expanded,\n nodeMap.allContainerNodes,\n nodeMap.allVisibleNodes\n ),\n [links, expanded, nodeMap.allContainerNodes, nodeMap.allVisibleNodes]\n );\n const promotedLinkIdsByAttr = useMemo(() => {\n const idsByAttr = new Map<string, PromotedLinkId<K1, D2>>();\n promotedLinks.forEach((id) => {\n idsByAttr.set(getPromotedString(id), id);\n });\n return idsByAttr;\n }, [promotedLinks]);\n const promotedLinkMap = useMemo(\n () => createPromotedLinksMap<K1, D2>(promotedLinks),\n [promotedLinks]\n );\n const contentBounds = useMemo(\n () => getContentBounds(bounds, combinedLabelBounds),\n [bounds, combinedLabelBounds]\n );\n const {\n panZoomProps,\n panProps,\n zoomProps,\n toggleButtonContent,\n cursor,\n centerX: contentRelativeCenterX,\n centerY: contentRelativeCenterY,\n zoomValue,\n panBounds,\n kbPanCallback,\n kbZoomCallback\n } = usePanZoom({\n props: otherProps,\n captureTargetRef: rootRef,\n width: width,\n height: height,\n contentBounds,\n isRtl\n });\n\n const { touchResponse, touchResponseStyle } = useVisTouchResponse({\n type: 'auto',\n supportsTouchDragGestures: zoomProps.zooming === 'on' || panProps.panning !== 'off',\n rootRef\n });\n const [dropFeedback, setDropFeedback] = useState<DiagramDropFeedback<K1, K2, D2>>();\n\n const [visibility, setVisibility] = useState<'visible' | 'hidden'>('hidden');\n const {\n onContextMenuDismissed,\n focusedItemInfo,\n hoveredItemInfo,\n activeId,\n syncFocusedItemInfoFromTarget,\n eventsProps\n } = useEvents<K1, K2, D1, D2>(\n touchResponse,\n diagramNodes[0],\n diagramNodes,\n diagramLinks,\n promotedLinks,\n bounds,\n navigationBounds,\n linkIdToDataMap,\n nodeIdToDataMap,\n width,\n height,\n otherProps.maxZoom || 1,\n expanded,\n nodeIdToParentMap,\n promotedLinkMap,\n onItemHover,\n onItemFocus,\n kbPanCallback,\n kbZoomCallback,\n onExpandedChange,\n () => isTabbableModeRef.current,\n (event) => {\n const currentTarget = event.currentTarget as HTMLElement | null;\n const relatedTarget = event.relatedTarget as Element | null;\n return (\n isTabbableModeRef.current &&\n shouldIgnoreTransientBlurRef.current &&\n currentTarget != null &&\n (relatedTarget == null || relatedTarget === currentTarget.ownerDocument.body)\n );\n }\n );\n const {\n captureFocusRestoreState,\n captureFocusRestoreStateFromTarget,\n handleInnerFocusKeyDownCapture,\n isTabbableMode,\n onTabbableModeFocusFailure,\n requestFocusRestore,\n syncTabbableModeFromTarget,\n tabbableModeFocusAction,\n tabbableModeRestoreCustomElementId,\n tabbableModeRestoreElementId,\n tabbableSetProps\n } = useDiagramTabbableMode<K1, K2, D2>({\n rootRef,\n focusedItemInfo,\n isTabbableModeRef,\n shouldIgnoreTransientBlurRef,\n nodeIdsByAttr,\n linkIdsByAttr,\n promotedLinkIdsByAttr,\n visibility\n });\n const style = {\n width: width,\n height: height,\n cursor: dropFeedback?.accepted === false ? 'no-drop' : cursor,\n visibility: visibility,\n ...touchResponseStyle\n };\n const { selectionProps, selectionContent } = useDiagramSelection<K1, K2, D1, D2>({\n selectedIds,\n selectionMode,\n nodeMap,\n linkMap,\n focusedItemInfo,\n onSelectionChange,\n rootRef,\n promotedLinkMap\n });\n\n // This is for the datatip kb position\n if (focusedItemInfo && absBounds.size > 0) {\n focusedItemBoundsRef.current = getFocusedItemBounds(\n focusedItemInfo,\n absBounds,\n diagramLinks,\n linkMap.itemIdToIndexMap,\n zoomValue,\n rootRef\n );\n }\n\n const [datatipDisabled, setDatatipDisabled] = useState(false);\n\n const {\n datatipContent,\n datatipProps: { 'aria-describedby': datatipAriaDescribedby, ...datatipProps }\n } = useDiagramDatatip({\n touchResponse,\n datatip: datatipDisabled ? undefined : datatip,\n focusedItemInfo,\n focusedItemBoundsRef,\n panState: centerXYToPanXY(\n contentRelativeCenterX,\n contentRelativeCenterY,\n zoomValue,\n width,\n height\n ),\n zoom: zoomValue,\n width: width,\n nodesMap: nodeIdToDataMap,\n linksMap: linkIdToDataMap,\n hoveredItem: hoveredItemInfo,\n isTabbableMode\n });\n\n // When expanded changes, diagram loses focus so we need to call re-render\n const expandRerender = useRef(false);\n const hasMountedExpandedRef = useRef(false);\n useLayoutEffect(() => {\n const rootElement = rootRef.current;\n if (!rootElement) {\n return;\n }\n\n if (!hasMountedExpandedRef.current) {\n hasMountedExpandedRef.current = true;\n return;\n }\n\n const activeElement = rootElement.ownerDocument.activeElement;\n const shouldRestoreFocus =\n activeElement === rootElement ||\n (activeElement instanceof Element && rootElement.contains(activeElement));\n\n if (!shouldRestoreFocus) {\n return;\n }\n\n captureFocusRestoreState();\n requestFocusRestore();\n expandRerender.current = true;\n }, [captureFocusRestoreState, expanded, requestFocusRestore]);\n useLayoutEffect(() => {\n if (visibility === 'visible' && expandRerender.current === true) {\n expandRerender.current = false;\n }\n }, [visibility]);\n const states = useRef<States<K1, K2, D2>>();\n\n states.current = {\n // update states to new state\n selectedNodeIds: selectedIds.nodes ?? [],\n selectedLinkIds: selectedIds.links ?? [],\n selectedPromotedLinkIds: selectedIds.promotedLinks ?? [],\n focusedId:\n focusedItemInfo.isCurrent && focusedItemInfo.isFocusVisible ? focusedItemInfo.id : undefined,\n tabbableModeItemId: isTabbableMode ? focusedItemInfo.id : undefined,\n hoveredId: hoveredItemInfo?.isCurrent ? hoveredItemInfo.id : undefined,\n activeId,\n highlightedNodeIds: highlightedIds.nodes ?? [],\n highlightedLinkIds: highlightedIds.links ?? [],\n highlightedPromotedLinkIds: highlightedIds.promotedLinks ?? [],\n isTabbableMode,\n zoom: zoomValue,\n expanded: expanded || { all: false, keys: new Set() },\n onTabbableModeFocusFailure,\n tabbableModeFocusAction,\n tabbableModeRestoreElementId,\n tabbableModeRestoreCustomElementId,\n dropFeedback\n };\n const layoutCenterX = contentBounds.x + contentRelativeCenterX;\n const layoutCenterY = contentBounds.y + contentRelativeCenterY;\n const overviewConfig = overview === 'on' ? defaultOverviewConfig : overview;\n\n const { contextMenuContent, contextMenuProps } = useDiagramContextMenu<K1, K2, D1, D2>({\n focusedItemInfo,\n rootRef,\n contextMenuConfig: nodes.length > 0 ? contextMenuConfig : undefined,\n onContextMenuDismissed,\n nodesMap: nodeIdToDataMap,\n linksMap: linkIdToDataMap,\n promotedLinkMap\n });\n\n const { draggable, dndProps, dndContent } = useDiagramDnd<K1, K2, D1, D2>({\n onDrag: otherProps.onDrag,\n onDragStart: otherProps.onDragStart,\n onDragEnd: otherProps.onDragEnd,\n onDragEnter: otherProps.onDragEnter,\n onDragLeave: otherProps.onDragLeave,\n onDragOver: otherProps.onDragOver,\n onDrop: otherProps.onDrop,\n nodeDraggable: otherProps.nodeDraggable,\n rootRef,\n nodesMap: nodeIdToDataMap,\n linksMap: linkIdToDataMap,\n promotedLinks,\n nodeBounds: bounds,\n selectedNodeIds: new Set(selectedIds.nodes ?? []),\n selectionMode,\n onSelectionChange,\n setDropFeedback,\n centerX: contentRelativeCenterX,\n centerY: contentRelativeCenterY,\n zoomValue,\n width,\n height,\n setDatatipDisabled\n });\n\n const mergedEventProps = mergeProps(\n panZoomProps,\n eventsProps,\n tabbableSetProps,\n selectionProps,\n datatipProps,\n contextMenuProps,\n dndProps\n );\n\n const captureTabbableModeInteractionFocus = useCallback(\n (target: EventTarget | null) => {\n const rootElement = rootRef.current;\n if (rootElement == null || !(target instanceof Element) || !rootElement.contains(target)) {\n return;\n }\n if (captureFocusRestoreStateFromTarget(target)) {\n return;\n }\n\n if (isTabbableModeRef.current) {\n captureFocusRestoreState();\n }\n },\n [captureFocusRestoreState, captureFocusRestoreStateFromTarget]\n );\n\n const handlePointerDownCapture = useCallback(\n (event: PointerEvent) => {\n captureTabbableModeInteractionFocus(event.target);\n },\n [captureTabbableModeInteractionFocus]\n );\n\n const handleKeyDownCapture = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n captureTabbableModeInteractionFocus(event.target);\n }\n },\n [captureTabbableModeInteractionFocus]\n );\n\n useEffect(() => {\n const rootElement = rootRef.current;\n const ownerDocument = rootElement?.ownerDocument;\n if (rootElement == null || ownerDocument == null) {\n return;\n }\n\n const handleFocusCapture = (event: FocusEvent) => {\n const currentRoot = rootRef.current;\n if (\n currentRoot != null &&\n event.target instanceof Element &&\n currentRoot.contains(event.target)\n ) {\n syncFocusedItemInfoFromTarget(event.target, currentRoot);\n syncTabbableModeFromTarget(event.target);\n }\n };\n\n const handleKeyDownCapture = (event: KeyboardEvent) => {\n const currentRoot = rootRef.current;\n if (\n currentRoot == null ||\n !(event.target instanceof Element) ||\n !currentRoot.contains(event.target)\n ) {\n return;\n }\n\n if (handleInnerFocusKeyDownCapture(event)) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n captureTabbableModeInteractionFocus(event.target);\n }\n };\n\n ownerDocument.addEventListener('focus', handleFocusCapture as EventListener, true);\n ownerDocument.addEventListener('keydown', handleKeyDownCapture as EventListener, true);\n return () => {\n ownerDocument.removeEventListener('focus', handleFocusCapture as EventListener, true);\n ownerDocument.removeEventListener('keydown', handleKeyDownCapture as EventListener, true);\n };\n }, [\n captureTabbableModeInteractionFocus,\n handleInnerFocusKeyDownCapture,\n syncFocusedItemInfoFromTarget,\n syncTabbableModeFromTarget\n ]);\n\n // Called anytime node changes size\n const onNodeSizeChanged = (nodeWidth: number, nodeHeight: number, id: K1) => {\n if (!isFiniteDimension(nodeWidth) || !isFiniteDimension(nodeHeight)) {\n return;\n }\n newDimensions.set(id, { width: nodeWidth, height: nodeHeight });\n if (resizeThrottling.current) {\n return;\n }\n\n resizeThrottling.current = true;\n // performs layout at the next available animation frame when all measurements should be ready\n window.requestAnimationFrame(() => {\n const { labelDims, layoutJSON } = constructLayoutJSON<K1, K2, D1, D2>(\n nodeIdToDataMap,\n linkIdToDataMap,\n promotedLinks,\n newDimensions,\n width,\n height,\n zoomValue,\n nodeIdToParentMap,\n rootRef,\n getTextDimensions\n );\n labelDimensions.current = labelDims;\n const nextLayoutOutput = layout(layoutJSON);\n const { nodePoints, nodeLabelPos, linkLabelPos } = deconstructLayoutJSON<K1, K2, D1, D2>(\n nextLayoutOutput,\n diagramNodes,\n diagramLinks\n );\n nodeLabelPosRef.current = nodeLabelPos;\n linkLabelPosRef.current = linkLabelPos;\n const { nodeBounds, nodeAbsBounds } = mergeDimensions(newDimensions, nodePoints, rootRef);\n const labelBounds = getAllLabelBounds(\n labelDims,\n nodeLabelPos,\n linkLabelPos,\n direction === 'rtl',\n rootRef\n );\n const equalBounds = isEqualBounds(nodeBounds, bounds);\n if (!equalBounds || linkDimsChanged.current || linkRerenderNeeded.current) {\n linkRerenderNeeded.current = linkPositionChanged(nodeBounds, bounds, links);\n setBounds(nodeBounds);\n setAbsBounds(nodeAbsBounds);\n setCombinedLabelBounds(labelBounds);\n setLayoutOutput(nextLayoutOutput);\n linkDimsChanged.current = false;\n setVisibility('hidden');\n } else if (visibility === 'hidden') {\n // Even when measured bounds have already converged, the latest layout output may\n // still carry corrected link geometry after container expand/collapse settles.\n setLayoutOutput(nextLayoutOutput);\n setVisibility('visible');\n }\n resizeThrottling.current = false;\n });\n };\n\n const onLinkSizeChanged = (linkWidth: number, linkHeight: number, id: K2) => {\n if (!isFiniteDimension(linkWidth) || !isFiniteDimension(linkHeight)) {\n return;\n }\n if (linkWidth !== 0 || linkHeight !== 0) {\n const linkDims = linkDimensions.current.get(id);\n if (\n !linkDims ||\n (linkDims &&\n (Math.abs(linkWidth - linkDims.width) > 0.5 ||\n Math.abs(linkHeight - linkDims.height) > 0.5))\n ) {\n linkDimensions.current.set(id, { width: linkWidth, height: linkHeight });\n linkDimsChanged.current = true;\n }\n }\n };\n\n const onPromotedLinkSizeChanged = (linkWidth: number, linkHeight: number, id: string) => {\n if (!isFiniteDimension(linkWidth) || !isFiniteDimension(linkHeight)) {\n return;\n }\n if (linkWidth !== 0 || linkHeight !== 0) {\n const linkDims = promotedLinkDimensions.current.get(id);\n if (\n !linkDims ||\n (linkDims &&\n (Math.abs(linkWidth - linkDims.width) > 0.5 ||\n Math.abs(linkHeight - linkDims.height) > 0.5))\n ) {\n promotedLinkDimensions.current.set(id, { width: linkWidth, height: linkHeight });\n linkDimsChanged.current = true;\n }\n }\n };\n\n useLayoutEffect(() => {\n if (overviewConfig === 'off' || visibility !== 'visible' || bounds.size === 0) {\n return;\n }\n const frame = window.requestAnimationFrame(() => {\n const nodePositions = new Map<K1, { x: number; y: number }>();\n bounds.forEach((value, key) => {\n nodePositions.set(key, { x: value.x, y: value.y });\n });\n const { nodeAbsBounds } = mergeDimensions(\n getDimensionsFromBounds(bounds),\n nodePositions,\n rootRef\n );\n if (!isEqualBounds(nodeAbsBounds, absBounds)) {\n setAbsBounds(nodeAbsBounds);\n }\n });\n return () => window.cancelAnimationFrame(frame);\n }, [absBounds, bounds, overviewConfig, visibility, zoomValue]);\n\n return (\n <div\n ref={rootRef}\n class={classNames([\n outerStyles,\n dropFeedback?.accepted === false ? VisDndStyles.dndRejectedStyle : undefined\n ])}\n {...mergedEventProps}\n draggable={draggable}\n style={style}\n tabIndex={0}\n role=\"application\"\n aria-label={otherProps['aria-label']}\n aria-labelledby={otherProps['aria-labelledby']}\n aria-describedby={merge([otherProps['aria-describedby'], datatipAriaDescribedby])}\n aria-activedescendant={activeId}\n onPointerDownCapture={handlePointerDownCapture}\n onKeyDownCapture={handleKeyDownCapture}>\n {dropFeedback?.type === 'background' ? (\n <div\n class={classNames([\n dropFeedbackStyles.backgroundDropFeedbackStyle,\n dropFeedback.accepted\n ? VisDndStyles.dndDragOverHTMLStyle\n : VisDndStyles.dndRejectedStyle\n ])}\n data-oj-private-drop-feedback={dropFeedback.accepted ? 'accept' : 'reject'}\n />\n ) : undefined}\n {getTextDimensions ? (\n <>\n <DiagramPanZoomContainer\n centerX={contentRelativeCenterX}\n centerY={contentRelativeCenterY}\n zoom={zoomValue}\n width={width}\n height={height}>\n <TabbableModeContext.Provider value={{ isTabbable: isTabbableMode }}>\n <DiagramLayers\n nodes={diagramNodes}\n links={diagramLinks}\n zoom={zoomValue}\n nodeRenderer={nodeRenderer}\n linkRenderer={linkRenderer}\n width={width}\n height={height}\n nodeBounds={bounds}\n linkDimensions={linkDimensions.current}\n promotedLinkDimensions={promotedLinkDimensions.current}\n states={states.current!}\n onNodeSizeChanged={onNodeSizeChanged}\n onLinkSizeChanged={onLinkSizeChanged}\n onPromotedLinkSizeChanged={onPromotedLinkSizeChanged}\n nodeLabelPositions={nodeLabelPosRef.current}\n linkLabelPositions={linkLabelPosRef.current}\n labelDimensions={labelDimensions.current}\n supportsSelection={\n selectionMode !== 'none' ||\n !!(selectedIds?.nodes && selectedIds.nodes.length > 0) ||\n !!(selectedIds?.links && selectedIds.links.length > 0)\n }\n layoutOutput={layoutOutput}\n nodeIdToParentMap={nodeIdToParentMap}\n rootRef={rootRef}\n combinedNodeBounds={contentBounds}\n nodeBoundsRef={nodeBoundsRef}\n promotedLinks={promotedLinks}\n normalizeLinks={normalizeLinks}\n />\n </TabbableModeContext.Provider>\n </DiagramPanZoomContainer>\n {overviewConfig !== 'off' && (\n <DiagramOverview<K1, K2, D1, L>\n nodes={diagramNodes}\n nodeBounds={bounds}\n nodeAbsBounds={absBounds}\n expanded={expanded}\n contentBounds={contentBounds}\n componentWidth={width}\n componentHeight={height}\n layoutCenterX={layoutCenterX}\n layoutCenterY={layoutCenterY}\n zoom={zoomValue}\n minZoom={zoomProps.minZoom}\n panBounds={panBounds}\n layoutOutput={layoutOutput}\n overview={overviewConfig}\n isRtl={isRtl}\n panning={panProps.panning}\n panDirection={panProps.panDirection}\n onPan={panProps.panning !== 'off' ? otherProps.onPan : undefined}\n />\n )}\n </>\n ) : undefined}\n {textMeasureContent}\n {datatipContent}\n {contextMenuContent}\n {selectionContent}\n {toggleButtonContent}\n {dndContent}\n </div>\n );\n}\n","import { useSelection } from '#hooks/PRIVATE_useVisSelection';\nimport type {\n DiagramLinkData,\n DiagramNodeData,\n ItemInfo,\n PromotedLinkId,\n SelectedItemDetail\n} from '../diagram.types';\nimport { getNavigableInfo, serializeDiagramKey } from '../utils/diagramUtils';\nimport type { RefObject } from 'preact';\n\ntype SelectionProps<K1, K2, D1, D2> = {\n selectedIds: {\n nodes?: K1[];\n links?: K2[];\n promotedLinks?: PromotedLinkId<K1, D2>[];\n };\n selectionMode: 'none' | 'single' | 'multiple';\n nodeMap: {\n itemIdToDataMap: Map<K1, D1>;\n };\n linkMap: {\n itemIdToDataMap: Map<K2, D2>;\n };\n focusedItemInfo: ItemInfo<K1, K2, D2>;\n onSelectionChange?: (detail: SelectedItemDetail<K1, K2, D1, D2>) => void;\n rootRef: RefObject<HTMLDivElement>;\n promotedLinkMap: Map<string, PromotedLinkId<K1, D2>>;\n};\n\ntype EncodedNodeId = `N_${string}`;\ntype EncodedLinkId = `L_${string}`;\ntype EncodedPromotedLinkId = `P_${string}`;\n\nexport function useDiagramSelection<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>\n>({\n selectedIds,\n selectionMode,\n nodeMap,\n linkMap,\n focusedItemInfo,\n onSelectionChange,\n rootRef,\n promotedLinkMap\n}: SelectionProps<K1, K2, D1, D2>) {\n const nodeIdToDataMap = nodeMap.itemIdToDataMap;\n const nodeEncodedToIdMap = new Map<string, K1>();\n const linkEncodedToIdMap = new Map<string, K2>();\n\n const linkIdToDataMap = linkMap.itemIdToDataMap;\n const encodeNodeId = (id: K1) => {\n const encoded = `N_${serializeDiagramKey(id)}` as EncodedNodeId;\n nodeEncodedToIdMap.set(encoded, id);\n return encoded;\n };\n const decodeNodeId = (id: EncodedNodeId) => nodeEncodedToIdMap.get(id);\n const encodeLinkId = (id: K2) => {\n const encoded = `L_${serializeDiagramKey(id)}` as EncodedLinkId;\n linkEncodedToIdMap.set(encoded, id);\n return encoded;\n };\n const decodeLinkId = (id: EncodedLinkId) => linkEncodedToIdMap.get(id);\n const encodePromotedLinkId = (id: PromotedLinkId<K1, D2>) =>\n `P_${JSON.stringify(id)}` as EncodedPromotedLinkId;\n const decodePromotedLinkId = (id: EncodedPromotedLinkId) => JSON.parse(id.slice(2));\n\n const encodedNodesSelection = selectedIds.nodes ? selectedIds.nodes.map(encodeNodeId) : [];\n const encodedLinksSelection = selectedIds.links ? selectedIds.links.map(encodeLinkId) : [];\n const encodedPromotedLinksSelection = selectedIds.promotedLinks\n ? selectedIds.promotedLinks.map(encodePromotedLinkId)\n : [];\n const encodedSelection = [\n ...encodedNodesSelection,\n ...encodedLinksSelection,\n ...encodedPromotedLinksSelection\n ];\n const idExtracter = (event: Event) => {\n // return encodeNodeId(id) or encodeLinkId(id) depending on node or link selection or undefined if clicked on empty space\n const info =\n event.type === 'keyup'\n ? focusedItemInfo\n : getNavigableInfo<K1, K2, D2>(\n event.target as HTMLElement,\n promotedLinkMap,\n nodeIdToDataMap,\n linkIdToDataMap,\n rootRef\n );\n return info.id !== undefined\n ? info.type === 'node'\n ? encodeNodeId(info.id as K1)\n : info.type === 'link'\n ? encodeLinkId(info.id as K2)\n : encodePromotedLinkId(info.id)\n : undefined;\n };\n\n const onEncodedSelectionChange = (detail: {\n ids: (EncodedNodeId | EncodedLinkId | EncodedPromotedLinkId)[];\n }) => {\n const newNodeIds = detail.ids\n .filter((encId) => encId[0] === 'N')\n .map((encId) => decodeNodeId(encId as EncodedNodeId)!);\n const newLinkIds = detail.ids\n .filter((encId) => encId[0] === 'L')\n .map((encId) => decodeLinkId(encId as EncodedLinkId)!);\n\n const newPromotedLinkIds = detail.ids\n .filter((encId) => encId[0] === 'P')\n .map((encId) => decodePromotedLinkId(encId as EncodedPromotedLinkId)!);\n\n const newSelectedNodeIds = newNodeIds.filter(\n (id) => nodeIdToDataMap.get(id)?.selectable !== 'off'\n );\n const newSelectedLinkIds = newLinkIds.filter(\n (id) => linkIdToDataMap.get(id)?.selectable !== 'off'\n );\n\n const nodeData = newSelectedNodeIds.map((selectedId) => {\n return nodeIdToDataMap.get(selectedId);\n });\n const linkData = newSelectedLinkIds.map((selectedId) => {\n return linkIdToDataMap.get(selectedId);\n });\n return (\n onSelectionChange &&\n onSelectionChange({\n nodes: {\n ids: newSelectedNodeIds,\n data: nodeData\n },\n links: {\n ids: newSelectedLinkIds,\n data: linkData\n },\n promotedLinks: {\n ids: newPromotedLinkIds\n }\n })\n );\n };\n\n const getDataById = (id: EncodedNodeId | EncodedLinkId | EncodedPromotedLinkId) => {\n let data;\n if (id[0] === 'N') {\n const nodeId = decodeNodeId(id as EncodedNodeId)!;\n data = nodeMap.itemIdToDataMap.get(nodeId);\n } else if (id[0] === 'L') {\n const linkId = decodeLinkId(id as EncodedLinkId)!;\n data = linkMap.itemIdToDataMap.get(linkId);\n } else if (id[0] === 'P') {\n data = decodePromotedLinkId(id as EncodedPromotedLinkId)!;\n }\n return data;\n };\n\n const isKeyboardSelection = (event: KeyboardEvent) => {\n return event.key === '[' || event.key === ']';\n };\n\n const { selectionContent, selectionProps } = useSelection<\n EncodedNodeId | EncodedLinkId | EncodedPromotedLinkId,\n D1 | D2 | DiagramLinkData<string, K1>\n >({\n selection: encodedSelection,\n idExtracter,\n selectionMode,\n getDataById,\n onChange: onEncodedSelectionChange,\n isKeyboardSelection\n });\n\n return { selectionContent, selectionProps };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * Licensed under The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type { DiagramContextMenuContext, PromotedLinkId } from '../diagram.types';\n\nexport function getDiagramContextMenuContext<K1 extends string | number, K2 extends string | number, D1, D2>(\n nodesMap: Map<K1, D1>,\n linksMap: Map<K2, D2>,\n type: 'node' | 'link' | 'promotedLink' | 'background',\n idx?: K1 | K2 | PromotedLinkId<K1, D2> | string\n) {\n let context: DiagramContextMenuContext<K1, D1, D2>;\n\n if (type === 'node') {\n context = {\n data: nodesMap.get(idx as K1)!,\n type\n };\n } else if (type === 'link') {\n context = {\n data: linksMap.get(idx as K2)!,\n type\n };\n } else if (type === 'promotedLink') {\n context = {\n id: idx as PromotedLinkId<K1, D2>,\n type\n };\n } else {\n context = {\n type: 'background'\n };\n }\n\n return {\n context: context as DiagramContextMenuContext<K1, D1, D2>\n };\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n BaseDiagramWithDimensionsProps,\n Bounds,\n DiagramDropFeedback,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput,\n PromotedLinkId\n} from './diagram.types';\nimport { useMemo, useRef, useState } from 'preact/hooks';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { styles as VisDndStyles } from '#hooks/PRIVATE_useVisDnd/themes/VisDndStyles.css';\nimport { dropFeedbackStyles, noDataStyle, outerStyles } from './themes/DiagramStyles.css';\nimport { useDiagramDnd } from './hooks/useDiagramDnd';\n\nexport function EmptyBaseDiagramWithDimensions<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({\n width,\n height,\n selectionMode = 'none',\n selectedIds = {},\n onSelectionChange,\n ...otherProps\n}: BaseDiagramWithDimensionsProps<K1, K2, D1, D2, L>) {\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const rootRef = useRef<HTMLDivElement>(null);\n const [, setDatatipDisabled] = useState(false);\n const [dropFeedback, setDropFeedback] = useState<DiagramDropFeedback<K1, K2, D2>>();\n const nodesMap = useMemo(() => new Map<K1, D1>(), []);\n const linksMap = useMemo(() => new Map<K2, D2>(), []);\n const promotedLinks = useMemo(() => [] as PromotedLinkId<K1, D2>[], []);\n const nodeBounds = useMemo(() => new Map<K1, Bounds>(), []);\n const selectedNodeIds = useMemo(() => new Set<K1>(selectedIds.nodes ?? []), [selectedIds.nodes]);\n const { draggable, dndProps, dndContent } = useDiagramDnd<K1, K2, D1, D2>({\n onDrag: otherProps.onDrag,\n onDragStart: otherProps.onDragStart,\n onDragEnd: otherProps.onDragEnd,\n onDragEnter: otherProps.onDragEnter,\n onDragLeave: otherProps.onDragLeave,\n onDragOver: otherProps.onDragOver,\n onDrop: otherProps.onDrop,\n nodeDraggable: otherProps.nodeDraggable,\n rootRef,\n nodesMap,\n linksMap,\n promotedLinks,\n nodeBounds,\n selectedNodeIds,\n selectionMode,\n onSelectionChange,\n setDropFeedback,\n centerX: width / 2,\n centerY: height / 2,\n zoomValue: 1,\n width,\n height,\n setDatatipDisabled\n });\n const style = {\n width,\n height,\n cursor: dropFeedback?.accepted === false ? 'no-drop' : undefined\n };\n\n return (\n <div\n ref={rootRef}\n class={classNames([\n outerStyles,\n dropFeedback?.accepted === false ? VisDndStyles.dndRejectedStyle : undefined\n ])}\n {...dndProps}\n draggable={draggable}\n style={style}\n tabIndex={0}\n role=\"application\"\n aria-label={otherProps['aria-label']}\n aria-labelledby={otherProps['aria-labelledby']}\n aria-describedby={otherProps['aria-describedby']}>\n {dropFeedback?.type === 'background' ? (\n <div\n class={classNames([\n dropFeedbackStyles.backgroundDropFeedbackStyle,\n dropFeedback.accepted\n ? VisDndStyles.dndDragOverHTMLStyle\n : VisDndStyles.dndRejectedStyle\n ])}\n data-oj-private-drop-feedback={dropFeedback.accepted ? 'accept' : 'reject'}\n />\n ) : undefined}\n <div class={noDataStyle}>{translations.vis_noData()}</div>\n {dndContent}\n </div>\n );\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n BaseDiagramWithDimensionsProps,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput\n} from './diagram.types';\nimport { BaseDiagramWithDimensionsWithData } from './BaseDiagramWithDimensionsWithData';\nimport { EmptyBaseDiagramWithDimensions } from './EmptyBaseDiagramWithDimensions';\n\nexport function BaseDiagramWithDimensions<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>(props: BaseDiagramWithDimensionsProps<K1, K2, D1, D2, L>) {\n return props.nodes && props.nodes.length > 0 ? (\n <BaseDiagramWithDimensionsWithData {...props} />\n ) : (\n <EmptyBaseDiagramWithDimensions {...props} />\n );\n}\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport type {\n BaseDiagramProps,\n DiagramNodeData,\n DiagramLinkData,\n DiagramLayoutOutput\n} from './diagram.types';\nimport { TrackResizeContainer } from '#UNSAFE_TrackResizeContainer';\nimport { dimensionStyle } from './themes/DiagramStyles.css';\nimport { BaseDiagramWithDimensions } from './BaseDiagramWithDimensions';\n\n/**\n * Diagrams are used to display a set of nodes and the links between them.\n */\nexport function BaseDiagram<\n K1 extends string | number,\n K2 extends string | number,\n D1 extends DiagramNodeData<K1, D1>,\n D2 extends DiagramLinkData<K2, K1>,\n L extends DiagramLayoutOutput<K1, K2>\n>({ width, height, ...otherProps }: BaseDiagramProps<K1, K2, D1, D2, L>) {\n return (\n <TrackResizeContainer width={width} height={height} class={dimensionStyle}>\n {(width, height) => (\n <BaseDiagramWithDimensions width={width} height={height} {...otherProps} />\n )}\n </TrackResizeContainer>\n );\n}\n"],"names":["hasFiniteRect","bounds","Number","isFinite","x","y","width","height","serializeDiagramKey","key","getMapEntryBySerializedKey","map","serializedKey","prefix","slice","value","deserializeDiagramKey","get","undefined","queryElementByAttributeValue","root","attribute","querySelector","replace","escapeAttributeValueForSelector","queryElementBySerializedDiagramKey","constructLayoutJSON","nodeItems","linkItems","promotedLinks","dimensions","zoom","nodeIdToParentMap","rootRef","getTextDimensions","labelDims","Map","nodeValues","Array","from","values","linkValues","forEach","nodes","getNodeLabelProps","label","fontProps","_getFontProps","labelStyle","set","id","getLabelProps","linkKeys","keys","item","layoutJSON","getNodeDimensions","data","getLabelDimensions","getContainerId","startNode","endNode","getCommonAncestorId","getRelativeNodeBounds","containerId","absPos","getAbsoluteNodePosition","getPromotedLinks","componentSize","normalizeBounds","getAbsoluteLinkBounds","itemId","referenceId","isPromoted","current","linkElement","nodeContainer","getPromotedString","dims","linkBoundingRect","getBoundingClientRect","diagramBoundingRect","getBounds","links","nodeBounds","linkDimensions","promotedLinkDimensions","topId","leftId","minX","Infinity","minY","maxX","maxY","i","length","nodeId","nodeMinX","nodeMinY","linkMinX","linkMinY","linkMaxX","linkMaxY","linkId","topBounds","leftBounds","promotedLink","contentWidth","contentHeight","nodeElement","nodeBoundingRect","nodeContainerRect","deconstructLayoutJSON","nodeData","linkData","positions","nodeLabelPos","linkLabelPos","findPoints","link","nodePoints","output","node","position","mergeDimensions","nodeAbsBounds","point","absPoint","hasFinitePoint","hasFiniteSize","hasFiniteAbsPoint","isEqualBounds","bounds1","bounds2","size","equal","b2Value","Math","abs","_createItemMap","items","itemIdToDataMap","itemIdToIndexMap","itemIndexToIdMap","itemIdToParentMap","allContainerNodes","expanded","allVisibleNodes","allVisibleNodesData","parentId","parentIndex","index","push","containsKey","getDimensionsFromBounds","getLabelBounds","isRTL","labelPos","getLabelPosition","rotationAngle","rotationPoint","angle","topLeft","getCoordsRelToRotPoint","topRight","bottomLeft","bottomRight","points","getBoundsFromPoints","rotatePoint","pos","labelPoint","rotPoint","cos","sin","positionProps","hAlign","vAlign","isEqualItem","item1","item2","type","isSamePromotedLinkId","isPromotedLinkId","id1","id2","includesPromotedLinkId","ids","some","candidate","getNavigableInfo","element","promotedLinkMap","nodesMap","linksMap","rootElementRef","navigableId","elem","dataset","entry","parentElement","getItemAriaLabel","translations","supportsSelection","states","accessibleLabel","generateAriaLabel","isSelected","isIndirect","isExpanded","isCollapsed","containsControls","styles","fontFamily","fontSize","fontStyle","fontWeight","startId","endId","startAnc","_getAncestorIds","endAnc","indexOf","getLinksForNode","frontLinks","backLinks","frontPromotedLinks","backPromotedLinks","ancestors","anc","containerLinksReady","containerLinks","layoutOutput","changeExpanded","removeKey","addKey","firstVisibleAncestor","collapsed","isDescendant","chId","DiagramLabel","text","labelBorderStyle","labelStyles","labelPosition","labelRotation","rotation","getLabelRotation","_jsx","class","classNames","borderColor","style","top","left","children","NODE_ITEM_SELECTOR","LINK_ITEM_SELECTOR","PROMOTED_LINK_ITEM_SELECTOR","ROVING_TABINDEX_ATTR","ROVING_RESTORE_PREFIX","FOCUSABLE_DESCENDANT_SELECTOR","join","getFocusScope","contentElement","focusScopeSelector","HTMLElement","SVGElement","focusScopeCandidate","getRestorableFocusIds","rootElement","activeElement","contains","activeElementId","activeCustomElementId","rovingTabIndexId","getAttribute","matches","focusDiagramItemContent","focusAction","restoreElementId","restoreCustomElementId","focusScope","tabbables","allTabbableElements","getDiagramItemTabbables","restoreId","restoreTarget","startsWith","ownerDocument","getElementById","focus","preventScroll","containFocusWithinDiagramItem","event","firstTabbable","lastTabbable","isActiveWithinScope","shiftKey","preventDefault","stopPropagation","DiagramNodeElement","state","activeId","nodeRenderer","onNodeSizeChanged","isDimmed","content","labelDimensions","dropFeedback","nodeStyles","dimmedItemStyle","nodeDropFeedbackStyle","itemStyles","useTranslationBundle","ref","useRef","contentRef","tabbableFocusStateRef","tabbableModeFocusAction","tabbableModeRestoreElementId","tabbableModeRestoreCustomElementId","handleTabbableFocusFailure","useCallback","onTabbableModeFocusFailure","focusOwner","autoFocusRef","tabbableFocusState","focusTrackerBaseStyle","useLayoutEffect","isTabbable","frameId","window","requestAnimationFrame","cancelAnimationFrame","optionsRef","box","useResizeObserver","boxSize","isArray","borderBoxSize","inlineSize","contentRect","blockSize","nodePos","direction","useUser","hasLabel","serializedId","expander","jsx","buttonStyle","EmbeddedIconButton","Minus","Plus","context","childContext","_jsxs","accepted","VisDndStyles","dndRejectedStyle","role","tabIndex","isFocused","isHovered","dndDragOverHTMLStyle","TabbableModeContext","Provider","FocusTrap","isDisabled","restoreFocusRef","layerStyles","isSameBounds","getSvgDropFeedbackBounds","getBBox","DiagramLinkElement","linkRenderer","onLinkSizeChanged","linkStyles","svgDropFeedbackStyle","dropFeedbackBounds","setDropFeedbackBounds","useState","nextBounds","handleKeyDownCapture","jsxs","onKeyDownCapture","dndDragOverSvgStyle","nextZoom","minZoom","maxZoom","onZoomChange","newZoom","constrainZoom","zoomValue","getZoomToFitZoom","contentBounds","zoomX","zoomY","min","max","zoomAndCenterItemFromInfo","info","linkIdToDataMap","totalBounds","startNodeBounds","endNodeBounds","cX","cY","centerX","centerY","getPanZoomToCenterNode","DiagramLabelLayer","itemProps","DiagramLinkLayer","combinedNodeBounds","linkLabelPositions","linkLayerStyle","overflow","isTabbableOwner","isTabbableMode","tabbableModeItemId","selectedLinkIds","includes","focusedId","hoveredId","highlightedNodeIds","highlightedLinkIds","highlightedPromotedLinkIds","DiagramPromotedLinkElement","stringId","num_links","diagram_promotedLinks","toString","diagram_promotedLink","DiagramPromotedLinkLayer","selectedPromotedLinkIds","DiagramNodeLayer","onPromotedLinkSizeChanged","nodeLabelPositions","nodeBoundsRef","normalizeLinks","selectedNodeIds","child","linkDims","isContainerReady","childContent","getContent","nodeFullBounds","DiagramLayers","useTabbableMode","updatedStates","_Fragment","PAN_EPSILON","constrainValueToBounds","constrainPanToBounds","nextPan","panBounds","panX","panY","pan","previousPan","panDirection","onPanChange","newPan","constrainPan","isPanChanged","center","panXYToCenterXY","getPanBounds","dWidth","dHeight","elemBounds","initPanZoomState","panType","zoomRatio","minZoomX","minZoomY","initZoom","initCenterX","initCenterY","dx","dy","boundsX","boundsY","centerXYToPanXY","OVERVIEW_GAP","clamp","roundPixel","round","roundPixelSize","getChildBounds","getOverviewNodeBounds","offsetX","offsetY","overviewNodeBounds","childNodes","isExpandedContainer","overviewBounds","childBounds","childOffsetX","childOffsetY","getMeasuredOverviewNodeBounds","DiagramOverview","componentWidth","componentHeight","layoutCenterX","layoutCenterY","overview","isRtl","panning","onPan","isOverviewReady","overviewSize","maxWidth","maxHeight","getOverviewSize","viewportWidth","viewportHeight","viewportCenterX","viewportCenterY","panMinCenter","panMaxCenter","viewportMinX","viewportMinY","viewportMaxX","viewportMaxY","scaledOverviewRatio","scaledOverviewWidth","scaledOverviewHeight","overviewCanvasX","overviewCanvasY","windowWidth","windowHeight","minWindowX","minWindowY","maxWindowX","maxWindowY","windowX","windowY","startLeft","endLeft","customContent","renderer","measuredNodeBounds","originX","originY","absBounds","measuredBounds","getMeasuredLayoutBounds","layoutOverviewNodeBounds","measuredOverviewNodeBounds","measuredBoundsById","mergeOverviewNodeBounds","stopDiagramPan","overviewStyles","overviewContainerStyle","overviewContentStyle","overviewViewportBackgroundStyle","toOverviewX","toOverviewY","roundedX","roundedY","roundedWidth","roundedHeight","overviewContainerNodeStyle","radius","cx","cy","r","overviewNodeStyle","overviewOverlayStyle","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","OverviewSlidingWindow","isInteractive","orientation","onWindowDimsChange","deltaX","deltaY","nextWindowX","nextWindowY","clampedX","clampedY","panToWindow","DiagramPanZoomContainer","panValues","panZoomStyles","transform","getNavigableLinksForNodeId","listOfLinks","_getClockwiseAngle","currNode","oppositeNode","p1","_getNodeCenter","p2","atan2","PI","_getNodesDistance","sqrt","pow","_getLinkDirection","nodeBB","calcDistanceAngleWeighted","objectBB","currentBB","optimalAngle1","optimalAngle2","objCenterX","objCenterY","curCenterX","curCenterY","x_dist","y_dist","distance","isValidDestination","objBB","curBB","compareCenters","_areEqualWithinTolerance","calcInContact","objRect","curRect","_isVerticallyAligned","_isHorizontallyAligned","rect1","rect2","a","b","_anglesAreEqualWithinTolerance","a1","a2","res","useDiagramNavigation","nodeIdToDataMap","currentKeyboardFocusNode","nodeBoundsById","getNextNavigableNode","listOfObjects","currBB","object","inContact","nextObject","nextDistance","MAX_VALUE","nextInContact","hasFoundCurrent","objBounds","currBounds","getNextNavigableLink","listOfNodes","currentLink","allLinks","keyboardFocusNode","linksWithSortingAttributes","linkDetail","addSortingAttributes","sort","link1","link2","linkAngle1","linkDistance1","linkDirection1","linkAngle2","linkDistance2","linkDirection2","bForward","navigateFromNodeToLink","adjLinks","currNodeBB","currNodeBBCenterX","nodeCenterX","altKey","code","navigateFromLinkToNode","startNodeBB","endNodeBB","startNodeCenterX","endNodeCenterX","DIAGRAM_ITEM_SELECTOR","useEvents","touchResponse","initNode","navigationNodeBounds","onItemHover","onItemFocus","kbPanCallback","kbZoomCallback","onExpandedChange","shouldIgnoreTransientBlur","focusedItemInfo","setfocusedItemInfo","hoveredItemInfo","sethoveredItemInfo","getNearestVisibleNodeId","currentNodeId","has","getVisibleFallbackItemInfo","itemInfo","nearestVisibleNodeId","promotedLinkId","resolvedFocusedItemInfo","normalizeKey","isElementFocusVisible","syncFocusedItemInfoFromTarget","target","currentTarget","Element","itemTarget","closest","isFocusVisible","syncedItemInfo","isCurrent","updatefocusedItemInfo","hoverHandlers","useVisHover","detail","getRandomId","handleKeyboardInput","useEffect","fallbackItemInfo","hasActiveDescendant","onContextMenuDismissed","gesture","eventsProps","mergeProps","onKeyUp","onKeyDown","tabbableModeActive","hasInternalFocus","eventConsumed","currentFocusedItemInfo","isChangeItemType","nextItemInfo","isNavigationEvent","currentItemInfo","parent","navigableNodes","itemDetail","getLinkDetailFromInfo","handleKeyboardNavigationEvent","dPan","dZoom","ctrlKey","nZoom","nPan","metaKey","newExpanded","getChildInfo","cancelEvent","onBlur","relatedTarget","buttonId","expCollapseButtonId","onFocus","useDiagramDatatip","datatip","focusedItemBoundsRef","panState","hoveredItem","datatipC","focusedItem","isPointerActive","getDatatipContent","elementBounds","offset","calculateOffset","globalThis","console","log","focusedItemBounds","datatipContent","datatipProps","useDatatip","placement","anchor","usePointerGesture","captureTargetRef","numPointers","onPointerGestureDown","onPointerGestureMove","onPointerGestureEnd","onExtraneousPointerDown","activePointers","e","findIndex","pointerEvent","pointerId","pointers","splice","safeSetPointerCapture","onPointerLeave","useDragPan","panProps","onDragPanStart","onDragPanEnd","prevPanState","initialPanState","dragProps","draggableRegion","onDragStart","onDragMove","onDragEnd","inactiveState","isDragging","x0","y0","regionOffsetX","regionOffsetY","dragState","handlePointerEvent","cb","pageX","pageY","originalEvent","button","region","xMin","xMax","yMin","yMax","inDraggableRegion","getRegionOffset","useDrag","getDistance","usePinchZoom","zooming","onZoom","pinchProps","onPinchZoomStart","onPinchZoomChange","onPinchZoomEnd","origin","prevDistance","reset","pointer1","pointer2","getMidpoint","delta","usePinch","usePanZoom","props","cursor","setCursor","normalizedContentBounds","zoomProps","zoomTofitZoom","getZoomProps","prevPanBoundsInputs","isDeviceTouch","isTouch","plotArea","showPanButton","dragModeOptions","isZoomScroll","plotAreaSpace","showZoomButton","showSelectButton","toggleButtonContent","userDragMode","useVisDragModeControls","contentX","contentY","getPanProps","panCenterX","panCenterY","panBoundsInputs","previousPanBoundsInputs","currentPan","constrainedPan","dragPanProps","panOnZoom","focusX","focusY","oldPan","nextPanBounds","previousPanAtNewZoom","wheelZoomProps","onPanOnZoom","onWheel","onWheelCallback","deltaMode","DOM_DELTA_PIXEL","DOM_DELTA_LINE","DOM_DELTA_PAGE","getNormalizedDelta","clientX","clientY","useWheel","constrainedZoom","useWheelZoom","pinchZoomProps","panZoomProps","DEBUG_PREFIX","describeElement","dataNodeId","dataLinkId","dataPromotedLinkId","tagName","ariaLabel","textContent","trim","debugLog","message","details","useDiagramTabbableMode","isTabbableModeRef","shouldIgnoreTransientBlurRef","nodeIdsByAttr","linkIdsByAttr","promotedLinkIdsByAttr","visibility","setTabbableModeFocusAction","restoreRequestCount","setRestoreRequestCount","shouldRestoreDiagramFocusRef","previousInnerFocusIdRef","previousCustomFocusIdRef","shouldRestoreItemOwnerFocusRef","shouldRestoreTransientItemOwnerFocusRef","shouldRestoreTabbableContentRef","previousVisibilityRef","prevIsTabbableModeRef","shouldExitTabbableModeOnRootFocusRef","shouldFinalizeRootRestoreRef","transientBlurTimeoutRef","rootEntryFirstFocusFrameRef","pendingFallbackFocusOwnerRef","pendingFallbackItemRef","pendingRestoreChildFocusRef","hasRetriedOwnerChildFocusRef","clearTransientBlurIgnore","clearTimeout","armTransientBlurIgnore","setTimeout","clearStoredFocusRestoreState","hasStoredFocusRestoreTarget","captureFocusRestoreState","document","isDiagramRootFocused","shouldRestoreFocus","hadStoredRestoreTarget","hasNextRestoreTarget","shouldRestoreItemOwnerFocus","getTabbableItemFromElement","promotedLinkElement","body","getCurrentTabbableItemElement","selector","attrName","attrValue","querySelectorAll","isSameTabbableItem","focusedTabbableItem","useMemo","isCurrentTabbableItem","rawTabbableSetProps","getCurrentTabbableKey","setCurrentTabbableKey","useTabbableModeSet","currentTabbableItem","captureFocusRestoreStateFromTarget","restorableTarget","focusedItemElement","targetItem","hasRestoreTarget","syncTabbableModeFromTarget","enteredInnerFocus","handleInnerFocusKeyDownCapture","wasCurrentTabbable","tabbableSetProps","count","shouldExitTabbableModeOnRootFocus","currentActiveElement","exitedTabbableMode","shouldFocusOwner","fallbackItem","ownerElement","focusTarget","scheduledFocusTarget","requestFocusRestore","restoreDiagramRootFocus","isConnected","isFocusOutsideDiagram","shouldRestoreOwnerFocus","shouldRestoreDiagramFocus","hasStoredRestoreTarget","shouldRestoreTransientItemOwnerFocus","shouldFinalizeRootRestore","previousInnerFocusId","previousCustomFocusId","hasStoredInnerRestoreTarget","currentRootElement","DROP_OFFSET_X_DATA_TYPE","DROP_OFFSET_Y_DATA_TYPE","getClientCoordinate","fallback","getSafeZoom","getClosestElement","Node","getElementBounds","rect","right","bottom","getOutlineOverflow","computedStyle","getComputedStyle","outlineWidth","parseFloat","outlineOffset","getVisualBounds","rootBounds","rootOverflow","stack","currentElement","pop","getDiagramPointerPosition","safePanX","safePanY","safeZoom","rootRect","getMinimumNodePosition","getDiagramDragContext","nodeDraggable","nodeEntry","validDraggedNodes","filter","nodeOffset","getDiagramDropContext","pointerPosition","dataTransfer","getData","nodeRect","nodeX","nodeY","linkEntry","promotedLinkEntry","find","getDragImageElements","nodeElementMap","nodeElements","visualBounds","minLeft","minTop","maxRight","maxBottom","container","createElement","pointerEvents","visual","wrapper","clone","cloneNode","source","sourceElements","cloneElements","sourceElement","cloneElement","outlineStyle","outlineColor","spread","existingBoxShadow","boxShadow","outlineShadow","outline","applyOutlineAsBoxShadow","margin","appendChild","image","offSetX","offSetY","setDiagramNativeDropEffect","dropEffect","acceptedDropEffect","effectAllowed","getAcceptedDiagramDropEffect","useDiagramDnd","onDrag","onDragEnter","onDragLeave","onDragOver","onDrop","selectionMode","onSelectionChange","setDropFeedback","setDatatipDisabled","draggable","isDiagramDraggable","getDropFeedback","updateDropFeedback","feedback","feedback1","feedback2","isSameDropFeedback","dropProps","useDnd","getDragContext","getDropContext","getDragImage","draggedNodeBounds","contentMinX","contentMinY","setData","String","setDiagramDropOffset","onPreDndStart","selectableNodes","selectable","every","showDropEffect","showRejectedDropEffect","clearDropEffect","dndProps","dndContent","emptyKeys","all","Set","defaultOverviewConfig","isFiniteDimension","BaseDiagramWithDimensionsWithData","selectedIds","layout","highlightedIds","contextMenuConfig","otherProps","setBounds","setAbsBounds","combinedLabelBounds","setCombinedLabelBounds","diagramNodes","nodeMap","createNodesMap","navigationBounds","idsByAttr","_","diagramLinks","newLinks","filterLinksWithNoStartOrEndNodes","linkMap","createLinksMap","resizeThrottling","newDimensions","textMeasureContent","useTextDimensions","linkDimsChanged","linkRerenderNeeded","nodeLabelPosRef","linkLabelPosRef","setLayoutOutput","linkToPromotedMap","promotedToLinkMap","startVisible","endVisible","subLinks","finalPromoted","createPromotedLinksMap","labelBounds","getContentBounds","contentRelativeCenterX","contentRelativeCenterY","touchResponseStyle","useVisTouchResponse","supportsTouchDragGestures","setVisibility","selectionProps","selectionContent","nodeEncodedToIdMap","linkEncodedToIdMap","encodeNodeId","encoded","decodeNodeId","encodeLinkId","decodeLinkId","encodePromotedLinkId","JSON","stringify","decodePromotedLinkId","parse","encodedSelection","useSelection","selection","idExtracter","getDataById","onChange","newNodeIds","encId","newLinkIds","newPromotedLinkIds","newSelectedNodeIds","newSelectedLinkIds","selectedId","isKeyboardSelection","useDiagramSelection","linkIdToIndexMap","next","liveBounds","startNB","endNB","startNCenter","endNCenter","getFocusedItemBounds","datatipDisabled","datatipAriaDescribedby","expandRerender","hasMountedExpandedRef","overviewConfig","contextMenuContent","contextMenuProps","useContextMenu","onContextMenuHandler","idx","elementType","getDiagramContextMenuContext","contextMenuOptions","useDiagramContextMenu","mergedEventProps","captureTabbableModeInteractionFocus","handlePointerDownCapture","handleFocusCapture","currentRoot","addEventListener","removeEventListener","frame","nodePositions","outerStyles","merge","l","onPointerDownCapture","dropFeedbackStyles","backgroundDropFeedbackStyle","nodeWidth","nodeHeight","nextLayoutOutput","nodeBound","getAllLabelBounds","nodesWithLinks","rerender","linkPositionChanged","linkWidth","linkHeight","EmptyBaseDiagramWithDimensions","noDataStyle","vis_noData","BaseDiagramWithDimensions","TrackResizeContainer","dimensionStyle"],"mappings":"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"}