@plumile/backoffice-react 0.1.109 → 0.1.113

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 (308) hide show
  1. package/lib/esm/auth/AuthRefreshNotice.js +2 -2
  2. package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
  3. package/lib/esm/auth/authRefreshNotice.css.js +1 -0
  4. package/lib/esm/auth/authRefreshNotice.css.js.map +1 -1
  5. package/lib/esm/auth/login/EmailCapturePanel.js +12 -9
  6. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  7. package/lib/esm/auth/login/LoginFlow.js +10 -10
  8. package/lib/esm/auth/login/LoginFlow.js.map +1 -1
  9. package/lib/esm/auth/login/MethodChooser.js +14 -12
  10. package/lib/esm/auth/login/MethodChooser.js.map +1 -1
  11. package/lib/esm/auth/login/MfaChallengeForm.js +13 -10
  12. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  13. package/lib/esm/auth/login/OidcButtons.js +4 -4
  14. package/lib/esm/auth/login/OidcButtons.js.map +1 -1
  15. package/lib/esm/auth/login/PasskeyLoginForm.js +13 -10
  16. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  17. package/lib/esm/auth/login/PasswordLoginPanel.js +8 -8
  18. package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
  19. package/lib/esm/auth/login/loginPage.css.js.map +1 -1
  20. package/lib/esm/auth/pages/AcceptInvitationScreen.js +18 -14
  21. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  22. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +16 -12
  23. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  24. package/lib/esm/auth/pages/PasswordResetRequestScreen.js +15 -11
  25. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  26. package/lib/esm/auth/pages/VerifyEmailScreen.js +13 -11
  27. package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
  28. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +66 -54
  29. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  30. package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js +8 -8
  31. package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -1
  32. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js.map +1 -1
  33. package/lib/esm/components/backoffice/actions/toastViewAction.js.map +1 -1
  34. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +13 -12
  35. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  36. package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js +3 -3
  37. package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js.map +1 -1
  38. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js +8 -8
  39. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  40. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js +12 -11
  41. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
  42. package/lib/esm/components/backoffice/detail/BackofficeDetailField.js +8 -7
  43. package/lib/esm/components/backoffice/detail/BackofficeDetailField.js.map +1 -1
  44. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.css.js.map +1 -1
  45. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js +6 -6
  46. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +1 -1
  47. package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js +3 -3
  48. package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js.map +1 -1
  49. package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js +3 -3
  50. package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js.map +1 -1
  51. package/lib/esm/components/backoffice/detail/BackofficeDetailPayload.js +4 -4
  52. package/lib/esm/components/backoffice/detail/BackofficeDetailPayload.js.map +1 -1
  53. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js +1 -1
  54. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
  55. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +30 -29
  56. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  57. package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js +3 -3
  58. package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js.map +1 -1
  59. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js +5 -5
  60. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +1 -1
  61. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +21 -19
  62. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
  63. package/lib/esm/components/backoffice/detail/BackofficeKpiStrip.js +9 -6
  64. package/lib/esm/components/backoffice/detail/BackofficeKpiStrip.js.map +1 -1
  65. package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js +7 -7
  66. package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
  67. package/lib/esm/components/backoffice/detail/BackofficePayloadInspectorSection.js +8 -8
  68. package/lib/esm/components/backoffice/detail/BackofficePayloadInspectorSection.js.map +1 -1
  69. package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js +5 -5
  70. package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js.map +1 -1
  71. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  72. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
  73. package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js +4 -4
  74. package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js.map +1 -1
  75. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +1 -1
  76. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
  77. package/lib/esm/components/backoffice/detail/backofficeAuditMetadataPanel.css.js.map +1 -1
  78. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js.map +1 -1
  79. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js.map +1 -1
  80. package/lib/esm/components/backoffice/detail/backofficeDetailField.css.js.map +1 -1
  81. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js.map +1 -1
  82. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js.map +1 -1
  83. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js.map +1 -1
  84. package/lib/esm/components/backoffice/detail/backofficeDetailSection.css.js.map +1 -1
  85. package/lib/esm/components/backoffice/detail/backofficeDetailTaggedValue.css.js.map +1 -1
  86. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js.map +1 -1
  87. package/lib/esm/components/backoffice/detail/backofficeKpiStrip.css.js.map +1 -1
  88. package/lib/esm/components/backoffice/detail/backofficeLifecycleTimelineSection.css.js.map +1 -1
  89. package/lib/esm/components/backoffice/detail/backofficePayloadInspectorSection.css.js.map +1 -1
  90. package/lib/esm/components/backoffice/detail/backofficeReferenceValue.css.js.map +1 -1
  91. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js.map +1 -1
  92. package/lib/esm/components/backoffice/detail/backofficeScopeStack.css.js.map +1 -1
  93. package/lib/esm/components/backoffice/detail/backofficeStatusMetaBadge.css.js.map +1 -1
  94. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js.map +1 -1
  95. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +12 -12
  96. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
  97. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js +11 -9
  98. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
  99. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +18 -17
  100. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
  101. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js.map +1 -1
  102. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -1
  103. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js.map +1 -1
  104. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +25 -23
  105. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
  106. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js.map +1 -1
  107. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js.map +1 -1
  108. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +14 -14
  109. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  110. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js.map +1 -1
  111. package/lib/esm/components/backoffice/layout/buildSidebarSections.js +42 -37
  112. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  113. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
  114. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js +1 -1
  115. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
  116. package/lib/esm/components/backoffice/links/BackofficeLink.js +1 -1
  117. package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
  118. package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -1
  119. package/lib/esm/components/backoffice/lists/BackofficeListToolbar.js +1 -1
  120. package/lib/esm/components/backoffice/lists/BackofficeListToolbar.js.map +1 -1
  121. package/lib/esm/components/backoffice/lists/backofficeListToolbar.css.js.map +1 -1
  122. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js +1 -1
  123. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
  124. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js.map +1 -1
  125. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +31 -27
  126. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  127. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js.map +1 -1
  128. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js +6 -6
  129. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js.map +1 -1
  130. package/lib/esm/components/backoffice/pickers/shared/EntityPickerShell.js +4 -4
  131. package/lib/esm/components/backoffice/pickers/shared/EntityPickerShell.js.map +1 -1
  132. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +1 -1
  133. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  134. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js.map +1 -1
  135. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js.map +1 -1
  136. package/lib/esm/components/backoffice/routing/BackofficeContentError.js +6 -5
  137. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
  138. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js +10 -10
  139. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
  140. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js +10 -10
  141. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
  142. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js.map +1 -1
  143. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js.map +1 -1
  144. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js.map +1 -1
  145. package/lib/esm/components/backoffice/routing/backofficeRouteFallback.css.js.map +1 -1
  146. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js.map +1 -1
  147. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js +3 -3
  148. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js.map +1 -1
  149. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +191 -178
  150. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  151. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +6 -5
  152. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  153. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js.map +1 -1
  154. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js.map +1 -1
  155. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +10 -9
  156. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  157. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js +1 -1
  158. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
  159. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js.map +1 -1
  160. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js.map +1 -1
  161. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +11 -9
  162. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
  163. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +7 -7
  164. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
  165. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js +17 -12
  166. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
  167. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js +10 -10
  168. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
  169. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -1
  170. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js.map +1 -1
  171. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js.map +1 -1
  172. package/lib/esm/hooks/useBackofficeListUrlState.js +2 -1
  173. package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -1
  174. package/lib/esm/pages/BackofficeAcceptInvitationPage.js +1 -1
  175. package/lib/esm/pages/BackofficeAcceptInvitationPage.js.map +1 -1
  176. package/lib/esm/pages/BackofficeDashboardPage.js +72 -68
  177. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  178. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +1 -1
  179. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  180. package/lib/esm/pages/BackofficeEntityDetailPage.js +207 -184
  181. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  182. package/lib/esm/pages/BackofficeEntityDetailUnknownPageRedirect.js +1 -1
  183. package/lib/esm/pages/BackofficeEntityDetailUnknownPageRedirect.js.map +1 -1
  184. package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
  185. package/lib/esm/pages/BackofficeEntityListPage.js +143 -139
  186. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  187. package/lib/esm/pages/BackofficeHubPage.js +10 -9
  188. package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
  189. package/lib/esm/pages/BackofficeLayoutPage.js +44 -39
  190. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  191. package/lib/esm/pages/BackofficeLoginPage.js +1 -1
  192. package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
  193. package/lib/esm/pages/BackofficePasswordResetCompletePage.js +1 -1
  194. package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -1
  195. package/lib/esm/pages/BackofficeVerifyEmailPage.js +1 -1
  196. package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
  197. package/lib/esm/pages/backofficeDashboardPage.css.js.map +1 -1
  198. package/lib/esm/pages/backofficeEntityDetailPage.css.js.map +1 -1
  199. package/lib/esm/pages/backofficeEntityListPage.css.js.map +1 -1
  200. package/lib/esm/pages/dashboard/DashboardMetricGroup.js +10 -9
  201. package/lib/esm/pages/dashboard/DashboardMetricGroup.js.map +1 -1
  202. package/lib/esm/pages/dashboard/DashboardPanel.js +3 -3
  203. package/lib/esm/pages/dashboard/DashboardPanel.js.map +1 -1
  204. package/lib/esm/pages/dashboard/DashboardQuickActions.js +2 -2
  205. package/lib/esm/pages/dashboard/DashboardQuickActions.js.map +1 -1
  206. package/lib/esm/pages/dashboard/DashboardStatusList.js +1 -1
  207. package/lib/esm/pages/dashboard/DashboardStatusList.js.map +1 -1
  208. package/lib/esm/pages/dashboard/dashboardMetricGroup.css.js.map +1 -1
  209. package/lib/esm/pages/dashboard/dashboardPanel.css.js.map +1 -1
  210. package/lib/esm/pages/dashboard/dashboardQuickActions.css.js.map +1 -1
  211. package/lib/esm/pages/dashboard/dashboardStatusList.css.js.map +1 -1
  212. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  213. package/lib/esm/provider/BackofficeProvider.js +22 -20
  214. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  215. package/lib/esm/router/createBackofficeRoutes.js +33 -30
  216. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  217. package/lib/esm/storybook/relay/RelayStory.css.js.map +1 -1
  218. package/lib/types/auth/AuthFlows.stories.d.ts +19 -0
  219. package/lib/types/auth/AuthFlows.stories.d.ts.map +1 -0
  220. package/lib/types/auth/AuthRefreshNotice.d.ts +1 -1
  221. package/lib/types/auth/AuthRefreshNotice.d.ts.map +1 -1
  222. package/lib/types/auth/authRefreshNotice.css.d.ts.map +1 -1
  223. package/lib/types/auth/login/EmailCapturePanel.d.ts.map +1 -1
  224. package/lib/types/auth/login/MethodChooser.d.ts.map +1 -1
  225. package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
  226. package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
  227. package/lib/types/auth/login/PasswordLoginPanel.d.ts +1 -1
  228. package/lib/types/auth/login/PasswordLoginPanel.d.ts.map +1 -1
  229. package/lib/types/auth/login/loginPage.css.d.ts.map +1 -1
  230. package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
  231. package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
  232. package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
  233. package/lib/types/auth/pages/VerifyEmailScreen.d.ts.map +1 -1
  234. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  235. package/lib/types/components/backoffice/actions/toastViewAction.d.ts +1 -1
  236. package/lib/types/components/backoffice/actions/toastViewAction.d.ts.map +1 -1
  237. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +1 -1
  238. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  239. package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts +1 -1
  240. package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts.map +1 -1
  241. package/lib/types/components/backoffice/detail/BackofficeDetailErrorList.d.ts.map +1 -1
  242. package/lib/types/components/backoffice/detail/BackofficeDetailField.d.ts.map +1 -1
  243. package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts +1 -1
  244. package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts.map +1 -1
  245. package/lib/types/components/backoffice/detail/BackofficeDetailPrimitives.stories.d.ts +17 -0
  246. package/lib/types/components/backoffice/detail/BackofficeDetailPrimitives.stories.d.ts.map +1 -0
  247. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
  248. package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts +1 -1
  249. package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts.map +1 -1
  250. package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts.map +1 -1
  251. package/lib/types/components/backoffice/detail/BackofficeKpiStrip.d.ts.map +1 -1
  252. package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts.map +1 -1
  253. package/lib/types/components/backoffice/filters/DeferredFilterSearchInput.d.ts.map +1 -1
  254. package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts.map +1 -1
  255. package/lib/types/components/backoffice/filters/backofficeFilterAction.css.d.ts.map +1 -1
  256. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts.map +1 -1
  257. package/lib/types/components/backoffice/hub/BackofficeHubTemplate.d.ts.map +1 -1
  258. package/lib/types/components/backoffice/hub/BackofficeHubTemplate.stories.d.ts +48 -0
  259. package/lib/types/components/backoffice/hub/BackofficeHubTemplate.stories.d.ts.map +1 -0
  260. package/lib/types/components/backoffice/hub/backofficeHubTemplate.css.d.ts.map +1 -1
  261. package/lib/types/components/backoffice/layout/backofficeSidebarActions.css.d.ts.map +1 -1
  262. package/lib/types/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.d.ts.map +1 -1
  263. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +1 -1
  264. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
  265. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts +1 -1
  266. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts.map +1 -1
  267. package/lib/types/components/backoffice/lists/BackofficeListToolbar.stories.d.ts +13 -0
  268. package/lib/types/components/backoffice/lists/BackofficeListToolbar.stories.d.ts.map +1 -0
  269. package/lib/types/components/backoffice/overview/BackofficeOverviewLayout.stories.d.ts.map +1 -1
  270. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  271. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.stories.d.ts +11 -0
  272. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.stories.d.ts.map +1 -0
  273. package/lib/types/components/backoffice/pickers/entityIdPickerDialog.css.d.ts.map +1 -1
  274. package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts.map +1 -1
  275. package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts.map +1 -1
  276. package/lib/types/components/backoffice/routing/backofficeRoutePendingBar.css.d.ts.map +1 -1
  277. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +1 -1
  278. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  279. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts +1 -1
  280. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts.map +1 -1
  281. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.stories.d.ts.map +1 -1
  282. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts.map +1 -1
  283. package/lib/types/components/backoffice/shared/backofficeFilterableCell.css.d.ts.map +1 -1
  284. package/lib/types/components/backoffice/tools/BackofficeTools.stories.d.ts +17 -0
  285. package/lib/types/components/backoffice/tools/BackofficeTools.stories.d.ts.map +1 -0
  286. package/lib/types/components/backoffice/tools/BackofficeToolsDocPanel.d.ts.map +1 -1
  287. package/lib/types/components/backoffice/tools/BackofficeToolsJsonForm.d.ts.map +1 -1
  288. package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +1 -1
  289. package/lib/types/hooks/useBackofficeListUrlState.d.ts.map +1 -1
  290. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  291. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts +2 -1
  292. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
  293. package/lib/types/pages/BackofficeHubPage.d.ts.map +1 -1
  294. package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
  295. package/lib/types/pages/backofficeEntityDetailPage.css.d.ts.map +1 -1
  296. package/lib/types/pages/dashboard/DashboardMetricGroup.d.ts.map +1 -1
  297. package/lib/types/pages/dashboard/dashboardMetricGroup.css.d.ts.map +1 -1
  298. package/lib/types/pages/dashboard/dashboardPanel.css.d.ts.map +1 -1
  299. package/lib/types/pages/dashboard/dashboardQuickActions.css.d.ts.map +1 -1
  300. package/lib/types/pages/dashboard/dashboardStatusList.css.d.ts.map +1 -1
  301. package/lib/types/pages/detail/buildTabsItems.d.ts +1 -1
  302. package/lib/types/pages/detail/buildTabsItems.d.ts.map +1 -1
  303. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  304. package/lib/types/provider/types.d.ts +2 -1
  305. package/lib/types/provider/types.d.ts.map +1 -1
  306. package/lib/types/router/createBackofficeRoutes.d.ts +2 -1
  307. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  308. package/package.json +14 -10
