@vertesia/ui 1.4.0-dev.20260615.051508Z → 1.4.0-dev.20260629.130134Z

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 (337) hide show
  1. package/lib/core/components/shadcn/dropdown.d.ts.map +1 -1
  2. package/lib/core/components/shadcn/dropdown.js +6 -2
  3. package/lib/core/components/shadcn/dropdown.js.map +1 -1
  4. package/lib/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  5. package/lib/core/components/shadcn/filters/filterBar.js +9 -2
  6. package/lib/core/components/shadcn/filters/filterBar.js.map +1 -1
  7. package/lib/core/components/shadcn/modal/ConfirmModal.d.ts +16 -1
  8. package/lib/core/components/shadcn/modal/ConfirmModal.d.ts.map +1 -1
  9. package/lib/core/components/shadcn/modal/ConfirmModal.js +25 -3
  10. package/lib/core/components/shadcn/modal/ConfirmModal.js.map +1 -1
  11. package/lib/core/components/shadcn/modal/dialog.js +1 -1
  12. package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
  13. package/lib/core/components/shadcn/popover.d.ts.map +1 -1
  14. package/lib/core/components/shadcn/popover.js +3 -1
  15. package/lib/core/components/shadcn/popover.js.map +1 -1
  16. package/lib/core/components/shadcn/switch.js +3 -3
  17. package/lib/core/components/shadcn/switch.js.map +1 -1
  18. package/lib/core/components/shadcn/tabs.js +1 -1
  19. package/lib/core/components/shadcn/tabs.js.map +1 -1
  20. package/lib/core/components/shadcn/tooltip.d.ts.map +1 -1
  21. package/lib/core/components/shadcn/tooltip.js +3 -1
  22. package/lib/core/components/shadcn/tooltip.js.map +1 -1
  23. package/lib/env/index.d.ts +0 -19
  24. package/lib/env/index.d.ts.map +1 -1
  25. package/lib/env/index.js +0 -6
  26. package/lib/env/index.js.map +1 -1
  27. package/lib/features/agent/PayloadBuilder.d.ts +4 -0
  28. package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
  29. package/lib/features/agent/PayloadBuilder.js +16 -0
  30. package/lib/features/agent/PayloadBuilder.js.map +1 -1
  31. package/lib/features/agent/chat/AgentApprovalModeSelector.d.ts +10 -0
  32. package/lib/features/agent/chat/AgentApprovalModeSelector.d.ts.map +1 -0
  33. package/lib/features/agent/chat/AgentApprovalModeSelector.js +50 -0
  34. package/lib/features/agent/chat/AgentApprovalModeSelector.js.map +1 -0
  35. package/lib/features/agent/chat/AgentChatFixtureReplay.d.ts +2 -1
  36. package/lib/features/agent/chat/AgentChatFixtureReplay.d.ts.map +1 -1
  37. package/lib/features/agent/chat/AgentChatFixtureReplay.js +3 -3
  38. package/lib/features/agent/chat/AgentChatFixtureReplay.js.map +1 -1
  39. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts +5 -2
  40. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
  41. package/lib/features/agent/chat/AgentRequestInputOverlay.js +41 -7
  42. package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
  43. package/lib/features/agent/chat/AgentRightPanel.d.ts.map +1 -1
  44. package/lib/features/agent/chat/AgentRightPanel.js +133 -12
  45. package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
  46. package/lib/features/agent/chat/AnimatedThinkingDots.js +1 -1
  47. package/lib/features/agent/chat/AnimatedThinkingDots.js.map +1 -1
  48. package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
  49. package/lib/features/agent/chat/ArtifactsTab.js +11 -65
  50. package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
  51. package/lib/features/agent/chat/AskUserWidget.d.ts +3 -1
  52. package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
  53. package/lib/features/agent/chat/AskUserWidget.js +4 -3
  54. package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
  55. package/lib/features/agent/chat/ModernAgentConversation.d.ts +10 -2
  56. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  57. package/lib/features/agent/chat/ModernAgentConversation.js +526 -117
  58. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  59. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts +8 -0
  60. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts.map +1 -0
  61. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js +19 -0
  62. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js.map +1 -0
  63. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +8 -2
  64. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  65. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +551 -92
  66. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  67. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
  68. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +7 -6
  69. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
  70. package/lib/features/agent/chat/ModernAgentOutput/Header.js +2 -2
  71. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  72. package/lib/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.d.ts +8 -0
  73. package/lib/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.d.ts.map +1 -0
  74. package/lib/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.js +61 -0
  75. package/lib/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.js.map +1 -0
  76. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +15 -2
  77. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
  78. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +28 -38
  79. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  80. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +1 -1
  81. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  82. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +3 -2
  83. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  84. package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js +2 -1
  85. package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js.map +1 -1
  86. package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js +1 -1
  87. package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js.map +1 -1
  88. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts +5 -0
  89. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
  90. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +59 -4
  91. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
  92. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +2 -2
  93. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
  94. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +9 -0
  95. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
  96. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +180 -0
  97. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
  98. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts +6 -0
  99. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
  100. package/lib/features/agent/chat/ModernAgentOutput/utils.js +92 -2
  101. package/lib/features/agent/chat/ModernAgentOutput/utils.js.map +1 -1
  102. package/lib/features/agent/chat/clipboardFiles.d.ts +15 -0
  103. package/lib/features/agent/chat/clipboardFiles.d.ts.map +1 -0
  104. package/lib/features/agent/chat/clipboardFiles.js +35 -0
  105. package/lib/features/agent/chat/clipboardFiles.js.map +1 -0
  106. package/lib/features/agent/chat/hooks/useAgentStream.d.ts +6 -0
  107. package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
  108. package/lib/features/agent/chat/hooks/useAgentStream.js +218 -37
  109. package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
  110. package/lib/features/agent/chat/hooks/useArtifacts.d.ts +1 -8
  111. package/lib/features/agent/chat/hooks/useArtifacts.d.ts.map +1 -1
  112. package/lib/features/agent/chat/hooks/useArtifacts.js +10 -28
  113. package/lib/features/agent/chat/hooks/useArtifacts.js.map +1 -1
  114. package/lib/features/agent/chat/index.d.ts +2 -1
  115. package/lib/features/agent/chat/index.d.ts.map +1 -1
  116. package/lib/features/agent/chat/index.js +2 -1
  117. package/lib/features/agent/chat/index.js.map +1 -1
  118. package/lib/features/agent/chat/workstreams.d.ts +1 -0
  119. package/lib/features/agent/chat/workstreams.d.ts.map +1 -1
  120. package/lib/features/agent/chat/workstreams.js +28 -0
  121. package/lib/features/agent/chat/workstreams.js.map +1 -1
  122. package/lib/features/facets/AgentRunnerFacetsNav.d.ts +10 -1
  123. package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
  124. package/lib/features/facets/AgentRunnerFacetsNav.js +6 -3
  125. package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
  126. package/lib/features/facets/CollectionsFacetsNav.d.ts +10 -1
  127. package/lib/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
  128. package/lib/features/facets/CollectionsFacetsNav.js +14 -5
  129. package/lib/features/facets/CollectionsFacetsNav.js.map +1 -1
  130. package/lib/features/facets/PromptsFacetsNav.d.ts +10 -1
  131. package/lib/features/facets/PromptsFacetsNav.d.ts.map +1 -1
  132. package/lib/features/facets/PromptsFacetsNav.js +14 -5
  133. package/lib/features/facets/PromptsFacetsNav.js.map +1 -1
  134. package/lib/features/facets/RunsFacetsNav.d.ts +10 -1
  135. package/lib/features/facets/RunsFacetsNav.d.ts.map +1 -1
  136. package/lib/features/facets/RunsFacetsNav.js +14 -5
  137. package/lib/features/facets/RunsFacetsNav.js.map +1 -1
  138. package/lib/features/index.d.ts +0 -1
  139. package/lib/features/index.d.ts.map +1 -1
  140. package/lib/features/index.js +0 -1
  141. package/lib/features/index.js.map +1 -1
  142. package/lib/features/oauth/McpConnectionsButton.d.ts +30 -0
  143. package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -0
  144. package/lib/features/oauth/McpConnectionsButton.js +70 -0
  145. package/lib/features/oauth/McpConnectionsButton.js.map +1 -0
  146. package/lib/features/oauth/McpConnectionsDialog.d.ts +25 -0
  147. package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -0
  148. package/lib/features/oauth/McpConnectionsDialog.js +26 -0
  149. package/lib/features/oauth/McpConnectionsDialog.js.map +1 -0
  150. package/lib/features/oauth/RemoteMcpConnectionButton.d.ts.map +1 -1
  151. package/lib/features/oauth/RemoteMcpConnectionButton.js +14 -6
  152. package/lib/features/oauth/RemoteMcpConnectionButton.js.map +1 -1
  153. package/lib/features/oauth/index.d.ts +3 -0
  154. package/lib/features/oauth/index.d.ts.map +1 -1
  155. package/lib/features/oauth/index.js +3 -0
  156. package/lib/features/oauth/index.js.map +1 -1
  157. package/lib/features/oauth/useMcpConnections.d.ts +44 -0
  158. package/lib/features/oauth/useMcpConnections.d.ts.map +1 -0
  159. package/lib/features/oauth/useMcpConnections.js +168 -0
  160. package/lib/features/oauth/useMcpConnections.js.map +1 -0
  161. package/lib/features/permissions/UserPermissionsProvider.d.ts +4 -6
  162. package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
  163. package/lib/features/permissions/UserPermissionsProvider.js +40 -42
  164. package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
  165. package/lib/features/store/objects/DocumentPreviewPanel.d.ts.map +1 -1
  166. package/lib/features/store/objects/DocumentPreviewPanel.js +2 -1
  167. package/lib/features/store/objects/DocumentPreviewPanel.js.map +1 -1
  168. package/lib/features/store/objects/DocumentQuickFilter.d.ts +23 -0
  169. package/lib/features/store/objects/DocumentQuickFilter.d.ts.map +1 -0
  170. package/lib/features/store/objects/DocumentQuickFilter.js +30 -0
  171. package/lib/features/store/objects/DocumentQuickFilter.js.map +1 -0
  172. package/lib/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  173. package/lib/features/store/objects/DocumentSearchResults.js +17 -1
  174. package/lib/features/store/objects/DocumentSearchResults.js.map +1 -1
  175. package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  176. package/lib/features/store/objects/components/ContentOverview.js +17 -74
  177. package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
  178. package/lib/features/store/objects/layout/DocumentTableColumn.d.ts +7 -1
  179. package/lib/features/store/objects/layout/DocumentTableColumn.d.ts.map +1 -1
  180. package/lib/features/store/objects/layout/DocumentTableColumn.js +27 -3
  181. package/lib/features/store/objects/layout/DocumentTableColumn.js.map +1 -1
  182. package/lib/features/store/objects/layout/documentLayout.js +1 -1
  183. package/lib/features/store/objects/layout/renderers.d.ts +2 -1
  184. package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
  185. package/lib/features/store/objects/layout/renderers.js +27 -20
  186. package/lib/features/store/objects/layout/renderers.js.map +1 -1
  187. package/lib/features/store/types/ContentObjectTypesSearch.d.ts.map +1 -1
  188. package/lib/features/store/types/ContentObjectTypesSearch.js +4 -1
  189. package/lib/features/store/types/ContentObjectTypesSearch.js.map +1 -1
  190. package/lib/features/store/types/ContentObjectTypesTable.d.ts +2 -1
  191. package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
  192. package/lib/features/store/types/ContentObjectTypesTable.js +8 -3
  193. package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
  194. package/lib/i18n/instance.d.ts.map +1 -1
  195. package/lib/i18n/instance.js +1 -0
  196. package/lib/i18n/instance.js.map +1 -1
  197. package/lib/i18n/locales/ar.json +72 -45
  198. package/lib/i18n/locales/de.json +65 -34
  199. package/lib/i18n/locales/en.json +63 -47
  200. package/lib/i18n/locales/es.json +65 -35
  201. package/lib/i18n/locales/fr.json +65 -35
  202. package/lib/i18n/locales/it.json +72 -42
  203. package/lib/i18n/locales/ja.json +72 -41
  204. package/lib/i18n/locales/ko.json +72 -41
  205. package/lib/i18n/locales/pt.json +72 -42
  206. package/lib/i18n/locales/ru.json +72 -43
  207. package/lib/i18n/locales/tr.json +72 -41
  208. package/lib/i18n/locales/zh-TW.json +72 -41
  209. package/lib/i18n/locales/zh.json +72 -41
  210. package/lib/session/UserSession.d.ts +0 -6
  211. package/lib/session/UserSession.d.ts.map +1 -1
  212. package/lib/session/UserSession.js +0 -15
  213. package/lib/session/UserSession.js.map +1 -1
  214. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  215. package/lib/session/UserSessionProvider.js +39 -98
  216. package/lib/session/UserSessionProvider.js.map +1 -1
  217. package/lib/session/auth/composable.d.ts.map +1 -1
  218. package/lib/session/auth/composable.js +3 -33
  219. package/lib/session/auth/composable.js.map +1 -1
  220. package/lib/shell/login/SignInPrimitives.d.ts.map +1 -1
  221. package/lib/shell/login/SignInPrimitives.js +3 -2
  222. package/lib/shell/login/SignInPrimitives.js.map +1 -1
  223. package/lib/vertesia-ui-core.js +1 -1
  224. package/lib/vertesia-ui-core.js.map +1 -1
  225. package/lib/vertesia-ui-env.js +1 -1
  226. package/lib/vertesia-ui-env.js.map +1 -1
  227. package/lib/vertesia-ui-features.js +1 -1
  228. package/lib/vertesia-ui-features.js.map +1 -1
  229. package/lib/vertesia-ui-i18n.js +1 -1
  230. package/lib/vertesia-ui-i18n.js.map +1 -1
  231. package/lib/vertesia-ui-session.js +1 -1
  232. package/lib/vertesia-ui-session.js.map +1 -1
  233. package/lib/vertesia-ui-shell.js +1 -1
  234. package/lib/vertesia-ui-shell.js.map +1 -1
  235. package/lib/vertesia-ui-widgets.js +1 -1
  236. package/lib/vertesia-ui-widgets.js.map +1 -1
  237. package/lib/widgets/schema-editor/editor/Editable.js +1 -1
  238. package/lib/widgets/schema-editor/editor/Editable.js.map +1 -1
  239. package/llms.txt +70 -70
  240. package/package.json +35 -32
  241. package/src/core/components/shadcn/dropdown.tsx +2 -0
  242. package/src/core/components/shadcn/filters/filterBar.tsx +9 -2
  243. package/src/core/components/shadcn/modal/ConfirmModal.tsx +65 -3
  244. package/src/core/components/shadcn/modal/dialog.tsx +1 -1
  245. package/src/core/components/shadcn/popover.tsx +1 -0
  246. package/src/core/components/shadcn/switch.tsx +4 -4
  247. package/src/core/components/shadcn/tabs.tsx +1 -1
  248. package/src/core/components/shadcn/tooltip.tsx +1 -0
  249. package/src/env/index.ts +0 -24
  250. package/src/features/agent/PayloadBuilder.tsx +18 -0
  251. package/src/features/agent/chat/AgentApprovalModeSelector.tsx +130 -0
  252. package/src/features/agent/chat/AgentChatFixtureReplay.test.tsx +22 -2
  253. package/src/features/agent/chat/AgentChatFixtureReplay.tsx +33 -27
  254. package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +122 -0
  255. package/src/features/agent/chat/AgentRequestInputOverlay.tsx +91 -17
  256. package/src/features/agent/chat/AgentRightPanel.tsx +238 -50
  257. package/src/features/agent/chat/AnimatedThinkingDots.tsx +1 -1
  258. package/src/features/agent/chat/ArtifactsTab.tsx +21 -155
  259. package/src/features/agent/chat/AskUserWidget.tsx +6 -2
  260. package/src/features/agent/chat/ModernAgentConversation.test.tsx +1157 -47
  261. package/src/features/agent/chat/ModernAgentConversation.tsx +703 -136
  262. package/src/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.tsx +74 -0
  263. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +1420 -126
  264. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +934 -111
  265. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +31 -40
  266. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +28 -28
  267. package/src/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.tsx +83 -0
  268. package/src/features/agent/chat/ModernAgentOutput/MessageInput.test.tsx +38 -2
  269. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +121 -98
  270. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +7 -1
  271. package/src/features/agent/chat/ModernAgentOutput/SlideInPanel.tsx +3 -3
  272. package/src/features/agent/chat/ModernAgentOutput/SlidingMessages.tsx +1 -1
  273. package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +82 -2
  274. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +2 -2
  275. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +216 -0
  276. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +149 -0
  277. package/src/features/agent/chat/ModernAgentOutput/utils.ts +103 -2
  278. package/src/features/agent/chat/clipboardFiles.ts +33 -0
  279. package/src/features/agent/chat/hooks/useAgentStream.test.tsx +355 -4
  280. package/src/features/agent/chat/hooks/useAgentStream.ts +270 -43
  281. package/src/features/agent/chat/hooks/useArtifacts.ts +11 -44
  282. package/src/features/agent/chat/index.ts +10 -1
  283. package/src/features/agent/chat/workstreams.ts +42 -0
  284. package/src/features/facets/AgentRunnerFacetsNav.tsx +23 -3
  285. package/src/features/facets/CollectionsFacetsNav.tsx +30 -5
  286. package/src/features/facets/PromptsFacetsNav.tsx +30 -5
  287. package/src/features/facets/RunsFacetsNav.tsx +32 -5
  288. package/src/features/index.ts +0 -1
  289. package/src/features/oauth/McpConnectionsButton.test.tsx +248 -0
  290. package/src/features/oauth/McpConnectionsButton.tsx +269 -0
  291. package/src/features/oauth/McpConnectionsDialog.tsx +142 -0
  292. package/src/features/oauth/RemoteMcpConnectionButton.tsx +37 -14
  293. package/src/features/oauth/index.ts +3 -0
  294. package/src/features/oauth/useMcpConnections.test.ts +94 -0
  295. package/src/features/oauth/useMcpConnections.ts +210 -0
  296. package/src/features/permissions/UserPermissionsProvider.tsx +41 -59
  297. package/src/features/store/objects/DocumentPreviewPanel.tsx +4 -2
  298. package/src/features/store/objects/DocumentQuickFilter.tsx +72 -0
  299. package/src/features/store/objects/DocumentSearchResults.tsx +30 -11
  300. package/src/features/store/objects/components/ContentOverview.tsx +30 -99
  301. package/src/features/store/objects/layout/DocumentTableColumn.tsx +29 -4
  302. package/src/features/store/objects/layout/documentLayout.tsx +1 -1
  303. package/src/features/store/objects/layout/renderers.tsx +80 -20
  304. package/src/features/store/types/ContentObjectTypesSearch.tsx +7 -1
  305. package/src/features/store/types/ContentObjectTypesTable.tsx +34 -4
  306. package/src/i18n/instance.ts +1 -0
  307. package/src/i18n/locales/ar.json +72 -45
  308. package/src/i18n/locales/de.json +65 -34
  309. package/src/i18n/locales/en.json +63 -47
  310. package/src/i18n/locales/es.json +65 -35
  311. package/src/i18n/locales/fr.json +65 -35
  312. package/src/i18n/locales/it.json +72 -42
  313. package/src/i18n/locales/ja.json +72 -41
  314. package/src/i18n/locales/ko.json +72 -41
  315. package/src/i18n/locales/pt.json +72 -42
  316. package/src/i18n/locales/ru.json +72 -43
  317. package/src/i18n/locales/tr.json +72 -41
  318. package/src/i18n/locales/zh-TW.json +72 -41
  319. package/src/i18n/locales/zh.json +72 -41
  320. package/src/i18n/rtl.test.ts +57 -1
  321. package/src/session/UserSession.ts +0 -16
  322. package/src/session/UserSessionProvider.tsx +51 -123
  323. package/src/session/auth/composable.ts +3 -34
  324. package/src/shell/login/SignInPrimitives.tsx +3 -2
  325. package/src/widgets/schema-editor/editor/Editable.tsx +1 -1
  326. package/lib/features/document-viewer/UniversalDocumentViewer.d.ts +0 -73
  327. package/lib/features/document-viewer/UniversalDocumentViewer.d.ts.map +0 -1
  328. package/lib/features/document-viewer/UniversalDocumentViewer.js +0 -415
  329. package/lib/features/document-viewer/UniversalDocumentViewer.js.map +0 -1
  330. package/lib/features/document-viewer/index.d.ts +0 -2
  331. package/lib/features/document-viewer/index.d.ts.map +0 -1
  332. package/lib/features/document-viewer/index.js +0 -2
  333. package/lib/features/document-viewer/index.js.map +0 -1
  334. package/src/features/document-viewer/UniversalDocumentViewer.test.tsx +0 -123
  335. package/src/features/document-viewer/UniversalDocumentViewer.tsx +0 -746
  336. package/src/features/document-viewer/index.ts +0 -1
  337. package/src/session/auth/composable.test.ts +0 -79
