@plumile/backoffice-react 0.2.3 → 0.2.6

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 (296) hide show
  1. package/README.md +14 -3
  2. package/lib/esm/auth/AuthRefreshNotice.js +21 -18
  3. package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
  4. package/lib/esm/auth/TotpQrCode.js +20 -12
  5. package/lib/esm/auth/TotpQrCode.js.map +1 -1
  6. package/lib/esm/auth/authRefreshNotice.css.js +2 -1
  7. package/lib/esm/auth/authRefreshNotice.css.js.map +1 -1
  8. package/lib/esm/auth/login/AuthPanel.js.map +1 -1
  9. package/lib/esm/auth/login/EmailCapturePanel.js +26 -28
  10. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  11. package/lib/esm/auth/login/LoginFlow.js +11 -11
  12. package/lib/esm/auth/login/LoginFlow.js.map +1 -1
  13. package/lib/esm/auth/login/MethodChooser.js +18 -16
  14. package/lib/esm/auth/login/MethodChooser.js.map +1 -1
  15. package/lib/esm/auth/login/MfaChallengeForm.js +47 -52
  16. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  17. package/lib/esm/auth/login/OidcButtons.js +3 -2
  18. package/lib/esm/auth/login/OidcButtons.js.map +1 -1
  19. package/lib/esm/auth/login/PasskeyLoginForm.js +13 -15
  20. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  21. package/lib/esm/auth/login/PasswordLoginPanel.js +8 -8
  22. package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
  23. package/lib/esm/auth/login/loginPage.css.js +1 -1
  24. package/lib/esm/auth/login/loginPage.css.js.map +1 -1
  25. package/lib/esm/auth/pages/AcceptInvitationScreen.js +80 -75
  26. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  27. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +31 -31
  28. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  29. package/lib/esm/auth/pages/PasswordResetRequestScreen.js +33 -29
  30. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  31. package/lib/esm/auth/pages/VerifyEmailScreen.js +42 -40
  32. package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
  33. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +202 -210
  34. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  35. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
  36. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js.map +1 -1
  37. package/lib/esm/components/backoffice/actions/toastViewAction.js.map +1 -1
  38. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +36 -30
  39. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
  40. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
  41. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js.map +1 -1
  42. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +36 -33
  43. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  44. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  45. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js +1 -1
  46. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
  47. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +24 -20
  48. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
  49. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  50. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
  51. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js +7 -8
  52. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
  53. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +49 -45
  54. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
  55. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
  56. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js.map +1 -1
  57. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
  58. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js.map +1 -1
  59. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
  60. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js.map +1 -1
  61. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
  62. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js.map +1 -1
  63. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
  64. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js.map +1 -1
  65. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
  66. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js.map +1 -1
  67. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
  68. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js.map +1 -1
  69. package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js +1 -1
  70. package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js.map +1 -1
  71. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +1 -1
  72. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
  73. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js +15 -15
  74. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
  75. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +53 -65
  76. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
  77. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
  78. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js.map +1 -1
  79. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
  80. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -1
  81. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +2 -2
  82. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js.map +1 -1
  83. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +6 -6
  84. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
  85. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
  86. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js.map +1 -1
  87. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
  88. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js.map +1 -1
  89. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +3 -3
  90. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  91. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
  92. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js.map +1 -1
  93. package/lib/esm/components/backoffice/layout/buildSidebarSections.js +152 -172
  94. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  95. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js +2 -5
  96. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
  97. package/lib/esm/components/backoffice/layout/sidebarUtils.js +1 -1
  98. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  99. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
  100. package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
  101. package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -1
  102. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
  103. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js.map +1 -1
  104. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js +1 -1
  105. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
  106. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
  107. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js.map +1 -1
  108. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +93 -82
  109. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  110. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
  111. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js.map +1 -1
  112. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
  113. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js.map +1 -1
  114. package/lib/esm/components/backoffice/routing/BackofficeContentError.js +6 -3
  115. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
  116. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js +7 -7
  117. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
  118. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
  119. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js.map +1 -1
  120. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
  121. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js.map +1 -1
  122. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
  123. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js.map +1 -1
  124. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +3 -2
  125. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -1
  126. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +314 -309
  127. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  128. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +1 -1
  129. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  130. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
  131. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js.map +1 -1
  132. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
  133. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js.map +1 -1
  134. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +2 -2
  135. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  136. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js +1 -1
  137. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
  138. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
  139. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js.map +1 -1
  140. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
  141. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js.map +1 -1
  142. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +12 -12
  143. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
  144. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +3 -2
  145. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
  146. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js +15 -19
  147. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
  148. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
  149. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -1
  150. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
  151. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js.map +1 -1
  152. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
  153. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js.map +1 -1
  154. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js +17 -9
  155. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js.map +1 -1
  156. package/lib/esm/hooks/useCopyToClipboard.js +1 -1
  157. package/lib/esm/hooks/useCopyToClipboard.js.map +1 -1
  158. package/lib/esm/i18n/locales/en/backofficeReact.js +21 -2
  159. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  160. package/lib/esm/i18n/locales/fr/backofficeReact.js +21 -2
  161. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  162. package/lib/esm/pages/BackofficeDashboardPage.js +42 -41
  163. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  164. package/lib/esm/pages/BackofficeDashboardWidgetContent.js +291 -255
  165. package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
  166. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +47 -49
  167. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  168. package/lib/esm/pages/BackofficeEntityDetailPage.js +111 -105
  169. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  170. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +213 -213
  171. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  172. package/lib/esm/pages/BackofficeEntityListDataPage.js +101 -83
  173. package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
  174. package/lib/esm/pages/BackofficeEntityListPage.helpers.js +10 -4
  175. package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
  176. package/lib/esm/pages/BackofficeEntityListPage.js +55 -54
  177. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  178. package/lib/esm/pages/BackofficeEntityListRouteContext.js.map +1 -1
  179. package/lib/esm/pages/BackofficeHubPage.js +1 -1
  180. package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
  181. package/lib/esm/pages/BackofficeLayoutPage.js +64 -56
  182. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  183. package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
  184. package/lib/esm/pages/backofficeDashboardPage.css.js.map +1 -1
  185. package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
  186. package/lib/esm/pages/backofficeEntityDetailPage.css.js.map +1 -1
  187. package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
  188. package/lib/esm/pages/backofficeEntityListPage.css.js.map +1 -1
  189. package/lib/esm/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -1
  190. package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js +11 -11
  191. package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
  192. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  193. package/lib/esm/provider/BackofficeProvider.js +41 -39
  194. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  195. package/lib/esm/router/createBackofficeRoutes.js +23 -23
  196. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  197. package/lib/esm/storybook/backofficeDashboardPageStory.css.js +6 -0
  198. package/lib/esm/storybook/backofficeDashboardPageStory.css.js.map +1 -0
  199. package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
  200. package/lib/esm/storybook/relay/RelayStory.css.js.map +1 -1
  201. package/lib/esm/style.css +1 -1
  202. package/lib/types/auth/AuthRefreshNotice.d.ts +5 -1
  203. package/lib/types/auth/AuthRefreshNotice.d.ts.map +1 -1
  204. package/lib/types/auth/TotpQrCode.d.ts +2 -1
  205. package/lib/types/auth/TotpQrCode.d.ts.map +1 -1
  206. package/lib/types/auth/authRefreshNotice.css.d.ts.map +1 -1
  207. package/lib/types/auth/login/AuthPanel.d.ts.map +1 -1
  208. package/lib/types/auth/login/EmailCapturePanel.d.ts.map +1 -1
  209. package/lib/types/auth/login/LoginFlow.d.ts.map +1 -1
  210. package/lib/types/auth/login/MethodChooser.d.ts.map +1 -1
  211. package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
  212. package/lib/types/auth/login/OidcButtons.d.ts.map +1 -1
  213. package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
  214. package/lib/types/auth/login/PasswordLoginPanel.d.ts +1 -1
  215. package/lib/types/auth/login/PasswordLoginPanel.d.ts.map +1 -1
  216. package/lib/types/auth/login/loginPage.css.d.ts.map +1 -1
  217. package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
  218. package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
  219. package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
  220. package/lib/types/auth/pages/VerifyEmailScreen.d.ts.map +1 -1
  221. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts +3 -3
  222. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  223. package/lib/types/components/backoffice/actions/toastViewAction.d.ts +1 -1
  224. package/lib/types/components/backoffice/actions/toastViewAction.d.ts.map +1 -1
  225. package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.d.ts +2 -1
  226. package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.d.ts.map +1 -1
  227. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +2 -2
  228. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  229. package/lib/types/components/backoffice/detail/BackofficeDetailBadgeRow.d.ts.map +1 -1
  230. package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts.map +1 -1
  231. package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts +1 -1
  232. package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts.map +1 -1
  233. package/lib/types/components/backoffice/detail/BackofficeTokenUsageBreakdown.d.ts.map +1 -1
  234. package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts +1 -1
  235. package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts.map +1 -1
  236. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts +1 -1
  237. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts.map +1 -1
  238. package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts.map +1 -1
  239. package/lib/types/components/backoffice/filters/backofficeFilterAction.css.d.ts.map +1 -1
  240. package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -1
  241. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts +0 -1
  242. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts.map +1 -1
  243. package/lib/types/components/backoffice/hub/backofficeHubTemplate.css.d.ts.map +1 -1
  244. package/lib/types/components/backoffice/layout/backofficeSidebarActions.css.d.ts.map +1 -1
  245. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +2 -2
  246. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
  247. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts +1 -1
  248. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts.map +1 -1
  249. package/lib/types/components/backoffice/list/RowFlagsCell.css.d.ts.map +1 -1
  250. package/lib/types/components/backoffice/overview/backofficeOverviewLayout.css.d.ts.map +1 -1
  251. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts +3 -3
  252. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  253. package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts.map +1 -1
  254. package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts.map +1 -1
  255. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.d.ts.map +1 -1
  256. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +2 -2
  257. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  258. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts +1 -1
  259. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts.map +1 -1
  260. package/lib/types/components/backoffice/shared/backofficeFilterableCell.css.d.ts.map +1 -1
  261. package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts.map +1 -1
  262. package/lib/types/components/backoffice/tools/BackofficeToolsJsonForm.d.ts.map +1 -1
  263. package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +1 -1
  264. package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts +1 -2
  265. package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts.map +1 -1
  266. package/lib/types/i18n/resources.d.ts +44 -2
  267. package/lib/types/i18n/resources.d.ts.map +1 -1
  268. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  269. package/lib/types/pages/BackofficeDashboardWidgetContent.d.ts.map +1 -1
  270. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
  271. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  272. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +1 -1
  273. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  274. package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -1
  275. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  276. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts +9 -9
  277. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
  278. package/lib/types/pages/BackofficeEntityListRouteContext.d.ts +2 -2
  279. package/lib/types/pages/BackofficeEntityListRouteContext.d.ts.map +1 -1
  280. package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
  281. package/lib/types/pages/backofficeEntityListPage.css.d.ts.map +1 -1
  282. package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts +1 -1
  283. package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts.map +1 -1
  284. package/lib/types/pages/detail/buildTabsItems.d.ts +1 -1
  285. package/lib/types/pages/detail/buildTabsItems.d.ts.map +1 -1
  286. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  287. package/lib/types/provider/types.d.ts +2 -0
  288. package/lib/types/provider/types.d.ts.map +1 -1
  289. package/lib/types/router/createBackofficeRoutes.d.ts +0 -1
  290. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  291. package/lib/types/storybook/backofficeDashboardPageStory.css.d.ts +2 -0
  292. package/lib/types/storybook/backofficeDashboardPageStory.css.d.ts.map +1 -0
  293. package/package.json +17 -17
  294. package/lib/esm/components/backoffice/technical/TechnicalIdentifierValue.js +0 -2
  295. package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts +0 -2
  296. package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts.map +0 -1
