@solidxai/core-ui 0.1.19 → 0.1.20-beta.1

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 (282) hide show
  1. package/dist/components/common/Link.d.ts.map +1 -1
  2. package/dist/components/common/Link.js +2 -1
  3. package/dist/components/common/Link.js.map +1 -1
  4. package/dist/components/common/Link.tsx +2 -1
  5. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +1 -0
  6. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  7. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +109 -23
  8. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  9. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +155 -34
  10. package/dist/components/core/chatter/SolidChatter.js +2 -2
  11. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  12. package/dist/components/core/chatter/SolidChatter.tsx +2 -2
  13. package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js +20 -19
  14. package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js.map +1 -1
  15. package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.tsx +16 -16
  16. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.d.ts.map +1 -1
  17. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js +3 -10
  18. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js.map +1 -1
  19. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx +3 -8
  20. package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.d.ts.map +1 -1
  21. package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.js +36 -9
  22. package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.js.map +1 -1
  23. package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.tsx +78 -7
  24. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.d.ts +1 -0
  25. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.d.ts.map +1 -1
  26. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.js +1 -1
  27. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.js.map +1 -1
  28. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.tsx +1 -1
  29. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.d.ts +4 -0
  30. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.d.ts.map +1 -0
  31. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.js +131 -0
  32. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.js.map +1 -0
  33. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.tsx +151 -0
  34. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.d.ts +4 -0
  35. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.d.ts.map +1 -0
  36. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.js +13 -0
  37. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.js.map +1 -0
  38. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.tsx +20 -0
  39. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  40. package/dist/components/core/form/SolidFormView.js +4 -0
  41. package/dist/components/core/form/SolidFormView.js.map +1 -1
  42. package/dist/components/core/form/SolidFormView.tsx +4 -0
  43. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  44. package/dist/components/core/kanban/SolidKanbanView.js +50 -15
  45. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  46. package/dist/components/core/kanban/SolidKanbanView.tsx +22 -3
  47. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  48. package/dist/components/core/list/SolidListView.js +16 -3
  49. package/dist/components/core/list/SolidListView.js.map +1 -1
  50. package/dist/components/core/list/SolidListView.tsx +16 -2
  51. package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
  52. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +4 -1
  53. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  54. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +4 -1
  55. package/dist/components/core/module/ModulePackageDialog.css +102 -0
  56. package/dist/components/core/module/ModulePackageDialog.d.ts +2 -1
  57. package/dist/components/core/module/ModulePackageDialog.d.ts.map +1 -1
  58. package/dist/components/core/module/ModulePackageDialog.js +216 -68
  59. package/dist/components/core/module/ModulePackageDialog.js.map +1 -1
  60. package/dist/components/core/module/ModulePackageDialog.tsx +356 -76
  61. package/dist/components/core/solid-agent/SolidAgentChat.d.ts.map +1 -1
  62. package/dist/components/core/solid-agent/SolidAgentChat.js +9 -3
  63. package/dist/components/core/solid-agent/SolidAgentChat.js.map +1 -1
  64. package/dist/components/core/solid-agent/SolidAgentChat.tsx +9 -4
  65. package/dist/components/core/solid-agent/SolidAgentMarkdown.d.ts.map +1 -1
  66. package/dist/components/core/solid-agent/SolidAgentMarkdown.js +25 -6
  67. package/dist/components/core/solid-agent/SolidAgentMarkdown.js.map +1 -1
  68. package/dist/components/core/solid-agent/SolidAgentMarkdown.tsx +15 -1
  69. package/dist/components/core/solid-agent/client/agentRuntime.d.ts +5 -0
  70. package/dist/components/core/solid-agent/client/agentRuntime.d.ts.map +1 -1
  71. package/dist/components/core/solid-agent/client/agentRuntime.js +77 -20
  72. package/dist/components/core/solid-agent/client/agentRuntime.js.map +1 -1
  73. package/dist/components/core/solid-agent/client/agentRuntime.ts +29 -1
  74. package/dist/components/core/solid-agent/client/agentSocket.d.ts +5 -1
  75. package/dist/components/core/solid-agent/client/agentSocket.d.ts.map +1 -1
  76. package/dist/components/core/solid-agent/client/agentSocket.js +27 -4
  77. package/dist/components/core/solid-agent/client/agentSocket.js.map +1 -1
  78. package/dist/components/core/solid-agent/client/agentSocket.ts +14 -3
  79. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js +2 -2
  80. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js.map +1 -1
  81. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx +5 -5
  82. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts +2 -0
  83. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts.map +1 -1
  84. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js +2 -2
  85. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js.map +1 -1
  86. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.ts +4 -4
  87. package/dist/components/core/solid-agent/thread/AgentThread.d.ts.map +1 -1
  88. package/dist/components/core/solid-agent/thread/AgentThread.js +61 -26
  89. package/dist/components/core/solid-agent/thread/AgentThread.js.map +1 -1
  90. package/dist/components/core/solid-agent/thread/AgentThread.tsx +74 -40
  91. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts +2 -1
  92. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts.map +1 -1
  93. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js +2 -1
  94. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js.map +1 -1
  95. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.tsx +3 -1
  96. package/dist/components/core/solid-agent/types.d.ts +3 -0
  97. package/dist/components/core/solid-agent/types.d.ts.map +1 -1
  98. package/dist/components/core/solid-agent/types.js +0 -9
  99. package/dist/components/core/solid-agent/types.js.map +1 -1
  100. package/dist/components/core/solid-agent/types.ts +4 -2
  101. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts +1 -1
  102. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts.map +1 -1
  103. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js +5 -2
  104. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js.map +1 -1
  105. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.tsx +11 -5
  106. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js +3 -0
  107. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js.map +1 -1
  108. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.tsx +4 -0
  109. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js +3 -0
  110. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js.map +1 -1
  111. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.tsx +4 -0
  112. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js +3 -0
  113. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js.map +1 -1
  114. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.tsx +4 -0
  115. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js +3 -0
  116. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js.map +1 -1
  117. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.tsx +4 -0
  118. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js +3 -0
  119. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js.map +1 -1
  120. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.tsx +4 -0
  121. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js +3 -0
  122. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js.map +1 -1
  123. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.tsx +4 -0
  124. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js +3 -0
  125. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js.map +1 -1
  126. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.tsx +4 -0
  127. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js +3 -0
  128. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js.map +1 -1
  129. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.tsx +4 -0
  130. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js +3 -0
  131. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js.map +1 -1
  132. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.tsx +4 -0
  133. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js +19 -0
  134. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js.map +1 -1
  135. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.tsx +20 -0
  136. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js +3 -0
  137. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js.map +1 -1
  138. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.tsx +4 -0
  139. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js +3 -0
  140. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js.map +1 -1
  141. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.tsx +4 -0
  142. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js +3 -0
  143. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js.map +1 -1
  144. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.tsx +4 -0
  145. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js +3 -0
  146. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js.map +1 -1
  147. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.tsx +4 -0
  148. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js +3 -0
  149. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js.map +1 -1
  150. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.tsx +4 -0
  151. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js +3 -0
  152. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js.map +1 -1
  153. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.tsx +4 -0
  154. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js +3 -0
  155. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js.map +1 -1
  156. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.tsx +4 -0
  157. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js +3 -0
  158. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js.map +1 -1
  159. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.tsx +4 -0
  160. package/dist/components/core/solid-agent/widgets/solidChatWidgets.module.css +9 -1
  161. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  162. package/dist/components/core/users/CreateUser.js +23 -8
  163. package/dist/components/core/users/CreateUser.js.map +1 -1
  164. package/dist/components/core/users/CreateUser.tsx +10 -6
  165. package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
  166. package/dist/components/layout/AdminHeaderActions.js +1 -29
  167. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  168. package/dist/components/layout/AdminHeaderActions.tsx +0 -42
  169. package/dist/components/layout/AdminTopHeader.js +2 -2
  170. package/dist/components/layout/AdminTopHeader.js.map +1 -1
  171. package/dist/components/layout/AdminTopHeader.tsx +2 -2
  172. package/dist/components/layout/AppSidebar.d.ts.map +1 -1
  173. package/dist/components/layout/AppSidebar.js +21 -5
  174. package/dist/components/layout/AppSidebar.js.map +1 -1
  175. package/dist/components/layout/AppSidebar.tsx +24 -6
  176. package/dist/components/layout/SolidAiStudioLayout.d.ts +0 -1
  177. package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
  178. package/dist/components/layout/SolidAiStudioLayout.js +8 -161
  179. package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
  180. package/dist/components/layout/SolidAiStudioLayout.tsx +6 -136
  181. package/dist/components/layout/user-profile-menu.js +10 -10
  182. package/dist/components/layout/user-profile-menu.js.map +1 -1
  183. package/dist/components/layout/user-profile-menu.tsx +3 -3
  184. package/dist/components/shad-cn-ui/SolidLightbox.d.ts +2 -1
  185. package/dist/components/shad-cn-ui/SolidLightbox.d.ts.map +1 -1
  186. package/dist/components/shad-cn-ui/SolidLightbox.js +11 -4
  187. package/dist/components/shad-cn-ui/SolidLightbox.js.map +1 -1
  188. package/dist/components/shad-cn-ui/SolidLightbox.tsx +14 -1
  189. package/dist/helpers/modelViewPersistence.d.ts +2 -0
  190. package/dist/helpers/modelViewPersistence.d.ts.map +1 -1
  191. package/dist/helpers/modelViewPersistence.js +72 -0
  192. package/dist/helpers/modelViewPersistence.js.map +1 -1
  193. package/dist/helpers/modelViewPersistence.ts +79 -0
  194. package/dist/helpers/registry.d.ts +6 -2
  195. package/dist/helpers/registry.d.ts.map +1 -1
  196. package/dist/helpers/registry.js +68 -3
  197. package/dist/helpers/registry.js.map +1 -1
  198. package/dist/helpers/registry.ts +62 -4
  199. package/dist/hooks/useModelsDevModels.d.ts +43 -0
  200. package/dist/hooks/useModelsDevModels.d.ts.map +1 -0
  201. package/dist/hooks/useModelsDevModels.js +81 -0
  202. package/dist/hooks/useModelsDevModels.js.map +1 -0
  203. package/dist/hooks/useModelsDevModels.ts +106 -0
  204. package/dist/hooks/useRouter.d.ts.map +1 -1
  205. package/dist/hooks/useRouter.js +3 -2
  206. package/dist/hooks/useRouter.js.map +1 -1
  207. package/dist/hooks/useRouter.ts +3 -2
  208. package/dist/index.d.ts +2 -2
  209. package/dist/index.d.ts.map +1 -1
  210. package/dist/index.js +1 -1
  211. package/dist/index.js.map +1 -1
  212. package/dist/index.ts +4 -1
  213. package/dist/modules/solidUiModule.d.ts +3 -2
  214. package/dist/modules/solidUiModule.d.ts.map +1 -1
  215. package/dist/modules/solidUiModule.js +1 -1
  216. package/dist/modules/solidUiModule.js.map +1 -1
  217. package/dist/modules/solidUiModule.ts +5 -1
  218. package/dist/redux/api/moduleApi.d.ts +12 -2
  219. package/dist/redux/api/moduleApi.d.ts.map +1 -1
  220. package/dist/redux/api/moduleApi.js +33 -3
  221. package/dist/redux/api/moduleApi.js.map +1 -1
  222. package/dist/redux/api/moduleApi.ts +17 -2
  223. package/dist/redux/api/solidChatterMessageApi.d.ts +3 -1
  224. package/dist/redux/api/solidChatterMessageApi.d.ts.map +1 -1
  225. package/dist/redux/api/solidChatterMessageApi.js +9 -1
  226. package/dist/redux/api/solidChatterMessageApi.js.map +1 -1
  227. package/dist/redux/api/solidChatterMessageApi.ts +9 -1
  228. package/dist/redux/store/defaultStoreConfig.d.ts +9 -1
  229. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  230. package/dist/resources/globals.css +30 -0
  231. package/dist/resources/solid-custom.css +10 -6
  232. package/dist/resources/solid-tailwind-generated.css +1 -1
  233. package/dist/routes/AppEventListener.d.ts.map +1 -1
  234. package/dist/routes/AppEventListener.js +3 -3
  235. package/dist/routes/AppEventListener.js.map +1 -1
  236. package/dist/routes/AppEventListener.tsx +2 -3
  237. package/dist/routes/pages/admin/core/AgentHubTagsField.css +21 -0
  238. package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts +17 -0
  239. package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts.map +1 -0
  240. package/dist/routes/pages/admin/core/AgentHubTagsField.js +171 -0
  241. package/dist/routes/pages/admin/core/AgentHubTagsField.js.map +1 -0
  242. package/dist/routes/pages/admin/core/AgentHubTagsField.tsx +125 -0
  243. package/dist/routes/pages/admin/core/AgentPersonaHistory.css +130 -0
  244. package/dist/routes/pages/admin/core/AgentPersonaHistory.d.ts +7 -0
  245. package/dist/routes/pages/admin/core/AgentPersonaHistory.d.ts.map +1 -0
  246. package/dist/routes/pages/admin/core/AgentPersonaHistory.js +228 -0
  247. package/dist/routes/pages/admin/core/AgentPersonaHistory.js.map +1 -0
  248. package/dist/routes/pages/admin/core/AgentPersonaHistory.tsx +234 -0
  249. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.css +13 -14
  250. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -1
  251. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +218 -165
  252. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -1
  253. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +221 -127
  254. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts.map +1 -1
  255. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js +14 -69
  256. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js.map +1 -1
  257. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx +15 -83
  258. package/dist/routes/pages/admin/core/AgentToolActivationDialog.d.ts +11 -0
  259. package/dist/routes/pages/admin/core/AgentToolActivationDialog.d.ts.map +1 -0
  260. package/dist/routes/pages/admin/core/AgentToolActivationDialog.js +166 -0
  261. package/dist/routes/pages/admin/core/AgentToolActivationDialog.js.map +1 -0
  262. package/dist/routes/pages/admin/core/AgentToolActivationDialog.tsx +140 -0
  263. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.css +26 -0
  264. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts.map +1 -1
  265. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js +94 -71
  266. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js.map +1 -1
  267. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx +60 -52
  268. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts +2 -0
  269. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts.map +1 -0
  270. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js +108 -0
  271. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js.map +1 -0
  272. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.tsx +96 -0
  273. package/dist/routes/solidRoutes.d.ts.map +1 -1
  274. package/dist/routes/solidRoutes.js +2 -0
  275. package/dist/routes/solidRoutes.js.map +1 -1
  276. package/dist/routes/solidRoutes.tsx +2 -0
  277. package/dist/types/extension-registry.d.ts +12 -0
  278. package/dist/types/extension-registry.d.ts.map +1 -1
  279. package/dist/types/extension-registry.js.map +1 -1
  280. package/dist/types/extension-registry.ts +15 -0
  281. package/dist/types/solid-core.d.ts +2 -0
  282. package/package.json +2 -1
