@vertesia/ui 0.60.0 → 0.61.0

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 (661) hide show
  1. package/lib/esm/core/components/FormItem.js +9 -0
  2. package/lib/esm/core/components/FormItem.js.map +1 -0
  3. package/lib/esm/core/components/InputList.js +4 -3
  4. package/lib/esm/core/components/InputList.js.map +1 -1
  5. package/lib/esm/core/components/index.js +3 -3
  6. package/lib/esm/core/components/index.js.map +1 -1
  7. package/lib/esm/core/components/shadcn/button.js +37 -7
  8. package/lib/esm/core/components/shadcn/button.js.map +1 -1
  9. package/lib/esm/core/components/shadcn/dialog.js +3 -3
  10. package/lib/esm/core/components/shadcn/dialog.js.map +1 -1
  11. package/lib/esm/core/components/shadcn/filters/DynamicLabel.js +38 -0
  12. package/lib/esm/core/components/shadcn/filters/DynamicLabel.js.map +1 -0
  13. package/lib/esm/core/components/shadcn/filters/comboBox.js +24 -26
  14. package/lib/esm/core/components/shadcn/filters/comboBox.js.map +1 -1
  15. package/lib/esm/core/components/shadcn/filters/dateFilter.js +12 -12
  16. package/lib/esm/core/components/shadcn/filters/dateFilter.js.map +1 -1
  17. package/lib/esm/core/components/shadcn/filters/filterBar.js +49 -36
  18. package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
  19. package/lib/esm/core/components/shadcn/filters/filters.js +31 -23
  20. package/lib/esm/core/components/shadcn/filters/filters.js.map +1 -1
  21. package/lib/esm/core/components/shadcn/filters/selectFilter.js +33 -24
  22. package/lib/esm/core/components/shadcn/filters/selectFilter.js.map +1 -1
  23. package/lib/esm/core/components/shadcn/filters/textFilter.js +2 -2
  24. package/lib/esm/core/components/shadcn/filters/textFilter.js.map +1 -1
  25. package/lib/esm/core/components/shadcn/filters/types.js.map +1 -1
  26. package/lib/esm/core/components/shadcn/input.js +4 -4
  27. package/lib/esm/core/components/shadcn/input.js.map +1 -1
  28. package/lib/esm/core/components/shadcn/selectBox.js +72 -6
  29. package/lib/esm/core/components/shadcn/selectBox.js.map +1 -1
  30. package/lib/esm/core/components/styles.js +1 -1
  31. package/lib/esm/core/components/styles.js.map +1 -1
  32. package/lib/esm/core/components/table/index.js +3 -0
  33. package/lib/esm/core/components/table/index.js.map +1 -1
  34. package/lib/esm/core/index.js +2 -1
  35. package/lib/esm/core/index.js.map +1 -1
  36. package/lib/esm/core/utils/cn.js +6 -0
  37. package/lib/esm/core/utils/cn.js.map +1 -0
  38. package/lib/esm/core/utils/index.js +2 -0
  39. package/lib/esm/core/utils/index.js.map +1 -0
  40. package/lib/esm/features/agent/PayloadBuilder.js +174 -0
  41. package/lib/esm/features/agent/PayloadBuilder.js.map +1 -0
  42. package/lib/esm/features/agent/chat/AnimatedThinkingDots.js +207 -0
  43. package/lib/esm/features/agent/chat/AnimatedThinkingDots.js.map +1 -0
  44. package/lib/esm/features/agent/chat/JumpingDots.js +6 -0
  45. package/lib/esm/features/agent/chat/JumpingDots.js.map +1 -0
  46. package/lib/esm/features/agent/chat/ModernAgentConversation.js +409 -0
  47. package/lib/esm/features/agent/chat/ModernAgentConversation.js.map +1 -0
  48. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +129 -0
  49. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -0
  50. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js +66 -0
  51. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js.map +1 -0
  52. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js +29 -0
  53. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js.map +1 -0
  54. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js +97 -0
  55. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js.map +1 -0
  56. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js +46 -0
  57. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -0
  58. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js +352 -0
  59. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -0
  60. package/lib/esm/features/agent/chat/ModernAgentOutput/MessagesContainer.js +20 -0
  61. package/lib/esm/features/agent/chat/ModernAgentOutput/MessagesContainer.js.map +1 -0
  62. package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js +62 -0
  63. package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js.map +1 -0
  64. package/lib/esm/features/agent/chat/ModernAgentOutput/SlideInPanel.js +23 -0
  65. package/lib/esm/features/agent/chat/ModernAgentOutput/SlideInPanel.js.map +1 -0
  66. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingMessages.js +51 -0
  67. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingMessages.js.map +1 -0
  68. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js +82 -0
  69. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js.map +1 -0
  70. package/lib/esm/features/agent/chat/ModernAgentOutput/StackedMessages.js +13 -0
  71. package/lib/esm/features/agent/chat/ModernAgentOutput/StackedMessages.js.map +1 -0
  72. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +105 -0
  73. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -0
  74. package/lib/esm/features/agent/chat/ModernAgentOutput/utils.js +154 -0
  75. package/lib/esm/features/agent/chat/ModernAgentOutput/utils.js.map +1 -0
  76. package/lib/esm/features/agent/chat/SlidingThinkingIndicator.js +266 -0
  77. package/lib/esm/features/agent/chat/SlidingThinkingIndicator.js.map +1 -0
  78. package/lib/esm/features/agent/chat/WaitingMessages.js +60 -0
  79. package/lib/esm/features/agent/chat/WaitingMessages.js.map +1 -0
  80. package/lib/esm/features/agent/chat/index.js +5 -0
  81. package/lib/esm/features/agent/chat/index.js.map +1 -0
  82. package/lib/esm/features/agent/index.js +3 -0
  83. package/lib/esm/features/agent/index.js.map +1 -0
  84. package/lib/esm/features/errors/PanelErrorBoundary.js +11 -0
  85. package/lib/esm/features/errors/PanelErrorBoundary.js.map +1 -0
  86. package/lib/esm/features/errors/RowErrorBoundary.js +9 -0
  87. package/lib/esm/features/errors/RowErrorBoundary.js.map +1 -0
  88. package/lib/esm/features/errors/VertesiaErrorBoundary.js +15 -0
  89. package/lib/esm/features/errors/VertesiaErrorBoundary.js.map +1 -0
  90. package/lib/esm/features/errors/WidgetErrorBoundary.js +11 -0
  91. package/lib/esm/features/errors/WidgetErrorBoundary.js.map +1 -0
  92. package/lib/esm/features/errors/index.js +5 -0
  93. package/lib/esm/features/errors/index.js.map +1 -0
  94. package/lib/esm/features/facets/EnvironmentFacet.js +39 -0
  95. package/lib/esm/features/facets/EnvironmentFacet.js.map +1 -0
  96. package/lib/esm/features/facets/FacetsNav.js +8 -0
  97. package/lib/esm/features/facets/FacetsNav.js.map +1 -0
  98. package/lib/esm/features/facets/InteractionFacet.js +39 -0
  99. package/lib/esm/features/facets/InteractionFacet.js.map +1 -0
  100. package/lib/esm/features/facets/StringFacet.js +12 -0
  101. package/lib/esm/features/facets/StringFacet.js.map +1 -0
  102. package/lib/esm/features/facets/StringListFacet.js +11 -0
  103. package/lib/esm/features/facets/StringListFacet.js.map +1 -0
  104. package/lib/esm/features/facets/TypeFacet.js +42 -0
  105. package/lib/esm/features/facets/TypeFacet.js.map +1 -0
  106. package/lib/esm/features/facets/TypeOptions.js +19 -0
  107. package/lib/esm/features/facets/TypeOptions.js.map +1 -0
  108. package/lib/esm/features/facets/UserFacet.js +33 -0
  109. package/lib/esm/features/facets/UserFacet.js.map +1 -0
  110. package/lib/esm/features/facets/VFacetsNav.js +114 -0
  111. package/lib/esm/features/facets/VFacetsNav.js.map +1 -0
  112. package/lib/esm/features/facets/VStringFacet.js +17 -0
  113. package/lib/esm/features/facets/VStringFacet.js.map +1 -0
  114. package/lib/esm/features/facets/VTypeFacet.js +56 -0
  115. package/lib/esm/features/facets/VTypeFacet.js.map +1 -0
  116. package/lib/esm/features/facets/VUserFacet.js +31 -0
  117. package/lib/esm/features/facets/VUserFacet.js.map +1 -0
  118. package/lib/esm/features/facets/index.js +12 -0
  119. package/lib/esm/features/facets/index.js.map +1 -0
  120. package/lib/esm/features/facets/utils.js +7 -0
  121. package/lib/esm/features/facets/utils.js.map +1 -0
  122. package/lib/esm/features/index.js +9 -1
  123. package/lib/esm/features/index.js.map +1 -1
  124. package/lib/esm/features/layout/GenericPageNavHeader.js +11 -0
  125. package/lib/esm/features/layout/GenericPageNavHeader.js.map +1 -0
  126. package/lib/esm/features/layout/NotFoundView.js +5 -0
  127. package/lib/esm/features/layout/NotFoundView.js.map +1 -0
  128. package/lib/esm/features/layout/index.js +3 -0
  129. package/lib/esm/features/layout/index.js.map +1 -0
  130. package/lib/esm/features/magic-pdf/DownloadPopover.js +13 -0
  131. package/lib/esm/features/magic-pdf/DownloadPopover.js.map +1 -0
  132. package/lib/esm/features/magic-pdf/MagicPdfView.js +44 -0
  133. package/lib/esm/features/magic-pdf/MagicPdfView.js.map +1 -0
  134. package/lib/esm/features/magic-pdf/PageSlider.js +57 -0
  135. package/lib/esm/features/magic-pdf/PageSlider.js.map +1 -0
  136. package/lib/esm/features/magic-pdf/PdfPageProvider.js +133 -0
  137. package/lib/esm/features/magic-pdf/PdfPageProvider.js.map +1 -0
  138. package/lib/esm/features/magic-pdf/TextPageView.js +45 -0
  139. package/lib/esm/features/magic-pdf/TextPageView.js.map +1 -0
  140. package/lib/esm/features/magic-pdf/index.js +2 -0
  141. package/lib/esm/features/magic-pdf/index.js.map +1 -0
  142. package/lib/esm/features/magic-pdf/types.js +2 -0
  143. package/lib/esm/features/magic-pdf/types.js.map +1 -0
  144. package/lib/esm/features/magic-pdf/useResizeOnDrag.js +34 -0
  145. package/lib/esm/features/magic-pdf/useResizeOnDrag.js.map +1 -0
  146. package/lib/esm/features/store/collections/BrowseCollectionView.js +37 -0
  147. package/lib/esm/features/store/collections/BrowseCollectionView.js.map +1 -0
  148. package/lib/esm/features/store/collections/CollectionView.js +53 -0
  149. package/lib/esm/features/store/collections/CollectionView.js.map +1 -0
  150. package/lib/esm/features/store/collections/CollectionsTable.js +60 -0
  151. package/lib/esm/features/store/collections/CollectionsTable.js.map +1 -0
  152. package/lib/esm/features/store/collections/CollectionsView.js +94 -0
  153. package/lib/esm/features/store/collections/CollectionsView.js.map +1 -0
  154. package/lib/esm/features/store/collections/EditCollectionView.js +161 -0
  155. package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -0
  156. package/lib/esm/features/store/collections/index.js +6 -0
  157. package/lib/esm/features/store/collections/index.js.map +1 -0
  158. package/lib/esm/features/store/index.js +4 -0
  159. package/lib/esm/features/store/index.js.map +1 -0
  160. package/lib/esm/features/store/objects/DocumentPreviewPanel.js +150 -0
  161. package/lib/esm/features/store/objects/DocumentPreviewPanel.js.map +1 -0
  162. package/lib/esm/features/store/objects/DocumentSearchResults.js +123 -0
  163. package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -0
  164. package/lib/esm/features/store/objects/DocumentSelectionProvider.js +81 -0
  165. package/lib/esm/features/store/objects/DocumentSelectionProvider.js.map +1 -0
  166. package/lib/esm/features/store/objects/DocumentTable.js +278 -0
  167. package/lib/esm/features/store/objects/DocumentTable.js.map +1 -0
  168. package/lib/esm/features/store/objects/ExportPropertiesModal.js +31 -0
  169. package/lib/esm/features/store/objects/ExportPropertiesModal.js.map +1 -0
  170. package/lib/esm/features/store/objects/components/ContentDispositionButton.js +31 -0
  171. package/lib/esm/features/store/objects/components/ContentDispositionButton.js.map +1 -0
  172. package/lib/esm/features/store/objects/components/ContentOverview.js +195 -0
  173. package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -0
  174. package/lib/esm/features/store/objects/components/DocumentIcon.js +28 -0
  175. package/lib/esm/features/store/objects/components/DocumentIcon.js.map +1 -0
  176. package/lib/esm/features/store/objects/components/DocumentInput.js +52 -0
  177. package/lib/esm/features/store/objects/components/DocumentInput.js.map +1 -0
  178. package/lib/esm/features/store/objects/components/PropertiesEditorModal.js +169 -0
  179. package/lib/esm/features/store/objects/components/PropertiesEditorModal.js.map +1 -0
  180. package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js +45 -0
  181. package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js.map +1 -0
  182. package/lib/esm/features/store/objects/components/SelectDocument.js +39 -0
  183. package/lib/esm/features/store/objects/components/SelectDocument.js.map +1 -0
  184. package/lib/esm/features/store/objects/components/SelectDocumentModal.js +7 -0
  185. package/lib/esm/features/store/objects/components/SelectDocumentModal.js.map +1 -0
  186. package/lib/esm/features/store/objects/components/VectorSearchWidget.js +85 -0
  187. package/lib/esm/features/store/objects/components/VectorSearchWidget.js.map +1 -0
  188. package/lib/esm/features/store/objects/components/index.js +10 -0
  189. package/lib/esm/features/store/objects/components/index.js.map +1 -0
  190. package/lib/esm/features/store/objects/components/useDownloadObject.js +21 -0
  191. package/lib/esm/features/store/objects/components/useDownloadObject.js.map +1 -0
  192. package/lib/esm/features/store/objects/index.js +11 -0
  193. package/lib/esm/features/store/objects/index.js.map +1 -0
  194. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js +74 -0
  195. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js.map +1 -0
  196. package/lib/esm/features/store/objects/layout/documentLayout.js +16 -0
  197. package/lib/esm/features/store/objects/layout/documentLayout.js.map +1 -0
  198. package/lib/esm/features/store/objects/layout/index.js +3 -0
  199. package/lib/esm/features/store/objects/layout/index.js.map +1 -0
  200. package/lib/esm/features/store/objects/layout/renderers.js +128 -0
  201. package/lib/esm/features/store/objects/layout/renderers.js.map +1 -0
  202. package/lib/esm/features/store/objects/search/DocumentSearchContext.js +150 -0
  203. package/lib/esm/features/store/objects/search/DocumentSearchContext.js.map +1 -0
  204. package/lib/esm/features/store/objects/search/DocumentSearchProvider.js +41 -0
  205. package/lib/esm/features/store/objects/search/DocumentSearchProvider.js.map +1 -0
  206. package/lib/esm/features/store/objects/search/index.js +3 -0
  207. package/lib/esm/features/store/objects/search/index.js.map +1 -0
  208. package/lib/esm/features/store/objects/selection/ObjectsActionContext.js +149 -0
  209. package/lib/esm/features/store/objects/selection/ObjectsActionContext.js.map +1 -0
  210. package/lib/esm/features/store/objects/selection/ObjectsActionSpec.js +2 -0
  211. package/lib/esm/features/store/objects/selection/ObjectsActionSpec.js.map +1 -0
  212. package/lib/esm/features/store/objects/selection/SelectionActions.js +75 -0
  213. package/lib/esm/features/store/objects/selection/SelectionActions.js.map +1 -0
  214. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js +64 -0
  215. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js.map +1 -0
  216. package/lib/esm/features/store/objects/selection/actions/ChangeTypeAction.js +53 -0
  217. package/lib/esm/features/store/objects/selection/actions/ChangeTypeAction.js.map +1 -0
  218. package/lib/esm/features/store/objects/selection/actions/ConfirmAction.js +30 -0
  219. package/lib/esm/features/store/objects/selection/actions/ConfirmAction.js.map +1 -0
  220. package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js +66 -0
  221. package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js.map +1 -0
  222. package/lib/esm/features/store/objects/selection/actions/ExportPropertiesAction.js +106 -0
  223. package/lib/esm/features/store/objects/selection/actions/ExportPropertiesAction.js.map +1 -0
  224. package/lib/esm/features/store/objects/selection/actions/RemoveFromCollectionAction.js +64 -0
  225. package/lib/esm/features/store/objects/selection/actions/RemoveFromCollectionAction.js.map +1 -0
  226. package/lib/esm/features/store/objects/selection/actions/StartWorkflowComponent.js +72 -0
  227. package/lib/esm/features/store/objects/selection/actions/StartWorkflowComponent.js.map +1 -0
  228. package/lib/esm/features/store/objects/selection/actions/index.js +8 -0
  229. package/lib/esm/features/store/objects/selection/actions/index.js.map +1 -0
  230. package/lib/esm/features/store/objects/selection/index.js +5 -0
  231. package/lib/esm/features/store/objects/selection/index.js.map +1 -0
  232. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js +476 -0
  233. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js.map +1 -0
  234. package/lib/esm/features/store/objects/upload/index.js +4 -0
  235. package/lib/esm/features/store/objects/upload/index.js.map +1 -0
  236. package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js +201 -0
  237. package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js.map +1 -0
  238. package/lib/esm/features/store/objects/upload/useUploadHandler.js +230 -0
  239. package/lib/esm/features/store/objects/upload/useUploadHandler.js.map +1 -0
  240. package/lib/esm/features/store/types/ContentObjectTypeView.js +158 -0
  241. package/lib/esm/features/store/types/ContentObjectTypeView.js.map +1 -0
  242. package/lib/esm/features/store/types/ContentObjectTypesSearch.js +82 -0
  243. package/lib/esm/features/store/types/ContentObjectTypesSearch.js.map +1 -0
  244. package/lib/esm/features/store/types/ContentObjectTypesTable.js +11 -0
  245. package/lib/esm/features/store/types/ContentObjectTypesTable.js.map +1 -0
  246. package/lib/esm/features/store/types/ContentObjectTypesView.js +55 -0
  247. package/lib/esm/features/store/types/ContentObjectTypesView.js.map +1 -0
  248. package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js +26 -0
  249. package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js.map +1 -0
  250. package/lib/esm/features/store/types/ObjectSchemaEditor.js +89 -0
  251. package/lib/esm/features/store/types/ObjectSchemaEditor.js.map +1 -0
  252. package/lib/esm/features/store/types/SelectContentType.js +43 -0
  253. package/lib/esm/features/store/types/SelectContentType.js.map +1 -0
  254. package/lib/esm/features/store/types/SelectContentTypeModal.js +28 -0
  255. package/lib/esm/features/store/types/SelectContentTypeModal.js.map +1 -0
  256. package/lib/esm/features/store/types/TableLayoutEditor.js +78 -0
  257. package/lib/esm/features/store/types/TableLayoutEditor.js.map +1 -0
  258. package/lib/esm/features/store/types/index.js +11 -0
  259. package/lib/esm/features/store/types/index.js.map +1 -0
  260. package/lib/esm/features/store/types/search/ObjectTypeSearchContext.js +98 -0
  261. package/lib/esm/features/store/types/search/ObjectTypeSearchContext.js.map +1 -0
  262. package/lib/esm/features/store/types/search/ObjectTypeSearchProvider.js +15 -0
  263. package/lib/esm/features/store/types/search/ObjectTypeSearchProvider.js.map +1 -0
  264. package/lib/esm/features/store/types/search/index.js +3 -0
  265. package/lib/esm/features/store/types/search/index.js.map +1 -0
  266. package/lib/esm/features/user/UserAvatar.js +18 -0
  267. package/lib/esm/features/user/UserAvatar.js.map +1 -0
  268. package/lib/esm/features/user/UserInfo.js +88 -0
  269. package/lib/esm/features/user/UserInfo.js.map +1 -0
  270. package/lib/esm/features/user/index.js +3 -0
  271. package/lib/esm/features/user/index.js.map +1 -0
  272. package/lib/esm/features/utils/index.js +4 -0
  273. package/lib/esm/features/utils/index.js.map +1 -0
  274. package/lib/esm/features/utils/mimeType.js +9 -0
  275. package/lib/esm/features/utils/mimeType.js.map +1 -0
  276. package/lib/esm/features/utils/rendition.js +47 -0
  277. package/lib/esm/features/utils/rendition.js.map +1 -0
  278. package/lib/esm/features/utils/text.js +10 -0
  279. package/lib/esm/features/utils/text.js.map +1 -0
  280. package/lib/esm/layout/FullHeightLayout.js +1 -1
  281. package/lib/esm/layout/FullHeightLayout.js.map +1 -1
  282. package/lib/esm/layout/Sidebar.js +12 -2
  283. package/lib/esm/layout/Sidebar.js.map +1 -1
  284. package/lib/esm/widgets/Progress.js +5 -0
  285. package/lib/esm/widgets/Progress.js.map +1 -0
  286. package/lib/esm/widgets/codemirror/CodeMirrorEditor.js +1 -1
  287. package/lib/esm/widgets/codemirror/CodeMirrorEditor.js.map +1 -1
  288. package/lib/esm/widgets/form/Form.js +2 -2
  289. package/lib/esm/widgets/form/Form.js.map +1 -1
  290. package/lib/esm/widgets/form/schema.js +11 -5
  291. package/lib/esm/widgets/form/schema.js.map +1 -1
  292. package/lib/esm/widgets/index.js +4 -0
  293. package/lib/esm/widgets/index.js.map +1 -1
  294. package/lib/esm/widgets/popover/Popover.js +73 -0
  295. package/lib/esm/widgets/popover/Popover.js.map +1 -0
  296. package/lib/esm/widgets/popover/context.js +7 -0
  297. package/lib/esm/widgets/popover/context.js.map +1 -0
  298. package/lib/esm/widgets/popover/index.js +3 -0
  299. package/lib/esm/widgets/popover/index.js.map +1 -0
  300. package/lib/esm/widgets/popover/slots.js +22 -0
  301. package/lib/esm/widgets/popover/slots.js.map +1 -0
  302. package/lib/esm/widgets/properties/PropertiesView.js +6 -0
  303. package/lib/esm/widgets/properties/PropertiesView.js.map +1 -0
  304. package/lib/esm/widgets/properties/index.js +2 -0
  305. package/lib/esm/widgets/properties/index.js.map +1 -0
  306. package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js +1 -2
  307. package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js.map +1 -1
  308. package/lib/esm/widgets/schema-editor/editor/Editable.js +9 -10
  309. package/lib/esm/widgets/schema-editor/editor/Editable.js.map +1 -1
  310. package/lib/esm/widgets/schema-editor/editor/PropertyViewer.js +1 -1
  311. package/lib/esm/widgets/schema-editor/editor/PropertyViewer.js.map +1 -1
  312. package/lib/esm/widgets/schema-editor/editor/SchemaEditor.js +2 -2
  313. package/lib/esm/widgets/schema-editor/editor/SchemaEditor.js.map +1 -1
  314. package/lib/esm/widgets/upload/DropZone.js +162 -0
  315. package/lib/esm/widgets/upload/DropZone.js.map +1 -0
  316. package/lib/esm/widgets/upload/UploadResultCategory.js +19 -0
  317. package/lib/esm/widgets/upload/UploadResultCategory.js.map +1 -0
  318. package/lib/esm/widgets/upload/UploadSummary.js +30 -0
  319. package/lib/esm/widgets/upload/UploadSummary.js.map +1 -0
  320. package/lib/esm/widgets/upload/index.js +4 -0
  321. package/lib/esm/widgets/upload/index.js.map +1 -0
  322. package/lib/tsconfig.tsbuildinfo +1 -1
  323. package/lib/types/core/components/FormItem.d.ts +11 -0
  324. package/lib/types/core/components/index.d.ts +3 -3
  325. package/lib/types/core/components/shadcn/button.d.ts +13 -2
  326. package/lib/types/core/components/shadcn/command.d.ts +7 -7
  327. package/lib/types/core/components/shadcn/filters/DynamicLabel.d.ts +8 -0
  328. package/lib/types/core/components/shadcn/filters/comboBox.d.ts +5 -5
  329. package/lib/types/core/components/shadcn/filters/dateFilter.d.ts +3 -4
  330. package/lib/types/core/components/shadcn/filters/types.d.ts +7 -1
  331. package/lib/types/core/components/shadcn/input.d.ts +4 -4
  332. package/lib/types/core/components/shadcn/selectBox.d.ts +13 -4
  333. package/lib/types/core/components/table/index.d.ts +1 -0
  334. package/lib/types/core/index.d.ts +2 -1
  335. package/lib/types/core/utils/cn.d.ts +2 -0
  336. package/lib/types/core/utils/index.d.ts +1 -0
  337. package/lib/types/features/agent/PayloadBuilder.d.ts +53 -0
  338. package/lib/types/features/agent/chat/AnimatedThinkingDots.d.ts +37 -0
  339. package/lib/types/features/agent/chat/JumpingDots.d.ts +6 -0
  340. package/lib/types/features/agent/chat/ModernAgentConversation.d.ts +24 -0
  341. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +21 -0
  342. package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts +18 -0
  343. package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.d.ts +10 -0
  344. package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts +15 -0
  345. package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +12 -0
  346. package/lib/types/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +7 -0
  347. package/lib/types/features/agent/chat/ModernAgentOutput/MessagesContainer.d.ts +9 -0
  348. package/lib/types/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts +8 -0
  349. package/lib/types/features/agent/chat/ModernAgentOutput/SlideInPanel.d.ts +10 -0
  350. package/lib/types/features/agent/chat/ModernAgentOutput/SlidingMessages.d.ts +7 -0
  351. package/lib/types/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.d.ts +9 -0
  352. package/lib/types/features/agent/chat/ModernAgentOutput/StackedMessages.d.ts +7 -0
  353. package/lib/types/features/agent/chat/ModernAgentOutput/WorkstreamTabs.d.ts +21 -0
  354. package/lib/types/features/agent/chat/ModernAgentOutput/utils.d.ts +23 -0
  355. package/lib/types/features/agent/chat/SlidingThinkingIndicator.d.ts +17 -0
  356. package/lib/types/features/agent/chat/WaitingMessages.d.ts +1 -0
  357. package/lib/types/features/agent/chat/index.d.ts +4 -0
  358. package/lib/types/features/agent/index.d.ts +2 -0
  359. package/lib/types/features/errors/PanelErrorBoundary.d.ts +4 -0
  360. package/lib/types/features/errors/RowErrorBoundary.d.ts +7 -0
  361. package/lib/types/features/errors/VertesiaErrorBoundary.d.ts +11 -0
  362. package/lib/types/features/errors/WidgetErrorBoundary.d.ts +4 -0
  363. package/lib/types/features/errors/index.d.ts +4 -0
  364. package/lib/types/features/facets/EnvironmentFacet.d.ts +9 -0
  365. package/lib/types/features/facets/FacetsNav.d.ts +6 -0
  366. package/lib/types/features/facets/InteractionFacet.d.ts +9 -0
  367. package/lib/types/features/facets/StringFacet.d.ts +10 -0
  368. package/lib/types/features/facets/StringListFacet.d.ts +10 -0
  369. package/lib/types/features/facets/TypeFacet.d.ts +15 -0
  370. package/lib/types/features/facets/TypeOptions.d.ts +3 -0
  371. package/lib/types/features/facets/UserFacet.d.ts +11 -0
  372. package/lib/types/features/facets/VFacetsNav.d.ts +7 -0
  373. package/lib/types/features/facets/VStringFacet.d.ts +15 -0
  374. package/lib/types/features/facets/VTypeFacet.d.ts +8 -0
  375. package/lib/types/features/facets/VUserFacet.d.ts +9 -0
  376. package/lib/types/features/facets/index.d.ts +11 -0
  377. package/lib/types/features/facets/utils.d.ts +3 -0
  378. package/lib/types/features/index.d.ts +9 -1
  379. package/lib/types/features/layout/GenericPageNavHeader.d.ts +12 -0
  380. package/lib/types/features/layout/NotFoundView.d.ts +4 -0
  381. package/lib/types/features/layout/index.d.ts +2 -0
  382. package/lib/types/features/magic-pdf/DownloadPopover.d.ts +6 -0
  383. package/lib/types/features/magic-pdf/MagicPdfView.d.ts +6 -0
  384. package/lib/types/features/magic-pdf/PageSlider.d.ts +7 -0
  385. package/lib/types/features/magic-pdf/PdfPageProvider.d.ts +28 -0
  386. package/lib/types/features/magic-pdf/TextPageView.d.ts +7 -0
  387. package/lib/types/features/magic-pdf/index.d.ts +1 -0
  388. package/lib/types/features/magic-pdf/types.d.ts +1 -0
  389. package/lib/types/features/magic-pdf/useResizeOnDrag.d.ts +8 -0
  390. package/lib/types/features/store/collections/BrowseCollectionView.d.ts +6 -0
  391. package/lib/types/features/store/collections/CollectionView.d.ts +5 -0
  392. package/lib/types/features/store/collections/CollectionsTable.d.ts +5 -0
  393. package/lib/types/features/store/collections/CollectionsView.d.ts +10 -0
  394. package/lib/types/features/store/collections/EditCollectionView.d.ts +7 -0
  395. package/lib/types/features/store/collections/index.d.ts +5 -0
  396. package/lib/types/features/store/index.d.ts +3 -0
  397. package/lib/types/features/store/objects/DocumentPreviewPanel.d.ts +7 -0
  398. package/lib/types/features/store/objects/DocumentSearchResults.d.ts +19 -0
  399. package/lib/types/features/store/objects/DocumentSelectionProvider.d.ts +32 -0
  400. package/lib/types/features/store/objects/DocumentTable.d.ts +20 -0
  401. package/lib/types/features/store/objects/ExportPropertiesModal.d.ts +11 -0
  402. package/lib/types/features/store/objects/components/ContentDispositionButton.d.ts +8 -0
  403. package/lib/types/features/store/objects/components/ContentOverview.d.ts +7 -0
  404. package/lib/types/features/store/objects/components/DocumentIcon.d.ts +10 -0
  405. package/lib/types/features/store/objects/components/DocumentInput.d.ts +7 -0
  406. package/lib/types/features/store/objects/components/PropertiesEditorModal.d.ts +7 -0
  407. package/lib/types/features/store/objects/components/SaveVersionConfirmModal.d.ts +8 -0
  408. package/lib/types/features/store/objects/components/SelectDocument.d.ts +8 -0
  409. package/lib/types/features/store/objects/components/SelectDocumentModal.d.ts +8 -0
  410. package/lib/types/features/store/objects/components/VectorSearchWidget.d.ts +10 -0
  411. package/lib/types/features/store/objects/components/index.d.ts +9 -0
  412. package/lib/types/features/store/objects/components/useDownloadObject.d.ts +3 -0
  413. package/lib/types/features/store/objects/index.d.ts +10 -0
  414. package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts +16 -0
  415. package/lib/types/features/store/objects/layout/documentLayout.d.ts +17 -0
  416. package/lib/types/features/store/objects/layout/index.d.ts +2 -0
  417. package/lib/types/features/store/objects/layout/renderers.d.ts +2 -0
  418. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts +48 -0
  419. package/lib/types/features/store/objects/search/DocumentSearchProvider.d.ts +15 -0
  420. package/lib/types/features/store/objects/search/index.d.ts +2 -0
  421. package/lib/types/features/store/objects/selection/ObjectsActionContext.d.ts +25 -0
  422. package/lib/types/features/store/objects/selection/ObjectsActionSpec.d.ts +27 -0
  423. package/lib/types/features/store/objects/selection/SelectionActions.d.ts +4 -0
  424. package/lib/types/features/store/objects/selection/actions/AddToCollectionAction.d.ts +3 -0
  425. package/lib/types/features/store/objects/selection/actions/ChangeTypeAction.d.ts +3 -0
  426. package/lib/types/features/store/objects/selection/actions/ConfirmAction.d.ts +15 -0
  427. package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts +2 -0
  428. package/lib/types/features/store/objects/selection/actions/ExportPropertiesAction.d.ts +3 -0
  429. package/lib/types/features/store/objects/selection/actions/RemoveFromCollectionAction.d.ts +2 -0
  430. package/lib/types/features/store/objects/selection/actions/StartWorkflowComponent.d.ts +3 -0
  431. package/lib/types/features/store/objects/selection/actions/index.d.ts +7 -0
  432. package/lib/types/features/store/objects/selection/index.d.ts +4 -0
  433. package/lib/types/features/store/objects/upload/DocumentUploadModal.d.ts +37 -0
  434. package/lib/types/features/store/objects/upload/index.d.ts +3 -0
  435. package/lib/types/features/store/objects/upload/useSmartFileUploadProcessing.d.ts +29 -0
  436. package/lib/types/features/store/objects/upload/useUploadHandler.d.ts +49 -0
  437. package/lib/types/features/store/types/ContentObjectTypeView.d.ts +5 -0
  438. package/lib/types/features/store/types/ContentObjectTypesSearch.d.ts +5 -0
  439. package/lib/types/features/store/types/ContentObjectTypesTable.d.ts +7 -0
  440. package/lib/types/features/store/types/ContentObjectTypesView.d.ts +8 -0
  441. package/lib/types/features/store/types/CreateOrUpdateTypeModal.d.ts +14 -0
  442. package/lib/types/features/store/types/ObjectSchemaEditor.d.ts +7 -0
  443. package/lib/types/features/store/types/SelectContentType.d.ts +10 -0
  444. package/lib/types/features/store/types/SelectContentTypeModal.d.ts +32 -0
  445. package/lib/types/features/store/types/TableLayoutEditor.d.ts +8 -0
  446. package/lib/types/features/store/types/index.d.ts +10 -0
  447. package/lib/types/features/store/types/search/ObjectTypeSearchContext.d.ts +35 -0
  448. package/lib/types/features/store/types/search/ObjectTypeSearchProvider.d.ts +10 -0
  449. package/lib/types/features/store/types/search/index.d.ts +2 -0
  450. package/lib/types/features/user/UserAvatar.d.ts +8 -0
  451. package/lib/types/features/user/UserInfo.d.ts +36 -0
  452. package/lib/types/features/user/index.d.ts +2 -0
  453. package/lib/types/features/utils/index.d.ts +3 -0
  454. package/lib/types/features/utils/mimeType.d.ts +4 -0
  455. package/lib/types/features/utils/rendition.d.ts +3 -0
  456. package/lib/types/features/utils/text.d.ts +2 -0
  457. package/lib/types/layout/Sidebar.d.ts +2 -1
  458. package/lib/types/widgets/Progress.d.ts +5 -0
  459. package/lib/types/widgets/form/schema.d.ts +4 -3
  460. package/lib/types/widgets/index.d.ts +4 -0
  461. package/lib/types/widgets/popover/Popover.d.ts +37 -0
  462. package/lib/types/widgets/popover/context.d.ts +7 -0
  463. package/lib/types/widgets/popover/index.d.ts +2 -0
  464. package/lib/types/widgets/popover/slots.d.ts +4 -0
  465. package/lib/types/widgets/properties/PropertiesView.d.ts +10 -0
  466. package/lib/types/widgets/properties/index.d.ts +1 -0
  467. package/lib/types/widgets/upload/DropZone.d.ts +40 -0
  468. package/lib/types/widgets/upload/UploadResultCategory.d.ts +25 -0
  469. package/lib/types/widgets/upload/UploadSummary.d.ts +37 -0
  470. package/lib/types/widgets/upload/index.d.ts +3 -0
  471. package/lib/vertesia-ui-core.js +1 -1
  472. package/lib/vertesia-ui-core.js.map +1 -1
  473. package/lib/vertesia-ui-features.js +1 -1
  474. package/lib/vertesia-ui-features.js.map +1 -1
  475. package/lib/vertesia-ui-layout.js +1 -1
  476. package/lib/vertesia-ui-layout.js.map +1 -1
  477. package/lib/vertesia-ui-router.js.map +1 -1
  478. package/lib/vertesia-ui-session.js.map +1 -1
  479. package/lib/vertesia-ui-widgets.js +1 -1
  480. package/lib/vertesia-ui-widgets.js.map +1 -1
  481. package/package.json +13 -5
  482. package/src/core/components/FormItem.tsx +35 -0
  483. package/src/core/components/InputList.tsx +4 -3
  484. package/src/core/components/index.ts +3 -3
  485. package/src/core/components/shadcn/button.tsx +68 -8
  486. package/src/core/components/shadcn/dialog.tsx +3 -3
  487. package/src/core/components/shadcn/filters/DynamicLabel.tsx +45 -0
  488. package/src/core/components/shadcn/filters/comboBox.tsx +56 -52
  489. package/src/core/components/shadcn/filters/dateFilter.tsx +24 -25
  490. package/src/core/components/shadcn/filters/filterBar.tsx +53 -47
  491. package/src/core/components/shadcn/filters/filters.tsx +43 -30
  492. package/src/core/components/shadcn/filters/selectFilter.tsx +53 -34
  493. package/src/core/components/shadcn/filters/textFilter.tsx +6 -3
  494. package/src/core/components/shadcn/filters/types.ts +8 -1
  495. package/src/core/components/shadcn/input.tsx +5 -5
  496. package/src/core/components/shadcn/selectBox.tsx +138 -33
  497. package/src/core/components/styles.ts +1 -1
  498. package/src/core/components/table/index.tsx +8 -0
  499. package/src/core/index.ts +2 -1
  500. package/src/core/utils/cn.ts +6 -0
  501. package/src/core/utils/index.ts +1 -0
  502. package/src/features/agent/PayloadBuilder.tsx +208 -0
  503. package/src/features/agent/chat/AnimatedThinkingDots.tsx +350 -0
  504. package/src/features/agent/chat/JumpingDots.tsx +16 -0
  505. package/src/features/agent/chat/ModernAgentConversation.tsx +708 -0
  506. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +246 -0
  507. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +231 -0
  508. package/src/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.tsx +66 -0
  509. package/src/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.tsx +282 -0
  510. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +125 -0
  511. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +562 -0
  512. package/src/features/agent/chat/ModernAgentOutput/MessagesContainer.tsx +51 -0
  513. package/src/features/agent/chat/ModernAgentOutput/PlanPanel.tsx +123 -0
  514. package/src/features/agent/chat/ModernAgentOutput/README-image-support.md +43 -0
  515. package/src/features/agent/chat/ModernAgentOutput/SlideInPanel.tsx +72 -0
  516. package/src/features/agent/chat/ModernAgentOutput/SlidingMessages.tsx +96 -0
  517. package/src/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.tsx +185 -0
  518. package/src/features/agent/chat/ModernAgentOutput/StackedMessages.tsx +33 -0
  519. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +167 -0
  520. package/src/features/agent/chat/ModernAgentOutput/utils.ts +195 -0
  521. package/src/features/agent/chat/ModernAgentOutput/with-types.d.ts +15 -0
  522. package/src/features/agent/chat/SlidingThinkingIndicator.tsx +459 -0
  523. package/src/features/agent/chat/WaitingMessages.ts +66 -0
  524. package/src/features/agent/chat/index.ts +4 -0
  525. package/src/features/agent/index.ts +2 -0
  526. package/src/features/errors/PanelErrorBoundary.tsx +30 -0
  527. package/src/features/errors/RowErrorBoundary.tsx +28 -0
  528. package/src/features/errors/VertesiaErrorBoundary.tsx +28 -0
  529. package/src/features/errors/WidgetErrorBoundary.tsx +27 -0
  530. package/src/features/errors/index.ts +4 -0
  531. package/src/features/facets/EnvironmentFacet.tsx +53 -0
  532. package/src/features/facets/FacetsNav.tsx +19 -0
  533. package/src/features/facets/InteractionFacet.tsx +53 -0
  534. package/src/features/facets/StringFacet.tsx +23 -0
  535. package/src/features/facets/StringListFacet.tsx +22 -0
  536. package/src/features/facets/TypeFacet.tsx +59 -0
  537. package/src/features/facets/TypeOptions.tsx +22 -0
  538. package/src/features/facets/UserFacet.tsx +61 -0
  539. package/src/features/facets/VFacetsNav.tsx +139 -0
  540. package/src/features/facets/VStringFacet.tsx +34 -0
  541. package/src/features/facets/VTypeFacet.tsx +72 -0
  542. package/src/features/facets/VUserFacet.tsx +47 -0
  543. package/src/features/facets/index.ts +11 -0
  544. package/src/features/facets/utils.tsx +9 -0
  545. package/src/features/index.ts +9 -1
  546. package/src/features/layout/GenericPageNavHeader.tsx +48 -0
  547. package/src/features/layout/NotFoundView.tsx +11 -0
  548. package/src/features/layout/index.ts +2 -0
  549. package/src/features/magic-pdf/DownloadPopover.tsx +32 -0
  550. package/src/features/magic-pdf/MagicPdfView.tsx +102 -0
  551. package/src/features/magic-pdf/PageSlider.tsx +112 -0
  552. package/src/features/magic-pdf/PdfPageProvider.tsx +229 -0
  553. package/src/features/magic-pdf/TextPageView.tsx +65 -0
  554. package/src/features/magic-pdf/index.ts +1 -0
  555. package/src/features/magic-pdf/types.ts +1 -0
  556. package/src/features/magic-pdf/useResizeOnDrag.ts +42 -0
  557. package/src/features/store/collections/BrowseCollectionView.tsx +45 -0
  558. package/src/features/store/collections/CollectionView.tsx +94 -0
  559. package/src/features/store/collections/CollectionsTable.tsx +115 -0
  560. package/src/features/store/collections/CollectionsView.tsx +166 -0
  561. package/src/features/store/collections/EditCollectionView.tsx +253 -0
  562. package/src/features/store/collections/index.ts +5 -0
  563. package/src/features/store/index.ts +3 -0
  564. package/src/features/store/objects/DocumentPreviewPanel.tsx +417 -0
  565. package/src/features/store/objects/DocumentSearchResults.tsx +209 -0
  566. package/src/features/store/objects/DocumentSelectionProvider.tsx +99 -0
  567. package/src/features/store/objects/DocumentTable.tsx +409 -0
  568. package/src/features/store/objects/ExportPropertiesModal.tsx +89 -0
  569. package/src/features/store/objects/components/ContentDispositionButton.tsx +45 -0
  570. package/src/features/store/objects/components/ContentOverview.tsx +466 -0
  571. package/src/features/store/objects/components/DocumentIcon.tsx +87 -0
  572. package/src/features/store/objects/components/DocumentInput.tsx +90 -0
  573. package/src/features/store/objects/components/PropertiesEditorModal.tsx +253 -0
  574. package/src/features/store/objects/components/SaveVersionConfirmModal.tsx +136 -0
  575. package/src/features/store/objects/components/SelectDocument.tsx +69 -0
  576. package/src/features/store/objects/components/SelectDocumentModal.tsx +20 -0
  577. package/src/features/store/objects/components/VectorSearchWidget.tsx +115 -0
  578. package/src/features/store/objects/components/index.ts +9 -0
  579. package/src/features/store/objects/components/useDownloadObject.ts +24 -0
  580. package/src/features/store/objects/index.ts +10 -0
  581. package/src/features/store/objects/layout/DocumentTableColumn.tsx +84 -0
  582. package/src/features/store/objects/layout/documentLayout.tsx +69 -0
  583. package/src/features/store/objects/layout/index.ts +2 -0
  584. package/src/features/store/objects/layout/knowledge.md +238 -0
  585. package/src/features/store/objects/layout/renderers.tsx +139 -0
  586. package/src/features/store/objects/search/DocumentSearchContext.ts +181 -0
  587. package/src/features/store/objects/search/DocumentSearchProvider.tsx +54 -0
  588. package/src/features/store/objects/search/index.ts +2 -0
  589. package/src/features/store/objects/selection/ObjectsActionContext.tsx +196 -0
  590. package/src/features/store/objects/selection/ObjectsActionSpec.ts +31 -0
  591. package/src/features/store/objects/selection/SelectionActions.tsx +160 -0
  592. package/src/features/store/objects/selection/actions/AddToCollectionAction.tsx +114 -0
  593. package/src/features/store/objects/selection/actions/ChangeTypeAction.tsx +76 -0
  594. package/src/features/store/objects/selection/actions/ConfirmAction.tsx +46 -0
  595. package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +77 -0
  596. package/src/features/store/objects/selection/actions/ExportPropertiesAction.tsx +117 -0
  597. package/src/features/store/objects/selection/actions/RemoveFromCollectionAction.tsx +77 -0
  598. package/src/features/store/objects/selection/actions/StartWorkflowComponent.tsx +122 -0
  599. package/src/features/store/objects/selection/actions/index.ts +7 -0
  600. package/src/features/store/objects/selection/index.ts +4 -0
  601. package/src/features/store/objects/upload/DocumentUploadModal.tsx +970 -0
  602. package/src/features/store/objects/upload/index.ts +3 -0
  603. package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +250 -0
  604. package/src/features/store/objects/upload/useUploadHandler.ts +325 -0
  605. package/src/features/store/types/ContentObjectTypeView.tsx +244 -0
  606. package/src/features/store/types/ContentObjectTypesSearch.tsx +111 -0
  607. package/src/features/store/types/ContentObjectTypesTable.tsx +38 -0
  608. package/src/features/store/types/ContentObjectTypesView.tsx +71 -0
  609. package/src/features/store/types/CreateOrUpdateTypeModal.tsx +70 -0
  610. package/src/features/store/types/ObjectSchemaEditor.tsx +127 -0
  611. package/src/features/store/types/SelectContentType.tsx +88 -0
  612. package/src/features/store/types/SelectContentTypeModal.tsx +142 -0
  613. package/src/features/store/types/TableLayoutEditor.tsx +104 -0
  614. package/src/features/store/types/index.ts +10 -0
  615. package/src/features/store/types/search/ObjectTypeSearchContext.tsx +119 -0
  616. package/src/features/store/types/search/ObjectTypeSearchProvider.tsx +24 -0
  617. package/src/features/store/types/search/index.ts +2 -0
  618. package/src/features/user/UserAvatar.tsx +34 -0
  619. package/src/features/user/UserInfo.tsx +215 -0
  620. package/src/features/user/index.ts +2 -0
  621. package/src/features/utils/index.ts +3 -0
  622. package/src/features/utils/mimeType.ts +9 -0
  623. package/src/features/utils/rendition.ts +75 -0
  624. package/src/features/utils/text.ts +10 -0
  625. package/src/layout/FullHeightLayout.tsx +1 -1
  626. package/src/layout/Sidebar.tsx +12 -2
  627. package/src/widgets/Progress.tsx +10 -0
  628. package/src/widgets/codemirror/CodeMirrorEditor.tsx +1 -1
  629. package/src/widgets/form/Form.tsx +2 -2
  630. package/src/widgets/form/schema.ts +14 -7
  631. package/src/widgets/index.ts +5 -1
  632. package/src/widgets/popover/Popover.tsx +171 -0
  633. package/src/widgets/popover/context.ts +15 -0
  634. package/src/widgets/popover/index.ts +2 -0
  635. package/src/widgets/popover/slots.ts +24 -0
  636. package/src/widgets/properties/PropertiesView.tsx +26 -0
  637. package/src/widgets/properties/index.ts +1 -0
  638. package/src/widgets/schema-editor/JSONSchemaEditorModal.tsx +1 -2
  639. package/src/widgets/schema-editor/editor/Editable.tsx +12 -13
  640. package/src/widgets/schema-editor/editor/PropertyViewer.tsx +1 -1
  641. package/src/widgets/schema-editor/editor/SchemaEditor.tsx +4 -4
  642. package/src/widgets/upload/DropZone.tsx +257 -0
  643. package/src/widgets/upload/UploadResultCategory.tsx +81 -0
  644. package/src/widgets/upload/UploadSummary.tsx +116 -0
  645. package/src/widgets/upload/index.ts +3 -0
  646. package/lib/esm/code/index.js +0 -3
  647. package/lib/esm/code/index.js.map +0 -1
  648. package/lib/esm/core/components/Input.js +0 -16
  649. package/lib/esm/core/components/Input.js.map +0 -1
  650. package/lib/esm/form/index.js +0 -3
  651. package/lib/esm/form/index.js.map +0 -1
  652. package/lib/types/code/index.d.ts +0 -0
  653. package/lib/types/core/components/Input.d.ts +0 -8
  654. package/lib/types/form/index.d.ts +0 -0
  655. package/lib/vertesia-ui-code.js +0 -2
  656. package/lib/vertesia-ui-code.js.map +0 -1
  657. package/lib/vertesia-ui-form.js +0 -2
  658. package/lib/vertesia-ui-form.js.map +0 -1
  659. package/src/code/index.ts +0 -1
  660. package/src/core/components/Input.tsx +0 -43
  661. package/src/form/index.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"vertesia-ui-session.js","sources":["esm/session/auth/firebase.js","esm/session/TypeRegistry.js","esm/session/UserSession.js","esm/session/auth/composable.js","esm/session/auth/useAuthState.js","esm/session/UserSessionProvider.js","esm/session/useUXTracking.js"],"sourcesContent":["import { Env } from \"@vertesia/ui/env\";\nimport { getAnalytics } from \"firebase/analytics\";\nimport { initializeApp } from \"firebase/app\";\nimport { getAuth } from \"firebase/auth\";\n// Use lazy initialization to avoid accessing Env before it's initialized\nlet _firebaseApp = null;\nlet _analytics = null;\nlet _firebaseAuth = null;\n// Getters that lazily initialize Firebase components when first accessed\nexport function getFirebaseApp() {\n if (!_firebaseApp) {\n try {\n _firebaseApp = initializeApp(Env.firebase);\n }\n catch (error) {\n console.error(\"Failed to initialize Firebase app:\", error);\n throw new Error(\"Firebase initialization failed - environment may not be properly initialized\");\n }\n }\n return _firebaseApp;\n}\nexport function getFirebaseAnalytics() {\n if (!_analytics) {\n _analytics = getAnalytics(getFirebaseApp());\n }\n return _analytics;\n}\nexport function getFirebaseAuth() {\n if (!_firebaseAuth) {\n _firebaseAuth = getAuth(getFirebaseApp());\n }\n return _firebaseAuth;\n}\nexport async function setFirebaseTenant(tenantEmail) {\n if (!tenantEmail) {\n console.log(\"No tenant name or email specified, skipping tenant setup\");\n return;\n }\n try {\n if (tenantEmail)\n console.log(`Resolving tenant ID from email: ${tenantEmail}`);\n // Add retry logic with exponential backoff\n let retries = 3;\n let retryDelay = 250; // Start with 250ms delay\n while (retries > 0) {\n try {\n // Call the API endpoint to resolve the tenant ID\n const response = await fetch(\"/api/resolve-tenant\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n tenantEmail: tenantEmail,\n }),\n // Add timeout to prevent hanging requests\n signal: AbortSignal.timeout(5000),\n });\n // Check for network errors\n if (!response) {\n throw new Error(\"No response received from tenant API\");\n }\n // Handle HTTP error responses\n if (!response.ok) {\n // Try to parse the error response\n try {\n const errorData = await response.json();\n console.error(\"Failed to resolve tenant ID:\", errorData.error);\n }\n catch (parseError) {\n console.error(`Failed to resolve tenant ID: HTTP ${response.status}`);\n }\n // If the error is 404 Not Found, no need to retry\n if (response.status === 404) {\n console.warn(`Tenant not found for ${tenantEmail}`);\n return;\n }\n throw new Error(`HTTP error ${response.status}`);\n }\n // Successfully got a response, parse it\n const data = (await response.json());\n if (data && data.firebaseTenantId) {\n const auth = getFirebaseAuth();\n auth.tenantId = data.firebaseTenantId;\n Env.firebase.providerType = data.provider ?? \"oidc\";\n console.log(`Tenant ID set to ${auth.tenantId}`);\n return data;\n }\n else {\n console.error(`Invalid response format, missing tenantId for ${tenantEmail}`);\n return; // No need to retry for invalid response format\n }\n }\n catch (fetchError) {\n // Only retry for network-related errors\n if (retries > 1) {\n console.warn(`Tenant resolution failed, retrying in ${retryDelay}ms...`, fetchError);\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n retryDelay *= 2; // Exponential backoff\n retries--;\n }\n else {\n throw fetchError; // Last retry failed, propagate error\n }\n }\n }\n }\n catch (error) {\n // Final error handler\n console.error(\"Error setting Firebase tenant:\", error instanceof Error ? error.message : \"Unknown error\");\n // Continue without tenant ID - authentication will work without multi-tenancy\n // but the user will access the default tenant\n }\n}\nexport async function getFirebaseAuthToken(refresh) {\n const auth = getFirebaseAuth();\n const user = auth.currentUser;\n if (user) {\n return user\n .getIdToken(refresh)\n .then((token) => {\n Env.logger.info(\"Got Firebase token\", {\n vertesia: {\n user_email: user.email,\n user_name: user.displayName,\n user_id: user.uid,\n refresh: refresh,\n },\n });\n return token;\n })\n .catch((err) => {\n Env.logger.error(\"Failed to get Firebase token\", {\n vertesia: {\n user_email: user.email,\n user_name: user.displayName,\n user_id: user.uid,\n refresh: refresh,\n error: err,\n },\n });\n console.error(\"Failed to get access token\", err);\n return null;\n });\n }\n else {\n Env.logger.warn(\"No user found\");\n return Promise.resolve(null);\n }\n}\n//# sourceMappingURL=firebase.js.map","export class TypeRegistry {\n types;\n map = {};\n constructor(types) {\n this.types = types;\n //sort types\n types.sort((a, b) => a.name.localeCompare(b.name));\n for (const type of types) {\n this.map[type.id] = type;\n }\n }\n getType(id) {\n return this.map[id];\n }\n getTypeLayout(id) {\n const type = this.map[id];\n return type ? type.table_layout : undefined;\n }\n getTypeName(id) {\n const type = this.map[id];\n return type ? type.name : undefined;\n }\n}\n//# sourceMappingURL=TypeRegistry.js.map","import { jwtDecode } from 'jwt-decode';\nimport { createContext, useContext } from 'react';\nimport { VertesiaClient } from '@vertesia/client';\nimport { Env } from '@vertesia/ui/env';\nimport { getComposableToken } from './auth/composable';\nimport { getFirebaseAuth } from './auth/firebase';\nimport { TypeRegistry } from './TypeRegistry';\nexport const LastSelectedAccountId_KEY = 'composableai.lastSelectedAccountId';\nexport const LastSelectedProjectId_KEY = 'composableai.lastSelectedProjectId';\nclass UserSession {\n isLoading = true;\n client;\n authError;\n authToken;\n typeRegistry;\n setSession;\n lastSelectedAccount;\n lastSelectedProject;\n onboardingComplete;\n constructor(client, setSession) {\n if (client) {\n this.client = client;\n }\n else {\n this.client = new VertesiaClient({\n serverUrl: Env.endpoints.studio,\n storeUrl: Env.endpoints.zeno,\n });\n }\n if (setSession) {\n this.setSession = setSession;\n }\n this.logout = this.logout.bind(this);\n }\n get store() {\n return this.client.store;\n }\n get user() {\n return this.authToken;\n }\n get account() {\n return this.authToken?.account;\n }\n get project() {\n return this.authToken?.project;\n }\n get accounts() {\n return this.authToken?.accounts;\n }\n get authCallback() {\n return this.rawAuthToken.then(token => `Bearer ${token}`);\n }\n get rawAuthToken() {\n return getComposableToken().then(res => {\n const token = res?.rawToken;\n if (!token) {\n throw new Error('No token available');\n }\n this.authToken = jwtDecode(token);\n return token;\n });\n }\n signOut() {\n this.logout();\n }\n getAccount() {\n return this.authToken?.account;\n }\n async login(token) {\n this.authError = undefined;\n this.isLoading = false;\n this.client.withAuthCallback(() => this.authCallback);\n this.authToken = jwtDecode(token);\n console.log(`Logging in as ${this.authToken?.name} with account ${this.authToken?.account.name} (${this.authToken?.account.id}, and project ${this.authToken?.project?.name} (${this.authToken?.project?.id})`);\n //store selected account in local storage\n localStorage.setItem(LastSelectedAccountId_KEY, this.authToken.account.id);\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.authToken.account.id, this.authToken.project?.id ?? '');\n // notify the host app of the login\n Env.onLogin?.(this.authToken);\n // Independent async calls\n await Promise.all([\n this._loadTypes(),\n this.fetchOnboardingStatus(),\n ]);\n return Promise.resolve();\n }\n isLoggedIn() {\n return !!this.authToken;\n }\n logout() {\n console.log('Logging out');\n if (this.authToken) {\n getFirebaseAuth().signOut();\n }\n this.authError = undefined;\n this.isLoading = false;\n this.authToken = undefined;\n this.typeRegistry = undefined;\n this.setSession = undefined;\n this.client.withAuthCallback(undefined);\n }\n async switchAccount(targetAccountId) {\n localStorage.setItem(LastSelectedAccountId_KEY, targetAccountId);\n if (this) {\n if (this.account && this.project) {\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.account.id, this.project.id);\n }\n else if (this.account) {\n localStorage.removeItem(LastSelectedProjectId_KEY + '-' + this.account.id);\n }\n }\n window.location.replace('/?a=' + targetAccountId);\n }\n async switchProject(targetProjectId) {\n if (this.account) {\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.account.id, targetProjectId);\n }\n window.location.replace('/?a=' + this.account?.id + '&p=' + targetProjectId);\n }\n async _loadTypes() {\n if (this.project) {\n return this.store.types.list({}, { layout: true }).then(types => this.typeRegistry = new TypeRegistry(types)).catch(err => {\n console.error('Failed to fetch object types', err);\n throw err;\n });\n }\n else {\n console.log('No project selected');\n }\n }\n async reloadTypes() {\n return this._loadTypes().then(() => {\n this.setSession?.(this.clone());\n });\n }\n async fetchAccounts() {\n return this.client.accounts.list().then(accounts => {\n if (!this.authToken) {\n throw new Error('No token available');\n }\n this.authToken.accounts = accounts;\n this.setSession?.(this.clone());\n }).catch(err => {\n console.error('Failed to fetch accounts', err);\n throw err;\n });\n }\n async fetchOnboardingStatus() {\n if (this.onboardingComplete) {\n console.log('Onboarding already completed');\n return false;\n }\n const previousStatus = this.onboardingComplete;\n try {\n const onboarding = await this.client.account.onboardingProgress();\n this.onboardingComplete = Object.values(onboarding).every(value => value === true);\n if (previousStatus !== this.onboardingComplete) {\n return true;\n }\n this.setSession?.(this.clone());\n }\n catch (error) {\n console.error('Error fetching onboarding status:', error);\n this.onboardingComplete = false;\n this.setSession?.(this.clone());\n }\n return false;\n }\n clone() {\n const session = new UserSession(this.client);\n session.isLoading = this.isLoading;\n session.authError = this.authError;\n session.authToken = this.authToken;\n session.setSession = this.setSession;\n session.lastSelectedAccount = this.lastSelectedAccount;\n session.switchAccount = this.switchAccount;\n session.typeRegistry = this.typeRegistry;\n session.onboardingComplete = this.onboardingComplete;\n return session;\n }\n}\nconst UserSessionContext = createContext(undefined);\nexport function useUserSession() {\n const session = useContext(UserSessionContext);\n if (!session) {\n throw new Error('useUserSession must be used within a UserSessionProvider');\n }\n return session;\n}\nexport { UserSession, UserSessionContext };\n//# sourceMappingURL=UserSession.js.map","import { jwtDecode } from \"jwt-decode\";\nimport { Env } from '@vertesia/ui/env';\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY } from '../UserSession';\nimport { getFirebaseAuth, getFirebaseAuthToken } from './firebase';\nlet AUTH_TOKEN_RAW;\nlet AUTH_TOKEN;\nexport async function fetchComposableToken(getIdToken, accountId, projectId, ttl) {\n console.log(`Getting/refreshing composable token for account ${accountId} and project ${projectId} `);\n Env.logger.info('Getting/refreshing composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n },\n });\n const idToken = await getIdToken(); //get from firebase\n if (!idToken) {\n console.log('No id token found - using cookie auth');\n throw new Error('No id token found');\n }\n console.log('Fetching composable token from ' + Env.endpoints.studio);\n Env.logger.info('Fetching composable token from' + Env.endpoints.studio, {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n },\n });\n const url = new URL(Env.endpoints.studio + '/auth/token');\n if (accountId)\n url.searchParams.set('accountId', accountId);\n if (projectId)\n url.searchParams.set('projectId', projectId);\n if (ttl)\n url.searchParams.set('ttl', String(ttl));\n console.log(`Getting composable token for account ${accountId} and project ${projectId}`);\n Env.logger.info('Getting composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n },\n });\n const res = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${idToken}`\n }\n }).catch(err => {\n localStorage.removeItem(LastSelectedAccountId_KEY);\n localStorage.removeItem(LastSelectedProjectId_KEY);\n console.error('Failed to get composable token', err);\n Env.logger.error('Failed to get composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n error: err,\n },\n });\n throw new Error('Failed to get composable token');\n });\n if (idToken && res?.status === 412) {\n console.log(\"412: auth succeeded but user doesn't exist - signup required\", res?.status);\n Env.logger.error(\"412: auth succeeded but user doesn't exist - signup required\", {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n status: res?.status\n },\n });\n const idTokenDecoded = jwtDecode(idToken);\n if (!idTokenDecoded?.email) {\n Env.logger.error('No email found in id token');\n throw new Error('No email found in id token');\n }\n Env.logger.error('User not found', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n email: idTokenDecoded.email\n }\n });\n throw new UserNotFoundError('User not found', idTokenDecoded.email);\n }\n if (!res || !res.ok) {\n console.error('Failed to get composable token', res);\n Env.logger.error('Failed to get composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n status: res?.status,\n },\n });\n throw new Error('Failed to get composable token');\n }\n const { token } = await res.json().catch(err => {\n Env.logger.error('Failed to parse composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n error: err,\n },\n });\n console.error('Failed to parse composable token', err);\n });\n return token;\n}\n/**\n *\n * @param accountId\n * @param projectId\n * @param ttl time to live for the token in seconds\n * @returns\n */\nexport async function fetchComposableTokenFromFirebaseToken(accountId, projectId, ttl) {\n return fetchComposableToken(getFirebaseAuthToken, accountId, projectId, ttl);\n}\nexport async function getComposableToken(accountId, projectId, initToken, forceRefresh = false) {\n const selectedAccount = accountId ?? localStorage.getItem(LastSelectedAccountId_KEY) ?? undefined;\n const selectedProject = projectId ?? localStorage.getItem(LastSelectedProjectId_KEY + '-' + selectedAccount) ?? undefined;\n //token is still valid for more than 5 minutes\n if (!forceRefresh && AUTH_TOKEN_RAW && AUTH_TOKEN && AUTH_TOKEN.exp > (Date.now() / 1000 + 300)) {\n return { rawToken: AUTH_TOKEN_RAW, token: AUTH_TOKEN, error: false };\n }\n //token is close to expire, refresh it\n if (getFirebaseAuth().currentUser) {\n //we have a firebase user, get the token from there\n AUTH_TOKEN_RAW = await fetchComposableTokenFromFirebaseToken(selectedAccount, selectedProject);\n }\n else if (initToken || AUTH_TOKEN_RAW) {\n //we have a token already and no firebase user, refresh it\n AUTH_TOKEN_RAW = await fetchComposableToken(() => Promise.resolve(initToken ?? AUTH_TOKEN_RAW), selectedAccount, selectedProject);\n }\n if (!AUTH_TOKEN_RAW) {\n Env.logger.error('Cannot acquire a composable token', {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n throw new Error('Cannot acquire a composable token');\n }\n AUTH_TOKEN = jwtDecode(AUTH_TOKEN_RAW);\n if (!AUTH_TOKEN || !AUTH_TOKEN.exp || !AUTH_TOKEN_RAW) {\n console.error('Invalid composable token', AUTH_TOKEN);\n Env.logger.error('Invalid composable token', {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n throw new Error('Invalid composable token');\n }\n return { rawToken: AUTH_TOKEN_RAW, token: AUTH_TOKEN, error: false };\n}\nexport class UserNotFoundError extends Error {\n email;\n constructor(message, email) {\n super(message);\n this.name = 'UserNotFoundError';\n this.email = email;\n }\n}\n//# sourceMappingURL=composable.js.map","/**\n * This hook is used to generate and verify state for OAuth2 authorization requests.\n * @returns\n */\nimport { useCallback } from \"react\";\nconst AUTH_STATE_KEY = 'auth_state';\nconst STATE_EXPIRY_KEY = 'auth_state_expiry';\nconst STATE_TTL = 5 * 60 * 1000; // 5 min\nexport function useAuthState() {\n // Generate new state\n const generateState = useCallback(() => {\n const state = crypto.randomUUID();\n const expiryTime = Date.now() + STATE_TTL;\n // Store state and expiry\n sessionStorage.setItem(AUTH_STATE_KEY, state);\n sessionStorage.setItem(STATE_EXPIRY_KEY, expiryTime.toString());\n return state;\n }, []);\n // Verify returned state\n const verifyState = useCallback((returnedState) => {\n if (!returnedState) {\n return 'Missing state';\n }\n const savedState = sessionStorage.getItem(AUTH_STATE_KEY);\n const expiryTime = parseInt(sessionStorage.getItem(STATE_EXPIRY_KEY) || '0');\n let reason;\n // Verify state matches and hasn't expired\n if (savedState !== returnedState) {\n reason = `State mismatched (${savedState} !== ${returnedState})`;\n }\n else if (Date.now() > expiryTime) {\n reason = 'State expired';\n }\n else {\n reason = undefined; // No errors\n }\n // Clear stored state regardless of outcome\n sessionStorage.removeItem(AUTH_STATE_KEY);\n sessionStorage.removeItem(STATE_EXPIRY_KEY);\n return reason;\n }, []);\n // Clear state (useful for cleanup)\n const clearState = useCallback(() => {\n sessionStorage.removeItem(AUTH_STATE_KEY);\n sessionStorage.removeItem(STATE_EXPIRY_KEY);\n }, []);\n return { generateState, verifyState, clearState };\n}\n//# sourceMappingURL=useAuthState.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { onAuthStateChanged } from \"firebase/auth\";\nimport { useEffect, useState } from \"react\";\nimport { UserNotFoundError, getComposableToken } from \"./auth/composable\";\nimport { getFirebaseAuth } from \"./auth/firebase\";\nimport { useAuthState } from \"./auth/useAuthState\";\nimport { Env } from \"@vertesia/ui/env\";\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY, UserSession, UserSessionContext } from \"./UserSession\";\nconst devDomains = [\".composable.sh\", \".vertesia.dev\", \"vertesia.app\"];\nconst CENTRAL_AUTH_REDIRECT = \"https://internal-auth.vertesia.app/\";\nfunction shouldRedirectToCentralAuth() {\n // Authentication is not supported in Docker environment.\n // See https://github.com/vertesia/studio/wiki/Composable-UI-Hosting-Options\n if (Env.isDocker) {\n return true;\n }\n return devDomains.some((domain) => window.location.hostname.endsWith(domain));\n}\nexport function UserSessionProvider({ children }) {\n const hashParams = new URLSearchParams(location.hash.substring(1));\n const token = hashParams.get(\"token\");\n const state = hashParams.get(\"state\");\n const [session, setSession] = useState(new UserSession());\n const { generateState, verifyState } = useAuthState();\n const redirectToCentralAuth = (projectId, accountId) => {\n const url = new URL(CENTRAL_AUTH_REDIRECT);\n const currentUrl = new URL(window.location.href);\n currentUrl.hash = \"\";\n if (projectId)\n currentUrl.searchParams.set(\"p\", projectId);\n if (accountId)\n currentUrl.searchParams.set(\"a\", accountId);\n url.searchParams.set(\"redirect_uri\", currentUrl.toString());\n url.searchParams.set(\"state\", generateState());\n location.replace(url.toString());\n };\n useEffect(() => {\n console.log(\"Auth: starting auth flow\");\n Env.logger.info(\"Starting auth flow\");\n const currentUrl = new URL(window.location.href);\n const selectedAccount = currentUrl.searchParams.get(\"a\") ?? localStorage.getItem(LastSelectedAccountId_KEY) ?? undefined;\n const selectedProject = currentUrl.searchParams.get(\"p\") ??\n localStorage.getItem(LastSelectedProjectId_KEY + \"-\" + selectedAccount) ??\n undefined;\n console.log(\"Auth: selected account\", selectedAccount);\n console.log(\"Auth: selected project\", selectedProject);\n Env.logger.info(\"Selected account and project\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n if (token && state) {\n const validationError = verifyState(state);\n if (validationError) {\n console.error(`Auth: invalid state: ${validationError}`);\n Env.logger.error(`Invalid state: ${validationError}`, {\n vertesia: {\n state: state,\n },\n });\n redirectToCentralAuth();\n }\n getComposableToken(selectedAccount, selectedProject, token)\n .then((res) => {\n session.login(res.rawToken).then(() => {\n setSession(session.clone());\n //cleanup the hash\n window.location.hash = \"\";\n });\n })\n .catch((err) => {\n console.error(\"Failed to fetch user token from studio, redirecting to central auth\", err);\n Env.logger.error(\"Failed to fetch user token from studio, redirecting to central auth\", {\n vertesia: {\n error: err,\n },\n });\n redirectToCentralAuth();\n });\n return;\n }\n else {\n //if on a dev domain and not logged in, redirect to central auth\n if (!session.isLoggedIn()) {\n console.log(\"Auth: not logged in & no token/state\");\n Env.logger.info(\"Not logged in & no token/state\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n if (shouldRedirectToCentralAuth()) {\n console.log(\"Auth: on dev domain, redirecting to central auth with selection\", selectedAccount, selectedProject);\n Env.logger.info(\"Redirecting to central auth with selection\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n redirectToCentralAuth();\n }\n else {\n console.log(\"Auth: not on dev domain\");\n Env.logger.info(\"Not on dev domain\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n }\n }\n }\n return onAuthStateChanged(getFirebaseAuth(), async (firebaseUser) => {\n if (firebaseUser) {\n console.log(\"Auth: successful login with firebase\");\n Env.logger.info(\"Successful login with firebase\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n session.setSession = setSession;\n await getComposableToken(selectedAccount, selectedProject)\n .then((res) => {\n session.login(res.rawToken).then(() => setSession(session.clone()));\n })\n .catch((err) => {\n console.error(\"Failed to fetch user token from studio\", err);\n Env.logger.error(\"Failed to fetch user token from studio\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n error: err,\n },\n });\n if (!(err instanceof UserNotFoundError))\n session.logout();\n session.isLoading = false;\n session.authError = err;\n setSession(session.clone());\n });\n }\n else {\n // anonymous user\n console.log(\"Auth: using anonymous user\");\n Env.logger.info(\"Using anonymous user\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n session.client.withAuthCallback(undefined);\n session.logout();\n setSession(session.clone());\n }\n });\n }, []);\n return _jsx(UserSessionContext.Provider, { value: session, children: children });\n}\n//# sourceMappingURL=UserSessionProvider.js.map","import { Env } from '@vertesia/ui/env';\nimport { logEvent } from \"firebase/analytics\";\nimport { getFirebaseAnalytics } from \"./auth/firebase\";\nexport function useUXTracking() {\n //identify user in monitoring and UX systems\n const tagUserSession = async (user) => {\n const signupData = window.localStorage.getItem(\"composableSignupData\");\n if (!user) {\n console.error('No user found -- skipping tagging');\n return;\n }\n if (signupData) {\n window.localStorage.removeItem(\"composableSignupData\");\n }\n };\n //send event to analytics and UX systems\n const trackEvent = (eventName, eventProperties) => {\n if (!Env.isProd) {\n console.debug('track event', eventName, eventProperties);\n }\n //GA via firebase\n logEvent(getFirebaseAnalytics(), eventName, { ...eventProperties, debug_mode: !Env.isProd });\n };\n return {\n tagUserSession,\n trackEvent\n };\n}\n//# sourceMappingURL=useUXTracking.js.map"],"names":["_firebaseApp","_analytics","_firebaseAuth","getFirebaseApp","initializeApp","Env","firebase","error","console","Error","getFirebaseAnalytics","getAnalytics","getFirebaseAuth","getAuth","async","setFirebaseTenant","tenantEmail","log","retries","retryDelay","response","fetch","method","headers","body","JSON","stringify","signal","AbortSignal","timeout","ok","errorData","json","parseError","status","warn","data","firebaseTenantId","auth","tenantId","providerType","provider","fetchError","Promise","resolve","setTimeout","message","getFirebaseAuthToken","refresh","user","currentUser","getIdToken","then","token","logger","info","vertesia","user_email","email","user_name","displayName","user_id","uid","catch","err","TypeRegistry","types","map","constructor","this","sort","a","b","name","localeCompare","type","id","getType","getTypeLayout","table_layout","undefined","getTypeName","LastSelectedAccountId_KEY","LastSelectedProjectId_KEY","UserSession","isLoading","client","authError","authToken","typeRegistry","setSession","lastSelectedAccount","lastSelectedProject","onboardingComplete","VertesiaClient","serverUrl","endpoints","studio","storeUrl","zeno","logout","bind","store","account","project","accounts","authCallback","rawAuthToken","getComposableToken","res","rawToken","jwtDecode","signOut","getAccount","login","withAuthCallback","localStorage","setItem","onLogin","all","_loadTypes","fetchOnboardingStatus","isLoggedIn","switchAccount","targetAccountId","removeItem","window","location","replace","switchProject","targetProjectId","list","layout","reloadTypes","clone","fetchAccounts","previousStatus","onboarding","onboardingProgress","Object","values","every","value","session","UserSessionContext","createContext","useUserSession","useContext","AUTH_TOKEN_RAW","AUTH_TOKEN","fetchComposableToken","accountId","projectId","ttl","account_id","project_id","idToken","url","URL","searchParams","set","String","Authorization","idTokenDecoded","UserNotFoundError","fetchComposableTokenFromFirebaseToken","initToken","forceRefresh","selectedAccount","getItem","selectedProject","exp","Date","now","super","AUTH_STATE_KEY","STATE_EXPIRY_KEY","devDomains","UserSessionProvider","children","hashParams","URLSearchParams","hash","substring","get","state","useState","generateState","verifyState","useCallback","crypto","randomUUID","expiryTime","sessionStorage","toString","returnedState","savedState","parseInt","reason","clearState","redirectToCentralAuth","currentUrl","href","useEffect","validationError","isDocker","some","domain","hostname","endsWith","onAuthStateChanged","firebaseUser","_jsx","Provider","useUXTracking","tagUserSession","signupData","trackEvent","eventName","eventProperties","isProd","debug","logEvent","debug_mode"],"mappings":"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"}
