@payloadcms/next 3.74.0-canary.6 → 3.74.0-internal-debug.1b84a48

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 (470) hide show
  1. package/dist/auth/login.d.ts +9 -12
  2. package/dist/auth/login.d.ts.map +1 -1
  3. package/dist/auth/login.js +52 -58
  4. package/dist/auth/login.js.map +1 -1
  5. package/dist/auth/logout.d.ts +2 -2
  6. package/dist/auth/logout.d.ts.map +1 -1
  7. package/dist/auth/logout.js +39 -44
  8. package/dist/auth/logout.js.map +1 -1
  9. package/dist/auth/refresh.d.ts +2 -1
  10. package/dist/auth/refresh.d.ts.map +1 -1
  11. package/dist/auth/refresh.js +45 -47
  12. package/dist/auth/refresh.js.map +1 -1
  13. package/dist/cjs/withPayload.cjs +65 -24
  14. package/dist/cjs/withPayload.cjs.map +2 -2
  15. package/dist/config.js +1 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/elements/DocumentHeader/Tabs/ShouldRenderTabs.js +9 -15
  18. package/dist/elements/DocumentHeader/Tabs/ShouldRenderTabs.js.map +1 -1
  19. package/dist/elements/DocumentHeader/Tabs/Tab/TabLink.js +40 -71
  20. package/dist/elements/DocumentHeader/Tabs/Tab/TabLink.js.map +1 -1
  21. package/dist/elements/DocumentHeader/Tabs/Tab/index.js +65 -59
  22. package/dist/elements/DocumentHeader/Tabs/Tab/index.js.map +1 -1
  23. package/dist/elements/DocumentHeader/Tabs/Tab/index.scss +38 -0
  24. package/dist/elements/DocumentHeader/Tabs/index.js +80 -70
  25. package/dist/elements/DocumentHeader/Tabs/index.js.map +1 -1
  26. package/dist/elements/DocumentHeader/Tabs/index.scss +54 -0
  27. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js +16 -23
  28. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js.map +1 -1
  29. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.scss +10 -0
  30. package/dist/elements/DocumentHeader/Tabs/tabs/index.js +61 -69
  31. package/dist/elements/DocumentHeader/Tabs/tabs/index.js.map +1 -1
  32. package/dist/elements/DocumentHeader/index.js +48 -28
  33. package/dist/elements/DocumentHeader/index.js.map +1 -1
  34. package/dist/elements/DocumentHeader/index.scss +64 -0
  35. package/dist/elements/FormHeader/index.js +30 -16
  36. package/dist/elements/FormHeader/index.js.map +1 -1
  37. package/dist/elements/FormHeader/index.scss +8 -0
  38. package/dist/elements/Logo/index.js +19 -34
  39. package/dist/elements/Logo/index.js.map +1 -1
  40. package/dist/elements/Nav/NavHamburger/index.js +23 -44
  41. package/dist/elements/Nav/NavHamburger/index.js.map +1 -1
  42. package/dist/elements/Nav/NavWrapper/index.js +28 -54
  43. package/dist/elements/Nav/NavWrapper/index.js.map +1 -1
  44. package/dist/elements/Nav/NavWrapper/index.scss +27 -0
  45. package/dist/elements/Nav/SettingsMenuButton/index.js +33 -39
  46. package/dist/elements/Nav/SettingsMenuButton/index.js.map +1 -1
  47. package/dist/elements/Nav/SettingsMenuButton/index.scss +11 -0
  48. package/dist/elements/Nav/getNavPrefs.js +27 -22
  49. package/dist/elements/Nav/getNavPrefs.js.map +1 -1
  50. package/dist/elements/Nav/index.client.js +97 -118
  51. package/dist/elements/Nav/index.client.js.map +1 -1
  52. package/dist/elements/Nav/index.js +148 -127
  53. package/dist/elements/Nav/index.js.map +1 -1
  54. package/dist/elements/Nav/index.scss +173 -0
  55. package/dist/esbuildEntry.d.ts +5 -0
  56. package/dist/esbuildEntry.d.ts.map +1 -0
  57. package/dist/esbuildEntry.js +6 -0
  58. package/dist/esbuildEntry.js.map +1 -0
  59. package/dist/exports/auth.js +1 -0
  60. package/dist/exports/auth.js.map +1 -1
  61. package/dist/exports/client.js +1 -1
  62. package/dist/exports/client.js.map +1 -1
  63. package/dist/exports/layouts.js +1 -0
  64. package/dist/exports/layouts.js.map +1 -1
  65. package/dist/exports/routes.js +1 -0
  66. package/dist/exports/routes.js.map +1 -1
  67. package/dist/exports/rsc.js +1 -0
  68. package/dist/exports/rsc.js.map +1 -1
  69. package/dist/exports/templates.js +1 -0
  70. package/dist/exports/templates.js.map +1 -1
  71. package/dist/exports/utilities.js +7 -12
  72. package/dist/exports/utilities.js.map +1 -1
  73. package/dist/exports/views.js +1 -0
  74. package/dist/exports/views.js.map +1 -1
  75. package/dist/index.js +1 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/layouts/Root/NestProviders.js +21 -20
  78. package/dist/layouts/Root/NestProviders.js.map +1 -1
  79. package/dist/layouts/Root/checkDependencies.js +49 -41
  80. package/dist/layouts/Root/checkDependencies.js.map +1 -1
  81. package/dist/layouts/Root/index.js +128 -103
  82. package/dist/layouts/Root/index.js.map +1 -1
  83. package/dist/prod/styles.css +5 -1
  84. package/dist/routes/graphql/handler.js +114 -122
  85. package/dist/routes/graphql/handler.js.map +1 -1
  86. package/dist/routes/graphql/index.js +1 -0
  87. package/dist/routes/graphql/index.js.map +1 -1
  88. package/dist/routes/graphql/playground.js +28 -27
  89. package/dist/routes/graphql/playground.js.map +1 -1
  90. package/dist/routes/index.js +1 -0
  91. package/dist/routes/index.js.map +1 -1
  92. package/dist/routes/rest/index.js +23 -22
  93. package/dist/routes/rest/index.js.map +1 -1
  94. package/dist/routes/rest/og/image.js +103 -79
  95. package/dist/routes/rest/og/image.js.map +1 -1
  96. package/dist/routes/rest/og/index.js +59 -54
  97. package/dist/routes/rest/og/index.js.map +1 -1
  98. package/dist/templates/Default/NavHamburger/index.js +12 -20
  99. package/dist/templates/Default/NavHamburger/index.js.map +1 -1
  100. package/dist/templates/Default/Wrapper/index.js +20 -44
  101. package/dist/templates/Default/Wrapper/index.js.map +1 -1
  102. package/dist/templates/Default/Wrapper/index.scss +58 -0
  103. package/dist/templates/Default/index.js +147 -116
  104. package/dist/templates/Default/index.js.map +1 -1
  105. package/dist/templates/Default/index.scss +79 -0
  106. package/dist/templates/Minimal/index.js +26 -17
  107. package/dist/templates/Minimal/index.js.map +1 -1
  108. package/dist/templates/Minimal/index.scss +30 -0
  109. package/dist/utilities/getExistingAuthToken.js +3 -2
  110. package/dist/utilities/getExistingAuthToken.js.map +1 -1
  111. package/dist/utilities/getNextRequestI18n.js +12 -13
  112. package/dist/utilities/getNextRequestI18n.js.map +1 -1
  113. package/dist/utilities/getPayloadHMR.js +5 -5
  114. package/dist/utilities/getPayloadHMR.js.map +1 -1
  115. package/dist/utilities/getPreferences.js +27 -22
  116. package/dist/utilities/getPreferences.js.map +1 -1
  117. package/dist/utilities/getRequestLocale.js +13 -14
  118. package/dist/utilities/getRequestLocale.js.map +1 -1
  119. package/dist/utilities/getRequestTheme.js +19 -19
  120. package/dist/utilities/getRequestTheme.js.map +1 -1
  121. package/dist/utilities/getRouteWithoutAdmin.js +3 -5
  122. package/dist/utilities/getRouteWithoutAdmin.js.map +1 -1
  123. package/dist/utilities/handleAuthRedirect.js +22 -36
  124. package/dist/utilities/handleAuthRedirect.js.map +1 -1
  125. package/dist/utilities/handleServerFunctions.d.ts.map +1 -1
  126. package/dist/utilities/handleServerFunctions.js +33 -41
  127. package/dist/utilities/handleServerFunctions.js.map +1 -1
  128. package/dist/utilities/initReq.d.ts +2 -13
  129. package/dist/utilities/initReq.d.ts.map +1 -1
  130. package/dist/utilities/initReq.js +78 -96
  131. package/dist/utilities/initReq.js.map +1 -1
  132. package/dist/utilities/isCustomAdminView.js +22 -26
  133. package/dist/utilities/isCustomAdminView.js.map +1 -1
  134. package/dist/utilities/isPublicAdminRoute.js +26 -20
  135. package/dist/utilities/isPublicAdminRoute.js.map +1 -1
  136. package/dist/utilities/meta.js +68 -63
  137. package/dist/utilities/meta.js.map +1 -1
  138. package/dist/utilities/selectiveCache.js +25 -26
  139. package/dist/utilities/selectiveCache.js.map +1 -1
  140. package/dist/utilities/setPayloadAuthCookie.js +19 -22
  141. package/dist/utilities/setPayloadAuthCookie.js.map +1 -1
  142. package/dist/utilities/slugify.js +24 -33
  143. package/dist/utilities/slugify.js.map +1 -1
  144. package/dist/utilities/timestamp.js +7 -6
  145. package/dist/utilities/timestamp.js.map +1 -1
  146. package/dist/views/API/LocaleSelector/index.js +17 -39
  147. package/dist/views/API/LocaleSelector/index.js.map +1 -1
  148. package/dist/views/API/RenderJSON/index.js +171 -126
  149. package/dist/views/API/RenderJSON/index.js.map +1 -1
  150. package/dist/views/API/RenderJSON/index.scss +129 -0
  151. package/dist/views/API/index.client.js +291 -199
  152. package/dist/views/API/index.client.js.map +1 -1
  153. package/dist/views/API/index.js +7 -2
  154. package/dist/views/API/index.js.map +1 -1
  155. package/dist/views/API/index.scss +119 -0
  156. package/dist/views/API/metadata.js +18 -23
  157. package/dist/views/API/metadata.js.map +1 -1
  158. package/dist/views/Account/ResetPreferences/index.js +78 -102
  159. package/dist/views/Account/ResetPreferences/index.js.map +1 -1
  160. package/dist/views/Account/Settings/LanguageSelector.js +18 -47
  161. package/dist/views/Account/Settings/LanguageSelector.js.map +1 -1
  162. package/dist/views/Account/Settings/index.js +60 -25
  163. package/dist/views/Account/Settings/index.js.map +1 -1
  164. package/dist/views/Account/Settings/index.scss +48 -0
  165. package/dist/views/Account/ToggleTheme/index.js +38 -55
  166. package/dist/views/Account/ToggleTheme/index.js.map +1 -1
  167. package/dist/views/Account/index.client.js +16 -32
  168. package/dist/views/Account/index.client.js.map +1 -1
  169. package/dist/views/Account/index.js +147 -158
  170. package/dist/views/Account/index.js.map +1 -1
  171. package/dist/views/Account/metadata.js +8 -12
  172. package/dist/views/Account/metadata.js.map +1 -1
  173. package/dist/views/BrowseByFolder/buildView.js +138 -157
  174. package/dist/views/BrowseByFolder/buildView.js.map +1 -1
  175. package/dist/views/BrowseByFolder/index.js +16 -16
  176. package/dist/views/BrowseByFolder/index.js.map +1 -1
  177. package/dist/views/BrowseByFolder/metadata.js +13 -15
  178. package/dist/views/BrowseByFolder/metadata.js.map +1 -1
  179. package/dist/views/CollectionFolders/buildView.js +122 -142
  180. package/dist/views/CollectionFolders/buildView.js.map +1 -1
  181. package/dist/views/CollectionFolders/index.js +16 -16
  182. package/dist/views/CollectionFolders/index.js.map +1 -1
  183. package/dist/views/CollectionFolders/metadata.js +18 -21
  184. package/dist/views/CollectionFolders/metadata.js.map +1 -1
  185. package/dist/views/CollectionFolders/renderFolderViewSlots.js +58 -61
  186. package/dist/views/CollectionFolders/renderFolderViewSlots.js.map +1 -1
  187. package/dist/views/CollectionTrash/index.js +17 -17
  188. package/dist/views/CollectionTrash/index.js.map +1 -1
  189. package/dist/views/CollectionTrash/metadata.js +18 -21
  190. package/dist/views/CollectionTrash/metadata.js.map +1 -1
  191. package/dist/views/CreateFirstUser/index.client.js +117 -103
  192. package/dist/views/CreateFirstUser/index.client.js.map +1 -1
  193. package/dist/views/CreateFirstUser/index.js +87 -81
  194. package/dist/views/CreateFirstUser/index.js.map +1 -1
  195. package/dist/views/CreateFirstUser/index.scss +21 -0
  196. package/dist/views/CreateFirstUser/metadata.js +8 -12
  197. package/dist/views/CreateFirstUser/metadata.js.map +1 -1
  198. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js +147 -138
  199. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js.map +1 -1
  200. package/dist/views/Dashboard/Default/ModularDashboard/index.client.js +423 -405
  201. package/dist/views/Dashboard/Default/ModularDashboard/index.client.js.map +1 -1
  202. package/dist/views/Dashboard/Default/ModularDashboard/index.d.ts.map +1 -1
  203. package/dist/views/Dashboard/Default/ModularDashboard/index.js +75 -75
  204. package/dist/views/Dashboard/Default/ModularDashboard/index.js.map +1 -1
  205. package/dist/views/Dashboard/Default/ModularDashboard/index.scss +316 -0
  206. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js +62 -89
  207. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js.map +1 -1
  208. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.d.ts.map +1 -1
  209. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js +43 -47
  210. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js.map +1 -1
  211. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.d.ts.map +1 -1
  212. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js +67 -65
  213. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js.map +1 -1
  214. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js +164 -147
  215. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js.map +1 -1
  216. package/dist/views/Dashboard/Default/ModularDashboard/utils/collisionDetection.js +31 -30
  217. package/dist/views/Dashboard/Default/ModularDashboard/utils/collisionDetection.js.map +1 -1
  218. package/dist/views/Dashboard/Default/ModularDashboard/utils/sensors.js +223 -229
  219. package/dist/views/Dashboard/Default/ModularDashboard/utils/sensors.js.map +1 -1
  220. package/dist/views/Dashboard/Default/index.js +59 -45
  221. package/dist/views/Dashboard/Default/index.js.map +1 -1
  222. package/dist/views/Dashboard/index.js +46 -42
  223. package/dist/views/Dashboard/index.js.map +1 -1
  224. package/dist/views/Dashboard/metadata.js +10 -14
  225. package/dist/views/Dashboard/metadata.js.map +1 -1
  226. package/dist/views/Document/getCustomDocumentViewByKey.js +3 -2
  227. package/dist/views/Document/getCustomDocumentViewByKey.js.map +1 -1
  228. package/dist/views/Document/getCustomViewByRoute.js +27 -30
  229. package/dist/views/Document/getCustomViewByRoute.js.map +1 -1
  230. package/dist/views/Document/getDocPreferences.js +40 -41
  231. package/dist/views/Document/getDocPreferences.js.map +1 -1
  232. package/dist/views/Document/getDocumentData.js +44 -55
  233. package/dist/views/Document/getDocumentData.js.map +1 -1
  234. package/dist/views/Document/getDocumentPermissions.js +77 -80
  235. package/dist/views/Document/getDocumentPermissions.js.map +1 -1
  236. package/dist/views/Document/getDocumentView.js +313 -283
  237. package/dist/views/Document/getDocumentView.js.map +1 -1
  238. package/dist/views/Document/getIsLocked.js +73 -73
  239. package/dist/views/Document/getIsLocked.js.map +1 -1
  240. package/dist/views/Document/getMetaBySegment.js +130 -136
  241. package/dist/views/Document/getMetaBySegment.js.map +1 -1
  242. package/dist/views/Document/getVersions.js +220 -213
  243. package/dist/views/Document/getVersions.js.map +1 -1
  244. package/dist/views/Document/handleServerFunction.d.ts.map +1 -1
  245. package/dist/views/Document/handleServerFunction.js +101 -130
  246. package/dist/views/Document/handleServerFunction.js.map +1 -1
  247. package/dist/views/Document/index.js +317 -355
  248. package/dist/views/Document/index.js.map +1 -1
  249. package/dist/views/Document/metadata.js +2 -1
  250. package/dist/views/Document/metadata.js.map +1 -1
  251. package/dist/views/Document/renderDocumentSlots.d.ts +3 -2
  252. package/dist/views/Document/renderDocumentSlots.d.ts.map +1 -1
  253. package/dist/views/Document/renderDocumentSlots.js +142 -141
  254. package/dist/views/Document/renderDocumentSlots.js.map +1 -1
  255. package/dist/views/Edit/index.js +10 -6
  256. package/dist/views/Edit/index.js.map +1 -1
  257. package/dist/views/Edit/metadata.js +36 -46
  258. package/dist/views/Edit/metadata.js.map +1 -1
  259. package/dist/views/ForgotPassword/ForgotPasswordForm/index.js +130 -164
  260. package/dist/views/ForgotPassword/ForgotPasswordForm/index.js.map +1 -1
  261. package/dist/views/ForgotPassword/index.js +79 -62
  262. package/dist/views/ForgotPassword/index.js.map +1 -1
  263. package/dist/views/ForgotPassword/metadata.js +8 -12
  264. package/dist/views/ForgotPassword/metadata.js.map +1 -1
  265. package/dist/views/List/createSerializableValue.js +12 -11
  266. package/dist/views/List/createSerializableValue.js.map +1 -1
  267. package/dist/views/List/enrichDocsWithVersionStatus.js +86 -86
  268. package/dist/views/List/enrichDocsWithVersionStatus.js.map +1 -1
  269. package/dist/views/List/extractRelationshipDisplayValue.js +15 -14
  270. package/dist/views/List/extractRelationshipDisplayValue.js.map +1 -1
  271. package/dist/views/List/extractValueOrRelationshipID.js +16 -15
  272. package/dist/views/List/extractValueOrRelationshipID.js.map +1 -1
  273. package/dist/views/List/handleGroupBy.js +133 -150
  274. package/dist/views/List/handleGroupBy.js.map +1 -1
  275. package/dist/views/List/handleServerFunction.d.ts.map +1 -1
  276. package/dist/views/List/handleServerFunction.js +97 -123
  277. package/dist/views/List/handleServerFunction.js.map +1 -1
  278. package/dist/views/List/index.d.ts +1 -0
  279. package/dist/views/List/index.d.ts.map +1 -1
  280. package/dist/views/List/index.js +303 -318
  281. package/dist/views/List/index.js.map +1 -1
  282. package/dist/views/List/metadata.js +17 -20
  283. package/dist/views/List/metadata.js.map +1 -1
  284. package/dist/views/List/renderListViewSlots.js +82 -75
  285. package/dist/views/List/renderListViewSlots.js.map +1 -1
  286. package/dist/views/List/resolveAllFilterOptions.js +43 -45
  287. package/dist/views/List/resolveAllFilterOptions.js.map +1 -1
  288. package/dist/views/List/transformColumnsToSelect.js +9 -8
  289. package/dist/views/List/transformColumnsToSelect.js.map +1 -1
  290. package/dist/views/Login/LoginField/index.js +57 -89
  291. package/dist/views/Login/LoginField/index.js.map +1 -1
  292. package/dist/views/Login/LoginForm/index.js +107 -160
  293. package/dist/views/Login/LoginForm/index.js.map +1 -1
  294. package/dist/views/Login/LoginForm/index.scss +10 -0
  295. package/dist/views/Login/index.js +82 -85
  296. package/dist/views/Login/index.js.map +1 -1
  297. package/dist/views/Login/index.scss +10 -0
  298. package/dist/views/Login/metadata.js +8 -12
  299. package/dist/views/Login/metadata.js.map +1 -1
  300. package/dist/views/Logout/LogoutClient.js +84 -120
  301. package/dist/views/Logout/LogoutClient.js.map +1 -1
  302. package/dist/views/Logout/index.js +29 -29
  303. package/dist/views/Logout/index.js.map +1 -1
  304. package/dist/views/Logout/index.scss +25 -0
  305. package/dist/views/Logout/metadata.js +7 -11
  306. package/dist/views/Logout/metadata.js.map +1 -1
  307. package/dist/views/NotFound/index.client.js +71 -82
  308. package/dist/views/NotFound/index.client.js.map +1 -1
  309. package/dist/views/NotFound/index.js +72 -73
  310. package/dist/views/NotFound/index.js.map +1 -1
  311. package/dist/views/NotFound/index.scss +57 -0
  312. package/dist/views/NotFound/metadata.js +7 -9
  313. package/dist/views/NotFound/metadata.js.map +1 -1
  314. package/dist/views/ResetPassword/ResetPasswordForm/index.js +97 -108
  315. package/dist/views/ResetPassword/ResetPasswordForm/index.js.map +1 -1
  316. package/dist/views/ResetPassword/index.js +93 -73
  317. package/dist/views/ResetPassword/index.js.map +1 -1
  318. package/dist/views/ResetPassword/index.scss +11 -0
  319. package/dist/views/ResetPassword/metadata.js +8 -12
  320. package/dist/views/ResetPassword/metadata.js.map +1 -1
  321. package/dist/views/Root/attachViewActions.js +18 -23
  322. package/dist/views/Root/attachViewActions.js.map +1 -1
  323. package/dist/views/Root/generateCustomViewMetadata.js +19 -21
  324. package/dist/views/Root/generateCustomViewMetadata.js.map +1 -1
  325. package/dist/views/Root/getCustomViewByKey.js +12 -14
  326. package/dist/views/Root/getCustomViewByKey.js.map +1 -1
  327. package/dist/views/Root/getCustomViewByRoute.js +31 -42
  328. package/dist/views/Root/getCustomViewByRoute.js.map +1 -1
  329. package/dist/views/Root/getDocumentViewInfo.js +24 -23
  330. package/dist/views/Root/getDocumentViewInfo.js.map +1 -1
  331. package/dist/views/Root/getRouteData.js +333 -325
  332. package/dist/views/Root/getRouteData.js.map +1 -1
  333. package/dist/views/Root/index.js +248 -270
  334. package/dist/views/Root/index.js.map +1 -1
  335. package/dist/views/Root/isPathMatchingRoute.js +21 -26
  336. package/dist/views/Root/isPathMatchingRoute.js.map +1 -1
  337. package/dist/views/Root/metadata.js +176 -181
  338. package/dist/views/Root/metadata.js.map +1 -1
  339. package/dist/views/Unauthorized/index.js +54 -46
  340. package/dist/views/Unauthorized/index.js.map +1 -1
  341. package/dist/views/Unauthorized/index.scss +14 -0
  342. package/dist/views/Unauthorized/metadata.js +8 -12
  343. package/dist/views/Unauthorized/metadata.js.map +1 -1
  344. package/dist/views/Verify/index.client.js +25 -43
  345. package/dist/views/Verify/index.client.js.map +1 -1
  346. package/dist/views/Verify/index.js +69 -64
  347. package/dist/views/Verify/index.js.map +1 -1
  348. package/dist/views/Verify/index.scss +16 -0
  349. package/dist/views/Verify/metadata.js +8 -12
  350. package/dist/views/Verify/metadata.js.map +1 -1
  351. package/dist/views/Version/Default/SelectedLocalesContext.js +4 -4
  352. package/dist/views/Version/Default/SelectedLocalesContext.js.map +1 -1
  353. package/dist/views/Version/Default/SetStepNav.js +86 -127
  354. package/dist/views/Version/Default/SetStepNav.js.map +1 -1
  355. package/dist/views/Version/Default/index.js +380 -236
  356. package/dist/views/Version/Default/index.js.map +1 -1
  357. package/dist/views/Version/Default/index.scss +170 -0
  358. package/dist/views/Version/Default/types.js +2 -1
  359. package/dist/views/Version/Default/types.js.map +1 -1
  360. package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.js +102 -119
  361. package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.js.map +1 -1
  362. package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.scss +81 -0
  363. package/dist/views/Version/RenderFieldsToDiff/RenderVersionFieldsToDiff.js +78 -73
  364. package/dist/views/Version/RenderFieldsToDiff/RenderVersionFieldsToDiff.js.map +1 -1
  365. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js +363 -408
  366. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js.map +1 -1
  367. package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js +40 -51
  368. package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js.map +1 -1
  369. package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js +35 -67
  370. package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js.map +1 -1
  371. package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.scss +12 -0
  372. package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js +59 -56
  373. package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js.map +1 -1
  374. package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.scss +9 -0
  375. package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js +139 -117
  376. package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js.map +1 -1
  377. package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.scss +59 -0
  378. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/generateLabelFromValue.js +56 -61
  379. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/generateLabelFromValue.js.map +1 -1
  380. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js +223 -204
  381. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js.map +1 -1
  382. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.scss +91 -0
  383. package/dist/views/Version/RenderFieldsToDiff/fields/Row/index.js +17 -11
  384. package/dist/views/Version/RenderFieldsToDiff/fields/Row/index.js.map +1 -1
  385. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js +48 -73
  386. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js.map +1 -1
  387. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.scss +4 -0
  388. package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js +132 -143
  389. package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js.map +1 -1
  390. package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.scss +9 -0
  391. package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js +56 -81
  392. package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js.map +1 -1
  393. package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.scss +4 -0
  394. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js +252 -211
  395. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js.map +1 -1
  396. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.scss +121 -0
  397. package/dist/views/Version/RenderFieldsToDiff/fields/index.js +23 -22
  398. package/dist/views/Version/RenderFieldsToDiff/fields/index.js.map +1 -1
  399. package/dist/views/Version/RenderFieldsToDiff/index.js +12 -9
  400. package/dist/views/Version/RenderFieldsToDiff/index.js.map +1 -1
  401. package/dist/views/Version/RenderFieldsToDiff/index.scss +24 -0
  402. package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.js +213 -228
  403. package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.js.map +1 -1
  404. package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.spec.js +1005 -826
  405. package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.spec.js.map +1 -1
  406. package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.js +2 -1
  407. package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.js.map +1 -1
  408. package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.spec.js +44 -43
  409. package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.spec.js.map +1 -1
  410. package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.js +32 -36
  411. package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.js.map +1 -1
  412. package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.spec.js +145 -129
  413. package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.spec.js.map +1 -1
  414. package/dist/views/Version/Restore/index.js +117 -93
  415. package/dist/views/Version/Restore/index.js.map +1 -1
  416. package/dist/views/Version/Restore/index.scss +84 -0
  417. package/dist/views/Version/SelectComparison/VersionDrawer/CreatedAtCell.js +33 -50
  418. package/dist/views/Version/SelectComparison/VersionDrawer/CreatedAtCell.js.map +1 -1
  419. package/dist/views/Version/SelectComparison/VersionDrawer/index.js +170 -226
  420. package/dist/views/Version/SelectComparison/VersionDrawer/index.js.map +1 -1
  421. package/dist/views/Version/SelectComparison/VersionDrawer/index.scss +18 -0
  422. package/dist/views/Version/SelectComparison/index.js +73 -50
  423. package/dist/views/Version/SelectComparison/index.js.map +1 -1
  424. package/dist/views/Version/SelectComparison/index.scss +9 -0
  425. package/dist/views/Version/SelectComparison/types.js +2 -1
  426. package/dist/views/Version/SelectComparison/types.js.map +1 -1
  427. package/dist/views/Version/SelectLocales/index.js +34 -32
  428. package/dist/views/Version/SelectLocales/index.js.map +1 -1
  429. package/dist/views/Version/VersionPillLabel/VersionPillLabel.d.ts.map +1 -1
  430. package/dist/views/Version/VersionPillLabel/VersionPillLabel.js +107 -96
  431. package/dist/views/Version/VersionPillLabel/VersionPillLabel.js.map +1 -1
  432. package/dist/views/Version/VersionPillLabel/getVersionLabel.d.ts +3 -2
  433. package/dist/views/Version/VersionPillLabel/getVersionLabel.d.ts.map +1 -1
  434. package/dist/views/Version/VersionPillLabel/getVersionLabel.js +30 -39
  435. package/dist/views/Version/VersionPillLabel/getVersionLabel.js.map +1 -1
  436. package/dist/views/Version/VersionPillLabel/index.scss +26 -0
  437. package/dist/views/Version/fetchVersions.js +113 -138
  438. package/dist/views/Version/fetchVersions.js.map +1 -1
  439. package/dist/views/Version/index.d.ts.map +1 -1
  440. package/dist/views/Version/index.js +328 -323
  441. package/dist/views/Version/index.js.map +1 -1
  442. package/dist/views/Version/metadata.js +43 -50
  443. package/dist/views/Version/metadata.js.map +1 -1
  444. package/dist/views/Versions/buildColumns.js +95 -79
  445. package/dist/views/Versions/buildColumns.js.map +1 -1
  446. package/dist/views/Versions/cells/AutosaveCell/index.js +34 -38
  447. package/dist/views/Versions/cells/AutosaveCell/index.js.map +1 -1
  448. package/dist/views/Versions/cells/AutosaveCell/index.scss +9 -0
  449. package/dist/views/Versions/cells/CreatedAt/index.js +32 -53
  450. package/dist/views/Versions/cells/CreatedAt/index.js.map +1 -1
  451. package/dist/views/Versions/cells/ID/index.js +10 -8
  452. package/dist/views/Versions/cells/ID/index.js.map +1 -1
  453. package/dist/views/Versions/index.client.js +106 -83
  454. package/dist/views/Versions/index.client.js.map +1 -1
  455. package/dist/views/Versions/index.js +164 -164
  456. package/dist/views/Versions/index.js.map +1 -1
  457. package/dist/views/Versions/index.scss +110 -0
  458. package/dist/views/Versions/metadata.js +37 -44
  459. package/dist/views/Versions/metadata.js.map +1 -1
  460. package/dist/views/Versions/types.js +2 -1
  461. package/dist/views/Versions/types.js.map +1 -1
  462. package/dist/withPayload/withPayload.js +232 -174
  463. package/dist/withPayload/withPayload.js.map +1 -1
  464. package/dist/withPayload/withPayload.spec.js +36 -35
  465. package/dist/withPayload/withPayload.spec.js.map +1 -1
  466. package/dist/withPayload/withPayload.utils.js +65 -73
  467. package/dist/withPayload/withPayload.utils.js.map +1 -1
  468. package/dist/withPayload/withPayloadLegacy.js +41 -40
  469. package/dist/withPayload/withPayloadLegacy.js.map +1 -1
  470. package/package.json +6 -6