@@ -23,7 +23,7 @@ import { usePathname } from "../../hooks/usePathname";
23
23
  import { useSearchParams } from "../../hooks/useSearchParams";
24
24
  import { env } from "../../adapters/env";
25
25
  import { normalizeAssetUrl } from "../../helpers/assetUrl";
26
- import { resolveRetainedModelViewRoute } from "../../helpers/modelViewPersistence";
26
+ import { getMenuContextForActiveRoute, resolveRetainedModelViewRoute } from "../../helpers/modelViewPersistence";
27
27
  import { SolidMenuItemIcon } from "./SolidMenuItemIcon";
28
28
  var defaultMenuKey = env("NEXT_PUBLIC_DEFAULT_MENU_KEY");
29
29
  var SIDEBAR_STORAGE_KEY = "solidx.sidebar.collapsed";
@@ -67,11 +67,27 @@ function doesSearchParamsMatchSubset(requiredParams, currentParams) {
67
67
  function isMenuPathActive(itemPath, currentPathname, currentSearchParams) {
68
68
  if (!itemPath)
69
69
  return false;
70
- var resolvedItemPath = resolveRetainedModelViewRoute(itemPath);
71
- var _a = getPathAndParams(resolvedItemPath), itemPathname = _a.pathname, itemSearchParams = _a.searchParams;
72
- if (itemPathname !== normalizePath(currentPathname))
70
+ var _a = getPathAndParams(itemPath), itemPathname = _a.pathname, itemSearchParams = _a.searchParams;
71
+ var currentPath = normalizePath(currentPathname);
72
+ var modelMenuMatch = itemPathname.match(/^(\/admin\/core\/[^/]+\/[^/]+)\/(?:list|tree|kanban|card)$/);
73
+ if (!modelMenuMatch) {
74
+ return itemPathname === currentPath && doesSearchParamsMatchSubset(itemSearchParams, currentSearchParams);
75
+ }
76
+ var modelPath = modelMenuMatch[1];
77
+ if (currentPath !== modelPath && !currentPath.startsWith(modelPath + "/"))
73
78
  return false;
74
- return doesSearchParamsMatchSubset(itemSearchParams, currentSearchParams);
79
+ // New routes keep identity in the URL. Older form routes use the saved view as a fallback.
80
+ var activeContext = getMenuContextForActiveRoute(currentPath, currentSearchParams);
81
+ var itemMenuId = itemSearchParams.get("menuItemId");
82
+ var activeMenuId = activeContext.get("menuItemId");
83
+ if (itemMenuId && activeMenuId)
84
+ return itemMenuId === activeMenuId;
85
+ var itemActionId = itemSearchParams.get("actionId");
86
+ var activeActionId = activeContext.get("actionId");
87
+ if (itemActionId && activeActionId)
88
+ return itemActionId === activeActionId;
89
+ // A model link without menu identity is matched by its model path alone.
90
+ return !itemMenuId && !itemActionId;
75
91
  }
76
92
  function cloneMenuItems(items) {
77
93
  if (items === void 0) { items = []; }
@@ -1 +1 @@
1
- {"version":3,"file":"AppSidebar.js","sourceRoot":"","sources":["../../../src/components/layout/AppSidebar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useGetSolidMenuBasedOnRoleQuery } from \"../../redux/api/solidMenuApi\";\nimport { hideNavbar, toggleNavbar } from \"../../redux/features/navbarSlice\";\nimport { setIsAuthenticated, setUser } from \"../../redux/features/userSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { AdminHeaderActions } from \"./AdminHeaderActions\";\nimport UserProfileMenu from \"./user-profile-menu\";\nimport SolidLink from \"../common/Link\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { env } from \"../../adapters/env\";\nimport { normalizeAssetUrl } from \"../../helpers/assetUrl\";\nimport { resolveRetainedModelViewRoute } from \"../../helpers/modelViewPersistence\";\nimport type { MenuItemIconSource } from \"../../helpers/menuItemIcons\";\nimport { SolidMenuItemIcon } from \"./SolidMenuItemIcon\";\n\ntype SolidMenuItem = Omit<MenuItemIconSource, \"children\" | \"icon\"> & {\n key?: string;\n title: string;\n path?: string;\n icon?: string | null;\n children?: SolidMenuItem[];\n};\n\nconst defaultMenuKey = env(\"NEXT_PUBLIC_DEFAULT_MENU_KEY\");\nconst SIDEBAR_STORAGE_KEY = \"solidx.sidebar.collapsed\";\nconst SELECTED_WORKSPACE_STORAGE_KEY = \"solidx.sidebar.selected-workspace\";\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\nconst DESKTOP_SIDEBAR_WIDTH = \"272px\";\nconst DEFAULT_WORKSPACE_TITLE = \"Solid Core\";\nconst DEFAULT_WORKSPACE_KEY = \"solid-core\";\n\nfunction normalizePath(path: string): string {\n if (!path || path === \"/\") return \"/\";\n return path.endsWith(\"/\") ? path.slice(0, -1) : path;\n}\n\nfunction getPathAndParams(targetPath: string): { pathname: string; searchParams: URLSearchParams } {\n const parsed = new URL(targetPath, \"http://localhost\");\n return {\n pathname: normalizePath(parsed.pathname),\n searchParams: new URLSearchParams(parsed.search),\n };\n}\n\nfunction doesSearchParamsMatchSubset(requiredParams: URLSearchParams, currentParams: URLSearchParams): boolean {\n const currentValueCounts = new Map<string, number>();\n currentParams.forEach((value, key) => {\n const token = `${key}=${value}`;\n currentValueCounts.set(token, (currentValueCounts.get(token) || 0) + 1);\n });\n\n let isSubset = true;\n requiredParams.forEach((value, key) => {\n if (!isSubset) return;\n const token = `${key}=${value}`;\n const count = currentValueCounts.get(token) || 0;\n if (count <= 0) {\n isSubset = false;\n return;\n }\n currentValueCounts.set(token, count - 1);\n });\n\n return isSubset;\n}\n\nfunction isMenuPathActive(itemPath: string | undefined, currentPathname: string, currentSearchParams: URLSearchParams): boolean {\n if (!itemPath) return false;\n\n const resolvedItemPath = resolveRetainedModelViewRoute(itemPath);\n const { pathname: itemPathname, searchParams: itemSearchParams } = getPathAndParams(resolvedItemPath);\n if (itemPathname !== normalizePath(currentPathname)) return false;\n\n return doesSearchParamsMatchSubset(itemSearchParams, currentSearchParams);\n}\n\nfunction cloneMenuItems(items: SolidMenuItem[] = []): SolidMenuItem[] {\n return items.map((item) => ({\n ...item,\n children: item.children ? cloneMenuItems(item.children) : [],\n }));\n}\n\nfunction filterMenuItems(items: SolidMenuItem[], query: string): SolidMenuItem[] {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return items;\n\n const next: SolidMenuItem[] = [];\n items.forEach((item) => {\n const children = item.children ? filterMenuItems(item.children, normalizedQuery) : [];\n const matchesSelf = item.title.toLowerCase().includes(normalizedQuery);\n const isPathlessParentMatch = matchesSelf && !item.path && item.children && item.children.length > 0;\n\n if (isPathlessParentMatch) {\n next.push({ ...item, children: cloneMenuItems(item.children) });\n return;\n }\n\n if (matchesSelf || children.length > 0) {\n next.push({ ...item, children });\n }\n });\n return next;\n}\n\nfunction resolveDefaultWorkspace(items: SolidMenuItem[]) {\n return (\n items.find((item) => item.key === DEFAULT_WORKSPACE_KEY) ||\n items.find((item) => item.title.trim().toLowerCase() === DEFAULT_WORKSPACE_TITLE.toLowerCase()) ||\n items.find((item) => item.key === defaultMenuKey) ||\n items[0]\n );\n}\n\nconst WorkspaceIcon = ({ workspace, className }: { workspace?: SolidMenuItem; className: string }) => {\n const iconUrl = normalizeAssetUrl(workspace?.icon) || null;\n const [failedUrl, setFailedUrl] = useState<string | null>(null);\n const showImage = !!iconUrl && failedUrl !== iconUrl;\n\n useEffect(() => {\n setFailedUrl(null);\n }, [iconUrl]);\n\n return (\n <span className={`${className}${showImage ? \" has-image\" : \"\"}`}>\n {showImage ? (\n <img\n src={iconUrl}\n alt=\"\"\n aria-hidden=\"true\"\n onError={() => setFailedUrl(iconUrl)}\n />\n ) : (\n (workspace?.title || \"W\").slice(0, 1).toUpperCase()\n )}\n </span>\n );\n};\n\nconst SidebarMenuTree = ({\n items,\n pathname,\n searchParams,\n forceExpand,\n}: {\n items: SolidMenuItem[];\n pathname: string;\n searchParams: URLSearchParams;\n forceExpand?: boolean;\n}) => {\n const [expandedKeys, setExpandedKeys] = useState<Record<string, boolean>>({});\n\n const buildNodeId = (node: SolidMenuItem, parentId: string, index: number) => {\n const base = node.key || node.path || node.title || `node-${index}`;\n return `${parentId}/${base}`;\n };\n\n useEffect(() => {\n const initialExpanded: Record<string, boolean> = {};\n if (forceExpand) {\n const walk = (nodes: SolidMenuItem[], parentId = \"root\") => {\n nodes.forEach((node, index) => {\n const nodeId = buildNodeId(node, parentId, index);\n if (node.children && node.children.length > 0 && node.key) {\n initialExpanded[nodeId] = true;\n walk(node.children, nodeId);\n } else if (node.children && node.children.length > 0) {\n initialExpanded[nodeId] = true;\n walk(node.children, nodeId);\n }\n });\n };\n walk(items);\n }\n setExpandedKeys(initialExpanded);\n }, [items, forceExpand]);\n\n const toggleExpanded = (nodeId: string) => {\n setExpandedKeys((prev) => ({ ...prev, [nodeId]: !prev[nodeId] }));\n };\n\n const renderNode = (node: SolidMenuItem, depth = 0, parentId = \"root\", index = 0) => {\n const nodeId = buildNodeId(node, parentId, index);\n const hasChildren = !!(node.children && node.children.length > 0);\n const isExpanded = expandedKeys[nodeId] === true;\n const isActive = isMenuPathActive(node.path, pathname, searchParams);\n const resolvedPath = node.path ? resolveRetainedModelViewRoute(node.path) : undefined;\n const paddingLeft = 12 + depth * 14;\n\n return (\n <li key={nodeId} className=\"solid-sidebar-tree-item\">\n <div\n className={`solid-sidebar-tree-row ${isActive ? \"is-active\" : \"\"}`}\n style={{ paddingLeft }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"solid-sidebar-tree-parent flex items-center gap-2\"\n onClick={() => toggleExpanded(nodeId)}\n aria-expanded={isExpanded}\n aria-label={`Toggle ${node.title}`}\n >\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </button>\n ) : node.path ? (\n <SolidLink href={resolvedPath} className=\"solid-sidebar-tree-link flex items-center gap-2\">\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </SolidLink>\n ) : (\n <span className=\"solid-sidebar-tree-link flex items-center gap-2\">\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </span>\n )}\n {hasChildren && (\n <button\n type=\"button\"\n className=\"solid-sidebar-tree-toggle\"\n onClick={() => toggleExpanded(nodeId)}\n aria-label={`Toggle ${node.title}`}\n >\n <span className=\"solid-tree-plusminus\">{isExpanded ? \"−\" : \"+\"}</span>\n </button>\n )}\n </div>\n {hasChildren && isExpanded && (\n <ul className=\"solid-sidebar-tree-list solid-sidebar-tree-children\">\n {node.children!.map((child, childIndex) => renderNode(child as SolidMenuItem, depth + 1, nodeId, childIndex))}\n </ul>\n )}\n </li>\n );\n };\n\n return <ul className=\"solid-sidebar-tree-list\">{items.map((item, index) => renderNode(item, 0, \"root\", index))}</ul>;\n};\n\nconst AppSidebar = () => {\n const dispatch = useDispatch();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const visibleNavbar = useSelector((state: any) => state.navbarState.visibleNavbar);\n const { data: menu } = useGetSolidMenuBasedOnRoleQuery(\"\");\n const workspaceSwitcherRef = useRef<HTMLDivElement | null>(null);\n\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [workspaceOpen, setWorkspaceOpen] = useState(false);\n const [selectedWorkspaceKey, setSelectedWorkspaceKey] = useState<string>(() => {\n if (typeof window === \"undefined\") return \"\";\n return window.localStorage.getItem(SELECTED_WORKSPACE_STORAGE_KEY) || \"\";\n });\n const [isDesktop, setIsDesktop] = useState<boolean>(typeof window === \"undefined\" ? true : window.innerWidth > 1199);\n const [isCollapsed, setIsCollapsed] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n const stored = window.localStorage.getItem(SIDEBAR_STORAGE_KEY);\n if (stored === null) return true;\n return stored === \"true\";\n });\n\n const { data } = useSession();\n\n useEffect(() => {\n if (data) {\n dispatch(setUser(data?.user));\n dispatch(setIsAuthenticated(true));\n }\n }, [data, dispatch]);\n\n useEffect(() => {\n const onResize = () => {\n const desktop = window.innerWidth > 1199;\n setIsDesktop(desktop);\n if (desktop) {\n dispatch(hideNavbar());\n }\n };\n\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [dispatch]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(SIDEBAR_STORAGE_KEY, String(isCollapsed));\n }, [isCollapsed]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!selectedWorkspaceKey) {\n window.localStorage.removeItem(SELECTED_WORKSPACE_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(SELECTED_WORKSPACE_STORAGE_KEY, selectedWorkspaceKey);\n }, [selectedWorkspaceKey]);\n\n useEffect(() => {\n const width = isDesktop ? (isCollapsed ? \"0px\" : DESKTOP_SIDEBAR_WIDTH) : \"0px\";\n document.documentElement.style.setProperty(\"--solid-sidebar-width\", width);\n }, [isDesktop, isCollapsed]);\n\n useEffect(() => {\n if (!menu?.data?.length) return;\n const defaultWorkspace = resolveDefaultWorkspace(menu.data);\n const hasSelectedWorkspace = menu.data.some((workspace: SolidMenuItem) => workspace.key === selectedWorkspaceKey);\n const nextWorkspaceKey = hasSelectedWorkspace ? selectedWorkspaceKey : defaultWorkspace?.key || \"\";\n\n if (nextWorkspaceKey !== selectedWorkspaceKey) {\n setSelectedWorkspaceKey(nextWorkspaceKey);\n }\n }, [menu, selectedWorkspaceKey]);\n\n useEffect(() => {\n if (!isDesktop) {\n dispatch(hideNavbar());\n }\n }, [pathname, dispatch, isDesktop]);\n\n useEffect(() => {\n const onToggleRequest = () => {\n if (window.innerWidth > 1199) {\n setIsCollapsed((prev) => !prev);\n return;\n }\n dispatch(toggleNavbar());\n };\n\n window.addEventListener(SIDEBAR_TOGGLE_EVENT, onToggleRequest);\n return () => window.removeEventListener(SIDEBAR_TOGGLE_EVENT, onToggleRequest);\n }, [dispatch]);\n\n useEffect(() => {\n if (!workspaceOpen) return;\n\n const handlePointerDown = (event: MouseEvent) => {\n const switcher = workspaceSwitcherRef.current;\n const target = event.target as Node;\n\n if (!switcher || switcher.contains(target)) {\n return;\n }\n\n setWorkspaceOpen(false);\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [workspaceOpen]);\n\n const workspaces: SolidMenuItem[] = menu?.data || [];\n const selectedWorkspace = workspaces.find((m) => m.key === selectedWorkspaceKey) || workspaces[0];\n const selectedWorkspaceChildren = selectedWorkspace?.children || [];\n\n const filteredMenu = useMemo(\n () => filterMenuItems(selectedWorkspaceChildren, searchTerm),\n [selectedWorkspaceChildren, searchTerm]\n );\n\n const shellClasses = [\n \"solid-sidebar\",\n isDesktop && isCollapsed ? \"is-collapsed\" : \"\",\n !isDesktop && visibleNavbar ? \"is-open\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n // The collapsed preference belongs to the desktop sidebar. Mobile uses\n // the navbar visibility state for its drawer, so it must always render\n // the full menu when opened.\n const isSidebarContentCollapsed = isDesktop && isCollapsed;\n\n const selectWorkspace = (workspace: SolidMenuItem) => {\n setSelectedWorkspaceKey(workspace.key || \"\");\n setSearchTerm(\"\");\n setWorkspaceOpen(false);\n };\n\n return (\n <>\n {!isDesktop && visibleNavbar && <div className=\"solid-sidebar-backdrop\" onClick={() => dispatch(toggleNavbar())} />}\n\n <aside className={shellClasses}>\n <div className=\"solid-sidebar-header\">\n <div className=\"solid-workspace-switcher\" ref={workspaceSwitcherRef}>\n <button\n type=\"button\"\n className=\"solid-workspace-trigger\"\n onClick={() => setWorkspaceOpen((prev) => !prev)}\n aria-label=\"Select workspace\"\n >\n <WorkspaceIcon workspace={selectedWorkspace} className=\"solid-workspace-avatar\" />\n {!isSidebarContentCollapsed && (\n <>\n <span className=\"solid-workspace-label-wrap\">\n <span className=\"solid-workspace-label-top\">Workspace</span>\n <span className=\"solid-workspace-label\">{selectedWorkspace?.title || \"Workspace\"}</span>\n </span>\n <span className={`solid-workspace-chevron-dual ${workspaceOpen ? \"is-open\" : \"\"}`} aria-hidden=\"true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M4 6L7 3L10 6\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M4 8L7 11L10 8\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </>\n )}\n </button>\n\n {workspaceOpen && !isSidebarContentCollapsed && (\n <div className=\"solid-workspace-menu\">\n {workspaces.map((workspace) => (\n <button\n type=\"button\"\n key={workspace.key || workspace.title}\n className={`solid-workspace-item ${workspace.key === selectedWorkspace?.key ? \"is-active\" : \"\"}`}\n onClick={() => selectWorkspace(workspace)}\n >\n <WorkspaceIcon workspace={workspace} className=\"solid-workspace-item-avatar\" />\n <span className=\"solid-workspace-item-label\">{workspace.title}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n </div>\n\n {!isSidebarContentCollapsed ? (\n <>\n <div className=\"solid-sidebar-search-wrap\">\n <input\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder=\"Search in menu...\"\n className=\"solid-sidebar-search\"\n />\n </div>\n\n <div className=\"solid-sidebar-tree-wrap\">\n <SidebarMenuTree items={filteredMenu} pathname={pathname} searchParams={searchParams} forceExpand={!!searchTerm.trim()} />\n </div>\n </>\n ) : (\n <div className=\"solid-sidebar-collapsed-nav\">\n {filteredMenu.slice(0, 10).map((item) => (\n <SolidLink\n key={item.key || item.title}\n href={item.path || \"#\"}\n className={`solid-collapsed-item ${isMenuPathActive(item.path, pathname, searchParams) ? \"is-active\" : \"\"}`}\n title={item.title}\n >\n {item.title.slice(0, 1).toUpperCase()}\n </SolidLink>\n ))}\n </div>\n )}\n\n <div className=\"solid-sidebar-footer\">\n <AdminHeaderActions variant=\"sidebar\" />\n <UserProfileMenu />\n </div>\n </aside>\n\n {isDesktop && isCollapsed && (\n <button\n type=\"button\"\n className=\"solid-sidebar-hotspot\"\n onClick={() => setIsCollapsed(false)}\n aria-label=\"Expand sidebar\"\n title=\"Expand sidebar\"\n />\n )}\n </>\n );\n};\n\nexport default AppSidebar;\n"]}
1
+ {"version":3,"file":"AppSidebar.js","sourceRoot":"","sources":["../../../src/components/layout/AppSidebar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useGetSolidMenuBasedOnRoleQuery } from \"../../redux/api/solidMenuApi\";\nimport { hideNavbar, toggleNavbar } from \"../../redux/features/navbarSlice\";\nimport { setIsAuthenticated, setUser } from \"../../redux/features/userSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { AdminHeaderActions } from \"./AdminHeaderActions\";\nimport UserProfileMenu from \"./user-profile-menu\";\nimport SolidLink from \"../common/Link\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { env } from \"../../adapters/env\";\nimport { normalizeAssetUrl } from \"../../helpers/assetUrl\";\nimport { getMenuContextForActiveRoute, resolveRetainedModelViewRoute } from \"../../helpers/modelViewPersistence\";\nimport type { MenuItemIconSource } from \"../../helpers/menuItemIcons\";\nimport { SolidMenuItemIcon } from \"./SolidMenuItemIcon\";\n\ntype SolidMenuItem = Omit<MenuItemIconSource, \"children\" | \"icon\"> & {\n key?: string;\n title: string;\n path?: string;\n icon?: string | null;\n children?: SolidMenuItem[];\n};\n\nconst defaultMenuKey = env(\"NEXT_PUBLIC_DEFAULT_MENU_KEY\");\nconst SIDEBAR_STORAGE_KEY = \"solidx.sidebar.collapsed\";\nconst SELECTED_WORKSPACE_STORAGE_KEY = \"solidx.sidebar.selected-workspace\";\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\nconst DESKTOP_SIDEBAR_WIDTH = \"272px\";\nconst DEFAULT_WORKSPACE_TITLE = \"Solid Core\";\nconst DEFAULT_WORKSPACE_KEY = \"solid-core\";\n\nfunction normalizePath(path: string): string {\n if (!path || path === \"/\") return \"/\";\n return path.endsWith(\"/\") ? path.slice(0, -1) : path;\n}\n\nfunction getPathAndParams(targetPath: string): { pathname: string; searchParams: URLSearchParams } {\n const parsed = new URL(targetPath, \"http://localhost\");\n return {\n pathname: normalizePath(parsed.pathname),\n searchParams: new URLSearchParams(parsed.search),\n };\n}\n\nfunction doesSearchParamsMatchSubset(requiredParams: URLSearchParams, currentParams: URLSearchParams): boolean {\n const currentValueCounts = new Map<string, number>();\n currentParams.forEach((value, key) => {\n const token = `${key}=${value}`;\n currentValueCounts.set(token, (currentValueCounts.get(token) || 0) + 1);\n });\n\n let isSubset = true;\n requiredParams.forEach((value, key) => {\n if (!isSubset) return;\n const token = `${key}=${value}`;\n const count = currentValueCounts.get(token) || 0;\n if (count <= 0) {\n isSubset = false;\n return;\n }\n currentValueCounts.set(token, count - 1);\n });\n\n return isSubset;\n}\n\nfunction isMenuPathActive(itemPath: string | undefined, currentPathname: string, currentSearchParams: URLSearchParams): boolean {\n if (!itemPath) return false;\n\n const { pathname: itemPathname, searchParams: itemSearchParams } = getPathAndParams(itemPath);\n const currentPath = normalizePath(currentPathname);\n const modelMenuMatch = itemPathname.match(/^(\\/admin\\/core\\/[^/]+\\/[^/]+)\\/(?:list|tree|kanban|card)$/);\n\n if (!modelMenuMatch) {\n return itemPathname === currentPath && doesSearchParamsMatchSubset(itemSearchParams, currentSearchParams);\n }\n\n const modelPath = modelMenuMatch[1];\n if (currentPath !== modelPath && !currentPath.startsWith(modelPath + \"/\")) return false;\n\n // New routes keep identity in the URL. Older form routes use the saved view as a fallback.\n const activeContext = getMenuContextForActiveRoute(currentPath, currentSearchParams);\n const itemMenuId = itemSearchParams.get(\"menuItemId\");\n const activeMenuId = activeContext.get(\"menuItemId\");\n if (itemMenuId && activeMenuId) return itemMenuId === activeMenuId;\n\n const itemActionId = itemSearchParams.get(\"actionId\");\n const activeActionId = activeContext.get(\"actionId\");\n if (itemActionId && activeActionId) return itemActionId === activeActionId;\n\n // A model link without menu identity is matched by its model path alone.\n return !itemMenuId && !itemActionId;\n}\n\nfunction cloneMenuItems(items: SolidMenuItem[] = []): SolidMenuItem[] {\n return items.map((item) => ({\n ...item,\n children: item.children ? cloneMenuItems(item.children) : [],\n }));\n}\n\nfunction filterMenuItems(items: SolidMenuItem[], query: string): SolidMenuItem[] {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return items;\n\n const next: SolidMenuItem[] = [];\n items.forEach((item) => {\n const children = item.children ? filterMenuItems(item.children, normalizedQuery) : [];\n const matchesSelf = item.title.toLowerCase().includes(normalizedQuery);\n const isPathlessParentMatch = matchesSelf && !item.path && item.children && item.children.length > 0;\n\n if (isPathlessParentMatch) {\n next.push({ ...item, children: cloneMenuItems(item.children) });\n return;\n }\n\n if (matchesSelf || children.length > 0) {\n next.push({ ...item, children });\n }\n });\n return next;\n}\n\nfunction resolveDefaultWorkspace(items: SolidMenuItem[]) {\n return (\n items.find((item) => item.key === DEFAULT_WORKSPACE_KEY) ||\n items.find((item) => item.title.trim().toLowerCase() === DEFAULT_WORKSPACE_TITLE.toLowerCase()) ||\n items.find((item) => item.key === defaultMenuKey) ||\n items[0]\n );\n}\n\nconst WorkspaceIcon = ({ workspace, className }: { workspace?: SolidMenuItem; className: string }) => {\n const iconUrl = normalizeAssetUrl(workspace?.icon) || null;\n const [failedUrl, setFailedUrl] = useState<string | null>(null);\n const showImage = !!iconUrl && failedUrl !== iconUrl;\n\n useEffect(() => {\n setFailedUrl(null);\n }, [iconUrl]);\n\n return (\n <span className={`${className}${showImage ? \" has-image\" : \"\"}`}>\n {showImage ? (\n <img\n src={iconUrl}\n alt=\"\"\n aria-hidden=\"true\"\n onError={() => setFailedUrl(iconUrl)}\n />\n ) : (\n (workspace?.title || \"W\").slice(0, 1).toUpperCase()\n )}\n </span>\n );\n};\n\nconst SidebarMenuTree = ({\n items,\n pathname,\n searchParams,\n forceExpand,\n}: {\n items: SolidMenuItem[];\n pathname: string;\n searchParams: URLSearchParams;\n forceExpand?: boolean;\n}) => {\n const [expandedKeys, setExpandedKeys] = useState<Record<string, boolean>>({});\n\n const buildNodeId = (node: SolidMenuItem, parentId: string, index: number) => {\n const base = node.key || node.path || node.title || `node-${index}`;\n return `${parentId}/${base}`;\n };\n\n useEffect(() => {\n const initialExpanded: Record<string, boolean> = {};\n if (forceExpand) {\n const walk = (nodes: SolidMenuItem[], parentId = \"root\") => {\n nodes.forEach((node, index) => {\n const nodeId = buildNodeId(node, parentId, index);\n if (node.children && node.children.length > 0 && node.key) {\n initialExpanded[nodeId] = true;\n walk(node.children, nodeId);\n } else if (node.children && node.children.length > 0) {\n initialExpanded[nodeId] = true;\n walk(node.children, nodeId);\n }\n });\n };\n walk(items);\n }\n setExpandedKeys(initialExpanded);\n }, [items, forceExpand]);\n\n const toggleExpanded = (nodeId: string) => {\n setExpandedKeys((prev) => ({ ...prev, [nodeId]: !prev[nodeId] }));\n };\n\n const renderNode = (node: SolidMenuItem, depth = 0, parentId = \"root\", index = 0) => {\n const nodeId = buildNodeId(node, parentId, index);\n const hasChildren = !!(node.children && node.children.length > 0);\n const isExpanded = expandedKeys[nodeId] === true;\n const isActive = isMenuPathActive(node.path, pathname, searchParams);\n const resolvedPath = node.path ? resolveRetainedModelViewRoute(node.path) : undefined;\n const paddingLeft = 12 + depth * 14;\n\n return (\n <li key={nodeId} className=\"solid-sidebar-tree-item\">\n <div\n className={`solid-sidebar-tree-row ${isActive ? \"is-active\" : \"\"}`}\n style={{ paddingLeft }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"solid-sidebar-tree-parent flex items-center gap-2\"\n onClick={() => toggleExpanded(nodeId)}\n aria-expanded={isExpanded}\n aria-label={`Toggle ${node.title}`}\n >\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </button>\n ) : node.path ? (\n <SolidLink href={resolvedPath} className=\"solid-sidebar-tree-link flex items-center gap-2\">\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </SolidLink>\n ) : (\n <span className=\"solid-sidebar-tree-link flex items-center gap-2\">\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </span>\n )}\n {hasChildren && (\n <button\n type=\"button\"\n className=\"solid-sidebar-tree-toggle\"\n onClick={() => toggleExpanded(nodeId)}\n aria-label={`Toggle ${node.title}`}\n >\n <span className=\"solid-tree-plusminus\">{isExpanded ? \"−\" : \"+\"}</span>\n </button>\n )}\n </div>\n {hasChildren && isExpanded && (\n <ul className=\"solid-sidebar-tree-list solid-sidebar-tree-children\">\n {node.children!.map((child, childIndex) => renderNode(child as SolidMenuItem, depth + 1, nodeId, childIndex))}\n </ul>\n )}\n </li>\n );\n };\n\n return <ul className=\"solid-sidebar-tree-list\">{items.map((item, index) => renderNode(item, 0, \"root\", index))}</ul>;\n};\n\nconst AppSidebar = () => {\n const dispatch = useDispatch();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const visibleNavbar = useSelector((state: any) => state.navbarState.visibleNavbar);\n const { data: menu } = useGetSolidMenuBasedOnRoleQuery(\"\");\n const workspaceSwitcherRef = useRef<HTMLDivElement | null>(null);\n\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [workspaceOpen, setWorkspaceOpen] = useState(false);\n const [selectedWorkspaceKey, setSelectedWorkspaceKey] = useState<string>(() => {\n if (typeof window === \"undefined\") return \"\";\n return window.localStorage.getItem(SELECTED_WORKSPACE_STORAGE_KEY) || \"\";\n });\n const [isDesktop, setIsDesktop] = useState<boolean>(typeof window === \"undefined\" ? true : window.innerWidth > 1199);\n const [isCollapsed, setIsCollapsed] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n const stored = window.localStorage.getItem(SIDEBAR_STORAGE_KEY);\n if (stored === null) return true;\n return stored === \"true\";\n });\n\n const { data } = useSession();\n\n useEffect(() => {\n if (data) {\n dispatch(setUser(data?.user));\n dispatch(setIsAuthenticated(true));\n }\n }, [data, dispatch]);\n\n useEffect(() => {\n const onResize = () => {\n const desktop = window.innerWidth > 1199;\n setIsDesktop(desktop);\n if (desktop) {\n dispatch(hideNavbar());\n }\n };\n\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [dispatch]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(SIDEBAR_STORAGE_KEY, String(isCollapsed));\n }, [isCollapsed]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!selectedWorkspaceKey) {\n window.localStorage.removeItem(SELECTED_WORKSPACE_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(SELECTED_WORKSPACE_STORAGE_KEY, selectedWorkspaceKey);\n }, [selectedWorkspaceKey]);\n\n useEffect(() => {\n const width = isDesktop ? (isCollapsed ? \"0px\" : DESKTOP_SIDEBAR_WIDTH) : \"0px\";\n document.documentElement.style.setProperty(\"--solid-sidebar-width\", width);\n }, [isDesktop, isCollapsed]);\n\n useEffect(() => {\n if (!menu?.data?.length) return;\n const defaultWorkspace = resolveDefaultWorkspace(menu.data);\n const hasSelectedWorkspace = menu.data.some((workspace: SolidMenuItem) => workspace.key === selectedWorkspaceKey);\n const nextWorkspaceKey = hasSelectedWorkspace ? selectedWorkspaceKey : defaultWorkspace?.key || \"\";\n\n if (nextWorkspaceKey !== selectedWorkspaceKey) {\n setSelectedWorkspaceKey(nextWorkspaceKey);\n }\n }, [menu, selectedWorkspaceKey]);\n\n useEffect(() => {\n if (!isDesktop) {\n dispatch(hideNavbar());\n }\n }, [pathname, dispatch, isDesktop]);\n\n useEffect(() => {\n const onToggleRequest = () => {\n if (window.innerWidth > 1199) {\n setIsCollapsed((prev) => !prev);\n return;\n }\n dispatch(toggleNavbar());\n };\n\n window.addEventListener(SIDEBAR_TOGGLE_EVENT, onToggleRequest);\n return () => window.removeEventListener(SIDEBAR_TOGGLE_EVENT, onToggleRequest);\n }, [dispatch]);\n\n useEffect(() => {\n if (!workspaceOpen) return;\n\n const handlePointerDown = (event: MouseEvent) => {\n const switcher = workspaceSwitcherRef.current;\n const target = event.target as Node;\n\n if (!switcher || switcher.contains(target)) {\n return;\n }\n\n setWorkspaceOpen(false);\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [workspaceOpen]);\n\n const workspaces: SolidMenuItem[] = menu?.data || [];\n const selectedWorkspace = workspaces.find((m) => m.key === selectedWorkspaceKey) || workspaces[0];\n const selectedWorkspaceChildren = selectedWorkspace?.children || [];\n\n const filteredMenu = useMemo(\n () => filterMenuItems(selectedWorkspaceChildren, searchTerm),\n [selectedWorkspaceChildren, searchTerm]\n );\n\n const shellClasses = [\n \"solid-sidebar\",\n isDesktop && isCollapsed ? \"is-collapsed\" : \"\",\n !isDesktop && visibleNavbar ? \"is-open\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n // The collapsed preference belongs to the desktop sidebar. Mobile uses\n // the navbar visibility state for its drawer, so it must always render\n // the full menu when opened.\n const isSidebarContentCollapsed = isDesktop && isCollapsed;\n\n const selectWorkspace = (workspace: SolidMenuItem) => {\n setSelectedWorkspaceKey(workspace.key || \"\");\n setSearchTerm(\"\");\n setWorkspaceOpen(false);\n };\n\n return (\n <>\n {!isDesktop && visibleNavbar && <div className=\"solid-sidebar-backdrop\" onClick={() => dispatch(toggleNavbar())} />}\n\n <aside className={shellClasses}>\n <div className=\"solid-sidebar-header\">\n <div className=\"solid-workspace-switcher\" ref={workspaceSwitcherRef}>\n <button\n type=\"button\"\n className=\"solid-workspace-trigger\"\n onClick={() => setWorkspaceOpen((prev) => !prev)}\n aria-label=\"Select workspace\"\n >\n <WorkspaceIcon workspace={selectedWorkspace} className=\"solid-workspace-avatar\" />\n {!isSidebarContentCollapsed && (\n <>\n <span className=\"solid-workspace-label-wrap\">\n <span className=\"solid-workspace-label-top\">Workspace</span>\n <span className=\"solid-workspace-label\">{selectedWorkspace?.title || \"Workspace\"}</span>\n </span>\n <span className={`solid-workspace-chevron-dual ${workspaceOpen ? \"is-open\" : \"\"}`} aria-hidden=\"true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M4 6L7 3L10 6\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M4 8L7 11L10 8\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </>\n )}\n </button>\n\n {workspaceOpen && !isSidebarContentCollapsed && (\n <div className=\"solid-workspace-menu\">\n {workspaces.map((workspace) => (\n <button\n type=\"button\"\n key={workspace.key || workspace.title}\n className={`solid-workspace-item ${workspace.key === selectedWorkspace?.key ? \"is-active\" : \"\"}`}\n onClick={() => selectWorkspace(workspace)}\n >\n <WorkspaceIcon workspace={workspace} className=\"solid-workspace-item-avatar\" />\n <span className=\"solid-workspace-item-label\">{workspace.title}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n </div>\n\n {!isSidebarContentCollapsed ? (\n <>\n <div className=\"solid-sidebar-search-wrap\">\n <input\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder=\"Search in menu...\"\n className=\"solid-sidebar-search\"\n />\n </div>\n\n <div className=\"solid-sidebar-tree-wrap\">\n <SidebarMenuTree items={filteredMenu} pathname={pathname} searchParams={searchParams} forceExpand={!!searchTerm.trim()} />\n </div>\n </>\n ) : (\n <div className=\"solid-sidebar-collapsed-nav\">\n {filteredMenu.slice(0, 10).map((item) => (\n <SolidLink\n key={item.key || item.title}\n href={item.path || \"#\"}\n className={`solid-collapsed-item ${isMenuPathActive(item.path, pathname, searchParams) ? \"is-active\" : \"\"}`}\n title={item.title}\n >\n {item.title.slice(0, 1).toUpperCase()}\n </SolidLink>\n ))}\n </div>\n )}\n\n <div className=\"solid-sidebar-footer\">\n <AdminHeaderActions variant=\"sidebar\" />\n <UserProfileMenu />\n </div>\n </aside>\n\n {isDesktop && isCollapsed && (\n <button\n type=\"button\"\n className=\"solid-sidebar-hotspot\"\n onClick={() => setIsCollapsed(false)}\n aria-label=\"Expand sidebar\"\n title=\"Expand sidebar\"\n />\n )}\n </>\n );\n};\n\nexport default AppSidebar;\n"]}
@@ -11,7 +11,7 @@ import { usePathname } from "../../hooks/usePathname";
11
11
  import { useSearchParams } from "../../hooks/useSearchParams";
12
12
  import { env } from "../../adapters/env";
13
13
  import { normalizeAssetUrl } from "../../helpers/assetUrl";
14
- import { resolveRetainedModelViewRoute } from "../../helpers/modelViewPersistence";
14
+ import { getMenuContextForActiveRoute, resolveRetainedModelViewRoute } from "../../helpers/modelViewPersistence";
15
15
  import type { MenuItemIconSource } from "../../helpers/menuItemIcons";
16
16
  import { SolidMenuItemIcon } from "./SolidMenuItemIcon";
17
17
 
@@ -67,13 +67,31 @@ function doesSearchParamsMatchSubset(requiredParams: URLSearchParams, currentPar
67
67
  }
68
68
 
69
69
  function isMenuPathActive(itemPath: string | undefined, currentPathname: string, currentSearchParams: URLSearchParams): boolean {
70
- if (!itemPath) return false;
70
+ if (!itemPath) return false;
71
71
 
72
- const resolvedItemPath = resolveRetainedModelViewRoute(itemPath);
73
- const { pathname: itemPathname, searchParams: itemSearchParams } = getPathAndParams(resolvedItemPath);
74
- if (itemPathname !== normalizePath(currentPathname)) return false;
72
+ const { pathname: itemPathname, searchParams: itemSearchParams } = getPathAndParams(itemPath);
73
+ const currentPath = normalizePath(currentPathname);
74
+ const modelMenuMatch = itemPathname.match(/^(\/admin\/core\/[^/]+\/[^/]+)\/(?:list|tree|kanban|card)$/);
75
75
 
76
- return doesSearchParamsMatchSubset(itemSearchParams, currentSearchParams);
76
+ if (!modelMenuMatch) {
77
+ return itemPathname === currentPath && doesSearchParamsMatchSubset(itemSearchParams, currentSearchParams);
78
+ }
79
+
80
+ const modelPath = modelMenuMatch[1];
81
+ if (currentPath !== modelPath && !currentPath.startsWith(modelPath + "/")) return false;
82
+
83
+ // New routes keep identity in the URL. Older form routes use the saved view as a fallback.
84
+ const activeContext = getMenuContextForActiveRoute(currentPath, currentSearchParams);
85
+ const itemMenuId = itemSearchParams.get("menuItemId");
86
+ const activeMenuId = activeContext.get("menuItemId");
87
+ if (itemMenuId && activeMenuId) return itemMenuId === activeMenuId;
88
+
89
+ const itemActionId = itemSearchParams.get("actionId");
90
+ const activeActionId = activeContext.get("actionId");
91
+ if (itemActionId && activeActionId) return itemActionId === activeActionId;
92
+
93
+ // A model link without menu identity is matched by its model path alone.
94
+ return !itemMenuId && !itemActionId;
77
95
  }
78
96
 
79
97
  function cloneMenuItems(items: SolidMenuItem[] = []): SolidMenuItem[] {
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
2
  export declare const ChatIcon: () => import("react/jsx-runtime").JSX.Element;
3
3
  export declare function SolidStudio(): React.ReactPortal | null;
4
- export declare function PreviewModePersist(): null;
5
4
  export declare function SolidStudioWrapper({ children }: {
6
5
  children: React.ReactNode;
7
6
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"SolidAiStudioLayout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAmC3D,eAAO,MAAM,QAAQ,+CAIpB,CAAC;AAyBF,wBAAgB,WAAW,6BAmL1B;AASD,wBAAgB,kBAAkB,SAsBjC;AAID,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE7E;AAGD,eAAO,MAAM,mBAAmB,2BAAqB,CAAC;AACtD,eAAO,MAAM,gBAAgB,oBAAc,CAAC"}
1
+ {"version":3,"file":"SolidAiStudioLayout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AA0B3D,eAAO,MAAM,QAAQ,+CAIpB,CAAC;AAyBF,wBAAgB,WAAW,6BAyF1B;AAID,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE7E;AAGD,eAAO,MAAM,mBAAmB,2BAAqB,CAAC;AACtD,eAAO,MAAM,gBAAgB,oBAAc,CAAC"}
@@ -1,53 +1,14 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __generator = (this && this.__generator) || function (thisArg, body) {
11
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
- function verb(n) { return function (v) { return step([n, v]); }; }
14
- function step(op) {
15
- if (f) throw new TypeError("Generator is already executing.");
16
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
- if (y = 0, t) op = [op[0] & 2, t.value];
19
- switch (op[0]) {
20
- case 0: case 1: t = op; break;
21
- case 4: _.label++; return { value: op[1], done: false };
22
- case 5: _.label++; y = op[1]; op = [0]; continue;
23
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
- default:
25
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
- if (t[2]) _.ops.pop();
30
- _.trys.pop(); continue;
31
- }
32
- op = body.call(thisArg, _);
33
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
- }
36
- };
37
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
38
2
  import { useEffect, useRef, useState } from "react";
39
3
  import { useDispatch, useSelector } from "react-redux";
40
- import { useNavigate, useLocation } from "react-router-dom";
4
+ import { useNavigate } from "react-router-dom";
41
5
  import { exitStudioMode, setStudioView } from "../../redux/features/solidStudioSlice";
42
- import { showToast } from "../../redux/features/toastSlice";
43
6
  import { useSession } from "../../hooks/useSession";
44
- import { getSession, signOut } from "../../adapters/auth/index";
7
+ import { signOut } from "../../adapters/auth/index";
45
8
  import { createPortal } from "react-dom";
46
9
  import { env } from "../../adapters/env";
47
- import { ERROR_MESSAGES } from "../../constants/error-messages";
48
10
  // ── Icons ──────────────────────────────────────────────────────────────────────
49
11
  var DotsIcon = function () { return (_jsxs("svg", { width: "15", height: "15", viewBox: "0 0 16 16", fill: "currentColor", "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "3", r: "1.3" }), _jsx("circle", { cx: "8", cy: "8", r: "1.3" }), _jsx("circle", { cx: "8", cy: "13", r: "1.3" })] })); };
50
- var PreviewIcon = function () { return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M1 7s2.5-5 6-5 6 5 6 5-2.5 5-6 5-6-5-6-5Z", stroke: "currentColor", strokeWidth: "1.3", strokeLinejoin: "round" }), _jsx("circle", { cx: "7", cy: "7", r: "1.8", stroke: "currentColor", strokeWidth: "1.3" })] })); };
51
12
  var LogoutIcon = function () { return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M5 2H2.5A1.5 1.5 0 0 0 1 3.5v7A1.5 1.5 0 0 0 2.5 12H5", stroke: "currentColor", strokeWidth: "1.3", strokeLinecap: "round" }), _jsx("path", { d: "M9 4l3 3-3 3M12 7H5", stroke: "currentColor", strokeWidth: "1.3", strokeLinecap: "round", strokeLinejoin: "round" })] })); };
52
13
  export var ChatIcon = function () { return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) })); };
53
14
  var BackendIcon = function () { return (_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "2.2", y: "3", width: "11.6", height: "4", rx: "1", stroke: "currentColor", strokeWidth: "1.2" }), _jsx("rect", { x: "2.2", y: "9", width: "11.6", height: "4", rx: "1", stroke: "currentColor", strokeWidth: "1.2" }), _jsx("circle", { cx: "4.5", cy: "5", r: "0.7", fill: "currentColor" }), _jsx("circle", { cx: "4.5", cy: "11", r: "0.7", fill: "currentColor" })] })); };
@@ -55,20 +16,17 @@ var FrontendIcon = function () { return (_jsxs("svg", { width: "16", height: "16
55
16
  // ── SolidStudio ────────────────────────────────────────────────────────────────
56
17
  // Single component that renders both the Studio header and the AI panel.
57
18
  // Mount this ONCE at the app root via AppEventListener.
58
- // When studio mode is off it renders nothing.
19
+ // Visible only to the "sa" user in dev environments.
59
20
  export function SolidStudio() {
60
- var _this = this;
21
+ var _a;
61
22
  var isStudioMode = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.isStudioMode) !== null && _b !== void 0 ? _b : false; });
62
23
  var studioView = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.studioView) !== null && _b !== void 0 ? _b : null; });