package/README.md CHANGED
@@ -71,6 +71,9 @@ packages.
71
71
  - `AuthRefreshNotice` keeps the backoffice session-refresh subscription and
72
72
  fixed positioning in this package, while delegating its visual notice surface
73
73
  to `InlineBanner` from `@plumile/ui`.
74
+ - `TotpQrCode` requires a localized `title` so the generated QR image has an
75
+ accessible name. The surrounding enrollment flow must also display the TOTP
76
+ secret as a manual alternative for users who cannot scan the image.
74
77
 
75
78
  ### Hooks and backoffice helpers
76
79
 
@@ -124,12 +127,15 @@ only helpers tied to backoffice mutations, connections, and typed data.
124
127
 
125
128
  Backoffice React no longer exports generic toolbar or detail-header wrappers.
126
129
  Use `BackofficeToolbar`, `BackofficeListFilterToolbar`,
127
- `BackofficeListFooter`, and `BackofficePageHeader` from `@plumile/ui` for
130
+ `BackofficeListFooter`, and `PageHeader` from `@plumile/ui` for
128
131
  visual composition. The entity-list scaffold delegates its filter trigger,
129
132
  active chips, searchable drawer, reset behavior, and session-scoped drawer
130
133
  state to `BackofficeListFilterToolbar`; this package keeps the backoffice