1
+ {"version":3,"file":"vertesia-ui-session.js","sources":["esm/session/auth/firebase.js","esm/session/TypeRegistry.js","esm/session/UserSession.js","esm/session/auth/composable.js","esm/session/auth/useAuthState.js","esm/session/UserSessionProvider.js","esm/session/useUXTracking.js"],"sourcesContent":["import { Env } from \"@vertesia/ui/env\";\nimport { getAnalytics } from \"firebase/analytics\";\nimport { initializeApp } from \"firebase/app\";\nimport { getAuth } from \"firebase/auth\";\n// Use lazy initialization to avoid accessing Env before it's initialized\nlet _firebaseApp = null;\nlet _analytics = null;\nlet _firebaseAuth = null;\n// Getters that lazily initialize Firebase components when first accessed\nexport function getFirebaseApp() {\n if (!_firebaseApp) {\n try {\n _firebaseApp = initializeApp(Env.firebase);\n }\n catch (error) {\n console.error(\"Failed to initialize Firebase app:\", error);\n throw new Error(\"Firebase initialization failed - environment may not be properly initialized\");\n }\n }\n return _firebaseApp;\n}\nexport function getFirebaseAnalytics() {\n if (!_analytics) {\n _analytics = getAnalytics(getFirebaseApp());\n }\n return _analytics;\n}\nexport function getFirebaseAuth() {\n if (!_firebaseAuth) {\n _firebaseAuth = getAuth(getFirebaseApp());\n }\n return _firebaseAuth;\n}\nexport async function setFirebaseTenant(tenantEmail) {\n if (!tenantEmail) {\n console.log(\"No tenant name or email specified, skipping tenant setup\");\n return;\n }\n try {\n if (tenantEmail)\n console.log(`Resolving tenant ID from email: ${tenantEmail}`);\n // Add retry logic with exponential backoff\n let retries = 3;\n let retryDelay = 250; // Start with 250ms delay\n while (retries > 0) {\n try {\n // Call the API endpoint to resolve the tenant ID\n const response = await fetch(\"/api/resolve-tenant\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n tenantEmail: tenantEmail,\n }),\n // Add timeout to prevent hanging requests\n signal: AbortSignal.timeout(5000),\n });\n // Check for network errors\n if (!response) {\n throw new Error(\"No response received from tenant API\");\n }\n // Handle HTTP error responses\n if (!response.ok) {\n // Try to parse the error response\n try {\n const errorData = await response.json();\n console.error(\"Failed to resolve tenant ID:\", errorData.error);\n }\n catch (parseError) {\n console.error(`Failed to resolve tenant ID: HTTP ${response.status}`);\n }\n // If the error is 404 Not Found, no need to retry\n if (response.status === 404) {\n console.warn(`Tenant not found for ${tenantEmail}`);\n return;\n }\n throw new Error(`HTTP error ${response.status}`);\n }\n // Successfully got a response, parse it\n const data = (await response.json());\n if (data && data.firebaseTenantId) {\n const auth = getFirebaseAuth();\n auth.tenantId = data.firebaseTenantId;\n Env.firebase.providerType = data.provider ?? \"oidc\";\n console.log(`Tenant ID set to ${auth.tenantId}`);\n return data;\n }\n else {\n console.error(`Invalid response format, missing tenantId for ${tenantEmail}`);\n return; // No need to retry for invalid response format\n }\n }\n catch (fetchError) {\n // Only retry for network-related errors\n if (retries > 1) {\n console.warn(`Tenant resolution failed, retrying in ${retryDelay}ms...`, fetchError);\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n retryDelay *= 2; // Exponential backoff\n retries--;\n }\n else {\n throw fetchError; // Last retry failed, propagate error\n }\n }\n }\n }\n catch (error) {\n // Final error handler\n console.error(\"Error setting Firebase tenant:\", error instanceof Error ? error.message : \"Unknown error\");\n // Continue without tenant ID - authentication will work without multi-tenancy\n // but the user will access the default tenant\n }\n}\nexport async function getFirebaseAuthToken(refresh) {\n const auth = getFirebaseAuth();\n const user = auth.currentUser;\n if (user) {\n return user\n .getIdToken(refresh)\n .then((token) => {\n Env.logger.info(\"Got Firebase token\", {\n vertesia: {\n user_email: user.email,\n user_name: user.displayName,\n user_id: user.uid,\n refresh: refresh,\n },\n });\n return token;\n })\n .catch((err) => {\n Env.logger.error(\"Failed to get Firebase token\", {\n vertesia: {\n user_email: user.email,\n user_name: user.displayName,\n user_id: user.uid,\n refresh: refresh,\n error: err,\n },\n });\n console.error(\"Failed to get access token\", err);\n return null;\n });\n }\n else {\n Env.logger.warn(\"No user found\");\n return Promise.resolve(null);\n }\n}\n//# sourceMappingURL=firebase.js.map","export class TypeRegistry {\n types;\n map = {};\n constructor(types) {\n this.types = types;\n //sort types\n types.sort((a, b) => a.name.localeCompare(b.name));\n for (const type of types) {\n this.map[type.id] = type;\n }\n }\n getType(id) {\n return this.map[id];\n }\n getTypeLayout(id) {\n const type = this.map[id];\n return type ? type.table_layout : undefined;\n }\n getTypeName(id) {\n const type = this.map[id];\n return type ? type.name : undefined;\n }\n}\n//# sourceMappingURL=TypeRegistry.js.map","import { jwtDecode } from 'jwt-decode';\nimport { createContext, useContext } from 'react';\nimport { VertesiaClient } from '@vertesia/client';\nimport { Env } from '@vertesia/ui/env';\nimport { getComposableToken } from './auth/composable';\nimport { getFirebaseAuth } from './auth/firebase';\nimport { TypeRegistry } from './TypeRegistry';\nexport const LastSelectedAccountId_KEY = 'composableai.lastSelectedAccountId';\nexport const LastSelectedProjectId_KEY = 'composableai.lastSelectedProjectId';\nclass UserSession {\n isLoading = true;\n client;\n authError;\n authToken;\n typeRegistry;\n setSession;\n lastSelectedAccount;\n lastSelectedProject;\n onboardingComplete;\n constructor(client, setSession) {\n if (client) {\n this.client = client;\n }\n else {\n this.client = new VertesiaClient({\n serverUrl: Env.endpoints.studio,\n storeUrl: Env.endpoints.zeno,\n });\n }\n if (setSession) {\n this.setSession = setSession;\n }\n this.logout = this.logout.bind(this);\n }\n get store() {\n return this.client.store;\n }\n get user() {\n return this.authToken;\n }\n get account() {\n return this.authToken?.account;\n }\n get project() {\n return this.authToken?.project;\n }\n get accounts() {\n return this.authToken?.accounts;\n }\n get authCallback() {\n return this.rawAuthToken.then(token => `Bearer ${token}`);\n }\n get rawAuthToken() {\n return getComposableToken().then(res => {\n const token = res?.rawToken;\n if (!token) {\n throw new Error('No token available');\n }\n this.authToken = jwtDecode(token);\n return token;\n });\n }\n signOut() {\n this.logout();\n }\n getAccount() {\n return this.authToken?.account;\n }\n async login(token) {\n this.authError = undefined;\n this.isLoading = false;\n this.client.withAuthCallback(() => this.authCallback);\n this.authToken = jwtDecode(token);\n console.log(`Logging in as ${this.authToken?.name} with account ${this.authToken?.account.name} (${this.authToken?.account.id}, and project ${this.authToken?.project?.name} (${this.authToken?.project?.id})`);\n //store selected account in local storage\n localStorage.setItem(LastSelectedAccountId_KEY, this.authToken.account.id);\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.authToken.account.id, this.authToken.project?.id ?? '');\n // notify the host app of the login\n Env.onLogin?.(this.authToken);\n // Independent async calls\n await Promise.all([\n this._loadTypes(),\n this.fetchOnboardingStatus(),\n ]);\n return Promise.resolve();\n }\n isLoggedIn() {\n return !!this.authToken;\n }\n logout() {\n console.log('Logging out');\n if (this.authToken) {\n getFirebaseAuth().signOut();\n }\n this.authError = undefined;\n this.isLoading = false;\n this.authToken = undefined;\n this.typeRegistry = undefined;\n this.setSession = undefined;\n this.client.withAuthCallback(undefined);\n }\n async switchAccount(targetAccountId) {\n localStorage.setItem(LastSelectedAccountId_KEY, targetAccountId);\n if (this) {\n if (this.account && this.project) {\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.account.id, this.project.id);\n }\n else if (this.account) {\n localStorage.removeItem(LastSelectedProjectId_KEY + '-' + this.account.id);\n }\n }\n window.location.replace('/?a=' + targetAccountId);\n }\n async switchProject(targetProjectId) {\n if (this.account) {\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.account.id, targetProjectId);\n }\n window.location.replace('/?a=' + this.account?.id + '&p=' + targetProjectId);\n }\n async _loadTypes() {\n if (this.project) {\n return this.store.types.list({}, { layout: true }).then(types => this.typeRegistry = new TypeRegistry(types)).catch(err => {\n console.error('Failed to fetch object types', err);\n throw err;\n });\n }\n else {\n console.log('No project selected');\n }\n }\n async reloadTypes() {\n return this._loadTypes().then(() => {\n this.setSession?.(this.clone());\n });\n }\n async fetchAccounts() {\n return this.client.accounts.list().then(accounts => {\n if (!this.authToken) {\n throw new Error('No token available');\n }\n this.authToken.accounts = accounts;\n this.setSession?.(this.clone());\n }).catch(err => {\n console.error('Failed to fetch accounts', err);\n throw err;\n });\n }\n async fetchOnboardingStatus() {\n if (this.onboardingComplete) {\n console.log('Onboarding already completed');\n return false;\n }\n const previousStatus = this.onboardingComplete;\n try {\n const onboarding = await this.client.account.onboardingProgress();\n this.onboardingComplete = Object.values(onboarding).every(value => value === true);\n if (previousStatus !== this.onboardingComplete) {\n return true;\n }\n this.setSession?.(this.clone());\n }\n catch (error) {\n console.error('Error fetching onboarding status:', error);\n this.onboardingComplete = false;\n this.setSession?.(this.clone());\n }\n return false;\n }\n clone() {\n const session = new UserSession(this.client);\n session.isLoading = this.isLoading;\n session.authError = this.authError;\n session.authToken = this.authToken;\n session.setSession = this.setSession;\n session.lastSelectedAccount = this.lastSelectedAccount;\n session.switchAccount = this.switchAccount;\n session.typeRegistry = this.typeRegistry;\n session.onboardingComplete = this.onboardingComplete;\n return session;\n }\n}\nconst UserSessionContext = createContext(undefined);\nexport function useUserSession() {\n const session = useContext(UserSessionContext);\n if (!session) {\n throw new Error('useUserSession must be used within a UserSessionProvider');\n }\n return session;\n}\nexport { UserSession, UserSessionContext };\n//# sourceMappingURL=UserSession.js.map","import { jwtDecode } from \"jwt-decode\";\nimport { Env } from '@vertesia/ui/env';\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY } from '../UserSession';\nimport { getFirebaseAuth, getFirebaseAuthToken } from './firebase';\nlet AUTH_TOKEN_RAW;\nlet AUTH_TOKEN;\nexport async function fetchComposableToken(getIdToken, accountId, projectId, ttl) {\n console.log(`Getting/refreshing composable token for account ${accountId} and project ${projectId} `);\n Env.logger.info('Getting/refreshing composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n },\n });\n const idToken = await getIdToken(); //get from firebase\n if (!idToken) {\n console.log('No id token found - using cookie auth');\n throw new Error('No id token found');\n }\n console.log('Fetching composable token from ' + Env.endpoints.studio);\n Env.logger.info('Fetching composable token from' + Env.endpoints.studio, {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n },\n });\n const url = new URL(Env.endpoints.studio + '/auth/token');\n if (accountId)\n url.searchParams.set('accountId', accountId);\n if (projectId)\n url.searchParams.set('projectId', projectId);\n if (ttl)\n url.searchParams.set('ttl', String(ttl));\n console.log(`Getting composable token for account ${accountId} and project ${projectId}`);\n Env.logger.info('Getting composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n },\n });\n const res = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${idToken}`\n }\n }).catch(err => {\n localStorage.removeItem(LastSelectedAccountId_KEY);\n localStorage.removeItem(LastSelectedProjectId_KEY);\n console.error('Failed to get composable token', err);\n Env.logger.error('Failed to get composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n error: err,\n },\n });\n throw new Error('Failed to get composable token');\n });\n if (idToken && res?.status === 412) {\n console.log(\"412: auth succeeded but user doesn't exist - signup required\", res?.status);\n Env.logger.error(\"412: auth succeeded but user doesn't exist - signup required\", {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n status: res?.status\n },\n });\n const idTokenDecoded = jwtDecode(idToken);\n if (!idTokenDecoded?.email) {\n Env.logger.error('No email found in id token');\n throw new Error('No email found in id token');\n }\n Env.logger.error('User not found', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n email: idTokenDecoded.email\n }\n });\n throw new UserNotFoundError('User not found', idTokenDecoded.email);\n }\n if (!res || !res.ok) {\n console.error('Failed to get composable token', res);\n Env.logger.error('Failed to get composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n status: res?.status,\n },\n });\n throw new Error('Failed to get composable token');\n }\n const { token } = await res.json().catch(err => {\n Env.logger.error('Failed to parse composable token', {\n vertesia: {\n account_id: accountId,\n project_id: projectId,\n error: err,\n },\n });\n console.error('Failed to parse composable token', err);\n });\n return token;\n}\n/**\n *\n * @param accountId\n * @param projectId\n * @param ttl time to live for the token in seconds\n * @returns\n */\nexport async function fetchComposableTokenFromFirebaseToken(accountId, projectId, ttl) {\n return fetchComposableToken(getFirebaseAuthToken, accountId, projectId, ttl);\n}\nexport async function getComposableToken(accountId, projectId, initToken, forceRefresh = false) {\n const selectedAccount = accountId ?? localStorage.getItem(LastSelectedAccountId_KEY) ?? undefined;\n const selectedProject = projectId ?? localStorage.getItem(LastSelectedProjectId_KEY + '-' + selectedAccount) ?? undefined;\n //token is still valid for more than 5 minutes\n if (!forceRefresh && AUTH_TOKEN_RAW && AUTH_TOKEN && AUTH_TOKEN.exp > (Date.now() / 1000 + 300)) {\n return { rawToken: AUTH_TOKEN_RAW, token: AUTH_TOKEN, error: false };\n }\n //token is close to expire, refresh it\n if (getFirebaseAuth().currentUser) {\n //we have a firebase user, get the token from there\n AUTH_TOKEN_RAW = await fetchComposableTokenFromFirebaseToken(selectedAccount, selectedProject);\n }\n else if (initToken || AUTH_TOKEN_RAW) {\n //we have a token already and no firebase user, refresh it\n AUTH_TOKEN_RAW = await fetchComposableToken(() => Promise.resolve(initToken ?? AUTH_TOKEN_RAW), selectedAccount, selectedProject);\n }\n if (!AUTH_TOKEN_RAW) {\n Env.logger.error('Cannot acquire a composable token', {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n throw new Error('Cannot acquire a composable token');\n }\n AUTH_TOKEN = jwtDecode(AUTH_TOKEN_RAW);\n if (!AUTH_TOKEN || !AUTH_TOKEN.exp || !AUTH_TOKEN_RAW) {\n console.error('Invalid composable token', AUTH_TOKEN);\n Env.logger.error('Invalid composable token', {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n throw new Error('Invalid composable token');\n }\n return { rawToken: AUTH_TOKEN_RAW, token: AUTH_TOKEN, error: false };\n}\nexport class UserNotFoundError extends Error {\n email;\n constructor(message, email) {\n super(message);\n this.name = 'UserNotFoundError';\n this.email = email;\n }\n}\n//# sourceMappingURL=composable.js.map","/**\n * This hook is used to generate and verify state for OAuth2 authorization requests.\n * @returns\n */\nimport { useCallback } from \"react\";\nconst AUTH_STATE_KEY = 'auth_state';\nconst STATE_EXPIRY_KEY = 'auth_state_expiry';\nconst STATE_TTL = 5 * 60 * 1000; // 5 min\nexport function useAuthState() {\n // Generate new state\n const generateState = useCallback(() => {\n const state = crypto.randomUUID();\n const expiryTime = Date.now() + STATE_TTL;\n // Store state and expiry\n sessionStorage.setItem(AUTH_STATE_KEY, state);\n sessionStorage.setItem(STATE_EXPIRY_KEY, expiryTime.toString());\n return state;\n }, []);\n // Verify returned state\n const verifyState = useCallback((returnedState) => {\n if (!returnedState) {\n return 'Missing state';\n }\n const savedState = sessionStorage.getItem(AUTH_STATE_KEY);\n const expiryTime = parseInt(sessionStorage.getItem(STATE_EXPIRY_KEY) || '0');\n let reason;\n // Verify state matches and hasn't expired\n if (savedState !== returnedState) {\n reason = `State mismatched (${savedState} !== ${returnedState})`;\n }\n else if (Date.now() > expiryTime) {\n reason = 'State expired';\n }\n else {\n reason = undefined; // No errors\n }\n // Clear stored state regardless of outcome\n sessionStorage.removeItem(AUTH_STATE_KEY);\n sessionStorage.removeItem(STATE_EXPIRY_KEY);\n return reason;\n }, []);\n // Clear state (useful for cleanup)\n const clearState = useCallback(() => {\n sessionStorage.removeItem(AUTH_STATE_KEY);\n sessionStorage.removeItem(STATE_EXPIRY_KEY);\n }, []);\n return { generateState, verifyState, clearState };\n}\n//# sourceMappingURL=useAuthState.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { onAuthStateChanged } from \"firebase/auth\";\nimport { useEffect, useState } from \"react\";\nimport { UserNotFoundError, getComposableToken } from \"./auth/composable\";\nimport { getFirebaseAuth } from \"./auth/firebase\";\nimport { useAuthState } from \"./auth/useAuthState\";\nimport { Env } from \"@vertesia/ui/env\";\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY, UserSession, UserSessionContext } from \"./UserSession\";\nconst devDomains = [\".composable.sh\", \".vertesia.dev\", \"vertesia.app\"];\nconst CENTRAL_AUTH_REDIRECT = \"https://internal-auth.vertesia.app/\";\nfunction shouldRedirectToCentralAuth() {\n // Authentication is not supported in Docker environment.\n // See https://github.com/vertesia/studio/wiki/Composable-UI-Hosting-Options\n if (Env.isDocker) {\n return true;\n }\n return devDomains.some((domain) => window.location.hostname.endsWith(domain));\n}\nexport function UserSessionProvider({ children }) {\n const hashParams = new URLSearchParams(location.hash.substring(1));\n const token = hashParams.get(\"token\");\n const state = hashParams.get(\"state\");\n const [session, setSession] = useState(new UserSession());\n const { generateState, verifyState } = useAuthState();\n const redirectToCentralAuth = (projectId, accountId) => {\n const url = new URL(CENTRAL_AUTH_REDIRECT);\n const currentUrl = new URL(window.location.href);\n currentUrl.hash = \"\";\n if (projectId)\n currentUrl.searchParams.set(\"p\", projectId);\n if (accountId)\n currentUrl.searchParams.set(\"a\", accountId);\n url.searchParams.set(\"redirect_uri\", currentUrl.toString());\n url.searchParams.set(\"state\", generateState());\n location.replace(url.toString());\n };\n useEffect(() => {\n console.log(\"Auth: starting auth flow\");\n Env.logger.info(\"Starting auth flow\");\n const currentUrl = new URL(window.location.href);\n const selectedAccount = currentUrl.searchParams.get(\"a\") ?? localStorage.getItem(LastSelectedAccountId_KEY) ?? undefined;\n const selectedProject = currentUrl.searchParams.get(\"p\") ??\n localStorage.getItem(LastSelectedProjectId_KEY + \"-\" + selectedAccount) ??\n undefined;\n console.log(\"Auth: selected account\", selectedAccount);\n console.log(\"Auth: selected project\", selectedProject);\n Env.logger.info(\"Selected account and project\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n if (token && state) {\n const validationError = verifyState(state);\n if (validationError) {\n console.error(`Auth: invalid state: ${validationError}`);\n Env.logger.error(`Invalid state: ${validationError}`, {\n vertesia: {\n state: state,\n },\n });\n redirectToCentralAuth();\n }\n getComposableToken(selectedAccount, selectedProject, token)\n .then((res) => {\n session.login(res.rawToken).then(() => {\n setSession(session.clone());\n //cleanup the hash\n window.location.hash = \"\";\n });\n })\n .catch((err) => {\n console.error(\"Failed to fetch user token from studio, redirecting to central auth\", err);\n Env.logger.error(\"Failed to fetch user token from studio, redirecting to central auth\", {\n vertesia: {\n error: err,\n },\n });\n redirectToCentralAuth();\n });\n return;\n }\n else {\n //if on a dev domain and not logged in, redirect to central auth\n if (!session.isLoggedIn()) {\n console.log(\"Auth: not logged in & no token/state\");\n Env.logger.info(\"Not logged in & no token/state\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n if (shouldRedirectToCentralAuth()) {\n console.log(\"Auth: on dev domain, redirecting to central auth with selection\", selectedAccount, selectedProject);\n Env.logger.info(\"Redirecting to central auth with selection\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n redirectToCentralAuth();\n }\n else {\n console.log(\"Auth: not on dev domain\");\n Env.logger.info(\"Not on dev domain\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n }\n }\n }\n return onAuthStateChanged(getFirebaseAuth(), async (firebaseUser) => {\n if (firebaseUser) {\n console.log(\"Auth: successful login with firebase\");\n Env.logger.info(\"Successful login with firebase\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n session.setSession = setSession;\n await getComposableToken(selectedAccount, selectedProject)\n .then((res) => {\n session.login(res.rawToken).then(() => setSession(session.clone()));\n })\n .catch((err) => {\n console.error(\"Failed to fetch user token from studio\", err);\n Env.logger.error(\"Failed to fetch user token from studio\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n error: err,\n },\n });\n if (!(err instanceof UserNotFoundError))\n session.logout();\n session.isLoading = false;\n session.authError = err;\n setSession(session.clone());\n });\n }\n else {\n // anonymous user\n console.log(\"Auth: using anonymous user\");\n Env.logger.info(\"Using anonymous user\", {\n vertesia: {\n account_id: selectedAccount,\n project_id: selectedProject,\n },\n });\n session.client.withAuthCallback(undefined);\n session.logout();\n setSession(session.clone());\n }\n });\n }, []);\n return _jsx(UserSessionContext.Provider, { value: session, children: children });\n}\n//# sourceMappingURL=UserSessionProvider.js.map","import { Env } from '@vertesia/ui/env';\nimport { logEvent } from \"firebase/analytics\";\nimport { getFirebaseAnalytics } from \"./auth/firebase\";\nexport function useUXTracking() {\n //identify user in monitoring and UX systems\n const tagUserSession = async (user) => {\n const signupData = window.localStorage.getItem(\"composableSignupData\");\n if (!user) {\n console.error('No user found -- skipping tagging');\n return;\n }\n if (signupData) {\n window.localStorage.removeItem(\"composableSignupData\");\n }\n };\n //send event to analytics and UX systems\n const trackEvent = (eventName, eventProperties) => {\n if (!Env.isProd) {\n console.debug('track event', eventName, eventProperties);\n }\n //GA via firebase\n logEvent(getFirebaseAnalytics(), eventName, { ...eventProperties, debug_mode: !Env.isProd });\n };\n return {\n tagUserSession,\n trackEvent\n };\n}\n//# sourceMappingURL=useUXTracking.js.map"],"names":["_firebaseApp","_analytics","_firebaseAuth","getFirebaseApp","initializeApp","Env","firebase","error","console","Error","getFirebaseAnalytics","getAnalytics","getFirebaseAuth","getAuth","async","setFirebaseTenant","tenantEmail","log","retries","retryDelay","response","fetch","method","headers","body","JSON","stringify","signal","AbortSignal","timeout","ok","errorData","json","parseError","status","warn","data","firebaseTenantId","auth","tenantId","providerType","provider","fetchError","Promise","resolve","setTimeout","message","getFirebaseAuthToken","refresh","user","currentUser","getIdToken","then","token","logger","info","vertesia","user_email","email","user_name","displayName","user_id","uid","catch","err","TypeRegistry","types","map","constructor","this","sort","a","b","name","localeCompare","type","id","getType","getTypeLayout","table_layout","undefined","getTypeName","LastSelectedAccountId_KEY","LastSelectedProjectId_KEY","UserSession","isLoading","client","authError","authToken","typeRegistry","setSession","lastSelectedAccount","lastSelectedProject","onboardingComplete","VertesiaClient","serverUrl","endpoints","studio","storeUrl","zeno","logout","bind","store","account","project","accounts","authCallback","rawAuthToken","getComposableToken","res","rawToken","jwtDecode","signOut","getAccount","login","withAuthCallback","localStorage","setItem","onLogin","all","_loadTypes","fetchOnboardingStatus","isLoggedIn","switchAccount","targetAccountId","removeItem","window","location","replace","switchProject","targetProjectId","list","layout","reloadTypes","clone","fetchAccounts","previousStatus","onboarding","onboardingProgress","Object","values","every","value","session","UserSessionContext","createContext","useUserSession","useContext","AUTH_TOKEN_RAW","AUTH_TOKEN","fetchComposableToken","accountId","projectId","ttl","account_id","project_id","idToken","url","URL","searchParams","set","String","Authorization","idTokenDecoded","UserNotFoundError","fetchComposableTokenFromFirebaseToken","initToken","forceRefresh","selectedAccount","getItem","selectedProject","exp","Date","now","super","AUTH_STATE_KEY","STATE_EXPIRY_KEY","devDomains","UserSessionProvider","children","hashParams","URLSearchParams","hash","substring","get","state","useState","generateState","verifyState","useCallback","crypto","randomUUID","expiryTime","sessionStorage","toString","returnedState","savedState","parseInt","reason","clearState","redirectToCentralAuth","currentUrl","href","useEffect","validationError","isDocker","some","domain","hostname","endsWith","onAuthStateChanged","firebaseUser","_jsx","Provider","useUXTracking","tagUserSession","signupData","trackEvent","eventName","eventProperties","isProd","debug","logEvent","debug_mode"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{isNil as n,omit as s,isEqual as i}from"lodash-es";import a,{createContext as o,useContext as l,useMemo as c,useState as h,useEffect as u,useRef as d}from"react";import{XMLParser as p,XMLValidator as m}from"fast-xml-parser";import{ObjectWalker as y}from"@vertesia/json";import{DotBadge as g,useSafeLayoutEffect as v,useToast as f,VModal as b,VModalTitle as x,VModalBody as w,VModalFooter as C,Button as N,Styles as k,VSelectBox as j,ModalBody as S,ModalFooter as O,useFlag as A,useClickOutside as P}from"@vertesia/ui/core";import $ from"clsx";import I from"ajv";import{json as q}from"@codemirror/lang-json";import E from"debounce";import{EditorView as T}from"@codemirror/view";import{Text as M,EditorState as V}from"@codemirror/state";import{basicSetup as L}from"codemirror";import{AlignLeft as F,Trash2 as R,Pencil as _,Plus as D,ChevronDown as z,ChevronRight as K}from"lucide-react";const U="#text",B="#comment",W="#cdata",H="DECLARATION_TAG",J={tagColor:"#d43900",textColor:"#333",attributeKeyColor:"#2a7ab0",attributeValueColor:"#008000",separatorColor:"#333",commentColor:"#aaa",cdataColor:"#1d781d",fontFamily:"monospace"},X=o({theme:J,collapsible:!1,indentSize:2}),Z=()=>l(X),G=new p({preserveOrder:!0,ignoreAttributes:!1,attributeNamePrefix:"",allowBooleanAttributes:!0,commentPropName:B,cdataPropName:W,parseTagValue:!1});function Y(r){const{indentation:n,children:s,isInline:i}=r,{theme:a}=Z();return e("div",{style:{color:a.cdataColor},children:[t("span",{children:`${n}<![CDATA[`}),s,t("span",{children:`${i?"":n}]]>`})]})}function Q(e){const{collapsible:r,theme:n}=Z(),{collapsed:s}=e;return r?t("span",{style:{position:"relative"},children:t("span",{style:{position:"absolute",right:"0",border:0,padding:0,background:"none"},children:t(ee,{fill:n.separatorColor,style:{transform:`rotate(${s?0:90}deg)`,transition:"transform 0.2s"}})})}):null}function ee({...e}){return t("svg",{width:"16px",height:"16px",viewBox:"0 0 24 24",...e,children:t("path",{d:"M9 17.898C9 18.972 10.2649 19.546 11.0731 18.8388L17.3838 13.3169C18.1806 12.6197 18.1806 11.3801 17.3838 10.6829L11.0731 5.16108C10.2649 4.45388 9 5.02785 9 6.1018V17.898Z"})})}function te(e){const{collapsible:t,initialCollapsedDepth:r}=Z(),[s,i]=h((()=>!(n(r)||!t)&&e>=r));return u((()=>{i(!(n(r)||!t)&&e>=r)}),[r,e,t]),{collapsed:s,buttonProps:t?{onClick:()=>i((e=>!e)),role:"button",style:{cursor:"pointer"}}:{}}}function re(r){const{indentation:n,children:s,isInline:i,level:a}=r,{theme:o}=Z(),{collapsed:l,buttonProps:c}=te(a);return e("div",{style:{color:o.commentColor},children:[e("span",{...c,children:[t("span",{children:n}),t(Q,{collapsed:l}),t("span",{children:"\x3c!-- "})]}),!l&&s,l&&"...",t("span",{children:`${i||l?" ":n}--\x3e`})]})}function ne(r){const{attributes:n}=r,{theme:s}=Z();return n?t("span",{children:Object.entries(n).map((([r,n])=>e("span",{children:[t("span",{style:{color:s.attributeKeyColor},children:` ${r}`}),t("span",{style:{color:s.separatorColor},children:"="}),t("span",{style:{color:s.attributeValueColor},children:`"${n}"`})]},`attribute-${r}`)))}):null}function se(r){const{indentation:n,tagKey:s,attributes:i}=r,{theme:a}=Z();return e("div",{children:[t("span",{style:{color:a.separatorColor},children:`${n}<?`}),t("span",{style:{color:a.tagColor},children:`${s.slice(1)}`}),t(ne,{attributes:i}),t("span",{style:{color:a.separatorColor},children:"?>"})]})}function ie(e){return"string"==typeof e&&e.includes("\n")}function ae(e){const t=e[":@"],r=s(e,":@"),[[n,i]]=Object.entries(r),a=function(e){switch(e){case U:case W:case B:return e;default:return e.startsWith("?")?H:"TAG"}}(n);return{attributes:t,tagKey:n,subElements:i,type:a}}function oe(e){return!!e&&Object.keys(e).length>0}function le(n){const{indentation:s,tagKey:i,attributes:a,children:o,isInline:l,hasChildren:c,level:h}=n,{collapsed:u,buttonProps:d}=te(h),{theme:p}=Z();return e("div",{children:[e("span",{...d,children:[t("span",{children:s}),t(Q,{collapsed:u}),t("span",{style:{color:p.separatorColor},children:"<"}),t("span",{style:{color:p.tagColor},children:`${i}`}),!u&&t(ne,{attributes:a}),u&&oe(a)&&" ...",t("span",{style:{color:p.separatorColor},children:c?">":" />"})]}),c&&e(r,{children:[!u&&o,u&&"...",t("span",{style:{color:p.separatorColor},children:`${l||u?"":s}</`}),t("span",{style:{color:p.tagColor},children:`${i}`}),t("span",{style:{color:p.separatorColor},children:">"})]})]})}function ce(e){const{hasSiblings:r,text:n,indentation:s,isText:i}=e,{theme:a}=Z(),o=i?{color:a.textColor}:void 0;return ie(n)||r?t("div",{style:o,children:n.split("\n").filter((e=>!!e.trim())).map(((e,r)=>t("div",{children:`${s}${e.trim()}`},`${r}`)))}):t("span",{style:o,children:n})}function he(e){const{elements:n,level:s=0,isText:i=!0}=e,{indentSize:a}=Z();return Array.isArray(n)&&0!==n.length?t(r,{children:n.map(((e,r)=>{const{tagKey:o,attributes:l,subElements:c,type:h}=ae(e),u=n.length>1,d=function(e,t){return new Array(t*e+1).join(" ")}(a,s),p=`${s}-${r}`,m=function(e){return"string"!=typeof e&&1===e.length&&U in e[0]&&!ie(e[0][U])}(c);switch(h){case U:return t(ce,{text:c,indentation:d,hasSiblings:u,isText:i},p);case B:return t(re,{isInline:m,indentation:d,level:s,children:t(he,{elements:c,level:s+1,isText:!1})},p);case W:return t(Y,{indentation:d,isInline:m,children:t(he,{elements:c,level:s+1,isText:!1})},p);case H:return t(se,{indentation:d,tagKey:o,attributes:l},p);default:return t(le,{indentation:d,tagKey:o,attributes:l,isInline:m,hasChildren:c.length>0,level:s,children:t(he,{elements:c,level:s+1})},p)}}))}):null}function ue(){return t("div",{children:"Invalid XML!"})}function de(e){const{theme:r,xml:n,collapsible:s=!1,indentSize:a=2,invalidXml:o,initalCollapsedDepth:l,initialCollapsedDepth:d}=e,[p,y]=h((()=>({...J,...r}))),{json:g,valid:v}=function(e){return c((()=>{try{if(!m.validate(e))throw new Error("Invalid XML!");const t=G.parse(e);if("string"==typeof e&&e.trim().length>0&&0===t.length)throw new Error("Invalid XML!");return{json:t,valid:!0}}catch(e){return{json:null,valid:!1,errorMessage:`Fail to parse: ${e.message}`}}}),[e])}(n),f=c((()=>({theme:p,collapsible:s,indentSize:a,initialCollapsedDepth:d??l})),[p,s,a,l,d]);return u((()=>{y((e=>{const t={...J,...r};return i(t,e)?e:t}))}),[r]),v?t(X.Provider,{value:f,children:t("div",{className:"rxv-container",style:{whiteSpace:"pre-wrap",fontFamily:p.fontFamily,overflowWrap:"break-word"},children:t(he,{elements:g})})}):o||t(ue,{})}const pe="text-pink-500 dark:text-pink-400",me="text-purple-500 dark:text-purple-400",ye="text-blue-500 dark:text-blue-400",ge={code:"bg-gray-100 dark:bg-slate-800 whitespace-pre-wrap p-4 rounded-lg font-mono",comma:pe,assign:pe,startObject:pe,endObject:pe,startArray:pe,endArray:pe,boolean:me,null:me,key:ye,index:ye,string:"text-orange-500 dark:text-orange-400",number:"text-green-500 dark:text-green-400"};class ve{renderer;parent;key;indent;result=[];constructor(e,t,r,n){this.renderer=e,this.parent=t,this.key=r,this.indent=n}get classMap(){return this.renderer.classMap}writeKey(e){const t=typeof e;"string"===t?(this.result.length>0&&this.result.push(`<span class='${this.classMap.comma}'>,\n</span>`),this.indent&&this.result.push(this.indent),this.result.push(`<span class="${this.classMap.key}">"${e}"</span><span class='${this.classMap.assign}'>: </span>`)):"number"===t&&(this.result.length>0&&this.result.push(`<span class='${this.classMap.comma}'>,\n</span>`),this.indent&&this.result.push(this.indent))}pushValue(e,t){if(this.writeKey(e),null===t)this.result.push(`<span class='${this.classMap.null}'>null</span>`);else if(t instanceof ve)this.result.push(t.renderStart()+t.renderValue()+t.renderEnd());else{let e;const r=typeof t;"string"===r?(t=(t=`"${t}"`).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),e=this.classMap.string):"number"===r?e=this.classMap.number:"boolean"===r&&(e=this.classMap.boolean),this.result.push(`<span class='${e}'>${t}</span>`)}}renderValue(){return this.result.join("")}}class fe extends ve{constructor(e,t,r,n){super(e,t,r,n)}renderStart(){return`<span class='${this.classMap.startObject}'>{\n</span>`}renderEnd(){const e=this.result.length>0?"\n":"";return`<span class='${this.classMap.endObject}'>${e}${this.parent?.indent||""}}</span>`}}class be extends ve{constructor(e,t,r,n){super(e,t,r,n)}renderStart(){return`<span class='${this.classMap.startArray}'>[\n</span>`}renderEnd(){const e=this.result.length>0?"\n":"";return`<span class='${this.classMap.endArray}'>${e}${this.parent?.indent||""}]</span>`}}class xe{classMap;tab;stack=[];block=new fe(this,void 0,"","");constructor(e=ge,t=" "){this.classMap=e,this.tab=t}onStartObject(e){const t=new fe(this,this.block,e,this.block.indent+this.tab);this.stack.push(this.block),this.block=t}onEndObject(){const e=this.block;this.block=this.stack.pop(),this.block.pushValue(e.key,e)}onStartIteration(e){const t=new be(this,this.block,e,this.block.indent+this.tab);this.stack.push(this.block),this.block=t}onEndIteration(){const e=this.block;this.block=this.stack.pop(),this.block.pushValue(e.key,e)}onValue(e,t){this.block.pushValue(e,t)}}function we({data:e,className:r,classMap:n}){const[s,i]=h();return u((()=>{i(function(e,r,n){const s=new xe(r);(new y).walk(e,s);const i=s.block.renderValue();return t("div",{className:n,dangerouslySetInnerHTML:{__html:`<div class='${s.classMap.code}' style='overflow-x: scroll'>${i}</div>`}})}(e,n,r))}),[e]),s}class Ce{schema;properties={};validator;constructor(e){this.schema=e||{type:"object",properties:{}},this.validator=new I({strict:!1}).compile(this.schema),this.load()}load(){if(this.schema.properties){const e=this.schema.properties;Object.keys(e).forEach((t=>{this.loadProperty(t,e[t])}))}}hasProperties(){return Object.keys(this.properties).length>0}get title(){return this.schema.title||this.schema.name}get description(){return this.schema.description}loadProperty(e,t){let r;return r="array"===t.type?new ke(this,e,t):new Ne(this,e,t),this.properties[e]=r,r}get type(){return this.schema.type}validate(e){return!!this.validator(e)||(this.validator.errors||[])}addProperty(e,t,r=!1){"object"!==this.schema.type&&(this.schema.type="object"),this.schema.properties||(this.schema.properties={});const n="string"==typeof t?"object"===(s=t)?{type:"object",properties:{}}:"array"===s?{type:"array",items:{type:"any"}}:{type:s}:t;var s;const i=this.loadProperty(e,n);return this.schema.properties[i.name]=i.schema,r&&(i.isRequired=!0),i}removeProperty(e){this.schema.properties&&(delete this.schema.properties[e],Array.isArray(this.schema.required)&&(this.schema.required=this.schema.required.filter((t=>t!==e)))),delete this.properties[e]}getProperty(e){return this.properties[e]}get editor(){return this.schema.editor}}class Ne extends Ce{parent;name;constructor(e,t,r){if(super(r),this.parent=e,this.name=t,"array"===r.type)throw new Error("Array property must be instantiated using ArrayPropertySchema");"object"!==r.type||r.properties||(r.properties={})}get isMulti(){return!1}get isReadOnly(){return!!this.schema.readOnly}set isReadOnly(e){this.schema.readOnly=e}get defaultValue(){return this.schema.default}set defaultValue(e){this.schema.default=e}get enum(){return this.schema.enum}set enum(e){this.schema.enum=e}get isRequired(){const e=this.parent.schema.required;return!!e&&e.includes(this.name)}set isRequired(e){let t=Array.isArray(this.parent.schema.required)?this.parent.schema.required:[];t=e?t.concat(this.name):t.filter((e=>e!==this.name)),this.parent.schema.required=t}get type(){return this.schema.type}set type(e){this.schema.type!==e&&(this.schema.type=e,"object"!==e&&(this.properties={},this.schema.properties=void 0))}remove(){this.parent.removeProperty(this.name)}get isBoolean(){return"boolean"===this.type}get isString(){return"string"===this.type}get isNumber(){return"number"===this.type||"integer"===this.type}get isObject(){return"object"===this.type}}class ke extends Ne{arraySchema;constructor(e,t,r){super(e,t,function(e){if("array"!==e.type)throw new Error("Expecting an array schema");if(e.items){if(Array.isArray(e.items))throw new Error("Tuple arrays are not supported")}else e.items={type:"any"};return e.items}(r)),this.arraySchema=r}get isMulti(){return!0}}function je(e){return(e=e.replace(/_/g," ").replace(/([a-z0-9])&([A-Z])/g,"$1 $2"))[0].toUpperCase()+e.slice(1)}function Se(e,t){if(t.editor)return t.editor;switch(t.type){case"number":case"integer":return"number";case"boolean":return"checkbox";default:return"text"}}class Oe{parent;schema;name;observer;constructor(e,t,r){this.parent=e,this.schema=t,this.name=r}get isRoot(){return!this.parent}get root(){return this.parent?this.parent.root:this}get path(){return this.parent?this.parent.path.concat(this.name):[]}get isScalar(){return!1}get isListItem(){return!1}get isObject(){return!1}get isList(){return!1}get title(){return this.schema.title||je(this.name)}onChange(e){this.observer&&!1===this.observer(this)||this.parent&&this.parent.onChange(e)}}class Ae extends Oe{constructor(e,t,r){super(e,t,r)}get isObject(){return!0}getProperty(e){const t=this.schema.properties[e];return t.isMulti?new qe(this,t,this.getOrInitArrayProperty(e)):t.isObject?new $e(this,t,t.name,this.getOrInitObjectProperty(e)):new Ie(this,t)}getOrInitObjectProperty(e){let t=this.value[e];return t||(this.value[e]=t={}),t}getOrInitArrayProperty(e){let t=this.value[e];return t||(this.value[e]=t=[]),t}setPropertyValue(e,t){return this.value[e]!==t&&(this.value[e]=t,!0)}getPropertyValue(e){return this.value[e]}get properties(){const e=[];for(const t of Object.values(this.schema.properties))t.isMulti?e.push(new qe(this,t,this.getOrInitArrayProperty(t.name))):t.isObject?e.push(new $e(this,t,t.name,this.getOrInitObjectProperty(t.name))):e.push(new Ie(this,t));return e}[Symbol.iterator](){return this.properties[Symbol.iterator]()}}class Pe extends Ae{value;constructor(e,t={}){super(null,e instanceof Ce?e:new Ce(e),"#root"),this.value=t}}class $e extends Ae{value;constructor(e,t,r,n){super(e,t,r),this.value=n}}class Ie extends Oe{constructor(e,t){super(e,t,t.name),void 0===e.value[this.name]&&void 0!==t.defaultValue&&(e.value[this.name]=t.defaultValue)}get isScalar(){return!0}set value(e){this.parent.setPropertyValue(this.name,e)&&this.onChange(this)}get value(){return this.parent.getPropertyValue(this.name)}getInputType(){return Se(this.name,this.schema)}}class qe extends Oe{value;items=[];constructor(e,t,r){super(e,t,t.name),this.value=r;for(const e of this.value)this.add()}get isList(){return!0}newItem(e){return this.schema.isObject?new Ee(this,e):new Te(this,e)}add(){const e=this.newItem(this.items.length);return this.items.push(e),e}remove(e){const t=this.value;if(e>=0&&e<this.items.length){this.items.splice(e,1);for(let e=0,t=this.items.length;e<t;e++){const t=this.items[e];t.index=e,t.name=String(e)}}Array.isArray(t)&&e>=0&&e<t.length&&(t.splice(e,1),this.onChange(this))}[Symbol.iterator](){return this.items[Symbol.iterator]()}item(e){if(e<0||e>=this.value.length)return;const t=this.value[e];return this.schema.isObject?new $e(this,this.schema,String(e),t):new Te(this,e)}trim(){for(;void 0===this.items[this.items.length-1];)this.items.pop()}}class Ee extends Ae{index;key;constructor(e,t){super(e,e.schema,String(t)),this.index=t,void 0===e.value[t]&&(e.value[t]={}),this.key=this.name+"@"+Date.now()}get isListItem(){return!0}set value(e){this.parent.value[this.index]=e}get value(){return this.parent.value[this.index]}}class Te extends Oe{index;key;constructor(e,t){super(e,e.schema,String(t)),this.index=t,void 0===e.value[t]&&void 0!==e.schema.defaultValue&&(e.value[t]=e.schema.defaultValue),this.key=this.name+"@"+Date.now()}get isScalar(){return!0}get isListItem(){return!0}set value(e){this.parent.value[this.index]=e}get value(){return this.parent.value[this.index]}getInputType(){return Se(this.name,this.schema)}}function Me({value:e}){return t("div",{className:"flex flex-col gap-4",children:Object.entries(e).map((([e,r])=>t(Fe,{name:e,value:r},e)))})}function Ve({name:e}){return t("div",{className:"text-md font-semibold",children:je(e)})}function Le({children:e,className:r}){return t("div",{className:$("flex flex-col gap-4 py-2 pl-4 border-l-4 border-l-solid border-l-slate-100 dark:border-l-slate-600",r),children:e})}function Fe({name:r,value:n}){const s=ze(n);switch(s.type){case De.Inline:return e("div",{className:"w-full flex gap-2",children:[t(Ve,{name:r+":"}),t("p",{children:s.value})]});case De.Paragraph:return e("div",{children:[t(Ve,{name:r}),t("p",{children:s.value})]});case De.Prose:return e("div",{className:"prose dark:prose-invert",children:[t(Ve,{name:r}),t("div",{className:"vprose dark:prose-invert",children:s.value})]});case De.Array:return t(Re,{name:r,value:n});case De.Object:return e("div",{children:[t(Ve,{name:r}),t(Le,{className:"mt-2",children:Object.entries(n).map((([e,r])=>t(Fe,{name:e,value:r},e)))})]})}}function Re({name:r,value:n}){const s=n.join(" ").length,i=s/n.length,a="string"==typeof n[0]&&(s<80||s<400&&i<32),o=n.length>9;return e("div",a?{className:"flex gap-2 flex-wrap",children:[r&&t(Ve,{name:r+":"}),n.map(((e,r)=>t(g,{children:String(e)},r)))]}:{children:[r&&t(Ve,{name:r}),t("div",{className:"flex flex-col gap-2",children:n.map(((e,r)=>t(_e,{index:r,value:e,useBullet:o},r)))})]})}function _e({index:r,value:n,useBullet:s}){const i=s?t("span",{className:"text-xl",children:"•"}):e("span",{children:[r+1,"."]}),a=ze(n);let o;switch(a.type){case De.Object:o=t(Le,{children:Object.entries(n).map((([e,r])=>t(Fe,{name:e,value:r},e)))});break;case De.Array:o=t(Re,{value:n});break;case De.Prose:o=t("div",{className:"prose dark:prose-invert",children:a.value});break;default:o=t("div",{children:a.value})}return e("div",{className:"flex gap-4 hover:bg-slate-50 dark:hover:bg-slate-800 py-2 pr-2 pl-4",children:[t("div",{className:"font-semibold text-gray-600 dark:text-gray-400",children:i}),t("div",{children:o})]})}var De;function ze(e){if(null==e)return{value:"-",type:De.Inline};if(Array.isArray(e))return{value:e,type:De.Array};const t=typeof e;if("string"===t){const t=e.length;let r;return t<80?r=De.Inline:t>400?r=De.Prose:(r=De.Paragraph,e=e.replace(/(?:\n\n)+/g,"\n\n")),{type:r,value:e}}return"number"===t||"boolean"===t?{value:String(e),type:De.Inline}:{value:e,type:De.Object}}function Ke({value:e,viewCode:r=!1}){return e?t("div",{className:"relative w-full",children:r?t(we,{data:e}):t(Me,{value:e})}):t("pre",{className:"whitespace-pre-wrap",children:"No Data to display"})}!function(e){e[e.Inline=0]="Inline",e[e.Paragraph=1]="Paragraph",e[e.Prose=2]="Prose",e[e.Array=3]="Array",e[e.Object=4]="Object"}(De||(De={}));let Ue=null;class Be{editor;constructor(e){this.editor=e}setValue(e){this.editor.dispatch({changes:{from:0,to:this.editor.state.doc.length,insert:e||""}})}getValue(){return this.editor.state.doc.toString()}}const We=[T.theme({"&":{fontSize:"16px",fontFamily:"Sans-Serif"},".cm-content":{fontFamily:"inherit"},".cm-scroller":{fontFamily:"inherit"},".cm-gutters":{backgroundColor:"transparent",color:"#ddd"},".cm-focused":{outline:"none"},".cm-cursor":{borderLeft:"2px solid #000",borderLeftColor:"#000",animation:"blink 1.2s step-start infinite"},"@keyframes blink":{"50%":{opacity:0}}}),T.lineWrapping];function He({onChange:e,value:r,className:n,editorRef:s,extensions:i,debounceTimeout:a=0}){const o=d(null),l=d(void 0);u((()=>{if(e)return l.current=a>0?E(e,a):e,()=>{l.current=void 0}}),[e,a]);const h=c((()=>t("div",{ref:o,className:n})),[n]);return v((()=>{if(o.current){let t=[...We,(e=e=>{l.current?.(e)},T.updateListener.of((t=>{t.docChanged&&e(t)})))];Array.isArray(i)?t=t.concat(i):i&&t.push(i);const n=((e="",t=[])=>{const r="string"==typeof e?M.of(e.split("\n")):e;return Ue?Ue.doc.toString()!==r.toString()&&(Ue=V.create({doc:r,extensions:t})):Ue=V.create({doc:r,extensions:t}),Ue})(r,t),a=new T({state:n,parent:o.current}),c=new Be(a);return s&&(s.current=c),()=>{a.destroy(),s&&(s.current=void 0)}}var e}),[h,i]),h}const Je=[L,q()];function Xe({schema:r,isOpen:n,onClose:s,readonly:i=!1}){const a=d(void 0),o=f(),l=c((()=>function(e){return e?JSON.stringify(e,null,2):""}(r.schema)),[r]);return e(b,{onClose:s,isOpen:!!n,className:"min-w-[60vw]",children:[t(x,{children:"JSON Schema Editor"}),t(w,{children:i?t(we,{data:r.schema||{}}):t(He,{value:l,extensions:Je,editorRef:a})}),t(C,{children:i?null:t(N,{onClick:()=>{if(a.current){const e=a.current.getValue();try{const t=function(e){if(e&&(e=e.trim()))return JSON.parse(e)}(e);r.replaceSchema(t),s()}catch(e){o({status:"error",title:"Invalid JSON Schema",description:e.message,duration:5e3})}}},children:"Save changes"})})]})}var Ze;function Ge(e,t){let r="any"===t.name?void 0:t.isNullable?[t.name,"null"]:t.name;if(t.isArray)if(e.type="array",e.properties=void 0,!e.items||Array.isArray(e.items))e.items={type:r,properties:t.isObject?{}:void 0};else{const n=e.items;n.type=r,t.isObject&&!n.properties&&(n.properties={})}else e.type=r,e.items=void 0,t.isObject?e.properties||(e.properties={}):e.properties=void 0}function Ye(e){let t,r=!1,n=!1;const s=e.type;if(Array.isArray(s))for(const e of s)"null"===e?r=!0:t||(t=e);else t=s;t||(t="any"),"array"===t&&(n=!0,t=function(e){if(!e)return"any";let t;t=Array.isArray(e)?Qe(e[0].type):Qe(e.type);"array"!==t&&"null"!==t||(t="any");return t}(e.items));let i=t;switch(e.editor||e.format){case"textarea":i="text";break;case"media":i="media";break;case"document":i="document"}return{isNullable:r,isArray:n,isObject:"object"===t,name:i}}function Qe(e){return e?Array.isArray(e)?e.find((e=>"null"!==e))||"any":e:"any"}!function(e){e.string="string",e.number="number",e.integer="integer",e.boolean="boolean",e.object="object",e.any="any",e.text="text",e.media="media",e.document="document"}(Ze||(Ze={}));let et=0;class tt{source;onChange=()=>{};schema;root;constructor(e,t){this.schema=e?"string"==typeof e?JSON.parse(e):e:{title:t,type:"object",properties:{}},this.schema.properties||(this.schema.properties={}),this.root=new rt("",this.schema,this),this.root.loadChildren()}get isEmpty(){return!this.root.children||0===this.root.children.length}get children(){return this.root.children}reload(){return this.root=new rt("",this.schema,this),this.root.loadChildren(),this.onChange?.(this),this}withSource(e,t){return this.source={uri:t,name:e},this}withChangeListener(e){return this.onChange=e,this}replaceSchema(e){this.schema=e||{title:this.schema.title,type:"object",properties:{}},this.reload()}clone(){const e=new tt(this.schema);return e.source=this.source,this.onChange&&e.withChangeListener(this.onChange),e}}class rt{schema;loader;parent;name;isRequired=!1;type;children;constructor(e,t,r,n){if(this.schema=t,this.loader=r,this.parent=n,this.name=e,this.type=Ye(t),this.parent){let t=this.parent._getPropertiesSchema().required;this.isRequired=!(!t||!Array.isArray(t))&&t.includes(e)}}get title(){return this.schema.title}set title(e){this.schema.title=e}get description(){return this.schema.description}set description(e){this.schema.description=e}get isParent(){return this.type.isObject}get isNew(){return!!this.schema.isNew}set isNew(e){e?this.schema.isNew=!0:delete this.schema.isNew}resetIsNew(){const e=this.isNew;return this.isNew=!1,e}getNameSignature(){return`${this.name}${this.isRequired?"":"?"}`}getTypeSignature(){return`${this.type.name}${this.type.isArray?"[]":""}${this.type.isNullable?"?":""}`}getSignature(){return`${this.getNameSignature()}: ${this.getTypeSignature()}`}reloadTree(){this.loader.reload()}loadChildren(){this.children=[],this.schema.items&&this.schema.items.properties?this._loadChildren(this.schema.items.properties):this.schema.properties&&this._loadChildren(this.schema.properties)}_loadChildren(e){for(const t of Object.keys(e)){const r=e[t],n=new rt(t,r,this.loader,this);this.children.push(n),n.isParent&&n.loadChildren()}}_getPropertiesSchema(){return this.type.isArray&&this.type.isObject?this.schema.items:this.schema}findAvailableChildName(e){const t=this._getPropertiesSchema().properties||{};let r;do{r=e+ ++et}while(t[r]);return r}addChild(e,t,r=!1){if(!this.type.isObject)throw new Error("Cannot add child to a non object node");this.children||(this.children=[]);const n=function(e,t,r,n=!1){if("object"!==e.type)throw new Error("Cannot add property to a non-object schema");e.properties||(e.properties={});const s={};return Ge(s,r),e.properties[t]=s,n&&(Array.isArray(e.required)?function(e,t){e.includes(t)||e.push(t)}(e.required,t):e.required=[t]),s}(this._getPropertiesSchema(),e,t,r),s=new rt(e,n,this.loader,this);return this.children.push(s),s}remove(){if(this.parent&&this.parent.type.isObject){return function(e,t){e.properties&&(delete e.properties[t],Array.isArray(e.required)&&(e.required=e.required.filter((e=>e!==t))))}(this.parent._getPropertiesSchema(),this.name),this.parent.children&&(this.parent.children=this.parent.children.filter((e=>e.name!==this.name))),!0}return!1}update(e){let t=!1;null!=e.name&&this.name!==e.name&&(this.parent&&function(e,t,r){if(e.properties){const n=e.properties,s={};for(const e of Object.keys(n)){const i=n[e];e===t?s[r]=i:s[e]=i}e.properties=s}e.required&&(e.required=e.required.map((e=>e===t?r:e)))}(this.parent._getPropertiesSchema(),this.name,e.name),this.name=e.name,t=!0),null!=e.isRequired&&this.isRequired!==e.isRequired&&(this.parent&&function(e,t,r){if(Array.isArray(e.required)){const n=e.required.indexOf(t);r?n<0&&e.required.push(t):n>-1&&e.required.splice(n,1)}else r&&(e.required=[t])}(this.parent._getPropertiesSchema(),this.name,e.isRequired),this.isRequired=e.isRequired,t=!0);let r=e.type?.name;"any"===r&&(r=void 0);const n=r!==this.schema.type;return e.type&&(Ge(this.schema,e.type),this.type=e.type,this.type.isObject?this.children||(this.children=[]):this.children=void 0,t=!0),this.schema.editor&&null===e.editor?(this.schema.editor=void 0,this.schema.format=void 0,t=!0):e.editor?(this.schema.editor=e.editor,this.schema.format=e.editor,t=!0):n&&(this.schema.editor=void 0,this.schema.format=void 0,t=!0),e.description!==this.description&&(this.description=e.description,t=!0),t}getUpdateFromNameAndTypeSignature(e,t){let r=e.trim(),n=!0;r.endsWith("?")&&(r=r.substring(0,r.length-1).trim(),n=!1);const s=function(e){let t=!1,r=!1;(e=e.trim()).endsWith("?")&&(r=!0,e=e.substring(0,e.length-1).trim()),e.endsWith("[]")&&(t=!0,e=e.substring(0,e.length-2).trim());const n=Ze[e];if(!n)throw new Error(`Unknown type "${e}"`);return{name:n,isArray:t,isNullable:r,isObject:n===Ze.object}}(t);let i;return"text"===s.name?(s.name=Ze.string,i="textarea"):"media"===s.name?(s.name=Ze.any,i="media"):"document"===s.name?(s.name=Ze.any,i="document"):i=null,{name:r,type:s,isRequired:n,editor:i}}updateFromNameAndTypeSignature(e,t){return this.update(this.getUpdateFromNameAndTypeSignature(e,t))}updateFromSignature(e){const t=(e=e.trim()).indexOf(":");if(t<0)throw new Error("Expecting a name and a type separated by a colon");const r=e.substring(0,t),n=e.substring(t+1);return this.updateFromNameAndTypeSignature(r,n)}}function nt(e){return{name:e.getNameSignature(),type:e.getTypeSignature(),description:e.description}}const st=function(){const e=Object.values(Ze),t=[...e];for(const r of e)t.push(r+"[]");return e.sort(),t}();function it({value:r,onChange:n,onCancel:s,onSave:i}){const[a,o]=h(!1);if(!r)return null;return e("div",{className:"flex items-center",children:[t("div",{className:"flex-1",children:t(at,{value:r.name,onChange:e=>{n({...r,name:e})},onCancel:s,onSave:i})}),t("div",{className:"px-1 font-semibold",children:":"}),t("div",{className:"flex-1",children:t(ot,{value:r.type,onChange:e=>{n({...r,type:e})},onCancel:s,onSave:i})}),e("div",{children:[t(N,{variant:"ghost",size:"xs",onClick:()=>o(!0),title:"Edit description",children:t(F,{className:"size-4"})}),t(lt,{value:r.description,isOpen:a,onClose:e=>{void 0!==e&&"string"==typeof e&&n({...r,description:e},!0),o(!1)}})]})]})}function at({value:e,onChange:r,onCancel:n,onSave:s}){const i=d(null);u((()=>{i.current?.focus()}),[]);return t("input",{onKeyUp:e=>{switch(e.key){case"Enter":s?.();break;case"Escape":n?.()}},ref:i,value:e,onChange:e=>{r(e.target.value)},className:k.INPUT_UNSTYLED,style:{fontSize:"inherit",width:"",display:"inline"}})}function ot({value:e,onChange:r,onCancel:n,onSave:s}){return t(j,{className:k.INPUT_UNSTYLED,options:st,value:e||"",onBlur:()=>{s?.()},onChange:r,onKeyDown:(e,t)=>{t||("Enter"===e.key?s?.():"Escape"===e.key&&n?.())},popupClass:"schema-type-suggest-popup z-90"})}function lt({value:r,isOpen:n,onClose:s}){return e(b,{isOpen:n,onClose:s,children:[t(x,{children:"Edit description"}),t(ct,{value:r,onSave:s})]})}function ct({value:n,onSave:s}){const i=d(null),[a,o]=h(n||"");return u((()=>{i.current&&i.current.focus()}),[i.current]),e(r,{children:[t(S,{className:"h-max",children:t("textarea",{ref:i,className:"dark:bg-gray-800 w-full h-full dark:text-white",value:a,onChange:e=>o(e.target.value)})}),t(O,{children:t(N,{onClick:()=>s(a),children:"Save Changes"})})]})}function ht({value:r}){return r?e("div",{className:"w-full flex items-baseline",children:[t("div",{children:r.name||""}),t("div",{className:"ml-2 text-sm text-gray-400",children:r.type||""})]}):null}function ut(e){const[t,r]=h(new tt(e||{type:"object",properties:{}}).withChangeListener((e=>{r(e.clone())})));return t}const dt="block sm:text-sm sm:leading-6 rounded-md border-0 py-1.5 px-2 text-gray-900 dark:text-slate-50",pt=`${dt} hover:shadow-xs hover:ring-1 hover:ring-inset hover:ring-gray-300 dark:hover:ring-slate-600`,mt=`${dt} shadow-xs ring-1 ring-inset ring-gray-300 dark:ring-slate-600`;function yt({value:r,onChange:n,onDelete:s,outlineOnHover:i=!1,editOnClick:a=!0,placeholder:o,viewer:l,editor:c,skipClickOutside:u,isEditing:d=!1,readonly:p=!1,onValidate:m}){const{on:y,off:g,isOn:v}=A(d),[f,b]=h();return e("div",{children:[v&&!p?t(vt,{value:r,onSave:e=>{if(m){const t=m(e);if(t)return void b(t);b(void 0)}n(e)&&g()},onCancel:g,editor:c,skipClickOutside:e=>!!u&&u(e)}):t(gt,{value:r,onEdit:y,viewer:l,placeholder:o,outlineOnHover:i,editOnClick:a,onDelete:s,readonly:p}),f&&t("div",{className:"text-red-500 text-sm",children:f})]})}function gt({viewer:r,value:n,onEdit:s,editOnClick:i,outlineOnHover:a,placeholder:o,onDelete:l,readonly:c}){const h="hidden group-hover:block text-gray-400 hover:text-gray-600 dark:text-gray-600 dark:hover:text-gray-400";return e("div",{tabIndex:0,onKeyUp:e=>{"Enter"===e.key&&s()},onClick:()=>{i&&s()},className:$("flex justify-start items-center group",a?pt:dt,{"cursor-pointer":i}),children:[t(r,{value:n,placeholder:o}),e("div",{className:"ml-auto flex space-x-2",children:[!c&&l&&t("button",{className:h,onClick:l,children:t(R,{className:"size-4"})}),c?null:t("button",{className:h,onClick:s,children:t(_,{className:"size-4"})})]})]})}function vt({editor:e,value:r,onSave:n,onCancel:s,skipClickOutside:i}){const[a,o]=h(r),l=d(r),[c,u]=h(null),p=()=>{n(l.current)},m=P(p,i);return t("div",{ref:m,children:t("div",{className:mt,children:t("div",{className:"w-full",onClick:e=>e.stopPropagation(),children:t(e,{value:a,onChange:(e,t=!1)=>{o(e),l.current=e,t&&(c&&clearTimeout(c),u(setTimeout((()=>{n(e)}),500)))},onSave:p,onCancel:s})})})})}function ft(e){const t=e.target;return!(!t.closest||!t.closest(".schema-type-suggest-popup"))}function bt({schema:r,readonly:n=!1}){return e("ul",{className:"",children:[r.children.map((e=>xt(e,n))),n?null:t(jt,{parent:r.root})]})}function xt(e,r){return e.isParent?t(Ct,{property:e,readonly:r},e.name):t(wt,{node:e,readonly:r},e.name)}function wt({node:e,readonly:r}){return t("li",{children:t(kt,{property:e,readonly:r})})}function Ct({property:r,readonly:n}){const[s,i]=h(!0);return e("li",{children:[e("div",{className:"flex items-center w-full",children:[t("button",{onClick:()=>i(!s),children:t(s?z:K,{className:"size-4"})}),t("div",{className:"flex-1",children:t(kt,{property:r,readonly:n})})]}),s&&e("ul",{className:"ml-4 border-l border-gray-400 border-dashed",children:[(r.children||[]).map((e=>xt(e,n))),n?null:t(jt,{parent:r})]})]})}function Nt(e){return e?/^[a-zA-Z0-9_]+[?]?$/.test(e)?void 0:"Only letters, numbers, underscores or question mark are allowed (a-zA-Z0-9_?)":"Name is required"}function kt({property:e,readonly:r}){const n=f(),s=e.resetIsNew(),i=nt(e);return t(yt,{value:i,onChange:t=>{try{t.description&&"string"!=typeof t.description&&(t.description=void 0);const r=e.getUpdateFromNameAndTypeSignature(t.name,t.type);e.update({...r,description:t.description})&&e.reloadTree()}catch(e){return n({status:"error",title:"Invalid property declaration",description:e.message,duration:9e3}),!1}return!0},onDelete:()=>{e.remove(),e.reloadTree()},editor:it,viewer:ht,outlineOnHover:!0,isEditing:s,skipClickOutside:ft,readonly:r,onValidate:e=>Nt(e.name)})}function jt({parent:r}){return e("button",{className:"ml-1 py-2 flex items-center text-gray-400 hover:text-indigo-600",onClick:()=>{const e=r.findAvailableChildName("new_property_");r.addChild(e,{isObject:!1,isArray:!1,isNullable:!1,name:Ze.string},!0).isNew=!0,r.reloadTree()},children:[t(D,{className:"size-5"}),t("div",{className:"ml-2",children:"Add property"})]})}const St=o(void 0),Ot=St.Provider;function At(){const e=l(St);if(!e)throw new Error("useFieldSet must be used within a Form or FieldSet element");return e}const Pt=o(void 0);function $t(){const e=l(Pt);if(!e)throw new Error("useForm must be used within a Form element");return e}const It=Pt.Provider;function qt({htmlFor:r,required:n,children:s}){return e("label",{htmlFor:r,className:"block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200",children:[s,n&&t("sup",{className:"text-red-600",children:"*"})]})}function Et({children:e}){return t("p",{className:"mt-2 text-sm text-gray-500",children:e})}function Tt({children:e}){return t("p",{className:"mt-2 text-sm text-red-600",children:e})}const Mt=a.forwardRef((({object:e,type:r="text",onChange:n,...s},i)=>{const[a,o]=h(null!=e.value?String(e.value):""),[l,c]=h(e.schema.isBoolean&&!0===e.value);s.className?s.className=$(k.INPUT,s.className):s.className=k.INPUT;const u=t=>{o(t.target.value),e.schema.isBoolean?(e.value=t.target.checked,c(e.value)):e.value=t.target.value,n&&n(t)};return"textarea"===r?t("textarea",{ref:i,...s,value:a,onChange:u}):t("input","checkbox"===r?{ref:i,...s,type:"checkbox",checked:l,onChange:u,className:"form-check-input"}:{ref:i,...s,type:r,value:a,onChange:u})}));function Vt({object:e,components:r,onSubmit:n,children:s,onChange:i}){return e.observer=i,t(It,{value:{object:e,components:r||{}},children:t("form",{className:"w-full",onSubmit:t=>{t.stopPropagation(),t.preventDefault(),n&&n(e.value)},children:s})})}function Lt(){const e=$t();return t("div",{className:"flex flex-col gap-4 w-full",children:e.object.properties.map(Rt)})}function Ft({children:r,...n}){return e(Vt,{...n,children:[t(Lt,{}),r]})}function Rt(e){return e.isList?t(zt,{object:e},e.name):e.isObject?t(Dt,{object:e},e.name):t(_t,{object:e},e.name)}function _t({object:r,editor:n,inline:s=!1}){n||(n=r.schema.editor);const{components:i}=$t(),a=n&&i[n]||Mt,o=r.getInputType();"checkbox"===o&&(s=!0);return e("div",{className:"",children:[e("div",{className:$("flex gap-2",s?"flex-row items-center":"flex-col"),children:[!r.isListItem&&t(qt,{required:r.schema.isRequired,children:r.title}),t(a,{object:r,type:o,onChange:e=>{const{value:t}=e.target;r.value=r.schema.isNumber?parseFloat(t):t}})]}),r.schema.description&&t(Et,{children:r.schema.description})]})}function Dt({object:r}){return e("div",{className:"flex flex-col gap-4 my-4 py-2 pl-4 border-l-4 border-l-solid border-l-slate-100 dark:border-l-slate-600",children:[!r.isListItem&&t("div",{className:"text-gray-900 dark:text-gray-200 font-semibold",children:r.title}),r.properties.map(Rt)]})}function zt({object:r}){const[n,s]=h(r.value||[]);return e("div",{className:"flex flex-col gap-4 my-4 py-2 pl-4 border-l-4 border-l-solid border-l-slate-100 darK:border-l-slate-600",children:[!r.isListItem&&t("div",{className:"text-gray-900 dark:text-gray-200 font-semibold",children:r.title}),r.items.map(((e,i)=>t(Kt,{object:e,list:r,onDelete:()=>(e=>{r.remove(e),s([...r.value])})(i)},`${i}-${n[i]??""}`))),t("div",{children:e(N,{variant:"soft",onClick:()=>{r.add(),s([...r.value])},children:[t(D,{className:"size-6"})," Add"]})})]})}function Kt({list:r,object:n,onDelete:s}){return e("div",{className:"flex gap-2 w-full",children:[t("div",{className:"flex-1",children:(i=n,a=r.schema.arraySchema.editor,i.isList?t(zt,{object:i}):i.isObject?t(Dt,{object:i}):t(_t,{object:i,editor:a}))}),t(N,{variant:"soft",onClick:s,children:t(R,{className:"size-4"})})]});var i,a}export{ke as ArrayPropertySchema,He as CodeMirrorEditor,Be as EditorApi,Ot as FieldSetContextProvider,Vt as Form,It as FormContextProvider,Tt as FormError,Et as FormHelper,qt as FormLabel,Ft as GeneratedForm,Mt as Input,we as JSONCode,Ke as JSONDisplay,Xe as JSONSchemaEditorModal,Me as JSONView,Ee as ManageObjectEntry,qe as ManagedListProperty,Pe as ManagedObject,Ae as ManagedObjectBase,$e as ManagedObjectProperty,Ie as ManagedProperty,Te as ManagedScalarEntry,tt as ManagedSchema,Oe as Node,it as PropertyEditor,at as PropertyNameEditor,Ne as PropertySchema,ht as PropertyViewer,_t as ScalarField,Ce as Schema,bt as SchemaEditor,rt as SchemaNode,de as XMLViewer,je as computeTitleFromName,nt as getEditableSchemaProperty,At as useFieldSet,$t as useForm,ut as useSchema,Nt as validatePropertyName};
1
+ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{isNil as n,omit as s,isEqual as i}from"lodash-es";import a,{createContext as o,useContext as l,useMemo as c,useState as d,useEffect as h,useRef as u,Children as p,isValidElement as m}from"react";import{XMLParser as f,XMLValidator as g}from"fast-xml-parser";import{ObjectWalker as y}from"@vertesia/json";import{DotBadge as v,useSafeLayoutEffect as b,useToast as x,VModal as w,VModalTitle as N,VModalBody as k,VModalFooter as C,Button as j,Styles as S,VSelectBox as O,ModalBody as A,ModalFooter as P,useFlag as $,useClickOutside as E,Table as I}from"@vertesia/ui/core";import T from"clsx";import q from"ajv";import{json as M}from"@codemirror/lang-json";import L from"debounce";import{EditorView as D}from"@codemirror/view";import{Text as F,EditorState as R}from"@codemirror/state";import{basicSetup as V}from"codemirror";import{AlignLeft as _,Trash2 as z,SquarePen as U,Plus as K,ChevronDown as B,ChevronRight as W,UploadIcon as H,CheckCircleIcon as J,AlertCircleIcon as G,XCircleIcon as X}from"lucide-react";import{offset as Z,shift as Y,flip as Q}from"@floating-ui/dom";import{useFloating as ee,autoUpdate as te,useDismiss as re,useClick as ne,useHover as se,useInteractions as ie,useTransitionStyles as ae,FloatingPortal as oe,FloatingFocusManager as le,safePolygon as ce}from"@floating-ui/react";const de="#text",he="#comment",ue="#cdata",pe="DECLARATION_TAG",me={tagColor:"#d43900",textColor:"#333",attributeKeyColor:"#2a7ab0",attributeValueColor:"#008000",separatorColor:"#333",commentColor:"#aaa",cdataColor:"#1d781d",fontFamily:"monospace"},fe=o({theme:me,collapsible:!1,indentSize:2}),ge=()=>l(fe),ye=new f({preserveOrder:!0,ignoreAttributes:!1,attributeNamePrefix:"",allowBooleanAttributes:!0,commentPropName:he,cdataPropName:ue,parseTagValue:!1});function ve(r){const{indentation:n,children:s,isInline:i}=r,{theme:a}=ge();return e("div",{style:{color:a.cdataColor},children:[t("span",{children:`${n}<![CDATA[`}),s,t("span",{children:`${i?"":n}]]>`})]})}function be(e){const{collapsible:r,theme:n}=ge(),{collapsed:s}=e;return r?t("span",{style:{position:"relative"},children:t("span",{style:{position:"absolute",right:"0",border:0,padding:0,background:"none"},children:t(xe,{fill:n.separatorColor,style:{transform:`rotate(${s?0:90}deg)`,transition:"transform 0.2s"}})})}):null}function xe({...e}){return t("svg",{width:"16px",height:"16px",viewBox:"0 0 24 24",...e,children:t("path",{d:"M9 17.898C9 18.972 10.2649 19.546 11.0731 18.8388L17.3838 13.3169C18.1806 12.6197 18.1806 11.3801 17.3838 10.6829L11.0731 5.16108C10.2649 4.45388 9 5.02785 9 6.1018V17.898Z"})})}function we(e){const{collapsible:t,initialCollapsedDepth:r}=ge(),[s,i]=d((()=>!(n(r)||!t)&&e>=r));return h((()=>{i(!(n(r)||!t)&&e>=r)}),[r,e,t]),{collapsed:s,buttonProps:t?{onClick:()=>i((e=>!e)),role:"button",style:{cursor:"pointer"}}:{}}}function Ne(r){const{indentation:n,children:s,isInline:i,level:a}=r,{theme:o}=ge(),{collapsed:l,buttonProps:c}=we(a);return e("div",{style:{color:o.commentColor},children:[e("span",{...c,children:[t("span",{children:n}),t(be,{collapsed:l}),t("span",{children:"\x3c!-- "})]}),!l&&s,l&&"...",t("span",{children:`${i||l?" ":n}--\x3e`})]})}function ke(r){const{attributes:n}=r,{theme:s}=ge();return n?t("span",{children:Object.entries(n).map((([r,n])=>e("span",{children:[t("span",{style:{color:s.attributeKeyColor},children:` ${r}`}),t("span",{style:{color:s.separatorColor},children:"="}),t("span",{style:{color:s.attributeValueColor},children:`"${n}"`})]},`attribute-${r}`)))}):null}function Ce(r){const{indentation:n,tagKey:s,attributes:i}=r,{theme:a}=ge();return e("div",{children:[t("span",{style:{color:a.separatorColor},children:`${n}<?`}),t("span",{style:{color:a.tagColor},children:`${s.slice(1)}`}),t(ke,{attributes:i}),t("span",{style:{color:a.separatorColor},children:"?>"})]})}function je(e){return"string"==typeof e&&e.includes("\n")}function Se(e){const t=e[":@"],r=s(e,":@"),[[n,i]]=Object.entries(r),a=function(e){switch(e){case de:case ue:case he:return e;default:return e.startsWith("?")?pe:"TAG"}}(n);return{attributes:t,tagKey:n,subElements:i,type:a}}function Oe(e){return!!e&&Object.keys(e).length>0}function Ae(n){const{indentation:s,tagKey:i,attributes:a,children:o,isInline:l,hasChildren:c,level:d}=n,{collapsed:h,buttonProps:u}=we(d),{theme:p}=ge();return e("div",{children:[e("span",{...u,children:[t("span",{children:s}),t(be,{collapsed:h}),t("span",{style:{color:p.separatorColor},children:"<"}),t("span",{style:{color:p.tagColor},children:`${i}`}),!h&&t(ke,{attributes:a}),h&&Oe(a)&&" ...",t("span",{style:{color:p.separatorColor},children:c?">":" />"})]}),c&&e(r,{children:[!h&&o,h&&"...",t("span",{style:{color:p.separatorColor},children:`${l||h?"":s}</`}),t("span",{style:{color:p.tagColor},children:`${i}`}),t("span",{style:{color:p.separatorColor},children:">"})]})]})}function Pe(e){const{hasSiblings:r,text:n,indentation:s,isText:i}=e,{theme:a}=ge(),o=i?{color:a.textColor}:void 0;return je(n)||r?t("div",{style:o,children:n.split("\n").filter((e=>!!e.trim())).map(((e,r)=>t("div",{children:`${s}${e.trim()}`},`${r}`)))}):t("span",{style:o,children:n})}function $e(e){const{elements:n,level:s=0,isText:i=!0}=e,{indentSize:a}=ge();return Array.isArray(n)&&0!==n.length?t(r,{children:n.map(((e,r)=>{const{tagKey:o,attributes:l,subElements:c,type:d}=Se(e),h=n.length>1,u=function(e,t){return new Array(t*e+1).join(" ")}(a,s),p=`${s}-${r}`,m=function(e){return"string"!=typeof e&&1===e.length&&de in e[0]&&!je(e[0][de])}(c);switch(d){case de:return t(Pe,{text:c,indentation:u,hasSiblings:h,isText:i},p);case he:return t(Ne,{isInline:m,indentation:u,level:s,children:t($e,{elements:c,level:s+1,isText:!1})},p);case ue:return t(ve,{indentation:u,isInline:m,children:t($e,{elements:c,level:s+1,isText:!1})},p);case pe:return t(Ce,{indentation:u,tagKey:o,attributes:l},p);default:return t(Ae,{indentation:u,tagKey:o,attributes:l,isInline:m,hasChildren:c.length>0,level:s,children:t($e,{elements:c,level:s+1})},p)}}))}):null}function Ee(){return t("div",{children:"Invalid XML!"})}function Ie(e){const{theme:r,xml:n,collapsible:s=!1,indentSize:a=2,invalidXml:o,initalCollapsedDepth:l,initialCollapsedDepth:u}=e,[p,m]=d((()=>({...me,...r}))),{json:f,valid:y}=function(e){return c((()=>{try{if(!g.validate(e))throw new Error("Invalid XML!");const t=ye.parse(e);if("string"==typeof e&&e.trim().length>0&&0===t.length)throw new Error("Invalid XML!");return{json:t,valid:!0}}catch(e){return{json:null,valid:!1,errorMessage:`Fail to parse: ${e.message}`}}}),[e])}(n),v=c((()=>({theme:p,collapsible:s,indentSize:a,initialCollapsedDepth:u??l})),[p,s,a,l,u]);return h((()=>{m((e=>{const t={...me,...r};return i(t,e)?e:t}))}),[r]),y?t(fe.Provider,{value:v,children:t("div",{className:"rxv-container",style:{whiteSpace:"pre-wrap",fontFamily:p.fontFamily,overflowWrap:"break-word"},children:t($e,{elements:f})})}):o||t(Ee,{})}const Te="text-pink-500 dark:text-pink-400",qe="text-purple-500 dark:text-purple-400",Me="text-blue-500 dark:text-blue-400",Le={code:"bg-gray-100 dark:bg-slate-800 whitespace-pre-wrap p-4 rounded-lg font-mono",comma:Te,assign:Te,startObject:Te,endObject:Te,startArray:Te,endArray:Te,boolean:qe,null:qe,key:Me,index:Me,string:"text-orange-500 dark:text-orange-400",number:"text-green-500 dark:text-green-400"};class De{renderer;parent;key;indent;result=[];constructor(e,t,r,n){this.renderer=e,this.parent=t,this.key=r,this.indent=n}get classMap(){return this.renderer.classMap}writeKey(e){const t=typeof e;"string"===t?(this.result.length>0&&this.result.push(`<span class='${this.classMap.comma}'>,\n</span>`),this.indent&&this.result.push(this.indent),this.result.push(`<span class="${this.classMap.key}">"${e}"</span><span class='${this.classMap.assign}'>: </span>`)):"number"===t&&(this.result.length>0&&this.result.push(`<span class='${this.classMap.comma}'>,\n</span>`),this.indent&&this.result.push(this.indent))}pushValue(e,t){if(this.writeKey(e),null===t)this.result.push(`<span class='${this.classMap.null}'>null</span>`);else if(t instanceof De)this.result.push(t.renderStart()+t.renderValue()+t.renderEnd());else{let e;const r=typeof t;"string"===r?(t=(t=`"${t}"`).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),e=this.classMap.string):"number"===r?e=this.classMap.number:"boolean"===r&&(e=this.classMap.boolean),this.result.push(`<span class='${e}'>${t}</span>`)}}renderValue(){return this.result.join("")}}class Fe extends De{constructor(e,t,r,n){super(e,t,r,n)}renderStart(){return`<span class='${this.classMap.startObject}'>{\n</span>`}renderEnd(){const e=this.result.length>0?"\n":"";return`<span class='${this.classMap.endObject}'>${e}${this.parent?.indent||""}}</span>`}}class Re extends De{constructor(e,t,r,n){super(e,t,r,n)}renderStart(){return`<span class='${this.classMap.startArray}'>[\n</span>`}renderEnd(){const e=this.result.length>0?"\n":"";return`<span class='${this.classMap.endArray}'>${e}${this.parent?.indent||""}]</span>`}}class Ve{classMap;tab;stack=[];block=new Fe(this,void 0,"","");constructor(e=Le,t=" "){this.classMap=e,this.tab=t}onStartObject(e){const t=new Fe(this,this.block,e,this.block.indent+this.tab);this.stack.push(this.block),this.block=t}onEndObject(){const e=this.block;this.block=this.stack.pop(),this.block.pushValue(e.key,e)}onStartIteration(e){const t=new Re(this,this.block,e,this.block.indent+this.tab);this.stack.push(this.block),this.block=t}onEndIteration(){const e=this.block;this.block=this.stack.pop(),this.block.pushValue(e.key,e)}onValue(e,t){this.block.pushValue(e,t)}}function _e({data:e,className:r,classMap:n}){const[s,i]=d();return h((()=>{i(function(e,r,n){const s=new Ve(r);(new y).walk(e,s);const i=s.block.renderValue();return t("div",{className:n,dangerouslySetInnerHTML:{__html:`<div class='${s.classMap.code}' style='overflow-x: scroll'>${i}</div>`}})}(e,n,r))}),[e]),s}class ze{schema;properties={};_validator;constructor(e){this.schema=e||{type:"object",properties:{}},this.load()}get validator(){if(!this._validator){const e=new q({allErrors:!0,strict:!1});this._validator=e.compile(this.schema)}return this._validator}load(){if(this.schema.properties){const e=this.schema.properties;Object.keys(e).forEach((t=>{this.loadProperty(t,e[t])}))}}hasProperties(){return Object.keys(this.properties).length>0}get title(){return this.schema.title||this.schema.name}get description(){return this.schema.description}loadProperty(e,t){let r;return r="array"===t.type?new Ke(this,e,t):new Ue(this,e,t),this.properties[e]=r,r}get type(){return this.schema.type}validate(e){return this.validator(e)?null:this.validator.errors||[]}addProperty(e,t,r=!1){"object"!==this.schema.type&&(this.schema.type="object"),this.schema.properties||(this.schema.properties={});const n="string"==typeof t?"object"===(s=t)?{type:"object",properties:{}}:"array"===s?{type:"array",items:{}}:{type:s}:t;var s;const i=this.loadProperty(e,n);return this.schema.properties[i.name]=i.schema,r&&(i.isRequired=!0),i}removeProperty(e){this.schema.properties&&(delete this.schema.properties[e],Array.isArray(this.schema.required)&&(this.schema.required=this.schema.required.filter((t=>t!==e)))),delete this.properties[e]}getProperty(e){return this.properties[e]}get editor(){return this.schema.editor}}class Ue extends ze{parent;name;constructor(e,t,r){if(super(r),this.parent=e,this.name=t,"array"===r.type)throw new Error("Array property must be instantiated using ArrayPropertySchema");"object"!==r.type||r.properties||(r.properties={})}get isMulti(){return!1}get isReadOnly(){return!!this.schema.readOnly}set isReadOnly(e){this.schema.readOnly=e}get defaultValue(){return this.schema.default}set defaultValue(e){this.schema.default=e}get enum(){return this.schema.enum}set enum(e){this.schema.enum=e}get isRequired(){const e=this.parent.schema.required;return!!e&&e.includes(this.name)}set isRequired(e){let t=Array.isArray(this.parent.schema.required)?this.parent.schema.required:[];t=e?t.concat(this.name):t.filter((e=>e!==this.name)),this.parent.schema.required=t}get type(){return this.schema.type}set type(e){this.schema.type!==e&&(this.schema.type=e,"object"!==e&&(this.properties={},this.schema.properties=void 0))}remove(){this.parent.removeProperty(this.name)}get isBoolean(){return"boolean"===this.type}get isString(){return"string"===this.type}get isNumber(){return"number"===this.type||"integer"===this.type}get isObject(){return"object"===this.type}}class Ke extends Ue{arraySchema;constructor(e,t,r){super(e,t,function(e){if("array"!==e.type)throw new Error("Expecting an array schema");if(e.items){if(Array.isArray(e.items))throw new Error("Tuple arrays are not supported")}else e.items={};return e.items}(r)),this.arraySchema=r}get isMulti(){return!0}}function Be(e){return(e=e.replace(/_/g," ").replace(/([a-z0-9])&([A-Z])/g,"$1 $2"))[0].toUpperCase()+e.slice(1)}function We(e,t){if(t.editor)return t.editor;switch(t.type){case"number":case"integer":return"number";case"boolean":return"checkbox";default:return"text"}}class He{parent;schema;name;observer;constructor(e,t,r){this.parent=e,this.schema=t,this.name=r}get isRoot(){return!this.parent}get root(){return this.parent?this.parent.root:this}get path(){return this.parent?this.parent.path.concat(this.name):[]}get isScalar(){return!1}get isListItem(){return!1}get isObject(){return!1}get isList(){return!1}get title(){return this.schema.title||Be(this.name)}onChange(e){this.observer&&!1===this.observer(this)||this.parent&&this.parent.onChange(e)}}class Je extends He{constructor(e,t,r){super(e,t,r)}get isObject(){return!0}getProperty(e){const t=this.schema.properties[e];return t.isMulti?new Ye(this,t,this.getOrInitArrayProperty(e)):t.isObject?new Xe(this,t,t.name,this.getOrInitObjectProperty(e)):new Ze(this,t)}getOrInitObjectProperty(e){let t=this.value[e];return t||(this.value[e]=t={}),t}getOrInitArrayProperty(e){let t=this.value[e];return t||(this.value[e]=t=[]),t}setPropertyValue(e,t){return this.value[e]!==t&&(this.value[e]=t,!0)}getPropertyValue(e){return this.value[e]}get properties(){const e=[];for(const t of Object.values(this.schema.properties))t.isMulti?e.push(new Ye(this,t,this.getOrInitArrayProperty(t.name))):t.isObject?e.push(new Xe(this,t,t.name,this.getOrInitObjectProperty(t.name))):e.push(new Ze(this,t));return e}[Symbol.iterator](){return this.properties[Symbol.iterator]()}}class Ge extends Je{value;constructor(e,t={}){super(null,e instanceof ze?e:new ze(e),"#root"),this.value=t}}class Xe extends Je{value;constructor(e,t,r,n){super(e,t,r),this.value=n}}class Ze extends He{constructor(e,t){super(e,t,t.name),void 0===e.value[this.name]&&void 0!==t.defaultValue&&(e.value[this.name]=t.defaultValue)}get isScalar(){return!0}set value(e){this.parent.setPropertyValue(this.name,e)&&this.onChange(this)}get value(){return this.parent.getPropertyValue(this.name)}getInputType(){return We(this.name,this.schema)}}class Ye extends He{value;items=[];constructor(e,t,r){super(e,t,t.name),this.value=r;for(const e of this.value)this.add()}get isList(){return!0}newItem(e){return this.schema.isObject?new Qe(this,e):new et(this,e)}add(){const e=this.newItem(this.items.length);return this.items.push(e),e}remove(e){const t=this.value;if(e>=0&&e<this.items.length){this.items.splice(e,1);for(let e=0,t=this.items.length;e<t;e++){const t=this.items[e];t.index=e,t.name=String(e)}}Array.isArray(t)&&e>=0&&e<t.length&&(t.splice(e,1),this.onChange(this))}[Symbol.iterator](){return this.items[Symbol.iterator]()}item(e){if(e<0||e>=this.value.length)return;const t=this.value[e];return this.schema.isObject?new Xe(this,this.schema,String(e),t):new et(this,e)}trim(){for(;void 0===this.items[this.items.length-1];)this.items.pop()}}class Qe extends Je{index;key;constructor(e,t){super(e,e.schema,String(t)),this.index=t,void 0===e.value[t]&&(e.value[t]={}),this.key=this.name+"@"+Date.now()}get isListItem(){return!0}set value(e){this.parent.value[this.index]=e}get value(){return this.parent.value[this.index]}}class et extends He{index;key;constructor(e,t){super(e,e.schema,String(t)),this.index=t,void 0===e.value[t]&&void 0!==e.schema.defaultValue&&(e.value[t]=e.schema.defaultValue),this.key=this.name+"@"+Date.now()}get isScalar(){return!0}get isListItem(){return!0}set value(e){this.parent.value[this.index]=e}get value(){return this.parent.value[this.index]}getInputType(){return We(this.name,this.schema)}}function tt({value:e}){return t("div",{className:"flex flex-col gap-4",children:Object.entries(e).map((([e,r])=>t(st,{name:e,value:r},e)))})}function rt({name:e}){return t("div",{className:"text-md font-semibold",children:Be(e)})}function nt({children:e,className:r}){return t("div",{className:T("flex flex-col gap-4 py-2 pl-4 border-l-4 border-l-solid border-l-slate-100 dark:border-l-slate-600",r),children:e})}function st({name:r,value:n}){const s=lt(n);switch(s.type){case ot.Inline:return e("div",{className:"w-full flex gap-2",children:[t(rt,{name:r+":"}),t("p",{children:s.value})]});case ot.Paragraph:return e("div",{children:[t(rt,{name:r}),t("p",{children:s.value})]});case ot.Prose:return e("div",{className:"prose dark:prose-invert",children:[t(rt,{name:r}),t("div",{className:"vprose dark:prose-invert",children:s.value})]});case ot.Array:return t(it,{name:r,value:n});case ot.Object:return e("div",{children:[t(rt,{name:r}),t(nt,{className:"mt-2",children:Object.entries(n).map((([e,r])=>t(st,{name:e,value:r},e)))})]})}}function it({name:r,value:n}){const s=n.join(" ").length,i=s/n.length,a="string"==typeof n[0]&&(s<80||s<400&&i<32),o=n.length>9;return e("div",a?{className:"flex gap-2 flex-wrap",children:[r&&t(rt,{name:r+":"}),n.map(((e,r)=>t(v,{children:String(e)},r)))]}:{children:[r&&t(rt,{name:r}),t("div",{className:"flex flex-col gap-2",children:n.map(((e,r)=>t(at,{index:r,value:e,useBullet:o},r)))})]})}function at({index:r,value:n,useBullet:s}){const i=s?t("span",{className:"text-xl",children:"•"}):e("span",{children:[r+1,"."]}),a=lt(n);let o;switch(a.type){case ot.Object:o=t(nt,{children:Object.entries(n).map((([e,r])=>t(st,{name:e,value:r},e)))});break;case ot.Array:o=t(it,{value:n});break;case ot.Prose:o=t("div",{className:"prose dark:prose-invert",children:a.value});break;default:o=t("div",{children:a.value})}return e("div",{className:"flex gap-4 hover:bg-slate-50 dark:hover:bg-slate-800 py-2 pr-2 pl-4",children:[t("div",{className:"font-semibold text-gray-600 dark:text-gray-400",children:i}),t("div",{children:o})]})}var ot;function lt(e){if(null==e)return{value:"-",type:ot.Inline};if(Array.isArray(e))return{value:e,type:ot.Array};const t=typeof e;if("string"===t){const t=e.length;let r;return t<80?r=ot.Inline:t>400?r=ot.Prose:(r=ot.Paragraph,e=e.replace(/(?:\n\n)+/g,"\n\n")),{type:r,value:e}}return"number"===t||"boolean"===t?{value:String(e),type:ot.Inline}:{value:e,type:ot.Object}}function ct({value:e,viewCode:r=!1}){return e?t("div",{className:"relative w-full",children:r?t(_e,{data:e}):t(tt,{value:e})}):t("pre",{className:"whitespace-pre-wrap",children:"No Data to display"})}!function(e){e[e.Inline=0]="Inline",e[e.Paragraph=1]="Paragraph",e[e.Prose=2]="Prose",e[e.Array=3]="Array",e[e.Object=4]="Object"}(ot||(ot={}));let dt=null;class ht{editor;constructor(e){this.editor=e}setValue(e){this.editor.dispatch({changes:{from:0,to:this.editor.state.doc.length,insert:e||""}})}getValue(){return this.editor.state.doc.toString()}}const ut=[D.theme({"&":{fontSize:"14px",fontFamily:"monospace"},".cm-content":{fontFamily:"inherit"},".cm-scroller":{fontFamily:"inherit"},".cm-gutters":{backgroundColor:"transparent",color:"#ddd"},".cm-focused":{outline:"none"},".cm-cursor":{borderLeft:"2px solid #000",borderLeftColor:"#000",animation:"blink 1.2s step-start infinite"},"@keyframes blink":{"50%":{opacity:0}}}),D.lineWrapping];function pt({onChange:e,value:r,className:n,editorRef:s,extensions:i,debounceTimeout:a=0}){const o=u(null),l=u(void 0);h((()=>{if(e)return l.current=a>0?L(e,a):e,()=>{l.current=void 0}}),[e,a]);const d=c((()=>t("div",{ref:o,className:n})),[n]);return b((()=>{if(o.current){let t=[...ut,(e=e=>{l.current?.(e)},D.updateListener.of((t=>{t.docChanged&&e(t)})))];Array.isArray(i)?t=t.concat(i):i&&t.push(i);const n=((e="",t=[])=>{const r="string"==typeof e?F.of(e.split("\n")):e;return dt?dt.doc.toString()!==r.toString()&&(dt=R.create({doc:r,extensions:t})):dt=R.create({doc:r,extensions:t}),dt})(r,t),a=new D({state:n,parent:o.current}),c=new ht(a);return s&&(s.current=c),()=>{a.destroy(),s&&(s.current=void 0)}}var e}),[d,i]),d}const mt=[V,M()];function ft({schema:r,isOpen:n,onClose:s,readonly:i=!1}){const a=u(void 0),o=x(),l=c((()=>function(e){return e?JSON.stringify(e,null,2):""}(r.schema)),[r]);return e(w,{onClose:s,isOpen:!!n,className:"min-w-[60vw]",children:[t(N,{children:"JSON Schema Editor"}),t(k,{children:i?t(_e,{data:r.schema||{}}):t(pt,{value:l,extensions:mt,editorRef:a})}),t(C,{children:i?null:t(j,{onClick:()=>{if(a.current){const e=a.current.getValue();try{const t=function(e){if(e&&(e=e.trim()))return JSON.parse(e)}(e);r.replaceSchema(t),s()}catch(e){o({status:"error",title:"Invalid JSON Schema",description:e.message,duration:5e3})}}},children:"Save changes"})})]})}var gt;function yt(e,t){let r="any"===t.name?void 0:t.isNullable?[t.name,"null"]:t.name;if(t.isArray)if(e.type="array",e.properties=void 0,!e.items||Array.isArray(e.items))e.items={type:r,properties:t.isObject?{}:void 0};else{const n=e.items;n.type=r,t.isObject&&!n.properties&&(n.properties={})}else e.type=r,e.items=void 0,t.isObject?e.properties||(e.properties={}):e.properties=void 0}function vt(e){let t,r=!1,n=!1;const s=e.type;if(Array.isArray(s))for(const e of s)"null"===e?r=!0:t||(t=e);else t=s;t||(t="any"),"array"===t&&(n=!0,t=function(e){if(!e)return"any";let t;t=Array.isArray(e)?bt(e[0].type):bt(e.type);"array"!==t&&"null"!==t||(t="any");return t}(e.items));let i=t;switch(e.editor||e.format){case"textarea":i="text";break;case"media":i="media";break;case"document":i="document"}return{isNullable:r,isArray:n,isObject:"object"===t,name:i}}function bt(e){return e?Array.isArray(e)?e.find((e=>"null"!==e))||"any":e:"any"}!function(e){e.string="string",e.number="number",e.integer="integer",e.boolean="boolean",e.object="object",e.any="any",e.text="text",e.media="media",e.document="document"}(gt||(gt={}));let xt=0;class wt{source;onChange=()=>{};schema;root;constructor(e,t){this.schema=e?"string"==typeof e?JSON.parse(e):e:{title:t,type:"object",properties:{}},this.schema.properties||(this.schema.properties={}),this.root=new Nt("",this.schema,this),this.root.loadChildren()}get isEmpty(){return!this.root.children||0===this.root.children.length}get children(){return this.root.children}reload(){return this.root=new Nt("",this.schema,this),this.root.loadChildren(),this.onChange?.(this),this}withSource(e,t){return this.source={uri:t,name:e},this}withChangeListener(e){return this.onChange=e,this}replaceSchema(e){this.schema=e||{title:this.schema.title,type:"object",properties:{}},this.reload()}clone(){const e=new wt(this.schema);return e.source=this.source,this.onChange&&e.withChangeListener(this.onChange),e}}class Nt{schema;loader;parent;name;isRequired=!1;type;children;constructor(e,t,r,n){if(this.schema=t,this.loader=r,this.parent=n,this.name=e,this.type=vt(t),this.parent){let t=this.parent._getPropertiesSchema().required;this.isRequired=!(!t||!Array.isArray(t))&&t.includes(e)}}get title(){return this.schema.title}set title(e){this.schema.title=e}get description(){return this.schema.description}set description(e){this.schema.description=e}get isParent(){return this.type.isObject}get isNew(){return!!this.schema.isNew}set isNew(e){e?this.schema.isNew=!0:delete this.schema.isNew}resetIsNew(){const e=this.isNew;return this.isNew=!1,e}getNameSignature(){return`${this.name}${this.isRequired?"":"?"}`}getTypeSignature(){return`${this.type.name}${this.type.isArray?"[]":""}${this.type.isNullable?"?":""}`}getSignature(){return`${this.getNameSignature()}: ${this.getTypeSignature()}`}reloadTree(){this.loader.reload()}loadChildren(){this.children=[],this.schema.items&&this.schema.items.properties?this._loadChildren(this.schema.items.properties):this.schema.properties&&this._loadChildren(this.schema.properties)}_loadChildren(e){for(const t of Object.keys(e)){const r=e[t],n=new Nt(t,r,this.loader,this);this.children.push(n),n.isParent&&n.loadChildren()}}_getPropertiesSchema(){return this.type.isArray&&this.type.isObject?this.schema.items:this.schema}findAvailableChildName(e){const t=this._getPropertiesSchema().properties||{};let r;do{r=e+ ++xt}while(t[r]);return r}addChild(e,t,r=!1){if(!this.type.isObject)throw new Error("Cannot add child to a non object node");this.children||(this.children=[]);const n=function(e,t,r,n=!1){if("object"!==e.type)throw new Error("Cannot add property to a non-object schema");e.properties||(e.properties={});const s={};return yt(s,r),e.properties[t]=s,n&&(Array.isArray(e.required)?function(e,t){e.includes(t)||e.push(t)}(e.required,t):e.required=[t]),s}(this._getPropertiesSchema(),e,t,r),s=new Nt(e,n,this.loader,this);return this.children.push(s),s}remove(){if(this.parent&&this.parent.type.isObject){return function(e,t){e.properties&&(delete e.properties[t],Array.isArray(e.required)&&(e.required=e.required.filter((e=>e!==t))))}(this.parent._getPropertiesSchema(),this.name),this.parent.children&&(this.parent.children=this.parent.children.filter((e=>e.name!==this.name))),!0}return!1}update(e){let t=!1;null!=e.name&&this.name!==e.name&&(this.parent&&function(e,t,r){if(e.properties){const n=e.properties,s={};for(const e of Object.keys(n)){const i=n[e];e===t?s[r]=i:s[e]=i}e.properties=s}e.required&&(e.required=e.required.map((e=>e===t?r:e)))}(this.parent._getPropertiesSchema(),this.name,e.name),this.name=e.name,t=!0),null!=e.isRequired&&this.isRequired!==e.isRequired&&(this.parent&&function(e,t,r){if(Array.isArray(e.required)){const n=e.required.indexOf(t);r?n<0&&e.required.push(t):n>-1&&e.required.splice(n,1)}else r&&(e.required=[t])}(this.parent._getPropertiesSchema(),this.name,e.isRequired),this.isRequired=e.isRequired,t=!0);let r=e.type?.name;"any"===r&&(r=void 0);const n=r!==this.schema.type;return e.type&&(yt(this.schema,e.type),this.type=e.type,this.type.isObject?this.children||(this.children=[]):this.children=void 0,t=!0),this.schema.editor&&null===e.editor?(this.schema.editor=void 0,this.schema.format=void 0,t=!0):e.editor?(this.schema.editor=e.editor,this.schema.format=e.editor,t=!0):n&&(this.schema.editor=void 0,this.schema.format=void 0,t=!0),e.description!==this.description&&(this.description=e.description,t=!0),t}getUpdateFromNameAndTypeSignature(e,t){let r=e.trim(),n=!0;r.endsWith("?")&&(r=r.substring(0,r.length-1).trim(),n=!1);const s=function(e){let t=!1,r=!1;(e=e.trim()).endsWith("?")&&(r=!0,e=e.substring(0,e.length-1).trim()),e.endsWith("[]")&&(t=!0,e=e.substring(0,e.length-2).trim());const n=gt[e];if(!n)throw new Error(`Unknown type "${e}"`);return{name:n,isArray:t,isNullable:r,isObject:n===gt.object}}(t);let i;return"text"===s.name?(s.name=gt.string,i="textarea"):"media"===s.name?(s.name=gt.any,i="media"):"document"===s.name?(s.name=gt.any,i="document"):i=null,{name:r,type:s,isRequired:n,editor:i}}updateFromNameAndTypeSignature(e,t){return this.update(this.getUpdateFromNameAndTypeSignature(e,t))}updateFromSignature(e){const t=(e=e.trim()).indexOf(":");if(t<0)throw new Error("Expecting a name and a type separated by a colon");const r=e.substring(0,t),n=e.substring(t+1);return this.updateFromNameAndTypeSignature(r,n)}}function kt(e){return{name:e.getNameSignature(),type:e.getTypeSignature(),description:e.description}}const Ct=function(){const e=Object.values(gt),t=[...e];for(const r of e)t.push(r+"[]");return e.sort(),t}();function jt({value:r,onChange:n,onCancel:s,onSave:i}){const[a,o]=d(!1);if(!r)return null;return e("div",{className:"flex items-center",children:[t("div",{className:"flex-1",children:t(St,{value:r.name,onChange:e=>{n({...r,name:e})},onCancel:s,onSave:i})}),t("div",{className:"px-1 font-semibold",children:":"}),t("div",{className:"flex-1",children:t(Ot,{value:r.type,onChange:e=>{n({...r,type:e})},onCancel:s,onSave:i})}),e("div",{children:[t(j,{variant:"ghost",size:"xs",onClick:()=>o(!0),title:"Edit description",children:t(_,{className:"size-4"})}),t(At,{value:r.description,isOpen:a,onClose:e=>{void 0!==e&&"string"==typeof e&&n({...r,description:e},!0),o(!1)}})]})]})}function St({value:e,onChange:r,onCancel:n,onSave:s}){const i=u(null);h((()=>{i.current?.focus()}),[]);return t("input",{onKeyUp:e=>{switch(e.key){case"Enter":s?.();break;case"Escape":n?.()}},ref:i,value:e,onChange:e=>{r(e.target.value)},className:S.INPUT_UNSTYLED,style:{fontSize:"inherit",width:"",display:"inline"}})}function Ot({value:e,onChange:r,onCancel:n,onSave:s}){return t(O,{className:S.INPUT_UNSTYLED,options:Ct,value:e||"",onBlur:()=>{s?.()},onChange:r,onKeyDown:(e,t)=>{t||("Enter"===e.key?s?.():"Escape"===e.key&&n?.())},popupClass:"schema-type-suggest-popup z-90"})}function At({value:r,isOpen:n,onClose:s}){return e(w,{isOpen:n,onClose:s,children:[t(N,{children:"Edit description"}),t(Pt,{value:r,onSave:s})]})}function Pt({value:n,onSave:s}){const i=u(null),[a,o]=d(n||"");return h((()=>{i.current&&i.current.focus()}),[i.current]),e(r,{children:[t(A,{className:"h-max",children:t("textarea",{ref:i,className:"dark:bg-gray-800 w-full h-full dark:text-white",value:a,onChange:e=>o(e.target.value)})}),t(P,{children:t(j,{onClick:()=>s(a),children:"Save Changes"})})]})}function $t({value:r}){return r?e("div",{className:"w-full flex items-baseline",children:[t("div",{children:r.name||""}),t("div",{className:"ml-2 text-sm text-muted",children:r.type||""})]}):null}function Et(e){const[t,r]=d(new wt(e||{type:"object",properties:{}}).withChangeListener((e=>{r(e.clone())})));return t}const It="block text-sm sm:leading-6 rounded-md border-0 py-1.5 px-4",Tt=`${It} hover:shadow-xs hover:ring-1 hover:ring-inset hover:ring-ring`,qt=`${It} shadow-xs ring-1 ring-inset ring-ring`;function Mt({value:r,onChange:n,onDelete:s,outlineOnHover:i=!1,editOnClick:a=!0,placeholder:o,viewer:l,editor:c,skipClickOutside:h,isEditing:u=!1,readonly:p=!1,onValidate:m}){const{on:f,off:g,isOn:y}=$(u),[v,b]=d();return e("div",{className:"",children:[y&&!p?t(Dt,{value:r,onSave:e=>{if(m){const t=m(e);if(t)return void b(t);b(void 0)}n(e)&&g()},onCancel:g,editor:c,skipClickOutside:e=>!!h&&h(e)}):t(Lt,{value:r,onEdit:f,viewer:l,placeholder:o,outlineOnHover:i,editOnClick:a,onDelete:s,readonly:p}),v&&t("div",{className:"text-red-500 text-sm",children:v})]})}function Lt({viewer:r,value:n,onEdit:s,editOnClick:i,outlineOnHover:a,placeholder:o,onDelete:l,readonly:c}){const d="invisible group-hover:visible";return e("div",{tabIndex:0,onKeyUp:e=>{"Enter"===e.key&&s()},onClick:()=>{i&&s()},className:T("flex justify-start items-center group",a?Tt:It,{"cursor-pointer":i}),children:[t(r,{value:n,placeholder:o}),e("div",{className:"ml-auto flex space-x-2",children:[!c&&l&&t(j,{variant:"ghost",size:"sm",className:d,onClick:l,children:t(z,{className:"size-4"})}),c?null:t(j,{variant:"ghost",size:"sm",className:d,onClick:s,children:t(U,{className:"size-4"})})]})]})}function Dt({editor:e,value:r,onSave:n,onCancel:s,skipClickOutside:i}){const[a,o]=d(r),l=u(r),[c,h]=d(null),p=()=>{n(l.current)},m=E(p,i);return t("div",{ref:m,children:t("div",{className:qt,children:t("div",{className:"w-full",onClick:e=>e.stopPropagation(),children:t(e,{value:a,onChange:(e,t=!1)=>{o(e),l.current=e,t&&(c&&clearTimeout(c),h(setTimeout((()=>{n(e)}),500)))},onSave:p,onCancel:s})})})})}function Ft(e){const t=e.target;return!(!t.closest||!t.closest(".schema-type-suggest-popup"))}function Rt({schema:r,readonly:n=!1}){return e("ul",{className:"",children:[r.children.map((e=>Vt(e,n))),n?null:t(Bt,{parent:r.root})]})}function Vt(e,r){return e.isParent?t(zt,{property:e,readonly:r},e.name):t(_t,{node:e,readonly:r},e.name)}function _t({node:e,readonly:r}){return t("li",{children:t(Kt,{property:e,readonly:r})})}function zt({property:r,readonly:n}){const[s,i]=d(!0);return e("li",{children:[e("div",{className:"flex items-center w-full",children:[t("button",{onClick:()=>i(!s),children:t(s?B:W,{className:"size-4"})}),t("div",{className:"flex-1",children:t(Kt,{property:r,readonly:n})})]}),s&&e("ul",{className:"ml-4 border-l border-gray-400 border-dashed",children:[(r.children||[]).map((e=>Vt(e,n))),n?null:t(Bt,{parent:r})]})]})}function Ut(e){return e?/^[a-zA-Z0-9_]+[?]?$/.test(e)?void 0:"Only letters, numbers, underscores or question mark are allowed (a-zA-Z0-9_?)":"Name is required"}function Kt({property:e,readonly:r}){const n=x(),s=e.resetIsNew(),i=kt(e);return t(Mt,{value:i,onChange:t=>{try{t.description&&"string"!=typeof t.description&&(t.description=void 0);const r=e.getUpdateFromNameAndTypeSignature(t.name,t.type);e.update({...r,description:t.description})&&e.reloadTree()}catch(e){return n({status:"error",title:"Invalid property declaration",description:e.message,duration:9e3}),!1}return!0},onDelete:()=>{e.remove(),e.reloadTree()},editor:jt,viewer:$t,outlineOnHover:!0,isEditing:s,skipClickOutside:Ft,readonly:r,onValidate:e=>Ut(e.name)})}function Bt({parent:r}){return e(j,{variant:"outline",onClick:()=>{const e=r.findAvailableChildName("new_property_");r.addChild(e,{isObject:!1,isArray:!1,isNullable:!1,name:gt.string},!0).isNew=!0,r.reloadTree()},children:[t(K,{className:"size-4"}),"Add property"]})}const Wt=o(void 0),Ht=Wt.Provider;function Jt(){const e=l(Wt);if(!e)throw new Error("useFieldSet must be used within a Form or FieldSet element");return e}const Gt=o(void 0);function Xt(){const e=l(Gt);if(!e)throw new Error("useForm must be used within a Form element");return e}const Zt=Gt.Provider;function Yt({htmlFor:r,required:n,children:s}){return e("label",{htmlFor:r,className:"block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200",children:[s,n&&t("sup",{className:"text-red-600",children:"*"})]})}function Qt({children:e}){return t("p",{className:"mt-2 text-sm text-gray-500",children:e})}function er({children:e}){return t("p",{className:"mt-2 text-sm text-red-600",children:e})}const tr=a.forwardRef((({object:e,type:r="text",onChange:n,...s},i)=>{const[a,o]=d(null!=e.value?String(e.value):""),[l,c]=d(e.schema.isBoolean&&!0===e.value);s.className?s.className=T(S.INPUT,s.className):s.className=S.INPUT;const h=t=>{o(t.target.value),e.schema.isBoolean?(e.value=t.target.checked,c(e.value)):e.value=t.target.value,n&&n(t)};return"textarea"===r?t("textarea",{ref:i,...s,value:a,onChange:h}):t("input","checkbox"===r?{ref:i,...s,type:"checkbox",checked:l,onChange:h,className:"form-check-input"}:{ref:i,...s,type:r,value:a,onChange:h})}));function rr({object:e,components:r,onSubmit:n,children:s,onChange:i}){return e.observer=i,t(Zt,{value:{object:e,components:r||{}},children:t("form",{className:"w-full",onSubmit:t=>{t.stopPropagation(),t.preventDefault(),n&&n(e.value)},children:s})})}function nr(){const e=Xt();return t("div",{className:"flex flex-col gap-4 w-full",children:e.object.properties.map(ir)})}function sr({children:r,...n}){return e(rr,{...n,children:[t(nr,{}),r]})}function ir(e){return e.isList?t(lr,{object:e},e.name):e.isObject?t(or,{object:e},e.name):t(ar,{object:e},e.name)}function ar({object:r,editor:n,inline:s=!1}){n||(n=r.schema.editor);const{components:i}=Xt(),a=n&&i[n]||tr,o=r.getInputType();"checkbox"===o&&(s=!0);return e("div",{className:"",children:[e("div",{className:T("flex gap-2",s?"flex-row items-center":"flex-col"),children:[!r.isListItem&&t(Yt,{required:r.schema.isRequired,children:r.title}),t(a,{object:r,type:o,onChange:e=>{const{value:t}=e.target;r.value=r.schema.isNumber?parseFloat(t):t}})]}),r.schema.description&&t(Qt,{children:r.schema.description})]})}function or({object:r}){return e("div",{className:"flex flex-col gap-4 my-4 py-2 pl-4 border-l-4 border-l-solid border-l-slate-100 dark:border-l-slate-600",children:[!r.isListItem&&t("div",{className:"text-gray-900 dark:text-gray-200 font-semibold",children:r.title}),r.properties.map(ir)]})}function lr({object:r}){const[n,s]=d(r.value||[]);return e("div",{className:"flex flex-col gap-4 my-4 py-2 pl-4 border-l-4 border-l-solid border-l-slate-100 darK:border-l-slate-600",children:[!r.isListItem&&t("div",{className:"text-gray-900 dark:text-gray-200 font-semibold",children:r.title}),r.items.map(((e,i)=>t(cr,{object:e,list:r,onDelete:()=>(e=>{r.remove(e),s([...r.value])})(i)},`${i}-${n[i]??""}`))),t("div",{children:e(j,{variant:"secondary",onClick:()=>{r.add(),s([...r.value])},children:[t(K,{className:"size-6"})," Add"]})})]})}function cr({list:r,object:n,onDelete:s}){return e("div",{className:"flex gap-2 w-full",children:[t("div",{className:"flex-1",children:(i=n,a=r.schema.arraySchema.editor,i.isList?t(lr,{object:i}):i.isObject?t(or,{object:i}):t(ar,{object:i,editor:a}))}),t(j,{variant:"secondary",onClick:s,children:t(z,{className:"size-4"})})]});var i,a}function dr({className:r,properties:n}){return t(I,{className:r,children:t("tbody",{children:n.map((r=>e("tr",{children:[t("td",{className:"w-1/3 font-semibold",children:t("span",{children:r.name})}),t("td",{className:"w-2/3",children:r.value??"undefined"})]},r.name)))})})}const hr=o(void 0);function ur(){return l(hr)}const pr=Symbol("__SLOT_NAME");function mr(e,t){const r=[];return p.forEach(e,(e=>{!function(e,t,r){let n;m(e)&&(n=e.type[pr])?r[n]=e:t.push(e)}(e,r,t)})),r.length>1?r:r[0]}function fr(e,t){t[pr]=e}function gr(e){return e?"boolean"==typeof e?{enabled:e}:e:{enabled:!1}}function yr(e){const r={};if(mr(e.children,r),!r.content)throw new Error("Popover must provide a content slot");const n=r.trigger?.props,s=r.content.props;return t(vr,{...e,trigger:n,content:s})}function vr({middleware:r,offset:n,trigger:s,dismiss:i=!0,content:a,placement:o,strategy:l,zIndex:c=40}){const[h,u]=d(!1),p=ee({open:h,placement:o,strategy:l,onOpenChange:u,middleware:r||[Z(n||4),Y(),Q()],whileElementsMounted:te}),{floatingStyles:m,refs:{setReference:f,setFloating:g},context:y}=p,v=re(y,gr(i)),b=ne(y,gr(!(x=s)||x.hover||x.click?x?.click:{enabled:!0}));var x;const w=se(y,gr(function(e){return!0===e?.hover?{enabled:!0,handleClose:ce({blockPointerEvents:!0}),restMs:0}:e?.hover}(s))),{getReferenceProps:N,getFloatingProps:k}=ie([v,b,w]),{isMounted:C,styles:j}=ae(y,a.transition);return e(hr.Provider,{value:{...p,close:()=>u(!1)},children:[s&&t("div",{className:T(s.className,"inline-block"),ref:f,...N(),children:s.children}),t(oe,{children:C&&t("div",{ref:g,style:{...m,zIndex:c},...k(),children:t(le,{context:y,children:t("div",{className:T(a.className,"bg-popover rounded-md text-popover-foreground max-w-md"),style:j,children:a.children})})})})]})}function br(e){return null}function xr(e){return null}function wr({onDrop:r,message:n,buttonLabel:s="Upload Files",allowFolders:i=!0,className:a=""}){const[o,l]=d(!1),c=u(null),h=u(null);return e("div",{className:`flex flex-col items-center justify-center py-12 border-2 rounded-lg transition-colors ${o?"border-color-primary bg-color-primary/10":"border-dashed border-color-border"} ${a}`,onDragOver:e=>{e.preventDefault(),e.dataTransfer.types.includes("Files")&&l(!0)},onDragLeave:e=>{e.preventDefault(),h.current&&!h.current.contains(e.relatedTarget)&&l(!1)},onDrop:async e=>{if(e.preventDefault(),l(!1),e.dataTransfer.items&&e.dataTransfer.items.length>0){const t=Array.from(e.dataTransfer.items),n=[],s=new Set,i=async e=>{if(e.isFile){const t=await new Promise((t=>{e.file((r=>{Object.defineProperty(r,"webkitRelativePath",{writable:!0,value:e.fullPath.substring(1)}),t(r)}))}));!t.name.startsWith(".")&&t.size>0&&n.push(t);const r=e.fullPath.substring(1).split("/").slice(0,-1).join("/");r&&s.add(r)}else if(e.isDirectory){const t=e.createReader(),r=await new Promise((e=>{t.readEntries((t=>{e(t)}))}));await Promise.all(r.map(i));const n=e.fullPath.substring(1);n&&s.add(n)}};try{if(await Promise.all(t.map((e=>{const t=e.webkitGetAsEntry?e.webkitGetAsEntry():e;return t?i(t):Promise.resolve()}))),n.length>0){const e=new Set(Array.from(s).map((e=>e.split("/")[0])).filter(Boolean)).size,t=n.length;let i="";i=e>0?1===e?`Preparing to upload 1 folder with ${t} files...`:`Preparing to upload ${e} folders with ${t} files...`:`Preparing to upload ${t} file${1===t?"":"s"}...`,r(n,{count:n.length,message:i})}}catch(t){console.error("Error processing dropped files:",t);const n=Array.from(e.dataTransfer.files);n.length>0&&r(n)}}else if(e.dataTransfer.files&&e.dataTransfer.files.length>0){const t=Array.from(e.dataTransfer.files);r(t)}},children:[t(H,{className:"h-12 w-12 mb-3 transition-colors "+(o?"text-primary":"text-muted/50")}),t("p",{className:"text-color-muted-foreground",children:n}),e("div",{className:"mt-4 text-center",children:[e("div",{className:"text-sm text-muted mb-2",children:["Drag and drop files",i?" or folders":""," here, or"]}),e(j,{onClick:()=>{c.current&&c.current.click()},children:[t(H,{className:"h-4 w-4 mr-2"}),s]}),t("input",{type:"file",ref:c,onChange:e=>{if(e.target.files&&e.target.files.length>0){const t=Array.from(e.target.files);if(t.some((e=>e.webkitRelativePath&&e.webkitRelativePath.includes("/")))){const e=new Set(t.map((e=>e.webkitRelativePath?.split("/")[0])).filter(Boolean)).size,n=t.length,s=1===e?`Preparing to upload 1 folder with ${n} files...`:`Preparing to upload ${e} folders with ${n} files...`,i={count:t.length,message:s};r(t,i)}else{const e={count:t.length,message:`Preparing to upload ${t.length} file${1===t.length?"":"s"}...`};r(t,e)}}},multiple:!0,webkitdirectory:i?"":void 0,directory:i?"":void 0,className:"hidden"})]})]})}function Nr({title:r,count:n,icon:s=t(J,{className:"h-4 w-4 text-green-500"}),items:i}){const[a,o]=d(!1);return e("div",{className:"border border-color-border rounded-md overflow-hidden",children:[e("div",{className:"flex items-center justify-between p-3 bg-color-muted/10 cursor-pointer",onClick:()=>o(!a),children:[e("div",{className:"flex items-center",children:[t("span",{className:"mr-2",children:s}),t("span",{className:"font-medium",children:r}),t("span",{className:"ml-2 px-2 py-0.5 bg-color-muted/20 rounded-full text-xs",children:n})]}),t("button",{className:"text-muted",children:t("svg",{className:"h-5 w-5 transition-transform "+(a?"transform rotate-180":""),fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:t("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})})]}),a&&t("div",{className:"p-3 border-t border-color-border max-h-48 overflow-y-auto",children:i.length>0?t("ul",{className:"space-y-1",children:i.map(((e,r)=>t("li",{className:"text-sm py-1 px-2 rounded hover:bg-color-muted/10",children:e},r)))}):t("div",{className:"text-sm text-muted py-2",children:"No items to display"})})]})}function kr({files:r,className:n="",location:s,collection:i}){const a=r.filter((e=>"success"===e.status)),o=r.filter((e=>"updated"===e.status)),l=r.filter((e=>"skipped"===e.status)),c=r.filter((e=>"failed"===e.status)),d=a.length,h=o.length,u=l.length,p=c.length,m=r.length;return e("div",{className:`flex flex-col py-6 ${n}`,children:[e("div",{className:"flex items-center mb-4",children:[t("div",{className:"w-12 h-12 mr-4 rounded-full bg-color-success/10 flex items-center justify-center",children:t(J,{className:"h-6 w-6 text-color-success"})}),e("div",{children:[t("p",{className:"text-lg font-medium text-color-success",children:"Upload Complete"}),e("p",{className:"text-muted",children:[m," file",1!==m?"s":""," processed",i?` in collection '${i}'`:"",s?` in folder '${s}'`:""]})]})]}),e("div",{className:"space-y-3 mt-2",children:[d>0&&t(Nr,{title:"Successfully Uploaded",count:d,icon:t(J,{className:"h-4 w-4 text-green-500"}),items:a.map((e=>e.name))}),h>0&&t(Nr,{title:"Successfully Updated",count:h,icon:t(J,{className:"h-4 w-4 text-blue-500"}),items:o.map((e=>e.name))}),u>0&&t(Nr,{title:"Skipped (Already Existed)",count:u,icon:t(G,{className:"h-4 w-4 text-amber-500"}),items:l.map((e=>e.name))}),p>0&&t(Nr,{title:"Failed to Upload",count:p,icon:t(X,{className:"h-4 w-4 text-red-500"}),items:c.map((e=>e.name))})]})]})}function Cr({percent:e}){return t("div",{className:"w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700",children:t("div",{className:"bg-blue-600 h-2.5 rounded-full",style:{width:`${e}%`}})})}fr("trigger",br),fr("content",xr),yr.Trigger=br,yr.Content=xr;export{Ke as ArrayPropertySchema,pt as CodeMirrorEditor,wr as DropZone,ht as EditorApi,Ht as FieldSetContextProvider,rr as Form,Zt as FormContextProvider,er as FormError,Qt as FormHelper,Yt as FormLabel,sr as GeneratedForm,tr as Input,_e as JSONCode,ct as JSONDisplay,ft as JSONSchemaEditorModal,tt as JSONView,Qe as ManageObjectEntry,Ye as ManagedListProperty,Ge as ManagedObject,Je as ManagedObjectBase,Xe as ManagedObjectProperty,Ze as ManagedProperty,et as ManagedScalarEntry,wt as ManagedSchema,He as Node,yr as Popover,hr as PopoverContext,Cr as Progress,dr as PropertiesView,jt as PropertyEditor,St as PropertyNameEditor,Ue as PropertySchema,$t as PropertyViewer,ar as ScalarField,ze as Schema,Rt as SchemaEditor,Nt as SchemaNode,Nr as UploadResultCategory,kr as UploadSummary,Ie as XMLViewer,Be as computeTitleFromName,kt as getEditableSchemaProperty,Jt as useFieldSet,Xt as useForm,ur as usePopoverContext,Et as useSchema,Ut as validatePropertyName};
2
2
  //# sourceMappingURL=vertesia-ui-widgets.js.map