63
24
  var dispatch = useDispatch();
64
25
  var navigate = useNavigate();
65
- var _a = useLocation(), pathname = _a.pathname, search = _a.search;
66
- var isPreviewMode = new URLSearchParams(search).get("preview") === "true" || (typeof sessionStorage !== "undefined" && sessionStorage.getItem("solid-preview") === "true");
67
- var isPreviewable = pathname !== "/studio" && pathname !== "/landing";
68
26
  var _b = useSession(), data = _b.data, status = _b.status;
69
- var isAuthenticated = status === "authenticated";
27
+ var isStudioUser = ((_a = data === null || data === void 0 ? void 0 : data.user) === null || _a === void 0 ? void 0 : _a.username) === "sa";
28
+ var isDev = env("VITE_SOLIDX_ENV") === "dev";
70
29
  var _c = useState(false), isMenuOpen = _c[0], setIsMenuOpen = _c[1];
71
- var _d = useState(false), isChatRedirecting = _d[0], setIsChatRedirecting = _d[1];
72
30
  var menuRef = useRef(null);
73
31
  // Close the 3-dot menu when clicking outside
74
32
  useEffect(function () {
@@ -88,7 +46,7 @@ export function SolidStudio() {
88
46
  dispatch(exitStudioMode());
89
47
  }
90
48
  }, [status, isStudioMode, dispatch]);