131
134
  integration layer focused on manifests, routing, permissions, Relay, filters,
132
- and i18n.
135
+ and i18n. The scaffold places its manual `BackofficeListFooter` inside the
136
+ active record-list or virtualized-table scroll viewport and keeps the automatic
137
+ IntersectionObserver sentinel separate, non-interactive, and hidden from the
138
+ accessibility tree.
133
139
 
134
140
  Backoffice React also no longer exports the old generic detail wrappers and
135
141
  aliases: `BackofficeDetailField`, `BackofficeDetailSection`,
@@ -145,7 +151,7 @@ were removed without compatibility wrappers; use `AuditTimeline` and
145
151
  `TimelineEventRow` from `@plumile/ui` for visual timelines. Use the canonical
146
152
  components instead: `CopyableText`, `DataTable`, `MetricCard`,
147
153
  `MetricTileGroup`, `DashboardPanel`, `DashboardMetricGroup`,
148
- `DashboardQuickActions`, `DashboardStatusList`, `BackofficeKeyValueList`,
154
+ `DashboardQuickActions`, `DashboardStatusList`, `PropertyList`,
149
155
  `BackofficeDetailField`, `BackofficeDetailSection`, `BackofficeScopeStack`,
150
156
  `BackofficeAuditMetadataPanel`, and `AuditTimeline` from `@plumile/ui`; direct
151
157
  React composition for empty/action/block wrappers; and
@@ -171,11 +177,16 @@ export function App(): JSX.Element {
171
177
  entityManifest={entityManifest}
172
178
  auth={auth}
173
179
  graphql={graphql}
180
+ theme={{ density: 'compact', defaultMode: 'system' }}
174
181
  />
175
182
  );
176
183
  }
