@vertesia/ui 0.78.0 → 0.79.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/lib/esm/core/components/Panel.js +8 -0
  2. package/lib/esm/core/components/Panel.js.map +1 -0
  3. package/lib/esm/core/components/SelectBox.js +1 -1
  4. package/lib/esm/core/components/SelectBox.js.map +1 -1
  5. package/lib/esm/core/components/SelectList.js +18 -13
  6. package/lib/esm/core/components/SelectList.js.map +1 -1
  7. package/lib/esm/core/components/SidePanel.js +2 -2
  8. package/lib/esm/core/components/SidePanel.js.map +1 -1
  9. package/lib/esm/core/components/index.js +1 -1
  10. package/lib/esm/core/components/index.js.map +1 -1
  11. package/lib/esm/core/components/shadcn/breadcrumb.js +29 -8
  12. package/lib/esm/core/components/shadcn/breadcrumb.js.map +1 -1
  13. package/lib/esm/core/components/shadcn/button.js +3 -2
  14. package/lib/esm/core/components/shadcn/button.js.map +1 -1
  15. package/lib/esm/core/components/shadcn/filters/filterBar.js +41 -14
  16. package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
  17. package/lib/esm/core/components/shadcn/index.js +2 -0
  18. package/lib/esm/core/components/shadcn/index.js.map +1 -1
  19. package/lib/esm/core/components/shadcn/input.js +4 -1
  20. package/lib/esm/core/components/shadcn/input.js.map +1 -1
  21. package/lib/esm/core/components/shadcn/resizeable.js +15 -0
  22. package/lib/esm/core/components/shadcn/resizeable.js.map +1 -0
  23. package/lib/esm/core/components/shadcn/selectBox.js +15 -9
  24. package/lib/esm/core/components/shadcn/selectBox.js.map +1 -1
  25. package/lib/esm/core/components/shadcn/tabs.js +20 -8
  26. package/lib/esm/core/components/shadcn/tabs.js.map +1 -1
  27. package/lib/esm/core/components/shadcn/textarea.js +7 -0
  28. package/lib/esm/core/components/shadcn/textarea.js.map +1 -0
  29. package/lib/esm/core/components/table/index.js +1 -1
  30. package/lib/esm/core/components/table/index.js.map +1 -1
  31. package/lib/esm/core/hooks/CompositeState.js +139 -1
  32. package/lib/esm/core/hooks/CompositeState.js.map +1 -1
  33. package/lib/esm/core/hooks/index.js +1 -0
  34. package/lib/esm/core/hooks/index.js.map +1 -1
  35. package/lib/esm/core/hooks/useScrollableSearch.js +92 -0
  36. package/lib/esm/core/hooks/useScrollableSearch.js.map +1 -0
  37. package/lib/esm/env/index.js +1 -1
  38. package/lib/esm/env/index.js.map +1 -1
  39. package/lib/esm/features/agent/PayloadBuilder.js +80 -55
  40. package/lib/esm/features/agent/PayloadBuilder.js.map +1 -1
  41. package/lib/esm/features/agent/chat/ModernAgentConversation.js +22 -24
  42. package/lib/esm/features/agent/chat/ModernAgentConversation.js.map +1 -1
  43. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +2 -3
  44. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  45. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js +2 -2
  46. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  47. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js +15 -20
  48. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js.map +1 -1
  49. package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js +1 -0
  50. package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js.map +1 -1
  51. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js +3 -3
  52. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js.map +1 -1
  53. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +6 -6
  54. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
  55. package/lib/esm/features/facets/CollectionsFacetsNav.js +85 -0
  56. package/lib/esm/features/facets/CollectionsFacetsNav.js.map +1 -0
  57. package/lib/esm/features/facets/DocumentsFacetsNav.js +19 -7
  58. package/lib/esm/features/facets/DocumentsFacetsNav.js.map +1 -1
  59. package/lib/esm/features/facets/EnvironmentFacet.js +1 -1
  60. package/lib/esm/features/facets/EnvironmentFacet.js.map +1 -1
  61. package/lib/esm/features/facets/InteractionsFacetsNav.js +88 -0
  62. package/lib/esm/features/facets/InteractionsFacetsNav.js.map +1 -0
  63. package/lib/esm/features/facets/PromptsFacetsNav.js +80 -0
  64. package/lib/esm/features/facets/PromptsFacetsNav.js.map +1 -0
  65. package/lib/esm/features/facets/RunsFacetsNav.js +28 -6
  66. package/lib/esm/features/facets/RunsFacetsNav.js.map +1 -1
  67. package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js +7 -5
  68. package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js.map +1 -1
  69. package/lib/esm/features/facets/index.js +10 -8
  70. package/lib/esm/features/facets/index.js.map +1 -1
  71. package/lib/esm/features/facets/utils/SearchInterface.js +2 -0
  72. package/lib/esm/features/facets/utils/SearchInterface.js.map +1 -0
  73. package/lib/esm/features/facets/utils/StringFacet.js.map +1 -0
  74. package/lib/esm/features/facets/utils/StringListFacet.js.map +1 -0
  75. package/lib/esm/features/facets/utils/TypeFacet.js.map +1 -0
  76. package/lib/esm/features/facets/utils/VEnvironmentFacet.js.map +1 -0
  77. package/lib/esm/features/facets/utils/VInteractionFacet.js.map +1 -0
  78. package/lib/esm/features/facets/utils/VStringFacet.js.map +1 -0
  79. package/lib/esm/features/facets/{VTypeFacet.js → utils/VTypeFacet.js} +9 -4
  80. package/lib/esm/features/facets/utils/VTypeFacet.js.map +1 -0
  81. package/lib/esm/features/facets/{VUserFacet.js → utils/VUserFacet.js} +1 -1
  82. package/lib/esm/features/facets/utils/VUserFacet.js.map +1 -0
  83. package/lib/esm/features/facets/utils/utils.js.map +1 -0
  84. package/lib/esm/features/layout/GenericPageNavHeader.js +58 -5
  85. package/lib/esm/features/layout/GenericPageNavHeader.js.map +1 -1
  86. package/lib/esm/features/store/collections/BrowseCollectionView.js +3 -0
  87. package/lib/esm/features/store/collections/BrowseCollectionView.js.map +1 -1
  88. package/lib/esm/features/store/collections/CreateCollection.js +2 -2
  89. package/lib/esm/features/store/collections/CreateCollection.js.map +1 -1
  90. package/lib/esm/features/store/collections/EditCollectionView.js +43 -31
  91. package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
  92. package/lib/esm/features/store/collections/SelectCollection.js +46 -16
  93. package/lib/esm/features/store/collections/SelectCollection.js.map +1 -1
  94. package/lib/esm/features/store/objects/DocumentSearchResults.js +43 -13
  95. package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -1
  96. package/lib/esm/features/store/objects/DocumentTable.js +6 -6
  97. package/lib/esm/features/store/objects/DocumentTable.js.map +1 -1
  98. package/lib/esm/features/store/objects/components/ContentOverview.js +225 -87
  99. package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
  100. package/lib/esm/features/store/objects/components/DocumentIcon.js +11 -3
  101. package/lib/esm/features/store/objects/components/DocumentIcon.js.map +1 -1
  102. package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js +11 -2
  103. package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js.map +1 -1
  104. package/lib/esm/features/store/objects/components/useDownloadObject.js +2 -2
  105. package/lib/esm/features/store/objects/components/useDownloadObject.js.map +1 -1
  106. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js +13 -1
  107. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js.map +1 -1
  108. package/lib/esm/features/store/objects/layout/documentLayout.js +7 -8
  109. package/lib/esm/features/store/objects/layout/documentLayout.js.map +1 -1
  110. package/lib/esm/features/store/objects/layout/renderers.js +28 -12
  111. package/lib/esm/features/store/objects/layout/renderers.js.map +1 -1
  112. package/lib/esm/features/store/objects/search/DocumentSearchContext.js +5 -1
  113. package/lib/esm/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  114. package/lib/esm/features/store/objects/search/DocumentSearchProvider.js +1 -1
  115. package/lib/esm/features/store/objects/search/DocumentSearchProvider.js.map +1 -1
  116. package/lib/esm/features/store/objects/selection/ObjectsActionContext.js +3 -2
  117. package/lib/esm/features/store/objects/selection/ObjectsActionContext.js.map +1 -1
  118. package/lib/esm/features/store/objects/selection/SelectionActions.js +2 -0
  119. package/lib/esm/features/store/objects/selection/SelectionActions.js.map +1 -1
  120. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js +12 -4
  121. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js.map +1 -1
  122. package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js +20 -2
  123. package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js.map +1 -1
  124. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js +16 -8
  125. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  126. package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js +1 -1
  127. package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js.map +1 -1
  128. package/lib/esm/features/store/types/ObjectSchemaEditor.js +1 -1
  129. package/lib/esm/features/store/types/ObjectSchemaEditor.js.map +1 -1
  130. package/lib/esm/features/user/UserInfo.js +35 -1
  131. package/lib/esm/features/user/UserInfo.js.map +1 -1
  132. package/lib/esm/router/HistoryNavigator.js +25 -2
  133. package/lib/esm/router/HistoryNavigator.js.map +1 -1
  134. package/lib/esm/router/Nav.js +3 -3
  135. package/lib/esm/router/Nav.js.map +1 -1
  136. package/lib/esm/session/UserSession.js +1 -0
  137. package/lib/esm/session/UserSession.js.map +1 -1
  138. package/lib/esm/session/UserSessionProvider.js +9 -2
  139. package/lib/esm/session/UserSessionProvider.js.map +1 -1
  140. package/lib/esm/session/auth/composable.js +66 -67
  141. package/lib/esm/session/auth/composable.js.map +1 -1
  142. package/lib/esm/shell/login/UserInfo.js +1 -1
  143. package/lib/esm/shell/login/UserInfo.js.map +1 -1
  144. package/lib/esm/widgets/form/Form.js +17 -30
  145. package/lib/esm/widgets/form/Form.js.map +1 -1
  146. package/lib/esm/widgets/form/FormContext.js +4 -2
  147. package/lib/esm/widgets/form/FormContext.js.map +1 -1
  148. package/lib/esm/widgets/form/ManagedObject.js +4 -0
  149. package/lib/esm/widgets/form/ManagedObject.js.map +1 -1
  150. package/lib/esm/widgets/form/fields.js +4 -3
  151. package/lib/esm/widgets/form/fields.js.map +1 -1
  152. package/lib/esm/widgets/form/inputs.js +2 -0
  153. package/lib/esm/widgets/form/inputs.js.map +1 -1
  154. package/lib/esm/widgets/schema-editor/index.js +0 -1
  155. package/lib/esm/widgets/schema-editor/index.js.map +1 -1
  156. package/lib/tsconfig.tsbuildinfo +1 -1
  157. package/lib/types/core/components/Panel.d.ts +11 -0
  158. package/lib/types/core/components/Panel.d.ts.map +1 -0
  159. package/lib/types/core/components/SelectList.d.ts +2 -1
  160. package/lib/types/core/components/SelectList.d.ts.map +1 -1
  161. package/lib/types/core/components/SidePanel.d.ts.map +1 -1
  162. package/lib/types/core/components/index.d.ts +1 -1
  163. package/lib/types/core/components/index.d.ts.map +1 -1
  164. package/lib/types/core/components/shadcn/breadcrumb.d.ts +3 -2
  165. package/lib/types/core/components/shadcn/breadcrumb.d.ts.map +1 -1
  166. package/lib/types/core/components/shadcn/button.d.ts.map +1 -1
  167. package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  168. package/lib/types/core/components/shadcn/index.d.ts +2 -0
  169. package/lib/types/core/components/shadcn/index.d.ts.map +1 -1
  170. package/lib/types/core/components/shadcn/input.d.ts.map +1 -1
  171. package/lib/types/core/components/shadcn/resizeable.d.ts +9 -0
  172. package/lib/types/core/components/shadcn/resizeable.d.ts.map +1 -0
  173. package/lib/types/core/components/shadcn/selectBox.d.ts +3 -2
  174. package/lib/types/core/components/shadcn/selectBox.d.ts.map +1 -1
  175. package/lib/types/core/components/shadcn/tabs.d.ts +2 -1
  176. package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -1
  177. package/lib/types/core/components/shadcn/textarea.d.ts +4 -0
  178. package/lib/types/core/components/shadcn/textarea.d.ts.map +1 -0
  179. package/lib/types/core/hooks/CompositeState.d.ts +115 -6
  180. package/lib/types/core/hooks/CompositeState.d.ts.map +1 -1
  181. package/lib/types/core/hooks/index.d.ts +1 -0
  182. package/lib/types/core/hooks/index.d.ts.map +1 -1
  183. package/lib/types/core/hooks/useScrollableSearch.d.ts +82 -0
  184. package/lib/types/core/hooks/useScrollableSearch.d.ts.map +1 -0
  185. package/lib/types/env/index.d.ts +3 -1
  186. package/lib/types/env/index.d.ts.map +1 -1
  187. package/lib/types/features/agent/PayloadBuilder.d.ts +11 -19
  188. package/lib/types/features/agent/PayloadBuilder.d.ts.map +1 -1
  189. package/lib/types/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  190. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +1 -1
  191. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  192. package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  193. package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts.map +1 -1
  194. package/lib/types/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts.map +1 -1
  195. package/lib/types/features/facets/CollectionsFacetsNav.d.ts +14 -0
  196. package/lib/types/features/facets/CollectionsFacetsNav.d.ts.map +1 -0
  197. package/lib/types/features/facets/DocumentsFacetsNav.d.ts +1 -1
  198. package/lib/types/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
  199. package/lib/types/features/facets/InteractionsFacetsNav.d.ts +14 -0
  200. package/lib/types/features/facets/InteractionsFacetsNav.d.ts.map +1 -0
  201. package/lib/types/features/facets/PromptsFacetsNav.d.ts +15 -0
  202. package/lib/types/features/facets/PromptsFacetsNav.d.ts.map +1 -0
  203. package/lib/types/features/facets/RunsFacetsNav.d.ts +1 -1
  204. package/lib/types/features/facets/RunsFacetsNav.d.ts.map +1 -1
  205. package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts +1 -1
  206. package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
  207. package/lib/types/features/facets/index.d.ts +10 -8
  208. package/lib/types/features/facets/index.d.ts.map +1 -1
  209. package/lib/types/features/facets/utils/SearchInterface.d.ts +14 -0
  210. package/lib/types/features/facets/utils/SearchInterface.d.ts.map +1 -0
  211. package/lib/types/features/facets/utils/StringFacet.d.ts.map +1 -0
  212. package/lib/types/features/facets/utils/StringListFacet.d.ts.map +1 -0
  213. package/lib/types/features/facets/utils/TypeFacet.d.ts.map +1 -0
  214. package/lib/types/features/facets/utils/VEnvironmentFacet.d.ts.map +1 -0
  215. package/lib/types/features/facets/utils/VInteractionFacet.d.ts.map +1 -0
  216. package/lib/types/features/facets/utils/VStringFacet.d.ts.map +1 -0
  217. package/lib/types/features/facets/{VTypeFacet.d.ts → utils/VTypeFacet.d.ts} +2 -1
  218. package/lib/types/features/facets/utils/VTypeFacet.d.ts.map +1 -0
  219. package/lib/types/features/facets/utils/VUserFacet.d.ts.map +1 -0
  220. package/lib/types/features/facets/utils/utils.d.ts.map +1 -0
  221. package/lib/types/features/layout/GenericPageNavHeader.d.ts +2 -1
  222. package/lib/types/features/layout/GenericPageNavHeader.d.ts.map +1 -1
  223. package/lib/types/features/store/collections/BrowseCollectionView.d.ts.map +1 -1
  224. package/lib/types/features/store/collections/CreateCollection.d.ts.map +1 -1
  225. package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -1
  226. package/lib/types/features/store/collections/SelectCollection.d.ts +12 -8
  227. package/lib/types/features/store/collections/SelectCollection.d.ts.map +1 -1
  228. package/lib/types/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  229. package/lib/types/features/store/objects/DocumentTable.d.ts +4 -0
  230. package/lib/types/features/store/objects/DocumentTable.d.ts.map +1 -1
  231. package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  232. package/lib/types/features/store/objects/components/DocumentIcon.d.ts +7 -1
  233. package/lib/types/features/store/objects/components/DocumentIcon.d.ts.map +1 -1
  234. package/lib/types/features/store/objects/components/SaveVersionConfirmModal.d.ts.map +1 -1
  235. package/lib/types/features/store/objects/components/useDownloadObject.d.ts +1 -1
  236. package/lib/types/features/store/objects/components/useDownloadObject.d.ts.map +1 -1
  237. package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts +2 -1
  238. package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts.map +1 -1
  239. package/lib/types/features/store/objects/layout/documentLayout.d.ts +4 -2
  240. package/lib/types/features/store/objects/layout/documentLayout.d.ts.map +1 -1
  241. package/lib/types/features/store/objects/layout/renderers.d.ts +1 -1
  242. package/lib/types/features/store/objects/layout/renderers.d.ts.map +1 -1
  243. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts +2 -3
  244. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  245. package/lib/types/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -1
  246. package/lib/types/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
  247. package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts +1 -0
  248. package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts.map +1 -1
  249. package/lib/types/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -1
  250. package/lib/types/features/user/UserInfo.d.ts +12 -1
  251. package/lib/types/features/user/UserInfo.d.ts.map +1 -1
  252. package/lib/types/router/HistoryNavigator.d.ts.map +1 -1
  253. package/lib/types/router/Nav.d.ts +2 -1
  254. package/lib/types/router/Nav.d.ts.map +1 -1
  255. package/lib/types/session/UserSession.d.ts.map +1 -1
  256. package/lib/types/session/UserSessionProvider.d.ts.map +1 -1
  257. package/lib/types/session/auth/composable.d.ts.map +1 -1
  258. package/lib/types/widgets/form/Form.d.ts +2 -1
  259. package/lib/types/widgets/form/Form.d.ts.map +1 -1
  260. package/lib/types/widgets/form/FormContext.d.ts +5 -2
  261. package/lib/types/widgets/form/FormContext.d.ts.map +1 -1
  262. package/lib/types/widgets/form/ManagedObject.d.ts.map +1 -1
  263. package/lib/types/widgets/form/fields.d.ts +2 -2
  264. package/lib/types/widgets/form/fields.d.ts.map +1 -1
  265. package/lib/types/widgets/form/inputs.d.ts.map +1 -1
  266. package/lib/types/widgets/schema-editor/index.d.ts +0 -1
  267. package/lib/types/widgets/schema-editor/index.d.ts.map +1 -1
  268. package/lib/vertesia-ui-core.js +1 -1
  269. package/lib/vertesia-ui-core.js.map +1 -1
  270. package/lib/vertesia-ui-env.js +1 -1
  271. package/lib/vertesia-ui-env.js.map +1 -1
  272. package/lib/vertesia-ui-features.js +1 -1
  273. package/lib/vertesia-ui-features.js.map +1 -1
  274. package/lib/vertesia-ui-router.js +1 -1
  275. package/lib/vertesia-ui-router.js.map +1 -1
  276. package/lib/vertesia-ui-session.js +1 -1
  277. package/lib/vertesia-ui-session.js.map +1 -1
  278. package/lib/vertesia-ui-shell.js +1 -1
  279. package/lib/vertesia-ui-shell.js.map +1 -1
  280. package/lib/vertesia-ui-widgets.js +1 -1
  281. package/lib/vertesia-ui-widgets.js.map +1 -1
  282. package/package.json +166 -165
  283. package/src/core/components/Panel.tsx +34 -0
  284. package/src/core/components/SelectList.tsx +11 -1
  285. package/src/core/components/SidePanel.tsx +18 -13
  286. package/src/core/components/index.ts +1 -1
  287. package/src/core/components/shadcn/breadcrumb.tsx +49 -30
  288. package/src/core/components/shadcn/button.tsx +3 -2
  289. package/src/core/components/shadcn/filters/filterBar.tsx +49 -23
  290. package/src/core/components/shadcn/index.ts +2 -0
  291. package/src/core/components/shadcn/input.tsx +10 -7
  292. package/src/core/components/shadcn/resizeable.tsx +54 -0
  293. package/src/core/components/shadcn/selectBox.tsx +87 -67
  294. package/src/core/components/shadcn/tabs.tsx +25 -8
  295. package/src/core/components/shadcn/textarea.tsx +21 -0
  296. package/src/core/components/table/index.tsx +1 -1
  297. package/src/core/hooks/index.ts +1 -0
  298. package/src/core/hooks/useScrollableSearch.tsx +193 -0
  299. package/src/features/agent/chat/ModernAgentConversation.tsx +109 -118
  300. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +2 -22
  301. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +1 -9
  302. package/src/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.tsx +39 -55
  303. package/src/features/agent/chat/ModernAgentOutput/PlanPanel.tsx +1 -0
  304. package/src/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.tsx +8 -8
  305. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +8 -8
  306. package/src/features/facets/CollectionsFacetsNav.tsx +115 -0
  307. package/src/features/facets/DocumentsFacetsNav.tsx +22 -11
  308. package/src/features/facets/EnvironmentFacet.tsx +1 -1
  309. package/src/features/facets/InteractionsFacetsNav.tsx +121 -0
  310. package/src/features/facets/PromptsFacetsNav.tsx +110 -0
  311. package/src/features/facets/RunsFacetsNav.tsx +40 -9
  312. package/src/features/facets/WorkflowExecutionsFacetsNav.tsx +10 -8
  313. package/src/features/facets/index.ts +11 -9
  314. package/src/features/facets/utils/SearchInterface.tsx +12 -0
  315. package/src/features/facets/{VTypeFacet.tsx → utils/VTypeFacet.tsx} +12 -5
  316. package/src/features/facets/{VUserFacet.tsx → utils/VUserFacet.tsx} +1 -1
  317. package/src/features/layout/GenericPageNavHeader.tsx +73 -10
  318. package/src/features/store/collections/BrowseCollectionView.tsx +4 -0
  319. package/src/features/store/collections/CreateCollection.tsx +3 -4
  320. package/src/features/store/collections/EditCollectionView.tsx +104 -85
  321. package/src/features/store/collections/SelectCollection.tsx +214 -29
  322. package/src/features/store/objects/DocumentSearchResults.tsx +98 -27
  323. package/src/features/store/objects/DocumentTable.tsx +14 -4
  324. package/src/features/store/objects/components/ContentOverview.tsx +536 -267
  325. package/src/features/store/objects/components/DocumentIcon.tsx +42 -13
  326. package/src/features/store/objects/components/SaveVersionConfirmModal.tsx +12 -2
  327. package/src/features/store/objects/layout/DocumentTableColumn.tsx +16 -1
  328. package/src/features/store/objects/layout/documentLayout.tsx +10 -12
  329. package/src/features/store/objects/layout/knowledge.md +10 -10
  330. package/src/features/store/objects/layout/renderers.tsx +39 -18
  331. package/src/features/store/objects/search/DocumentSearchContext.ts +6 -1
  332. package/src/features/store/objects/search/DocumentSearchProvider.tsx +1 -1
  333. package/src/features/store/objects/selection/ObjectsActionContext.tsx +3 -2
  334. package/src/features/store/objects/selection/SelectionActions.tsx +2 -0
  335. package/src/features/store/objects/selection/actions/AddToCollectionAction.tsx +23 -10
  336. package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +22 -2
  337. package/src/features/store/objects/upload/DocumentUploadModal.tsx +23 -15
  338. package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +10 -7
  339. package/src/features/store/types/CreateOrUpdateTypeModal.tsx +1 -1
  340. package/src/features/store/types/ObjectSchemaEditor.tsx +1 -1
  341. package/src/features/user/UserInfo.tsx +66 -3
  342. package/src/router/HistoryNavigator.ts +33 -2
  343. package/src/router/Nav.tsx +4 -3
  344. package/src/shell/login/UserInfo.tsx +1 -1
  345. package/src/widgets/form/Form.tsx +19 -43
  346. package/src/widgets/form/FormContext.ts +5 -2
  347. package/src/widgets/form/fields.tsx +8 -6
  348. package/src/widgets/form/inputs.tsx +1 -0
  349. package/src/widgets/schema-editor/index.ts +0 -1
  350. package/lib/esm/core/components/Textarea.js +0 -15
  351. package/lib/esm/core/components/Textarea.js.map +0 -1
  352. package/lib/esm/features/facets/FacetsNav.js +0 -8
  353. package/lib/esm/features/facets/FacetsNav.js.map +0 -1
  354. package/lib/esm/features/facets/StringFacet.js.map +0 -1
  355. package/lib/esm/features/facets/StringListFacet.js.map +0 -1
  356. package/lib/esm/features/facets/TypeFacet.js.map +0 -1
  357. package/lib/esm/features/facets/VEnvironmentFacet.js.map +0 -1
  358. package/lib/esm/features/facets/VFacetsNav.js +0 -48
  359. package/lib/esm/features/facets/VFacetsNav.js.map +0 -1
  360. package/lib/esm/features/facets/VInteractionFacet.js.map +0 -1
  361. package/lib/esm/features/facets/VStringFacet.js.map +0 -1
  362. package/lib/esm/features/facets/VTypeFacet.js.map +0 -1
  363. package/lib/esm/features/facets/VUserFacet.js.map +0 -1
  364. package/lib/esm/features/facets/utils.js.map +0 -1
  365. package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js +0 -49
  366. package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js.map +0 -1
  367. package/lib/types/core/components/Textarea.d.ts +0 -8
  368. package/lib/types/core/components/Textarea.d.ts.map +0 -1
  369. package/lib/types/features/facets/FacetsNav.d.ts +0 -7
  370. package/lib/types/features/facets/FacetsNav.d.ts.map +0 -1
  371. package/lib/types/features/facets/StringFacet.d.ts.map +0 -1
  372. package/lib/types/features/facets/StringListFacet.d.ts.map +0 -1
  373. package/lib/types/features/facets/TypeFacet.d.ts.map +0 -1
  374. package/lib/types/features/facets/VEnvironmentFacet.d.ts.map +0 -1
  375. package/lib/types/features/facets/VFacetsNav.d.ts +0 -16
  376. package/lib/types/features/facets/VFacetsNav.d.ts.map +0 -1
  377. package/lib/types/features/facets/VInteractionFacet.d.ts.map +0 -1
  378. package/lib/types/features/facets/VStringFacet.d.ts.map +0 -1
  379. package/lib/types/features/facets/VTypeFacet.d.ts.map +0 -1
  380. package/lib/types/features/facets/VUserFacet.d.ts.map +0 -1
  381. package/lib/types/features/facets/utils.d.ts.map +0 -1
  382. package/lib/types/widgets/schema-editor/JSONSchemaEditorModal.d.ts +0 -10
  383. package/lib/types/widgets/schema-editor/JSONSchemaEditorModal.d.ts.map +0 -1
  384. package/src/core/components/Textarea.tsx +0 -25
  385. package/src/features/facets/FacetsNav.tsx +0 -19
  386. package/src/features/facets/VFacetsNav.tsx +0 -81
  387. package/src/widgets/schema-editor/JSONSchemaEditorModal.tsx +0 -67
  388. /package/lib/esm/features/facets/{StringFacet.js → utils/StringFacet.js} +0 -0
  389. /package/lib/esm/features/facets/{StringListFacet.js → utils/StringListFacet.js} +0 -0
  390. /package/lib/esm/features/facets/{TypeFacet.js → utils/TypeFacet.js} +0 -0
  391. /package/lib/esm/features/facets/{VEnvironmentFacet.js → utils/VEnvironmentFacet.js} +0 -0
  392. /package/lib/esm/features/facets/{VInteractionFacet.js → utils/VInteractionFacet.js} +0 -0
  393. /package/lib/esm/features/facets/{VStringFacet.js → utils/VStringFacet.js} +0 -0
  394. /package/lib/esm/features/facets/{utils.js → utils/utils.js} +0 -0
  395. /package/lib/types/features/facets/{StringFacet.d.ts → utils/StringFacet.d.ts} +0 -0
  396. /package/lib/types/features/facets/{StringListFacet.d.ts → utils/StringListFacet.d.ts} +0 -0
  397. /package/lib/types/features/facets/{TypeFacet.d.ts → utils/TypeFacet.d.ts} +0 -0
  398. /package/lib/types/features/facets/{VEnvironmentFacet.d.ts → utils/VEnvironmentFacet.d.ts} +0 -0
  399. /package/lib/types/features/facets/{VInteractionFacet.d.ts → utils/VInteractionFacet.d.ts} +0 -0
  400. /package/lib/types/features/facets/{VStringFacet.d.ts → utils/VStringFacet.d.ts} +0 -0
  401. /package/lib/types/features/facets/{VUserFacet.d.ts → utils/VUserFacet.d.ts} +0 -0
  402. /package/lib/types/features/facets/{utils.d.ts → utils/utils.d.ts} +0 -0
  403. /package/src/features/facets/{StringFacet.tsx → utils/StringFacet.tsx} +0 -0
  404. /package/src/features/facets/{StringListFacet.tsx → utils/StringListFacet.tsx} +0 -0
  405. /package/src/features/facets/{TypeFacet.tsx → utils/TypeFacet.tsx} +0 -0
  406. /package/src/features/facets/{VEnvironmentFacet.tsx → utils/VEnvironmentFacet.tsx} +0 -0
  407. /package/src/features/facets/{VInteractionFacet.tsx → utils/VInteractionFacet.tsx} +0 -0
  408. /package/src/features/facets/{VStringFacet.tsx → utils/VStringFacet.tsx} +0 -0
  409. /package/src/features/facets/{utils.tsx → utils/utils.tsx} +0 -0