@@ -1 +1 @@
1
- {"version":3,"file":"vertesia-ui-shell.js","sources":["shell/apps/AppInstallationProvider.js","shell/apps/AppProjectSelector.js","shell/apps/StandaloneApp.js","shell/login/InviteAcceptModal.js","shell/login/SignInIcons.js","shell/login/SignInPrimitives.js","shell/login/signInUtils.js","shell/login/SignInAuthPending.js","shell/login/SignInEmailStep.js","shell/login/SignInProvidersStep.js","shell/login/SignInReturningStep.js","shell/login/SignInTenantBlockedStep.js","shell/login/SignInWithProviderButton.js","shell/login/SignInTenantStep.js","shell/login/SignupForm.js","shell/login/SigninScreen.js","shell/login/TerminalLogin.js","shell/login/SignInModal.js","shell/login/UserInfo.js","shell/login/UserSessionMenu.js","shell/utils.js","shell/SplashScreen.js","shell/VertesiaShell.js"],"sourcesContent":["import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createContext, useContext } from 'react';\nexport const AppInstallationContext = createContext(null);\nexport function AppInstallationProvider({ installation, children, }) {\n return _jsx(AppInstallationContext.Provider, { value: installation, children: children });\n}\n/**\n * Get the current app installation obejct when called in an app context otheriwse returns null\n */\nexport function useAppInstallation() {\n return useContext(AppInstallationContext);\n}\n//# sourceMappingURL=AppInstallationProvider.js.map","import { jsxs as _jsxs, jsx as _jsx } from \"react/jsx-runtime\";\nimport { errorMessage, SelectBox, useFetch } from '@vertesia/ui/core';\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY, useUserSession } from '@vertesia/ui/session';\nimport { useState } from 'react';\nexport function AppProjectSelector({ app, onChange, placeholder }) {\n const { client, project } = useUserSession();\n const { data: projects, error } = useFetch(() => {\n return client.apps.getAppInstallationProjects(app);\n }, [app.id, app.name]);\n const _onChange = (project) => {\n if (onChange) {\n if (!onChange(project)) {\n // if onChange returns true then the defualt on change is called\n return;\n }\n }\n // default on change\n localStorage.setItem(LastSelectedAccountId_KEY, project.account);\n localStorage.setItem(`${LastSelectedProjectId_KEY}-${project.account}`, project.id);\n window.location.reload();\n };\n if (error) {\n return _jsxs(\"span\", { className: \"text-red-600\", children: [\"Error: failed to fetch projects: \", errorMessage(error)] });\n }\n return (_jsx(SelectProject, { placeholder: placeholder, initialValue: project?.id, projects: projects || [], onChange: _onChange }));\n}\nfunction SelectProject({ initialValue, projects, onChange, placeholder = 'Select Project', }) {\n const [value, setValue] = useState();\n const _onChange = (value) => {\n setValue(value);\n onChange(value);\n };\n const actualValue = !value && initialValue ? projects.find((p) => p.id === initialValue) : value;\n return (_jsx(SelectBox, { by: \"id\", value: actualValue, options: projects, optionLabel: (option) => option.name, placeholder: placeholder, onChange: _onChange }));\n}\n//# sourceMappingURL=AppProjectSelector.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Center, SelectBox, useFetch } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY, useUserSession } from '@vertesia/ui/session';\nimport { LockIcon } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { AppInstallationProvider } from './AppInstallationProvider';\nexport function StandaloneApp({ name, AccessDenied = AccessDeniedMessage, children }) {\n return name ? (_jsx(StandaloneAppImpl, { name: name, AccessDenied: AccessDenied, children: children })) : (_jsx(UnknownAppName, {}));\n}\nexport function StandaloneAppImpl({ name, AccessDenied = AccessDeniedMessage, children }) {\n const { authToken, client } = useUserSession();\n const [installation, setInstallation] = useState(null);\n const [state, setState] = useState('loading');\n useEffect(() => {\n if (!authToken) {\n setState('loading');\n }\n else {\n const isAppVisible = authToken.apps.includes(name);\n if (isAppVisible) {\n client.apps.getAppInstallationByName(name).then((inst) => {\n if (!inst) {\n console.log(`App ${name} not found!`);\n setState('error');\n }\n else {\n setState('loaded');\n setInstallation(inst);\n }\n });\n }\n else {\n setState('error');\n }\n }\n }, [name, authToken, client.apps.getAppInstallationByName]);\n if (state === 'loading') {\n return null;\n }\n else if (state === 'error') {\n return _jsx(AccessDenied, { name: name });\n }\n else if (installation) {\n return _jsx(AppInstallationProvider, { installation: installation, children: children });\n }\n}\nfunction AccessDeniedMessage({ name }) {\n const { project, accounts, client } = useUserSession();\n const { t } = useUITranslation();\n const [selectedAccountId, setSelectedAccountId] = useState();\n // Fetch all projects where the app is installed across all organizations\n const { data: allProjects } = useFetch(() => {\n return client.apps.getAppInstallationProjects({ name });\n }, [name]);\n // Group projects by organization\n const { projectsByOrg, orgOptions } = useMemo(() => {\n if (!allProjects || !accounts)\n return { projectsByOrg: {}, orgOptions: [] };\n const grouped = {};\n for (const p of allProjects) {\n if (!grouped[p.account]) {\n grouped[p.account] = [];\n }\n grouped[p.account].push(p);\n }\n // Only show orgs that have projects with the app installed\n const orgsWithProjects = accounts.filter((a) => grouped[a.id]?.length > 0);\n return { projectsByOrg: grouped, orgOptions: orgsWithProjects };\n }, [allProjects, accounts]);\n // Auto-select first org if not selected\n useEffect(() => {\n if (!selectedAccountId && orgOptions.length > 0) {\n setSelectedAccountId(orgOptions[0].id);\n }\n }, [orgOptions, selectedAccountId]);\n const onProjectChange = (selected) => {\n localStorage.setItem(LastSelectedAccountId_KEY, selected.account);\n localStorage.setItem(`${LastSelectedProjectId_KEY}-${selected.account}`, selected.id);\n window.location.reload();\n };\n const filteredProjects = selectedAccountId ? projectsByOrg[selectedAccountId] || [] : [];\n const selectedOrg = orgOptions.find((a) => a.id === selectedAccountId);\n return (_jsxs(Center, { className: \"pt-10 flex flex-col items-center text-center text-gray-700\", children: [_jsx(LockIcon, { className: \"w-10 h-10 mb-4 text-gray-500\" }), _jsx(\"div\", { className: \"text-xl font-semibold\", children: t('shell.accessDenied') }), _jsxs(\"div\", { className: \"mt-2 text-sm text-gray-500\", children: [\"You don't have permission to view the \", _jsx(\"span\", { className: \"font-semibold\", children: name }), \" app in project:\", ' ', _jsxs(\"span\", { className: \"font-semibold\", children: [\"\\u00AB\", project?.name, \"\\u00BB\"] }), \".\"] }), orgOptions.length === 0 && allProjects !== undefined && (_jsx(\"div\", { className: \"mt-4 text-sm text-gray-500\", children: \"This app is not installed in any project you have access to.\" })), orgOptions.length > 0 && (_jsxs(\"div\", { className: \"mt-4 flex flex-row gap-4 items-end\", children: [orgOptions.length > 1 && (_jsxs(\"div\", { children: [_jsx(\"div\", { className: \"text-sm text-gray-500 mb-2\", children: t('shell.organization') }), _jsx(SelectBox, { by: \"id\", value: selectedOrg, options: orgOptions, optionLabel: (option) => option.name, placeholder: t('shell.selectOrganization'), onChange: (org) => setSelectedAccountId(org.id) })] })), _jsxs(\"div\", { children: [orgOptions.length > 1 && (_jsx(\"div\", { className: \"text-sm text-gray-500 mb-2\", children: t('login.terminal.project') })), _jsx(SelectBox, { by: \"id\", value: undefined, options: filteredProjects, optionLabel: (option) => option.name, placeholder: t('shell.selectProject'), onChange: onProjectChange })] })] }))] }));\n}\nfunction UnknownAppName() {\n const { t } = useUITranslation();\n return (_jsxs(Center, { className: \"pt-10 flex flex-col items-center text-center text-gray-700\", children: [_jsx(LockIcon, { className: \"w-10 h-10 mb-4 text-gray-500\" }), _jsx(\"div\", { className: \"text-xl font-semibold\", children: t('shell.applicationNotRegistered') }), _jsxs(\"div\", { className: \"mt-2 text-sm text-gray-500\", children: [\"Before starting to code a Vertesia application you must register an application manifest in Vertesia Studio then install it in one or more projects.\", _jsx(\"p\", {}), \"Then use the created app name as a parameter to\", ' ', _jsx(\"code\", { children: \"<StandaloneApp name=\\\"your-app-name\\\">\" }), \" in the \", _jsx(\"code\", { children: \"src/main.tsx\" }), \" file.\"] })] }));\n}\n//# sourceMappingURL=StandaloneApp.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Modal, ModalBody, ModalTitle } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useEffect, useState } from 'react';\nexport function InviteAcceptModal() {\n const session = useUserSession();\n const { client } = session;\n const { t } = useUITranslation();\n const [showModal, setShowModal] = useState(false);\n const [invites, setInvites] = useState([]);\n useEffect(() => {\n client.account\n .listInvites()\n .then((invites) => {\n if (invites.length > 0) {\n // Filter out legacy invites that do not have account data\n const notLegacyInvites = invites.filter((i) => i.data.account);\n if (notLegacyInvites.length === 0) {\n console.log('No valid invites found, closing modal');\n return;\n }\n // If we have valid invites, show the modal\n console.log('Found valid invites', notLegacyInvites.length);\n setShowModal(true);\n setInvites(notLegacyInvites);\n }\n else {\n console.log('No invites found, closing modal');\n setShowModal(false);\n }\n })\n .catch((err) => {\n console.error('Error fetching invites', err);\n });\n }, [client.account.listInvites]);\n const closeModal = () => setShowModal(false);\n const accept = async (invite) => {\n await client.account.acceptInvite(invite.id);\n await session.authCallback;\n await session.fetchAccounts();\n await session.fetchProjects(invite.data.account.id);\n const remainingInvites = invites.filter((i) => i.id !== invite.id);\n const notLegacyInvites = remainingInvites.filter((i) => i.data.account);\n if (notLegacyInvites.length > 0) {\n setInvites(notLegacyInvites);\n }\n else {\n closeModal();\n }\n };\n const reject = async (invite) => {\n await client.account.rejectInvite(invite.id);\n const remainingInvites = invites.filter((i) => i.id !== invite.id);\n setInvites(remainingInvites);\n if (remainingInvites.length === 0) {\n closeModal();\n }\n };\n const inviteList = invites.map((invite) => {\n if (!invite.data.account) {\n console.warn('Invite has no account data', invite);\n return null; // Skip rendering this invite\n }\n return (_jsxs(\"div\", { className: \"flex flex-row w-full justify-between border rounded-sm px-2 py-2 \", children: [_jsxs(\"div\", { className: \"flex flex-col\", children: [_jsx(\"div\", { className: \"w-full font-semibold\", children: invite.data.account.name ?? invite.data.account }), invite.data.project && _jsxs(\"div\", { className: \"w-full text-base\", children: [\"- \", invite.data.project.name] }), _jsxs(\"div\", { className: \"text-xs\", children: [\"Role: \", invite.data.role] }), invite.data.invited_by && (_jsxs(\"div\", { className: \"text-xs\", children: [\"by \", invite.data.invited_by.name ?? invite.data.invited_by] }))] }), _jsxs(\"div\", { className: \"flex flex-col gap-4\", children: [_jsx(Button, { size: 'xs', onClick: () => accept(invite), children: t('login.accept') }), ' ', _jsx(Button, { size: 'xs', variant: \"secondary\", onClick: () => reject(invite), children: t('login.reject') })] })] }, invite.id));\n });\n return (_jsx(\"div\", { children: _jsxs(Modal, { isOpen: showModal, onClose: closeModal, children: [_jsx(ModalTitle, { children: t('login.reviewInvites') }), _jsxs(ModalBody, { children: [_jsx(\"div\", { className: \"text-sm pb-4\", children: \"You have received the following invites to join other accounts. Please review and accept or declined them.\" }), inviteList] })] }) }));\n}\n//# sourceMappingURL=InviteAcceptModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { LockKeyhole } from 'lucide-react';\nexport function GoogleIcon(props) {\n return (_jsxs(\"svg\", { viewBox: \"0 0 48 48\", \"aria-hidden\": \"true\", ...props, children: [_jsx(\"path\", { fill: \"#FFC107\", d: \"M43.6 20.5H42V20H24v8h11.3c-1.6 4.7-6.1 8-11.3 8a12 12 0 0 1 0-24c3 0 5.8 1.1 7.9 3l5.7-5.7A20 20 0 1 0 24 44c11 0 20-9 20-20 0-1.2-.1-2.3-.4-3.5z\" }), _jsx(\"path\", { fill: \"#FF3D00\", d: \"M6.3 14.7l6.6 4.8A12 12 0 0 1 24 12c3 0 5.8 1.1 7.9 3l5.7-5.7A20 20 0 0 0 6.3 14.7z\" }), _jsx(\"path\", { fill: \"#4CAF50\", d: \"M24 44c5.2 0 10-2 13.6-5.2l-6.3-5.3A12 12 0 0 1 12.7 28.5l-6.6 5.1A20 20 0 0 0 24 44z\" }), _jsx(\"path\", { fill: \"#1976D2\", d: \"M43.6 20.5H42V20H24v8h11.3a12 12 0 0 1-4 5.5l6.3 5.3C37.9 36.6 44 31 44 24c0-1.2-.1-2.3-.4-3.5z\" })] }));\n}\nexport function GithubIcon(props) {\n return (_jsx(\"svg\", { viewBox: \"0 0 24 24\", \"aria-hidden\": \"true\", ...props, children: _jsx(\"path\", { fill: \"currentColor\", fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M12 2C6.48 2 2 6.58 2 12.25c0 4.54 2.87 8.39 6.84 9.75.5.09.68-.22.68-.49v-1.7c-2.78.62-3.37-1.36-3.37-1.36-.46-1.18-1.11-1.5-1.11-1.5-.91-.63.07-.62.07-.62 1 .07 1.53 1.05 1.53 1.05.89 1.57 2.34 1.12 2.91.86.09-.66.35-1.12.63-1.38-2.22-.26-4.56-1.14-4.56-5.07 0-1.12.39-2.03 1.03-2.75-.1-.26-.45-1.3.1-2.7 0 0 .84-.28 2.76 1.05A9.4 9.4 0 0 1 12 7.07c.85 0 1.71.12 2.51.34 1.91-1.33 2.75-1.05 2.75-1.05.55 1.4.2 2.44.1 2.7.64.72 1.03 1.63 1.03 2.75 0 3.94-2.34 4.81-4.57 5.06.36.32.68.94.68 1.9v2.81c0 .27.18.59.69.49C19.13 20.64 22 16.78 22 12.25 22 6.58 17.52 2 12 2z\" }) }));\n}\nexport function MicrosoftIcon(props) {\n return (_jsxs(\"svg\", { viewBox: \"0 0 24 24\", \"aria-hidden\": \"true\", ...props, children: [_jsx(\"path\", { fill: \"#F25022\", d: \"M2 2h9.5v9.5H2z\" }), _jsx(\"path\", { fill: \"#7FBA00\", d: \"M12.5 2H22v9.5h-9.5z\" }), _jsx(\"path\", { fill: \"#00A4EF\", d: \"M2 12.5h9.5V22H2z\" }), _jsx(\"path\", { fill: \"#FFB900\", d: \"M12.5 12.5H22V22h-9.5z\" })] }));\n}\n// Generic lock for OIDC/unknown (no brand glyph).\nexport const OidcIcon = LockKeyhole;\n/** Provider → brand icon. */\nexport const PROVIDER_ICONS = {\n google: GoogleIcon,\n github: GithubIcon,\n microsoft: MicrosoftIcon,\n oidc: OidcIcon,\n};\nexport function providerIcon(provider) {\n if (provider && provider in PROVIDER_ICONS)\n return PROVIDER_ICONS[provider];\n return OidcIcon;\n}\n//# sourceMappingURL=SignInIcons.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n// Stateless visual primitives shared by the sign-in steps.\nimport { Button } from '@vertesia/ui/core';\nimport { ArrowRight, Mail } from 'lucide-react';\nimport { providerIcon } from './SignInIcons';\nexport function SignInStepLayout({ children, centered = false }) {\n return (_jsx(\"div\", { className: centered\n ? 'w-full max-w-[420px] flex flex-col gap-6 items-center text-center'\n : 'w-full max-w-[420px] flex flex-col gap-6', children: children }));\n}\nexport function SignInStepHeader({ eyebrow, title, body, variant = 'info' }) {\n const eyebrowColor = variant === 'destructive' ? 'text-destructive' : 'text-info';\n return (_jsxs(\"div\", { children: [eyebrow && _jsx(\"div\", { className: `${eyebrowColor} text-[12.5px] font-medium mb-2`, children: eyebrow }), _jsx(\"h1\", { className: \"text-foreground text-[22px] font-semibold tracking-tight leading-tight mb-1.5\", children: title }), body && _jsx(\"p\", { className: \"text-muted text-sm leading-relaxed\", children: body })] }));\n}\n// ─── Buttons ────────────────────────────────────────────────────────────────\nconst SIGNIN_STEP_BUTTON_BASE = 'cursor-pointer inline-flex items-center justify-center text-sm font-medium transition';\nconst SIGNIN_STEP_BUTTON_VARIANTS = {\n // Filled CTA; greys out when disabled.\n primary: 'h-[42px] gap-2.5 rounded-md bg-foreground text-background hover:opacity-90 ' +\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n // Non-interactive primary kept at full opacity (spinner reads as active).\n loading: 'h-[42px] gap-2.5 rounded-md bg-foreground text-background opacity-90',\n // Flat text link.\n ghost: 'h-9 text-muted hover:text-foreground',\n};\n/** Button used across the sign-in steps. */\nexport function SignInStepButton({ variant = 'primary', className = '', type = 'button', disabled, ...rest }) {\n return (_jsx(Button, { variant: \"unstyled\", size: \"none\", type: type, \n // loading is always non-interactive.\n disabled: variant === 'loading' ? true : disabled, className: `${SIGNIN_STEP_BUTTON_BASE} ${SIGNIN_STEP_BUTTON_VARIANTS[variant]} ${className}`.trim(), ...rest }));\n}\n/** Compact inline text link for info rows (\"Change\", \"Not you?\"). */\nexport function SignInInlineLinkButton({ size = 'xs', className = '', type = 'button', ...rest }) {\n // `!` overrides beat the Button base's text-sm/rounded-md defaults.\n const sizeClass = size === 'smaller' ? '!text-[11px]' : '!text-xs';\n const base = `cursor-pointer ${sizeClass} text-muted hover:text-foreground !transition px-2 py-1 ` +\n '!rounded underline decoration-transparent hover:decoration-current underline-offset-[3px]';\n return (_jsx(Button, { variant: \"unstyled\", size: \"none\", type: type, className: className ? `${base} ${className}` : base, ...rest }));\n}\n// ─── Badges & avatars ────────────────────────────────────────────────────────\nconst INITIALS_BADGE_SHAPES = {\n // Round user avatar, with a ring.\n circle: 'size-9 rounded-full text-sm ring-4 ring-background ring-offset-1 ring-offset-border',\n // Square org chip.\n square: 'size-[30px] rounded-md text-[11px]',\n};\n/** Initials in a colored chip — a round user avatar or a square org chip. */\nexport function SignInInitialsBadge({ initials, shape = 'circle' }) {\n return (_jsx(\"span\", { className: `bg-info text-info-foreground grid place-items-center font-semibold shrink-0 ${INITIALS_BADGE_SHAPES[shape]}`, children: initials }));\n}\n/** Rounded tile framing a provider/status icon. */\nexport function SignInIconBadge({ children }) {\n return (_jsx(\"div\", { className: \"inline-grid place-items-center size-14 rounded-xl bg-info-background border border-info/15 mb-3.5\", children: children }));\n}\n/** Title over a secondary line; fills the row beside a badge or avatar. */\nexport function SignInIdentityLines({ title, subtitle, titleClass, subtitleClass }) {\n return (_jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [_jsx(\"div\", { className: titleClass, children: title }), _jsx(\"div\", { className: subtitleClass, children: subtitle })] }));\n}\n// Two-row panel layout, tuned per usage. `tenant`: org card with a square badge;\n// `returning`: smaller returning-user card with a round avatar.\nconst ACCOUNT_CARD_VARIANTS = {\n tenant: {\n topRow: 'flex items-center gap-2.5 px-3 py-2.5',\n title: 'text-[13.5px] font-semibold text-foreground leading-tight',\n subtitle: 'text-[11.5px] text-muted leading-tight mt-0.5',\n bottomRow: 'flex items-center gap-2.5 px-3 py-1.5 border-t border-border bg-muted-background',\n mailBox: 'size-[30px] grid place-items-center shrink-0',\n mailIcon: 'size-4 text-muted',\n email: 'text-sm text-foreground/80 flex-1 truncate',\n actionSize: 'xs',\n },\n returning: {\n topRow: 'flex items-center gap-3 px-3.5 py-2.5',\n title: 'text-sm font-semibold text-foreground truncate',\n subtitle: 'text-xs text-foreground/80 truncate',\n bottomRow: 'flex items-center gap-3 px-3.5 py-1 border-t border-border bg-muted-background',\n mailBox: 'w-9 h-6 grid place-items-center shrink-0',\n mailIcon: 'size-3.5 text-muted',\n email: 'text-xs text-foreground/80 flex-1 truncate',\n actionSize: 'smaller',\n },\n};\n/** Identity (badge + title + subtitle) over an email row with a trailing action link. */\nexport function SignInAccountCard({ variant = 'returning', badge, title, subtitle, email, actionLabel, onAction, }) {\n const v = ACCOUNT_CARD_VARIANTS[variant];\n return (_jsxs(\"div\", { className: \"rounded-md border border-border bg-background overflow-hidden\", children: [_jsxs(\"div\", { className: v.topRow, children: [badge, _jsx(SignInIdentityLines, { title: title, subtitle: subtitle, titleClass: v.title, subtitleClass: v.subtitle })] }), _jsxs(\"div\", { className: v.bottomRow, children: [_jsx(\"div\", { className: v.mailBox, children: _jsx(Mail, { className: v.mailIcon }) }), _jsx(\"span\", { className: v.email, children: email }), _jsx(SignInInlineLinkButton, { size: v.actionSize, onClick: onAction, children: actionLabel })] })] }));\n}\n/** Single-row identity card: badge + title/subtitle + a trailing action link. */\nexport function SignInAccountRow({ badge, title, subtitle, actionLabel, onAction }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-3 px-3.5 py-2.5 rounded-md border border-border bg-muted-background\", children: [badge, _jsx(SignInIdentityLines, { title: title, subtitle: subtitle, titleClass: \"text-sm font-semibold text-foreground truncate\", subtitleClass: \"text-xs text-muted truncate\" }), _jsx(SignInInlineLinkButton, { onClick: onAction, children: actionLabel })] }));\n}\n/** Standalone bordered pill: mail icon + email + a trailing action link. */\nexport function SignInEmailRow({ email, actionLabel, onAction }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-2 px-3 py-2 rounded-md border border-border bg-muted-background\", children: [_jsx(Mail, { className: \"size-4 text-muted shrink-0\" }), _jsx(\"span\", { className: \"text-sm text-foreground/80 flex-1 truncate\", children: email }), _jsx(SignInInlineLinkButton, { onClick: onAction, children: actionLabel })] }));\n}\n/** \"Continue with <provider>\" button. */\nexport function SignInProviderButton({ provider, label, onClick, variant = 'outline' }) {\n const Icon = providerIcon(provider);\n if (variant === 'arrow') {\n // !size beats Button's [&_svg]:size-4 rule. Arrow fades in and nudges right on hover.\n const arrowClass = '!size-3.5 text-muted opacity-0 group-hover:opacity-100 group-hover:translate-x-0.5 transition';\n return (_jsxs(Button, { variant: \"unstyled\", size: \"none\", onClick: onClick, className: \"cursor-pointer group h-[42px] w-full inline-flex items-center gap-3 ps-3.5 pe-3 rounded-md border border-border bg-background text-sm font-medium text-foreground transition hover:bg-muted-background\", children: [_jsx(Icon, { className: \"!size-[18px] shrink-0\" }), _jsx(\"span\", { className: \"flex-1 text-start\", children: label }), _jsx(ArrowRight, { className: arrowClass })] }));\n }\n const variantClass = variant === 'filled' ? '!bg-foreground text-background hover:!bg-foreground/90' : 'hover:shadow-sm';\n return (_jsxs(Button, { variant: \"outline\", onClick: onClick, className: `w-full py-5 flex rounded-lg transition duration-150 text-center ${variantClass}`, children: [_jsx(Icon, { className: \"!size-[18px]\" }), _jsx(\"span\", { className: \"text-sm font-medium\", children: label })] }));\n}\n/** Destructive notice: icon + bold title over a muted meta line. */\nexport function SignInCallout({ icon: Icon, title, meta }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-2.5 px-3 py-2.5 rounded-md bg-destructive-background border border-destructive/20\", children: [_jsx(Icon, { className: \"size-5 text-destructive shrink-0\" }), _jsxs(\"div\", { className: \"flex-1 min-w-0 text-sm\", children: [_jsx(\"div\", { className: \"font-semibold text-destructive\", children: title }), _jsx(\"div\", { className: \"text-xs text-destructive/80\", children: meta })] })] }));\n}\n/** Horizontal rule with a centered label. */\nexport function SignInOrDivider({ children }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-3 my-2 text-muted-foreground text-[10.5px] uppercase tracking-widest\", children: [_jsx(\"div\", { className: \"flex-1 h-px bg-border\" }), _jsx(\"span\", { children: children }), _jsx(\"div\", { className: \"flex-1 h-px bg-border\" })] }));\n}\n/** Labeled email input with an inline validation message. */\nexport function SignInEmailField({ inputRef, label, placeholder, value, onChange, invalid = false, error, }) {\n return (_jsxs(\"div\", { className: \"flex flex-col gap-1.5\", children: [_jsx(\"label\", { htmlFor: \"vt-login-email\", className: \"text-xs font-medium text-foreground/80\", children: label }), _jsx(\"input\", { ref: inputRef, id: \"vt-login-email\", name: \"vt-login-email\", type: \"email\", className: \"h-[42px] px-3.5 rounded-md border border-border bg-background text-sm text-foreground placeholder:text-muted-foreground outline-none transition focus:border-info focus:ring-4 focus:ring-info/15 aria-[invalid=true]:border-destructive aria-[invalid=true]:ring-destructive/15\", placeholder: placeholder, value: value, onChange: (e) => onChange(e.target.value), \"aria-invalid\": invalid, autoComplete: \"off\", autoCorrect: \"off\", autoCapitalize: \"off\", spellCheck: false, \"data-1p-ignore\": true, \"data-lpignore\": \"true\", \"data-form-type\": \"other\" }), error && (_jsx(\"div\", { role: \"alert\", className: \"text-xs text-destructive\", children: error }))] }));\n}\n//# sourceMappingURL=SignInPrimitives.js.map","import { getFirebaseAuth, setFirebaseTenant } from '@vertesia/ui/session';\nimport { signOut as firebaseSignOut, GithubAuthProvider, GoogleAuthProvider, OAuthProvider, signInWithRedirect, } from 'firebase/auth';\nconst LAST_SUCCESSFUL_LOGIN_KEY = 'vt.lastSuccessfulLogin';\nconst PENDING_SIGNIN_KEY = 'vt.pendingSignin';\nexport function readLastSuccessfulLogin() {\n try {\n const raw = localStorage.getItem(LAST_SUCCESSFUL_LOGIN_KEY);\n if (!raw)\n return null;\n const v = JSON.parse(raw);\n if (!v?.email || !v?.lastProvider)\n return null;\n return v;\n }\n catch {\n return null;\n }\n}\nexport function writeLastSuccessfulLogin(s) {\n try {\n localStorage.setItem(LAST_SUCCESSFUL_LOGIN_KEY, JSON.stringify(s));\n }\n catch {\n // localStorage unavailable — the record is not persisted\n }\n}\nexport function clearLastSuccessfulLogin() {\n try {\n localStorage.removeItem(LAST_SUCCESSFUL_LOGIN_KEY);\n }\n catch {\n // ignore\n }\n}\nexport function readPendingSignin() {\n try {\n const raw = sessionStorage.getItem(PENDING_SIGNIN_KEY);\n return raw ? JSON.parse(raw) : null;\n }\n catch {\n return null;\n }\n}\nfunction writePendingSignin(p) {\n try {\n sessionStorage.setItem(PENDING_SIGNIN_KEY, JSON.stringify(p));\n }\n catch {\n // ignore\n }\n}\nexport function clearPendingSignin() {\n try {\n sessionStorage.removeItem(PENDING_SIGNIN_KEY);\n }\n catch {\n // ignore\n }\n}\n/**\n * Clears the persisted sign-in records (last-successful-login and pending) and\n * signs out of Firebase. Best-effort: sign-out errors (e.g. no active session)\n * are swallowed.\n */\nexport async function resetSignInState() {\n clearLastSuccessfulLogin();\n clearPendingSignin();\n try {\n await firebaseSignOut(getFirebaseAuth());\n }\n catch {\n // best-effort: no active session, or auth not initialized\n }\n}\nfunction buildRedirectPath(redirectTo) {\n let path = redirectTo || window.location.pathname || '/';\n if (path[0] !== '/')\n path = `/${path}`;\n return path;\n}\nconst buildGoogleProvider = (email, redirectTo) => {\n const p = new GoogleAuthProvider();\n p.addScope('profile');\n p.addScope('email');\n p.setCustomParameters({\n redirect_uri: window.location.origin + buildRedirectPath(redirectTo),\n ...(email ? { login_hint: email } : { prompt: 'select_account' }),\n });\n return p;\n};\nconst buildGithubProvider = (email) => {\n const p = new GithubAuthProvider();\n p.addScope('profile');\n p.addScope('email');\n if (email)\n p.setCustomParameters({ login: email });\n return p;\n};\nconst buildMicrosoftProvider = (email) => {\n const p = new OAuthProvider('microsoft.com');\n p.addScope('profile');\n p.addScope('email');\n if (email)\n p.setCustomParameters({ login_hint: email });\n return p;\n};\nconst buildOidcProvider = (email) => {\n const p = new OAuthProvider('oidc.main');\n if (email)\n p.setCustomParameters({ login_hint: email });\n return p;\n};\nconst PROVIDER_BUILDERS = {\n google: buildGoogleProvider,\n github: buildGithubProvider,\n microsoft: buildMicrosoftProvider,\n oidc: buildOidcProvider,\n};\nfunction buildFirebaseProvider(idp, email, redirectTo) {\n return PROVIDER_BUILDERS[idp](email, redirectTo);\n}\nexport async function startSignIn(provider, email, redirectTo) {\n if (!email)\n return { ok: false, reason: 'no-email' };\n // A tenant-mapped email uses the tenant's provider (overriding `provider`); otherwise use `provider`.\n const tenant = await setFirebaseTenant(email);\n const auth = getFirebaseAuth();\n let effectiveIdp = provider;\n let tenantName;\n if (tenant) {\n // Tenant config dictates the IdP.\n if (tenant.provider)\n effectiveIdp = tenant.provider;\n tenantName = tenant.label || tenant.name || undefined;\n localStorage.setItem('tenantName', tenantName ?? '');\n }\n else {\n // No tenant — clear any stale tenant routing from a prior attempt.\n localStorage.removeItem('tenantName');\n if (auth.tenantId)\n auth.tenantId = null;\n }\n writePendingSignin({ email, provider: effectiveIdp, tenantName });\n void signInWithRedirect(auth, buildFirebaseProvider(effectiveIdp, email, redirectTo));\n return { ok: true };\n}\n/** Starts a provider sign-in directly, skipping email/tenant resolution and clearing any tenant routing. */\nexport function startSignInWithoutTenant(provider, redirectTo) {\n const auth = getFirebaseAuth();\n localStorage.removeItem('tenantName');\n if (auth.tenantId)\n auth.tenantId = null;\n void signInWithRedirect(auth, buildFirebaseProvider(provider, undefined, redirectTo));\n}\nexport function providerLabel(id) {\n if (id === 'google')\n return 'Google';\n if (id === 'github')\n return 'GitHub';\n if (id === 'microsoft')\n return 'Microsoft';\n return 'Sign In';\n}\nexport function emailLocalPart(email) {\n if (!email)\n return '';\n const at = email.lastIndexOf('@');\n return at > 0 ? email.slice(0, at) : email;\n}\nexport function emailDomain(email) {\n if (!email)\n return '';\n const at = email.lastIndexOf('@');\n return at > 0 ? email.slice(at + 1) : '';\n}\nexport function capitalizeFirst(s) {\n return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;\n}\nexport function emailInitial(email) {\n return (email || '?').charAt(0).toUpperCase();\n}\nexport function firstNameFromEmail(email) {\n const local = emailLocalPart(email);\n const parts = local.split(/[._-]+/).filter(Boolean);\n const first = parts[0] || 'friend';\n return first.charAt(0).toUpperCase() + first.slice(1).toLowerCase();\n}\nexport function isValidEmail(email) {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test((email || '').trim());\n}\n/**\n * Detects the customer-domain \"needs invite\" 403 from /auth/ensure-user by its message.\n * Walks the `cause` chain because the token fetch re-wraps the original error.\n */\nexport function isInviteRequiredError(err) {\n let current = err;\n for (let depth = 0; current != null && depth < 8; depth++) {\n const msg = current instanceof Error ? current.message : String(current);\n if (msg.includes('Customer-domain user requires an invite to join'))\n return true;\n current = current instanceof Error ? current.cause : undefined;\n }\n return false;\n}\n//# sourceMappingURL=signInUtils.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Spinner } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { providerIcon } from './SignInIcons';\nimport { SignInIconBadge, SignInStepButton, SignInStepHeader, SignInStepLayout } from './SignInPrimitives';\nimport { providerLabel } from './signInUtils';\nexport default function SignInAuthPending({ provider, onCancel }) {\n const { t } = useUITranslation();\n const Icon = providerIcon(provider);\n // OIDC has no brand name for the title; use a generic noun phrase.\n const titleProvider = provider === 'oidc' ? t('auth.pending.genericProvider') : providerLabel(provider);\n return (_jsxs(SignInStepLayout, { centered: true, children: [_jsxs(\"div\", { children: [_jsx(SignInIconBadge, { children: _jsx(Icon, { className: provider === 'oidc' ? 'size-6 text-info' : 'size-6' }) }), _jsx(SignInStepHeader, { title: t('auth.pending.title', { provider: titleProvider }), body: t('auth.pending.body') })] }), _jsxs(\"div\", { className: \"w-full flex flex-col gap-2\", children: [_jsxs(SignInStepButton, { variant: \"loading\", children: [_jsx(Spinner, {}), _jsx(\"span\", { children: t('auth.pending.authenticating') })] }), onCancel && (_jsx(SignInStepButton, { variant: \"ghost\", onClick: onCancel, children: t('auth.pending.cancel') }))] })] }));\n}\n//# sourceMappingURL=SignInAuthPending.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Spinner } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { setFirebaseTenant } from '@vertesia/ui/session';\nimport { ArrowRight } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { SignInEmailField, SignInStepButton, SignInStepHeader, SignInStepLayout } from './SignInPrimitives';\nimport { isValidEmail } from './signInUtils';\nexport default function SignInEmailStep({ initialEmail, onProceed }) {\n const { t } = useUITranslation();\n const [email, setEmail] = useState(initialEmail ?? '');\n const [submitError, setSubmitError] = useState(false);\n const [loading, setLoading] = useState(false);\n const inputRef = useRef(null);\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n const submit = async (e) => {\n e.preventDefault();\n if (loading)\n return;\n if (!isValidEmail(email)) {\n setSubmitError(true);\n return;\n }\n setSubmitError(false);\n setLoading(true);\n try {\n const tenant = await setFirebaseTenant(email.trim().toLowerCase());\n onProceed(email.trim().toLowerCase(), tenant ?? undefined);\n }\n catch {\n // resolveTenant failed quietly — proceed to providers panel\n onProceed(email.trim().toLowerCase(), undefined);\n }\n finally {\n setLoading(false);\n }\n };\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { eyebrow: t('auth.email.eyebrow'), title: t('auth.email.title'), body: t('auth.email.body') }), _jsxs(\"form\", { onSubmit: submit, noValidate: true, className: `flex flex-col ${submitError ? 'gap-2' : 'gap-6'}`, children: [_jsx(SignInEmailField, { inputRef: inputRef, label: t('auth.email.label'), placeholder: t('auth.email.placeholder'), value: email, onChange: (value) => {\n setEmail(value);\n if (submitError)\n setSubmitError(false);\n }, invalid: submitError, error: submitError ? t('auth.email.invalidError') : undefined }), _jsx(SignInStepButton, { type: \"submit\", disabled: loading, children: loading ? (_jsx(Spinner, {})) : (_jsxs(_Fragment, { children: [_jsx(\"span\", { children: t('auth.continue') }), _jsx(ArrowRight, { className: \"!size-3.5\" })] })) })] })] }));\n}\n//# sourceMappingURL=SignInEmailStep.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { SignInEmailRow, SignInProviderButton, SignInStepHeader, SignInStepLayout } from './SignInPrimitives';\nimport { providerLabel, startSignIn } from './signInUtils';\nconst PROVIDERS = ['google', 'github', 'microsoft'];\nexport default function SignInProvidersStep({ email, onBack, onProviderClicked, redirectTo, }) {\n const { t } = useUITranslation();\n const pick = async (provider) => {\n onProviderClicked(provider);\n await startSignIn(provider, email, redirectTo);\n };\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { eyebrow: t('auth.providers.eyebrow'), title: t('auth.providers.title'), body: t('auth.providers.bodyConsumer') }), _jsx(SignInEmailRow, { email: email, actionLabel: t('auth.change'), onAction: onBack }), _jsx(\"div\", { className: \"flex flex-col gap-2\", children: PROVIDERS.map((id) => (_jsx(SignInProviderButton, { provider: id, label: t('auth.continueWithProvider', { provider: providerLabel(id) }), onClick: () => pick(id), variant: \"arrow\" }, id))) })] }));\n}\n//# sourceMappingURL=SignInProvidersStep.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { SignInAccountCard, SignInAccountRow, SignInInitialsBadge, SignInProviderButton, SignInStepButton, SignInStepHeader, SignInStepLayout, } from './SignInPrimitives';\nimport { emailInitial, firstNameFromEmail, providerLabel, startSignIn, } from './signInUtils';\nexport default function SignInReturningStep({ session, onNotYou, onProviderClicked, redirectTo, }) {\n const { t } = useUITranslation();\n const firstName = session.name ? session.name.split(' ')[0] || session.name : firstNameFromEmail(session.email);\n const displayName = session.name || firstNameFromEmail(session.email);\n const avatar = _jsx(SignInInitialsBadge, { initials: emailInitial(session.email) });\n // A stored tenantName means we resolved the user's organization.\n const hasTenant = !!session.tenantName;\n const primaryLabel = session.lastProvider === 'oidc'\n ? t('auth.continueWithSignIn')\n : t('auth.continueWithProvider', { provider: providerLabel(session.lastProvider) });\n const continueWith = async (provider) => {\n onProviderClicked(provider);\n await startSignIn(provider, session.email, redirectTo);\n };\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { eyebrow: t('auth.returning.eyebrow'), title: t('auth.returning.title', { name: firstName }), body: t('auth.returning.body') }), hasTenant && session.tenantName ? (_jsx(SignInAccountCard, { variant: \"returning\", badge: avatar, title: displayName, subtitle: session.tenantName, email: session.email, actionLabel: t('auth.returning.notYou'), onAction: onNotYou })) : (_jsx(SignInAccountRow, { badge: avatar, title: displayName, subtitle: session.email, actionLabel: t('auth.returning.notYou'), onAction: onNotYou })), _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsx(SignInProviderButton, { provider: session.lastProvider, label: primaryLabel, onClick: () => continueWith(session.lastProvider), variant: \"filled\" }), _jsx(SignInStepButton, { variant: \"ghost\", onClick: onNotYou, children: t('auth.returning.useDifferent') })] })] }));\n}\n//# sourceMappingURL=SignInReturningStep.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { ShieldOff } from 'lucide-react';\nimport { SignInCallout, SignInStepButton, SignInStepHeader, SignInStepLayout } from './SignInPrimitives';\nimport { capitalizeFirst, emailDomain } from './signInUtils';\nexport default function SignInTenantBlockedStep({ email, tenantName, onBack }) {\n const { t } = useUITranslation();\n // Without a tenant name: subheading uses the i18n fallback, callout uses \"<Domain> Team\".\n const subheadingName = tenantName || t('auth.blocked.tenantFallback');\n const domain = emailDomain(email);\n const boxName = tenantName ||\n (domain\n ? t('auth.blocked.teamFromDomain', { domain: capitalizeFirst(domain) })\n : t('auth.blocked.tenantFallback'));\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { variant: \"destructive\", eyebrow: t('auth.blocked.eyebrow'), title: t('auth.blocked.title'), body: t('auth.blocked.body', { name: subheadingName, email }) }), _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsx(SignInCallout, { icon: ShieldOff, title: boxName, meta: t('auth.blocked.tenantMeta', { email }) }), _jsx(SignInStepButton, { variant: \"ghost\", onClick: onBack, children: t('auth.blocked.useDifferent') })] })] }));\n}\n//# sourceMappingURL=SignInTenantBlockedStep.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { SignInProviderButton } from './SignInPrimitives';\nimport { providerLabel, startSignIn, startSignInWithoutTenant } from './signInUtils';\n// \"Continue with <provider>\" button that owns its sign-in redirect.\nexport default function SignInWithProviderButton({ provider, email, redirectTo, variant = 'outline', onClick, }) {\n const { t } = useUITranslation();\n const label = provider === 'oidc'\n ? t('auth.continueWithSignIn')\n : t('auth.continueWithProvider', { provider: providerLabel(provider) });\n const signIn = () => {\n onClick?.();\n if (email) {\n void startSignIn(provider, email, redirectTo);\n }\n else {\n // OIDC needs a resolved tenant; the no-email path is only hit by no-tenant buttons.\n startSignInWithoutTenant(provider, redirectTo);\n }\n };\n return _jsx(SignInProviderButton, { provider: provider, label: label, onClick: signIn, variant: variant });\n}\n//# sourceMappingURL=SignInWithProviderButton.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { SignInAccountCard, SignInInitialsBadge, SignInStepButton, SignInStepHeader, SignInStepLayout, } from './SignInPrimitives';\nimport SignInWithProviderButton from './SignInWithProviderButton';\nimport { providerLabel } from './signInUtils';\nfunction tenantInitials(name) {\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((p) => p.charAt(0).toUpperCase())\n .join('');\n}\nexport default function SignInTenantStep({ email, tenant, onBack, onProviderClicked, redirectTo, }) {\n const { t } = useUITranslation();\n const tenantName = tenant.label || tenant.name || t('auth.blocked.tenantFallback');\n // Brands keep their identity; anything else routes through OIDC.\n const provider = tenant.provider === 'google' || tenant.provider === 'github' || tenant.provider === 'microsoft'\n ? tenant.provider\n : 'oidc';\n const idpName = provider === 'oidc' ? t('auth.tenant.viaIdpFallback') : providerLabel(provider);\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { eyebrow: t('auth.tenant.eyebrow'), title: t('auth.tenant.title', { name: tenantName }), body: t('auth.tenant.body') }), _jsx(SignInAccountCard, { variant: \"tenant\", badge: _jsx(SignInInitialsBadge, { initials: tenantInitials(tenantName), shape: \"square\" }), title: tenantName, subtitle: t('auth.tenant.viaIdp', { idp: idpName }), email: email, actionLabel: t('auth.change'), onAction: onBack }), _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsx(SignInWithProviderButton, { provider: provider, email: email, redirectTo: redirectTo, variant: \"filled\", onClick: onProviderClicked }), _jsx(SignInStepButton, { variant: \"ghost\", onClick: onBack, children: t('auth.tenant.notPartOf', { name: tenantName }) })] })] }));\n}\n//# sourceMappingURL=SignInTenantStep.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, Input, RadioGroup, SelectBox } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { getFirebaseAuth } from '@vertesia/ui/session';\nimport { useEffect, useState } from 'react';\nexport default function SignupForm({ onSignup, goBack }) {\n const { t } = useUITranslation();\n const [accountType, setAccountType] = useState(undefined);\n const [companySize, setCompanySize] = useState(undefined);\n const [companyName, setCompanyName] = useState(undefined);\n const [companyWebsite, setCompanyWebsite] = useState(undefined);\n const [projectMaturity, setProjectMaturity] = useState(undefined);\n const [fbUser, setFbUser] = useState(undefined);\n const [error, setError] = useState(undefined);\n const isCompany = accountType === 'company';\n const companySizeOptions = [\n { id: 1, label: t('signup.size1to10') },\n { id: 11, label: t('signup.size11to100') },\n { id: 101, label: t('signup.size101to1000') },\n { id: 1001, label: t('signup.size1001to5000') },\n { id: 5001, label: t('signup.size5000plus') },\n ];\n const accountTypeOptions = [\n {\n id: 'personal',\n label: t('signup.personal'),\n description: t('signup.personalDescription'),\n },\n {\n id: 'company',\n label: t('signup.company'),\n description: t('signup.companyDescription'),\n },\n ];\n const projectMaturityOptions = [\n { id: 'testing', label: t('signup.justTesting') },\n { id: 'exploring', label: t('signup.activelyExploring') },\n { id: 'using', label: t('signup.alreadyUsing') },\n { id: 'migrating', label: t('signup.migratingLLMs') },\n { id: 'other', label: t('signup.other') },\n ];\n useEffect(() => {\n const user = getFirebaseAuth().currentUser;\n if (!user) {\n console.error('No user found');\n return;\n }\n setFbUser(user);\n }, []);\n const isValid = () => {\n if (!accountType) {\n setError(t('signup.pleaseSelectAccountType'));\n return false;\n }\n if (isCompany && !companyName) {\n setError(t('signup.pleaseEnterOrgName'));\n return false;\n }\n if (isCompany && !companySize) {\n setError(t('signup.pleaseSelectCompanySize'));\n return false;\n }\n return true;\n };\n const onSubmit = async () => {\n if (!isValid())\n return;\n if (!accountType)\n return;\n const signupData = {\n accountType: accountType,\n companyName: companyName,\n companySize: companySize?.id,\n companyWebsite: companyWebsite,\n maturity: projectMaturity,\n };\n window.localStorage.setItem('composableSignupData', JSON.stringify(signupData));\n const fbToken = await getFirebaseAuth().currentUser?.getIdToken();\n console.log('Got firebase token', getFirebaseAuth(), fbToken);\n if (!fbToken) {\n console.error('No firebase token found');\n return;\n }\n onSignup(signupData, fbToken);\n };\n return (_jsxs(\"div\", { className: \"flex flex-col space-y-2\", children: [_jsxs(\"div\", { className: \"prose\", children: [_jsx(\"p\", { className: \"prose text-sm text-muted pt-4\", children: t('signup.welcomeMessage', { name: fbUser?.displayName, email: fbUser?.email }) }), error && _jsx(\"div\", { className: \"text-destructive\", children: error })] }), _jsx(FormItem, { label: t('signup.accountType'), children: _jsx(RadioGroup, { options: accountTypeOptions, selected: accountTypeOptions.find((option) => option.id === accountType), onSelect: (option) => setAccountType(option.id) }) }), isCompany && (_jsxs(_Fragment, { children: [_jsx(FormItem, { label: t('signup.companySize'), children: _jsx(SelectBox, { className: \"w-full border border-accent bg-muted\", value: companySize, options: companySizeOptions, onChange: setCompanySize, optionLabel: (option) => option?.label, placeholder: t('signup.selectCompanySize') }) }), _jsx(FormItem, { label: t('signup.companyName'), children: _jsx(Input, { value: companyName, onChange: setCompanyName, type: \"text\", required: true }) }), _jsx(FormItem, { label: t('signup.companyWebsite'), children: _jsx(Input, { value: companyWebsite, onChange: setCompanyWebsite, type: \"text\" }) })] })), _jsx(FormItem, { label: t('signup.projectMaturity'), children: _jsx(SelectBox, { className: \"w-full border border-accent bg-muted\", options: projectMaturityOptions, value: projectMaturityOptions.find((option) => option.id === projectMaturity), optionLabel: (option) => option?.label, placeholder: t('signup.selectProjectMaturity'), onChange: (option) => setProjectMaturity(option?.id) }) }), _jsxs(\"div\", { className: \"pt-8 flex flex-col\", children: [_jsx(Button, { variant: \"primary\", onClick: onSubmit, size: \"xl\", children: _jsx(\"span\", { className: \"text-lg\", children: t('signup.signUp') }) }), _jsx(Button, { variant: \"ghost\", size: \"xl\", className: \"mt-4\", onClick: goBack, children: _jsx(\"span\", { className: \"\", children: t('signup.wrongAccountGoBack') }) })] })] }));\n}\nfunction FormItem({ label, children }) {\n return (_jsxs(\"div\", { className: \"flex flex-col space-y-2 pt-4\", children: [_jsx(\"div\", { className: \"text-sm text-muted\", children: label }), children] }));\n}\n//# sourceMappingURL=SignupForm.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Env } from '@vertesia/ui/env';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { RegionTag } from '@vertesia/ui/layout';\nimport { UserNotFoundError, useUserSession, useUXTracking } from '@vertesia/ui/session';\nimport { useCallback, useEffect, useState } from 'react';\nimport SignInAuthPending from './SignInAuthPending';\nimport SignInEmailStep from './SignInEmailStep';\nimport SignInProvidersStep from './SignInProvidersStep';\nimport SignInReturningStep from './SignInReturningStep';\nimport SignInTenantBlockedStep from './SignInTenantBlockedStep';\nimport SignInTenantStep from './SignInTenantStep';\nimport SignupForm from './SignupForm';\nimport { clearLastSuccessfulLogin, clearPendingSignin, isInviteRequiredError, readLastSuccessfulLogin, readPendingSignin, resetSignInState, writeLastSuccessfulLogin, } from './signInUtils';\nexport function SigninScreen({ allowedPrefix, isNested = false, lightLogo, darkLogo, preservePath, suppressAuthErrorPrefix, }) {\n const pathname = typeof window === 'undefined' ? '' : window.location.pathname;\n const allow = matchesPathPrefix(pathname, allowedPrefix);\n const suppressAuthError = matchesPathPrefix(pathname, suppressAuthErrorPrefix);\n return allow ? null : (_jsx(SigninScreenImpl, { isNested: isNested, lightLogo: lightLogo, darkLogo: darkLogo, preservePath: preservePath, suppressAuthError: suppressAuthError }));\n}\nfunction matchesPathPrefix(pathname, prefix) {\n const prefixes = Array.isArray(prefix) ? prefix : prefix ? [prefix] : [];\n return prefixes.some((candidate) => {\n if (pathname === candidate) {\n return true;\n }\n return pathname.startsWith(candidate.endsWith('/') ? candidate : `${candidate}/`);\n });\n}\nfunction SigninScreenImpl({ isNested = false, lightLogo, darkLogo, preservePath, suppressAuthError, }) {\n const { t } = useUITranslation();\n const { isLoading, user, authError, signOut } = useUserSession();\n const { trackEvent } = useUXTracking();\n const [storedSession, setStoredSession] = useState(() => readLastSuccessfulLogin());\n const [mode, setMode] = useState(() => {\n const s = readLastSuccessfulLogin();\n return s ? 'returning' : 'email';\n });\n const [email, setEmail] = useState('');\n const [tenant, setTenant] = useState(undefined);\n const [pendingProvider, setPendingProvider] = useState(null);\n useEffect(() => {\n if (!preservePath) {\n history.replaceState({}, '', '/');\n }\n }, [preservePath]);\n // Route based on authError surfaced by the session.\n useEffect(() => {\n if (!authError)\n return;\n if (authError instanceof UserNotFoundError) {\n setMode('signup');\n }\n else if (isInviteRequiredError(authError)) {\n const pending = readPendingSignin();\n if (pending)\n setEmail(pending.email);\n setMode('blocked');\n }\n }, [authError]);\n // On successful login, finalize the last-successful-login entry with the user's name.\n useEffect(() => {\n if (!user)\n return;\n const pending = readPendingSignin();\n if (!pending)\n return;\n writeLastSuccessfulLogin({\n email: pending.email,\n lastProvider: pending.provider,\n tenantName: pending.tenantName,\n name: user.name || undefined,\n });\n clearPendingSignin();\n }, [user]);\n const onProceedFromEmail = useCallback((e, t) => {\n setEmail(e);\n setTenant(t);\n setMode(t ? 'tenant' : 'providers');\n }, []);\n const onBack = useCallback(() => {\n setMode('email');\n setTenant(undefined);\n }, []);\n const onNotYou = useCallback(() => {\n clearLastSuccessfulLogin();\n clearPendingSignin();\n setStoredSession(null);\n setEmail('');\n setTenant(undefined);\n setMode('email');\n void signOut();\n }, [signOut]);\n const onProviderClicked = useCallback((provider) => {\n // Tenant context comes from a resolved tenant or stored tenantName, not the provider.\n const hasTenant = !!tenant || !!storedSession?.tenantName;\n // Only the pre-existing enterprise_signin event; non-tenant sign-ins emit nothing.\n if (hasTenant)\n trackEvent('enterprise_signin', { provider });\n setPendingProvider(provider);\n setMode('pending');\n // The redirect itself happens in the calling step's startSignIn(); this just shows the pending screen.\n }, [trackEvent, storedSession?.tenantName, tenant]);\n // \"Use a different email\" out of the blocked/signup screen. The user reached it\n // as a valid Firebase user with no Vertesia account, so a partial reset isn't\n // enough: unless we also clear the persisted records and sign out of Firebase,\n // the leftover session re-runs the invite check on the next auth change or\n // reload and lands them back on blocked.\n const startOver = useCallback(() => {\n setStoredSession(null); // drop the in-memory mirror too — resetSignInState only clears storage\n setEmail('');\n setTenant(undefined);\n setMode('email');\n void resetSignInState();\n }, []);\n // Submits the signup form to /auth/signup, then redirects into the app.\n const onSignup = (data, fbToken) => {\n const payload = { signupData: data, firebaseToken: fbToken };\n void fetch(`${Env.endpoints.studio}/auth/signup`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).then(() => {\n trackEvent('sign_up');\n window.location.href = '/';\n });\n };\n const shouldHideTransientAuthError = suppressAuthError && authError !== undefined && !(authError instanceof UserNotFoundError);\n if (isLoading || user || shouldHideTransientAuthError)\n return null;\n let content = null;\n if (mode === 'pending' && pendingProvider) {\n content = _jsx(SignInAuthPending, { provider: pendingProvider });\n }\n else if (mode === 'blocked') {\n content = (_jsx(SignInTenantBlockedStep, { email: email || storedSession?.email || '', tenantName: tenant?.label || tenant?.name || storedSession?.tenantName || undefined, onBack: startOver }));\n }\n else if (mode === 'signup' && !localStorage.getItem('tenantName')) {\n content = _jsx(SignupForm, { onSignup: onSignup, goBack: startOver });\n }\n else if (mode === 'tenant' && tenant) {\n content = (_jsx(SignInTenantStep, { email: email, tenant: tenant, onBack: onBack, onProviderClicked: () => onProviderClicked((tenant.provider ?? 'oidc')) }));\n }\n else if (mode === 'providers') {\n content = _jsx(SignInProvidersStep, { email: email, onBack: onBack, onProviderClicked: onProviderClicked });\n }\n else if (mode === 'returning' && storedSession) {\n content = (_jsx(SignInReturningStep, { session: storedSession, onNotYou: onNotYou, onProviderClicked: onProviderClicked }));\n }\n else {\n content = _jsx(SignInEmailStep, { initialEmail: email, onProceed: onProceedFromEmail });\n }\n return (_jsx(\"div\", { style: { zIndex: 999998 }, className: `${isNested ? 'absolute' : 'fixed'} inset-0 overflow-y-auto bg-background`, children: _jsx(\"div\", { className: \"min-h-full flex flex-col items-center justify-center py-12 px-4\", children: _jsxs(\"div\", { className: \"flex flex-col items-center w-full\", children: [(lightLogo || darkLogo) && (_jsxs(\"div\", { className: \"mb-7\", children: [lightLogo && _jsx(\"img\", { src: lightLogo, alt: \"Vertesia\", className: \"h-10 block dark:hidden\" }), darkLogo && _jsx(\"img\", { src: darkLogo, alt: \"Vertesia\", className: \"h-10 hidden dark:block\" })] })), content, authError && !(authError instanceof UserNotFoundError) && !isInviteRequiredError(authError) && (_jsx(\"div\", { className: \"mt-6 max-w-[420px] text-center text-sm text-muted\", children: _jsxs(\"div\", { children: [t('auth.signInError'), _jsx(\"br\", {}), t('auth.signInErrorContact'), _jsx(\"a\", { className: \"text-info mx-1\", href: \"mailto:support@vertesiahq.com\", children: \"support@vertesiahq.com\" }), t('auth.signInErrorPersists'), _jsx(\"pre\", { className: \"mt-2 text-xs\", children: t('auth.error', { message: authError.message }) })] }) })), _jsxs(\"div\", { className: \"flex items-center gap-5 mt-10 text-xs text-muted-foreground\", children: [_jsx(\"a\", { href: \"https://vertesiahq.com/privacy\", className: \"hover:text-foreground transition\", children: t('auth.privacyPolicy') }), _jsx(\"span\", { className: \"text-border\", children: \"\\u00B7\" }), _jsx(\"a\", { href: \"https://vertesiahq.com/terms\", className: \"hover:text-foreground transition\", children: t('auth.termsOfService') }), _jsx(\"span\", { className: \"text-border\", children: \"\\u00B7\" }), _jsx(RegionTag, { className: \"cursor-default\" })] })] }) }) }));\n}\n//# sourceMappingURL=SigninScreen.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, Center, ErrorBox, errorMessage, Input, SelectBox, Spinner, useFetch, useToast, } from '@vertesia/ui/core';\nimport { Env } from '@vertesia/ui/env';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { useLocation } from '@vertesia/ui/router';\nimport { fetchComposableTokenFromFirebaseToken, fetchComposableTokenFromVertesiaToken, getCurrentVertesiaToken, useUserSession, } from '@vertesia/ui/session';\nimport { useState } from 'react';\nconst LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost']);\nfunction parseRedirectUri(rawRedirect) {\n if (!rawRedirect) {\n return null;\n }\n let decoded;\n try {\n decoded = decodeURIComponent(rawRedirect);\n }\n catch {\n return null;\n }\n let parsed;\n try {\n parsed = new URL(decoded);\n }\n catch {\n return null;\n }\n if (parsed.protocol !== 'http:') {\n return null;\n }\n if (!parsed.port) {\n return null;\n }\n if (parsed.username || parsed.password) {\n return null;\n }\n if (!LOOPBACK_HOSTS.has(parsed.hostname)) {\n return null;\n }\n return parsed.toString();\n}\nfunction getClientInfo(location) {\n const params = new URLSearchParams(location.search);\n const redirect = parseRedirectUri(params.get('redirect_uri'));\n const code = params.get('code');\n if (!redirect || !code) {\n return null;\n }\n const profile = params.get('profile') ?? 'default';\n const project = params.get('project') ?? undefined;\n const account = params.get('account') ?? undefined;\n return { redirect, code, profile, project, account };\n}\nexport function TerminalLogin() {\n const [payload, setPayload] = useState();\n const [error, setError] = useState();\n const location = useLocation();\n const clientInfo = getClientInfo(location);\n const toast = useToast();\n const { t } = useUITranslation();\n const onAccept = async (data) => {\n if (!clientInfo)\n return;\n if (!data.profile) {\n toast({\n title: t('login.terminal.profileRequired'),\n description: t('login.terminal.profileRequiredDesc'),\n status: 'error',\n duration: 2000,\n });\n return;\n }\n if (!data.account) {\n toast({\n title: t('login.terminal.accountRequired'),\n description: t('login.terminal.accountRequiredDesc'),\n status: 'error',\n duration: 2000,\n });\n return;\n }\n if (!data.project) {\n toast({\n title: t('login.terminal.projectRequired'),\n description: t('login.terminal.projectRequiredDesc'),\n status: 'error',\n duration: 2000,\n });\n return;\n }\n // expire in 1 day\n let payload;\n try {\n const vertesiaToken = getCurrentVertesiaToken();\n const token = vertesiaToken\n ? await fetchComposableTokenFromVertesiaToken(vertesiaToken, data.account, data.project, 24 * 3600)\n : await fetchComposableTokenFromFirebaseToken(data.account, data.project, 24 * 3600);\n if (token) {\n payload = {\n ...data,\n studio_server_url: Env.endpoints.studio,\n zeno_server_url: Env.endpoints.zeno,\n token,\n };\n await fetch(clientInfo.redirect, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n setPayload(payload);\n }\n else {\n toast({\n title: t('login.terminal.failedToGetToken'),\n status: 'error',\n duration: 5000,\n });\n }\n }\n catch (err) {\n if (payload) {\n setError(err instanceof Error ? err : new Error(errorMessage(err)));\n setPayload(payload);\n }\n else {\n toast({\n title: t('login.terminal.errorAuthorizingClient'),\n description: errorMessage(err),\n status: 'error',\n duration: 5000,\n });\n }\n }\n };\n const getPageContent = () => {\n if (!clientInfo) {\n return (_jsx(ErrorBox, { title: t('login.terminal.invalidRequest'), children: t('login.terminal.invalidRequestDesc') }));\n }\n return payload ? (_jsx(AuthDoneScreen, { payload: payload, error: error })) : (_jsx(AuthAcceptScreen, { clientInfo: clientInfo, onAccept: onAccept }));\n };\n const page = getPageContent();\n return _jsx(\"div\", { className: \"w-full flex flex-col items-center gap-4 mt-24\", children: page });\n}\nfunction AuthAcceptScreen({ onAccept, clientInfo }) {\n const { client, user } = useUserSession();\n const { data: allProjects, error } = useFetch(() => (user ? client.projects.list() : Promise.resolve([])), [user]);\n const { t } = useUITranslation();\n if (error) {\n return _jsx(ErrorBox, { title: t('login.terminal.errorLoadingProjects'), children: errorMessage(error) });\n }\n const getEnvironmentName = () => {\n if (Env.isLocalDev) {\n return t('login.terminal.envLocalDev');\n }\n else if (Env.isDev) {\n return t('login.terminal.envStaging');\n }\n return t('login.terminal.envProduction');\n };\n const envName = getEnvironmentName();\n return user && allProjects ? (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"w-1/3\", children: [_jsxs(\"div\", { className: \"mb-4 text-xl font-semibold text-info\", children: [\"Authorizing client on \", envName, \" environment.\"] }), _jsxs(\"div\", { className: \"mb-2 text-md text-muted-foreground\", children: [_jsx(\"div\", { children: t('login.terminal.clientWantsAuth') }), _jsxs(\"div\", { children: [\"The client app code is \", _jsx(\"b\", { className: \"text-foreground\", children: clientInfo.code }), \". You can check if the code is correct in the terminal.\"] })] }), _jsxs(\"div\", { className: \"mb-2 text-sm text-muted-foreground\", children: [_jsx(\"div\", { children: t('login.terminal.chooseAccountProject') }), _jsx(\"div\", { children: t('login.terminal.profileNameNote') })] })] }), _jsx(ProfileForm, { onAccept: onAccept, allProjects: allProjects, data: clientInfo })] })) : (_jsx(Spinner, { size: \"lg\" }));\n}\nfunction AuthDoneScreen({ payload, error }) {\n const toast = useToast();\n const { t } = useUITranslation();\n const onCopy = () => {\n if (payload) {\n navigator.clipboard.writeText(JSON.stringify(payload));\n toast({\n title: t('login.terminal.authPayloadCopied'),\n description: error\n ? t('login.terminal.authPayloadCopiedWithError', { error: error.message })\n : t('login.terminal.authPayloadCopiedSuccess'),\n status: 'success',\n duration: 5000,\n });\n }\n };\n return (_jsxs(\"div\", { children: [error ? (_jsx(\"div\", { children: _jsx(ErrorBox, { title: t('login.terminal.failedToSendToken'), children: t('login.terminal.failedToSendTokenDesc', { error: error.message }) }) })) : (_jsx(\"div\", { children: t('login.terminal.clientAuthenticated') })), _jsx(Center, { className: \"mt-4\", children: _jsx(Button, { variant: \"secondary\", onClick: onCopy, children: t('login.terminal.copyAuthPayload') }) })] }));\n}\nfunction ProfileForm({ allProjects, data, onAccept }) {\n const { accounts, account, project } = useUserSession();\n const { t } = useUITranslation();\n const [currentData, setCurrentData] = useState(() => ({\n profile: data.profile,\n account: data.account ?? account?.id,\n project: data.project ?? project?.id,\n }));\n const onChangeProfile = (value) => {\n setCurrentData({ ...currentData, profile: value });\n };\n const onChangeAccount = (value) => {\n setCurrentData({ ...currentData, account: value.id, project: undefined });\n };\n const onChangeProject = (value) => {\n setCurrentData({ ...currentData, project: value.id });\n };\n const projects = allProjects.filter((p) => p.account === currentData.account);\n return (_jsxs(\"div\", { className: \"w-1/3\", children: [_jsxs(\"div\", { className: \"mb-4 flex flex-col gap-2\", children: [_jsx(\"span\", { className: \"font-semibold text-muted-foreground\", children: t('login.terminal.profileName') }), _jsx(Input, { type: \"text\", value: currentData.profile, onChange: onChangeProfile })] }), _jsxs(\"div\", { className: \"mb-4 flex flex-col gap-2\", children: [_jsx(\"span\", { className: \"font-semibold text-muted-foreground\", children: t('login.terminal.account') }), _jsx(SelectAccount, { value: currentData.account, onChange: onChangeAccount, accounts: accounts || [] })] }), _jsxs(\"div\", { className: \"mb-4 flex flex-col gap-2\", children: [_jsx(\"span\", { className: \"font-semibold text-muted-foreground\", children: t('login.terminal.project') }), _jsx(SelectProject, { value: currentData.project, onChange: onChangeProject, projects: projects })] }), _jsx(\"div\", { className: \"mb-4 text-sm text-attention\", children: t('login.terminal.browserPermissionNote') }), _jsx(\"div\", { children: _jsx(Button, { size: \"xl\", onClick: () => onAccept(currentData), children: t('login.terminal.authorizeClient') }) })] }));\n}\nfunction SelectAccount({ value, accounts, onChange }) {\n const { t } = useUITranslation();\n const _onChange = (value) => {\n onChange(value);\n };\n return (_jsx(SelectBox, { options: accounts, value: accounts?.find((a) => a.id === value), onChange: _onChange, by: \"id\", optionLabel: (option) => option.name, placeholder: t('login.terminal.selectAccount') }));\n}\nfunction SelectProject({ value, projects, onChange }) {\n const { t } = useUITranslation();\n const _onChange = (value) => {\n onChange(value);\n };\n return (_jsx(SelectBox, { by: \"id\", value: projects.find((p) => p.id === value), options: projects, optionLabel: (option) => option.name, placeholder: t('login.terminal.selectProject'), onChange: _onChange }));\n}\n//# sourceMappingURL=TerminalLogin.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle } from '@vertesia/ui/core';\nimport SignInWithProviderButton from './SignInWithProviderButton';\nexport default function SignInModal({ isOpen, onClose }) {\n return (_jsxs(Modal, { isOpen: isOpen, onClose: onClose, children: [_jsx(ModalTitle, { children: \"Sign In\" }), _jsxs(ModalBody, { className: \"flex flex-col gap-2\", children: [_jsx(SignInWithProviderButton, { provider: \"google\" }), _jsx(SignInWithProviderButton, { provider: \"github\" }), _jsx(SignInWithProviderButton, { provider: \"microsoft\" })] }), _jsx(ModalFooter, { align: \"right\", children: _jsx(Button, { variant: \"ghost\", onClick: onClose, children: \"Cancel\" }) })] }));\n}\n//# sourceMappingURL=SignInModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { getTenantIdFromProject } from '@vertesia/common';\nimport { Tabs, TabsBar, TabsPanel, VTooltip } from '@vertesia/ui/core';\nimport { Env } from '@vertesia/ui/env';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { useUserSession } from '@vertesia/ui/session';\n// Package version is now passed as prop from the consuming application\nimport { Check, CopyIcon } from 'lucide-react';\nimport { useState } from 'react';\nexport function InfoItems({ title, value }) {\n function copyToClipboard(value) {\n navigator.clipboard.writeText(value);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n }\n const [isCopied, setIsCopied] = useState(false);\n return (_jsxs(\"div\", { className: \"w-full flex justify-between items-center mb-1\", children: [_jsxs(\"div\", { className: \"flex flex-col w-[calc(100%-3rem)]\", children: [_jsx(\"div\", { className: \"text-sm px-2 dark:text-slate-200\", children: title }), _jsx(VTooltip, { description: value, size: \"xs\", placement: \"left\", children: _jsxs(\"div\", { className: \"text-xs truncate text-muted w-full text-start px-2\", children: [value, \" \"] }) })] }), isCopied ? (_jsx(Check, { className: \"size-4 cursor-pointer text-success\" })) : (_jsx(CopyIcon, { className: \"size-4 cursor-pointer text-gray-400 dark:text-slate-400\", onClick: () => copyToClipboard(value) }))] }));\n}\nexport default function InfoList() {\n const { t } = useUITranslation();\n const session = useUserSession();\n const { account, project, client, authToken } = session;\n const server = client.baseUrl;\n const store = client.store.baseUrl;\n // Behind the unified LB, server and store share one host (path-routing splits studio\n // vs zeno), so the Store row just duplicates Server — only show it when they differ.\n const showStore = store.replace(/\\/+$/, '') !== server.replace(/\\/+$/, '');\n const mcpServer = Env.endpoints.mcp ?? t('user.unknown');\n const tenantId = project ? getTenantIdFromProject(project) : '';\n const tabs = [\n {\n name: 'user',\n label: t('user.user'),\n content: (_jsxs(\"div\", { className: \"space-y-1 p-2\", children: [_jsx(InfoItems, { title: t('user.organizationId'), value: account?.id ?? t('user.unknown') }), _jsx(InfoItems, { title: t('user.projectId'), value: project?.id ?? t('user.unknown') }), _jsx(InfoItems, { title: t('user.userId'), value: authToken?.sub ?? t('user.unknown') }), _jsx(InfoItems, { title: t('user.organizationRoles'), value: authToken?.account_roles?.join(',') ?? t('user.unknown') }), _jsx(InfoItems, { title: t('user.projectRoles'), value: authToken?.project_roles?.join(',') ?? t('user.unknown') })] })),\n },\n {\n name: 'environment',\n label: t('user.environment'),\n content: (_jsxs(\"div\", { className: \"space-y-1 p-2\", children: [_jsx(InfoItems, { title: t('user.tenantId'), value: tenantId }), _jsx(InfoItems, { title: t('user.environment'), value: Env.type }), _jsx(InfoItems, { title: t('user.server'), value: server }), showStore && _jsx(InfoItems, { title: t('user.store'), value: store }), _jsx(InfoItems, { title: t('user.mcpServer'), value: mcpServer }), _jsx(InfoItems, { title: t('user.appVersion'), value: Env.version }), _jsx(InfoItems, { title: t('user.sdkVersion'), value: Env.sdkVersion || t('user.unknown') })] })),\n },\n ];\n return (_jsx(\"div\", { className: \"w-full\", children: _jsxs(Tabs, { defaultValue: \"user\", tabs: tabs, fullWidth: true, updateHash: false, children: [_jsx(TabsBar, {}), _jsx(TabsPanel, {})] }) }));\n}\n//# sourceMappingURL=UserInfo.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Permission } from '@vertesia/common';\nimport { Avatar, Button, MenuList, ModeToggle, Popover, PopoverContent, PopoverTrigger, Spinner, } from '@vertesia/ui/core';\nimport { useUserPermissions } from '@vertesia/ui/features';\nimport { useNavigate } from '@vertesia/ui/router';\nimport { useUserSession } from '@vertesia/ui/session';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport SignInModal from './SignInModal';\nimport InfoList from './UserInfo';\nexport function UserSessionMenu(_props) {\n const { user, isLoading } = useUserSession();\n const [showModal, setShowModal] = useState(false);\n if (isLoading) {\n return _jsx(Spinner, {});\n }\n else if (!user) {\n return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => setShowModal(true), children: \"Sign In\" }), _jsx(SignInModal, { isOpen: showModal, onClose: () => setShowModal(false) })] }));\n }\n else {\n return (_jsx(\"div\", { className: \"px-3\", children: _jsx(UserSessionPopup, { asMenuTrigger: true }) }));\n }\n}\nfunction UserSessionPopup({ className, asMenuTrigger = false }) {\n const session = useUserSession();\n const navigate = useNavigate();\n const perms = useUserPermissions();\n const { user } = session;\n if (!session || !user)\n return null;\n const isProjectManager = perms.hasPermission(Permission.project_admin);\n return (_jsxs(Popover, { click: true, children: [_jsx(PopoverTrigger, { children: _jsx(\"div\", { className: clsx(className, 'flex items-center justify-start', asMenuTrigger && 'cursor-pointer'), children: _jsx(Avatar, { size: \"sm\", color: \"bg-amber-500\", shape: \"circle\", \n /*src={picture} */\n name: user?.name }) }) }), _jsx(PopoverContent, { align: \"start\", className: \"w-[280px] mx-2 my-1 p-0\", children: _jsxs(\"div\", { className: \"divide-y divide-gray-200 dark:divide-slate-700\", children: [_jsxs(\"div\", { className: \"py-2 ps-2\", children: [_jsx(\"p\", { className: \"px-4 dark:text-white mb-1\", children: user?.name ?? 'Unknown' }), _jsx(\"p\", { className: \"px-4 text-xs text-gray-500\", children: user?.email ?? '' })] }), _jsx(\"div\", { className: \"w-full p-1\", children: _jsx(InfoList, {}) }), _jsx(\"div\", { className: \"py-2 ps-2\", children: _jsx(ModeToggle, {}) }), _jsx(\"div\", { className: \"py-2\", children: _jsxs(MenuList, { children: [isProjectManager && (_jsx(MenuList.Item, { className: \"px-2\", onClick: () => navigate('/settings', { replace: true }), children: \"Settings\" })), _jsx(MenuList.Item, { className: \"px-2\", onClick: () => session.logout(), children: \"Sign out\" })] }) })] }) })] }));\n}\n//# sourceMappingURL=UserSessionMenu.js.map","export function isVertesiaEmail(email) {\n return email\n ? email.endsWith('@vertesiahq.com') ||\n email.endsWith('@becomposable.com') ||\n email.endsWith('@composableprompts.com')\n : false;\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { useEffect, useState } from 'react';\nexport function SplashScreen({ icon: Icon }) {\n const { isLoading } = useUserSession();\n const [show, setShow] = useState(true);\n useEffect(() => {\n if (!isLoading) {\n setShow(false);\n }\n }, [isLoading]);\n return (_jsx(AnimatePresence, { children: show && (_jsx(motion.div, { style: { zIndex: 999999, position: 'fixed', inset: 0 }, className: \"fixed inset-x-0 inset-y-0\", initial: { opacity: 1 }, exit: { opacity: 0 }, transition: { ease: 'easeIn', duration: 0.5 }, children: _jsx(\"div\", { style: {\n display: 'flex',\n width: '100%',\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n }, className: \"flex w-full h-full items-center justify-center\", children: _jsx(\"div\", { className: \"animate-[spin_4s_linear_infinite]\", children: _jsx(\"div\", { className: \"animate-pulse rounded-full bg-transparent\", children: Icon || _jsx(LoadingIcon, {}) }) }) }) })) }));\n}\nfunction LoadingIcon() {\n const stopColor1 = 'currentColor';\n const stopColor2 = 'currentColor';\n // const stopColor1 = \"#4F46E5\";\n // const stopColor2 = \"#4F46E5\";\n return (_jsxs(\"svg\", { width: \"32\", height: \"32\", className: \"w-8 h-8 text-indigo-600\", viewBox: \"0 0 50 50\", xmlns: \"http://www.w3.org/2000/svg\", role: \"img\", \"aria-label\": \"Loading\", children: [_jsx(\"title\", { children: \"Loading\" }), _jsx(\"defs\", { children: _jsxs(\"linearGradient\", { id: \"spinner-gradient\", x1: \"1\", y1: \"0\", x2: \"0\", y2: \"1\", children: [_jsx(\"stop\", { offset: \"0%\", stopColor: stopColor1, stopOpacity: \"1\" }), _jsx(\"stop\", { offset: \"100%\", stopColor: stopColor2, stopOpacity: \"0\" })] }) }), _jsx(\"circle\", { cx: \"25\", cy: \"25\", r: \"20\", stroke: \"url(#spinner-gradient)\", strokeWidth: \"5\", fill: \"none\", strokeLinecap: \"round\" })] }));\n}\n//# sourceMappingURL=SplashScreen.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { ThemeProvider, ToastProvider } from '@vertesia/ui/core';\nimport { TypeRegistryProvider, UserPermissionProvider } from '@vertesia/ui/features';\nimport { LanguageBoundI18nProvider, LanguageProvider } from '@vertesia/ui/i18n';\nimport { UserSessionProvider } from '@vertesia/ui/session';\nimport { SigninScreen } from './login/SigninScreen';\nimport { SplashScreen } from './SplashScreen';\nexport function VertesiaShell({ children, lightLogo, darkLogo, loadingIcon, loadOnboardingStatus, preserveSignInPath, suppressSignInErrorPrefixes, defaultLanguage, }) {\n return (_jsx(ToastProvider, { children: _jsx(UserSessionProvider, { loadOnboardingStatus: loadOnboardingStatus, children: _jsx(TypeRegistryProvider, { children: _jsx(ThemeProvider, { defaultTheme: \"system\", storageKey: \"vite-ui-theme\", children: _jsx(LanguageProvider, { defaultLanguage: defaultLanguage, children: _jsxs(LanguageBoundI18nProvider, { children: [_jsx(SplashScreen, { icon: loadingIcon }), _jsx(SigninScreen, { allowedPrefix: \"/shared/\", darkLogo: darkLogo, lightLogo: lightLogo, preservePath: preserveSignInPath, suppressAuthErrorPrefix: suppressSignInErrorPrefixes }), _jsx(UserPermissionProvider, { children: children })] }) }) }) }) }) }));\n}\n//# sourceMappingURL=VertesiaShell.js.map"],"names":["AppInstallationContext","createContext","AppInstallationProvider","installation","children","_jsx","Provider","value","useAppInstallation","useContext","AppProjectSelector","app","onChange","placeholder","client","project","useUserSession","data","projects","error","useFetch","apps","getAppInstallationProjects","id","name","_jsxs","className","errorMessage","SelectProject","initialValue","localStorage","setItem","LastSelectedAccountId_KEY","account","LastSelectedProjectId_KEY","window","location","reload","setValue","useState","actualValue","find","p","SelectBox","by","options","optionLabel","option","StandaloneApp","AccessDenied","AccessDeniedMessage","StandaloneAppImpl","UnknownAppName","authToken","setInstallation","state","setState","useEffect","includes","getAppInstallationByName","then","inst","console","log","accounts","t","useUITranslation","selectedAccountId","setSelectedAccountId","allProjects","projectsByOrg","orgOptions","useMemo","grouped","push","orgsWithProjects","filter","a","length","filteredProjects","selectedOrg","Center","LockIcon","undefined","org","selected","InviteAcceptModal","session","showModal","setShowModal","invites","setInvites","listInvites","notLegacyInvites","i","catch","err","closeModal","inviteList","map","invite","role","invited_by","Button","size","onClick","async","acceptInvite","authCallback","fetchAccounts","fetchProjects","accept","variant","rejectInvite","remainingInvites","reject","warn","Modal","isOpen","onClose","ModalTitle","ModalBody","OidcIcon","LockKeyhole","PROVIDER_ICONS","google","props","viewBox","fill","d","github","fillRule","clipRule","microsoft","oidc","providerIcon","provider","SignInStepLayout","centered","SignInStepHeader","eyebrow","title","body","SIGNIN_STEP_BUTTON_VARIANTS","primary","loading","ghost","SignInStepButton","type","disabled","rest","trim","SignInInlineLinkButton","base","INITIALS_BADGE_SHAPES","circle","square","SignInInitialsBadge","initials","shape","SignInIconBadge","SignInIdentityLines","subtitle","titleClass","subtitleClass","ACCOUNT_CARD_VARIANTS","tenant","topRow","bottomRow","mailBox","mailIcon","email","actionSize","returning","SignInAccountCard","badge","actionLabel","onAction","v","Mail","SignInAccountRow","SignInEmailRow","SignInProviderButton","label","Icon","arrowClass","ArrowRight","SignInCallout","icon","meta","SignInEmailField","inputRef","invalid","htmlFor","ref","e","target","autoComplete","autoCorrect","autoCapitalize","spellCheck","LAST_SUCCESSFUL_LOGIN_KEY","PENDING_SIGNIN_KEY","readLastSuccessfulLogin","raw","getItem","JSON","parse","lastProvider","clearLastSuccessfulLogin","removeItem","readPendingSignin","sessionStorage","clearPendingSignin","resetSignInState","firebaseSignOut","getFirebaseAuth","buildRedirectPath","redirectTo","path","pathname","PROVIDER_BUILDERS","GoogleAuthProvider","addScope","setCustomParameters","redirect_uri","origin","login_hint","prompt","GithubAuthProvider","login","OAuthProvider","buildFirebaseProvider","idp","startSignIn","ok","reason","setFirebaseTenant","auth","tenantName","effectiveIdp","tenantId","stringify","writePendingSignin","signInWithRedirect","providerLabel","firstNameFromEmail","local","at","lastIndexOf","slice","emailLocalPart","first","split","Boolean","charAt","toUpperCase","toLowerCase","isInviteRequiredError","current","depth","Error","message","String","cause","SignInAuthPending","onCancel","titleProvider","Spinner","SignInEmailStep","initialEmail","onProceed","setEmail","submitError","setSubmitError","setLoading","useRef","focus","onSubmit","preventDefault","test","isValidEmail","noValidate","_Fragment","PROVIDERS","SignInProvidersStep","onBack","onProviderClicked","pick","SignInReturningStep","onNotYou","firstName","displayName","avatar","hasTenant","primaryLabel","continueWith","SignInTenantBlockedStep","subheadingName","domain","emailDomain","boxName","s","ShieldOff","SignInWithProviderButton","startSignInWithoutTenant","SignInTenantStep","idpName","join","SignupForm","onSignup","goBack","accountType","setAccountType","companySize","setCompanySize","companyName","setCompanyName","companyWebsite","setCompanyWebsite","projectMaturity","setProjectMaturity","fbUser","setFbUser","setError","isCompany","companySizeOptions","accountTypeOptions","description","projectMaturityOptions","user","currentUser","FormItem","RadioGroup","onSelect","Input","required","signupData","maturity","fbToken","getIdToken","SigninScreen","allowedPrefix","isNested","lightLogo","darkLogo","preservePath","suppressAuthErrorPrefix","allow","matchesPathPrefix","suppressAuthError","SigninScreenImpl","prefix","Array","isArray","some","candidate","startsWith","endsWith","isLoading","authError","signOut","trackEvent","useUXTracking","storedSession","setStoredSession","mode","setMode","setTenant","pendingProvider","setPendingProvider","history","replaceState","UserNotFoundError","pending","writeLastSuccessfulLogin","onProceedFromEmail","useCallback","startOver","payload","firebaseToken","fetch","Env","endpoints","studio","method","headers","href","content","style","zIndex","src","alt","RegionTag","LOOPBACK_HOSTS","Set","getClientInfo","params","URLSearchParams","search","redirect","rawRedirect","decoded","parsed","decodeURIComponent","URL","protocol","port","username","password","has","hostname","toString","parseRedirectUri","get","code","profile","TerminalLogin","setPayload","clientInfo","useLocation","toast","useToast","onAccept","status","duration","vertesiaToken","getCurrentVertesiaToken","token","fetchComposableTokenFromVertesiaToken","fetchComposableTokenFromFirebaseToken","studio_server_url","zeno_server_url","zeno","page","AuthDoneScreen","AuthAcceptScreen","ErrorBox","list","Promise","resolve","envName","isLocalDev","isDev","ProfileForm","navigator","clipboard","writeText","currentData","setCurrentData","SelectAccount","SignInModal","ModalFooter","align","InfoItems","isCopied","setIsCopied","VTooltip","placement","Check","CopyIcon","setTimeout","copyToClipboard","InfoList","server","baseUrl","store","showStore","replace","mcpServer","mcp","getTenantIdFromProject","tabs","sub","account_roles","project_roles","version","sdkVersion","Tabs","defaultValue","fullWidth","updateHash","TabsBar","TabsPanel","UserSessionMenu","_props","UserSessionPopup","asMenuTrigger","navigate","useNavigate","perms","useUserPermissions","isProjectManager","hasPermission","Permission","project_admin","Popover","click","PopoverTrigger","clsx","Avatar","color","PopoverContent","ModeToggle","MenuList","Item","logout","isVertesiaEmail","SplashScreen","show","setShow","AnimatePresence","motion","div","position","inset","initial","opacity","exit","transition","ease","display","width","height","alignItems","justifyContent","LoadingIcon","xmlns","x1","y1","x2","y2","offset","stopColor","stopOpacity","cx","cy","r","stroke","strokeWidth","strokeLinecap","VertesiaShell","loadingIcon","loadOnboardingStatus","preserveSignInPath","suppressSignInErrorPrefixes","defaultLanguage","ToastProvider","UserSessionProvider","TypeRegistryProvider","ThemeProvider","defaultTheme","storageKey","LanguageProvider","LanguageBoundI18nProvider","UserPermissionProvider"],"mappings":"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"}
1
+ {"version":3,"file":"vertesia-ui-shell.js","sources":["shell/apps/AppInstallationProvider.js","shell/apps/AppProjectSelector.js","shell/apps/StandaloneApp.js","shell/login/InviteAcceptModal.js","shell/login/SignInIcons.js","shell/login/SignInPrimitives.js","shell/login/signInUtils.js","shell/login/SignInAuthPending.js","shell/login/SignInEmailStep.js","shell/login/SignInProvidersStep.js","shell/login/SignInReturningStep.js","shell/login/SignInTenantBlockedStep.js","shell/login/SignInWithProviderButton.js","shell/login/SignInTenantStep.js","shell/login/SignupForm.js","shell/login/SigninScreen.js","shell/login/TerminalLogin.js","shell/login/SignInModal.js","shell/login/UserInfo.js","shell/login/UserSessionMenu.js","shell/utils.js","shell/SplashScreen.js","shell/VertesiaShell.js"],"sourcesContent":["import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createContext, useContext } from 'react';\nexport const AppInstallationContext = createContext(null);\nexport function AppInstallationProvider({ installation, children, }) {\n return _jsx(AppInstallationContext.Provider, { value: installation, children: children });\n}\n/**\n * Get the current app installation obejct when called in an app context otheriwse returns null\n */\nexport function useAppInstallation() {\n return useContext(AppInstallationContext);\n}\n//# sourceMappingURL=AppInstallationProvider.js.map","import { jsxs as _jsxs, jsx as _jsx } from \"react/jsx-runtime\";\nimport { errorMessage, SelectBox, useFetch } from '@vertesia/ui/core';\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY, useUserSession } from '@vertesia/ui/session';\nimport { useState } from 'react';\nexport function AppProjectSelector({ app, onChange, placeholder }) {\n const { client, project } = useUserSession();\n const { data: projects, error } = useFetch(() => {\n return client.apps.getAppInstallationProjects(app);\n }, [app.id, app.name]);\n const _onChange = (project) => {\n if (onChange) {\n if (!onChange(project)) {\n // if onChange returns true then the defualt on change is called\n return;\n }\n }\n // default on change\n localStorage.setItem(LastSelectedAccountId_KEY, project.account);\n localStorage.setItem(`${LastSelectedProjectId_KEY}-${project.account}`, project.id);\n window.location.reload();\n };\n if (error) {\n return _jsxs(\"span\", { className: \"text-red-600\", children: [\"Error: failed to fetch projects: \", errorMessage(error)] });\n }\n return (_jsx(SelectProject, { placeholder: placeholder, initialValue: project?.id, projects: projects || [], onChange: _onChange }));\n}\nfunction SelectProject({ initialValue, projects, onChange, placeholder = 'Select Project', }) {\n const [value, setValue] = useState();\n const _onChange = (value) => {\n setValue(value);\n onChange(value);\n };\n const actualValue = !value && initialValue ? projects.find((p) => p.id === initialValue) : value;\n return (_jsx(SelectBox, { by: \"id\", value: actualValue, options: projects, optionLabel: (option) => option.name, placeholder: placeholder, onChange: _onChange }));\n}\n//# sourceMappingURL=AppProjectSelector.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Center, SelectBox, useFetch } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY, useUserSession } from '@vertesia/ui/session';\nimport { LockIcon } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { AppInstallationProvider } from './AppInstallationProvider';\nexport function StandaloneApp({ name, AccessDenied = AccessDeniedMessage, children }) {\n return name ? (_jsx(StandaloneAppImpl, { name: name, AccessDenied: AccessDenied, children: children })) : (_jsx(UnknownAppName, {}));\n}\nexport function StandaloneAppImpl({ name, AccessDenied = AccessDeniedMessage, children }) {\n const { authToken, client } = useUserSession();\n const [installation, setInstallation] = useState(null);\n const [state, setState] = useState('loading');\n useEffect(() => {\n if (!authToken) {\n setState('loading');\n }\n else {\n const isAppVisible = authToken.apps.includes(name);\n if (isAppVisible) {\n client.apps.getAppInstallationByName(name).then((inst) => {\n if (!inst) {\n console.log(`App ${name} not found!`);\n setState('error');\n }\n else {\n setState('loaded');\n setInstallation(inst);\n }\n });\n }\n else {\n setState('error');\n }\n }\n }, [name, authToken, client.apps.getAppInstallationByName]);\n if (state === 'loading') {\n return null;\n }\n else if (state === 'error') {\n return _jsx(AccessDenied, { name: name });\n }\n else if (installation) {\n return _jsx(AppInstallationProvider, { installation: installation, children: children });\n }\n}\nfunction AccessDeniedMessage({ name }) {\n const { project, accounts, client } = useUserSession();\n const { t } = useUITranslation();\n const [selectedAccountId, setSelectedAccountId] = useState();\n // Fetch all projects where the app is installed across all organizations\n const { data: allProjects } = useFetch(() => {\n return client.apps.getAppInstallationProjects({ name });\n }, [name]);\n // Group projects by organization\n const { projectsByOrg, orgOptions } = useMemo(() => {\n if (!allProjects || !accounts)\n return { projectsByOrg: {}, orgOptions: [] };\n const grouped = {};\n for (const p of allProjects) {\n if (!grouped[p.account]) {\n grouped[p.account] = [];\n }\n grouped[p.account].push(p);\n }\n // Only show orgs that have projects with the app installed\n const orgsWithProjects = accounts.filter((a) => grouped[a.id]?.length > 0);\n return { projectsByOrg: grouped, orgOptions: orgsWithProjects };\n }, [allProjects, accounts]);\n // Auto-select first org if not selected\n useEffect(() => {\n if (!selectedAccountId && orgOptions.length > 0) {\n setSelectedAccountId(orgOptions[0].id);\n }\n }, [orgOptions, selectedAccountId]);\n const onProjectChange = (selected) => {\n localStorage.setItem(LastSelectedAccountId_KEY, selected.account);\n localStorage.setItem(`${LastSelectedProjectId_KEY}-${selected.account}`, selected.id);\n window.location.reload();\n };\n const filteredProjects = selectedAccountId ? projectsByOrg[selectedAccountId] || [] : [];\n const selectedOrg = orgOptions.find((a) => a.id === selectedAccountId);\n return (_jsxs(Center, { className: \"pt-10 flex flex-col items-center text-center text-gray-700\", children: [_jsx(LockIcon, { className: \"w-10 h-10 mb-4 text-gray-500\" }), _jsx(\"div\", { className: \"text-xl font-semibold\", children: t('shell.accessDenied') }), _jsxs(\"div\", { className: \"mt-2 text-sm text-gray-500\", children: [\"You don't have permission to view the \", _jsx(\"span\", { className: \"font-semibold\", children: name }), \" app in project:\", ' ', _jsxs(\"span\", { className: \"font-semibold\", children: [\"\\u00AB\", project?.name, \"\\u00BB\"] }), \".\"] }), orgOptions.length === 0 && allProjects !== undefined && (_jsx(\"div\", { className: \"mt-4 text-sm text-gray-500\", children: \"This app is not installed in any project you have access to.\" })), orgOptions.length > 0 && (_jsxs(\"div\", { className: \"mt-4 flex flex-row gap-4 items-end\", children: [orgOptions.length > 1 && (_jsxs(\"div\", { children: [_jsx(\"div\", { className: \"text-sm text-gray-500 mb-2\", children: t('shell.organization') }), _jsx(SelectBox, { by: \"id\", value: selectedOrg, options: orgOptions, optionLabel: (option) => option.name, placeholder: t('shell.selectOrganization'), onChange: (org) => setSelectedAccountId(org.id) })] })), _jsxs(\"div\", { children: [orgOptions.length > 1 && (_jsx(\"div\", { className: \"text-sm text-gray-500 mb-2\", children: t('login.terminal.project') })), _jsx(SelectBox, { by: \"id\", value: undefined, options: filteredProjects, optionLabel: (option) => option.name, placeholder: t('shell.selectProject'), onChange: onProjectChange })] })] }))] }));\n}\nfunction UnknownAppName() {\n const { t } = useUITranslation();\n return (_jsxs(Center, { className: \"pt-10 flex flex-col items-center text-center text-gray-700\", children: [_jsx(LockIcon, { className: \"w-10 h-10 mb-4 text-gray-500\" }), _jsx(\"div\", { className: \"text-xl font-semibold\", children: t('shell.applicationNotRegistered') }), _jsxs(\"div\", { className: \"mt-2 text-sm text-gray-500\", children: [\"Before starting to code a Vertesia application you must register an application manifest in Vertesia Studio then install it in one or more projects.\", _jsx(\"p\", {}), \"Then use the created app name as a parameter to\", ' ', _jsx(\"code\", { children: \"<StandaloneApp name=\\\"your-app-name\\\">\" }), \" in the \", _jsx(\"code\", { children: \"src/main.tsx\" }), \" file.\"] })] }));\n}\n//# sourceMappingURL=StandaloneApp.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Modal, ModalBody, ModalTitle } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useEffect, useState } from 'react';\nexport function InviteAcceptModal() {\n const session = useUserSession();\n const { client } = session;\n const { t } = useUITranslation();\n const [showModal, setShowModal] = useState(false);\n const [invites, setInvites] = useState([]);\n useEffect(() => {\n client.account\n .listInvites()\n .then((invites) => {\n if (invites.length > 0) {\n // Filter out legacy invites that do not have account data\n const notLegacyInvites = invites.filter((i) => i.data.account);\n if (notLegacyInvites.length === 0) {\n console.log('No valid invites found, closing modal');\n return;\n }\n // If we have valid invites, show the modal\n console.log('Found valid invites', notLegacyInvites.length);\n setShowModal(true);\n setInvites(notLegacyInvites);\n }\n else {\n console.log('No invites found, closing modal');\n setShowModal(false);\n }\n })\n .catch((err) => {\n console.error('Error fetching invites', err);\n });\n }, [client.account.listInvites]);\n const closeModal = () => setShowModal(false);\n const accept = async (invite) => {\n await client.account.acceptInvite(invite.id);\n await session.authCallback;\n await session.fetchAccounts();\n await session.fetchProjects(invite.data.account.id);\n const remainingInvites = invites.filter((i) => i.id !== invite.id);\n const notLegacyInvites = remainingInvites.filter((i) => i.data.account);\n if (notLegacyInvites.length > 0) {\n setInvites(notLegacyInvites);\n }\n else {\n closeModal();\n }\n };\n const reject = async (invite) => {\n await client.account.rejectInvite(invite.id);\n const remainingInvites = invites.filter((i) => i.id !== invite.id);\n setInvites(remainingInvites);\n if (remainingInvites.length === 0) {\n closeModal();\n }\n };\n const inviteList = invites.map((invite) => {\n if (!invite.data.account) {\n console.warn('Invite has no account data', invite);\n return null; // Skip rendering this invite\n }\n return (_jsxs(\"div\", { className: \"flex flex-row w-full justify-between border rounded-sm px-2 py-2 \", children: [_jsxs(\"div\", { className: \"flex flex-col\", children: [_jsx(\"div\", { className: \"w-full font-semibold\", children: invite.data.account.name ?? invite.data.account }), invite.data.project && _jsxs(\"div\", { className: \"w-full text-base\", children: [\"- \", invite.data.project.name] }), _jsxs(\"div\", { className: \"text-xs\", children: [\"Role: \", invite.data.role] }), invite.data.invited_by && (_jsxs(\"div\", { className: \"text-xs\", children: [\"by \", invite.data.invited_by.name ?? invite.data.invited_by] }))] }), _jsxs(\"div\", { className: \"flex flex-col gap-4\", children: [_jsx(Button, { size: 'xs', onClick: () => accept(invite), children: t('login.accept') }), ' ', _jsx(Button, { size: 'xs', variant: \"secondary\", onClick: () => reject(invite), children: t('login.reject') })] })] }, invite.id));\n });\n return (_jsx(\"div\", { children: _jsxs(Modal, { isOpen: showModal, onClose: closeModal, children: [_jsx(ModalTitle, { children: t('login.reviewInvites') }), _jsxs(ModalBody, { children: [_jsx(\"div\", { className: \"text-sm pb-4\", children: \"You have received the following invites to join other accounts. Please review and accept or declined them.\" }), inviteList] })] }) }));\n}\n//# sourceMappingURL=InviteAcceptModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { LockKeyhole } from 'lucide-react';\nexport function GoogleIcon(props) {\n return (_jsxs(\"svg\", { viewBox: \"0 0 48 48\", \"aria-hidden\": \"true\", ...props, children: [_jsx(\"path\", { fill: \"#FFC107\", d: \"M43.6 20.5H42V20H24v8h11.3c-1.6 4.7-6.1 8-11.3 8a12 12 0 0 1 0-24c3 0 5.8 1.1 7.9 3l5.7-5.7A20 20 0 1 0 24 44c11 0 20-9 20-20 0-1.2-.1-2.3-.4-3.5z\" }), _jsx(\"path\", { fill: \"#FF3D00\", d: \"M6.3 14.7l6.6 4.8A12 12 0 0 1 24 12c3 0 5.8 1.1 7.9 3l5.7-5.7A20 20 0 0 0 6.3 14.7z\" }), _jsx(\"path\", { fill: \"#4CAF50\", d: \"M24 44c5.2 0 10-2 13.6-5.2l-6.3-5.3A12 12 0 0 1 12.7 28.5l-6.6 5.1A20 20 0 0 0 24 44z\" }), _jsx(\"path\", { fill: \"#1976D2\", d: \"M43.6 20.5H42V20H24v8h11.3a12 12 0 0 1-4 5.5l6.3 5.3C37.9 36.6 44 31 44 24c0-1.2-.1-2.3-.4-3.5z\" })] }));\n}\nexport function GithubIcon(props) {\n return (_jsx(\"svg\", { viewBox: \"0 0 24 24\", \"aria-hidden\": \"true\", ...props, children: _jsx(\"path\", { fill: \"currentColor\", fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M12 2C6.48 2 2 6.58 2 12.25c0 4.54 2.87 8.39 6.84 9.75.5.09.68-.22.68-.49v-1.7c-2.78.62-3.37-1.36-3.37-1.36-.46-1.18-1.11-1.5-1.11-1.5-.91-.63.07-.62.07-.62 1 .07 1.53 1.05 1.53 1.05.89 1.57 2.34 1.12 2.91.86.09-.66.35-1.12.63-1.38-2.22-.26-4.56-1.14-4.56-5.07 0-1.12.39-2.03 1.03-2.75-.1-.26-.45-1.3.1-2.7 0 0 .84-.28 2.76 1.05A9.4 9.4 0 0 1 12 7.07c.85 0 1.71.12 2.51.34 1.91-1.33 2.75-1.05 2.75-1.05.55 1.4.2 2.44.1 2.7.64.72 1.03 1.63 1.03 2.75 0 3.94-2.34 4.81-4.57 5.06.36.32.68.94.68 1.9v2.81c0 .27.18.59.69.49C19.13 20.64 22 16.78 22 12.25 22 6.58 17.52 2 12 2z\" }) }));\n}\nexport function MicrosoftIcon(props) {\n return (_jsxs(\"svg\", { viewBox: \"0 0 24 24\", \"aria-hidden\": \"true\", ...props, children: [_jsx(\"path\", { fill: \"#F25022\", d: \"M2 2h9.5v9.5H2z\" }), _jsx(\"path\", { fill: \"#7FBA00\", d: \"M12.5 2H22v9.5h-9.5z\" }), _jsx(\"path\", { fill: \"#00A4EF\", d: \"M2 12.5h9.5V22H2z\" }), _jsx(\"path\", { fill: \"#FFB900\", d: \"M12.5 12.5H22V22h-9.5z\" })] }));\n}\n// Generic lock for OIDC/unknown (no brand glyph).\nexport const OidcIcon = LockKeyhole;\n/** Provider → brand icon. */\nexport const PROVIDER_ICONS = {\n google: GoogleIcon,\n github: GithubIcon,\n microsoft: MicrosoftIcon,\n oidc: OidcIcon,\n};\nexport function providerIcon(provider) {\n if (provider && provider in PROVIDER_ICONS)\n return PROVIDER_ICONS[provider];\n return OidcIcon;\n}\n//# sourceMappingURL=SignInIcons.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n// Stateless visual primitives shared by the sign-in steps.\nimport { Button } from '@vertesia/ui/core';\nimport { ArrowRight, Mail } from 'lucide-react';\nimport { providerIcon } from './SignInIcons';\nexport function SignInStepLayout({ children, centered = false }) {\n return (_jsx(\"div\", { className: centered\n ? 'w-full max-w-[420px] flex flex-col gap-6 items-center text-center'\n : 'w-full max-w-[420px] flex flex-col gap-6', children: children }));\n}\nexport function SignInStepHeader({ eyebrow, title, body, variant = 'info' }) {\n const eyebrowColor = variant === 'destructive' ? 'text-destructive' : 'text-info';\n return (_jsxs(\"div\", { children: [eyebrow && _jsx(\"div\", { className: `${eyebrowColor} text-[12.5px] font-medium mb-2`, children: eyebrow }), _jsx(\"h1\", { className: \"text-foreground text-[22px] font-semibold tracking-tight leading-tight mb-1.5\", children: title }), body && _jsx(\"p\", { className: \"text-muted text-sm leading-relaxed\", children: body })] }));\n}\n// ─── Buttons ────────────────────────────────────────────────────────────────\nconst SIGNIN_STEP_BUTTON_BASE = 'cursor-pointer inline-flex items-center justify-center text-sm font-medium transition';\nconst SIGNIN_STEP_BUTTON_VARIANTS = {\n // Filled CTA; greys out when disabled.\n primary: 'h-[42px] gap-2.5 rounded-md bg-foreground text-background hover:opacity-90 ' +\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n // Non-interactive primary kept at full opacity (spinner reads as active).\n loading: 'h-[42px] gap-2.5 rounded-md bg-foreground text-background opacity-90',\n // Flat text link.\n ghost: 'h-9 text-muted hover:text-foreground',\n};\n/** Button used across the sign-in steps. */\nexport function SignInStepButton({ variant = 'primary', className = '', type = 'button', disabled, ...rest }) {\n return (_jsx(Button, { variant: \"unstyled\", size: \"none\", type: type, \n // loading is always non-interactive.\n disabled: variant === 'loading' ? true : disabled, className: `${SIGNIN_STEP_BUTTON_BASE} ${SIGNIN_STEP_BUTTON_VARIANTS[variant]} ${className}`.trim(), ...rest }));\n}\n/** Compact inline text link for info rows (\"Change\", \"Not you?\"). */\nexport function SignInInlineLinkButton({ size = 'xs', className = '', type = 'button', ...rest }) {\n // `!` overrides beat the Button base's text-sm/rounded-md defaults.\n const sizeClass = size === 'smaller' ? '!text-[11px]' : '!text-xs';\n const base = `cursor-pointer ${sizeClass} text-muted hover:text-foreground !transition px-2 py-1 ` +\n '!rounded underline decoration-transparent hover:decoration-current underline-offset-[3px]';\n return (_jsx(Button, { variant: \"unstyled\", size: \"none\", type: type, className: className ? `${base} ${className}` : base, ...rest }));\n}\n// ─── Badges & avatars ────────────────────────────────────────────────────────\nconst INITIALS_BADGE_SHAPES = {\n // Round user avatar, with a ring.\n circle: 'size-9 rounded-full text-sm ring-4 ring-background ring-offset-1 ring-offset-border',\n // Square org chip.\n square: 'size-[30px] rounded-md text-[11px]',\n};\n/** Initials in a colored chip — a round user avatar or a square org chip. */\nexport function SignInInitialsBadge({ initials, shape = 'circle' }) {\n return (_jsx(\"span\", { className: `bg-info text-info-foreground grid place-items-center font-semibold shrink-0 ${INITIALS_BADGE_SHAPES[shape]}`, children: initials }));\n}\n/** Rounded tile framing a provider/status icon. */\nexport function SignInIconBadge({ children }) {\n return (_jsx(\"div\", { className: \"inline-grid place-items-center size-14 rounded-xl bg-info-background border border-info/15 mb-3.5\", children: children }));\n}\n/** Title over a secondary line; fills the row beside a badge or avatar. */\nexport function SignInIdentityLines({ title, subtitle, titleClass, subtitleClass }) {\n return (_jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [_jsx(\"div\", { className: titleClass, children: title }), _jsx(\"div\", { className: subtitleClass, children: subtitle })] }));\n}\n// Two-row panel layout, tuned per usage. `tenant`: org card with a square badge;\n// `returning`: smaller returning-user card with a round avatar.\nconst ACCOUNT_CARD_VARIANTS = {\n tenant: {\n topRow: 'flex items-center gap-2.5 px-3 py-2.5',\n title: 'text-[13.5px] font-semibold text-foreground leading-tight',\n subtitle: 'text-[11.5px] text-muted leading-tight mt-0.5',\n bottomRow: 'flex items-center gap-2.5 px-3 py-1.5 border-t border-border bg-muted-background',\n mailBox: 'size-[30px] grid place-items-center shrink-0',\n mailIcon: 'size-4 text-muted',\n email: 'text-sm text-foreground/80 flex-1 truncate',\n actionSize: 'xs',\n },\n returning: {\n topRow: 'flex items-center gap-3 px-3.5 py-2.5',\n title: 'text-sm font-semibold text-foreground truncate',\n subtitle: 'text-xs text-foreground/80 truncate',\n bottomRow: 'flex items-center gap-3 px-3.5 py-1 border-t border-border bg-muted-background',\n mailBox: 'w-9 h-6 grid place-items-center shrink-0',\n mailIcon: 'size-3.5 text-muted',\n email: 'text-xs text-foreground/80 flex-1 truncate',\n actionSize: 'smaller',\n },\n};\n/** Identity (badge + title + subtitle) over an email row with a trailing action link. */\nexport function SignInAccountCard({ variant = 'returning', badge, title, subtitle, email, actionLabel, onAction, }) {\n const v = ACCOUNT_CARD_VARIANTS[variant];\n return (_jsxs(\"div\", { className: \"rounded-md border border-border bg-background overflow-hidden\", children: [_jsxs(\"div\", { className: v.topRow, children: [badge, _jsx(SignInIdentityLines, { title: title, subtitle: subtitle, titleClass: v.title, subtitleClass: v.subtitle })] }), _jsxs(\"div\", { className: v.bottomRow, children: [_jsx(\"div\", { className: v.mailBox, children: _jsx(Mail, { className: v.mailIcon }) }), _jsx(\"span\", { className: v.email, children: email }), _jsx(SignInInlineLinkButton, { size: v.actionSize, onClick: onAction, children: actionLabel })] })] }));\n}\n/** Single-row identity card: badge + title/subtitle + a trailing action link. */\nexport function SignInAccountRow({ badge, title, subtitle, actionLabel, onAction }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-3 px-3.5 py-2.5 rounded-md border border-border bg-muted-background\", children: [badge, _jsx(SignInIdentityLines, { title: title, subtitle: subtitle, titleClass: \"text-sm font-semibold text-foreground truncate\", subtitleClass: \"text-xs text-muted truncate\" }), _jsx(SignInInlineLinkButton, { onClick: onAction, children: actionLabel })] }));\n}\n/** Standalone bordered pill: mail icon + email + a trailing action link. */\nexport function SignInEmailRow({ email, actionLabel, onAction }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-2 px-3 py-2 rounded-md border border-border bg-muted-background\", children: [_jsx(Mail, { className: \"size-4 text-muted shrink-0\" }), _jsx(\"span\", { className: \"text-sm text-foreground/80 flex-1 truncate\", children: email }), _jsx(SignInInlineLinkButton, { onClick: onAction, children: actionLabel })] }));\n}\n/** \"Continue with <provider>\" button. */\nexport function SignInProviderButton({ provider, label, onClick, variant = 'outline' }) {\n const Icon = providerIcon(provider);\n if (variant === 'arrow') {\n // rtl-ok: arrow hover nudge moves toward inline-end with an explicit RTL mirror.\n // !size beats Button's [&_svg]:size-4 rule. Arrow fades in and nudges on hover.\n const arrowClass = '!size-3.5 text-muted opacity-0 group-hover:opacity-100 group-hover:translate-x-0.5 rtl:group-hover:-translate-x-0.5 transition'; // rtl-ok: matched line mirrors the hover nudge for RTL.\n return (_jsxs(Button, { variant: \"unstyled\", size: \"none\", onClick: onClick, className: \"cursor-pointer group h-[42px] w-full inline-flex items-center gap-3 ps-3.5 pe-3 rounded-md border border-border bg-background text-sm font-medium text-foreground transition hover:bg-muted-background\", children: [_jsx(Icon, { className: \"!size-[18px] shrink-0\" }), _jsx(\"span\", { className: \"flex-1 text-start\", children: label }), _jsx(ArrowRight, { className: arrowClass })] }));\n }\n const variantClass = variant === 'filled' ? '!bg-foreground text-background hover:!bg-foreground/90' : 'hover:shadow-sm';\n return (_jsxs(Button, { variant: \"outline\", onClick: onClick, className: `w-full py-5 flex rounded-lg transition duration-150 text-center ${variantClass}`, children: [_jsx(Icon, { className: \"!size-[18px]\" }), _jsx(\"span\", { className: \"text-sm font-medium\", children: label })] }));\n}\n/** Destructive notice: icon + bold title over a muted meta line. */\nexport function SignInCallout({ icon: Icon, title, meta }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-2.5 px-3 py-2.5 rounded-md bg-destructive-background border border-destructive/20\", children: [_jsx(Icon, { className: \"size-5 text-destructive shrink-0\" }), _jsxs(\"div\", { className: \"flex-1 min-w-0 text-sm\", children: [_jsx(\"div\", { className: \"font-semibold text-destructive\", children: title }), _jsx(\"div\", { className: \"text-xs text-destructive/80\", children: meta })] })] }));\n}\n/** Horizontal rule with a centered label. */\nexport function SignInOrDivider({ children }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-3 my-2 text-muted-foreground text-[10.5px] uppercase tracking-widest\", children: [_jsx(\"div\", { className: \"flex-1 h-px bg-border\" }), _jsx(\"span\", { children: children }), _jsx(\"div\", { className: \"flex-1 h-px bg-border\" })] }));\n}\n/** Labeled email input with an inline validation message. */\nexport function SignInEmailField({ inputRef, label, placeholder, value, onChange, invalid = false, error, }) {\n return (_jsxs(\"div\", { className: \"flex flex-col gap-1.5\", children: [_jsx(\"label\", { htmlFor: \"vt-login-email\", className: \"text-xs font-medium text-foreground/80\", children: label }), _jsx(\"input\", { ref: inputRef, id: \"vt-login-email\", name: \"vt-login-email\", type: \"email\", className: \"h-[42px] px-3.5 rounded-md border border-border bg-background text-sm text-foreground placeholder:text-muted-foreground outline-none transition focus:border-info focus:ring-4 focus:ring-info/15 aria-[invalid=true]:border-destructive aria-[invalid=true]:ring-destructive/15\", placeholder: placeholder, value: value, onChange: (e) => onChange(e.target.value), \"aria-invalid\": invalid, autoComplete: \"off\", autoCorrect: \"off\", autoCapitalize: \"off\", spellCheck: false, \"data-1p-ignore\": true, \"data-lpignore\": \"true\", \"data-form-type\": \"other\" }), error && (_jsx(\"div\", { role: \"alert\", className: \"text-xs text-destructive\", children: error }))] }));\n}\n//# sourceMappingURL=SignInPrimitives.js.map","import { getFirebaseAuth, setFirebaseTenant } from '@vertesia/ui/session';\nimport { signOut as firebaseSignOut, GithubAuthProvider, GoogleAuthProvider, OAuthProvider, signInWithRedirect, } from 'firebase/auth';\nconst LAST_SUCCESSFUL_LOGIN_KEY = 'vt.lastSuccessfulLogin';\nconst PENDING_SIGNIN_KEY = 'vt.pendingSignin';\nexport function readLastSuccessfulLogin() {\n try {\n const raw = localStorage.getItem(LAST_SUCCESSFUL_LOGIN_KEY);\n if (!raw)\n return null;\n const v = JSON.parse(raw);\n if (!v?.email || !v?.lastProvider)\n return null;\n return v;\n }\n catch {\n return null;\n }\n}\nexport function writeLastSuccessfulLogin(s) {\n try {\n localStorage.setItem(LAST_SUCCESSFUL_LOGIN_KEY, JSON.stringify(s));\n }\n catch {\n // localStorage unavailable — the record is not persisted\n }\n}\nexport function clearLastSuccessfulLogin() {\n try {\n localStorage.removeItem(LAST_SUCCESSFUL_LOGIN_KEY);\n }\n catch {\n // ignore\n }\n}\nexport function readPendingSignin() {\n try {\n const raw = sessionStorage.getItem(PENDING_SIGNIN_KEY);\n return raw ? JSON.parse(raw) : null;\n }\n catch {\n return null;\n }\n}\nfunction writePendingSignin(p) {\n try {\n sessionStorage.setItem(PENDING_SIGNIN_KEY, JSON.stringify(p));\n }\n catch {\n // ignore\n }\n}\nexport function clearPendingSignin() {\n try {\n sessionStorage.removeItem(PENDING_SIGNIN_KEY);\n }\n catch {\n // ignore\n }\n}\n/**\n * Clears the persisted sign-in records (last-successful-login and pending) and\n * signs out of Firebase. Best-effort: sign-out errors (e.g. no active session)\n * are swallowed.\n */\nexport async function resetSignInState() {\n clearLastSuccessfulLogin();\n clearPendingSignin();\n try {\n await firebaseSignOut(getFirebaseAuth());\n }\n catch {\n // best-effort: no active session, or auth not initialized\n }\n}\nfunction buildRedirectPath(redirectTo) {\n let path = redirectTo || window.location.pathname || '/';\n if (path[0] !== '/')\n path = `/${path}`;\n return path;\n}\nconst buildGoogleProvider = (email, redirectTo) => {\n const p = new GoogleAuthProvider();\n p.addScope('profile');\n p.addScope('email');\n p.setCustomParameters({\n redirect_uri: window.location.origin + buildRedirectPath(redirectTo),\n ...(email ? { login_hint: email } : { prompt: 'select_account' }),\n });\n return p;\n};\nconst buildGithubProvider = (email) => {\n const p = new GithubAuthProvider();\n p.addScope('profile');\n p.addScope('email');\n if (email)\n p.setCustomParameters({ login: email });\n return p;\n};\nconst buildMicrosoftProvider = (email) => {\n const p = new OAuthProvider('microsoft.com');\n p.addScope('profile');\n p.addScope('email');\n if (email)\n p.setCustomParameters({ login_hint: email });\n return p;\n};\nconst buildOidcProvider = (email) => {\n const p = new OAuthProvider('oidc.main');\n if (email)\n p.setCustomParameters({ login_hint: email });\n return p;\n};\nconst PROVIDER_BUILDERS = {\n google: buildGoogleProvider,\n github: buildGithubProvider,\n microsoft: buildMicrosoftProvider,\n oidc: buildOidcProvider,\n};\nfunction buildFirebaseProvider(idp, email, redirectTo) {\n return PROVIDER_BUILDERS[idp](email, redirectTo);\n}\nexport async function startSignIn(provider, email, redirectTo) {\n if (!email)\n return { ok: false, reason: 'no-email' };\n // A tenant-mapped email uses the tenant's provider (overriding `provider`); otherwise use `provider`.\n const tenant = await setFirebaseTenant(email);\n const auth = getFirebaseAuth();\n let effectiveIdp = provider;\n let tenantName;\n if (tenant) {\n // Tenant config dictates the IdP.\n if (tenant.provider)\n effectiveIdp = tenant.provider;\n tenantName = tenant.label || tenant.name || undefined;\n localStorage.setItem('tenantName', tenantName ?? '');\n }\n else {\n // No tenant — clear any stale tenant routing from a prior attempt.\n localStorage.removeItem('tenantName');\n if (auth.tenantId)\n auth.tenantId = null;\n }\n writePendingSignin({ email, provider: effectiveIdp, tenantName });\n void signInWithRedirect(auth, buildFirebaseProvider(effectiveIdp, email, redirectTo));\n return { ok: true };\n}\n/** Starts a provider sign-in directly, skipping email/tenant resolution and clearing any tenant routing. */\nexport function startSignInWithoutTenant(provider, redirectTo) {\n const auth = getFirebaseAuth();\n localStorage.removeItem('tenantName');\n if (auth.tenantId)\n auth.tenantId = null;\n void signInWithRedirect(auth, buildFirebaseProvider(provider, undefined, redirectTo));\n}\nexport function providerLabel(id) {\n if (id === 'google')\n return 'Google';\n if (id === 'github')\n return 'GitHub';\n if (id === 'microsoft')\n return 'Microsoft';\n return 'Sign In';\n}\nexport function emailLocalPart(email) {\n if (!email)\n return '';\n const at = email.lastIndexOf('@');\n return at > 0 ? email.slice(0, at) : email;\n}\nexport function emailDomain(email) {\n if (!email)\n return '';\n const at = email.lastIndexOf('@');\n return at > 0 ? email.slice(at + 1) : '';\n}\nexport function capitalizeFirst(s) {\n return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;\n}\nexport function emailInitial(email) {\n return (email || '?').charAt(0).toUpperCase();\n}\nexport function firstNameFromEmail(email) {\n const local = emailLocalPart(email);\n const parts = local.split(/[._-]+/).filter(Boolean);\n const first = parts[0] || 'friend';\n return first.charAt(0).toUpperCase() + first.slice(1).toLowerCase();\n}\nexport function isValidEmail(email) {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test((email || '').trim());\n}\n/**\n * Detects the customer-domain \"needs invite\" 403 from /auth/ensure-user by its message.\n * Walks the `cause` chain because the token fetch re-wraps the original error.\n */\nexport function isInviteRequiredError(err) {\n let current = err;\n for (let depth = 0; current != null && depth < 8; depth++) {\n const msg = current instanceof Error ? current.message : String(current);\n if (msg.includes('Customer-domain user requires an invite to join'))\n return true;\n current = current instanceof Error ? current.cause : undefined;\n }\n return false;\n}\n//# sourceMappingURL=signInUtils.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Spinner } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { providerIcon } from './SignInIcons';\nimport { SignInIconBadge, SignInStepButton, SignInStepHeader, SignInStepLayout } from './SignInPrimitives';\nimport { providerLabel } from './signInUtils';\nexport default function SignInAuthPending({ provider, onCancel }) {\n const { t } = useUITranslation();\n const Icon = providerIcon(provider);\n // OIDC has no brand name for the title; use a generic noun phrase.\n const titleProvider = provider === 'oidc' ? t('auth.pending.genericProvider') : providerLabel(provider);\n return (_jsxs(SignInStepLayout, { centered: true, children: [_jsxs(\"div\", { children: [_jsx(SignInIconBadge, { children: _jsx(Icon, { className: provider === 'oidc' ? 'size-6 text-info' : 'size-6' }) }), _jsx(SignInStepHeader, { title: t('auth.pending.title', { provider: titleProvider }), body: t('auth.pending.body') })] }), _jsxs(\"div\", { className: \"w-full flex flex-col gap-2\", children: [_jsxs(SignInStepButton, { variant: \"loading\", children: [_jsx(Spinner, {}), _jsx(\"span\", { children: t('auth.pending.authenticating') })] }), onCancel && (_jsx(SignInStepButton, { variant: \"ghost\", onClick: onCancel, children: t('auth.pending.cancel') }))] })] }));\n}\n//# sourceMappingURL=SignInAuthPending.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Spinner } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { setFirebaseTenant } from '@vertesia/ui/session';\nimport { ArrowRight } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { SignInEmailField, SignInStepButton, SignInStepHeader, SignInStepLayout } from './SignInPrimitives';\nimport { isValidEmail } from './signInUtils';\nexport default function SignInEmailStep({ initialEmail, onProceed }) {\n const { t } = useUITranslation();\n const [email, setEmail] = useState(initialEmail ?? '');\n const [submitError, setSubmitError] = useState(false);\n const [loading, setLoading] = useState(false);\n const inputRef = useRef(null);\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n const submit = async (e) => {\n e.preventDefault();\n if (loading)\n return;\n if (!isValidEmail(email)) {\n setSubmitError(true);\n return;\n }\n setSubmitError(false);\n setLoading(true);\n try {\n const tenant = await setFirebaseTenant(email.trim().toLowerCase());\n onProceed(email.trim().toLowerCase(), tenant ?? undefined);\n }\n catch {\n // resolveTenant failed quietly — proceed to providers panel\n onProceed(email.trim().toLowerCase(), undefined);\n }\n finally {\n setLoading(false);\n }\n };\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { eyebrow: t('auth.email.eyebrow'), title: t('auth.email.title'), body: t('auth.email.body') }), _jsxs(\"form\", { onSubmit: submit, noValidate: true, className: `flex flex-col ${submitError ? 'gap-2' : 'gap-6'}`, children: [_jsx(SignInEmailField, { inputRef: inputRef, label: t('auth.email.label'), placeholder: t('auth.email.placeholder'), value: email, onChange: (value) => {\n setEmail(value);\n if (submitError)\n setSubmitError(false);\n }, invalid: submitError, error: submitError ? t('auth.email.invalidError') : undefined }), _jsx(SignInStepButton, { type: \"submit\", disabled: loading, children: loading ? (_jsx(Spinner, {})) : (_jsxs(_Fragment, { children: [_jsx(\"span\", { children: t('auth.continue') }), _jsx(ArrowRight, { className: \"!size-3.5\" })] })) })] })] }));\n}\n//# sourceMappingURL=SignInEmailStep.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { SignInEmailRow, SignInProviderButton, SignInStepHeader, SignInStepLayout } from './SignInPrimitives';\nimport { providerLabel, startSignIn } from './signInUtils';\nconst PROVIDERS = ['google', 'github', 'microsoft'];\nexport default function SignInProvidersStep({ email, onBack, onProviderClicked, redirectTo, }) {\n const { t } = useUITranslation();\n const pick = async (provider) => {\n onProviderClicked(provider);\n await startSignIn(provider, email, redirectTo);\n };\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { eyebrow: t('auth.providers.eyebrow'), title: t('auth.providers.title'), body: t('auth.providers.bodyConsumer') }), _jsx(SignInEmailRow, { email: email, actionLabel: t('auth.change'), onAction: onBack }), _jsx(\"div\", { className: \"flex flex-col gap-2\", children: PROVIDERS.map((id) => (_jsx(SignInProviderButton, { provider: id, label: t('auth.continueWithProvider', { provider: providerLabel(id) }), onClick: () => pick(id), variant: \"arrow\" }, id))) })] }));\n}\n//# sourceMappingURL=SignInProvidersStep.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { SignInAccountCard, SignInAccountRow, SignInInitialsBadge, SignInProviderButton, SignInStepButton, SignInStepHeader, SignInStepLayout, } from './SignInPrimitives';\nimport { emailInitial, firstNameFromEmail, providerLabel, startSignIn, } from './signInUtils';\nexport default function SignInReturningStep({ session, onNotYou, onProviderClicked, redirectTo, }) {\n const { t } = useUITranslation();\n const firstName = session.name ? session.name.split(' ')[0] || session.name : firstNameFromEmail(session.email);\n const displayName = session.name || firstNameFromEmail(session.email);\n const avatar = _jsx(SignInInitialsBadge, { initials: emailInitial(session.email) });\n // A stored tenantName means we resolved the user's organization.\n const hasTenant = !!session.tenantName;\n const primaryLabel = session.lastProvider === 'oidc'\n ? t('auth.continueWithSignIn')\n : t('auth.continueWithProvider', { provider: providerLabel(session.lastProvider) });\n const continueWith = async (provider) => {\n onProviderClicked(provider);\n await startSignIn(provider, session.email, redirectTo);\n };\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { eyebrow: t('auth.returning.eyebrow'), title: t('auth.returning.title', { name: firstName }), body: t('auth.returning.body') }), hasTenant && session.tenantName ? (_jsx(SignInAccountCard, { variant: \"returning\", badge: avatar, title: displayName, subtitle: session.tenantName, email: session.email, actionLabel: t('auth.returning.notYou'), onAction: onNotYou })) : (_jsx(SignInAccountRow, { badge: avatar, title: displayName, subtitle: session.email, actionLabel: t('auth.returning.notYou'), onAction: onNotYou })), _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsx(SignInProviderButton, { provider: session.lastProvider, label: primaryLabel, onClick: () => continueWith(session.lastProvider), variant: \"filled\" }), _jsx(SignInStepButton, { variant: \"ghost\", onClick: onNotYou, children: t('auth.returning.useDifferent') })] })] }));\n}\n//# sourceMappingURL=SignInReturningStep.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { ShieldOff } from 'lucide-react';\nimport { SignInCallout, SignInStepButton, SignInStepHeader, SignInStepLayout } from './SignInPrimitives';\nimport { capitalizeFirst, emailDomain } from './signInUtils';\nexport default function SignInTenantBlockedStep({ email, tenantName, onBack }) {\n const { t } = useUITranslation();\n // Without a tenant name: subheading uses the i18n fallback, callout uses \"<Domain> Team\".\n const subheadingName = tenantName || t('auth.blocked.tenantFallback');\n const domain = emailDomain(email);\n const boxName = tenantName ||\n (domain\n ? t('auth.blocked.teamFromDomain', { domain: capitalizeFirst(domain) })\n : t('auth.blocked.tenantFallback'));\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { variant: \"destructive\", eyebrow: t('auth.blocked.eyebrow'), title: t('auth.blocked.title'), body: t('auth.blocked.body', { name: subheadingName, email }) }), _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsx(SignInCallout, { icon: ShieldOff, title: boxName, meta: t('auth.blocked.tenantMeta', { email }) }), _jsx(SignInStepButton, { variant: \"ghost\", onClick: onBack, children: t('auth.blocked.useDifferent') })] })] }));\n}\n//# sourceMappingURL=SignInTenantBlockedStep.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { SignInProviderButton } from './SignInPrimitives';\nimport { providerLabel, startSignIn, startSignInWithoutTenant } from './signInUtils';\n// \"Continue with <provider>\" button that owns its sign-in redirect.\nexport default function SignInWithProviderButton({ provider, email, redirectTo, variant = 'outline', onClick, }) {\n const { t } = useUITranslation();\n const label = provider === 'oidc'\n ? t('auth.continueWithSignIn')\n : t('auth.continueWithProvider', { provider: providerLabel(provider) });\n const signIn = () => {\n onClick?.();\n if (email) {\n void startSignIn(provider, email, redirectTo);\n }\n else {\n // OIDC needs a resolved tenant; the no-email path is only hit by no-tenant buttons.\n startSignInWithoutTenant(provider, redirectTo);\n }\n };\n return _jsx(SignInProviderButton, { provider: provider, label: label, onClick: signIn, variant: variant });\n}\n//# sourceMappingURL=SignInWithProviderButton.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { SignInAccountCard, SignInInitialsBadge, SignInStepButton, SignInStepHeader, SignInStepLayout, } from './SignInPrimitives';\nimport SignInWithProviderButton from './SignInWithProviderButton';\nimport { providerLabel } from './signInUtils';\nfunction tenantInitials(name) {\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((p) => p.charAt(0).toUpperCase())\n .join('');\n}\nexport default function SignInTenantStep({ email, tenant, onBack, onProviderClicked, redirectTo, }) {\n const { t } = useUITranslation();\n const tenantName = tenant.label || tenant.name || t('auth.blocked.tenantFallback');\n // Brands keep their identity; anything else routes through OIDC.\n const provider = tenant.provider === 'google' || tenant.provider === 'github' || tenant.provider === 'microsoft'\n ? tenant.provider\n : 'oidc';\n const idpName = provider === 'oidc' ? t('auth.tenant.viaIdpFallback') : providerLabel(provider);\n return (_jsxs(SignInStepLayout, { children: [_jsx(SignInStepHeader, { eyebrow: t('auth.tenant.eyebrow'), title: t('auth.tenant.title', { name: tenantName }), body: t('auth.tenant.body') }), _jsx(SignInAccountCard, { variant: \"tenant\", badge: _jsx(SignInInitialsBadge, { initials: tenantInitials(tenantName), shape: \"square\" }), title: tenantName, subtitle: t('auth.tenant.viaIdp', { idp: idpName }), email: email, actionLabel: t('auth.change'), onAction: onBack }), _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsx(SignInWithProviderButton, { provider: provider, email: email, redirectTo: redirectTo, variant: \"filled\", onClick: onProviderClicked }), _jsx(SignInStepButton, { variant: \"ghost\", onClick: onBack, children: t('auth.tenant.notPartOf', { name: tenantName }) })] })] }));\n}\n//# sourceMappingURL=SignInTenantStep.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, Input, RadioGroup, SelectBox } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { getFirebaseAuth } from '@vertesia/ui/session';\nimport { useEffect, useState } from 'react';\nexport default function SignupForm({ onSignup, goBack }) {\n const { t } = useUITranslation();\n const [accountType, setAccountType] = useState(undefined);\n const [companySize, setCompanySize] = useState(undefined);\n const [companyName, setCompanyName] = useState(undefined);\n const [companyWebsite, setCompanyWebsite] = useState(undefined);\n const [projectMaturity, setProjectMaturity] = useState(undefined);\n const [fbUser, setFbUser] = useState(undefined);\n const [error, setError] = useState(undefined);\n const isCompany = accountType === 'company';\n const companySizeOptions = [\n { id: 1, label: t('signup.size1to10') },\n { id: 11, label: t('signup.size11to100') },\n { id: 101, label: t('signup.size101to1000') },\n { id: 1001, label: t('signup.size1001to5000') },\n { id: 5001, label: t('signup.size5000plus') },\n ];\n const accountTypeOptions = [\n {\n id: 'personal',\n label: t('signup.personal'),\n description: t('signup.personalDescription'),\n },\n {\n id: 'company',\n label: t('signup.company'),\n description: t('signup.companyDescription'),\n },\n ];\n const projectMaturityOptions = [\n { id: 'testing', label: t('signup.justTesting') },\n { id: 'exploring', label: t('signup.activelyExploring') },\n { id: 'using', label: t('signup.alreadyUsing') },\n { id: 'migrating', label: t('signup.migratingLLMs') },\n { id: 'other', label: t('signup.other') },\n ];\n useEffect(() => {\n const user = getFirebaseAuth().currentUser;\n if (!user) {\n console.error('No user found');\n return;\n }\n setFbUser(user);\n }, []);\n const isValid = () => {\n if (!accountType) {\n setError(t('signup.pleaseSelectAccountType'));\n return false;\n }\n if (isCompany && !companyName) {\n setError(t('signup.pleaseEnterOrgName'));\n return false;\n }\n if (isCompany && !companySize) {\n setError(t('signup.pleaseSelectCompanySize'));\n return false;\n }\n return true;\n };\n const onSubmit = async () => {\n if (!isValid())\n return;\n if (!accountType)\n return;\n const signupData = {\n accountType: accountType,\n companyName: companyName,\n companySize: companySize?.id,\n companyWebsite: companyWebsite,\n maturity: projectMaturity,\n };\n window.localStorage.setItem('composableSignupData', JSON.stringify(signupData));\n const fbToken = await getFirebaseAuth().currentUser?.getIdToken();\n console.log('Got firebase token', getFirebaseAuth(), fbToken);\n if (!fbToken) {\n console.error('No firebase token found');\n return;\n }\n onSignup(signupData, fbToken);\n };\n return (_jsxs(\"div\", { className: \"flex flex-col space-y-2\", children: [_jsxs(\"div\", { className: \"prose\", children: [_jsx(\"p\", { className: \"prose text-sm text-muted pt-4\", children: t('signup.welcomeMessage', { name: fbUser?.displayName, email: fbUser?.email }) }), error && _jsx(\"div\", { className: \"text-destructive\", children: error })] }), _jsx(FormItem, { label: t('signup.accountType'), children: _jsx(RadioGroup, { options: accountTypeOptions, selected: accountTypeOptions.find((option) => option.id === accountType), onSelect: (option) => setAccountType(option.id) }) }), isCompany && (_jsxs(_Fragment, { children: [_jsx(FormItem, { label: t('signup.companySize'), children: _jsx(SelectBox, { className: \"w-full border border-accent bg-muted\", value: companySize, options: companySizeOptions, onChange: setCompanySize, optionLabel: (option) => option?.label, placeholder: t('signup.selectCompanySize') }) }), _jsx(FormItem, { label: t('signup.companyName'), children: _jsx(Input, { value: companyName, onChange: setCompanyName, type: \"text\", required: true }) }), _jsx(FormItem, { label: t('signup.companyWebsite'), children: _jsx(Input, { value: companyWebsite, onChange: setCompanyWebsite, type: \"text\" }) })] })), _jsx(FormItem, { label: t('signup.projectMaturity'), children: _jsx(SelectBox, { className: \"w-full border border-accent bg-muted\", options: projectMaturityOptions, value: projectMaturityOptions.find((option) => option.id === projectMaturity), optionLabel: (option) => option?.label, placeholder: t('signup.selectProjectMaturity'), onChange: (option) => setProjectMaturity(option?.id) }) }), _jsxs(\"div\", { className: \"pt-8 flex flex-col\", children: [_jsx(Button, { variant: \"primary\", onClick: onSubmit, size: \"xl\", children: _jsx(\"span\", { className: \"text-lg\", children: t('signup.signUp') }) }), _jsx(Button, { variant: \"ghost\", size: \"xl\", className: \"mt-4\", onClick: goBack, children: _jsx(\"span\", { className: \"\", children: t('signup.wrongAccountGoBack') }) })] })] }));\n}\nfunction FormItem({ label, children }) {\n return (_jsxs(\"div\", { className: \"flex flex-col space-y-2 pt-4\", children: [_jsx(\"div\", { className: \"text-sm text-muted\", children: label }), children] }));\n}\n//# sourceMappingURL=SignupForm.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Env } from '@vertesia/ui/env';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { RegionTag } from '@vertesia/ui/layout';\nimport { UserNotFoundError, useUserSession, useUXTracking } from '@vertesia/ui/session';\nimport { useCallback, useEffect, useState } from 'react';\nimport SignInAuthPending from './SignInAuthPending';\nimport SignInEmailStep from './SignInEmailStep';\nimport SignInProvidersStep from './SignInProvidersStep';\nimport SignInReturningStep from './SignInReturningStep';\nimport SignInTenantBlockedStep from './SignInTenantBlockedStep';\nimport SignInTenantStep from './SignInTenantStep';\nimport SignupForm from './SignupForm';\nimport { clearLastSuccessfulLogin, clearPendingSignin, isInviteRequiredError, readLastSuccessfulLogin, readPendingSignin, resetSignInState, writeLastSuccessfulLogin, } from './signInUtils';\nexport function SigninScreen({ allowedPrefix, isNested = false, lightLogo, darkLogo, preservePath, suppressAuthErrorPrefix, }) {\n const pathname = typeof window === 'undefined' ? '' : window.location.pathname;\n const allow = matchesPathPrefix(pathname, allowedPrefix);\n const suppressAuthError = matchesPathPrefix(pathname, suppressAuthErrorPrefix);\n return allow ? null : (_jsx(SigninScreenImpl, { isNested: isNested, lightLogo: lightLogo, darkLogo: darkLogo, preservePath: preservePath, suppressAuthError: suppressAuthError }));\n}\nfunction matchesPathPrefix(pathname, prefix) {\n const prefixes = Array.isArray(prefix) ? prefix : prefix ? [prefix] : [];\n return prefixes.some((candidate) => {\n if (pathname === candidate) {\n return true;\n }\n return pathname.startsWith(candidate.endsWith('/') ? candidate : `${candidate}/`);\n });\n}\nfunction SigninScreenImpl({ isNested = false, lightLogo, darkLogo, preservePath, suppressAuthError, }) {\n const { t } = useUITranslation();\n const { isLoading, user, authError, signOut } = useUserSession();\n const { trackEvent } = useUXTracking();\n const [storedSession, setStoredSession] = useState(() => readLastSuccessfulLogin());\n const [mode, setMode] = useState(() => {\n const s = readLastSuccessfulLogin();\n return s ? 'returning' : 'email';\n });\n const [email, setEmail] = useState('');\n const [tenant, setTenant] = useState(undefined);\n const [pendingProvider, setPendingProvider] = useState(null);\n useEffect(() => {\n if (!preservePath) {\n history.replaceState({}, '', '/');\n }\n }, [preservePath]);\n // Route based on authError surfaced by the session.\n useEffect(() => {\n if (!authError)\n return;\n if (authError instanceof UserNotFoundError) {\n setMode('signup');\n }\n else if (isInviteRequiredError(authError)) {\n const pending = readPendingSignin();\n if (pending)\n setEmail(pending.email);\n setMode('blocked');\n }\n }, [authError]);\n // On successful login, finalize the last-successful-login entry with the user's name.\n useEffect(() => {\n if (!user)\n return;\n const pending = readPendingSignin();\n if (!pending)\n return;\n writeLastSuccessfulLogin({\n email: pending.email,\n lastProvider: pending.provider,\n tenantName: pending.tenantName,\n name: user.name || undefined,\n });\n clearPendingSignin();\n }, [user]);\n const onProceedFromEmail = useCallback((e, t) => {\n setEmail(e);\n setTenant(t);\n setMode(t ? 'tenant' : 'providers');\n }, []);\n const onBack = useCallback(() => {\n setMode('email');\n setTenant(undefined);\n }, []);\n const onNotYou = useCallback(() => {\n clearLastSuccessfulLogin();\n clearPendingSignin();\n setStoredSession(null);\n setEmail('');\n setTenant(undefined);\n setMode('email');\n void signOut();\n }, [signOut]);\n const onProviderClicked = useCallback((provider) => {\n // Tenant context comes from a resolved tenant or stored tenantName, not the provider.\n const hasTenant = !!tenant || !!storedSession?.tenantName;\n // Only the pre-existing enterprise_signin event; non-tenant sign-ins emit nothing.\n if (hasTenant)\n trackEvent('enterprise_signin', { provider });\n setPendingProvider(provider);\n setMode('pending');\n // The redirect itself happens in the calling step's startSignIn(); this just shows the pending screen.\n }, [trackEvent, storedSession?.tenantName, tenant]);\n // \"Use a different email\" out of the blocked/signup screen. The user reached it\n // as a valid Firebase user with no Vertesia account, so a partial reset isn't\n // enough: unless we also clear the persisted records and sign out of Firebase,\n // the leftover session re-runs the invite check on the next auth change or\n // reload and lands them back on blocked.\n const startOver = useCallback(() => {\n setStoredSession(null); // drop the in-memory mirror too — resetSignInState only clears storage\n setEmail('');\n setTenant(undefined);\n setMode('email');\n void resetSignInState();\n }, []);\n // Submits the signup form to /auth/signup, then redirects into the app.\n const onSignup = (data, fbToken) => {\n const payload = { signupData: data, firebaseToken: fbToken };\n void fetch(`${Env.endpoints.studio}/auth/signup`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).then(() => {\n trackEvent('sign_up');\n window.location.href = '/';\n });\n };\n const shouldHideTransientAuthError = suppressAuthError && authError !== undefined && !(authError instanceof UserNotFoundError);\n if (isLoading || user || shouldHideTransientAuthError)\n return null;\n let content = null;\n if (mode === 'pending' && pendingProvider) {\n content = _jsx(SignInAuthPending, { provider: pendingProvider });\n }\n else if (mode === 'blocked') {\n content = (_jsx(SignInTenantBlockedStep, { email: email || storedSession?.email || '', tenantName: tenant?.label || tenant?.name || storedSession?.tenantName || undefined, onBack: startOver }));\n }\n else if (mode === 'signup' && !localStorage.getItem('tenantName')) {\n content = _jsx(SignupForm, { onSignup: onSignup, goBack: startOver });\n }\n else if (mode === 'tenant' && tenant) {\n content = (_jsx(SignInTenantStep, { email: email, tenant: tenant, onBack: onBack, onProviderClicked: () => onProviderClicked((tenant.provider ?? 'oidc')) }));\n }\n else if (mode === 'providers') {\n content = _jsx(SignInProvidersStep, { email: email, onBack: onBack, onProviderClicked: onProviderClicked });\n }\n else if (mode === 'returning' && storedSession) {\n content = (_jsx(SignInReturningStep, { session: storedSession, onNotYou: onNotYou, onProviderClicked: onProviderClicked }));\n }\n else {\n content = _jsx(SignInEmailStep, { initialEmail: email, onProceed: onProceedFromEmail });\n }\n return (_jsx(\"div\", { style: { zIndex: 999998 }, className: `${isNested ? 'absolute' : 'fixed'} inset-0 overflow-y-auto bg-background`, children: _jsx(\"div\", { className: \"min-h-full flex flex-col items-center justify-center py-12 px-4\", children: _jsxs(\"div\", { className: \"flex flex-col items-center w-full\", children: [(lightLogo || darkLogo) && (_jsxs(\"div\", { className: \"mb-7\", children: [lightLogo && _jsx(\"img\", { src: lightLogo, alt: \"Vertesia\", className: \"h-10 block dark:hidden\" }), darkLogo && _jsx(\"img\", { src: darkLogo, alt: \"Vertesia\", className: \"h-10 hidden dark:block\" })] })), content, authError && !(authError instanceof UserNotFoundError) && !isInviteRequiredError(authError) && (_jsx(\"div\", { className: \"mt-6 max-w-[420px] text-center text-sm text-muted\", children: _jsxs(\"div\", { children: [t('auth.signInError'), _jsx(\"br\", {}), t('auth.signInErrorContact'), _jsx(\"a\", { className: \"text-info mx-1\", href: \"mailto:support@vertesiahq.com\", children: \"support@vertesiahq.com\" }), t('auth.signInErrorPersists'), _jsx(\"pre\", { className: \"mt-2 text-xs\", children: t('auth.error', { message: authError.message }) })] }) })), _jsxs(\"div\", { className: \"flex items-center gap-5 mt-10 text-xs text-muted-foreground\", children: [_jsx(\"a\", { href: \"https://vertesiahq.com/privacy\", className: \"hover:text-foreground transition\", children: t('auth.privacyPolicy') }), _jsx(\"span\", { className: \"text-border\", children: \"\\u00B7\" }), _jsx(\"a\", { href: \"https://vertesiahq.com/terms\", className: \"hover:text-foreground transition\", children: t('auth.termsOfService') }), _jsx(\"span\", { className: \"text-border\", children: \"\\u00B7\" }), _jsx(RegionTag, { className: \"cursor-default\" })] })] }) }) }));\n}\n//# sourceMappingURL=SigninScreen.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, Center, ErrorBox, errorMessage, Input, SelectBox, Spinner, useFetch, useToast, } from '@vertesia/ui/core';\nimport { Env } from '@vertesia/ui/env';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { useLocation } from '@vertesia/ui/router';\nimport { fetchComposableTokenFromFirebaseToken, fetchComposableTokenFromVertesiaToken, getCurrentVertesiaToken, useUserSession, } from '@vertesia/ui/session';\nimport { useState } from 'react';\nconst LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost']);\nfunction parseRedirectUri(rawRedirect) {\n if (!rawRedirect) {\n return null;\n }\n let decoded;\n try {\n decoded = decodeURIComponent(rawRedirect);\n }\n catch {\n return null;\n }\n let parsed;\n try {\n parsed = new URL(decoded);\n }\n catch {\n return null;\n }\n if (parsed.protocol !== 'http:') {\n return null;\n }\n if (!parsed.port) {\n return null;\n }\n if (parsed.username || parsed.password) {\n return null;\n }\n if (!LOOPBACK_HOSTS.has(parsed.hostname)) {\n return null;\n }\n return parsed.toString();\n}\nfunction getClientInfo(location) {\n const params = new URLSearchParams(location.search);\n const redirect = parseRedirectUri(params.get('redirect_uri'));\n const code = params.get('code');\n if (!redirect || !code) {\n return null;\n }\n const profile = params.get('profile') ?? 'default';\n const project = params.get('project') ?? undefined;\n const account = params.get('account') ?? undefined;\n return { redirect, code, profile, project, account };\n}\nexport function TerminalLogin() {\n const [payload, setPayload] = useState();\n const [error, setError] = useState();\n const location = useLocation();\n const clientInfo = getClientInfo(location);\n const toast = useToast();\n const { t } = useUITranslation();\n const onAccept = async (data) => {\n if (!clientInfo)\n return;\n if (!data.profile) {\n toast({\n title: t('login.terminal.profileRequired'),\n description: t('login.terminal.profileRequiredDesc'),\n status: 'error',\n duration: 2000,\n });\n return;\n }\n if (!data.account) {\n toast({\n title: t('login.terminal.accountRequired'),\n description: t('login.terminal.accountRequiredDesc'),\n status: 'error',\n duration: 2000,\n });\n return;\n }\n if (!data.project) {\n toast({\n title: t('login.terminal.projectRequired'),\n description: t('login.terminal.projectRequiredDesc'),\n status: 'error',\n duration: 2000,\n });\n return;\n }\n // expire in 1 day\n let payload;\n try {\n const vertesiaToken = getCurrentVertesiaToken();\n const token = vertesiaToken\n ? await fetchComposableTokenFromVertesiaToken(vertesiaToken, data.account, data.project, 24 * 3600)\n : await fetchComposableTokenFromFirebaseToken(data.account, data.project, 24 * 3600);\n if (token) {\n payload = {\n ...data,\n studio_server_url: Env.endpoints.studio,\n zeno_server_url: Env.endpoints.zeno,\n token,\n };\n await fetch(clientInfo.redirect, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n setPayload(payload);\n }\n else {\n toast({\n title: t('login.terminal.failedToGetToken'),\n status: 'error',\n duration: 5000,\n });\n }\n }\n catch (err) {\n if (payload) {\n setError(err instanceof Error ? err : new Error(errorMessage(err)));\n setPayload(payload);\n }\n else {\n toast({\n title: t('login.terminal.errorAuthorizingClient'),\n description: errorMessage(err),\n status: 'error',\n duration: 5000,\n });\n }\n }\n };\n const getPageContent = () => {\n if (!clientInfo) {\n return (_jsx(ErrorBox, { title: t('login.terminal.invalidRequest'), children: t('login.terminal.invalidRequestDesc') }));\n }\n return payload ? (_jsx(AuthDoneScreen, { payload: payload, error: error })) : (_jsx(AuthAcceptScreen, { clientInfo: clientInfo, onAccept: onAccept }));\n };\n const page = getPageContent();\n return _jsx(\"div\", { className: \"w-full flex flex-col items-center gap-4 mt-24\", children: page });\n}\nfunction AuthAcceptScreen({ onAccept, clientInfo }) {\n const { client, user } = useUserSession();\n const { data: allProjects, error } = useFetch(() => (user ? client.projects.list() : Promise.resolve([])), [user]);\n const { t } = useUITranslation();\n if (error) {\n return _jsx(ErrorBox, { title: t('login.terminal.errorLoadingProjects'), children: errorMessage(error) });\n }\n const getEnvironmentName = () => {\n if (Env.isLocalDev) {\n return t('login.terminal.envLocalDev');\n }\n else if (Env.isDev) {\n return t('login.terminal.envStaging');\n }\n return t('login.terminal.envProduction');\n };\n const envName = getEnvironmentName();\n return user && allProjects ? (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"w-1/3\", children: [_jsxs(\"div\", { className: \"mb-4 text-xl font-semibold text-info\", children: [\"Authorizing client on \", envName, \" environment.\"] }), _jsxs(\"div\", { className: \"mb-2 text-md text-muted-foreground\", children: [_jsx(\"div\", { children: t('login.terminal.clientWantsAuth') }), _jsxs(\"div\", { children: [\"The client app code is \", _jsx(\"b\", { className: \"text-foreground\", children: clientInfo.code }), \". You can check if the code is correct in the terminal.\"] })] }), _jsxs(\"div\", { className: \"mb-2 text-sm text-muted-foreground\", children: [_jsx(\"div\", { children: t('login.terminal.chooseAccountProject') }), _jsx(\"div\", { children: t('login.terminal.profileNameNote') })] })] }), _jsx(ProfileForm, { onAccept: onAccept, allProjects: allProjects, data: clientInfo })] })) : (_jsx(Spinner, { size: \"lg\" }));\n}\nfunction AuthDoneScreen({ payload, error }) {\n const toast = useToast();\n const { t } = useUITranslation();\n const onCopy = () => {\n if (payload) {\n navigator.clipboard.writeText(JSON.stringify(payload));\n toast({\n title: t('login.terminal.authPayloadCopied'),\n description: error\n ? t('login.terminal.authPayloadCopiedWithError', { error: error.message })\n : t('login.terminal.authPayloadCopiedSuccess'),\n status: 'success',\n duration: 5000,\n });\n }\n };\n return (_jsxs(\"div\", { children: [error ? (_jsx(\"div\", { children: _jsx(ErrorBox, { title: t('login.terminal.failedToSendToken'), children: t('login.terminal.failedToSendTokenDesc', { error: error.message }) }) })) : (_jsx(\"div\", { children: t('login.terminal.clientAuthenticated') })), _jsx(Center, { className: \"mt-4\", children: _jsx(Button, { variant: \"secondary\", onClick: onCopy, children: t('login.terminal.copyAuthPayload') }) })] }));\n}\nfunction ProfileForm({ allProjects, data, onAccept }) {\n const { accounts, account, project } = useUserSession();\n const { t } = useUITranslation();\n const [currentData, setCurrentData] = useState(() => ({\n profile: data.profile,\n account: data.account ?? account?.id,\n project: data.project ?? project?.id,\n }));\n const onChangeProfile = (value) => {\n setCurrentData({ ...currentData, profile: value });\n };\n const onChangeAccount = (value) => {\n setCurrentData({ ...currentData, account: value.id, project: undefined });\n };\n const onChangeProject = (value) => {\n setCurrentData({ ...currentData, project: value.id });\n };\n const projects = allProjects.filter((p) => p.account === currentData.account);\n return (_jsxs(\"div\", { className: \"w-1/3\", children: [_jsxs(\"div\", { className: \"mb-4 flex flex-col gap-2\", children: [_jsx(\"span\", { className: \"font-semibold text-muted-foreground\", children: t('login.terminal.profileName') }), _jsx(Input, { type: \"text\", value: currentData.profile, onChange: onChangeProfile })] }), _jsxs(\"div\", { className: \"mb-4 flex flex-col gap-2\", children: [_jsx(\"span\", { className: \"font-semibold text-muted-foreground\", children: t('login.terminal.account') }), _jsx(SelectAccount, { value: currentData.account, onChange: onChangeAccount, accounts: accounts || [] })] }), _jsxs(\"div\", { className: \"mb-4 flex flex-col gap-2\", children: [_jsx(\"span\", { className: \"font-semibold text-muted-foreground\", children: t('login.terminal.project') }), _jsx(SelectProject, { value: currentData.project, onChange: onChangeProject, projects: projects })] }), _jsx(\"div\", { className: \"mb-4 text-sm text-attention\", children: t('login.terminal.browserPermissionNote') }), _jsx(\"div\", { children: _jsx(Button, { size: \"xl\", onClick: () => onAccept(currentData), children: t('login.terminal.authorizeClient') }) })] }));\n}\nfunction SelectAccount({ value, accounts, onChange }) {\n const { t } = useUITranslation();\n const _onChange = (value) => {\n onChange(value);\n };\n return (_jsx(SelectBox, { options: accounts, value: accounts?.find((a) => a.id === value), onChange: _onChange, by: \"id\", optionLabel: (option) => option.name, placeholder: t('login.terminal.selectAccount') }));\n}\nfunction SelectProject({ value, projects, onChange }) {\n const { t } = useUITranslation();\n const _onChange = (value) => {\n onChange(value);\n };\n return (_jsx(SelectBox, { by: \"id\", value: projects.find((p) => p.id === value), options: projects, optionLabel: (option) => option.name, placeholder: t('login.terminal.selectProject'), onChange: _onChange }));\n}\n//# sourceMappingURL=TerminalLogin.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle } from '@vertesia/ui/core';\nimport SignInWithProviderButton from './SignInWithProviderButton';\nexport default function SignInModal({ isOpen, onClose }) {\n return (_jsxs(Modal, { isOpen: isOpen, onClose: onClose, children: [_jsx(ModalTitle, { children: \"Sign In\" }), _jsxs(ModalBody, { className: \"flex flex-col gap-2\", children: [_jsx(SignInWithProviderButton, { provider: \"google\" }), _jsx(SignInWithProviderButton, { provider: \"github\" }), _jsx(SignInWithProviderButton, { provider: \"microsoft\" })] }), _jsx(ModalFooter, { align: \"right\", children: _jsx(Button, { variant: \"ghost\", onClick: onClose, children: \"Cancel\" }) })] }));\n}\n//# sourceMappingURL=SignInModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { getTenantIdFromProject } from '@vertesia/common';\nimport { Tabs, TabsBar, TabsPanel, VTooltip } from '@vertesia/ui/core';\nimport { Env } from '@vertesia/ui/env';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { useUserSession } from '@vertesia/ui/session';\n// Package version is now passed as prop from the consuming application\nimport { Check, CopyIcon } from 'lucide-react';\nimport { useState } from 'react';\nexport function InfoItems({ title, value }) {\n function copyToClipboard(value) {\n navigator.clipboard.writeText(value);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n }\n const [isCopied, setIsCopied] = useState(false);\n return (_jsxs(\"div\", { className: \"w-full flex justify-between items-center mb-1\", children: [_jsxs(\"div\", { className: \"flex flex-col w-[calc(100%-3rem)]\", children: [_jsx(\"div\", { className: \"text-sm px-2 dark:text-slate-200\", children: title }), _jsx(VTooltip, { description: value, size: \"xs\", placement: \"left\", children: _jsxs(\"div\", { className: \"text-xs truncate text-muted w-full text-start px-2\", children: [value, \" \"] }) })] }), isCopied ? (_jsx(Check, { className: \"size-4 cursor-pointer text-success\" })) : (_jsx(CopyIcon, { className: \"size-4 cursor-pointer text-gray-400 dark:text-slate-400\", onClick: () => copyToClipboard(value) }))] }));\n}\nexport default function InfoList() {\n const { t } = useUITranslation();\n const session = useUserSession();\n const { account, project, client, authToken } = session;\n const server = client.baseUrl;\n const store = client.store.baseUrl;\n // Behind the unified LB, server and store share one host (path-routing splits studio\n // vs zeno), so the Store row just duplicates Server — only show it when they differ.\n const showStore = store.replace(/\\/+$/, '') !== server.replace(/\\/+$/, '');\n const mcpServer = Env.endpoints.mcp ?? t('user.unknown');\n const tenantId = project ? getTenantIdFromProject(project) : '';\n const tabs = [\n {\n name: 'user',\n label: t('user.user'),\n content: (_jsxs(\"div\", { className: \"space-y-1 p-2\", children: [_jsx(InfoItems, { title: t('user.organizationId'), value: account?.id ?? t('user.unknown') }), _jsx(InfoItems, { title: t('user.projectId'), value: project?.id ?? t('user.unknown') }), _jsx(InfoItems, { title: t('user.userId'), value: authToken?.sub ?? t('user.unknown') }), _jsx(InfoItems, { title: t('user.organizationRoles'), value: authToken?.account_roles?.join(',') ?? t('user.unknown') }), _jsx(InfoItems, { title: t('user.projectRoles'), value: authToken?.project_roles?.join(',') ?? t('user.unknown') })] })),\n },\n {\n name: 'environment',\n label: t('user.environment'),\n content: (_jsxs(\"div\", { className: \"space-y-1 p-2\", children: [_jsx(InfoItems, { title: t('user.tenantId'), value: tenantId }), _jsx(InfoItems, { title: t('user.environment'), value: Env.type }), _jsx(InfoItems, { title: t('user.server'), value: server }), showStore && _jsx(InfoItems, { title: t('user.store'), value: store }), _jsx(InfoItems, { title: t('user.mcpServer'), value: mcpServer }), _jsx(InfoItems, { title: t('user.appVersion'), value: Env.version }), _jsx(InfoItems, { title: t('user.sdkVersion'), value: Env.sdkVersion || t('user.unknown') })] })),\n },\n ];\n return (_jsx(\"div\", { className: \"w-full\", children: _jsxs(Tabs, { defaultValue: \"user\", tabs: tabs, fullWidth: true, updateHash: false, children: [_jsx(TabsBar, {}), _jsx(TabsPanel, {})] }) }));\n}\n//# sourceMappingURL=UserInfo.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Permission } from '@vertesia/common';\nimport { Avatar, Button, MenuList, ModeToggle, Popover, PopoverContent, PopoverTrigger, Spinner, } from '@vertesia/ui/core';\nimport { useUserPermissions } from '@vertesia/ui/features';\nimport { useNavigate } from '@vertesia/ui/router';\nimport { useUserSession } from '@vertesia/ui/session';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport SignInModal from './SignInModal';\nimport InfoList from './UserInfo';\nexport function UserSessionMenu(_props) {\n const { user, isLoading } = useUserSession();\n const [showModal, setShowModal] = useState(false);\n if (isLoading) {\n return _jsx(Spinner, {});\n }\n else if (!user) {\n return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => setShowModal(true), children: \"Sign In\" }), _jsx(SignInModal, { isOpen: showModal, onClose: () => setShowModal(false) })] }));\n }\n else {\n return (_jsx(\"div\", { className: \"px-3\", children: _jsx(UserSessionPopup, { asMenuTrigger: true }) }));\n }\n}\nfunction UserSessionPopup({ className, asMenuTrigger = false }) {\n const session = useUserSession();\n const navigate = useNavigate();\n const perms = useUserPermissions();\n const { user } = session;\n if (!session || !user)\n return null;\n const isProjectManager = perms.hasPermission(Permission.project_admin);\n return (_jsxs(Popover, { click: true, children: [_jsx(PopoverTrigger, { children: _jsx(\"div\", { className: clsx(className, 'flex items-center justify-start', asMenuTrigger && 'cursor-pointer'), children: _jsx(Avatar, { size: \"sm\", color: \"bg-amber-500\", shape: \"circle\", \n /*src={picture} */\n name: user?.name }) }) }), _jsx(PopoverContent, { align: \"start\", className: \"w-[280px] mx-2 my-1 p-0\", children: _jsxs(\"div\", { className: \"divide-y divide-gray-200 dark:divide-slate-700\", children: [_jsxs(\"div\", { className: \"py-2 ps-2\", children: [_jsx(\"p\", { className: \"px-4 dark:text-white mb-1\", children: user?.name ?? 'Unknown' }), _jsx(\"p\", { className: \"px-4 text-xs text-gray-500\", children: user?.email ?? '' })] }), _jsx(\"div\", { className: \"w-full p-1\", children: _jsx(InfoList, {}) }), _jsx(\"div\", { className: \"py-2 ps-2\", children: _jsx(ModeToggle, {}) }), _jsx(\"div\", { className: \"py-2\", children: _jsxs(MenuList, { children: [isProjectManager && (_jsx(MenuList.Item, { className: \"px-2\", onClick: () => navigate('/settings', { replace: true }), children: \"Settings\" })), _jsx(MenuList.Item, { className: \"px-2\", onClick: () => session.logout(), children: \"Sign out\" })] }) })] }) })] }));\n}\n//# sourceMappingURL=UserSessionMenu.js.map","export function isVertesiaEmail(email) {\n return email\n ? email.endsWith('@vertesiahq.com') ||\n email.endsWith('@becomposable.com') ||\n email.endsWith('@composableprompts.com')\n : false;\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { useEffect, useState } from 'react';\nexport function SplashScreen({ icon: Icon }) {\n const { isLoading } = useUserSession();\n const [show, setShow] = useState(true);\n useEffect(() => {\n if (!isLoading) {\n setShow(false);\n }\n }, [isLoading]);\n return (_jsx(AnimatePresence, { children: show && (_jsx(motion.div, { style: { zIndex: 999999, position: 'fixed', inset: 0 }, className: \"fixed inset-x-0 inset-y-0\", initial: { opacity: 1 }, exit: { opacity: 0 }, transition: { ease: 'easeIn', duration: 0.5 }, children: _jsx(\"div\", { style: {\n display: 'flex',\n width: '100%',\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n }, className: \"flex w-full h-full items-center justify-center\", children: _jsx(\"div\", { className: \"animate-[spin_4s_linear_infinite]\", children: _jsx(\"div\", { className: \"animate-pulse rounded-full bg-transparent\", children: Icon || _jsx(LoadingIcon, {}) }) }) }) })) }));\n}\nfunction LoadingIcon() {\n const stopColor1 = 'currentColor';\n const stopColor2 = 'currentColor';\n // const stopColor1 = \"#4F46E5\";\n // const stopColor2 = \"#4F46E5\";\n return (_jsxs(\"svg\", { width: \"32\", height: \"32\", className: \"w-8 h-8 text-indigo-600\", viewBox: \"0 0 50 50\", xmlns: \"http://www.w3.org/2000/svg\", role: \"img\", \"aria-label\": \"Loading\", children: [_jsx(\"title\", { children: \"Loading\" }), _jsx(\"defs\", { children: _jsxs(\"linearGradient\", { id: \"spinner-gradient\", x1: \"1\", y1: \"0\", x2: \"0\", y2: \"1\", children: [_jsx(\"stop\", { offset: \"0%\", stopColor: stopColor1, stopOpacity: \"1\" }), _jsx(\"stop\", { offset: \"100%\", stopColor: stopColor2, stopOpacity: \"0\" })] }) }), _jsx(\"circle\", { cx: \"25\", cy: \"25\", r: \"20\", stroke: \"url(#spinner-gradient)\", strokeWidth: \"5\", fill: \"none\", strokeLinecap: \"round\" })] }));\n}\n//# sourceMappingURL=SplashScreen.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { ThemeProvider, ToastProvider } from '@vertesia/ui/core';\nimport { TypeRegistryProvider, UserPermissionProvider } from '@vertesia/ui/features';\nimport { LanguageBoundI18nProvider, LanguageProvider } from '@vertesia/ui/i18n';\nimport { UserSessionProvider } from '@vertesia/ui/session';\nimport { SigninScreen } from './login/SigninScreen';\nimport { SplashScreen } from './SplashScreen';\nexport function VertesiaShell({ children, lightLogo, darkLogo, loadingIcon, loadOnboardingStatus, preserveSignInPath, suppressSignInErrorPrefixes, defaultLanguage, }) {\n return (_jsx(ToastProvider, { children: _jsx(UserSessionProvider, { loadOnboardingStatus: loadOnboardingStatus, children: _jsx(TypeRegistryProvider, { children: _jsx(ThemeProvider, { defaultTheme: \"system\", storageKey: \"vite-ui-theme\", children: _jsx(LanguageProvider, { defaultLanguage: defaultLanguage, children: _jsxs(LanguageBoundI18nProvider, { children: [_jsx(SplashScreen, { icon: loadingIcon }), _jsx(SigninScreen, { allowedPrefix: \"/shared/\", darkLogo: darkLogo, lightLogo: lightLogo, preservePath: preserveSignInPath, suppressAuthErrorPrefix: suppressSignInErrorPrefixes }), _jsx(UserPermissionProvider, { children: children })] }) }) }) }) }) }));\n}\n//# sourceMappingURL=VertesiaShell.js.map"],"names":["AppInstallationContext","createContext","AppInstallationProvider","installation","children","_jsx","Provider","value","useAppInstallation","useContext","AppProjectSelector","app","onChange","placeholder","client","project","useUserSession","data","projects","error","useFetch","apps","getAppInstallationProjects","id","name","_jsxs","className","errorMessage","SelectProject","initialValue","localStorage","setItem","LastSelectedAccountId_KEY","account","LastSelectedProjectId_KEY","window","location","reload","setValue","useState","actualValue","find","p","SelectBox","by","options","optionLabel","option","StandaloneApp","AccessDenied","AccessDeniedMessage","StandaloneAppImpl","UnknownAppName","authToken","setInstallation","state","setState","useEffect","includes","getAppInstallationByName","then","inst","console","log","accounts","t","useUITranslation","selectedAccountId","setSelectedAccountId","allProjects","projectsByOrg","orgOptions","useMemo","grouped","push","orgsWithProjects","filter","a","length","filteredProjects","selectedOrg","Center","LockIcon","undefined","org","selected","InviteAcceptModal","session","showModal","setShowModal","invites","setInvites","listInvites","notLegacyInvites","i","catch","err","closeModal","inviteList","map","invite","role","invited_by","Button","size","onClick","async","acceptInvite","authCallback","fetchAccounts","fetchProjects","accept","variant","rejectInvite","remainingInvites","reject","warn","Modal","isOpen","onClose","ModalTitle","ModalBody","OidcIcon","LockKeyhole","PROVIDER_ICONS","google","props","viewBox","fill","d","github","fillRule","clipRule","microsoft","oidc","providerIcon","provider","SignInStepLayout","centered","SignInStepHeader","eyebrow","title","body","SIGNIN_STEP_BUTTON_VARIANTS","primary","loading","ghost","SignInStepButton","type","disabled","rest","trim","SignInInlineLinkButton","base","INITIALS_BADGE_SHAPES","circle","square","SignInInitialsBadge","initials","shape","SignInIconBadge","SignInIdentityLines","subtitle","titleClass","subtitleClass","ACCOUNT_CARD_VARIANTS","tenant","topRow","bottomRow","mailBox","mailIcon","email","actionSize","returning","SignInAccountCard","badge","actionLabel","onAction","v","Mail","SignInAccountRow","SignInEmailRow","SignInProviderButton","label","Icon","arrowClass","ArrowRight","SignInCallout","icon","meta","SignInEmailField","inputRef","invalid","htmlFor","ref","e","target","autoComplete","autoCorrect","autoCapitalize","spellCheck","LAST_SUCCESSFUL_LOGIN_KEY","PENDING_SIGNIN_KEY","readLastSuccessfulLogin","raw","getItem","JSON","parse","lastProvider","clearLastSuccessfulLogin","removeItem","readPendingSignin","sessionStorage","clearPendingSignin","resetSignInState","firebaseSignOut","getFirebaseAuth","buildRedirectPath","redirectTo","path","pathname","PROVIDER_BUILDERS","GoogleAuthProvider","addScope","setCustomParameters","redirect_uri","origin","login_hint","prompt","GithubAuthProvider","login","OAuthProvider","buildFirebaseProvider","idp","startSignIn","ok","reason","setFirebaseTenant","auth","tenantName","effectiveIdp","tenantId","stringify","writePendingSignin","signInWithRedirect","providerLabel","firstNameFromEmail","local","at","lastIndexOf","slice","emailLocalPart","first","split","Boolean","charAt","toUpperCase","toLowerCase","isInviteRequiredError","current","depth","Error","message","String","cause","SignInAuthPending","onCancel","titleProvider","Spinner","SignInEmailStep","initialEmail","onProceed","setEmail","submitError","setSubmitError","setLoading","useRef","focus","onSubmit","preventDefault","test","isValidEmail","noValidate","_Fragment","PROVIDERS","SignInProvidersStep","onBack","onProviderClicked","pick","SignInReturningStep","onNotYou","firstName","displayName","avatar","hasTenant","primaryLabel","continueWith","SignInTenantBlockedStep","subheadingName","domain","emailDomain","boxName","s","ShieldOff","SignInWithProviderButton","startSignInWithoutTenant","SignInTenantStep","idpName","join","SignupForm","onSignup","goBack","accountType","setAccountType","companySize","setCompanySize","companyName","setCompanyName","companyWebsite","setCompanyWebsite","projectMaturity","setProjectMaturity","fbUser","setFbUser","setError","isCompany","companySizeOptions","accountTypeOptions","description","projectMaturityOptions","user","currentUser","FormItem","RadioGroup","onSelect","Input","required","signupData","maturity","fbToken","getIdToken","SigninScreen","allowedPrefix","isNested","lightLogo","darkLogo","preservePath","suppressAuthErrorPrefix","allow","matchesPathPrefix","suppressAuthError","SigninScreenImpl","prefix","Array","isArray","some","candidate","startsWith","endsWith","isLoading","authError","signOut","trackEvent","useUXTracking","storedSession","setStoredSession","mode","setMode","setTenant","pendingProvider","setPendingProvider","history","replaceState","UserNotFoundError","pending","writeLastSuccessfulLogin","onProceedFromEmail","useCallback","startOver","payload","firebaseToken","fetch","Env","endpoints","studio","method","headers","href","content","style","zIndex","src","alt","RegionTag","LOOPBACK_HOSTS","Set","getClientInfo","params","URLSearchParams","search","redirect","rawRedirect","decoded","parsed","decodeURIComponent","URL","protocol","port","username","password","has","hostname","toString","parseRedirectUri","get","code","profile","TerminalLogin","setPayload","clientInfo","useLocation","toast","useToast","onAccept","status","duration","vertesiaToken","getCurrentVertesiaToken","token","fetchComposableTokenFromVertesiaToken","fetchComposableTokenFromFirebaseToken","studio_server_url","zeno_server_url","zeno","page","AuthDoneScreen","AuthAcceptScreen","ErrorBox","list","Promise","resolve","envName","isLocalDev","isDev","ProfileForm","navigator","clipboard","writeText","currentData","setCurrentData","SelectAccount","SignInModal","ModalFooter","align","InfoItems","isCopied","setIsCopied","VTooltip","placement","Check","CopyIcon","setTimeout","copyToClipboard","InfoList","server","baseUrl","store","showStore","replace","mcpServer","mcp","getTenantIdFromProject","tabs","sub","account_roles","project_roles","version","sdkVersion","Tabs","defaultValue","fullWidth","updateHash","TabsBar","TabsPanel","UserSessionMenu","_props","UserSessionPopup","asMenuTrigger","navigate","useNavigate","perms","useUserPermissions","isProjectManager","hasPermission","Permission","project_admin","Popover","click","PopoverTrigger","clsx","Avatar","color","PopoverContent","ModeToggle","MenuList","Item","logout","isVertesiaEmail","SplashScreen","show","setShow","AnimatePresence","motion","div","position","inset","initial","opacity","exit","transition","ease","display","width","height","alignItems","justifyContent","LoadingIcon","xmlns","x1","y1","x2","y2","offset","stopColor","stopOpacity","cx","cy","r","stroke","strokeWidth","strokeLinecap","VertesiaShell","loadingIcon","loadOnboardingStatus","preserveSignInPath","suppressSignInErrorPrefixes","defaultLanguage","ToastProvider","UserSessionProvider","TypeRegistryProvider","ThemeProvider","defaultTheme","storageKey","LanguageProvider","LanguageBoundI18nProvider","UserPermissionProvider"],"mappings":"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"}