177
184
  ```
178
185
 
186
+ `theme` configures the single `BackofficeThemeProvider` owned by
187
+ `BackofficeProvider`. It forwards mode, storage, theme classes, and density;
188
+ applications should not wrap the provider in a second backoffice theme scope.
189
+
179
190
  ## Instrumentation
180
191
 
181
192
  `BackofficeProvider` forwards router instrumentations to the internal
@@ -1,29 +1,32 @@
1
1
  import { root as e } from "./authRefreshNotice.css.js";
2
2
  import { useSyncExternalStore as t } from "react";
3
3
  import { addAuthRefreshStateListener as n, getAuthRefreshState as r } from "@plumile/auth/shortAccessToken.js";
4
- import { InlineBanner as i } from "@plumile/ui/components/feedback/InlineBanner.js";
5
- import { cx as a } from "@plumile/ui/theme/tools.js";
4
+ import { InlineBanner as i } from "@plumile/ui";
5
+ import { cx as a } from "@plumile/ui/theme";
6
6
  import { jsx as o } from "react/jsx-runtime";
7
7
  //#region src/auth/AuthRefreshNotice.tsx
8
8
  var s = (e) => n(() => {
9
9
  e();
10
- }), c = () => r(), l = () => t(s, c, c), u = ({ messages: t, className: n }) => {
11
- let r = l();
12
- return r.status === "temporarily_unavailable" ? /* @__PURE__ */ o(i, {
13
- tone: "warning",
14
- className: a(e, n),
15
- role: "status",
16
- ariaLive: "polite",
17
- children: t.temporarilyUnavailable
18
- }) : r.status === "session_expired" ? /* @__PURE__ */ o(i, {
19
- tone: "danger",
20
- className: a(e, n),
21
- role: "status",
22
- ariaLive: "polite",
23
- children: t.sessionExpired
24
- }) : null;
10
+ }), c = () => r(), l = () => t(s, c, c), u = ({ messages: t, className: n, state: r }) => r.status === "temporarily_unavailable" ? /* @__PURE__ */ o(i, {
11
+ tone: "warning",
12
+ className: a(e, n),
13
+ role: "status",
14
+ "aria-live": "polite",
15
+ children: t.temporarilyUnavailable
16
+ }) : r.status === "session_expired" ? /* @__PURE__ */ o(i, {
17
+ tone: "danger",
18
+ className: a(e, n),
19
+ role: "status",
20
+ "aria-live": "polite",
21
+ children: t.sessionExpired
22
+ }) : null, d = (e) => {
23
+ let t = l();
24
+ return /* @__PURE__ */ o(u, {
25
+ ...e,
26
+ state: t
27
+ });
25
28
  };
26
29
  //#endregion
27
- export { u as AuthRefreshNotice, u as default, l as useAuthRefreshStateSnapshot };
30
+ export { d as AuthRefreshNotice, d as default, u as AuthRefreshNoticeView, l as useAuthRefreshStateSnapshot };
28
31
 
29
32
  //# sourceMappingURL=AuthRefreshNotice.js.map
@@ -1 +1 @@
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 { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.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 <InlineBanner\n tone=\"warning\"\n className={cx(styles.root, className)}\n role=\"status\"\n ariaLive=\"polite\"\n >\n {messages.temporarilyUnavailable}\n </InlineBanner>\n );\n }\n\n if (state.status === 'session_expired') {\n return (\n <InlineBanner\n tone=\"danger\"\n className={cx(styles.root, className)}\n role=\"status\"\n ariaLive=\"polite\"\n >\n {messages.sessionExpired}\n </InlineBanner>\n );\n }\n\n return null;\n};\n\nexport default AuthRefreshNotice;\n"],"mappings":";;;;;;;AAsBA,IAAM,KAAa,MACV,QAAkC;CACvC,EAAc;AAChB,CAAC,GAGG,UACG,EAAoB,GAGhB,UACJ,EAAqB,GAAW,GAAa,CAAW,GAGpD,KAAqB,EAChC,aACA,mBACgD;CAChD,IAAM,IAAQ,EAA4B;CA4B1C,OA1BI,EAAM,WAAW,4BAEjB,kBAAC,GAAD;EACE,MAAK;EACL,WAAW,EAAG,GAAa,CAAS;EACpC,MAAK;EACL,UAAS;EAER,UAAA,EAAS;CACE,CAAA,IAId,EAAM,WAAW,oBAEjB,kBAAC,GAAD;EACE,MAAK;EACL,WAAW,EAAG,GAAa,CAAS;EACpC,MAAK;EACL,UAAS;EAER,UAAA,EAAS;CACE,CAAA,IAIX;AACT"}
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 { InlineBanner } from '@plumile/ui';\nimport { cx } from '@plumile/ui/theme';\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\ntype AuthRefreshNoticeViewProps = AuthRefreshNoticeProps & {\n state: AuthRefreshState;\n};\n\n/** Story- and test-facing deterministic view; not exported from the package. */\nexport const AuthRefreshNoticeView = ({\n messages,\n className,\n state,\n}: AuthRefreshNoticeViewProps): JSX.Element | null => {\n if (state.status === 'temporarily_unavailable') {\n return (\n <InlineBanner\n tone=\"warning\"\n className={cx(styles.root, className)}\n role=\"status\"\n aria-live=\"polite\"\n >\n {messages.temporarilyUnavailable}\n </InlineBanner>\n );\n }\n\n if (state.status === 'session_expired') {\n return (\n <InlineBanner\n tone=\"danger\"\n className={cx(styles.root, className)}\n role=\"status\"\n aria-live=\"polite\"\n >\n {messages.sessionExpired}\n </InlineBanner>\n );\n }\n\n return null;\n};\n\nexport const AuthRefreshNotice = (\n props: AuthRefreshNoticeProps,\n): JSX.Element | null => {\n const state = useAuthRefreshStateSnapshot();\n return <AuthRefreshNoticeView {...props} state={state} />;\n};\n\nexport default AuthRefreshNotice;\n"],"mappings":";;;;;;;AAsBA,IAAM,KAAa,MACV,QAAkC;CACvC,EAAc;AAChB,CAAC,GAGG,UACG,EAAoB,GAGhB,UACJ,EAAqB,GAAW,GAAa,CAAW,GAQpD,KAAyB,EACpC,aACA,cACA,eAEI,EAAM,WAAW,4BAEjB,kBAAC,GAAD;CACE,MAAK;CACL,WAAW,EAAG,GAAa,CAAS;CACpC,MAAK;CACL,aAAU;CAET,UAAA,EAAS;AACE,CAAA,IAId,EAAM,WAAW,oBAEjB,kBAAC,GAAD;CACE,MAAK;CACL,WAAW,EAAG,GAAa,CAAS;CACpC,MAAK;CACL,aAAU;CAET,UAAA,EAAS;AACE,CAAA,IAIX,MAGI,KACX,MACuB;CACvB,IAAM,IAAQ,EAA4B;CAC1C,OAAO,kBAAC,GAAD;EAAuB,GAAI;EAAc;CAAQ,CAAA;AAC1D"}
@@ -1,7 +1,12 @@
1
1
  import { jsx as e } from "react/jsx-runtime";
2
2
  import { QRCode as t } from "react-qr-code";
3
3
  //#region src/auth/TotpQrCode.tsx
4
- function n({ secret: e, issuer: t, accountName: n, algorithm: r = "SHA1", digits: i = 6, period: a = 30 }) {
4
+ var n = {
5
+ display: "block",
6
+ height: "auto",
7
+ maxWidth: "100%"
8
+ };
9
+ function r({ secret: e, issuer: t, accountName: n, algorithm: r = "SHA1", digits: i = 6, period: a = 30 }) {
5
10
  let o = n ?? t, s = new URLSearchParams({
6
11
  secret: e,
7
12
  issuer: t,
@@ -11,21 +16,24 @@ function n({ secret: e, issuer: t, accountName: n, algorithm: r = "SHA1", digits
11
16
  });
12
17
  return `otpauth://totp/${encodeURIComponent(o)}?${s.toString()}`;
13
18
  }