91
- if (!isStudioMode || !isAuthenticated || isPreviewMode)
49
+ if (!isStudioUser || !isDev)
92
50
  return null;
93
51
  var handleLogout = function () {
94
52
  setIsMenuOpen(false);
@@ -99,120 +57,9 @@ export function SolidStudio() {
99
57
  dispatch(setStudioView(view));
100
58
  navigate(view === "backend" ? "/admin" : "/landing");
101
59
  };
102
- var handleAiChatClick = function () { return __awaiter(_this, void 0, void 0, function () {
103
- var aiUrl, session, accessToken, apiBaseUrl, response, detail, errorPayload, _a, payload, ssoCode, redirectUrl, error_1, detail;
104
- var _b, _c, _d, _e, _f, _g;
105
- return __generator(this, function (_h) {
106
- switch (_h.label) {
107
- case 0:
108
- if (isChatRedirecting)
109
- return [2 /*return*/];
110
- aiUrl = env("VITE_SOLIDX_AI_URL");
111
- if (!aiUrl)
112
- return [2 /*return*/];
113
- setIsChatRedirecting(true);
114
- _h.label = 1;
115
- case 1:
116
- _h.trys.push([1, 10, 11, 12]);
117
- return [4 /*yield*/, getSession()];
118
- case 2:
119
- session = _h.sent();
120
- accessToken = ((_b = session === null || session === void 0 ? void 0 : session.user) === null || _b === void 0 ? void 0 : _b.accessToken) || ((_c = data === null || data === void 0 ? void 0 : data.user) === null || _c === void 0 ? void 0 : _c.accessToken);
121
- if (!accessToken)
122
- return [2 /*return*/];
123
- apiBaseUrl = env("API_URL", "http://localhost:8080").replace(/\/+$/, "");
124
- return [4 /*yield*/, fetch("".concat(apiBaseUrl, "/api/iam/sso/code"), {
125
- method: "POST",
126
- headers: {
127
- accept: "*/*",
128
- Authorization: "Bearer ".concat(accessToken),
129
- },
130
- body: "",
131
- })];
132
- case 3:
133
- response = _h.sent();
134
- if (!!response.ok) return [3 /*break*/, 8];
135
- detail = "Failed to fetch ssoCode (".concat(response.status, ")");
136
- _h.label = 4;
137
- case 4:
138
- _h.trys.push([4, 6, , 7]);
139
- return [4 /*yield*/, response.json()];
140
- case 5:
141
- errorPayload = _h.sent();
142
- detail =
143
- (errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.message) ||
144
- ((_d = errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.error) === null || _d === void 0 ? void 0 : _d.message) ||
145
- ((_e = errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.data) === null || _e === void 0 ? void 0 : _e.message) ||
146
- detail;
147
- return [3 /*break*/, 7];
148
- case 6:
149
- _a = _h.sent();
150
- return [3 /*break*/, 7];
151
- case 7: throw new Error(detail);
152
- case 8: return [4 /*yield*/, response.json()];
153
- case 9:
154
- payload = _h.sent();
155
- ssoCode = (_f = payload === null || payload === void 0 ? void 0 : payload.ssoCode) !== null && _f !== void 0 ? _f : (_g = payload === null || payload === void 0 ? void 0 : payload.data) === null || _g === void 0 ? void 0 : _g.ssoCode;
156
- if (!ssoCode) {
157
- throw new Error("ssoCode missing in response");
158
- }
159
- redirectUrl = new URL(aiUrl, window.location.origin);
160
- redirectUrl.searchParams.set("ssoCode", String(ssoCode));
161
- window.open(redirectUrl.toString(), "_blank");
162
- return [3 /*break*/, 12];
163
- case 10:
164
- error_1 = _h.sent();
165
- detail = error_1 instanceof Error ? error_1.message : ERROR_MESSAGES.SOMETHING_WRONG;
166
- dispatch(showToast({
167
- severity: "error",
168
- summary: ERROR_MESSAGES.ERROR,
169
- detail: detail,
170
- life: 4000,
171
- }));
172
- console.error("Failed to open AI chat with ssoCode:", error_1);
173
- return [3 /*break*/, 12];
174
- case 11:
175
- setIsChatRedirecting(false);
176
- return [7 /*endfinally*/];
177
- case 12: return [2 /*return*/];
178
- }
179
- });
180
- }); };
181
- var studioUI = (_jsx("div", { className: "solid-studio-island", style: { zIndex: "var(--z-studio)" }, children: _jsxs("div", { className: "solid-studio-island-inner", children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "backend" ? " active" : ""), onClick: function () { return handleViewSwitch("backend"); }, "aria-label": "Backend studio", children: _jsx(BackendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "frontend" ? " active" : ""), onClick: function () { return handleViewSwitch("frontend"); }, "aria-label": "Frontend studio", children: _jsx(FrontendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn", onClick: handleAiChatClick, disabled: isChatRedirecting, "aria-busy": isChatRedirecting, "aria-label": "AI chat", children: _jsx(ChatIcon, {}) }), _jsxs("div", { className: "solid-studio-island-menu", ref: menuRef, children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(isMenuOpen ? " active" : ""), onClick: function () { return setIsMenuOpen(function (o) { return !o; }); }, "aria-label": "Studio options", children: _jsx(DotsIcon, {}) }), isMenuOpen && (_jsxs("div", { className: "solid-studio-island-dropdown", children: [isPreviewable && (_jsxs("button", { type: "button", className: "solid-studio-island-dropdown-item", onClick: function () {
182
- setIsMenuOpen(false);
183
- var params = new URLSearchParams(search);
184
- params.set("preview", "true");
185
- window.open("".concat(pathname, "?").concat(params.toString()), "_blank");
186
- }, children: [_jsx(PreviewIcon, {}), "Preview page"] })), _jsxs("button", { type: "button", className: "solid-studio-island-dropdown-item danger", onClick: handleLogout, children: [_jsx(LogoutIcon, {}), "Logout"] })] }))] })] }) }));
60
+ var studioUI = (_jsx("div", { className: "solid-studio-island", style: { zIndex: "var(--z-studio)" }, children: _jsxs("div", { className: "solid-studio-island-inner", children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "backend" ? " active" : ""), onClick: function () { return handleViewSwitch("backend"); }, "aria-label": "Backend studio", children: _jsx(BackendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "frontend" ? " active" : ""), onClick: function () { return handleViewSwitch("frontend"); }, "aria-label": "Frontend studio", children: _jsx(FrontendIcon, {}) }), _jsxs("div", { className: "solid-studio-island-menu", ref: menuRef, children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(isMenuOpen ? " active" : ""), onClick: function () { return setIsMenuOpen(function (o) { return !o; }); }, "aria-label": "Studio options", children: _jsx(DotsIcon, {}) }), isMenuOpen && (_jsx("div", { className: "solid-studio-island-dropdown", children: _jsxs("button", { type: "button", className: "solid-studio-island-dropdown-item danger", onClick: handleLogout, children: [_jsx(LogoutIcon, {}), "Logout"] }) }))] })] }) }));
187
61
  return typeof document !== "undefined" ? createPortal(studioUI, document.body) : null;
