@plumile/backoffice-react 0.1.105 → 0.1.107

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 (633) hide show
  1. package/lib/esm/_virtual/_rolldown/runtime.js +7 -0
  2. package/lib/esm/auth/AuthRefreshNotice.js +38 -0
  3. package/lib/esm/auth/AuthRefreshNotice.js.map +1 -0
  4. package/lib/esm/auth/TotpQrCode.js +28 -0
  5. package/lib/esm/auth/TotpQrCode.js.map +1 -0
  6. package/lib/esm/auth/authRefreshNotice.css.js +7 -0
  7. package/lib/esm/auth/authRefreshNotice.css.js.map +1 -0
  8. package/lib/esm/{AuthPanel-BaIRFGbX.js → auth/login/AuthPanel.js} +7 -7
  9. package/lib/esm/auth/login/AuthPanel.js.map +1 -0
  10. package/lib/esm/auth/login/EmailCapturePanel.js +50 -0
  11. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -0
  12. package/lib/esm/auth/login/LoginFlow.js +130 -0
  13. package/lib/esm/auth/login/LoginFlow.js.map +1 -0
  14. package/lib/esm/auth/login/MethodChooser.js +49 -0
  15. package/lib/esm/auth/login/MethodChooser.js.map +1 -0
  16. package/lib/esm/auth/login/MfaChallengeForm.js +80 -0
  17. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -0
  18. package/lib/esm/auth/login/OidcButtons.js +29 -0
  19. package/lib/esm/auth/login/OidcButtons.js.map +1 -0
  20. package/lib/esm/auth/login/PasskeyLoginForm.js +81 -0
  21. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -0
  22. package/lib/esm/auth/login/PasswordLoginPanel.js +37 -0
  23. package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -0
  24. package/lib/esm/auth/login/loginPage.css.js +7 -0
  25. package/lib/esm/auth/login/loginPage.css.js.map +1 -0
  26. package/lib/esm/auth/login/synchronizeAuthStatusQuery.js +10 -0
  27. package/lib/esm/auth/login/synchronizeAuthStatusQuery.js.map +1 -0
  28. package/lib/esm/{AcceptInvitationScreen-VaWXQPHp.js → auth/pages/AcceptInvitationScreen.js} +11 -11
  29. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -0
  30. package/lib/esm/{PasswordResetCompleteScreen-Cgg96DPo.js → auth/pages/PasswordResetCompleteScreen.js} +10 -10
  31. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -0
  32. package/lib/esm/{PasswordResetRequestScreen-I1nFvGLd.js → auth/pages/PasswordResetRequestScreen.js} +10 -10
  33. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -0
  34. package/lib/esm/{VerifyEmailScreen-Br5KyHjg.js → auth/pages/VerifyEmailScreen.js} +7 -7
  35. package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -0
  36. package/lib/esm/{BackofficeEntityActionFormDialog-DrZxuytz.js → components/backoffice/actions/BackofficeEntityActionFormDialog.js} +123 -121
  37. package/lib/esm/{BackofficeEntityActionFormDialog-DrZxuytz.js.map → components/backoffice/actions/BackofficeEntityActionFormDialog.js.map} +1 -1
  38. package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js +26 -0
  39. package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -0
  40. package/lib/esm/{backofficeEntityActionFormDialog.css-DJgEKwaA.js → components/backoffice/actions/backofficeEntityActionFormDialog.css.js} +3 -2
  41. package/lib/esm/{backofficeEntityActionFormDialog.css-DJgEKwaA.js.map → components/backoffice/actions/backofficeEntityActionFormDialog.css.js.map} +1 -1
  42. package/lib/esm/{toastViewAction-DQYlcGOL.js → components/backoffice/actions/toastViewAction.js} +2 -2
  43. package/lib/esm/{toastViewAction-DQYlcGOL.js.map → components/backoffice/actions/toastViewAction.js.map} +1 -1
  44. package/lib/esm/{buildDataTableColumns-DdmF-EYq.js → components/backoffice/columns/buildDataTableColumns.js} +18 -18
  45. package/lib/esm/{buildDataTableColumns-DdmF-EYq.js.map → components/backoffice/columns/buildDataTableColumns.js.map} +1 -1
  46. package/lib/esm/components/backoffice/detail/BackofficeAuditMetadataPanel.js +31 -0
  47. package/lib/esm/components/backoffice/detail/BackofficeAuditMetadataPanel.js.map +1 -0
  48. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js +22 -0
  49. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -0
  50. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js +40 -0
  51. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -0
  52. package/lib/esm/components/backoffice/detail/BackofficeDetailField.js +30 -0
  53. package/lib/esm/components/backoffice/detail/BackofficeDetailField.js.map +1 -0
  54. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.css.js +7 -0
  55. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.css.js.map +1 -0
  56. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js +24 -0
  57. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +1 -0
  58. package/lib/esm/components/backoffice/detail/BackofficeDetailLayout.js +20 -0
  59. package/lib/esm/components/backoffice/detail/BackofficeDetailLayout.js.map +1 -0
  60. package/lib/esm/components/backoffice/detail/BackofficeDetailPayload.js +18 -0
  61. package/lib/esm/components/backoffice/detail/BackofficeDetailPayload.js.map +1 -0
  62. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js +56 -0
  63. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -0
  64. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationList.js +11 -0
  65. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationList.js.map +1 -0
  66. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +123 -0
  67. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -0
  68. package/lib/esm/components/backoffice/detail/BackofficeDetailSection.js +36 -0
  69. package/lib/esm/components/backoffice/detail/BackofficeDetailSection.js.map +1 -0
  70. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js +18 -0
  71. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +1 -0
  72. package/lib/esm/components/backoffice/detail/BackofficeEntityRefLink.js +17 -0
  73. package/lib/esm/components/backoffice/detail/BackofficeEntityRefLink.js.map +1 -0
  74. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +72 -0
  75. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -0
  76. package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js +11 -0
  77. package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js.map +1 -0
  78. package/lib/esm/components/backoffice/detail/BackofficeKpiStrip.js +35 -0
  79. package/lib/esm/components/backoffice/detail/BackofficeKpiStrip.js.map +1 -0
  80. package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js +37 -0
  81. package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -0
  82. package/lib/esm/components/backoffice/detail/BackofficePayloadInspectorSection.js +36 -0
  83. package/lib/esm/components/backoffice/detail/BackofficePayloadInspectorSection.js.map +1 -0
  84. package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js +22 -0
  85. package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js.map +1 -0
  86. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +43 -0
  87. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -0
  88. package/lib/esm/components/backoffice/detail/BackofficeScopeStack.js +28 -0
  89. package/lib/esm/components/backoffice/detail/BackofficeScopeStack.js.map +1 -0
  90. package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js +27 -0
  91. package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js.map +1 -0
  92. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js +37 -0
  93. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -0
  94. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +84 -0
  95. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -0
  96. package/lib/esm/components/backoffice/detail/backofficeAuditMetadataPanel.css.js +7 -0
  97. package/lib/esm/components/backoffice/detail/backofficeAuditMetadataPanel.css.js.map +1 -0
  98. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +7 -0
  99. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js.map +1 -0
  100. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +7 -0
  101. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js.map +1 -0
  102. package/lib/esm/components/backoffice/detail/backofficeDetailField.css.js +15 -0
  103. package/lib/esm/components/backoffice/detail/backofficeDetailField.css.js.map +1 -0
  104. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +7 -0
  105. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js.map +1 -0
  106. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +7 -0
  107. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js.map +1 -0
  108. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +7 -0
  109. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js.map +1 -0
  110. package/lib/esm/components/backoffice/detail/backofficeDetailSection.css.js +7 -0
  111. package/lib/esm/components/backoffice/detail/backofficeDetailSection.css.js.map +1 -0
  112. package/lib/esm/components/backoffice/detail/backofficeDetailTaggedValue.css.js +7 -0
  113. package/lib/esm/components/backoffice/detail/backofficeDetailTaggedValue.css.js.map +1 -0
  114. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +7 -0
  115. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js.map +1 -0
  116. package/lib/esm/components/backoffice/detail/backofficeKpiStrip.css.js +7 -0
  117. package/lib/esm/components/backoffice/detail/backofficeKpiStrip.css.js.map +1 -0
  118. package/lib/esm/components/backoffice/detail/backofficeLifecycleTimelineSection.css.js +7 -0
  119. package/lib/esm/components/backoffice/detail/backofficeLifecycleTimelineSection.css.js.map +1 -0
  120. package/lib/esm/components/backoffice/detail/backofficePayloadInspectorSection.css.js +7 -0
  121. package/lib/esm/components/backoffice/detail/backofficePayloadInspectorSection.css.js.map +1 -0
  122. package/lib/esm/components/backoffice/detail/backofficeReferenceValue.css.js +7 -0
  123. package/lib/esm/components/backoffice/detail/backofficeReferenceValue.css.js.map +1 -0
  124. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +7 -0
  125. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js.map +1 -0
  126. package/lib/esm/components/backoffice/detail/backofficeScopeStack.css.js +7 -0
  127. package/lib/esm/components/backoffice/detail/backofficeScopeStack.css.js.map +1 -0
  128. package/lib/esm/components/backoffice/detail/backofficeStatusMetaBadge.css.js +7 -0
  129. package/lib/esm/components/backoffice/detail/backofficeStatusMetaBadge.css.js.map +1 -0
  130. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +7 -0
  131. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js.map +1 -0
  132. package/lib/esm/components/backoffice/detail/createBackofficeEntityLinkProps.js +21 -0
  133. package/lib/esm/components/backoffice/detail/createBackofficeEntityLinkProps.js.map +1 -0
  134. package/lib/esm/components/backoffice/detail/detailPayloadUtils.js +17 -0
  135. package/lib/esm/components/backoffice/detail/detailPayloadUtils.js.map +1 -0
  136. package/lib/esm/{BackofficeErrorBoundary-BwRVSDHU.js → components/backoffice/errors/BackofficeErrorBoundary.js} +2 -2
  137. package/lib/esm/{BackofficeErrorBoundary-BwRVSDHU.js.map → components/backoffice/errors/BackofficeErrorBoundary.js.map} +1 -1
  138. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +46 -0
  139. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -0
  140. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js +67 -0
  141. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -0
  142. package/lib/esm/components/backoffice/filters/EntityFilterValue.js +46 -0
  143. package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -0
  144. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +65 -0
  145. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -0
  146. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +7 -0
  147. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js.map +1 -0
  148. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +7 -0
  149. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -0
  150. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +7 -0
  151. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js.map +1 -0
  152. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +83 -0
  153. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -0
  154. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +7 -0
  155. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js.map +1 -0
  156. package/lib/esm/{BackofficePermissionsContext-C2bdxy2z.js → components/backoffice/layout/BackofficePermissionsContext.js} +2 -2
  157. package/lib/esm/{BackofficePermissionsContext-C2bdxy2z.js.map → components/backoffice/layout/BackofficePermissionsContext.js.map} +1 -1
  158. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +7 -0
  159. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js.map +1 -0
  160. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js +10 -0
  161. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js.map +1 -0
  162. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +69 -0
  163. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -0
  164. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortal.js +12 -0
  165. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortal.js.map +1 -0
  166. package/lib/esm/{BackofficeTopbarPortalContext-Da5XFatM.js → components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js} +2 -2
  167. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -0
  168. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js +16 -0
  169. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -0
  170. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +7 -0
  171. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js.map +1 -0
  172. package/lib/esm/{buildBreadcrumbs-C5St167Y.js → components/backoffice/layout/breadcrumb/buildBreadcrumbs.js} +7 -3
  173. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -0
  174. package/lib/esm/components/backoffice/layout/breadcrumb/types.js +0 -0
  175. package/lib/esm/components/backoffice/layout/buildSidebarSections.js +301 -0
  176. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -0
  177. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js +18 -0
  178. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -0
  179. package/lib/esm/{sidebarUtils-BgCBLJLv.js → components/backoffice/layout/sidebarUtils.js} +32 -22
  180. package/lib/esm/{sidebarUtils-BgCBLJLv.js.map → components/backoffice/layout/sidebarUtils.js.map} +1 -1
  181. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +7 -0
  182. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js.map +1 -0
  183. package/lib/esm/components/backoffice/list/RowFlagsCell.js +37 -0
  184. package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -0
  185. package/lib/esm/components/backoffice/lists/BackofficeListToolbar.js +33 -0
  186. package/lib/esm/components/backoffice/lists/BackofficeListToolbar.js.map +1 -0
  187. package/lib/esm/components/backoffice/lists/backofficeListToolbar.css.js +13 -0
  188. package/lib/esm/components/backoffice/lists/backofficeListToolbar.css.js.map +1 -0
  189. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js +31 -0
  190. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -0
  191. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +7 -0
  192. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js.map +1 -0
  193. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +117 -0
  194. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -0
  195. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +7 -0
  196. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js.map +1 -0
  197. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js +27 -0
  198. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js.map +1 -0
  199. package/lib/esm/components/backoffice/pickers/shared/EntityPickerRowBase.js +23 -0
  200. package/lib/esm/components/backoffice/pickers/shared/EntityPickerRowBase.js.map +1 -0
  201. package/lib/esm/components/backoffice/pickers/shared/EntityPickerShell.js +28 -0
  202. package/lib/esm/components/backoffice/pickers/shared/EntityPickerShell.js.map +1 -0
  203. package/lib/esm/components/backoffice/pickers/types.js +0 -0
  204. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js +35 -0
  205. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -0
  206. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js +30 -0
  207. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -0
  208. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +65 -0
  209. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -0
  210. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +7 -0
  211. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js.map +1 -0
  212. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +7 -0
  213. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js.map +1 -0
  214. package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js +24 -0
  215. package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js.map +1 -0
  216. package/lib/esm/components/backoffice/routing/BackofficeContentError.js +27 -0
  217. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -0
  218. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js +47 -0
  219. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -0
  220. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js +25 -0
  221. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -0
  222. package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js +12 -0
  223. package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +1 -0
  224. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +7 -0
  225. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js.map +1 -0
  226. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +7 -0
  227. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js.map +1 -0
  228. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +7 -0
  229. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js.map +1 -0
  230. package/lib/esm/components/backoffice/routing/backofficeRouteFallback.css.js +7 -0
  231. package/lib/esm/components/backoffice/routing/backofficeRouteFallback.css.js.map +1 -0
  232. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js +7 -0
  233. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js.map +1 -0
  234. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js +12 -0
  235. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js.map +1 -0
  236. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +506 -0
  237. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -0
  238. package/lib/esm/components/backoffice/scaffolds/BackofficeListFilterContext.js +40 -0
  239. package/lib/esm/components/backoffice/scaffolds/BackofficeListFilterContext.js.map +1 -0
  240. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +24 -0
  241. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -0
  242. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +7 -0
  243. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js.map +1 -0
  244. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +7 -0
  245. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js.map +1 -0
  246. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +41 -0
  247. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -0
  248. package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js +17 -0
  249. package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js.map +1 -0
  250. package/lib/esm/components/backoffice/shared/BackofficeFormattedNumber.js +17 -0
  251. package/lib/esm/components/backoffice/shared/BackofficeFormattedNumber.js.map +1 -0
  252. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js +12 -0
  253. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -0
  254. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +16 -0
  255. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js.map +1 -0
  256. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +7 -0
  257. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js.map +1 -0
  258. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +41 -0
  259. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -0
  260. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +48 -0
  261. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -0
  262. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js +63 -0
  263. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -0
  264. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js +35 -0
  265. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -0
  266. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +7 -0
  267. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -0
  268. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +7 -0
  269. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js.map +1 -0
  270. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +7 -0
  271. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js.map +1 -0
  272. package/lib/esm/components/backoffice/tools/parseToolJson.js +13 -0
  273. package/lib/esm/components/backoffice/tools/parseToolJson.js.map +1 -0
  274. package/lib/esm/filters/filterHelpers.js +26 -0
  275. package/lib/esm/filters/filterHelpers.js.map +1 -0
  276. package/lib/esm/hooks/useAuth.js +444 -0
  277. package/lib/esm/hooks/useAuth.js.map +1 -0
  278. package/lib/esm/hooks/useBackofficeAuth.js +89 -0
  279. package/lib/esm/hooks/useBackofficeAuth.js.map +1 -0
  280. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js +39 -0
  281. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js.map +1 -0
  282. package/lib/esm/hooks/useBackofficeListRefetch.js +50 -0
  283. package/lib/esm/hooks/useBackofficeListRefetch.js.map +1 -0
  284. package/lib/esm/{useBackofficeListUrlState-Ca6d7uIN.js → hooks/useBackofficeListUrlState.js} +2 -2
  285. package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -0
  286. package/lib/esm/hooks/useBackofficeLoadMore.js +18 -0
  287. package/lib/esm/hooks/useBackofficeLoadMore.js.map +1 -0
  288. package/lib/esm/hooks/useBackofficeSessionAuth.js +33 -0
  289. package/lib/esm/hooks/useBackofficeSessionAuth.js.map +1 -0
  290. package/lib/esm/hooks/useBackofficeSidebarPins.js +89 -0
  291. package/lib/esm/hooks/useBackofficeSidebarPins.js.map +1 -0
  292. package/lib/esm/hooks/useConditionalSubscription.js +63 -0
  293. package/lib/esm/hooks/useConditionalSubscription.js.map +1 -0
  294. package/lib/esm/hooks/useCopyToClipboard.js +31 -0
  295. package/lib/esm/hooks/useCopyToClipboard.js.map +1 -0
  296. package/lib/esm/hooks/useInfiniteConnection.js +95 -0
  297. package/lib/esm/hooks/useInfiniteConnection.js.map +1 -0
  298. package/lib/esm/hooks/useRefetchNeededReload.js +23 -0
  299. package/lib/esm/hooks/useRefetchNeededReload.js.map +1 -0
  300. package/lib/esm/hooks/useSidebarGroupCollapse.js +70 -0
  301. package/lib/esm/hooks/useSidebarGroupCollapse.js.map +1 -0
  302. package/lib/esm/i18n/createI18nInstance.js +68 -0
  303. package/lib/esm/i18n/createI18nInstance.js.map +1 -0
  304. package/lib/esm/i18n/locales/en/backofficeReact.js +436 -0
  305. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -0
  306. package/lib/esm/i18n/locales/fr/backofficeReact.js +439 -0
  307. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -0
  308. package/lib/esm/i18n/mergeResourceLanguages.js +22 -0
  309. package/lib/esm/i18n/mergeResourceLanguages.js.map +1 -0
  310. package/lib/esm/i18n/resources.js +23 -0
  311. package/lib/esm/i18n/resources.js.map +1 -0
  312. package/lib/esm/i18n/useBackofficeFormats.js +23 -0
  313. package/lib/esm/i18n/useBackofficeFormats.js.map +1 -0
  314. package/lib/esm/i18n/useBackofficeReactTranslation.js +9 -0
  315. package/lib/esm/i18n/useBackofficeReactTranslation.js.map +1 -0
  316. package/lib/esm/i18n/useReviewStatusLabel.js +19 -0
  317. package/lib/esm/i18n/useReviewStatusLabel.js.map +1 -0
  318. package/lib/esm/index.js +73 -0
  319. package/lib/esm/modules/base64.js +21 -0
  320. package/lib/esm/modules/base64.js.map +1 -0
  321. package/lib/esm/modules/formatFileSize.js +28 -0
  322. package/lib/esm/modules/formatFileSize.js.map +1 -0
  323. package/lib/esm/modules/sharedSchemaTypes.js +0 -0
  324. package/lib/esm/modules/webauthn.js +33 -0
  325. package/lib/esm/modules/webauthn.js.map +1 -0
  326. package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +15 -0
  327. package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +1 -0
  328. package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +15 -0
  329. package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +1 -0
  330. package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js +20 -0
  331. package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js.map +1 -0
  332. package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js +13 -0
  333. package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +1 -0
  334. package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js +13 -0
  335. package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js.map +1 -0
  336. package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js +13 -0
  337. package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +1 -0
  338. package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js +33 -0
  339. package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js.map +1 -0
  340. package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js +19 -0
  341. package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js.map +1 -0
  342. package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js +18 -0
  343. package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +1 -0
  344. package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js +22 -0
  345. package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js.map +1 -0
  346. package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js +17 -0
  347. package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +1 -0
  348. package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js +18 -0
  349. package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js.map +1 -0
  350. package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +19 -0
  351. package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +1 -0
  352. package/lib/esm/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js +80 -0
  353. package/lib/esm/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js.map +1 -0
  354. package/lib/esm/node_modules/fbjs/lib/areEqual.js +42 -0
  355. package/lib/esm/node_modules/fbjs/lib/areEqual.js.map +1 -0
  356. package/lib/esm/node_modules/invariant/browser.js +30 -0
  357. package/lib/esm/node_modules/invariant/browser.js.map +1 -0
  358. package/lib/esm/node_modules/relay-test-utils/index.js +11 -0
  359. package/lib/esm/node_modules/relay-test-utils/index.js.map +1 -0
  360. package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js +288 -0
  361. package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js.map +1 -0
  362. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js +183 -0
  363. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +1 -0
  364. package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js +19 -0
  365. package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js.map +1 -0
  366. package/lib/esm/node_modules/relay-test-utils/lib/index.js +21 -0
  367. package/lib/esm/node_modules/relay-test-utils/lib/index.js.map +1 -0
  368. package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js +16 -0
  369. package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js.map +1 -0
  370. package/lib/esm/pages/BackofficeAcceptInvitationPage.js +24 -0
  371. package/lib/esm/pages/BackofficeAcceptInvitationPage.js.map +1 -0
  372. package/lib/esm/pages/BackofficeDashboardPage.helpers.js +18 -0
  373. package/lib/esm/pages/BackofficeDashboardPage.helpers.js.map +1 -0
  374. package/lib/esm/pages/BackofficeDashboardPage.js +266 -0
  375. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -0
  376. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +18 -0
  377. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -0
  378. package/lib/esm/pages/BackofficeEntityDetailPage.helpers.js +14 -0
  379. package/lib/esm/pages/BackofficeEntityDetailPage.helpers.js.map +1 -0
  380. package/lib/esm/pages/BackofficeEntityDetailPage.js +474 -0
  381. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -0
  382. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +414 -0
  383. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -0
  384. package/lib/esm/{BackofficeEntityDetailUnknownPageRedirect-Iu4R3WvX.js → pages/BackofficeEntityDetailUnknownPageRedirect.js} +3 -3
  385. package/lib/esm/pages/BackofficeEntityDetailUnknownPageRedirect.js.map +1 -0
  386. package/lib/esm/pages/BackofficeEntityListPage.helpers.js +37 -0
  387. package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -0
  388. package/lib/esm/pages/BackofficeEntityListPage.js +381 -0
  389. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -0
  390. package/lib/esm/{BackofficeHubPage-DOePQ8Fc.js → pages/BackofficeHubPage.js} +29 -28
  391. package/lib/esm/pages/BackofficeHubPage.js.map +1 -0
  392. package/lib/esm/pages/BackofficeLayoutPage.js +273 -0
  393. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -0
  394. package/lib/esm/pages/BackofficeLoginPage.js +47 -0
  395. package/lib/esm/pages/BackofficeLoginPage.js.map +1 -0
  396. package/lib/esm/{BackofficePasswordResetCompletePage-Cit5sdDm.js → pages/BackofficePasswordResetCompletePage.js} +16 -15
  397. package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -0
  398. package/lib/esm/{BackofficePasswordResetRequestPage-B_TurHev.js → pages/BackofficePasswordResetRequestPage.js} +12 -12
  399. package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -0
  400. package/lib/esm/{BackofficeVerifyEmailPage-DQbFIob1.js → pages/BackofficeVerifyEmailPage.js} +16 -15
  401. package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -0
  402. package/lib/esm/pages/backofficeDashboardPage.css.js +7 -0
  403. package/lib/esm/pages/backofficeDashboardPage.css.js.map +1 -0
  404. package/lib/esm/pages/backofficeEntityDetailPage.css.js +7 -0
  405. package/lib/esm/pages/backofficeEntityDetailPage.css.js.map +1 -0
  406. package/lib/esm/pages/backofficeEntityListPage.css.js +7 -0
  407. package/lib/esm/pages/backofficeEntityListPage.css.js.map +1 -0
  408. package/lib/esm/pages/dashboard/DashboardMetricGroup.js +25 -0
  409. package/lib/esm/pages/dashboard/DashboardMetricGroup.js.map +1 -0
  410. package/lib/esm/pages/dashboard/DashboardPanel.js +15 -0
  411. package/lib/esm/pages/dashboard/DashboardPanel.js.map +1 -0
  412. package/lib/esm/pages/dashboard/DashboardQuickActions.js +27 -0
  413. package/lib/esm/pages/dashboard/DashboardQuickActions.js.map +1 -0
  414. package/lib/esm/pages/dashboard/DashboardStatusList.js +28 -0
  415. package/lib/esm/pages/dashboard/DashboardStatusList.js.map +1 -0
  416. package/lib/esm/pages/dashboard/dashboardMetricGroup.css.js +8 -0
  417. package/lib/esm/pages/dashboard/dashboardMetricGroup.css.js.map +1 -0
  418. package/lib/esm/pages/dashboard/dashboardPanel.css.js +7 -0
  419. package/lib/esm/pages/dashboard/dashboardPanel.css.js.map +1 -0
  420. package/lib/esm/pages/dashboard/dashboardQuickActions.css.js +7 -0
  421. package/lib/esm/pages/dashboard/dashboardQuickActions.css.js.map +1 -0
  422. package/lib/esm/pages/dashboard/dashboardStatusList.css.js +7 -0
  423. package/lib/esm/pages/dashboard/dashboardStatusList.css.js.map +1 -0
  424. package/lib/esm/{BackofficeEntityDetailLayoutContext-C5G-PH28.js → pages/detail/BackofficeEntityDetailLayoutContext.js} +2 -2
  425. package/lib/esm/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -0
  426. package/lib/esm/pages/detail/buildTabsItems.js +10 -0
  427. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -0
  428. package/lib/esm/{pageResolution-CUaTq4Ql.js → pages/detail/pageResolution.js} +2 -2
  429. package/lib/esm/pages/detail/pageResolution.js.map +1 -0
  430. package/lib/esm/provider/BackofficeConfigContext.js +12 -0
  431. package/lib/esm/provider/BackofficeConfigContext.js.map +1 -0
  432. package/lib/esm/provider/BackofficeProvider.js +171 -0
  433. package/lib/esm/provider/BackofficeProvider.js.map +1 -0
  434. package/lib/esm/provider/entityRegistry.js +95 -0
  435. package/lib/esm/provider/entityRegistry.js.map +1 -0
  436. package/lib/esm/provider/lazyValue.js +14 -0
  437. package/lib/esm/provider/lazyValue.js.map +1 -0
  438. package/lib/esm/provider/types.js +0 -0
  439. package/lib/esm/provider/useBackofficeEntityLoader.js +141 -0
  440. package/lib/esm/provider/useBackofficeEntityLoader.js.map +1 -0
  441. package/lib/esm/{useBackofficeLazyValue-CW9xfRzQ.js → provider/useBackofficeLazyValue.js} +15 -7
  442. package/lib/esm/provider/useBackofficeLazyValue.js.map +1 -0
  443. package/lib/esm/relay/RelayProvider.js +13 -0
  444. package/lib/esm/relay/RelayProvider.js.map +1 -0
  445. package/lib/esm/relay/connectionUtils.js +19 -0
  446. package/lib/esm/relay/connectionUtils.js.map +1 -0
  447. package/lib/esm/relay/createInlineDataReader.js +2 -0
  448. package/lib/esm/relay/createInlineReader.js +7 -0
  449. package/lib/esm/relay/createInlineReader.js.map +1 -0
  450. package/lib/esm/relay/envHelpers.js +55 -0
  451. package/lib/esm/relay/envHelpers.js.map +1 -0
  452. package/lib/esm/{environment-DQfVyWHJ.js → relay/environment.js} +90 -100
  453. package/lib/esm/relay/environment.js.map +1 -0
  454. package/lib/esm/relay/identityView.js +6 -0
  455. package/lib/esm/relay/identityView.js.map +1 -0
  456. package/lib/esm/{mutationResult-C2Vb_vPt.js → relay/mutationResult.js} +2 -2
  457. package/lib/esm/relay/mutationResult.js.map +1 -0
  458. package/lib/esm/{useRelayEnvironment-vQ86aW-n.js → relay/useRelayEnvironment.js} +2 -2
  459. package/lib/esm/relay/useRelayEnvironment.js.map +1 -0
  460. package/lib/esm/{backofficeAuthPaths-2hHNn8D3.js → router/backofficeAuthPaths.js} +2 -2
  461. package/lib/esm/router/backofficeAuthPaths.js.map +1 -0
  462. package/lib/esm/router/createBackofficeRoutes.js +322 -0
  463. package/lib/esm/router/createBackofficeRoutes.js.map +1 -0
  464. package/lib/esm/storybook/relay/RelayStory.css.js +7 -0
  465. package/lib/esm/storybook/relay/RelayStory.css.js.map +1 -0
  466. package/lib/esm/storybook/relay/RelayStory.js +86 -0
  467. package/lib/esm/storybook/relay/RelayStory.js.map +1 -0
  468. package/lib/esm/storybook/relay/mockResolvers.js +99 -0
  469. package/lib/esm/storybook/relay/mockResolvers.js.map +1 -0
  470. package/lib/esm/storybook/relay/relay-test-utils.d.js +0 -0
  471. package/lib/esm/style.css +1 -1
  472. package/lib/esm/style.js +1 -0
  473. package/lib/esm/subscriptions/useCursorResumableSubscription.js +29 -0
  474. package/lib/esm/subscriptions/useCursorResumableSubscription.js.map +1 -0
  475. package/lib/types/auth/AuthRefreshNotice.d.ts +14 -0
  476. package/lib/types/auth/AuthRefreshNotice.d.ts.map +1 -0
  477. package/lib/types/auth/TotpQrCode.d.ts +17 -0
  478. package/lib/types/auth/TotpQrCode.d.ts.map +1 -0
  479. package/lib/types/auth/authRefreshNotice.css.d.ts +4 -0
  480. package/lib/types/auth/authRefreshNotice.css.d.ts.map +1 -0
  481. package/lib/types/components/backoffice/detail/BackofficeAuditMetadataPanel.d.ts +19 -0
  482. package/lib/types/components/backoffice/detail/BackofficeAuditMetadataPanel.d.ts.map +1 -0
  483. package/lib/types/components/backoffice/detail/BackofficeEntityRefLink.d.ts +15 -0
  484. package/lib/types/components/backoffice/detail/BackofficeEntityRefLink.d.ts.map +1 -0
  485. package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts +34 -0
  486. package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts.map +1 -0
  487. package/lib/types/components/backoffice/detail/BackofficeEnumLabel.d.ts +9 -0
  488. package/lib/types/components/backoffice/detail/BackofficeEnumLabel.d.ts.map +1 -0
  489. package/lib/types/components/backoffice/detail/BackofficeKpiStrip.d.ts +17 -0
  490. package/lib/types/components/backoffice/detail/BackofficeKpiStrip.d.ts.map +1 -0
  491. package/lib/types/components/backoffice/detail/BackofficeLifecycleTimelineSection.d.ts +20 -0
  492. package/lib/types/components/backoffice/detail/BackofficeLifecycleTimelineSection.d.ts.map +1 -0
  493. package/lib/types/components/backoffice/detail/BackofficePayloadInspectorSection.d.ts +15 -0
  494. package/lib/types/components/backoffice/detail/BackofficePayloadInspectorSection.d.ts.map +1 -0
  495. package/lib/types/components/backoffice/detail/BackofficeReferenceValue.d.ts +9 -0
  496. package/lib/types/components/backoffice/detail/BackofficeReferenceValue.d.ts.map +1 -0
  497. package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts +17 -0
  498. package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts.map +1 -0
  499. package/lib/types/components/backoffice/detail/BackofficeScopeStack.d.ts +13 -0
  500. package/lib/types/components/backoffice/detail/BackofficeScopeStack.d.ts.map +1 -0
  501. package/lib/types/components/backoffice/detail/BackofficeStatusMetaBadge.d.ts +13 -0
  502. package/lib/types/components/backoffice/detail/BackofficeStatusMetaBadge.d.ts.map +1 -0
  503. package/lib/types/components/backoffice/detail/BackofficeTokenUsageBreakdown.d.ts +18 -0
  504. package/lib/types/components/backoffice/detail/BackofficeTokenUsageBreakdown.d.ts.map +1 -0
  505. package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts +31 -0
  506. package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts.map +1 -0
  507. package/lib/types/components/backoffice/detail/backofficeAuditMetadataPanel.css.d.ts +5 -0
  508. package/lib/types/components/backoffice/detail/backofficeAuditMetadataPanel.css.d.ts.map +1 -0
  509. package/lib/types/components/backoffice/detail/backofficeEntitySummaryHeader.css.d.ts +12 -0
  510. package/lib/types/components/backoffice/detail/backofficeEntitySummaryHeader.css.d.ts.map +1 -0
  511. package/lib/types/components/backoffice/detail/backofficeKpiStrip.css.d.ts +5 -0
  512. package/lib/types/components/backoffice/detail/backofficeKpiStrip.css.d.ts.map +1 -0
  513. package/lib/types/components/backoffice/detail/backofficeLifecycleTimelineSection.css.d.ts +3 -0
  514. package/lib/types/components/backoffice/detail/backofficeLifecycleTimelineSection.css.d.ts.map +1 -0
  515. package/lib/types/components/backoffice/detail/backofficePayloadInspectorSection.css.d.ts +4 -0
  516. package/lib/types/components/backoffice/detail/backofficePayloadInspectorSection.css.d.ts.map +1 -0
  517. package/lib/types/components/backoffice/detail/backofficeReferenceValue.css.d.ts +3 -0
  518. package/lib/types/components/backoffice/detail/backofficeReferenceValue.css.d.ts.map +1 -0
  519. package/lib/types/components/backoffice/detail/backofficeRelationsSummaryGrid.css.d.ts +6 -0
  520. package/lib/types/components/backoffice/detail/backofficeRelationsSummaryGrid.css.d.ts.map +1 -0
  521. package/lib/types/components/backoffice/detail/backofficeScopeStack.css.d.ts +5 -0
  522. package/lib/types/components/backoffice/detail/backofficeScopeStack.css.d.ts.map +1 -0
  523. package/lib/types/components/backoffice/detail/backofficeStatusMetaBadge.css.d.ts +2 -0
  524. package/lib/types/components/backoffice/detail/backofficeStatusMetaBadge.css.d.ts.map +1 -0
  525. package/lib/types/components/backoffice/detail/backofficeUsageCostBreakdown.css.d.ts +7 -0
  526. package/lib/types/components/backoffice/detail/backofficeUsageCostBreakdown.css.d.ts.map +1 -0
  527. package/lib/types/components/backoffice/detail/createBackofficeEntityLinkProps.d.ts +30 -0
  528. package/lib/types/components/backoffice/detail/createBackofficeEntityLinkProps.d.ts.map +1 -0
  529. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts +12 -0
  530. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts.map +1 -0
  531. package/lib/types/components/backoffice/filters/EntityIdFilterField.stories.d.ts +12 -0
  532. package/lib/types/components/backoffice/filters/EntityIdFilterField.stories.d.ts.map +1 -0
  533. package/lib/types/components/backoffice/overview/BackofficeOverviewLayout.stories.d.ts +11 -0
  534. package/lib/types/components/backoffice/overview/BackofficeOverviewLayout.stories.d.ts.map +1 -0
  535. package/lib/types/components/backoffice/refs/BackofficeEntityLink.d.ts +15 -0
  536. package/lib/types/components/backoffice/refs/BackofficeEntityLink.d.ts.map +1 -0
  537. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.stories.d.ts +11 -0
  538. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.stories.d.ts.map +1 -0
  539. package/lib/types/components/backoffice/shared/BackofficeFormattedCurrency.d.ts +9 -0
  540. package/lib/types/components/backoffice/shared/BackofficeFormattedCurrency.d.ts.map +1 -0
  541. package/lib/types/components/backoffice/shared/BackofficeFormattedNumber.d.ts +9 -0
  542. package/lib/types/components/backoffice/shared/BackofficeFormattedNumber.d.ts.map +1 -0
  543. package/lib/types/components/backoffice/tools/BackofficeToolsDocPanel.d.ts +11 -0
  544. package/lib/types/components/backoffice/tools/BackofficeToolsDocPanel.d.ts.map +1 -0
  545. package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts +8 -0
  546. package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts.map +1 -0
  547. package/lib/types/components/backoffice/tools/BackofficeToolsJsonForm.d.ts +15 -0
  548. package/lib/types/components/backoffice/tools/BackofficeToolsJsonForm.d.ts.map +1 -0
  549. package/lib/types/components/backoffice/tools/BackofficeToolsQueryBoundary.d.ts +7 -0
  550. package/lib/types/components/backoffice/tools/BackofficeToolsQueryBoundary.d.ts.map +1 -0
  551. package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts +8 -0
  552. package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +1 -0
  553. package/lib/types/components/backoffice/tools/backofficeToolsForm.css.d.ts +7 -0
  554. package/lib/types/components/backoffice/tools/backofficeToolsForm.css.d.ts.map +1 -0
  555. package/lib/types/components/backoffice/tools/backofficeToolsJsonForm.css.d.ts +4 -0
  556. package/lib/types/components/backoffice/tools/backofficeToolsJsonForm.css.d.ts.map +1 -0
  557. package/lib/types/components/backoffice/tools/parseToolJson.d.ts +2 -0
  558. package/lib/types/components/backoffice/tools/parseToolJson.d.ts.map +1 -0
  559. package/lib/types/hooks/useInfiniteConnection.d.ts +37 -0
  560. package/lib/types/hooks/useInfiniteConnection.d.ts.map +1 -0
  561. package/lib/types/i18n/resources.d.ts +54 -0
  562. package/lib/types/i18n/resources.d.ts.map +1 -1
  563. package/lib/types/index.d.ts +28 -0
  564. package/lib/types/index.d.ts.map +1 -1
  565. package/lib/types/relay/connectionUtils.d.ts +10 -0
  566. package/lib/types/relay/connectionUtils.d.ts.map +1 -0
  567. package/lib/types/storybook/relay/RelayStory.css.d.ts +5 -0
  568. package/lib/types/storybook/relay/RelayStory.css.d.ts.map +1 -0
  569. package/lib/types/storybook/relay/RelayStory.d.ts +35 -0
  570. package/lib/types/storybook/relay/RelayStory.d.ts.map +1 -0
  571. package/lib/types/storybook/relay/mockResolvers.d.ts +3 -0
  572. package/lib/types/storybook/relay/mockResolvers.d.ts.map +1 -0
  573. package/lib/types/subscriptions/useCursorResumableSubscription.d.ts +16 -0
  574. package/lib/types/subscriptions/useCursorResumableSubscription.d.ts.map +1 -0
  575. package/package.json +24 -9
  576. package/lib/esm/AcceptInvitationScreen-VaWXQPHp.js.map +0 -1
  577. package/lib/esm/AuthPanel-BaIRFGbX.js.map +0 -1
  578. package/lib/esm/BackofficeAcceptInvitationPage-tpfBfhT9.js +0 -24
  579. package/lib/esm/BackofficeAcceptInvitationPage-tpfBfhT9.js.map +0 -1
  580. package/lib/esm/BackofficeDashboardPage-D5W36DY-.js +0 -329
  581. package/lib/esm/BackofficeDashboardPage-D5W36DY-.js.map +0 -1
  582. package/lib/esm/BackofficeDetailPayload-CZcsDv2w.js +0 -98
  583. package/lib/esm/BackofficeDetailPayload-CZcsDv2w.js.map +0 -1
  584. package/lib/esm/BackofficeEntityDetailLayoutContext-C5G-PH28.js.map +0 -1
  585. package/lib/esm/BackofficeEntityDetailLayoutPage-BSgGBzSL.js +0 -18
  586. package/lib/esm/BackofficeEntityDetailLayoutPage-BSgGBzSL.js.map +0 -1
  587. package/lib/esm/BackofficeEntityDetailPage-LB1uEJVM.js +0 -1061
  588. package/lib/esm/BackofficeEntityDetailPage-LB1uEJVM.js.map +0 -1
  589. package/lib/esm/BackofficeEntityDetailUnknownPageRedirect-Iu4R3WvX.js.map +0 -1
  590. package/lib/esm/BackofficeEntityListPage-D_zL-qRb.js +0 -432
  591. package/lib/esm/BackofficeEntityListPage-D_zL-qRb.js.map +0 -1
  592. package/lib/esm/BackofficeHubPage-DOePQ8Fc.js.map +0 -1
  593. package/lib/esm/BackofficeHubTemplate-C6K55egX.js +0 -82
  594. package/lib/esm/BackofficeHubTemplate-C6K55egX.js.map +0 -1
  595. package/lib/esm/BackofficeLayoutPage-Bq2bKkYF.js +0 -783
  596. package/lib/esm/BackofficeLayoutPage-Bq2bKkYF.js.map +0 -1
  597. package/lib/esm/BackofficeListToolbar-loFfIPtP.js +0 -109
  598. package/lib/esm/BackofficeListToolbar-loFfIPtP.js.map +0 -1
  599. package/lib/esm/BackofficeLoginPage-DIlcOueK.js +0 -46
  600. package/lib/esm/BackofficeLoginPage-DIlcOueK.js.map +0 -1
  601. package/lib/esm/BackofficePasswordResetCompletePage-Cit5sdDm.js.map +0 -1
  602. package/lib/esm/BackofficePasswordResetRequestPage-B_TurHev.js.map +0 -1
  603. package/lib/esm/BackofficeRightPageLayout-CfNkrMvH.js +0 -83
  604. package/lib/esm/BackofficeRightPageLayout-CfNkrMvH.js.map +0 -1
  605. package/lib/esm/BackofficeTopbarPortalContext-Da5XFatM.js.map +0 -1
  606. package/lib/esm/BackofficeVerifyEmailPage-DQbFIob1.js.map +0 -1
  607. package/lib/esm/EntityIdPickerDialog-BSn0v3bv.js +0 -340
  608. package/lib/esm/EntityIdPickerDialog-BSn0v3bv.js.map +0 -1
  609. package/lib/esm/LazyBackofficeEntityActionFormDialog-oRd_WHAK.js +0 -670
  610. package/lib/esm/LazyBackofficeEntityActionFormDialog-oRd_WHAK.js.map +0 -1
  611. package/lib/esm/PasswordResetCompleteScreen-Cgg96DPo.js.map +0 -1
  612. package/lib/esm/PasswordResetRequestScreen-I1nFvGLd.js.map +0 -1
  613. package/lib/esm/VerifyEmailScreen-Br5KyHjg.js.map +0 -1
  614. package/lib/esm/backoffice-react.js +0 -1925
  615. package/lib/esm/backoffice-react.js.map +0 -1
  616. package/lib/esm/backofficeAuthPaths-2hHNn8D3.js.map +0 -1
  617. package/lib/esm/buildBreadcrumbs-C5St167Y.js.map +0 -1
  618. package/lib/esm/environment-DQfVyWHJ.js.map +0 -1
  619. package/lib/esm/loginPage.css-B7Io_DuU.js +0 -6
  620. package/lib/esm/loginPage.css-B7Io_DuU.js.map +0 -1
  621. package/lib/esm/mutationResult-C2Vb_vPt.js.map +0 -1
  622. package/lib/esm/pageResolution-CUaTq4Ql.js.map +0 -1
  623. package/lib/esm/synchronizeAuthStatusQuery-DNJR5MfH.js +0 -323
  624. package/lib/esm/synchronizeAuthStatusQuery-DNJR5MfH.js.map +0 -1
  625. package/lib/esm/useAuth-CWf8ZspF.js +0 -548
  626. package/lib/esm/useAuth-CWf8ZspF.js.map +0 -1
  627. package/lib/esm/useBackofficeAuth-Da7FPNys.js +0 -89
  628. package/lib/esm/useBackofficeAuth-Da7FPNys.js.map +0 -1
  629. package/lib/esm/useBackofficeLazyValue-CW9xfRzQ.js.map +0 -1
  630. package/lib/esm/useBackofficeListUrlState-Ca6d7uIN.js.map +0 -1
  631. package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js +0 -18
  632. package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js.map +0 -1
  633. package/lib/esm/useRelayEnvironment-vQ86aW-n.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeLayoutPage-Bq2bKkYF.js","names":[],"sources":["../../src/hooks/useBackofficeSidebarPins.ts","../../src/hooks/useSidebarGroupCollapse.ts","../../src/components/backoffice/layout/backofficeSidebarActions.css.ts","../../src/components/backoffice/layout/buildSidebarSections.tsx","../../src/components/backoffice/routing/backofficeContentError.css.ts","../../src/components/backoffice/routing/BackofficeContentError.tsx","../../src/components/backoffice/routing/backofficeContentFallback.css.ts","../../src/components/backoffice/routing/BackofficeContentFallback.tsx","../../src/components/backoffice/routing/backofficeContentBoundary.css.ts","../../src/components/backoffice/routing/BackofficeContentBoundary.tsx","../../src/components/backoffice/layout/mapViewerToSidebarProfileView.ts","../../src/pages/BackofficeLayoutPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_STORAGE_KEY = 'backoffice.sidebar.pins.v1';\n\ntype PinsPayload = unknown;\n\nconst readPinsFromStorage = (storageKey: string): string[] => {\n if (typeof window === 'undefined') {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return [];\n }\n const parsed = JSON.parse(raw) as PinsPayload;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n } catch {\n return [];\n }\n};\n\nconst normalizePins = (\n pins: readonly string[],\n validIds: Set<string>,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n pins.forEach((entry) => {\n if (!validIds.has(entry)) {\n return;\n }\n if (seen.has(entry)) {\n return;\n }\n seen.add(entry);\n output.push(entry);\n });\n return output;\n};\n\nexport type SidebarPinsState = {\n pins: readonly string[];\n isPinned: (id: string) => boolean;\n pin: (id: string) => void;\n unpin: (id: string) => void;\n toggle: (id: string) => void;\n reorder: (fromId: string, toId: string) => void;\n};\n\nexport type UseBackofficeSidebarPinsInput = {\n enabled?: boolean;\n storageKey?: string;\n visibleEntityIds: readonly string[];\n};\n\nexport const useBackofficeSidebarPins = (\n input: UseBackofficeSidebarPinsInput,\n): SidebarPinsState => {\n const {\n enabled = true,\n storageKey = DEFAULT_STORAGE_KEY,\n visibleEntityIds,\n } = input;\n const validIds = useMemo(() => {\n return new Set(visibleEntityIds);\n }, [visibleEntityIds]);\n\n const [pins, setPins] = useState<string[]>(() => {\n if (!enabled) {\n return [];\n }\n const stored = readPinsFromStorage(storageKey);\n return normalizePins(stored, validIds);\n });\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n setPins((prev) => {\n const normalized = normalizePins(prev, validIds);\n if (normalized.length === prev.length) {\n let unchanged = true;\n for (let index = 0; index < normalized.length; index += 1) {\n if (normalized[index] !== prev[index]) {\n unchanged = false;\n break;\n }\n }\n if (unchanged) {\n return prev;\n }\n }\n return normalized;\n });\n }, [enabled, validIds]);\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n const stored = readPinsFromStorage(storageKey);\n setPins(normalizePins(stored, validIds));\n }, [enabled, storageKey, validIds]);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(pins));\n } catch {\n // Ignore storage errors in non-browser or restricted environments.\n }\n }, [enabled, pins, storageKey]);\n\n const pinsSet = useMemo(() => {\n return new Set(pins);\n }, [pins]);\n\n const pin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n if (!validIds.has(id)) {\n return;\n }\n setPins((prev) => {\n if (prev.includes(id)) {\n return prev;\n }\n return [...prev, id];\n });\n },\n [enabled, validIds],\n );\n\n const unpin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return prev.filter((entry) => {\n return entry !== id;\n });\n });\n },\n [enabled],\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (pinsSet.has(id)) {\n unpin(id);\n } else {\n pin(id);\n }\n },\n [pin, pinsSet, unpin],\n );\n\n const reorder = useCallback(\n (fromId: string, toId: string) => {\n if (!enabled) {\n return;\n }\n if (fromId === toId) {\n return;\n }\n setPins((prev) => {\n const fromIndex = prev.indexOf(fromId);\n const toIndex = prev.indexOf(toId);\n if (fromIndex === -1 || toIndex === -1) {\n return prev;\n }\n if (fromIndex === toIndex) {\n return prev;\n }\n const next = [...prev];\n next.splice(fromIndex, 1);\n next.splice(toIndex, 0, fromId);\n return next;\n });\n },\n [enabled],\n );\n\n const isPinned = useCallback(\n (id: string) => {\n return pinsSet.has(id);\n },\n [pinsSet],\n );\n\n return {\n pins,\n isPinned,\n pin,\n unpin,\n toggle,\n reorder,\n };\n};\n\nexport const __test = {\n normalizePins,\n readPinsFromStorage,\n};\n\nexport default useBackofficeSidebarPins;\n","import { useCallback, useEffect, useMemo, useState } from 'react';\n\nexport type SidebarGroupCollapseState = Record<string, boolean | undefined>;\n\nexport type UseSidebarGroupCollapseInput = {\n groupIds: readonly string[];\n activeGroupId?: string | null;\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>;\n storageKey?: string;\n persist?: boolean;\n};\n\nconst readStoredState = (\n storageKey: string | undefined,\n): SidebarGroupCollapseState | null => {\n if (storageKey == null || typeof window === 'undefined') {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return null;\n }\n const parsed = JSON.parse(raw) as unknown;\n if (parsed == null || typeof parsed !== 'object') {\n return null;\n }\n const output: SidebarGroupCollapseState = {};\n Object.entries(parsed as Record<string, unknown>).forEach(\n ([key, value]) => {\n if (typeof value === 'boolean') {\n output[key] = value;\n }\n },\n );\n return output;\n } catch {\n return null;\n }\n};\n\nconst buildInitialState = (\n groupIds: readonly string[],\n activeGroupId?: string | null,\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>,\n): SidebarGroupCollapseState => {\n const state: SidebarGroupCollapseState = {};\n groupIds.forEach((groupId) => {\n state[groupId] = defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n if (activeGroupId != null && groupIds.includes(activeGroupId)) {\n state[activeGroupId] = false;\n }\n return state;\n};\n\nexport const useSidebarGroupCollapse = (\n input: UseSidebarGroupCollapseInput,\n): {\n collapsedByGroupId: SidebarGroupCollapseState;\n setCollapsed: (groupId: string, collapsed: boolean) => void;\n} => {\n const {\n activeGroupId,\n defaultCollapsedByGroupId,\n groupIds,\n persist = false,\n storageKey,\n } = input;\n\n const groupIdList = useMemo(() => {\n return [...groupIds];\n }, [groupIds]);\n\n const [collapsedByGroupId, setCollapsedByGroupId] =\n useState<SidebarGroupCollapseState>(() => {\n if (persist) {\n const stored = readStoredState(storageKey);\n if (stored != null) {\n return {\n ...buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n ),\n ...stored,\n };\n }\n }\n return buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n );\n });\n\n useEffect(() => {\n setCollapsedByGroupId((prev) => {\n const next: SidebarGroupCollapseState = {};\n\n groupIdList.forEach((groupId) => {\n const existing = prev[groupId];\n next[groupId] =\n existing ?? defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n\n if (activeGroupId != null && groupIdList.includes(activeGroupId)) {\n next[activeGroupId] = false;\n }\n\n return next;\n });\n }, [activeGroupId, defaultCollapsedByGroupId, groupIdList]);\n\n useEffect(() => {\n if (!persist || storageKey == null || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify(collapsedByGroupId),\n );\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n }, [collapsedByGroupId, persist, storageKey]);\n\n useEffect(() => {\n if (activeGroupId == null) {\n return;\n }\n setCollapsedByGroupId((prev) => {\n if (prev[activeGroupId] === false) {\n return prev;\n }\n return {\n ...prev,\n [activeGroupId]: false,\n };\n });\n }, [activeGroupId]);\n\n const setCollapsed = useCallback((groupId: string, collapsed: boolean) => {\n setCollapsedByGroupId((prev) => {\n if (prev[groupId] === collapsed) {\n return prev;\n }\n return {\n ...prev,\n [groupId]: collapsed,\n };\n });\n }, []);\n\n return {\n collapsedByGroupId,\n setCollapsed,\n };\n};\n\nexport default useSidebarGroupCollapse;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, vars } from '@plumile/ui';\n\nexport const actionButton = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n borderRadius: 'md',\n borderWidth: 0,\n borderStyle: 'none',\n padding: 0,\n backgroundColor: 'transparent',\n color: 'textSecondary',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceMuted,\n color: vars.colors.text,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: 2,\n },\n },\n },\n]);\n","import { type DragEvent, type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeSidebarItemDescriptor,\n BackofficeIconComponent,\n BackofficeSidebarRecentItem,\n} from '../../../provider/types.js';\nimport {\n type AdminSidebarSection,\n type SidebarNavSectionItem,\n GripDotsSvg,\n PinFilledSvg,\n PinSvg,\n BackofficeSidebarHistorySvg,\n SidebarHomeSvg,\n SidebarTasksSvg,\n} from '@plumile/ui';\nimport type { SidebarGroupCollapseState } from '../../../hooks/useSidebarGroupCollapse.js';\nimport * as styles from './backofficeSidebarActions.css.js';\nimport {\n buildEntityGroupLookup,\n isActivePath,\n resolveLabel,\n resolveGroupItems,\n resolveHubEntityIds,\n resolveSidebarHub,\n resolveSidebarGroups,\n} from './sidebarUtils.js';\n\nconst renderIcon = (\n Icon?: BackofficeIconComponent,\n fallback?: ReactNode,\n size = 18,\n): ReactNode => {\n if (Icon != null) {\n return <Icon width={size} height={size} aria-hidden=\"true\" />;\n }\n return fallback ?? null;\n};\n\nexport type BuildSidebarSectionsInput = {\n basePath: string;\n pathname: string;\n entities: BackofficeEntityManifestMap;\n sidebar?: BackofficeSidebarConfig;\n permissions: unknown;\n searchQuery?: string;\n tApp: TFunction;\n t: TFunction;\n pinnedEntityIds?: readonly string[];\n recentItems?: readonly BackofficeSidebarRecentItem[];\n onTogglePin?: (entityId: string) => void;\n onReorderPin?: (fromId: string, toId: string) => void;\n collapsedByGroupId?: SidebarGroupCollapseState;\n onGroupCollapsedChange?: (groupId: string, collapsed: boolean) => void;\n sidebarCollapsed?: boolean;\n};\n\n/**\n * Builds the sidebar sections for the backoffice layout.\n */\nexport function buildSidebarSections(\n input: BuildSidebarSectionsInput,\n): readonly AdminSidebarSection[] {\n const {\n basePath,\n pathname,\n entities,\n sidebar,\n permissions,\n searchQuery,\n tApp,\n t,\n pinnedEntityIds = [],\n recentItems = [],\n onTogglePin,\n onReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange,\n sidebarCollapsed = false,\n } = input;\n\n const groups = resolveSidebarGroups(entities, sidebar);\n const entries = Object.entries(groups);\n const pinnedSet = new Set(pinnedEntityIds);\n const pinLabel = t('sidebar.actions.pin');\n const unpinLabel = t('sidebar.actions.unpin');\n const reorderLabel = t('sidebar.actions.reorder');\n const entityGroupLookup = buildEntityGroupLookup(groups, sidebar);\n const normalizedQuery = searchQuery?.trim().toLowerCase() ?? '';\n\n const labelMatchesQuery = (label: string): boolean => {\n return (\n normalizedQuery === '' || label.toLowerCase().includes(normalizedQuery)\n );\n };\n\n const renderPinAction = (entityId: string): ReactNode | null => {\n if (onTogglePin == null) {\n return null;\n }\n const isPinned = pinnedSet.has(entityId);\n let label = pinLabel;\n let Icon = PinSvg;\n if (isPinned) {\n label = unpinLabel;\n Icon = PinFilledSvg;\n }\n\n return (\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-pressed={isPinned}\n aria-label={label}\n title={label}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onTogglePin(entityId);\n }}\n >\n <Icon width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n };\n\n const buildDashboardItem = (\n groupId?: string,\n ): SidebarNavSectionItem | null => {\n const dashboardDescriptor: BackofficeSidebarItemDescriptor = {\n kind: 'dashboard',\n id: 'dashboard',\n };\n const isDashboardVisible = sidebar?.isItemVisible?.(\n dashboardDescriptor,\n permissions,\n );\n if (isDashboardVisible === false) {\n return null;\n }\n\n const label = t('sidebar.items.dashboard');\n if (!labelMatchesQuery(label)) {\n return null;\n }\n\n return {\n id: 'dashboard',\n data: {\n kind: 'dashboard',\n id: 'dashboard',\n groupId,\n },\n label,\n href: basePath,\n icon: renderIcon(\n undefined,\n <SidebarHomeSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, basePath),\n ariaLabel: label,\n };\n };\n\n const buildEntityItem = (inputItem: {\n entityId: string;\n groupId?: string;\n groupIcon?: BackofficeIconComponent;\n itemIcon?: BackofficeIconComponent;\n itemLabel?: string;\n enableReorder?: boolean;\n }): SidebarNavSectionItem | null => {\n const { entityId, groupId, groupIcon, itemIcon, itemLabel, enableReorder } =\n inputItem;\n const config = entities[entityId];\n if (config == null) {\n return null;\n }\n\n let descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'entity',\n id: entityId,\n };\n if (config.kind === 'tool') {\n descriptor = { kind: 'tool', id: entityId };\n }\n const isEntityVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isEntityVisible === false) {\n return null;\n }\n\n if (config.kind === 'tool') {\n const label = itemLabel ?? resolveLabel(config.label, tApp);\n if (\n normalizedQuery !== '' &&\n !label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n return {\n id: `tool-${entityId}`,\n data: {\n kind: 'tool',\n id: entityId,\n groupId,\n },\n label,\n href: config.routes.list,\n icon: renderIcon(\n itemIcon ?? groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, config.routes.list),\n ariaLabel: label,\n actionSlot: renderPinAction(entityId),\n };\n }\n\n if (!config.hasList) {\n return null;\n }\n\n const label = itemLabel ?? resolveLabel(config.label, tApp);\n if (\n normalizedQuery !== '' &&\n !label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n\n let dragHandleSlot: ReactNode | undefined;\n let onDragStart: ((event: DragEvent) => void) | undefined;\n let onDragOver: ((event: DragEvent) => void) | undefined;\n let onDrop: ((event: DragEvent) => void) | undefined;\n let draggable = false;\n\n if (enableReorder === true && onReorderPin != null) {\n draggable = true;\n dragHandleSlot = (\n <GripDotsSvg width={14} height={14} aria-hidden=\"true\" />\n );\n onDragStart = (event) => {\n const { dataTransfer } = event;\n dataTransfer.effectAllowed = 'move';\n dataTransfer.setData('text/plain', entityId);\n };\n onDragOver = (event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n dataTransfer.dropEffect = 'move';\n };\n onDrop = (event) => {\n event.preventDefault();\n const fromId = event.dataTransfer.getData('text/plain');\n if (fromId === '' || fromId === entityId) {\n return;\n }\n onReorderPin(fromId, entityId);\n };\n }\n\n let dragHandleLabel: string | undefined;\n if (dragHandleSlot != null) {\n dragHandleLabel = reorderLabel;\n }\n\n return {\n id: entityId,\n data: {\n kind: 'entity',\n id: entityId,\n groupId,\n },\n label,\n href: config.routes.list,\n icon: renderIcon(\n itemIcon ?? groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, config.routes.list),\n ariaLabel: label,\n actionSlot: renderPinAction(entityId),\n dragHandleSlot,\n dragHandleLabel,\n draggable,\n onDragStart,\n onDragOver,\n onDrop,\n };\n };\n\n const buildHubItem = (inputItem: {\n hub: ReturnType<typeof resolveSidebarHub>;\n groupId?: string;\n icon?: BackofficeIconComponent;\n }): SidebarNavSectionItem | null => {\n const { hub, groupId, icon } = inputItem;\n const descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'hub',\n id: hub.id,\n };\n const isVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isVisible === false) {\n return null;\n }\n const childEntityIds = resolveHubEntityIds(hub);\n const visibleChildConfigs = childEntityIds\n .map((entityId) => {\n return entities[entityId] ?? null;\n })\n .filter((config): config is BackofficeEntityManifestMap[string] => {\n if (config == null) {\n return false;\n }\n let childKind: BackofficeSidebarItemDescriptor['kind'] = 'entity';\n if (config.kind === 'tool') {\n childKind = 'tool';\n }\n const childDescriptor: BackofficeSidebarItemDescriptor = {\n kind: childKind,\n id: config.id,\n };\n const isChildVisible = sidebar?.isItemVisible?.(\n childDescriptor,\n permissions,\n );\n if (isChildVisible === false) {\n return false;\n }\n if (config.kind !== 'tool' && !config.hasList) {\n return false;\n }\n return true;\n });\n if (childEntityIds.length > 0 && visibleChildConfigs.length === 0) {\n return null;\n }\n const label = resolveLabel(hub.title, tApp);\n const matchesHub = labelMatchesQuery(label);\n const matchesChild = visibleChildConfigs.some((config) => {\n return labelMatchesQuery(resolveLabel(config.label, tApp));\n });\n if (!matchesHub && !matchesChild) {\n return null;\n }\n const isActive =\n isActivePath(pathname, hub.href) ||\n visibleChildConfigs.some((config) => {\n return isActivePath(pathname, config.routes.list);\n });\n return {\n id: `hub-${hub.id}`,\n data: {\n kind: 'hub',\n id: hub.id,\n groupId,\n },\n label,\n href: hub.href,\n icon: renderIcon(\n icon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive,\n ariaLabel: label,\n };\n };\n\n const sections: AdminSidebarSection[] = [];\n\n const primaryItems = sidebar?.primaryItems ?? [];\n if (primaryItems.length > 0) {\n const primarySectionItems = primaryItems\n .map((primaryItem): SidebarNavSectionItem | null => {\n if (primaryItem.kind === 'dashboard') {\n return buildDashboardItem();\n }\n if (primaryItem.kind === 'hub') {\n const hub = resolveSidebarHub(primaryItem, sidebar);\n return buildHubItem({\n hub,\n icon: primaryItem.icon,\n });\n }\n let itemLabel: string | undefined;\n if (primaryItem.label != null) {\n itemLabel = resolveLabel(primaryItem.label, tApp);\n }\n return buildEntityItem({\n entityId: primaryItem.id,\n itemIcon: primaryItem.icon,\n itemLabel,\n });\n })\n .filter((item): item is SidebarNavSectionItem => {\n return item != null;\n });\n\n if (primarySectionItems.length > 0) {\n sections.push({\n id: 'primary',\n items: primarySectionItems,\n collapsible: false,\n });\n }\n }\n\n if (pinnedEntityIds.length > 0) {\n const pinnedItems = pinnedEntityIds\n .map((entityId) => {\n const groupMeta = entityGroupLookup.get(entityId);\n return buildEntityItem({\n entityId,\n groupId: groupMeta?.groupId,\n groupIcon: groupMeta?.groupIcon,\n itemIcon: groupMeta?.itemIcon,\n enableReorder: true,\n });\n })\n .filter((item): item is SidebarNavSectionItem => {\n return item != null;\n });\n\n if (pinnedItems.length > 0) {\n sections.push({\n id: 'pinned',\n title: t('sidebar.sections.pinned'),\n icon: renderIcon(\n undefined,\n <PinSvg width={16} height={16} aria-hidden=\"true\" />,\n ),\n items: pinnedItems,\n collapsible: false,\n });\n }\n }\n\n if (recentItems.length > 0) {\n const recentSectionItems = recentItems\n .map((recentItem): SidebarNavSectionItem | null => {\n const config = entities[recentItem.id];\n if (config == null) {\n return null;\n }\n const descriptor: BackofficeSidebarItemDescriptor = {\n kind: recentItem.kind,\n id: recentItem.id,\n };\n const isVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isVisible === false) {\n return null;\n }\n if (\n normalizedQuery !== '' &&\n !recentItem.label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n const groupMeta = entityGroupLookup.get(recentItem.id);\n return {\n id: `recent-${recentItem.kind}-${recentItem.id}`,\n data: {\n kind: recentItem.kind,\n id: recentItem.id,\n groupId: groupMeta?.groupId,\n },\n label: recentItem.label,\n href: recentItem.href,\n icon: renderIcon(\n groupMeta?.itemIcon ?? groupMeta?.groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, recentItem.href),\n ariaLabel: recentItem.label,\n } satisfies SidebarNavSectionItem;\n })\n .filter((item): item is SidebarNavSectionItem => {\n return item != null;\n });\n\n if (recentSectionItems.length > 0) {\n sections.push({\n id: 'recent',\n title: t('sidebar.sections.recent'),\n icon: renderIcon(\n undefined,\n <BackofficeSidebarHistorySvg\n width={16}\n height={16}\n aria-hidden=\"true\"\n />,\n ),\n items: recentSectionItems,\n collapsible: false,\n });\n }\n }\n\n entries.forEach(([groupId, group]) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n\n const items: SidebarNavSectionItem[] = [];\n\n const groupItems = resolveGroupItems(group);\n if (groupItems.length > 0) {\n groupItems.forEach((groupItem) => {\n if (groupItem.kind === 'dashboard') {\n const item = buildDashboardItem(groupId);\n if (item != null) {\n items.push(item);\n }\n return;\n }\n if (groupItem.kind === 'hub') {\n const hub = resolveSidebarHub(groupItem, sidebar);\n const item = buildHubItem({\n hub,\n groupId,\n icon: groupItem.icon ?? group.icon,\n });\n if (item != null) {\n items.push(item);\n }\n return;\n }\n let itemLabel: string | undefined;\n if (groupItem.label != null) {\n itemLabel = resolveLabel(groupItem.label, tApp);\n }\n const item = buildEntityItem({\n entityId: groupItem.id,\n groupId,\n groupIcon: group.icon,\n itemIcon: groupItem.icon,\n itemLabel,\n });\n if (item != null) {\n items.push(item);\n }\n });\n }\n\n let sectionItems: SidebarNavSectionItem[] = items;\n if (sidebarCollapsed && group.behavior?.showInCollapsedRail !== true) {\n sectionItems = items.filter((item) => {\n return item.id === 'dashboard' || item.isActive === true;\n });\n }\n\n if (sectionItems.length === 0) {\n return;\n }\n\n let title: string | undefined;\n if (group.title != null) {\n title = resolveLabel(group.title, tApp);\n }\n\n const isCollapsed = collapsedByGroupId?.[groupId];\n let onCollapsedChange: ((collapsed: boolean) => void) | undefined;\n if (onGroupCollapsedChange != null) {\n onCollapsedChange = (collapsed: boolean) => {\n onGroupCollapsedChange(groupId, collapsed);\n };\n }\n\n sections.push({\n id: groupId,\n title,\n icon: renderIcon(group.icon, undefined, 16),\n items: sectionItems,\n collapsible: group.behavior?.collapsible ?? true,\n defaultCollapsed: group.behavior?.defaultCollapsed ?? true,\n isCollapsed,\n onCollapsedChange,\n });\n });\n\n return sections;\n}\n","import { sprinkles } from '@plumile/ui';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n width: 'full',\n});\n\nexport const banner = sprinkles({\n borderColor: 'borderStrong',\n});\n","import { type JSX } from 'react';\n\nimport { Button, InlineBanner } from '@plumile/ui';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './backofficeContentError.css.js';\n\ntype BackofficeContentErrorProps = {\n error: unknown;\n onRetry: () => void;\n};\n\nexport const BackofficeContentError = ({\n onRetry,\n}: BackofficeContentErrorProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div className={styles.root}>\n <InlineBanner\n tone=\"danger\"\n className={styles.banner}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={onRetry}\n >\n {t('common.actions.retry')}\n </Button>\n }\n >\n {t('common.errors.unexpected')}\n </InlineBanner>\n </div>\n );\n};\n\nexport default BackofficeContentError;\n","import { sprinkles } from '@plumile/ui';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n width: 'full',\n minHeight: 'full',\n});\n\nexport const title = sprinkles({\n maxWidth: 'md',\n});\n\nexport const grid = sprinkles({\n display: 'grid',\n gap: 4,\n gridTemplateColumns: 'autoFitMinmax240',\n});\n\nexport const card = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n padding: 4,\n minHeight: 44,\n borderRadius: 'xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surfaceMuted',\n});\n","import { type JSX } from 'react';\n\nimport { Skeleton } from '@plumile/ui';\n\nimport * as styles from './backofficeContentFallback.css.js';\n\nexport const BackofficeContentFallback = (): JSX.Element => {\n return (\n <div\n className={styles.container}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Skeleton variant=\"text\" width=\"38%\" className={styles.title} />\n <Skeleton variant=\"text\" width=\"62%\" />\n <div className={styles.grid}>\n {Array.from({ length: 4 }, (_, index) => {\n return (\n <div key={`content-skeleton-${index}`} className={styles.card}>\n <Skeleton variant=\"text\" width=\"46%\" />\n <Skeleton variant=\"text\" width=\"82%\" lines={2} />\n <Skeleton variant=\"block\" width=\"100%\" height={120} />\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default BackofficeContentFallback;\n","import { sprinkles } from '@plumile/ui';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n minHeight: 'full',\n width: 'full',\n minWidth: 0,\n});\n","import { Suspense, type JSX, type ReactNode } from 'react';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nimport { BackofficeContentError } from './BackofficeContentError.js';\nimport { BackofficeContentFallback } from './BackofficeContentFallback.js';\nimport * as styles from './backofficeContentBoundary.css.js';\n\nexport type BackofficeContentBoundaryProps = {\n children: ReactNode;\n};\n\nexport const BackofficeContentBoundary = ({\n children,\n}: BackofficeContentBoundaryProps): JSX.Element => {\n return (\n <div className={styles.root}>\n <BackofficeErrorBoundary\n fallback={({ error, reset }) => {\n return <BackofficeContentError error={error} onRetry={reset} />;\n }}\n >\n <Suspense fallback={<BackofficeContentFallback />}>{children}</Suspense>\n </BackofficeErrorBoundary>\n </div>\n );\n};\n\nexport default BackofficeContentBoundary;\n","import type { BackofficeSidebarProfileViewer } from '@plumile/ui';\n\nexport type BackofficeViewerIdentity = {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n};\n\ntype MapViewerToSidebarProfileViewInput = {\n viewer: BackofficeViewerIdentity | null | undefined;\n unknownUserLabel: string;\n};\n\nconst sanitizeToken = (value: string | null | undefined): string => {\n return value?.trim() ?? '';\n};\n\nexport const mapViewerToSidebarProfileView = ({\n viewer,\n unknownUserLabel,\n}: MapViewerToSidebarProfileViewInput): BackofficeSidebarProfileViewer => {\n const firstName = sanitizeToken(viewer?.firstName);\n const lastName = sanitizeToken(viewer?.lastName);\n const joinedDisplayName = [firstName, lastName]\n .filter((token) => {\n return token !== '';\n })\n .join(' ')\n .trim();\n let displayName = joinedDisplayName;\n if (displayName === '') {\n displayName = unknownUserLabel;\n }\n\n const email = sanitizeToken(viewer?.email);\n const initialsToken = sanitizeToken(viewer?.initials);\n let initials = initialsToken;\n if (initials === '') {\n initials = '?';\n }\n\n const ariaParts = [displayName];\n if (email !== '') {\n ariaParts.push(email);\n }\n\n return {\n displayName,\n email,\n initials,\n ariaLabel: ariaParts.join(' - '),\n };\n};\n\nexport default mapViewerToSidebarProfileView;\n","import {\n useEffect,\n useMemo,\n type JSX,\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n commitMutation,\n usePreloadedQuery,\n type PreloadedQuery,\n} from 'react-relay';\nimport type {\n GraphQLTaggedNode,\n MutationParameters,\n OperationType,\n} from 'relay-runtime';\nimport { RoutingContext, useLocation } from '@plumile/router';\n\nimport {\n AdminShellLayout,\n BackofficeSidebarProfileMenu,\n EnvironmentBadge,\n GlobalSearchInput,\n ToastProvider,\n} from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport type { LogoutResponse, LogoutVariables } from '../hooks/useAuth.js';\nimport { useBackofficeSidebarPins } from '../hooks/useBackofficeSidebarPins.js';\nimport { useSidebarGroupCollapse } from '../hooks/useSidebarGroupCollapse.js';\nimport { buildSidebarSections } from '../components/backoffice/layout/buildSidebarSections.js';\nimport { BackofficeContentBoundary } from '../components/backoffice/routing/BackofficeContentBoundary.js';\nimport {\n resolveActiveEntityId,\n resolveSidebarGroups,\n resolveVisibleEntityIds,\n} from '../components/backoffice/layout/sidebarUtils.js';\nimport { BackofficeTopbarPortalContextProvider } from '../components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js';\nimport { BackofficePermissionsProvider } from '../components/backoffice/layout/BackofficePermissionsContext.js';\nimport {\n mapViewerToSidebarProfileView,\n type BackofficeViewerIdentity,\n} from '../components/backoffice/layout/mapViewerToSidebarProfileView.js';\nimport { resetRelayStore } from '../relay/environment.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\nimport type { BackofficeSidebarRecentItem } from '../provider/types.js';\n\nexport type BackofficeLayoutPageProps = {\n children: ReactNode;\n permissionsQuery?: GraphQLTaggedNode;\n prepared?: PreloadedQuery<OperationType> | null;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\ntype LayoutShellProps = {\n children: ReactNode;\n permissions: unknown;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\nconst DEFAULT_RECENT_ITEMS_STORAGE_KEY = 'plumile:backoffice:recent-items';\nconst DEFAULT_SIDEBAR_PREFS_STORAGE_KEY = 'plumile:backoffice:sidebar';\n\nconst readRecentItems = (\n storageKey: string,\n): readonly BackofficeSidebarRecentItem[] => {\n if (typeof window === 'undefined') {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return [];\n }\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter((item): item is BackofficeSidebarRecentItem => {\n if (item == null || typeof item !== 'object') {\n return false;\n }\n const candidate = item as Partial<BackofficeSidebarRecentItem>;\n return (\n (candidate.kind === 'entity' || candidate.kind === 'tool') &&\n typeof candidate.id === 'string' &&\n typeof candidate.label === 'string' &&\n typeof candidate.href === 'string' &&\n typeof candidate.visitedAt === 'number'\n );\n });\n } catch {\n return [];\n }\n};\n\nconst writeRecentItems = (\n storageKey: string,\n items: readonly BackofficeSidebarRecentItem[],\n): void => {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(items));\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n};\n\nconst BackofficeLayoutShell = ({\n children,\n permissions,\n authStatus,\n activeGroupId,\n}: LayoutShellProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { pathname } = useLocation();\n const routing = useContext(RoutingContext);\n const relayEnvironment = useRelayEnvironment();\n const {\n auth: authConfig,\n basePath,\n entities,\n sidebar,\n } = useBackofficeConfig();\n const [sidebarQuery, setSidebarQuery] = useState('');\n const sidebarPreferencesStorageKey =\n sidebar?.preferences?.storageKey ?? DEFAULT_SIDEBAR_PREFS_STORAGE_KEY;\n const persistSidebarCollapsed =\n sidebar?.preferences?.persistCollapsed === true;\n const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(() => {\n if (!persistSidebarCollapsed || typeof window === 'undefined') {\n return false;\n }\n try {\n return (\n window.localStorage.getItem(\n `${sidebarPreferencesStorageKey}:collapsed`,\n ) === 'true'\n );\n } catch {\n return false;\n }\n });\n const [isSigningOut, setIsSigningOut] = useState(false);\n const [topbarTarget, setTopbarTarget] = useState<HTMLDivElement | null>(null);\n const recentItemsConfig = sidebar?.recentItems;\n const recentItemsEnabled = recentItemsConfig?.enabled === true;\n const recentItemsStorageKey =\n recentItemsConfig?.storageKey ?? DEFAULT_RECENT_ITEMS_STORAGE_KEY;\n const recentItemsMaxItems = recentItemsConfig?.maxItems ?? 8;\n const [recentItems, setRecentItems] = useState<\n readonly BackofficeSidebarRecentItem[]\n >(() => {\n if (!recentItemsEnabled) {\n return [];\n }\n return readRecentItems(recentItemsStorageKey);\n });\n\n useEffect(() => {\n if (!persistSidebarCollapsed || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(\n `${sidebarPreferencesStorageKey}:collapsed`,\n String(isSidebarCollapsed),\n );\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n }, [\n isSidebarCollapsed,\n persistSidebarCollapsed,\n sidebarPreferencesStorageKey,\n ]);\n\n const groups = useMemo(() => {\n return resolveSidebarGroups(entities, sidebar);\n }, [entities, sidebar]);\n\n const groupIds = useMemo(() => {\n return Object.keys(groups);\n }, [groups]);\n\n const defaultCollapsedByGroupId = useMemo(() => {\n return Object.fromEntries(\n Object.entries(groups).map(([groupId, group]) => {\n return [groupId, group.behavior?.defaultCollapsed ?? true];\n }),\n );\n }, [groups]);\n\n const visibleEntityIds = useMemo(() => {\n return resolveVisibleEntityIds(groups, entities, sidebar, permissions);\n }, [entities, groups, permissions, sidebar]);\n\n const activeEntityId = useMemo(() => {\n return resolveActiveEntityId(pathname, entities);\n }, [entities, pathname]);\n\n useEffect(() => {\n if (!recentItemsEnabled || activeEntityId == null) {\n return;\n }\n const config = entities[activeEntityId];\n if (config == null) {\n return;\n }\n if (config.kind !== 'tool' && !config.hasList) {\n return;\n }\n const href = config.routes.list;\n let kind: BackofficeSidebarRecentItem['kind'] = 'entity';\n if (config.kind === 'tool') {\n kind = 'tool';\n }\n const item: BackofficeSidebarRecentItem = {\n kind,\n id: activeEntityId,\n label: config.label(tApp),\n href,\n visitedAt: Date.now(),\n };\n setRecentItems((prev) => {\n const next = [\n item,\n ...prev.filter((entry) => {\n return entry.id !== item.id || entry.kind !== item.kind;\n }),\n ].slice(0, recentItemsMaxItems);\n writeRecentItems(recentItemsStorageKey, next);\n return next;\n });\n }, [\n activeEntityId,\n entities,\n recentItemsEnabled,\n recentItemsMaxItems,\n recentItemsStorageKey,\n tApp,\n ]);\n\n const {\n pins,\n toggle: togglePin,\n reorder: reorderPin,\n } = useBackofficeSidebarPins({\n enabled: sidebar?.pinnedItems?.enabled === true,\n storageKey: sidebar?.pinnedItems?.storageKey,\n visibleEntityIds,\n });\n\n let groupCollapseStorageKey: string | undefined;\n if (sidebar?.preferences?.storageKey != null) {\n groupCollapseStorageKey = `${sidebar.preferences.storageKey}:groups`;\n }\n\n const { collapsedByGroupId, setCollapsed } = useSidebarGroupCollapse({\n groupIds,\n activeGroupId,\n defaultCollapsedByGroupId,\n persist: sidebar?.preferences?.persistGroups === true,\n storageKey: groupCollapseStorageKey,\n });\n\n const sections = useMemo(() => {\n return buildSidebarSections({\n basePath,\n pathname,\n entities,\n sidebar,\n permissions,\n searchQuery: sidebarQuery,\n tApp,\n t,\n pinnedEntityIds: pins,\n recentItems,\n onTogglePin: togglePin,\n onReorderPin: reorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange: setCollapsed,\n sidebarCollapsed: false,\n });\n }, [\n basePath,\n collapsedByGroupId,\n entities,\n pathname,\n permissions,\n pins,\n recentItems,\n reorderPin,\n setCollapsed,\n sidebar,\n sidebarQuery,\n t,\n tApp,\n togglePin,\n ]);\n\n const mobileSections = useMemo(() => {\n return buildSidebarSections({\n basePath,\n pathname,\n entities,\n sidebar,\n permissions,\n searchQuery: sidebarQuery,\n tApp,\n t,\n pinnedEntityIds: pins,\n recentItems,\n onTogglePin: togglePin,\n onReorderPin: reorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange: setCollapsed,\n sidebarCollapsed: false,\n });\n }, [\n basePath,\n collapsedByGroupId,\n entities,\n pathname,\n permissions,\n pins,\n recentItems,\n reorderPin,\n setCollapsed,\n sidebar,\n sidebarQuery,\n t,\n tApp,\n togglePin,\n ]);\n\n const environment = useMemo(() => {\n const meta = import.meta as unknown as { env?: Record<string, unknown> };\n if (meta.env?.DEV === true) {\n return 'dev' as const;\n }\n return 'prod' as const;\n }, []);\n\n const handleSignOut = useCallback(() => {\n if (isSigningOut) {\n return;\n }\n\n type LogoutMutation = MutationParameters & {\n response: LogoutResponse;\n variables: LogoutVariables;\n };\n\n setIsSigningOut(true);\n\n const runSignOut = async (): Promise<void> => {\n try {\n const config = await authConfig.logout.load();\n await new Promise<void>((resolve, reject) => {\n commitMutation<LogoutMutation>(relayEnvironment, {\n mutation: config.logoutMutation,\n variables: {},\n onCompleted: () => {\n resolve();\n },\n onError: (error) => {\n reject(error);\n },\n });\n });\n localStorage.removeItem('auth_token');\n localStorage.removeItem('remember_me');\n resetRelayStore();\n routing?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n } finally {\n setIsSigningOut(false);\n }\n };\n\n runSignOut().catch(() => {\n /* noop */\n });\n }, [authConfig.logout, basePath, isSigningOut, relayEnvironment, routing]);\n\n const viewer = authStatus?.me ?? null;\n const sidebarProfile = useMemo(() => {\n return mapViewerToSidebarProfileView({\n viewer,\n unknownUserLabel: t('sidebar.profile.unknownUser'),\n });\n }, [t, viewer]);\n\n const sidebarFooter = (\n <BackofficeSidebarProfileMenu\n collapsed={false}\n viewer={sidebarProfile}\n labels={{\n sectionTitle: t('sidebar.profile.title'),\n menuAriaLabel: t('sidebar.profile.menuAriaLabel'),\n signOut: t('sidebar.profile.actions.signOut'),\n }}\n onSignOut={handleSignOut}\n isSigningOut={isSigningOut}\n />\n );\n\n const mobileSidebarFooter = (\n <BackofficeSidebarProfileMenu\n collapsed={false}\n viewer={sidebarProfile}\n labels={{\n sectionTitle: t('sidebar.profile.title'),\n menuAriaLabel: t('sidebar.profile.menuAriaLabel'),\n signOut: t('sidebar.profile.actions.signOut'),\n }}\n onSignOut={handleSignOut}\n isSigningOut={isSigningOut}\n />\n );\n\n let contentNode: JSX.Element | null = null;\n if (topbarTarget != null) {\n contentNode = (\n <BackofficeContentBoundary>{children}</BackofficeContentBoundary>\n );\n }\n\n const sidebarSearchNode = (\n <GlobalSearchInput\n value={sidebarQuery}\n onChange={setSidebarQuery}\n placeholder={t('sidebar.search.placeholder')}\n ariaLabel={t('sidebar.search.placeholder')}\n />\n );\n\n return (\n <ToastProvider>\n <AdminShellLayout\n sidebar={{\n sections,\n header: <EnvironmentBadge environment={environment} />,\n search: sidebarSearchNode,\n footer: sidebarFooter,\n isCollapsed: isSidebarCollapsed,\n onCollapsedChange: setIsSidebarCollapsed,\n collapseToggleLabel: t('sidebar.actions.collapseSidebar'),\n expandToggleLabel: t('sidebar.actions.expandSidebar'),\n navigationAriaLabel: t('sidebar.navigationAriaLabel'),\n }}\n mobileSidebar={{\n sections: mobileSections,\n header: <EnvironmentBadge environment={environment} />,\n search: sidebarSearchNode,\n footer: mobileSidebarFooter,\n isCollapsed: false,\n hideCollapseToggle: true,\n navigationAriaLabel: t('sidebar.navigationAriaLabel'),\n }}\n topbar={{\n breadcrumb: <div ref={setTopbarTarget} />,\n }}\n >\n <BackofficePermissionsProvider permissions={permissions}>\n <BackofficeTopbarPortalContextProvider\n value={{\n target: topbarTarget,\n dashboardHref: basePath,\n dashboardLabel: t('sidebar.items.dashboard'),\n }}\n >\n {contentNode}\n </BackofficeTopbarPortalContextProvider>\n </BackofficePermissionsProvider>\n </AdminShellLayout>\n </ToastProvider>\n );\n};\n\ntype LayoutWithPermissionsProps = {\n children: ReactNode;\n permissionsQuery: GraphQLTaggedNode;\n prepared: PreloadedQuery<OperationType>;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\nconst LayoutWithPermissions = ({\n children,\n permissionsQuery,\n prepared,\n authStatus,\n activeGroupId,\n}: LayoutWithPermissionsProps): JSX.Element => {\n const permissions = usePreloadedQuery(permissionsQuery, prepared);\n\n return (\n <BackofficeLayoutShell\n permissions={permissions}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </BackofficeLayoutShell>\n );\n};\n\nexport const BackofficeLayoutPage = ({\n children,\n permissionsQuery,\n prepared,\n authStatus,\n activeGroupId,\n}: BackofficeLayoutPageProps): JSX.Element => {\n if (permissionsQuery != null && prepared != null) {\n return (\n <LayoutWithPermissions\n permissionsQuery={permissionsQuery}\n prepared={prepared}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </LayoutWithPermissions>\n );\n }\n\n return (\n <BackofficeLayoutShell\n permissions={null}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </BackofficeLayoutShell>\n );\n};\n\nexport default BackofficeLayoutPage;\n"],"mappings":";;;;;;;;;;;;;;;AAEA,IAAM,IAAsB,8BAItB,KAAuB,MAAiC;CAC5D,IAAI,OAAO,SAAW,KACpB,OAAO,EAAE;CAEX,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,EAAW;EACnD,IAAI,KAAO,MACT,OAAO,EAAE;EAEX,IAAM,IAAS,KAAK,MAAM,EAAI;EAI9B,OAHK,MAAM,QAAQ,EAAO,GAGnB,EAAO,QAAQ,MACb,OAAO,KAAU,SACxB,GAJO,EAAE;SAKL;EACN,OAAO,EAAE;;GAIP,KACJ,GACA,MACa;CACb,IAAM,IAAmB,EAAE,EACrB,oBAAO,IAAI,KAAa;CAW9B,OAVA,EAAK,SAAS,MAAU;EACjB,EAAS,IAAI,EAAM,KAGpB,EAAK,IAAI,EAAM,KAGnB,EAAK,IAAI,EAAM,EACf,EAAO,KAAK,EAAM;GAClB,EACK;GAkBI,MACX,MACqB;CACrB,IAAM,EACJ,aAAU,IACV,gBAAa,GACb,wBACE,GACE,IAAW,QACR,IAAI,IAAI,EAAiB,EAC/B,CAAC,EAAiB,CAAC,EAEhB,CAAC,GAAM,KAAW,QACjB,IAIE,EADQ,EAAoB,EACd,EAAQ,EAAS,GAH7B,EAAE,CAIX;CAkCF,AAhCA,QAAgB;EACd,IAAI,CAAC,GAAS;GACZ,EAAQ,EAAE,CAAC;GACX;;EAEF,GAAS,MAAS;GAChB,IAAM,IAAa,EAAc,GAAM,EAAS;GAChD,IAAI,EAAW,WAAW,EAAK,QAAQ;IACrC,IAAI,IAAY;IAChB,KAAK,IAAI,IAAQ,GAAG,IAAQ,EAAW,QAAQ,KAAS,GACtD,IAAI,EAAW,OAAW,EAAK,IAAQ;KACrC,IAAY;KACZ;;IAGJ,IAAI,GACF,OAAO;;GAGX,OAAO;IACP;IACD,CAAC,GAAS,EAAS,CAAC,EAEvB,QAAgB;EACd,IAAI,CAAC,GAAS;GACZ,EAAQ,EAAE,CAAC;GACX;;EAGF,EAAQ,EADO,EAAoB,EACb,EAAQ,EAAS,CAAC;IACvC;EAAC;EAAS;EAAY;EAAS,CAAC,EAEnC,QAAgB;EACV,OAAC,KAAW,OAAO,SAAW,MAGlC,IAAI;GACF,OAAO,aAAa,QAAQ,GAAY,KAAK,UAAU,EAAK,CAAC;UACvD;IAGP;EAAC;EAAS;EAAM;EAAW,CAAC;CAE/B,IAAM,IAAU,QACP,IAAI,IAAI,EAAK,EACnB,CAAC,EAAK,CAAC,EAEJ,IAAM,GACT,MAAe;EACT,KAGA,EAAS,IAAI,EAAG,IAGrB,GAAS,MACH,EAAK,SAAS,EAAG,GACZ,IAEF,CAAC,GAAG,GAAM,EAAG,CACpB;IAEJ,CAAC,GAAS,EAAS,CACpB,EAEK,IAAQ,GACX,MAAe;EACT,KAGL,GAAS,MACA,EAAK,QAAQ,MACX,MAAU,EACjB,CACF;IAEJ,CAAC,EAAQ,CACV,EAEK,IAAS,GACZ,MAAe;EACd,AAAI,EAAQ,IAAI,EAAG,GACjB,EAAM,EAAG,GAET,EAAI,EAAG;IAGX;EAAC;EAAK;EAAS;EAAM,CACtB,EAEK,IAAU,GACb,GAAgB,MAAiB;EAC3B,KAGD,MAAW,KAGf,GAAS,MAAS;GAChB,IAAM,IAAY,EAAK,QAAQ,EAAO,EAChC,IAAU,EAAK,QAAQ,EAAK;GAIlC,IAHI,MAAc,MAAM,MAAY,MAGhC,MAAc,GAChB,OAAO;GAET,IAAM,IAAO,CAAC,GAAG,EAAK;GAGtB,OAFA,EAAK,OAAO,GAAW,EAAE,EACzB,EAAK,OAAO,GAAS,GAAG,EAAO,EACxB;IACP;IAEJ,CAAC,EAAQ,CACV;CASD,OAAO;EACL;EACA,UATe,GACd,MACQ,EAAQ,IAAI,EAAG,EAExB,CAAC,EAAQ,CAKT;EACA;EACA;EACA;EACA;EACD;GCvMG,MACJ,MACqC;CACrC,IAAI,KAAc,QAAQ,OAAO,SAAW,KAC1C,OAAO;CAET,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,EAAW;EACnD,IAAI,KAAO,MACT,OAAO;EAET,IAAM,IAAS,KAAK,MAAM,EAAI;EAC9B,IAAsB,OAAO,KAAW,aAApC,GACF,OAAO;EAET,IAAM,IAAoC,EAAE;EAQ5C,OAPA,OAAO,QAAQ,EAAkC,CAAC,SAC/C,CAAC,GAAK,OAAW;GAChB,AAAI,OAAO,KAAU,cACnB,EAAO,KAAO;IAGnB,EACM;SACD;EACN,OAAO;;GAIL,KACJ,GACA,GACA,MAC8B;CAC9B,IAAM,IAAmC,EAAE;CAO3C,OANA,EAAS,SAAS,MAAY;EAC5B,EAAM,KAAW,IAA4B,MAAY;GACzD,EACE,KAAiB,QAAQ,EAAS,SAAS,EAAc,KAC3D,EAAM,KAAiB,KAElB;GAGI,MACX,MAIG;CACH,IAAM,EACJ,kBACA,8BACA,aACA,aAAU,IACV,kBACE,GAEE,IAAc,QACX,CAAC,GAAG,EAAS,EACnB,CAAC,EAAS,CAAC,EAER,CAAC,GAAoB,KACzB,QAA0C;EACxC,IAAI,GAAS;GACX,IAAM,IAAS,GAAgB,EAAW;GAC1C,IAAI,KAAU,MACZ,OAAO;IACL,GAAG,EACD,GACA,GACA,EACD;IACD,GAAG;IACJ;;EAGL,OAAO,EACL,GACA,GACA,EACD;GACD;CA6DJ,OA3DA,QAAgB;EACd,GAAuB,MAAS;GAC9B,IAAM,IAAkC,EAAE;GAY1C,OAVA,EAAY,SAAS,MAAY;IAE/B,EAAK,KADY,EAAK,MAER,IAA4B,MAAY;KACtD,EAEE,KAAiB,QAAQ,EAAY,SAAS,EAAc,KAC9D,EAAK,KAAiB,KAGjB;IACP;IACD;EAAC;EAAe;EAA2B;EAAY,CAAC,EAE3D,QAAgB;EACV,OAAC,KAAW,KAAc,QAAQ,OAAO,SAAW,MAGxD,IAAI;GACF,OAAO,aAAa,QAClB,GACA,KAAK,UAAU,EAAmB,CACnC;UACK;IAGP;EAAC;EAAoB;EAAS;EAAW,CAAC,EAE7C,QAAgB;EACV,KAAiB,QAGrB,GAAuB,MACjB,EAAK,OAAmB,KACnB,IAEF;GACL,GAAG;IACF,IAAgB;GAClB,CACD;IACD,CAAC,EAAc,CAAC,EAcZ;EACL;EACA,cAdmB,GAAa,GAAiB,MAAuB;GACxE,GAAuB,MACjB,EAAK,OAAa,IACb,IAEF;IACL,GAAG;KACF,IAAU;IACZ,CACD;KACD,EAAE,CAIH;EACD;oKE9HG,KACJ,GACA,GACA,IAAO,OAEH,KAAQ,OAGL,KAAY,OAFV,kBAAC,GAAD;CAAM,OAAO;CAAM,QAAQ;CAAM,eAAY;CAAS,CAAA;AA0BjE,SAAgB,GACd,GACgC;CAChC,IAAM,EACJ,aACA,aACA,aACA,YACA,gBACA,gBACA,SACA,MACA,qBAAkB,EAAE,EACpB,iBAAc,EAAE,EAChB,gBACA,kBACA,uBACA,2BACA,sBAAmB,OACjB,GAEE,IAAS,EAAqB,GAAU,EAAQ,EAChD,KAAU,OAAO,QAAQ,EAAO,EAChC,KAAY,IAAI,IAAI,EAAgB,EACpC,KAAW,EAAE,sBAAsB,EACnC,IAAa,EAAE,wBAAwB,EACvC,IAAe,EAAE,0BAA0B,EAC3C,IAAoB,EAAuB,GAAQ,EAAQ,EAC3D,IAAkB,GAAa,MAAM,CAAC,aAAa,IAAI,IAEvD,KAAqB,MAEvB,MAAoB,MAAM,EAAM,aAAa,CAAC,SAAS,EAAgB,EAIrE,KAAmB,MAAuC;EAC9D,IAAI,KAAe,MACjB,OAAO;EAET,IAAM,IAAW,GAAU,IAAI,EAAS,EACpC,IAAQ,IACR,IAAO;EAMX,OALI,MACF,IAAQ,GACR,IAAO,IAIP,kBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,gBAAc;GACd,cAAY;GACZ,OAAO;GACP,UAAU,MAAU;IAGlB,AAFA,EAAM,gBAAgB,EACtB,EAAM,iBAAiB,EACvB,EAAY,EAAS;;aAGvB,kBAAC,GAAD;IAAM,OAAO;IAAI,QAAQ;IAAI,eAAY;IAAS,CAAA;GAC3C,CAAA;IAIP,KACJ,MACiC;EASjC,IAJ2B,GAAS,gBAClC;GAJA,MAAM;GACN,IAAI;GAGJ,EACA,EACD,KAC0B,IACzB,OAAO;EAGT,IAAM,IAAQ,EAAE,0BAA0B;EAK1C,OAJK,EAAkB,EAAM,GAItB;GACL,IAAI;GACJ,MAAM;IACJ,MAAM;IACN,IAAI;IACJ;IACD;GACD;GACA,MAAM;GACN,MAAM,EACJ,KAAA,GACA,kBAAC,IAAD;IAAgB,OAAO;IAAI,QAAQ;IAAI,eAAY;IAAS,CAAA,CAC7D;GACD,UAAU,EAAa,GAAU,EAAS;GAC1C,WAAW;GACZ,GAlBQ;IAqBL,KAAmB,MAOW;EAClC,IAAM,EAAE,aAAU,YAAS,cAAW,aAAU,cAAW,qBACzD,GACI,IAAS,EAAS;EACxB,IAAI,KAAU,MACZ,OAAO;EAGT,IAAI,IAA8C;GAChD,MAAM;GACN,IAAI;GACL;EAKD,IAJI,EAAO,SAAS,WAClB,IAAa;GAAE,MAAM;GAAQ,IAAI;GAAU,GAErB,GAAS,gBAAgB,GAAY,EAAY,KACjD,IACtB,OAAO;EAGT,IAAI,EAAO,SAAS,QAAQ;GAC1B,IAAM,IAAQ,KAAa,EAAa,EAAO,OAAO,EAAK;GAO3D,OALE,MAAoB,MACpB,CAAC,EAAM,aAAa,CAAC,SAAS,EAAgB,GAEvC,OAEF;IACL,IAAI,QAAQ;IACZ,MAAM;KACJ,MAAM;KACN,IAAI;KACJ;KACD;IACD;IACA,MAAM,EAAO,OAAO;IACpB,MAAM,EACJ,KAAY,GACZ,kBAAC,GAAD;KAAiB,OAAO;KAAI,QAAQ;KAAI,eAAY;KAAS,CAAA,CAC9D;IACD,UAAU,EAAa,GAAU,EAAO,OAAO,KAAK;IACpD,WAAW;IACX,YAAY,EAAgB,EAAS;IACtC;;EAGH,IAAI,CAAC,EAAO,SACV,OAAO;EAGT,IAAM,IAAQ,KAAa,EAAa,EAAO,OAAO,EAAK;EAC3D,IACE,MAAoB,MACpB,CAAC,EAAM,aAAa,CAAC,SAAS,EAAgB,EAE9C,OAAO;EAGT,IAAI,GACA,GACA,GACA,GACA,IAAY;EAEhB,AAAI,MAAkB,MAAQ,MAAgB,SAC5C,IAAY,IACZ,IACE,kBAAC,GAAD;GAAa,OAAO;GAAI,QAAQ;GAAI,eAAY;GAAS,CAAA,EAE3D,KAAe,MAAU;GACvB,IAAM,EAAE,oBAAiB;GAEzB,AADA,EAAa,gBAAgB,QAC7B,EAAa,QAAQ,cAAc,EAAS;KAE9C,KAAc,MAAU;GACtB,EAAM,gBAAgB;GACtB,IAAM,EAAE,oBAAiB;GACzB,EAAa,aAAa;KAE5B,KAAU,MAAU;GAClB,EAAM,gBAAgB;GACtB,IAAM,IAAS,EAAM,aAAa,QAAQ,aAAa;GACnD,MAAW,MAAM,MAAW,KAGhC,GAAa,GAAQ,EAAS;;EAIlC,IAAI;EAKJ,OAJI,KAAkB,SACpB,IAAkB,IAGb;GACL,IAAI;GACJ,MAAM;IACJ,MAAM;IACN,IAAI;IACJ;IACD;GACD;GACA,MAAM,EAAO,OAAO;GACpB,MAAM,EACJ,KAAY,GACZ,kBAAC,GAAD;IAAiB,OAAO;IAAI,QAAQ;IAAI,eAAY;IAAS,CAAA,CAC9D;GACD,UAAU,EAAa,GAAU,EAAO,OAAO,KAAK;GACpD,WAAW;GACX,YAAY,EAAgB,EAAS;GACrC;GACA;GACA;GACA;GACA;GACA;GACD;IAGG,KAAgB,MAIc;EAClC,IAAM,EAAE,QAAK,YAAS,YAAS,GACzB,IAA8C;GAClD,MAAM;GACN,IAAI,EAAI;GACT;EAED,IADkB,GAAS,gBAAgB,GAAY,EAAY,KACjD,IAChB,OAAO;EAET,IAAM,IAAiB,EAAoB,EAAI,EACzC,IAAsB,EACzB,KAAK,MACG,EAAS,MAAa,KAC7B,CACD,QAAQ,MAA0D;GACjE,IAAI,KAAU,MACZ,OAAO;GAET,IAAI,IAAqD;GACzD,AAAI,EAAO,SAAS,WAClB,IAAY;GAEd,IAAM,IAAmD;IACvD,MAAM;IACN,IAAI,EAAO;IACZ;GAWD,OAHA,EAPuB,GAAS,gBAC9B,GACA,EACD,KACsB,MAGnB,EAAO,SAAS,UAAU,CAAC,EAAO;IAItC;EACJ,IAAI,EAAe,SAAS,KAAK,EAAoB,WAAW,GAC9D,OAAO;EAET,IAAM,IAAQ,EAAa,EAAI,OAAO,EAAK,EACrC,IAAa,EAAkB,EAAM,EACrC,IAAe,EAAoB,MAAM,MACtC,EAAkB,EAAa,EAAO,OAAO,EAAK,CAAC,CAC1D;EACF,IAAI,CAAC,KAAc,CAAC,GAClB,OAAO;EAET,IAAM,IACJ,EAAa,GAAU,EAAI,KAAK,IAChC,EAAoB,MAAM,MACjB,EAAa,GAAU,EAAO,OAAO,KAAK,CACjD;EACJ,OAAO;GACL,IAAI,OAAO,EAAI;GACf,MAAM;IACJ,MAAM;IACN,IAAI,EAAI;IACR;IACD;GACD;GACA,MAAM,EAAI;GACV,MAAM,EACJ,GACA,kBAAC,GAAD;IAAiB,OAAO;IAAI,QAAQ;IAAI,eAAY;IAAS,CAAA,CAC9D;GACD;GACA,WAAW;GACZ;IAGG,IAAkC,EAAE,EAEpC,IAAe,GAAS,gBAAgB,EAAE;CAChD,IAAI,EAAa,SAAS,GAAG;EAC3B,IAAM,IAAsB,EACzB,KAAK,MAA8C;GAClD,IAAI,EAAY,SAAS,aACvB,OAAO,GAAoB;GAE7B,IAAI,EAAY,SAAS,OAEvB,OAAO,EAAa;IAClB,KAFU,EAAkB,GAAa,EAEzC;IACA,MAAM,EAAY;IACnB,CAAC;GAEJ,IAAI;GAIJ,OAHI,EAAY,SAAS,SACvB,IAAY,EAAa,EAAY,OAAO,EAAK,GAE5C,EAAgB;IACrB,UAAU,EAAY;IACtB,UAAU,EAAY;IACtB;IACD,CAAC;IACF,CACD,QAAQ,MACA,KAAQ,KACf;EAEJ,AAAI,EAAoB,SAAS,KAC/B,EAAS,KAAK;GACZ,IAAI;GACJ,OAAO;GACP,aAAa;GACd,CAAC;;CAIN,IAAI,EAAgB,SAAS,GAAG;EAC9B,IAAM,IAAc,EACjB,KAAK,MAAa;GACjB,IAAM,IAAY,EAAkB,IAAI,EAAS;GACjD,OAAO,EAAgB;IACrB;IACA,SAAS,GAAW;IACpB,WAAW,GAAW;IACtB,UAAU,GAAW;IACrB,eAAe;IAChB,CAAC;IACF,CACD,QAAQ,MACA,KAAQ,KACf;EAEJ,AAAI,EAAY,SAAS,KACvB,EAAS,KAAK;GACZ,IAAI;GACJ,OAAO,EAAE,0BAA0B;GACnC,MAAM,EACJ,KAAA,GACA,kBAAC,GAAD;IAAQ,OAAO;IAAI,QAAQ;IAAI,eAAY;IAAS,CAAA,CACrD;GACD,OAAO;GACP,aAAa;GACd,CAAC;;CAIN,IAAI,EAAY,SAAS,GAAG;EAC1B,IAAM,IAAqB,EACxB,KAAK,MAA6C;GAEjD,IADe,EAAS,EAAW,OACrB,MACZ,OAAO;GAET,IAAM,IAA8C;IAClD,MAAM,EAAW;IACjB,IAAI,EAAW;IAChB;GAKD,IAJkB,GAAS,gBAAgB,GAAY,EAAY,KACjD,MAIhB,MAAoB,MACpB,CAAC,EAAW,MAAM,aAAa,CAAC,SAAS,EAAgB,EAEzD,OAAO;GAET,IAAM,IAAY,EAAkB,IAAI,EAAW,GAAG;GACtD,OAAO;IACL,IAAI,UAAU,EAAW,KAAK,GAAG,EAAW;IAC5C,MAAM;KACJ,MAAM,EAAW;KACjB,IAAI,EAAW;KACf,SAAS,GAAW;KACrB;IACD,OAAO,EAAW;IAClB,MAAM,EAAW;IACjB,MAAM,EACJ,GAAW,YAAY,GAAW,WAClC,kBAAC,GAAD;KAAiB,OAAO;KAAI,QAAQ;KAAI,eAAY;KAAS,CAAA,CAC9D;IACD,UAAU,EAAa,GAAU,EAAW,KAAK;IACjD,WAAW,EAAW;IACvB;IACD,CACD,QAAQ,MACA,KAAQ,KACf;EAEJ,AAAI,EAAmB,SAAS,KAC9B,EAAS,KAAK;GACZ,IAAI;GACJ,OAAO,EAAE,0BAA0B;GACnC,MAAM,EACJ,KAAA,GACA,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,eAAY;IACZ,CAAA,CACH;GACD,OAAO;GACP,aAAa;GACd,CAAC;;CAsFN,OAlFA,GAAQ,SAAS,CAAC,GAAS,OAAW;EACpC,IAAI,EAAM,aAAa,QAAQ,CAAC,EAAM,UAAU,EAAY,EAC1D;EAGF,IAAM,IAAiC,EAAE,EAEnC,IAAa,EAAkB,EAAM;EAC3C,AAAI,EAAW,SAAS,KACtB,EAAW,SAAS,MAAc;GAChC,IAAI,EAAU,SAAS,aAAa;IAClC,IAAM,IAAO,EAAmB,EAAQ;IACxC,AAAI,KAAQ,QACV,EAAM,KAAK,EAAK;IAElB;;GAEF,IAAI,EAAU,SAAS,OAAO;IAE5B,IAAM,IAAO,EAAa;KACxB,KAFU,EAAkB,GAAW,EAEvC;KACA;KACA,MAAM,EAAU,QAAQ,EAAM;KAC/B,CAAC;IACF,AAAI,KAAQ,QACV,EAAM,KAAK,EAAK;IAElB;;GAEF,IAAI;GACJ,AAAI,EAAU,SAAS,SACrB,IAAY,EAAa,EAAU,OAAO,EAAK;GAEjD,IAAM,IAAO,EAAgB;IAC3B,UAAU,EAAU;IACpB;IACA,WAAW,EAAM;IACjB,UAAU,EAAU;IACpB;IACD,CAAC;GACF,AAAI,KAAQ,QACV,EAAM,KAAK,EAAK;IAElB;EAGJ,IAAI,IAAwC;EAO5C,IANI,KAAoB,EAAM,UAAU,wBAAwB,OAC9D,IAAe,EAAM,QAAQ,MACpB,EAAK,OAAO,eAAe,EAAK,aAAa,GACpD,GAGA,EAAa,WAAW,GAC1B;EAGF,IAAI;EACJ,AAAI,EAAM,SAAS,SACjB,IAAQ,EAAa,EAAM,OAAO,EAAK;EAGzC,IAAM,IAAc,IAAqB,IACrC;EAOJ,AANI,KAA0B,SAC5B,KAAqB,MAAuB;GAC1C,EAAuB,GAAS,EAAU;MAI9C,EAAS,KAAK;GACZ,IAAI;GACJ;GACA,MAAM,EAAW,EAAM,MAAM,KAAA,GAAW,GAAG;GAC3C,OAAO;GACP,aAAa,EAAM,UAAU,eAAe;GAC5C,kBAAkB,EAAM,UAAU,oBAAoB;GACtD;GACA;GACD,CAAC;GACF,EAEK;;;;yDE5jBI,MAA0B,EACrC,iBAC8C;CAC9C,IAAM,EAAE,MAAM,GAA+B;CAE7C,OACE,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,GAAD;GACE,MAAK;GACL,WAAW;GACX,SACE,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,MAAK;IACL,SAAS;cAER,EAAE,uBAAuB;IACnB,CAAA;aAGV,EAAE,2BAA2B;GACjB,CAAA;EACX,CAAA;+NE7BG,UAET,kBAAC,OAAD;CACE,WAAW;CACX,MAAK;CACL,aAAU;CACV,aAAU;WAJZ;EAME,kBAAC,GAAD;GAAU,SAAQ;GAAO,OAAM;GAAM,WAAW;GAAgB,CAAA;EAChE,kBAAC,GAAD;GAAU,SAAQ;GAAO,OAAM;GAAQ,CAAA;EACvC,kBAAC,OAAD;GAAK,WAAW;aACb,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,GAAG,MAE3B,kBAAC,OAAD;IAAuC,WAAW;cAAlD;KACE,kBAAC,GAAD;MAAU,SAAQ;MAAO,OAAM;MAAQ,CAAA;KACvC,kBAAC,GAAD;MAAU,SAAQ;MAAO,OAAM;MAAM,OAAO;MAAK,CAAA;KACjD,kBAAC,GAAD;MAAU,SAAQ;MAAQ,OAAM;MAAO,QAAQ;MAAO,CAAA;KAClD;MAJI,oBAAoB,IAIxB,CAER;GACE,CAAA;EACF;6DEfG,MAA6B,EACxC,kBAGE,kBAAC,OAAD;CAAK,WAAW;WACd,kBAAC,GAAD;EACE,WAAW,EAAE,UAAO,eACX,kBAAC,IAAD;GAA+B;GAAO,SAAS;GAAS,CAAA;YAGjE,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,EAA6B,CAAA;GAAG;GAAoB,CAAA;EAChD,CAAA;CACtB,CAAA,ECTJ,KAAiB,MACd,GAAO,MAAM,IAAI,IAGb,MAAiC,EAC5C,WACA,0BACwE;CASxE,IAAI,IANsB,CAFR,EAAc,GAAQ,UAEb,EADV,EAAc,GAAQ,SACD,CAAS,CAC5C,QAAQ,MACA,MAAU,GACjB,CACD,KAAK,IAAI,CACT,MACe;CAClB,AAAI,MAAgB,OAClB,IAAc;CAGhB,IAAM,IAAQ,EAAc,GAAQ,MAAM,EAEtC,IADkB,EAAc,GAAQ,SAC7B;CACf,AAAI,MAAa,OACf,IAAW;CAGb,IAAM,IAAY,CAAC,EAAY;CAK/B,OAJI,MAAU,MACZ,EAAU,KAAK,EAAM,EAGhB;EACL;EACA;EACA;EACA,WAAW,EAAU,KAAK,MAAM;EACjC;GCqBG,KAAmC,mCACnC,KAAoC,8BAEpC,MACJ,MAC2C;CAC3C,IAAI,OAAO,SAAW,KACpB,OAAO,EAAE;CAEX,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,EAAW;EACnD,IAAI,KAAO,MACT,OAAO,EAAE;EAEX,IAAM,IAAS,KAAK,MAAM,EAAI;EAI9B,OAHK,MAAM,QAAQ,EAAO,GAGnB,EAAO,QAAQ,MAA8C;GAClE,IAAoB,OAAO,KAAS,aAAhC,GACF,OAAO;GAET,IAAM,IAAY;GAClB,QACG,EAAU,SAAS,YAAY,EAAU,SAAS,WACnD,OAAO,EAAU,MAAO,YACxB,OAAO,EAAU,SAAU,YAC3B,OAAO,EAAU,QAAS,YAC1B,OAAO,EAAU,aAAc;IAEjC,GAdO,EAAE;SAeL;EACN,OAAO,EAAE;;GAIP,MACJ,GACA,MACS;CACL,aAAO,SAAW,MAGtB,IAAI;EACF,OAAO,aAAa,QAAQ,GAAY,KAAK,UAAU,EAAM,CAAC;SACxD;GAKJ,KAAyB,EAC7B,aACA,gBACA,eACA,uBACmC;CACnC,IAAM,EAAE,GAAG,MAAS,GAAgB,EAC9B,EAAE,SAAM,GAA+B,EACvC,EAAE,gBAAa,IAAa,EAC5B,IAAU,GAAW,GAAe,EACpC,IAAmB,GAAqB,EACxC,EACJ,MAAM,GACN,aACA,aACA,eACE,GAAqB,EACnB,CAAC,GAAc,MAAmB,EAAS,GAAG,EAC9C,IACJ,GAAS,aAAa,cAAc,IAChC,IACJ,GAAS,aAAa,qBAAqB,IACvC,CAAC,GAAoB,KAAyB,QAAe;EACjE,IAAI,CAAC,KAA2B,OAAO,SAAW,KAChD,OAAO;EAET,IAAI;GACF,OACE,OAAO,aAAa,QAClB,GAAG,EAA6B,YACjC,KAAK;UAEF;GACN,OAAO;;GAET,EACI,CAAC,GAAc,KAAmB,EAAS,GAAM,EACjD,CAAC,GAAc,MAAmB,EAAgC,KAAK,EACvE,IAAoB,GAAS,aAC7B,IAAqB,GAAmB,YAAY,IACpD,IACJ,GAAmB,cAAc,IAC7B,IAAsB,GAAmB,YAAY,GACrD,CAAC,GAAa,MAAkB,QAG/B,IAGE,GAAgB,EAAsB,GAFpC,EAAE,CAGX;CAEF,QAAgB;EACV,OAAC,KAA2B,OAAO,SAAW,MAGlD,IAAI;GACF,OAAO,aAAa,QAClB,GAAG,EAA6B,aAChC,OAAO,EAAmB,CAC3B;UACK;IAGP;EACD;EACA;EACA;EACD,CAAC;CAEF,IAAM,IAAS,QACN,EAAqB,GAAU,EAAQ,EAC7C,CAAC,GAAU,EAAQ,CAAC,EAEjB,KAAW,QACR,OAAO,KAAK,EAAO,EACzB,CAAC,EAAO,CAAC,EAEN,KAA4B,QACzB,OAAO,YACZ,OAAO,QAAQ,EAAO,CAAC,KAAK,CAAC,GAAS,OAC7B,CAAC,GAAS,EAAM,UAAU,oBAAoB,GAAK,CAC1D,CACH,EACA,CAAC,EAAO,CAAC,EAEN,KAAmB,QAChB,EAAwB,GAAQ,GAAU,GAAS,EAAY,EACrE;EAAC;EAAU;EAAQ;EAAa;EAAQ,CAAC,EAEtC,IAAiB,QACd,EAAsB,GAAU,EAAS,EAC/C,CAAC,GAAU,EAAS,CAAC;CAExB,QAAgB;EACd,IAAI,CAAC,KAAsB,KAAkB,MAC3C;EAEF,IAAM,IAAS,EAAS;EAIxB,IAHI,KAAU,QAGV,EAAO,SAAS,UAAU,CAAC,EAAO,SACpC;EAEF,IAAM,IAAO,EAAO,OAAO,MACvB,IAA4C;EAChD,AAAI,EAAO,SAAS,WAClB,IAAO;EAET,IAAM,IAAoC;GACxC;GACA,IAAI;GACJ,OAAO,EAAO,MAAM,EAAK;GACzB;GACA,WAAW,KAAK,KAAK;GACtB;EACD,IAAgB,MAAS;GACvB,IAAM,IAAO,CACX,GACA,GAAG,EAAK,QAAQ,MACP,EAAM,OAAO,EAAK,MAAM,EAAM,SAAS,EAAK,KACnD,CACH,CAAC,MAAM,GAAG,EAAoB;GAE/B,OADA,GAAiB,GAAuB,EAAK,EACtC;IACP;IACD;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAM,EACJ,SACA,QAAQ,GACR,SAAS,MACP,GAAyB;EAC3B,SAAS,GAAS,aAAa,YAAY;EAC3C,YAAY,GAAS,aAAa;EAClC;EACD,CAAC,EAEE;CACJ,AAAI,GAAS,aAAa,cAAc,SACtC,KAA0B,GAAG,EAAQ,YAAY,WAAW;CAG9D,IAAM,EAAE,uBAAoB,oBAAiB,GAAwB;EACnE;EACA;EACA;EACA,SAAS,GAAS,aAAa,kBAAkB;EACjD,YAAY;EACb,CAAC,EAEI,KAAW,QACR,GAAqB;EAC1B;EACA;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;EACA,iBAAiB;EACjB;EACA,aAAa;EACb,cAAc;EACd;EACA,wBAAwB;EACxB,kBAAkB;EACnB,CAAC,EACD;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAEI,KAAiB,QACd,GAAqB;EAC1B;EACA;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;EACA,iBAAiB;EACjB;EACA,aAAa;EACb,cAAc;EACd;EACA,wBAAwB;EACxB,kBAAkB;EACnB,CAAC,EACD;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAEI,KAAc,QAEd,OADgB,KACX,KAAK,QAAQ,KACb,QAEF,QACN,EAAE,CAAC,EAEA,KAAgB,QAAkB;EAClC,MASJ,EAAgB,GAAK,GA0BrB,YAxB8C;GAC5C,IAAI;IACF,IAAM,IAAS,MAAM,EAAW,OAAO,MAAM;IAgB7C,AAfA,MAAM,IAAI,SAAe,GAAS,MAAW;KAC3C,EAA+B,GAAkB;MAC/C,UAAU,EAAO;MACjB,WAAW,EAAE;MACb,mBAAmB;OACjB,GAAS;;MAEX,UAAU,MAAU;OAClB,EAAO,EAAM;;MAEhB,CAAC;MACF,EACF,aAAa,WAAW,aAAa,EACrC,aAAa,WAAW,cAAc,EACtC,GAAiB,EACjB,GAAS,QAAQ,KAAK,EAAE,UAAU,EAAuB,EAAS,EAAE,CAAC;aAC7D;IACR,EAAgB,GAAM;;MAId,CAAC,YAAY,GAEvB;IACD;EAAC,EAAW;EAAQ;EAAU;EAAc;EAAkB;EAAQ,CAAC,EAEpE,KAAS,GAAY,MAAM,MAC3B,KAAiB,QACd,GAA8B;EACnC;EACA,kBAAkB,EAAE,8BAA8B;EACnD,CAAC,EACD,CAAC,GAAG,GAAO,CAAC,EAET,KACJ,kBAAC,GAAD;EACE,WAAW;EACX,QAAQ;EACR,QAAQ;GACN,cAAc,EAAE,wBAAwB;GACxC,eAAe,EAAE,gCAAgC;GACjD,SAAS,EAAE,kCAAkC;GAC9C;EACD,WAAW;EACG;EACd,CAAA,EAGE,KACJ,kBAAC,GAAD;EACE,WAAW;EACX,QAAQ;EACR,QAAQ;GACN,cAAc,EAAE,wBAAwB;GACxC,eAAe,EAAE,gCAAgC;GACjD,SAAS,EAAE,kCAAkC;GAC9C;EACD,WAAW;EACG;EACd,CAAA,EAGA,KAAkC;CACtC,AAAI,KAAgB,SAClB,KACE,kBAAC,IAAD,EAA4B,aAAqC,CAAA;CAIrE,IAAM,KACJ,kBAAC,GAAD;EACE,OAAO;EACP,UAAU;EACV,aAAa,EAAE,6BAA6B;EAC5C,WAAW,EAAE,6BAA6B;EAC1C,CAAA;CAGJ,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,IAAD;EACE,SAAS;GACP;GACA,QAAQ,kBAAC,GAAD,EAA+B,iBAAe,CAAA;GACtD,QAAQ;GACR,QAAQ;GACR,aAAa;GACb,mBAAmB;GACnB,qBAAqB,EAAE,kCAAkC;GACzD,mBAAmB,EAAE,gCAAgC;GACrD,qBAAqB,EAAE,8BAA8B;GACtD;EACD,eAAe;GACb,UAAU;GACV,QAAQ,kBAAC,GAAD,EAA+B,iBAAe,CAAA;GACtD,QAAQ;GACR,QAAQ;GACR,aAAa;GACb,oBAAoB;GACpB,qBAAqB,EAAE,8BAA8B;GACtD;EACD,QAAQ,EACN,YAAY,kBAAC,OAAD,EAAK,KAAK,IAAmB,CAAA,EAC1C;YAED,kBAAC,GAAD;GAA4C;aAC1C,kBAAC,GAAD;IACE,OAAO;KACL,QAAQ;KACR,eAAe;KACf,gBAAgB,EAAE,0BAA0B;KAC7C;cAEA;IACqC,CAAA;GACV,CAAA;EACf,CAAA,EACL,CAAA;GAed,MAAyB,EAC7B,aACA,qBACA,aACA,eACA,uBAKE,kBAAC,GAAD;CACe,aAJG,EAAkB,GAAkB,EAIvC;CACD;CACG;CAEd;CACqB,CAAA,EAIf,KAAwB,EACnC,aACA,qBACA,aACA,eACA,uBAEI,KAAoB,QAAQ,KAAY,OAExC,kBAAC,IAAD;CACoB;CACR;CACE;CACG;CAEd;CACqB,CAAA,GAK1B,kBAAC,GAAD;CACE,aAAa;CACD;CACG;CAEd;CACqB,CAAA"}
@@ -1,109 +0,0 @@
1
- import { t as e } from "./useBackofficeReactTranslation-Btt58EIo.js";
2
- import { t } from "./BackofficeErrorBoundary-BwRVSDHU.js";
3
- import { r as n } from "./EntityIdPickerDialog-BSn0v3bv.js";
4
- import { Suspense as r, createContext as i, useCallback as a, useContext as o, useMemo as s } from "react";
5
- import { cx as c } from "@plumile/ui";
6
- import * as l from "react-relay";
7
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
8
- import { buildBackofficeListLink as f } from "@plumile/backoffice-core/state/buildListHref.js";
9
- import { setWhereValue as p } from "@plumile/backoffice-core/filters/where.js";
10
- //#region src/components/backoffice/scaffolds/BackofficeListFilterContext.tsx
11
- var m = i(null), h = (e) => {
12
- let { config: t, state: n, pushState: r, children: i } = e, o = a((e, t, i) => {
13
- let a = p(n.where, e, t, i);
14
- r({
15
- ...n,
16
- where: a
17
- });
18
- }, [r, n]), c = a((e, r, i) => {
19
- let a = p(n.where, e, r, i);
20
- return f(t, {
21
- ...n,
22
- where: a
23
- });
24
- }, [t, n]), l = s(() => ({
25
- config: t,
26
- state: n,
27
- pushState: r,
28
- applyFilter: o,
29
- buildFilterLink: c
30
- }), [
31
- o,
32
- c,
33
- t,
34
- r,
35
- n
36
- ]);
37
- return /* @__PURE__ */ u(m.Provider, {
38
- value: l,
39
- children: i
40
- });
41
- }, g = () => o(m), { useLazyLoadQuery: _ } = l, v = (e) => {
42
- if (typeof e != "object" || !e) return null;
43
- let { title: t } = e;
44
- if (typeof t != "string") return null;
45
- let n = t.trim();
46
- return n === "" ? null : n;
47
- }, y = ({ valueConfig: e, id: t, children: n }) => {
48
- let r = _(e.query, { id: t }), i = e.resolveRow(r), a = null;
49
- return i != null && (a = e.toRow(i)), n(v(a));
50
- }, b = ({ entityId: e, id: i, children: a }) => {
51
- let o = n(e, { enabled: i.trim() !== "" }), s = null;
52
- o.status === "loaded" && (s = o.module.config.picker.value ?? null);
53
- let c = a(null);
54
- return s == null ? c : /* @__PURE__ */ u(t, {
55
- fallback: () => c,
56
- children: /* @__PURE__ */ u(r, {
57
- fallback: c,
58
- children: /* @__PURE__ */ u(y, {
59
- valueConfig: s,
60
- id: i,
61
- children: a
62
- })
63
- })
64
- });
65
- }, x = ({ entityId: t, id: n }) => {
66
- let { t: r } = e(), i = n.trim();
67
- return /* @__PURE__ */ u(b, {
68
- entityId: t,
69
- id: n,
70
- children: (e) => {
71
- let t = i;
72
- return i === "" && (t = r("filters.placeholders.unresolved")), /* @__PURE__ */ u("span", { children: e ?? t });
73
- }
74
- });
75
- }, S = "txvbqb9ip txvbqbai7 txvbqbao7 txvbqbu7g", C = {
76
- compact: "txvbqbao7",
77
- default: "txvbqbaog"
78
- }, w = {
79
- auto: "sqlyj40",
80
- stacked: "sqlyj41"
81
- }, T = ({ activeFilters: e, className: t, density: n = "compact", filterDrawerTrigger: r, primaryFilters: i, responsiveMode: a = "auto", sortControl: o, utilityActions: s }) => {
82
- let l = i != null || r != null, f = o != null || s != null, p = l || f, m = e != null;
83
- return !p && !m ? null : /* @__PURE__ */ d("div", {
84
- className: c(S, C[n], w[a], t),
85
- children: [p && /* @__PURE__ */ d("div", {
86
- className: "sqlyj42 txvbqb9iy txvbqbcp txvbqbao7 txvbqbu7g",
87
- children: [l && /* @__PURE__ */ d("div", {
88
- className: "sqlyj43 txvbqb9ip txvbqbcp txvbqbajy txvbqbao7 txvbqbk5y",
89
- children: [i, r]
90
- }), f && /* @__PURE__ */ d("div", {
91
- className: "sqlyj44 txvbqb9ip txvbqbcp txvbqbdp7 txvbqbajy txvbqbao7 txvbqbk5y",
92
- children: [o != null && /* @__PURE__ */ u("div", {
93
- className: "sqlyj45 txvbqb9ip txvbqbcp txvbqbk5y",
94
- children: o
95
- }), s != null && /* @__PURE__ */ u("div", {
96
- className: "sqlyj46 txvbqb9ip txvbqbcp txvbqbdp7 txvbqbajy txvbqbao7",
97
- children: s
98
- })]
99
- })]
100
- }), m && /* @__PURE__ */ u("div", {
101
- className: "txvbqb9ip txvbqbcp txvbqbajy txvbqbao7 txvbqbp6g txvbqb4sg txvbqb1qg txvbqb2cg",
102
- children: e
103
- })]
104
- });
105
- };
106
- //#endregion
107
- export { g as a, h as i, x as n, b as r, T as t };
108
-
109
- //# sourceMappingURL=BackofficeListToolbar-loFfIPtP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeListToolbar-loFfIPtP.js","names":[],"sources":["../../src/components/backoffice/scaffolds/BackofficeListFilterContext.tsx","../../src/components/backoffice/filters/EntityFilterValue.tsx","../../src/components/backoffice/lists/backofficeListToolbar.css.ts","../../src/components/backoffice/lists/BackofficeListToolbar.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n type JSX,\n type ReactNode,\n} from 'react';\n\nimport type {\n BackofficeListState,\n BackofficeRuntimeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { buildBackofficeListLink } from '@plumile/backoffice-core/state/buildListHref.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\n\nexport type BackofficeListFilterContextValue = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<Record<string, unknown>, string>;\n pushState: (\n next: BackofficeListState<Record<string, unknown>, string>,\n ) => void;\n applyFilter: (\n whereKey: string,\n value: unknown,\n path?: readonly string[],\n ) => void;\n buildFilterLink: (\n whereKey: string,\n value: unknown,\n path?: readonly string[],\n ) => { pathname: string; search: string };\n};\n\nconst BackofficeListFilterContext =\n createContext<BackofficeListFilterContextValue | null>(null);\n\ntype ProviderProps<\n Where extends Record<string, unknown>,\n Sort extends string,\n> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<Where, Sort>;\n pushState: (next: BackofficeListState<Where, Sort>) => void;\n children: ReactNode;\n};\n\nexport const BackofficeListFilterProvider = <\n Where extends Record<string, unknown>,\n Sort extends string,\n>(\n props: ProviderProps<Where, Sort>,\n): JSX.Element => {\n const { config, state, pushState, children } = props;\n\n const applyFilter = useCallback(\n (whereKey: string, value: unknown, path?: readonly string[]) => {\n const nextWhere = setWhereValue(\n state.where,\n whereKey as keyof Where,\n value,\n path,\n );\n pushState({ ...state, where: nextWhere });\n },\n [pushState, state],\n );\n\n const buildFilterLink = useCallback(\n (whereKey: string, value: unknown, path?: readonly string[]) => {\n const nextWhere = setWhereValue(\n state.where,\n whereKey as keyof Where,\n value,\n path,\n );\n return buildBackofficeListLink(config, { ...state, where: nextWhere });\n },\n [config, state],\n );\n\n const contextValue = useMemo<BackofficeListFilterContextValue>(() => {\n return {\n config,\n state,\n pushState: pushState as BackofficeListFilterContextValue['pushState'],\n applyFilter,\n buildFilterLink,\n };\n }, [applyFilter, buildFilterLink, config, pushState, state]);\n\n return (\n <BackofficeListFilterContext.Provider value={contextValue}>\n {children}\n </BackofficeListFilterContext.Provider>\n );\n};\n\nexport const useBackofficeListFilterContext =\n (): BackofficeListFilterContextValue | null => {\n return useContext(BackofficeListFilterContext);\n };\n\nexport default BackofficeListFilterContext;\n","import { Suspense, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport type { BackofficePickerValueConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype EntityFilterValueContentProps<RowRef, RowView> = {\n valueConfig: BackofficePickerValueConfig<RowRef, RowView>;\n id: string;\n children: (label: string | null) => JSX.Element;\n};\n\nconst resolveTitle = (value: unknown): string | null => {\n if (value == null || typeof value !== 'object') {\n return null;\n }\n const { title } = value as { title?: unknown };\n if (typeof title !== 'string') {\n return null;\n }\n const trimmed = title.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nconst EntityFilterValueContent = <RowRef, RowView>({\n valueConfig,\n id,\n children,\n}: EntityFilterValueContentProps<RowRef, RowView>): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(valueConfig.query, { id });\n const rowRef = valueConfig.resolveRow(data);\n let row: RowView | null = null;\n if (rowRef != null) {\n row = valueConfig.toRow(rowRef);\n }\n const title = resolveTitle(row);\n\n return children(title);\n};\n\nexport type EntityFilterValueTextProps = {\n entityId: string;\n id: string;\n children: (label: string | null) => JSX.Element;\n};\n\nexport const EntityFilterValueText = ({\n entityId,\n id,\n children,\n}: EntityFilterValueTextProps): JSX.Element => {\n const resolvedId = id.trim();\n const pickerEntityState = useBackofficePickerEntityLoader(entityId, {\n enabled: resolvedId !== '',\n });\n let valueConfig: BackofficePickerValueConfig<unknown, unknown> | null = null;\n if (pickerEntityState.status === 'loaded') {\n valueConfig = pickerEntityState.module.config.picker.value ?? null;\n }\n\n const fallback = children(null);\n if (valueConfig == null) {\n return fallback;\n }\n\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return fallback;\n }}\n >\n <Suspense fallback={fallback}>\n <EntityFilterValueContent valueConfig={valueConfig} id={id}>\n {children}\n </EntityFilterValueContent>\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport type EntityFilterValueProps = {\n entityId: string;\n id: string;\n};\n\nexport const EntityFilterValue = ({\n entityId,\n id,\n}: EntityFilterValueProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedId = id.trim();\n\n return (\n <EntityFilterValueText entityId={entityId} id={id}>\n {(label) => {\n let fallbackLabel = resolvedId;\n if (resolvedId === '') {\n fallbackLabel = t('filters.placeholders.unresolved');\n }\n return <span>{label ?? fallbackLabel}</span>;\n }}\n </EntityFilterValueText>\n );\n};\n\nexport default EntityFilterValue;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '@plumile/ui';\n\nconst MOBILE_MEDIA_QUERY = 'screen and (max-width: 767px)';\nconst TABLET_MEDIA_QUERY = 'screen and (max-width: 1023px)';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const density = {\n compact: sprinkles({\n gap: 2,\n }),\n default: sprinkles({\n gap: 3,\n }),\n};\n\nexport const responsiveMode = {\n auto: style({}),\n stacked: style({}),\n};\n\nexport const mainRow = style([\n sprinkles({\n display: 'grid',\n alignItems: 'center',\n gap: 2,\n width: 'full',\n }),\n {\n gridTemplateColumns: 'minmax(0, 1fr) auto',\n selectors: {\n [`${responsiveMode.stacked} &`]: {\n gridTemplateColumns: 'minmax(0, 1fr)',\n },\n },\n '@media': {\n [TABLET_MEDIA_QUERY]: {\n gridTemplateColumns: 'minmax(0, 1fr)',\n },\n },\n },\n]);\n\nexport const filtersGroup = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n minWidth: 0,\n }),\n {\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n alignItems: 'stretch',\n width: '100%',\n },\n },\n },\n]);\n\nexport const rightGroup = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n flexWrap: 'wrap',\n gap: 2,\n minWidth: 0,\n }),\n {\n '@media': {\n [TABLET_MEDIA_QUERY]: {\n justifyContent: 'flex-start',\n },\n [MOBILE_MEDIA_QUERY]: {\n alignItems: 'stretch',\n width: '100%',\n },\n },\n },\n]);\n\nexport const sortGroup = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n minWidth: 0,\n }),\n {\n width: '11.5rem',\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n width: '100%',\n },\n },\n },\n]);\n\nexport const actionsGroup = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n flexWrap: 'wrap',\n gap: 2,\n }),\n {\n '@media': {\n [TABLET_MEDIA_QUERY]: {\n justifyContent: 'flex-start',\n },\n [MOBILE_MEDIA_QUERY]: {\n alignItems: 'stretch',\n width: '100%',\n },\n },\n },\n]);\n\nexport const activeFiltersRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n paddingTop: 2,\n borderTopWidth: 'px',\n borderStyle: 'solid',\n borderTopColor: 'borderSubtle',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeListToolbar.css.js';\n\nexport type BackofficeListToolbarDensity = 'compact' | 'default';\n\nexport type BackofficeListToolbarResponsiveMode = 'auto' | 'stacked';\n\nexport type BackofficeListToolbarProps = {\n primaryFilters?: ReactNode;\n filterDrawerTrigger?: ReactNode;\n sortControl?: ReactNode;\n utilityActions?: ReactNode;\n activeFilters?: ReactNode;\n density?: BackofficeListToolbarDensity;\n responsiveMode?: BackofficeListToolbarResponsiveMode;\n className?: string;\n};\n\nexport const BackofficeListToolbar = ({\n activeFilters,\n className,\n density = 'compact',\n filterDrawerTrigger,\n primaryFilters,\n responsiveMode = 'auto',\n sortControl,\n utilityActions,\n}: BackofficeListToolbarProps): JSX.Element | null => {\n const hasFilters = primaryFilters != null || filterDrawerTrigger != null;\n const hasRightControls = sortControl != null || utilityActions != null;\n const hasMainRow = hasFilters || hasRightControls;\n const hasActiveFilters = activeFilters != null;\n\n if (!hasMainRow && !hasActiveFilters) {\n return null;\n }\n\n return (\n <div\n className={cx(\n styles.container,\n styles.density[density],\n styles.responsiveMode[responsiveMode],\n className,\n )}\n >\n {hasMainRow && (\n <div className={styles.mainRow}>\n {hasFilters && (\n <div className={styles.filtersGroup}>\n {primaryFilters}\n {filterDrawerTrigger}\n </div>\n )}\n {hasRightControls && (\n <div className={styles.rightGroup}>\n {sortControl != null && (\n <div className={styles.sortGroup}>{sortControl}</div>\n )}\n {utilityActions != null && (\n <div className={styles.actionsGroup}>{utilityActions}</div>\n )}\n </div>\n )}\n </div>\n )}\n {hasActiveFilters && (\n <div className={styles.activeFiltersRow}>{activeFilters}</div>\n )}\n </div>\n );\n};\n\nexport default BackofficeListToolbar;\n"],"mappings":"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"}
@@ -1,46 +0,0 @@
1
- import { t as e } from "./useRelayEnvironment-vQ86aW-n.js";
2
- import { r as t } from "./useBackofficeReactTranslation-Btt58EIo.js";
3
- import { n, t as r } from "./synchronizeAuthStatusQuery-DNJR5MfH.js";
4
- import { t as i } from "./useBackofficeAuth-Da7FPNys.js";
5
- import { n as a } from "./backofficeAuthPaths-2hHNn8D3.js";
6
- import { t as o } from "./useBackofficeLazyValue-CW9xfRzQ.js";
7
- import { useCallback as s, useContext as c, useRef as l } from "react";
8
- import { RoutingContext as u } from "@plumile/router";
9
- import * as d from "react-relay";
10
- import { jsx as f } from "react/jsx-runtime";
11
- //#region src/pages/BackofficeLoginPage.tsx
12
- var { usePreloadedQuery: p } = d, m = ({ prepared: d }) => {
13
- let m = c(u), { auth: h, basePath: g } = t(), _ = o(), v = i(), y = e(), b = l(!1);
14
- return /* @__PURE__ */ f(n, {
15
- auth: v,
16
- oidcProviders: p(_.loginQuery, d.query).oidcProviders ?? [],
17
- onLoginSuccess: s(() => {
18
- b.current || (b.current = !0, (async () => {
19
- try {
20
- let e = await h.session.load();
21
- if (e.authStatusQuery == null) {
22
- m?.history.push({ pathname: g });
23
- return;
24
- }
25
- if (await h.lifecycle?.onLoginSuccess?.(), !await r(y, e.authStatusQuery)) return;
26
- m?.history.push({ pathname: g });
27
- } catch {} finally {
28
- b.current = !1;
29
- }
30
- })().catch(() => {}));
31
- }, [
32
- h.lifecycle,
33
- h.session,
34
- g,
35
- y,
36
- m?.history
37
- ]),
38
- onForgotPassword: s(() => {
39
- m?.history.push({ pathname: a(g) });
40
- }, [g, m?.history])
41
- });
42
- };
43
- //#endregion
44
- export { m as BackofficeLoginPage, m as default };
45
-
46
- //# sourceMappingURL=BackofficeLoginPage-DIlcOueK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeLoginPage-DIlcOueK.js","names":[],"sources":["../../src/pages/BackofficeLoginPage.tsx"],"sourcesContent":["import { useCallback, useContext, useRef, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { PreloadedQuery } from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { RoutingContext } from '@plumile/router';\n\nimport type { OidcProviderKind } from '../modules/sharedSchemaTypes.js';\nimport { LoginFlow } from '../auth/login/LoginFlow.js';\nimport { synchronizeAuthStatusQuery } from '../auth/login/synchronizeAuthStatusQuery.js';\nimport { useBackofficeAuth } from '../hooks/useBackofficeAuth.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeAuthLoginConfig } from '../provider/useBackofficeLazyValue.js';\nimport { getBackofficePasswordResetPath } from '../router/backofficeAuthPaths.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nexport type BackofficeLoginPageProps = {\n prepared: { query: PreloadedQuery<OperationType> };\n};\n\nexport const BackofficeLoginPage = ({\n prepared,\n}: BackofficeLoginPageProps): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { auth: authConfig, basePath } = useBackofficeConfig();\n const auth = useBackofficeAuthLoginConfig();\n const authState = useBackofficeAuth();\n const relayEnvironment = useRelayEnvironment();\n const isPostLoginSyncInFlightRef = useRef(false);\n\n const data = usePreloadedQuery(auth.loginQuery, prepared.query);\n const oidcProviders =\n (data as { oidcProviders?: readonly OidcProviderKind[] }).oidcProviders ??\n [];\n\n const handleLoginSuccess = useCallback((): void => {\n if (isPostLoginSyncInFlightRef.current) {\n return;\n }\n\n isPostLoginSyncInFlightRef.current = true;\n const runPostLoginSync = async (): Promise<void> => {\n try {\n const sessionAuth = await authConfig.session.load();\n if (sessionAuth.authStatusQuery == null) {\n routerContext?.history.push({\n pathname: basePath,\n });\n return;\n }\n\n await authConfig.lifecycle?.onLoginSuccess?.();\n\n const isLoggedIn = await synchronizeAuthStatusQuery<OperationType>(\n relayEnvironment,\n sessionAuth.authStatusQuery,\n );\n if (!isLoggedIn) {\n return;\n }\n routerContext?.history.push({\n pathname: basePath,\n });\n } catch {\n // Keep user on login page if post-login auth sync fails.\n } finally {\n isPostLoginSyncInFlightRef.current = false;\n }\n };\n\n runPostLoginSync().catch(() => {});\n }, [\n authConfig.lifecycle,\n authConfig.session,\n basePath,\n relayEnvironment,\n routerContext?.history,\n ]);\n\n const handleForgotPassword = useCallback(() => {\n routerContext?.history.push({\n pathname: getBackofficePasswordResetPath(basePath),\n });\n }, [basePath, routerContext?.history]);\n\n return (\n <LoginFlow\n auth={authState}\n oidcProviders={oidcProviders}\n onLoginSuccess={handleLoginSuccess}\n onForgotPassword={handleForgotPassword}\n />\n );\n};\n\nexport default BackofficeLoginPage;\n"],"mappings":";;;;;;;;;;;AAeA,IAAM,EAAE,mBAAA,MAAsB,GAMjB,KAAuB,EAClC,kBAC2C;CAC3C,IAAM,IAAgB,EAAW,EAAe,EAC1C,EAAE,MAAM,GAAY,gBAAa,GAAqB,EACtD,IAAO,GAA8B,EACrC,IAAY,GAAmB,EAC/B,IAAmB,GAAqB,EACxC,IAA6B,EAAO,GAAM;CAyDhD,OACE,kBAAC,GAAD;EACE,MAAM;EACS,eA1DN,EAAkB,EAAK,YAAY,EAAS,MAEtD,CAAyD,iBAC1D,EAAE;EAwDA,gBAtDuB,QAAwB;GAC7C,EAA2B,YAI/B,EAA2B,UAAU,KA8BrC,YA7BoD;IAClD,IAAI;KACF,IAAM,IAAc,MAAM,EAAW,QAAQ,MAAM;KACnD,IAAI,EAAY,mBAAmB,MAAM;MACvC,GAAe,QAAQ,KAAK,EAC1B,UAAU,GACX,CAAC;MACF;;KASF,IANA,MAAM,EAAW,WAAW,kBAAkB,EAM1C,CAAC,MAJoB,EACvB,GACA,EAAY,gBACb,EAEC;KAEF,GAAe,QAAQ,KAAK,EAC1B,UAAU,GACX,CAAC;YACI,WAEE;KACR,EAA2B,UAAU;;OAIvB,CAAC,YAAY,GAAG;KACjC;GACD,EAAW;GACX,EAAW;GACX;GACA;GACA,GAAe;GAChB,CAYmB;EAChB,kBAXyB,QAAkB;GAC7C,GAAe,QAAQ,KAAK,EAC1B,UAAU,EAA+B,EAAS,EACnD,CAAC;KACD,CAAC,GAAU,GAAe,QAAQ,CAOf;EAClB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficePasswordResetCompletePage-Cit5sdDm.js","names":[],"sources":["../../src/pages/BackofficePasswordResetCompletePage.tsx"],"sourcesContent":["import { useCallback, useContext, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { MutationParameters } from 'relay-runtime';\nimport { RoutingContext } from '@plumile/router';\n\nimport { PasswordResetCompleteScreen } from '../auth/pages/PasswordResetCompleteScreen.js';\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeAuthPasswordResetCompleteConfig } from '../provider/useBackofficeLazyValue.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\n\nconst { useMutation } = ReactRelay;\n\ntype CompletePasswordResetErrorReason =\n | 'INVALID_TOKEN'\n | 'TOKEN_EXPIRED'\n | 'PASSWORD_POLICY_VIOLATION'\n | 'INTERNAL_ERROR';\n\ntype CompletePasswordResetMutationPayload =\n MutationPayloadBase<CompletePasswordResetErrorReason> & {\n success?: boolean | null;\n };\n\nexport const BackofficePasswordResetCompletePage = (): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { basePath } = useBackofficeConfig();\n const auth = useBackofficeAuthPasswordResetCompleteConfig();\n const { t } = useBackofficeReactTranslation();\n type CompletePasswordResetMutation = MutationParameters & {\n response: {\n completePasswordReset?: CompletePasswordResetMutationPayload | null;\n };\n variables: { input: { newPassword: string; token: string } };\n };\n const [commitReset] = useMutation<CompletePasswordResetMutation>(\n auth.completePasswordResetMutation,\n );\n\n const handleBackToLogin = useCallback(() => {\n routerContext?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n }, [basePath, routerContext?.history]);\n\n const handleCompleteReset = useCallback(\n async (input: { newPassword: string; token: string }): Promise<boolean> => {\n const invalidMessage = t('auth.passwordResetComplete.errors.invalid');\n const defaultErrorMessage = invalidMessage;\n\n return new Promise((resolve, reject) => {\n commitReset({\n variables: {\n input,\n },\n onCompleted: (response) => {\n const outcome = resolveMutationOutcome(\n response.completePasswordReset ?? null,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n switch (reason) {\n case 'INVALID_TOKEN':\n return invalidMessage;\n case 'TOKEN_EXPIRED':\n return t('auth.passwordResetComplete.errors.expired');\n case 'PASSWORD_POLICY_VIOLATION':\n return t(\n 'auth.passwordResetComplete.errors.policyViolation',\n );\n case 'INTERNAL_ERROR':\n return invalidMessage;\n default:\n return null;\n }\n },\n },\n );\n if (!outcome.ok) {\n reject(new Error(outcome.message));\n return;\n }\n\n const successResult = requireField(\n outcome.payload.success ?? null,\n defaultErrorMessage,\n );\n if (!successResult.ok) {\n reject(new Error(successResult.message));\n return;\n }\n resolve(successResult.value);\n },\n onError: () => {\n reject(new Error(defaultErrorMessage));\n },\n });\n });\n },\n [commitReset, t],\n );\n\n return (\n <PasswordResetCompleteScreen\n onBackToLogin={handleBackToLogin}\n onCompletePasswordReset={handleCompleteReset}\n />\n );\n};\n\nexport default BackofficePasswordResetCompletePage;\n"],"mappings":";;;;;;;;;;AAgBA,IAAM,EAAE,mBAAgB,GAaX,UAAyD;CACpE,IAAM,IAAgB,EAAW,EAAe,EAC1C,EAAE,gBAAa,GAAqB,EACpC,IAAO,GAA8C,EACrD,EAAE,SAAM,GAA+B,EAOvC,CAAC,KAAe,EACpB,EAAK,8BACN;CA+DD,OACE,kBAAC,GAAD;EACE,eA/DsB,QAAkB;GAC1C,GAAe,QAAQ,KAAK,EAAE,UAAU,EAAuB,EAAS,EAAE,CAAC;KAC1E,CAAC,GAAU,GAAe,QAAQ,CA6DlB;EACf,yBA5DwB,EAC1B,OAAO,MAAoE;GACzE,IAAM,IAAiB,EAAE,4CAA4C,EAC/D,IAAsB;GAE5B,OAAO,IAAI,SAAS,GAAS,MAAW;IACtC,EAAY;KACV,WAAW,EACT,UACD;KACD,cAAc,MAAa;MACzB,IAAM,IAAU,EACd,EAAS,yBAAyB,MAClC;OACE;OACA,YAAY,MAAW;QACrB,QAAQ,GAAR;SACE,KAAK,iBACH,OAAO;SACT,KAAK,iBACH,OAAO,EAAE,4CAA4C;SACvD,KAAK,6BACH,OAAO,EACL,oDACD;SACH,KAAK,kBACH,OAAO;SACT,SACE,OAAO;;;OAGd,CACF;MACD,IAAI,CAAC,EAAQ,IAAI;OACf,EAAW,MAAM,EAAQ,QAAQ,CAAC;OAClC;;MAGF,IAAM,IAAgB,EACpB,EAAQ,QAAQ,WAAW,MAC3B,EACD;MACD,IAAI,CAAC,EAAc,IAAI;OACrB,EAAW,MAAM,EAAc,QAAQ,CAAC;OACxC;;MAEF,EAAQ,EAAc,MAAM;;KAE9B,eAAe;MACb,EAAW,MAAM,EAAoB,CAAC;;KAEzC,CAAC;KACF;KAEJ,CAAC,GAAa,EAAE,CAMW;EACzB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficePasswordResetRequestPage-B_TurHev.js","names":[],"sources":["../../src/pages/BackofficePasswordResetRequestPage.tsx"],"sourcesContent":["import { useCallback, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { MutationParameters } from 'relay-runtime';\n\nimport { PasswordResetRequestScreen } from '../auth/pages/PasswordResetRequestScreen.js';\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeAuthPasswordResetRequestConfig } from '../provider/useBackofficeLazyValue.js';\n\nconst { useMutation } = ReactRelay;\n\ntype StartPasswordResetErrorReason =\n | 'INVALID_EMAIL'\n | 'RATE_LIMITED'\n | 'INTERNAL_ERROR';\n\ntype StartPasswordResetMutationPayload =\n MutationPayloadBase<StartPasswordResetErrorReason> & {\n payload?: { success?: boolean | null } | null;\n };\n\nexport const BackofficePasswordResetRequestPage = (): JSX.Element => {\n const auth = useBackofficeAuthPasswordResetRequestConfig();\n const { t } = useBackofficeReactTranslation();\n type StartPasswordResetMutation = MutationParameters & {\n response: { startPasswordReset?: StartPasswordResetMutationPayload | null };\n variables: { input: { email: string; locale?: string } };\n };\n const [commitReset] = useMutation<StartPasswordResetMutation>(\n auth.startPasswordResetMutation,\n );\n\n const mapStartResetReason = useCallback(\n (reason: StartPasswordResetErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_EMAIL':\n return t('auth.passwordResetRequest.errors.invalidEmail');\n case 'RATE_LIMITED':\n return t('auth.passwordResetRequest.errors.rateLimited');\n case 'INTERNAL_ERROR':\n return t('auth.passwordResetRequest.errors.startFailed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const handleStartReset = useCallback(\n async (input: { email: string; locale?: string }): Promise<boolean> => {\n const defaultErrorMessage = t(\n 'auth.passwordResetRequest.errors.startFailed',\n );\n\n return new Promise((resolve, reject) => {\n commitReset({\n variables: {\n input,\n },\n onCompleted: (response) => {\n const outcome = resolveMutationOutcome(\n response.startPasswordReset ?? null,\n {\n defaultErrorMessage,\n mapReason: mapStartResetReason,\n },\n );\n if (!outcome.ok) {\n reject(new Error(outcome.message));\n return;\n }\n\n const successResult = requireField(\n outcome.payload.payload?.success ?? null,\n defaultErrorMessage,\n );\n if (!successResult.ok) {\n reject(new Error(successResult.message));\n return;\n }\n resolve(successResult.value);\n },\n onError: () => {\n reject(new Error(defaultErrorMessage));\n },\n });\n });\n },\n [commitReset, mapStartResetReason, t],\n );\n\n return <PasswordResetRequestScreen onStartPasswordReset={handleStartReset} />;\n};\n\nexport default BackofficePasswordResetRequestPage;\n"],"mappings":";;;;;;;;AAaA,IAAM,EAAE,mBAAgB,GAYX,UAAwD;CACnE,IAAM,IAAO,GAA6C,EACpD,EAAE,SAAM,GAA+B,EAKvC,CAAC,KAAe,EACpB,EAAK,2BACN,EAEK,IAAsB,GACzB,MAAyD;EACxD,QAAQ,GAAR;GACE,KAAK,iBACH,OAAO,EAAE,gDAAgD;GAC3D,KAAK,gBACH,OAAO,EAAE,+CAA+C;GAC1D,KAAK,kBACH,OAAO,EAAE,+CAA+C;GAC1D,SACE,OAAO;;IAGb,CAAC,EAAE,CACJ;CA6CD,OAAO,kBAAC,GAAD,EAA4B,sBA3CV,EACvB,OAAO,MAAgE;EACrE,IAAM,IAAsB,EAC1B,+CACD;EAED,OAAO,IAAI,SAAS,GAAS,MAAW;GACtC,EAAY;IACV,WAAW,EACT,UACD;IACD,cAAc,MAAa;KACzB,IAAM,IAAU,EACd,EAAS,sBAAsB,MAC/B;MACE;MACA,WAAW;MACZ,CACF;KACD,IAAI,CAAC,EAAQ,IAAI;MACf,EAAW,MAAM,EAAQ,QAAQ,CAAC;MAClC;;KAGF,IAAM,IAAgB,EACpB,EAAQ,QAAQ,SAAS,WAAW,MACpC,EACD;KACD,IAAI,CAAC,EAAc,IAAI;MACrB,EAAW,MAAM,EAAc,QAAQ,CAAC;MACxC;;KAEF,EAAQ,EAAc,MAAM;;IAE9B,eAAe;KACb,EAAW,MAAM,EAAoB,CAAC;;IAEzC,CAAC;IACF;IAEJ;EAAC;EAAa;EAAqB;EAAE,CAGkB,EAAoB,CAAA"}
@@ -1,83 +0,0 @@
1
- import { t as e } from "./useBackofficeReactTranslation-Btt58EIo.js";
2
- import { n as t } from "./BackofficeTopbarPortalContext-Da5XFatM.js";
3
- import { Link as n } from "@plumile/router";
4
- import { SidebarHomeSvg as r } from "@plumile/ui";
5
- import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
6
- import { createPortal as s } from "react-dom";
7
- //#region src/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.ts
8
- var c = (e, t) => Error(t == null ? `Invalid breadcrumb contract: ${e}` : `Invalid breadcrumb contract: ${e} (${t})`), l = (e) => {
9
- if (e == null) throw c("MISSING_BREADCRUMB");
10
- if (e.length === 0) throw c("EMPTY_BREADCRUMB");
11
- let t = /* @__PURE__ */ new Set();
12
- if (e.forEach((e, n) => {
13
- if (typeof e.id != "string" || e.id.trim() === "") throw c("INVALID_SEGMENT_ID", `index=${n}`);
14
- if (t.has(e.id)) throw c("INVALID_SEGMENT_ID", `duplicate id="${e.id}"`);
15
- t.add(e.id);
16
- }), e[e.length - 1]?.isCurrent !== !0) throw c("MISSING_CURRENT_SEGMENT");
17
- return e;
18
- }, u = ({ children: e }) => {
19
- let { target: n } = t();
20
- if (n == null) throw Error("Backoffice topbar target is missing. Ensure BackofficeLayoutPage provides a topbar breadcrumb mount target before rendering right-side pages.");
21
- return s(e, n);
22
- }, d = "txvbqb9jg txvbqbcp", f = "_80s44h0 txvbqb9jg txvbqbcp txvbqbao7", p = "txvbqb9jg txvbqbcp txvbqbao7", m = "txvbqbva1 txvbqb8y txvbqbfb7", h = "_80s44h4", g = "_80s44h5 txvbqbva1 txvbqb8y txvbqbfb7", _ = "txvbqbv9z txvbqb8y txvbqbfb7 txvbqbamp", v = ({ items: s }) => {
23
- let { t: c } = e(), { dashboardHref: l, dashboardLabel: u } = t(), v = !1, y = s[0];
24
- s.length === 1 && y != null && (v = y.id === "dashboard" && y.isCurrent === !0);
25
- let b = s;
26
- v && (b = []);
27
- let x = /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a(r, {
28
- width: 16,
29
- height: 16,
30
- "aria-hidden": "true"
31
- }), /* @__PURE__ */ a("span", {
32
- className: h,
33
- children: u
34
- })] });
35
- return /* @__PURE__ */ a("nav", {
36
- className: d,
37
- "aria-label": c("common.breadcrumb"),
38
- children: /* @__PURE__ */ o("ol", {
39
- className: f,
40
- children: [/* @__PURE__ */ o("li", {
41
- className: p,
42
- children: [v && /* @__PURE__ */ a("span", {
43
- className: "_80s44h3 _80s44h1 txvbqb9jg txvbqbcp txvbqbdoy txvbqbty7 txvbqbc77 txvbqb1rg txvbqbva1 txvbqb77 txvbqb6x txvbqb7k txvbqbv45 txvbqbv9z",
44
- "aria-current": "page",
45
- title: u,
46
- children: x
47
- }), !v && /* @__PURE__ */ a(n, {
48
- to: l,
49
- className: "_80s44h2 _80s44h1 txvbqb9jg txvbqbcp txvbqbdoy txvbqbty7 txvbqbc77 txvbqb1rg txvbqbva1 txvbqb77 txvbqb6x txvbqb7k",
50
- "aria-label": u,
51
- title: u,
52
- children: x
53
- })]
54
- }), b.map((e) => {
55
- let t = e.isCurrent === !0, r = e.id, i = e.to != null && !t, s;
56
- if (i) s = /* @__PURE__ */ a(n, {
57
- to: e.to,
58
- className: g,
59
- children: e.label
60
- });
61
- else {
62
- let n = g;
63
- t && (n = _), s = /* @__PURE__ */ a("span", {
64
- className: n,
65
- children: e.label
66
- });
67
- }
68
- return /* @__PURE__ */ o("li", {
69
- className: p,
70
- children: [/* @__PURE__ */ a("span", {
71
- className: m,
72
- "aria-hidden": "true",
73
- children: "/"
74
- }), s]
75
- }, r);
76
- })]
77
- })
78
- });
79
- }, y = ({ breadcrumb: e, children: t }) => /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(v, { items: l(e) }) }), /* @__PURE__ */ a(i, { children: t })] });
80
- //#endregion
81
- export { y as t };
82
-
83
- //# sourceMappingURL=BackofficeRightPageLayout-CfNkrMvH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeRightPageLayout-CfNkrMvH.js","names":[],"sources":["../../src/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.ts","../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarPortal.tsx","../../src/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.ts","../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.tsx","../../src/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.tsx"],"sourcesContent":["import type {\n BackofficeTopbarBreadcrumbItem,\n BreadcrumbContractErrorCode,\n} from './types.js';\n\nconst formatContractError = (\n code: BreadcrumbContractErrorCode,\n details?: string,\n): Error => {\n if (details == null) {\n return new Error(`Invalid breadcrumb contract: ${code}`);\n }\n return new Error(`Invalid breadcrumb contract: ${code} (${details})`);\n};\n\nexport const assertValidBreadcrumb = (\n items: readonly BackofficeTopbarBreadcrumbItem[] | null | undefined,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n if (items == null) {\n throw formatContractError('MISSING_BREADCRUMB');\n }\n if (items.length === 0) {\n throw formatContractError('EMPTY_BREADCRUMB');\n }\n\n const seen = new Set<string>();\n items.forEach((item, index) => {\n if (typeof item.id !== 'string' || item.id.trim() === '') {\n throw formatContractError('INVALID_SEGMENT_ID', `index=${index}`);\n }\n\n if (seen.has(item.id)) {\n throw formatContractError(\n 'INVALID_SEGMENT_ID',\n `duplicate id=\"${item.id}\"`,\n );\n }\n seen.add(item.id);\n });\n\n const last = items[items.length - 1];\n if (last?.isCurrent !== true) {\n throw formatContractError('MISSING_CURRENT_SEGMENT');\n }\n\n return items;\n};\n","import { type JSX, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { useBackofficeTopbarPortalContext } from './BackofficeTopbarPortalContext.js';\n\nexport type BackofficeTopbarPortalProps = {\n children: ReactNode;\n};\n\nexport const BackofficeTopbarPortal = ({\n children,\n}: BackofficeTopbarPortalProps): JSX.Element | null => {\n const { target } = useBackofficeTopbarPortalContext();\n if (target == null) {\n throw new Error(\n 'Backoffice topbar target is missing. Ensure BackofficeLayoutPage provides a topbar breadcrumb mount target before rendering right-side pages.',\n );\n }\n return createPortal(children, target);\n};\n\nexport default BackofficeTopbarPortal;\n","import { sprinkles, vars } from '@plumile/ui';\nimport { style } from '@vanilla-extract/css';\n\nconst INLINE_FLEX = 'inline-flex' as const;\n\nexport const nav = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n});\n\nexport const list = style([\n sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n gap: 2,\n }),\n {\n margin: 0,\n padding: 0,\n listStyle: 'none',\n },\n]);\n\nexport const item = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n gap: 2,\n});\n\nexport const separator = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'normal',\n});\n\nconst homeBase = style([\n sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n color: 'textSecondary',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n textDecoration: 'none',\n },\n]);\n\nexport const homeLink = style([\n homeBase,\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceMuted,\n color: vars.colors.text,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const homeCurrent = style([\n homeBase,\n sprinkles({\n backgroundColor: 'surfaceMuted',\n color: 'text',\n }),\n]);\n\nexport const homeLabel = style({\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: 0,\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: 0,\n});\n\nexport const link = style([\n sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'normal',\n }),\n {\n textDecoration: 'none',\n selectors: {\n '&:hover': {\n textDecoration: 'underline',\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const current = sprinkles({\n color: 'text',\n fontSize: 'sm',\n lineHeight: 'normal',\n fontWeight: 'semibold',\n});\n","import { type JSX } from 'react';\nimport { Link } from '@plumile/router';\nimport { SidebarHomeSvg } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../../i18n/useBackofficeReactTranslation.js';\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\nimport { useBackofficeTopbarPortalContext } from './BackofficeTopbarPortalContext.js';\nimport * as styles from './backofficeTopbarBreadcrumb.css.js';\n\nexport type BackofficeTopbarBreadcrumbProps = {\n items: readonly BackofficeTopbarBreadcrumbItem[];\n};\n\nexport const BackofficeTopbarBreadcrumb = ({\n items,\n}: BackofficeTopbarBreadcrumbProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const { dashboardHref, dashboardLabel } = useBackofficeTopbarPortalContext();\n let isDashboardCurrent = false;\n const firstItem = items[0];\n if (items.length === 1 && firstItem != null) {\n isDashboardCurrent =\n firstItem.id === 'dashboard' && firstItem.isCurrent === true;\n }\n let visibleItems: readonly BackofficeTopbarBreadcrumbItem[] = items;\n if (isDashboardCurrent) {\n visibleItems = [];\n }\n\n const homeContent = (\n <>\n <SidebarHomeSvg width={16} height={16} aria-hidden=\"true\" />\n <span className={styles.homeLabel}>{dashboardLabel}</span>\n </>\n );\n\n return (\n <nav className={styles.nav} aria-label={t('common.breadcrumb')}>\n <ol className={styles.list}>\n <li className={styles.item}>\n {isDashboardCurrent && (\n <span\n className={styles.homeCurrent}\n aria-current=\"page\"\n title={dashboardLabel}\n >\n {homeContent}\n </span>\n )}\n {!isDashboardCurrent && (\n <Link\n to={dashboardHref}\n className={styles.homeLink}\n aria-label={dashboardLabel}\n title={dashboardLabel}\n >\n {homeContent}\n </Link>\n )}\n </li>\n {visibleItems.map((item) => {\n const isCurrent = item.isCurrent === true;\n const key = item.id;\n const shouldRenderLink = item.to != null && !isCurrent;\n let content: JSX.Element;\n\n if (shouldRenderLink) {\n content = (\n <Link to={item.to} className={styles.link}>\n {item.label}\n </Link>\n );\n } else {\n let className = styles.link;\n if (isCurrent) {\n className = styles.current;\n }\n content = <span className={className}>{item.label}</span>;\n }\n\n return (\n <li key={key} className={styles.item}>\n <span className={styles.separator} aria-hidden=\"true\">\n /\n </span>\n {content}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n\nexport default BackofficeTopbarBreadcrumb;\n","import { type JSX, type ReactNode } from 'react';\n\nimport { assertValidBreadcrumb } from './assertValidBreadcrumb.js';\nimport { BackofficeTopbarPortal } from './BackofficeTopbarPortal.js';\nimport { BackofficeTopbarBreadcrumb } from './BackofficeTopbarBreadcrumb.js';\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nexport type BackofficeRightPageLayoutProps = {\n breadcrumb: readonly BackofficeTopbarBreadcrumbItem[];\n children: ReactNode;\n};\n\nexport const BackofficeRightPageLayout = ({\n breadcrumb,\n children,\n}: BackofficeRightPageLayoutProps): JSX.Element => {\n const items = assertValidBreadcrumb(breadcrumb);\n\n return (\n <>\n <BackofficeTopbarPortal>\n <BackofficeTopbarBreadcrumb items={items} />\n </BackofficeTopbarPortal>\n <>{children}</>\n </>\n );\n};\n\nexport default BackofficeRightPageLayout;\n"],"mappings":";;;;;;;AAKA,IAAM,KACJ,GACA,MAGa,MADT,KAAW,OACI,gCAAgC,MAElC,gCAAgC,EAAK,IAAI,EAAQ,GAFR,EAK/C,KACX,MAC8C;CAC9C,IAAI,KAAS,MACX,MAAM,EAAoB,qBAAqB;CAEjD,IAAI,EAAM,WAAW,GACnB,MAAM,EAAoB,mBAAmB;CAG/C,IAAM,oBAAO,IAAI,KAAa;CAgB9B,IAfA,EAAM,SAAS,GAAM,MAAU;EAC7B,IAAI,OAAO,EAAK,MAAO,YAAY,EAAK,GAAG,MAAM,KAAK,IACpD,MAAM,EAAoB,sBAAsB,SAAS,IAAQ;EAGnE,IAAI,EAAK,IAAI,EAAK,GAAG,EACnB,MAAM,EACJ,sBACA,iBAAiB,EAAK,GAAG,GAC1B;EAEH,EAAK,IAAI,EAAK,GAAG;GACjB,EAEW,EAAM,EAAM,SAAS,IACxB,cAAc,IACtB,MAAM,EAAoB,0BAA0B;CAGtD,OAAO;GCpCI,KAA0B,EACrC,kBACqD;CACrD,IAAM,EAAE,cAAW,GAAkC;CACrD,IAAI,KAAU,MACZ,MAAU,MACR,gJACD;CAEH,OAAO,EAAa,GAAU,EAAO;6PEL1B,KAA8B,EACzC,eACkD;CAClD,IAAM,EAAE,SAAM,GAA+B,EACvC,EAAE,kBAAe,sBAAmB,GAAkC,EACxE,IAAqB,IACnB,IAAY,EAAM;CACxB,AAAI,EAAM,WAAW,KAAK,KAAa,SACrC,IACE,EAAU,OAAO,eAAe,EAAU,cAAc;CAE5D,IAAI,IAA0D;CAC9D,AAAI,MACF,IAAe,EAAE;CAGnB,IAAM,IACJ,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAgB,OAAO;EAAI,QAAQ;EAAI,eAAY;EAAS,CAAA,EAC5D,kBAAC,QAAD;EAAM,WAAW;YAAmB;EAAsB,CAAA,CACzD,EAAA,CAAA;CAGL,OACE,kBAAC,OAAD;EAAK,WAAW;EAAY,cAAY,EAAE,oBAAoB;YAC5D,kBAAC,MAAD;GAAI,WAAW;aAAf,CACE,kBAAC,MAAD;IAAI,WAAW;cAAf,CACG,KACC,kBAAC,QAAD;KACE,WAAW;KACX,gBAAa;KACb,OAAO;eAEN;KACI,CAAA,EAER,CAAC,KACA,kBAAC,GAAD;KACE,IAAI;KACJ,WAAW;KACX,cAAY;KACZ,OAAO;eAEN;KACI,CAAA,CAEN;OACJ,EAAa,KAAK,MAAS;IAC1B,IAAM,IAAY,EAAK,cAAc,IAC/B,IAAM,EAAK,IACX,IAAmB,EAAK,MAAM,QAAQ,CAAC,GACzC;IAEJ,IAAI,GACF,IACE,kBAAC,GAAD;KAAM,IAAI,EAAK;KAAI,WAAW;eAC3B,EAAK;KACD,CAAA;SAEJ;KACL,IAAI,IAAY;KAIhB,AAHI,MACF,IAAY,IAEd,IAAU,kBAAC,QAAD;MAAiB;gBAAY,EAAK;MAAa,CAAA;;IAG3D,OACE,kBAAC,MAAD;KAAc,WAAW;eAAzB,CACE,kBAAC,QAAD;MAAM,WAAW;MAAkB,eAAY;gBAAO;MAE/C,CAAA,EACN,EACE;OALI,EAKJ;KAEP,CACC;;EACD,CAAA;GC9EG,KAA6B,EACxC,eACA,kBAKE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAmC,OAL3B,EAAsB,EAKK,EAAS,CAAA,EACrB,CAAA,EACzB,kBAAA,GAAA,EAAG,aAAY,CAAA,CACd,EAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeTopbarPortalContext-Da5XFatM.js","names":[],"sources":["../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type BackofficeTopbarPortalContextValue = {\n target: HTMLDivElement | null;\n dashboardHref: string;\n dashboardLabel: string;\n};\n\nconst BackofficeTopbarPortalContext =\n createContext<BackofficeTopbarPortalContextValue | null>(null);\n\nexport const BackofficeTopbarPortalContextProvider =\n BackofficeTopbarPortalContext.Provider;\n\nexport const useBackofficeTopbarPortalContext =\n (): BackofficeTopbarPortalContextValue => {\n const context = useContext(BackofficeTopbarPortalContext);\n if (context == null) {\n throw new Error(\n 'BackofficeTopbarPortalContext is missing. Ensure pages are rendered under BackofficeLayoutPage.',\n );\n }\n return context;\n };\n"],"mappings":";;AAQA,IAAM,IACJ,EAAyD,KAAK,EAEnD,IACX,EAA8B,UAEnB,UAC+B;CACxC,IAAM,IAAU,EAAW,EAA8B;CACzD,IAAI,KAAW,MACb,MAAU,MACR,kGACD;CAEH,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackofficeVerifyEmailPage-DQbFIob1.js","names":[],"sources":["../../src/pages/BackofficeVerifyEmailPage.tsx"],"sourcesContent":["import { useCallback, useContext, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { MutationParameters } from 'relay-runtime';\nimport { RoutingContext } from '@plumile/router';\n\nimport { VerifyEmailScreen } from '../auth/pages/VerifyEmailScreen.js';\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeAuthVerifyEmailConfig } from '../provider/useBackofficeLazyValue.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\n\nconst { useMutation } = ReactRelay;\n\ntype VerifyEmailErrorReason =\n | 'INVALID_TOKEN'\n | 'TOKEN_EXPIRED'\n | 'ALREADY_VERIFIED'\n | 'INTERNAL_ERROR';\n\ntype VerifyEmailMutationPayload =\n MutationPayloadBase<VerifyEmailErrorReason> & {\n success?: boolean | null;\n };\n\nexport const BackofficeVerifyEmailPage = (): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { basePath } = useBackofficeConfig();\n const auth = useBackofficeAuthVerifyEmailConfig();\n const { t } = useBackofficeReactTranslation();\n type VerifyEmailMutation = MutationParameters & {\n response: { verifyEmail?: VerifyEmailMutationPayload | null };\n variables: { input: { token: string } };\n };\n const [commitVerify] = useMutation<VerifyEmailMutation>(\n auth.verifyEmailMutation,\n );\n\n const handleBackToLogin = useCallback(() => {\n routerContext?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n }, [basePath, routerContext?.history]);\n\n const handleVerifyEmail = useCallback(\n async (input: { token: string }): Promise<boolean> => {\n const invalidMessage = t('auth.verifyEmail.errors.invalid');\n const defaultErrorMessage = invalidMessage;\n\n return new Promise((resolve, reject) => {\n commitVerify({\n variables: {\n input,\n },\n onCompleted: (response) => {\n const outcome = resolveMutationOutcome(\n response.verifyEmail ?? null,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n switch (reason) {\n case 'INVALID_TOKEN':\n return invalidMessage;\n case 'TOKEN_EXPIRED':\n return t('auth.verifyEmail.errors.expired');\n case 'ALREADY_VERIFIED':\n return t('auth.verifyEmail.errors.alreadyVerified');\n case 'INTERNAL_ERROR':\n return invalidMessage;\n default:\n return null;\n }\n },\n },\n );\n if (!outcome.ok) {\n reject(new Error(outcome.message));\n return;\n }\n\n const successResult = requireField(\n outcome.payload.success ?? null,\n defaultErrorMessage,\n );\n if (!successResult.ok) {\n reject(new Error(successResult.message));\n return;\n }\n resolve(successResult.value);\n },\n onError: () => {\n reject(new Error(defaultErrorMessage));\n },\n });\n });\n },\n [commitVerify, t],\n );\n\n return (\n <VerifyEmailScreen\n onBackToLogin={handleBackToLogin}\n onVerifyEmail={handleVerifyEmail}\n />\n );\n};\n\nexport default BackofficeVerifyEmailPage;\n"],"mappings":";;;;;;;;;;AAgBA,IAAM,EAAE,mBAAgB,GAaX,UAA+C;CAC1D,IAAM,IAAgB,EAAW,EAAe,EAC1C,EAAE,gBAAa,GAAqB,EACpC,IAAO,GAAoC,EAC3C,EAAE,SAAM,GAA+B,EAKvC,CAAC,KAAgB,EACrB,EAAK,oBACN;CA6DD,OACE,kBAAC,GAAD;EACE,eA7DsB,QAAkB;GAC1C,GAAe,QAAQ,KAAK,EAAE,UAAU,EAAuB,EAAS,EAAE,CAAC;KAC1E,CAAC,GAAU,GAAe,QAAQ,CA2DlB;EACf,eA1DsB,EACxB,OAAO,MAA+C;GACpD,IAAM,IAAiB,EAAE,kCAAkC,EACrD,IAAsB;GAE5B,OAAO,IAAI,SAAS,GAAS,MAAW;IACtC,EAAa;KACX,WAAW,EACT,UACD;KACD,cAAc,MAAa;MACzB,IAAM,IAAU,EACd,EAAS,eAAe,MACxB;OACE;OACA,YAAY,MAAW;QACrB,QAAQ,GAAR;SACE,KAAK,iBACH,OAAO;SACT,KAAK,iBACH,OAAO,EAAE,kCAAkC;SAC7C,KAAK,oBACH,OAAO,EAAE,0CAA0C;SACrD,KAAK,kBACH,OAAO;SACT,SACE,OAAO;;;OAGd,CACF;MACD,IAAI,CAAC,EAAQ,IAAI;OACf,EAAW,MAAM,EAAQ,QAAQ,CAAC;OAClC;;MAGF,IAAM,IAAgB,EACpB,EAAQ,QAAQ,WAAW,MAC3B,EACD;MACD,IAAI,CAAC,EAAc,IAAI;OACrB,EAAW,MAAM,EAAc,QAAQ,CAAC;OACxC;;MAEF,EAAQ,EAAc,MAAM;;KAE9B,eAAe;MACb,EAAW,MAAM,EAAoB,CAAC;;KAEzC,CAAC;KACF;KAEJ,CAAC,GAAc,EAAE,CAMA;EACf,CAAA"}