14
- var r = ({ secret: r, issuer: i, accountName: a, otpauthUrl: o, size: s = 220, algorithm: c, digits: l, period: u }) => {
15
- let d = o ?? n({
16
- secret: r,
17
- issuer: i,
18
- accountName: a,
19
- algorithm: c,
20
- digits: l,
21
- period: u
19
+ var i = ({ secret: i, issuer: a, accountName: o, title: s, otpauthUrl: c, size: l = 220, algorithm: u, digits: d, period: f }) => {
20
+ let p = c ?? r({
21
+ secret: i,
22
+ issuer: a,
23
+ accountName: o,
24
+ algorithm: u,
25
+ digits: d,
26
+ period: f
22
27
  });
23
28
  return /* @__PURE__ */ e(t, {
24
- value: d,
25
- size: s
29
+ value: p,
30
+ size: l,
31
+ title: s,
32
+ role: "img",
33
+ style: n
26
34
  });
27
35
  };
28
36
  //#endregion
29
- export { r as TotpQrCode, r as default, n as buildTotpOtpAuthUri };
37
+ export { i as TotpQrCode, i as default, r as buildTotpOtpAuthUri };
30
38
 
31
39
  //# sourceMappingURL=TotpQrCode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TotpQrCode.js","names":[],"sources":["../../../src/auth/TotpQrCode.tsx"],"sourcesContent":["import type { JSX } from 'react';\nimport { QRCode } from 'react-qr-code';\n\nexport type BuildTotpOtpAuthUriOptions = {\n secret: string;\n issuer: string;\n accountName?: string;\n algorithm?: string;\n digits?: number;\n period?: number;\n};\n\nexport type TotpQrCodeProps = BuildTotpOtpAuthUriOptions & {\n otpauthUrl?: string;\n size?: number;\n};\n\n/**\n *\n */\nexport function buildTotpOtpAuthUri({\n secret,\n issuer,\n accountName,\n algorithm = 'SHA1',\n digits = 6,\n period = 30,\n}: BuildTotpOtpAuthUriOptions): string {\n const label = accountName ?? issuer;\n const params = new URLSearchParams({\n secret,\n issuer,\n algorithm,\n digits: String(digits),\n period: String(period),\n });\n\n return `otpauth://totp/${encodeURIComponent(label)}?${params.toString()}`;\n}\n\nexport const TotpQrCode = ({\n secret,\n issuer,\n accountName,\n otpauthUrl,\n size = 220,\n algorithm,\n digits,\n period,\n}: TotpQrCodeProps): JSX.Element => {\n const otpAuthUri =\n otpauthUrl ??\n buildTotpOtpAuthUri({\n secret,\n issuer,\n accountName,\n algorithm,\n digits,\n period,\n });\n\n return <QRCode value={otpAuthUri} size={size} />;\n};\n\nexport default TotpQrCode;\n"],"mappings":";;;AAoBA,SAAgB,EAAoB,EAClC,WACA,WACA,gBACA,eAAY,QACZ,YAAS,GACT,YAAS,MAC4B;CACrC,IAAM,IAAQ,KAAe,GACvB,IAAS,IAAI,gBAAgB;EACjC;EACA;EACA;EACA,QAAQ,OAAO,CAAM;EACrB,QAAQ,OAAO,CAAM;CACvB,CAAC;CAED,OAAO,kBAAkB,mBAAmB,CAAK,EAAE,GAAG,EAAO,SAAS;AACxE;AAEA,IAAa,KAAc,EACzB,WACA,WACA,gBACA,eACA,UAAO,KACP,cACA,WACA,gBACkC;CAClC,IAAM,IACJ,KACA,EAAoB;EAClB;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAEH,OAAO,kBAAC,GAAD;EAAQ,OAAO;EAAkB;CAAO,CAAA;AACjD"}
1
+ {"version":3,"file":"TotpQrCode.js","names":[],"sources":["../../../src/auth/TotpQrCode.tsx"],"sourcesContent":["import type { CSSProperties, JSX } from 'react';\nimport { QRCode } from 'react-qr-code';\n\nconst responsiveQrCodeStyle: CSSProperties = {\n display: 'block',\n height: 'auto',\n maxWidth: '100%',\n};\n\nexport type BuildTotpOtpAuthUriOptions = {\n secret: string;\n issuer: string;\n accountName?: string;\n algorithm?: string;\n digits?: number;\n period?: number;\n};\n\nexport type TotpQrCodeProps = BuildTotpOtpAuthUriOptions & {\n /** Localized accessible name describing the QR code's purpose. */\n title: string;\n otpauthUrl?: string;\n size?: number;\n};\n\n/**\n *\n */\nexport function buildTotpOtpAuthUri({\n secret,\n issuer,\n accountName,\n algorithm = 'SHA1',\n digits = 6,\n period = 30,\n}: BuildTotpOtpAuthUriOptions): string {\n const label = accountName ?? issuer;\n const params = new URLSearchParams({\n secret,\n issuer,\n algorithm,\n digits: String(digits),\n period: String(period),\n });\n\n return `otpauth://totp/${encodeURIComponent(label)}?${params.toString()}`;\n}\n\nexport const TotpQrCode = ({\n secret,\n issuer,\n accountName,\n title,\n otpauthUrl,\n size = 220,\n algorithm,\n digits,\n period,\n}: TotpQrCodeProps): JSX.Element => {\n const otpAuthUri =\n otpauthUrl ??\n buildTotpOtpAuthUri({\n secret,\n issuer,\n accountName,\n algorithm,\n digits,\n period,\n });\n\n return (\n <QRCode\n value={otpAuthUri}\n size={size}\n title={title}\n role=\"img\"\n style={responsiveQrCodeStyle}\n />\n );\n};\n\nexport default TotpQrCode;\n"],"mappings":";;;AAGA,IAAM,IAAuC;CAC3C,SAAS;CACT,QAAQ;CACR,UAAU;AACZ;AAqBA,SAAgB,EAAoB,EAClC,WACA,WACA,gBACA,eAAY,QACZ,YAAS,GACT,YAAS,MAC4B;CACrC,IAAM,IAAQ,KAAe,GACvB,IAAS,IAAI,gBAAgB;EACjC;EACA;EACA;EACA,QAAQ,OAAO,CAAM;EACrB,QAAQ,OAAO,CAAM;CACvB,CAAC;CAED,OAAO,kBAAkB,mBAAmB,CAAK,EAAE,GAAG,EAAO,SAAS;AACxE;AAEA,IAAa,KAAc,EACzB,WACA,WACA,gBACA,UACA,eACA,UAAO,KACP,cACA,WACA,gBACkC;CAClC,IAAM,IACJ,KACA,EAAoB;EAClB;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAEH,OACE,kBAAC,GAAD;EACE,OAAO;EACD;EACC;EACP,MAAK;EACL,OAAO;CACR,CAAA;AAEL"}
@@ -1,5 +1,6 @@
1
+ /* empty css */
1
2
  //#region src/auth/authRefreshNotice.css.ts
2
- var e = "txvbqbjvh txvbqb2bm txvbqb1ih txvbqbjxf txvbqb164 txvbqbcqt txvbqbblp txvbqbc05 txvbqb18o";
3
+ var e = "tc0xii0 txvbqbk67 txvbqb2mc txvbqb1iu txvbqb1lg txvbqb16f txvbqbbwf txvbqbcav txvbqb191";
3
4
  //#endregion
4
5
  export { e as root };
5
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"authRefreshNotice.css.js","names":[],"sources":["../../../src/auth/authRefreshNotice.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n position: 'fixed',\n zIndex: 50,\n left: 4,\n right: 4,\n bottom: 4,\n maxWidth: 720,\n marginX: 'auto',\n marginY: 0,\n boxShadow: 'lg',\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, vars } from '@plumile/ui/theme';\n\nexport const root = style([\n sprinkles({\n position: 'fixed',\n zIndex: 50,\n insetInlineStart: 4,\n insetInlineEnd: 4,\n bottom: 4,\n marginX: 'auto',\n marginY: 0,\n boxShadow: 'lg',\n }),\n {\n width: 'auto',\n maxWidth: vars.maxWidth[720],\n },\n]);\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPanel.js","names":[],"sources":["../../../../src/auth/login/AuthPanel.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n title?: string;\n description?: string;\n children: ReactNode;\n footer?: ReactNode;\n};\n\nexport const AuthPanel = ({\n title,\n description,\n children,\n footer,\n}: Props): JSX.Element => {\n return (\n <div className={styles.panel}>\n <div className={styles.block}>\n {title != null ? <h2 className={styles.panelTitle}>{title}</h2> : null}\n {description != null ? (\n <p className={styles.helper}>{description}</p>\n ) : null}\n {children}\n {footer != null ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n </div>\n );\n};\n\nexport default AuthPanel;\n"],"mappings":";;;AAYA,IAAa,KAAa,EACxB,UACA,gBACA,aACA,QAAA,QAGE,kBAAC,OAAD;CAAK,WAAW;CACd,UAAA,kBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA;GACG,KAAS,OAAwD,OAAjD,kBAAC,MAAD;IAAI,WAAW;IAAoB,UAAA;GAAU,CAAA;GAC7D,KAAe,OAEZ,OADF,kBAAC,KAAD;IAAG,WAAW;IAAgB,UAAA;GAAe,CAAA;GAE9C;GACA,KAAU,OAAuD,OAAhD,kBAAC,OAAD;IAAK,WAAW;IAAgB,UAAA;GAAY,CAAA;EAC3D;;AACF,CAAA"}
1
+ {"version":3,"file":"AuthPanel.js","names":[],"sources":["../../../../src/auth/login/AuthPanel.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n title?: string;\n description?: string;\n children: ReactNode;\n footer?: ReactNode;\n};\n\nexport const AuthPanel = ({\n title,\n description,\n children,\n footer,\n}: Props): JSX.Element => {\n return (\n <div className={styles.panel}>\n <div className={styles.block}>\n {title != null ? <h2 className={styles.panelTitle}>{title}</h2> : null}\n {description != null ? (\n <p className={styles.helper}>{description}</p>\n ) : null}\n {children}\n {footer != null ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n </div>\n );\n};\n\nexport default AuthPanel;\n"],"mappings":";;;AAWA,IAAa,KAAa,EACxB,UACA,gBACA,aACA,QAAA,QAGE,kBAAC,OAAD;CAAK,WAAW;CACd,UAAA,kBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA;GACG,KAAS,OAAwD,OAAjD,kBAAC,MAAD;IAAI,WAAW;IAAoB,UAAA;GAAU,CAAA;GAC7D,KAAe,OAEZ,OADF,kBAAC,KAAD;IAAG,WAAW;IAAgB,UAAA;GAAe,CAAA;GAE9C;GACA,KAAU,OAAuD,OAAhD,kBAAC,OAAD;IAAK,WAAW;IAAgB,UAAA;GAAY,CAAA;EAC3D;;AACF,CAAA"}
@@ -2,56 +2,54 @@ 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 { 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";
5
+ import { Form as s, FormField as c } from "@plumile/ui";
6
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
+ import { Button as d } from "@plumile/ui/button";
10
8
  //#region src/auth/login/EmailCapturePanel.tsx
11
- var p = ({ email: p, errorMessage: m, isLoading: h, onEmailChange: g, onContinue: _, onForgotPassword: v }) => {
12
- let { t: y } = a(), b = o((e) => {
13
- e.preventDefault(), _();
14
- }, [_]);
15
- return /* @__PURE__ */ s(i, { children: /* @__PURE__ */ c(f, {
9
+ var f = ({ email: f, errorMessage: p, isLoading: m, onEmailChange: h, onContinue: g, onForgotPassword: _ }) => {
10
+ let { t: v } = a(), y = o((e) => {
11
+ e.preventDefault(), g();
12
+ }, [g]);
13
+ return /* @__PURE__ */ l(i, { children: /* @__PURE__ */ u(s, {
16
14
  className: t,
17
- onSubmit: b,
15
+ onSubmit: y,
18
16
  initialFocus: "first-form-control",
19
17
  children: [
20
- /* @__PURE__ */ s("p", {
18
+ /* @__PURE__ */ l("p", {
21
19
  className: n,
22
- children: y("auth.emailCapture.description")
20
+ children: v("auth.emailCapture.description")
23
21
  }),
24
- m != null && /* @__PURE__ */ s(u, { children: m }),
25
- /* @__PURE__ */ s(d, {
26
- label: y("auth.emailCapture.emailLabel"),
22
+ /* @__PURE__ */ l(c, {
23
+ label: v("auth.emailCapture.emailLabel"),
24
+ error: p,
27
25
  name: "email",
28
26
  type: "email",
29
- value: p,
27
+ value: f,
30
28
  onChange: (e) => {
31
- g(e.target.value);
29
+ h(e.target.value);
32
30
  },
33
- placeholder: y("auth.emailCapture.emailPlaceholder"),
31
+ placeholder: v("auth.emailCapture.emailPlaceholder"),
34
32
  autoComplete: "email",
35
33
  required: !0
36
34
  }),
37
- /* @__PURE__ */ c("div", {
35
+ /* @__PURE__ */ u("div", {
38
36
  className: e,
39
- children: [/* @__PURE__ */ s(l, {
37
+ children: [/* @__PURE__ */ l(d, {
40
38
  type: "submit",
41
- variant: "primary",
42
- isLoading: h,
43
- children: y("auth.emailCapture.continue")
44
- }), /* @__PURE__ */ s("button", {
39
+ variant: "solid",
40
+ loading: m,
41
+ children: v("auth.emailCapture.continue")
42
+ }), /* @__PURE__ */ l("button", {
45
43
  type: "button",
46
44
  className: r,
47
- onClick: v,
48
- children: y("auth.emailCapture.forgotPassword")
45
+ onClick: _,
46
+ children: v("auth.emailCapture.forgotPassword")
49
47
  })]
50
48
  })
51
49
  ]
52
50
  }) });
53
51
  };
54
52
  //#endregion
55
- export { p as EmailCapturePanel };
53
+ export { f as EmailCapturePanel };
56
54
 
57
55
  //# sourceMappingURL=EmailCapturePanel.js.map
@@ -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 } 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,EAA8B,GACtC,IAAe,GAClB,MAAsC;EAErC,AADA,EAAM,eAAe,GACrB,EAAW;CACb,GACA,CAAC,CAAU,CACb;CAEA,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,WAAW;EACX,UAAU;EACV,cAAa;EAHf,UAAA;GAKE,kBAAC,KAAD;IAAG,WAAW;IAAgB,UAAA,EAAE,+BAA+B;GAAK,CAAA;GACnE,KAAgB,QAAQ,kBAAC,GAAD,EAAA,UAAY,EAAwB,CAAA;GAC7D,kBAAC,GAAD;IACE,OAAO,EAAE,8BAA8B;IACvC,MAAK;IACL,MAAK;IACL,OAAO;IACP,WAAW,MAAU;KACnB,EAAc,EAAM,OAAO,KAAK;IAClC;IACA,aAAa,EAAE,oCAAoC;IACnD,cAAa;IACb,UAAA;GACD,CAAA;GACD,kBAAC,OAAD;IAAK,WAAW;IAAhB,UAAA,CACE,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAqB;KAChD,UAAA,EAAE,4BAA4B;IACzB,CAAA,GACR,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,SAAS;KAER,UAAA,EAAE,kCAAkC;IAC/B,CAAA,CACL;;EACD;CACG,CAAA,EAAA,CAAA;AAEf"}
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/button';\nimport { FormField, Form } 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 <FormField\n label={t('auth.emailCapture.emailLabel')}\n error={errorMessage}\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=\"solid\" loading={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":";;;;;;;;AAkBA,IAAa,KAAqB,EAChC,UACA,iBACA,cACA,kBACA,eACA,0BACwB;CACxB,IAAM,EAAE,SAAM,EAA8B,GACtC,IAAe,GAClB,MAAsC;EAErC,AADA,EAAM,eAAe,GACrB,EAAW;CACb,GACA,CAAC,CAAU,CACb;CAEA,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,WAAW;EACX,UAAU;EACV,cAAa;EAHf,UAAA;GAKE,kBAAC,KAAD;IAAG,WAAW;IAAgB,UAAA,EAAE,+BAA+B;GAAK,CAAA;GACpE,kBAAC,GAAD;IACE,OAAO,EAAE,8BAA8B;IACvC,OAAO;IACP,MAAK;IACL,MAAK;IACL,OAAO;IACP,WAAW,MAAU;KACnB,EAAc,EAAM,OAAO,KAAK;IAClC;IACA,aAAa,EAAE,oCAAoC;IACnD,cAAa;IACb,UAAA;GACD,CAAA;GACD,kBAAC,OAAD;IAAK,WAAW;IAAhB,UAAA,CACE,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,SAAS;KAC5C,UAAA,EAAE,4BAA4B;IACzB,CAAA,GACR,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,SAAS;KAER,UAAA,EAAE,kCAAkC;IAC/B,CAAA,CACL;;EACD;CACG,CAAA,EAAA,CAAA;AAEf"}
@@ -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 { jsx as f } from "react/jsx-runtime";
10
- import { AuthLayout as p } from "@plumile/ui/atomic/templates/auth_layout/AuthLayout.js";
9
+ import { AuthLayout as f } from "@plumile/ui";
10
+ import { jsx as p } from "react/jsx-runtime";
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(() => ({
@@ -17,7 +17,7 @@ var m = ({ auth: m, oidcProviders: h, onLoginSuccess: g, onForgotPassword: _ })
17
17
  return b(e), S(t.methods), w(t.lockedUntil), t;
18
18
  }
19
19
  }), [m]), N = s(({ force: e } = { force: !1 }) => {
20
- !e && m.nextStep === "TOTP" || g();
20
+ (e || m.nextStep !== "TOTP") && g();
21
21
  }, [m.nextStep, g]), P = m.nextStep === "TOTP" || T === "mfa", F = v(P ? "auth.loginFlow.title.mfa" : "auth.loginFlow.title.default"), I = v(P ? "auth.loginFlow.subtitle.mfa" : "auth.loginFlow.subtitle.default"), L = s(async (e) => {
22
22
  A(null);
23
23
  try {
@@ -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__ */ f(e, { children: /* @__PURE__ */ f(r, {
62
+ return R = P ? /* @__PURE__ */ p(e, { children: /* @__PURE__ */ p(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__ */ f(e, {
70
+ }) }) : T === "passkey" ? /* @__PURE__ */ p(e, {
71
71
  title: v("auth.loginFlow.passkey.title"),
72
72
  description: v("auth.loginFlow.passkey.description", { email: y }),
73
- children: /* @__PURE__ */ f(i, {
73
+ children: /* @__PURE__ */ p(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__ */ f(e, {
82
+ }) : T === "methods" ? /* @__PURE__ */ p(e, {
83
83
  title: v("auth.loginFlow.methods.title"),
84
- children: /* @__PURE__ */ f(a, {
84
+ children: /* @__PURE__ */ p(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__ */ f(o, {
99
+ }) : T === "password" ? /* @__PURE__ */ p(o, {
100
100
  auth: M,
101
101
  defaultEmail: y,
102
102
  onForgotPassword: _,
103
103
  onSuccess: N,
104
104
  providers: h
105
- }) : /* @__PURE__ */ f(n, {
105
+ }) : /* @__PURE__ */ p(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__ */ f(p, {
121
+ }), /* @__PURE__ */ p(f, {
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/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":"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"}
1
+ {"version":3,"file":"LoginFlow.js","names":[],"sources":["../../../../src/auth/login/LoginFlow.tsx"],"sourcesContent":["import {\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,42 +1,44 @@
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 { 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";
3
+ import { FormError as s } from "@plumile/ui";
4
+ import { cx as c } from "@plumile/ui/theme";
5
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
+ import { Trans as d } from "react-i18next";
7
+ import { Button as f } from "@plumile/ui/button";
8
8
  //#region src/auth/login/MethodChooser.tsx
9
9
  var p = ({ email: p, methods: m, lockedUntil: h, onSelect: g, onBack: _ }) => {
10
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) => {
11
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() });
12
- return /* @__PURE__ */ c(d, {
12
+ return /* @__PURE__ */ l(f, {
13
13
  type: "button",
14
- variant: "secondary",
14
+ variant: "soft",
15
15
  onClick: () => {
16
16
  g(t);
17
17
  },
18
- className: s(n, e),
18
+ className: c(n, e),
19
+ tone: "neutral",
19
20
  children: r
20
21
  }, t);
21
22
  });
22
- return /* @__PURE__ */ c("div", {
23
+ return /* @__PURE__ */ l("div", {
23
24
  className: t,
24
- children: /* @__PURE__ */ l("div", {
25
+ children: /* @__PURE__ */ u("div", {
25
26
  className: a,
26
27
  children: [
27
- /* @__PURE__ */ c("p", {
28
+ /* @__PURE__ */ l("p", {
28
29
  className: r,
29
- children: /* @__PURE__ */ c(u, {
30
+ children: /* @__PURE__ */ l(d, {
31
+ ns: "backofficeReact",
30
32
  i18nKey: "auth.methodChooser.prompt",
31
33
  values: { email: p },
32
- components: { strong: /* @__PURE__ */ c("strong", {}) }
34
+ components: { strong: /* @__PURE__ */ l("strong", {}) }
33
35
  })
34
36
  }),
35
- y ? /* @__PURE__ */ c(f, { children: b }) : null,
37
+ y ? /* @__PURE__ */ l(s, { children: b }) : null,
36
38
  y ? null : x,
37
- /* @__PURE__ */ c(d, {
39
+ /* @__PURE__ */ l(f, {
38
40
  type: "button",
39
- variant: "text",
41
+ variant: "plain",
40
42
  onClick: _,
41
43
  className: i,
42
44
  children: v("auth.methodChooser.actions.back")
@@ -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 } 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,EAA8B,GACtC,IAAW,EAAQ,WAAW,GAC9B,IACJ,KAAe,OAIX,EAAE,2BAA2B,IAH7B,EAAE,qCAAqC,EACrC,MAAM,IAAI,KAAK,CAAW,CAAC,CAAC,eAAe,EAC7C,CAAC,GAGD,IAAgB,EAAQ,KAAK,MAAW;EAC5C,IAAM,IACJ,MAAW,YACP,EAAE,oCAAoC,IACtC,MAAW,aACT,EAAE,qCAAqC,IACvC,EAAE,oCAAoC,EACpC,QAAQ,EAAO,YAAY,EAC7B,CAAC;EACT,OACE,kBAAC,GAAD;GAEE,MAAK;GACL,SAAQ;GACR,eAAe;IACb,EAAS,CAAM;GACjB;GACA,WAAW,EAAG,GAAkB,CAAuB;GAEtD,UAAA;EACK,GATD,CASC;CAEZ,CAAC;CAED,OACE,kBAAC,OAAD;EAAK,WAAW;EACd,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAhB,UAAA;IACE,kBAAC,KAAD;KAAG,WAAW;KACZ,UAAA,kBAAC,GAAD;MACE,SAAQ;MACR,QAAQ,EAAE,SAAM;MAChB,YAAY,EAAE,QAAQ,kBAAC,UAAD,CAAS,CAAA,EAAE;KAClC,CAAA;IACA,CAAA;IACF,IAAW,kBAAC,GAAD,EAAA,UAAY,EAAyB,CAAA,IAAI;IACnD,IAA2B,OAAhB;IACb,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,SAAS;KACT,WAAW;KAEV,UAAA,EAAE,iCAAiC;IAC9B,CAAA;GACL;;CACF,CAAA;AAET"}
1
+ {"version":3,"file":"MethodChooser.js","names":[],"sources":["../../../../src/auth/login/MethodChooser.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { Trans } from 'react-i18next';\nimport { Button } from '@plumile/ui/button';\nimport { FormError } from '@plumile/ui';\nimport { cx } from '@plumile/ui/theme';\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=\"soft\"\n onClick={() => {\n onSelect(method);\n }}\n className={cx(styles.fullWidth, styles.brandGhostButton)}\n tone=\"neutral\"\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 ns=\"backofficeReact\"\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=\"plain\"\n onClick={onBack}\n className={styles.inlineLink}\n >\n {t('auth.methodChooser.actions.back')}\n </Button>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;AAmBA,IAAa,KAAiB,EAC5B,UACA,YACA,gBACA,aACA,gBACwB;CACxB,IAAM,EAAE,SAAM,EAA8B,GACtC,IAAW,EAAQ,WAAW,GAC9B,IACJ,KAAe,OAIX,EAAE,2BAA2B,IAH7B,EAAE,qCAAqC,EACrC,MAAM,IAAI,KAAK,CAAW,CAAC,CAAC,eAAe,EAC7C,CAAC,GAGD,IAAgB,EAAQ,KAAK,MAAW;EAC5C,IAAM,IACJ,MAAW,YACP,EAAE,oCAAoC,IACtC,MAAW,aACT,EAAE,qCAAqC,IACvC,EAAE,oCAAoC,EACpC,QAAQ,EAAO,YAAY,EAC7B,CAAC;EACT,OACE,kBAAC,GAAD;GAEE,MAAK;GACL,SAAQ;GACR,eAAe;IACb,EAAS,CAAM;GACjB;GACA,WAAW,EAAG,GAAkB,CAAuB;GACvD,MAAK;GAEJ,UAAA;EACK,GAVD,CAUC;CAEZ,CAAC;CAED,OACE,kBAAC,OAAD;EAAK,WAAW;EACd,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAhB,UAAA;IACE,kBAAC,KAAD;KAAG,WAAW;KACZ,UAAA,kBAAC,GAAD;MACE,IAAG;MACH,SAAQ;MACR,QAAQ,EAAE,SAAM;MAChB,YAAY,EAAE,QAAQ,kBAAC,UAAD,CAAS,CAAA,EAAE;KAClC,CAAA;IACA,CAAA;IACF,IAAW,kBAAC,GAAD,EAAA,UAAY,EAAyB,CAAA,IAAI;IACnD,IAA2B,OAAhB;IACb,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,SAAS;KACT,WAAW;KAEV,UAAA,EAAE,iCAAiC;IAC9B,CAAA;GACL;;CACF,CAAA;AAET"}