188
62
  }
189
- // ── PreviewModePersist ─────────────────────────────────────────────────────────
190
- // Mount once at the app root alongside SolidStudio.
191
- // sessionStorage is tab-scoped, so preview opened in a new tab stays isolated.
192
- // Closing the tab is the natural way to exit preview mode.
193
- var PREVIEW_KEY = "solid-preview";
194
- export function PreviewModePersist() {
195
- var _a = useLocation(), pathname = _a.pathname, search = _a.search;
196
- var navigate = useNavigate();
197
- // Activate: when URL has ?preview=true, store it in sessionStorage for this tab
198
- useEffect(function () {
199
- var params = new URLSearchParams(search);
200
- if (params.get("preview") === "true") {
201
- sessionStorage.setItem(PREVIEW_KEY, "true");
202
- }
203
- }, [search]);
204
- // Persist: re-inject ?preview=true on every navigation if it was set
205
- useEffect(function () {
206
- if (sessionStorage.getItem(PREVIEW_KEY) !== "true")
207
- return;
208
- var params = new URLSearchParams(search);
209
- if (params.get("preview") === "true")
210
- return;
211
- params.set("preview", "true");
212
- navigate({ pathname: pathname, search: "?".concat(params.toString()) }, { replace: true });
213
- }, [pathname, search, navigate]);
214
- return null;
215
- }
216
63
  // ── SolidStudioWrapper ─────────────────────────────────────────────────────────