@@ -29,7 +29,8 @@ interface FilterProviderProps {
29
29
  const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterProviderProps) => {
30
30
  const url = new URL(window.location.href);
31
31
  const searchParams = url.searchParams;
32
-
32
+ const [hasInitialized, setHasInitialized] = React.useState(false);
33
+
33
34
  useEffect(() => {
34
35
  try {
35
36
  const params = new URLSearchParams(searchParams.toString());
@@ -42,16 +43,22 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
42
43
  // Handle stringList with direct string array - always array format
43
44
  values = `[${(filter.value as string[]).map(item => encodeURIComponent(item)).join(',')}]`;
44
45
  } else if (Array.isArray(filter.value)) {
45
- if (filter.multiple || filter.value.length > 1) {
46
- // Handle multiple values - use array format
47
- values = `[${filter.value.map((item: any) => encodeURIComponent(item.value || '')).join(',')}]`;
46
+ if (filter.multiple) {
47
+ // Handle multiple filters - always use array format for multiple=true
48
+ values = `[${filter.value.map((item: any) => encodeURIComponent(item.value || item || '')).join(',')}]`;
49
+ } else if (filter.value.length > 1) {
50
+ // Handle multiple values for non-multiple filters
51
+ values = `[${filter.value.map((item: any) => encodeURIComponent(item.value || item || '')).join(',')}]`;
48
52
  } else {
49
- // Single value in array - don't use array format
53
+ // Single value in array for non-multiple filter - don't use array format
50
54
  const firstValue = filter.value[0];
51
55
  if (typeof firstValue === 'string') {
52
56
  values = encodeURIComponent(firstValue);
57
+ } else if (typeof firstValue === 'object' && firstValue?.value !== undefined) {
58
+ // Handle FilterOption object
59
+ values = encodeURIComponent(String(firstValue.value));
53
60
  } else {
54
- values = encodeURIComponent(firstValue?.value || '');
61
+ values = encodeURIComponent(String(firstValue || ''));
55
62
  }
56
63
  }
57
64
  } else {
@@ -64,8 +71,8 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
64
71
  params.delete('filters');
65
72
  }
66
73
 
67
- const newUrl = `${window.location.pathname}?${params.toString()}`;
68
- window.history.replaceState({}, '', newUrl);
74
+ const newUrl = `${window.location.pathname}?${params.toString()}${window.location.hash}`;
75
+ window.history.replaceState(window.history.state || {}, '', newUrl);
69
76
  } catch (error) {
70
77
  console.error("Failed to update URL with filters:", error);
71
78
  }
@@ -73,14 +80,14 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
73
80
 
74
81
  useEffect(() => {
75
82
  const filtersParam = searchParams.get('filters');
76
- if (filtersParam) {
83
+ if (filtersParam && filterGroups.length > 0 && !hasInitialized) {
77
84
  try {
78
85
  // Parse format with array indicators: filterName:value or filterName:[value1,value2]
79
86
  const filterPairs = filtersParam.split(';');
80
87
  const parsedFilters = filterPairs.map(pair => {
81
88
  const [encodedName, valuesString] = pair.split(':');
82
89
  const name = decodeURIComponent(encodedName);
83
-
90
+
84
91
  let values: string[];
85
92
  // Check if it's an array format [value1,value2]
86
93
  if (valuesString.startsWith('[') && valuesString.endsWith(']')) {
@@ -100,8 +107,8 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
100
107
  filterValue = values;
101
108
  } else if (group?.type === 'text') {
102
109
  // For text, return FilterOption array (single value for text inputs)
103
- filterValue = values.length === 1 ? [{ value: values[0], label: values[0] }] :
104
- values.map(value => ({ value, label: value }));
110
+ filterValue = values.length === 1 ? [{ value: values[0], label: values[0] }] :
111
+ values.map(value => ({ value, label: value }));
105
112
  } else {
106
113
  // For other types, find options with labels
107
114
  filterValue = values.map(value => {
@@ -123,21 +130,40 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
123
130
  });
124
131
  }
125
132
 
126
- return {
133
+ if (group?.multiple && !valuesString.startsWith('[') && !valuesString.endsWith(']')) {
134
+ if (group.type === 'stringList') {
135
+ filterValue = values;
136
+ } else {
137
+ if (!Array.isArray(filterValue)) {
138
+ filterValue = [filterValue];
139
+ }
140
+ }
141
+ }
142
+
143
+ // Fallback: if group not found but we detected array format, assume it should be multiple
144
+ const shouldBeMultiple = group?.multiple || (!group && valuesString.startsWith('[') && valuesString.endsWith(']'));
145
+
146
+ const filter = {
127
147
  name,
128
148
  type: group?.type || 'select',
129
149
  placeholder: group?.placeholder,
130
150
  value: filterValue,
131
- multiple: group?.multiple || false
151
+ multiple: shouldBeMultiple
132
152
  };
153
+
154
+ return filter;
133
155
  });
134
156
 
135
157
  setFilters(parsedFilters);
158
+ setHasInitialized(true);
136
159
  } catch (error) {
137
- console.error("Failed to parse filters from URL:", error);
160
+ setHasInitialized(true);
138
161
  }
162
+ } else if (filterGroups.length > 0 && !hasInitialized) {
163
+ // No URL params but we have groups - mark as initialized
164
+ setHasInitialized(true);
139
165
  }
140
- }, []);
166
+ }, [filterGroups, hasInitialized]);
141
167
 
142
168
  return (
143
169
  <FilterContext.Provider value={{ filters, setFilters, filterGroups }}>
@@ -287,7 +313,7 @@ const FilterBtn = ({ className }: { className?: string }) => {
287
313
  {"Filter"}
288
314
  </Button>
289
315
  </PopoverTrigger>
290
- <PopoverContent className="w-[300px] p-0" align="start">
316
+ <PopoverContent className="w-[300px] p-0" align="start" sideOffset={4}>
291
317
  <Command>
292
318
  {
293
319
  filterGroups.find(group => group.name === selectedView)?.type === "select" && (
@@ -303,7 +329,7 @@ const FilterBtn = ({ className }: { className?: string }) => {
303
329
  />
304
330
  )
305
331
  }
306
- <CommandList className="max-h-[300px] overflow-y-auto">
332
+ <CommandList>
307
333
  <CommandGroup>
308
334
  {!selectedView ? getAvailableFilterGroups() : renderFilterOptions()}
309
335
  </CommandGroup>
@@ -316,7 +342,7 @@ const FilterBtn = ({ className }: { className?: string }) => {
316
342
 
317
343
  const FilterBar = ({ className }: { className?: string }) => {
318
344
  const { filters, setFilters, filterGroups } = React.useContext(FilterContext);
319
-
345
+
320
346
  return (
321
347
  <div className={cn(className)}>
322
348
  <Filters filters={filters} setFilters={setFilters} filterGroups={filterGroups} />
@@ -324,15 +350,15 @@ const FilterBar = ({ className }: { className?: string }) => {
324
350
  );
325
351
  };
326
352
 
327
- const FilterClear = ({ className }: { className?: string }) => {
353
+ const FilterClear = ({ className }: { className?: string}) => {
328
354
  const { filters, setFilters } = React.useContext(FilterContext);
329
-
355
+
330
356
  const hasActiveFilters = filters.filter((filter) => filter.value?.length > 0).length > 0;
331
-
357
+
332
358
  if (!hasActiveFilters) {
333
359
  return null;
334
360
  }
335
-
361
+
336
362
  return (
337
363
  <Button
338
364
  variant="outline"
@@ -20,3 +20,5 @@ export * from './command';
20
20
  export * from './checkbox';
21
21
  export * from './heading';
22
22
  export * from './text';
23
+ export * from './resizeable';
24
+ export * from './textarea';
@@ -4,6 +4,7 @@ import { cva, type VariantProps } from "class-variance-authority"
4
4
  import { cn } from "../libs/utils"
5
5
  import { X } from "lucide-react";
6
6
  import { ChangeEvent } from "react";
7
+ import { Button } from "@vertesia/ui/core";
7
8
 
8
9
  const variants = cva(
9
10
  "",
@@ -53,14 +54,14 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
53
54
  };
54
55
 
55
56
  return (
56
- <div className="w-full" style={{ position: 'relative', display: 'inline-block' }}>
57
+ <div className="w-full relative inline-block [&:hover_.clear-button]:opacity-100">
57
58
  <input
58
59
  type={type}
59
60
  className={
60
61
  cn(
61
62
  variants({ size, variant }),
62
63
  className,
63
- clearable && value ? "pr-6" : "",
64
+ clearable && value ? "pr-8" : "",
64
65
  )}
65
66
  ref={ref}
66
67
  value={value == null ? '' : value}
@@ -68,14 +69,16 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
68
69
  {...props}
69
70
  />
70
71
  {clearable && value && !props.readOnly && !props.disabled && (
71
- <button
72
- onClick={_onClear}
73
- className={`absolute ${type !== 'number' ? 'right-0' : 'right-7'} top-1/2 -translate-y-1/2 size-7 text-muted-foreground hover:text-destructive cursor-pointer flex items-center justify-center`}
72
+ <Button variant={"link"} size={"icon"}
74
73
  type="button"
75
- aria-label="Clear input"
74
+ onClick={_onClear}
75
+ className={`clear-button opacity-0 transition-opacity duration-200
76
+ absolute top-1/2 -translate-y-1/2 text-muted !hover:text-destructive cursor-pointer
77
+ flex items-center justify-center size-6 rounded right-2`}
78
+ alt="Clear input"
76
79
  >
77
80
  <X size={16} />
78
- </button>
81
+ </Button>
79
82
  )}
80
83
  </div>
81
84
  )
@@ -0,0 +1,54 @@
1
+ import * as React from "react"
2
+ import { Minus } from "lucide-react"
3
+ import * as ResizablePrimitive from "react-resizable-panels"
4
+
5
+ import { cn } from "../libs/utils"
6
+
7
+ function ResizablePanelGroup({
8
+ className,
9
+ ...props
10
+ }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) {
11
+ return (
12
+ <ResizablePrimitive.PanelGroup
13
+ data-slot="resizable-panel-group"
14
+ className={cn(
15
+ "flex h-full w-full data-[panel-group-direction=vertical]:flex-col",
16
+ className
17
+ )}
18
+ {...props}
19
+ />
20
+ )
21
+ }
22
+
23
+ function ResizablePanel({
24
+ ...props
25
+ }: React.ComponentProps<typeof ResizablePrimitive.Panel>) {
26
+ return <ResizablePrimitive.Panel data-slot="resizable-panel" {...props} />
27
+ }
28
+
29
+ function ResizableHandle({
30
+ withHandle,
31
+ className,
32
+ ...props
33
+ }: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
34
+ withHandle?: boolean
35
+ }) {
36
+ return (
37
+ <ResizablePrimitive.PanelResizeHandle
38
+ data-slot="resizable-handle"
39
+ className={cn(
40
+ "bg-muted focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:translate-x-0 data-[panel-group-direction=vertical]:after:-translate-y-1/2 [&[data-panel-group-direction=vertical]>div]:rotate-90",
41
+ className
42
+ )}
43
+ {...props}
44
+ >
45
+ {withHandle && (
46
+ <div className="z-10 flex size-4 items-center justify-center rounded-xs font-semibold">
47
+ <Minus className="size-4 rotate-90" />
48
+ </div>
49
+ )}
50
+ </ResizablePrimitive.PanelResizeHandle>
51
+ )
52
+ }
53
+
54
+ export { ResizablePanelGroup, ResizablePanel, ResizableHandle }
@@ -6,8 +6,9 @@ import { useState, useEffect, useRef } from 'react';
6
6
  import { Popover, PopoverContent, PopoverTrigger, PopoverClose } from './popover';
7
7
  import { Command, CommandEmpty, CommandGroup, CommandItem, CommandList } from './command';
8
8
  import { Input } from './input';
9
+ import { Button } from '@vertesia/ui/core';
9
10
 
10
- interface VSelectBoxBaseProps<T> {
11
+ export interface VSelectBoxBaseProps<T> {
11
12
  options: T[] | undefined;
12
13
  optionLabel?: (option: T) => React.ReactNode;
13
14
  onBlur?: () => void;
@@ -23,6 +24,7 @@ interface VSelectBoxBaseProps<T> {
23
24
  popupClass?: string;
24
25
  isClearable?: boolean;
25
26
  border?: boolean;
27
+ inline?: boolean;
26
28
  }
27
29
 
28
30
  interface VSelectBoxSingleProps<T> extends VSelectBoxBaseProps<T> {
@@ -39,7 +41,7 @@ interface VSelectBoxMultipleProps<T> extends VSelectBoxBaseProps<T> {
39
41
 
40
42
  type VSelectBoxProps<T> = VSelectBoxSingleProps<T> | VSelectBoxMultipleProps<T>;
41
43
 
42
- export function VSelectBox<T = any>({ options, optionLabel, value, onChange, addNew, addNewLabel, disabled, filterBy, label, placeholder, className, popupClass, isClearable, border = true, multiple = false, by }: Readonly<VSelectBoxProps<T>>) {
44
+ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, addNew, addNewLabel, disabled, filterBy, label, placeholder, className, popupClass, isClearable, border = true, multiple = false, by, inline = false }: Readonly<VSelectBoxProps<T>>) {
43
45
  const triggerRef = useRef<HTMLDivElement>(null);
44
46
  const [open, setOpen] = useState(false);
45
47
  const [width, setWidth] = useState<number>(0);
@@ -169,6 +171,82 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
169
171
  );
170
172
  };
171
173
 
174
+ // Render the options list content
175
+ const renderOptionsContent = () => (
176
+ <>
177
+ {filterBy && (
178
+ <div className='flex justify-start items-center mb-1'>
179
+ <div className='mx-2'>
180
+ <SearchIcon className="size-4" />
181
+ </div>
182
+ <Input variant='unstyled' value={filterValue} onChange={setFilterValue} className="w-full p-1 rounded-md" placeholder="Search..." />
183
+ </div>
184
+ )}
185
+ <Command className="overflow-hidden">
186
+ <CommandList className={inline ? "max-h-full overflow-y-auto" : "max-h-[200px] overflow-y-auto"}>
187
+ <CommandEmpty>No result found.</CommandEmpty>
188
+ <CommandGroup className="overflow-visible">
189
+ {filteredOptions?.map((opt, index) => {
190
+ const isSelected = multiple
191
+ ? isOptionSelected(opt, Array.isArray(value) ? value : [])
192
+ : value != null ? isOptionsEqual(value as T, opt) : false;
193
+
194
+ return (
195
+ <CommandItem
196
+ key={index}
197
+ onSelect={() => _onClick(opt)}
198
+ className="w-full"
199
+ >
200
+ {multiple || inline ? (
201
+ <div className='w-full flex justify-between items-center cursor-pointer'>
202
+ <div className='w-full truncate text-left'>
203
+ {optionLabel ? optionLabel(opt) : opt as String}
204
+ </div>
205
+ {isSelected && <Check className="size-4" />}
206
+ </div>
207
+ ) : (
208
+ <PopoverClose className='w-full flex justify-between items-center'>
209
+ <div className='w-full truncate text-left'>
210
+ {optionLabel ? optionLabel(opt) : opt as String}
211
+ </div>
212
+ {isSelected && <Check className="size-4" />}
213
+ </PopoverClose>
214
+ )}
215
+ </CommandItem>
216
+ );
217
+ })}
218
+ </CommandGroup>
219
+ </CommandList>
220
+ </Command>
221
+ {addNew && (
222
+ <div className='p-1'>
223
+ <a
224
+ onClick={addNew}
225
+ className={clsx(
226
+ 'gap-x-2 px-2 py-1.5 truncate group flex rounded-md items-center text-sm cursor-pointer hover:bg-accent',
227
+ )}
228
+ >
229
+ <SquarePlus size={16} strokeWidth={1.25} absoluteStrokeWidth />
230
+ {addNewLabel}
231
+ </a>
232
+ </div>
233
+ )}
234
+ </>
235
+ );
236
+
237
+ if (inline) {
238
+ return (
239
+ <div className={clsx(
240
+ className,
241
+ border && 'border border-border rounded-md',
242
+ "bg-popover p-1",
243
+ popupClass
244
+ )}>
245
+ {renderOptionsContent()}
246
+ </div>
247
+ );
248
+ }
249
+
172
250
  return (
173
251
  <Popover>
174
252
  <PopoverTrigger asChild>
@@ -178,7 +256,7 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
178
256
  className={clsx(
179
257
  className,
180
258
  border && 'border border-border',
181
- 'flex flex-row gap-2 items-center justify-between p-2 rounded-md group relative',
259
+ 'flex flex-row gap-2 items-center justify-between p-2 rounded-md group relative [&:hover_.clear-button]:opacity-100',
182
260
  !disabled ? "cursor-pointer hover:bg-muted" : "cursor-not-allowed text-muted",
183
261
  )}
184
262
  >
@@ -194,9 +272,10 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
194
272
  {multiple ? renderMultipleValue() : renderSingleValue()}
195
273
  </div>
196
274
  </div>
197
- <div className="flex items-center gap-1">
275
+ <div className="flex items-center gap-1 group">
198
276
  {isClearable && value && (Array.isArray(value) ? value.length > 0 : true) && (
199
- <div
277
+ <Button variant={"link"} size={"icon"}
278
+ alt="Clear selection"
200
279
  onClick={(e) => {
201
280
  e.stopPropagation();
202
281
  if (multiple) {
@@ -205,10 +284,10 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
205
284
  (onChange as (option: T) => void)(undefined as any);
206
285
  }
207
286
  }}
208
- className="cursor-pointer hover:bg-muted/20 rounded p-1"
287
+ className="cursor-pointer hover:bg-muted/20 clear-button opacity-0 transition-opacity duration-200 rounded p-1"
209
288
  >
210
289
  <X className="size-4" />
211
- </div>
290
+ </Button>
212
291
  )}
213
292
  {!disabled && (
214
293
  <ChevronsUpDown className="size-4 opacity-50" />
@@ -225,66 +304,7 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
225
304
  popupClass
226
305
  )}
227
306
  >
228
- {filterBy && (
229
-
230
- <div className='flex justify-start items-center mb-1'>
231
- <div className='mx-2'>
232
- <SearchIcon className="size-4" />
233
- </div>
234
- <Input variant='unstyled' value={filterValue} onChange={setFilterValue} className="w-full p-1 rounded-md" placeholder="Search..." />
235
- </div>
236
- )}
237
- <Command className="overflow-hidden">
238
- <CommandList className="max-h-[200px] overflow-y-auto">
239
- <CommandEmpty>No result found.</CommandEmpty>
240
- <CommandGroup className="overflow-visible">
241
- {filteredOptions?.map((opt, index) => {
242
- const isSelected = multiple
243
- ? isOptionSelected(opt, Array.isArray(value) ? value : [])
244
- : value != null ? isOptionsEqual(value as T, opt) : false;
245
-
246
- return (
247
- <CommandItem
248
- key={index}
249
- onSelect={() => _onClick(opt)}
250
- className="w-full"
251
- >
252
- {multiple ? (
253
- <div className='w-full flex justify-between items-center cursor-pointer'>
254
- <div className='w-full truncate text-left'>
255
- {optionLabel ? optionLabel(opt) : opt as String}
256
- </div>
257
- {isSelected && <Check className="size-4" />}
258
- </div>
259
- ) : (
260
- <PopoverClose className='w-full flex justify-between items-center'>
261
- <div className='w-full truncate text-left'>
262
- {optionLabel ? optionLabel(opt) : opt as String}
263
- </div>
264
- {isSelected && <Check className="size-4" />}
265
- </PopoverClose>
266
- )}
267
- </CommandItem>
268
- );
269
- })}
270
- </CommandGroup>
271
- </CommandList>
272
- </Command>
273
- {
274
- addNew && (
275
- <div className='p-1'>
276
- <a
277
- onClick={addNew}
278
- className={clsx(
279
- 'gap-x-2 px-2 py-1.5 truncate group flex rounded-md items-center text-sm cursor-pointer hover:bg-accent',
280
- )}
281
- >
282
- <SquarePlus size={16} strokeWidth={1.25} absoluteStrokeWidth />
283
- {addNewLabel}
284
- </a>
285
- </div>
286
- )
287
- }
307
+ {renderOptionsContent()}
288
308
  </PopoverContent>
289
309
  </Popover>
290
310
  );
@@ -12,13 +12,15 @@ const TabsContext = React.createContext<{
12
12
  setTab?: (name: string) => void;
13
13
  responsive?: boolean;
14
14
  variant?: "tabs" | "pills";
15
+ updateHash?: boolean;
15
16
  }>({
16
17
  size: undefined,
17
18
  tabs: undefined,
18
19
  current: undefined,
19
20
  setTab: undefined,
20
21
  responsive: false,
21
- variant: "tabs"
22
+ variant: "tabs",
23
+ updateHash: true
22
24
  });
23
25
 
24
26
  interface TabsProps {
@@ -31,6 +33,7 @@ interface TabsProps {
31
33
  onTabChange?: (tabName: string) => void;
32
34
  responsive?: boolean;
33
35
  variant?: "tabs" | "pills";
36
+ updateHash?: boolean;
34
37
  }
35
38
 
36
39
  const VTabs = ({
@@ -42,7 +45,8 @@ const VTabs = ({
42
45
  children,
43
46
  onTabChange,
44
47
  responsive = false,
45
- variant = "tabs"
48
+ variant = "tabs",
49
+ updateHash = true
46
50
  }: TabsProps) => {
47
51
  // Initialize value
48
52
  const [value, setValue] = React.useState(() => {
@@ -99,6 +103,15 @@ const VTabs = ({
99
103
 
100
104
  const handleValueChange = (newValue: string) => {
101
105
  setValue(newValue);
106
+
107
+ // Update the URL hash when tab changes (only if updateHash is true and not controlled by parent)
108
+ if (updateHash && !current) {
109
+ // Preserve existing history state when changing hash
110
+ const currentState = window.history.state;
111
+ const newUrl = window.location.pathname + window.location.search + '#' + newValue;
112
+ window.history.pushState(currentState, '', newUrl);
113
+ }
114
+
102
115
  if (onTabChange) {
103
116
  onTabChange(newValue);
104
117
  }
@@ -109,7 +122,7 @@ const VTabs = ({
109
122
  }, [handleValueChange]);
110
123
 
111
124
  return (
112
- <TabsContext.Provider value={{ tabs, size: fullWidth ? tabs.length : 0, current: value, setTab, responsive: responsive, variant }}>
125
+ <TabsContext.Provider value={{ tabs, size: fullWidth ? tabs.length : 0, current: value, setTab, responsive: responsive, variant, updateHash }}>
113
126
  <TabsPrimitive.Root
114
127
  defaultValue={value || tabs[0]?.name}
115
128
  value={value}
@@ -123,7 +136,7 @@ const VTabs = ({
123
136
  };
124
137
 
125
138
  const VTabsBar = ({ className }: { className?: string }) => {
126
- const { tabs, size, current, setTab, responsive, variant } = React.useContext(TabsContext);
139
+ const { tabs, size, current, setTab, responsive, variant, updateHash } = React.useContext(TabsContext);
127
140
 
128
141
  const fullWidth = size !== 0;
129
142
 
@@ -132,13 +145,15 @@ const VTabsBar = ({ className }: { className?: string }) => {
132
145
 
133
146
  const tab = tabs.find(t => t.name === tabName);
134
147
 
135
- if (tab?.href) {
136
- window.history.pushState(null, '', tab.href);
148
+ if (tab?.href && updateHash) {
149
+ // Preserve existing history state when changing tabs
150
+ const currentState = window.history.state;
151
+ window.history.pushState(currentState, '', tab.href);
137
152
  }
138
153
 
139
154
  setTab(tabName);
140
155
 
141
- }, [tabs, setTab]);
156
+ }, [tabs, setTab, updateHash]);
142
157
 
143
158
  if (!tabs || !setTab) {
144
159
  console.warn("TabsBar: No tabs provided or setTab not available");
@@ -226,7 +241,9 @@ const TabsTrigger = React.forwardRef<
226
241
  const handleClick = React.useCallback((event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
227
242
  if (href) {
228
243
  event.preventDefault();
229
- window.history.pushState(null, '', href);
244
+ // Preserve existing history state when changing tabs
245
+ const currentState = window.history.state;
246
+ window.history.pushState(currentState, '', href);
230
247
  }
231
248
  if (props.onClick) {
232
249
  (props.onClick as React.MouseEventHandler<HTMLButtonElement>)(event);
@@ -0,0 +1,21 @@
1
+ import * as React from "react"
2
+
3
+ import { cn } from "../libs/utils"
4
+
5
+ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
6
+ return (
7
+ <textarea
8
+ data-slot="textarea"
9
+ className={cn(
10
+ "py-2 text-sm",
11
+ "flex w-full rounded-md border border-input bg-background ring-offset-background",
12
+ "placeholder:text-muted focus-visible:outline-none focus-visible:ring-1 ring-inset focus-visible:ring-ring",
13
+ "disabled:cursor-not-allowed disabled:opacity-50",
14
+ className
15
+ )}
16
+ {...props}
17
+ />
18
+ )
19
+ }
20
+
21
+ export { Textarea }
@@ -23,7 +23,7 @@ export function RowSkeleton({ columns }: { columns: number }) {
23
23
  <tr className="hover:bg-muted">
24
24
  {Array(columns).fill(0).map((_, index) =>
25
25
  <td key={index}>
26
- <div className="animate-pulse rounded-xs h-5 bg-gray-200 dark:bg-gray-600"></div>
26
+ <div className="animate-pulse rounded-xs h-5 bg-muted"></div>
27
27
  </td>
28
28
  )}
29
29
  </tr>
@@ -11,4 +11,5 @@ export * from "./useFlag.js"
11
11
  export * from "./useIntersectionObserver.js"
12
12
  export * from "./useIsFistRendering.js"
13
13
  export * from "./useSafeLayoutEffect.js"
14
+ export * from "./useScrollableSearch.js"
14
15
  export * from "./useSharedValue.js"