@@ -2,263 +2,257 @@ import { KeyboardCode, KeyboardSensor, PointerSensor, useSensor, useSensors } fr
2
2
  /**
3
3
  * Get all droppable widget positions, filtering out overlapping "before" droppables
4
4
  * and assigning row numbers based on Y position.
5
- */
6
- function getDroppablePositions() {
7
- const positionTolerance = 5;
8
- const rowTolerance = 10;
9
- const result = [];
10
- let currentRow = 0;
11
- let currentY = null;
12
- const allDroppables = Array.from(document.querySelectorAll('.droppable-widget'));
13
- for (let i = 0; i < allDroppables.length; i++) {
14
- const element = allDroppables[i];
15
- const rect = element.getBoundingClientRect();
16
- // Skip hidden elements
17
- if (rect.width === 0 || rect.height === 0) {
18
- continue;
19
- }
20
- const centerX = rect.left + rect.width / 2;
21
- const centerY = rect.top + rect.height / 2;
22
- const testId = element.getAttribute('data-testid') || '';
23
- const isBeforeDroppable = testId.endsWith('-before');
24
- // Skip "before" droppables that overlap with another droppable
25
- if (isBeforeDroppable) {
26
- const hasOverlapping = allDroppables.some((other, otherIndex) => {
27
- if (otherIndex === i) {
28
- return false;
5
+ */ function getDroppablePositions() {
6
+ const positionTolerance = 5;
7
+ const rowTolerance = 10;
8
+ const result = [];
9
+ let currentRow = 0;
10
+ let currentY = null;
11
+ const allDroppables = Array.from(document.querySelectorAll('.droppable-widget'));
12
+ for(let i = 0; i < allDroppables.length; i++){
13
+ const element = allDroppables[i];
14
+ const rect = element.getBoundingClientRect();
15
+ // Skip hidden elements
16
+ if (rect.width === 0 || rect.height === 0) {
17
+ continue;
29
18
  }
30
- const otherRect = other.getBoundingClientRect();
31
- const otherCenterX = otherRect.left + otherRect.width / 2;
32
- const otherCenterY = otherRect.top + otherRect.height / 2;
33
- return Math.abs(otherCenterX - centerX) < positionTolerance && Math.abs(otherCenterY - centerY) < positionTolerance;
34
- });
35
- if (hasOverlapping) {
36
- continue;
37
- }
38
- }
39
- // Assign row number based on Y position change
40
- if (currentY === null) {
41
- currentY = centerY;
42
- } else if (Math.abs(centerY - currentY) >= rowTolerance) {
43
- currentRow++;
44
- currentY = centerY;
19
+ const centerX = rect.left + rect.width / 2;
20
+ const centerY = rect.top + rect.height / 2;
21
+ const testId = element.getAttribute('data-testid') || '';
22
+ const isBeforeDroppable = testId.endsWith('-before');
23
+ // Skip "before" droppables that overlap with another droppable
24
+ if (isBeforeDroppable) {
25
+ const hasOverlapping = allDroppables.some((other, otherIndex)=>{
26
+ if (otherIndex === i) {
27
+ return false;
28
+ }
29
+ const otherRect = other.getBoundingClientRect();
30
+ const otherCenterX = otherRect.left + otherRect.width / 2;
31
+ const otherCenterY = otherRect.top + otherRect.height / 2;
32
+ return Math.abs(otherCenterX - centerX) < positionTolerance && Math.abs(otherCenterY - centerY) < positionTolerance;
33
+ });
34
+ if (hasOverlapping) {
35
+ continue;
36
+ }
37
+ }
38
+ // Assign row number based on Y position change
39
+ if (currentY === null) {
40
+ currentY = centerY;
41
+ } else if (Math.abs(centerY - currentY) >= rowTolerance) {
42
+ currentRow++;
43
+ currentY = centerY;
44
+ }
45
+ result.push({
46
+ centerX,
47
+ centerY,
48
+ element,
49
+ isBeforeDroppable,
50
+ rect,
51
+ row: currentRow
52
+ });
45
53
  }
46
- result.push({
47
- centerX,
48
- centerY,
49
- element,
50
- isBeforeDroppable,
51
- rect,
52
- row: currentRow
53
- });
54
- }
55
- return result;
54
+ return result;
56
55
  }
57
56
  /**
58
57
  * Find the row with the closest Y position to the given posY.
59
58
  * Returns the row index, or null if no droppables exist.
60
- */
61
- function findClosestRow(droppables, posY) {
62
- if (droppables.length === 0) {
63
- return null;
64
- }
65
- let closestRow = droppables[0].row;
66
- let minYDistance = Infinity;
67
- for (const droppable of droppables) {
68
- const yDistance = Math.abs(droppable.centerY - posY);
69
- if (yDistance < minYDistance) {
70
- minYDistance = yDistance;
71
- closestRow = droppable.row;
59
+ */ function findClosestRow(droppables, posY) {
60
+ if (droppables.length === 0) {
61
+ return null;
62
+ }
63
+ let closestRow = droppables[0].row;
64
+ let minYDistance = Infinity;
65
+ for (const droppable of droppables){
66
+ const yDistance = Math.abs(droppable.centerY - posY);
67
+ if (yDistance < minYDistance) {
68
+ minYDistance = yDistance;
69
+ closestRow = droppable.row;
70
+ }
72
71
  }
73
- }
74
- return closestRow;
72
+ return closestRow;
75
73
  }
76
74
  /**
77
75
  * Find the closest droppable within a specific row by X position.
78
76
  * Returns the droppable and its index, or null if no droppables in that row.
79
- */
80
- function findClosestDroppableInRow(droppables, rowIndex, posX) {
81
- let closestIndex = -1;
82
- let minXDistance = Infinity;
83
- for (let i = 0; i < droppables.length; i++) {
84
- const droppable = droppables[i];
85
- if (droppable.row === rowIndex) {
86
- const xDistance = Math.abs(droppable.centerX - posX);
87
- if (xDistance < minXDistance) {
88
- minXDistance = xDistance;
89
- closestIndex = i;
90
- }
77
+ */ function findClosestDroppableInRow(droppables, rowIndex, posX) {
78
+ let closestIndex = -1;
79
+ let minXDistance = Infinity;
80
+ for(let i = 0; i < droppables.length; i++){
81
+ const droppable = droppables[i];
82
+ if (droppable.row === rowIndex) {
83
+ const xDistance = Math.abs(droppable.centerX - posX);
84
+ if (xDistance < minXDistance) {
85
+ minXDistance = xDistance;
86
+ closestIndex = i;
87
+ }
88
+ }
91
89
  }
92
- }
93
- if (closestIndex === -1) {
94
- return null;
95
- }
96
- return {
97
- droppable: droppables[closestIndex],
98
- index: closestIndex
99
- };
90
+ if (closestIndex === -1) {
91
+ return null;
92
+ }
93
+ return {
94
+ droppable: droppables[closestIndex],
95
+ index: closestIndex
96
+ };
100
97
  }
101
98
  /**
102
99
  * Find the target droppable based on direction
103
100
  * - ArrowRight/Left: Next/previous in DOM order (now that overlapping droppables are filtered)
104
101
  * - ArrowUp/Down: Closest in adjacent row (row +1 or -1) by X position
105
- */
106
- function findTargetDroppable(droppables, currentCenterX, currentCenterY, direction) {
107
- // Find the closest row, then the closest droppable in that row
108
- const currentRow = findClosestRow(droppables, currentCenterY);
109
- if (currentRow === null) {
110
- return null;
111
- }
112
- const currentDroppable = findClosestDroppableInRow(droppables, currentRow, currentCenterX);
113
- if (!currentDroppable) {
114
- return null;
115
- }
116
- const {
117
- index: currentIndex
118
- } = currentDroppable;
119
- switch (direction) {
120
- case 'ArrowDown':
121
- {
122
- const targetRow = currentRow + 1;
123
- return findClosestDroppableInRow(droppables, targetRow, currentCenterX)?.droppable || null;
124
- }
125
- case 'ArrowLeft':
126
- // Previous in DOM order
127
- return droppables[currentIndex - 1] || null;
128
- case 'ArrowRight':
129
- // Next in DOM order
130
- return droppables[currentIndex + 1] || null;
131
- case 'ArrowUp':
132
- {
133
- const targetRow = currentRow - 1;
134
- return findClosestDroppableInRow(droppables, targetRow, currentCenterX)?.droppable || null;
135
- }
136
- default:
137
- return null;
138
- }
102
+ */ function findTargetDroppable(droppables, currentCenterX, currentCenterY, direction) {
103
+ // Find the closest row, then the closest droppable in that row
104
+ const currentRow = findClosestRow(droppables, currentCenterY);
105
+ if (currentRow === null) {
106
+ return null;
107
+ }
108
+ const currentDroppable = findClosestDroppableInRow(droppables, currentRow, currentCenterX);
109
+ if (!currentDroppable) {
110
+ return null;
111
+ }
112
+ const { index: currentIndex } = currentDroppable;
113
+ switch(direction){
114
+ case 'ArrowDown':
115
+ {
116
+ const targetRow = currentRow + 1;
117
+ return findClosestDroppableInRow(droppables, targetRow, currentCenterX)?.droppable || null;
118
+ }
119
+ case 'ArrowLeft':
120
+ // Previous in DOM order
121
+ return droppables[currentIndex - 1] || null;
122
+ case 'ArrowRight':
123
+ // Next in DOM order
124
+ return droppables[currentIndex + 1] || null;
125
+ case 'ArrowUp':
126
+ {
127
+ const targetRow = currentRow - 1;
128
+ return findClosestDroppableInRow(droppables, targetRow, currentCenterX)?.droppable || null;
129
+ }
130
+ default:
131
+ return null;
132
+ }
139
133
  }
140
134
  /**
141
135
  * Custom coordinate getter that jumps directly to droppable positions
142
136
  * instead of moving in pixel increments. This works better with scrolling
143
137
  * and provides more predictable navigation.
144
- */
145
- const droppableJumpKeyboardCoordinateGetter = (event, {
146
- context,
147
- currentCoordinates
148
- }) => {
149
- const {
150
- collisionRect
151
- } = context;
152
- const {
153
- code
154
- } = event;
155
- if (!collisionRect) {
156
- return currentCoordinates;
157
- }
158
- // Only handle arrow keys
159
- if (!['ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp'].includes(code)) {
160
- return currentCoordinates;
161
- }
162
- // Prevent default browser scroll behavior for arrow keys
163
- event.preventDefault();
164
- // Clear scrollableAncestors to prevent dnd-kit from scrolling instead of moving
165
- // This must be done on every keydown because context is updated by dnd-kit
166
- if (context.scrollableAncestors) {
167
- context.scrollableAncestors.length = 0;
168
- }
169
- // Get all droppable widgets and their positions
170
- const droppables = getDroppablePositions();
171
- if (droppables.length === 0) {
172
- return currentCoordinates;
173
- }
174
- // Current position center (viewport coordinates from collisionRect)
175
- const currentCenterX = collisionRect.left + collisionRect.width / 2;
176
- const currentCenterY = collisionRect.top + collisionRect.height / 2;
177
- // Find the target droppable based on direction
178
- const targetDroppable = findTargetDroppable(droppables, currentCenterX, currentCenterY, code);
179
- // If we found a target, scroll if needed and calculate the delta
180
- if (targetDroppable) {
181
- const viewportHeight = window.innerHeight;
182
- const targetRect = targetDroppable.rect;
183
- const scrollPadding = 20 // Extra padding to ensure element is fully visible
184
- ;
185
- // Check if target droppable is fully visible in viewport
186
- const isAboveViewport = targetRect.top < scrollPadding;
187
- const isBelowViewport = targetRect.bottom > viewportHeight - scrollPadding;
188
- // Scroll to make target visible (using instant scroll for synchronous behavior)
189
- if (isAboveViewport) {
190
- const scrollAmount = targetRect.top - scrollPadding;
191
- // don't use smooth scroll here, because it will mess up the delta calculation
192
- window.scrollBy({
193
- behavior: 'instant',
194
- top: scrollAmount
195
- });
196
- } else if (isBelowViewport) {
197
- const scrollAmount = targetRect.bottom - viewportHeight + scrollPadding;
198
- window.scrollBy({
199
- behavior: 'instant',
200
- top: scrollAmount
201
- });
138
+ */ const droppableJumpKeyboardCoordinateGetter = (event, { context, currentCoordinates })=>{
139
+ const { collisionRect } = context;
140
+ const { code } = event;
141
+ if (!collisionRect) {
142
+ return currentCoordinates;
202
143
  }
203
- // After scroll, recalculate target position (it may have changed due to scroll)
204
- const newTargetRect = targetDroppable.element.getBoundingClientRect();
205
- const newTargetCenterX = newTargetRect.left + newTargetRect.width / 2;
206
- const newTargetCenterY = newTargetRect.top + newTargetRect.height / 2;
207
- // Calculate delta using current overlay position (which didn't change) and new target position
208
- const deltaX = newTargetCenterX - currentCenterX;
209
- const deltaY = newTargetCenterY - currentCenterY;
210
- // Add delta to currentCoordinates to position overlay's center at target's center
211
- return {
212
- x: currentCoordinates.x + deltaX,
213
- y: currentCoordinates.y + deltaY
214
- };
215
- }
216
- // No valid target found, stay in place
217
- return currentCoordinates;
144
+ // Only handle arrow keys
145
+ if (![
146
+ 'ArrowDown',
147
+ 'ArrowLeft',
148
+ 'ArrowRight',
149
+ 'ArrowUp'
150
+ ].includes(code)) {
151
+ return currentCoordinates;
152
+ }
153
+ // Prevent default browser scroll behavior for arrow keys
154
+ event.preventDefault();
155
+ // Clear scrollableAncestors to prevent dnd-kit from scrolling instead of moving
156
+ // This must be done on every keydown because context is updated by dnd-kit
157
+ if (context.scrollableAncestors) {
158
+ context.scrollableAncestors.length = 0;
159
+ }
160
+ // Get all droppable widgets and their positions
161
+ const droppables = getDroppablePositions();
162
+ if (droppables.length === 0) {
163
+ return currentCoordinates;
164
+ }
165
+ // Current position center (viewport coordinates from collisionRect)
166
+ const currentCenterX = collisionRect.left + collisionRect.width / 2;
167
+ const currentCenterY = collisionRect.top + collisionRect.height / 2;
168
+ // Find the target droppable based on direction
169
+ const targetDroppable = findTargetDroppable(droppables, currentCenterX, currentCenterY, code);
170
+ // If we found a target, scroll if needed and calculate the delta
171
+ if (targetDroppable) {
172
+ const viewportHeight = window.innerHeight;
173
+ const targetRect = targetDroppable.rect;
174
+ const scrollPadding = 20;
175
+ // Extra padding to ensure element is fully visible
176
+ // Check if target droppable is fully visible in viewport
177
+ const isAboveViewport = targetRect.top < scrollPadding;
178
+ const isBelowViewport = targetRect.bottom > viewportHeight - scrollPadding;
179
+ // Scroll to make target visible (using instant scroll for synchronous behavior)
180
+ if (isAboveViewport) {
181
+ const scrollAmount = targetRect.top - scrollPadding;
182
+ // don't use smooth scroll here, because it will mess up the delta calculation
183
+ window.scrollBy({
184
+ behavior: 'instant',
185
+ top: scrollAmount
186
+ });
187
+ } else if (isBelowViewport) {
188
+ const scrollAmount = targetRect.bottom - viewportHeight + scrollPadding;
189
+ window.scrollBy({
190
+ behavior: 'instant',
191
+ top: scrollAmount
192
+ });
193
+ }
194
+ // After scroll, recalculate target position (it may have changed due to scroll)
195
+ const newTargetRect = targetDroppable.element.getBoundingClientRect();
196
+ const newTargetCenterX = newTargetRect.left + newTargetRect.width / 2;
197
+ const newTargetCenterY = newTargetRect.top + newTargetRect.height / 2;
198
+ // Calculate delta using current overlay position (which didn't change) and new target position
199
+ const deltaX = newTargetCenterX - currentCenterX;
200
+ const deltaY = newTargetCenterY - currentCenterY;
201
+ // Add delta to currentCoordinates to position overlay's center at target's center
202
+ return {
203
+ x: currentCoordinates.x + deltaX,
204
+ y: currentCoordinates.y + deltaY
205
+ };
206
+ }
207
+ // No valid target found, stay in place
208
+ return currentCoordinates;
218
209
  };
219
210
  /**
220
211
  * Custom KeyboardSensor that only activates when focus is directly on the
221
212
  * draggable element, not on any of its descendants. This allows interactive
222
213
  * elements inside draggables (like buttons) to work normally with the keyboard.
223
- */
224
- class DirectFocusKeyboardSensor extends KeyboardSensor {
225
- static activators = [{
226
- eventName: 'onKeyDown',
227
- handler: (event, {
228
- keyboardCodes = {
229
- cancel: [KeyboardCode.Esc],
230
- end: [KeyboardCode.Space, KeyboardCode.Enter],
231
- start: [KeyboardCode.Space, KeyboardCode.Enter]
232
- },
233
- onActivation
234
- }, {
235
- active
236
- }) => {
237
- const {
238
- code
239
- } = event.nativeEvent;
240
- // Only activate if focus is directly on the draggable node, not descendants
241
- if (event.target !== active.node.current) {
242
- return false;
243
- }
244
- if (keyboardCodes.start.includes(code)) {
245
- event.preventDefault();
246
- onActivation?.({
247
- event: event.nativeEvent
248
- });
249
- return true;
250
- }
251
- return false;
252
- }
253
- }];
254
- }
214
+ */ let DirectFocusKeyboardSensor = class DirectFocusKeyboardSensor extends KeyboardSensor {
215
+ static activators = [
216
+ {
217
+ eventName: 'onKeyDown',
218
+ handler: (event, { keyboardCodes = {
219
+ cancel: [
220
+ KeyboardCode.Esc
221
+ ],
222
+ end: [
223
+ KeyboardCode.Space,
224
+ KeyboardCode.Enter
225
+ ],
226
+ start: [
227
+ KeyboardCode.Space,
228
+ KeyboardCode.Enter
229
+ ]
230
+ }, onActivation }, { active })=>{
231
+ const { code } = event.nativeEvent;
232
+ // Only activate if focus is directly on the draggable node, not descendants
233
+ if (event.target !== active.node.current) {
234
+ return false;
235
+ }
236
+ if (keyboardCodes.start.includes(code)) {
237
+ event.preventDefault();
238
+ onActivation?.({
239
+ event: event.nativeEvent
240
+ });
241
+ return true;
242
+ }
243
+ return false;
244
+ }
245
+ }
246
+ ];
247
+ };
255
248
  export function useDashboardSensors() {
256
- return useSensors(useSensor(PointerSensor, {
257
- activationConstraint: {
258
- distance: 5
259
- }
260
- }), useSensor(DirectFocusKeyboardSensor, {
261
- coordinateGetter: droppableJumpKeyboardCoordinateGetter
262
- }));
249
+ return useSensors(useSensor(PointerSensor, {
250
+ activationConstraint: {
251
+ distance: 5
252
+ }
253
+ }), useSensor(DirectFocusKeyboardSensor, {
254
+ coordinateGetter: droppableJumpKeyboardCoordinateGetter
255
+ }));
263
256
  }
257
+
264
258
  //# sourceMappingURL=sensors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sensors.js","names":["KeyboardCode","KeyboardSensor","PointerSensor","useSensor","useSensors","getDroppablePositions","positionTolerance","rowTolerance","result","currentRow","currentY","allDroppables","Array","from","document","querySelectorAll","i","length","element","rect","getBoundingClientRect","width","height","centerX","left","centerY","top","testId","getAttribute","isBeforeDroppable","endsWith","hasOverlapping","some","other","otherIndex","otherRect","otherCenterX","otherCenterY","Math","abs","push","row","findClosestRow","droppables","posY","closestRow","minYDistance","Infinity","droppable","yDistance","findClosestDroppableInRow","rowIndex","posX","closestIndex","minXDistance","xDistance","index","findTargetDroppable","currentCenterX","currentCenterY","direction","currentDroppable","currentIndex","targetRow","droppableJumpKeyboardCoordinateGetter","event","context","currentCoordinates","collisionRect","code","includes","preventDefault","scrollableAncestors","targetDroppable","viewportHeight","window","innerHeight","targetRect","scrollPadding","isAboveViewport","isBelowViewport","bottom","scrollAmount","scrollBy","behavior","newTargetRect","newTargetCenterX","newTargetCenterY","deltaX","deltaY","x","y","DirectFocusKeyboardSensor","activators","eventName","handler","keyboardCodes","cancel","Esc","end","Space","Enter","start","onActivation","active","nativeEvent","target","node","current","useDashboardSensors","activationConstraint","distance","coordinateGetter"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/utils/sensors.ts"],"sourcesContent":["import type { KeyboardCoordinateGetter, KeyboardSensorOptions } from '@dnd-kit/core'\n\nimport { KeyboardCode, KeyboardSensor, PointerSensor, useSensor, useSensors } from '@dnd-kit/core'\n\ntype DroppablePosition = {\n centerX: number\n centerY: number\n element: Element\n isBeforeDroppable: boolean\n rect: DOMRect\n row: number\n}\n\n/**\n * Get all droppable widget positions, filtering out overlapping \"before\" droppables\n * and assigning row numbers based on Y position.\n */\nfunction getDroppablePositions(): DroppablePosition[] {\n const positionTolerance = 5\n const rowTolerance = 10\n const result: DroppablePosition[] = []\n let currentRow = 0\n let currentY: null | number = null\n\n const allDroppables = Array.from(document.querySelectorAll('.droppable-widget'))\n\n for (let i = 0; i < allDroppables.length; i++) {\n const element = allDroppables[i]\n const rect = element.getBoundingClientRect()\n\n // Skip hidden elements\n if (rect.width === 0 || rect.height === 0) {\n continue\n }\n\n const centerX = rect.left + rect.width / 2\n const centerY = rect.top + rect.height / 2\n const testId = element.getAttribute('data-testid') || ''\n const isBeforeDroppable = testId.endsWith('-before')\n\n // Skip \"before\" droppables that overlap with another droppable\n if (isBeforeDroppable) {\n const hasOverlapping = allDroppables.some((other, otherIndex) => {\n if (otherIndex === i) {\n return false\n }\n const otherRect = other.getBoundingClientRect()\n const otherCenterX = otherRect.left + otherRect.width / 2\n const otherCenterY = otherRect.top + otherRect.height / 2\n return (\n Math.abs(otherCenterX - centerX) < positionTolerance &&\n Math.abs(otherCenterY - centerY) < positionTolerance\n )\n })\n if (hasOverlapping) {\n continue\n }\n }\n\n // Assign row number based on Y position change\n if (currentY === null) {\n currentY = centerY\n } else if (Math.abs(centerY - currentY) >= rowTolerance) {\n currentRow++\n currentY = centerY\n }\n\n result.push({\n centerX,\n centerY,\n element,\n isBeforeDroppable,\n rect,\n row: currentRow,\n })\n }\n\n return result\n}\n\n/**\n * Find the row with the closest Y position to the given posY.\n * Returns the row index, or null if no droppables exist.\n */\nfunction findClosestRow(droppables: DroppablePosition[], posY: number): null | number {\n if (droppables.length === 0) {\n return null\n }\n\n let closestRow = droppables[0].row\n let minYDistance = Infinity\n\n for (const droppable of droppables) {\n const yDistance = Math.abs(droppable.centerY - posY)\n if (yDistance < minYDistance) {\n minYDistance = yDistance\n closestRow = droppable.row\n }\n }\n\n return closestRow\n}\n\n/**\n * Find the closest droppable within a specific row by X position.\n * Returns the droppable and its index, or null if no droppables in that row.\n */\nfunction findClosestDroppableInRow(\n droppables: DroppablePosition[],\n rowIndex: number,\n posX: number,\n): { droppable: DroppablePosition; index: number } | null {\n let closestIndex = -1\n let minXDistance = Infinity\n\n for (let i = 0; i < droppables.length; i++) {\n const droppable = droppables[i]\n if (droppable.row === rowIndex) {\n const xDistance = Math.abs(droppable.centerX - posX)\n if (xDistance < minXDistance) {\n minXDistance = xDistance\n closestIndex = i\n }\n }\n }\n\n if (closestIndex === -1) {\n return null\n }\n\n return { droppable: droppables[closestIndex], index: closestIndex }\n}\n\n/**\n * Find the target droppable based on direction\n * - ArrowRight/Left: Next/previous in DOM order (now that overlapping droppables are filtered)\n * - ArrowUp/Down: Closest in adjacent row (row +1 or -1) by X position\n */\nfunction findTargetDroppable(\n droppables: DroppablePosition[],\n currentCenterX: number,\n currentCenterY: number,\n direction: string,\n): DroppablePosition | null {\n // Find the closest row, then the closest droppable in that row\n const currentRow = findClosestRow(droppables, currentCenterY)\n\n if (currentRow === null) {\n return null\n }\n\n const currentDroppable = findClosestDroppableInRow(droppables, currentRow, currentCenterX)\n\n if (!currentDroppable) {\n return null\n }\n\n const { index: currentIndex } = currentDroppable\n\n switch (direction) {\n case 'ArrowDown': {\n const targetRow = currentRow + 1\n return findClosestDroppableInRow(droppables, targetRow, currentCenterX)?.droppable || null\n }\n\n case 'ArrowLeft':\n // Previous in DOM order\n return droppables[currentIndex - 1] || null\n\n case 'ArrowRight':\n // Next in DOM order\n return droppables[currentIndex + 1] || null\n\n case 'ArrowUp': {\n const targetRow = currentRow - 1\n return findClosestDroppableInRow(droppables, targetRow, currentCenterX)?.droppable || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Custom coordinate getter that jumps directly to droppable positions\n * instead of moving in pixel increments. This works better with scrolling\n * and provides more predictable navigation.\n */\nconst droppableJumpKeyboardCoordinateGetter: KeyboardCoordinateGetter = (\n event,\n { context, currentCoordinates },\n) => {\n const { collisionRect } = context\n const { code } = event\n\n if (!collisionRect) {\n return currentCoordinates\n }\n\n // Only handle arrow keys\n if (!['ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp'].includes(code)) {\n return currentCoordinates\n }\n\n // Prevent default browser scroll behavior for arrow keys\n event.preventDefault()\n\n // Clear scrollableAncestors to prevent dnd-kit from scrolling instead of moving\n // This must be done on every keydown because context is updated by dnd-kit\n if (context.scrollableAncestors) {\n context.scrollableAncestors.length = 0\n }\n\n // Get all droppable widgets and their positions\n const droppables = getDroppablePositions()\n\n if (droppables.length === 0) {\n return currentCoordinates\n }\n\n // Current position center (viewport coordinates from collisionRect)\n const currentCenterX = collisionRect.left + collisionRect.width / 2\n const currentCenterY = collisionRect.top + collisionRect.height / 2\n\n // Find the target droppable based on direction\n const targetDroppable = findTargetDroppable(droppables, currentCenterX, currentCenterY, code)\n\n // If we found a target, scroll if needed and calculate the delta\n if (targetDroppable) {\n const viewportHeight = window.innerHeight\n const targetRect = targetDroppable.rect\n const scrollPadding = 20 // Extra padding to ensure element is fully visible\n\n // Check if target droppable is fully visible in viewport\n const isAboveViewport = targetRect.top < scrollPadding\n const isBelowViewport = targetRect.bottom > viewportHeight - scrollPadding\n\n // Scroll to make target visible (using instant scroll for synchronous behavior)\n if (isAboveViewport) {\n const scrollAmount = targetRect.top - scrollPadding\n // don't use smooth scroll here, because it will mess up the delta calculation\n window.scrollBy({ behavior: 'instant', top: scrollAmount })\n } else if (isBelowViewport) {\n const scrollAmount = targetRect.bottom - viewportHeight + scrollPadding\n window.scrollBy({ behavior: 'instant', top: scrollAmount })\n }\n\n // After scroll, recalculate target position (it may have changed due to scroll)\n const newTargetRect = targetDroppable.element.getBoundingClientRect()\n const newTargetCenterX = newTargetRect.left + newTargetRect.width / 2\n const newTargetCenterY = newTargetRect.top + newTargetRect.height / 2\n\n // Calculate delta using current overlay position (which didn't change) and new target position\n const deltaX = newTargetCenterX - currentCenterX\n const deltaY = newTargetCenterY - currentCenterY\n\n // Add delta to currentCoordinates to position overlay's center at target's center\n return {\n x: currentCoordinates.x + deltaX,\n y: currentCoordinates.y + deltaY,\n }\n }\n\n // No valid target found, stay in place\n return currentCoordinates\n}\n\n/**\n * Custom KeyboardSensor that only activates when focus is directly on the\n * draggable element, not on any of its descendants. This allows interactive\n * elements inside draggables (like buttons) to work normally with the keyboard.\n */\nclass DirectFocusKeyboardSensor extends KeyboardSensor {\n static override activators = [\n {\n eventName: 'onKeyDown' as const,\n handler: (\n event: React.KeyboardEvent,\n {\n keyboardCodes = {\n cancel: [KeyboardCode.Esc],\n end: [KeyboardCode.Space, KeyboardCode.Enter],\n start: [KeyboardCode.Space, KeyboardCode.Enter],\n },\n onActivation,\n }: KeyboardSensorOptions,\n { active }: { active: { node: React.MutableRefObject<HTMLElement | null> } },\n ) => {\n const { code } = event.nativeEvent\n\n // Only activate if focus is directly on the draggable node, not descendants\n if (event.target !== active.node.current) {\n return false\n }\n\n if (keyboardCodes.start.includes(code)) {\n event.preventDefault()\n onActivation?.({ event: event.nativeEvent })\n return true\n }\n\n return false\n },\n },\n ]\n}\n\nexport function useDashboardSensors() {\n return useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(DirectFocusKeyboardSensor, {\n coordinateGetter: droppableJumpKeyboardCoordinateGetter,\n }),\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/utils/sensors.ts"],"sourcesContent":["import type { KeyboardCoordinateGetter, KeyboardSensorOptions } from '@dnd-kit/core'\n\nimport { KeyboardCode, KeyboardSensor, PointerSensor, useSensor, useSensors } from '@dnd-kit/core'\n\ntype DroppablePosition = {\n centerX: number\n centerY: number\n element: Element\n isBeforeDroppable: boolean\n rect: DOMRect\n row: number\n}\n\n/**\n * Get all droppable widget positions, filtering out overlapping \"before\" droppables\n * and assigning row numbers based on Y position.\n */\nfunction getDroppablePositions(): DroppablePosition[] {\n const positionTolerance = 5\n const rowTolerance = 10\n const result: DroppablePosition[] = []\n let currentRow = 0\n let currentY: null | number = null\n\n const allDroppables = Array.from(document.querySelectorAll('.droppable-widget'))\n\n for (let i = 0; i < allDroppables.length; i++) {\n const element = allDroppables[i]\n const rect = element.getBoundingClientRect()\n\n // Skip hidden elements\n if (rect.width === 0 || rect.height === 0) {\n continue\n }\n\n const centerX = rect.left + rect.width / 2\n const centerY = rect.top + rect.height / 2\n const testId = element.getAttribute('data-testid') || ''\n const isBeforeDroppable = testId.endsWith('-before')\n\n // Skip \"before\" droppables that overlap with another droppable\n if (isBeforeDroppable) {\n const hasOverlapping = allDroppables.some((other, otherIndex) => {\n if (otherIndex === i) {\n return false\n }\n const otherRect = other.getBoundingClientRect()\n const otherCenterX = otherRect.left + otherRect.width / 2\n const otherCenterY = otherRect.top + otherRect.height / 2\n return (\n Math.abs(otherCenterX - centerX) < positionTolerance &&\n Math.abs(otherCenterY - centerY) < positionTolerance\n )\n })\n if (hasOverlapping) {\n continue\n }\n }\n\n // Assign row number based on Y position change\n if (currentY === null) {\n currentY = centerY\n } else if (Math.abs(centerY - currentY) >= rowTolerance) {\n currentRow++\n currentY = centerY\n }\n\n result.push({\n centerX,\n centerY,\n element,\n isBeforeDroppable,\n rect,\n row: currentRow,\n })\n }\n\n return result\n}\n\n/**\n * Find the row with the closest Y position to the given posY.\n * Returns the row index, or null if no droppables exist.\n */\nfunction findClosestRow(droppables: DroppablePosition[], posY: number): null | number {\n if (droppables.length === 0) {\n return null\n }\n\n let closestRow = droppables[0].row\n let minYDistance = Infinity\n\n for (const droppable of droppables) {\n const yDistance = Math.abs(droppable.centerY - posY)\n if (yDistance < minYDistance) {\n minYDistance = yDistance\n closestRow = droppable.row\n }\n }\n\n return closestRow\n}\n\n/**\n * Find the closest droppable within a specific row by X position.\n * Returns the droppable and its index, or null if no droppables in that row.\n */\nfunction findClosestDroppableInRow(\n droppables: DroppablePosition[],\n rowIndex: number,\n posX: number,\n): { droppable: DroppablePosition; index: number } | null {\n let closestIndex = -1\n let minXDistance = Infinity\n\n for (let i = 0; i < droppables.length; i++) {\n const droppable = droppables[i]\n if (droppable.row === rowIndex) {\n const xDistance = Math.abs(droppable.centerX - posX)\n if (xDistance < minXDistance) {\n minXDistance = xDistance\n closestIndex = i\n }\n }\n }\n\n if (closestIndex === -1) {\n return null\n }\n\n return { droppable: droppables[closestIndex], index: closestIndex }\n}\n\n/**\n * Find the target droppable based on direction\n * - ArrowRight/Left: Next/previous in DOM order (now that overlapping droppables are filtered)\n * - ArrowUp/Down: Closest in adjacent row (row +1 or -1) by X position\n */\nfunction findTargetDroppable(\n droppables: DroppablePosition[],\n currentCenterX: number,\n currentCenterY: number,\n direction: string,\n): DroppablePosition | null {\n // Find the closest row, then the closest droppable in that row\n const currentRow = findClosestRow(droppables, currentCenterY)\n\n if (currentRow === null) {\n return null\n }\n\n const currentDroppable = findClosestDroppableInRow(droppables, currentRow, currentCenterX)\n\n if (!currentDroppable) {\n return null\n }\n\n const { index: currentIndex } = currentDroppable\n\n switch (direction) {\n case 'ArrowDown': {\n const targetRow = currentRow + 1\n return findClosestDroppableInRow(droppables, targetRow, currentCenterX)?.droppable || null\n }\n\n case 'ArrowLeft':\n // Previous in DOM order\n return droppables[currentIndex - 1] || null\n\n case 'ArrowRight':\n // Next in DOM order\n return droppables[currentIndex + 1] || null\n\n case 'ArrowUp': {\n const targetRow = currentRow - 1\n return findClosestDroppableInRow(droppables, targetRow, currentCenterX)?.droppable || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Custom coordinate getter that jumps directly to droppable positions\n * instead of moving in pixel increments. This works better with scrolling\n * and provides more predictable navigation.\n */\nconst droppableJumpKeyboardCoordinateGetter: KeyboardCoordinateGetter = (\n event,\n { context, currentCoordinates },\n) => {\n const { collisionRect } = context\n const { code } = event\n\n if (!collisionRect) {\n return currentCoordinates\n }\n\n // Only handle arrow keys\n if (!['ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp'].includes(code)) {\n return currentCoordinates\n }\n\n // Prevent default browser scroll behavior for arrow keys\n event.preventDefault()\n\n // Clear scrollableAncestors to prevent dnd-kit from scrolling instead of moving\n // This must be done on every keydown because context is updated by dnd-kit\n if (context.scrollableAncestors) {\n context.scrollableAncestors.length = 0\n }\n\n // Get all droppable widgets and their positions\n const droppables = getDroppablePositions()\n\n if (droppables.length === 0) {\n return currentCoordinates\n }\n\n // Current position center (viewport coordinates from collisionRect)\n const currentCenterX = collisionRect.left + collisionRect.width / 2\n const currentCenterY = collisionRect.top + collisionRect.height / 2\n\n // Find the target droppable based on direction\n const targetDroppable = findTargetDroppable(droppables, currentCenterX, currentCenterY, code)\n\n // If we found a target, scroll if needed and calculate the delta\n if (targetDroppable) {\n const viewportHeight = window.innerHeight\n const targetRect = targetDroppable.rect\n const scrollPadding = 20 // Extra padding to ensure element is fully visible\n\n // Check if target droppable is fully visible in viewport\n const isAboveViewport = targetRect.top < scrollPadding\n const isBelowViewport = targetRect.bottom > viewportHeight - scrollPadding\n\n // Scroll to make target visible (using instant scroll for synchronous behavior)\n if (isAboveViewport) {\n const scrollAmount = targetRect.top - scrollPadding\n // don't use smooth scroll here, because it will mess up the delta calculation\n window.scrollBy({ behavior: 'instant', top: scrollAmount })\n } else if (isBelowViewport) {\n const scrollAmount = targetRect.bottom - viewportHeight + scrollPadding\n window.scrollBy({ behavior: 'instant', top: scrollAmount })\n }\n\n // After scroll, recalculate target position (it may have changed due to scroll)\n const newTargetRect = targetDroppable.element.getBoundingClientRect()\n const newTargetCenterX = newTargetRect.left + newTargetRect.width / 2\n const newTargetCenterY = newTargetRect.top + newTargetRect.height / 2\n\n // Calculate delta using current overlay position (which didn't change) and new target position\n const deltaX = newTargetCenterX - currentCenterX\n const deltaY = newTargetCenterY - currentCenterY\n\n // Add delta to currentCoordinates to position overlay's center at target's center\n return {\n x: currentCoordinates.x + deltaX,\n y: currentCoordinates.y + deltaY,\n }\n }\n\n // No valid target found, stay in place\n return currentCoordinates\n}\n\n/**\n * Custom KeyboardSensor that only activates when focus is directly on the\n * draggable element, not on any of its descendants. This allows interactive\n * elements inside draggables (like buttons) to work normally with the keyboard.\n */\nclass DirectFocusKeyboardSensor extends KeyboardSensor {\n static override activators = [\n {\n eventName: 'onKeyDown' as const,\n handler: (\n event: React.KeyboardEvent,\n {\n keyboardCodes = {\n cancel: [KeyboardCode.Esc],\n end: [KeyboardCode.Space, KeyboardCode.Enter],\n start: [KeyboardCode.Space, KeyboardCode.Enter],\n },\n onActivation,\n }: KeyboardSensorOptions,\n { active }: { active: { node: React.MutableRefObject<HTMLElement | null> } },\n ) => {\n const { code } = event.nativeEvent\n\n // Only activate if focus is directly on the draggable node, not descendants\n if (event.target !== active.node.current) {\n return false\n }\n\n if (keyboardCodes.start.includes(code)) {\n event.preventDefault()\n onActivation?.({ event: event.nativeEvent })\n return true\n }\n\n return false\n },\n },\n ]\n}\n\nexport function useDashboardSensors() {\n return useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(DirectFocusKeyboardSensor, {\n coordinateGetter: droppableJumpKeyboardCoordinateGetter,\n }),\n )\n}\n"],"names":["KeyboardCode","KeyboardSensor","PointerSensor","useSensor","useSensors","getDroppablePositions","positionTolerance","rowTolerance","result","currentRow","currentY","allDroppables","Array","from","document","querySelectorAll","i","length","element","rect","getBoundingClientRect","width","height","centerX","left","centerY","top","testId","getAttribute","isBeforeDroppable","endsWith","hasOverlapping","some","other","otherIndex","otherRect","otherCenterX","otherCenterY","Math","abs","push","row","findClosestRow","droppables","posY","closestRow","minYDistance","Infinity","droppable","yDistance","findClosestDroppableInRow","rowIndex","posX","closestIndex","minXDistance","xDistance","index","findTargetDroppable","currentCenterX","currentCenterY","direction","currentDroppable","currentIndex","targetRow","droppableJumpKeyboardCoordinateGetter","event","context","currentCoordinates","collisionRect","code","includes","preventDefault","scrollableAncestors","targetDroppable","viewportHeight","window","innerHeight","targetRect","scrollPadding","isAboveViewport","isBelowViewport","bottom","scrollAmount","scrollBy","behavior","newTargetRect","newTargetCenterX","newTargetCenterY","deltaX","deltaY","x","y","DirectFocusKeyboardSensor","activators","eventName","handler","keyboardCodes","cancel","Esc","end","Space","Enter","start","onActivation","active","nativeEvent","target","node","current","useDashboardSensors","activationConstraint","distance","coordinateGetter"],"mappings":"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"}