@@ -1,7 +1,7 @@
1
1
  import { indicator as e, root as t, text as n } from "./authRefreshNotice.css.js";
2
2
  import { useSyncExternalStore as r } from "react";
3
- import { addAuthRefreshStateListener as i, getAuthRefreshState as a } from "@plumile/auth";
4
- import { cx as o } from "@plumile/ui";
3
+ import { addAuthRefreshStateListener as i, getAuthRefreshState as a } from "@plumile/auth/shortAccessToken.js";
4
+ import { cx as o } from "@plumile/ui/theme/tools.js";
5
5
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
6
6
  //#region src/auth/AuthRefreshNotice.tsx
7
7
  var l = (e) => i(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"AuthRefreshNotice.js","names":[],"sources":["../../../src/auth/AuthRefreshNotice.tsx"],"sourcesContent":["import { useSyncExternalStore, type JSX } from 'react';\n\nimport {\n addAuthRefreshStateListener,\n getAuthRefreshState,\n type AuthRefreshState,\n} from '@plumile/auth';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './authRefreshNotice.css.js';\n\nexport type AuthRefreshNoticeMessages = {\n temporarilyUnavailable: string;\n sessionExpired: string;\n};\n\nexport type AuthRefreshNoticeProps = {\n messages: AuthRefreshNoticeMessages;\n className?: string;\n};\n\nconst subscribe = (onStoreChange: () => void): (() => void) => {\n return addAuthRefreshStateListener(() => {\n onStoreChange();\n });\n};\n\nconst getSnapshot = (): AuthRefreshState => {\n return getAuthRefreshState();\n};\n\nexport const useAuthRefreshStateSnapshot = (): AuthRefreshState => {\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n};\n\nexport const AuthRefreshNotice = ({\n messages,\n className,\n}: AuthRefreshNoticeProps): JSX.Element | null => {\n const state = useAuthRefreshStateSnapshot();\n\n if (state.status === 'temporarily_unavailable') {\n return (\n <div\n className={cx(styles.root, className)}\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className={styles.indicator} aria-hidden=\"true\" />\n <p className={styles.text}>{messages.temporarilyUnavailable}</p>\n </div>\n );\n }\n\n if (state.status === 'session_expired') {\n return (\n <div\n className={cx(styles.root, className)}\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className={styles.indicator} aria-hidden=\"true\" />\n <p className={styles.text}>{messages.sessionExpired}</p>\n </div>\n );\n }\n\n return null;\n};\n\nexport default AuthRefreshNotice;\n"],"mappings":";;;;;;AAqBA,IAAM,KAAa,MACV,QAAkC;CACvC,GAAe;EACf,EAGE,UACG,GAAqB,EAGjB,UACJ,EAAqB,GAAW,GAAa,EAAY,EAGrD,KAAqB,EAChC,aACA,mBACgD;CAChD,IAAM,IAAQ,GAA6B;CA4B3C,OA1BI,EAAM,WAAW,4BAEjB,kBAAC,OAAD;EACE,WAAW,EAAG,GAAa,EAAU;EACrC,MAAK;EACL,aAAU;YAHZ,CAKE,kBAAC,QAAD;GAAM,WAAW;GAAkB,eAAY;GAAS,CAAA,EACxD,kBAAC,KAAD;GAAG,WAAW;aAAc,EAAS;GAA2B,CAAA,CAC5D;MAIN,EAAM,WAAW,oBAEjB,kBAAC,OAAD;EACE,WAAW,EAAG,GAAa,EAAU;EACrC,MAAK;EACL,aAAU;YAHZ,CAKE,kBAAC,QAAD;GAAM,WAAW;GAAkB,eAAY;GAAS,CAAA,EACxD,kBAAC,KAAD;GAAG,WAAW;aAAc,EAAS;GAAmB,CAAA,CACpD;MAIH"}
1
+ {"version":3,"file":"AuthRefreshNotice.js","names":[],"sources":["../../../src/auth/AuthRefreshNotice.tsx"],"sourcesContent":["import { useSyncExternalStore, type JSX } from 'react';\n\nimport { type AuthRefreshState } from '@plumile/auth/authRefreshState.js';\nimport {\n addAuthRefreshStateListener,\n getAuthRefreshState,\n} from '@plumile/auth/shortAccessToken.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport * as styles from './authRefreshNotice.css.js';\n\nexport type AuthRefreshNoticeMessages = {\n temporarilyUnavailable: string;\n sessionExpired: string;\n};\n\nexport type AuthRefreshNoticeProps = {\n messages: AuthRefreshNoticeMessages;\n className?: string;\n};\n\nconst subscribe = (onStoreChange: () => void): (() => void) => {\n return addAuthRefreshStateListener(() => {\n onStoreChange();\n });\n};\n\nconst getSnapshot = (): AuthRefreshState => {\n return getAuthRefreshState();\n};\n\nexport const useAuthRefreshStateSnapshot = (): AuthRefreshState => {\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n};\n\nexport const AuthRefreshNotice = ({\n messages,\n className,\n}: AuthRefreshNoticeProps): JSX.Element | null => {\n const state = useAuthRefreshStateSnapshot();\n\n if (state.status === 'temporarily_unavailable') {\n return (\n <div\n className={cx(styles.root, className)}\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className={styles.indicator} aria-hidden=\"true\" />\n <p className={styles.text}>{messages.temporarilyUnavailable}</p>\n </div>\n );\n }\n\n if (state.status === 'session_expired') {\n return (\n <div\n className={cx(styles.root, className)}\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className={styles.indicator} aria-hidden=\"true\" />\n <p className={styles.text}>{messages.sessionExpired}</p>\n </div>\n );\n }\n\n return null;\n};\n\nexport default AuthRefreshNotice;\n"],"mappings":";;;;;;AAqBA,IAAM,KAAa,MACV,QAAkC;CACvC,GAAe;EACf,EAGE,UACG,GAAqB,EAGjB,UACJ,EAAqB,GAAW,GAAa,EAAY,EAGrD,KAAqB,EAChC,aACA,mBACgD;CAChD,IAAM,IAAQ,GAA6B;CA4B3C,OA1BI,EAAM,WAAW,4BAEjB,kBAAC,OAAD;EACE,WAAW,EAAG,GAAa,EAAU;EACrC,MAAK;EACL,aAAU;YAHZ,CAKE,kBAAC,QAAD;GAAM,WAAW;GAAkB,eAAY;GAAS,CAAA,EACxD,kBAAC,KAAD;GAAG,WAAW;aAAc,EAAS;GAA2B,CAAA,CAC5D;MAIN,EAAM,WAAW,oBAEjB,kBAAC,OAAD;EACE,WAAW,EAAG,GAAa,EAAU;EACrC,MAAK;EACL,aAAU;YAHZ,CAKE,kBAAC,QAAD;GAAM,WAAW;GAAkB,eAAY;GAAS,CAAA,EACxD,kBAAC,KAAD;GAAG,WAAW;aAAc,EAAS;GAAmB,CAAA,CACpD;MAIH"}
@@ -1,3 +1,4 @@
1
+ /* empty css */
1
2
  /* empty css */
2
3
  //#region src/auth/authRefreshNotice.css.ts
3
4
  var e = "tc0xii0 txvbqbptp txvbqb9ip txvbqbcp txvbqbaog txvbqb8y txvbqbuwp", t = "tc0xii1", n = "txvbqbfcp";
@@ -1 +1 @@
1
- {"version":3,"file":"authRefreshNotice.css.js","names":[],"sources":["../../../src/auth/authRefreshNotice.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, vars } from '@plumile/ui';\n\nexport const root = style([\n sprinkles({\n position: 'fixed',\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n fontSize: 'sm',\n zIndex: 50,\n }),\n {\n left: '16px',\n right: '16px',\n bottom: '16px',\n maxWidth: '720px',\n margin: '0 auto',\n padding: '10px 14px',\n color: vars.colors.text,\n backgroundColor: vars.colors.white,\n border: `1px solid ${vars.colors.borderStrong}`,\n boxShadow: vars.boxShadow.lg,\n },\n]);\n\nexport const indicator = style({\n flex: '0 0 auto',\n width: '8px',\n height: '8px',\n borderRadius: '999px',\n backgroundColor: vars.colors.warning,\n});\n\nexport const text = sprinkles({\n margin: 0,\n});\n"],"mappings":""}
1
+ {"version":3,"file":"authRefreshNotice.css.js","names":[],"sources":["../../../src/auth/authRefreshNotice.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.js';\n\nexport const root = style([\n sprinkles({\n position: 'fixed',\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n fontSize: 'sm',\n zIndex: 50,\n }),\n {\n left: '16px',\n right: '16px',\n bottom: '16px',\n maxWidth: '720px',\n margin: '0 auto',\n padding: '10px 14px',\n color: vars.colors.text,\n backgroundColor: vars.colors.white,\n border: `1px solid ${vars.colors.borderStrong}`,\n boxShadow: vars.boxShadow.lg,\n },\n]);\n\nexport const indicator = style({\n flex: '0 0 auto',\n width: '8px',\n height: '8px',\n borderRadius: '999px',\n backgroundColor: vars.colors.warning,\n});\n\nexport const text = sprinkles({\n margin: 0,\n});\n"],"mappings":""}
@@ -2,24 +2,27 @@ import { actionsRow as e, formSurface as t, helper as n, inlineLink as r } from
2
2
  import { AuthPanel as i } from "./AuthPanel.js";
3
3
  import { useBackofficeReactTranslation as a } from "../../i18n/useBackofficeReactTranslation.js";
4
4
  import { useCallback as o } from "react";
5
- import { Button as s, Form as c, FormError as l, FormField as u } from "@plumile/ui";
6
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
5
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
6
+ import { Button as l } from "@plumile/ui/atomic/atoms/button/Button.js";
7
+ import { FormError as u } from "@plumile/ui/atomic/molecules/form_error/FormError.js";
8
+ import { FormField as d } from "@plumile/ui/atomic/molecules/form_field/FormField.js";
9
+ import { Form as f } from "@plumile/ui/atomic/molecules/form/Form.js";
7
10
  //#region src/auth/login/EmailCapturePanel.tsx