217
64
  // Kept for backwards compatibility. Now a pure pass-through.
218
65
  export function SolidStudioWrapper(_a) {
@@ -1 +1 @@
1
- {"version":3,"file":"SolidAiStudioLayout.js","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport { exitStudioMode, setStudioView, type StudioView } from \"../../redux/features/solidStudioSlice\";\nimport { showToast } from \"../../redux/features/toastSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { getSession, signOut } from \"../../adapters/auth/index\";\nimport { createPortal } from \"react-dom\";\nimport { env } from \"../../adapters/env\";\nimport { ERROR_MESSAGES } from \"../../constants/error-messages\";\n\n// ── Icons ──────────────────────────────────────────────────────────────────────\n\nconst DotsIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"3\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.3\" />\n </svg>\n);\n\nconst PreviewIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 7s2.5-5 6-5 6 5 6 5-2.5 5-6 5-6-5-6-5Z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.8\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n);\n\nconst LogoutIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 2H2.5A1.5 1.5 0 0 0 1 3.5v7A1.5 1.5 0 0 0 2.5 12H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n <path d=\"M9 4l3 3-3 3M12 7H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const ChatIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst BackendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2.2\" y=\"3\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"2.2\" y=\"9\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <circle cx=\"4.5\" cy=\"5\" r=\"0.7\" fill=\"currentColor\" />\n <circle cx=\"4.5\" cy=\"11\" r=\"0.7\" fill=\"currentColor\" />\n </svg>\n);\n\nconst FrontendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.8\" y=\"2\" width=\"12.4\" height=\"9.5\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M6 13.5 5 15h6l-1-1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M5.5 5 7.5 7l-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"m10.5 5 2 2-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ── SolidStudio ────────────────────────────────────────────────────────────────\n// Single component that renders both the Studio header and the AI panel.\n// Mount this ONCE at the app root via AppEventListener.\n// When studio mode is off it renders nothing.\n\nexport function SolidStudio() {\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const studioView = useSelector((state: any) => state.solidStudio?.studioView ?? null) as StudioView;\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { pathname, search } = useLocation();\n const isPreviewMode = new URLSearchParams(search).get(\"preview\") === \"true\" || (typeof sessionStorage !== \"undefined\" && sessionStorage.getItem(\"solid-preview\") === \"true\");\n const isPreviewable = pathname !== \"/studio\" && pathname !== \"/landing\";\n const { data, status } = useSession();\n const isAuthenticated = status === \"authenticated\";\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isChatRedirecting, setIsChatRedirecting] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close the 3-dot menu when clicking outside\n useEffect(() => {\n if (!isMenuOpen) return;\n const handler = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isMenuOpen]);\n\n // Auto-exit studio if the user logs out\n useEffect(() => {\n if (status === \"unauthenticated\" && isStudioMode) {\n dispatch(exitStudioMode());\n }\n }, [status, isStudioMode, dispatch]);\n\n if (!isStudioMode || !isAuthenticated || isPreviewMode) return null;\n\n const handleLogout = () => {\n setIsMenuOpen(false);\n dispatch(exitStudioMode());\n signOut({ callbackUrl: \"/auth/login\" });\n };\n\n const handleViewSwitch = (view: StudioView) => {\n dispatch(setStudioView(view));\n navigate(view === \"backend\" ? \"/admin\" : \"/landing\");\n };\n\n const handleAiChatClick = async () => {\n if (isChatRedirecting) return;\n\n const aiUrl = env(\"VITE_SOLIDX_AI_URL\");\n if (!aiUrl) return;\n\n setIsChatRedirecting(true);\n try {\n const session = await getSession();\n const accessToken = session?.user?.accessToken || data?.user?.accessToken;\n if (!accessToken) return;\n\n const apiBaseUrl = env(\"API_URL\", \"http://localhost:8080\").replace(/\\/+$/, \"\");\n const response = await fetch(`${apiBaseUrl}/api/iam/sso/code`, {\n method: \"POST\",\n headers: {\n accept: \"*/*\",\n Authorization: `Bearer ${accessToken}`,\n },\n body: \"\",\n });\n\n if (!response.ok) {\n let detail = `Failed to fetch ssoCode (${response.status})`;\n try {\n const errorPayload = await response.json();\n detail =\n errorPayload?.message ||\n errorPayload?.error?.message ||\n errorPayload?.data?.message ||\n detail;\n } catch {\n // no-op: keep default message\n }\n throw new Error(detail);\n }\n\n const payload = await response.json();\n const ssoCode = payload?.ssoCode ?? payload?.data?.ssoCode;\n if (!ssoCode) {\n throw new Error(\"ssoCode missing in response\");\n }\n\n const redirectUrl = new URL(aiUrl, window.location.origin);\n redirectUrl.searchParams.set(\"ssoCode\", String(ssoCode));\n window.open(redirectUrl.toString(), \"_blank\");\n } catch (error) {\n const detail = error instanceof Error ? error.message : ERROR_MESSAGES.SOMETHING_WRONG;\n dispatch(\n showToast({\n severity: \"error\",\n summary: ERROR_MESSAGES.ERROR,\n detail,\n life: 4000,\n })\n );\n console.error(\"Failed to open AI chat with ssoCode:\", error);\n } finally {\n setIsChatRedirecting(false);\n }\n };\n\n const studioUI = (\n <div className=\"solid-studio-island\" style={{ zIndex: \"var(--z-studio)\" }}>\n <div className=\"solid-studio-island-inner\">\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"backend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"backend\")}\n aria-label=\"Backend studio\"\n >\n <BackendIcon />\n </button>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"frontend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"frontend\")}\n aria-label=\"Frontend studio\"\n >\n <FrontendIcon />\n </button>\n <button\n type=\"button\"\n className=\"solid-studio-island-btn\"\n onClick={handleAiChatClick}\n disabled={isChatRedirecting}\n aria-busy={isChatRedirecting}\n aria-label=\"AI chat\"\n >\n <ChatIcon />\n </button>\n <div className=\"solid-studio-island-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${isMenuOpen ? \" active\" : \"\"}`}\n onClick={() => setIsMenuOpen((o) => !o)}\n aria-label=\"Studio options\"\n >\n <DotsIcon />\n </button>\n {isMenuOpen && (\n <div className=\"solid-studio-island-dropdown\">\n {isPreviewable && (\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item\"\n onClick={() => {\n setIsMenuOpen(false);\n const params = new URLSearchParams(search);\n params.set(\"preview\", \"true\");\n window.open(`${pathname}?${params.toString()}`, \"_blank\");\n }}\n >\n <PreviewIcon />\n Preview page\n </button>\n )}\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item danger\"\n onClick={handleLogout}\n >\n <LogoutIcon />\n Logout\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n return typeof document !== \"undefined\" ? createPortal(studioUI, document.body) : null;\n}\n\n// ── PreviewModePersist ─────────────────────────────────────────────────────────\n// Mount once at the app root alongside SolidStudio.\n// sessionStorage is tab-scoped, so preview opened in a new tab stays isolated.\n// Closing the tab is the natural way to exit preview mode.\n\nconst PREVIEW_KEY = \"solid-preview\";\n\nexport function PreviewModePersist() {\n const { pathname, search } = useLocation();\n const navigate = useNavigate();\n\n // Activate: when URL has ?preview=true, store it in sessionStorage for this tab\n useEffect(() => {\n const params = new URLSearchParams(search);\n if (params.get(\"preview\") === \"true\") {\n sessionStorage.setItem(PREVIEW_KEY, \"true\");\n }\n }, [search]);\n\n // Persist: re-inject ?preview=true on every navigation if it was set\n useEffect(() => {\n if (sessionStorage.getItem(PREVIEW_KEY) !== \"true\") return;\n const params = new URLSearchParams(search);\n if (params.get(\"preview\") === \"true\") return;\n params.set(\"preview\", \"true\");\n navigate({ pathname, search: `?${params.toString()}` }, { replace: true });\n }, [pathname, search, navigate]);\n\n return null;\n}\n\n// ── SolidStudioWrapper ─────────────────────────────────────────────────────────\n// Kept for backwards compatibility. Now a pure pass-through.\nexport function SolidStudioWrapper({ children }: { children: React.ReactNode }) {\n return <>{children}</>;\n}\n\n// Legacy aliases\nexport const SolidAiStudioLayout = SolidStudioWrapper;\nexport const SolidStudioPanel = SolidStudio;\n"]}
1
+ {"version":3,"file":"SolidAiStudioLayout.js","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAmB,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,kFAAkF;AAElF,IAAM,QAAQ,GAAG,cAAM,OAAA,CACrB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,cAAc,iBAAa,MAAM,aACpF,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,GAAG,IAC7B,CACP,EANsB,CAMtB,CAAC;AAEF,IAAM,UAAU,GAAG,cAAM,OAAA,CACvB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,aAC5E,eAAM,CAAC,EAAC,uDAAuD,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,GAAG,EAChI,eAAM,CAAC,EAAC,qBAAqB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,IACjH,CACP,EALwB,CAKxB,CAAC;AAEF,MAAM,CAAC,IAAM,QAAQ,GAAG,cAAM,OAAA,CAC5B,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,YAC9I,eAAM,CAAC,EAAC,+DAA+D,GAAG,GACtE,CACP,EAJ6B,CAI7B,CAAC;AAEF,IAAM,WAAW,GAAG,cAAM,OAAA,CACxB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,aAC5E,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,GAAG,EAC7F,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,GAAG,EAC7F,iBAAQ,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,cAAc,GAAG,EACtD,iBAAQ,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,cAAc,GAAG,IACnD,CACP,EAPyB,CAOzB,CAAC;AAEF,IAAM,YAAY,GAAG,cAAM,OAAA,CACzB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,aAC5E,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,GAAG,EACjG,eAAM,CAAC,EAAC,uBAAuB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,EACvH,eAAM,CAAC,EAAC,mBAAmB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,EACnH,eAAM,CAAC,EAAC,iBAAiB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,IAC7G,CACP,EAP0B,CAO1B,CAAC;AAEF,kFAAkF;AAClF,yEAAyE;AACzE,wDAAwD;AACxD,qDAAqD;AAErD,MAAM,UAAU,WAAW;;IACzB,IAAM,YAAY,GAAG,WAAW,CAAC,UAAC,KAAU,gBAAK,OAAA,MAAA,MAAA,KAAK,CAAC,WAAW,0CAAE,YAAY,mCAAI,KAAK,CAAA,EAAA,CAAC,CAAC;IAC3F,IAAM,UAAU,GAAG,WAAW,CAAC,UAAC,KAAU,gBAAK,OAAA,MAAA,MAAA,KAAK,CAAC,WAAW,0CAAE,UAAU,mCAAI,IAAI,CAAA,EAAA,CAAe,CAAC;IACpG,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IACzB,IAAA,KAAmB,UAAU,EAAE,EAA7B,IAAI,UAAA,EAAE,MAAM,YAAiB,CAAC;IACtC,IAAM,YAAY,GAAG,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,QAAQ,MAAK,IAAI,CAAC;IACnD,IAAM,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAC,KAAK,KAAK,CAAC;IACzC,IAAA,KAA8B,QAAQ,CAAC,KAAK,CAAC,EAA5C,UAAU,QAAA,EAAE,aAAa,QAAmB,CAAC;IACpD,IAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE7C,6CAA6C;IAC7C,SAAS,CAAC;QACR,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,IAAM,OAAO,GAAG,UAAC,CAAa;YAC5B,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,EAAE;gBAClE,aAAa,CAAC,KAAK,CAAC,CAAC;aACtB;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,cAAM,OAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAlD,CAAkD,CAAC;IAClE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,wCAAwC;IACxC,SAAS,CAAC;QACR,IAAI,MAAM,KAAK,iBAAiB,IAAI,YAAY,EAAE;YAChD,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;SAC5B;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErC,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAM,YAAY,GAAG;QACnB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,IAAM,gBAAgB,GAAG,UAAC,IAAgB;QACxC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC;IAEF,IAAM,QAAQ,GAAG,CACf,cAAK,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,YACvE,eAAK,SAAS,EAAC,2BAA2B,aACxC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,iCAA0B,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAE,EAChF,OAAO,EAAE,cAAM,OAAA,gBAAgB,CAAC,SAAS,CAAC,EAA3B,CAA2B,gBAC/B,gBAAgB,YAE3B,KAAC,WAAW,KAAG,GACR,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,iCAA0B,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAE,EACjF,OAAO,EAAE,cAAM,OAAA,gBAAgB,CAAC,UAAU,CAAC,EAA5B,CAA4B,gBAChC,iBAAiB,YAE5B,KAAC,YAAY,KAAG,GACT,EACT,eAAK,SAAS,EAAC,0BAA0B,EAAC,GAAG,EAAE,OAAO,aACpD,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,iCAA0B,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAE,EAClE,OAAO,EAAE,cAAM,OAAA,aAAa,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,EAAF,CAAE,CAAC,EAAxB,CAAwB,gBAC5B,gBAAgB,YAE3B,KAAC,QAAQ,KAAG,GACL,EACR,UAAU,IAAI,CACb,cAAK,SAAS,EAAC,8BAA8B,YAC3C,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,0CAA0C,EACpD,OAAO,EAAE,YAAY,aAErB,KAAC,UAAU,KAAG,cAEP,GACL,CACP,IACG,IACF,GACF,CACP,CAAC;IAEF,OAAO,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxF,CAAC;AAED,kFAAkF;AAClF,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,EAA2C;QAAzC,QAAQ,cAAA;IAC3C,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,IAAM,mBAAmB,GAAG,kBAAkB,CAAC;AACtD,MAAM,CAAC,IAAM,gBAAgB,GAAG,WAAW,CAAC","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useNavigate } from \"react-router-dom\";\nimport { exitStudioMode, setStudioView, type StudioView } from \"../../redux/features/solidStudioSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { signOut } from \"../../adapters/auth/index\";\nimport { createPortal } from \"react-dom\";\nimport { env } from \"../../adapters/env\";\n\n// ── Icons ──────────────────────────────────────────────────────────────────────\n\nconst DotsIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"3\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.3\" />\n </svg>\n);\n\nconst LogoutIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 2H2.5A1.5 1.5 0 0 0 1 3.5v7A1.5 1.5 0 0 0 2.5 12H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n <path d=\"M9 4l3 3-3 3M12 7H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const ChatIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst BackendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2.2\" y=\"3\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"2.2\" y=\"9\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <circle cx=\"4.5\" cy=\"5\" r=\"0.7\" fill=\"currentColor\" />\n <circle cx=\"4.5\" cy=\"11\" r=\"0.7\" fill=\"currentColor\" />\n </svg>\n);\n\nconst FrontendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.8\" y=\"2\" width=\"12.4\" height=\"9.5\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M6 13.5 5 15h6l-1-1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M5.5 5 7.5 7l-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"m10.5 5 2 2-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ── SolidStudio ────────────────────────────────────────────────────────────────\n// Single component that renders both the Studio header and the AI panel.\n// Mount this ONCE at the app root via AppEventListener.\n// Visible only to the \"sa\" user in dev environments.\n\nexport function SolidStudio() {\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const studioView = useSelector((state: any) => state.solidStudio?.studioView ?? null) as StudioView;\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { data, status } = useSession();\n const isStudioUser = data?.user?.username === \"sa\";\n const isDev = env(\"VITE_SOLIDX_ENV\") === \"dev\";\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close the 3-dot menu when clicking outside\n useEffect(() => {\n if (!isMenuOpen) return;\n const handler = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isMenuOpen]);\n\n // Auto-exit studio if the user logs out\n useEffect(() => {\n if (status === \"unauthenticated\" && isStudioMode) {\n dispatch(exitStudioMode());\n }\n }, [status, isStudioMode, dispatch]);\n\n if (!isStudioUser || !isDev) return null;\n\n const handleLogout = () => {\n setIsMenuOpen(false);\n dispatch(exitStudioMode());\n signOut({ callbackUrl: \"/auth/login\" });\n };\n\n const handleViewSwitch = (view: StudioView) => {\n dispatch(setStudioView(view));\n navigate(view === \"backend\" ? \"/admin\" : \"/landing\");\n };\n\n const studioUI = (\n <div className=\"solid-studio-island\" style={{ zIndex: \"var(--z-studio)\" }}>\n <div className=\"solid-studio-island-inner\">\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"backend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"backend\")}\n aria-label=\"Backend studio\"\n >\n <BackendIcon />\n </button>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"frontend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"frontend\")}\n aria-label=\"Frontend studio\"\n >\n <FrontendIcon />\n </button>\n <div className=\"solid-studio-island-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${isMenuOpen ? \" active\" : \"\"}`}\n onClick={() => setIsMenuOpen((o) => !o)}\n aria-label=\"Studio options\"\n >\n <DotsIcon />\n </button>\n {isMenuOpen && (\n <div className=\"solid-studio-island-dropdown\">\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item danger\"\n onClick={handleLogout}\n >\n <LogoutIcon />\n Logout\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n return typeof document !== \"undefined\" ? createPortal(studioUI, document.body) : null;\n}\n\n// ── SolidStudioWrapper ─────────────────────────────────────────────────────────\n// Kept for backwards compatibility. Now a pure pass-through.\nexport function SolidStudioWrapper({ children }: { children: React.ReactNode }) {\n return <>{children}</>;\n}\n\n// Legacy aliases\nexport const SolidAiStudioLayout = SolidStudioWrapper;\nexport const SolidStudioPanel = SolidStudio;\n"]}