8
11
  var p = ({ email: p, errorMessage: m, isLoading: h, onEmailChange: g, onContinue: _, onForgotPassword: v }) => {
9
12
  let { t: y } = a();
10
- return /* @__PURE__ */ d(i, { children: /* @__PURE__ */ f(c, {
13
+ return /* @__PURE__ */ s(i, { children: /* @__PURE__ */ c(f, {
11
14
  className: t,
12
15
  onSubmit: o((e) => {
13
16
  e.preventDefault(), _();
14
17
  }, [_]),
15
18
  initialFocus: "first-form-control",
16
19
  children: [
17
- /* @__PURE__ */ d("p", {
20
+ /* @__PURE__ */ s("p", {
18
21
  className: n,
19
22
  children: y("auth.emailCapture.description")
20
23
  }),
21
- m != null && /* @__PURE__ */ d(l, { children: m }),
22
- /* @__PURE__ */ d(u, {
24
+ m != null && /* @__PURE__ */ s(u, { children: m }),
25
+ /* @__PURE__ */ s(d, {
23
26
  label: y("auth.emailCapture.emailLabel"),
24
27
  name: "email",
25
28
  type: "email",
@@ -31,14 +34,14 @@ var p = ({ email: p, errorMessage: m, isLoading: h, onEmailChange: g, onContinue
31
34
  autoComplete: "email",
32
35
  required: !0
33
36
  }),
34
- /* @__PURE__ */ f("div", {
37
+ /* @__PURE__ */ c("div", {
35
38
  className: e,
36
- children: [/* @__PURE__ */ d(s, {
39
+ children: [/* @__PURE__ */ s(l, {
37
40
  type: "submit",
38
41
  variant: "primary",
39
42
  isLoading: h,
40
43
  children: y("auth.emailCapture.continue")
41
- }), /* @__PURE__ */ d("button", {
44
+ }), /* @__PURE__ */ s("button", {
42
45
  type: "button",
43
46
  className: r,
44
47
  onClick: v,
@@ -1 +1 @@
1
- {"version":3,"file":"EmailCapturePanel.js","names":[],"sources":["../../../../src/auth/login/EmailCapturePanel.tsx"],"sourcesContent":["import { useCallback, type FormEvent, type JSX } from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button, Form, FormError, FormField } from '@plumile/ui';\n\nimport { AuthPanel } from './AuthPanel.js';\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n email: string;\n errorMessage: string | null;\n isLoading: boolean;\n onEmailChange: (value: string) => void;\n onContinue: () => void;\n onForgotPassword: () => void;\n};\n\nexport const EmailCapturePanel = ({\n email,\n errorMessage,\n isLoading,\n onEmailChange,\n onContinue,\n onForgotPassword,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n onContinue();\n },\n [onContinue],\n );\n\n return (\n <AuthPanel>\n <Form\n className={styles.formSurface}\n onSubmit={handleSubmit}\n initialFocus=\"first-form-control\"\n >\n <p className={styles.helper}>{t('auth.emailCapture.description')}</p>\n {errorMessage != null && <FormError>{errorMessage}</FormError>}\n <FormField\n label={t('auth.emailCapture.emailLabel')}\n name=\"email\"\n type=\"email\"\n value={email}\n onChange={(event) => {\n onEmailChange(event.target.value);\n }}\n placeholder={t('auth.emailCapture.emailPlaceholder')}\n autoComplete=\"email\"\n required\n />\n <div className={styles.actionsRow}>\n <Button type=\"submit\" variant=\"primary\" isLoading={isLoading}>\n {t('auth.emailCapture.continue')}\n </Button>\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onForgotPassword}\n >\n {t('auth.emailCapture.forgotPassword')}\n </button>\n </div>\n </Form>\n </AuthPanel>\n );\n};\n"],"mappings":";;;;;;;AAiBA,IAAa,KAAqB,EAChC,UACA,iBACA,cACA,kBACA,eACA,0BACwB;CACxB,IAAM,EAAE,SAAM,GAA+B;CAS7C,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,WAAW;EACX,UAZe,GAClB,MAAsC;GAErC,AADA,EAAM,gBAAgB,EACtB,GAAY;KAEd,CAAC,EAAW,CAOE;EACV,cAAa;YAHf;GAKE,kBAAC,KAAD;IAAG,WAAW;cAAgB,EAAE,gCAAgC;IAAK,CAAA;GACpE,KAAgB,QAAQ,kBAAC,GAAD,EAAA,UAAY,GAAyB,CAAA;GAC9D,kBAAC,GAAD;IACE,OAAO,EAAE,+BAA+B;IACxC,MAAK;IACL,MAAK;IACL,OAAO;IACP,WAAW,MAAU;KACnB,EAAc,EAAM,OAAO,MAAM;;IAEnC,aAAa,EAAE,qCAAqC;IACpD,cAAa;IACb,UAAA;IACA,CAAA;GACF,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAqB;eAChD,EAAE,6BAA6B;KACzB,CAAA,EACT,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,SAAS;eAER,EAAE,mCAAmC;KAC/B,CAAA,CACL;;GACD;KACG,CAAA"}
1
+ {"version":3,"file":"EmailCapturePanel.js","names":[],"sources":["../../../../src/auth/login/EmailCapturePanel.tsx"],"sourcesContent":["import { useCallback, type FormEvent, type JSX } from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { FormError } from '@plumile/ui/atomic/molecules/form_error/FormError.js';\nimport { FormField } from '@plumile/ui/atomic/molecules/form_field/FormField.js';\nimport { Form } from '@plumile/ui/atomic/molecules/form/Form.js';\n\nimport { AuthPanel } from './AuthPanel.js';\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n email: string;\n errorMessage: string | null;\n isLoading: boolean;\n onEmailChange: (value: string) => void;\n onContinue: () => void;\n onForgotPassword: () => void;\n};\n\nexport const EmailCapturePanel = ({\n email,\n errorMessage,\n isLoading,\n onEmailChange,\n onContinue,\n onForgotPassword,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n onContinue();\n },\n [onContinue],\n );\n\n return (\n <AuthPanel>\n <Form\n className={styles.formSurface}\n onSubmit={handleSubmit}\n initialFocus=\"first-form-control\"\n >\n <p className={styles.helper}>{t('auth.emailCapture.description')}</p>\n {errorMessage != null && <FormError>{errorMessage}</FormError>}\n <FormField\n label={t('auth.emailCapture.emailLabel')}\n name=\"email\"\n type=\"email\"\n value={email}\n onChange={(event) => {\n onEmailChange(event.target.value);\n }}\n placeholder={t('auth.emailCapture.emailPlaceholder')}\n autoComplete=\"email\"\n required\n />\n <div className={styles.actionsRow}>\n <Button type=\"submit\" variant=\"primary\" isLoading={isLoading}>\n {t('auth.emailCapture.continue')}\n </Button>\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onForgotPassword}\n >\n {t('auth.emailCapture.forgotPassword')}\n </button>\n </div>\n </Form>\n </AuthPanel>\n );\n};\n"],"mappings":";;;;;;;;;;AAoBA,IAAa,KAAqB,EAChC,UACA,iBACA,cACA,kBACA,eACA,0BACwB;CACxB,IAAM,EAAE,SAAM,GAA+B;CAS7C,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,WAAW;EACX,UAZe,GAClB,MAAsC;GAErC,AADA,EAAM,gBAAgB,EACtB,GAAY;KAEd,CAAC,EAAW,CAOE;EACV,cAAa;YAHf;GAKE,kBAAC,KAAD;IAAG,WAAW;cAAgB,EAAE,gCAAgC;IAAK,CAAA;GACpE,KAAgB,QAAQ,kBAAC,GAAD,EAAA,UAAY,GAAyB,CAAA;GAC9D,kBAAC,GAAD;IACE,OAAO,EAAE,+BAA+B;IACxC,MAAK;IACL,MAAK;IACL,OAAO;IACP,WAAW,MAAU;KACnB,EAAc,EAAM,OAAO,MAAM;;IAEnC,aAAa,EAAE,qCAAqC;IACpD,cAAa;IACb,UAAA;IACA,CAAA;GACF,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAqB;eAChD,EAAE,6BAA6B;KACzB,CAAA,EACT,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,SAAS;eAER,EAAE,mCAAmC;KAC/B,CAAA,CACL;;GACD;KACG,CAAA"}
@@ -6,8 +6,8 @@ import { PasskeyLoginForm as i } from "./PasskeyLoginForm.js";
6
6
  import { MethodChooser as a } from "./MethodChooser.js";
7
7
  import { PasswordLoginPanel as o } from "./PasswordLoginPanel.js";
8
8
  import { useCallback as s, useEffect as c, useMemo as l, useRef as u, useState as d } from "react";
9
- import { AuthLayout as f } from "@plumile/ui";
10
- import { jsx as p } from "react/jsx-runtime";
9
+ import { jsx as f } from "react/jsx-runtime";
10
+ import { AuthLayout as p } from "@plumile/ui/atomic/templates/auth_layout/AuthLayout.js";
11
11
  //#region src/auth/login/LoginFlow.tsx
12
12
  var m = ({ auth: m, oidcProviders: h, onLoginSuccess: g, onForgotPassword: _ }) => {
13
13
  let { t: v } = t(), [y, b] = d(""), [x, S] = d([]), [C, w] = d(null), [T, E] = d("email"), [D, O] = d(!1), [k, A] = d(null), j = u(!0), M = l(() => ({
@@ -59,7 +59,7 @@ var m = ({ auth: m, oidcProviders: h, onLoginSuccess: g, onForgotPassword: _ })
59
59
  T
60
60
  ]);
61
61
  let R;
62
- return R = P ? /* @__PURE__ */ p(e, { children: /* @__PURE__ */ p(r, {
62
+ return R = P ? /* @__PURE__ */ f(e, { children: /* @__PURE__ */ f(r, {
63
63
  auth: m,
64
64
  onSuccess: () => {
65
65
  N({ force: !0 });
@@ -67,10 +67,10 @@ var m = ({ auth: m, oidcProviders: h, onLoginSuccess: g, onForgotPassword: _ })
67
67
  onBack: () => {
68
68
  m.reset(), E("email");
69
69
  }
70
- }) }) : T === "passkey" ? /* @__PURE__ */ p(e, {
70
+ }) }) : T === "passkey" ? /* @__PURE__ */ f(e, {
71
71
  title: v("auth.loginFlow.passkey.title"),
72
72
  description: v("auth.loginFlow.passkey.description", { email: y }),
73
- children: /* @__PURE__ */ p(i, {
73
+ children: /* @__PURE__ */ f(i, {
74
74
  auth: M,
75
75
  onSuccess: N,
76
76
  onShowMethods: () => {
@@ -79,9 +79,9 @@ var m = ({ auth: m, oidcProviders: h, onLoginSuccess: g, onForgotPassword: _ })
79
79
  defaultEmail: y,
80
80
  isAttemptingPasskey: m.isLoading
81
81
  })
82
- }) : T === "methods" ? /* @__PURE__ */ p(e, {
82
+ }) : T === "methods" ? /* @__PURE__ */ f(e, {
83
83
  title: v("auth.loginFlow.methods.title"),
84
- children: /* @__PURE__ */ p(a, {
84
+ children: /* @__PURE__ */ f(a, {
85
85
  email: y,
86
86
  methods: x,
87
87
  lockedUntil: C,
@@ -96,13 +96,13 @@ var m = ({ auth: m, oidcProviders: h, onLoginSuccess: g, onForgotPassword: _ })
96
96
  E("email");
97
97
  }
98
98
  })
99
- }) : T === "password" ? /* @__PURE__ */ p(o, {
99
+ }) : T === "password" ? /* @__PURE__ */ f(o, {
100
100
  auth: M,
101
101
  defaultEmail: y,
102
102
  onForgotPassword: _,
103
103
  onSuccess: N,
104
104
  providers: h
105
- }) : /* @__PURE__ */ p(n, {
105
+ }) : /* @__PURE__ */ f(n, {
106
106
  email: y,
107
107
  errorMessage: k,
108
108
  isLoading: m.isLoading,
@@ -118,7 +118,7 @@ var m = ({ auth: m, oidcProviders: h, onLoginSuccess: g, onForgotPassword: _ })
118
118
  L(e).catch(() => {});
119
119
  },
120
120
  onForgotPassword: _
121
- }), /* @__PURE__ */ p(f, {
121
+ }), /* @__PURE__ */ f(p, {
122
122
  title: F,
123
123
  subtitle: I,
124
124
  children: R
@@ -1 +1 @@
1
- {"version":3,"file":"LoginFlow.js","names":[],"sources":["../../../../src/auth/login/LoginFlow.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n type JSX,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { AuthLayout } from '@plumile/ui';\n\nimport type {\n AuthMethod,\n OidcProviderKind,\n} from '../../modules/sharedSchemaTypes.js';\nimport type { UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport { MfaChallengeForm } from './MfaChallengeForm.js';\nimport { PasskeyLoginForm } from './PasskeyLoginForm.js';\nimport { MethodChooser } from './MethodChooser.js';\nimport AuthPanel from './AuthPanel.js';\nimport { EmailCapturePanel } from './EmailCapturePanel.js';\nimport { PasswordLoginPanel } from './PasswordLoginPanel.js';\n\nexport type LoginFlowProps = {\n auth: UseAuthReturn;\n oidcProviders: readonly OidcProviderKind[];\n onLoginSuccess: () => void;\n onForgotPassword: () => void;\n};\n\ntype View = 'email' | 'passkey' | 'methods' | 'password' | 'mfa';\n\nexport const LoginFlow = ({\n auth,\n oidcProviders,\n onLoginSuccess,\n onForgotPassword,\n}: LoginFlowProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [email, setEmail] = useState('');\n const [methods, setMethods] = useState<readonly AuthMethod[]>([]);\n const [lockedUntil, setLockedUntil] = useState<string | null>(null);\n const [view, setView] = useState<View>('email');\n const [hasTriedPasskey, setHasTriedPasskey] = useState(false);\n const [localError, setLocalError] = useState<string | null>(null);\n const passkeyAttemptActive = useRef(true);\n\n const loginAdapter = useMemo(() => {\n return {\n ...auth,\n beginAuthentication: async (inputEmail: string) => {\n const result = await auth.beginAuthentication(inputEmail);\n setEmail(inputEmail);\n setMethods(result.methods);\n setLockedUntil(result.lockedUntil);\n return result;\n },\n };\n }, [auth]);\n\n const handleLoginSuccess = useCallback(\n ({ force } = { force: false }) => {\n if (!force && auth.nextStep === 'TOTP') {\n return;\n }\n onLoginSuccess();\n },\n [auth.nextStep, onLoginSuccess],\n );\n\n const isMfaStep = auth.nextStep === 'TOTP' || view === 'mfa';\n const title = isMfaStep\n ? t('auth.loginFlow.title.mfa')\n : t('auth.loginFlow.title.default');\n const subtitle = isMfaStep\n ? t('auth.loginFlow.subtitle.mfa')\n : t('auth.loginFlow.subtitle.default');\n\n const startFlowForEmail = useCallback(\n async (inputEmail: string) => {\n setLocalError(null);\n try {\n const trimmed = inputEmail.trim();\n const result = await auth.beginAuthentication(trimmed);\n setEmail(trimmed);\n setMethods(result.methods);\n setLockedUntil(result.lockedUntil);\n const hasPasskey = result.methods.some((method) => {\n return method === 'PASSKEY';\n });\n\n if (hasPasskey) {\n setView('passkey');\n } else if (result.methods.includes('PASSWORD')) {\n setView('password');\n } else {\n setView('methods');\n }\n } catch {\n setLocalError(t('auth.loginFlow.errors.tryAgain'));\n }\n },\n [auth, t],\n );\n\n useEffect(() => {\n passkeyAttemptActive.current = true;\n const trimmedEmail = email.trim();\n const shouldAttempt =\n view === 'passkey' && !hasTriedPasskey && trimmedEmail !== '';\n\n if (shouldAttempt) {\n setHasTriedPasskey(true);\n const runPasskeyLogin = async () => {\n try {\n const status = await loginAdapter.loginWithPasskey({\n email: trimmedEmail,\n });\n\n if (!passkeyAttemptActive.current) {\n return;\n }\n\n if (status === 'success') {\n handleLoginSuccess();\n return;\n }\n\n if (status === 'mfa-required') {\n setView('mfa');\n return;\n }\n\n setView('methods');\n setLocalError(t('auth.loginFlow.errors.passkeyUnavailable'));\n } catch {\n if (!passkeyAttemptActive.current) {\n return;\n }\n\n setLocalError(t('auth.loginFlow.errors.passkeyUnavailable'));\n setView('methods');\n }\n };\n runPasskeyLogin().catch(() => {\n // Errors are handled inside runPasskeyLogin; ignore any unexpected rethrow.\n });\n }\n\n return () => {\n passkeyAttemptActive.current = false;\n };\n }, [email, handleLoginSuccess, hasTriedPasskey, loginAdapter, t, view]);\n\n let content: JSX.Element;\n\n if (isMfaStep) {\n content = (\n <AuthPanel>\n <MfaChallengeForm\n auth={auth}\n onSuccess={() => {\n handleLoginSuccess({ force: true });\n }}\n onBack={() => {\n auth.reset();\n setView('email');\n }}\n />\n </AuthPanel>\n );\n } else if (view === 'passkey') {\n content = (\n <AuthPanel\n title={t('auth.loginFlow.passkey.title')}\n description={t('auth.loginFlow.passkey.description', { email })}\n >\n <PasskeyLoginForm\n auth={loginAdapter}\n onSuccess={handleLoginSuccess}\n onShowMethods={() => {\n setView('methods');\n }}\n defaultEmail={email}\n isAttemptingPasskey={auth.isLoading}\n />\n </AuthPanel>\n );\n } else if (view === 'methods') {\n content = (\n <AuthPanel title={t('auth.loginFlow.methods.title')}>\n <MethodChooser\n email={email}\n methods={methods}\n lockedUntil={lockedUntil}\n onSelect={(method) => {\n if (method === 'PASSKEY') {\n setView('passkey');\n return;\n }\n if (method === 'PASSWORD') {\n setView('password');\n }\n }}\n onBack={() => {\n setView('email');\n }}\n />\n </AuthPanel>\n );\n } else if (view === 'password') {\n content = (\n <PasswordLoginPanel\n auth={loginAdapter}\n defaultEmail={email}\n onForgotPassword={onForgotPassword}\n onSuccess={handleLoginSuccess}\n providers={oidcProviders}\n />\n );\n } else {\n // email capture only\n content = (\n <EmailCapturePanel\n email={email}\n errorMessage={localError}\n isLoading={auth.isLoading}\n onEmailChange={(value) => {\n setEmail(value);\n setLocalError(null);\n }}\n onContinue={() => {\n const trimmed = email.trim();\n if (trimmed === '') {\n setLocalError(t('auth.loginFlow.errors.emailRequired'));\n return;\n }\n startFlowForEmail(trimmed).catch(() => {\n // startFlowForEmail handles its own errors.\n });\n }}\n onForgotPassword={onForgotPassword}\n />\n );\n }\n\n return (\n <AuthLayout title={title} subtitle={subtitle}>\n {content}\n </AuthLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"LoginFlow.js","names":[],"sources":["../../../../src/auth/login/LoginFlow.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n type JSX,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { AuthLayout } from '@plumile/ui/atomic/templates/auth_layout/AuthLayout.js';\n\nimport type {\n AuthMethod,\n OidcProviderKind,\n} from '../../modules/sharedSchemaTypes.js';\nimport type { UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport { MfaChallengeForm } from './MfaChallengeForm.js';\nimport { PasskeyLoginForm } from './PasskeyLoginForm.js';\nimport { MethodChooser } from './MethodChooser.js';\nimport AuthPanel from './AuthPanel.js';\nimport { EmailCapturePanel } from './EmailCapturePanel.js';\nimport { PasswordLoginPanel } from './PasswordLoginPanel.js';\n\nexport type LoginFlowProps = {\n auth: UseAuthReturn;\n oidcProviders: readonly OidcProviderKind[];\n onLoginSuccess: () => void;\n onForgotPassword: () => void;\n};\n\ntype View = 'email' | 'passkey' | 'methods' | 'password' | 'mfa';\n\nexport const LoginFlow = ({\n auth,\n oidcProviders,\n onLoginSuccess,\n onForgotPassword,\n}: LoginFlowProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [email, setEmail] = useState('');\n const [methods, setMethods] = useState<readonly AuthMethod[]>([]);\n const [lockedUntil, setLockedUntil] = useState<string | null>(null);\n const [view, setView] = useState<View>('email');\n const [hasTriedPasskey, setHasTriedPasskey] = useState(false);\n const [localError, setLocalError] = useState<string | null>(null);\n const passkeyAttemptActive = useRef(true);\n\n const loginAdapter = useMemo(() => {\n return {\n ...auth,\n beginAuthentication: async (inputEmail: string) => {\n const result = await auth.beginAuthentication(inputEmail);\n setEmail(inputEmail);\n setMethods(result.methods);\n setLockedUntil(result.lockedUntil);\n return result;\n },\n };\n }, [auth]);\n\n const handleLoginSuccess = useCallback(\n ({ force } = { force: false }) => {\n if (!force && auth.nextStep === 'TOTP') {\n return;\n }\n onLoginSuccess();\n },\n [auth.nextStep, onLoginSuccess],\n );\n\n const isMfaStep = auth.nextStep === 'TOTP' || view === 'mfa';\n const title = isMfaStep\n ? t('auth.loginFlow.title.mfa')\n : t('auth.loginFlow.title.default');\n const subtitle = isMfaStep\n ? t('auth.loginFlow.subtitle.mfa')\n : t('auth.loginFlow.subtitle.default');\n\n const startFlowForEmail = useCallback(\n async (inputEmail: string) => {\n setLocalError(null);\n try {\n const trimmed = inputEmail.trim();\n const result = await auth.beginAuthentication(trimmed);\n setEmail(trimmed);\n setMethods(result.methods);\n setLockedUntil(result.lockedUntil);\n const hasPasskey = result.methods.some((method) => {\n return method === 'PASSKEY';\n });\n\n if (hasPasskey) {\n setView('passkey');\n } else if (result.methods.includes('PASSWORD')) {\n setView('password');\n } else {\n setView('methods');\n }\n } catch {\n setLocalError(t('auth.loginFlow.errors.tryAgain'));\n }\n },\n [auth, t],\n );\n\n useEffect(() => {\n passkeyAttemptActive.current = true;\n const trimmedEmail = email.trim();\n const shouldAttempt =\n view === 'passkey' && !hasTriedPasskey && trimmedEmail !== '';\n\n if (shouldAttempt) {\n setHasTriedPasskey(true);\n const runPasskeyLogin = async () => {\n try {\n const status = await loginAdapter.loginWithPasskey({\n email: trimmedEmail,\n });\n\n if (!passkeyAttemptActive.current) {\n return;\n }\n\n if (status === 'success') {\n handleLoginSuccess();\n return;\n }\n\n if (status === 'mfa-required') {\n setView('mfa');\n return;\n }\n\n setView('methods');\n setLocalError(t('auth.loginFlow.errors.passkeyUnavailable'));\n } catch {\n if (!passkeyAttemptActive.current) {\n return;\n }\n\n setLocalError(t('auth.loginFlow.errors.passkeyUnavailable'));\n setView('methods');\n }\n };\n runPasskeyLogin().catch(() => {\n // Errors are handled inside runPasskeyLogin; ignore any unexpected rethrow.\n });\n }\n\n return () => {\n passkeyAttemptActive.current = false;\n };\n }, [email, handleLoginSuccess, hasTriedPasskey, loginAdapter, t, view]);\n\n let content: JSX.Element;\n\n if (isMfaStep) {\n content = (\n <AuthPanel>\n <MfaChallengeForm\n auth={auth}\n onSuccess={() => {\n handleLoginSuccess({ force: true });\n }}\n onBack={() => {\n auth.reset();\n setView('email');\n }}\n />\n </AuthPanel>\n );\n } else if (view === 'passkey') {\n content = (\n <AuthPanel\n title={t('auth.loginFlow.passkey.title')}\n description={t('auth.loginFlow.passkey.description', { email })}\n >\n <PasskeyLoginForm\n auth={loginAdapter}\n onSuccess={handleLoginSuccess}\n onShowMethods={() => {\n setView('methods');\n }}\n defaultEmail={email}\n isAttemptingPasskey={auth.isLoading}\n />\n </AuthPanel>\n );\n } else if (view === 'methods') {\n content = (\n <AuthPanel title={t('auth.loginFlow.methods.title')}>\n <MethodChooser\n email={email}\n methods={methods}\n lockedUntil={lockedUntil}\n onSelect={(method) => {\n if (method === 'PASSKEY') {\n setView('passkey');\n return;\n }\n if (method === 'PASSWORD') {\n setView('password');\n }\n }}\n onBack={() => {\n setView('email');\n }}\n />\n </AuthPanel>\n );\n } else if (view === 'password') {\n content = (\n <PasswordLoginPanel\n auth={loginAdapter}\n defaultEmail={email}\n onForgotPassword={onForgotPassword}\n onSuccess={handleLoginSuccess}\n providers={oidcProviders}\n />\n );\n } else {\n // email capture only\n content = (\n <EmailCapturePanel\n email={email}\n errorMessage={localError}\n isLoading={auth.isLoading}\n onEmailChange={(value) => {\n setEmail(value);\n setLocalError(null);\n }}\n onContinue={() => {\n const trimmed = email.trim();\n if (trimmed === '') {\n setLocalError(t('auth.loginFlow.errors.emailRequired'));\n return;\n }\n startFlowForEmail(trimmed).catch(() => {\n // startFlowForEmail handles its own errors.\n });\n }}\n onForgotPassword={onForgotPassword}\n />\n );\n }\n\n return (\n <AuthLayout title={title} subtitle={subtitle}>\n {content}\n </AuthLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;AAmCA,IAAa,KAAa,EACxB,SACA,kBACA,mBACA,0BACiC;CACjC,IAAM,EAAE,SAAM,GAA+B,EACvC,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAS,KAAc,EAAgC,EAAE,CAAC,EAC3D,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAC7D,CAAC,GAAM,KAAW,EAAe,QAAQ,EACzC,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAY,KAAiB,EAAwB,KAAK,EAC3D,IAAuB,EAAO,GAAK,EAEnC,IAAe,SACZ;EACL,GAAG;EACH,qBAAqB,OAAO,MAAuB;GACjD,IAAM,IAAS,MAAM,EAAK,oBAAoB,EAAW;GAIzD,OAHA,EAAS,EAAW,EACpB,EAAW,EAAO,QAAQ,EAC1B,EAAe,EAAO,YAAY,EAC3B;;EAEV,GACA,CAAC,EAAK,CAAC,EAEJ,IAAqB,GACxB,EAAE,aAAU,EAAE,OAAO,IAAO,KAAK;EAC5B,CAAC,KAAS,EAAK,aAAa,UAGhC,GAAgB;IAElB,CAAC,EAAK,UAAU,EAAe,CAChC,EAEK,IAAY,EAAK,aAAa,UAAU,MAAS,OACjD,IACF,EADU,IACR,6BACA,+BAA+B,EAC/B,IACF,EADa,IACX,gCACA,kCAAkC,EAElC,IAAoB,EACxB,OAAO,MAAuB;EAC5B,EAAc,KAAK;EACnB,IAAI;GACF,IAAM,IAAU,EAAW,MAAM,EAC3B,IAAS,MAAM,EAAK,oBAAoB,EAAQ;GAQtD,AAPA,EAAS,EAAQ,EACjB,EAAW,EAAO,QAAQ,EAC1B,EAAe,EAAO,YAAY,EACf,EAAO,QAAQ,MAAM,MAC/B,MAAW,UAGhB,GACF,EAAQ,UAAU,GACT,EAAO,QAAQ,SAAS,WAAW,GAC5C,EAAQ,WAAW,GAEnB,EAAQ,UAAU;UAEd;GACN,EAAc,EAAE,iCAAiC,CAAC;;IAGtD,CAAC,GAAM,EAAE,CACV;CAED,QAAgB;EACd,EAAqB,UAAU;EAC/B,IAAM,IAAe,EAAM,MAAM;EA0CjC,OAxCE,MAAS,aAAa,CAAC,KAAmB,MAAiB,OAG3D,EAAmB,GAAK,GAgCxB,YA/BoC;GAClC,IAAI;IACF,IAAM,IAAS,MAAM,EAAa,iBAAiB,EACjD,OAAO,GACR,CAAC;IAEF,IAAI,CAAC,EAAqB,SACxB;IAGF,IAAI,MAAW,WAAW;KACxB,GAAoB;KACpB;;IAGF,IAAI,MAAW,gBAAgB;KAC7B,EAAQ,MAAM;KACd;;IAIF,AADA,EAAQ,UAAU,EAClB,EAAc,EAAE,2CAA2C,CAAC;WACtD;IACN,IAAI,CAAC,EAAqB,SACxB;IAIF,AADA,EAAc,EAAE,2CAA2C,CAAC,EAC5D,EAAQ,UAAU;;MAGL,CAAC,YAAY,GAE5B,SAGS;GACX,EAAqB,UAAU;;IAEhC;EAAC;EAAO;EAAoB;EAAiB;EAAc;EAAG;EAAK,CAAC;CAEvE,IAAI;CA4FJ,OA1FA,AAkEE,IAlEE,IAEA,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACQ;EACN,iBAAiB;GACf,EAAmB,EAAE,OAAO,IAAM,CAAC;;EAErC,cAAc;GAEZ,AADA,EAAK,OAAO,EACZ,EAAQ,QAAQ;;EAElB,CAAA,EACQ,CAAA,GAEL,MAAS,YAEhB,kBAAC,GAAD;EACE,OAAO,EAAE,+BAA+B;EACxC,aAAa,EAAE,sCAAsC,EAAE,UAAO,CAAC;YAE/D,kBAAC,GAAD;GACE,MAAM;GACN,WAAW;GACX,qBAAqB;IACnB,EAAQ,UAAU;;GAEpB,cAAc;GACd,qBAAqB,EAAK;GAC1B,CAAA;EACQ,CAAA,GAEL,MAAS,YAEhB,kBAAC,GAAD;EAAW,OAAO,EAAE,+BAA+B;YACjD,kBAAC,GAAD;GACS;GACE;GACI;GACb,WAAW,MAAW;IACpB,IAAI,MAAW,WAAW;KACxB,EAAQ,UAAU;KAClB;;IAEF,AAAI,MAAW,cACb,EAAQ,WAAW;;GAGvB,cAAc;IACZ,EAAQ,QAAQ;;GAElB,CAAA;EACQ,CAAA,GAEL,MAAS,aAEhB,kBAAC,GAAD;EACE,MAAM;EACN,cAAc;EACI;EAClB,WAAW;EACX,WAAW;EACX,CAAA,GAKF,kBAAC,GAAD;EACS;EACP,cAAc;EACd,WAAW,EAAK;EAChB,gBAAgB,MAAU;GAExB,AADA,EAAS,EAAM,EACf,EAAc,KAAK;;EAErB,kBAAkB;GAChB,IAAM,IAAU,EAAM,MAAM;GAC5B,IAAI,MAAY,IAAI;IAClB,EAAc,EAAE,sCAAsC,CAAC;IACvD;;GAEF,EAAkB,EAAQ,CAAC,YAAY,GAErC;;EAEc;EAClB,CAAA,EAKJ,kBAAC,GAAD;EAAmB;EAAiB;YACjC;EACU,CAAA"}
@@ -1,38 +1,40 @@
1
1
  import { brandGhostButton as e, formSurface as t, fullWidth as n, helper as r, inlineLink as i, stack as a } from "./loginPage.css.js";
2
2
  import { useBackofficeReactTranslation as o } from "../../i18n/useBackofficeReactTranslation.js";
3
- import { Button as s, FormError as c, cx as l } from "@plumile/ui";
4
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
- import { Trans as f } from "react-i18next";
3
+ import { cx as s } from "@plumile/ui/theme/tools.js";
4
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
+ import { Trans as u } from "react-i18next";
6
+ import { Button as d } from "@plumile/ui/atomic/atoms/button/Button.js";
7
+ import { FormError as f } from "@plumile/ui/atomic/molecules/form_error/FormError.js";
6
8
  //#region src/auth/login/MethodChooser.tsx
7
9
  var p = ({ email: p, methods: m, lockedUntil: h, onSelect: g, onBack: _ }) => {
8
10
  let { t: v } = o(), y = m.length === 0, b = h == null ? v("auth.methodChooser.locked") : v("auth.methodChooser.lockedWithTime", { time: new Date(h).toLocaleString() }), x = m.map((t) => {
9
11
  let r = t === "PASSKEY" ? v("auth.methodChooser.methods.passkey") : t === "PASSWORD" ? v("auth.methodChooser.methods.password") : v("auth.methodChooser.methods.other", { method: t.toLowerCase() });
10
- return /* @__PURE__ */ u(s, {
12
+ return /* @__PURE__ */ c(d, {
11
13
  type: "button",
12
14
  variant: "secondary",
13
15
  onClick: () => {
14
16
  g(t);
15
17
  },
16
- className: l(n, e),
18
+ className: s(n, e),
17
19
  children: r
18
20
  }, t);
19
21
  });
20
- return /* @__PURE__ */ u("div", {
22
+ return /* @__PURE__ */ c("div", {
21
23
  className: t,
22
- children: /* @__PURE__ */ d("div", {
24
+ children: /* @__PURE__ */ l("div", {
23
25
  className: a,
24
26
  children: [
25
- /* @__PURE__ */ u("p", {
27
+ /* @__PURE__ */ c("p", {
26
28
  className: r,
27
- children: /* @__PURE__ */ u(f, {
29
+ children: /* @__PURE__ */ c(u, {
28
30
  i18nKey: "auth.methodChooser.prompt",
29
31
  values: { email: p },
30
- components: { strong: /* @__PURE__ */ u("strong", {}) }
32
+ components: { strong: /* @__PURE__ */ c("strong", {}) }
31
33
  })
32
34
  }),
33
- y ? /* @__PURE__ */ u(c, { children: b }) : null,
35
+ y ? /* @__PURE__ */ c(f, { children: b }) : null,
34
36
  y ? null : x,
35
- /* @__PURE__ */ u(s, {
37
+ /* @__PURE__ */ c(d, {
36
38
  type: "button",
37
39
  variant: "text",
38
40
  onClick: _,
@@ -1 +1 @@
1
- {"version":3,"file":"MethodChooser.js","names":[],"sources":["../../../../src/auth/login/MethodChooser.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport { Trans } from 'react-i18next';\nimport { Button, FormError, cx } from '@plumile/ui';\n\nimport type { AuthMethod } from '../../modules/sharedSchemaTypes.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n email: string;\n methods: readonly AuthMethod[];\n lockedUntil: string | null;\n onSelect: (method: AuthMethod) => void;\n onBack: () => void;\n};\n\nexport const MethodChooser = ({\n email,\n methods,\n lockedUntil,\n onSelect,\n onBack,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const isLocked = methods.length === 0;\n const lockedMessage =\n lockedUntil != null\n ? t('auth.methodChooser.lockedWithTime', {\n time: new Date(lockedUntil).toLocaleString(),\n })\n : t('auth.methodChooser.locked');\n\n const methodButtons = methods.map((method) => {\n const label =\n method === 'PASSKEY'\n ? t('auth.methodChooser.methods.passkey')\n : method === 'PASSWORD'\n ? t('auth.methodChooser.methods.password')\n : t('auth.methodChooser.methods.other', {\n method: method.toLowerCase(),\n });\n return (\n <Button\n key={method}\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n onSelect(method);\n }}\n className={cx(styles.fullWidth, styles.brandGhostButton)}\n >\n {label}\n </Button>\n );\n });\n\n return (\n <div className={styles.formSurface}>\n <div className={styles.stack}>\n <p className={styles.helper}>\n <Trans\n i18nKey=\"auth.methodChooser.prompt\"\n values={{ email }}\n components={{ strong: <strong /> }}\n />\n </p>\n {isLocked ? <FormError>{lockedMessage}</FormError> : null}\n {!isLocked ? methodButtons : null}\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={onBack}\n className={styles.inlineLink}\n >\n {t('auth.methodChooser.actions.back')}\n </Button>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;AAkBA,IAAa,KAAiB,EAC5B,UACA,YACA,gBACA,aACA,gBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B,EACvC,IAAW,EAAQ,WAAW,GAC9B,IACJ,KAAe,OAIX,EAAE,4BAA4B,GAH9B,EAAE,qCAAqC,EACrC,MAAM,IAAI,KAAK,EAAY,CAAC,gBAAgB,EAC7C,CAAC,EAGF,IAAgB,EAAQ,KAAK,MAAW;EAC5C,IAAM,IACJ,MAAW,YACP,EAAE,qCAAqC,GACvC,MAAW,aACT,EAAE,sCAAsC,GACxC,EAAE,oCAAoC,EACpC,QAAQ,EAAO,aAAa,EAC7B,CAAC;EACV,OACE,kBAAC,GAAD;GAEE,MAAK;GACL,SAAQ;GACR,eAAe;IACb,EAAS,EAAO;;GAElB,WAAW,EAAG,GAAkB,EAAwB;aAEvD;GACM,EATF,EASE;GAEX;CAEF,OACE,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,KAAD;KAAG,WAAW;eACZ,kBAAC,GAAD;MACE,SAAQ;MACR,QAAQ,EAAE,UAAO;MACjB,YAAY,EAAE,QAAQ,kBAAC,UAAD,EAAU,CAAA,EAAE;MAClC,CAAA;KACA,CAAA;IACH,IAAW,kBAAC,GAAD,EAAA,UAAY,GAA0B,CAAA,GAAG;IACnD,IAA2B,OAAhB;IACb,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,SAAS;KACT,WAAW;eAEV,EAAE,kCAAkC;KAC9B,CAAA;IACL;;EACF,CAAA"}
1
+ {"version":3,"file":"MethodChooser.js","names":[],"sources":["../../../../src/auth/login/MethodChooser.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport { Trans } from 'react-i18next';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { FormError } from '@plumile/ui/atomic/molecules/form_error/FormError.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport type { AuthMethod } from '../../modules/sharedSchemaTypes.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n email: string;\n methods: readonly AuthMethod[];\n lockedUntil: string | null;\n onSelect: (method: AuthMethod) => void;\n onBack: () => void;\n};\n\nexport const MethodChooser = ({\n email,\n methods,\n lockedUntil,\n onSelect,\n onBack,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const isLocked = methods.length === 0;\n const lockedMessage =\n lockedUntil != null\n ? t('auth.methodChooser.lockedWithTime', {\n time: new Date(lockedUntil).toLocaleString(),\n })\n : t('auth.methodChooser.locked');\n\n const methodButtons = methods.map((method) => {\n const label =\n method === 'PASSKEY'\n ? t('auth.methodChooser.methods.passkey')\n : method === 'PASSWORD'\n ? t('auth.methodChooser.methods.password')\n : t('auth.methodChooser.methods.other', {\n method: method.toLowerCase(),\n });\n return (\n <Button\n key={method}\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n onSelect(method);\n }}\n className={cx(styles.fullWidth, styles.brandGhostButton)}\n >\n {label}\n </Button>\n );\n });\n\n return (\n <div className={styles.formSurface}>\n <div className={styles.stack}>\n <p className={styles.helper}>\n <Trans\n i18nKey=\"auth.methodChooser.prompt\"\n values={{ email }}\n components={{ strong: <strong /> }}\n />\n </p>\n {isLocked ? <FormError>{lockedMessage}</FormError> : null}\n {!isLocked ? methodButtons : null}\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={onBack}\n className={styles.inlineLink}\n >\n {t('auth.methodChooser.actions.back')}\n </Button>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;AAoBA,IAAa,KAAiB,EAC5B,UACA,YACA,gBACA,aACA,gBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B,EACvC,IAAW,EAAQ,WAAW,GAC9B,IACJ,KAAe,OAIX,EAAE,4BAA4B,GAH9B,EAAE,qCAAqC,EACrC,MAAM,IAAI,KAAK,EAAY,CAAC,gBAAgB,EAC7C,CAAC,EAGF,IAAgB,EAAQ,KAAK,MAAW;EAC5C,IAAM,IACJ,MAAW,YACP,EAAE,qCAAqC,GACvC,MAAW,aACT,EAAE,sCAAsC,GACxC,EAAE,oCAAoC,EACpC,QAAQ,EAAO,aAAa,EAC7B,CAAC;EACV,OACE,kBAAC,GAAD;GAEE,MAAK;GACL,SAAQ;GACR,eAAe;IACb,EAAS,EAAO;;GAElB,WAAW,EAAG,GAAkB,EAAwB;aAEvD;GACM,EATF,EASE;GAEX;CAEF,OACE,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,KAAD;KAAG,WAAW;eACZ,kBAAC,GAAD;MACE,SAAQ;MACR,QAAQ,EAAE,UAAO;MACjB,YAAY,EAAE,QAAQ,kBAAC,UAAD,EAAU,CAAA,EAAE;MAClC,CAAA;KACA,CAAA;IACH,IAAW,kBAAC,GAAD,EAAA,UAAY,GAA0B,CAAA,GAAG;IACnD,IAA2B,OAAhB;IACb,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,SAAS;KACT,WAAW;eAEV,EAAE,kCAAkC;KAC9B,CAAA;IACL;;EACF,CAAA"}
@@ -1,8 +1,11 @@
1
1
  import { actionsRow as e, formSurface as t, helper as n, inlineLink as r, stack as i } from "./loginPage.css.js";
2
2
  import { useBackofficeReactTranslation as a } from "../../i18n/useBackofficeReactTranslation.js";
3
3
  import { useCallback as o, useEffect as s, useState as c } from "react";
4
- import { Button as l, Form as u, FormError as d, FormField as f } from "@plumile/ui";
5
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
4
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
+ import { Button as d } from "@plumile/ui/atomic/atoms/button/Button.js";
6
+ import { FormError as f } from "@plumile/ui/atomic/molecules/form_error/FormError.js";
7
+ import { FormField as p } from "@plumile/ui/atomic/molecules/form_field/FormField.js";
8
+ import { Form as m } from "@plumile/ui/atomic/molecules/form/Form.js";
6
9
  //#region src/auth/login/MfaChallengeForm.tsx
7
10
  var h = ({ auth: h, onSuccess: g, onBack: _ }) => {
8
11
  let { t: v } = a(), [y, b] = c(""), [x, S] = c(null);
@@ -28,22 +31,22 @@ var h = ({ auth: h, onSuccess: g, onBack: _ }) => {
28
31
  g,
29
32
  v
30
33
  ]), w = h.emailHint == null ? v("auth.mfa.helper.default") : v("auth.mfa.helper.withEmail", { email: h.emailHint }), T = x;
31
- return /* @__PURE__ */ m(u, {
34
+ return /* @__PURE__ */ u(m, {
32
35
  className: t,
33
36
  onSubmit: o((e) => {
34
37
  C(e).catch(() => {});
35
38
  }, [C]),
36
39
  noValidate: !0,
37
40
  initialFocus: "first-form-control",
38
- children: [/* @__PURE__ */ m("div", {
41
+ children: [/* @__PURE__ */ u("div", {
39
42
  className: i,
40
43
  children: [
41
- /* @__PURE__ */ p("p", {
44
+ /* @__PURE__ */ l("p", {
42
45
  className: n,
43
46
  children: w
44
47
  }),
45
- T == null ? null : /* @__PURE__ */ p(d, { children: T }),
46
- /* @__PURE__ */ p(f, {
48
+ T == null ? null : /* @__PURE__ */ l(f, { children: T }),
49
+ /* @__PURE__ */ l(p, {
47
50
  label: v("auth.mfa.form.label"),
48
51
  name: "code",
49
52
  type: "text",
@@ -56,9 +59,9 @@ var h = ({ auth: h, onSuccess: g, onBack: _ }) => {
56
59
  required: !0
57
60
  })
58
61
  ]
59
- }), /* @__PURE__ */ m("div", {
62
+ }), /* @__PURE__ */ u("div", {
60
63
  className: e,
61
- children: [/* @__PURE__ */ p(l, {
64
+ children: [/* @__PURE__ */ l(d, {
62
65
  type: "button",
63
66
  variant: "text",
64
67
  size: "small",
@@ -67,7 +70,7 @@ var h = ({ auth: h, onSuccess: g, onBack: _ }) => {
67
70
  h.reset(), _();
68
71
  },
69
72
  children: v("auth.mfa.actions.back")
70
- }), /* @__PURE__ */ p(l, {
73
+ }), /* @__PURE__ */ l(d, {
71
74
  type: "submit",
72
75
  size: "large",
73
76
  isLoading: h.isLoading,
@@ -1 +1 @@
1
- {"version":3,"file":"MfaChallengeForm.js","names":[],"sources":["../../../../src/auth/login/MfaChallengeForm.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useCallback,\n useEffect,\n useState,\n type FormEvent,\n type JSX,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button, Form, FormError, FormField } from '@plumile/ui';\n\nimport type { TotpCredentials, UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: Pick<\n UseAuthReturn,\n 'completeMfa' | 'isLoading' | 'error' | 'emailHint' | 'reset' | 'clearError'\n >;\n onSuccess: () => void;\n onBack: () => void;\n};\n\nexport const MfaChallengeForm = ({\n auth,\n onSuccess,\n onBack,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [code, setCode] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n\n // Clear any stale errors when the MFA form is shown\n useEffect(() => {\n auth.clearError();\n setLocalError(null);\n }, [auth]);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setLocalError(null);\n\n const trimmed = code.trim();\n if (trimmed.length < 4) {\n setLocalError(t('auth.mfa.errors.shortCode'));\n return;\n }\n\n try {\n const credentials: TotpCredentials = {\n code: trimmed,\n };\n await auth.completeMfa(credentials);\n onSuccess();\n } catch {\n setLocalError(t('auth.mfa.errors.verificationFailed'));\n }\n },\n [auth, code, onSuccess, t],\n );\n\n const helper =\n auth.emailHint != null\n ? t('auth.mfa.helper.withEmail', { email: auth.emailHint })\n : t('auth.mfa.helper.default');\n\n const formError = localError;\n\n const handleSubmitEvent = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n handleSubmit(event).catch(() => {\n return undefined;\n });\n },\n [handleSubmit],\n );\n\n return (\n <Form\n className={styles.formSurface}\n onSubmit={handleSubmitEvent}\n noValidate\n initialFocus=\"first-form-control\"\n >\n <div className={styles.stack}>\n <p className={styles.helper}>{helper}</p>\n {formError != null ? <FormError>{formError}</FormError> : null}\n <FormField\n label={t('auth.mfa.form.label')}\n name=\"code\"\n type=\"text\"\n value={code}\n onChange={(event) => {\n setCode(event.target.value);\n setLocalError(null);\n }}\n placeholder={t('auth.mfa.form.placeholder')}\n autoComplete=\"one-time-code\"\n required\n />\n </div>\n <div className={styles.actionsRow}>\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n className={styles.inlineLink}\n onClick={() => {\n auth.reset();\n onBack();\n }}\n >\n {t('auth.mfa.actions.back')}\n </Button>\n <Button type=\"submit\" size=\"large\" isLoading={auth.isLoading}>\n {t('auth.mfa.actions.submit')}\n </Button>\n </div>\n </Form>\n );\n};\n"],"mappings":";;;;;;AAyBA,IAAa,KAAoB,EAC/B,SACA,cACA,gBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B,EACvC,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAY,KAAiB,EAAwB,KAAK;CAGjE,QAAgB;EAEd,AADA,EAAK,YAAY,EACjB,EAAc,KAAK;IAClB,CAAC,EAAK,CAAC;CAEV,IAAM,IAAe,EACnB,OAAO,MAAsC;EAE3C,AADA,EAAM,gBAAgB,EACtB,EAAc,KAAK;EAEnB,IAAM,IAAU,EAAK,MAAM;EAC3B,IAAI,EAAQ,SAAS,GAAG;GACtB,EAAc,EAAE,4BAA4B,CAAC;GAC7C;;EAGF,IAAI;GACF,IAAM,IAA+B,EACnC,MAAM,GACP;GAED,AADA,MAAM,EAAK,YAAY,EAAY,EACnC,GAAW;UACL;GACN,EAAc,EAAE,qCAAqC,CAAC;;IAG1D;EAAC;EAAM;EAAM;EAAW;EAAE,CAC3B,EAEK,IACJ,EAAK,aAAa,OAEd,EAAE,0BAA0B,GAD5B,EAAE,6BAA6B,EAAE,OAAO,EAAK,WAAW,CAAC,EAGzD,IAAY;CAWlB,OACE,kBAAC,GAAD;EACE,WAAW;EACX,UAZsB,GACvB,MAAsC;GACrC,EAAa,EAAM,CAAC,YAAY,GAE9B;KAEJ,CAAC,EAAa,CAMF;EACV,YAAA;EACA,cAAa;YAJf,CAME,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,KAAD;KAAG,WAAW;eAAgB;KAAW,CAAA;IACxC,KAAa,OAA4C,OAArC,kBAAC,GAAD,EAAA,UAAY,GAAsB,CAAA;IACvD,kBAAC,GAAD;KACE,OAAO,EAAE,sBAAsB;KAC/B,MAAK;KACL,MAAK;KACL,OAAO;KACP,WAAW,MAAU;MAEnB,AADA,EAAQ,EAAM,OAAO,MAAM,EAC3B,EAAc,KAAK;;KAErB,aAAa,EAAE,4BAA4B;KAC3C,cAAa;KACb,UAAA;KACA,CAAA;IACE;MACN,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,MAAK;IACL,WAAW;IACX,eAAe;KAEb,AADA,EAAK,OAAO,EACZ,GAAQ;;cAGT,EAAE,wBAAwB;IACpB,CAAA,EACT,kBAAC,GAAD;IAAQ,MAAK;IAAS,MAAK;IAAQ,WAAW,EAAK;cAChD,EAAE,0BAA0B;IACtB,CAAA,CACL;KACD"}
1
+ {"version":3,"file":"MfaChallengeForm.js","names":[],"sources":["../../../../src/auth/login/MfaChallengeForm.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useCallback,\n useEffect,\n useState,\n type FormEvent,\n type JSX,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { FormError } from '@plumile/ui/atomic/molecules/form_error/FormError.js';\nimport { FormField } from '@plumile/ui/atomic/molecules/form_field/FormField.js';\nimport { Form } from '@plumile/ui/atomic/molecules/form/Form.js';\n\nimport type { TotpCredentials, UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: Pick<\n UseAuthReturn,\n 'completeMfa' | 'isLoading' | 'error' | 'emailHint' | 'reset' | 'clearError'\n >;\n onSuccess: () => void;\n onBack: () => void;\n};\n\nexport const MfaChallengeForm = ({\n auth,\n onSuccess,\n onBack,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [code, setCode] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n\n // Clear any stale errors when the MFA form is shown\n useEffect(() => {\n auth.clearError();\n setLocalError(null);\n }, [auth]);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setLocalError(null);\n\n const trimmed = code.trim();\n if (trimmed.length < 4) {\n setLocalError(t('auth.mfa.errors.shortCode'));\n return;\n }\n\n try {\n const credentials: TotpCredentials = {\n code: trimmed,\n };\n await auth.completeMfa(credentials);\n onSuccess();\n } catch {\n setLocalError(t('auth.mfa.errors.verificationFailed'));\n }\n },\n [auth, code, onSuccess, t],\n );\n\n const helper =\n auth.emailHint != null\n ? t('auth.mfa.helper.withEmail', { email: auth.emailHint })\n : t('auth.mfa.helper.default');\n\n const formError = localError;\n\n const handleSubmitEvent = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n handleSubmit(event).catch(() => {\n return undefined;\n });\n },\n [handleSubmit],\n );\n\n return (\n <Form\n className={styles.formSurface}\n onSubmit={handleSubmitEvent}\n noValidate\n initialFocus=\"first-form-control\"\n >\n <div className={styles.stack}>\n <p className={styles.helper}>{helper}</p>\n {formError != null ? <FormError>{formError}</FormError> : null}\n <FormField\n label={t('auth.mfa.form.label')}\n name=\"code\"\n type=\"text\"\n value={code}\n onChange={(event) => {\n setCode(event.target.value);\n setLocalError(null);\n }}\n placeholder={t('auth.mfa.form.placeholder')}\n autoComplete=\"one-time-code\"\n required\n />\n </div>\n <div className={styles.actionsRow}>\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n className={styles.inlineLink}\n onClick={() => {\n auth.reset();\n onBack();\n }}\n >\n {t('auth.mfa.actions.back')}\n </Button>\n <Button type=\"submit\" size=\"large\" isLoading={auth.isLoading}>\n {t('auth.mfa.actions.submit')}\n </Button>\n </div>\n </Form>\n );\n};\n"],"mappings":";;;;;;;;;AA4BA,IAAa,KAAoB,EAC/B,SACA,cACA,gBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B,EACvC,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAY,KAAiB,EAAwB,KAAK;CAGjE,QAAgB;EAEd,AADA,EAAK,YAAY,EACjB,EAAc,KAAK;IAClB,CAAC,EAAK,CAAC;CAEV,IAAM,IAAe,EACnB,OAAO,MAAsC;EAE3C,AADA,EAAM,gBAAgB,EACtB,EAAc,KAAK;EAEnB,IAAM,IAAU,EAAK,MAAM;EAC3B,IAAI,EAAQ,SAAS,GAAG;GACtB,EAAc,EAAE,4BAA4B,CAAC;GAC7C;;EAGF,IAAI;GACF,IAAM,IAA+B,EACnC,MAAM,GACP;GAED,AADA,MAAM,EAAK,YAAY,EAAY,EACnC,GAAW;UACL;GACN,EAAc,EAAE,qCAAqC,CAAC;;IAG1D;EAAC;EAAM;EAAM;EAAW;EAAE,CAC3B,EAEK,IACJ,EAAK,aAAa,OAEd,EAAE,0BAA0B,GAD5B,EAAE,6BAA6B,EAAE,OAAO,EAAK,WAAW,CAAC,EAGzD,IAAY;CAWlB,OACE,kBAAC,GAAD;EACE,WAAW;EACX,UAZsB,GACvB,MAAsC;GACrC,EAAa,EAAM,CAAC,YAAY,GAE9B;KAEJ,CAAC,EAAa,CAMF;EACV,YAAA;EACA,cAAa;YAJf,CAME,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,KAAD;KAAG,WAAW;eAAgB;KAAW,CAAA;IACxC,KAAa,OAA4C,OAArC,kBAAC,GAAD,EAAA,UAAY,GAAsB,CAAA;IACvD,kBAAC,GAAD;KACE,OAAO,EAAE,sBAAsB;KAC/B,MAAK;KACL,MAAK;KACL,OAAO;KACP,WAAW,MAAU;MAEnB,AADA,EAAQ,EAAM,OAAO,MAAM,EAC3B,EAAc,KAAK;;KAErB,aAAa,EAAE,4BAA4B;KAC3C,cAAa;KACb,UAAA;KACA,CAAA;IACE;MACN,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,MAAK;IACL,WAAW;IACX,eAAe;KAEb,AADA,EAAK,OAAO,EACZ,GAAQ;;cAGT,EAAE,wBAAwB;IACpB,CAAA,EACT,kBAAC,GAAD;IAAQ,MAAK;IAAS,MAAK;IAAQ,WAAW,EAAK;cAChD,EAAE,0BAA0B;IACtB,CAAA,CACL;KACD"}
@@ -1,17 +1,17 @@
1
1
  import { brandGhostButton as e, stack as t } from "./loginPage.css.js";
2
2
  import { useBackofficeReactTranslation as n } from "../../i18n/useBackofficeReactTranslation.js";
3
- import { Button as r } from "@plumile/ui";
4
- import { jsx as i } from "react/jsx-runtime";
3
+ import { jsx as r } from "react/jsx-runtime";
4
+ import { Button as i } from "@plumile/ui/atomic/atoms/button/Button.js";
5
5
  //#region src/auth/login/OidcButtons.tsx
6
6
  var a = "/auth/oidc/start", o = ({ providers: o }) => {
7
7
  let { t: s } = n();
8
- return o.length === 0 ? null : /* @__PURE__ */ i("div", {
8
+ return o.length === 0 ? null : /* @__PURE__ */ r("div", {
9
9
  className: t,
10
10
  children: o.map((t) => {
11
11
  let n = s("auth.oidc.buttons.generic");
12
12
  t === "GOOGLE" ? n = s("auth.oidc.buttons.google") : t === "APPLE" && (n = s("auth.oidc.buttons.apple"));
13
13
  let o = t.toLowerCase();
14
- return /* @__PURE__ */ i(r, {
14
+ return /* @__PURE__ */ r(i, {
15
15
  type: "button",
16
16
  variant: "secondary",
17
17
  className: e,
@@ -1 +1 @@
1
- {"version":3,"file":"OidcButtons.js","names":[],"sources":["../../../../src/auth/login/OidcButtons.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { Button } from '@plumile/ui';\n\nimport type { OidcProviderKind } from '../../modules/sharedSchemaTypes.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './loginPage.css.js';\n\nconst OIDC_START_PATH = '/auth/oidc/start';\n\ntype Props = {\n providers: readonly OidcProviderKind[];\n};\n\nexport const OidcButtons = ({ providers }: Props): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (providers.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.stack}>\n {providers.map((provider) => {\n let label = t('auth.oidc.buttons.generic');\n if (provider === 'GOOGLE') {\n label = t('auth.oidc.buttons.google');\n } else if (provider === 'APPLE') {\n label = t('auth.oidc.buttons.apple');\n }\n const providerName = provider.toLowerCase();\n return (\n <Button\n key={provider}\n type=\"button\"\n variant=\"secondary\"\n className={styles.brandGhostButton}\n onClick={() => {\n window.location.assign(\n `${OIDC_START_PATH}?provider=${providerName}`,\n );\n }}\n >\n {label}\n </Button>\n );\n })}\n </div>\n );\n};\n"],"mappings":";;;;;AASA,IAAM,IAAkB,oBAMX,KAAe,EAAE,mBAA2C;CACvE,IAAM,EAAE,SAAM,GAA+B;CAM7C,OAJI,EAAU,WAAW,IAChB,OAIP,kBAAC,OAAD;EAAK,WAAW;YACb,EAAU,KAAK,MAAa;GAC3B,IAAI,IAAQ,EAAE,4BAA4B;GAC1C,AAAI,MAAa,WACf,IAAQ,EAAE,2BAA2B,GAC5B,MAAa,YACtB,IAAQ,EAAE,0BAA0B;GAEtC,IAAM,IAAe,EAAS,aAAa;GAC3C,OACE,kBAAC,GAAD;IAEE,MAAK;IACL,SAAQ;IACR,WAAW;IACX,eAAe;KACb,OAAO,SAAS,OACd,GAAG,EAAgB,YAAY,IAChC;;cAGF;IACM,EAXF,EAWE;IAEX;EACE,CAAA"}
1
+ {"version":3,"file":"OidcButtons.js","names":[],"sources":["../../../../src/auth/login/OidcButtons.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\n\nimport type { OidcProviderKind } from '../../modules/sharedSchemaTypes.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './loginPage.css.js';\n\nconst OIDC_START_PATH = '/auth/oidc/start';\n\ntype Props = {\n providers: readonly OidcProviderKind[];\n};\n\nexport const OidcButtons = ({ providers }: Props): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (providers.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.stack}>\n {providers.map((provider) => {\n let label = t('auth.oidc.buttons.generic');\n if (provider === 'GOOGLE') {\n label = t('auth.oidc.buttons.google');\n } else if (provider === 'APPLE') {\n label = t('auth.oidc.buttons.apple');\n }\n const providerName = provider.toLowerCase();\n return (\n <Button\n key={provider}\n type=\"button\"\n variant=\"secondary\"\n className={styles.brandGhostButton}\n onClick={() => {\n window.location.assign(\n `${OIDC_START_PATH}?provider=${providerName}`,\n );\n }}\n >\n {label}\n </Button>\n );\n })}\n </div>\n );\n};\n"],"mappings":";;;;;AASA,IAAM,IAAkB,oBAMX,KAAe,EAAE,mBAA2C;CACvE,IAAM,EAAE,SAAM,GAA+B;CAM7C,OAJI,EAAU,WAAW,IAChB,OAIP,kBAAC,OAAD;EAAK,WAAW;YACb,EAAU,KAAK,MAAa;GAC3B,IAAI,IAAQ,EAAE,4BAA4B;GAC1C,AAAI,MAAa,WACf,IAAQ,EAAE,2BAA2B,GAC5B,MAAa,YACtB,IAAQ,EAAE,0BAA0B;GAEtC,IAAM,IAAe,EAAS,aAAa;GAC3C,OACE,kBAAC,GAAD;IAEE,MAAK;IACL,SAAQ;IACR,WAAW;IACX,eAAe;KACb,OAAO,SAAS,OACd,GAAG,EAAgB,YAAY,IAChC;;cAGF;IACM,EAXF,EAWE;IAEX;EACE,CAAA"}
@@ -1,8 +1,11 @@
1
1
  import { actionsRow as e, formSurface as t, helper as n, inlineLink as r, stack as i } from "./loginPage.css.js";
2
2
  import { useBackofficeReactTranslation as a } from "../../i18n/useBackofficeReactTranslation.js";
3
3
  import { useCallback as o, useEffect as s, useState as c } from "react";
4
- import { Button as l, Form as u, FormError as d, FormField as f } from "@plumile/ui";
5
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
4
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
+ import { Button as d } from "@plumile/ui/atomic/atoms/button/Button.js";
6
+ import { FormError as f } from "@plumile/ui/atomic/molecules/form_error/FormError.js";
7
+ import { FormField as p } from "@plumile/ui/atomic/molecules/form_field/FormField.js";
8
+ import { Form as m } from "@plumile/ui/atomic/molecules/form/Form.js";
6
9
  //#region src/auth/login/PasskeyLoginForm.tsx
7
10
  var h = ({ auth: h, onSuccess: g, defaultEmail: _, isAttemptingPasskey: v = !1, onShowMethods: y }) => {
8
11
  let { t: b } = a(), [x, S] = c(h.emailHint ?? ""), [C, w] = c(null);
@@ -34,22 +37,22 @@ var h = ({ auth: h, onSuccess: g, defaultEmail: _, isAttemptingPasskey: v = !1,
34
37
  g,
35
38
  b
36
39
  ]), E = C;
37
- return /* @__PURE__ */ m(u, {
40
+ return /* @__PURE__ */ u(m, {
38
41
  className: t,
39
42
  onSubmit: o((e) => {
40
43
  T(e).catch(() => {});
41
44
  }, [T]),
42
45
  noValidate: !0,
43
46
  initialFocus: "first-form-control",
44
- children: [/* @__PURE__ */ m("div", {
47
+ children: [/* @__PURE__ */ u("div", {
45
48
  className: i,
46
49
  children: [
47
- /* @__PURE__ */ p("p", {
50
+ /* @__PURE__ */ l("p", {
48
51
  className: n,
49
52
  children: b("auth.passkey.helper")
50
53
  }),
51
- E == null ? null : /* @__PURE__ */ p(d, { children: E }),
52
- /* @__PURE__ */ p(f, {
54
+ E == null ? null : /* @__PURE__ */ l(f, { children: E }),
55
+ /* @__PURE__ */ l(p, {
53
56
  label: b("auth.passkey.form.emailLabel"),
54
57
  name: "passkey-email",
55
58
  type: "email",
@@ -62,14 +65,14 @@ var h = ({ auth: h, onSuccess: g, defaultEmail: _, isAttemptingPasskey: v = !1,
62
65
  required: !0
63
66
  })
64
67
  ]
65
- }), /* @__PURE__ */ m("div", {
68
+ }), /* @__PURE__ */ u("div", {
66
69
  className: e,
67
- children: [/* @__PURE__ */ p(l, {
70
+ children: [/* @__PURE__ */ l(d, {
68
71
  type: "submit",
69
72
  variant: "primary",
70
73
  isLoading: h.isLoading,
71
74
  children: b(v ? "auth.passkey.actions.submitting" : "auth.passkey.actions.submit")
72
- }), y == null ? null : /* @__PURE__ */ p("button", {
75
+ }), y == null ? null : /* @__PURE__ */ l("button", {
73
76
  type: "button",
74
77
  className: r,
75
78
  onClick: y,
@@ -1 +1 @@
1
- {"version":3,"file":"PasskeyLoginForm.js","names":[],"sources":["../../../../src/auth/login/PasskeyLoginForm.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useCallback,\n useEffect,\n useState,\n type FormEvent,\n type JSX,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button, Form, FormError, FormField } from '@plumile/ui';\n\nimport type { UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: Pick<\n UseAuthReturn,\n | 'loginWithPasskey'\n | 'isLoading'\n | 'error'\n | 'emailHint'\n | 'nextStep'\n | 'beginAuthentication'\n | 'lockedUntil'\n | 'availableMethods'\n >;\n onSuccess: () => void;\n defaultEmail?: string;\n isAttemptingPasskey?: boolean;\n onShowMethods?: () => void;\n};\n\nexport const PasskeyLoginForm = ({\n auth,\n onSuccess,\n defaultEmail,\n isAttemptingPasskey = false,\n onShowMethods,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [email, setEmail] = useState(auth.emailHint ?? '');\n const [localError, setLocalError] = useState<string | null>(null);\n\n useEffect(() => {\n if (auth.emailHint != null && auth.emailHint !== '') {\n setEmail(auth.emailHint);\n } else if (defaultEmail != null && defaultEmail !== '') {\n setEmail(defaultEmail);\n }\n }, [auth.emailHint, defaultEmail]);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setLocalError(null);\n\n if (email.trim() === '') {\n setLocalError(t('auth.passkey.errors.emailRequired'));\n return;\n }\n\n try {\n const result = await auth.beginAuthentication(email.trim());\n if (Array.isArray(result.methods) && result.methods.length === 0) {\n const lockedUntilMessage =\n result.lockedUntil != null\n ? t('auth.passkey.errors.lockedWithTime', {\n time: new Date(result.lockedUntil).toLocaleString(),\n })\n : t('auth.passkey.errors.locked');\n setLocalError(lockedUntilMessage);\n return;\n }\n if (\n Array.isArray(result.methods) &&\n !result.methods.includes('PASSKEY')\n ) {\n setLocalError(t('auth.passkey.errors.notAvailable'));\n return;\n }\n\n const status = await auth.loginWithPasskey({ email: email.trim() });\n if (status === 'success') {\n onSuccess();\n }\n } catch {\n setLocalError(t('auth.passkey.errors.failed'));\n }\n },\n [auth, email, onSuccess, t],\n );\n\n const formError = localError;\n\n const handleSubmitEvent = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n handleSubmit(event).catch(() => {\n return undefined;\n });\n },\n [handleSubmit],\n );\n\n return (\n <Form\n className={styles.formSurface}\n onSubmit={handleSubmitEvent}\n noValidate\n initialFocus=\"first-form-control\"\n >\n <div className={styles.stack}>\n <p className={styles.helper}>{t('auth.passkey.helper')}</p>\n {formError != null ? <FormError>{formError}</FormError> : null}\n <FormField\n label={t('auth.passkey.form.emailLabel')}\n name=\"passkey-email\"\n type=\"email\"\n value={email}\n onChange={(event) => {\n setEmail(event.target.value);\n setLocalError(null);\n }}\n placeholder={t('auth.passkey.form.emailPlaceholder')}\n autoComplete=\"email\"\n required\n />\n </div>\n <div className={styles.actionsRow}>\n <Button type=\"submit\" variant=\"primary\" isLoading={auth.isLoading}>\n {isAttemptingPasskey\n ? t('auth.passkey.actions.submitting')\n : t('auth.passkey.actions.submit')}\n </Button>\n {onShowMethods != null ? (\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onShowMethods}\n >\n {t('auth.passkey.actions.showMethods')}\n </button>\n ) : null}\n </div>\n </Form>\n );\n};\n"],"mappings":";;;;;;AAkCA,IAAa,KAAoB,EAC/B,SACA,cACA,iBACA,yBAAsB,IACtB,uBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B,EACvC,CAAC,GAAO,KAAY,EAAS,EAAK,aAAa,GAAG,EAClD,CAAC,GAAY,KAAiB,EAAwB,KAAK;CAEjE,QAAgB;EACd,AAAI,EAAK,aAAa,QAAQ,EAAK,cAAc,KAC/C,EAAS,EAAK,UAAU,GACf,KAAgB,QAAQ,MAAiB,MAClD,EAAS,EAAa;IAEvB,CAAC,EAAK,WAAW,EAAa,CAAC;CAElC,IAAM,IAAe,EACnB,OAAO,MAAsC;EAI3C,IAHA,EAAM,gBAAgB,EACtB,EAAc,KAAK,EAEf,EAAM,MAAM,KAAK,IAAI;GACvB,EAAc,EAAE,oCAAoC,CAAC;GACrD;;EAGF,IAAI;GACF,IAAM,IAAS,MAAM,EAAK,oBAAoB,EAAM,MAAM,CAAC;GAC3D,IAAI,MAAM,QAAQ,EAAO,QAAQ,IAAI,EAAO,QAAQ,WAAW,GAAG;IAOhE,EALE,EAAO,eAAe,OAIlB,EAAE,6BAA6B,GAH/B,EAAE,sCAAsC,EACtC,MAAM,IAAI,KAAK,EAAO,YAAY,CAAC,gBAAgB,EACpD,CAAC,CAEyB;IACjC;;GAEF,IACE,MAAM,QAAQ,EAAO,QAAQ,IAC7B,CAAC,EAAO,QAAQ,SAAS,UAAU,EACnC;IACA,EAAc,EAAE,mCAAmC,CAAC;IACpD;;GAIF,AAAI,MADiB,EAAK,iBAAiB,EAAE,OAAO,EAAM,MAAM,EAAE,CAAC,KACpD,aACb,GAAW;UAEP;GACN,EAAc,EAAE,6BAA6B,CAAC;;IAGlD;EAAC;EAAM;EAAO;EAAW;EAAE,CAC5B,EAEK,IAAY;CAWlB,OACE,kBAAC,GAAD;EACE,WAAW;EACX,UAZsB,GACvB,MAAsC;GACrC,EAAa,EAAM,CAAC,YAAY,GAE9B;KAEJ,CAAC,EAAa,CAMF;EACV,YAAA;EACA,cAAa;YAJf,CAME,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,KAAD;KAAG,WAAW;eAAgB,EAAE,sBAAsB;KAAK,CAAA;IAC1D,KAAa,OAA4C,OAArC,kBAAC,GAAD,EAAA,UAAY,GAAsB,CAAA;IACvD,kBAAC,GAAD;KACE,OAAO,EAAE,+BAA+B;KACxC,MAAK;KACL,MAAK;KACL,OAAO;KACP,WAAW,MAAU;MAEnB,AADA,EAAS,EAAM,OAAO,MAAM,EAC5B,EAAc,KAAK;;KAErB,aAAa,EAAE,qCAAqC;KACpD,cAAa;KACb,UAAA;KACA,CAAA;IACE;MACN,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,GAAD;IAAQ,MAAK;IAAS,SAAQ;IAAU,WAAW,EAAK;cAElD,EADH,IACK,oCACA,8BAA8B;IAC7B,CAAA,EACR,KAAiB,OAQd,OAPF,kBAAC,UAAD;IACE,MAAK;IACL,WAAW;IACX,SAAS;cAER,EAAE,mCAAmC;IAC/B,CAAA,CAEP;KACD"}
1
+ {"version":3,"file":"PasskeyLoginForm.js","names":[],"sources":["../../../../src/auth/login/PasskeyLoginForm.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useCallback,\n useEffect,\n useState,\n type FormEvent,\n type JSX,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { FormError } from '@plumile/ui/atomic/molecules/form_error/FormError.js';\nimport { FormField } from '@plumile/ui/atomic/molecules/form_field/FormField.js';\nimport { Form } from '@plumile/ui/atomic/molecules/form/Form.js';\n\nimport type { UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: Pick<\n UseAuthReturn,\n | 'loginWithPasskey'\n | 'isLoading'\n | 'error'\n | 'emailHint'\n | 'nextStep'\n | 'beginAuthentication'\n | 'lockedUntil'\n | 'availableMethods'\n >;\n onSuccess: () => void;\n defaultEmail?: string;\n isAttemptingPasskey?: boolean;\n onShowMethods?: () => void;\n};\n\nexport const PasskeyLoginForm = ({\n auth,\n onSuccess,\n defaultEmail,\n isAttemptingPasskey = false,\n onShowMethods,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [email, setEmail] = useState(auth.emailHint ?? '');\n const [localError, setLocalError] = useState<string | null>(null);\n\n useEffect(() => {\n if (auth.emailHint != null && auth.emailHint !== '') {\n setEmail(auth.emailHint);\n } else if (defaultEmail != null && defaultEmail !== '') {\n setEmail(defaultEmail);\n }\n }, [auth.emailHint, defaultEmail]);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setLocalError(null);\n\n if (email.trim() === '') {\n setLocalError(t('auth.passkey.errors.emailRequired'));\n return;\n }\n\n try {\n const result = await auth.beginAuthentication(email.trim());\n if (Array.isArray(result.methods) && result.methods.length === 0) {\n const lockedUntilMessage =\n result.lockedUntil != null\n ? t('auth.passkey.errors.lockedWithTime', {\n time: new Date(result.lockedUntil).toLocaleString(),\n })\n : t('auth.passkey.errors.locked');\n setLocalError(lockedUntilMessage);\n return;\n }\n if (\n Array.isArray(result.methods) &&\n !result.methods.includes('PASSKEY')\n ) {\n setLocalError(t('auth.passkey.errors.notAvailable'));\n return;\n }\n\n const status = await auth.loginWithPasskey({ email: email.trim() });\n if (status === 'success') {\n onSuccess();\n }\n } catch {\n setLocalError(t('auth.passkey.errors.failed'));\n }\n },\n [auth, email, onSuccess, t],\n );\n\n const formError = localError;\n\n const handleSubmitEvent = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n handleSubmit(event).catch(() => {\n return undefined;\n });\n },\n [handleSubmit],\n );\n\n return (\n <Form\n className={styles.formSurface}\n onSubmit={handleSubmitEvent}\n noValidate\n initialFocus=\"first-form-control\"\n >\n <div className={styles.stack}>\n <p className={styles.helper}>{t('auth.passkey.helper')}</p>\n {formError != null ? <FormError>{formError}</FormError> : null}\n <FormField\n label={t('auth.passkey.form.emailLabel')}\n name=\"passkey-email\"\n type=\"email\"\n value={email}\n onChange={(event) => {\n setEmail(event.target.value);\n setLocalError(null);\n }}\n placeholder={t('auth.passkey.form.emailPlaceholder')}\n autoComplete=\"email\"\n required\n />\n </div>\n <div className={styles.actionsRow}>\n <Button type=\"submit\" variant=\"primary\" isLoading={auth.isLoading}>\n {isAttemptingPasskey\n ? t('auth.passkey.actions.submitting')\n : t('auth.passkey.actions.submit')}\n </Button>\n {onShowMethods != null ? (\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onShowMethods}\n >\n {t('auth.passkey.actions.showMethods')}\n </button>\n ) : null}\n </div>\n </Form>\n );\n};\n"],"mappings":";;;;;;;;;AAqCA,IAAa,KAAoB,EAC/B,SACA,cACA,iBACA,yBAAsB,IACtB,uBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B,EACvC,CAAC,GAAO,KAAY,EAAS,EAAK,aAAa,GAAG,EAClD,CAAC,GAAY,KAAiB,EAAwB,KAAK;CAEjE,QAAgB;EACd,AAAI,EAAK,aAAa,QAAQ,EAAK,cAAc,KAC/C,EAAS,EAAK,UAAU,GACf,KAAgB,QAAQ,MAAiB,MAClD,EAAS,EAAa;IAEvB,CAAC,EAAK,WAAW,EAAa,CAAC;CAElC,IAAM,IAAe,EACnB,OAAO,MAAsC;EAI3C,IAHA,EAAM,gBAAgB,EACtB,EAAc,KAAK,EAEf,EAAM,MAAM,KAAK,IAAI;GACvB,EAAc,EAAE,oCAAoC,CAAC;GACrD;;EAGF,IAAI;GACF,IAAM,IAAS,MAAM,EAAK,oBAAoB,EAAM,MAAM,CAAC;GAC3D,IAAI,MAAM,QAAQ,EAAO,QAAQ,IAAI,EAAO,QAAQ,WAAW,GAAG;IAOhE,EALE,EAAO,eAAe,OAIlB,EAAE,6BAA6B,GAH/B,EAAE,sCAAsC,EACtC,MAAM,IAAI,KAAK,EAAO,YAAY,CAAC,gBAAgB,EACpD,CAAC,CAEyB;IACjC;;GAEF,IACE,MAAM,QAAQ,EAAO,QAAQ,IAC7B,CAAC,EAAO,QAAQ,SAAS,UAAU,EACnC;IACA,EAAc,EAAE,mCAAmC,CAAC;IACpD;;GAIF,AAAI,MADiB,EAAK,iBAAiB,EAAE,OAAO,EAAM,MAAM,EAAE,CAAC,KACpD,aACb,GAAW;UAEP;GACN,EAAc,EAAE,6BAA6B,CAAC;;IAGlD;EAAC;EAAM;EAAO;EAAW;EAAE,CAC5B,EAEK,IAAY;CAWlB,OACE,kBAAC,GAAD;EACE,WAAW;EACX,UAZsB,GACvB,MAAsC;GACrC,EAAa,EAAM,CAAC,YAAY,GAE9B;KAEJ,CAAC,EAAa,CAMF;EACV,YAAA;EACA,cAAa;YAJf,CAME,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,KAAD;KAAG,WAAW;eAAgB,EAAE,sBAAsB;KAAK,CAAA;IAC1D,KAAa,OAA4C,OAArC,kBAAC,GAAD,EAAA,UAAY,GAAsB,CAAA;IACvD,kBAAC,GAAD;KACE,OAAO,EAAE,+BAA+B;KACxC,MAAK;KACL,MAAK;KACL,OAAO;KACP,WAAW,MAAU;MAEnB,AADA,EAAS,EAAM,OAAO,MAAM,EAC5B,EAAc,KAAK;;KAErB,aAAa,EAAE,qCAAqC;KACpD,cAAa;KACb,UAAA;KACA,CAAA;IACE;MACN,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,GAAD;IAAQ,MAAK;IAAS,SAAQ;IAAU,WAAW,EAAK;cAElD,EADH,IACK,oCACA,8BAA8B;IAC7B,CAAA,EACR,KAAiB,OAQd,OAPF,kBAAC,UAAD;IACE,MAAK;IACL,WAAW;IACX,SAAS;cAER,EAAE,mCAAmC;IAC/B,CAAA,CAEP;KACD"}
@@ -2,31 +2,31 @@ import { actionsRow as e, formSurface as t, inlineLink as n } from "./loginPage.
2
2
  import { AuthPanel as r } from "./AuthPanel.js";
3
3
  import { useBackofficeReactTranslation as i } from "../../i18n/useBackofficeReactTranslation.js";
4
4
  import { OidcButtons as a } from "./OidcButtons.js";
5
- import { LoginForm as o } from "@plumile/ui";
6
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ import { LoginForm as c } from "@plumile/ui/atomic/organisms/login_form/LoginForm.js";
7
7
  //#region src/auth/login/PasswordLoginPanel.tsx
8
8
  var l = ({ auth: l, defaultEmail: u, onForgotPassword: d, onSuccess: f, providers: p }) => {
9
9
  let { t: m } = i();
10
- return /* @__PURE__ */ s(r, {
10
+ return /* @__PURE__ */ o(r, {
11
11
  title: m("auth.passwordLogin.title"),
12
- children: /* @__PURE__ */ c("div", {
12
+ children: /* @__PURE__ */ s("div", {
13
13
  className: t,
14
14
  children: [
15
- /* @__PURE__ */ s(o, {
15
+ /* @__PURE__ */ o(c, {
16
16
  auth: l,
17
17
  onSuccess: f,
18
18
  defaultEmail: u
19
19
  }),
20
- /* @__PURE__ */ s("div", {
20
+ /* @__PURE__ */ o("div", {
21
21
  className: e,
22
- children: /* @__PURE__ */ s("button", {
22
+ children: /* @__PURE__ */ o("button", {
23
23
  type: "button",
24
24
  className: n,
25
25
  onClick: d,
26
26
  children: m("auth.passwordLogin.forgotPassword")
27
27
  })
28
28
  }),
29
- /* @__PURE__ */ s(a, { providers: p })
29
+ /* @__PURE__ */ o(a, { providers: p })
30
30
  ]
31
31
  })
32
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordLoginPanel.js","names":[],"sources":["../../../../src/auth/login/PasswordLoginPanel.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { LoginForm, type LoginFormAuthAdapter } from '@plumile/ui';\n\nimport type { OidcProviderKind } from '../../modules/sharedSchemaTypes.js';\n\nimport { AuthPanel } from './AuthPanel.js';\nimport { OidcButtons } from './OidcButtons.js';\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: LoginFormAuthAdapter;\n defaultEmail: string;\n onForgotPassword: () => void;\n onSuccess: () => void;\n providers: readonly OidcProviderKind[];\n};\n\nexport const PasswordLoginPanel = ({\n auth,\n defaultEmail,\n onForgotPassword,\n onSuccess,\n providers,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <AuthPanel title={t('auth.passwordLogin.title')}>\n <div className={styles.formSurface}>\n <LoginForm\n auth={auth}\n onSuccess={onSuccess}\n defaultEmail={defaultEmail}\n />\n <div className={styles.actionsRow}>\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onForgotPassword}\n >\n {t('auth.passwordLogin.forgotPassword')}\n </button>\n </div>\n <OidcButtons providers={providers} />\n </div>\n </AuthPanel>\n );\n};\n"],"mappings":";;;;;;;AAmBA,IAAa,KAAsB,EACjC,SACA,iBACA,qBACA,cACA,mBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B;CAC7C,OACE,kBAAC,GAAD;EAAW,OAAO,EAAE,2BAA2B;YAC7C,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,GAAD;KACQ;KACK;KACG;KACd,CAAA;IACF,kBAAC,OAAD;KAAK,WAAW;eACd,kBAAC,UAAD;MACE,MAAK;MACL,WAAW;MACX,SAAS;gBAER,EAAE,oCAAoC;MAChC,CAAA;KACL,CAAA;IACN,kBAAC,GAAD,EAAwB,cAAa,CAAA;IACjC;;EACI,CAAA"}
1
+ {"version":3,"file":"PasswordLoginPanel.js","names":[],"sources":["../../../../src/auth/login/PasswordLoginPanel.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { LoginForm } from '@plumile/ui/atomic/organisms/login_form/LoginForm.js';\nimport { type LoginFormAuthAdapter } from '@plumile/ui/atomic/organisms/login_form/useLoginForm.js';\n\nimport type { OidcProviderKind } from '../../modules/sharedSchemaTypes.js';\n\nimport { AuthPanel } from './AuthPanel.js';\nimport { OidcButtons } from './OidcButtons.js';\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: LoginFormAuthAdapter;\n defaultEmail: string;\n onForgotPassword: () => void;\n onSuccess: () => void;\n providers: readonly OidcProviderKind[];\n};\n\nexport const PasswordLoginPanel = ({\n auth,\n defaultEmail,\n onForgotPassword,\n onSuccess,\n providers,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <AuthPanel title={t('auth.passwordLogin.title')}>\n <div className={styles.formSurface}>\n <LoginForm\n auth={auth}\n onSuccess={onSuccess}\n defaultEmail={defaultEmail}\n />\n <div className={styles.actionsRow}>\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onForgotPassword}\n >\n {t('auth.passwordLogin.forgotPassword')}\n </button>\n </div>\n <OidcButtons providers={providers} />\n </div>\n </AuthPanel>\n );\n};\n"],"mappings":";;;;;;;AAoBA,IAAa,KAAsB,EACjC,SACA,iBACA,qBACA,cACA,mBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B;CAC7C,OACE,kBAAC,GAAD;EAAW,OAAO,EAAE,2BAA2B;YAC7C,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,GAAD;KACQ;KACK;KACG;KACd,CAAA;IACF,kBAAC,OAAD;KAAK,WAAW;eACd,kBAAC,UAAD;MACE,MAAK;MACL,WAAW;MACX,SAAS;gBAER,EAAE,oCAAoC;MAChC,CAAA;KACL,CAAA;IACN,kBAAC,GAAD,EAAwB,cAAa,CAAA;IACjC;;EACI,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"loginPage.css.js","names":[],"sources":["../../../../src/auth/login/loginPage.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles, vars } from '@plumile/ui';\n\nexport const stack = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const formSurface = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n width: 'full',\n});\n\nexport const helper = sprinkles({\n color: 'brandDarkGray',\n fontSize: 'sm',\n margin: 0,\n lineHeight: 1.6,\n});\n\nexport const divider = sprinkles({\n alignItems: 'center',\n color: 'brandDarkGray',\n display: 'flex',\n gap: 2,\n marginTop: 5,\n marginBottom: 3,\n});\n\nexport const dividerLine = sprinkles({\n backgroundColor: 'brandPrimaryRed',\n height: 'px',\n flex: 1,\n borderRadius: 'full',\n opacity: 35,\n});\n\nexport const actionsRow = sprinkles({\n alignItems: 'center',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 3,\n justifyContent: 'space-between',\n marginTop: 3,\n});\n\nexport const inlineLink = style([\n sprinkles({\n color: 'brandPrimaryRed',\n fontWeight: 'semibold',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n background: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'none',\n ':hover': {\n color: vars.colors.brandSecondaryOrange,\n textDecoration: 'underline',\n },\n },\n]);\n\nexport const panel = sprinkles({\n borderTopLeftRadius: 'none',\n borderTopRightRadius: 'none',\n borderBottomLeftRadius: '2xl',\n borderBottomRightRadius: '2xl',\n paddingX: 6,\n paddingY: 6,\n});\n\nexport const block = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const fullWidth = sprinkles({\n width: 'full',\n});\n\nexport const panelTitle = sprinkles({\n margin: 0,\n fontSize: 'xl',\n fontWeight: 'bold',\n color: 'brandPrimaryRed',\n letterSpacing: 'tight',\n});\n\nexport const footer = sprinkles({\n marginTop: 4,\n});\n\nexport const brandGhostButton = style([\n sprinkles({\n borderColor: 'brandPrimaryRed',\n borderWidth: 'px',\n borderStyle: 'solid',\n color: 'brandPrimaryRed',\n backgroundColor: 'brandLightGray',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: `color-mix(in srgb, ${vars.colors.brandPrimaryRed} 8%, transparent)`,\n color: vars.colors.brandSecondaryOrange,\n borderColor: vars.colors.brandSecondaryOrange,\n },\n },\n },\n]);\n"],"mappings":""}
1
+ {"version":3,"file":"loginPage.css.js","names":[],"sources":["../../../../src/auth/login/loginPage.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { vars } from '@plumile/ui/theme/themeContract.js';\n\nexport const stack = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const formSurface = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n width: 'full',\n});\n\nexport const helper = sprinkles({\n color: 'brandDarkGray',\n fontSize: 'sm',\n margin: 0,\n lineHeight: 1.6,\n});\n\nexport const divider = sprinkles({\n alignItems: 'center',\n color: 'brandDarkGray',\n display: 'flex',\n gap: 2,\n marginTop: 5,\n marginBottom: 3,\n});\n\nexport const dividerLine = sprinkles({\n backgroundColor: 'brandPrimaryRed',\n height: 'px',\n flex: 1,\n borderRadius: 'full',\n opacity: 35,\n});\n\nexport const actionsRow = sprinkles({\n alignItems: 'center',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 3,\n justifyContent: 'space-between',\n marginTop: 3,\n});\n\nexport const inlineLink = style([\n sprinkles({\n color: 'brandPrimaryRed',\n fontWeight: 'semibold',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n background: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'none',\n ':hover': {\n color: vars.colors.brandSecondaryOrange,\n textDecoration: 'underline',\n },\n },\n]);\n\nexport const panel = sprinkles({\n borderTopLeftRadius: 'none',\n borderTopRightRadius: 'none',\n borderBottomLeftRadius: '2xl',\n borderBottomRightRadius: '2xl',\n paddingX: 6,\n paddingY: 6,\n});\n\nexport const block = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const fullWidth = sprinkles({\n width: 'full',\n});\n\nexport const panelTitle = sprinkles({\n margin: 0,\n fontSize: 'xl',\n fontWeight: 'bold',\n color: 'brandPrimaryRed',\n letterSpacing: 'tight',\n});\n\nexport const footer = sprinkles({\n marginTop: 4,\n});\n\nexport const brandGhostButton = style([\n sprinkles({\n borderColor: 'brandPrimaryRed',\n borderWidth: 'px',\n borderStyle: 'solid',\n color: 'brandPrimaryRed',\n backgroundColor: 'brandLightGray',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: `color-mix(in srgb, ${vars.colors.brandPrimaryRed} 8%, transparent)`,\n color: vars.colors.brandSecondaryOrange,\n borderColor: vars.colors.brandSecondaryOrange,\n },\n },\n },\n]);\n"],"mappings":""}